diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/InspectionBusinessChannelController.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/InspectionBusinessChannelController.java index 7a1e866d..27de0fbc 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/InspectionBusinessChannelController.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/InspectionBusinessChannelController.java @@ -74,7 +74,8 @@ public class InspectionBusinessChannelController { .map(String::valueOf) .collect(Collectors.joining(",")); channel.setUserIds(userIds); - + }else if (ObjectUtil.isEmpty(channel.getUserIds())) { + channel.setUserIds(""); } return CommonResult.success(inspectionBusinessChannelService.updateById(channel)); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/controller/admin/RepairStatisticsController.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/controller/admin/RepairStatisticsController.java index 96d2fd52..ff959b44 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/controller/admin/RepairStatisticsController.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/controller/admin/RepairStatisticsController.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.base.service.RepairStatisticsService; import cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO; import cn.iocoder.yudao.module.base.vo.QueryBusinessResp; +import cn.iocoder.yudao.module.base.vo.QueryTableResp; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -155,4 +156,19 @@ public class RepairStatisticsController { return CommonResult.success(statisticsService.listBusinessByCustomerOrCar(reqVO,page)); } + /** + * @Author 许 + * @Description 根据客户或者车辆查询订单列表 + * @Date 17:06 2025/9/1 + * @Param [reqVO, pageNo, pageSize] + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @GetMapping("/pageByCustomerOrCar") + public CommonResult pageByCustomerOrCar(QueryBusinessReqVO reqVO, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNo, pageSize); + return CommonResult.success(statisticsService.pageByCustomerOrCar(reqVO,page)); + } + } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/mapper/RepairStatisticsMapper.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/mapper/RepairStatisticsMapper.java index 4eea9f9e..874584f9 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/mapper/RepairStatisticsMapper.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/mapper/RepairStatisticsMapper.java @@ -1,9 +1,6 @@ package cn.iocoder.yudao.module.base.mapper; -import cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO; -import cn.iocoder.yudao.module.base.vo.QueryBusinessResp; -import cn.iocoder.yudao.module.base.vo.RepairStatisticsVO; -import cn.iocoder.yudao.module.base.vo.RepairTicketStatisticsVO; +import cn.iocoder.yudao.module.base.vo.*; import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -118,4 +115,13 @@ public interface RepairStatisticsMapper { * @return java.util.List **/ IPage listBusinessByCar(@Param("reqVO") QueryBusinessReqVO reqVO,@Param("page") Page page); + + /** + * @Author 许 + * @Description 根据客户或车牌查询订单 + * @Date 17:13 2025/9/1 + * @Param [reqVO, page] + * @return com.baomidou.mybatisplus.core.metadata.IPage + **/ + IPage pageByCustomerOrCar(@Param("reqVO") QueryBusinessReqVO reqVO,@Param("page") Page page); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairStatisticsService.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairStatisticsService.java index 8847875b..fa40ee7a 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairStatisticsService.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/RepairStatisticsService.java @@ -1,9 +1,6 @@ package cn.iocoder.yudao.module.base.service; -import cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO; -import cn.iocoder.yudao.module.base.vo.QueryBusinessResp; -import cn.iocoder.yudao.module.base.vo.RepairStatisticsVO; -import cn.iocoder.yudao.module.base.vo.RepairTicketStatisticsVO; +import cn.iocoder.yudao.module.base.vo.*; import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -94,4 +91,13 @@ public interface RepairStatisticsService { * @return com.baomidou.mybatisplus.core.metadata.IPage **/ IPage listBusinessByCustomerOrCar(QueryBusinessReqVO reqVO, Page page); + + /** + * @Author 许 + * @Description 根据客户或者车辆插叙订单 + * @Date 17:08 2025/9/1 + * @Param [reqVO, page] + * @return com.baomidou.mybatisplus.core.metadata.IPage + **/ + IPage pageByCustomerOrCar(QueryBusinessReqVO reqVO, Page page); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairStatisticsServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairStatisticsServiceImpl.java index 46302482..d918c354 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairStatisticsServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/service/impl/RepairStatisticsServiceImpl.java @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.base.service.impl; import cn.iocoder.yudao.module.base.mapper.RepairStatisticsMapper; import cn.iocoder.yudao.module.base.service.RepairStatisticsService; -import cn.iocoder.yudao.module.base.vo.QueryBusinessReqVO; -import cn.iocoder.yudao.module.base.vo.QueryBusinessResp; -import cn.iocoder.yudao.module.base.vo.RepairStatisticsVO; -import cn.iocoder.yudao.module.base.vo.RepairTicketStatisticsVO; +import cn.iocoder.yudao.module.base.vo.*; import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsRespVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -151,4 +148,17 @@ public class RepairStatisticsServiceImpl implements RepairStatisticsService { } return queryBusinessResps; } + + /** + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @Author 许 + * @Description 根据客户或者车辆插叙订单 + * @Date 17:08 2025/9/1 + * @Param [reqVO, page] + */ + @Override + public IPage pageByCustomerOrCar(QueryBusinessReqVO reqVO, Page page) { + IPage queryTableResps = statisticsMapper.pageByCustomerOrCar(reqVO,page); + return queryTableResps; + } } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessReqVO.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessReqVO.java index 5f2de25b..1a6fd22e 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessReqVO.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessReqVO.java @@ -27,4 +27,14 @@ public class QueryBusinessReqVO { * 搜索 */ private String search; + + /** + * 手机 + */ + private String phone; + + /** + * 车牌 + */ + private String carNo; } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessResp.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessResp.java index 2aa46cac..36145e15 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessResp.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryBusinessResp.java @@ -51,8 +51,18 @@ public class QueryBusinessResp { */ private String source; + /** + * 业务来源 + */ + private String sourceStr; + /** * 车牌号 */ private String carNum; + + /** + * 经办人 + */ + private String handleName; } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryTableResp.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryTableResp.java new file mode 100644 index 00000000..2c98ee80 --- /dev/null +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/base/vo/QueryTableResp.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.base.vo; + +import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets; +import lombok.Data; + +/** + *@BelongsProject: lanan-system + *@BelongsPackage: cn.iocoder.yudao.module.base.vo + *@Author: 许 + *@CreateTime: 2025-09-01 17:07 + *@Description: 查询表单 + *@Version: 1.0 + */ +@Data +public class QueryTableResp extends DlRepairTickets { + /** + * 订单ID + */ + private String orderId; + + /** + * 工单来源 + */ + private String sourceStr; +} diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTicketsController.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTicketsController.java index 7bd1d111..1716d1b5 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTicketsController.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTicketsController.java @@ -477,6 +477,33 @@ public class DlRepairTicketsController { return success(dlRepairTicketsService.getBossNum(selectType, startDate, endDate)); } + /** + * @Author 许 + * @Description 数据统计-新版 + * @Date 10:53 2025/9/1 + * @Param [startDate, endDate] + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @GetMapping("/getBossNumNew") + @Operation(summary = "从总检的角度查进场数、维修中、已完成、已交车、在厂的工单数量") + public CommonResult getBossNumNew(@RequestParam(value = "dateRange[0]", required = false) String startDate, + @RequestParam(value = "dateRange[1]", required = false) String endDate) { + return success(dlRepairTicketsService.getBossNum(startDate, endDate)); + } + + /** + * @Author 许 + * @Description 统计详情-细分工单类型 + * @Date 14:14 2025/9/3 + * @Param [startDate, endDate] + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @GetMapping("/getBossNumStatistics") + public CommonResult getBossNumStatistics(@RequestParam(value = "dateRange[0]", required = false) String startDate, + @RequestParam(value = "dateRange[1]", required = false) String endDate) { + return success(dlRepairTicketsService.getBossNumStatistics(startDate, endDate)); + } + /** * 获取日期范围 * @author vinjor-M diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java index fd2d8a03..88efa898 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/entity/DlRepairTickets.java @@ -35,7 +35,7 @@ public class DlRepairTickets extends TenantBaseDO { /** * 业务类型(repair_type) */ - private String repairType; + private String repairType; /** * 用户ID(system_users表的ID) diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/mapper/DlRepairTicketsMapper.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/mapper/DlRepairTicketsMapper.java index c97cc4a3..4e9129b5 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/mapper/DlRepairTicketsMapper.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/mapper/DlRepairTicketsMapper.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.tickets.mapper; import cn.iocoder.yudao.module.tickets.entity.DlRepairTickets; import cn.iocoder.yudao.module.tickets.vo.DlRepairTicketsReqVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -57,6 +58,16 @@ public interface DlRepairTicketsMapper extends BaseMapper { **/ List selectTicketIdByParams(@Param("nowDate")String dayDate, @Param("recordCode")String recordCode, @Param("startTime")String startTime, @Param("endTime")String endTime); + + /** + * @Author 许 + * @Description 根据条件查询统计 + * @Date 11:32 2025/9/4 + * @Param [queryWrapper] + * @return java.util.List> + **/ + List> selectTicketIdByParamsNew(@Param("ew") QueryWrapper queryWrapper); + /** * @Author 许 * @Description 统计工单 @@ -66,6 +77,9 @@ public interface DlRepairTicketsMapper extends BaseMapper { **/ Map getStatistics(@Param("map") DlRepairTicketsReqVO repairTicketsReqVO); + + // 通用金额求和查询 + List> selectSumAmount(@Param("ew") QueryWrapper receivableWrapper); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java index 4a9f62da..408f94f9 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletResponse; +import java.util.List; import java.util.Map; /** @@ -172,6 +173,15 @@ public interface DlRepairTicketsService extends IService { **/ Map getBossNum(String selectType,String startDate,String endDate); + /** + * @Author 许 + * @Description 数据统计 + * @Date 10:51 2025/9/1 + * @Param [startDate, endDate] + * @return java.util.Map + **/ + Map getBossNum(String startDate,String endDate); + /** * 服务顾问通知客户取车 * @@ -318,4 +328,13 @@ public interface DlRepairTicketsService extends IService { **/ TicketsSettlementVO getSettlement(DlRepairTicketsReqVO repairTicketsReqVO); + + /** + * @Author 许 + * @Description 统计详情-细分工单类型 + * @Date 14:15 2025/9/3 + * @Param [startDate, endDate] + * @return java.util.List + **/ + Map getBossNumStatistics(String startDate, String endDate); } 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 f192db10..fea2c7a4 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 @@ -66,8 +66,10 @@ import cn.iocoder.yudao.module.tickets.vo.*; import cn.iocoder.yudao.util.CreateQRCodeUtil; import cn.iocoder.yudao.util.SendSmsUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -750,44 +752,44 @@ public class DlRepairTicketsServiceImpl extends ServiceImpllambdaQuery() - .eq(RepairRecords::getTicketId, repairTicketsRespVO.getId()) - .eq(RepairRecords::getType, RecordTypeEnum.JSSP) - .orderByDesc(RepairRecords::getCreateTime) - .last("limit 1")); + // 根据工单id 查询工单记录中的审批记录 + RepairRecords record = repairRecordsService.getOne(Wrappers.lambdaQuery() + .eq(RepairRecords::getTicketId, repairTicketsRespVO.getId()) + .eq(RepairRecords::getType, RecordTypeEnum.JSSP) + .orderByDesc(RepairRecords::getCreateTime) + .last("limit 1")); - // 提取冗余字段 - String otherData = record.getOtherData(); - // 将json 转为对象 - TicketsSettlementVO approvalVO = JSON.parseObject(otherData, TicketsSettlementVO.class); + // 提取冗余字段 + String otherData = record.getOtherData(); + // 将json 转为对象 + TicketsSettlementVO approvalVO = JSON.parseObject(otherData, TicketsSettlementVO.class); - // 设置订单金额信息 - repairOrderInfo.setPayMoney(approvalVO.getActualMoney()); - repairOrderInfo.setGoodsPrice(approvalVO.getMoney()); + // 设置订单金额信息 + repairOrderInfo.setPayMoney(approvalVO.getActualMoney()); + repairOrderInfo.setGoodsPrice(approvalVO.getMoney()); - //判断优惠类型 - if (approvalVO.getDiscountType().equals("1")) { - repairOrderInfo.setReduceMoney(BigDecimal.valueOf(approvalVO.getDiscount())); - } else if (approvalVO.getDiscountType().equals("2")) { - // 折扣计算 - repairOrderInfo.setReduceMoney(repairOrderInfo.getGoodsPrice().multiply(BigDecimal.valueOf(approvalVO.getDiscount() / 10))); - } + //判断优惠类型 + if (approvalVO.getDiscountType().equals("1")) { + repairOrderInfo.setReduceMoney(BigDecimal.valueOf(approvalVO.getDiscount())); + } else if (approvalVO.getDiscountType().equals("2")) { + // 折扣计算 + repairOrderInfo.setReduceMoney(repairOrderInfo.getGoodsPrice().multiply(BigDecimal.valueOf(approvalVO.getDiscount() / 10))); + } - // 设置订单支付时间和支付结果 - repairOrderInfo.setPayTime(LocalDateTime.now()); - repairOrderInfo.setOrderStatus("1"); + // 设置订单支付时间和支付结果 + repairOrderInfo.setPayTime(LocalDateTime.now()); + repairOrderInfo.setOrderStatus("1"); // } // 更新工单 baseMapper.updateById(repairTicketsRespVO); @@ -885,6 +887,223 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl + * @Author 许 + * @Description 统计详情-细分工单类型 + * @Date 14:15 2025/9/3 + * @Param [startDate, endDate] + */ + @Override + public Map getBossNumStatistics(String startDate, String endDate) { + Map resultMap = new HashMap<>(); + List> statsList = new ArrayList<>(); + + // 构建查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + + if (startDate != null && endDate != null) { + // 如果有时间范围,添加时间条件 + queryWrapper.between("create_time", + startDate + " 00:00:00", + endDate + " 23:59:59"); + } + + // 根据条件查询工单 + List ticketsInRange = this.list(queryWrapper); + + // 维修中(按 repairType 分组) + Map workingStats = ticketsInRange.stream() + .filter(item -> TicketsStatusEnum.WORKING.getCode().equals(item.getTicketsStatus())) + .collect(Collectors.groupingBy(DlRepairTickets::getRepairType, Collectors.counting())); + statsList.add(createStatsNode("workingNum", "维修中", workingStats)); + + // 在厂(未交车且不是已完成状态 03) + Map inCompanyStats = ticketsInRange.stream() + .filter(item -> "0".equals(item.getIsHandover())) + .filter(item -> !"03".equals(item.getTicketsStatus())) + .collect(Collectors.groupingBy(DlRepairTickets::getRepairType, Collectors.counting())); + statsList.add(createStatsNode("inCompanyNum", "在厂", inCompanyStats)); + + // 未结算 + List noPayCodeList = Arrays.asList("04", "05", "07", "01"); + Map noPayStats = ticketsInRange.stream() + .filter(item -> noPayCodeList.contains(item.getTicketsStatus())) + .collect(Collectors.groupingBy(DlRepairTickets::getRepairType, Collectors.counting())); + statsList.add(createStatsNode("noPayNum", "未结算", noPayStats)); + + // 进厂数(所有在范围内创建的) + Map newOrderStats = ticketsInRange.stream() + .collect(Collectors.groupingBy(DlRepairTickets::getRepairType, Collectors.counting())); + statsList.add(createStatsNode("newOrderNum", "进厂数", newOrderStats)); + + // 已完成(通过 mapper 查询并按 repairType 分组) + Map overStats = getOverStatsByRepairType(startDate, endDate); + statsList.add(createStatsNode("overNum", "已完成", overStats)); + + // 已交车(通过 mapper 查询并按 repairType 分组) + Map giveCusStats = getGiveCusStatsByRepairType(startDate, endDate); + statsList.add(createStatsNode("giveCusNum", "已交车", giveCusStats)); + + // 添加到结果map + resultMap.put("stats", statsList); + + // 统计金额信息 + Map amountStats = calculateAmountStats(startDate, endDate); + resultMap.putAll(amountStats); + + return resultMap; + } + + // 获取已完成工单按维修类型分组的统计(优化版本) + private Map getOverStatsByRepairType(String startDate, String endDate) { + // 直接使用 mapper 查询已完成工单并按 repairType 分组 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ne("drt.tickets_status", "03"); // 已完成状态 + + if (startDate != null && endDate != null) { + queryWrapper.between("drt.create_time", + startDate + " 00:00:00", + endDate + " 23:59:59"); + } + queryWrapper.eq("drr.type", RecordTypeEnum.ZJ.getCode()); + +// // 使用 group by 直接在数据库层面分组统计 +// List> result = repairTicketsMapper.selectMaps( +// queryWrapper.select("repair_type", "count(*) as count") +// .groupBy("repair_type") +// queryWrapper.getSqlSelect() +// ); + + // 使用 group by 直接在数据库层面分组统计 + List> result = repairTicketsMapper.selectTicketIdByParamsNew( + queryWrapper.select("repair_type", "count(*) as count") + .groupBy("repair_type") + ); + + return convertGroupResult(result); + } + + // 获取已交车工单按维修类型分组的统计(优化版本) + private Map getGiveCusStatsByRepairType(String startDate, String endDate) { + // 直接使用 mapper 查询已交车工单并按 repairType 分组 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_handover", "1"); // 已交车 + + if (startDate != null && endDate != null) { + queryWrapper.between("create_time", + startDate + " 00:00:00", + endDate + " 23:59:59"); + } + + // 使用 group by 直接在数据库层面分组统计 + List> result = repairTicketsMapper.selectMaps( + queryWrapper.select("repair_type", "count(*) as count") + .groupBy("repair_type") + ); + + return convertGroupResult(result); + } + + // 转换分组查询结果 + private Map convertGroupResult(List> result) { + Map stats = new HashMap<>(); + if (result != null) { + for (Map map : result) { + String repairType = (String) map.get("repair_type"); + Long count = (Long) map.get("count"); + if (repairType != null && count != null) { + stats.put(repairType, count); + } + } + } + return stats; + } + + // 创建统计节点的辅助方法 + private Map createStatsNode(String code, String name, Map stats) { + Map node = new HashMap<>(); + node.put("code", code); + node.put("name", name); + + List> children = stats.entrySet().stream() + .map(entry -> { + Map child = new HashMap<>(); + child.put("repairType", entry.getKey()); + child.put("count", entry.getValue()); + return child; + }) + .collect(Collectors.toList()); + + node.put("children", children); + + // 计算该统计项的总数 + long total = stats.values().stream().mapToLong(Long::longValue).sum(); + node.put("total", total); + + return node; + } + + // 计算金额统计 + private Map calculateAmountStats(String startDate, String endDate) { + Map amountMap = new HashMap<>(); + + // 应收款:竣工已结算的单子的总金额 + QueryWrapper receivableWrapper = new QueryWrapper<>(); +// receivableWrapper.eq("tickets_status", "03"); + + if (startDate != null && endDate != null) { + receivableWrapper.between("drt.create_time", + startDate + " 00:00:00", + endDate + " 23:59:59"); + } + + List> receivables = repairTicketsMapper.selectSumAmount(receivableWrapper); + BigDecimal receivableAmount = BigDecimal.ZERO; + Integer receivableCount = 0; + BigDecimal receivedAmount = BigDecimal.ZERO; + Integer receivedCount = 0; + for (Map receivable : receivables) { + // 转换为TicketsSettlementVO + Object otherData = receivable.get("otherData"); + TicketsSettlementVO settlement = JSONObject.parseObject( + otherData.toString(), TicketsSettlementVO.class + ); + + //计算实付金额的总和 + BigDecimal actualMoney = settlement.getActualMoney(); + receivableAmount = receivableAmount.add(actualMoney); + + receivableCount++; + + //判断是否是已经确认收款的 + Object payType = receivable.get("payType"); + if (payType != null && "03".equals(payType.toString())) { + // 计算已收款金额 + BigDecimal isConfirmedReceive = settlement.getActualMoney(); + receivedAmount = receivedAmount.add(isConfirmedReceive); + + receivedCount++; + } + } + amountMap.put("receivableAmount", receivableAmount != null ? receivableAmount : BigDecimal.ZERO); + amountMap.put("receivableCount", receivableCount); + + // 已收款:应收款里面出纳确认收款的金额 + amountMap.put("receivedAmount", receivedAmount != null ? receivedAmount : BigDecimal.ZERO); + amountMap.put("receivedCount", receivedCount); + + // 待收款:应收 - 已收 + BigDecimal receivable = (BigDecimal) amountMap.get("receivableAmount"); + BigDecimal received = (BigDecimal) amountMap.get("receivedAmount"); + BigDecimal pendingAmount = receivable.subtract(received); + amountMap.put("pendingAmount", pendingAmount); + amountMap.put("pendingCount", receivableCount - receivedCount); + + return amountMap; + } + + /** * 客户信息和车辆信息 新增、修改 * @param customerAndCarVO 用户信息和车辆信息 @@ -2012,6 +2231,104 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl + **/ + @Override + public Map getBossNum(String startDate, String endDate) { + Map rtnMap = new HashMap<>(); + long workingNum = 0; + long inCompanyNum = 0; + long newOrderNum = 0; + long overNum = 0; + long giveCusNum = 0; + long noPayNum = 0; + + List workingIdList = new ArrayList<>(); + List inCompanyIdList = new ArrayList<>(); + List newOrderIdList = new ArrayList<>(); + List overIdList = new ArrayList<>(); + List giveCusIdList = new ArrayList<>(); + List noPayIdList = new ArrayList<>(); + + // 查询所有工单 + List repairTickets = this.list(); + if (!repairTickets.isEmpty()) { + List ticketsInRange = repairTickets; + + // 只有当startDate和endDate都不为null时才进行时间过滤 + if (startDate != null && endDate != null) { + // 时间范围 + 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")); + + // 在时间范围内的工单 + ticketsInRange = repairTickets.stream() + .filter(item -> { + LocalDateTime createTime = item.getCreateTime(); + return (createTime.isEqual(startTime) || createTime.isAfter(startTime)) && + (createTime.isEqual(endTime) || createTime.isBefore(endTime)); + }) + .collect(Collectors.toList()); + } + + // 维修中 + workingIdList = ticketsInRange.stream() + .filter(item -> TicketsStatusEnum.WORKING.getCode().equals(item.getTicketsStatus())) + .map(DlRepairTickets::getId).collect(Collectors.toList()); + workingNum = workingIdList.size(); + + // 在厂(未交车且不是已完成状态 03) + inCompanyIdList = ticketsInRange.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"); + noPayIdList = ticketsInRange.stream() + .filter(item -> noPayCodeList.contains(item.getTicketsStatus())) + .map(DlRepairTickets::getId).collect(Collectors.toList()); + noPayNum = noPayIdList.size(); + + // 进厂数(所有在范围内创建的) + newOrderIdList = ticketsInRange.stream().map(DlRepairTickets::getId).collect(Collectors.toList()); + newOrderNum = newOrderIdList.size(); + + // 已完成(走 mapper 查记录) + overIdList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.ZJ.getCode(), + startDate != null ? startDate + " 00:00:00" : null, + endDate != null ? endDate + " 23:59:59" : null); + overNum = overIdList.size(); + + // 已交车(走 mapper 查记录) + giveCusIdList = repairTicketsMapper.selectTicketIdByParams(null, RecordTypeEnum.JC.getCode(), + startDate != null ? startDate + " 00:00:00" : null, + endDate != null ? endDate + " 23:59:59" : null); + giveCusNum = giveCusIdList.size(); + } + + rtnMap.put("workingNum", workingNum); + rtnMap.put("workingIdList", workingIdList); + rtnMap.put("inCompanyNum", inCompanyNum); + rtnMap.put("inCompanyIdList", inCompanyIdList); + rtnMap.put("newOrderNum", newOrderNum); + rtnMap.put("newOrderIdList", newOrderIdList); + rtnMap.put("overNum", overNum); + rtnMap.put("overIdList", overIdList); + rtnMap.put("giveCusNum", giveCusNum); + rtnMap.put("giveCusIdList", giveCusIdList); + rtnMap.put("noPayNum", noPayNum); + rtnMap.put("noPayIdList", noPayIdList); + return rtnMap; + } + + /** * 服务顾问通知客户取车 * @param noticeCusVO 请求对象 diff --git a/dl-module-repair/src/main/resources/mapper/base/RepairStatisticsMapper.xml b/dl-module-repair/src/main/resources/mapper/base/RepairStatisticsMapper.xml index 36cdd0f3..b06ce8fd 100644 --- a/dl-module-repair/src/main/resources/mapper/base/RepairStatisticsMapper.xml +++ b/dl-module-repair/src/main/resources/mapper/base/RepairStatisticsMapper.xml @@ -135,14 +135,16 @@ r.ticket_no AS bizNo, r.repair_type AS bizType, r.in_time AS bizTime, + r.handle_name AS handleName, 'repair' AS source, + '维修' AS sourceStr, ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY r.in_time DESC) AS rn FROM base_customer_main c JOIN dl_repair_tickets r ON c.id = r.user_id WHERE 1 = 1 and c.deleted = 0 - AND r.in_time BETWEEN #{reqVO.dateRange[0]} AND #{reqVO.dateRange[1]} + AND r.in_time BETWEEN CONCAT(#{reqVO.dateRange[0]}, ' 00:00:00') AND CONCAT(#{reqVO.dateRange[1]}, ' 23:59:59') AND (c.cus_name LIKE CONCAT('%', #{reqVO.search}, '%') @@ -150,6 +152,7 @@ OR r.ticket_no LIKE CONCAT('%', #{reqVO.search}, '%') ) + ORDER BY r.in_time DESC