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();
//
// }
}