From ea4548867093c0c2a23c10d3c68e8a0650454efc Mon Sep 17 00:00:00 2001 From: hayu <1604366271@qq.com> Date: Tue, 30 Dec 2025 12:24:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E8=AE=B0=E5=BD=95=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=8F=8A=E4=BB=B7=E6=A0=BC=E8=AE=A1=E7=AE=97=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/LossAssessmentServiceImpl.java | 335 +++- .../service/impl/RepairServiceImpl.java | 1695 +++++++++++------ .../lossAssessment/LossAssessmentMapper.xml | 2 +- 3 files changed, 1345 insertions(+), 687 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lossAssessment/service/impl/LossAssessmentServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lossAssessment/service/impl/LossAssessmentServiceImpl.java index 98565a99..12e3a9f4 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/lossAssessment/service/impl/LossAssessmentServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/lossAssessment/service/impl/LossAssessmentServiceImpl.java @@ -158,89 +158,258 @@ public class LossAssessmentServiceImpl implements LossAssessmentService { @Transactional(rollbackFor = Exception.class) public AjaxResult batchLossAssessmentApply(@NotNull List repairDeviceVOList) { try { - // 准备业务逻辑数据 LoginUser loginUser = SecurityUtils.getLoginUser(); - // 配件集合 - List partList; - - // 校验参数,过滤空数据 + //清理无效数据 repairDeviceVOList.removeIf(Objects::isNull); - - for (RepairDeviceVO bean : repairDeviceVOList){ - //判断管理方式是否为空 - if (null == bean.getManageType()) { - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - return AjaxResult.error("请选择物资管理方式"); - } - //如果是编码设备 - if (Objects.equals(MaTypeManageTypeEnum.CODE_DEVICE.getTypeId(), bean.getManageType())) { - partList = bean.getCodeInRepairPartList(); - // 更新定损数量、并修改定损人员 - mapper.updateRepairedNumAndStatus(bean.getId(), BigDecimal.ONE, 1, loginUser.getUsername(), loginUser.getUserid()); - // 更新维修人员信息 - if (!CollectionUtils.isEmpty(bean.getRepairList())) { - RepairPartDetails repairPartDetails = bean.getRepairList().get(0); - bean.setRepairer(repairPartDetails.getRepairer()); - bean.setRemark(repairPartDetails.getRemark()); - mapper.updateRepairer(bean); - } else { - bean.setRepairer(SecurityUtils.getLoginUser().getSysUser().getNickName()); - mapper.updateRepairer(bean); - } - // 统一处理配件集合数据 - copeNumberManageInList(bean, partList, loginUser, bean.getManageType()); - } else if (Objects.equals(MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId(), bean.getManageType())) { - //数量设备 - if (null == bean.getId()) { - throw new ServiceException("请完善参数,详情ID为空!"); - } - // 更新维修人员信息 - if (!CollectionUtils.isEmpty(bean.getRepairList())) { - RepairPartDetails repairPartDetails = bean.getRepairList().get(0); - bean.setRepairer(repairPartDetails.getRepairer()); - bean.setRemark(repairPartDetails.getRemark()); - mapper.updateRepairer(bean); - for (RepairPartDetails partDetails : bean.getRepairList()) { - if (!CollectionUtils.isEmpty(partDetails.getFileList())) { - for (BmFileInfo bmFileInfo : partDetails.getFileList()) { - bmFileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR_NUM.getTaskTypeId()) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getUsername()); - bmFileInfoMapper.insertBmFileInfo(bmFileInfo); - } - } - } - } - BigDecimal innerRepairNum = BigDecimal.ZERO; - BigDecimal outerRepairNum = BigDecimal.ZERO; - BigDecimal scrapNum = BigDecimal.ZERO; - partList = bean.getNumberInRepairPartList(); - - - for (RepairPartDetails list : partList){ - innerRepairNum = innerRepairNum.add(list.getDsNum()); - } - // 获取维修详情表中的维修详情记录:待维修、已维修、已报废的数量 - RepairTaskDetails details = mapper.getById(bean.getId()); - if (Objects.isNull(details)) { - throw new ServiceException("此记录不存在,请检查后提交!"); - } - - // 处理配件集合数据 - copeNumberManageInList(bean, partList, loginUser, bean.getManageType()); - - // 拆分维修单 - splitRepairDetailsToMultiple(bean, innerRepairNum, outerRepairNum, scrapNum, loginUser); - } + for (RepairDeviceVO bean : repairDeviceVOList) { + validateAndProcessDevice(bean, loginUser); } - } catch (Exception e){ + } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - log.error("定损完成操作",e.getMessage()); - return AjaxResult.error("定损失败"); + log.error("定损完成操作", e.getMessage()); + return AjaxResult.error("定损失败"); } return AjaxResult.success("定损完成"); } + /** + * 验证并处理设备 + */ + private void validateAndProcessDevice(RepairDeviceVO bean, LoginUser loginUser) { + // 1. 验证管理方式 + if (bean.getManageType() == null) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new ServiceException("请选择物资管理方式"); + } + + // 2. 根据管理方式处理 + if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(bean.getManageType())) { + processCodedEquipmentSimple(bean, loginUser); + } else if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(bean.getManageType())) { + processNumberDevice(bean, loginUser); + } + } + + /** + * 处理数量设备 + */ + private void processNumberDevice(RepairDeviceVO bean, LoginUser loginUser) { + // 1. 参数校验 + if (bean.getId() == null) { + throw new ServiceException("请完善参数,详情ID为空!"); + } + // 2. 更新维修人员和文件 + updateRepairerAndFiles(bean, loginUser); + // 3. 计算内部维修数量 + BigDecimal innerRepairNum = calculateInnerRepairNum(bean); + // 4. 验证记录存在性 + validateRepairDetailsExistence(bean); + // 5. 处理配件数据 + processAccessoryCollectionData(bean); + // 6. 拆分维修单 + splitRepairDetailsToMultiple(bean, innerRepairNum, BigDecimal.ZERO, BigDecimal.ZERO, loginUser); + } + + /** + * 更新维修人员和相关文件 + */ + private void updateRepairerAndFiles(RepairDeviceVO bean, LoginUser loginUser) { + if (CollectionUtils.isEmpty(bean.getRepairList())) { + return; + } + // 更新维修人员 + updateRepairer(bean); + // 处理文件上传 + processRepairFiles(bean, loginUser); + } + + /** + * 处理维修相关文件 + */ + private void processRepairFiles(RepairDeviceVO bean, LoginUser loginUser) { + for (RepairPartDetails partDetails : bean.getRepairList()) { + if (CollectionUtils.isEmpty(partDetails.getFileList())) { + continue; + } + for (BmFileInfo bmFileInfo : partDetails.getFileList()) { + bmFileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR_NUM.getTaskTypeId()) + .setTaskId(bean.getTaskId()) + .setModelId(bean.getId()) + .setCreateBy(loginUser.getUsername()); + bmFileInfoMapper.insertBmFileInfo(bmFileInfo); + } + } + } + + /** + * 计算内部维修数量 + */ + private BigDecimal calculateInnerRepairNum(RepairDeviceVO bean) { + return bean.getNumberInRepairPartList().stream() + .map(RepairPartDetails::getDsNum) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 验证维修详情记录存在性 + */ + private void validateRepairDetailsExistence(RepairDeviceVO bean) { + RepairTaskDetails details = mapper.getById(bean.getId()); + if (details == null) { + throw new ServiceException("此记录不存在,请检查后提交!"); + } + } + + /** + * 定损编码设备处理 + * @param bean + * @param loginUser 登录人信息 + */ + private void processCodedEquipmentSimple(RepairDeviceVO bean,LoginUser loginUser) { + //更新定损数量、定损人员 + updateRepairedNumAndStatus(bean.getId(),loginUser); + //更新维修人员信息 + updateRepairer(bean); + //处理配件集合数据 + processAccessoryCollectionData(bean); + } + + /** + * 处理配件集合数据 + */ + private void processAccessoryCollectionData(RepairDeviceVO bean) { + //配件集合 + List partList = bean.getCodeInRepairPartList(); + //去除无效数据 + List validPartList = partList.stream() + .filter(partDetails -> !(null == partDetails.getPartId() && partDetails.getPartPrice() == null)) + .collect(Collectors.toList()); + + // 替换原集合 + partList.clear(); + partList.addAll(validPartList); + if (partList.size()>0){ + BigDecimal dsNum = BigDecimal.ZERO; + //处理配件数据 + for (RepairPartDetails partDetails : partList){ + insertRepairRecord(bean,partDetails); + if (bean.getManageType()==1){ + dsNum = dsNum.add(partDetails.getDsNum()); + } + } + //计算维修费用 + BigDecimal sfCosts = countPartCosts(partList, BigDecimal.ZERO); + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setId(bean.getId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setMaId(bean.getMaId()); + if (bean.getManageType()==0){ + repairApplyRecord.setRepairNum(BigDecimal.valueOf(1)); + } else { + repairApplyRecord.setRepairNum(dsNum); + } + repairApplyRecord.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); + //新增定损费用记录表 + mapper.addRepairCost(repairApplyRecord, sfCosts, "1"); + } else { + //无配件数据,只增加维修记录 + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setMaId(bean.getMaId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setRepairType(bean.getRepairType()); + repairApplyRecord.setStatus(0L); + repairApplyRecord.setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); + repairApplyRecord.setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); + repairApplyRecord.setCreateBy(SecurityUtils.getLoginUser().getUsername()); + //添加维修记录表数据 + addRepairRecord(repairApplyRecord); + } + + } + + /** + * 增加维修记录 + */ + private void insertRepairRecord(RepairDeviceVO bean,RepairPartDetails partDetails) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setMaId(bean.getMaId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); + if (bean.getManageType()==0){ + repairApplyRecord.setRepairNum(BigDecimal.valueOf(1)); + } else { + repairApplyRecord.setRepairNum(partDetails.getDsNum()); + } + repairApplyRecord.setCreateBy(loginUser.getUsername()); + repairApplyRecord.setStatus(0L); + + //添加配件明细表数据 + partDetails.setTaskId(bean.getTaskId()); + partDetails.setMaId(bean.getMaId()); + partDetails.setTypeId(bean.getTypeId()); + partDetails.setCompanyId(null); + partDetails.setCreateBy(String.valueOf(loginUser.getUserid())); + if (partDetails.getPartPrice()==null && partDetails.getPartId()!=null){ + // 根据 partId 找配件单价 + BigDecimal partPrice = mapper.selectPartPrice(partDetails.getPartId()); + // 设置配件单价费用 + partDetails.setPartPrice(partPrice); + } + //添加维修配件明细表数据 + addRepairPartDetails(partDetails); + repairApplyRecord.setId(bean.getId()); + repairApplyRecord.setPartPrice(partDetails.getPartPrice()); + repairApplyRecord.setPartNum(partDetails.getPartNum()); + repairApplyRecord.setRepairContent(partDetails.getRepairContent()); + repairApplyRecord.setPartType(1); + repairApplyRecord.setPartId(Optional.ofNullable(partDetails.getPartId()).orElse(0L)); + //添加维修记录表数据 + addRepairRecord(repairApplyRecord); + } + + /** + * 添加维修记录表数据 + */ + private void addRepairRecord(RepairApplyRecord repairApplyRecord) { + mapper.addRecord(repairApplyRecord); + } + + /** + * 添加维修配件明细表数据 + */ + private void addRepairPartDetails(RepairPartDetails partDetails) { + // 添加【维修配件明细表】 + mapper.addPart(partDetails); + } + + /** + * 更新定损数量、定损人员 + */ + private void updateRepairedNumAndStatus(Long id,LoginUser loginUser) { + mapper.updateRepairedNumAndStatus(id, BigDecimal.ONE, 1, loginUser.getUsername(), loginUser.getUserid()); + } + + /** + * 更新维修人员 + */ + private void updateRepairer(RepairDeviceVO bean) { + if (!CollectionUtils.isEmpty(bean.getRepairList())){ + RepairPartDetails repairPartDetails = bean.getRepairList().get(0); + bean.setRepairer(repairPartDetails.getRepairer()); + bean.setRemark(repairPartDetails.getRemark()); + mapper.updateRepairer(bean); + } else { + bean.setRepairer(SecurityUtils.getLoginUser().getSysUser().getNickName()); + mapper.updateRepairer(bean); + } + + } + @Override @Transactional(rollbackFor = Exception.class) public AjaxResult endLossAssessmentTask(ArrayList taskList) { @@ -387,13 +556,12 @@ public class LossAssessmentServiceImpl implements LossAssessmentService { } } + /** + * 修改维修数、报废数 + * 更新定损状态 + */ private void splitRepairDetailsToMultiple(RepairDeviceVO bean, BigDecimal innerRepairNum, BigDecimal outerRepairNum, BigDecimal scrapNum, LoginUser loginUser) { - //本次修完了 - if ((bean.getRepairNum().subtract(innerRepairNum).subtract(outerRepairNum).subtract(scrapNum).compareTo(BigDecimal.valueOf(0)) ) == 0) { - mapper.updateRepairedAndScrapNum(bean.getId(), innerRepairNum.add(outerRepairNum), scrapNum, loginUser.getUserid(), loginUser.getUserid()); - } else { - mapper.updateRepairedAndScrapNum(bean.getId(), innerRepairNum.add(outerRepairNum), scrapNum, loginUser.getUserid(), loginUser.getUserid()); - } + mapper.updateRepairedAndScrapNum(bean.getId(), innerRepairNum.add(outerRepairNum), scrapNum, loginUser.getUserid(), loginUser.getUserid()); mapper.updateStatusByRepairScrapNum(bean.getId()); } @@ -413,7 +581,10 @@ public class LossAssessmentServiceImpl implements LossAssessmentService { // 遍历配件列表,判断配件类型,收费还是不收费 for (RepairPartDetails partDetails : partList) { // 维修记录表信息 - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()).setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setMaId(bean.getMaId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(manageType)) { repairApplyRecord.setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); repairApplyRecord.setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/repair/service/impl/RepairServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/repair/service/impl/RepairServiceImpl.java index 0f000111..7dca9865 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/repair/service/impl/RepairServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/repair/service/impl/RepairServiceImpl.java @@ -34,6 +34,7 @@ import org.hibernate.validator.internal.util.StringHelper; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; @@ -550,335 +551,7 @@ public class RepairServiceImpl implements RepairService { return AjaxResult.success(); } - @Override - public AjaxResult batchRepairApply(@NotNull List repairDeviceVOList) { - // 准备业务逻辑数据 - LoginUser loginUser = SecurityUtils.getLoginUser(); - // 配件集合 - List partList; - // 校验参数,过滤空数据 - repairDeviceVOList.removeIf(Objects::isNull); - - for (RepairDeviceVO bean : repairDeviceVOList) { - if (null == bean.getManageType()) { - throw new ServiceException("请选择物资管理方式"); - } - if (Objects.equals(MaTypeManageTypeEnum.CODE_DEVICE.getTypeId(), bean.getManageType())) { - partList = bean.getNumberInRepairPartList(); - // 物资管理方式--编码管理 - if (null == bean.getRepairType()) { - continue; - } - //修改ma_machine表检验信息 - ArrayList ids = new ArrayList<>(); - ids.add(bean.getId()); - repairMapper.updateMaMachine(ids, SecurityUtils.getLoginUser().getSysUser().getNickName()); - - // 根据维修方式,更新维修数量、报废数量 - switch (bean.getRepairType()) { - case INNER_REPAIR: { - partList = bean.getCodeInRepairPartList(); - // 更新维修数量、并修改维修人员 - repairMapper.updateRepairedNumAndStatus(bean.getId(), BigDecimal.ONE, 1, loginUser.getUsername(), loginUser.getUserid()); - // 保存内部维修文件 - if (CollectionUtil.isNotEmpty(bean.getInRepairList())) { - if (CollectionUtil.isNotEmpty(bean.getInRepairList().get(0).getFileList())) { - for (BmFileInfo fileInfo : bean.getInRepairList().get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.INNER_REPAIR.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getSysUser().getNickName()); - fileInfo.setCreateTime(DateUtils.getNowDate()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - } - } - } - break; - } - case RETURN_FACTORY: { - partList = bean.getCodeOutRepairPartList(); - // 更新维修数量、维修人员不变 - repairMapper.updateRepairedNumTwoAndStatus(bean.getId(), BigDecimal.ONE, 1, loginUser.getUserid()); - // 保存外部维修文件 - if (CollectionUtil.isNotEmpty(bean.getOutRepairList())) { - if (CollectionUtil.isNotEmpty(bean.getOutRepairList().get(0).getFileList())) { - for (BmFileInfo fileInfo : bean.getOutRepairList().get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.RETURN_FACTORY.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getSysUser().getNickName()); - fileInfo.setCreateTime(DateUtils.getNowDate()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - } - } - } - break; - } - case TO_SCRAP: { - // 报废无需上传配件、直接初始化空集合 - partList = bean.getCodeScrapRepairPartList(); - // 获取维修详情表中的维修详情记录:待维修、已维修、已报废的数量 - RepairTaskDetails details = repairMapper.getById(bean.getId()); - if (Objects.isNull(details)) { - throw new ServiceException("此维修记录不存在,请检查后提交!"); - } - - RepairApplyRecord scrapCostsRecord = new RepairApplyRecord(); - scrapCostsRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(bean.getRepairType()).setRepairNum(BigDecimal.ONE).setStatus(0L).setId(bean.getId()) - .setPartType(bean.getCodeScrapRepairPartList().get(0).getPartType()).setRepairType(3); - - // SQL: 新增【报废费用记录表】 - //repairMapper.addRepairCost(scrapCostsRecord, details.getBuyPrice(), bean.getCodeScrapRepairPartList().get(0).getScrapType()); - - // 更新报废数量 - repairMapper.updateScrapNumAndStatus(bean.getId(), BigDecimal.ONE, 1, loginUser.getUserid()); - break; - } - default: - System.err.println("请输入正确的维修类型:" + bean.getRepairType()); - break; - } - - // 更新维修人员信息 - if (!CollectionUtils.isEmpty(bean.getRepairList())) { - RepairPartDetails repairPartDetails = bean.getRepairList().get(0); - bean.setRepairer(repairPartDetails.getRepairer()); - bean.setRemark(repairPartDetails.getRemark()); - repairMapper.updateRepairer(bean); - } else { - bean.setRepairer(SecurityUtils.getLoginUser().getSysUser().getNickName()); - repairMapper.updateRepairer(bean); - } - - // 统一处理配件集合数据 - copeNumberManageInList(bean, partList, loginUser, bean.getManageType()); - - } else if (Objects.equals(MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId(), bean.getManageType())) { - // 物资管理方式--数量管理 - if (null == bean.getId()) { - throw new ServiceException("请完善参数,维修详情ID为空!"); - } - if (null == bean.getRepairType()) { - continue; - } - - //校验本次维修数量不能大于待维修数量 - if (bean.getTaskId() != null && bean.getTypeId() != null) { - // 查询该任务待维修数量 - RepairDeviceVO repairDeviceVO = repairMapper.getRepairNumByTaskId(bean); - BigDecimal thisRepairNum = BigDecimal.ZERO; - - // 计算本次维修数量 - if (bean.getNumberInRepairPartList().size() > 0) { - if (null != bean.getNumberInRepairPartList().get(0).getRepairNum() && 0 < bean.getNumberInRepairPartList().get(0).getRepairNum().compareTo(BigDecimal.ZERO)) { - thisRepairNum = thisRepairNum.add(bean.getNumberInRepairPartList().get(0).getRepairNum()); - } - } - if (bean.getNumberOutRepairPartList().size() > 0) { - if (null != bean.getNumberOutRepairPartList().get(0).getRepairNum() && 0 < bean.getNumberOutRepairPartList().get(0).getRepairNum().compareTo(BigDecimal.ZERO)) { - thisRepairNum = thisRepairNum.add(bean.getNumberOutRepairPartList().get(0).getRepairNum()); - } - } - if (bean.getNumberScrapRepairPartList().size() > 0) { - if (null != bean.getNumberScrapRepairPartList().get(0).getScrapNum() && 0 < bean.getNumberScrapRepairPartList().get(0).getScrapNum().compareTo(BigDecimal.ZERO)) { - thisRepairNum = thisRepairNum.add(bean.getNumberScrapRepairPartList().get(0).getScrapNum()); - } - } - - // 比较 repairHomeInfo.getRepairNum() 和 thisRepairNum 的值 - if (repairDeviceVO != null && repairDeviceVO.getRepairNum() != null) { - int comparisonResult = thisRepairNum.compareTo(repairDeviceVO.getRepairNum()); - - if (comparisonResult > 0) { - // thisRepairNum 大于 repairHomeInfo.getRepairNum() - return AjaxResult.success("维修已完成"); - } - } else { - // repairHomeInfo 或 repairHomeInfo.getRepairNum() 为 null 的处理 - throw new ServiceException("此维修记录不存在,请检查后提交"); - } - } - - // 更新维修人员信息 - if (!CollectionUtils.isEmpty(bean.getRepairList())) { - RepairPartDetails repairPartDetails = bean.getRepairList().get(0); - bean.setRepairer(repairPartDetails.getRepairer()); - bean.setRemark(repairPartDetails.getRemark()); - repairMapper.updateRepairer(bean); - for (RepairPartDetails partDetails : bean.getRepairList()) { - if (!CollectionUtils.isEmpty(partDetails.getFileList())) { - for (BmFileInfo bmFileInfo : partDetails.getFileList()) { - bmFileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR_NUM.getTaskTypeId()) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getSysUser().getNickName()); - bmFileInfoMapper.insertBmFileInfo(bmFileInfo); - } - } - } - } - BigDecimal innerRepairNum = BigDecimal.ZERO; - BigDecimal outerRepairNum = BigDecimal.ZERO; - BigDecimal scrapNum = BigDecimal.ZERO; - - // 处理配件--数量管理--内部维修 - if (CollectionUtil.isNotEmpty(bean.getNumberInRepairPartList())) { - partList = bean.getNumberInRepairPartList(); - if (null != partList.get(0).getRepairNum() && 0 < partList.get(0).getRepairNum().compareTo(BigDecimal.ZERO)) { - // 获取维修详情表中的维修详情记录:待维修、已维修、已报废的数量 - RepairTaskDetails details = repairMapper.getById(bean.getId()); - if (Objects.isNull(details)) { - throw new ServiceException("此维修记录不存在,请检查后提交!"); - } - // 分拆维修单, 准备数据 - innerRepairNum = partList.get(0).getRepairNum(); - // 处理配件集合数据 - copeNumberManageInList(bean, partList, loginUser, bean.getManageType()); - } - } - // 保存内部维修文件 - if (CollectionUtil.isNotEmpty(bean.getInRepairList())) { - if (CollectionUtil.isNotEmpty(bean.getInRepairList().get(0).getFileList())) { - for (BmFileInfo fileInfo : bean.getInRepairList().get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.INNER_REPAIR.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getSysUser().getNickName()); - fileInfo.setCreateTime(DateUtils.getNowDate()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - } - } - } - - // 处理配件集合数据 -- 数量管理--外部返厂维修 - if (CollectionUtil.isNotEmpty(bean.getNumberOutRepairPartList())) { - // 获取维修详情表中的维修详情记录:待维修、已维修、已报废的数量 - RepairTaskDetails details = repairMapper.getById(bean.getId()); - if (Objects.isNull(details)) { - throw new ServiceException("此维修记录不存在,请检查后提交!"); - } - BigDecimal sfCosts = BigDecimal.ZERO; - partList = bean.getNumberOutRepairPartList(); - // 重新查询维修详情 - details = repairMapper.getById(bean.getId()); - - // 判断外部维修配件数量是否为空 - if (null != partList.get(0).getRepairNum() && partList.get(0).getRepairNum().compareTo(BigDecimal.ZERO) > 0) { - // 分拆维修单, 准备数据 - outerRepairNum = partList.get(0).getRepairNum(); - - if (null == partList.get(0).getSupplierId()) { - throw new ServiceException("请选择返厂厂家"); - } - - // 数量管理--外部返厂维修 -- 记录表插入数据 - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - for (RepairPartDetails repairPartDetails : partList) { - repairApplyRecord.setId(bean.getId()).setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(RepairTypeEnum.RETURN_FACTORY.getTypeId()).setRepairNum(repairPartDetails.getRepairNum()).setScrapNum(BigDecimal.valueOf(0)) - .setPartName(repairPartDetails.getPartName()).setPartType(repairPartDetails.getPartType()) - .setRepairContent(repairPartDetails.getRepairContent()).setSupplierId(repairPartDetails.getSupplierId()) - .setPartNum(repairPartDetails.getPartNum()).setRepairer(loginUser.getUsername()) - .setPartPrice(Optional.ofNullable(repairPartDetails.getPartPrice()).orElse(BigDecimal.ZERO)) - .setCreateBy(loginUser.getSysUser().getNickName()); - if (CollectionUtil.isNotEmpty(bean.getOutRepairList())) { - repairApplyRecord.setRemark(StringUtils.isNotBlank(bean.getOutRepairList().get(0).getRemark()) ? bean.getOutRepairList().get(0).getRemark() : ""); - } - // 新增【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - // 保存外部维修文件 - if (CollectionUtil.isNotEmpty(bean.getOutRepairList())) { - if (CollectionUtil.isNotEmpty(bean.getOutRepairList().get(0).getFileList())) { - for (BmFileInfo fileInfo : bean.getOutRepairList().get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.RETURN_FACTORY.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getSysUser().getNickName()); - fileInfo.setCreateTime(DateUtils.getNowDate()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - } - } - } - for (int i = 0; i < partList.size(); i++) { - sfCosts = sfCosts.add(partList.get(i).getPartPrice()); - } -// sfCosts = countPartCosts(partList, sfCosts); - // TODO: 判断是否是收费配件,因数据存在多条,可能有些是免费配件 有些收费,所以这里用价格统一做处理,后续讨论 - // SQL: 新增【维修费用记录表】 - repairMapper.addRepairCost(repairApplyRecord, sfCosts, sfCosts.equals(BigDecimal.ZERO) ? "0" : "1"); - } - } - - // 处理配件集合数据 -- 数量管理--报废维修 - if (CollectionUtil.isNotEmpty(bean.getNumberScrapRepairPartList())) { - // 判断报废数量是否为空 - if (bean.getNumberScrapRepairPartList().get(0).getScrapNum() != null && bean.getNumberScrapRepairPartList().get(0).getScrapNum().compareTo(BigDecimal.ZERO) > 0) { - // 获取维修详情表中的维修详情记录:待维修、已维修、已报废的数量 - RepairTaskDetails details = repairMapper.getById(bean.getId()); - - if (Objects.isNull(details)) { - throw new ServiceException("此维修记录不存在,请检查后提交!"); - } - - // 分拆维修单, 准备数据 - scrapNum = Optional.ofNullable(bean.getNumberScrapRepairPartList().get(0).getScrapNum()).orElse(BigDecimal.ZERO); - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - - // 计算报废金额 - BigDecimal scrapCosts = Optional.ofNullable(details.getBuyPrice()).orElse(BigDecimal.ZERO).multiply(scrapNum); - - // 附件📎 - if (CollectionUtil.isNotEmpty(bean.getNumberScrapRepairPartList().get(0).getFileList())) { - for (BmFileInfo fileInfo : bean.getNumberScrapRepairPartList().get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getUsername()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - - // 报废类型无需配件,所以配件为空,添加【维修记录表】 - // 维修记录表信息 - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(RepairTypeEnum.TO_SCRAP.getTypeId()).setStatus(0L).setIsSlt(0L).setPartNum(0) - .setFileIds(null == fileInfo.getId() ? "" : String.valueOf(fileInfo.getId())) - .setRepairNum(scrapNum).setScrapNum(bean.getNumberScrapRepairPartList().get(0).getScrapNum()) - .setScrapId(bean.getNumberScrapRepairPartList().get(0).getScrapId()) - .setScrapReason(bean.getNumberScrapRepairPartList().get(0).getScrapReason()) - .setScrapType(bean.getNumberScrapRepairPartList().get(0).getScrapType()) - .setRepairer(loginUser.getUsername()).setCreateBy(loginUser.getUsername()); - // 因报废操作无需配件, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - } else { - // 报废类型无需配件,所以配件为空,添加【维修记录表】 - // 维修记录表信息 - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(RepairTypeEnum.TO_SCRAP.getTypeId()).setStatus(0L).setIsSlt(0L).setPartNum(0) - .setRepairNum(scrapNum).setScrapNum(bean.getNumberScrapRepairPartList().get(0).getScrapNum()) - .setScrapReason(bean.getNumberScrapRepairPartList().get(0).getScrapReason()) - .setScrapType(bean.getNumberScrapRepairPartList().get(0).getScrapType()) - .setRepairer(loginUser.getUsername()).setCreateBy(loginUser.getUsername()); - // 因报废操作无需配件, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - - // SQL: 新增【报废费用记录表】 - repairMapper.addRepairCost(repairApplyRecord, scrapCosts, repairApplyRecord.getScrapType()); - - } - } - // 拆分维修单 - splitRepairDetailsToMultiple(bean, innerRepairNum, outerRepairNum, scrapNum, loginUser); - - } else { - throw new ServiceException("请选择正确的维修类型"); - } - } - - return AjaxResult.success("维修完成"); - } /** * 拆分维修单,生成任务协议表 @@ -916,282 +589,6 @@ public class RepairServiceImpl implements RepairService { return newTask; } - /** - * 将维修详情拆分到多个类别 - * 此方法用于根据内修、外修和报废数量更新维修记录, - * 它首先检查提交的总维修数量是否超过实际维修数量,如果超过,则抛出异常 - * 如果本次维修完成了全部维修任务,则直接更新实际维修数量和报废数量,否则,更新本次维修和报废的数量 - * - * @param bean 维修设备的视图对象,包含维修相关信息 - * @param innerRepairNum 内部维修数量 - * @param outerRepairNum 外部维修数量 - * @param scrapNum 报废数量 - * @param loginUser 当前登录用户信息,用于记录操作者 - * @throws ServiceException 如果本次维修提交总数过大,则抛出此异常 - */ - private void splitRepairDetailsToMultiple(RepairDeviceVO bean, BigDecimal innerRepairNum, BigDecimal outerRepairNum, BigDecimal scrapNum, LoginUser loginUser) { - if (bean.getRepairNum().compareTo(innerRepairNum.add(outerRepairNum).add(scrapNum)) < 0) { - throw new ServiceException("本次维修提交总数过大"); - } - //本次修完了 - // TODO 2024-12-11 阮世耀:经过讨论 这里不管一次是否全部修完 都要先修复this 那么此判断是无意义的 - if ((bean.getRepairNum().subtract(innerRepairNum).subtract(outerRepairNum).subtract(scrapNum).compareTo(BigDecimal.valueOf(0))) == 0) { - // TODO 2024-12-12 阮世耀:按逻辑来说 在审核之后才会PUT到真实的维修or报废数量,那么这里统一只修改this值 -// repairMapper.updateRepairedNum(bean.getId(), innerRepairNum.add(outerRepairNum) , loginUser.getUserid(), loginUser.getUserid()); -// repairMapper.updateScrapNum(bean.getId(), scrapNum, loginUser.getUserid()); - repairMapper.updateRepairedAndScrapNum(bean.getId(), innerRepairNum.add(outerRepairNum), scrapNum, loginUser.getUserid(), loginUser.getUserid()); - } else { - // TODO 2024-12-12 阮世耀:按逻辑来说 在审核之后才会PUT到真实的维修or报废数量,那么这里统一只修改this值 -// repairMapper.updateRepairedNum(bean.getId(), innerRepairNum.add(outerRepairNum) , loginUser.getUserid(), loginUser.getUserid()); -// repairMapper.updateScrapNum(bean.getId(), scrapNum, loginUser.getUserid()); - repairMapper.updateRepairedAndScrapNum(bean.getId(), innerRepairNum.add(outerRepairNum), scrapNum, loginUser.getUserid(), loginUser.getUserid()); - } - repairMapper.updateStatusByRepairScrapNum(bean.getId()); - } - - - /** - * 配件列表价格合计 - * - * @param partList 配件列表 - * @param sfCosts 配件价格合计 - * @return 配件合计后的价格 - */ - private static BigDecimal countPartCosts(List partList, BigDecimal sfCosts) { - for (RepairPartDetails partDetails : partList) { - if (null != partDetails.getPartPrice() && null != partDetails.getPartNum()) { - BigDecimal partPrice = partDetails.getPartPrice(); - BigDecimal partNumber = new BigDecimal(partDetails.getPartNum()); - sfCosts = sfCosts.add(partPrice.multiply(partNumber)); - } - } - return sfCosts; - } - - /** - * 处理配件集合数据 - * - * @param bean 维修申请单 - * @param partList 配件列表 - * @param loginUser 当前登录用户 - * @param manageType 管理方式:0编码管理 1数量管理 - */ - private void copeNumberManageInList(RepairDeviceVO bean, List partList, LoginUser loginUser, Integer manageType) { - if (CollectionUtil.isNotEmpty(partList)) { - if (null == bean.getManageType()) { - throw new ServiceException("请选择物资管理方式"); - } - // 如果是数量管理,那么默认为内部维修 - if (null == bean.getRepairType() && MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { - bean.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); - } - // 再检查还是null的话直接结束任务 - if (null == bean.getRepairType()) { - return; - } - - // 内部维修 - if (RepairTypeEnum.INNER_REPAIR.getTypeId().equals(bean.getRepairType())) { - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - // 遍历配件列表,判断配件类型,收费还是不收费 - for (RepairPartDetails partDetails : partList) { - // 维修记录表信息 - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()).setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); - if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(manageType)) { - repairApplyRecord.setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); - repairApplyRecord.setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); - } - if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { - repairApplyRecord.setRepairNum(partDetails.getRepairNum()); - } - repairApplyRecord.setCreateBy(loginUser.getSysUser().getNickName()); - repairApplyRecord.setStatus(0L); - if (bean.getInRepairList() != null && bean.getInRepairList().size() > 0) { - repairApplyRecord.setRemark(StringUtils.isNotBlank(bean.getInRepairList().get(0).getRemark()) ? bean.getInRepairList().get(0).getRemark() : ""); - } - - if ((null != partDetails.getId() || null != partDetails.getPartId()) && null != partDetails.getPartNum()) { - partDetails.setPartId(null != partDetails.getPartId() ? partDetails.getPartId() : partDetails.getId()); - // 有维修配件时,如果价格为空,设置为0 - if (null == partDetails.getPartCost()) { - partDetails.setPartCost(BigDecimal.ZERO); - } - - partDetails.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()).setCompanyId(null); - partDetails.setCreateBy(String.valueOf(loginUser.getUserid())); - - // 根据 partId 找配件单价 - BigDecimal partPrice = repairMapper.selectPartPrice(partDetails.getPartId()); - // 设置配件单价费用 - partDetails.setPartPrice(partPrice); - // 添加【维修配件明细表】 - repairMapper.addPart(partDetails); - - // 设置维修记录的配件费用 - repairApplyRecord.setId(bean.getId()) - .setPartPrice(partPrice) - .setPartNum(partDetails.getPartNum()) - .setRepairContent(partDetails.getRepairContent()) - .setPartType(partDetails.getPartType()) - .setPartId(Optional.ofNullable(partDetails.getPartId()).orElse(0L)); - // 添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - - //1、查询该附件的库存数量 - int partNum = repairMapper.getPartNum(partDetails.getPartId()); - if (partNum >= partDetails.getPartNum()) { - //2、查询所有该配件数据,数据根据数量递减,扣除数量 - List list = repairMapper.getPartList(partDetails.getPartId()); - Integer partNums = partDetails.getPartNum(); - for (int i = 0; i < list.size() && partNums > 0; i++) { - RepairPart currentPart = list.get(i); - if (currentPart.getPartNum() >= partNums) { - // 当前记录数量足够,直接减去全部需要的数量 - currentPart.setPartNum(currentPart.getPartNum() - partNums); - partNums = 0; - } else { - // 当前记录数量不足,全部减去,并继续下一条记录 - partNums -= currentPart.getPartNum(); - } - // 更新数据库中的配件数量 - repairMapper.updatePartNum(currentPart); - } - } else { - throw new ServiceException("配件库存不足"); - } - - } else { - // 不选维修配件时, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - } - // 根据配件id 统计配件费用 - PartType type = partTypeMapper.selectPartTypeByPaId(partList.get(0).getPartId()); - if (type != null) { - partList.get(0).setPartPrice(type.getBuyPrice()); - } - BigDecimal sfCosts = countPartCosts(partList, BigDecimal.ZERO); - // TODO: 判断是否是收费配件,因数据存在多条,可能有些是免费配件 有些收费,所以这里用价格统一做处理,后续讨论 - // SQL: 新增【维修费用记录表】 - //repairApplyRecord.setRepairNum(partList.get(0).getPartNum() != null ? BigDecimal.valueOf(partList.get(0).getPartNum()) : BigDecimal.ZERO); - //查询定损是否把价格已经添加 - int count = repairMapper.getCostCount(repairApplyRecord); - if (count == 0) { - repairMapper.addRepairCost(repairApplyRecord, sfCosts, partList.get(0).getPartType().toString()); - } - } - - // 外部维修 - if (RepairTypeEnum.RETURN_FACTORY.getTypeId().equals(bean.getRepairType())) { - // ---------------校验维修数量----------------- - // 统计已维修数量 + 本次维修数量 - BigDecimal repairNum = bean.getRepairedNum().add(bean.getRepairNum()); - // 统计报废数量 + 维修合计数量 不能 大与> 总的待维修量 - if (repairNum.add(bean.getScrapNum()).compareTo(bean.getRepairNum()) > 0) { - throw new ServiceException("维修数量大于维修总量"); - } - - // 更新维修数量、维修人员不变 - repairMapper.updateRepairedNumTwo(bean.getId(), repairNum, loginUser.getUserid()); - - // 编码管理--外部返厂维修 - if (partList != null && partList.size() > 0) { - for (int i = 0; i < partList.size(); i++) { - RepairApplyRecord repairApplyRecord = new RepairApplyRecord().setId(bean.getId()).setTaskId(bean.getTaskId()).setMaId(bean.getMaId()) - .setTypeId(bean.getTypeId()).setRepairType(RepairTypeEnum.RETURN_FACTORY.getTypeId()) - .setPartName(partList.get(i).getPartName()) - .setPartType(partList.get(i).getPartType()) - .setRepairContent(partList.get(i).getRepairContent()).setPartNum(partList.get(i).getPartNum()); - - if (null == partList.get(i).getSupplierId()) { - throw new ServiceException("请选择返厂厂家"); - } - repairApplyRecord.setCreateBy(loginUser.getSysUser().getNickName()); - repairApplyRecord.setSupplierId(partList.get(i).getSupplierId()); - repairApplyRecord.setPartPrice(Optional.ofNullable(partList.get(i).getBackCost()).orElse(BigDecimal.ZERO)); - if (!CollectionUtils.isEmpty(bean.getOutRepairList())) { - repairApplyRecord.setRemark(StringUtils.isNotBlank(bean.getOutRepairList().get(0).getRemark()) ? bean.getOutRepairList().get(0).getRemark() : ""); - } - if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(manageType)) { - repairApplyRecord.setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); - repairApplyRecord.setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)); - } - if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { - repairApplyRecord.setRepairNum(partList.get(i).getRepairNum()); - } - - // 新增【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - - // 配件费用计算 - BigDecimal sfCosts = partList.get(i).getBackCost() != null ? partList.get(i).getBackCost() : BigDecimal.ZERO; - - // TODO: 判断是否是收费配件,因数据存在多条,可能有些是免费配件 有些收费,所以这里用价格统一做处理,后续讨论 - // SQL: 新增【维修费用记录表】 - //repairApplyRecord.setRepairNum(partList.get(i).getPartNum() != null ? BigDecimal.valueOf(partList.get(i).getPartNum()) : BigDecimal.ZERO); - //查询定损是否把价格已经添加 - int count = repairMapper.getCostCount(repairApplyRecord); - if (count == 0) { - repairMapper.addRepairCost(repairApplyRecord, sfCosts, partList.get(i).getPartType().toString()); - } - } - } - - } - - // 如果是报废类型,进行上传附件相关处理 - if (RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType())) { - if (CollectionUtil.isNotEmpty(partList.get(0).getFileList())) { - for (BmFileInfo fileInfo : partList.get(0).getFileList()) { - fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) - .setFileType(Long.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId())) - .setTaskId(bean.getTaskId()).setModelId(bean.getId()) - .setCreateBy(loginUser.getUsername()); - bmFileInfoMapper.insertBmFileInfo(fileInfo); - - // 配件为空,添加【维修记录表】 - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(bean.getRepairType()).setStatus(0L).setFileIds(String.valueOf(fileInfo.getId())) - .setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setCreateBy(loginUser.getUsername()); - repairApplyRecord.setScrapType(partList.get(0).getScrapType()); - repairApplyRecord.setScrapReason(partList.get(0).getScrapReason()); - repairApplyRecord.setScrapId(partList.get(0).getScrapId()); - // 不选维修配件时, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - } else { - // 配件为空,添加【维修记录表】 - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(bean.getRepairType()).setStatus(0L) - .setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setCreateBy(loginUser.getUsername()); - repairApplyRecord.setScrapType(partList.get(0).getScrapType()); - repairApplyRecord.setScrapReason(partList.get(0).getScrapReason()); - repairApplyRecord.setScrapId(partList.get(0).getScrapId()); - // 不选维修配件时, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - } - - } else { - // 配件为空,添加【维修记录表】 - RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); - repairApplyRecord.setTaskId(bean.getTaskId()).setMaId(bean.getMaId()).setTypeId(bean.getTypeId()) - .setRepairType(bean.getRepairType()).setStatus(0L) - .setRepairNum(BigDecimal.valueOf(!RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setScrapNum(BigDecimal.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()) ? 1 : 0)) - .setCreateBy(loginUser.getUsername()); - repairApplyRecord.setRemark(StringUtils.isNotBlank(bean.getRemark()) ? bean.getRemark() : ""); - // 不选维修配件时, 只添加【维修记录表】 - repairMapper.addRecord(repairApplyRecord); - } - } - @Override @Transactional(rollbackFor = Exception.class) public AjaxResult endRepairTask(@NotNull List taskList) { @@ -1979,4 +1376,1094 @@ public class RepairServiceImpl implements RepairService { } } + + + + /** + * 批量维修申请处理 + * + * @param repairDeviceVOList 维修设备VO列表 + * @return 处理结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult batchRepairApply(@NotNull List repairDeviceVOList) { + try { + // 获取当前登录用户(提前获取,避免多次调用) + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 校验并过滤空数据 + repairDeviceVOList.removeIf(Objects::isNull); + + // 遍历处理每个维修设备信息 + for (RepairDeviceVO repairDevice : repairDeviceVOList) { + // 校验物资管理方式是否为空 + if (null == repairDevice.getManageType()) { + throw new ServiceException("请选择物资管理方式"); + } + + // 根据物资管理方式分支处理 + Integer manageType = repairDevice.getManageType(); + if (Objects.equals(MaTypeManageTypeEnum.CODE_DEVICE.getTypeId(), manageType)) { + // 编码管理方式处理 + handleCodeManageRepair(repairDevice, loginUser); + } else if (Objects.equals(MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId(), manageType)) { + // 数量管理方式处理 + handleNumberManageRepair(repairDevice, loginUser); + } else { + throw new ServiceException("请选择正确的维修类型"); + } + } + + return AjaxResult.success("维修完成"); + } catch (Exception e) { + log.error("维修处理", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 处理编码管理方式的维修逻辑 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void handleCodeManageRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + // 维修类型为空则跳过当前处理 + if (null == repairDevice.getRepairType()) { + return; + } + + // 更新ma_machine表检验信息 + updateMaMachineCheckInfo(repairDevice); + + // 配件列表(用于后续统一处理) + List partList = null; + + // 根据维修类型分支处理 + Integer repairType = repairDevice.getRepairType(); + switch (repairType) { + case INNER_REPAIR: + partList = handleInnerRepair(repairDevice, loginUser); + break; + case RETURN_FACTORY: + partList = handleReturnFactoryRepair(repairDevice, loginUser); + break; + case TO_SCRAP: + partList = handleScrapRepair(repairDevice, loginUser); + break; + default: + System.err.println("请输入正确的维修类型:" + repairType); + break; + } + + // 更新维修人员信息 + updateRepairerInfo(repairDevice, loginUser); + + // 统一处理配件集合数据 + copeNumberManageInListNew(repairDevice, partList, loginUser, repairDevice.getManageType()); + } + + /** + * 处理数量管理方式的维修逻辑 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void handleNumberManageRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + // 校验维修详情ID不能为空 + validateRepairDetailIdNotNull(repairDevice); + + // 维修类型为空则跳过当前处理 + if (null == repairDevice.getRepairType()) { + return; + } + + // 校验本次维修数量不能大于待维修数量 + validateRepairNumNotExceedPending(repairDevice); + + // 更新维修人员信息并处理关联文件 + updateRepairerInfoWithFile(repairDevice, loginUser); + + // 初始化各类维修数量 + BigDecimal innerRepairNum = BigDecimal.ZERO; + BigDecimal outerRepairNum = BigDecimal.ZERO; + BigDecimal scrapNum = BigDecimal.ZERO; + + // 处理内部维修 + innerRepairNum = handleNumberManageInnerRepair(repairDevice, loginUser); + + // 保存内部维修文件(复用通用方法) + saveRepairFile(repairDevice.getInRepairList(), TmTaskTypeEnum.TM_TASK_REPAIR, RepairTypeEnum.INNER_REPAIR, + repairDevice, + loginUser); + + // 处理外部返厂维修 + outerRepairNum = handleNumberManageReturnFactoryRepair(repairDevice, loginUser); + + // 处理报废维修 + scrapNum = handleNumberManageScrapRepair(repairDevice, loginUser); + + // 拆分维修单 + splitRepairDetailsToMultiple(repairDevice, innerRepairNum, outerRepairNum, scrapNum, loginUser); + } + + /** + * 校验维修详情ID不能为空 + * + * @param repairDevice 维修设备VO + */ + private void validateRepairDetailIdNotNull(RepairDeviceVO repairDevice) { + if (null == repairDevice.getId()) { + throw new ServiceException("请完善参数,维修详情ID为空!"); + } + } + + /** + * 更新ma_machine表检验信息 + * + * @param repairDevice 维修设备VO + */ + private void updateMaMachineCheckInfo(RepairDeviceVO repairDevice) { + ArrayList ids = new ArrayList<>(); + ids.add(repairDevice.getId()); + String operatorNickName = SecurityUtils.getLoginUser().getSysUser().getNickName(); + repairMapper.updateMaMachine(ids, operatorNickName); + } + + /** + * 处理内部维修逻辑(编码管理) + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 内部维修配件列表 + */ + private List handleInnerRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + List partList = repairDevice.getCodeInRepairPartList(); + + // 更新维修数量、并修改维修人员 + repairMapper.updateRepairedNumAndStatus(repairDevice.getId(), BigDecimal.ONE, 1, + loginUser.getUsername(), loginUser.getUserid()); + + // 保存内部维修文件 + saveRepairFile(repairDevice.getInRepairList(), TmTaskTypeEnum.TM_TASK_REPAIR, RepairTypeEnum.INNER_REPAIR, + repairDevice, + loginUser); + + return partList; + } + + /** + * 处理返厂维修逻辑(编码管理) + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 返厂维修配件列表 + */ + private List handleReturnFactoryRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + List partList = repairDevice.getCodeOutRepairPartList(); + + // 更新维修数量、维修人员不变 + repairMapper.updateRepairedNumTwoAndStatus(repairDevice.getId(), BigDecimal.ONE, 1, loginUser.getUserid()); + + // 保存外部维修文件 + saveRepairFile(repairDevice.getOutRepairList(), TmTaskTypeEnum.TM_TASK_REPAIR, RepairTypeEnum.RETURN_FACTORY, + repairDevice, + loginUser); + + return partList; + } + + /** + * 处理报废维修逻辑(编码管理) + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 报废维修配件列表 + */ + private List handleScrapRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + List partList = repairDevice.getCodeScrapRepairPartList(); + + // 获取维修详情记录并校验 + RepairTaskDetails repairDetails = getAndValidateRepairTaskDetails(repairDevice.getId()); + + // 构建报废费用记录 + RepairApplyRecord scrapCostsRecord = buildScrapCostsRecord(repairDevice); + + // 更新报废数量 + repairMapper.updateScrapNumAndStatus(repairDevice.getId(), BigDecimal.ONE, 1, loginUser.getUserid()); + + return partList; + } + + /** + * 获取并校验维修任务详情 + * + * @param repairDetailId 维修详情ID + * @return 维修任务详情 + */ + private RepairTaskDetails getAndValidateRepairTaskDetails(Long repairDetailId) { + RepairTaskDetails details = repairMapper.getById(repairDetailId); + if (Objects.isNull(details)) { + throw new ServiceException("此维修记录不存在,请检查后提交!"); + } + return details; + } + + /** + * 构建报废费用记录 + * + * @param repairDevice 维修设备VO + * @return 报废费用记录 + */ + private RepairApplyRecord buildScrapCostsRecord(RepairDeviceVO repairDevice) { + RepairApplyRecord scrapCostsRecord = new RepairApplyRecord(); + scrapCostsRecord.setTaskId(repairDevice.getTaskId()) + .setMaId(repairDevice.getMaId()) + .setTypeId(repairDevice.getTypeId()) + .setRepairType(repairDevice.getRepairType()) + .setRepairNum(BigDecimal.ONE) + .setStatus(0L) + .setId(repairDevice.getId()) + .setPartType(repairDevice.getCodeScrapRepairPartList().get(0).getPartType()) + .setRepairType(3); + return scrapCostsRecord; + } + + /** + * 更新维修人员信息(无文件关联) + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void updateRepairerInfo(RepairDeviceVO repairDevice, LoginUser loginUser) { + if (!CollectionUtils.isEmpty(repairDevice.getRepairList())) { + RepairPartDetails repairPartDetails = repairDevice.getRepairList().get(0); + repairDevice.setRepairer(repairPartDetails.getRepairer()); + repairDevice.setRemark(repairPartDetails.getRemark()); + } else { + repairDevice.setRepairer(SecurityUtils.getLoginUser().getSysUser().getNickName()); + } + // 统一更新维修人员 + repairMapper.updateRepairer(repairDevice); + } + + /** + * 更新维修人员信息并处理关联文件(数量管理专用) + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void updateRepairerInfoWithFile(RepairDeviceVO repairDevice, LoginUser loginUser) { + if (!CollectionUtils.isEmpty(repairDevice.getRepairList())) { + RepairPartDetails repairPartDetails = repairDevice.getRepairList().get(0); + repairDevice.setRepairer(repairPartDetails.getRepairer()); + repairDevice.setRemark(repairPartDetails.getRemark()); + repairMapper.updateRepairer(repairDevice); + + // 处理维修人员关联文件 + handleRepairerRelatedFile(repairDevice, loginUser); + } else { + // 无维修列表时,默认设置当前用户为维修人员 + repairDevice.setRepairer(SecurityUtils.getLoginUser().getSysUser().getNickName()); + repairMapper.updateRepairer(repairDevice); + } + } + + /** + * 处理维修人员关联文件 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void handleRepairerRelatedFile(RepairDeviceVO repairDevice, LoginUser loginUser) { + for (RepairPartDetails partDetails : repairDevice.getRepairList()) { + if (!CollectionUtils.isEmpty(partDetails.getFileList())) { + for (BmFileInfo bmFileInfo : partDetails.getFileList()) { + bmFileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR_NUM.getTaskTypeId()) + .setTaskId(repairDevice.getTaskId()) + .setModelId(repairDevice.getId()) + .setCreateBy(loginUser.getSysUser().getNickName()); + bmFileInfoMapper.insertBmFileInfo(bmFileInfo); + } + } + } + } + + /** + * 校验本次维修数量不能大于待维修数量 + * + * @param repairDevice 维修设备VO + */ + private void validateRepairNumNotExceedPending(RepairDeviceVO repairDevice) { + if (repairDevice.getTaskId() != null && repairDevice.getTypeId() != null) { + // 查询该任务待维修数量 + RepairDeviceVO pendingRepairDevice = repairMapper.getRepairNumByTaskId(repairDevice); + BigDecimal currentRepairTotalNum = calculateCurrentRepairTotalNum(repairDevice); + + // 校验维修数量 + if (pendingRepairDevice != null && pendingRepairDevice.getRepairNum() != null) { + if (currentRepairTotalNum.compareTo(pendingRepairDevice.getRepairNum()) > 0) { + throw new ServiceException("本次维修数量不能大于待维修数量"); + } + } else { + throw new ServiceException("此维修记录不存在,请检查后提交"); + } + } + } + + /** + * 计算本次维修总数量(内部+外部+报废) + * + * @param repairDevice 维修设备VO + * @return 本次维修总数量 + */ + private BigDecimal calculateCurrentRepairTotalNum(RepairDeviceVO repairDevice) { + BigDecimal totalNum = BigDecimal.ZERO; + + // 累加内部维修数量 + totalNum = accumulateRepairNum(totalNum, repairDevice.getNumberInRepairPartList(), true); + // 累加外部维修数量 + totalNum = accumulateRepairNum(totalNum, repairDevice.getNumberOutRepairPartList(), true); + // 累加报废数量 + totalNum = accumulateRepairNum(totalNum, repairDevice.getNumberScrapRepairPartList(), false); + + return totalNum; + } + + /** + * 累加维修/报废数量 + * + * @param totalNum 累计数量 + * @param partList 配件列表 + * @param isRepairNum 是否为维修数量(false为报废数量) + * @return 累加后的总数量 + */ + private BigDecimal accumulateRepairNum(BigDecimal totalNum, List partList, boolean isRepairNum) { + if (CollectionUtil.isNotEmpty(partList)) { + RepairPartDetails firstPart = partList.get(0); + BigDecimal num = isRepairNum ? firstPart.getRepairNum() : firstPart.getScrapNum(); + if (null != num && 0 < num.compareTo(BigDecimal.ZERO)) { + totalNum = totalNum.add(num); + } + } + return totalNum; + } + + /** + * 处理数量管理-内部维修 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 内部维修数量 + */ + private BigDecimal handleNumberManageInnerRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + BigDecimal innerRepairNum = BigDecimal.ZERO; + List partList = repairDevice.getNumberInRepairPartList(); + + if (CollectionUtil.isNotEmpty(partList)) { + RepairPartDetails firstPart = partList.get(0); + if (null != firstPart.getRepairNum() && 0 < firstPart.getRepairNum().compareTo(BigDecimal.ZERO)) { + // 校验维修记录存在 + getAndValidateRepairTaskDetails(repairDevice.getId()); + + innerRepairNum = firstPart.getRepairNum(); + // 处理配件集合数据 + copeNumberManageInListNew(repairDevice, partList, loginUser, repairDevice.getManageType()); + } + } + + return innerRepairNum; + } + + /** + * 处理数量管理-返厂维修 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 返厂维修数量 + */ + private BigDecimal handleNumberManageReturnFactoryRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + BigDecimal outerRepairNum = BigDecimal.ZERO; + List partList = repairDevice.getNumberOutRepairPartList(); + + if (CollectionUtil.isNotEmpty(partList)) { + // 校验维修记录存在 + getAndValidateRepairTaskDetails(repairDevice.getId()); + + RepairPartDetails firstPart = partList.get(0); + if (null != firstPart.getRepairNum() && firstPart.getRepairNum().compareTo(BigDecimal.ZERO) > 0) { + outerRepairNum = firstPart.getRepairNum(); + + // 校验返厂厂家 + validateSupplierIdNotNull(firstPart); + + // 保存返厂维修记录及费用 + saveReturnFactoryRepairRecord(repairDevice, partList, loginUser); + + // 保存外部维修文件 + saveRepairFile(repairDevice.getOutRepairList(), TmTaskTypeEnum.TM_TASK_REPAIR, RepairTypeEnum.RETURN_FACTORY, + repairDevice, + loginUser); + } + } + + return outerRepairNum; + } + + /** + * 校验返厂厂家ID不能为空 + * + * @param partDetails 配件详情 + */ + private void validateSupplierIdNotNull(RepairPartDetails partDetails) { + if (null == partDetails.getSupplierId()) { + throw new ServiceException("请选择返厂厂家"); + } + } + + /** + * 保存返厂维修记录及费用 + * + * @param repairDevice 维修设备VO + * @param partList 配件列表 + * @param loginUser 当前登录用户 + */ + private void saveReturnFactoryRepairRecord(RepairDeviceVO repairDevice, List partList, LoginUser loginUser) { + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + BigDecimal totalCost = BigDecimal.ZERO; + + for (RepairPartDetails repairPartDetails : partList) { + // 构建维修记录 + buildReturnFactoryRepairRecord(repairApplyRecord, repairDevice, repairPartDetails, loginUser); + // 新增维修记录 + repairMapper.addRecord(repairApplyRecord); + // 累加配件费用 + if (repairPartDetails.getPartType()!=null&&repairPartDetails.getPartType()==1){ + totalCost = totalCost.add(Optional.ofNullable(repairPartDetails.getPartPrice()).orElse(BigDecimal.ZERO)); + } + } + + // 新增维修费用记录(校验是否已存在) + saveRepairCostRecord(repairApplyRecord, totalCost, partList.get(0).getPartType().toString()); + } + + /** + * 构建返厂维修记录 + * + * @param repairApplyRecord 维修记录 + * @param repairDevice 维修设备VO + * @param partDetails 配件详情 + * @param loginUser 当前登录用户 + */ + private void buildReturnFactoryRepairRecord(RepairApplyRecord repairApplyRecord, RepairDeviceVO repairDevice, + RepairPartDetails partDetails, LoginUser loginUser) { + repairApplyRecord.setId(repairDevice.getId()) + .setTaskId(repairDevice.getTaskId()) + .setMaId(repairDevice.getMaId()) + .setTypeId(repairDevice.getTypeId()) + .setRepairType(RepairTypeEnum.RETURN_FACTORY.getTypeId()) + .setRepairNum(partDetails.getRepairNum()) + .setScrapNum(BigDecimal.ZERO) + .setPartName(partDetails.getPartName()) + .setPartType(partDetails.getPartType()) + .setRepairContent(partDetails.getRepairContent()) + .setSupplierId(partDetails.getSupplierId()) + .setPartNum(partDetails.getPartNum()) + .setRepairer(loginUser.getUsername()) + .setPartPrice(Optional.ofNullable(partDetails.getPartPrice()).orElse(BigDecimal.ZERO)) + .setCreateBy(loginUser.getSysUser().getNickName()); + + // 设置备注 + if (CollectionUtil.isNotEmpty(repairDevice.getOutRepairList())) { + String remark = StringUtils.isNotBlank(repairDevice.getOutRepairList().get(0).getRemark()) + ? repairDevice.getOutRepairList().get(0).getRemark() : ""; + repairApplyRecord.setRemark(remark); + } + } + + /** + * 处理数量管理-报废维修 + * + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + * @return 报废数量 + */ + private BigDecimal handleNumberManageScrapRepair(RepairDeviceVO repairDevice, LoginUser loginUser) { + BigDecimal scrapNum = BigDecimal.ZERO; + List partList = repairDevice.getNumberScrapRepairPartList(); + + if (CollectionUtil.isNotEmpty(partList)) { + RepairPartDetails firstPart = partList.get(0); + if (null != firstPart.getScrapNum() && firstPart.getScrapNum().compareTo(BigDecimal.ZERO) > 0) { + // 校验维修记录存在 + RepairTaskDetails details = getAndValidateRepairTaskDetails(repairDevice.getId()); + + scrapNum = Optional.ofNullable(firstPart.getScrapNum()).orElse(BigDecimal.ZERO); + // 计算报废金额 + BigDecimal scrapCosts = Optional.ofNullable(details.getBuyPrice()).orElse(BigDecimal.ZERO).multiply(scrapNum); + + // 保存报废文件及记录 + saveScrapFileAndRecord(repairDevice, firstPart, scrapNum, scrapCosts, loginUser); + } + } + + return scrapNum; + } + + /** + * 保存报废文件及维修/费用记录 + * + * @param repairDevice 维修设备VO + * @param firstPart 首个配件详情 + * @param scrapNum 报废数量 + * @param scrapCosts 报废费用 + * @param loginUser 当前登录用户 + */ + private void saveScrapFileAndRecord(RepairDeviceVO repairDevice, RepairPartDetails firstPart, + BigDecimal scrapNum, BigDecimal scrapCosts, LoginUser loginUser) { + if (CollectionUtil.isNotEmpty(firstPart.getFileList())) { + for (BmFileInfo fileInfo : firstPart.getFileList()) { + // 插入报废文件 + insertScrapFile(fileInfo, repairDevice, loginUser); + // 构建并插入报废维修记录(带文件ID) + RepairApplyRecord repairApplyRecord = buildScrapRepairRecord(repairDevice, firstPart, scrapNum, + loginUser, String.valueOf(fileInfo.getId())); + repairMapper.addRecord(repairApplyRecord); + // 新增报废费用记录 + repairMapper.addRepairCost(repairApplyRecord, scrapCosts, repairApplyRecord.getScrapType()); + } + } else { + // 构建并插入报废维修记录(无文件ID) + RepairApplyRecord repairApplyRecord = buildScrapRepairRecord(repairDevice, firstPart, scrapNum, + loginUser, ""); + repairMapper.addRecord(repairApplyRecord); + // 新增报废费用记录 + repairMapper.addRepairCost(repairApplyRecord, scrapCosts, repairApplyRecord.getScrapType()); + } + } + + /** + * 插入报废文件 + * + * @param fileInfo 文件信息 + * @param repairDevice 维修设备VO + * @param loginUser 当前登录用户 + */ + private void insertScrapFile(BmFileInfo fileInfo, RepairDeviceVO repairDevice, LoginUser loginUser) { + fileInfo.setTaskType(TmTaskTypeEnum.TM_TASK_REPAIR.getTaskTypeId()) + .setFileType(Long.valueOf(RepairTypeEnum.TO_SCRAP.getTypeId())) + .setTaskId(repairDevice.getTaskId()) + .setModelId(repairDevice.getId()) + .setCreateBy(loginUser.getUsername()); + bmFileInfoMapper.insertBmFileInfo(fileInfo); + } + + /** + * 构建报废维修记录 + * + * @param repairDevice 维修设备VO + * @param firstPart 首个配件详情 + * @param scrapNum 报废数量 + * @param loginUser 当前登录用户 + * @param fileIds 文件ID字符串 + * @return 报废维修记录 + */ + private RepairApplyRecord buildScrapRepairRecord(RepairDeviceVO repairDevice, RepairPartDetails firstPart, + BigDecimal scrapNum, LoginUser loginUser, String fileIds) { + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + repairApplyRecord.setTaskId(repairDevice.getTaskId()) + .setMaId(repairDevice.getMaId()) + .setTypeId(repairDevice.getTypeId()) + .setRepairType(RepairTypeEnum.TO_SCRAP.getTypeId()) + .setStatus(0L) + .setIsSlt(0L) + .setPartNum(0) + .setFileIds(fileIds) + .setRepairNum(scrapNum) + .setScrapNum(firstPart.getScrapNum()) + .setScrapId(firstPart.getScrapId()) + .setScrapReason(firstPart.getScrapReason()) + .setScrapType(firstPart.getScrapType()) + .setRepairer(loginUser.getUsername()) + .setCreateBy(loginUser.getUsername()); + return repairApplyRecord; + } + + /** + * 通用保存维修文件方法(消除重复代码) + * + * @param repairList 维修列表(内部/外部) + * @param taskType 任务类型 + * @param repairType 维修类型 + * @param loginUser 当前登录用户 + * @param bean 维修数据 + */ + private void saveRepairFile(List repairList, TmTaskTypeEnum taskType, + RepairTypeEnum repairType, RepairDeviceVO bean, LoginUser loginUser) { + if (CollectionUtil.isNotEmpty(repairList)) { + Object firstItem = repairList.get(0); + List fileList = null; + + if (firstItem instanceof RepairPartDetails) { + fileList = ((RepairPartDetails) firstItem).getFileList(); + } + + if (CollectionUtil.isNotEmpty(fileList)) { + for (BmFileInfo fileInfo : fileList) { + fileInfo.setTaskType(taskType.getTaskTypeId()) + .setFileType(Long.valueOf(repairType.getTypeId())) + .setTaskId(bean.getTaskId()) + .setModelId(bean.getId()) + .setCreateBy(loginUser.getSysUser().getNickName()); + fileInfo.setCreateTime(DateUtils.getNowDate()); + bmFileInfoMapper.insertBmFileInfo(fileInfo); + } + } + } + } + + /** + * 保存维修费用记录(校验是否已存在) + * + * @param repairApplyRecord 维修记录 + * @param totalCost 总费用 + * @param partType 配件类型 + */ + private void saveRepairCostRecord(RepairApplyRecord repairApplyRecord, BigDecimal totalCost, String partType) { + int count = repairMapper.getCostCount(repairApplyRecord); + if (count == 0) { + repairMapper.addRepairCost(repairApplyRecord, totalCost, partType); + } + } + + /** + * 处理配件集合数据 + * + * @param bean 维修申请单 + * @param partList 配件列表 + * @param loginUser 当前登录用户 + * @param manageType 管理方式:0编码管理 1数量管理 + */ + private void copeNumberManageInListNew(RepairDeviceVO bean, List partList, LoginUser loginUser, Integer manageType) { + // 过滤无效数据(保留partId不为null的数据),生成新集合 + List validPartList = partList.stream() + .filter(partDetails -> partDetails.getPartId() != null) + .collect(Collectors.toList()); + + // 替换原集合 + partList.clear(); + partList.addAll(validPartList); + if (CollectionUtil.isEmpty(partList)) { + // 配件为空时,添加默认维修记录 + addDefaultRepairRecord(bean, loginUser); + return; + } + + // 校验并补全维修类型 + validateAndCompleteRepairType(bean, manageType); + if (null == bean.getRepairType()) { + return; + } + + // 根据维修类型分支处理 + Integer repairType = bean.getRepairType(); + if (RepairTypeEnum.INNER_REPAIR.getTypeId().equals(repairType)) { + handleInnerRepairPart(bean, partList, loginUser, manageType); + } else if (RepairTypeEnum.RETURN_FACTORY.getTypeId().equals(repairType)) { + handleReturnFactoryRepairPart(bean, partList, loginUser, manageType); + } else if (RepairTypeEnum.TO_SCRAP.getTypeId().equals(repairType)) { + handleScrapRepairPart(bean, partList, loginUser); + } + } + + /** + * 校验并补全维修类型 + * + * @param bean 维修申请单 + * @param manageType 管理方式 + */ + private void validateAndCompleteRepairType(RepairDeviceVO bean, Integer manageType) { + if (null == bean.getManageType()) { + throw new ServiceException("请选择物资管理方式"); + } + + // 数量管理默认补全为内部维修 + if (null == bean.getRepairType() && MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { + bean.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); + } + } + + /** + * 添加默认维修记录(配件为空时) + * + * @param bean 维修申请单 + * @param loginUser 当前登录用户 + */ + private void addDefaultRepairRecord(RepairDeviceVO bean, LoginUser loginUser) { + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + Integer repairType = bean.getRepairType(); + boolean isScrap = RepairTypeEnum.TO_SCRAP.getTypeId().equals(repairType); + + repairApplyRecord.setTaskId(bean.getTaskId()) + .setMaId(bean.getMaId()) + .setTypeId(bean.getTypeId()) + .setRepairType(repairType) + .setStatus(0L) + .setRepairNum(BigDecimal.valueOf(isScrap ? 0 : 1)) + .setScrapNum(BigDecimal.valueOf(isScrap ? 1 : 0)) + .setCreateBy(loginUser.getUsername()); + + repairMapper.addRecord(repairApplyRecord); + } + + /** + * 处理内部维修配件 + * + * @param bean 维修申请单 + * @param partList 配件列表 + * @param loginUser 当前登录用户 + * @param manageType 管理方式 + */ + private void handleInnerRepairPart(RepairDeviceVO bean, List partList, LoginUser loginUser, Integer manageType) { + + for (RepairPartDetails partDetails : partList) { + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + // 构建维修记录基础信息 + buildInnerRepairRecordBaseInfo(repairApplyRecord, bean, partDetails, loginUser, manageType); + + if ( null != partDetails.getPartId() && null != partDetails.getPartNum()) { + // 处理配件信息并更新库存 + handleInnerRepairPartInfo(bean, partDetails, loginUser, repairApplyRecord); + } + } + + // 统计配件费用并保存费用记录 + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setId(bean.getId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setMaId(bean.getMaId()); + if (bean.getManageType()==0){ + repairApplyRecord.setRepairNum(BigDecimal.valueOf(1)); + } else { + repairApplyRecord.setRepairNum(partList.get(0).getRepairNum()); + } + repairApplyRecord.setRepairType(RepairTypeEnum.INNER_REPAIR.getTypeId()); + saveInnerRepairCostRecord(bean, partList, repairApplyRecord); + } + + /** + * 构建内部维修记录基础信息 + * + * @param repairApplyRecord 维修记录 + * @param bean 维修申请单 + * @param partDetails 配件详情 + * @param loginUser 当前登录用户 + * @param manageType 管理方式 + */ + private void buildInnerRepairRecordBaseInfo(RepairApplyRecord repairApplyRecord, RepairDeviceVO bean, + RepairPartDetails partDetails, LoginUser loginUser, Integer manageType) { + boolean isScrap = RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()); + Integer repairType = RepairTypeEnum.INNER_REPAIR.getTypeId(); + + repairApplyRecord.setTaskId(bean.getTaskId()); + repairApplyRecord.setMaId(bean.getMaId()); + repairApplyRecord.setTypeId(bean.getTypeId()); + repairApplyRecord.setRepairType(repairType); + repairApplyRecord.setCreateBy(loginUser.getSysUser().getNickName()); + repairApplyRecord.setStatus(0L); + + // 设置维修/报废数量 + if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(manageType)) { + repairApplyRecord.setRepairNum(BigDecimal.valueOf(isScrap ? 0 : 1)) + .setScrapNum(BigDecimal.valueOf(isScrap ? 1 : 0)); + } + if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { + repairApplyRecord.setRepairNum(partDetails.getRepairNum()); + } + + // 设置备注 + if (CollectionUtil.isNotEmpty(bean.getInRepairList())) { + String remark = StringUtils.isNotBlank(bean.getInRepairList().get(0).getRemark()) + ? bean.getInRepairList().get(0).getRemark() : ""; + repairApplyRecord.setRemark(remark); + } + } + + /** + * 处理内部维修配件信息并更新库存 + * + * @param bean 维修申请单 + * @param partDetails 配件详情 + * @param loginUser 当前登录用户 + * @param repairApplyRecord 维修记录 + */ + private void handleInnerRepairPartInfo(RepairDeviceVO bean, RepairPartDetails partDetails, + LoginUser loginUser, RepairApplyRecord repairApplyRecord) { + // 补全配件费用(为空则设为0) + partDetails.setPartCost(Optional.ofNullable(partDetails.getPartCost()).orElse(BigDecimal.ZERO)); + + // 设置配件基础信息 + partDetails.setTaskId(bean.getTaskId()) + .setMaId(bean.getMaId()) + .setTypeId(bean.getTypeId()) + .setCompanyId(null) + .setCreateBy(String.valueOf(loginUser.getUserid())); + + // 查询配件单价并设置 + BigDecimal partPrice = repairMapper.selectPartPrice(partDetails.getPartId()); + partDetails.setPartPrice(partPrice); + + // 添加配件明细表 + repairMapper.addPart(partDetails); + + // 补全维修记录配件信息 + repairApplyRecord.setId(bean.getId()) + .setPartPrice(partPrice) + .setPartNum(partDetails.getPartNum()) + .setRepairContent(partDetails.getRepairContent()) + .setPartType(partDetails.getPartType()) + .setPartId(Optional.ofNullable(partDetails.getPartId()).orElse(0L)); + + // 添加维修记录表 + repairMapper.addRecord(repairApplyRecord); + + // 更新配件库存 + updatePartStock(partDetails); + } + + /** + * 更新配件库存 + * + * @param partDetails 配件详情 + */ + private void updatePartStock(RepairPartDetails partDetails) { + // 查询当前库存 + int stockNum = repairMapper.getPartNum(partDetails.getPartId()); + if (stockNum < partDetails.getPartNum()) { + throw new ServiceException("配件库存不足"); + } + + // 扣除库存 + List list = repairMapper.getPartList(partDetails.getPartId()); + Integer partNums = partDetails.getPartNum(); + for (int i = 0; i < list.size() && partNums > 0; i++) { + RepairPart currentPart = list.get(i); + if (currentPart.getPartNum() >= partNums) { + // 当前记录数量足够,直接减去全部需要的数量 + currentPart.setPartNum(currentPart.getPartNum() - partNums); + partNums = 0; + } else { + // 当前记录数量不足,全部减去,并继续下一条记录 + partNums -= currentPart.getPartNum(); + } + // 更新数据库中的配件数量 + repairMapper.updatePartNum(currentPart); + } + } + + /** + * 保存内部维修费用记录 + * + * @param bean 维修申请单 + * @param partList 配件列表 + * @param repairApplyRecord 维修记录 + */ + private void saveInnerRepairCostRecord(RepairDeviceVO bean, List partList, + RepairApplyRecord repairApplyRecord) { + // 查询配件类型并设置单价 + PartType type = partTypeMapper.selectPartTypeByPaId(partList.get(0).getPartId()); + if (type != null) { + partList.get(0).setPartPrice(type.getBuyPrice()); + } + + // 统计配件总费用 + BigDecimal totalCost = countPartCosts(partList, BigDecimal.ZERO); + + // 保存费用记录(校验是否已存在) + saveRepairCostRecord(repairApplyRecord, totalCost, partList.get(0).getPartType().toString()); + } + + /** + * 处理返厂维修配件 + * + * @param bean 维修申请单 + * @param partList 配件列表 + * @param loginUser 当前登录用户 + * @param manageType 管理方式 + */ + private void handleReturnFactoryRepairPart(RepairDeviceVO bean, List partList, + LoginUser loginUser, Integer manageType) { + // 校验维修数量不超限 + BigDecimal repairNum = bean.getRepairedNum().add(bean.getRepairNum()); + if (repairNum.add(bean.getScrapNum()).compareTo(bean.getRepairNum()) > 0) { + throw new ServiceException("维修数量大于维修总量"); + } + + // 更新维修数量 + repairMapper.updateRepairedNumTwo(bean.getId(), repairNum, loginUser.getUserid()); + + // 遍历配件处理 + for (RepairPartDetails partDetails : partList) { + // 校验返厂厂家 + validateSupplierIdNotNull(partDetails); + + // 构建返厂维修记录 + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + buildReturnFactoryRepairPartRecord(repairApplyRecord, bean, partDetails, loginUser, manageType); + + // 添加维修记录 + repairMapper.addRecord(repairApplyRecord); + + // 统计并保存费用记录 + BigDecimal partCost = Optional.ofNullable(partDetails.getBackCost()).orElse(BigDecimal.ZERO); + saveRepairCostRecord(repairApplyRecord, partCost, partDetails.getPartType().toString()); + } + } + + /** + * 构建返厂维修配件记录 + * + * @param repairApplyRecord 维修记录 + * @param bean 维修申请单 + * @param partDetails 配件详情 + * @param loginUser 当前登录用户 + * @param manageType 管理方式 + */ + private void buildReturnFactoryRepairPartRecord(RepairApplyRecord repairApplyRecord, RepairDeviceVO bean, + RepairPartDetails partDetails, LoginUser loginUser, Integer manageType) { + boolean isScrap = RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()); + Integer repairType = RepairTypeEnum.RETURN_FACTORY.getTypeId(); + + repairApplyRecord.setId(bean.getId()) + .setTaskId(bean.getTaskId()) + .setMaId(bean.getMaId()) + .setTypeId(bean.getTypeId()) + .setRepairType(repairType) + .setPartName(partDetails.getPartName()) + .setPartType(partDetails.getPartType()) + .setRepairContent(partDetails.getRepairContent()) + .setSupplierId(partDetails.getSupplierId()) + .setPartNum(partDetails.getPartNum()) + .setPartPrice(Optional.ofNullable(partDetails.getBackCost()).orElse(BigDecimal.ZERO)) + .setCreateBy(loginUser.getSysUser().getNickName()); + + // 设置维修/报废数量 + if (MaTypeManageTypeEnum.CODE_DEVICE.getTypeId().equals(manageType)) { + repairApplyRecord.setRepairNum(BigDecimal.valueOf(isScrap ? 0 : 1)) + .setScrapNum(BigDecimal.valueOf(isScrap ? 1 : 0)); + } + if (MaTypeManageTypeEnum.NUMBER_DEVICE.getTypeId().equals(manageType)) { + repairApplyRecord.setRepairNum(partDetails.getRepairNum()); + } + + // 设置备注 + if (CollectionUtil.isNotEmpty(bean.getOutRepairList())) { + String remark = StringUtils.isNotBlank(bean.getOutRepairList().get(0).getRemark()) + ? bean.getOutRepairList().get(0).getRemark() : ""; + repairApplyRecord.setRemark(remark); + } + } + + /** + * 处理报废维修配件 + * + * @param bean 维修申请单 + * @param partList 配件列表 + * @param loginUser 当前登录用户 + */ + private void handleScrapRepairPart(RepairDeviceVO bean, List partList, LoginUser loginUser) { + RepairPartDetails firstPart = partList.get(0); + if (CollectionUtil.isNotEmpty(firstPart.getFileList())) { + for (BmFileInfo fileInfo : firstPart.getFileList()) { + // 插入报废文件 + insertScrapFile(fileInfo, bean, loginUser); + // 构建并插入报废维修记录(带文件ID) + RepairApplyRecord repairApplyRecord = buildScrapRepairPartRecord(bean, firstPart, loginUser, + String.valueOf(fileInfo.getId())); + repairMapper.addRecord(repairApplyRecord); + } + } else { + // 构建并插入报废维修记录(无文件ID) + RepairApplyRecord repairApplyRecord = buildScrapRepairPartRecord(bean, firstPart, loginUser, ""); + repairMapper.addRecord(repairApplyRecord); + } + } + + /** + * 构建报废维修配件记录 + * + * @param bean 维修申请单 + * @param partDetails 配件详情 + * @param loginUser 当前登录用户 + * @param fileIds 文件ID字符串 + * @return 报废维修记录 + */ + private RepairApplyRecord buildScrapRepairPartRecord(RepairDeviceVO bean, RepairPartDetails partDetails, + LoginUser loginUser, String fileIds) { + boolean isScrap = RepairTypeEnum.TO_SCRAP.getTypeId().equals(bean.getRepairType()); + RepairApplyRecord repairApplyRecord = new RepairApplyRecord(); + + repairApplyRecord.setTaskId(bean.getTaskId()) + .setMaId(bean.getMaId()) + .setTypeId(bean.getTypeId()) + .setRepairType(bean.getRepairType()) + .setStatus(0L) + .setFileIds(fileIds) + .setRepairNum(BigDecimal.valueOf(isScrap ? 0 : 1)) + .setScrapNum(BigDecimal.valueOf(isScrap ? 1 : 0)) + .setCreateBy(loginUser.getUsername()); + repairApplyRecord.setScrapType(partDetails.getScrapType()) + .setScrapReason(partDetails.getScrapReason()) + .setScrapId(partDetails.getScrapId()); + + return repairApplyRecord; + } + + /** + * 配件列表价格合计 + * + * @param partList 配件列表 + * @param sfCosts 配件价格合计 + * @return 配件合计后的价格 + */ + private static BigDecimal countPartCosts(List partList, BigDecimal sfCosts) { + for (RepairPartDetails partDetails : partList) { + if (null != partDetails.getPartPrice() && null != partDetails.getPartNum() && null!=partDetails.getPartType() && partDetails.getPartType()==1) { + BigDecimal partPrice = partDetails.getPartPrice(); + BigDecimal partNumber = new BigDecimal(partDetails.getPartNum()); + sfCosts = sfCosts.add(partPrice.multiply(partNumber)); + } + } + return sfCosts; + } + + /** + * 拆分维修单 + * + * @param bean 维修设备VO + * @param innerRepairNum 内部维修数量 + * @param outerRepairNum 外部维修数量 + * @param scrapNum 报废数量 + * @param loginUser 当前登录用户 + */ + private void splitRepairDetailsToMultiple(RepairDeviceVO bean, BigDecimal innerRepairNum, + BigDecimal outerRepairNum, BigDecimal scrapNum, LoginUser loginUser) { + // 校验本次维修提交总数不超限 + BigDecimal totalSubmitNum = innerRepairNum.add(outerRepairNum).add(scrapNum); + if (bean.getRepairNum().compareTo(totalSubmitNum) < 0) { + throw new ServiceException("本次维修提交总数过大"); + } + + // 统一更新维修数量和报废数量 + BigDecimal totalRepairNum = innerRepairNum.add(outerRepairNum); + repairMapper.updateRepairedAndScrapNum(bean.getId(), totalRepairNum, scrapNum, + loginUser.getUserid(), loginUser.getUserid()); + + // 更新维修状态 + repairMapper.updateStatusByRepairScrapNum(bean.getId()); + } + } diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/lossAssessment/LossAssessmentMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/lossAssessment/LossAssessmentMapper.xml index 7ec1a91d..130a482b 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/lossAssessment/LossAssessmentMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/lossAssessment/LossAssessmentMapper.xml @@ -66,7 +66,7 @@ insert into repair_part_details (task_id, ma_id, type_id, part_id, part_num, part_cost, part_type, create_by, create_time, company_id, repair_content,ds_num,is_ds) - values (#{taskId}, #{maId}, #{typeId}, #{partId}, #{partNum}, #{partCost}, #{partType}, #{createBy}, now(), + values (#{taskId}, #{maId}, #{typeId}, #{partId}, #{partNum}, #{partPrice}, #{partType}, #{createBy}, now(), #{companyId}, #{repairContent},#{dsNum},1)