| doc/20261108_quality_inspect_first_inspect.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/bean/vo/ProductionOrderPickVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/service/ProductionOrderPickService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/quality/pojo/QualityInspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/production/ProductionOrderPickRecordMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
doc/20261108_quality_inspect_first_inspect.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,6 @@ -- è¿ç¨æ£éªæ°å¢â馿£âæ è®° -- æ¥æï¼2026-11-08 -- 说æï¼é¦æ£ä» ç¨äºè¿ç¨æ£éªï¼inspect_type = 1ï¼ï¼0=å¦ï¼1=æ¯ ALTER TABLE `quality_inspect` ADD COLUMN `is_first_inspect` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'æ¯å¦é¦æ£(0:å¦;1:æ¯)' AFTER `process`; src/main/java/com/ruoyi/production/bean/vo/ProductionOrderPickVo.java
@@ -29,4 +29,10 @@ @Schema(description = "æ¹å·") private List<String> batchNoList; @Schema(description = "é¢ææµæ°´id") private Long recordId; @Schema(description = "颿䏻åid") private Long pickId; } src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java
@@ -45,8 +45,12 @@ @GetMapping("/detail/{productionOrderId}") @Operation(summary = "æ¥è¯¢å·²é¢æè¯¦æ ") public R<List<ProductionOrderPickVo>> listPickedDetail(@PathVariable Long productionOrderId) { return R.ok(productionOrderPickService.listPickedDetail(productionOrderId)); public R<List<ProductionOrderPickVo>> listPickedDetail( @PathVariable Long productionOrderId, @RequestParam(defaultValue = "false") boolean records) { return R.ok(records ? productionOrderPickService.listPickedRecordDetail(productionOrderId) : productionOrderPickService.listPickedDetail(productionOrderId)); } } src/main/java/com/ruoyi/production/service/ProductionOrderPickService.java
@@ -22,4 +22,7 @@ Boolean updatePick(ProductionOrderPickDto dto); List<ProductionOrderPickVo> listPickedDetail(Long productionOrderId); /** é¢æè¯¦æ ï¼ä¸æ¡æµæ°´ä¸è¡ï¼ç¨äºâé¢æè¯¦æ âå¼¹çª */ List<ProductionOrderPickVo> listPickedRecordDetail(Long productionOrderId); } src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java
@@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -189,11 +190,110 @@ return Collections.emptyList(); } List<ProductionOrderPickVo> detailList = baseMapper.listPickedDetailByOrderId(productionOrderId); fillStockQuantity(detailList); fillBatchNoList(detailList); fillSelectableBatchNoList(detailList); return detailList; } @Override public List<ProductionOrderPickVo> listPickedRecordDetail(Long productionOrderId) { // é¢æè¯¦æ ï¼æ production_order_pick_record 䏿¡ä¸è¡ï¼å±ç¤ºæ¯æ¬¡é¢åéï¼è䏿¯ä¸»åæ±æ»ã if (productionOrderId == null) { return Collections.emptyList(); } List<ProductionOrderPickVo> detailList = productionOrderPickRecordMapper.listPickedDetailByOrderId(productionOrderId); allocateRecordReturnQuantity(detailList); fillStockQuantity(detailList); return detailList; } private void allocateRecordReturnQuantity(List<ProductionOrderPickVo> detailList) { // éææ°éæé¢æä¸»åæ±æ»åå¨ï¼è¯¦æ ææµæ°´æåå±ç¤ºæ¶æé¢åéåæå°æ¯æ¡æµæ°´ï¼ // ä¿è¯âå®é æ°é = é¢åæ°é - åæéæâä¸åä¸ä¸»ååæµæ°´å计ä¸ä¸»åä¸è´ã if (detailList == null || detailList.isEmpty()) { return; } Map<Long, List<ProductionOrderPickVo>> pickGroupMap = new LinkedHashMap<>(); for (ProductionOrderPickVo detail : detailList) { if (detail == null || detail.getId() == null) { continue; } pickGroupMap.computeIfAbsent(detail.getId(), key -> new ArrayList<>()).add(detail); } for (List<ProductionOrderPickVo> pickGroup : pickGroupMap.values()) { BigDecimal totalReturnQty = BigDecimal.ZERO; BigDecimal totalRecordQuantity = BigDecimal.ZERO; for (ProductionOrderPickVo detail : pickGroup) { totalReturnQty = defaultDecimal(detail.getReturnQty()); totalRecordQuantity = totalRecordQuantity.add(recordQuantity(detail)); } if (totalRecordQuantity.compareTo(BigDecimal.ZERO) <= 0) { for (ProductionOrderPickVo detail : pickGroup) { detail.setReturnQty(BigDecimal.ZERO); detail.setActualQty(BigDecimal.ZERO); } continue; } BigDecimal effectiveReturnQty = totalReturnQty.min(totalRecordQuantity); BigDecimal allocatedReturnQty = BigDecimal.ZERO; for (int i = 0; i < pickGroup.size(); i++) { ProductionOrderPickVo detail = pickGroup.get(i); BigDecimal rowQuantity = recordQuantity(detail); BigDecimal returnQty; if (i == pickGroup.size() - 1) { returnQty = effectiveReturnQty.subtract(allocatedReturnQty); } else { returnQty = effectiveReturnQty.multiply(rowQuantity) .divide(totalRecordQuantity, 4, RoundingMode.HALF_UP) .setScale(2, RoundingMode.HALF_UP); } if (returnQty.compareTo(rowQuantity) > 0) { returnQty = rowQuantity; } if (returnQty.compareTo(BigDecimal.ZERO) < 0) { returnQty = BigDecimal.ZERO; } detail.setReturnQty(returnQty); detail.setActualQty(rowQuantity.subtract(returnQty)); allocatedReturnQty = allocatedReturnQty.add(returnQty); } } } private BigDecimal recordQuantity(ProductionOrderPickVo detail) { return defaultDecimal(detail.getPickQuantity()).add(defaultDecimal(detail.getFeedingQty())); } private void fillStockQuantity(List<ProductionOrderPickVo> detailList) { // æ¹éæ¥è¯¢æç»ä¸æ¶åè§æ ¼çå½ååºåæ°éï¼ä¾åç«¯é¢æå°è´¦å±ç¤ºã if (detailList == null || detailList.isEmpty()) { return; } Set<Long> productModelIdSet = detailList.stream() .map(ProductionOrderPickVo::getProductModelId) .filter(Objects::nonNull) .collect(Collectors.toSet()); if (productModelIdSet.isEmpty()) { return; } List<StockInventory> stockList = stockInventoryMapper.selectList( Wrappers.<StockInventory>lambdaQuery() .in(StockInventory::getProductModelId, productModelIdSet)); Map<Long, BigDecimal> stockQuantityMap = new HashMap<>(); for (StockInventory stockItem : stockList) { if (stockItem == null || stockItem.getProductModelId() == null) { continue; } stockQuantityMap.merge(stockItem.getProductModelId(), defaultDecimal(stockItem.getQualitity()), BigDecimal::add); } for (ProductionOrderPickVo detail : detailList) { detail.setStockQuantity(stockQuantityMap.getOrDefault(detail.getProductModelId(), BigDecimal.ZERO)); } } private void processDeletePickIds(ProductionOrderPickDto rootDto, Map<Long, ProductionOrderPick> existingPickMap, Long productionOrderId) { src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -64,6 +64,13 @@ private String process; /** * æ¯å¦é¦æ£(è¿ç¨æ£éª,0:å¦;1:æ¯) */ @Excel(name = "馿£", readConverterExp = "0=å¦,1=æ¯") @TableField("is_first_inspect") private Integer isFirstInspect; /** * æ£éªå */ @Excel(name = "æ£éªå") src/main/resources/mapper/production/ProductionOrderPickRecordMapper.xml
@@ -22,19 +22,49 @@ <result column="dept_id" property="deptId" /> </resultMap> <!-- é¢æè¯¦æ ï¼ä¸æ¡é¢ææµæ°´ä¸è¡ï¼å±ç¤ºæ¯æ¬¡å®é é¢åï¼å«è¡¥æï¼çæ°éï¼è䏿¯ä¸»åæ±æ» --> <select id="listPickedDetailByOrderId" resultType="com.ruoyi.production.bean.vo.ProductionOrderPickVo"> select popr.*, poro.operation_name as operationName, select popr.pick_id as id, popr.id as recordId, popr.pick_id as pickId, popr.production_order_id as productionOrderId, popr.production_operation_task_id as productionOperationTaskId, pop.technology_operation_id as technologyOperationId, pop.operation_name as operationName, popr.product_model_id as productModelId, popr.batch_no as batchNo, popr.before_quantity as beforeQuantity, popr.after_quantity as afterQuantity, popr.pick_type as pickType, popr.remark, popr.create_time as createTime, popr.update_time as updateTime, popr.create_user as createUser, popr.dept_id as deptId, case when popr.pick_type = 2 then 0 else round(pop.demanded_quantity * popr.pick_quantity / nullif(pop.quantity, 0), 2) end as demandedQuantity, case when popr.pick_type = 2 then popr.pick_quantity else 0 end as feedingQty, case when popr.pick_type = 2 then 0 else popr.pick_quantity end as pickQuantity, pop.return_qty as returnQty, pop.is_returned as returned, pop.is_bom as bom, p.product_name as productName, pm.model as model, pm.unit as unit from production_order_pick_record popr left join production_operation_task pot on popr.production_operation_task_id = pot.id left join production_order_routing_operation poro on pot.production_order_routing_operation_id = poro.id join production_order_pick pop on pop.id = popr.pick_id left join product_model pm on popr.product_model_id = pm.id left join product p on pm.product_id = p.id where popr.production_order_id = #{productionOrderId} order by popr.create_time desc, popr.id desc order by popr.create_time, popr.id </select> <select id="listFeedingRecord" resultType="com.ruoyi.production.bean.vo.ProductionOrderPickRecordVo">