diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/stockOperate/service/impl/DlRepairSoServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/stockOperate/service/impl/DlRepairSoServiceImpl.java index 89470bff..a38c2e65 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/stockOperate/service/impl/DlRepairSoServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/stockOperate/service/impl/DlRepairSoServiceImpl.java @@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService; import cn.iocoder.yudao.module.tickets.service.DlRepairTitemService; import cn.iocoder.yudao.module.tickets.service.DlTicketWaresService; import cn.iocoder.yudao.module.tickets.service.DlTwItemService; +import cn.iocoder.yudao.module.tickets.utils.TicketsOperateUtil; import cn.iocoder.yudao.module.tickets.vo.AppWaresGroupVO; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -44,6 +45,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -53,7 +55,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU /** * 针对表【dl_repair_so(采购单领料单)】的数据库操作Service实现 - * * @author 小李 * @date 9:11 2024/9/13 **/ @@ -108,9 +109,11 @@ public class DlRepairSoServiceImpl extends ServiceImpl sois = repairSoiService.list(new LambdaQueryWrapper().in(DlRepairSoi::getSoId, so.getId())); @@ -272,7 +273,6 @@ public class DlRepairSoServiceImpl extends ServiceImpl sois = repairSoiService.list(new LambdaQueryWrapper().eq(DlRepairSoi::getSoId, id)); @@ -414,7 +412,7 @@ public class DlRepairSoServiceImpl extends ServiceImpl sois,List repairWares){ + **/ + private void dealWareItem(Boolean ifGet, String applyId, List sois, List repairWares) { //配件申请单 DlTicketWares dlTicketWares = ticketWaresService.getById(applyId); //工单现有的配件 List titems = titemService.list(new LambdaQueryWrapper().and(i -> { - i.eq(DlRepairTitem::getTicketId,dlTicketWares.getTicketId()) + i.eq(DlRepairTitem::getTicketId, dlTicketWares.getTicketId()) .eq(DlRepairTitem::getItemType, "02"); })); //更新或插入的数据集合 @@ -461,37 +459,64 @@ public class DlRepairSoServiceImpl extends ServiceImpl delIdList = new ArrayList<>(); //工单现有配件转MAP - Map itemMap = titems.stream().collect(Collectors.toMap(DlRepairTitem::getPartId,Function.identity())); + Map itemMap = titems.stream().collect(Collectors.toMap(DlRepairTitem::getPartId, Function.identity())); //配件库的数据集合转MAP - Map repairWaresMap = repairWares.stream().collect(Collectors.toMap(RepairWares::getId,Function.identity())); + Map repairWaresMap = repairWares.stream().collect(Collectors.toMap(RepairWares::getId, Function.identity())); //遍历本次领料/退料的所有配件 - for (DlRepairSoi repairSoi:sois){ - if(itemMap.containsKey(repairSoi.getGoodsId())){ + for (DlRepairSoi repairSoi : sois) { + if (itemMap.containsKey(repairSoi.getGoodsId())) { //工单中有这个配件 - if(ifGet){ + if (ifGet) { //领料 //工单现有配件中就有这个领取的配件,需要更新这个配件的数量、价格 DlRepairTitem item = itemMap.get(repairSoi.getGoodsId()); item.setItemCount(item.getItemCount() + repairSoi.getGoodsCount()); item.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount())); item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode()); + + + // 获取配件的售价和进价 + BigDecimal salePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价 + BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价 + + //计算利润 + BigDecimal profit = operateUtil.calcProfit(salePrice, purchasePrice, item.getItemCount()); + // 计算毛利率 + BigDecimal profitRate = operateUtil.calcProfitRate(salePrice, purchasePrice, item.getItemCount()); + + item.setItemProfit(profit); + item.setItemProfitRate(profitRate); + saveOrUpdateList.add(item); - }else{ + } else { //退料 //工单现有配件中就有这个领取的配件,需要更新这个配件的数量、价格 DlRepairTitem item = itemMap.get(repairSoi.getGoodsId()); - if(item.getItemCount()>repairSoi.getGoodsCount()){ + if (item.getItemCount() > repairSoi.getGoodsCount()) { //现有数量大于要退的数量,扣掉 item.setItemCount(item.getItemCount() - repairSoi.getGoodsCount()); item.setItemMoney(item.getItemPrice().multiply(BigDecimal.valueOf(item.getItemCount())).multiply(item.getItemDiscount())); item.setItemStatus(TicketsItemStatusEnum.RECEIVED.getCode()); + + // 重新计算利润和利润率 + BigDecimal salePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPrice(); // 售价 + BigDecimal purchasePrice = repairWaresMap.get(repairSoi.getGoodsId()).getPurPrice(); // 进价 + + //计算利润 + BigDecimal profit = operateUtil.calcProfit(salePrice, purchasePrice, item.getItemCount()); + // 计算毛利率 + BigDecimal profitRate = operateUtil.calcProfitRate(salePrice, purchasePrice, item.getItemCount()); + + item.setItemProfit(profit); + item.setItemProfitRate(profitRate); + saveOrUpdateList.add(item); - }else{ + } else { //现有数量小于或等于要退的数量,直接将这个配件删掉 delIdList.add(item.getId()); } } - }else{ + } else { //工单中没有这个配件 if (ifGet) { //领料,需要把这个配件添加到工单子表中 @@ -515,25 +540,37 @@ public class DlRepairSoServiceImpl extends ServiceImpl * @author vinjor-M diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTitem.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTitem.java index b00c5337..ab123328 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTitem.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTitem.java @@ -61,6 +61,16 @@ public class DlRepairTitem extends TenantBaseDO { */ private BigDecimal itemMoney; + /** + * 利润 + */ + private BigDecimal itemProfit; + + /** + * 毛利率 + */ + private BigDecimal itemProfitRate; + /** * 维修人员ID(system_users表的ID) */ @@ -115,4 +125,4 @@ public class DlRepairTitem extends TenantBaseDO { * 备注 */ private String remark; -} \ No newline at end of file +} diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java index 8f4cd24f..3ac919ee 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java @@ -86,6 +86,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.InputStream; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -100,7 +101,6 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU /** * 针对表【dl_repair_tickets(维修工单表)】的数据库操作Service实现 - * * @author 小李 * @date 18:19 2024/9/13 **/ @@ -202,7 +202,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl repairTypeList = dictDataApi.getDictDataList(DICT_REPAIR_TYPE); - Map repairTypeMap = repairTypeList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue,DictDataRespDTO::getLabel)); + Map repairTypeMap = repairTypeList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel)); DlRepairTicketsRespVO result = BeanUtil.toBean(dlRepairTickets, DlRepairTicketsRespVO.class); - result.setRepairTypeText(repairTypeMap.getOrDefault(dlRepairTickets.getRepairType(),"")); + result.setRepairTypeText(repairTypeMap.getOrDefault(dlRepairTickets.getRepairType(), "")); //查是否存在总检完成的记录,取出他的时间 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(RepairRecords::getTicketId,id) - .eq(RepairRecords::getType,RecordTypeEnum.ZJ.getCode()) + .eq(RepairRecords::getTicketId, id) + .eq(RepairRecords::getType, RecordTypeEnum.ZJ.getCode()) .orderByDesc(BaseDO::getCreateTime); List repairRecords = repairRecordsService.list(queryWrapper); - if(!repairRecords.isEmpty()){ + if (!repairRecords.isEmpty()) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String formattedString = repairRecords.get(0).getCreateTime().format(formatter); result.setRealOverDate(formattedString); @@ -427,13 +424,13 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl dataFromList = dictDataApi.getDictDataList(DICT_CUS_DATA_FROM); - Map dataFromMap = dataFromList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue,DictDataRespDTO::getLabel)); + Map dataFromMap = dataFromList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel)); customerInfo.setDataFromText(dataFromMap.get(customerInfo.getDataFrom())); } result.setCustomerInfo(customerInfo); @@ -464,15 +461,15 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl repairProjects.stream().filter(i -> i.getId().equals(item.getProjectId())).findFirst().ifPresent(item::setProject)); } result.setProjects(projects); - if(ifApp){ + if (ifApp) { //app新增逻辑 if (CollectionUtil.isNotEmpty(projects)) { List projectList = new ArrayList<>(); //查所有服务分类(项目分类) List baseTypeList = baseTypeService.list(); - Map baseTypeMap = baseTypeList.stream().collect(Collectors.toMap(BaseType::getId,BaseType::getName)); + Map baseTypeMap = baseTypeList.stream().collect(Collectors.toMap(BaseType::getId, BaseType::getName)); //先过滤出itenTypeId为null或空为单独一个组 - List nullList = projects.stream().filter(item->StringUtils.isEmpty(item.getItemTypeId())).collect(Collectors.toList()); + List nullList = projects.stream().filter(item -> StringUtils.isEmpty(item.getItemTypeId())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(nullList)) { AppWaresGroupVO waresGroupVO = new AppWaresGroupVO(); waresGroupVO.setWares(nullList); @@ -484,8 +481,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl> groupListMap = projects.stream().filter(item->StringUtils.isNotEmpty(item.getItemTypeId())).collect(Collectors.groupingBy(DlRepairTitem::getItemTypeId)); - for (String key:groupListMap.keySet()){ + Map> groupListMap = projects.stream().filter(item -> StringUtils.isNotEmpty(item.getItemTypeId())).collect(Collectors.groupingBy(DlRepairTitem::getItemTypeId)); + for (String key : groupListMap.keySet()) { AppWaresGroupVO waresGroupVO = new AppWaresGroupVO(); waresGroupVO.setWares(groupListMap.get(key)); waresGroupVO.setGroupName(baseTypeMap.get(key)); @@ -501,44 +498,44 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl waresGroupList = new ArrayList<>(); //查这个工单的配件 List waresList = repairTitemMapper.selectByTicketId(id); if (CollectionUtil.isNotEmpty(waresList)) { //先过滤出itenTypeId为null或空,或者itemTypeName为null或空的,为单独一个组 - List nullList = waresList.stream().filter(item->StringUtils.isEmpty(item.getItemTypeId()) || StringUtils.isEmpty(item.getItemTypeName())).collect(Collectors.toList()); + List nullList = waresList.stream().filter(item -> StringUtils.isEmpty(item.getItemTypeId()) || StringUtils.isEmpty(item.getItemTypeName())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(nullList)) { AppWaresGroupVO waresGroupVO = new AppWaresGroupVO(); waresGroupVO.setWares(nullList); waresGroupVO.setGroupName("未知分组"); waresGroupVO.setNums(nullList.size()); - waresGroupVO.setTotalAmount(nullList.stream().peek(item->{ - if(null==item.getItemMoney()){ + waresGroupVO.setTotalAmount(nullList.stream().peek(item -> { + if (null == item.getItemMoney()) { item.setItemMoney(new BigDecimal(0)); } - }).map(DlRepairTitem::getItemMoney).reduce(BigDecimal.ZERO,BigDecimal::add)); + }).map(DlRepairTitem::getItemMoney).reduce(BigDecimal.ZERO, BigDecimal::add)); waresGroupList.add(waresGroupVO); } //过滤出有分类的进行分组 - Map> groupListMap = waresList.stream().filter(item->StringUtils.isNotEmpty(item.getItemTypeId()) && StringUtils.isNotEmpty(item.getItemTypeName())).collect(Collectors.groupingBy(DlRepairTitem::getItemTypeId)); - for (String key:groupListMap.keySet()){ + Map> groupListMap = waresList.stream().filter(item -> StringUtils.isNotEmpty(item.getItemTypeId()) && StringUtils.isNotEmpty(item.getItemTypeName())).collect(Collectors.groupingBy(DlRepairTitem::getItemTypeId)); + for (String key : groupListMap.keySet()) { AppWaresGroupVO waresGroupVO = new AppWaresGroupVO(); waresGroupVO.setWares(groupListMap.get(key)); waresGroupVO.setGroupName(groupListMap.get(key).get(0).getItemTypeName()); waresGroupVO.setGroupId(key); waresGroupVO.setNums(groupListMap.get(key).size()); - waresGroupVO.setTotalAmount(groupListMap.get(key).stream().peek(item->{ - if(null==item.getItemMoney()){ + waresGroupVO.setTotalAmount(groupListMap.get(key).stream().peek(item -> { + if (null == item.getItemMoney()) { item.setItemMoney(new BigDecimal(0)); } - }).map(DlRepairTitem::getItemMoney).reduce(BigDecimal.ZERO,BigDecimal::add)); + }).map(DlRepairTitem::getItemMoney).reduce(BigDecimal.ZERO, BigDecimal::add)); waresGroupList.add(waresGroupVO); } } result.setWaresGroupList(waresGroupList); - }else{ + } else { // 取配件----原有逻辑-电脑端 List wares = items.stream().filter(item -> item.getItemType().equals("02")).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(wares)) { @@ -570,13 +567,45 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl recordTypeList = dictDataApi.getDictDataList(DICT_REPAIR_RECORDS_TYPE); Map typeMap = recordTypeList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel)); result.setRecords(records.stream().peek(item -> item.setType(typeMap.get(item.getType()))).collect(Collectors.toList())); + + //配件总利润 + BigDecimal waresProfit = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(items)) { + for (DlRepairTitemReqVO item : items) { + if ("02".equals(item.getItemType())) { + // 获取配件利润 加到总利润中 + BigDecimal itemProfit = item.getItemProfit() != null ? item.getItemProfit() : BigDecimal.ZERO; + waresProfit = waresProfit.add(itemProfit); + System.out.println("配件利润:" + itemProfit); + } + } + } + + + //计算含工时项目毛利率 + //配件总利润除以工单总价 + BigDecimal profitRate = new BigDecimal(0); + if (ObjectUtil.isNotEmpty(dlRepairTickets.getTotalPrice())) { + if (dlRepairTickets.getTotalPrice().compareTo(BigDecimal.ZERO) != 0) { + profitRate = waresProfit.divide(dlRepairTickets.getTotalPrice(), 2, RoundingMode.HALF_UP); + } + result.setProfitRate(profitRate); + } + //计算不含工时项目毛利率 + if (ObjectUtil.isNotEmpty(dlRepairTickets.getPartPrice())) { + BigDecimal profitRateNo = new BigDecimal(0); + if (dlRepairTickets.getPartPrice().compareTo(BigDecimal.ZERO) != 0) { + profitRateNo = waresProfit.divide(dlRepairTickets.getPartPrice(), 2, RoundingMode.HALF_UP); + } + result.setProfitRateNo(profitRateNo); + } + return result; } /** * 维修工单表 作废 * 传对象是因为需要有作废备注 - * * @param repairTicketsReqVO 工单对象 * @author 小李 * @date 19:46 2024/9/22 @@ -600,7 +629,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl - **/ - private IPage dealDictText(IPage dlRepairTicketsIPage){ + * @author vinjor-M + * @date 16:25 2025/1/9 + **/ + private IPage dealDictText(IPage dlRepairTicketsIPage) { //维修类型 List repairTypeList = dictDataApi.getDictDataList(DICT_REPAIR_TYPE); - Map repairTypeMap = repairTypeList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue,DictDataRespDTO::getLabel)); + Map repairTypeMap = repairTypeList.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel)); //支付方式 List payTypeList = dictDataApi.getDictDataList(DICT_REPAIR_PAY_TYPE); - dlRepairTicketsIPage.getRecords().forEach(item->{ - if(StringUtils.isNotEmpty(item.getRepairType())){ + dlRepairTicketsIPage.getRecords().forEach(item -> { + if (StringUtils.isNotEmpty(item.getRepairType())) { item.setRepairTypeText(repairTypeMap.get(item.getRepairType())); } - if(StringUtils.isNotEmpty(item.getPayType())){ - payTypeList.forEach(payType->{ - if(item.getPayType().contains(payType.getValue())){ - if(StringUtils.isEmpty(item.getPayTypeText())){ + if (StringUtils.isNotEmpty(item.getPayType())) { + payTypeList.forEach(payType -> { + if (item.getPayType().contains(payType.getValue())) { + if (StringUtils.isEmpty(item.getPayTypeText())) { item.setPayTypeText(payType.getLabel()); - }else{ - item.setPayTypeText(item.getPayTypeText()+","+payType.getLabel()); + } else { + item.setPayTypeText(item.getPayTypeText() + "," + payType.getLabel()); } } }); @@ -1065,7 +1091,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl getPageType(DlRepairTicketsReqVO repairTicketsReqVO, Page page) { String userRoleCode = getUserRole(); - if(null!=repairTicketsReqVO.getIdList() && repairTicketsReqVO.getIdList().size()>0){ + if (null != repairTicketsReqVO.getIdList() && repairTicketsReqVO.getIdList().size() > 0) { //根据id集和查询 DlRepairTicketsReqVO queryObj = new DlRepairTicketsReqVO(); queryObj.setIdList(repairTicketsReqVO.getIdList()); @@ -1127,54 +1152,54 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl idList = new ArrayList<>(); - if("yijungong".equals(repairTicketsReqVO.getTicketsStatus())){ + if ("yijungong".equals(repairTicketsReqVO.getTicketsStatus())) { //已竣工 - idList = repairTicketsMapper.selectTicketIdByParams(null,RecordTypeEnum.ZJ.getCode(),startDate,endDate); - }else if("yijiaoche".equals(repairTicketsReqVO.getTicketsStatus())){ + idList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.ZJ.getCode(), startDate, endDate); + } else if ("yijiaoche".equals(repairTicketsReqVO.getTicketsStatus())) { //已交车 - idList = repairTicketsMapper.selectTicketIdByParams(null,RecordTypeEnum.JC.getCode(),startDate,endDate); - }else { + idList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.JC.getCode(), startDate, endDate); + } else { //进厂 repairTicketsReqVO.setStartDate(startDate); repairTicketsReqVO.setEndDate(endDate); } - if(null!=idList && !idList.isEmpty()){ + if (null != idList && !idList.isEmpty()) { repairTicketsReqVO.setIdList(idList); //时间查询条件置空 repairTicketsReqVO.setStartDate(null); repairTicketsReqVO.setEndDate(null); } - }else { + } else { //否则查询时间不生效,按维修状态查 List statusList = new ArrayList<>(); - if("weixiuzhong".equals(repairTicketsReqVO.getTicketsStatus())){ + if ("weixiuzhong".equals(repairTicketsReqVO.getTicketsStatus())) { //维修中 statusList.add(TicketsStatusEnum.WORKING.getCode()); - }else if("weijiesuan".equals(repairTicketsReqVO.getTicketsStatus())){ + } else if ("weijiesuan".equals(repairTicketsReqVO.getTicketsStatus())) { //未结算 - statusList = Arrays.asList("04","05","07","01"); - }else if("zaichang".equals(repairTicketsReqVO.getTicketsStatus())){ + statusList = Arrays.asList("04", "05", "07", "01"); + } else if ("zaichang".equals(repairTicketsReqVO.getTicketsStatus())) { //在厂,就是没交车的,且不能是已作废和已完成的 repairTicketsReqVO.setIsHandover("0"); - statusList = Arrays.asList("04","05","07","01","06","02"); - }else if("jinchang".equals(repairTicketsReqVO.getTicketsStatus())){ + statusList = Arrays.asList("04", "05", "07", "01", "06", "02"); + } else if ("jinchang".equals(repairTicketsReqVO.getTicketsStatus())) { //进厂 statusList.add(TicketsStatusEnum.NO_WORK.getCode()); - }else if("yijungong".equals(repairTicketsReqVO.getTicketsStatus())){ + } else if ("yijungong".equals(repairTicketsReqVO.getTicketsStatus())) { //已竣工 - statusList = Arrays.asList("07","01","06","02","08"); - }else if("yijiaoche".equals(repairTicketsReqVO.getTicketsStatus())){ + statusList = Arrays.asList("07", "01", "06", "02", "08"); + } else if ("yijiaoche".equals(repairTicketsReqVO.getTicketsStatus())) { //已交车 repairTicketsReqVO.setIsHandover("1"); } - if(!statusList.isEmpty()){ + if (!statusList.isEmpty()) { repairTicketsReqVO.setStatusList(statusList); } } @@ -1184,7 +1209,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl dataList = dictDataApi.getDictDataList("repair_work_type"); DictDataRespDTO dictDataRespDTO = dataList.stream().filter(item -> item.getValue().equals(worker.getWorkType())).findFirst().orElse(null); String message = String.format("您的爱车%s已由%s %s接单了", tickets.getCarNo(), (dictDataRespDTO != null ? dictDataRespDTO.getLabel() : "维修工"), worker.getUserName()); - repairWorkerService.sentMessageToCus(SystemEnum.REPAIR.getCode(),id, message, false); + repairWorkerService.sentMessageToCus(SystemEnum.REPAIR.getCode(), id, message, false); // 更新工单主表时间 refreshUpdateTime(id); @@ -1265,7 +1288,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl() .setSql("now_repair_id = adviser_id") @@ -1428,7 +1448,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl { - repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(),id, message); + repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(), id, message); }); } @@ -1466,7 +1486,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl * @author vinjor-M * @date 11:30 2024/10/24 **/ @Override - public Map getBossNum(String selectType,String startDate,String endDate) { + public Map getBossNum(String selectType, String startDate, String endDate) { Map rtnMap = new HashMap<>(); //维修中---当前这一时刻 long workingNum = 0; @@ -1712,16 +1726,16 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl inCompanyIdList = new ArrayList<>(); //进场数 - long newOrderNum=0; + long newOrderNum = 0; List newOrderIdList = new ArrayList<>(); //已完成 - long overNum=0; + long overNum = 0; List overIdList = new ArrayList<>(); //已交车 - long giveCusNum=0; + long giveCusNum = 0; List giveCusIdList = new ArrayList<>(); //未结算 - long noPayNum=0; + long noPayNum = 0; List noPayIdList = new ArrayList<>(); List repairTickets = this.list(); if (!repairTickets.isEmpty()) { @@ -1729,46 +1743,46 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl TicketsStatusEnum.WORKING.getCode().equals(item.getTicketsStatus())).map(DlRepairTickets::getId).collect(Collectors.toList()); workingNum = workingIdList.size(); //只要没交车都算在厂 - inCompanyIdList = repairTickets.stream().filter(item -> "0".equals(item.getIsHandover())).filter(item->!"03".equals(item.getTicketsStatus())).map(DlRepairTickets::getId).collect(Collectors.toList()); + inCompanyIdList = repairTickets.stream().filter(item -> "0".equals(item.getIsHandover())).filter(item -> !"03".equals(item.getTicketsStatus())).map(DlRepairTickets::getId).collect(Collectors.toList()); inCompanyNum = inCompanyIdList.size(); //只要没结算,都是未结算 - List noPayCodeList = Arrays.asList("04","05","07","01"); + List noPayCodeList = Arrays.asList("04", "05", "07", "01"); noPayIdList = repairTickets.stream().filter(item -> noPayCodeList.contains(item.getTicketsStatus())).map(DlRepairTickets::getId).collect(Collectors.toList()); noPayNum = noPayIdList.size(); LocalDateTime currentTime = LocalDateTime.now(); - if("today".equals(selectType)){ + if ("today".equals(selectType)) { String nowDayStr = DateUtil.formatDate(new Date()); //查当日进厂数、已完成、已交车 newOrderIdList = repairTickets.stream().filter(item -> item.getCreateTime().toLocalDate().equals(currentTime.toLocalDate())).map(DlRepairTickets::getId).collect(Collectors.toList()); newOrderNum = newOrderIdList.size(); //查当日已完成的(总检完成的) - overIdList = repairTicketsMapper.selectTicketIdByParams(nowDayStr,RecordTypeEnum.ZJ.getCode(),null,null); + overIdList = repairTicketsMapper.selectTicketIdByParams(nowDayStr, RecordTypeEnum.ZJ.getCode(), null, null); overNum = overIdList.size(); //查当日已交车的 - giveCusIdList = repairTicketsMapper.selectTicketIdByParams(nowDayStr,RecordTypeEnum.JC.getCode(),null,null); + giveCusIdList = repairTicketsMapper.selectTicketIdByParams(nowDayStr, RecordTypeEnum.JC.getCode(), null, null); giveCusNum = giveCusIdList.size(); - }else if("all".equals(selectType)){ + } else if ("all".equals(selectType)) { //查累计进厂数、已完成、已交车 newOrderIdList = repairTickets.stream().map(DlRepairTickets::getId).collect(Collectors.toList()); newOrderNum = repairTickets.size(); //查累计已完成的(总检完成的) - List overCodeList = Arrays.asList("07","01","06","02","08"); + List overCodeList = Arrays.asList("07", "01", "06", "02", "08"); overIdList = repairTickets.stream().filter(item -> overCodeList.contains(item.getTicketsStatus())).map(DlRepairTickets::getId).collect(Collectors.toList()); overNum = overIdList.size(); //查累计已交车的 giveCusIdList = repairTickets.stream().filter(item -> "1".equals(item.getIsHandover())).map(DlRepairTickets::getId).collect(Collectors.toList()); giveCusNum = giveCusIdList.size(); - }else { + } else { //查某个时间范围内进厂数、已完成、已交车 - LocalDateTime startTime = LocalDateTime.parse(startDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - LocalDateTime endTime = LocalDateTime.parse(endDate+" 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LocalDateTime startTime = LocalDateTime.parse(startDate + " 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LocalDateTime endTime = LocalDateTime.parse(endDate + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); newOrderIdList = repairTickets.stream().filter(item -> item.getCreateTime().isAfter(startTime) && item.getCreateTime().isBefore(endTime)).map(DlRepairTickets::getId).collect(Collectors.toList()); newOrderNum = newOrderIdList.size(); //查某区间范围内已完成的(总检完成的) - overIdList = repairTicketsMapper.selectTicketIdByParams(null,RecordTypeEnum.ZJ.getCode(), startDate+" 00:00:00", endDate+" 23:59:59"); + overIdList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.ZJ.getCode(), startDate + " 00:00:00", endDate + " 23:59:59"); overNum = overIdList.size(); //查某区间范围内已交车的 - giveCusIdList = repairTicketsMapper.selectTicketIdByParams(null,RecordTypeEnum.JC.getCode(), startDate+" 00:00:00", endDate+" 23:59:59"); + giveCusIdList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.JC.getCode(), startDate + " 00:00:00", endDate + " 23:59:59"); giveCusNum = giveCusIdList.size(); } } @@ -1789,7 +1803,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl { - repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(),id, "待总检车牌为:" + item.getCarNo() + "工单已经超时,但无法自动总检,请手动处理"); + repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(), id, "待总检车牌为:" + item.getCarNo() + "工单已经超时,但无法自动总检,请手动处理"); }); } return flag; @@ -2058,9 +2067,9 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl { - repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(),Long.valueOf(item.getAdviserId()), "您有新的工单可以出厂检验"); + repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(), Long.valueOf(item.getAdviserId()), "您有新的工单可以出厂检验"); ids.forEach(id -> { - repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(),id, "车牌为:" + item.getCarNo() + "工单已由系统自动总检并移交服务顾问"); + repairWorkerService.sentMessage(SystemEnum.REPAIR.getCode(), id, "车牌为:" + item.getCarNo() + "工单已由系统自动总检并移交服务顾问"); }); // 记录日志 repairRecordsService.saveRepairRecord(item.getId(), null, RecordTypeEnum.ZJ.getCode(), "该工单由系统自动总检完成", null); @@ -2069,7 +2078,6 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl() .set(DlRepairTickets::getUpdateTime, LocalDateTime.now()) .eq(DlRepairTickets::getId, id) diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/utils/TicketsOperateUtil.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/utils/TicketsOperateUtil.java index 3eb78601..2484ccf2 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/utils/TicketsOperateUtil.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/utils/TicketsOperateUtil.java @@ -3,26 +3,85 @@ package cn.iocoder.yudao.module.tickets.utils; import cn.hutool.core.date.DateUtil; import org.springframework.stereotype.Component; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Date; /** * 工单操作常用util * @author vinjor-M * @date 16:15 2024/10/18 -**/ + **/ @Component public class TicketsOperateUtil { /** * 计算车龄 + * @param registerDate 车辆注册日期 + * @return java.lang.Double * @author vinjor-M * @date 14:47 2025/1/9 - * @param registerDate 车辆注册日期 - * @return java.lang.Double **/ - public Double computeCarYear(Date registerDate){ + public Double computeCarYear(Date registerDate) { long betweenMonth = DateUtil.betweenMonth(registerDate, new Date(), true); String carYear = String.format("%.2f", (double) betweenMonth / 12); return Double.parseDouble(carYear); } + + /** + * 计算利润 + * @param salePrice 单个售价(不含折扣) + * @param purchasePrice 单个进价(采购价格) + * @param count 数量 + * @return 利润金额 + */ + public BigDecimal calcProfit(BigDecimal salePrice, BigDecimal purchasePrice, int count) { + if (salePrice == null || purchasePrice == null) { + return BigDecimal.ZERO; + } + BigDecimal c = BigDecimal.valueOf(count); + return salePrice.multiply(c).subtract(purchasePrice.multiply(c)); + } + + /** + * 计算利润率 + * @param salePrice 单个售价(不含折扣) + * @param purchasePrice 单个进价(采购价格) + * @param count 数量 + * @return 利润率(0-1之间的小数,保留2位) + */ + public BigDecimal calcProfitRate(BigDecimal salePrice, BigDecimal purchasePrice, int count) { + if (salePrice == null || purchasePrice == null || count <= 0) { + return BigDecimal.ZERO; + } + + BigDecimal c = BigDecimal.valueOf(count); + BigDecimal saleTotal = salePrice.multiply(c); + if (saleTotal.compareTo(BigDecimal.ZERO) == 0) { + return BigDecimal.ZERO; + } + + BigDecimal profit = saleTotal.subtract(purchasePrice.multiply(c)); + return profit.divide(saleTotal, 2, RoundingMode.HALF_UP); + } + + /** + * 计算利润 + * @param salePrice 单个售价(不含折扣) + * @param purchasePrice 单个进价(采购价格) + * @return 利润金额 + */ + public BigDecimal calcProfit(BigDecimal salePrice, BigDecimal purchasePrice) { + return calcProfit(salePrice, purchasePrice, 1); + } + + /** + * 计算利润率 + * @param salePrice 售价(不含折扣) + * @param purchasePrice 进价(采购价格) + * @return 利润率(0-1之间的小数,保留2位) + */ + public BigDecimal calcProfitRate(BigDecimal salePrice, BigDecimal purchasePrice) { + return calcProfitRate(salePrice, purchasePrice, 1); + } } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/DlRepairTicketsRespVO.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/DlRepairTicketsRespVO.java index f2db5780..761b4e1c 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/DlRepairTicketsRespVO.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/vo/DlRepairTicketsRespVO.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets; import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem; import lombok.Data; +import java.math.BigDecimal; import java.util.List; /** @@ -75,4 +76,10 @@ public class DlRepairTicketsRespVO extends DlRepairTickets { /** 客户来源 */ private String cusFrom; + + /** 含工时项目毛利率*/ + private BigDecimal profitRate; + + /** 不含工时项目毛利率*/ + private BigDecimal profitRateNo; }