src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -57,4 +57,9 @@ productWorkOrderservice.down(response, productWorkOrder); } @ApiOperation("根据生产订单id查询数据") @GetMapping("/getByProductOrderId/{productOrderId}") public R getProductWorkOrderListByProductOrderId(@PathVariable Long productOrderId) { return R.ok(productWorkOrderservice.getByProductOrderId(productOrderId)); } } src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -59,4 +59,11 @@ ExcelUtil<ProductionProductMainDto> util = new ExcelUtil<ProductionProductMainDto>(ProductionProductMainDto.class); util.exportExcel(response, list, "生产报工数据"); } @ApiOperation("根据工单id查询报工数据") @GetMapping("/getByProductWorkOrderId/{productWorkOrderId}") public R getByProductWorkOrderId(@PathVariable Long productWorkOrderId) { return R.ok(productionProductMainService.getByProductWorkOrderId(productWorkOrderId)); } } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -1,14 +1,11 @@ package com.ruoyi.production.dto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; @EqualsAndHashCode(callSuper = true) @Data @@ -25,6 +22,11 @@ //工序 @ApiModelProperty(value = "工序") private String processName; private Long processId; @ApiModelProperty(value = "工序编号") private String processNo; //单位 @ApiModelProperty(value = "单位") @@ -52,4 +54,14 @@ @ApiModelProperty(value = "是否可以报工") private Boolean isCanReport; // 合格数量 @ApiModelProperty(value = "合格数量") private BigDecimal completeQty; @ApiModelProperty(value = "不良率") private BigDecimal scrapRate; @ApiModelProperty(value = "状态文本") private String statusText; } src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -33,6 +33,10 @@ @Excel(name = "报废数量") private BigDecimal scrapQty = BigDecimal.ZERO; @ApiModelProperty(value = "合格数量") @Excel(name = "合格数量") private BigDecimal qualifiedQty = BigDecimal.ZERO; //产品名称 @Excel(name = "产品名称") private String productName; @@ -63,5 +67,7 @@ // 其他数据 private String otherData; // 不合格处理结果 @ApiModelProperty(value = "不合格处理结果") private String dealResult; } src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -17,6 +17,8 @@ IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder); List<ProductWorkOrderDto> getByProductOrderId(@Param("productOrderId") Long productOrderId); ProductWorkOrderDto getProductWorkOrderFlowCard(@Param("id") Long id); List<ProductWorkOrderDto> selectWorkOrderStartStats(@Param("startDate") String startDate, @Param("endDate") String endDate); src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -33,4 +33,6 @@ IPage<ProductionProductMainDto> listProductionDetails(@Param("ew") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page); ArrayList<Long> listMain(List<Long> idList); List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId); } src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
@@ -7,6 +7,7 @@ import com.ruoyi.production.pojo.ProductWorkOrder; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface ProductWorkOrderService extends IService<ProductWorkOrder>{ @@ -15,4 +16,6 @@ int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto); void down(HttpServletResponse response, ProductWorkOrder productWorkOrder); List<ProductWorkOrderDto> getByProductOrderId(Long productOrderId); } src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -17,4 +17,6 @@ Boolean removeProductMain(Long id); ArrayList<Long> listMain(List<Long> idList); List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId); } src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,23 +7,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.Pictures; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.MatrixToImageWriter; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.mapper.ProductProcessRouteItemMapper; import com.ruoyi.production.mapper.ProductWorkOrderFileMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.pojo.QualityInspectParam; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -33,11 +23,10 @@ import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @@ -51,6 +40,8 @@ private ProductProcessRouteItemMapper productProcessRouteItemMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @Value("${file.temp-dir}") private String tempDir; @@ -148,4 +139,28 @@ } } @Override public List<ProductWorkOrderDto> getByProductOrderId(Long productOrderId) { List<ProductWorkOrderDto> productWorkOrderDtos = productWorkOrdermapper.getByProductOrderId(productOrderId); if (CollectionUtils.isNotEmpty(productWorkOrderDtos)) { productWorkOrderDtos.forEach(productWorkOrderDto -> { // 查询关联产出表数据 List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery().eq(ProductionProductMain::getWorkOrderId, productWorkOrderDto.getId())); BigDecimal scrapQty = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(productionProductMains)) { // 计算报废数量 List<Long> mainIds = productionProductMains.stream().map(ProductionProductMain::getId).collect(Collectors.toList()); List<ProductionProductOutput> productionProductOutputs = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().in(ProductionProductOutput::getProductMainId, mainIds)); scrapQty = productionProductOutputs.stream().map(ProductionProductOutput::getScrapQty).reduce(BigDecimal.ZERO, BigDecimal::add); } if (productWorkOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) > 0) { productWorkOrderDto.setScrapRate(scrapQty.divide(productWorkOrderDto.getCompleteQuantity(), 2, RoundingMode.HALF_UP)); } else { productWorkOrderDto.setScrapRate(scrapQty.multiply(BigDecimal.valueOf(100))); } productWorkOrderDto.setCompleteQty(productWorkOrderDto.getCompleteQuantity().subtract(scrapQty)); }); } return productWorkOrderDtos; } } src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -37,6 +37,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -374,4 +375,58 @@ public ArrayList<Long> listMain(List<Long> idList) { return productionProductMainMapper.listMain(idList); } } @Override public List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId) { List<ProductionProductMainDto> productionProductMainDtos = productionProductMainMapper.getByProductWorkOrderId(productWorkOrderId); if (productionProductMainDtos == null || productionProductMainDtos.isEmpty()) { return productionProductMainDtos; } // 收集所有产品主记录ID List<Long> productMainIds = productionProductMainDtos.stream() .map(ProductionProductMainDto::getId) .collect(Collectors.toList()); // 批量查询所有相关的质检记录 List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( Wrappers.<QualityInspect>lambdaQuery() .in(QualityInspect::getProductMainId, productMainIds) ); if (!qualityInspects.isEmpty()) { // 收集所有质检记录ID List<Long> inspectIds = qualityInspects.stream() .map(QualityInspect::getId) .collect(Collectors.toList()); // 批量查询所有相关的不合格处理记录 List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList( Wrappers.<QualityUnqualified>lambdaQuery() .in(QualityUnqualified::getInspectId, inspectIds) ); // 构建质检ID到不合格处理记录的映射 Map<Long, QualityUnqualified> inspectIdToUnqualifiedMap = qualityUnqualifieds.stream() .collect(Collectors.toMap(QualityUnqualified::getInspectId, q -> q, (q1, q2) -> q1)); // 构建产品主ID到质检记录的映射 Map<Long, QualityInspect> productMainIdToInspectMap = qualityInspects.stream() .collect(Collectors.toMap(QualityInspect::getProductMainId, q -> q, (q1, q2) -> q1)); // 关联处理结果到产品主记录 productionProductMainDtos.forEach(p -> { QualityInspect qualityInspect = productMainIdToInspectMap.get(p.getId()); if (qualityInspect != null) { QualityUnqualified qualityUnqualified = inspectIdToUnqualifiedMap.get(qualityInspect.getId()); if (qualityUnqualified != null) { p.setDealResult(qualityUnqualified.getDealResult() == null ? "" : qualityUnqualified.getDealResult()); } } }); } return productionProductMainDtos; } } src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -131,10 +131,12 @@ case "报废": //调用不合格库存接口 入不合格库 // 2 是成品-需要审核 1 是半成品-不需要审核 if (qualityInspect.getInspectType().equals(2)) { stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); } else { stockUtils.addUnStockNoReview(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); if (!"印铜".equals(qualityInspect.getProcess()) && !"印银".equals(qualityInspect.getProcess())) { if (qualityInspect.getInspectType().equals(2)) { stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); } else { stockUtils.addUnStockNoReview(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); } } break; case "让步放行": src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,6 +21,7 @@ <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT pwo.*, pp.id as processId, pp.NAME as processName, pm.model, pm.unit, @@ -51,6 +52,39 @@ and pwo.product_order_id = #{c.productOrderId} </if> order by pwo.priority </select> <select id="getByProductOrderId" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT pwo.*, pp.id as processId, pp.NAME as processName, pp.no as processNo, pm.model, pm.unit, p.product_name AS productName, po.nps_no AS productOrderNpsNo, ppri.drag_sort, ppri.product_route_id, ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus, CASE WHEN pwo.complete_quantity >= pwo.plan_quantity THEN '已生产' WHEN pwo.complete_quantity > 0 AND pwo.complete_quantity < pwo.plan_quantity THEN '生产中' ELSE '待生产' END AS statusText, CASE WHEN pwo.work_order_no LIKE 'FG%' THEN '返工返修' ELSE '正常' END AS work_order_type FROM product_work_order pwo LEFT JOIN product_process_route_item ppri ON ppri.id = pwo.product_process_route_item_id LEFT JOIN product_order po ON po.id = pwo.product_order_id LEFT JOIN product_process pp ON pp.id = ppri.process_id LEFT JOIN product_model pm ON pm.id = ppri.product_model_id LEFT JOIN product p ON p.id = pm.product_id where po.id=#{productOrderId} order by ppri.drag_sort </select> <select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT @@ -98,4 +132,4 @@ limit 1 ; </select> </mapper> </mapper> src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -53,6 +53,34 @@ order by ppm.id </select> <select id="getByProductWorkOrderId" resultType="com.ruoyi.production.dto.ProductionProductMainDto"> select ppm.*, pwo.work_order_no as workOrderNo, pwo.status as workOrderStatus, u.nick_name as nickName, p.product_name as productName, pp.name as process, pm.model as productModelName, ppo.quantity, ppo.scrap_qty, ppo.other_data, (ppo.quantity - ppo.scrap_qty) as qualifiedQty, pm.unit from production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id left join product_process_route_item ppri on ppri.id = pwo.product_process_route_item_id left join product_process pp on pp.id = ppri.process_id left join product_order po on po.id = pwo.product_order_id left join production_product_output ppo on ppm.id = ppo.product_main_id left join product_model pm on pm.id = ppo.product_model_id left join product p on p.id = pm.product_id left join sales_ledger sl on sl.id = po.sales_ledger_id left join sys_user u on u.user_id = ppm.user_id where pwo.id = #{productWorkOrderId} order by ppm.id </select> <select id="getOrderByMainId" resultType="com.ruoyi.production.pojo.ProductOrder"> select po.* from product_order po