src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -8,7 +8,8 @@ CUSTOMIZATION_STOCK_OUT("1", "åæ ¼èªå®ä¹åºåº"), PRODUCTION_REPORT_STOCK_OUT("3", "ç产æ¥å·¥-åºåº"), SALE_STOCK_OUT("8", "éå®-åºåº"), SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"); SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"), DRAW_MATERIALS_STOCK_OUT("14", "ç产订å-颿åºåº"); private final String code; private final String value; @@ -18,4 +19,4 @@ this.value = value; } } } src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -114,7 +114,7 @@ @PreAuthorize("@ss.hasPermi('product:bom:export')") @ApiOperation("导åºBOMæä»¶") @Log(title = "导åºBOMæä»¶", businessType = BusinessType.EXPORT) public void exportBom(HttpServletResponse response, @RequestParam Integer bomId) { public void exportBom(HttpServletResponse response, @RequestParam Long bomId) { productBomService.exportBom(response, bomId); } src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -84,4 +84,16 @@ public R cleanRecord(@PathVariable Long id, @RequestBody Map<String, Object> cleanRecord) { return R.ok(productOrderService.cleanRecord(id, cleanRecord)); } @ApiOperation("æ¥è¯¢ç产订å对åºçBOMçåææ") @GetMapping("/getByBomId") public R getByBomId(Long bomId) { return R.ok(productOrderService.getByBomId(bomId)); } @ApiOperation("ç产订åé¢ææ´æ°") @PostMapping("/drawMaterials") public R drawMaterials(@RequestBody ProductOrderDto productOrderDto) { return R.ok(productOrderService.drawMaterials(productOrderDto)); } } src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -1,22 +1,12 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; import com.ruoyi.production.service.ProductStructureService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Arrays; @RequestMapping("productStructure") @RestController @@ -34,7 +24,7 @@ @ApiOperation("BOMæ¥çåé详æ ") @GetMapping("/listBybomId/{bomId}") public R listBybomId( @PathVariable("bomId") Integer bomId){ public R listBybomId( @PathVariable("bomId") Long bomId){ return R.ok(productStructureService.listBybomId(bomId)); } } src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.production.dto; import lombok.Data; import java.math.BigDecimal; @Data public class DrawMaterialDto { private Long id; private Long productModelId; private BigDecimal qualitity; private BigDecimal requisitionQty; private String productName; private String model; private String unit; } src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -6,11 +6,13 @@ import com.ruoyi.production.pojo.ProductOrder; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; @EqualsAndHashCode(callSuper = true) @Data @ExcelIgnoreUnannotated public class ProductOrderDto extends ProductOrder { @@ -59,4 +61,7 @@ private Boolean isFh; private String uidNo; @ApiModelProperty(value = "BOMç¼å·id") private Long bomId; } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -45,4 +45,7 @@ private String workOrderType; private String uidNo; @ApiModelProperty(value = "é¢æè®°å½") private String drawMaterials; } src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -1,8 +1,6 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; import org.apache.ibatis.annotations.Mapper; @@ -13,7 +11,7 @@ @Mapper public interface ProductStructureMapper extends BaseMapper<ProductStructure> { List<ProductStructureDto> listBybomId(@Param("bomId") Integer bomId); List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId); List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Integer bomId, @Param("processId") Long processId); List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Long bomId, @Param("processId") Long processId); } src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -40,5 +40,5 @@ private String processRouteCode; @ApiModelProperty(value = "BOMçID") private Integer bomId; private Long bomId; } src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -123,4 +123,10 @@ */ @ApiModelProperty(value = "æ¸ åºè®°å½") private String cleanRecord; /** * é¢æè®°å½ */ @ApiModelProperty(value = "é¢æè®°å½") private String drawMaterials; } src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
@@ -1,18 +1,13 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> @@ -53,7 +48,7 @@ private LocalDateTime updateTime; @ApiModelProperty("å ³èbomçid") private Integer bomId; private Long bomId; @ApiModelProperty("å·¥èºè·¯çº¿ç¼ç ") private String processRouteCode; src/main/java/com/ruoyi/production/service/ProductBomService.java
@@ -26,5 +26,5 @@ AjaxResult uploadBom(MultipartFile file); void exportBom(HttpServletResponse response, Integer bomId); void exportBom(HttpServletResponse response, Long bomId); } src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -29,4 +29,8 @@ int finishOrder(Long orderId); int cleanRecord(Long id, Map<String, Object> cleanRecord); List getByBomId(Long bomId); int drawMaterials(ProductOrderDto productOrderDto); } src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -1,7 +1,6 @@ package com.ruoyi.production.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.basic.dto.ProductModelDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProductStructure; @@ -12,6 +11,6 @@ Boolean addProductStructureDto(ProductStructureDto productStructureDto); List<ProductStructureDto> listBybomId(Integer bomId); List<ProductStructureDto> listBybomId(Long bomId); } src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
@@ -186,7 +186,7 @@ @Override public void exportBom(HttpServletResponse response, Integer bomId) { public void exportBom(HttpServletResponse response, Long bomId) { if (bomId == null) { return; } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -4,27 +4,34 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.DrawMaterialDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.mapper.StockInventoryMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; @Service @@ -65,6 +72,13 @@ @Autowired private StockUtils stockUtils; @Autowired private ProductStructureMapper productStructureMapper; @Autowired private StockInventoryMapper stockInventoryMapper; @Override public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) { @@ -160,11 +174,11 @@ //妿已ç»å¼å§ç产,ä¸è½å é¤ //æ¥è¯¢ç产订åä¸çå·¥å List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)); if (productWorkOrders.size()>0){ if (productWorkOrders.size() > 0) { //夿æ¯å¦ææ¥å·¥æ°æ® List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery() .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList()))); if (productionProductMains.size()>0){ if (productionProductMains.size() > 0) { throw new RuntimeException("ç产订åå·²ç»å¼å§ç产,ä¸è½å é¤"); } //å é¤å·¥å @@ -229,4 +243,89 @@ productOrder.setCleanRecord(JSON.toJSONString(cleanRecord)); return productOrderMapper.updateById(productOrder); } @Override public List<StockInventoryDto> getByBomId(Long bomId) { List<ProductStructureDto> structureList = productStructureMapper.listBybomId(bomId); if (CollectionUtils.isEmpty(structureList)) { return Collections.emptyList(); } Set<Long> allNodeIds = structureList.stream() .map(ProductStructureDto::getId) .collect(Collectors.toSet()); Set<Long> parentIds = structureList.stream() .filter(node -> node.getParentId() != null && node.getParentId() != 0) .map(ProductStructureDto::getParentId) .collect(Collectors.toSet()); Set<Long> leafNodeIds = new HashSet<>(allNodeIds); leafNodeIds.removeAll(parentIds); // è·åå¶åèç¹ç productModelId List<Long> productModelIds = structureList.stream() .filter(node -> leafNodeIds.contains(node.getId())) .map(ProductStructureDto::getProductModelId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (productModelIds.isEmpty()) { return Collections.emptyList(); } return stockInventoryMapper.getStockInventory(productModelIds); } @Override @Transactional(rollbackFor = Exception.class) public int drawMaterials(ProductOrderDto productOrderDto) { if (productOrderDto == null || productOrderDto.getId() == null) { throw new RuntimeException("åæ°é误"); } String jsonString = productOrderDto.getDrawMaterials(); if (StringUtils.isEmpty(jsonString)) { throw new RuntimeException("颿æç»ä¸è½ä¸ºç©º"); } List<DrawMaterialDto> drawMaterialsList; try { drawMaterialsList = JSON.parseArray(jsonString, DrawMaterialDto.class); } catch (Exception e) { throw new RuntimeException("颿æç»æ ¼å¼é误"); } if (CollectionUtils.isEmpty(drawMaterialsList)) { throw new RuntimeException("颿æç»ä¸è½ä¸ºç©º"); } // å¤çé¢æï¼æ£ååºåï¼ try { for (DrawMaterialDto drawMaterialDto : drawMaterialsList) { if (drawMaterialDto.getProductModelId() == null) { throw new RuntimeException("产ååå·IDä¸è½ä¸ºç©º"); } stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId()); } } catch (Exception e) { throw new RuntimeException("é¢æå¤±è´¥ï¼" + e.getMessage()); } // JSONå符串åå¨ String newJsonString = JSON.toJSONString(drawMaterialsList); int update = productOrderMapper.update(null, new LambdaUpdateWrapper<ProductOrder>() .eq(ProductOrder::getId, productOrderDto.getId()) .set(ProductOrder::getDrawMaterials, newJsonString)); // æ ¡éªæ´æ°ç»æ if (update == 0) { throw new RuntimeException("æ´æ°è®¢å失败"); } return update; } } src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -130,7 +130,7 @@ @Override public List<ProductStructureDto> listBybomId(Integer bomId) { public List<ProductStructureDto> listBybomId(Long bomId) { List<ProductStructureDto> list = productStructureMapper.listBybomId(bomId); Map<Long, ProductStructureDto> map = new HashMap<>(); src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -49,4 +49,6 @@ List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate); BigDecimal selectTotalByDate(@Param("now") LocalDate now); List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids); } src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -16,6 +16,7 @@ <result property="manufacturingTeam" column="manufacturing_team"/> <result property="isEnd" column="is_end"/> </resultMap> <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto"> select po.*, sl.sales_contract_no, @@ -25,6 +26,7 @@ pm.unit, pm.uid_no, ppr.process_route_code, pb.id as bomId, pb.bom_no, ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus, DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff, src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -27,6 +27,7 @@ pm.unit, pm.uid_no, p.product_name AS productName, po.draw_materials as drawMaterials, po.nps_no AS productOrderNpsNo, po.is_end as productOrderIsEnd, ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus, src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -55,37 +55,37 @@ SELECT slpa.scheduling_user_id, slpa.scheduling_user_name, sum(ppout.quantity) as output_num, sum(slpa.finished_num * work_hours) as wages, IFNULL(SUM(ppout.quantity), 0) AS output_num, IFNULL(SUM(slpa.finished_num * slpa.work_hours), 0) AS wages, CONCAT( ROUND( CASE WHEN SUM(ppout.quantity) = 0 OR SUM(ppout.quantity) IS NULL THEN 0 WHEN IFNULL(SUM(ppout.quantity), 0) = 0 THEN 0 ELSE SUM(slpa.finished_num) * 100.0 / SUM(ppout.quantity) END, 2 ), '%' ) as output_rate ) AS output_rate FROM sales_ledger_production_accounting slpa LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id <where> <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''"> and slpa.scheduling_user_name = #{ew.schedulingUserName} AND slpa.scheduling_user_name = #{ew.schedulingUserName} </if> <if test="ew.entryDate != null "> and slpa.scheduling_date >= #{ew.entryDate} and slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDate}), INTERVAL 1 DAY) AND slpa.scheduling_date >= #{ew.entryDate} AND slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDate}), INTERVAL 1 DAY) </if> <if test="ew.entryDateStart != null and ew.entryDateEnd != null"> and slpa.scheduling_date >= #{ew.entryDateStart} and slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDateEnd}), INTERVAL 1 DAY) AND slpa.scheduling_date >= #{ew.entryDateStart} AND slpa.scheduling_date < DATE_ADD(DATE(#{ew.entryDateEnd}), INTERVAL 1 DAY) </if> </where> GROUP BY slpa.scheduling_user_name GROUP BY slpa.scheduling_user_id, slpa.scheduling_user_name </select> <select id="selectDailyWagesStats" resultType="java.util.Map"> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -239,4 +239,22 @@ ORDER BY DATE(sor.create_time) ASC </select> <select id="getStockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> SELECT p.product_name, pm.model, pm.unit, si.* FROM product_model pm LEFT JOIN product p ON p.id = pm.product_id LEFT JOIN stock_inventory si ON si.product_model_id = pm.id WHERE pm.id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> ORDER BY pm.id </select> </mapper>