diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionMallPartnersController.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionMallPartnersController.java index 720305a4..17b160dc 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionMallPartnersController.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionMallPartnersController.java @@ -221,7 +221,7 @@ public class InspectionMallPartnersController extends BaseController { } } - rows.add(CollUtil.newArrayList(Optional.ofNullable(item.getCarNum()).orElse(item.getCertificateNum()), Optional.ofNullable(item.getGoodsTitle()).orElse(""), Optional.ofNullable(item.getSkuName()).orElse(""), Optional.ofNullable(item.getBusinessChannel()).orElse(""), Optional.ofNullable(item.getCustomerSource()).orElse(""), Optional.ofNullable(item.getOtherName()).orElse(""), Optional.ofNullable(item.getInsuranceCompanyName()).orElse(""), ObjectUtil.isNotEmpty(item.getInsuranceExpiryDate()) ? DateUtil.format(item.getInsuranceExpiryDate(), "yyyy-MM-dd") : "", ObjectUtil.isNotEmpty(item.getVehicleInsuranceExpiryDate()) ? DateUtil.format(item.getVehicleInsuranceExpiryDate(), "yyyy-MM-dd") : "", ObjectUtil.isEmpty(item.getGoodsPrice()) ? "" : BigDecimal.valueOf(item.getGoodsPrice()) + rows.add(CollUtil.newArrayList(ObjectUtil.isNotEmpty(item.getCarNum()) ? item.getCarNum() : item.getCertificateNum(), Optional.ofNullable(item.getGoodsTitle()).orElse(""), Optional.ofNullable(item.getSkuName()).orElse(""), Optional.ofNullable(item.getBusinessChannel()).orElse(""), Optional.ofNullable(item.getCustomerSource()).orElse(""), Optional.ofNullable(item.getOtherName()).orElse(""), Optional.ofNullable(item.getInsuranceCompanyName()).orElse(""), ObjectUtil.isNotEmpty(item.getInsuranceExpiryDate()) ? DateUtil.format(item.getInsuranceExpiryDate(), "yyyy-MM-dd") : "", ObjectUtil.isNotEmpty(item.getVehicleInsuranceExpiryDate()) ? DateUtil.format(item.getVehicleInsuranceExpiryDate(), "yyyy-MM-dd") : "", ObjectUtil.isEmpty(item.getGoodsPrice()) ? "" : BigDecimal.valueOf(item.getGoodsPrice()) .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) .toString(), ObjectUtil.isEmpty(item.getRealPayMoney()) ? "暂未支付" : BigDecimal.valueOf(item.getRealPayMoney()) .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) @@ -239,17 +239,18 @@ public class InspectionMallPartnersController extends BaseController { //时间类型 if (StringUtils.isNotEmpty(query.getDateType())) { + filterBuilder.append("时间类型:"); if (query.getDateType().equals("nextInspectionTime")) { - filterBuilder.append("下次年检时间:") + filterBuilder.append("下次年检时间") .append(","); } else if (query.getDateType().equals("jcTime")) { - filterBuilder.append("检测时间:") + filterBuilder.append("检测时间") .append(","); } else if (query.getDateType().equals("bxTime")) { - filterBuilder.append("保险到期时间(交强):") + filterBuilder.append("保险到期时间(交强)") .append(","); } else if (query.getDateType().equals("bxVehicleTime")) { - filterBuilder.append("保险到期时间(商业):") + filterBuilder.append("保险到期时间(商业)") .append(","); } } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/PartnerOwnController.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/PartnerOwnController.java index efe89a57..fbf36dd4 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/PartnerOwnController.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/PartnerOwnController.java @@ -930,6 +930,17 @@ public class PartnerOwnController extends BaseController { return success(partnerList.getStaffCount(dlInspectionProject)); } + /** + * 获取员工统计 + * + * @param dlInspectionProject 项目 + * @return 结果 + */ + @PostMapping("/getStaffCountByUserId") + public CommonResult getStaffCountByUserId(@RequestBody DlInspectionProject dlInspectionProject) { + return success(partnerList.getStaffCountByUserId(dlInspectionProject)); + } + /** * 文件统计 * diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/StatisticsController.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/StatisticsController.java new file mode 100644 index 00000000..1410d7c5 --- /dev/null +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/admin/StatisticsController.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.inspection.controller.admin; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.inspection.entity.DlInspectionProject; +import cn.iocoder.yudao.module.inspection.service.StatisticsService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @BelongsProject: lanan-system + * @BelongsPackage: cn.iocoder.yudao.module.inspection.controller.admin + * @Author: 许 + * @CreateTime: 2025-08-05 11:16 + * @Description: 数据统计接口 + * @Version: 1.0 + */ +@RestController +@RequestMapping("/inspection/statistics") +@RequiredArgsConstructor +public class StatisticsController { + + private final StatisticsService statisticsService; + + /** + * @description: 获取员工项目统计信息 + * @author: 许 + * @date: 2025/8/5 11:21 + * @param: [dlInspectionProject] + * @return: cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @PostMapping("/queryStaffStatisticsInfo") + public CommonResult queryStaffStatisticsInfo(@RequestBody DlInspectionProject dlInspectionProject) { + return CommonResult.success(statisticsService.queryStaffStatisticsInfo(dlInspectionProject)); + } + + /** + * @description: 获取员工检测项目统计 (根据车型) + * @author: 许 + * @date: 2025/8/5 14:28 + * @param: [dlInspectionProject] + * @return: cn.iocoder.yudao.framework.common.pojo.CommonResult + **/ + @PostMapping("/queryStaffStatisticsGroupByGoods") + public CommonResult queryStaffStatisticsGroupByGoods(@RequestBody DlInspectionProject dlInspectionProject) { + return CommonResult.success(statisticsService.queryStaffCountGroupByGoods(dlInspectionProject)); + } +} diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/entity/DlInspectionProject.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/entity/DlInspectionProject.java index b8ea98ea..50738fee 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/entity/DlInspectionProject.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/entity/DlInspectionProject.java @@ -51,4 +51,10 @@ public class DlInspectionProject extends TenantBaseDO { @TableField(exist = false) private List datetimeRange; + + @TableField(exist = false) + private Long userId; + + @TableField(exist = false) + private String goodsTitle ; } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionInfoMapper.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionInfoMapper.java index a0c3d7a8..561df16a 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionInfoMapper.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionInfoMapper.java @@ -101,7 +101,7 @@ public interface InspectionInfoMapper extends BaseMapper IPage geStelectInspectionByBusiness(@Param("page") Page page,@Param("info") InspectionInfo inspectionInfo); - List selectMeetCarList(@Param("datetimeRange") List datetimeRange); + List selectMeetCarList(@Param("datetimeRange") List datetimeRange,@Param("goodsTitle") String goodsTitle); Map workOrderDataNew(@Param("query") OrderTableQuery query); diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionWorkNodeMapper.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionWorkNodeMapper.java index 11147d46..fa42e004 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionWorkNodeMapper.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/mapper/InspectionWorkNodeMapper.java @@ -44,6 +44,8 @@ public interface InspectionWorkNodeMapper extends BaseMapper List getStaffCount(DlInspectionProject dlInspectionProject); + List getStaffCountByUserId(DlInspectionProject dlInspectionProject); + /** * 根据检测id获取异常节点 * @param idList @@ -52,4 +54,22 @@ public interface InspectionWorkNodeMapper extends BaseMapper List> selectExceptionNodesByInspectionIds(@Param("ids") List idList); IPage> selectStaffProjectByUserId(@Param("page")Page> page, @Param("query") InspectionListQuery query); + + /** + * @description: 查询员工项目统计根据车型 + * @author: 许 + * @date: 2025/8/5 13:13 + * @param: [dlInspectionProject] + * @return: java.util.List> + **/ + List> queryStaffCountGroupByGoods(DlInspectionProject dlInspectionProject); + + /** + * @description: 查询员工项目统计 + * @author: 许 + * @date: 2025/8/5 14:07 + * @param: [dlInspectionProject] + * @return: java.util.Map + **/ + Map queryStaffInspectionCount(DlInspectionProject dlInspectionProject); } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/AppInspectionPartnerService.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/AppInspectionPartnerService.java index cf663790..37d7eb04 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/AppInspectionPartnerService.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/AppInspectionPartnerService.java @@ -249,6 +249,14 @@ public interface AppInspectionPartnerService extends IService */ List> getStaffCount(DlInspectionProject dlInspectionProject); + /** + * 查询员工统计 + * + * @param dlInspectionProject 项目信息 + * @return 结果 + */ + Map getStaffCountByUserId(DlInspectionProject dlInspectionProject); + /** * 文件统计 * diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java index 29df7569..1bff7333 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java @@ -181,7 +181,7 @@ public interface IInspectionInfoService extends IService Map getBusinessCountByType(Integer partnerId, List datetimeRange); - List selectMeetCarList(List datetimeRange); + List selectMeetCarList(List datetimeRange, String goodsTitle); List selectLatestByCarNums(Collection carNos); diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionWorkNodeService.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionWorkNodeService.java index 3759a91c..89b9759a 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionWorkNodeService.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionWorkNodeService.java @@ -76,6 +76,14 @@ public interface IInspectionWorkNodeService extends IService */ List> getStaffCount(DlInspectionProject dlInspectionProject); + /** + * 获取员工统计排序 + * + * @param dlInspectionProject + * @return + */ + Map getStaffCountByUserId(DlInspectionProject dlInspectionProject); + /** * 根据检测id获取异常节点 * @@ -89,4 +97,22 @@ public interface IInspectionWorkNodeService extends IService * @param idList */ void updateException(Long inspectionInfoId,List idList); + + /** + * @description: 员工统计根据车型 + * @author: 许 + * @date: 2025/8/5 11:41 + * @param: [dlInspectionProject] + * @return: java.util.List> + **/ + List> queryStaffCountGroupByGoods(DlInspectionProject dlInspectionProject); + + /** + * @description: 员工统计初检数量和复检数量 + * @author: 许 + * @date: 2025/8/5 14:04 + * @param: [dlInspectionProject] + * @return: java.util.Map + **/ + Map queryStaffInspectionCount(DlInspectionProject dlInspectionProject); } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/StatisticsService.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/StatisticsService.java new file mode 100644 index 00000000..79e46c7a --- /dev/null +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/StatisticsService.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.inspection.service; + +import cn.iocoder.yudao.module.inspection.entity.DlInspectionProject; + +import java.util.Map; + +public interface StatisticsService { + + /** + * @description: 获取员工统计信息 + * @author: 许 + * @date: 2025/8/5 11:25 + * @param: [dlInspectionProject] + * @return: java.util.Map + **/ + Map queryStaffStatisticsInfo(DlInspectionProject dlInspectionProject); + + /** + * @description: 获取员工统计信息 + * @author: 许 + * @date: 2025/8/5 14:30 + * @param: [dlInspectionProject] + * @return: java.util.Map + **/ + Map queryStaffCountGroupByGoods(DlInspectionProject dlInspectionProject); +} diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/AppInspectionPartnerServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/AppInspectionPartnerServiceImpl.java index e92bfec1..b5be9015 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/AppInspectionPartnerServiceImpl.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/AppInspectionPartnerServiceImpl.java @@ -2517,7 +2517,7 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl> getStaffCount(DlInspectionProject dlInspectionProject) { List> staffCount = inspectionWorkNodeService.getStaffCount(dlInspectionProject); // 根据userId查询检测工单表 接车人 - List list = inspectionInfoService.selectMeetCarList(dlInspectionProject.getDatetimeRange()); + List list = inspectionInfoService.selectMeetCarList(dlInspectionProject.getDatetimeRange(),null); // 统计每个 meetManId 的数量,避免 null key 异常 Map> meetManIdCountMap = list.stream() .filter(info -> info.getMeetManId() != null) // 过滤 null 值 @@ -2602,17 +2602,119 @@ public class AppInspectionPartnerServiceImpl extends ServiceImpl { List> children = (List>) staff.get("children"); if (children != null) { + children.removeIf(child -> ((Long) child.getOrDefault("count", 0L)) == 0L); children.sort(Comparator.comparingLong( (Map child) -> (Long) child.getOrDefault("count", 0L) ).reversed()); } }); + return staffCount; } + /** + * 查询员工统计 + * + * @param dlInspectionProject 项目信息 + * @return 结果 + */ + @Override + public Map getStaffCountByUserId(DlInspectionProject dlInspectionProject) { + Map staffCount = inspectionWorkNodeService.getStaffCountByUserId(dlInspectionProject); + if (staffCount == null || staffCount.isEmpty()) { + return Collections.emptyMap(); + } + + Long userId = (Long) staffCount.get("userId"); + + Set inspectionInfoIds = new HashSet<>(); + + List> children = (List>) staffCount.get("children"); + if (children == null) { + children = new ArrayList<>(); + staffCount.put("children", children); + } + + // 收集已有项目中的 inspectionInfoId + inspectionInfoIds.addAll( + children.stream() + .map(map -> (String) map.get("inspectionInfoId")) + .flatMap(idsStr -> Arrays.stream(idsStr.split(","))) + .map(String::trim) + .filter(idStr -> !idStr.isEmpty()) + .map(Long::valueOf) + .collect(Collectors.toSet()) + ); + + // 查询接车信息 + List meetCarList = inspectionInfoService.selectMeetCarList(dlInspectionProject.getDatetimeRange(), dlInspectionProject.getGoodsTitle()); + List userMeetCarList = meetCarList.stream() + .filter(i -> userId.equals(i.getMeetManId())) + .collect(Collectors.toList()); + + long meetCount = userMeetCarList.stream().filter(i -> Integer.valueOf(0).equals(i.getMeetType())).count(); + long meetGoCount = userMeetCarList.stream().filter(i -> Integer.valueOf(1).equals(i.getMeetType())).count(); + inspectionInfoIds.addAll(userMeetCarList.stream().map(InspectionInfo::getId).collect(Collectors.toList())); + + Map meetPhotoMap = new HashMap<>(); + meetPhotoMap.put("projectName", "接车拍照"); + meetPhotoMap.put("count", meetCount); + children.add(meetPhotoMap); + + Map meetGoMap = new HashMap<>(); + meetGoMap.put("projectName", "上门接车"); + meetGoMap.put("count", meetGoCount); + children.add(meetGoMap); + + + // 查询还车信息 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(InspectionInfo::getIsReturnCar, 1); + + List datetimeRange = dlInspectionProject.getDatetimeRange(); + if (CollUtil.isNotEmpty(datetimeRange) && datetimeRange.size() == 2) { + wrapper.between(InspectionInfo::getEndTime, datetimeRange.get(0), datetimeRange.get(1)); + } + + List returnCarList = inspectionInfoService.list(wrapper); + + + List userReturnCarList = returnCarList.stream() + .filter(i -> userId.equals(i.getReturnCarUserId())) + .collect(Collectors.toList()); + + long returnCount = userReturnCarList.stream().filter(i -> Integer.valueOf(0).equals(i.getReturnType())).count(); + long returnGoCount = userReturnCarList.stream().filter(i -> Integer.valueOf(1).equals(i.getReturnType())).count(); + inspectionInfoIds.addAll(userReturnCarList.stream().map(InspectionInfo::getId).collect(Collectors.toList())); + + Map returnPhotoMap = new HashMap<>(); + returnPhotoMap.put("projectName", "还车拍照"); + returnPhotoMap.put("count", returnCount); + children.add(returnPhotoMap); + + Map returnGoMap = new HashMap<>(); + returnGoMap.put("projectName", "上门还车"); + returnGoMap.put("count", returnGoCount); + children.add(returnGoMap); + + + // 重新设置总数 + staffCount.put("totalCount", (long) inspectionInfoIds.size()); + + // 移除 count == 0 的 children + children.removeIf(c -> ((Long) c.getOrDefault("count", 0L)) == 0L); + // 按 count 降序排序 + children.sort(Comparator.comparingLong(c -> (Long) c.getOrDefault("count", 0L))); + Collections.reverse(children); + + return staffCount; + } + + /** * 文件统计 * diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionFileServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionFileServiceImpl.java index 4ce79b26..77020f8a 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionFileServiceImpl.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionFileServiceImpl.java @@ -200,27 +200,7 @@ public class InspectionFileServiceImpl extends ServiceImpl tenantAdmin = roleApi.selectUserListByRoleCode(SecurityFrameworkUtils.getLoginUser().getTenantId(), "tenant_admin"); String content = String.join(",", keys); if (CollUtil.isNotEmpty(tenantAdmin)) { - // 判断是服务套餐是检测还是驾校 - switch (inspectionFile.getServicePackageId()) { - case "jiance": - for (UserDTO userDTO : tenantAdmin) { - noticeService.sentMessage(userDTO.getId(), content); - } - break; - case "jiaxiao": - for (UserDTO userDTO : tenantAdmin) { - // 准备发送参数 - Map templateParams = new HashMap<>(); - // 发送模版内容 - templateParams.put("text", content); - commonNotifyMessageSendService.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO() - .setUserId(userDTO.getId()) - .setTemplateCode(TICKET_EMPLOY) - .setSystemCode(SystemEnum.SCHOOL.getCode()) - .setTemplateParams(templateParams)); - } - break; - } + this.sendMessage(tenantAdmin.stream().map(UserDTO::getId).collect(Collectors.toList()), content, inspectionFile.getServicePackageId()); } } catch (IllegalAccessException e) { throw new RuntimeException(e); @@ -819,4 +799,26 @@ public class InspectionFileServiceImpl extends ServiceImpl userIdS, String text, String code) { + // 准备发送参数 + Map templateParams = new HashMap<>(); + // 发送模版内容 + templateParams.put("text", text); + // 发送站内信 + userIdS.forEach(userId -> { + commonNotifyMessageSendService.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO() + .setUserId(userId) + .setTemplateCode(TICKET_EMPLOY) + .setSystemCode(code) + .setTemplateParams(templateParams)); + }); + + } + } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java index cc00a66b..6778dcc3 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java @@ -1092,8 +1092,8 @@ public class InspectionInfoServiceImpl extends ServiceImpl selectMeetCarList(List datetimeRange) { - return baseMapper.selectMeetCarList(datetimeRange); + public List selectMeetCarList(List datetimeRange, String goodsTitle) { + return baseMapper.selectMeetCarList(datetimeRange,goodsTitle); } /** diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionWorkNodeServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionWorkNodeServiceImpl.java index 2b1454e6..fd6eea59 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionWorkNodeServiceImpl.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionWorkNodeServiceImpl.java @@ -495,6 +495,61 @@ public class InspectionWorkNodeServiceImpl extends ServiceImpl getStaffCountByUserId(DlInspectionProject dlInspectionProject) { + Map> tempMap = new LinkedHashMap<>(); + List staffCount = baseMapper.getStaffCountByUserId(dlInspectionProject); + + for (StaffProjectCountVO vo : staffCount) { + Map userEntry = tempMap.computeIfAbsent(vo.getUserId(), k -> { + Map m = new HashMap<>(); + m.put("userId", vo.getUserId()); + m.put("nickname", vo.getNickname()); + m.put("totalCount", 0L); // 初始总数 + m.put("children", new ArrayList>()); + return m; + }); + + // 添加项目 + List> children = (List>) userEntry.get("children"); + vo.setCount(vo.getCount() == null ? 0 : vo.getCount()); + if (vo.getCount() == 0) { + continue; + } + Map project = new HashMap<>(); + project.put("projectName", vo.getProjectName()); + project.put("count", vo.getCount()); + project.put("id", vo.getId()); + project.put("inspectionInfoId", vo.getInspectionInfoIds()); + children.add(project); + + // 累加总数 + Long currentTotal = (Long) userEntry.get("totalCount"); + userEntry.put("totalCount", currentTotal + vo.getCount()); + } + + // 如果查出来的用户为空,返回空对象 + if (tempMap.isEmpty()) { + return Collections.emptyMap(); + } + + // 只取一个用户数据(因为你保证只有一个用户) + Map result = tempMap.values().iterator().next(); + + // 排序该用户下的项目 children + List> children = (List>) result.get("children"); + children.sort((a, b) -> Long.compare((Long) b.get("count"), (Long) a.get("count"))); + + return result; + } + + /** * 根据检测id获取异常节点 * @@ -535,6 +590,30 @@ public class InspectionWorkNodeServiceImpl extends ServiceImpl> + */ + @Override + public List> queryStaffCountGroupByGoods(DlInspectionProject dlInspectionProject) { + return baseMapper.queryStaffCountGroupByGoods(dlInspectionProject); + } + + /** + * @description: 员工统计初检数量和复检数量 + * @author: 许 + * @date: 2025/8/5 14:04 + * @param: [dlInspectionProject] + * @return: java.util.Map + */ + @Override + public Map queryStaffInspectionCount(DlInspectionProject dlInspectionProject) { + return baseMapper.queryStaffInspectionCount(dlInspectionProject); + } + /** * 判断传入的 InspectionWorkNode 对象是否在集合中有后续项目 * diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/StatisticsServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/StatisticsServiceImpl.java new file mode 100644 index 00000000..b022e672 --- /dev/null +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/StatisticsServiceImpl.java @@ -0,0 +1,160 @@ +package cn.iocoder.yudao.module.inspection.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.inspection.entity.DlInspectionProject; +import cn.iocoder.yudao.module.inspection.entity.InspectionInfo; +import cn.iocoder.yudao.module.inspection.service.IInspectionInfoService; +import cn.iocoder.yudao.module.inspection.service.IInspectionWorkNodeService; +import cn.iocoder.yudao.module.inspection.service.StatisticsService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @BelongsProject: lanan-system + * @BelongsPackage: cn.iocoder.yudao.module.inspection.service.impl + * @Author: 许 + * @CreateTime: 2025-08-05 11:24 + * @Description: 数据统计实现类 + * @Version: 1.0 + */ +@Service +@RequiredArgsConstructor +public class StatisticsServiceImpl implements StatisticsService { + + private final IInspectionWorkNodeService inspectionWorkNodeService; + + private final IInspectionInfoService inspectionInfoService; + + private final AdminUserApi adminUserApi; + /** + * @description: 获取员工统计信息 + * @author: 许 + * @date: 2025/8/5 11:25 + * @param: [dlInspectionProject] + * @return: java.util.Map + */ + @Override + public Map queryStaffStatisticsInfo(DlInspectionProject dlInspectionProject) { + Map result = new HashMap<>(); + /*车型数量统计*/ + //1.根据userId查询完成的车型数量 + List> goodsStatistics = inspectionWorkNodeService.queryStaffCountGroupByGoods(dlInspectionProject); + result.put("goodsStatistics", goodsStatistics); + + /*初检数量统计 复检数量统计*/ + //1.根据userId查询 + Map inspectionStatistics =inspectionWorkNodeService.queryStaffInspectionCount(dlInspectionProject); + result.put("inspectionStatistics", inspectionStatistics); + + /*获取员工信息*/ + AdminUserRespDTO user = adminUserApi.getUser(dlInspectionProject.getUserId()); + result.put("staffInfo", user); + return result; + } + + /** + * @description: 获取员工统计信息 + * @author: 许 + * @date: 2025/8/5 14:30 + * @param: [dlInspectionProject] + * @return: java.util.Map + */ + @Override + public Map queryStaffCountGroupByGoods(DlInspectionProject dlInspectionProject) { + Map staffCount = inspectionWorkNodeService.getStaffCountByUserId(dlInspectionProject); + if (staffCount == null || staffCount.isEmpty()) { + return Collections.emptyMap(); + } + + Long userId = (Long) staffCount.get("userId"); + + Set inspectionInfoIds = new HashSet<>(); + + List> children = (List>) staffCount.get("children"); + if (children == null) { + children = new ArrayList<>(); + staffCount.put("children", children); + } + + // 收集已有项目中的 inspectionInfoId + inspectionInfoIds.addAll( + children.stream() + .map(map -> (String) map.get("inspectionInfoId")) + .flatMap(idsStr -> Arrays.stream(idsStr.split(","))) + .map(String::trim) + .filter(idStr -> !idStr.isEmpty()) + .map(Long::valueOf) + .collect(Collectors.toSet()) + ); + + // 查询接车信息 + List meetCarList = inspectionInfoService.selectMeetCarList(dlInspectionProject.getDatetimeRange(), dlInspectionProject.getGoodsTitle()); + List userMeetCarList = meetCarList.stream() + .filter(i -> userId.equals(i.getMeetManId())) + .collect(Collectors.toList()); + + long meetCount = userMeetCarList.stream().filter(i -> Integer.valueOf(0).equals(i.getMeetType())).count(); + long meetGoCount = userMeetCarList.stream().filter(i -> Integer.valueOf(1).equals(i.getMeetType())).count(); + inspectionInfoIds.addAll(userMeetCarList.stream().map(InspectionInfo::getId).collect(Collectors.toList())); + + Map meetPhotoMap = new HashMap<>(); + meetPhotoMap.put("projectName", "接车拍照"); + meetPhotoMap.put("count", meetCount); + children.add(meetPhotoMap); + + Map meetGoMap = new HashMap<>(); + meetGoMap.put("projectName", "上门接车"); + meetGoMap.put("count", meetGoCount); + children.add(meetGoMap); + + + // 查询还车信息 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(InspectionInfo::getIsReturnCar, 1); + + List datetimeRange = dlInspectionProject.getDatetimeRange(); + if (CollUtil.isNotEmpty(datetimeRange) && datetimeRange.size() == 2) { + wrapper.between(InspectionInfo::getEndTime, datetimeRange.get(0), datetimeRange.get(1)); + } + + List returnCarList = inspectionInfoService.list(wrapper); + + + List userReturnCarList = returnCarList.stream() + .filter(i -> userId.equals(i.getReturnCarUserId())) + .collect(Collectors.toList()); + + long returnCount = userReturnCarList.stream().filter(i -> Integer.valueOf(0).equals(i.getReturnType())).count(); + long returnGoCount = userReturnCarList.stream().filter(i -> Integer.valueOf(1).equals(i.getReturnType())).count(); + inspectionInfoIds.addAll(userReturnCarList.stream().map(InspectionInfo::getId).collect(Collectors.toList())); + + Map returnPhotoMap = new HashMap<>(); + returnPhotoMap.put("projectName", "还车拍照"); + returnPhotoMap.put("count", returnCount); + children.add(returnPhotoMap); + + Map returnGoMap = new HashMap<>(); + returnGoMap.put("projectName", "上门还车"); + returnGoMap.put("count", returnGoCount); + children.add(returnGoMap); + + + // 重新设置总数 + staffCount.put("totalCount", (long) inspectionInfoIds.size()); + + // 移除 count == 0 的 children + children.removeIf(c -> ((Long) c.getOrDefault("count", 0L)) == 0L); + // 按 count 降序排序 + children.sort(Comparator.comparingLong(c -> (Long) c.getOrDefault("count", 0L))); + Collections.reverse(children); + + return staffCount; + } +} diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/job/logger/AccessLogCleanJob.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/job/logger/AccessLogCleanJob.java deleted file mode 100644 index d8917f2e..00000000 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/job/logger/AccessLogCleanJob.java +++ /dev/null @@ -1,41 +0,0 @@ -//package cn.iocoder.yudao.module.job.logger; -// -//import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; -//import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; -//import cn.iocoder.yudao.module.infra.service.logger.ApiAccessLogService; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.stereotype.Component; -// -//import javax.annotation.Resource; -// -///** -// * 物理删除 N 天前的访问日志的 Job -// * -// * @author j-sentinel -// */ -//@Component -//@Slf4j -//public class AccessLogCleanJob implements JobHandler { -// -// @Resource -// private ApiAccessLogService apiAccessLogService; -// -// /** -// * 清理超过(14)天的日志 -// */ -// private static final Integer JOB_CLEAN_RETAIN_DAY = 14; -// -// /** -// * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大 -// */ -// private static final Integer DELETE_LIMIT = 100; -// -// @Override -// @TenantIgnore -// public String execute(String param) { -// Integer count = apiAccessLogService.cleanAccessLog(JOB_CLEAN_RETAIN_DAY, DELETE_LIMIT); -// log.info("[execute][定时执行清理访问日志数量 ({}) 个]", count); -// return String.format("定时执行清理访问日志数量 %s 个", count); -// } -// -//} diff --git a/dl-module-inspection/src/main/resources/mapper/InspectionWorkNodeMapper.xml b/dl-module-inspection/src/main/resources/mapper/InspectionWorkNodeMapper.xml index 44202f4c..1598d61d 100644 --- a/dl-module-inspection/src/main/resources/mapper/InspectionWorkNodeMapper.xml +++ b/dl-module-inspection/src/main/resources/mapper/InspectionWorkNodeMapper.xml @@ -267,6 +267,9 @@ staff.deleted = 0 AND su.deleted = 0 AND (valid_roles.user_id IS NOT NULL) -- 只保留有合格角色的用户 + + AND staff.user_id = #{userId} + GROUP BY staff.user_id ,ip.id @@ -376,4 +379,83 @@ GROUP BY ii.id ORDER BY ii.start_time DESC; + + + diff --git a/dl-module-inspection/src/main/resources/mapper/inspection/AppInspectionPartnerMapper.xml b/dl-module-inspection/src/main/resources/mapper/inspection/AppInspectionPartnerMapper.xml index 4fde466d..8cc84dc6 100644 --- a/dl-module-inspection/src/main/resources/mapper/inspection/AppInspectionPartnerMapper.xml +++ b/dl-module-inspection/src/main/resources/mapper/inspection/AppInspectionPartnerMapper.xml @@ -707,6 +707,7 @@ FROM ON ii.id = iwn_agg.inspection_info_id LEFT JOIN shop_user_car car on car.car_no = ii.car_num + ii.deleted = 0 AND oi.deleted = 0 AND oi.pay_type = #{query.payType} diff --git a/dl-module-inspection/src/main/resources/mapper/inspection/InspectionInfoMapper.xml b/dl-module-inspection/src/main/resources/mapper/inspection/InspectionInfoMapper.xml index 0b7ef617..49f182ef 100644 --- a/dl-module-inspection/src/main/resources/mapper/inspection/InspectionInfoMapper.xml +++ b/dl-module-inspection/src/main/resources/mapper/inspection/InspectionInfoMapper.xml @@ -700,11 +700,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT ii.*, imco.meet_type FROM inspection_info ii LEFT JOIN inspection_meet_car_order imco ON ii.id = imco.inspection_info_id + JOIN order_info oi ON oi.id = ii.inspection_order_id ii.deleted = 0 AND imco.deleted = 0 AND imco.is_meet = '1' AND imco.create_time BETWEEN #{datetimeRange[0]} AND #{datetimeRange[1]} + + AND oi.goods_title = #{goodsTitle} +