修改物资设备清单相关修改
This commit is contained in:
		| @ -141,8 +141,8 @@ public class BusMrpBaseController extends BaseController { | ||||
|      * 获取剩余量 | ||||
|      */ | ||||
|     @GetMapping("/remaining") | ||||
|     public R<Map<String,Object>> remaining(Long suppliespriceId,Long mrpBaseId) { | ||||
|         return R.ok(busMrpBaseService.remaining(suppliespriceId,mrpBaseId)); | ||||
|     public R<Map<String,Object>> remaining(Long projectId, String suppliespriceName,String specification,Long mrpBaseId) { | ||||
|         return R.ok(busMrpBaseService.remaining(projectId,suppliespriceName,specification,mrpBaseId)); | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -209,7 +209,19 @@ public class BusMrpBaseController extends BaseController { | ||||
| //        // 3. 递归组装树形结构,从顶级节点(pid=0)开始 | ||||
| //        List<ObtainTheListRes> treeList = buildTree("0", parentMap); | ||||
| //        return R.ok(treeList); | ||||
|         return R.ok(busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper<BusBillofquantities>().eq(BusBillofquantities::getPid, req.getSid()))); | ||||
|         List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper() | ||||
|             .selectList(new LambdaQueryWrapper<BusBillofquantities>() | ||||
|                 .eq(BusBillofquantities::getProjectId, req.getProjectId()) | ||||
|                 .eq(BusBillofquantities::getName, req.getSid())); | ||||
|         List<String> sids = new ArrayList<>(); | ||||
|         busBillofquantities.forEach(busBillofquantities1 -> { | ||||
|             sids.add(busBillofquantities1.getSid()); | ||||
|         }); | ||||
|         return R.ok(busBillofquantitiesService | ||||
|             .getBaseMapper() | ||||
|             .selectList(new LambdaQueryWrapper<BusBillofquantities>() | ||||
|                 .eq(BusBillofquantities::getProjectId, req.getProjectId()) | ||||
|                 .in(BusBillofquantities::getPid, sids))); | ||||
|     } | ||||
|  | ||||
|     private List<ObtainTheListRes> buildTree(String parentId, Map<String, List<ObtainTheListRes>> parentMap) { | ||||
|  | ||||
| @ -86,5 +86,5 @@ public interface IBusMrpBaseService extends IService<BusMrpBase>{ | ||||
|     /** | ||||
|      * 获取物资已有数量 | ||||
|      */ | ||||
|     Map<String, Object> remaining(Long suppliespriceId, Long mrpBaseId); | ||||
|     Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId); | ||||
| } | ||||
|  | ||||
| @ -75,7 +75,7 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB | ||||
|         planBo.setMrpBaseId(id); | ||||
|         List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo); | ||||
|         for (BusMaterialbatchdemandplanVo vo : voList) { | ||||
|             Map<String, Object> map = remaining(vo.getSuppliespriceId(), id); | ||||
|             Map<String, Object> map = remaining(vo.getProjectId(),vo.getName(), vo.getSpecification(), id); | ||||
|             vo.setRemaining(Convert.toBigDecimal(map.get("remainingQuantity"))); | ||||
|         } | ||||
|         busMrpVo.setMrpBaseBo(busMrpBaseVo); | ||||
| @ -190,25 +190,34 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB | ||||
|  | ||||
|         if (CollectionUtil.isNotEmpty(dto.getPlanList())) { | ||||
|             // 按 suppliespriceId 分组统计本次提交的数量 | ||||
|             Map<Long, BigDecimal> batchSumMap = dto.getPlanList().stream() | ||||
|             Map<String, BigDecimal> batchSumMap = dto.getPlanList().stream() | ||||
|                 .collect(Collectors.groupingBy( | ||||
|                     BusMaterialbatchdemandplanBo::getSuppliespriceId, | ||||
|                     // 关键修改:使用 name + specification 拼接作为分组键 | ||||
|                     item -> { | ||||
|                         String name = item.getName() != null ? item.getName() : ""; | ||||
|                         String spec = item.getSpecification() != null ? item.getSpecification() : ""; | ||||
|                         return name + "&&&" + spec; | ||||
|                     }, | ||||
|                     Collectors.reducing( | ||||
|                         BigDecimal.ZERO, | ||||
|                         BusMaterialbatchdemandplanBo::getDemandQuantity, | ||||
|                         item -> { | ||||
|                             BigDecimal quantity = item.getDemandQuantity(); | ||||
|                             return quantity != null ? quantity : BigDecimal.ZERO; | ||||
|                         }, | ||||
|                         BigDecimal::add | ||||
|                     ) | ||||
|                 )); | ||||
|  | ||||
|             // 检查每种物料是否超出数量限制 | ||||
|             for (Map.Entry<Long, BigDecimal> entry : batchSumMap.entrySet()) { | ||||
|                 Long suppliespriceId = entry.getKey(); | ||||
|             for (Map.Entry<String, BigDecimal> entry : batchSumMap.entrySet()) { | ||||
|                 String biaoshi = entry.getKey(); | ||||
|                 BigDecimal batchSum = entry.getValue(); | ||||
|  | ||||
|                 String[] split = biaoshi.split("&&&"); | ||||
|                 // 获取数据库中已有的数量 | ||||
|                 List<BusMaterialbatchdemandplan> existingList = planservice.list( | ||||
|                     Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class) | ||||
|                         .eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId) | ||||
|                         .eq(BusMaterialbatchdemandplan::getName, split[0]) | ||||
|                         .eq(BusMaterialbatchdemandplan::getSpecification,split[1]) | ||||
|                         .ne(BusMaterialbatchdemandplan::getMrpBaseId, convert.getId()) // 排除当前批次 | ||||
|                 ); | ||||
|  | ||||
| @ -217,13 +226,29 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB | ||||
|                     .reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
|  | ||||
|                 // 检查总数量是否超出限制 | ||||
|                 BusBillofquantities billofquantities = busBillofquantitiesService.getById(suppliespriceId); | ||||
|                 if (existingSum.add(batchSum).compareTo(billofquantities.getQuantity()) > 0) { | ||||
|                 List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper<BusBillofquantities>() | ||||
|                     .eq(BusBillofquantities::getProjectId, dto.getMrpBaseBo().getProjectId()) | ||||
|                     .eq(BusBillofquantities::getName, split[0]) | ||||
|                     .eq(BusBillofquantities::getSpecification, split[1])); | ||||
|                 BigDecimal quantity = busBillofquantities.stream() | ||||
|                     .map(BusBillofquantities::getQuantity) | ||||
|                     .filter(Objects::nonNull) | ||||
|                     .reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
|                 if (existingSum.add(batchSum).compareTo(quantity) > 0) { | ||||
|                     // 找到超出限制的物料名称用于提示 | ||||
|                     String itemName = dto.getPlanList().stream() | ||||
|                         .filter(plan -> plan.getSuppliespriceId().equals(suppliespriceId)) | ||||
|                         .filter(item -> { | ||||
|                             String name = item.getName() != null ? item.getName() : ""; | ||||
|                             String spec = item.getSpecification() != null ? item.getSpecification() : ""; | ||||
|                             return (name + "&&&" + spec).equals(biaoshi); | ||||
|  | ||||
|                         }) | ||||
|                         .findFirst() | ||||
|                         .map(BusMaterialbatchdemandplanBo::getName) | ||||
|                         .map(item -> { | ||||
|                             String name = item.getName() != null ? item.getName() : ""; | ||||
|                             String spec = item.getSpecification() != null ? item.getSpecification() : ""; | ||||
|                             return "名称:“"+name + "”,规格:“" + spec+"”"; | ||||
|                         }) | ||||
|                         .orElse("未知物料"); | ||||
|                     throw new ServiceException(itemName + "超出数量"); | ||||
|                 } | ||||
| @ -272,13 +297,23 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     public Map<String, Object> remaining(Long suppliespriceId, Long mrpBaseId) { | ||||
|     public Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId) { | ||||
|         Map<String, Object> map = new HashMap<>(); | ||||
|         BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId); | ||||
|         List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper() | ||||
|             .selectList(new LambdaQueryWrapper<BusBillofquantities>() | ||||
|                 .eq(BusBillofquantities::getProjectId, projectId) | ||||
|                 .eq(BusBillofquantities::getName, suppliespriceName) | ||||
|                 .eq(BusBillofquantities::getSpecification,specification)); | ||||
|         BigDecimal quantity = busBillofquantities.stream() | ||||
|             .map(BusBillofquantities::getQuantity) | ||||
|             .filter(Objects::nonNull) | ||||
|             .reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
| //        BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId); | ||||
|         // 获取数据库中已有的数量 | ||||
|         List<BusMaterialbatchdemandplan> existingList = planservice.list( | ||||
|             Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class) | ||||
|                 .eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId) | ||||
|                 .eq(BusMaterialbatchdemandplan::getName, suppliespriceName) | ||||
|                 .eq(BusMaterialbatchdemandplan::getSpecification ,specification) | ||||
|                 .ne(mrpBaseId!=null,BusMaterialbatchdemandplan::getMrpBaseId, mrpBaseId)// 排除当前批次 | ||||
|         ); | ||||
|         BigDecimal reduce = BigDecimal.ZERO; | ||||
| @ -287,11 +322,11 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB | ||||
|                 .map(BusMaterialbatchdemandplan::getDemandQuantity) | ||||
|                 .reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
|         } | ||||
|         map.put("remainingQuantity",byId.getQuantity().subtract(reduce)); | ||||
|         map.put("specification",byId.getSpecification()); | ||||
|         map.put("unit",byId.getUnit()); | ||||
|         map.put("remark",byId.getRemark()); | ||||
|         map.put("name",byId.getName()); | ||||
|         map.put("remainingQuantity",quantity.subtract(reduce)); | ||||
|         map.put("specification",busBillofquantities.getFirst().getSpecification()); | ||||
|         map.put("unit",busBillofquantities.getFirst().getUnit()); | ||||
|         map.put("remark",busBillofquantities.getFirst().getRemark()); | ||||
|         map.put("name",busBillofquantities.getFirst().getName()); | ||||
|         return map; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -42,4 +42,6 @@ public class CoryObtainTheListReq implements Serializable { | ||||
|  | ||||
|     private String sid; | ||||
|  | ||||
|     private String name; | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -211,7 +211,8 @@ public class BusBillofquantitiesVersionsServiceImpl extends ServiceImpl<BusBillo | ||||
| //        if (!Objects.equals(bo.getWorkOrderType(), "3")) { | ||||
|         // 2. 解析所有工作表,转换为带父子关系的ExcelMaterial列表  解析所有Sheet数据,按规则生成sid和pid | ||||
|         List<BusBillofquantities> allMaterials = new ArrayList<>(); | ||||
|         for (ExcelReader.SheetData sheetData : excelData.getSheetDataList()) { | ||||
|         if (Objects.equals(bo.getWorkOrderType(), "3")){ | ||||
|             ExcelReader.SheetData sheetData = excelData.getSheetDataList().getFirst(); | ||||
|             String sheetName = sheetData.getSheetName(); | ||||
|             List<List<String>> rowDataList = sheetData.getData(); | ||||
|             // 构建当前Sheet的树形结构(复用ExcelReader的buildTree方法) | ||||
| @ -220,30 +221,21 @@ public class BusBillofquantitiesVersionsServiceImpl extends ServiceImpl<BusBillo | ||||
|             Map<ExcelReader.TreeNode, BusBillofquantities> nodeMap = new HashMap<>(); | ||||
|             // 递归遍历树形结构,生成sid和pid | ||||
|             traverseTree(rootNode, nodeMap, allMaterials, sheetName, banBen); | ||||
|         }else { | ||||
|             for (ExcelReader.SheetData sheetData : excelData.getSheetDataList()) { | ||||
|                 String sheetName = sheetData.getSheetName(); | ||||
|                 List<List<String>> rowDataList = sheetData.getData(); | ||||
|                 // 构建当前Sheet的树形结构(复用ExcelReader的buildTree方法) | ||||
|                 ExcelReader.TreeNode rootNode = ExcelReader.buildTree(rowDataList); | ||||
|                 // 存储节点映射:TreeNode → ExcelMaterial(用于子节点关联父节点) | ||||
|                 Map<ExcelReader.TreeNode, BusBillofquantities> nodeMap = new HashMap<>(); | ||||
|                 // 递归遍历树形结构,生成sid和pid | ||||
|                 traverseTree(rootNode, nodeMap, allMaterials, sheetName, banBen); | ||||
|             } | ||||
|         } | ||||
|         // 3. 批量插入数据库 | ||||
|         if (Objects.equals(bo.getWorkOrderType(), "3")){ | ||||
|             List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper<BusBillofquantities>().eq(BusBillofquantities::getProjectId, bo.getProjectId())); | ||||
|             Set<String> names = busBillofquantities.stream() | ||||
|                 .filter(Objects::nonNull) | ||||
|                 .map(obj->{ | ||||
|                     String name = Optional.ofNullable (obj.getName ()).orElse (""); | ||||
|                     String specification = Optional.ofNullable (obj.getSpecification ()).orElse (""); | ||||
|                     String remark = Optional.ofNullable (obj.getRemark ()).orElse (""); | ||||
|                     return name+"+"+specification+"+"+remark; | ||||
|                 }) | ||||
|                 .collect(Collectors.toSet()); | ||||
|             for (BusBillofquantities allMaterial : allMaterials) { | ||||
|                 String biaoqian = allMaterial.getName()+"+"+allMaterial.getSpecification()+"+"+allMaterial.getRemark(); | ||||
|                 if (names.contains(biaoqian)) { | ||||
|                     throw new ServiceException("名称:“"+allMaterial.getName()+"+”规格:”"+allMaterial.getSpecification()+"“+”备注:“"+allMaterial.getRemark()+"已存在,请修改后重新上传!"); | ||||
|                 } | ||||
|                 allMaterial.setProjectId(bo.getProjectId()); | ||||
|             } | ||||
|         }else { | ||||
|             for (BusBillofquantities allMaterial : allMaterials) { | ||||
|                 allMaterial.setProjectId(bo.getProjectId()); | ||||
|             } | ||||
|         for (BusBillofquantities allMaterial : allMaterials) { | ||||
|             allMaterial.setProjectId(bo.getProjectId()); | ||||
|         } | ||||
|         boolean b = busBillofquantitiesService.saveBatch(allMaterials); | ||||
|         if (!b) { | ||||
|  | ||||
| @ -468,5 +468,9 @@ public class DesUserServiceImpl extends ServiceImpl<DesUserMapper, DesUser> impl | ||||
|         DataValidationConstraint constraint = helper.createFormulaListConstraint(personRange); | ||||
|         // 作用范围:第2行到100行,第四列 | ||||
|         CellRangeAddressList addressList = new CellRangeAddressList(1, 100, rowCount, rowCount); | ||||
|  | ||||
|         DataValidation validation = helper.createValidation(constraint, addressList); | ||||
|         validation.setShowErrorBox(true); | ||||
|         mainSheet.addValidationData(validation); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -203,9 +203,9 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill | ||||
|             .forEach(item -> { | ||||
|                 item.setPrice(item.getUnitPrice().multiply(item.getQuantity()).setScale(4, RoundingMode.HALF_UP)); | ||||
|             }); | ||||
|         if (bo.getType().equals(LimitListTypeEnum.SPECIAL.getCode())) { | ||||
|             return listVoList; | ||||
|         } | ||||
| //        if (bo.getType().equals(LimitListTypeEnum.SPECIAL.getCode())) { | ||||
| //            return listVoList; | ||||
| //        } | ||||
|  | ||||
|         //构建父子映射 | ||||
|         Map<String, List<BusBillofquantitiesLimitListVo>> parentMap = listVoList.stream() | ||||
|  | ||||
		Reference in New Issue
	
	Block a user