From 3d4cb4fafdee76f0dc2f895f21a37bfa0f638c6a Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 16 一月 2026 15:09:50 +0800
Subject: [PATCH] 生产报工的新增和删除已经投入产出

---
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                          |   22 ---
 src/main/resources/mapper/production/ProductionProductInputMapper.xml                    |    5 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java    |  272 ++++++++++++++++++++------------------
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                 |    4 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |    8 
 src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java                    |    2 
 src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java                     |   14 +
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java                 |    3 
 src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java                    |    9 -
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java               |    2 
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                       |    8 +
 src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java                    |    6 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                   |    2 
 src/main/resources/mapper/production/ProductStructureMapper.xml                          |    6 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                     |   13 +
 15 files changed, 196 insertions(+), 180 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
index 78a2f04..58fba64 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -17,7 +17,7 @@
 
     private Integer userId;
 
-    private Integer salesLedgerProductId;
+    private Long salesLedgerProductId;
 
     /**
      * 鍑哄簱绫诲瀷 1-閲囪喘鍑哄簱 2-閿�鍞嚭搴� 3-鑷畾涔�
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index 12dc8e9..dfa9756 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -22,9 +22,9 @@
     private Integer id;
 
     /**
-     * 浜у搧淇℃伅琛╥d锛堣嚜瀹氫箟鍏ュ簱鏃朵负0锛�
+     * 浜у搧淇℃伅琛╥d锛堢敓浜ф墸搴撳瓨鐨勬椂鍊欎娇鐢級
      */
-    private Integer salesLedgerProductId;
+    private Long salesLedgerProductId;
 
     /**
      * 鍏ュ簱id
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 4bfa4b8..f8f521e 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -74,18 +74,18 @@
             List<ProcurementRecordStorage> collect1 = procurementRecordStorages.stream()
                     .filter(procurementRecordStorage -> procurementRecordStorage.getSalesLedgerProductId().equals(dto.getId()))
                     .collect(Collectors.toList());
-            
+
             // 濡傛灉娌℃湁鐩稿叧鐨勫叆搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
             if(CollectionUtils.isEmpty(collect1)){
                 dto.setQuantity0(dto.getQuantity());
                 continue;
             }
-            
+
             // 璁$畻宸插叆搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭叆搴撴暟閲�
             BigDecimal totalInboundNum = collect1.stream()
                     .map(ProcurementRecordStorage::getInboundNum)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
-            
+
             // 寰呭叆搴撴暟閲� = 鎬绘暟閲� - 宸插叆搴撴暟閲�
             dto.setQuantity0(dto.getQuantity().subtract(totalInboundNum));
         }
@@ -611,7 +611,7 @@
         List<ProcurementRecordOut> recordOutList = procurementRecordOutMapper.selectList(queryWrapper);
 
         // 2. 鎸塖alesLedgerProductId鍒嗙粍锛岀粺璁℃瘡涓猧d瀵瑰簲鐨勫凡鍑哄簱鏁伴噺鎬诲拰-宸插嚭搴撴暟閲�
-        Map<Integer, BigDecimal> storageIdToTotalOutNumMap = recordOutList.stream()
+        Map<Long, BigDecimal> storageIdToTotalOutNumMap = recordOutList.stream()
                 .collect(Collectors.groupingBy(
                         ProcurementRecordOut::getSalesLedgerProductId,
                         Collectors.reducing(
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java
index 1e6e02e..13bb4a3 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java
@@ -11,4 +11,10 @@
 
     @ApiModelProperty(value = "浜у搧鍨嬪彿")
     private String model;
+
+    @ApiModelProperty(value = "浜у搧鍚嶇О")
+    private String productName;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index cb34380..3e171bc 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -21,9 +21,15 @@
     @ApiModelProperty(value = "鎶ュ伐鏁伴噺")
     private BigDecimal quantity;
 
-    @ApiModelProperty(value = "鏄惁鎶ュ伐")
-    private boolean reportWork;
+    //浜у搧鍚嶇О
+    private String productName;
 
-    @ApiModelProperty(value = "鎶ュ伐id")
-    private Long productMainId;
+    //浜у搧瑙勬牸鍨嬪彿
+    private String productModelName;
+
+    //鍗曚綅
+    private String unit;
+
+    //閿�鍞悎鍚屽彿
+    private String salesContractNo;
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
index 9ab7ba7..bd1831f 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -15,5 +15,5 @@
 
     List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId);
 
-    List<ProductStructureDto> listByproductModelId(@Param("productModelId") Long productModelId);
+    List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Long bomId, @Param("processId") Long processId);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
index 93f443e..46f988f 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -17,14 +17,5 @@
 
     IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
 
-    int updatePlanQuantity(Map<String, Object> params);
-
-    /**
-     * 鍥炴粴宸ュ崟璁″垝鏁伴噺锛氫粠production_product_output鍙杚uantity鍔犲洖plan_quantity
-     * @param productMainId
-     * @return
-     */
-    int rollbackPlanQuantity(@Param("productMainId") Long productMainId);
-
     List<ProductWorkOrderDto> selectProductWorkOrderDtoList();
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 3dbe688..2b7a20d 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -1,8 +1,10 @@
 package com.ruoyi.production.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
 
@@ -33,10 +35,14 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @TableField(fill = FieldFill.UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
     @ApiModelProperty(value = "绉熸埛ID")
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index c4d2ba5..b21de5f 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -5,6 +5,8 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+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.basic.mapper.ProductMapper;
@@ -23,6 +25,7 @@
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductionProductMainService;
 import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityInspectParamMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
@@ -34,6 +37,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import oshi.driver.mac.net.NetStat;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -46,6 +50,7 @@
 
 @Service
 @AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
     private final ProcurementRecordOutMapper procurementRecordOutMapper;
@@ -56,6 +61,7 @@
     private ProductWorkOrderMapper productWorkOrderMapper;
 
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+    private SysUserMapper userMapper;
 
     private ProductionProductOutputMapper productionProductOutputMapper;
 
@@ -66,8 +72,10 @@
     private QualityInspectMapper qualityInspectMapper;
 
     private ProductProcessMapper productProcessMapper;
+    private ProductProcessRouteMapper productProcessRouteMapper;
 
     private ProductMapper productMapper;
+
 
     private QualityTestStandardMapper qualityTestStandardMapper;
 
@@ -90,40 +98,35 @@
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public Boolean addProductMain(ProductionProductMainDto dto) {
-        if (dto == null) {
-            throw new RuntimeException("鍙傛暟涓嶈兘涓虹┖");
-        }
-
-        SysUser user = SecurityUtils.getLoginUser().getUser();
-
-
-        // 鏂板閫昏緫
+        SysUser user = userMapper.selectUserById(dto.getUserId());
         ProductionProductMain productionProductMain = new ProductionProductMain();
+        //褰撳墠宸ヨ壓璺嚎瀵瑰簲鐨勫伐搴忚鎯�
         ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
         if (productProcessRouteItem == null) {
             throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
         }
-
-        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-
+        //褰撳墠鍏蜂綋宸ュ簭
+        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
+        //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
+        ProductModel productModel = productModelMapper.selectById(productProcessRouteItem.getProductModelId());
+        //鏌ヨ璇ョ敓浜ц鍗曞搴旂殑bom
+        ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectById(productProcessRouteItem.getProductRouteId());
+        /*鏂板鎶ュ伐涓昏〃*/
+        //鏌ヨ鏈�澶ф姤宸ョ紪鍙�
+        String datePrefix = "BG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
         QueryWrapper<ProductionProductMain> queryWrapper = new QueryWrapper<>();
         queryWrapper.select("MAX(product_no) as maxNo")
                 .likeRight("product_no", datePrefix);
-
         List<Map<String, Object>> resultList = productionProductMainMapper.selectMaps(queryWrapper);
-
         int sequenceNumber = 1;
         if (resultList != null && !resultList.isEmpty()) {
             Map<String, Object> result = resultList.get(0);
-
             if (result != null) {
                 Object maxNoObj = result.get("maxNo");
                 if (maxNoObj != null) {
                     String lastNo = maxNoObj.toString();
                     System.out.println("lastNo: " + lastNo);
-
                     if (lastNo.startsWith(datePrefix)) {
                         try {
                             String seqStr = lastNo.substring(datePrefix.length());
@@ -135,117 +138,114 @@
                 }
             }
         }
-
         String productNo = String.format("%s%03d", datePrefix, sequenceNumber);
         productionProductMain.setProductNo(productNo);
-        productionProductMain.setUserId(user.getUserId());
+        productionProductMain.setUserId(dto.getUserId());
+        productionProductMain.setUserName(dto.getUserName());
         productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
         productionProductMain.setStatus(0);
-        // 娣诲姞鎶ュ伐涓昏〃
-        int insert = productionProductMainMapper.insert(productionProductMain);
-
-        //鏇存柊宸ュ崟
-        if (insert > 0) {
-            Map<String, Object> params = new HashMap<>();
-            params.put("workOrderId", dto.getWorkOrderId());
-            params.put("deductQuantity", dto.getQuantity());
-
-            productWorkOrderMapper.updatePlanQuantity(params);
+        productionProductMainMapper.insert(productionProductMain);
+        /*鏂板鎶ュ伐鎶曞叆琛�*/
+        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
+        if (productStructureDtos.size() == 0) {
+            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
+            ProductStructureDto productStructureDto = new ProductStructureDto();
+            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
+            productStructureDto.setUnitQuantity(BigDecimal.ONE);
+            productStructureDtos.add(productStructureDto);
         }
-        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
-        ProductModel productModel = productProcessRouteItem.getProductModelId() != null ?
-                productModelMapper.selectById(productProcessRouteItem.getProductModelId()) : null;
-
-        if (productModel != null) {
-            Product product = productMapper.selectById(productModel.getProductId());
-            int inspectType = "缁勮".equals(productProcess.getName()) ? 2 : 1;
-
-            QualityInspect qualityInspect = new QualityInspect();
-            qualityInspect.setProductId(product.getId());
-            qualityInspect.setProductName(product.getProductName());
-            qualityInspect.setModel(productModel.getModel());
-            qualityInspect.setUnit(productModel.getUnit());
-            qualityInspect.setQuantity(dto.getQuantity());
-            qualityInspect.setProcess(productProcess.getName());
-            qualityInspect.setInspectState(0);
-            qualityInspect.setInspectType(inspectType);
-            qualityInspect.setProductMainId(productionProductMain.getId());
-            qualityInspect.setProductModelId(productModel.getId());
-            qualityInspectMapper.insert(qualityInspect);
-
-            qualityTestStandardMapper.selectList(
-                    new LambdaQueryWrapper<QualityTestStandard>()
-                            .eq(QualityTestStandard::getProductId, product.getId())
-            ).forEach(standard -> {
-                QualityInspectParam param = new QualityInspectParam();
-                BeanUtils.copyProperties(standard, param);
-                param.setId(null);
-                param.setInspectId(qualityInspect.getId());
-                qualityInspectParamMapper.insert(param);
-            });
-        }
-        // 娣诲姞鎶曞叆
-        if (productModel != null) {
-            List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(productModel.getId());
-            for (ProductStructureDto productStructureDto : productStructureDtos) {
-                ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
-                Product product = productMapper.selectById(productModel1.getProductId());
-                BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
-                if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
-                    throw new RuntimeException(product.getProductName() + "搴撳瓨涓�0");
-                }
-                if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
-                    throw new RuntimeException(product.getProductName() + "搴撳瓨涓嶈冻");
-                }
-                ProductionProductInput productionProductInput = new ProductionProductInput();
-                productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-                productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
-                productionProductInput.setProductMainId(productionProductMain.getId());
-                productionProductInputMapper.insert(productionProductInput);
-
-
-                DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
-                LocalDate now = LocalDate.now();
-                ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
-                Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS"+dateFormat.format(now))[1]);
-                //娣诲姞鍑哄簱澶勭悊
-                ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
-                        .procurementRecordStorageId(0)
-                        .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
-                        .salesLedgerProductId(0)
-                        .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�"+ (aLong + 1) + "鎵规")
-                        .inboundNum(productionProductInput.getQuantity())
-                        .type(4)
-                        .createTime(LocalDateTime.now())
-                        .createUser(user.getUserId())
-                        .createBy(user.getNickName())
-                        .updateUser(user.getUserId())
-                        .updateTime(LocalDateTime.now())
-                        .productModelId(productModel1.getId());
-                procurementRecordOutMapper.insert(procurementRecordOut.build());
+        for (ProductStructureDto productStructureDto : productStructureDtos) {
+            ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
+            Product product = productMapper.selectById(productModel1.getProductId());
+            BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
+            if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
+                throw new RuntimeException(product.getProductName() + "搴撳瓨涓�0");
             }
+            if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
+                throw new RuntimeException(product.getProductName() + "搴撳瓨涓嶈冻");
+            }
+            ProductionProductInput productionProductInput = new ProductionProductInput();
+            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
+            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
+            productionProductInput.setProductMainId(productionProductMain.getId());
+            productionProductInputMapper.insert(productionProductInput);
+            //瀵瑰簲鐨勫簱瀛樺嚭搴�
+            DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
+            LocalDate now = LocalDate.now();
+            ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
+            Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS" + dateFormat.format(now))[1]);
+            ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
+                    .procurementRecordStorageId(0)
+                    .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
+                    .salesLedgerProductId(productionProductMain.getId())//鍏宠仈鎶ュ伐浜у嚭
+                    .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�" + (aLong + 1) + "鎵规")
+                    .inboundNum(productionProductInput.getQuantity())
+                    .type(4)
+                    .createBy(user.getNickName())
+                    .productModelId(productModel1.getId());
+            procurementRecordOutMapper.insert(procurementRecordOut.build());
         }
-
-        // 娣诲姞浜у嚭
+        /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
         productionProductOutput.setProductMainId(productionProductMain.getId());
         productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
         productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
         productionProductOutputMapper.insert(productionProductOutput);
-
-        // 鑾峰彇鐢熶骇璁㈠崟
+        //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
+        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+        int inspectType = 1;
+        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
+            //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
+            inspectType = 2;
+        }
+        Product product = productMapper.selectById(productModel.getProductId());
+        QualityInspect qualityInspect = new QualityInspect();
+        qualityInspect.setProductId(product.getId());
+        qualityInspect.setProductName(product.getProductName());
+        qualityInspect.setModel(productModel.getModel());
+        qualityInspect.setUnit(productModel.getUnit());
+        qualityInspect.setQuantity(dto.getQuantity());
+        qualityInspect.setProcess(productProcess.getName());
+        qualityInspect.setInspectState(0);
+        qualityInspect.setInspectType(inspectType);
+        qualityInspect.setProductMainId(productionProductMain.getId());
+        qualityInspect.setProductModelId(productModel.getId());
+        qualityInspectMapper.insert(qualityInspect);
+        qualityTestStandardMapper.selectList(
+                new LambdaQueryWrapper<QualityTestStandard>()
+                        .eq(QualityTestStandard::getProductId, product.getId())
+        ).forEach(standard -> {
+            QualityInspectParam param = new QualityInspectParam();
+            BeanUtils.copyProperties(standard, param);
+            param.setId(null);
+            param.setInspectId(qualityInspect.getId());
+            qualityInspectParamMapper.insert(param);
+        });
+        /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
         ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
-        List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(new QueryWrapper<ProductionProductMain>().lambda().eq(ProductionProductMain::getWorkOrderId, dto.getWorkOrderId()));
-
-        if (productionProductMains.isEmpty()) {
-            productWorkOrder.setActualStartTime(LocalDate.now());
+        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(dto.getQuantity()));
+        if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())){
+            productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
         }
+        if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0){
+            productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+        }
+        productWorkOrderMapper.updateById(productWorkOrder);
+        //鐢熶骇璁㈠崟
         ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
-        if (productOrder == null) {
-            throw new RuntimeException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+        if (ObjectUtils.isNull(productOrder.getStartTime())){
+            productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
         }
-        // 娣诲姞鐢熶骇鏍哥畻
+        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
+            //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
+            productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(dto.getQuantity()));
+            if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0){
+                productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+            }
+        }
+        productOrderMapper.updateById(productOrder);
+        /*娣诲姞鐢熶骇鏍哥畻*/
         SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
                 .salesLedgerWorkId(productionProductMain.getId())
                 .salesLedgerSchedulingId(0L)
@@ -260,40 +260,54 @@
                 .tenantId(dto.getTenantId())
                 .build();
         salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
-
         return true;
     }
 
     @Override
-    @Transactional
     public Boolean removeProductMain(ProductionProductMainDto dto) {
-        Long id = dto.getId();
-
-        // 鏇存柊宸ュ崟
-        productWorkOrderMapper.rollbackPlanQuantity(id);
-        // 鍒犻櫎璐ㄦ鍙傛暟鍜岃川妫�璁板綍
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(dto.getId());
+        //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
+        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+        ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0);
+        /*鍒犻櫎鏍哥畻*/
+        salesLedgerProductionAccountingMapper.delete(
+                new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                        .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId())
+        );
+        /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
+        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
+        productWorkOrder.setActualEndTime(null);
+        productWorkOrderMapper.updateById(productWorkOrder);
+        //鍒ゆ柇鏄惁鏄渶鍚庝竴閬撳伐搴�
+        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+        if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()){
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
+            productOrder.setEndTime(null);
+            productOrderMapper.updateById(productOrder);
+        }
+        /*鍒犻櫎浜у嚭*/
+        //鍒犻櫎璐ㄦ
         qualityInspectMapper.selectList(
                 new LambdaQueryWrapper<QualityInspect>()
-                        .eq(QualityInspect::getProductMainId, id)
+                        .eq(QualityInspect::getProductMainId, productionProductMain.getId())
         ).forEach(q -> {
             qualityInspectParamMapper.delete(
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
         });
-
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
-                .eq(ProductionProductOutput::getProductMainId, id)
-        );
-
-        // 鍒犻櫎鍏宠仈鐨勬牳绠楁暟鎹�
-        salesLedgerProductionAccountingMapper.delete(
-                new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
-                        .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id)
-        );
-
+                .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
+        /*鍒犻櫎鎶曞叆*/
+        procurementRecordOutMapper.delete(new LambdaQueryWrapper<ProcurementRecordOut>()
+                .eq(ProcurementRecordOut::getSalesLedgerProductId, productionProductMain.getId()));
+        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
+                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
         // 鍒犻櫎涓昏〃
-        return productionProductMainMapper.deleteById(id) > 0;
+        productionProductMainMapper.deleteById(productionProductMain.getId());
+        return true;
     }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index a34f809..ee7f721 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.math.LongMath;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.controller.BaseController;
@@ -101,7 +102,7 @@
             //  鐢熸垚鍑哄簱璁板綍
             ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd();
             procurementRecordOutAdd.setId(procurementRecordStorage.getId());
-            procurementRecordOutAdd.setSalesLedgerProductId(Math.toIntExact(salesLedgerProduct.getId()));
+            procurementRecordOutAdd.setSalesLedgerProductId((long) Math.toIntExact(salesLedgerProduct.getId()));
             procurementRecordOutAdd.setType(2);
             procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId()));
             procurementRecordOutAdd.setQuantity(salesLedgerProduct.getQuantity().toPlainString());
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 22923b5..1dadd18 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -703,7 +703,7 @@
                 productOrderMapper.insert(productOrder);
 
                 ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
-                List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(salesLedgerProduct.getProductModelId());
+                List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
                 if (processRoute != null) {
                     //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
                     ProductProcessRoute productProcessRoute = new ProductProcessRoute();
diff --git a/src/main/resources/mapper/production/ProductStructureMapper.xml b/src/main/resources/mapper/production/ProductStructureMapper.xml
index 1833487..e4a0795 100644
--- a/src/main/resources/mapper/production/ProductStructureMapper.xml
+++ b/src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -25,7 +25,7 @@
         where ps.bom_id = #{bomId}
         order by ps.id
     </select>
-    <select id="listByproductModelId" resultType="com.ruoyi.production.dto.ProductStructureDto">
+    <select id="listBybomAndProcess" resultType="com.ruoyi.production.dto.ProductStructureDto">
         select ps.*,
                p.product_name,
                pp.name as  process_name,
@@ -33,11 +33,11 @@
                pm.model
         from
             product_structure ps
-                left join product_bom pb on ps.bom_id = pb.id
                 left join product_model pm on ps.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_process pp on ps.process_id = pp.id
-        where pb.product_model_id = #{productModelId}
+        where ps.bom_id = #{bomId}
+        and ps.process_id=#{processId}
         order by ps.id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 2ab8057..9a03b30 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -45,26 +45,4 @@
         from product_work_order pwo
         left join product_order po on po.id = pwo.product_order_id
     </select>
-
-    <update id="updatePlanQuantity" parameterType="java.util.Map">
-        UPDATE product_work_order
-        SET
-            report_work = #{reportWork},
-            plan_quantity = plan_quantity - #{deductQuantity}
-        WHERE id = #{workOrderId}
-    </update>
-
-    <update id="rollbackPlanQuantity" parameterType="java.lang.Long">
-        UPDATE product_work_order pwo
-        INNER JOIN production_product_main ppm
-        ON pwo.id = ppm.work_order_id
-        AND ppm.id = #{productMainId}
-        INNER JOIN production_product_output ppo
-        ON ppo.product_main_id = ppm.id
-        SET
-        pwo.plan_quantity = pwo.plan_quantity + ppo.quantity,
-        pwo.report_work = 0,
-        pwo.quantity = 0
-        WHERE pwo.id = ppm.work_order_id
-    </update>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductInputMapper.xml b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
index 7d203f3..a885977 100644
--- a/src/main/resources/mapper/production/ProductionProductInputMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -13,11 +13,14 @@
     <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto">
         select ppi.*,
         pm.model as model,
-        ppm.product_no as productNo
+        ppm.product_no as productNo,
+        p.product_name,
+        pm.unit
         from
         production_product_input ppi
         left join production_product_main ppm on ppm.id = ppi.product_main_id
         left join product_model pm on pm.id = ppi.product_model_id
+        left join product p on p.id = pm.product_id
         <where>
             <if test="c.productMainId != null and c.productMainId > 0">
                 and ppm.id = #{c.productMainId}
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 3a0542c..5b5c825 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -16,10 +16,20 @@
         select ppm.*,
                pwo.work_order_no as workOrderNo,
                pwo.status as workOrderStatus,
-               u.nick_name as nickName
+               u.nick_name as nickName,
+               p.product_name as productName,
+               pm.model as productModelName,
+               ppo.quantity,
+               pm.unit,
+               sl.customer_contract_no salesContractNo
         from
             production_product_main ppm
                 left join product_work_order pwo on pwo.id = ppm.work_order_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>
             <if test="c.nickName != null and c.nickName != ''">
@@ -36,6 +46,7 @@
             </if>
         </where>
         order by ppm.id
+
     </select>
 
     <delete id="deleteByWorkOrderIds" parameterType="java.util.List">

--
Gitblit v1.9.3