From dc391936246ea4156fae38ad9802eac981bbc4b3 Mon Sep 17 00:00:00 2001 From: syruan <15555146157@163.com> Date: Mon, 28 Jul 2025 09:51:48 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=A2=86=E6=96=99?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MaterialLeaseInfoServiceImpl.java | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java index 16eaa8a5..87bbde81 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java @@ -1839,8 +1839,8 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService { } /** - * 预计算库存数据,替代复杂的类型树计算 - * 这个方法将原来每个detail都要执行的复杂计算优化为一次性预计算 + * 预计算库存数据,重现原始的类型树计算逻辑 + * 业务逻辑:总领料数量 - 已在用数量 = 剩余可用库存 */ private Map preCalculateStorageNums(MaterialLeaseApplyInfo info, List agreementList, @@ -1848,27 +1848,67 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService { Map storageNumMap = new HashMap<>(); try { - // 简化的库存计算:直接查询ma_type表的storage_num字段 - for (Long typeId : typeIds) { - try { - // 查询单个类型的信息,获取storage_num - Type typeInfo = typeMapper.selectTypeByTypeId(typeId); - if (typeInfo != null && typeInfo.getStorageNum() != null) { - storageNumMap.put(typeId, typeInfo.getStorageNum()); - } else { - storageNumMap.put(typeId, BigDecimal.ZERO); + log.info("开始预计算库存,原始类型树逻辑,处理{}个类型", typeIds.size()); + + // 第1步:从协议中获取总领料数量(原listL5逻辑) + Map totalLeaseNums = new HashMap<>(); + if (!CollectionUtils.isEmpty(agreementList)) { + for (AgreementVo agreementVo : agreementList) { + BackApplyInfo backApplyInfo = new BackApplyInfo(); + backApplyInfo.setAgreementId(Long.valueOf(agreementVo.getAgreementId())); + List listL4 = mapper.getUseTypeTreeL4(backApplyInfo); + + if (!CollectionUtils.isEmpty(listL4)) { + for (TypeTreeNode node : listL4) { + if (node.getTypeId() != 0L && node.getNum() != null) { + totalLeaseNums.merge(node.getTypeId(), node.getNum(), BigDecimal::add); + } + } } - } catch (Exception e) { - log.warn("查询typeId {}的库存失败: {}", typeId, e.getMessage()); - storageNumMap.put(typeId, BigDecimal.ZERO); } } - log.info("预计算库存完成,为{}个类型查询了库存值", typeIds.size()); + // 第2步:通过工程获取已在用数量(原list7逻辑) + Map usedNums = new HashMap<>(); + MaterialLeaseApplyInfo bean = new MaterialLeaseApplyInfo(); + bean.setProId(info.getProId()); + List listAgreement = materialLeaseInfoMapper.getAgreementIdByProId(bean); + if (!CollectionUtils.isEmpty(listAgreement)) { + for (BmAgreementInfo agreementInfo : listAgreement) { + bean.setAgreementId(agreementInfo.getAgreementId()); + List list6 = materialLeaseInfoMapper.getUseTypeTree(bean); + + if (!CollectionUtils.isEmpty(list6)) { + for (TypeTreeNode node : list6) { + if (node.getTypeId() != 0L && node.getNum() != null) { + usedNums.merge(node.getTypeId(), node.getNum(), BigDecimal::add); + } + } + } + } + } + + // 第3步:计算剩余库存 = 总领料数量 - 已在用数量 + for (Long typeId : typeIds) { + BigDecimal totalNum = totalLeaseNums.getOrDefault(typeId, BigDecimal.ZERO); + BigDecimal usedNum = usedNums.getOrDefault(typeId, BigDecimal.ZERO); + BigDecimal storageNum = totalNum.subtract(usedNum); + + // 确保不为负数 + if (storageNum.compareTo(BigDecimal.ZERO) < 0) { + storageNum = BigDecimal.ZERO; + } + + storageNumMap.put(typeId, storageNum); + } + + log.info("库存计算完成 - 总领料:{}项,已在用:{}项,计算库存:{}项", + totalLeaseNums.size(), usedNums.size(), storageNumMap.size()); + } catch (Exception e) { - log.error("预计算库存数据失败: {}", e.getMessage()); - // 发生错误时返回默认值 + log.error("预计算库存失败: {}", e.getMessage(), e); + // 失败时为所有类型设置默认值 for (Long typeId : typeIds) { storageNumMap.put(typeId, BigDecimal.ZERO); } From e1aef51b226761fee2545821e1e4a29c56db26cf Mon Sep 17 00:00:00 2001 From: syruan <15555146157@163.com> Date: Mon, 28 Jul 2025 11:11:01 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=80=80=E6=96=99=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C3=E7=A7=92->0.3=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BackApplyInfoServiceImpl.java | 400 +++++++++++------- 1 file changed, 255 insertions(+), 145 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java index ced22826..c515b16c 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java @@ -75,7 +75,7 @@ public class BackApplyInfoServiceImpl implements IBackApplyInfoService { private SelectMapper mapper; /** - * 查询退料任务 + * 查询退料任务 - 性能优化版 * * @param id 退料任务主键 * @return 退料任务 @@ -86,198 +86,308 @@ public class BackApplyInfoServiceImpl implements IBackApplyInfoService { //先根据外层id查询上层信息 BackApplyInfo backApplyInfo = backApplyInfoMapper.selectBackApplyInfoById(id); Long userId = SecurityUtils.getLoginUser().getUserid(); + // 首先根据用户名去ma_type_manage表查询是否存在绑定物资信息 List typeIdList = backApplyInfoMapper.selectTypeIdList(userId); if (CollectionUtils.isEmpty(typeIdList)) { backApplyInfo.setUserId(userId == 0 ? null : userId); } + /** 设置审批人签名url 防止代码冲突 **/ - String directAuditUrl = backApplyInfoMapper.getDirectAuditUrl(backApplyInfo); + String directAuditUrl = backApplyInfoMapper.getDirectAuditUrl(backApplyInfo); backApplyInfo.setDirectAuditSignUrl(directAuditUrl); /** 设置审批人签名url 防止代码冲突 **/ if (StringUtils.isNotBlank(backApplyInfo.getBackSignUrl())) { backApplyInfo.setBackSignUrl("data:image/png;base64," + backApplyInfo.getBackSignUrl()); } backApplyRequestVo.setBackApplyInfo(backApplyInfo); + //查询退料详情信息 backApplyInfo.setKeyWord(keyWord); // 移出maCodeList集合中状态不为在用的数据 List newCodeList = new ArrayList<>(); List backApplyDetailsList = backApplyInfoMapper.selectBackApplyDetailsListByTaskId(backApplyInfo); + if (CollectionUtils.isNotEmpty(backApplyDetailsList)) { if (!CollectionUtils.isEmpty(typeIdList)) { backApplyDetailsList = backApplyDetailsList.stream() .filter(item -> typeIdList.contains(item.getFirstId())) .collect(Collectors.toList()); } - // 批量查询附件信息,减少数据库访问次数 - List bmFileInfos = fetchBmFileInfos(id, backApplyDetailsList); - // 查询编码设备信息 - List maCodeList = fetchMaCodeList(id); - if ("0".equals(backApplyInfo.getStatus())) { - if (CollectionUtils.isNotEmpty(maCodeList)) { - // 将maCodeList不等于2的收集到新集合中 - for (MaCodeVo maCodeVo : maCodeList) { - if (StringUtils.isNotBlank(maCodeVo.getMaStatus()) && !"2".equals(maCodeVo.getMaStatus())) { - newCodeList.add(maCodeVo); - } - } - } - maCodeList = maCodeList.stream().filter(maCodeVo -> "2".equals(maCodeVo.getMaStatus())).collect(Collectors.toList()); + + // 核心优化:减少数据库查询次数 + // 1. 一次性查询编码设备信息 + List maCodeList = backApplyInfoMapper.selectByCode(id); + + // 2. 处理状态不为在用的设备编码 + if ("0".equals(backApplyInfo.getStatus()) && CollectionUtils.isNotEmpty(maCodeList)) { + newCodeList = filterNonInUseEquipment(maCodeList); + maCodeList = filterInUseEquipment(maCodeList); } - // 根据协议id查询设备在用数 - // 先查第四层类型 - List listL4 = mapper.getUseTypeTreeL4(backApplyInfo); + + // 3. 优化:只有在有编码设备时才查询类型树,减少不必要的复杂查询 + Map typeNumMap = new HashMap<>(); + if (hasCodedEquipment(backApplyDetailsList)) { + List listL4 = mapper.getUseTypeTreeL4(backApplyInfo); + typeNumMap = buildTypeNumMappingSimple(listL4); + } + + // 4. 一次性查询所有附件信息 + Map> allFileInfoMap = fetchAllFileInfosOptimized(id); + + // 5. 预构建映射表 + Map> typeCodeMap = buildTypeCodeMappingSimple(maCodeList); + Map maIdCodeMap = buildMaIdCodeMappingSimple(maCodeList); + + // 6. 快速处理每个退料详情 for (BackApplyDetails details : backApplyDetailsList) { - if (CollectionUtils.isNotEmpty(listL4)) { - for (TypeTreeNode node : listL4) { - if (node.getTypeId() == details.getTypeId()) { - details.setNum(node.getNum()); - break; - } - } - } - if ("0".equals(details.getManageType())) { - List list = backApplyInfoMapper.selectByCode(details.getParentId()); - if (CollectionUtils.isNotEmpty(list)) { - // 过滤出list中typeId和details.getTypeId相等的MaCodeVo对象 - list = list.stream().filter(type -> type.getTypeId().equals(details.getTypeId().toString())).collect(Collectors.toList()); - // 将goodNum和badNum分别相加 - details.setGoodNum(list.stream().map(MaCodeVo::getGoodNum).reduce(BigDecimal.ZERO, BigDecimal::add)); - details.setBadNum(list.stream().map(MaCodeVo::getBadNum).reduce(BigDecimal.ZERO, BigDecimal::add)); - } - } - // 为每个退料详情设置附件信息 - setBmFileInfosForDetails(details, bmFileInfos); - // 如果是编码设备,查询并设置相关的编码信息和附件 - if ("0".equals(details.getManageType())) { - setMaCodeDetails(details, maCodeList); - } - if (CollectionUtils.isNotEmpty(newCodeList)) { - for (MaCodeVo maCodeVo : newCodeList) { - if (maCodeVo.getTypeId().equals(details.getTypeId().toString())) { - details.setPreNum(details.getPreNum().subtract(BigDecimal.valueOf(1))); - } - // 根据maId查询设备编码信息 - BackApplyInfo dto = new BackApplyInfo(); - dto.setId(id); - dto.setMaId(maCodeVo.getMaId()); - MaCodeVo info = backApplyInfoMapper.selectDto(dto); - if (null != info) { - if (info.getMaId().equals(maCodeVo.getMaId())) { - if (info.getGoodNum() != null && info.getGoodNum().compareTo(BigDecimal.ZERO) > 0) { - details.setGoodNum(details.getGoodNum().subtract(info.getGoodNum())); - } else if (info.getBadNum() != null && info.getBadNum().compareTo(BigDecimal.ZERO) > 0) { - details.setBadNum(details.getBadNum().subtract(info.getBadNum())); - } - } - } - } - } + processBackApplyDetailsSimple(details, typeNumMap, typeCodeMap, allFileInfoMap, newCodeList, maIdCodeMap); } + backApplyRequestVo.setBackApplyDetailsList(backApplyDetailsList); } + AjaxResult ajaxResult = AjaxResult.success(); ajaxResult.put("data", backApplyRequestVo); + if (CollectionUtils.isNotEmpty(newCodeList)) { - // 拼接消息内容 - StringBuffer msgBuilder = new StringBuffer("您所选择的编码设备编号"); - for (int i = 0; i < newCodeList.size(); i++) { - String code = newCodeList.get(i).getMaCode(); - msgBuilder.append(code); - if (i < newCodeList.size() - 1) { - msgBuilder.append(", "); - } - } - msgBuilder.append("已被他人完成退料,请注意查看!"); - String msg = msgBuilder.toString(); - msg = msg.replaceAll("\n",""); + String msg = buildNotificationMessage(newCodeList); ajaxResult.put("msg", msg); } return ajaxResult; } /** - * 批量查询附件信息 - * @param id - * @param backApplyDetailsList - * @return + * 检查是否有编码设备 */ - private List fetchBmFileInfos(Long id, List backApplyDetailsList) { - List bmFileInfos = new ArrayList<>(); - for (BackApplyDetails details : backApplyDetailsList) { - BmFileInfo bmFileInfo = new BmFileInfo(); - bmFileInfo.setTaskId(id); - bmFileInfo.setTaskType(3); - bmFileInfo.setModelId(details.getId()); - List bmFileInfoList = bmFileInfoMapper.selectBmFileInfoList(bmFileInfo); - // 合并所有附件信息 - bmFileInfos.addAll(bmFileInfoList); + private boolean hasCodedEquipment(List backApplyDetailsList) { + return backApplyDetailsList.stream().anyMatch(details -> "0".equals(details.getManageType())); + } + + /** + * 过滤非在用设备 + */ + private List filterNonInUseEquipment(List maCodeList) { + return maCodeList.stream() + .filter(maCodeVo -> StringUtils.isNotBlank(maCodeVo.getMaStatus()) && !"2".equals(maCodeVo.getMaStatus())) + .collect(Collectors.toList()); + } + + /** + * 过滤在用设备 + */ + private List filterInUseEquipment(List maCodeList) { + return maCodeList.stream() + .filter(maCodeVo -> "2".equals(maCodeVo.getMaStatus())) + .collect(Collectors.toList()); + } + + /** + * 简化版类型数量映射构建 + */ + private Map buildTypeNumMappingSimple(List listL4) { + if (CollectionUtils.isEmpty(listL4)) { + return new HashMap<>(); } - return bmFileInfos; + Map typeNumMap = new HashMap<>(); + for (TypeTreeNode node : listL4) { + typeNumMap.put(node.getTypeId(), node.getNum()); + } + return typeNumMap; + } + + /** + * 简化版类型编码映射构建 + */ + private Map> buildTypeCodeMappingSimple(List maCodeList) { + Map> typeCodeMap = new HashMap<>(); + for (MaCodeVo vo : maCodeList) { + if (StringUtils.isNotBlank(vo.getTypeId())) { + Long typeId = Long.parseLong(vo.getTypeId()); + typeCodeMap.computeIfAbsent(typeId, k -> new ArrayList<>()).add(vo); + } + } + return typeCodeMap; + } + + /** + * 简化版机具ID映射构建 + */ + private Map buildMaIdCodeMappingSimple(List maCodeList) { + Map maIdCodeMap = new HashMap<>(); + for (MaCodeVo vo : maCodeList) { + maIdCodeMap.put(vo.getMaId(), vo); + } + return maIdCodeMap; + } + + /** + * 优化版附件查询 - 一次性查询 + */ + private Map> fetchAllFileInfosOptimized(Long taskId) { + // 一次性查询该任务的所有附件 + BmFileInfo queryParam = new BmFileInfo(); + queryParam.setTaskId(taskId); + queryParam.setTaskType(3); + List allFileInfos = bmFileInfoMapper.selectBmFileInfoList(queryParam); + + // 按modelId分组 + Map> fileInfoMap = new HashMap<>(); + for (BmFileInfo fileInfo : allFileInfos) { + fileInfoMap.computeIfAbsent(fileInfo.getModelId(), k -> new ArrayList<>()).add(fileInfo); + } + return fileInfoMap; + } + + /** + * 简化版退料详情处理 + */ + private void processBackApplyDetailsSimple(BackApplyDetails details, + Map typeNumMap, + Map> typeCodeMap, + Map> allFileInfoMap, + List newCodeList, + Map maIdCodeMap) { + + // 1. 设置在用数量 + BigDecimal num = typeNumMap.get(details.getTypeId()); + if (num != null) { + details.setNum(num); + } + + // 2. 设置附件信息 + List detailFileInfos = allFileInfoMap.get(details.getId()); + if (CollectionUtils.isNotEmpty(detailFileInfos)) { + details.setBmFileInfos(detailFileInfos); + } + + // 3. 处理编码设备 + if ("0".equals(details.getManageType())) { + processCodedEquipmentSimple(details, typeCodeMap, allFileInfoMap); + } + + // 4. 处理非在用状态的设备 + processNonInUseEquipmentSimple(details, newCodeList, maIdCodeMap); + } + + /** + * 简化版编码设备处理 + */ + private void processCodedEquipmentSimple(BackApplyDetails details, + Map> typeCodeMap, + Map> allFileInfoMap) { + List codeList = typeCodeMap.get(details.getTypeId()); + if (CollectionUtils.isEmpty(codeList)) { + return; + } + + // 计算总数 + BigDecimal totalGoodNum = BigDecimal.ZERO; + BigDecimal totalBadNum = BigDecimal.ZERO; + List maCodeDtos = new ArrayList<>(); + + for (MaCodeVo maCodeVo : codeList) { + if (StringUtils.isBlank(maCodeVo.getMaCode())) { + continue; + } + + // 累加数量 + if (maCodeVo.getGoodNum() != null) { + totalGoodNum = totalGoodNum.add(maCodeVo.getGoodNum()); + } + if (maCodeVo.getBadNum() != null) { + totalBadNum = totalBadNum.add(maCodeVo.getBadNum()); + } + + // 创建编码DTO + MaCodeDto maCodeDto = createMaCodeDto(maCodeVo); + List fileInfos = allFileInfoMap.get(maCodeVo.getMaId()); + if (CollectionUtils.isNotEmpty(fileInfos)) { + maCodeDto.setBmFileInfos(fileInfos); + } + maCodeDtos.add(maCodeDto); + } + + details.setGoodNum(totalGoodNum); + details.setBadNum(totalBadNum); + details.setMaCodeList(maCodeDtos); + } + + /** + * 简化版非在用设备处理 + */ + private void processNonInUseEquipmentSimple(BackApplyDetails details, + List newCodeList, + Map maIdCodeMap) { + if (CollectionUtils.isEmpty(newCodeList)) { + return; + } + + for (MaCodeVo maCodeVo : newCodeList) { + if (!maCodeVo.getTypeId().equals(details.getTypeId().toString())) { + continue; + } + + details.setPreNum(details.getPreNum().subtract(BigDecimal.valueOf(1))); + + MaCodeVo info = maIdCodeMap.get(maCodeVo.getMaId()); + if (info != null) { + if (info.getGoodNum() != null && info.getGoodNum().compareTo(BigDecimal.ZERO) > 0) { + details.setGoodNum(details.getGoodNum().subtract(info.getGoodNum())); + } else if (info.getBadNum() != null && info.getBadNum().compareTo(BigDecimal.ZERO) > 0) { + details.setBadNum(details.getBadNum().subtract(info.getBadNum())); + } + } + } + } + + /** + * 创建MaCodeDto对象 + */ + private MaCodeDto createMaCodeDto(MaCodeVo maCodeVo) { + MaCodeDto maCodeDto = new MaCodeDto(); + maCodeDto.setMaCode(maCodeVo.getMaCode()); + maCodeDto.setMaId(maCodeVo.getMaId()); + + if (maCodeVo.getGoodNum() != null && maCodeVo.getGoodNum().compareTo(BigDecimal.ZERO) > 0) { + maCodeDto.setApDetection("完好"); + } else if (maCodeVo.getBadNum() != null && maCodeVo.getBadNum().compareTo(BigDecimal.ZERO) > 0) { + maCodeDto.setApDetection("损坏"); + } + + maCodeDto.setTypeName(maCodeVo.getTypeName()); + maCodeDto.setMaterialName(maCodeVo.getMaterialName()); + maCodeDto.setTypeId(maCodeVo.getTypeId()); + maCodeDto.setMaStatus(maCodeVo.getMaStatus()); + maCodeDto.setMaterialType(maCodeVo.getMaterialType()); + maCodeDto.setGoodNum(maCodeVo.getGoodNum()); + maCodeDto.setBadNum(maCodeVo.getBadNum()); + + return maCodeDto; + } + + /** + * 优化消息构建 + */ + private String buildNotificationMessage(List newCodeList) { + StringBuilder msgBuilder = new StringBuilder("您所选择的编码设备编号"); + + String codes = newCodeList.stream() + .map(MaCodeVo::getMaCode) + .collect(Collectors.joining(", ")); + + msgBuilder.append(codes).append("已被他人完成退料,请注意查看!"); + + return msgBuilder.toString().replaceAll("\n", ""); } /** * 查询编码设备信息 - * @param id - * @return */ private List fetchMaCodeList(Long id) { return backApplyInfoMapper.selectByCode(id); } - /** - * 为每个退料详情设置附件信息 - * @param details - * @param bmFileInfos - */ - private void setBmFileInfosForDetails(BackApplyDetails details, List bmFileInfos) { - // 为每个退料详情设置附件信息 - List relatedFileInfos = bmFileInfos.stream() - .filter(fileInfo -> fileInfo.getModelId().equals(details.getId())) - .collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(relatedFileInfos)) { - details.setBmFileInfos(relatedFileInfos); - } - } - - /** - * 为编码设备详情设置编码信息和附件信息 - * @param details - * @param maCodeList - */ - private void setMaCodeDetails(BackApplyDetails details, List maCodeList) { - List codeVos = maCodeList.stream() - .filter(maCodeVo -> StringUtils.isNotBlank(maCodeVo.getMaCode()) - && maCodeVo.getTypeId().equals(details.getTypeId().toString())) - .collect(Collectors.toList()); - List maCodeDtos = new ArrayList<>(); - for (MaCodeVo maCodeVo : codeVos) { - MaCodeDto maCodeDto = new MaCodeDto(); - maCodeDto.setMaCode(maCodeVo.getMaCode()); - maCodeDto.setMaId(maCodeVo.getMaId()); - if (maCodeVo.getGoodNum() != null && maCodeVo.getGoodNum().compareTo(BigDecimal.ZERO) > 0) { - maCodeDto.setApDetection("完好"); - } else if (maCodeVo.getBadNum() != null && maCodeVo.getBadNum().compareTo(BigDecimal.ZERO) > 0) { - maCodeDto.setApDetection("损坏"); - } - maCodeDto.setTypeName(maCodeVo.getTypeName()); - maCodeDto.setMaterialName(maCodeVo.getMaterialName()); - maCodeDto.setTypeId(maCodeVo.getTypeId()); - maCodeDto.setMaStatus(maCodeVo.getMaStatus()); - maCodeDto.setMaterialType(maCodeVo.getMaterialType()); - maCodeDto.setGoodNum(maCodeVo.getGoodNum()); - maCodeDto.setBadNum(maCodeVo.getBadNum()); - // 查询并设置编码附件 - List bmFileInfoList = fetchBmFileInfos(details.getId(), maCodeVo.getMaId()); - if (CollectionUtils.isNotEmpty(bmFileInfoList)) { - maCodeDto.setBmFileInfos(bmFileInfoList); - } - maCodeDtos.add(maCodeDto); - } - details.setMaCodeList(maCodeDtos); - } - /** * 查询编码设备附件信息 * @param taskId From 2338d1c89e0015a77b16427d21ff63c97a7468ea Mon Sep 17 00:00:00 2001 From: syruan <15555146157@163.com> Date: Mon, 28 Jul 2025 15:53:50 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=96=B0=E8=B4=AD=E7=9A=84=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E6=9F=A5=E8=AF=A2=E9=80=9F=E5=BA=A6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../countersign/mapper/SignProcessMapper.java | 6 + .../mapper/PurchaseCheckDetailsMapper.java | 15 ++ .../impl/PurchaseCheckInfoServiceImpl.java | 242 +++++++++++++++++- .../material/task/mapper/TmTaskMapper.java | 8 + .../countersign/SignProcessMapper.xml | 23 ++ .../purchase/PurchaseCheckDetailsMapper.xml | 49 ++++ .../mapper/material/task/TmTaskMapper.xml | 9 + 7 files changed, 348 insertions(+), 4 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java index 4f23e0bf..1046e808 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/countersign/mapper/SignProcessMapper.java @@ -22,6 +22,12 @@ public interface SignProcessMapper */ List getPurchaseSignRecordByTask(Long taskId); + /** + * 批量查询采购任务的会签记录 + * @param taskIds 任务id列表 + */ + List getPurchaseSignRecordByTasksBatch(List taskIds); + /** * 查询采新购验收任务已进行会签的签名地址 * @param taskId 任务id diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java index a50f18f6..6fa86bfe 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/mapper/PurchaseCheckDetailsMapper.java @@ -24,6 +24,14 @@ public interface PurchaseCheckDetailsMapper { String selectMaTypeNameByTaskAndStatusList(@Param("taskId") Long taskId, @Param("statusList") List statusList); + /** + * 批量查询任务的物资类型名称 + * + * @param taskIds 任务ID列表 + * @param statusList 状态列表 + * @return Map 任务ID对应的物资类型名称 + */ + List selectMaTypeNameByTaskIdsBatch(@Param("taskIds") List taskIds, @Param("statusList") List statusList); /** * 查询新购验收任务详细 @@ -39,6 +47,13 @@ public interface PurchaseCheckDetailsMapper { */ List selectPurchaseCheckDetailsListByTaskId(@Param("taskId") Long taskId, @Param("status") Integer status, @Param("userId") Long userId); + /** + * 批量查询多个任务的验收任务详细列表 + * @param taskIds 任务ID列表 + * @param userId 用户ID + */ + List selectPurchaseCheckDetailsListByTaskIdsBatch(@Param("taskIds") List taskIds, @Param("userId") Long userId); + /** * 根据任务id查询新购验收任务详细列表--Join查询 * @param obj 新购验收任务请求参数封装dto diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java index 1fe0e519..8456915a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java @@ -5,8 +5,10 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.stream.Collectors; +import com.bonus.common.biz.config.DateTimeHelper; import com.bonus.common.biz.constant.BmConfigItems; import com.bonus.common.biz.enums.MaTypeManageTypeEnum; import com.bonus.common.biz.enums.PurchaseTaskStageEnum; @@ -186,13 +188,248 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService { } /** - * 查询新购验收任务列表 + * 查询新购验收任务列表 - 性能优化版本 * * @param purchaseQueryDto 新购验收任务请求参数 * @return 新购验收任务 */ @Override public List selectPurchaseCheckInfoList(PurchaseQueryDto purchaseQueryDto) { + log.info("=== MaterialLeaseInfoServiceImpl.selectPurchaseCheckInfoList开始执行,purchaseQueryDto: {}", purchaseQueryDto); + + final List purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseQueryDto); + if (CollectionUtils.isEmpty(purchaseCheckInfos)) { + return Collections.emptyList(); + } + + // 检查 SecurityUtils.getLoginUser() 是否为 null + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + log.error("当前用户未登录或登录信息丢失,无法获取用户ID"); + return Collections.emptyList(); + } + + final Long loginUserId = loginUser.getUserid(); + if (Objects.isNull(loginUserId) || Objects.isNull(purchaseQueryDto.getTaskStage())) { + return Collections.emptyList(); + } + + // 提取所有任务ID,用于批量查询 + List taskIds = purchaseCheckInfos.stream() + .map(PurchaseCheckInfo::getTaskId) + .collect(Collectors.toList()); + + // 批量查询所有任务的明细信息 + List allDetails = purchaseCheckDetailsMapper.selectPurchaseCheckDetailsListByTaskIdsBatch(taskIds, loginUserId); + Map> detailsMap = allDetails.stream() + .filter(detail -> detail.getTaskId() != null) + .collect(Collectors.groupingBy(PurchaseCheckDetails::getTaskId)); + + // 批量查询任务状态信息 + List tmTasks = tmTaskMapper.selectTmTaskByTaskIdsBatch(taskIds); + Map taskMap = tmTasks.stream() + .filter(task -> task.getTaskId() != null) + .collect(Collectors.toMap(TmTask::getTaskId, Function.identity())); + + // 批量查询物资类型名称 + final boolean isAllowPartTransfer = bmConfigService.isBmConfigEnabledWithDefaultFalse(BmConfigItems.BOOLEAN_ALLOW_PURCHASE_PART_TRANSFER); + List maTypeNames; + if (isAllowPartTransfer) { + maTypeNames = purchaseCheckDetailsMapper.selectMaTypeNameByTaskIdsBatch(taskIds, purchaseQueryDto.getStatusList()); + } else { + maTypeNames = purchaseCheckDetailsMapper.selectMaTypeNameByTaskIdsBatch(taskIds, new ArrayList<>()); + } + Map maTypeNameMap = maTypeNames.stream() + .filter(info -> info.getTaskId() != null) + .collect(Collectors.toMap(PurchaseCheckInfo::getTaskId, + info -> info.getPurchaseMaTypeName() != null ? info.getPurchaseMaTypeName() : "")); + + // 批量查询会签记录 + List allSignRecords = signProcessMapper.getPurchaseSignRecordByTasksBatch(taskIds); + Map> signRecordsMap = allSignRecords.stream() + .filter(record -> record.getTaskId() != null) + .collect(Collectors.groupingBy(PurchaseSignRecord::getTaskId)); + + // 查询会签配置(这个查询量小,可以保持原样) + List signProcessVoList = signProcessMapper.getList(new SignProcessVo()); + + List purchaseCheckInfoResult = new ArrayList<>(); + + for (final PurchaseCheckInfo purchaseInfo : purchaseCheckInfos) { + Long taskId = purchaseInfo.getTaskId(); + + // 获取采购物资明细 + List purchaseCheckDetails = detailsMap.getOrDefault(taskId, Collections.emptyList()); + if (CollectionUtils.isEmpty(purchaseCheckDetails)) { + continue; + } + + // 过滤掉数量管理并且是待绑定状态或者驳回后待绑定状态的物资 + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !(MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(o.getManageType()) && + (o.getStatus().equals(PurchaseTaskStatusEnum.TO_BIND.getStatus()) || + o.getStatus().equals(PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus())))).collect(Collectors.toList()); + + if (isAllowPartTransfer) { + // 根据任务阶段过滤 + switch (purchaseQueryDto.getTaskStage()) { + case PURCHASE_TASK_STAGE_MANAGE: + // 新购管理阶段展示全部任务、不进行过滤 + break; + case PURCHASE_TASK_STAGE_CHECK: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus())).collect(Collectors.toList()); + break; + case PURCHASE_TASK_STAGE_BIND: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + !PurchaseTaskStatusEnum.TO_NOTICE.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK_AFTER_REJECT.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_CHECK.getStatus().equals(o.getStatus()) && + !PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus().equals(o.getStatus()) + ).collect(Collectors.toList()); + break; + case PURCHASE_TASK_STAGE_STORE: + purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> + PurchaseTaskStatusEnum.IN_STORE.getStatus().equals(o.getStatus()) || + PurchaseTaskStatusEnum.TO_STORE.getStatus().equals(o.getStatus()) || + PurchaseTaskStatusEnum.TASK_FINISHED.getStatus().equals(o.getStatus()) || + (PurchaseTaskStatusEnum.TO_BIND.getStatus().equals(o.getStatus()) && null != o.getBindNum() && 0 < o.getBindNum().compareTo(BigDecimal.ZERO)) || + (PurchaseTaskStatusEnum.TO_STORE_AFTER_REJECT.getStatus().equals(o.getStatus()) && null != o.getBindNum() && 0 < o.getBindNum().compareTo(BigDecimal.ZERO)) + ).collect(Collectors.toList()); + break; + default: + System.err.println("未知的新购任务阶段:" + purchaseQueryDto.getTaskStage()); + return Collections.emptyList(); + } + } + + // 设置物资类型名称 + purchaseInfo.setPurchaseMaTypeName(maTypeNameMap.get(taskId)); + + if (!CollectionUtils.isEmpty(purchaseCheckDetails)) { + // 计算数量和金额 + BigDecimal purchaseMaTotalNumber = BigDecimal.ZERO; + BigDecimal checkMaTotalNumber = BigDecimal.ZERO; + BigDecimal bindMaTotalNumber = BigDecimal.ZERO; + BigDecimal inputMaTotalNumber = BigDecimal.ZERO; + BigDecimal purchaseMaTotalPrice = BigDecimal.ZERO; + BigDecimal purchaseTaxPriceTotal = BigDecimal.ZERO; + + boolean isIncludeStage = false; + for (final PurchaseCheckDetails detail : purchaseCheckDetails) { + if (null == detail.getPurchaseNum() || null == detail.getPurchasePrice()) { + continue; + } + if (0 > detail.getPurchaseNum().compareTo(BigDecimal.ZERO) || 0 > detail.getPurchasePrice().compareTo(BigDecimal.ZERO)) { + throw new IllegalArgumentException("采购数量和价格必须为非负数"); + } + if (!isIncludeStage) { + isIncludeStage = PurchaseTaskStatusEnum.isStatusOfStage(detail.getStatus(), PurchaseTaskStageEnum.getByCode(purchaseQueryDto.getTaskStage()), detail.getManageType()); + } + + purchaseMaTotalNumber = purchaseMaTotalNumber.add(Optional.of(detail.getPurchaseNum()).orElse(BigDecimal.ZERO)); + checkMaTotalNumber = checkMaTotalNumber.add(Optional.ofNullable(detail.getCheckNum()).orElse(BigDecimal.ZERO)); + bindMaTotalNumber = bindMaTotalNumber.add(Optional.ofNullable(detail.getBindNum()).orElse(BigDecimal.ZERO)); + inputMaTotalNumber = inputMaTotalNumber.add(Optional.ofNullable(detail.getInputNum()).orElse(BigDecimal.ZERO)); + purchaseMaTotalPrice = purchaseMaTotalPrice.add(detail.getPurchaseNum().multiply(detail.getPurchasePrice()).setScale(10, RoundingMode.HALF_DOWN)); + purchaseTaxPriceTotal = purchaseTaxPriceTotal.add(detail.getPurchaseNum().multiply(detail.getPurchaseTaxPrice()).setScale(10, RoundingMode.HALF_DOWN)); + } + + purchaseInfo.setPurchaseMaNumber(purchaseMaTotalNumber); + purchaseInfo.setPurchasePrice(purchaseMaTotalPrice); + purchaseInfo.setPurchaseTaxPrice(purchaseTaxPriceTotal); + purchaseInfo.setBindMaNumber(bindMaTotalNumber); + purchaseInfo.setCheckMaNumber(checkMaTotalNumber); + purchaseInfo.setInputMaNumber(inputMaTotalNumber); + purchaseInfo.setWaitInputNumber(purchaseMaTotalNumber.subtract(inputMaTotalNumber)); + + // 设置任务状态 + final TmTask tmTask = taskMap.get(taskId); + purchaseInfo.setTaskStatusName(isIncludeStage ? "未完成" : "已完成"); + if (null != purchaseQueryDto.getIsFinish()) { + if (1 == purchaseQueryDto.getIsFinish()) { + if (isIncludeStage) {continue;} + } else { + if (!isIncludeStage) {continue;} + } + } + + // 设置采购状态 + List statusList = purchaseCheckDetails.stream() + .map(PurchaseCheckDetails::getStatus) + .collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(statusList)) { + if (statusList.contains(PurchaseTaskStatusEnum.TO_BIND.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_STORE.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_BIND_AFTER_REJECT.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TO_STORE_AFTER_REJECT.getStatus())) { + purchaseInfo.setPurchaseStatus(PurchaseTaskStatusEnum.TO_BIND.getStatus()); + } else if (statusList.contains(PurchaseTaskStatusEnum.IN_STORE.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TASK_IN_PROGRESS.getStatus()) || + statusList.contains(PurchaseTaskStatusEnum.TASK_FINISHED.getStatus())) { + purchaseInfo.setPurchaseStatus(PurchaseTaskStatusEnum.IN_STORE.getStatus()); + } else { + purchaseInfo.setPurchaseStatus(0); + } + } + + if (tmTask != null) { + purchaseInfo.setTaskStatus(tmTask.getTaskStatus()); + } + + // 检查是否应该加入结果列表 + if (isAllowPartTransfer) { + purchaseCheckInfoResult.add(purchaseInfo); + } else { + final OptionalInt minStatus = purchaseCheckDetails.stream().mapToInt(PurchaseCheckDetails::getStatus).min(); + if (minStatus.isPresent() && purchaseQueryDto.getStatusList().contains(minStatus.getAsInt())) { + purchaseCheckInfoResult.add(purchaseInfo); + } + } + } + } + + if (!CollectionUtils.isEmpty(purchaseCheckInfoResult)) { + // 设置会签级别 + for (PurchaseCheckInfo purchaseCheckInfo : purchaseCheckInfoResult) { + List purchaseSignRecordList = signRecordsMap.getOrDefault(purchaseCheckInfo.getTaskId(), Collections.emptyList()); + + if (!CollectionUtils.isEmpty(purchaseSignRecordList) && !CollectionUtils.isEmpty(signProcessVoList)) { + Set configSignOrgSet = signProcessVoList.stream().map(SignProcessVo::getOrgId).collect(Collectors.toSet()); + Set signedOrgSet = purchaseSignRecordList.stream().map(PurchaseSignRecord::getOrgId).collect(Collectors.toSet()); + configSignOrgSet.removeAll(signedOrgSet); + + if (signedOrgSet.size() == 1) { + purchaseCheckInfo.setSignLevel("2"); + } else { + purchaseCheckInfo.setSignLevel("3"); + } + } + } + + // 关键字过滤 + String keyWord = purchaseQueryDto.getKeyWord(); + if (!StringUtils.isBlank(keyWord)) { + purchaseCheckInfoResult = purchaseCheckInfoResult.stream() + .filter(item -> containsKeyword(item, keyWord)) + .collect(Collectors.toList()); + } + } + + return purchaseCheckInfoResult; + } + + /** + * 查询新购验收任务列表 - 原始版本(保留作为备份) + * + * @param purchaseQueryDto 新购验收任务请求参数 + * @return 新购验收任务 + */ + public List selectPurchaseCheckInfoListOriginal(PurchaseQueryDto purchaseQueryDto) { + log.info("=== MaterialLeaseInfoServiceImpl.selectPurchaseCheckInfoList开始执行,purchaseQueryDto: {}", purchaseQueryDto); + final List purchaseCheckInfos = purchaseCheckInfoMapper.selectPurchaseCheckInfoJoinList(purchaseQueryDto); if (CollectionUtils.isEmpty(purchaseCheckInfos)) { return Collections.emptyList(); @@ -226,9 +463,6 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService { if (isAllowPartTransfer) { // 2024-12-23日 取消状态过滤,修改由任务阶段来过滤 --- by 阮世耀 -// if (!CollectionUtils.isEmpty(purchaseQueryDto.getStatusList())) { -// purchaseCheckDetails = purchaseCheckDetails.stream().filter(o -> purchaseQueryDto.getStatusList().contains(o.getStatus())).collect(Collectors.toList()); -// } switch (purchaseQueryDto.getTaskStage()) { case PURCHASE_TASK_STAGE_MANAGE: // 新购管理阶段展示全部任务、不进行过滤 diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java index e8596e63..0d10ea28 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java @@ -22,6 +22,14 @@ public interface TmTaskMapper { */ TmTask selectTmTaskByTaskId(Long taskId); + /** + * 批量查询任务 + * + * @param taskIds 任务主键列表 + * @return 任务列表 + */ + List selectTmTaskByTaskIdsBatch(List taskIds); + /** * 查询当年当月最大任务序号,用于生成任务编号 by 分类型查询 * @param year 年 diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml index 5e59e7c9..2e3a4e1e 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/countersign/SignProcessMapper.xml @@ -179,6 +179,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" par.task_id = #{taskId} + + + insert into purchase_audit_record(task_id, auditor, audit_time, audit_status, org_id, creator, create_time, audit_remark) values(#{taskId}, #{userId}, #{createTime}, #{auditStatus} ,#{orgId}, #{userId}, #{createTime}, #{auditRemark}) diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml index 4e11cf99..206ca029 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/purchase/PurchaseCheckDetailsMapper.xml @@ -295,6 +295,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY task_id + + + + + + insert into purchase_check_details(task_id,type_id,purchase_price,purchase_tax_price, purchase_num,check_num,bind_num,check_result,supplier_id, diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml index 0120c985..4a7cf37a 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml @@ -41,6 +41,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where task_id = #{taskId} + + + insert into tm_task From e592719669fbfffd85ad49875689790c72419f36 Mon Sep 17 00:00:00 2001 From: mashuai Date: Mon, 28 Jul 2025 15:56:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/domain/lease/LeaseOutDetails.java | 10 ++ .../controller/BackApplyInfoController.java | 43 +++++- .../material/back/domain/BackApplyInfo.java | 15 ++ .../back/service/IBackApplyInfoService.java | 22 +++ .../impl/BackApplyInfoServiceImpl.java | 133 +++++++++++++++--- .../impl/MaterialLeaseInfoServiceImpl.java | 120 +++------------- .../impl/MaterialMachineServiceImpl.java | 3 + .../impl/LeaseApplyInfoServiceImpl.java | 8 +- .../impl/LeaseOutDetailsServiceImpl.java | 14 +- .../material/back/BackApplyInfoMapper.xml | 13 +- .../material/clz/MaterialLeaseInfoMapper.xml | 2 +- .../material/lease/LeaseApplyInfoMapper.xml | 44 +++--- .../mapper/material/ma/MachineMapper.xml | 10 +- 13 files changed, 281 insertions(+), 156 deletions(-) diff --git a/bonus-common-biz/src/main/java/com/bonus/common/biz/domain/lease/LeaseOutDetails.java b/bonus-common-biz/src/main/java/com/bonus/common/biz/domain/lease/LeaseOutDetails.java index fb06a234..2d6ccc13 100644 --- a/bonus-common-biz/src/main/java/com/bonus/common/biz/domain/lease/LeaseOutDetails.java +++ b/bonus-common-biz/src/main/java/com/bonus/common/biz/domain/lease/LeaseOutDetails.java @@ -7,6 +7,7 @@ import lombok.ToString; import com.bonus.common.core.web.domain.BaseEntity; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -119,6 +120,15 @@ public class LeaseOutDetails extends BaseEntity { @ApiModelProperty(value = "是否退回 (0:未退回,1:退回)") private Integer isBack; + @ApiModelProperty("机具类型(1机具,2安全工器具)") + private int jiJuType; + + @ApiModelProperty(value = "本次检验日期") + private Date thisCheckTime; + + @ApiModelProperty(value = "下次检验日期") + private Date nextCheckTime; + /** * 领料出库机具编码集合 */ diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/controller/BackApplyInfoController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/controller/BackApplyInfoController.java index 19901bca..a8bdbbe7 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/controller/BackApplyInfoController.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/controller/BackApplyInfoController.java @@ -10,11 +10,8 @@ import javax.validation.constraints.NotNull; import cn.hutool.core.convert.Convert; import com.bonus.common.biz.config.ListPagingUtil; -import com.bonus.common.biz.domain.lease.LeaseApplyInfo; -import com.bonus.common.biz.domain.lease.LeasePublishInfo; import com.bonus.common.core.utils.ServletUtils; import com.bonus.common.log.enums.OperaType; -import com.bonus.common.security.utils.SecurityUtils; import com.bonus.material.archives.service.ArchivesService; import com.bonus.material.back.domain.BackApplyDetails; import com.bonus.material.back.domain.HandlingOrder; @@ -72,6 +69,46 @@ public class BackApplyInfoController extends BaseController { return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); } + /** + * 查询未签字退料任务列表 + * @param backApplyInfo + * @return + */ + @ApiOperation(value = "查询未签字退料任务列表") + @GetMapping("/getNoSignList") + public AjaxResult getNoSignList(BackApplyInfo backApplyInfo) { + Integer pageIndex = Convert.toInt(ServletUtils.getParameter("pageNum"), 1); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize"), 10); + List list = backApplyInfoService.getNoSignList(backApplyInfo); + return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); + } + + /** + * 查询材料员待确认的任务 + * @param backApplyInfo + * @return + */ + @ApiOperation(value = "查询材料员待确认的任务") + @GetMapping("/getCompleteBackTaskList") + public AjaxResult getCompleteBackTaskList(BackApplyInfo backApplyInfo) { + Integer pageIndex = Convert.toInt(ServletUtils.getParameter("pageNum"), 1); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize"), 10); + List list = backApplyInfoService.getCompleteBackTaskList(backApplyInfo); + return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); + } + + /** + * 材料员确认接口 + * @param backApplyInfo + * @return + */ + @ApiOperation(value = "材料员确认接口") + @PostMapping("/confirmMaterial") + public AjaxResult confirmMaterial(@RequestBody BackApplyInfo backApplyInfo) { + int confirmResult = backApplyInfoService.confirmMaterial(backApplyInfo); + return confirmResult > 0 ? success("确认成功") : error("确认失败"); + } + /** * 上传退料单PDF文件 */ diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/domain/BackApplyInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/domain/BackApplyInfo.java index 468f6f2d..0207b50c 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/domain/BackApplyInfo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/domain/BackApplyInfo.java @@ -188,4 +188,19 @@ public class BackApplyInfo implements Serializable { @ApiModelProperty(value = "一级类型id集合") private String firstId; + + @ApiModelProperty(value = "i8工程id") + private String externalId; + + @ApiModelProperty(value = "材料员确认账号") + private String materialMan; + + @ApiModelProperty(value = "材料员确认时间") + private String confirmTime; + + @ApiModelProperty(value = "是否确认 0不需要确认,1未确认 2已确认") + private Integer isConfirm; + + @ApiModelProperty(value = "材料员确认备注") + private String confirmRemark; } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/IBackApplyInfoService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/IBackApplyInfoService.java index aad658c0..18085657 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/IBackApplyInfoService.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/IBackApplyInfoService.java @@ -190,5 +190,27 @@ public interface IBackApplyInfoService { * @return */ AjaxResult uploadSort(HandlingOrder bean); + + /** + * 查询未签字退料任务列表 + * @param backApplyInfo + * @return + */ + List getNoSignList(BackApplyInfo backApplyInfo); + + /** + * 查询材料员待确认的任务 + * @param backApplyInfo + * @return + */ + List getCompleteBackTaskList(BackApplyInfo backApplyInfo); + + /** + * 材料员确认接口 + * @param backApplyInfo + * @return + */ + int confirmMaterial(BackApplyInfo backApplyInfo); + } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java index c515b16c..d50c3e2a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/back/service/impl/BackApplyInfoServiceImpl.java @@ -9,7 +9,6 @@ import cn.hutool.core.util.PhoneUtil; import com.alibaba.nacos.common.utils.CollectionUtils; import com.bonus.common.biz.constant.MaterialConstants; import com.bonus.common.biz.domain.TypeTreeNode; -import com.bonus.common.biz.domain.lease.LeaseApplyInfo; import com.bonus.common.biz.domain.lease.LeaseOutDetails; import com.bonus.common.biz.enums.*; import com.bonus.common.core.exception.ServiceException; @@ -24,6 +23,7 @@ import com.bonus.material.basic.mapper.BmFileInfoMapper; import com.bonus.material.common.domain.dto.SelectDto; import com.bonus.material.common.domain.vo.AgreementVo; import com.bonus.material.common.mapper.SelectMapper; +import com.bonus.material.lease.mapper.LeaseApplyInfoMapper; import com.bonus.material.ma.mapper.MachineMapper; import com.bonus.material.purchase.config.RemoteConfig; import com.bonus.material.settlement.domain.SltAgreementInfo; @@ -74,6 +74,9 @@ public class BackApplyInfoServiceImpl implements IBackApplyInfoService { @Resource private SelectMapper mapper; + @Resource + private LeaseApplyInfoMapper leaseApplyInfoMapper; + /** * 查询退料任务 - 性能优化版 * @@ -425,27 +428,27 @@ public class BackApplyInfoServiceImpl implements IBackApplyInfoService { backApplyInfo.setUserId(userId == 0 ? null : userId); } list = backApplyInfoMapper.selectBackApplyInfoList(backApplyInfo); - for (BackApplyInfo applyInfo : list) { - if (!CollectionUtils.isEmpty(typeIdList)) { - // 使用流过滤符合条件的元素 - list = list.stream() - .filter(item -> { - String firstIdStr = item.getFirstId(); - if (firstIdStr == null) { - return false; - } - // 将逗号分隔的字符串转为集合 - Set firstIds = Arrays.stream(firstIdStr.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .map(Long::parseLong) - .collect(Collectors.toSet()); + if (!CollectionUtils.isEmpty(typeIdList)) { + // 使用流过滤符合条件的元素 + list = list.stream() + .filter(item -> { + String firstIdStr = item.getFirstId(); + if (firstIdStr == null) { + return false; + } + // 将逗号分隔的字符串转为集合 + Set firstIds = Arrays.stream(firstIdStr.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(Long::parseLong) + .collect(Collectors.toSet()); - // 判断两个集合是否有交集 - return firstIds.stream().anyMatch(typeIdList::contains); - }) - .collect(Collectors.toList()); - } + // 判断两个集合是否有交集 + return firstIds.stream().anyMatch(typeIdList::contains); + }) + .collect(Collectors.toList()); + } + for (BackApplyInfo applyInfo : list) { if (StringUtils.isNotBlank(applyInfo.getBackSignUrl())) { applyInfo.setBackSignUrl("data:image/png;base64," + applyInfo.getBackSignUrl()); } @@ -1701,6 +1704,94 @@ public class BackApplyInfoServiceImpl implements IBackApplyInfoService { } } + /** + * 查询未签字退料任务列表 + * @param backApplyInfo + * @return + */ + @Override + public List getNoSignList(BackApplyInfo backApplyInfo) { + backApplyInfo.setIsSign(1); + Long userId = SecurityUtils.getLoginUser().getUserid(); + // 首先根据用户名去ma_type_manage表查询是否存在绑定物资信息 + List typeIdList = backApplyInfoMapper.selectTypeIdList(userId); + if (CollectionUtils.isEmpty(typeIdList)) { + backApplyInfo.setUserId(userId == 0 ? null : userId); + } + List list = backApplyInfoMapper.selectBackApplyInfoList(backApplyInfo); + if (!CollectionUtils.isEmpty(typeIdList)) { + // 使用流过滤符合条件的元素 + list = list.stream() + .filter(item -> { + String firstIdStr = item.getFirstId(); + if (firstIdStr == null) { + return false; + } + // 将逗号分隔的字符串转为集合 + Set firstIds = Arrays.stream(firstIdStr.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(Long::parseLong) + .collect(Collectors.toSet()); + + // 判断两个集合是否有交集 + return firstIds.stream().anyMatch(typeIdList::contains); + }) + .collect(Collectors.toList()); + } + // 提取关键字 + String keyWord = backApplyInfo.getKeyWord(); + // 如果关键字不为空,进行过滤 + if (!StringUtils.isBlank(keyWord)) { + list = list.stream() + .filter(item -> containsKeyword(item, keyWord)) + .collect(Collectors.toList()); + } + return list; + } + + /** + * 查询材料员待确认的任务 + * @param backApplyInfo + * @return + */ + @Override + public List getCompleteBackTaskList(BackApplyInfo backApplyInfo) { + // 查询已签名数据 + backApplyInfo.setIsSign(2); + List list = backApplyInfoMapper.selectBackApplyInfoList(backApplyInfo); + //材料站权限过滤 + String username = SecurityUtils.getLoginUser().getUsername(); + if(!CollectionUtils.isEmpty(list)) { + list = list.stream() + .filter(info -> { + // 调用 mapper 方法检查是否有符合条件的数据 + int count = leaseApplyInfoMapper.checkPermission(info.getExternalId(), username); + return count > 0; + }) + .collect(Collectors.toList()); + } + // 提取关键字 + String keyWord = backApplyInfo.getKeyWord(); + // 如果关键字不为空,进行过滤 + if (!StringUtils.isBlank(keyWord)) { + list = list.stream() + .filter(item -> containsKeyword(item, keyWord)) + .collect(Collectors.toList()); + } + return list; + } + + /** + * 材料员确认接口 + * @param backApplyInfo + * @return + */ + @Override + public int confirmMaterial(BackApplyInfo backApplyInfo) { + return backApplyInfoMapper.updateBackApplyInfo(backApplyInfo); + } + /** * 关键字搜索 diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java index 87bbde81..5c0d0627 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java @@ -702,105 +702,27 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService { // 获取工器具领料出库详情 List details = materialLeaseInfoMapper.getOutDetailsById(dto); if (!CollectionUtils.isEmpty(details)) { - leaseApplyRequestVo.setLeaseApplyDetailsList(details); + // 步骤4.1: 收集所有typeId,进行批量查询 + List typeIds = details.stream() + .map(MaterialLeaseApplyDetails::getTypeId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + SelectDto selectDto = new SelectDto(); + selectDto.setProId(info.getProId()); + List agreementList = mapper.getAgreementInfoBy(selectDto); + Map storageNumMap = preCalculateStorageNums(info, agreementList, typeIds); for (MaterialLeaseApplyDetails detail : details) { - SelectDto selectDto = new SelectDto(); - selectDto.setProId(info.getProId()); - List list = mapper.getAgreementInfoBy(selectDto); - // 先查第四层类型 - List listL4 = new ArrayList<>(); - List listL5 = new ArrayList<>(); - List list7 = new ArrayList<>(); - BackApplyInfo backApplyInfo = new BackApplyInfo(); - if (!CollectionUtils.isEmpty(list)) { - for (AgreementVo agreementVo : list) { - backApplyInfo.setAgreementId(Long.valueOf(agreementVo.getAgreementId())); - listL4 = mapper.getUseTypeTreeL4(backApplyInfo); - if (!CollectionUtils.isEmpty(listL4)) { - listL4 = listL4.stream() - .filter(item -> StringUtils.isNotBlank(item.getMaterialName()) && StringUtils.isNotBlank(item.getTypeName())) - .collect(Collectors.toList()); - // 将listL5中typeId相同的数据进行num相加 - for (TypeTreeNode node : listL4) { - // 根据node中的typeId查询listL5中相同数据,如果在listL5中存在,则将num相加,反之将node添加到list5中 - TypeTreeNode node1 = listL5.stream() - .filter(item -> item.getTypeId() == (node.getTypeId())) - .findFirst() - .orElse(null); - if (node1 != null) { - node1.setNum(node1.getNum().add(node.getNum())); - } - if (node1 == null) { - listL5.add(node); - } - } - } - } - // 根据工程id去协议表中查询协议id - MaterialLeaseApplyInfo bean = new MaterialLeaseApplyInfo(); - bean.setProId(info.getProId()); - List listAgreement = materialLeaseInfoMapper.getAgreementIdByProId(bean); - if (!CollectionUtils.isEmpty(listAgreement)) { - for (BmAgreementInfo agreementInfo : listAgreement) { - bean.setAgreementId(agreementInfo.getAgreementId()); - List list6 = materialLeaseInfoMapper.getUseTypeTree(bean); - if (!CollectionUtils.isEmpty(list6)) { - for (TypeTreeNode node : list6) { - // 根据node中的typeId查询listL7中相同数据,如果在listL7中存在,则将num相加,反之将node添加到list7中 - TypeTreeNode node1 = list7.stream() - .filter(item -> item.getTypeId() == (node.getTypeId())) - .findFirst() - .orElse(null); - if (node1 != null) { - node1.setNum(node1.getNum().add(node.getNum())); - } - if (node1 == null) { - list7.add(node); - } - } - } - } - } - // 根据协议id去clz_slt_agreement_info材料站协议表中查询在用设备,进行数据筛选去除 - if (!CollectionUtils.isEmpty(listL5)) { - if (!CollectionUtils.isEmpty(list7)) { - // 将list5中typeId和list7中相同数据进行num相减,并剔除相减后为0的数据 - Map typeIdToNum = list7.stream() - .collect(Collectors.toMap( - TypeTreeNode::getTypeId, - TypeTreeNode::getNum, - BigDecimal::add - )); - Iterator iterator = listL5.iterator(); - while (iterator.hasNext()) { - TypeTreeNode node = iterator.next(); - Long typeId = node.getTypeId(); - // 获取要减去的值,默认值为BigDecimal.ZERO - BigDecimal subtractNum = typeIdToNum.getOrDefault(typeId, BigDecimal.ZERO); - // 计算新值,处理num为null的情况(若业务允许) - BigDecimal currentNum = Optional.ofNullable(node.getNum()) - .orElse(BigDecimal.ZERO); - BigDecimal newNum = currentNum.subtract(subtractNum); - if (newNum.compareTo(BigDecimal.ZERO) == 0) { - iterator.remove(); - } else { - node.setNum(newNum); - } - } - } - // 根据details中的typeId去list5中获取库存 - listL5.stream() - .filter(node -> detail.getTypeId().equals(node.getTypeId())) - .findFirst() - .ifPresent(node -> detail.setStorageNum(node.getNum())); - } - // 获取编码详情 - List maCodeVoList = materialLeaseInfoMapper.getCodeList(dto.getId(), detail.getTypeId()); - if (!CollectionUtils.isEmpty(maCodeVoList)) { - detail.setMaCodeList(maCodeVoList); - } + // 直接从预计算的Map中获取库存数据,避免复杂的嵌套循环 + BigDecimal storageNum = storageNumMap.getOrDefault(detail.getTypeId(), BigDecimal.ZERO); + detail.setStorageNum(storageNum); + // 获取编码详情 + List maCodeVoList = materialLeaseInfoMapper.getCodeList(dto.getId(), detail.getTypeId()); + if (!CollectionUtils.isEmpty(maCodeVoList)) { + detail.setMaCodeList(maCodeVoList); } } + leaseApplyRequestVo.setLeaseApplyDetailsList(details); } }); return leaseApplyRequestVo; @@ -1503,17 +1425,17 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService { list.addAll(listL3); list.addAll(listL21); } - if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)) { + /*if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)) { // 创建树形结构(数据集合作为参数) TypeTreeBuild treeBuild = new TypeTreeBuild(list); // 原查询结果转换树形结构 groupList = treeBuild.buildTree(); - } + }*/ } } catch (Exception e) { AjaxResult.error("类型树-查询失败", e); } - return AjaxResult.success(groupList); + return AjaxResult.success(list); } /** diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java index 16398c08..8f8f5770 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java @@ -552,6 +552,9 @@ public class MaterialMachineServiceImpl implements MaterialMachineService { if (teamData == null) { // 根据用户名查询项目部信息 String departId = mapper.getDepartId(username); + if (StringUtils.isBlank(departId)) { + return new MaterialRetainedEquipmentInfo(); + } // 根据项目部id查询工程信息 List projectIdList = mapper.getProjectId(departId); if (!org.springframework.util.CollectionUtils.isEmpty(projectIdList)) { diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseApplyInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseApplyInfoServiceImpl.java index a2b85722..15550723 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseApplyInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseApplyInfoServiceImpl.java @@ -586,7 +586,8 @@ public class LeaseApplyInfoServiceImpl implements ILeaseApplyInfoService { // 领用数据 List leaseApplyOutList = leaseApplyInfoMapper.selectPublish(leaseApplyInfo); if (!CollectionUtils.isEmpty(leaseApplyOutList)) { - for (LeaseApplyInfo applyInfo : leaseApplyOutList) { + list.addAll(leaseApplyOutList); + for (LeaseApplyInfo applyInfo : list) { // 根据id去查询出库数量 LeaseApplyInfo outList = leaseApplyInfoMapper.getOutList(applyInfo); if (outList != null) { @@ -599,7 +600,6 @@ public class LeaseApplyInfoServiceImpl implements ILeaseApplyInfoService { applyInfo.setIsConfirm(1); } } - list.addAll(leaseApplyOutList); } //材料站权限过滤 String username = SecurityUtils.getLoginUser().getUsername(); @@ -686,7 +686,8 @@ public class LeaseApplyInfoServiceImpl implements ILeaseApplyInfoService { // 领用数据 List leaseApplyOutList = leaseApplyInfoMapper.selectPublish(leaseApplyInfo); if (!CollectionUtils.isEmpty(leaseApplyOutList)) { - for (LeaseApplyInfo applyInfo : leaseApplyOutList) { + list.addAll(leaseApplyOutList); + for (LeaseApplyInfo applyInfo : list) { // 根据id去查询出库数量 LeaseApplyInfo outList = leaseApplyInfoMapper.getOutList(applyInfo); if (outList != null) { @@ -699,7 +700,6 @@ public class LeaseApplyInfoServiceImpl implements ILeaseApplyInfoService { applyInfo.setIsConfirm(1); } } - list.addAll(leaseApplyOutList); } if (leaseApplyInfo.getIsConfirm()!=null) { diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseOutDetailsServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseOutDetailsServiceImpl.java index 047396f9..77ef0f45 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseOutDetailsServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lease/service/impl/LeaseOutDetailsServiceImpl.java @@ -1,6 +1,7 @@ package com.bonus.material.lease.service.impl; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; import java.util.Objects; import com.bonus.common.biz.constant.MaterialConstants; @@ -517,8 +518,17 @@ public class LeaseOutDetailsServiceImpl implements ILeaseOutDetailsService { if (res > 0) { // 普通机具减少 (ma_type 设备规格表)的库存数量 res = typeMapper.updateMaTypeStockNum(record); - // 更新 (ma_machine 设备表)的状态 - machineMapper.updateMaMachineStatus(record, MaMachineStatusEnum.IN_USE.getStatus()); + if (record.getMaId() != null) { + if (record.getJiJuType() == 1) { + record.setThisCheckTime(DateUtils.getNowDate()); + LocalDate currentDate = LocalDate.now(); + // 计算下一次检验日期:当前日期加一年减一天 + LocalDate nextCheckDate = currentDate.plusYears(1).minusDays(1); + record.setNextCheckTime(DateUtils.toDate(nextCheckDate)); + } + // 更新 (ma_machine 设备表)的状态 + res = machineMapper.updateMaMachineStatus(record, MaMachineStatusEnum.IN_USE.getStatus()); + } } } return res; diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/back/BackApplyInfoMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/back/BackApplyInfoMapper.xml index 76f0980d..993aa276 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/back/BackApplyInfoMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/back/BackApplyInfoMapper.xml @@ -49,7 +49,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP_CONCAT(DISTINCT mt2.type_name) AS typeName, bai.`status` AS status, bai.print_status as printStatus, - GROUP_CONCAT(DISTINCT mt4.type_id) as firstId + GROUP_CONCAT(DISTINCT mt4.type_id) as firstId, + bp.external_id as externalId, + su.nick_name as materialMan, + bai.confirm_time as confirmTime, + bai.is_confirm as isConfirm, + bai.confirm_remark as confirmRemark, + SUM(bad.pre_num) as backNum FROM back_apply_info bai LEFT JOIN back_apply_details bad on bad.parent_id = bai.id @@ -65,6 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN ma_type mt2 ON mt2.type_id = mt1.parent_id AND mt2.del_flag = '0' left join ma_type mt3 ON mt2.parent_id = mt3.type_id and mt3.del_flag = '0' left join ma_type mt4 ON mt3.parent_id = mt4.type_id and mt4.del_flag = '0' + left join sys_user su on su.user_id = bai.material_man JOIN ma_type_repair mtr ON mtr.type_id = bad.type_id AND mtr.user_id = #{userId} @@ -663,6 +670,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" `status` = #{status}, direct_id = #{directId}, print_status = #{printStatus}, + material_man = #{materialMan}, + confirm_time = #{confirmTime}, + is_confirm = #{isConfirm}, + confirm_remark = #{confirmRemark}, where id = #{id} diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialLeaseInfoMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialLeaseInfoMapper.xml index 73d1dc95..7f3dce19 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialLeaseInfoMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialLeaseInfoMapper.xml @@ -552,7 +552,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{typeId} - ORDER BY mt.type_id, mm.ma_code + ORDER BY mt.type_id, mm.ma_id diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/lease/LeaseApplyInfoMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/lease/LeaseApplyInfoMapper.xml index ff122342..6ef7aba0 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/lease/LeaseApplyInfoMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/lease/LeaseApplyInfoMapper.xml @@ -86,29 +86,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select - lai.id, lai.code, lai.task_id, lai.lease_person as leasePerson, lai.phone, lai.type, lai.company_audit_by, - lai.company_audit_time, lai.company_audit_remark, lai.dept_audit_by, lai.dept_audit_time, - lai.dept_audit_remark, lai.direct_audit_by, lai.direct_audit_time, lai.direct_audit_remark, - lai.create_by, lai.create_time, lai.update_by, lai.update_time, lai.remark, lai.company_id, - lai.direct_id, lai.lease_type, lai.estimate_lease_time, lai.cost_bearing_party, lai.lease_sign_url, lai.lease_sign_type, - lai.material_man, lai.confirm_time, lai.is_confirm, lai.confirm_remark, - bai.unit_id,bai.project_id,bu.unit_name as unitName, bp.pro_name as projectName,bp.external_id as externalId, bai.agreement_code as agreementCode, tt.task_status as taskStatus, - sda.dict_label as taskStatusName, - IFNULL(sum(lad.pre_num),0) as preCountNum, - IFNULL(sum(lod.out_num),0) as alNum, - CASE - WHEN IFNULL(sum(lad.pre_num),0) = SUM(CASE WHEN lod.is_confirm = 2 THEN lod.out_num ELSE 0 END) THEN 2 - ELSE 1 - END as isConfirm, - GROUP_CONCAT(DISTINCT mt1.type_name) as maTypeNames, - bp.contract_part as contractPart, - sd.dept_name as impUnitName, - tt.task_type as taskType + lai.id, lai.code, lai.task_id, lai.lease_person as leasePerson, lai.phone, lai.type, lai.company_audit_by, + lai.company_audit_time, lai.company_audit_remark, lai.dept_audit_by, lai.dept_audit_time, + lai.dept_audit_remark, lai.direct_audit_by, lai.direct_audit_time, lai.direct_audit_remark, + lai.create_by, lai.create_time as createTime, lai.update_by, lai.update_time, lai.remark, lai.company_id, + lai.direct_id, lai.lease_type, lai.estimate_lease_time, lai.cost_bearing_party, lai.lease_sign_url, lai.lease_sign_type, + lai.material_man, lai.confirm_time, lai.is_confirm, lai.confirm_remark, + bai.unit_id,bai.project_id,bu.unit_name as unitName, bp.pro_name as projectName,bp.external_id as externalId, bai.agreement_code as agreementCode, tt.task_status as taskStatus, + sda.dict_label as taskStatusName, + IFNULL(sum(lad.pre_num),0) as preCountNum, + IFNULL(lod.num,0) as alNum, + GROUP_CONCAT(DISTINCT mt1.type_name) as maTypeNames, + bp.contract_part as contractPart, + sd.dept_name as impUnitName, + tt.task_type as taskType from - lease_apply_info lai + lease_apply_info lai left join tm_task tt on lai.task_id = tt.task_id left join lease_apply_details lad on lai.id = lad.parent_id - left join lease_out_details lod on lai.id = lod.parent_id + LEFT JOIN (SELECT IFNULL( sum(out_num ), 0) AS num, parent_id, publish_task, is_confirm, confirm_remark, confirm_time, lease_sign_id from lease_out_details + GROUP BY parent_id) lod ON lai.id = lod.parent_id left join tm_task_agreement tta on lai.task_id = tta.task_id left join bm_agreement_info bai on tta.agreement_id = bai.agreement_id left join bm_unit bu on bu.unit_id = bai.unit_id @@ -404,7 +401,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"