package com.ruoyi.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.MapUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.domain.ZTravelBase; import com.ruoyi.domain.ZTravelPrice; import com.ruoyi.domain.ZTravelPriceDetail; import com.ruoyi.domain.dto.PriceDto; import com.ruoyi.mapper.ZTravelPriceMapper; import com.ruoyi.service.ZTravelBaseService; import com.ruoyi.service.ZTravelPriceDetailService; import com.ruoyi.service.ZTravelPriceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author ojq * @since 2023-03-14 */ @Service public class ZTravelPriceServiceImpl extends ServiceImpl implements ZTravelPriceService { @Autowired ZTravelPriceServiceImpl zTravelPriceService; @Autowired ZTravelPriceDetailService zTravelPriceDetailService; @Autowired ZTravelBaseService zTravelBaseService; // private LambdaQueryWrapper uniqueCondition(ZTravelPrice zTravelPrice){ // LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); // lqw.eq(zTravelPrice.getMyId()!=null,ZTravelPrice::getMyId,zTravelPrice.getMyId()) // .eq(zTravelPrice.getStartTime()!=null,ZTravelPrice::getStartTime,zTravelPrice.getStartTime()) // .eq(zTravelPrice.getEndTime()!=null,ZTravelPrice::getEndTime,zTravelPrice.getEndTime()) // .eq(zTravelPrice.getTotalDay()!=null,ZTravelPrice::getTotalDay,zTravelPrice.getTotalDay()) // .eq(StringUtils.isNotEmpty(zTravelPrice.getTitle()),ZTravelPrice::getTitle,zTravelPrice.getTitle()); //// .eq(zTravelPrice.getEat()!=null,ZTravelPrice::getEat,zTravelPrice.getEat()) //// .eq(zTravelPrice.getStay()!=null,ZTravelPrice::getStay,zTravelPrice.getStay()) //// .eq(zTravelPrice.getTraffic()!=null,ZTravelPrice::getTraffic,zTravelPrice.getTraffic()) //// .eq(zTravelPrice.getShopping()!=null,ZTravelPrice::getShopping,zTravelPrice.getShopping()); // return lqw; // } private LambdaQueryWrapper buildCondition(ZTravelPrice zTravelPrice, Long userId) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(ZTravelPrice::getMyId, userId) .eq(zTravelPrice.getTotalDay() != null, ZTravelPrice::getTotalDay, zTravelPrice.getTotalDay()) .like(StringUtils.isNotEmpty(zTravelPrice.getTitle()),ZTravelPrice::getTitle,zTravelPrice.getTitle()) .eq(zTravelPrice.getTotalCost()!=null,ZTravelPrice::getTotalCost,zTravelPrice.getTotalCost()) .le(zTravelPrice.getEnd() != null, ZTravelPrice::getEndTime, zTravelPrice.getEnd()) .ge(zTravelPrice.getStart() != null, ZTravelPrice::getStartTime, zTravelPrice.getStart()) .eq(zTravelPrice.getEat()!=null,ZTravelPrice::getEat,zTravelPrice.getEat()) .eq(zTravelPrice.getStay()!=null,ZTravelPrice::getStay,zTravelPrice.getStay()) .eq(zTravelPrice.getTraffic()!=null,ZTravelPrice::getTraffic,zTravelPrice.getTraffic()) .eq(zTravelPrice.getShopping()!=null,ZTravelPrice::getShopping,zTravelPrice.getShopping()); lqw.orderBy(true, true, ZTravelPrice::getStartTime); return lqw; } /** * 分页查找 */ @Override public AjaxResult selectDataList(ZTravelPrice zTravelPrice, Integer pageNum, Integer pageSize) { SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); LambdaQueryWrapper lqw = buildCondition(zTravelPrice, userId); Page pageBean = new Page<>(pageNum, pageSize); Page pageResult = page(pageBean, lqw); List priceList = pageResult.getRecords();//得到查询出来的数据 //查询费用详情 for (ZTravelPrice price : priceList) { LambdaQueryWrapper detailLqw = new LambdaQueryWrapper<>(); detailLqw.eq(ZTravelPriceDetail::getFeeId,price.getId()); List detailList = zTravelPriceDetailService.list(detailLqw); price.setDetailList(detailList); } HashMap data = MapUtils.getResult(pageResult, priceList); return AjaxResult.success(data); } @Override public List selectCondition(ZTravelPrice zTravelPrice) { SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); LambdaQueryWrapper lqw = buildCondition(zTravelPrice, userId); return list(lqw); } @Override public List selectByIds(Long[] ids) { List list = new ArrayList<>(); if (ids.length != 0) list = listByIds(Arrays.asList(ids)); else list = list(); return list; } @Override @Transactional public AjaxResult mySave(PriceDto priceDto) { SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); List detailList = priceDto.getDetailList(); //生成费用表id String priceId = IdUtils.fastSimpleUUID(); //得到总天数 long count = detailList.stream().map(ZTravelPriceDetail::getHappenTime).distinct().count(); Integer totalDay = Math.toIntExact(count); //先插入明细表 //collectList还没有添加每日金额字段 List collectList = detailList.stream().peek((priceDetail) -> { priceDetail.setFeeId(priceId); if (priceDetail.getEat() == null || priceDetail.getStay() == null || priceDetail.getTraffic() == null || priceDetail.getEntrance() == null || priceDetail.getShopping() == null) { throw new RuntimeException("如果没有对应的费用,前端要传个0过来"); } Double totalCost = priceDetail.getEat() + priceDetail.getStay() + priceDetail.getTraffic() + priceDetail.getEntrance() + priceDetail.getShopping(); priceDetail.setTotalCost(totalCost); }).collect(Collectors.toList()); //按日期分组 Map> groupByTimeMap = collectList.stream().collect(Collectors.groupingBy(ZTravelPriceDetail::getHappenTime)); //将每日金额字段的值也添加上 for (String key : groupByTimeMap.keySet()) { List groupByTimeList = groupByTimeMap.get(key); Double dayTotalCost = 0d; for (ZTravelPriceDetail detail : groupByTimeList) { dayTotalCost += detail.getTotalCost(); } for (ZTravelPriceDetail detail : groupByTimeList){ detail.setDayCost(dayTotalCost); } } //开始插入费用详情数据 for (String key : groupByTimeMap.keySet()) { List dataList = groupByTimeMap.get(key); for (ZTravelPriceDetail detail : dataList) { zTravelPriceDetailService.save(detail); } } //再插入费用记录统计表 //先得到各个详情费用的总和 Double eatTotal = 0d; Double stayTotal = 0d; Double trafficTotal = 0d; Double entranceTotal = 0d; Double shoppingTotal = 0d; Double totalFee = 0d; for (String key : groupByTimeMap.keySet()) { List dataList = groupByTimeMap.get(key); for (ZTravelPriceDetail priceDetail : dataList) { if (priceDetail.getEat() == null || priceDetail.getStay() == null || priceDetail.getTraffic() == null || priceDetail.getEntrance() == null || priceDetail.getShopping() == null) { throw new RuntimeException("如果没有对应的费用,前端要传个0过来"); } eatTotal+=priceDetail.getEat(); stayTotal+=priceDetail.getStay(); trafficTotal+=priceDetail.getTraffic(); entranceTotal+=priceDetail.getEntrance(); shoppingTotal+=priceDetail.getShopping(); totalFee+=priceDetail.getTotalCost(); } } ZTravelPrice zTravelPrice = new ZTravelPrice(); zTravelPrice.setId(priceId); zTravelPrice.setStartTime(priceDto.getStartTime()); zTravelPrice.setEndTime(priceDto.getEndTime()); zTravelPrice.setTotalDay(totalDay); zTravelPrice.setTitle(priceDto.getTitle()); zTravelPrice.setTableName(priceDto.getTableName()); zTravelPrice.setProperty(priceDto.getProperty()); zTravelPrice.setType(priceDto.getType()); zTravelPrice.setDestination(priceDto.getDestination()); zTravelPrice.setEat(eatTotal); zTravelPrice.setStay(stayTotal); zTravelPrice.setTraffic(trafficTotal); zTravelPrice.setEntrance(entranceTotal); zTravelPrice.setShopping(shoppingTotal); zTravelPrice.setTotalCost(totalFee); zTravelPrice.setMyId(userId); //插入费用记录统计 zTravelPriceService.save(zTravelPrice); return AjaxResult.success(); } @Override @Transactional public AjaxResult myUpdate(PriceDto priceDto) { SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); List detailList = priceDto.getDetailList(); //先查数据库里面这一次费用所有的数据 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(ZTravelPriceDetail::getFeeId,priceDto.getId()); List selectDetailList = zTravelPriceDetailService.list(lqw); //把传过来的数据中没有的id,在数据库中删掉 List detailIdList = detailList.stream().filter(priceDetail -> priceDetail.getId() != null).map(ZTravelPriceDetail::getId).collect(Collectors.toList()); List deleteIdList = selectDetailList.stream().filter(priceDetail -> !detailIdList.contains(priceDetail.getId())).map(ZTravelPriceDetail::getId).collect(Collectors.toList()); zTravelPriceDetailService.removeBatchByIds(deleteIdList); //如果传过来的列表的数据里面没有id List addPriceDetail = detailList.stream().filter(priceDetail -> priceDetail.getId() == null || priceDetail.getId() == 0 ).collect(Collectors.toList()); addPriceDetail.forEach(priceDetail -> { priceDetail.setFeeId(priceDto.getId()); }); //那就先增加到数据库中 zTravelPriceDetailService.saveBatch(addPriceDetail); //得到总天数 long count = detailList.stream().map(ZTravelPriceDetail::getHappenTime).distinct().count(); Integer totalDay = Math.toIntExact(count); List collectList = detailList.stream().peek((priceDetail) -> { if (priceDetail.getEat() == null || priceDetail.getStay() == null || priceDetail.getTraffic() == null || priceDetail.getEntrance() == null || priceDetail.getShopping() == null) { throw new RuntimeException("如果没有对应的费用,前端要传个0过来"); } Double totalCost = priceDetail.getEat() + priceDetail.getStay() + priceDetail.getTraffic() + priceDetail.getEntrance() + priceDetail.getShopping(); priceDetail.setTotalCost(totalCost); }).collect(Collectors.toList()); //按日期分组 Map> groupByTimeMap = collectList.stream().collect(Collectors.groupingBy(ZTravelPriceDetail::getHappenTime)); //将每日金额字段的值也添加上 for (String key : groupByTimeMap.keySet()) { List groupByTimeList = groupByTimeMap.get(key); Double dayTotalCost = 0d; for (ZTravelPriceDetail detail : groupByTimeList) { dayTotalCost += detail.getTotalCost(); } for (ZTravelPriceDetail detail : groupByTimeList){ detail.setDayCost(dayTotalCost); } } //开始修改费用详情数据 for (String key : groupByTimeMap.keySet()) { List dataList = groupByTimeMap.get(key); for (ZTravelPriceDetail detail : dataList) { zTravelPriceDetailService.updateById(detail); } } //再修改费用记录统计表 //先得到各个详情费用的总和 Double eatTotal = 0d; Double stayTotal = 0d; Double trafficTotal = 0d; Double entranceTotal = 0d; Double shoppingTotal = 0d; Double totalFee = 0d; for (String key : groupByTimeMap.keySet()) { List dataList = groupByTimeMap.get(key); for (ZTravelPriceDetail priceDetail : dataList) { if (priceDetail.getEat() == null || priceDetail.getStay() == null || priceDetail.getTraffic() == null || priceDetail.getEntrance() == null || priceDetail.getShopping() == null) { throw new RuntimeException("如果没有对应的费用,前端要传个0过来"); } eatTotal+=priceDetail.getEat(); stayTotal+=priceDetail.getStay(); trafficTotal+=priceDetail.getTraffic(); entranceTotal+=priceDetail.getEntrance(); shoppingTotal+=priceDetail.getShopping(); totalFee+=priceDetail.getTotalCost(); } } ZTravelPrice zTravelPrice = new ZTravelPrice(); zTravelPrice.setId(priceDto.getId()); zTravelPrice.setStartTime(priceDto.getStartTime()); zTravelPrice.setEndTime(priceDto.getEndTime()); zTravelPrice.setTotalDay(totalDay); zTravelPrice.setTitle(priceDto.getTitle()); zTravelPrice.setTableName(priceDto.getTableName()); zTravelPrice.setProperty(priceDto.getProperty()); zTravelPrice.setType(priceDto.getType()); zTravelPrice.setDestination(priceDto.getDestination()); zTravelPrice.setEat(eatTotal); zTravelPrice.setStay(stayTotal); zTravelPrice.setTraffic(trafficTotal); zTravelPrice.setEntrance(entranceTotal); zTravelPrice.setShopping(shoppingTotal); zTravelPrice.setTotalCost(totalFee); zTravelPrice.setMyId(userId); //修改统计表 zTravelPriceService.updateById(zTravelPrice); return AjaxResult.success(); } @Override @Transactional public AjaxResult myRemove(String[] ids) { for (String feeId : ids) { //删除旅游经历 zTravelBaseService.remove(new LambdaQueryWrapper().eq(ZTravelBase::getFeeId,feeId)); //删除费用详情 zTravelPriceDetailService.remove(new LambdaQueryWrapper().eq(ZTravelPriceDetail::getFeeId,feeId)); //删除费用记录 zTravelPriceService.remove(new LambdaQueryWrapper().eq(ZTravelPrice::getId,feeId)); } return AjaxResult.success(); } // @Override // public AjaxResult importExcel(MultipartFile file) { // // } // @Override // @Transactional // public AjaxResult importExcel(MultipartFile file) { // // ExcelUtil util = new ExcelUtil<>(ZTravelPrice.class); // List dataList = null; // try { // dataList = util.importExcel(file.getInputStream()); // } catch (Exception e) { // throw new RuntimeException("没有按照规则导入数据"); // } // // assert dataList != null; // // for (ZTravelPrice zTravelPrice : dataList) { // zTravelPriceService.mySave(zTravelPrice); // } // // return AjaxResult.success(); // // } }