3 Коммиты e17aad0615 ... 8c7a4de9ea

Автор SHA1 Сообщение Дата
  lucky 8c7a4de9ea feat:最新的老库存出库逻辑 3 месяцев назад
  lucky 1b0feec2bd Merge remote-tracking branch 'origin/master' 3 месяцев назад
  阿赫 d31ae23836 订单加空验证,出库日志绑定值错误 4 месяцев назад
45 измененных файлов с 5199 добавлено и 1027 удалено
  1. 1 0
      zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysDictDataController.java
  2. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/AmmunitionPlanInformationIntermediateTableController.java
  3. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/DetailsOfTheRefuelingPlanSpinningController.java
  4. 32 0
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInventoryController.java
  5. 3 1
      zkqy-custom-business/src/main/java/com/zkqy/business/controller/SaleProductsController.java
  6. 15 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductInventory.java
  7. 157 0
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInventoryVo.java
  8. 1 1
      zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInvoiceVO.java
  9. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductCodeListMapper.java
  10. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductHandsetOutboundRecordMapper.java
  11. 9 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInventoryMapper.java
  12. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInvoiceMapper.java
  13. 10 8
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordBatchMapper.java
  14. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordMapper.java
  15. 2 0
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductWarehousingRecordMapper.java
  16. 10 8
      zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductionMapper.java
  17. 19 0
      zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInventoryService.java
  18. 109 1
      zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java
  19. 5 5
      zkqy-custom-business/src/main/resources/mapper/business/DetailsOfTheRefuelingPlanMapper.xml
  20. 5 6
      zkqy-custom-business/src/main/resources/mapper/business/DetailsOfTheRefuelingPlanSpinningMapper.xml
  21. 13 1
      zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml
  22. 2 2
      zkqy-custom-business/src/main/resources/mapper/business/ProductOutboundRecordMapper.xml
  23. 5 5
      zkqy-custom-business/src/main/resources/mapper/business/ProductionLineMapper.xml
  24. 6 6
      zkqy-custom-business/src/main/resources/mapper/business/SaleProductsMapper.xml
  25. 23 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/EntryIds.java
  26. 66 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResponseStatus.java
  27. 31 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResultData.java
  28. 21 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResultWrapper.java
  29. 51 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/SuccessEntity.java
  30. 3040 0
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl (2).javabak
  31. 425 637
      zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl.java
  32. 37 0
      zkqy-fujian-amichi/src/main/resources/bc.json
  33. 0 242
      zkqy-fujian-amichi/src/main/resources/mapper/JdProductionOrderMapper.xml
  34. 107 0
      zkqy-fujian-amichi/src/main/resources/storage1.json
  35. 11 0
      zkqy-fujian-amichi/src/main/resources/xt.json
  36. 4 4
      zkqy-ui/.env.production
  37. 1 0
      zkqy-ui/.eslintrc.js
  38. 0 35
      zkqy-ui/build/index.js
  39. 23 0
      zkqy-ui/src/api/tablelist/commonTable.js
  40. 4 1
      zkqy-ui/src/permission.js
  41. 4 3
      zkqy-ui/src/views/bussiness/processMange.vue
  42. 0 2
      zkqy-ui/src/views/bussiness/processMange.vueavc
  43. 285 57
      zkqy-ui/src/views/orderMange/oldOutStock/index.vue
  44. 634 0
      zkqy-ui/src/views/orderMange/oldOutStock/indexCopy.vue
  45. 16 2
      zkqy-ui/src/views/orderMange/retailMange/index.vue

+ 1 - 0
zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysDictDataController.java

@@ -83,6 +83,7 @@ public class SysDictDataController extends BaseController {
      * 根据字典类型查询字典数据信息
      */
     @GetMapping(value = "/type/{dictType}")
+    @Anonymous
     public AjaxResult dictType(@PathVariable String dictType) {
         List<SysDictData> data = dictTypeService.selectDictDataByTypeAllTenant(dictType);
         if (StringUtils.isNull(data)) {

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/AmmunitionPlanInformationIntermediateTableController.java

@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletResponse;
 import com.zkqy.business.domain.DetailsOfTheRefuelingPlan;
 import com.zkqy.business.domain.vo.AmmunitionPlanInformationIntermediateTableRVo;
 import com.zkqy.business.domain.vo.AmmunitionPlanInformationIntermediateTableVo;
+import com.zkqy.common.annotation.Anonymous;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -65,6 +66,7 @@ public class AmmunitionPlanInformationIntermediateTableController extends BaseCo
 //    //@PreAuthorize("@ss.hasPermi('business:table:list')")
     @GetMapping("/list2")
     @ApiOperation(value = "查询加弹计划信息列表")
+    @Anonymous
     public AjaxResult list2(AmmunitionPlanInformationIntermediateTableVo ammunitionPlanInformationIntermediateTable) {
         List<AmmunitionPlanInformationIntermediateTableRVo> list = ammunitionPlanInformationIntermediateTableService.selectAmmunitionPlanInformationIntermediateTableList(ammunitionPlanInformationIntermediateTable);
         return AjaxResult.success(list);

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/DetailsOfTheRefuelingPlanSpinningController.java

@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.zkqy.business.domain.vo.DetailsOfTheRefuelingPlanSpinningRVo;
 import com.zkqy.business.domain.vo.DetailsOfTheRefuelingPlanSpinningVo;
+import com.zkqy.common.annotation.Anonymous;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -46,6 +47,7 @@ public class DetailsOfTheRefuelingPlanSpinningController extends BaseController
 //    //@PreAuthorize("@ss.hasPermi('system:spinning:list')")
     @GetMapping("/list")
     @ApiOperation(value = "查询纺丝计划详细信息列表")
+    @Anonymous
     public TableDataInfo list(DetailsOfTheRefuelingPlanSpinningVo detailsOfTheRefuelingPlanSpinning) {
         List<DetailsOfTheRefuelingPlanSpinningRVo> list = detailsOfTheRefuelingPlanSpinningService.selectDetailsOfTheRefuelingPlanSpinningList(detailsOfTheRefuelingPlanSpinning);
         return getDataTable(list);

+ 32 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/controller/ProductInventoryController.java

@@ -8,6 +8,8 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.zkqy.business.domain.*;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.business.domain.vo.ProductInventoryVo;
+import com.zkqy.business.domain.vo.ProductInvoiceVO;
 import com.zkqy.business.mapper.ProductionMapper;
 import com.zkqy.common.utils.DateUtils;
 import io.swagger.annotations.Api;
@@ -263,4 +265,34 @@ public class ProductInventoryController extends BaseController {
         return productInventoryService.checkOldInventory(productInvoice);
     }
 
+    /**
+     * 查询待出库的老库存信息
+     * @param SaleProductInfo
+     * @return
+     */
+    @GetMapping("/queryTheOldInventoryDeliveryList")
+    public TableDataInfo queryTheOldInventoryDeliveryList(ProductInvoiceVO.SaleProductInfo SaleProductInfo) {
+        //分页信息
+        startPage();
+        List<ProductInventory> productInventories = productInventoryService.queryTheOldInventoryDeliveryList(SaleProductInfo);
+        return  getDataTable(productInventories);
+    }
+
+    /**
+     * 查询待出库的老库存信息
+     * @param productInventoryVo
+     * @return
+     */
+    @PostMapping("/oldInventoryGoOut")
+    public AjaxResult oldInventoryGoOut(@RequestBody ProductInventoryVo productInventoryVo) {
+        //更新库存信息
+        int i = productInventoryService.oldInventoryGoOut(productInventoryVo);
+        if(i>0){
+            return  AjaxResult.success("出库成功");
+        }else {
+            return  AjaxResult.error("请联系管理员");
+        }
+
+    }
+
 }

+ 3 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/controller/SaleProductsController.java

@@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletResponse;
 import com.zkqy.business.domain.vo.SaleProductsVo;
 import com.zkqy.business.mapper.SaleOrderMapper;
 import com.zkqy.business.mapper.SaleProductsMapper;
+import com.zkqy.common.annotation.Anonymous;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -44,7 +45,8 @@ public class SaleProductsController extends BaseController {
      */
     @GetMapping("/getProducts")
     @ApiOperation(value = "查询销售产品列表")
-    public AjaxResult getProducts(@RequestParam("productionLineNo") String productionLineNo) {
+    @Anonymous
+    public AjaxResult getProducts(@RequestParam(value = "productionLineNo", required = false) String productionLineNo) {
         //销售单什么状态为3的(待生产)
         SaleProducts saleProducts=new SaleProducts();
 //        saleProducts.setStatus("3");

+ 15 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/ProductInventory.java

@@ -28,6 +28,8 @@ public class ProductInventory extends BaseEntity {
     @Excel(name = "码单号")
     private String qrCode;
 
+
+
     /**
      * 批号
      */
@@ -199,6 +201,19 @@ public class ProductInventory extends BaseEntity {
      */
     private String productColour;
 
+    /**
+     * 这个字段是因为老库存都是产品id没有对应的产品名称信息,所以我加了一个这个字段
+     */
+    private  String productName;
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
     /**
      * 库存类型
      */

+ 157 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInventoryVo.java

@@ -0,0 +1,157 @@
+package com.zkqy.business.domain.vo;
+
+import com.zkqy.business.domain.ProductInventory;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+public class ProductInventoryVo extends ProductInventory {
+
+    /**
+     * 箱数
+     */
+    private  String  oldActualBoxNum;
+
+    private  String  inventoryId;
+
+    private Date deliveryDate;
+
+    private  String deliveryWarehouse;
+
+    private  String transferWarehouse;
+
+    private  String  deliveryClerk;
+
+    public Date getDeliveryDate() {
+        return deliveryDate;
+    }
+
+    public void setDeliveryDate(Date deliveryDate) {
+        this.deliveryDate = deliveryDate;
+    }
+
+    public String getDeliveryWarehouse() {
+        return deliveryWarehouse;
+    }
+
+    public void setDeliveryWarehouse(String deliveryWarehouse) {
+        this.deliveryWarehouse = deliveryWarehouse;
+    }
+
+    public String getTransferWarehouse() {
+        return transferWarehouse;
+    }
+
+    public void setTransferWarehouse(String transferWarehouse) {
+        this.transferWarehouse = transferWarehouse;
+    }
+
+    public String getDeliveryClerk() {
+        return deliveryClerk;
+    }
+
+    public void setDeliveryClerk(String deliveryClerk) {
+        this.deliveryClerk = deliveryClerk;
+    }
+
+    @Override
+    public String getProductName() {
+        return productName;
+    }
+
+    @Override
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    /**
+     * 需求重量
+     */
+    private  String oldActualWeight;
+
+    /**
+     * 通知单号
+     */
+    private  String  noticeNumber;
+
+
+
+    /**
+     * 订单号
+     * @return
+     */
+    private  String  saleOrderNo;
+
+    /**
+     * 产品编码
+     * @return
+     */
+    private  String  productCode;
+
+    /**
+     * 产品名称
+     */
+    private String  productName;
+
+    /**
+     * 规格
+     * @return
+     */
+    private  String  productSpecifications;
+
+    public String getInventoryId() {
+        return inventoryId;
+    }
+
+    public void setInventoryId(String inventoryId) {
+        this.inventoryId = inventoryId;
+    }
+
+    public String getProductSpecifications() {
+        return productSpecifications;
+    }
+
+    public void setProductSpecifications(String productSpecifications) {
+        this.productSpecifications = productSpecifications;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+    public String getSaleOrderNo() {
+        return saleOrderNo;
+    }
+
+    public void setSaleOrderNo(String saleOrderNo) {
+        this.saleOrderNo = saleOrderNo;
+    }
+
+    public String getOldActualBoxNum() {
+        return oldActualBoxNum;
+    }
+
+    public void setOldActualBoxNum(String oldActualBoxNum) {
+        this.oldActualBoxNum = oldActualBoxNum;
+    }
+
+    public String getOldActualWeight() {
+        return oldActualWeight;
+    }
+
+    public void setOldActualWeight(String oldActualWeight) {
+        this.oldActualWeight = oldActualWeight;
+    }
+
+    public String getNoticeNumber() {
+        return noticeNumber;
+    }
+
+    public void setNoticeNumber(String noticeNumber) {
+        this.noticeNumber = noticeNumber;
+    }
+}

+ 1 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/domain/vo/ProductInvoiceVO.java

@@ -467,7 +467,7 @@ public class ProductInvoiceVO extends BaseEntity {
         private Long productId;
 
         /**
-         * 编码
+         * 产品编码
          */
         private String productCode;
 

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductCodeListMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.zkqy.business.domain.ProductCodeList;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 产品码单Mapper接口
@@ -11,6 +12,7 @@ import com.zkqy.business.domain.vo.ProductCodeListVO;
  * @author zkqy
  * @date 2024-04-01
  */
+@Mapper
 public interface ProductCodeListMapper {
     /**
      * 查询产品码单

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductHandsetOutboundRecordMapper.java

@@ -3,6 +3,7 @@ package com.zkqy.business.mapper;
 import java.util.List;
 
 import com.zkqy.business.domain.ProductHandsetOutboundRecord;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Param;
  * @author zkqy
  * @date 2024-04-12
  */
+@Mapper
 public interface ProductHandsetOutboundRecordMapper {
     /**
      * 查询成品手持机出库记录

+ 9 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInventoryMapper.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.zkqy.business.domain.ProductInventory;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 产品库存Mapper接口
@@ -12,6 +13,7 @@ import com.zkqy.business.domain.vo.ProductCodeListVO;
  * @author zkqy
  * @date 2024-04-09
  */
+@Mapper
 public interface ProductInventoryMapper {
     /**
      * 查询产品库存
@@ -79,6 +81,13 @@ public interface ProductInventoryMapper {
      */
     List<ProductInventory> oldselectProductInventoryByLotNumAndProductId(ProductInventory productInventory);
 
+    /**
+     * 老库存出库带产品名称
+     * @param productInventory
+     * @return
+     */
+    List<ProductInventory> oldselectProductInventoryByLotNumAndProductIdJoinProduction(ProductInventory productInventory);
+
     /**
      * 查询综合库存列表
      */

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductInvoiceMapper.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.zkqy.business.domain.ProductInvoice;
 import com.zkqy.business.domain.vo.ProductInvoiceFinancialExportVo;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 产品发货单Mapper接口
@@ -12,6 +13,7 @@ import com.zkqy.business.domain.vo.ProductInvoiceFinancialExportVo;
  * @author zkqy
  * @date 2024-04-11
  */
+@Mapper
 public interface ProductInvoiceMapper {
     /**
      * 查询产品发货单

+ 10 - 8
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordBatchMapper.java

@@ -2,19 +2,21 @@ package com.zkqy.business.mapper;
 
 import java.util.List;
 import com.zkqy.business.domain.ProductOutboundRecordBatch;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * 成品出库记录批次Mapper接口
- * 
+ *
  * @author zkqy
  * @date 2024-06-28
  */
-public interface ProductOutboundRecordBatchMapper 
+@Mapper
+public interface ProductOutboundRecordBatchMapper
 {
     /**
      * 查询成品出库记录批次
-     * 
+     *
      * @param id 成品出库记录批次主键
      * @return 成品出库记录批次
      */
@@ -22,7 +24,7 @@ public interface ProductOutboundRecordBatchMapper
 
     /**
      * 查询成品出库记录批次列表
-     * 
+     *
      * @param productOutboundRecordBatch 成品出库记录批次
      * @return 成品出库记录批次集合
      */
@@ -30,7 +32,7 @@ public interface ProductOutboundRecordBatchMapper
 
     /**
      * 新增成品出库记录批次
-     * 
+     *
      * @param productOutboundRecordBatch 成品出库记录批次
      * @return 结果
      */
@@ -38,7 +40,7 @@ public interface ProductOutboundRecordBatchMapper
 
     /**
      * 修改成品出库记录批次
-     * 
+     *
      * @param productOutboundRecordBatch 成品出库记录批次
      * @return 结果
      */
@@ -46,7 +48,7 @@ public interface ProductOutboundRecordBatchMapper
 
     /**
      * 删除成品出库记录批次
-     * 
+     *
      * @param id 成品出库记录批次主键
      * @return 结果
      */
@@ -54,7 +56,7 @@ public interface ProductOutboundRecordBatchMapper
 
     /**
      * 批量删除成品出库记录批次
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductOutboundRecordMapper.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.zkqy.business.domain.ProductOutboundRecord;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
  * @author zkqy
  * @date 2024-04-09
  */
+@Mapper
 public interface ProductOutboundRecordMapper {
     /**
      * 查询成品出库记录

+ 2 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductWarehousingRecordMapper.java

@@ -6,6 +6,7 @@ import java.util.Map;
 import com.zkqy.business.domain.ProductWarehousingRecord;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
 import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -14,6 +15,7 @@ import org.apache.ibatis.annotations.Param;
  * @author zkqy
  * @date 2024-04-09
  */
+@Mapper
 public interface ProductWarehousingRecordMapper {
     /**
      * 查询成品入库记录

+ 10 - 8
zkqy-custom-business/src/main/java/com/zkqy/business/mapper/ProductionMapper.java

@@ -2,18 +2,20 @@ package com.zkqy.business.mapper;
 
 import java.util.List;
 import com.zkqy.business.domain.Production;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 产品Mapper接口
- * 
+ *
  * @author zkqy
  * @date 2024-05-13
  */
-public interface ProductionMapper 
+@Mapper
+public interface ProductionMapper
 {
     /**
      * 查询产品
-     * 
+     *
      * @param id 产品主键
      * @return 产品
      */
@@ -21,7 +23,7 @@ public interface ProductionMapper
 
     /**
      * 查询产品列表
-     * 
+     *
      * @param production 产品
      * @return 产品集合
      */
@@ -29,7 +31,7 @@ public interface ProductionMapper
 
     /**
      * 新增产品
-     * 
+     *
      * @param production 产品
      * @return 结果
      */
@@ -37,7 +39,7 @@ public interface ProductionMapper
 
     /**
      * 修改产品
-     * 
+     *
      * @param production 产品
      * @return 结果
      */
@@ -45,7 +47,7 @@ public interface ProductionMapper
 
     /**
      * 删除产品
-     * 
+     *
      * @param id 产品主键
      * @return 结果
      */
@@ -53,7 +55,7 @@ public interface ProductionMapper
 
     /**
      * 批量删除产品
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */

+ 19 - 0
zkqy-custom-business/src/main/java/com/zkqy/business/service/IProductInventoryService.java

@@ -6,6 +6,8 @@ import java.util.Map;
 import com.zkqy.business.domain.ProductInventory;
 import com.zkqy.business.domain.ProductInvoice;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.business.domain.vo.ProductInventoryVo;
+import com.zkqy.business.domain.vo.ProductInvoiceVO;
 import com.zkqy.common.core.domain.AjaxResult;
 
 /**
@@ -148,4 +150,21 @@ public interface IProductInventoryService {
      * @return
      */
     AjaxResult checkOldInventory(ProductInvoice productInvoice);
+
+    /**
+     * 产品编码,产品名称,规格,颜色查询老库存信息
+     */
+    /**
+     * 检查库存是否足够
+     * @param productInvoice
+     * @return
+     */
+    List<ProductInventory> queryTheOldInventoryDeliveryList(ProductInvoiceVO.SaleProductInfo productInvoice);
+
+    /**
+     * 0407单个老库存出库逻辑
+     * @param productInventoryVo
+     * @return
+     */
+    int oldInventoryGoOut(ProductInventoryVo productInventoryVo);
 }

+ 109 - 1
zkqy-custom-business/src/main/java/com/zkqy/business/service/impl/ProductInventoryServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
 import cn.hutool.core.util.RandomUtil;
 import com.zkqy.business.domain.*;
 import com.zkqy.business.domain.vo.ProductCodeListVO;
+import com.zkqy.business.domain.vo.ProductInventoryVo;
 import com.zkqy.business.domain.vo.ProductInvoiceVO;
 import com.zkqy.business.mapper.*;
 import com.zkqy.business.service.IOldProductOutboundRecordService;
@@ -817,7 +818,7 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
                     productOutboundRecord.setBoxNum(xs);//箱数
                     productOutboundRecord.setSuttle(zl);//重量
                     productOutboundRecord.setMachineTool(Long.parseLong("30"));//机台
-                    productOutboundRecord.setGrossWeight(item.getOldActualWeight());//毛重
+                    productOutboundRecord.setGrossWeight(zl);//毛重
                     productOutboundRecord.setPackaging("2");//包装
                     productOutboundRecord.setWorkShifts("D甲");//班次
                     productOutboundRecord.setForeignTradeNumber("1");//外贸号
@@ -909,6 +910,113 @@ public class ProductInventoryServiceImpl implements IProductInventoryService {
             return  AjaxResult.success("库存够").put("isG",0);
         }
     }
+
+    /**
+     *
+     * @param SaleProductInfo
+     * @return
+     */
+    @Override
+    public List<ProductInventory> queryTheOldInventoryDeliveryList(ProductInvoiceVO.SaleProductInfo SaleProductInfo) {
+        ProductInventory product = new ProductInventory();
+        product.setProductId(SaleProductInfo.getProductId()); //产品编码
+        product.setProductColour(SaleProductInfo.getProductColor()); //色号
+        product.setInventoryType("2"); //老库存标记
+        //老库存信息中并没有规格信息
+        List<ProductInventory> productInventoryList = productInventoryMapper.oldselectProductInventoryByLotNumAndProductIdJoinProduction(product);
+        //查询所有待出库的老库存信息
+        return productInventoryList;
+    }
+
+    @Override
+    @Transactional
+    public int oldInventoryGoOut(ProductInventoryVo productInventoryVo) {
+
+        // 查询原来的库存信息
+        ProductInventory productInventory = productInventoryMapper.selectProductInventoryById(Long.valueOf(productInventoryVo.getInventoryId()));
+
+        // 新增老货品出库记录
+        OldProductOutboundRecord oldProductOutboundRecord = new OldProductOutboundRecord();
+        oldProductOutboundRecord.setSaleOrderNo(productInventoryVo.getSaleOrderNo());
+        oldProductOutboundRecord.setProductNo(productInventoryVo.getProductCode());
+        oldProductOutboundRecord.setActualBoxnum(productInventoryVo.getOldActualBoxNum().toString());
+        oldProductOutboundRecord.setActualWeight(productInventoryVo.getOldActualWeight().toString());
+        oldProductOutboundRecord.setProductColor(productInventoryVo.getProductColour());
+        oldProductOutboundRecord.setProductName(productInventoryVo.getProductName());
+        oldProductOutboundRecord.setProductSpecifications(productInventoryVo.getProductSpecifications()); // 组装
+        oldProductOutboundRecord.setLevels(productInventory.getLevels());
+        oldProductOutboundRecord.setDelFlag("0");
+        oldProductOutboundRecordService.insertOldProductOutboundRecord(oldProductOutboundRecord);
+
+        // 成品出库记录
+        ProductOutboundRecord productOutboundRecord = new ProductOutboundRecord();
+        productOutboundRecord.setQrCode("lkc_"+System.currentTimeMillis());//码单号
+        productOutboundRecord.setQrCodeId("lkc_"+ RandomUtil.getSecureRandom().nextInt());//码单标识
+        productOutboundRecord.setProductId(productInventory.getProductId());//产品编号
+        productOutboundRecord.setCanisterNum(0);//筒数
+        productOutboundRecord.setLevels(productInventory.getLevels());//等级
+        productOutboundRecord.setLotNum(productInventory.getLotNum());//库存批号
+        productOutboundRecord.setBoxNum(Integer.valueOf(productInventoryVo.getOldActualBoxNum()));//箱数 --自己组装
+        productOutboundRecord.setSuttle(Double.valueOf(productInventoryVo.getOldActualWeight()));//重量  --净重
+        productOutboundRecord.setMachineTool(Long.parseLong("30"));//机台
+        productOutboundRecord.setGrossWeight(Double.valueOf(productInventoryVo.getOldActualWeight()));//毛重
+        productOutboundRecord.setPackaging("2");//包装
+        productOutboundRecord.setWorkShifts("D甲");//班次
+        productOutboundRecord.setForeignTradeNumber("1");//外贸号
+        productOutboundRecord.setCanisterWeight(0.0);//筒重
+        productOutboundRecord.setBoxWeight(0.0);//箱重
+        productOutboundRecord.setTubeColor("塑料管");
+        productOutboundRecord.setPrintFormat("4");//打印格式
+        productOutboundRecord.setDelFlag("0");
+        productOutboundRecord.setCreateById(SecurityUtils.getUserId());
+        productOutboundRecord.setCreateBy(SecurityUtils.getUsername());
+        productOutboundRecord.setCreateTime(new Date());
+        productOutboundRecord.setDepositor(SecurityUtils.getUsername());
+        productOutboundRecord.setNoticeNumber(productInventoryVo.getNoticeNumber()); //通知单号
+        productOutboundRecord.setProductColour(productInventoryVo.getProductColour()); //产品色号
+        productOutboundRecord.setHistoryBatch(false);
+        productOutboundRecord.setBatchNumber(0);
+        productOutboundRecord.setConfirmOut(1);
+        productOutboundRecord.setWarehousingTime(new Date());//出库时间
+
+        // 添加成品库存出库记录
+        productOutboundRecordMapper.insertProductOutboundRecord(productOutboundRecord);
+
+        // 修正库存信息
+        Integer surplusBoxQuantity=productInventory.getTotalBoxNum()-Integer.parseInt(productInventoryVo.getOldActualBoxNum());
+        productInventory.setTotalBoxNum(surplusBoxQuantity);// 箱数剩余数量
+        if(productInventory.getTotalBoxNum()<=0){
+            productInventory.setDelFlag("2");//删除逻辑
+        }
+        Double surplusWhQuantity=productInventory.getTotalGrossWeight()-Double.parseDouble(productInventoryVo.getOldActualWeight());
+        productInventory.setTotalGrossWeight(this.handlingWeight(surplusWhQuantity));// 重量剩余数量
+
+//        //修改通知单、发货日期、发货仓库、调拨仓库、发货员、
+          ProductInvoice productInvoice = productInvoiceMapper.selectProductInvoiceByNoticeNumber(productInventoryVo.getNoticeNumber());
+
+        ProductInvoice productInvoice1 = new ProductInvoice();
+        productInvoice1.setId(productInvoice.getId());
+        productInvoice1.setDeliveryDate(productInventoryVo.getDeliveryDate());
+        productInvoice1.setDeliveryWarehouse(Long.valueOf(productInventoryVo.getDeliveryWarehouse()));
+//        productInvoice1.setTransferWarehouse(Long.valueOf(productInventoryVo.getTransferWarehouse())); ---调拨仓库
+        productInvoice1.setDeliveryClerk(productInventoryVo.getDeliveryClerk());
+        productInvoiceMapper.updateProductInvoice(productInvoice1);
+        //修改销售单状态为已完成
+        //查询通知单详情获取
+        ProductInvoice productInvoice2 = productInvoiceMapper.selectProductInvoiceById(productInvoice.getId());
+        //判断当前订单是否为零售单
+        SaleOrder saleOrder1 = saleOrderMapper.selectSaleOrderBySaleNo(productInvoice2.getSaleOrderNo());
+        // 更新销售单状态-》
+        SaleOrder saleOrder = new SaleOrder();
+        saleOrder.setSaleNo(productInvoice2.getSaleOrderNo());
+        // 已完成状态
+        saleOrder.setStatus("6");
+        saleOrder.setOldInventoryState(2);  // 标识当前出库订单为老库存
+        saleOrderMapper.updateSaleOrderBySaleNo(saleOrder);
+        // 修改库存记录
+        return productInventoryMapper.updateProductInventory(productInventory);
+    }
+
     //保留两位小数
     public Double handlingWeight(Double weight) {
         DecimalFormat df = new DecimalFormat("0.00");

+ 5 - 5
zkqy-custom-business/src/main/resources/mapper/business/DetailsOfTheRefuelingPlanMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zkqy.business.mapper.DetailsOfTheRefuelingPlanMapper">
-    
+
     <resultMap type="com.zkqy.business.domain.DetailsOfTheRefuelingPlan" id="DetailsOfTheRefuelingPlanResult">
         <result property="id"    column="id"    />
         <result property="timestampRandomCode"    column="timestamp_random_code"    />
@@ -29,12 +29,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                current_specification, current_lot_number, current_spindle_count, start_time, planned_end_time,plan_status,
                number,productType,product_id,salesman_id,productTypeName,
                create_by_id,create_by,create_time
-        from {DBNAME}.details_of_the_refueling_plan
+        from huaxian.details_of_the_refueling_plan
     </sql>
 
     <select id="selectDetailsOfTheRefuelingPlanList" parameterType="com.zkqy.business.domain.DetailsOfTheRefuelingPlan" resultMap="DetailsOfTheRefuelingPlanResult">
         <include refid="selectDetailsOfTheRefuelingPlanVo"/>
-        <where>  
+        <where>
             <if test="timestampRandomCode != null  and timestampRandomCode != ''"> and timestamp_random_code = #{timestampRandomCode}</if>
             <if test="macId != null "> and mac_id = #{macId}</if>
             <if test="machineId != null "> and machine_id = #{machineId}</if>
@@ -72,7 +72,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         ORDER BY CASE WHEN plan_status = 1 THEN 0 ELSE 1 END, plan_status;
     </select>
-    
+
     <select id="selectDetailsOfTheRefuelingPlanById" parameterType="Long" resultMap="DetailsOfTheRefuelingPlanResult">
         <include refid="selectDetailsOfTheRefuelingPlanVo"/>
         where id = #{id}
@@ -240,4 +240,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <delete id="deleteDetailsOfTheRefuelingPlanByMachineId">
         delete from {DBNAME}.details_of_the_refueling_plan where machine_id = #{machineId} and timestamp_random_code='停机';
     </delete>
-</mapper>
+</mapper>

+ 5 - 6
zkqy-custom-business/src/main/resources/mapper/business/DetailsOfTheRefuelingPlanSpinningMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zkqy.business.mapper.DetailsOfTheRefuelingPlanSpinningMapper">
-    
+
     <resultMap type="com.zkqy.business.domain.DetailsOfTheRefuelingPlanSpinning" id="DetailsOfTheRefuelingPlanSpinningResult">
         <result property="id"    column="id"    />
         <result property="timestampRandomCode"    column="timestamp_random_code"    />
@@ -36,13 +36,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select id, timestamp_random_code, mac_id,machine_id, production_digit, current_color_code, current_specification, current_lot_number, start_time, planned_end_time,
                plan_status, number, remark, create_by_id, create_by, update_by, update_by, create_time, update_time,
                product_id, salesman_id,productTypeName,create_by_id,create_by,create_time
-
-        from {DBNAME}.details_of_the_refueling_plan_spinning
+        from huaxian.details_of_the_refueling_plan_spinning
     </sql>
 
     <select id="selectDetailsOfTheRefuelingPlanSpinningList" parameterType="com.zkqy.business.domain.DetailsOfTheRefuelingPlanSpinning" resultMap="DetailsOfTheRefuelingPlanSpinningResult">
         <include refid="selectDetailsOfTheRefuelingPlanSpinningVo"/>
-        <where>  
+        <where>
             <if test="timestampRandomCode != null  and timestampRandomCode != ''"> and timestamp_random_code = #{timestampRandomCode}</if>
             <if test="macId != null  and machineId != ''"> and mac_id = #{macId}</if>
             <if test="machineId != null  and machineId != ''"> and machine_id = #{machineId}</if>
@@ -63,7 +62,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and plan_status != 3
         </where>
     </select>
-    
+
     <select id="selectDetailsOfTheRefuelingPlanSpinningById" parameterType="Long" resultMap="DetailsOfTheRefuelingPlanSpinningResult">
         <include refid="selectDetailsOfTheRefuelingPlanSpinningVo"/>
         where id = #{id}
@@ -255,4 +254,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </trim>
         </foreach>
     </insert>
-</mapper>
+</mapper>

+ 13 - 1
zkqy-custom-business/src/main/resources/mapper/business/ProductInventoryMapper.xml

@@ -297,6 +297,18 @@
         <if test="inventoryType != null and inventoryType != ''">and inventory_type = #{inventoryType}</if>
     </select>
 
+    <select id="oldselectProductInventoryByLotNumAndProductIdJoinProduction" resultType="com.zkqy.business.domain.ProductInventory">
+        select pi.*,p.product_name from {DBNAME}.product_inventory as pi
+                 left join {DBNAME}.production as p
+                 on  p.id=pi.product_id
+        where pi.del_flag = '0'
+        <if test="lotNum != null and lotNum != '' ">and pi.lot_num = #{lotNum}</if>
+        <if test="productId != null">and pi.product_id = #{productId}</if>
+        <if test="productColour != null and productColour != ''">and pi.product_colour = #{productColour}  </if>
+        <if test="inventoryType != null and inventoryType != ''">and pi.inventory_type = #{inventoryType}</if>
+    </select>
+
+
     <select id="selectComprehensiveInventoryList" resultType="com.zkqy.business.domain.vo.ProductCodeListVO">
         SELECT
         pi.product_id as productId,
@@ -461,4 +473,4 @@
 
     </select>
 
-</mapper>
+</mapper>

+ 2 - 2
zkqy-custom-business/src/main/resources/mapper/business/ProductOutboundRecordMapper.xml

@@ -351,8 +351,8 @@
         r.production_date,
         r.remark,
         r.box_num,
-        r.gross_weight,
-        r.suttle
+        ROUND(r.gross_weight, 2) as gross_weight,
+        ROUND(r.suttle, 2) as suttle
         FROM
         {DBNAME}.product_outbound_record r
         LEFT JOIN {DBNAME}.production p ON r.product_id = p.id

+ 5 - 5
zkqy-custom-business/src/main/resources/mapper/business/ProductionLineMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zkqy.business.mapper.ProductionLineMapper">
-    
+
     <resultMap type="com.zkqy.business.domain.ProductionLine" id="ProductionLineResult">
         <result property="id"    column="id"    />
         <result property="productionLineNo"    column="production_line_no"    />
@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectProductionLineVo">
-        select id, production_line_no, production_line_name, production_line_department, production_line_workshop, remark, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag, data_approval_status, process_key, task_process_key, task_node_key,sort from {DBNAME}.production_line
+        select id, production_line_no, production_line_name, production_line_department, production_line_workshop, remark, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag, data_approval_status, process_key, task_process_key, task_node_key,sort from huaxian.production_line
     </sql>
 
     <select id="selectProductionLineList" parameterType="com.zkqy.business.domain.ProductionLine" resultMap="ProductionLineResult">
@@ -44,12 +44,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="taskNodeKey != null  and taskNodeKey != ''"> and task_node_key = #{taskNodeKey}</if>
         order by sort asc
     </select>
-    
+
     <select id="selectProductionLineById" parameterType="Long" resultMap="ProductionLineResult">
         <include refid="selectProductionLineVo"/>
         where id = #{id}
     </select>
-        
+
     <insert id="insertProductionLine" parameterType="com.zkqy.business.domain.ProductionLine" useGeneratedKeys="true" keyProperty="id">
         insert into {DBNAME}.production_line
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -123,4 +123,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
-</mapper>
+</mapper>

+ 6 - 6
zkqy-custom-business/src/main/resources/mapper/business/SaleProductsMapper.xml

@@ -141,11 +141,11 @@
         sp.*,cs.custom_name,pd.product_specifications,sp.colours,
         pl.production_line_no as ccc
         FROM
-        {DBNAME}.sale_products AS sp
-        INNER JOIN {DBNAME}.sale_order AS so ON sp.sale_order_no = so.sale_no
-        Inner Join {DBNAME}.customer as cs ON so.sale_custom_no= cs.custom_no
-        inner join {DBNAME}.production as pd on sp.product_no= pd.product_no
-        left join {DBNAME}.production_line as pl on sp.production_line_no=pl.id
+        huaxian.sale_products AS sp
+        INNER JOIN huaxian.sale_order AS so ON sp.sale_order_no = so.sale_no
+        Inner Join huaxian.customer as cs ON so.sale_custom_no= cs.custom_no
+        inner join huaxian.production as pd on sp.product_no= pd.product_no
+        left join huaxian.production_line as pl on sp.production_line_no=pl.id
         where sp.del_flag = '0' and cs.del_flag = '0'  AND sp.product_number > 0.0
         AND so.order_type = 2 and so.`status`in (3,4) and sp.`status` in (3,4,6)
         <if test="saleProductNo != null  and saleProductNo != ''">and sale_product_no = #{saleProductNo}</if>
@@ -721,4 +721,4 @@
         <if test="id != null">and id=#{id}</if>
     </update>
 
-</mapper>
+</mapper>

+ 23 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/EntryIds.java

@@ -0,0 +1,23 @@
+package com.zkqy.amichi.bean;
+
+import java.util.List;
+
+public class EntryIds {
+    private List<Integer> FEntity;
+
+    // Getter 和 Setter
+    public List<Integer> getFEntity() {
+        return FEntity;
+    }
+
+    public void setFEntity(List<Integer> FEntity) {
+        this.FEntity = FEntity;
+    }
+
+    @Override
+    public String toString() {
+        return "EntryIds{" +
+                "FEntity=" + FEntity +
+                '}';
+    }
+}

+ 66 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResponseStatus.java

@@ -0,0 +1,66 @@
+package com.zkqy.amichi.bean;
+
+import com.kingdee.bos.webapi.entity.SuccessEntity;
+
+import java.util.List;
+
+public class ResponseStatus {
+    private boolean IsSuccess;
+    private List<Object> Errors;
+    private List<SuccessEntity> SuccessEntitys;
+    private List<Object> SuccessMessages;
+    private int MsgCode;
+
+    // Getter 和 Setter
+    public boolean isSuccess() {
+        return IsSuccess;
+    }
+
+    public void setSuccess(boolean success) {
+        IsSuccess = success;
+    }
+
+    public List<Object> getErrors() {
+        return Errors;
+    }
+
+    public void setErrors(List<Object> errors) {
+        Errors = errors;
+    }
+
+    public List<SuccessEntity> getSuccessEntitys() {
+        return SuccessEntitys;
+    }
+
+    public void setSuccessEntitys(List<SuccessEntity> successEntitys) {
+        SuccessEntitys = successEntitys;
+    }
+
+    public List<Object> getSuccessMessages() {
+        return SuccessMessages;
+    }
+
+    public void setSuccessMessages(List<Object> successMessages) {
+        SuccessMessages = successMessages;
+    }
+
+    public int getMsgCode() {
+        return MsgCode;
+    }
+
+    public void setMsgCode(int msgCode) {
+        MsgCode = msgCode;
+    }
+
+    @Override
+    public String toString() {
+        return "ResponseStatus{" +
+                "IsSuccess=" + IsSuccess +
+                ", Errors=" + Errors +
+                ", SuccessEntitys=" + SuccessEntitys +
+                ", SuccessMessages=" + SuccessMessages +
+                ", MsgCode=" + MsgCode +
+                '}';
+    }
+
+}

+ 31 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResultData.java

@@ -0,0 +1,31 @@
+package com.zkqy.amichi.bean;
+
+public class ResultData {
+    private ResponseStatus ResponseStatus;
+    private ResponseStatus ConvertResponseStatus;
+
+    // Getter 和 Setter
+    public ResponseStatus getResponseStatus() {
+        return ResponseStatus;
+    }
+
+    public void setResponseStatus(ResponseStatus responseStatus) {
+        ResponseStatus = responseStatus;
+    }
+
+    public ResponseStatus getConvertResponseStatus() {
+        return ConvertResponseStatus;
+    }
+
+    public void setConvertResponseStatus(ResponseStatus convertResponseStatus) {
+        ConvertResponseStatus = convertResponseStatus;
+    }
+
+    @Override
+    public String toString() {
+        return "ResultData{" +
+                "ResponseStatus=" + ResponseStatus +
+                ", ConvertResponseStatus=" + ConvertResponseStatus +
+                '}';
+    }
+}

+ 21 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/ResultWrapper.java

@@ -0,0 +1,21 @@
+package com.zkqy.amichi.bean;
+
+public class ResultWrapper {
+    private ResultData Result;
+
+    // Getter 和 Setter
+    public ResultData getResult() {
+        return Result;
+    }
+
+    public void setResult(ResultData result) {
+        Result = result;
+    }
+
+    @Override
+    public String toString() {
+        return "ResultWrapper{" +
+                "Result=" + Result +
+                '}';
+    }
+}

+ 51 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/bean/SuccessEntity.java

@@ -0,0 +1,51 @@
+package com.zkqy.amichi.bean;
+
+public class SuccessEntity {
+    private int Id;
+    private String Number;
+    private int DIndex;
+    private EntryIds EntryIds;
+
+    // Getter 和 Setter
+    public int getId() {
+        return Id;
+    }
+
+    public void setId(int id) {
+        Id = id;
+    }
+
+    public String getNumber() {
+        return Number;
+    }
+
+    public void setNumber(String number) {
+        Number = number;
+    }
+
+    public int getDIndex() {
+        return DIndex;
+    }
+
+    public void setDIndex(int DIndex) {
+        this.DIndex = DIndex;
+    }
+
+    public EntryIds getEntryIds() {
+        return EntryIds;
+    }
+
+    public void setEntryIds(EntryIds entryIds) {
+        EntryIds = entryIds;
+    }
+
+    @Override
+    public String toString() {
+        return "SuccessEntity{" +
+                "Id=" + Id +
+                ", Number='" + Number + '\'' +
+                ", DIndex=" + DIndex +
+                ", EntryIds=" + EntryIds +
+                '}';
+    }
+}

+ 3040 - 0
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl (2).javabak

@@ -0,0 +1,3040 @@
+package com.zkqy.amichi.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
+import cn.hutool.crypto.symmetric.SymmetricCrypto;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.zkqy.amichi.domain.*;
+import com.zkqy.amichi.domain.vo.ScanStatistics;
+import com.zkqy.amichi.domain.vo.StationProductScanningRingVo;
+import com.zkqy.amichi.jd.domain.JdProductionOrder;
+import com.zkqy.amichi.jd.domain.MaterialRetentionLogVo;
+import com.zkqy.amichi.mapper.*;
+import com.zkqy.amichi.service.IStationInformationService;
+import com.zkqy.amichi.service.RkService;
+import com.zkqy.amichi.utils.WarehouseEntryNumberGenerator;
+import com.zkqy.common.core.domain.entity.SysTenant;
+import com.zkqy.common.utils.DateUtils;
+import com.zkqy.common.utils.StringUtils;
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteNodeLog;
+import com.zkqy.execution.produce.dispersed.entity.BpmExecuteProcess;
+import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteNodeLogMapper;
+import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteProcessMapper;
+import com.zkqy.framework.web.service.SysLoginService;
+import com.zkqy.system.mapper.SysDictDataMapper;
+import com.zkqy.system.mapper.SysTenantMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+
+/**
+ * 工位信息Service业务层处理
+ *
+ * @author zkqy
+ * @date 2024-08-20
+ */
+@Service
+public class StationInformationServiceImpl implements IStationInformationService
+{
+    @Autowired
+    private StationInformationMapper stationInformationMapper;
+
+    @Autowired
+    private ReportInformationSheetMapper reportInformationSheetMapper;
+
+    @Autowired
+    private ExceptionReportInformationSheetMapper exceptionReportInformationSheetMapper;
+
+    @Autowired
+    private  ProductionPlanningManagementMapper productionPlanningManagementMapper;
+
+    @Autowired
+    private BpmExecuteProcessMapper bpmExecuteProcessMapper;
+
+    @Autowired
+    private BpmExecuteNodeLogMapper  bpmExecuteNodeLogMapper;
+
+    @Autowired
+    private  PlanTaskDetailsServiceImpl planTaskDetailsService;
+
+    @Autowired
+    private  ProductionCardFlowMapper productionCardFlowMapper;
+
+    @Autowired
+    private RingScanInformationMapper ringScanInformationMapper;
+
+    @Autowired
+    private  TerminalInformationMapper terminalInformationMapper;
+
+    @Autowired
+    private  MaterialRetentionLogMapper materialRetentionLogMapper;
+
+    @Autowired
+    private  RingScanInformationFirstMapper ringScanInformationFirstMapper;
+
+    @Autowired
+    private  RingTerminalMapper ringTerminalMapper;
+
+    @Autowired
+    private  RingScanInformationProdOrderScanningMapper prodOrderScanningMapper;
+
+    @Autowired
+    private  PlanTaskDetailsMapper planTaskDetailsMapper;
+
+    @Autowired
+    ProcedureListErpMapper procedureListErpMapper;
+
+    @Autowired
+    ProcedureListMapper procedureListMapper;
+
+    @Autowired
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Value("classpath:processReport.json")
+    private Resource processReport;
+
+
+    @Value("classpath:storage.json")
+    private Resource storage;
+
+    @Autowired
+    SysDictDataMapper dictDataMapper;
+
+
+    @Autowired
+    WarehouseEntryNumberGenerator warehouseEntryNumberGenerator;
+
+
+    @Autowired
+    ProductionReportingRecordMapper productionReportingRecordMapper;
+
+    /**
+     * 查询工位信息
+     * @param id 工位信息主键
+     * @return 工位信息
+     */
+    @Override
+    public StationInformation selectStationInformationById(Long id)
+    {
+        return stationInformationMapper.selectStationInformationById(id);
+    }
+
+    /**
+     * 查询工位信息列表
+     *
+     * @param stationInformation 工位信息
+     * @return 工位信息
+     */
+    @Override
+    public List<StationInformation> selectStationInformationList(StationInformation stationInformation)
+    {
+        return stationInformationMapper.selectStationInformationList(stationInformation);
+    }
+
+    /**
+     * 新增工位信息
+     *
+     * @param stationInformation 工位信息
+     * @return 结果
+     */
+    @Override
+    public int insertStationInformation(StationInformation stationInformation)
+    {
+        stationInformation.setCreateTime(DateUtils.getNowDate());
+        return stationInformationMapper.insertStationInformation(stationInformation);
+    }
+
+    /**
+     * 修改工位信息
+     *
+     * @param stationInformation 工位信息
+     * @return 结果
+     */
+    @Override
+    public int updateStationInformation(StationInformation stationInformation)
+    {
+        stationInformation.setUpdateTime(DateUtils.getNowDate());
+        return stationInformationMapper.updateStationInformation(stationInformation);
+    }
+
+    /**
+     * 批量删除工位信息
+     *
+     * @param ids 需要删除的工位信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteStationInformationByIds(Long[] ids)
+    {
+        return stationInformationMapper.deleteStationInformationByIds(ids);
+    }
+
+    /**
+     * 删除工位信息信息
+     *
+     * @param id 工位信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteStationInformationById(Long id)
+    {
+        return stationInformationMapper.deleteStationInformationById(id);
+    }
+
+    @Autowired
+    private SysLoginService loginService;
+
+    @Autowired
+    private  SysTenantMapper sysTenantMapper;
+    /**
+     * 手持扫描真实逻辑
+     * @param contentString
+     * @return
+     */
+    @Override
+    @Transactional
+    public String stationProductScanningTwo2(String contentString) throws Exception {
+        //abc
+        SysTenant sysTenant = sysTenantMapper.selectSysTenantByTenantId(216L);
+        //检查租户过期时间
+        if (sysTenant.getTenantExpirationTime() == null || sysTenant.getTenantExpirationTime().isEmpty()) {
+            return "未激活-系统-扫描失败-0-0-0-0";
+        }
+        SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.DES, "sgEsnN6QWq8W7j5H01020304".getBytes());
+        //当前时间
+        LocalDateTime now = LocalDateTime.now();
+        long nowSecond = now.toEpochSecond(ZoneOffset.ofHours(8));
+        //到期时间
+        String LastActiveTimeStr = symmetricCrypto.decryptStr(sysTenant.getTenantExpirationTime(), CharsetUtil.CHARSET_UTF_8);
+        LocalDateTime LastActiveDateTime = DateUtils.toLocalDateTime(LastActiveTimeStr, "yyyy-MM-dd HH:mm:ss");
+        long expirationTimeSecond = LastActiveDateTime.toEpochSecond(ZoneOffset.ofHours(8));
+        //计算时间戳
+        long difference = expirationTimeSecond - nowSecond; //相差的时间数 后边减前边
+        //如果是负数证明已经过期了
+        if (difference < 0) {
+            return "未激活-系统-扫描失败-0-0-0-0";
+        }
+        //扫描人员码信息
+        if(contentString.contains("scan@")){
+            //扫描标记替换为空
+            String replace = contentString.replace("scan@", "");
+            //首先把内容拆分下
+            String[] content = replace.split("&");
+            //人员信息
+            String personneString = content[0];
+            //更改当前人员的扫码信息
+            String[] personneList = personneString.split("#");
+            //设备编码信息
+            String sbMacAddress= content[1];
+            //更改当前工位码的设备信息
+            StationInformation stationInformation = new StationInformation();
+            stationInformation.setDeviceNumber(sbMacAddress);//设备编号
+            List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationListByDEviceNumber(stationInformation);
+
+            if (stationInformations.size()>0){
+                //重置以前的绑定(手持机在哪我就把那变成空)
+                stationInformationMapper.updateStationInformationDeviceNameAndBluetoothName(stationInformation);
+            }
+            stationInformation.setPersonnelId(personneList[0]);//员工id
+//            stationInformation.setPersonnelName(personneList[1]);//员工姓名
+            stationInformation.setUpdateTime(new Date()); //从新绑时间
+            int i = stationInformationMapper.updateStationInformationByUseIdAndUserName(stationInformation);
+            if(i>0){
+                System.out.println("手持设备绑定成功");
+            }
+            StationInformation stationInformation2 = new StationInformation();
+            stationInformation2.setPersonnelId(personneList[0]);//设备编号
+            List<StationInformation> stationInformations1 = stationInformationMapper.selectStationInformationList(stationInformation2);
+            if(stationInformations1.size()<=0){
+                return "当前工序没有此-人员-扫描失败-0-0-0-0";
+            }
+            System.out.println("工位:"+stationInformations1.get(0).getStationName()+"人员:"+stationInformations1.get(0).getPersonnelName());
+            return stationInformations1.get(0).getStationName()+"-"+stationInformations1.get(0).getPersonnelName()+"-手持设备绑定成功";
+        }else {
+            //产品编码&mac地址
+            String[] content = contentString.split("&");
+            //产品编码
+            String s1 = content[0];
+            //mac地址
+            String s2 = content[1];
+
+            //1、判断扫的是不是厂内流转卡
+            /*boolean fjqyD = stationProductScanningRingVo.getContentInformation().contains("D");
+            boolean fjqyZ = stationProductScanningRingVo.getContentInformation().contains("Z");
+            if(!fjqyD||!fjqyZ){return "请扫描相关二维码";}*/
+
+            //2、扫描间距判断
+            /* RingScanInformation ringScanInformationQuery=new RingScanInformation();
+            ringScanInformationQuery.setDeviceNumber(split[1]);//设备Mac地址
+            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+            if(ringScanInformations!=null){
+                //拿到上次扫描的时间
+                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+                //拿到当前系统时间
+                LocalDateTime now = LocalDateTime.now();
+                //计算两次时间的时间差
+                Duration duration = Duration.between(scanningTime1, now);
+                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+                //判断两次时间是否大于
+                if (isTwoMinutesPassed) {
+                  return "同一设备,两分钟之内不能重复扫描";
+                }
+            }*/
+
+            //扫码内容
+            RingScanInformation ringScanInformation=new RingScanInformation();
+            //扫描内容
+            ringScanInformation.setContentInformation(s1);
+            //当前时间
+            ringScanInformation.setScanningTime(LocalDateTime.now());
+            //mac地址
+            ringScanInformation.setDeviceNumber(s2);//mac地址
+
+
+
+
+            //4、查询当前机器绑定的工位信息和人信息
+            StationInformation terminalInformation=new StationInformation();
+            terminalInformation.setDeviceNumber(s2);//mac地址
+            List<StationInformation> stationInformations =
+                    stationInformationMapper.selectStationInformationListByDEviceNumber(terminalInformation);
+            if(stationInformations.size()>0){
+                ringScanInformation.setPersonnelName(stationInformations.get(0).getPersonnelName());//人员姓名
+                ringScanInformation.setProcess(stationInformations.get(0).getProcessId()); //工序id
+                ringScanInformation.setProcessName(stationInformations.get(0).getProcessName()); //工序名称
+                ringScanInformation.setStationId(stationInformations.get(0).getId().toString()); //工位id
+                ringScanInformation.setStationName(stationInformations.get(0).getStationName());//工位名称
+            }else {//当前没有绑定Mac地址直接返回
+                ringScanInformation.setExecutionMark("2");//成功
+                ringScanInformation.setExecutionMessage("未绑定-人员-扫描失败");
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+                return "未绑定-人员-扫描失败-0-0-0-0";
+            }
+            String nativeNumber="";
+            if(s1.contains("Z")){nativeNumber = s1.replace("Z", "");}
+            if(s1.contains("D")){nativeNumber=s1.replace("D","");}
+            if(StringUtils.isNotNull(nativeNumber)&&nativeNumber!=""){
+                //取值真实的扫描内容
+                ringScanInformation.setNativeNumbering(nativeNumber);
+            }else {
+                //扫描内容---直接就是产品码
+                ringScanInformation.setNativeNumbering(s1);
+            }
+            //根据扫描内容拿到生产订单号和订单号--查询流转卡序列号
+            ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+            productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
+            List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+            if(productionCardFlows.size()>0){
+                ProductionCardFlow productionCardFlow1 = productionCardFlows.get(0);
+                //需求单据号
+                ringScanInformation.setOrderNumber(productionCardFlow1.getProductionOrderListId());
+                //生产订单号
+                ringScanInformation.setProductionOrderNumber(productionCardFlow1.getDemandDocumentNumber());
+            }else {
+                System.out.println("erp未同步当前流转卡序列号");
+                ringScanInformation.setExecutionMark("2");//成功
+                ringScanInformation.setExecutionMessage("失败-未同步ERP");
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+                return stationInformations.get(0).getStationName()+"-"+stationInformations.get(0).getPersonnelName()+"-失败,未同步ERP-无-0-0-0";
+            }
+
+            //判断这个生产订单是否结案
+            String isJn="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FBillNo,FSerialNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FStatus\",\"Compare\":\"105\",\"Value\":\"6\",\"Right\":\"\",\"Logic\":0}," +
+                    "        {\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"67\",\"Value\":\""+ringScanInformation.getProductionOrderNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            K3CloudApi api = new K3CloudApi();
+            String jnIs = api.billQuery(isJn);
+            if (!jnIs.equals("[]")) {
+                System.out.println("该流转卡生产订单已结案");
+                ringScanInformation.setExecutionMark("2");//成功
+                ringScanInformation.setExecutionMessage("失败-已结案");
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+                //改变订单详情的状态
+                PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                planTaskDetails.setStatus("3");
+                planTaskDetails.setDemandDocument(ringScanInformation.getProductionOrderNumber());
+                int i = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                //返回失败信息
+                return stationInformations.get(0).getStationName()+"-"+stationInformations.get(0).getPersonnelName()+"-失败,已结案-无-0-0-0";
+            }
+            //验证重复扫描
+            RingScanInformation prodOrderScanning=new RingScanInformation();
+            prodOrderScanning.setContentInformation(s1);
+            prodOrderScanning.setProcessName(ringScanInformation.getProcessName());
+            List<RingScanInformation> ringScanInformations = ringScanInformationMapper.selectRingScanInformationListisNotNull(prodOrderScanning);
+            if(ringScanInformations.size()>0){
+                ringScanInformation.setExecutionMark("2");//成功
+                ringScanInformation.setExecutionMessage("重复扫描");
+                ringScanInformation.setOverNumber(ringScanInformations.get(0).getOverNumber());
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+                //查询订单号,订单总数量 完成数量,失败数量
+                //查询当前工位信息
+                ScanStatistics scanStatistics = ringScanInformationMapper.selectScanStatistics(ringScanInformation);
+                return stationInformations.get(0).getStationName()+"-"+stationInformations.get(0).getPersonnelName()+"-"+"重复扫描"+"-"
+                        +scanStatistics.getdOrder()+"-"+scanStatistics.getdCount()+"-"+scanStatistics.getDsCount()+"-"+scanStatistics.getDfCount();
+            }
+            //查询生产订单日志里有没有这个生产订单有就不添加了
+            RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+            ringScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+            List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+            if(ringScanInformationFirsts.size()<=0){
+                RingScanInformationFirst ringScanInformationFirst1=new RingScanInformationFirst();
+                ringScanInformationFirst1.setOrderNumber(ringScanInformation.getOrderNumber());//订单号
+                ringScanInformationFirst1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());//生产订单号
+                ringScanInformationFirst1.setStatus("1");
+                ringScanInformationFirst1.setStartTime(LocalDateTime.now());//开始时间
+
+                //有多少个序列号就是有多少台
+                ProductionCardFlow productionCardFlow2=new ProductionCardFlow();
+                productionCardFlow2.setProductionOrderListId(ringScanInformation.getOrderNumber());//订单号
+                List<ProductionCardFlow> productionCardFlows2 = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow2);
+                ringScanInformationFirst1.setTotalQuantity(String.valueOf(productionCardFlows2.size()));//订单的总数
+
+                //判断当前生产订单 到包装还是检验
+                PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                planTaskDetails.setDemandDocument(ringScanInformation.getProductionOrderNumber());
+                List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsService.selectPlanTaskDetailsList(planTaskDetails);
+
+                //解决老数据单据类型不存在的问题
+                if(planTaskDetails1.size()>0){
+                    //更新两个单位不存在的问题
+                    PlanTaskDetails planTaskDetails2 = planTaskDetails1.get(0);
+                    boolean present1 = Optional.ofNullable(planTaskDetails2.getfSNUnitID()).filter(a -> !a.isEmpty()).isPresent();
+                    boolean present2 = Optional.ofNullable(planTaskDetails2.getfBaseUnitId()).filter(a -> !a.isEmpty()).isPresent();
+                    //里边有一个是空的那么就更新下生产订单详情表信息
+                    if(ObjectUtil.isNull(planTaskDetails2.getfSNUnitID()) ||ObjectUtil.isNull(planTaskDetails2.getfBaseUnitId())){
+                        //金蝶工具key
+                        K3CloudApi api1 = new K3CloudApi();
+                        //定义查询条件
+                        //定义查询条件
+                        String query = "{\n" +
+                                "    \"FormId\": \"PRD_MO\",\n" +
+                                "    \"FieldKeys\": \"FUnitId.FNumber,FSNUnitID.FNumber,FBaseUnitId.FNumber\",\n" +
+                                "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"67\",\"Value\":\""+planTaskDetails2.getFbillno()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                                "    \"OrderString\": \"\",\n" +
+                                "    \"TopRowCount\": 0,\n" +
+                                "    \"StartRow\": 0,\n" +
+                                "    \"Limit\": 2000,\n" +
+                                "    \"SubSystemId\": \"\"\n" +
+                                "}";
+
+                        //查询结果
+                        String resultJson = api1.billQuery(query);
+                        //生产信息
+                        List<JdProductionOrder> jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                        //更新逻辑
+                        if (jdProductionOrders.size()>0) {
+                            PlanTaskDetails planTaskDetails3=new PlanTaskDetails();
+                            planTaskDetails3.setfSNUnitID(jdProductionOrders.get(0).getfSNUnitID());//序列号单位
+                            planTaskDetails3.setfBaseUnitId(jdProductionOrders.get(0).getfBaseUnitId());//基本单位
+                            planTaskDetails3.setId(planTaskDetails2.getId());//编号id
+                            int i = planTaskDetailsMapper.updatePlanTaskDetails(planTaskDetails3);
+                            System.out.println(i+"单位类型补充成功");
+                            //从新查类型
+                            planTaskDetails1 = planTaskDetailsService.selectPlanTaskDetailsList(planTaskDetails);
+                        }
+                    }
+                }
+
+                Double v = Double.parseDouble(planTaskDetails1.get(0).getQuantity());
+                Integer i1 = v.intValue();
+                ringScanInformationFirst1.setProductionOrderTotalQuantity(i1.toString());//生产订单的总数
+
+                if(planTaskDetails1.size()>0){
+                    PlanTaskDetails planTaskDetails2 = planTaskDetails1.get(0);
+                    String materialId = planTaskDetails2.getMaterialId();
+                    //逻辑走包装还是走检验
+                    if(materialId.startsWith("1")){// 成品检验
+                        ringScanInformationFirst1.setPackingOrInspection("1");//1开头的 成品检验, 入库
+                    }else if(materialId.startsWith("2")) { //试机检验
+                        ringScanInformationFirst1.setPackingOrInspection("2");//2试机检验,入库
+                    }
+                }
+
+                //扫一次产品记录一次
+                int i = ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst1);
+                //有可能订单数量就是一台,我扫一回订单就结束掉了
+
+                //这个订单,我直接扫一次,就扫一次,并且扫描的工序是成品检验或者试机检验,那我就进行报工
+                if(planTaskDetails1.size()>0){{
+                    PlanTaskDetails planTaskDetails2 = planTaskDetails1.get(0);
+                    String materialId = planTaskDetails2.getMaterialId();
+                    if(materialId.startsWith("1")&&ringScanInformation.getProcessName().equals("成品检验")){
+                        //更新成品检验(只扫一次也需要更新包装或者检验的数量)
+                        RingScanInformationFirst ringScanInformationFirstOne=new RingScanInformationFirst();
+                        ringScanInformationFirstOne.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                        List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirstOne);
+                        RingScanInformationFirst ringScanInformationFirstNumber = ringScanInformationFirsts1.get(0);
+                        RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getPackingQuantity(), ringScanInformation, "1");
+                        ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
+                        String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "3", ringScanInformation);//生产订单号,工序名
+                        if(aa.equals("工序汇报创建失败")){
+                            if(aa.contains("返还件退料套数小于累计汇报数")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                            }
+                            if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                            }
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-创建失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报提交失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-提交失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报审核失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-审核失败-扫描失败-0-0-0-0";
+                        }
+                    }else if(materialId.startsWith("2")&&ringScanInformation.getProcessName().equals("试机检验")) {
+
+                        //更新成品检验(只扫一次也需要更新包装或者检验的数量)
+                        RingScanInformationFirst ringScanInformationFirstOne=new RingScanInformationFirst();
+                        ringScanInformationFirstOne.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                        List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirstOne);
+                        RingScanInformationFirst ringScanInformationFirstNumber = ringScanInformationFirsts1.get(0);
+                        RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getPackingQuantity(), ringScanInformation, "1");
+                        ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
+                        String aa= generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(),ringScanInformation.getProcessName(),"4",ringScanInformation);//生产订单号,工序名
+                        if(aa.equals("工序汇报创建失败")){
+                            if(aa.contains("返还件退料套数小于累计汇报数")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                            }
+                            if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                            }
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-创建失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报提交失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-提交失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报审核失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-审核失败-扫描失败-0-0-0-0";
+                        }
+                    }
+                }}
+            }else {
+                //更新包装或者检验的数量
+                //拿到老的包装数量
+                RingScanInformationFirst ringScanInformationFirst1=new RingScanInformationFirst();
+                ringScanInformationFirst1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst1);
+                RingScanInformationFirst ringScanInformationFirstNumber = ringScanInformationFirsts1.get(0);
+                //判断当前生产订单 到包装还是检验
+                PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                planTaskDetails.setDemandDocument(ringScanInformation.getProductionOrderNumber());
+                List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsService.selectPlanTaskDetailsList(planTaskDetails);
+
+                //解决老数据单据类型不存在的问题
+                if(planTaskDetails1.size()>0){
+                    //更新两个单位不存在的问题
+                    PlanTaskDetails planTaskDetails2 = planTaskDetails1.get(0);
+                    //里边有一个是空的那么就更新下生产订单详情表信息
+                    if(ObjectUtil.isNull(planTaskDetails2.getfSNUnitID()) ||ObjectUtil.isNull(planTaskDetails2.getfBaseUnitId())){
+                        //金蝶工具key
+                        K3CloudApi api1 = new K3CloudApi();
+                        //定义查询条件
+                        String query = "{\n" +
+                                "    \"FormId\": \"PRD_MO\",\n" +
+                                "    \"FieldKeys\": \"FUnitId.FNumber,FSNUnitID.FNumber,FBaseUnitId.FNumber\",\n" +
+                                "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"67\",\"Value\":\""+planTaskDetails2.getFbillno()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                                "    \"OrderString\": \"\",\n" +
+                                "    \"TopRowCount\": 0,\n" +
+                                "    \"StartRow\": 0,\n" +
+                                "    \"Limit\": 2000,\n" +
+                                "    \"SubSystemId\": \"\"\n" +
+                                "}";
+
+                        //查询结果
+                        String resultJson = api1.billQuery(query);
+                        //生产信息
+                        List<JdProductionOrder> jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                        //更新逻辑
+                        if (jdProductionOrders.size()>0) {
+                            PlanTaskDetails planTaskDetails3=new PlanTaskDetails();
+                            planTaskDetails3.setfSNUnitID(jdProductionOrders.get(0).getfSNUnitID());//序列号单位
+                            planTaskDetails3.setfBaseUnitId(jdProductionOrders.get(0).getfBaseUnitId());//基本单位
+                            planTaskDetails3.setId(planTaskDetails2.getId());//编号id
+                            int i = planTaskDetailsMapper.updatePlanTaskDetails(planTaskDetails3);
+                            System.out.println(i+"单位类型补充成功");
+                            //从新查类型
+                            planTaskDetails1 = planTaskDetailsService.selectPlanTaskDetailsList(planTaskDetails);
+                        }
+                    }
+                }
+
+                if(planTaskDetails1.size()>0){
+                    PlanTaskDetails planTaskDetails2 = planTaskDetails1.get(0);
+                    String materialId = planTaskDetails2.getMaterialId();
+                    if(materialId.startsWith("1")&&ringScanInformation.getProcessName().equals("成品检验")){//1卡头并且当前工序未包装,扫描信息为,更新包装数量
+                        RingScanInformation ringScanInformation1=new RingScanInformation();
+                        ringScanInformation1.setNativeNumbering(ringScanInformation.getNativeNumbering());
+                        ringScanInformation1.setProcessName(ringScanInformation.getProcessName());//工序
+                        //有关于这个产品的扫描信息就不更新数量了
+                        List<RingScanInformation> ringScanInformations1 = ringScanInformationMapper.selectRingScanInformationList(ringScanInformation1);
+                        if(ringScanInformations1.size()<=0) {
+                            RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getPackingQuantity(), ringScanInformation, "1");
+                            ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
+                            //生产汇报  等于代表走工序汇报逻辑 1 和 2代表入的什么仓库(1:成品 2:利库)   3和4 代表走工序汇报逻辑(3:成品 4:利库)
+                            String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "3", ringScanInformation);//生产订单号,工序名
+                            if(aa.equals("工序汇报创建失败")){
+                                if(aa.contains("返还件退料套数小于累计汇报数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                                }
+                                if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                                }
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败-扫描失败-0-0-0-0";
+                            }
+                            if(aa.equals("工序汇报提交失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-提交失败-扫描失败-0-0-0-0";
+                            }
+                            if(aa.equals("工序汇报审核失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-审核失败-扫描失败-0-0-0-0";
+                            }
+                        }
+                    }else if(materialId.startsWith("2")&&ringScanInformation.getProcessName().equals("试机检验")) {
+                        //有关于这个产品的扫描信息就不更新数量了
+                        RingScanInformation ringScanInformation1=new RingScanInformation();
+                        ringScanInformation1.setNativeNumbering(ringScanInformation.getNativeNumbering());
+                        ringScanInformation1.setProcessName(ringScanInformation.getProcessName());//工序
+                        List<RingScanInformation> ringScanInformations1 = ringScanInformationMapper.selectRingScanInformationList(ringScanInformation1);
+                        if(ringScanInformations1.size()<=0){
+                            RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getInspectionQuantity(), ringScanInformation,"2");
+                            ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
+                            //生产汇报
+                            //等于代表走工序汇报逻辑 1 和 2代表入的什么仓库(1:成品 2:利库)   3和4 代表走工序汇报逻辑(3:成品 4:利库)
+                            String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "4", ringScanInformation);//生产订单号,工序名
+                            if(aa.equals("工序汇报创建失败")){
+                                if(aa.contains("返还件退料套数小于累计汇报数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                                }
+                                if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                                }
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败-扫描失败-0-0-0-0";
+                            }
+                            if(aa.equals("工序汇报提交失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-提交失败-扫描失败-0-0-0-0";
+                            }
+                            if(aa.equals("工序汇报审核失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-审核失败-扫描失败-0-0-0-0";
+                            }
+                        }
+                    }
+                    else if(materialId.startsWith("1")&&ringScanInformation.getProcessName().equals("入库")){//1开头产品的入库逻辑
+                        RingScanInformation ringScanInformation1=new RingScanInformation();
+                        ringScanInformation1.setNativeNumbering(ringScanInformation.getNativeNumbering());
+                        ringScanInformation1.setProcessName(ringScanInformation.getProcessName());//工序
+                        //有关于这个产品的扫描信息就不更新数量了
+                        List<RingScanInformation> ringScanInformations1 = ringScanInformationMapper.selectRingScanInformationList(ringScanInformation1);
+                        if(ringScanInformations1.size()<=0) {
+                            //入库
+                            String s = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "1", ringScanInformation);
+                            if(s.contains("未查询到生产汇报信息")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "未查询到-生产汇报信息-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单创建失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-"+("创建失败(车间仓物料不足)")+"-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单提交失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-提交失败-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单审核失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-审核失败-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("有问题请联系管理员")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                            }
+                        }
+                    }else if(materialId.startsWith("2")&&ringScanInformation.getProcessName().equals("入库")) {  //2开头产品的入库逻辑
+                        //有关于这个产品的扫描信息就不更新数量了
+                        RingScanInformation ringScanInformation1=new RingScanInformation();
+                        ringScanInformation1.setNativeNumbering(ringScanInformation.getNativeNumbering());
+                        ringScanInformation1.setProcessName(ringScanInformation.getProcessName());//工序
+                        List<RingScanInformation> ringScanInformations1 = ringScanInformationMapper.selectRingScanInformationList(ringScanInformation1);
+                        if(ringScanInformations1.size()<=0){
+                            //入库
+                            String s = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "2", ringScanInformation);//生产订单号,工序名
+                            if(s.contains("未查询到生产汇报信息")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "未查询到-生产汇报信息-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单创建失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-"+s+"-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单提交失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-提交失败-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("入库单审核失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "入库单-审核失败-扫描失败-0-0-0-0";
+                            }
+                            if(s.contains("有问题请联系管理员")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                            }
+                        }
+                    }
+                }
+            }
+            //插入扫描日志前判定当前销售订单是否变为生成完成
+            PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+            planTaskDetails.setStatus("1");//状态
+            planTaskDetails.setDemandDocument(ringScanInformation.getProductionOrderNumber());//生产订单
+            List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetails);
+            if(planTaskDetails1.size()<=0){
+                //生产订单状态
+                RingScanInformationFirst ringScanInformationFirst1=new RingScanInformationFirst();
+                ringScanInformationFirst1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                ringScanInformationFirst1.setStatus("2");
+                ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(ringScanInformationFirst1);
+            }
+            ProductionPlanningManagement productionPlanningManagement=new ProductionPlanningManagement();
+            productionPlanningManagement.setOrderNumber(ringScanInformation.getOrderNumber());
+            List<ProductionPlanningManagement> productionPlanningManagements = productionPlanningManagementMapper
+                    .selectProductionPlanningManagementList(productionPlanningManagement);
+            if(productionPlanningManagements.size()>0){
+                ProductionPlanningManagement productionPlanningManagement1 = productionPlanningManagements.get(0);
+                //订单号
+                PlanTaskDetails planTaskDetailsTwo=new PlanTaskDetails();
+                planTaskDetailsTwo.setPlanId(productionPlanningManagement1.getId());//生产订单
+                planTaskDetailsTwo.setStatus("1");
+                List<PlanTaskDetails> planTaskDetailsPlan = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetailsTwo);
+                if(planTaskDetailsPlan.size()<=0){
+                    PlanTaskDetails planTaskDetails2=new PlanTaskDetails();
+                    planTaskDetails2.setDemandDocument(ringScanInformation.getProductionOrderNumber());//生产订单
+                    List<PlanTaskDetails> planTaskDetails2s = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetails2);
+                    //改订单状态
+                    ProductionPlanningManagement productionPlanningManagementUpdate=new ProductionPlanningManagement();
+                    productionPlanningManagementUpdate.setOrderNumber(ringScanInformation.getOrderNumber());
+                    productionPlanningManagementUpdate.setTaskStatus("3");
+                    productionPlanningManagementUpdate.setId(planTaskDetails2s.get(0).getPlanId());
+                    productionPlanningManagementMapper.updateProductionPlanningManagement(productionPlanningManagementUpdate);
+                }
+            }
+            if(ringScanInformation.getProcessName().equals("焊接")){
+                String contentInformation = ringScanInformation.getContentInformation();
+                if(contentInformation.contains("D")){
+                    RingScanInformation ringScanInformation1=new RingScanInformation();
+                    ringScanInformation1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformation1.setProcessName("焊接D");
+                    ringScanInformation1.setOrderNumber(ringScanInformation.getOrderNumber());
+                    String s = ringScanInformationMapper.selectRingScanInformationListLike(ringScanInformation1);
+                    int i = Integer.parseInt(s);
+                    int ss=i+1;
+                    ringScanInformation.setOverNumber(String.valueOf(ss));
+                }else if(contentInformation.contains("Z")){
+                    RingScanInformation ringScanInformation1=new RingScanInformation();
+                    ringScanInformation1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformation1.setProcessName("焊接Z");
+                    ringScanInformation1.setOrderNumber(ringScanInformation.getOrderNumber());
+                    String s = ringScanInformationMapper.selectRingScanInformationListLike(ringScanInformation1);
+                    int i = Integer.parseInt(s);
+                    int ss=i+1;
+                    ringScanInformation.setOverNumber(String.valueOf(ss));
+                }
+            }else {
+                String s = ringScanInformationMapper.selectRingScanInformationListLike(ringScanInformation);
+                int i = Integer.parseInt(s);
+                int ss=i+1;
+                ringScanInformation.setOverNumber(String.valueOf(ss));
+            }
+            //插入扫描日志信息
+            ringScanInformation.setExecutionMark("1");
+            ringScanInformation.setExecutionMessage("扫描成功");
+            if(ringScanInformation.getProcessName().equals("白坯检验")){
+                RingScanInformation ringScanInformation1=new RingScanInformation();
+                BeanUtils.copyProperties(ringScanInformation,ringScanInformation1);
+                ringScanInformation1.setProcessName("浸漆");
+                ringScanInformation1.setProcess("32");
+                ringScanInformation1.setStationId("0");
+                ringScanInformation1.setStationName("浸漆");
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation1);
+            }
+            if(ringScanInformation.getProcessName().equals("成品检验")){
+                RingScanInformation ringScanInformation1=new RingScanInformation();
+                BeanUtils.copyProperties(ringScanInformation,ringScanInformation1);
+                ringScanInformation1.setProcessName("包装");
+                ringScanInformation1.setProcess("28");
+                ringScanInformation1.setStationId("0");
+                ringScanInformation1.setStationName("包装工位");
+
+                int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation1);
+            }
+            int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+
+
+            //查询当前工位信息
+            ScanStatistics scanStatistics = null;
+            RingScanInformation ringScanInformation1=new RingScanInformation();
+            ringScanInformation1.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+            ringScanInformation1.setProcessName(ringScanInformation.getProcessName());
+            if(ringScanInformation.getProcessName().equals("焊接")) {
+                if (ringScanInformation.getContentInformation().contains("D")) {
+                    ringScanInformation1.setProcessName("焊接D");
+                } else {
+                    ringScanInformation1.setProcessName("焊接Z");
+                }
+            }
+            scanStatistics = ringScanInformationMapper.selectScanStatistics(ringScanInformation1);
+            //记录扫迈欧
+            return ringScanInformation.getStationName()+"-"+ringScanInformation.getPersonnelName()+"-"+"扫描成功"+"-"+
+                    scanStatistics.getdOrder()+"-"+scanStatistics.getdCount()+"-"+scanStatistics.getDsCount()+"-"+scanStatistics.getDfCount();
+        }
+    }
+
+
+
+    /**
+     * 扣料
+     * @param orderNumber
+     * @param productNumber
+     * @param gxm
+     * @param lxkNumber
+     * @return
+     */
+    public  String   sweepingMaterial2(String orderNumber,String productNumber,String gxm,String lxkNumber){
+        if(gxm.equals("入库")){
+            return "入库不扣料";
+        }
+        ProcedureList procedureList=new ProcedureList();
+        procedureList.setProcedurName(gxm);
+        List<ProcedureList> procedureLists = procedureListMapper.selectProcedureListList(procedureList);
+        if(procedureLists.size()<=0){
+            return "此工序不存在";
+        }
+        //输入产品编号查询,
+        MaterialRetentionLog materialRetentionLog=new MaterialRetentionLog();
+        materialRetentionLog.setFlowSequenceNumber(productNumber);
+        materialRetentionLog.setProcess(gxm);
+        List<MaterialRetentionLog> materialRetentionLogs = materialRetentionLogMapper.selectMaterialRetentionLogList(materialRetentionLog);
+        if(materialRetentionLogs.size()>0){
+            return "此料已扣除";
+        }
+        //查询MES对应的ERP
+        ProcedureListErp procedureListErp=new ProcedureListErp();
+        procedureListErp.setErpJobName(procedureLists.get(0).getId().toString());
+        List<ProcedureListErp> procedureListErps = procedureListErpMapper.selectProcedureListErpList(procedureListErp);
+
+        if(gxm.equals("焊接")){
+            RingScanInformation ringScanInformation=new RingScanInformation();
+            ringScanInformation.setProcessName(gxm);//工序
+            ringScanInformation.setProductionOrderNumber(productNumber); //生产订单
+            ringScanInformation.setNativeNumbering(lxkNumber);//流转卡
+            List<RingScanInformation> ringScanInformations = ringScanInformationMapper.selectRingScanInformationList(ringScanInformation);
+            //当前流转卡在当前工序可以的话就进行扣料处理
+            // 人员id,产品id
+            if(ringScanInformations.size()==2){
+                //查询条件
+                String queryString ="{\n" +
+                        "    \"FormId\": \"PRD_MO\",\n" +
+                        "    \"FieldKeys\": \"FBillNo\",\n" +
+                        "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"67\",\"Value\":\""+lxkNumber+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                        "    \"OrderString\": \"\",\n" +
+                        "    \"TopRowCount\": 0,\n" +
+                        "    \"StartRow\": 0,\n" +
+                        "    \"Limit\": 2000,\n" +
+                        "    \"SubSystemId\": \"\"\n" +
+                        "}";
+                //查询条件
+                Map<String, Object> map = JSON.parseObject(queryString, Map.class);
+
+                K3CloudApi api = new K3CloudApi();
+                List<JdProductionOrder> jdProductionOrders;
+                try {
+                    String resultJson = api.billQuery(JSON.toJSONString(map));
+                    //如果查询的数据为空
+                    if(resultJson.equals("[]")){
+                        return "此工序不存在扣料信息";
+                    }else{
+                        //转换实体类对象
+                        jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                        //按照流转卡把信息查询出来了
+                        if(jdProductionOrders.size()>0) {
+                            //单据编号
+                            String documentNumber = jdProductionOrders.get(0).getDocumentNumber();
+                            //根据生产订单号查询生产用料清单
+                            String productionMaterialsListQuery="{\n" +
+                                    "    \"FormId\": \"PRD_PPBOM\",\n" +
+                                    "    \"FieldKeys\": \"FMaterialID.FNumber,FMaterialName,FMaterialModel,FMaterialModel2,FDescription,FMaterialID2.FNumber,FMaterialName1,FMaterialModel1,FUnitID2.FName,FMustQty,FMEMO1,FNumerator,FMaterialType,FProcessID.FName\",\n" +
+                                    "    \"FilterString\": [],\n" +
+                                    "    \"OrderString\": \"\",\n" +
+                                    "    \"TopRowCount\": 0,\n" +
+                                    "    \"StartRow\": 0,\n" +
+                                    "    \"Limit\": 2000,\n" +
+                                    "    \"SubSystemId\": \"\"\n" +
+                                    "}";
+                            //查询生产用料清单
+                            Map<String, Object> map2 = JSON.parseObject(productionMaterialsListQuery, Map.class);
+                            String filterString = map2.get("FilterString").toString();
+                            List<Map> mapList = JSON.parseArray(filterString, Map.class);
+                            if(procedureListErps.size()>0){
+                                //循环条件
+                                procedureListErps.forEach(map1 -> {
+                                    String ddh="{\"Left\":\"\",\"FieldName\":\"FMOBillNO\",\"Compare\":\"67\",\"Value\":\"11\",\"Right\":\"\",\"Logic\":0}";
+                                    String mapTj="{\"Left\":\"\",\"FieldName\":\"FProcessID.FName\",\"Compare\":\"67\",\"Value\":\"111\",\"Right\":\"\",\"Logic\":1}";
+                                    Map mapObj = JSONObject.parseObject(mapTj, Map.class);
+                                    Map ddhObj = JSONObject.parseObject(ddh, Map.class);
+                                    ddhObj.put("Value", productNumber);
+                                    mapObj.put("Value", map1.getProcedurName());
+                                    mapList.add(ddhObj);
+                                    mapList.add(mapObj);
+                                });
+
+                                map2.put("FilterString", mapList);//从新绑定条件
+
+                                //生产用料清单结果
+                                String resultJsonJG = api.billQuery(JSON.toJSONString(map2));
+                                //json转Java实体类对象
+                                List<MaterialRetentionLogVo> materialRetentionLogVos = JSON.parseArray(resultJsonJG, MaterialRetentionLogVo.class);
+                                //赋值一些默认值
+                                List<MaterialRetentionLogVo> collect = materialRetentionLogVos.parallelStream().map(item -> {
+                                    item.setCkNumber("CK005");
+                                    item.setDeliveryWarehouse("车间仓");
+                                    item.setFlowSequenceNumber(lxkNumber);//流转序列号
+                                    item.setMesprocess(gxm);
+                                    item.setOrderNumber(orderNumber);
+                                    item.setProductionOrderNumber(productNumber);
+                                    item.setCreateTime(new Date());
+                                    return item;
+                                }).collect(Collectors.toList());
+                                //分子数量基本的扣料单位
+                                int i = materialRetentionLogMapper.insertMaterialRetentionLogBatch(collect);
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    System.out.println(e);
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                }
+                return productNumber+gxm+"扣料成功";
+            }else {
+                return productNumber+gxm+"未完不扣料";
+            }
+        }else {
+            //查询条件
+            String queryString ="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FBillNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"67\",\"Value\":\""+lxkNumber+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            //查询条件
+            Map<String, Object> map = JSON.parseObject(queryString, Map.class);
+            K3CloudApi api = new K3CloudApi();
+            List<JdProductionOrder> jdProductionOrders;
+            try {
+                String resultJson = api.billQuery(JSON.toJSONString(map));
+                //如果查询的数据为空
+                if(resultJson==""||resultJson=="[]"){
+                    return "不能添加这次扫描记录";
+                }else{
+                    //转换实体类对象
+                    jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                    //按照流转卡把信息查询出来了
+                    if(jdProductionOrders.size()>0) {
+                        //单据编号
+                        String documentNumber = jdProductionOrders.get(0).getDocumentNumber();
+                        //这个生产订单生产的数量
+                        //String quantity = jdProductionOrders.get(0).getQuantity();
+                        //根据生产订单号查询生产用料清单
+                        String productionMaterialsListQuery="{\n" +
+                                "    \"FormId\": \"PRD_PPBOM\",\n" +
+                                "    \"FieldKeys\": \"FMaterialID.FNumber,FMaterialName,FMaterialModel,FMaterialModel2,FDescription,FMaterialID2.FNumber,FMaterialName1,FMaterialModel1,FUnitID2.FName,FMustQty,FMEMO1,FNumerator,FMaterialType,FProcessID.FName\",\n" +
+                                "    \"FilterString\": [],\n" +
+                                "    \"OrderString\": \"\",\n" +
+                                "    \"TopRowCount\": 0,\n" +
+                                "    \"StartRow\": 0,\n" +
+                                "    \"Limit\": 2000,\n" +
+                                "    \"SubSystemId\": \"\"\n" +
+                                "}";
+                        //查询生产用料清单
+                        Map<String, Object> map2 = JSON.parseObject(productionMaterialsListQuery, Map.class);
+
+                        String filterString = map2.get("FilterString").toString();
+
+                        List<Map> mapList = JSON.parseArray(filterString, Map.class);
+                        if(procedureListErps.size()>0){
+                            //循环条件
+                            procedureListErps.forEach(map1 -> {
+                                String ddh="{\"Left\":\"\",\"FieldName\":\"FMOBillNO\",\"Compare\":\"67\",\"Value\":\"11\",\"Right\":\"\",\"Logic\":0}";
+                                String mapTj="{\"Left\":\"\",\"FieldName\":\"FProcessID.FName\",\"Compare\":\"67\",\"Value\":\"111\",\"Right\":\"\",\"Logic\":1}";
+                                Map mapObj = JSONObject.parseObject(mapTj, Map.class);
+                                Map ddhObj = JSONObject.parseObject(ddh, Map.class);
+                                ddhObj.put("Value", productNumber);
+                                mapObj.put("Value", map1.getProcedurName());
+                                mapList.add(ddhObj);
+                                mapList.add(mapObj);
+                            });
+                            map2.put("FilterString", mapList);//从新绑定条件
+
+
+                            //生产用料清单结果
+                            String resultJsonJG = api.billQuery(JSON.toJSONString(map2));
+                            //json转Java实体类对象
+                            List<MaterialRetentionLogVo> materialRetentionLogVos = JSON.parseArray(resultJsonJG, MaterialRetentionLogVo.class);
+                            //赋值一些默认值
+                            List<MaterialRetentionLogVo> collect = materialRetentionLogVos.parallelStream().map(item -> {
+                                item.setCkNumber("CK005");
+                                item.setDeliveryWarehouse("车间仓");
+                                item.setFlowSequenceNumber(lxkNumber);//流转序列号
+                                item.setMesprocess(gxm); //工序
+                                item.setOrderNumber(orderNumber); //订单
+                                item.setProductionOrderNumber(productNumber); //生产订单
+                                item.setCreateTime(new DateTime());//创建时间
+                                return item;
+                            }).collect(Collectors.toList());
+                            //分子数量基本的扣料单位
+                            int i = materialRetentionLogMapper.insertMaterialRetentionLogBatch(collect);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                System.out.println(e);
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            }
+            return productNumber+gxm+"扣料成功";
+        }
+    }
+
+
+    @Override
+    public  String   sweepingMaterial(String orderNumber,String productNumber,String gxm,String lxkNumber) {
+        //查询条件
+        String queryString = "{\n" +
+                "    \"FormId\": \"PRD_MO\",\n" +
+                "    \"FieldKeys\": \"FBillNo\",\n" +
+                "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"67\",\"Value\":\"" + lxkNumber + "\",\"Right\":\"\",\"Logic\":0}],\n" +
+                "    \"OrderString\": \"\",\n" +
+                "    \"TopRowCount\": 0,\n" +
+                "    \"StartRow\": 0,\n" +
+                "    \"Limit\": 2000,\n" +
+                "    \"SubSystemId\": \"\"\n" +
+                "}";
+        //查询条件
+        Map<String, Object> map = JSON.parseObject(queryString, Map.class);
+        K3CloudApi api = new K3CloudApi();
+        List<JdProductionOrder> jdProductionOrders;
+        try {
+            String resultJson = api.billQuery(JSON.toJSONString(map));
+            //如果查询的数据为空
+            if (resultJson == "" || resultJson == "[]") {
+                return "不能添加这次扫描记录";
+            } else {
+                //转换实体类对象
+                jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                //按照流转卡把信息查询出来了
+                if (jdProductionOrders.size() > 0) {
+                    //单据编号
+                    String documentNumber = jdProductionOrders.get(0).getDocumentNumber();
+                    //这个生产订单生产的数量
+                    //String quantity = jdProductionOrders.get(0).getQuantity();
+                    //根据生产订单号查询生产用料清单
+                    String productionMaterialsListQuery = "{\n" +
+                            "    \"FormId\": \"PRD_PPBOM\",\n" +
+                            "    \"FieldKeys\": \"FMaterialID.FNumber,FMaterialName,FMaterialModel,FMaterialModel2,FDescription,FMaterialID2.FNumber,FMaterialName1,FMaterialModel1,FUnitID2.FName,FMustQty,FMEMO1,FNumerator,FMaterialType,FProcessID.FName\",\n" +
+                            "    \"FilterString\": [],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    //查询生产用料清单
+                    Map<String, Object> map2 = JSON.parseObject(productionMaterialsListQuery, Map.class);
+
+                    String filterString = map2.get("FilterString").toString();
+
+                    List<Map> mapList = JSON.parseArray(filterString, Map.class);
+
+                    //循环条件
+                    String ddh = "{\"Left\":\"\",\"FieldName\":\"FMOBillNO\",\"Compare\":\"67\",\"Value\":\"11\",\"Right\":\"\",\"Logic\":0}";
+                    Map ddhObj = JSONObject.parseObject(ddh, Map.class);
+                    ddhObj.put("Value", productNumber);
+                    mapList.add(ddhObj);
+                    map2.put("FilterString", mapList);//从新绑定条件
+
+
+                    //全部MES工序
+                    List<ProcedureList> procedureLists = procedureListMapper.selectProcedureListMap();
+
+                    Map<String, String> gxMap = procedureLists.stream()
+                            .filter(procedureList ->
+                                    procedureList.getElpname() != null && !procedureList.getElpname().isEmpty()) // 过滤条件
+                            .collect(Collectors.toMap(ProcedureList::getElpname, ProcedureList::getProcedurName));
+
+
+
+                    //生产用料清单结果
+                    String resultJsonJG = api.billQuery(JSON.toJSONString(map2));
+                    //json转Java实体类对象
+                    List<MaterialRetentionLogVo> materialRetentionLogVos = JSON.parseArray(resultJsonJG, MaterialRetentionLogVo.class);
+                    //赋值一些默认值
+                    List<MaterialRetentionLogVo> collect = materialRetentionLogVos.parallelStream().map(item -> {
+                        item.setCkNumber("CK005");
+                        item.setDeliveryWarehouse("车间仓");
+                        item.setFlowSequenceNumber(lxkNumber);//流转序列号
+                        boolean present = Optional.ofNullable(gxMap.get(item.getProcess())).filter(a->!a.isEmpty()).isPresent();
+                        if(present){
+                            item.setMesprocess(gxMap.get(item.getProcess())); //工序
+                        }else {
+                            item.setMesprocess("未知工序");
+                        }
+                        item.setOrderNumber(orderNumber); //订单
+                        item.setProductionOrderNumber(productNumber); //生产订单
+                        item.setCreateTime(new DateTime());//创建时间
+                        return item;
+                    }).collect(Collectors.toList());
+                    //分子数量基本的扣料单位
+                    int i = materialRetentionLogMapper.insertMaterialRetentionLogBatch(collect);
+                }
+            }
+        } catch (Exception ex) {
+            System.out.println(ex);
+            throw new RuntimeException(ex);
+        }
+        return productNumber + gxm + "扣料成功";
+    }
+
+
+    /**
+     * 更新包装还是更新检验
+     * @param ringScanInformationFirstNumber
+     * @param ringScanInformation
+     * @return
+     */
+    private static RingScanInformationFirst getRingScanInformationFirst(String ringScanInformationFirstNumber, RingScanInformation ringScanInformation,String type) {
+        if(type.equals("1")){      //成品检验
+            String inspectionQuantity = ringScanInformationFirstNumber;
+            Double newInspectionQuantity = Double.parseDouble(inspectionQuantity) + 1;
+            Integer i1 = newInspectionQuantity.intValue();
+            RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+            newRingScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+            newRingScanInformationFirst.setPackingQuantity(i1.toString());
+            //入库数量跟随,成品检验同步更新
+            newRingScanInformationFirst.setRks(i1.toString());
+            return newRingScanInformationFirst;
+        }else if(type.equals("2")) { //试机检验
+            String inspectionQuantity = ringScanInformationFirstNumber;
+            Double newInspectionQuantity = Double.parseDouble(inspectionQuantity) + 1;
+            Integer i2 = newInspectionQuantity.intValue();
+            RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+            newRingScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+            newRingScanInformationFirst.setInspectionQuantity(i2.toString());
+            //入库数量跟随,成品检验同步更新
+            newRingScanInformationFirst.setRks(i2.toString());
+
+            return newRingScanInformationFirst;
+        }else if(type.equals("3")) {//入库
+            String rKQuantity = ringScanInformationFirstNumber;
+            Double newRkQuantity = Double.parseDouble(rKQuantity) + 1;
+            Integer i2 = newRkQuantity.intValue();
+            RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+            newRingScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+            newRingScanInformationFirst.setRks(i2.toString());
+            return newRingScanInformationFirst;
+        }
+        return null;
+    }
+
+
+    /**
+     * 判断走入库还是走生产汇报的逻辑
+     *   前置一直在更新,包装检验,或者试机的数量,如果满足就创建生产汇报单据
+     *   前置也在更新,可入库的数量,如果满足就下推生产入库单。
+     * @param productionOrderNumber
+     * type 1入成品 type 2 入利库 type 3走工序汇报逻辑,实际我并没有获取这个参数
+     */
+    public  String  generateWarehouseWarrant(String productionOrderNumber,String gxName,String type,RingScanInformation ringScanInformation){
+        if(gxName.equals("入库")){
+            RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+            newRingScanInformationFirst.setProductionOrderNumber(productionOrderNumber);
+            //查询第一次新增时确定的是试机入库还是包装入库
+            List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(newRingScanInformationFirst);
+            if(ringScanInformationFirsts1.size()>0) {
+                RingScanInformationFirst ringScanInformationFirst = ringScanInformationFirsts1.get(0);
+                //包装或者检验
+                String packingOrInspection = ringScanInformationFirst.getPackingOrInspection();
+                if(packingOrInspection.equals("1")){//检查包装检验  --够了--下推入库单
+                    PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                    planTaskDetails.setDemandDocument(productionOrderNumber);
+                    //查询即将入库的产品信息
+                    List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetails);
+                    if(ringScanInformationFirst.getRks().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                        //加更正生产订单状态
+                        planTaskDetails.setStatus("2");//生产完成
+                        int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                    }
+                    //入库 typ 1 入成品 type 入利库
+                    Map<String,String> ac= erpWareHouSing(planTaskDetails1.get(0), type, ringScanInformation, "单量推送");
+                    if(ac.get("msg").equals("未查询到生产汇报信息")){
+                        return "未查询到生产汇报信息";
+                    }
+                    if(ac.get("msg").equals("入库单创建失败")){
+                        return "入库单创建失败"+ac.get("error");
+                    }
+                    if(ac.get("msg").equals("入库单提交失败")){
+                        return "入库单提交失败";
+                    }
+                    if(ac.get("msg").equals("入库单审核失败")){
+                        return "入库单审核失败";
+                    }
+                    return "入库成功";
+                }else if(packingOrInspection.equals("2")){  //试机数量 --够了--下推入库单
+                    //入库数量等于生产订单总数那么就发起入库申请
+                    if(ringScanInformationFirst.getRks().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                        PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                        planTaskDetails.setDemandDocument(productionOrderNumber);
+                        int i = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                        //查询即将入库的产品信息
+                        List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetails);
+                        //入库 typ 1 入成品 type 入利库
+                        Map<String,String> ac= erpWareHouSing(planTaskDetails1.get(0), type, ringScanInformation, "全量推送");
+                        if(ac.get("msg").equals("未查询到生产汇报信息")){
+                            return "未查询到生产汇报信息";
+                        }
+                        if(ac.get("msg").equals("入库单创建失败")){
+                            return "入库单创建失败"+ac.get("error");
+                        }
+                        if(ac.get("msg").equals("入库单提交失败")){
+                            return "入库单创建失败";
+                        }
+                        if(ac.get("msg").equals("入库单审核失败")){
+                            return "入库单审核失败";
+                        }
+                        //加更正生产订单状态
+                        planTaskDetails.setStatus("2");//生产完成
+                        int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                        return "入库成功";
+                    }
+                }
+            }
+            return "正在入库";
+        }else if(type.equals("3")||type.equals("4")){//等于代表走工序汇报逻辑 1 和 2代表入的什么仓库(1:成品 2:利库)   3和4 代表走工序汇报逻辑(3:成品 4:利库)
+            RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+            newRingScanInformationFirst.setProductionOrderNumber(productionOrderNumber);
+            //查询第一次新增时确定的是试机入库还是包装入库
+            List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(newRingScanInformationFirst);
+            if(ringScanInformationFirsts1.size()>0){
+                RingScanInformationFirst ringScanInformationFirst = ringScanInformationFirsts1.get(0);
+                String packingOrInspection = ringScanInformationFirst.getPackingOrInspection();
+                //改当前生产订单的状态
+                PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                planTaskDetails.setDemandDocument(productionOrderNumber);
+                //查询即将入库的产品信息
+                List<PlanTaskDetails> planTaskDetails1 = planTaskDetailsMapper.selectPlanTaskDetailsList(planTaskDetails);
+                //检查包装或者试机数量
+                if(packingOrInspection.equals("1")){//检查成品检验  --如果够了-下推生产汇报单
+                    //看包装跟当前生产订单总数量是否相等
+                    if(ringScanInformationFirst.getPackingQuantity().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                        //加更正生产订单状态
+                        planTaskDetails.setStatus("2");//生产完成
+                        int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                        //扣料操作
+                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
+                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
+                    }
+                    //工序汇报 0 为单个推送
+                    Map<String,String> aa =  erpProcessReport(planTaskDetails1.get(0),type,"单量推送",ringScanInformation);
+                    if(aa.get("msg").equals("工序汇报创建失败")){
+                        return aa.get("msg")+aa.get("error");
+                    }
+                    if(aa.get("msg").equals("工序汇报提交失败")){
+                        return aa.get("msg")+aa.get("error");
+                    }
+                    if(aa.get("msg").equals("工序汇报审核失败")){
+                        return aa.get("msg")+aa.get("error");
+                    }
+                    System.out.println("工序汇报单量推送");
+                }else if(packingOrInspection.equals("2")){ //试机数量--下推生产汇报单
+                    //看包装跟当前生产订单总数量是否相等
+                    if(ringScanInformationFirst.getInspectionQuantity().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                        //生产汇报 1为批量推送
+                        Map<String,String> aa = erpProcessReport(planTaskDetails1.get(0), type, "全量推送", ringScanInformation);
+                        if(aa.get("msg").equals("工序汇报创建失败")){
+                            return aa.get("msg")+aa.get("error");
+                        }
+                        if(aa.get("msg").equals("工序汇报提交失败")){
+                            return aa.get("msg")+aa.get("error");
+                        }
+                        if(aa.get("msg").equals("工序汇报审核失败")){
+                            return aa.get("msg")+aa.get("error");
+                        }
+                        //扣料操作
+                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
+                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
+                        //加更正生产订单状态
+                        planTaskDetails.setStatus("2");//生产完成
+                        int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                        System.out.println("工序汇报全量推送");
+                    }
+                }
+            }
+            return "工序汇报成功";
+        }
+        return "有问题请联系管理员";
+    }
+
+    /**
+     * 生产汇报单是否下推提交审核成功
+     * txfs:判断是成品检验还是试机检验
+     * @param planTaskDetails1
+     */
+    private Map<String,String> erpProcessReport(PlanTaskDetails planTaskDetails1,String type,String txfs,RingScanInformation ringScanInformation) {
+
+        //生产汇报
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            Map<String, Object> jsonData = objectMapper.readValue(processReport.getInputStream(), Map.class);
+            //得到Model
+            String model1 = objectMapper.writeValueAsString(jsonData.get("Model"));
+            Map<String,Object> modelMap = objectMapper.readValue(model1, Map.class);
+            String localDateTimeStr = DateUtils.toLocalDateTimeStr(LocalDateTime.now());
+            modelMap.put("FDate",localDateTimeStr);
+            //得到FEntity
+            String fEntityString = objectMapper.writeValueAsString(modelMap.get("FEntity"));
+            List<Map> list = objectMapper.readValue(fEntityString, List.class);
+            Map map = list.get(0);
+            String fMaterialId = map.get("FMaterialId").toString();
+            map.put("FSrcEntryId",planTaskDetails1.getFtreeEntityFentryid());
+            String fMaterialIdString = objectMapper.writeValueAsString(map.get("FMaterialId"));
+            Map<String,String > map1 = objectMapper.readValue(fMaterialIdString, Map.class);
+            map1.put("FNumber",planTaskDetails1.getMaterialId());
+            map.put("FMaterialId",map1);
+
+            //生产车间信息
+            boolean present = Optional.ofNullable(planTaskDetails1.getShopCoding()).filter(a -> !a.isEmpty()).isPresent();
+            if(present){
+                HashMap<String, String> shopCoding = new HashMap<>();
+                shopCoding.put("FNumber",planTaskDetails1.getShopCoding());
+                map.put("FWorkshipId",shopCoding);
+            }
+
+            map.put("FMoBillNo",planTaskDetails1.getDemandDocument());
+            map.put("FSrcBillNo",planTaskDetails1.getDemandDocument()); //生产订单号
+            map.put("FReqBillNo",ringScanInformation.getOverNumber()); //订单号
+            map.put("FStartTime",localDateTimeStr);
+            map.put("FEndTime",localDateTimeStr);
+            HashMap fbomdIdMap=new HashMap();
+            fbomdIdMap.put("FNumber",planTaskDetails1.getFbomIdFnumber());
+            map.put("FBomId",fbomdIdMap);
+
+            //单位
+            HashMap<String,String>  dw=new HashMap();
+            dw.put("FNumber",planTaskDetails1.getFunitidfNumber());
+            map.put("FUnitID",dw);
+
+
+
+            //基本单位
+            HashMap<String,String>  baseUtil=new HashMap();
+            baseUtil.put("FNumber",planTaskDetails1.getfBaseUnitId());
+            map.put("FBaseUnitId",baseUtil);
+
+
+            HashMap FStockId=new HashMap();
+            if(type.equals("3")){
+                FStockId.put("FNumber","CK007"); //成品仓
+            }else if(type.equals("4")) {
+                FStockId.put("FNumber","CK006"); //利库仓
+            }
+
+            map.put("FStockId",FStockId);
+
+            //序列号单位
+            String FSNUnitIDJson = objectMapper.writeValueAsString( map.get("FSNUnitID"));
+            Map<String,String > FSNUnitIDMap = objectMapper.readValue(FSNUnitIDJson, Map.class);
+            FSNUnitIDMap.put("FNumber",planTaskDetails1.getFunitidfNumber());
+            map.put("FSNUnitID",FSNUnitIDMap);//序列号单位
+
+            map.put("FReqBillNo",planTaskDetails1.getFsrcbillno()); //源单编号
+            map.put("FSrcInterId",planTaskDetails1.getFid());
+            map.put("FMoId",planTaskDetails1.getFid());
+            map.put("FMoEntryId",planTaskDetails1.getFtreeEntityFentryid());
+            map.put("FMOMAINENTRYID",planTaskDetails1.getFtreeEntityFentryid());
+
+            if(txfs.equals("全量推送")){
+                //序列号单据体---循环
+                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+                productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
+                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+
+                map.put("FSNQty",productionCardFlows.size()); //序列号数量
+                map.put("FFinishQty",planTaskDetails1.getQuantity()); //完成数量
+                map.put("FFinishQty",planTaskDetails1.getQuantity()); //合格数量
+
+                List<Map> list1=new ArrayList<>();
+                //String FSerialSubEntity = map.get("FSerialSubEntity").toString();
+                String FSerialSubEntityJson = objectMapper.writeValueAsString( map.get("FSerialSubEntity"));
+                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
+                productionCardFlows.forEach(item->{
+                    try {
+                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
+                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
+                        Map<String, Object> map2 = objectMapper.readValue(map2Json, Map.class);
+
+                        // 修改 map2 中的 FSerialNo
+                        map2.put("FSerialNo", item.getSerialNumber());
+
+                        // 处理 FSerialId
+                        Map<String, String> fSerialIdMap = null;
+                        if (map2.get("FSerialId") != null) {
+                            String fSerialIdJson = objectMapper.writeValueAsString(map2.get("FSerialId"));
+                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
+                        } else {
+                            fSerialIdMap = new HashMap<>();
+                        }
+
+                        // 修改 FSerialId 中的 FNUMBER
+                        fSerialIdMap.put("FNUMBER", item.getSerialNumber());
+                        map2.put("FSerialId", fSerialIdMap);
+
+                        // 将修改后的 map2 添加到 list1
+                        list1.add(map2);
+                    } catch (JsonProcessingException e) {
+                        System.out.println(e);
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    }
+                });
+                map.put("FSerialSubEntity",list1);
+            }else if(txfs.equals("单量推送")) { //==等于0的情况
+                //序列号单据体---循环
+                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+                productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
+                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+
+                map.put("FSNQty","1"); //序列号数量
+                map.put("FFinishQty","1"); //完成数量
+                map.put("FFinishQty","1"); //合格数量
+
+                List<Map> list1=new ArrayList<>();
+                String FSerialSubEntityJson = objectMapper.writeValueAsString( map.get("FSerialSubEntity"));
+                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
+                productionCardFlows.forEach(item->{
+                    try {
+                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
+                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
+                        Map<String, Object> map2 = objectMapper.readValue(map2Json, Map.class);
+
+                        // 修改 map2 中的 FSerialNo
+                        map2.put("FSerialNo", item.getSerialNumber());
+
+                        // 处理 FSerialId
+                        Map<String, String> fSerialIdMap = null;
+                        if (map2.get("FSerialId") != null) {
+                            String fSerialIdJson = objectMapper.writeValueAsString(map2.get("FSerialId"));
+                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
+                        } else {
+                            fSerialIdMap = new HashMap<>();
+                        }
+                        // 修改 FSerialId 中的 FNUMBER
+                        fSerialIdMap.put("FNUMBER", item.getSerialNumber());
+                        map2.put("FSerialId", fSerialIdMap);
+
+                        // 将修改后的 map2 添加到 list1
+                        list1.add(map2);
+                    } catch (JsonProcessingException e) {
+                        System.out.println(e);
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    }
+                });
+                map.put("FSerialSubEntity",list1);
+            }
+            //表连接关系
+            String FEntity_LinkJSON = objectMapper.writeValueAsString(map.get("FEntity_Link"));
+            List<Map> FEntity_LinkJSONList = objectMapper.readValue(FEntity_LinkJSON, List.class);
+            Map map3 = FEntity_LinkJSONList.get(0);
+            map3.put("FEntity_Link_FSBillId",planTaskDetails1.getFid());
+            map3.put("FEntity_Link_FSId",planTaskDetails1.getFtreeEntityFentryid());
+            List<Map> list2=new ArrayList<>();
+            list2.add(map3);
+            map.put("FEntity_Link",list2);
+            List<Map> FEntityList=new ArrayList<>();
+            FEntityList.add(map);
+            modelMap.put("FEntity",FEntityList);
+
+            //转成String 字符
+
+            jsonData.put("Model", modelMap);
+
+            String zxJson = objectMapper.writeValueAsString(jsonData);
+            //生产用料清单结果
+            K3CloudApi api = new K3CloudApi();
+            try {
+                //执行JSO结果
+                String resultJsonJG = api.save("PRD_MORPT", zxJson);
+                //分析结构
+                Map resultString = objectMapper.readValue(resultJsonJG, Map.class);
+
+                String result = objectMapper.writeValueAsString(resultString.get("Result"));
+                Map<String,Object>  resultMap= objectMapper.readValue(result, Map.class);
+                String number = resultMap.get("Number").toString();//编号
+
+                Map<String,String> s4 = documentExecutionJudgment(objectMapper, resultJsonJG, "工序汇报创建成功", "工序汇报创建失败");
+                if(s4.get("msg").equals("工序汇报创建失败")){
+                    return s4;
+                }
+                //执行提交
+                String tjQuery="{\n" +
+                        "    \"Numbers\": [],\n" +
+                        "    \"Ids\": \"\",\n" +
+                        "    \"SelectedPostId\": 0,\n" +
+                        "    \"NetworkCtrl\": \"\",\n" +
+                        "    \"IgnoreInterationFlag\": \"true\"\n" +
+                        "}";
+                Map map4 = objectMapper.readValue(tjQuery, Map.class);
+
+                List<String> numberjson = new ArrayList<>();
+                numberjson.add(number);
+                map4.put("Numbers",numberjson);
+                String tjExeJSON = objectMapper.writeValueAsString(map4);
+                String s1 = api.submit("PRD_MORPT",tjExeJSON);
+                Map<String,String> s3 = documentExecutionJudgment(objectMapper, s1, "工序汇提交成功", "工序汇报提交失败");
+                if(s3.get("msg").equals("工序汇报提交失败")){
+                    return s3;
+                }
+                //执行审核
+                String shQuery="{\n" +
+                        "    \"Numbers\": [],\n" +
+                        "    \"Ids\": \"\",\n" +
+                        "    \"InterationFlags\": \"\",\n" +
+                        "    \"NetworkCtrl\": \"\",\n" +
+                        "    \"IsVerifyProcInst\": \"\",\n" +
+                        "    \"IgnoreInterationFlag\": \"true\",\n" +
+                        "    \"UseBatControlTimes\": \"false\"\n" +
+                        "}";
+
+                Map map5 = objectMapper.readValue(shQuery, Map.class);
+                List<String> number2json = new ArrayList<>();
+                number2json.add(number);
+                map5.put("Numbers",number2json);
+                String shExeJSON = objectMapper.writeValueAsString(map4);
+                String s2 = api.audit("PRD_MORPT",shExeJSON);
+                Map<String,String> s = documentExecutionJudgment(objectMapper, s2, "工序汇报审核成功", "工序汇报审核失败");
+                if(s.get("msg").equals("工序汇报审核失败")){
+                    return s;
+                }
+                if(s.equals("工序汇报审核成功")){
+                    //添加一张审核记录表,单据编号,序列号,数量
+                    ProductionReportingRecord productionReportingRecord=new ProductionReportingRecord();
+                    if(txfs.equals("全量推送")) {
+                        //序列号单据体---循环
+                        ProductionCardFlow productionCardFlow = new ProductionCardFlow();
+                        productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
+                        List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+                        if(productionCardFlows.size()>0){
+                            //单据编号
+                            productionReportingRecord.setNumber(number);
+                            //整体的所有序列号
+                            productionReportingRecord.setXlhArray(productionCardFlows.stream().map(ProductionCardFlow::getSerialNumber).collect(Collectors.joining(",")));
+                            productionReportingRecord.setType("2");//试机检验
+                        }
+                        productionReportingRecordMapper.insertProductionReportingRecord(productionReportingRecord);
+                    }else if(txfs.equals("单量推送")) {
+                        //序列号单据体---循环
+                        ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+                        productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
+                        List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+                        if (productionCardFlows.size()>0){
+                            //单据编号
+                            productionReportingRecord.setNumber(number);
+                            //只有一个序列号
+                            productionReportingRecord.setXlh(productionCardFlows.get(0).getSerialNumber());
+                            productionReportingRecord.setType("1");//成品检验
+                            productionReportingRecordMapper.insertProductionReportingRecord(productionReportingRecord);
+                            System.out.println("保存工序汇报单据数据成功");
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                System.out.println(e);
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            }
+        } catch (IOException e) {
+            System.out.println(e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+        HashMap hashMap=new HashMap();
+        hashMap.put("msg","工序汇报成功");
+        return hashMap;
+    }
+
+    /**
+     * 操作ERP生产入库单
+     * @param planTaskDetails1
+     * planTaskDetails1 产品信息
+     * type 入那个库
+     * ringScanInformation 扫描信息
+     */
+    private  Map<String,String> erpWareHouSing(PlanTaskDetails planTaskDetails1,String type,RingScanInformation ringScanInformation,String isDOrQ){
+        //生产汇报
+        ObjectMapper objectMapper = new ObjectMapper();
+        //生产用料清单结果
+        K3CloudApi api = new K3CloudApi();
+        try {
+            String nr="";
+            if(isDOrQ.equals("单量推送")){
+                //当前扫描的序列号信息
+                String nativeNumbering = ringScanInformation.getNativeNumbering();
+                ProductionReportingRecord productionReportingRecord=new ProductionReportingRecord();
+                productionReportingRecord.setXlh(nativeNumbering);
+                List<ProductionReportingRecord> productionReportingRecords = productionReportingRecordMapper.selectProductionReportingRecordList(productionReportingRecord);
+                if(productionReportingRecords.size()>0){
+                    //查询生产汇报工序的基本信息
+                    nr="{\n" +
+                            "    \"FormId\": \"PRD_MORPT\",\n" +
+                            "    \"FieldKeys\": \"fbillno,fid,FSrcBillNo,FEntity_FEntryId,FDate,FUnitID.FNumber\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+productionReportingRecords.get(0).getNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                }else{
+                    Map<String,String> abc= new HashMap<>();
+                    abc.put("msg","未查询到生产汇报信息");
+                    return abc;
+                }
+            }else {
+                //查询生产汇报工序的基本信息
+                nr="{\n" +
+                        "    \"FormId\": \"PRD_MORPT\",\n" +
+                        "    \"FieldKeys\": \"fbillno,fid,FSrcBillNo,FEntity_FEntryId,FDate,FUnitID.FNumber\",\n" +
+                        "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSrcBillNo\",\"Compare\":\"17\",\"Value\":\""+planTaskDetails1.getDemandDocument()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                        "    \"OrderString\": \"\",\n" +
+                        "    \"TopRowCount\": 0,\n" +
+                        "    \"StartRow\": 0,\n" +
+                        "    \"Limit\": 2000,\n" +
+                        "    \"SubSystemId\": \"\"\n" +
+                        "}";
+            }
+
+            //查询结果
+            String nrString = api.billQuery(nr);
+
+            List<Map> mapList1 = JSONArray.parseArray(nrString, Map.class);
+            Map map2 = mapList1.get(0);
+            String fbillno = map2.get("fbillno").toString();
+            String fid = map2.get("fid").toString();
+            String FEntityFEntryId = map2.get("FEntity.FEntryId").toString();
+            String FDate = map2.get("FDate").toString();
+            String FSrcBillNo = map2.get("FSrcBillNo").toString();
+            String FUnitIDFNumber = map2.get("FUnitID.FNumber").toString();//基本单位
+
+            //生成入库单
+            Map<String, Object> jsonData2 = objectMapper.readValue(storage.getInputStream(), LinkedHashMap.class);
+            //得到Model
+            String model2 = objectMapper.writeValueAsString(jsonData2.get("Model"));
+            LinkedHashMap map6 = JSONObject.parseObject(model2, LinkedHashMap.class);
+            map6.put("FDate",DateUtils.toLocalDateTimeStr(LocalDateTime.now()));
+            String fEntity1 = objectMapper.writeValueAsString(map6.get("FEntity"));
+            List<LinkedHashMap> mapList = JSONArray.parseArray(fEntity1, LinkedHashMap.class);
+            LinkedHashMap map7 = mapList.get(0);
+            map7.put("F_PONP_HBRQ",FDate);
+
+            map7.put("FSrcEntryId",FEntityFEntryId);
+            map7.put("FSrcInterId",fid);
+            map7.put("FSrcBillNo",fbillno);
+            map7.put("FMoBillNo",planTaskDetails1.getDemandDocument());
+            map7.put("FMoId",planTaskDetails1.getFid());
+            map7.put("FMoEntryId",planTaskDetails1.getFtreeEntityFentryid());
+            map7.put("FReqBillNo",planTaskDetails1.getFsrcbillno()); //订单号
+            map7.put("FMOMAINENTRYID",planTaskDetails1.getFtreeEntityFentryid());
+            HashMap<String, String> fStockId = new HashMap<>();
+            if(type.equals("1")){
+                fStockId.put("FNumber","CK007"); //成品仓
+            }else {
+                fStockId.put("FNumber","CK006"); //利库仓
+            }
+            map7.put("FStockId",fStockId);
+            HashMap<String, String> fNumber = new HashMap<>();
+            fNumber.put("FNumber",planTaskDetails1.getMaterialId());
+            map7.put("FMaterialId",fNumber);
+
+            //生产车间信息
+            boolean present = Optional.ofNullable(planTaskDetails1.getShopCoding()).filter(a -> !a.isEmpty()).isPresent();
+            if(present){
+                HashMap<String, String> shopCoding = new HashMap<>();
+                shopCoding.put("FNumber",planTaskDetails1.getShopCoding());
+                map7.put("FWorkshipId",shopCoding);
+            }
+
+            //单位
+            HashMap<String, String> fUnitIDfNumber = new HashMap<>();
+            fUnitIDfNumber.put("FNumber",FUnitIDFNumber);
+            map7.put("FUnitID",fUnitIDfNumber);
+
+            //基本单位
+            HashMap<String, String> fBaseUnitIdFNumber = new HashMap<>();
+            fBaseUnitIdFNumber.put("FNumber",planTaskDetails1.getfBaseUnitId());
+            map7.put("FBaseUnitId",fBaseUnitIdFNumber);
+
+            //库存单位
+            HashMap<String, String> kudw = new HashMap<>();
+            fBaseUnitIdFNumber.put("FNumber",FUnitIDFNumber);
+            map7.put("FStockUnitId",kudw);
+
+            if(isDOrQ.equals("全量推送")){
+                //序列号单据体---循环
+                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+                productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
+                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+                map7.put("FSNQty",productionCardFlows.size()); //序列号数量
+                map7.put("FMustQty",productionCardFlows.size()); //应收实收
+                map7.put("FRealQty",productionCardFlows.size()); //实收
+
+                map7.put("FBaseMustQty",productionCardFlows.size());  //基本单位实收数量
+                map7.put("FBaseRealQty",productionCardFlows.size()); //基本单位库存实收数量
+                List<Map> list1=new ArrayList<>();
+                String FSerialSubEntityJson = objectMapper.writeValueAsString( map7.get("FSerialSubEntity"));
+                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
+                productionCardFlows.forEach(item->{
+                    try {
+                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
+                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
+                        Map<String, Object> map2two = objectMapper.readValue(map2Json, Map.class);
+
+                        // 修改 map2 中的 FSerialNo
+                        map2two.put("FSerialNo", item.getSerialNumber());
+
+                        // 处理 FSerialId
+                        Map<String, String> fSerialIdMap = null;
+                        if (map2two.get("FSerialId") != null) {
+                            String fSerialIdJson = objectMapper.writeValueAsString(map2two.get("FSerialId"));
+                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
+                        } else {
+                            fSerialIdMap = new HashMap<>();
+                        }
+
+                        // 修改 FSerialId 中的 FNUMBER
+                        fSerialIdMap.put("FNumber", item.getSerialNumber());
+                        map2two.put("FSerialId", fSerialIdMap);
+
+                        // 将修改后的 map2 添加到 list1
+                        list1.add(map2two);
+                    } catch (JsonProcessingException e) {
+                        System.out.println(e);
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    }
+                });
+            }else if(isDOrQ.equals("单量推送")) {
+                //序列号单据体---循环
+                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
+                productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
+                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
+                map7.put("FSNQty","1"); //序列号数量
+                map7.put("FMustQty","1"); //应收实收
+                map7.put("FRealQty","1"); //实收
+
+                map7.put("FBaseMustQty","1");  //基本单位实收数量
+                map7.put("FBaseRealQty","1"); //基本单位库存实收数量
+                List<Map> list1=new ArrayList<>();
+                String FSerialSubEntityJson = objectMapper.writeValueAsString( map7.get("FSerialSubEntity"));
+                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
+                productionCardFlows.forEach(item->{
+                    try {
+                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
+                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
+                        Map<String, Object> map2two = objectMapper.readValue(map2Json, Map.class);
+
+                        // 修改 map2 中的 FSerialNo
+                        map2two.put("FSerialNo", item.getSerialNumber());
+
+                        // 处理 FSerialId
+                        Map<String, String> fSerialIdMap = null;
+                        if (map2two.get("FSerialId") != null) {
+                            String fSerialIdJson = objectMapper.writeValueAsString(map2two.get("FSerialId"));
+                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
+                        } else {
+                            fSerialIdMap = new HashMap<>();
+                        }
+
+                        // 修改 FSerialId 中的 FNUMBER
+                        fSerialIdMap.put("FNumber", item.getSerialNumber());
+                        map2two.put("FSerialId", fSerialIdMap);
+
+                        // 将修改后的 map2 添加到 list1
+                        list1.add(map2two);
+                    } catch (JsonProcessingException e) {
+                        System.out.println(e);
+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    }
+                });
+                map7.put("FSerialSubEntity",list1);
+                System.out.println("入库单量推送流转卡逻辑");
+            }
+            List<Map> fEntityLinkList=new ArrayList<>();
+            String FenJson="{\n" +
+                    "\"FEntity_Link_FRuleId\": \"PRD_MO2INSTOCK\",\n" +
+                    "\"FEntity_Link_FSTableName\": \"T_PRD_MORPTENTRY\",\n" +
+                    "\"FEntity_Link_FSBillId\": \"168691\",\n" +
+                    "\"FEntity_Link_FSId\": \"168691\"\n" +
+                    "}";
+            Map<String,String> map8 = JSONObject.parseObject(FenJson, Map.class);
+            map8.put("FEntity_Link_FSBillId",fid);
+            map8.put("FEntity_Link_FSId",FEntityFEntryId);
+            fEntityLinkList.add(map8);
+            map7.put("FEntity_Link",fEntityLinkList);
+            List<LinkedHashMap> map7List = new ArrayList<>();
+            map7List.add(map7);
+            map6.put("FEntity",map7List);
+
+            jsonData2.put("Model",map6);
+
+            String rkdcrateJosn = api.save("PRD_INSTOCK",JSONObject.toJSONString(jsonData2));
+            Map<String, String> stringStringMap1 = documentExecutionJudgment(objectMapper, rkdcrateJosn, "生成入库单创建", "入库单创建失败");
+            if(stringStringMap1.get("msg").equals("入库单创建失败")){
+                return stringStringMap1;
+            }
+            //解析入库单创建结果
+            Map rkdCrateJsonResultString = objectMapper.readValue(rkdcrateJosn, Map.class);
+            String rkdCrateResultJson = objectMapper.writeValueAsString(rkdCrateJsonResultString.get("Result"));
+            Map<String,String>  rkdResultMap= objectMapper.readValue(rkdCrateResultJson, Map.class);
+            String rkdNumber = rkdResultMap.get("Number");//编号
+
+            //提交
+            String rkdtj="{\n" +
+                    "    \"Numbers\": [],\n" +
+                    "    \"Ids\": \"\",\n" +
+                    "    \"SelectedPostId\": 0,\n" +
+                    "    \"NetworkCtrl\": \"\",\n" +
+                    "    \"IgnoreInterationFlag\": \"\"\n" +
+                    "}";
+            Map<String, Object> jsonData3 = objectMapper.readValue(rkdtj, Map.class);
+            List<String> list5 =new ArrayList<>();
+            list5.add(rkdNumber);
+            jsonData3.put("Numbers",list5);
+            String tkdtjR = api.submit("PRD_INSTOCK",JSONObject.toJSONString(jsonData3));
+            Map<String, String> stringStringMap2 = documentExecutionJudgment(objectMapper, tkdtjR, "入库单提交成功", "入库单提交失败");
+            if(stringStringMap2.get("msg").equals("入库单提交失败")){
+                return stringStringMap2;
+            }
+
+            //审核
+            String rkdsh="{\n" +
+                    "    \"Numbers\": [],\n" +
+                    "    \"Ids\": \"\",\n" +
+                    "    \"InterationFlags\": \"\",\n" +
+                    "    \"NetworkCtrl\": \"\",\n" +
+                    "    \"IsVerifyProcInst\": \"\",\n" +
+                    "    \"IgnoreInterationFlag\": \"\",\n" +
+                    "    \"UseBatControlTimes\": \"false\"\n" +
+                    "}";
+            Map<String, Object> jsonData4 = objectMapper.readValue(rkdsh, Map.class);
+            jsonData4.put("Number",list5);
+
+            String rkdshR = api.audit("PRD_INSTOCK",JSONObject.toJSONString(jsonData3));
+            Map<String, String> stringStringMap = documentExecutionJudgment(objectMapper, rkdshR, "入库单审核成功", "入库单审核失败");
+            if(stringStringMap.get("msg").equals("入库单审核失败")){
+                return stringStringMap;
+            }
+        } catch (Exception e) {
+            System.out.println(e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            Map<String,String>  abc=new HashMap<>();
+            abc.put("msg", "入库单创建失败");
+            abc.put("error","入库单创建失败");
+            return abc;
+        }
+        Map<String,String>  abc=new HashMap<>();
+        abc.put("msg","入库成功");
+        return abc;
+    }
+
+    /**
+     * erp创建单据是否成功
+     * @param objectMapper
+     * @param resultJson
+     * @param
+     * @param msg2
+     * @return
+     * @throws JsonProcessingException
+     */
+    private Map<String,String>  documentExecutionJudgment(ObjectMapper objectMapper, String resultJson,String msg1,String msg2) throws JsonProcessingException {
+        Map s2Map = objectMapper.readValue(resultJson, Map.class);
+        String result = objectMapper.writeValueAsString(s2Map.get("Result"));
+        System.out.println(result+"执行结果");
+        Map<String,Object>  s2MapResultJsonMap= objectMapper.readValue(result, Map.class);
+        //判断是否成功
+        String responseStatus3 = objectMapper.writeValueAsString(s2MapResultJsonMap.get("ResponseStatus"));
+        Map map11 = objectMapper.readValue(responseStatus3, Map.class);
+        String isSuccess3 = map11.get("IsSuccess").toString();
+        String  isSuccess4= map11.get("Errors").toString();
+        if(isSuccess3.equals("true")){
+            HashMap hashMap=new HashMap();
+            hashMap.put("msg",msg1);
+            return hashMap;
+        }else {
+            System.out.println(isSuccess4);
+            HashMap hashMap=new HashMap();
+            hashMap.put("msg",msg2);
+            hashMap.put("error",isSuccess4);
+            return hashMap;
+        }
+    }
+
+
+    private String  documentExecutionJudgment1(ObjectMapper objectMapper, String resultJson,String msg1,String msg2) throws JsonProcessingException {
+        Map s2Map = objectMapper.readValue(resultJson, Map.class);
+        String result = objectMapper.writeValueAsString(s2Map.get("Result"));
+        System.out.println(result+"执行结果");
+        Map<String,Object>  s2MapResultJsonMap= objectMapper.readValue(result, Map.class);
+        //判断是否成功
+        String responseStatus3 = objectMapper.writeValueAsString(s2MapResultJsonMap.get("ResponseStatus"));
+        Map map11 = objectMapper.readValue(responseStatus3, Map.class);
+        String isSuccess3 = map11.get("IsSuccess").toString();
+        String  isSuccess4= map11.get("Errors").toString();
+        if(isSuccess3.equals("true")){
+//            HashMap hashMap=new HashMap();
+//            hashMap.put("msg",);
+            return msg1;
+        }else {
+            System.out.println(isSuccess4);
+//            HashMap hashMap=new HashMap();
+//            hashMap.put("msg",msg1);
+//            hashMap.put("error",isSuccess4);
+            return msg2;
+        }
+    }
+
+
+
+    /**
+     * 没有调用ERP入库单之前的入库逻辑
+     * @param productionOrderNumber
+     * @return
+     */
+    public  String  generateWarehouseWarrant2(String productionOrderNumber){
+        RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
+        newRingScanInformationFirst.setProductionOrderNumber(productionOrderNumber);;
+        List<RingScanInformationFirst> ringScanInformationFirsts1 = ringScanInformationFirstMapper.selectRingScanInformationFirstList(newRingScanInformationFirst);
+        if (ringScanInformationFirsts1.size()>0){
+            RingScanInformationFirst ringScanInformationFirst = ringScanInformationFirsts1.get(0);
+            String packingOrInspection = ringScanInformationFirst.getPackingOrInspection();
+            if(packingOrInspection.equals("1")){
+                //看包装跟当前生产订单总数量是否相等
+                if(ringScanInformationFirst.getPackingQuantity().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                    //生成入库单
+                    System.out.println("包装生成入库单-入成品仓库");
+                    //入库这个生产订单下的所有产品信息
+
+                    //改当前生产订单的状态
+                    PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                    planTaskDetails.setDemandDocument(productionOrderNumber);
+                    planTaskDetails.setStatus("2");//生产完成
+                    int i = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                }
+            }else if(packingOrInspection.equals("2")){
+                //看包装跟当前生产订单总数量是否相等
+                if(ringScanInformationFirst.getInspectionQuantity().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
+                    //生成入库单
+                    System.out.println("包装生成入库单--入利庫");
+                    //入库这个生产订单下的所有产品信息
+                    PlanTaskDetails planTaskDetails=new PlanTaskDetails();
+                    planTaskDetails.setDemandDocument(productionOrderNumber);
+                    planTaskDetails.setStatus("2");//生产完成
+                    int i = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
+                }
+            }
+        }
+        return "数量够了入库";
+    }
+
+
+    /**
+     * 蓝牙扫描枪扫描(作废)
+     * @param stationProductScanningRingVo
+     * @return
+     */
+    @Override
+    @Transactional
+    public String bluetoothScannerGun(StationProductScanningRingVo stationProductScanningRingVo) {
+        String contentInformation = stationProductScanningRingVo.getContentInformation();
+        if(contentInformation.contains("addRing")){//添加二维扫描枪
+            //编号拆分 蓝牙名-mac地址
+            String[] split = stationProductScanningRingVo.getDeviceNumber().split("-");
+            //位置1是蓝牙名称-位置二实mac地址
+            String split1=split[0];
+            //位置2是mac地址
+            String split2=split[1];
+            RingTerminal ringTerminal=new RingTerminal();
+            ringTerminal.setBluetoothName(split1);
+            ringTerminal.setHandheldTerminalNumber(split2);
+            int i = ringTerminalMapper.updateRingTerminalByBluetoothName(ringTerminal);
+            if(i>0){
+                System.out.println("扫描枪添加成功");
+            }
+        }else if(contentInformation.contains("scan@")){//扫描的是员工码
+            //更改当前人员的扫码信息
+            String replace = contentInformation.replace("scan@", "");
+            String[] personeList = replace.split("#");
+            //把当前设备给切换到这个人身上
+            //先找到当前设备在那个人身上
+            //更改当前工位码的设备信息
+            StationInformation stationInformation = new StationInformation();
+            String[] split1 = stationProductScanningRingVo.getDeviceNumber().split("-");
+            stationInformation.setDeviceNumber(split1[1]);//设备编号
+            stationInformation.setBluetoothName(split1[0]);//蓝牙名称
+            List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationListByDEviceNumber(stationInformation);
+            if (stationInformations.size()>0){
+                //重置以前的绑定(手持机在哪我就把那变成空)
+                stationInformationMapper.updateStationInformationDeviceNameAndBluetoothName(stationInformation);
+            }
+            stationInformation.setPersonnelId(personeList[0]);//员工id
+            stationInformation.setPersonnelName(personeList[1]);//员工姓名
+            int i = stationInformationMapper.updateStationInformationByUseIdAndUserName(stationInformation);
+            if(i>0){
+                System.out.println("扫枪绑定信息切换成功");
+            }
+        }else {
+
+
+            String scanningTime = stationProductScanningRingVo.getScanningTime();
+            String[] split = stationProductScanningRingVo.getDeviceNumber().split("-");
+            //1、判断扫的是不是厂内流转卡
+            /*boolean fjqyD = stationProductScanningRingVo.getContentInformation().contains("D");
+            boolean fjqyZ = stationProductScanningRingVo.getContentInformation().contains("Z");
+            if(!fjqyD||!fjqyZ){return "请扫描相关二维码";}*/
+
+            //2、扫描间距判断
+            /* RingScanInformation ringScanInformationQuery=new RingScanInformation();
+            ringScanInformationQuery.setDeviceNumber(split[1]);//设备Mac地址
+            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+            if(ringScanInformations!=null){
+                //拿到上次扫描的时间
+                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+                //拿到当前系统时间
+                LocalDateTime now = LocalDateTime.now();
+                //计算两次时间的时间差
+                Duration duration = Duration.between(scanningTime1, now);
+                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+                //判断两次时间是否大于
+                if (isTwoMinutesPassed) {
+                  return "同一设备,两分钟之内不能重复扫描";
+                }
+            }*/
+
+            //3、扫描录入数据
+            RingScanInformation ringScanInformation=new RingScanInformation();
+            ringScanInformation.setContentInformation(contentInformation);
+            LocalDateTime localDateTime = DateUtils.toLocalDateTime(scanningTime, "yyyy-MM-dd HH:mm:ss");
+            ringScanInformation.setScanningTime(localDateTime);
+            ringScanInformation.setDeviceName(split[0]);//蓝牙名称
+            ringScanInformation.setDeviceNumber(split[1]);//mac地址
+            //4、查询当前机器绑定的工位信息和人信息
+            StationInformation terminalInformation=new StationInformation();
+            terminalInformation.setBluetoothName(split[0]); //蓝牙名称
+            terminalInformation.setDeviceNumber(split[1]);//mac地址
+            List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationListByDEviceNumber(terminalInformation);
+            if(stationInformations.size()>0){
+                ringScanInformation.setPersonnelName(stationInformations.get(0).getPersonnelName());
+                ringScanInformation.setProcess(stationInformations.get(0).getProcessId());
+                ringScanInformation.setProcessName(stationInformations.get(0).getProcessName());
+                ringScanInformation.setStationId(stationInformations.get(0).getId().toString()); //工位名称
+                ringScanInformation.setStationName(stationInformations.get(0).getStationName());//工位名称
+            }
+            String nativeNumber="";
+            if(contentInformation.contains("Z")){
+                nativeNumber = contentInformation.replace("Z", "");
+            }
+            if(contentInformation.contains("D")){
+                nativeNumber=contentInformation.replace("D","");
+            }
+            if(StringUtils.isNotNull(nativeNumber)&&nativeNumber!=""){
+                //取值真实的扫描内容
+                ringScanInformation.setNativeNumbering(nativeNumber);
+            }else {
+                //扫描内容
+                ringScanInformation.setNativeNumbering(contentInformation);
+            }
+            //根据扫描内容拿到生产订单号和订单号
+            String  queryStringOrderNumberAndProductionOrderNumber="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FSaleOrderNo,FBillNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getNativeNumbering()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            Map<String, Object> map = JSON.parseObject(queryStringOrderNumberAndProductionOrderNumber, Map.class);
+            K3CloudApi api = new K3CloudApi();
+            String resultJson = null;
+            try {
+                resultJson = api.billQuery(JSON.toJSONString(map));
+            } catch (Exception e) {
+                System.out.println(e);
+                throw new RuntimeException(e);
+            }
+            //判断内不为空
+            if(resultJson!=""&resultJson!="[]"){
+                List<JdProductionOrder>    jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                if(jdProductionOrders.size()>0){
+                    //需求单据号
+                    ringScanInformation.setOrderNumber(jdProductionOrders.get(0).getDemandDocument());
+                    //生产订单号
+                    ringScanInformation.setProductionOrderNumber(jdProductionOrders.get(0).getDocumentNumber());
+                }
+            }
+            if(StringUtils.isNotNull(ringScanInformation.getOrderNumber())){
+                //--记录第一扫描(将来第一扫描的单据记录)
+                RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+                ringScanInformationFirst.setOrderNumber(ringScanInformation.getOrderNumber());
+                List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+                //订单扫描记录
+                if(ringScanInformationFirsts.size()<=0){
+                    ringScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformationFirst.setStatus("1");
+                    ringScanInformationFirst.setStartTime(LocalDateTime.now());//开始时间
+                    //查询这个订单的总数量是多少
+                    String sa="{\n" +
+                            "    \"FormId\": \"SAL_SaleOrder\",\n" +
+                            "    \"FieldKeys\": \"FBillNo,FQty\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getOrderNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> mapTotal = JSON.parseObject(sa, Map.class);
+                    String resultJsonTotal = null;
+                    try {
+                        resultJsonTotal = api.billQuery(JSON.toJSONString(mapTotal));
+                    } catch (Exception e) {
+                        System.out.println(e);
+                        throw new RuntimeException(e);
+                    }
+                    List<Map> mapListTotal = JSON.parseArray(resultJsonTotal, Map.class);
+                    if(mapListTotal.size()<=0){
+                        return "扫码失败订单已关闭";
+                    }
+                    Double totalAmount = mapListTotal.stream()
+                            .filter(map1 -> map1.containsKey("FQty")) // 确保 map 中包含 "amount" 字段
+                            .mapToDouble(map1 -> ((Number) map1.get("FQty")).doubleValue()) // 将 "amount" 字段转换为 double
+                            .sum(); // 求和
+
+                    ringScanInformationFirst.setTotalQuantity(String.valueOf(totalAmount.intValue()));
+                    //第一次扫码记录订单扫描记录信息
+                    int i = ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst);
+                }
+                //先查生产订单日志表没有在新增
+                RingScanInformationProdOrderScanning prodOrderScanning=new RingScanInformationProdOrderScanning();
+                prodOrderScanning.setOrderNumber(ringScanInformation.getOrderNumber());
+                prodOrderScanning.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                List<RingScanInformationProdOrderScanning> ringScanInformationProdOrderScannings =
+                        prodOrderScanningMapper.selectRingScanInformationProdOrderScanningList(prodOrderScanning);
+                if(ringScanInformationProdOrderScannings.size()<0){
+                    //看看这个生产订单包装节点Or检验
+                    String query="{\n" +
+                            "    \"FormId\": \"PRD_MO\",\n" +
+                            "    \"FieldKeys\": \"FMaterialId.FNumber\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"67\",\"Value\":\""+ringScanInformation.getProductionOrderNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> prodListQuery = JSON.parseObject(query, Map.class);
+                    String prodListQueryJson = null;
+                    try {
+                        prodListQueryJson = api.billQuery(JSON.toJSONString(prodListQuery));
+                    } catch (Exception e) {
+                        System.out.println(e);
+                        throw new RuntimeException(e);
+                    }
+                    List<Map> prodListQueryJsonList = JSON.parseArray(prodListQueryJson, Map.class);
+                    //如果ERP存在这个生产订单
+                    if(prodListQueryJsonList.size()>0){
+                        //[{"FMaterialId.FNumber":"1010040050034","FQty":2.0000000000}]
+                        //生产订单日志记录
+                        prodOrderScanning.setTotalQuantity(prodListQueryJsonList.get(0).get("FQty").toString());//数量
+                        if(prodListQueryJsonList.get(0).get("FMaterialId.FNumber").toString().startsWith("1")){
+                            prodOrderScanning.setToPackagingorinspection("1");//到包装
+                        }else if(prodListQueryJsonList.get(0).get("FMaterialId.FNumber").toString().startsWith("2")){
+                            prodOrderScanning.setToPackagingorinspection("2");//到检验
+                        }else {
+                            prodOrderScanning.setToPackagingorinspection("0");//其他
+                        }
+                        int i = prodOrderScanningMapper.insertRingScanInformationProdOrderScanning(prodOrderScanning);
+                        if(i>0){
+                            System.out.println("新增生产订单日志信息成功");
+                        }
+                    }
+                }
+            }
+
+            //插入扫描日志信息
+            int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+
+            if(i2>0){
+                //最后一个节点判定逻辑
+                RingScanInformationProdOrderScanning prodOrderScanning=new RingScanInformationProdOrderScanning();
+                prodOrderScanning.setOrderNumber(ringScanInformation.getOrderNumber());
+                prodOrderScanning.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                List<RingScanInformationProdOrderScanning> ringScanInformationProdOrderScannings =
+                        prodOrderScanningMapper.selectRingScanInformationProdOrderScanningList(prodOrderScanning);
+                if(ringScanInformationProdOrderScannings.size()>0){
+                    String toPackagingorinspection = ringScanInformationProdOrderScannings.get(0).getToPackagingorinspection();
+                    if(toPackagingorinspection.equals("1")){//更新包装数量
+                        String toPackagingorinspection1 = ringScanInformationProdOrderScannings.get(0).getPackingQuantity();
+                        Double d=Double.valueOf(toPackagingorinspection1)+1;
+                        ringScanInformationProdOrderScannings.get(0).setPackingQuantity(d.toString());
+                        int i = prodOrderScanningMapper.updateRingScanInformationProdOrderScanning(ringScanInformationProdOrderScannings.get(0));
+                        System.out.println("包装节点更新成功");
+                        String rk = this.rk(prodOrderScanning);
+                        System.out.println(rk);
+                    }else {//更新检验数量
+                        String toPackagingorinspection1 = ringScanInformationProdOrderScannings.get(0).getInspectionQuantity();
+                        Double d=Double.valueOf(toPackagingorinspection1)+1;
+                        ringScanInformationProdOrderScannings.get(0).setInspectionQuantity(d.toString());
+                        int i = prodOrderScanningMapper.updateRingScanInformationProdOrderScanning(ringScanInformationProdOrderScannings.get(0));
+                        System.out.println("检验节点更新成功");
+                        String rk = this.rk(prodOrderScanning);
+                        System.out.println(rk);
+                    }
+                }
+                return "扫描成功";
+            }else {
+                return "扫描失败";
+            }
+        }
+        return "扫描成功";
+    }
+
+    /**
+     * 产品扫描
+     * @param contentString
+     * @return
+     */
+    @Override
+    public String stationProductScanning(String contentString) {
+        try {
+            if (contentString.contains("scan@")) {//这个是工位码扫描逻辑
+                String[] content = contentString.split("&");
+                //更改当前工位码的设备信息
+                StationInformation stationInformation = new StationInformation();
+                stationInformation.setDeviceName(content[2]);//设备信息
+                //查询当前设备是否已经绑定了工位信息
+                List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationList(stationInformation);
+                if (stationInformations.size() > 0) { //更新原先绑定的工位信息为空
+                    stationInformation.setDeviceName("");//设备信息
+                    stationInformation.setTeamCode("");//班组码信息
+                    stationInformation.setStationCode(stationInformations.get(0).getStationCode());//工位码信息
+                    stationInformationMapper.updateStationInformationByStationUpdateEquipment(stationInformation);
+                }
+                stationInformation.setDeviceName(content[2]);//设备信息
+                stationInformation.setStationCode(content[1]);//工位码
+                int i = stationInformationMapper.updateStationInformationByStationUpdateEquipment(stationInformation);
+                return "手持机工位信息绑定成功";
+            } else if (contentString.contains("team@")){
+                String[] content = contentString.split("&");
+                //扫工位码之前先判断你当前手持机扫没扫过工位码信息
+                StationInformation stationInformationByDeviceName=new StationInformation();
+                stationInformationByDeviceName.setDeviceName(content[2]);//手持机标识
+                List<StationInformation> stationInformationsByDeviceName = stationInformationMapper.selectStationInformationList(stationInformationByDeviceName);
+                if(stationInformationsByDeviceName.size()<=0){
+                    return "请先用当前手持先扫工位码";
+                }
+                //先查询当前班组码有没有在其他工位上有就先给他清空
+                StationInformation stationInformation=new StationInformation();
+                stationInformation.setTeamCode(content[1]);//班组码信息
+                List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationList(stationInformation);
+                if (stationInformations.size() > 0) { //更新原先绑定的工位信息为空
+                    stationInformation.setTeamName("");//班组码信息
+                    stationInformation.setStationCode(stationInformations.get(0).getStationCode());//工位码信息
+                    stationInformationMapper.updateStationInformationByStationUpdateEquipment(stationInformation);
+                }
+                stationInformation.setTeamCode(content[1]);//班组码
+                stationInformation.setDeviceName(content[2]);//手持机码
+                int i = stationInformationMapper.updateStationInformationByStationUpdateByDeviceName(stationInformation);
+
+                List<StationInformation> stationInformationsTwo = stationInformationMapper.selectStationInformationList(stationInformation);
+                //拿到工位id
+                StationInformation stationInformation1 = stationInformationsTwo.get(0);
+                return "工位:"+stationInformation1.getStationName()+" 班组:"+stationInformation1.getTeamName();
+            } else{
+                //产品扫描逻辑
+                String[] content = contentString.split("&");
+                StationInformation stationInformation=new StationInformation();
+                stationInformation.setDeviceName(content[1]);//设备名称
+                //查询工位信息表
+                List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationList(stationInformation);
+                //节点.
+                if(stationInformations.size()>0){
+                    StationInformation stationInformation1 = stationInformations.get(0);//根据手持机设备名称得到工位信息
+                    ReportInformationSheet reportInformationSheet=new ReportInformationSheet();
+                    reportInformationSheet.setCurrentStationStationPeople(stationInformation1.getPersonnelName());//工位人员姓名
+                    reportInformationSheet.setStationCode(stationInformation1.getStationCode());//工位码
+                    reportInformationSheet.setProcess(stationInformation1.getStationName());//工序名称
+                    reportInformationSheet.setProductCode(content[0]);//产品码
+                    reportInformationSheet.setHandheldDevice(content[1]);//手持机
+                    reportInformationSheet.setCreateTime(new DateTime());//创建时间
+                    //推算出来产品编号或者订单编号
+                    String modifiedString = "DQY" + content[0].substring(0, content[0].length() - 3);
+                    reportInformationSheet.setOrderNumber(modifiedString);//订单号或任务号
+                    //更新节点生产数量
+                    //先拿到当前任务数量
+                    List<ProductionPlanningManagement> productionPlanningManagements = productionPlanningManagementMapper.selectProductionPlanningManagementByOrderNumebrOrPlanNumber(modifiedString, modifiedString);
+                    if(productionPlanningManagements.size()<=0){
+                        //插入异常报工信息
+                        extracted(reportInformationSheet,"未找到当前产品计划报工失败--信息不匹配");
+                        return "未找到当前产品计划报工失败--信息不匹配";
+                    }else {
+                        boolean equals = productionPlanningManagements.get(0).getPlanType().equals("3");
+                        if(equals){
+                            //插入异常报工信息
+                            extracted(reportInformationSheet,"该计划已经完成--信息不匹配");
+                            return "该计划已经完成--信息不匹配";
+                        }else {
+                            //找到计划了先确认下数量(我计划下的数量)
+                            ProductionPlanningManagement productionPlanningManagement = productionPlanningManagements.get(0);
+                            //拿到计划id------->根据计划id查询流程信息
+                            BpmExecuteProcess process=new BpmExecuteProcess();
+                            process.setTaskPlanKey(productionPlanningManagement.getId().toString());//计划id
+                            List<BpmExecuteProcess> bpmExecuteProcesses = bpmExecuteProcessMapper.selectBpmExecuteProcessListfjqy(process);
+                            if(bpmExecuteProcesses.size()<=0){
+                                //插入异常报工信息
+                                extracted(reportInformationSheet,"没有找到当前计划的流程管道--信息不匹配");
+                                return "没有找到当前计划的流程管道--信息不匹配";
+                            }else {
+                                //管道
+                                String taskKey = bpmExecuteProcesses.get(0).getTaskKey();
+                                BpmExecuteNodeLog bpmExecuteNodeLog=new BpmExecuteNodeLog();
+                                bpmExecuteNodeLog.setTaskProcessKey(taskKey);//流程编号
+                                bpmExecuteNodeLog.setTaskNodeName(stationInformation1.getStationName());//工序名称
+                                List<BpmExecuteNodeLog> bpmExecuteNodeLogs = bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogListfjqy(bpmExecuteNodeLog);
+                                String taskNodeNumber = bpmExecuteNodeLogs.get(0).getTaskNodeNumber();//节点数量
+                                //判断你当前报工工序节点是否已经报够数量了
+                                if(taskNodeNumber==null||taskNodeNumber.equals("")){
+                                    taskNodeNumber="0";
+                                }
+                                if(Integer.parseInt(taskNodeNumber)>=Integer.parseInt(productionPlanningManagement.getQuantity())){
+                                    //插入异常报工信息
+                                    extracted(reportInformationSheet,"当前工序已完成计划数量");
+                                    return "当前工序已完成计划数量";
+                                }else {
+                                    //否则更新接单已完成数量
+                                    int i = Math.addExact(Integer.parseInt(taskNodeNumber), 1);
+                                    BpmExecuteNodeLog upBpmExecuteNodeLog=new BpmExecuteNodeLog();
+                                    upBpmExecuteNodeLog.setTaskNodeNumber(String.valueOf(i));//更新数量
+                                    upBpmExecuteNodeLog.setId(bpmExecuteNodeLogs.get(0).getId());//节点日志id
+                                    //判断同一部手持机扫描时间间隔是否超过一分钟
+                                    ReportInformationSheet sheetsjjg=new ReportInformationSheet();
+                                    sheetsjjg.setProcess(stationInformation1.getStationName());//工序
+                                    sheetsjjg.setHandheldDevice(content[2]);//设备信息
+                                    ReportInformationSheet reportInformationSheetsSc = reportInformationSheetMapper.selectReportInformationSheetListOrderBy(sheetsjjg);
+                                    Date date1 = reportInformationSheetsSc.getCreateTime(); //上次扫码时间
+                                    Date date2 = new Date();//当前时间
+                                    String s = DateUtils.timeDistanceMin(date2, date1);
+                                    if(Integer.parseInt(s)<1){
+                                        //插入异常报工信息
+                                        extracted(reportInformationSheet,"两次扫码之间的间隔不能小于1分钟");//???? 看看那个小工人有这个坏心思
+                                        return "两次扫码之间的间隔不能小于1分钟";
+                                    }
+                                    //工序--产品重复扫描
+                                    ReportInformationSheet reportInformationSheet1=new ReportInformationSheet();
+                                    reportInformationSheet1.setProcess(stationInformation1.getStationName());//工序名称
+                                    reportInformationSheet1.setProductCode(stationInformation1.getStationName());//产品码
+                                    List<ReportInformationSheet> reportInformationSheets = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1);
+                                    if(reportInformationSheets.size()>0){
+                                        //插入异常报工信息
+                                        extracted(reportInformationSheet,"产品不能重复扫描");
+                                        return "产品不能重复扫描";
+                                    }
+
+                                    //当前产品只能被下一个工序进行扫描
+                                    //查询当前计划的所有工序信息
+                                    BpmExecuteNodeLog bpmExecuteNodeLogString=new BpmExecuteNodeLog();
+                                    bpmExecuteNodeLog.setTaskProcessKey(taskKey);//流程编号
+                                    List<BpmExecuteNodeLog> bpmExecuteNodeLogsString = bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogListfjqy(bpmExecuteNodeLogString);
+                                    List<String> collect = bpmExecuteNodeLogsString.stream().map(BpmExecuteNodeLog::getTaskNodeName).collect(Collectors.toList());
+                                    //所有的集合我拿到了
+                                    ReportInformationSheet reportInformationSheet1String=new ReportInformationSheet();
+                                    reportInformationSheet1String.setProductCode(stationInformation1.getStationName());//产品码
+                                    List<ReportInformationSheet> reportInformationSheetsString = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1String);
+                                    ReportInformationSheet reportInformationSheet2 = reportInformationSheetsString.get(0);
+                                    String process1 = reportInformationSheet2.getProcess();//这个产品编码上一次是那个工序扫的?
+                                    int nextIndex=0;
+                                    for (int i1 = 0; i1 < collect.size(); i1++) {
+                                        //如果工序名称相同
+                                        if(collect.get(i1).equals(process1)){
+                                            nextIndex=i1+1;
+                                        }
+                                    }
+                                    //说明已经在最后一个节点了,你前边的手持工序在怎么扫都扫不上的
+                                    if(nextIndex>=collect.size()){
+                                        //插入异常报工信息
+                                        extracted(reportInformationSheet,"请选择对应工序的手持机进行扫描");
+                                        return "请选择对应工序的手持机进行扫描";
+                                    }else {
+                                        if(!stationInformation1.getStationName().equals(collect.get(nextIndex))){
+                                            //插入异常报工信息
+                                            extracted(reportInformationSheet,"请选择当前产品对应的工序信息进行扫描");
+                                            return "请选择当前产品对应的工序信息进行扫描";
+                                        }
+                                    }
+                                    //当前工序有没有漏扫
+                                    int result = Math.subtractExact(Integer.parseInt(stationInformation1.getStationName()), 1);
+                                    reportInformationSheet1.setProductCode(String.valueOf(result));//产品码
+                                    List<ReportInformationSheet> reportInformationSheetsLS = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1);
+                                    if(reportInformationSheetsLS.size()>0){
+                                        //插入异常报工信息
+                                        extracted(reportInformationSheet,"当前工序漏扫了一个产品信息--请核对信息");
+                                        return "当前工序漏扫了一个产品信息--请核对信息";
+                                    }
+                                    //根据工位码查询 ---->节点报工日志
+                                    reportInformationSheetMapper.insertReportInformationSheet(reportInformationSheet);
+                                    int i1 = bpmExecuteNodeLogMapper.updateBpmExecuteNodeLogfjqy(upBpmExecuteNodeLog);
+                                    //更新当前工序节点信息
+                                    if(i1 >0){
+                                        return "产品信息扫描成功";
+                                    }else {
+                                        extracted(reportInformationSheet,"更新节点管道工序任务数量失败");
+                                        return "扫码报工失败";
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }else{
+                    return  "当前设备未绑定工位信息";
+                }
+            }
+        } catch (Exception e) {
+            System.out.println(
+                    e.getMessage()
+            );
+            return  "扫描失败";
+        }
+    }
+    /**
+     * 有其他方法调用这个这个基础逻辑
+     * @param contentString
+     * @return
+     */
+    private String  rk(RingScanInformationProdOrderScanning contentString){
+        return "rk";
+    }
+
+
+    /**
+     * 手持扫描实现(作废)
+     * @param contentString
+     * @return
+     */
+    @Override
+    public String stationProductScanningTwo(String contentString) {
+        //扫描人员码信息
+        if(contentString.contains("scan@")){
+            //扫描标记替换为空
+            String replace = contentString.replace("scan@", "");
+            //首先把内容拆分下
+            String[] content = replace.split("&");
+            //人员信息
+            String personneString = content[0];
+            //更改当前人员的扫码信息
+            String[] personneList = personneString.split("#");
+            //设备编码信息
+            String sbMacAddress= content[1];
+            //更改当前工位码的设备信息
+            StationInformation stationInformation = new StationInformation();
+            stationInformation.setDeviceNumber(sbMacAddress);//设备编号
+            List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationListByDEviceNumber(stationInformation);
+            if (stationInformations.size()>0){
+                //重置以前的绑定(手持机在哪我就把那变成空)
+                stationInformationMapper.updateStationInformationDeviceNameAndBluetoothName(stationInformation);
+            }
+            stationInformation.setPersonnelId(personneList[0]);//员工id
+            stationInformation.setPersonnelName(personneList[1]);//员工姓名
+            int i = stationInformationMapper.updateStationInformationByUseIdAndUserName(stationInformation);
+            if(i>0){
+                System.out.println("工位:"+stationInformations.get(0).getStationName()+"人员:"+stationInformations.get(0).getPersonnelName());
+            }
+        }else {
+            //产品编码&mac地址
+            String[] content = contentString.split("&");
+            //产品编码
+            String s1 = content[0];
+            //mac地址
+            String s2 = content[1];
+
+            //1、判断扫的是不是厂内流转卡
+            /*boolean fjqyD = stationProductScanningRingVo.getContentInformation().contains("D");
+            boolean fjqyZ = stationProductScanningRingVo.getContentInformation().contains("Z");
+            if(!fjqyD||!fjqyZ){return "请扫描相关二维码";}*/
+
+            //2、扫描间距判断
+            /* RingScanInformation ringScanInformationQuery=new RingScanInformation();
+            ringScanInformationQuery.setDeviceNumber(split[1]);//设备Mac地址
+            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+            if(ringScanInformations!=null){
+                //拿到上次扫描的时间
+                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+                //拿到当前系统时间
+                LocalDateTime now = LocalDateTime.now();
+                //计算两次时间的时间差
+                Duration duration = Duration.between(scanningTime1, now);
+                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+                //判断两次时间是否大于
+                if (isTwoMinutesPassed) {
+                  return "同一设备,两分钟之内不能重复扫描";
+                }
+            }*/
+
+            //扫码内容
+            RingScanInformation ringScanInformation=new RingScanInformation();
+            //扫描内容
+            ringScanInformation.setContentInformation(s1);
+            //当前时间
+            ringScanInformation.setScanningTime(LocalDateTime.now());
+            //mac地址
+            ringScanInformation.setDeviceNumber(s2);//mac地址
+
+            //4、查询当前机器绑定的工位信息和人信息
+            StationInformation terminalInformation=new StationInformation();
+            terminalInformation.setDeviceNumber(s2);//mac地址
+            List<StationInformation> stationInformations =
+                    stationInformationMapper.selectStationInformationListByDEviceNumber(terminalInformation);
+            if(stationInformations.size()>0){
+                ringScanInformation.setPersonnelName(stationInformations.get(0).getPersonnelName());
+                ringScanInformation.setProcess(stationInformations.get(0).getProcessId()); //人员id
+                ringScanInformation.setProcessName(stationInformations.get(0).getProcessName()); //人员姓名
+                ringScanInformation.setStationId(stationInformations.get(0).getId().toString()); //工位id
+                ringScanInformation.setStationName(stationInformations.get(0).getStationName());//工位名称
+            }
+            String nativeNumber="";
+            if(s1.contains("Z")){nativeNumber = s1.replace("Z", "");}
+            if(s1.contains("D")){nativeNumber=s1.replace("D","");}
+            if(StringUtils.isNotNull(nativeNumber)&&nativeNumber!=""){
+                //取值真实的扫描内容
+                ringScanInformation.setNativeNumbering(nativeNumber);
+            }else {
+                //扫描内容---直接就是产品码
+                ringScanInformation.setNativeNumbering(s1);
+            }
+
+
+            //根据扫描内容拿到生产订单号和订单号
+            String  queryStringOrderNumberAndProductionOrderNumber="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FSaleOrderNo,FBillNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getNativeNumbering()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            Map<String, Object> map = JSON.parseObject(queryStringOrderNumberAndProductionOrderNumber, Map.class);
+            K3CloudApi api = new K3CloudApi();
+            String resultJson = null;
+            try {
+                resultJson = api.billQuery(JSON.toJSONString(map));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+
+            //判断内不为空
+            if(resultJson!=""&resultJson!="[]"){
+                List<JdProductionOrder>    jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                if(jdProductionOrders.size()>0){
+                    //需求单据号
+                    ringScanInformation.setOrderNumber(jdProductionOrders.get(0).getDemandDocument());
+                    //生产订单号
+                    ringScanInformation.setProductionOrderNumber(jdProductionOrders.get(0).getDocumentNumber());
+                    //唯一标识id
+//                    ringScanInformation.setId(UUID.randomUUID().toString());
+                }
+            }
+
+            if(StringUtils.isNotNull(ringScanInformation.getOrderNumber())){
+                //--记录第一扫描(将来第一扫描的单据记录)
+                RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+                ringScanInformationFirst.setOrderNumber(ringScanInformation.getOrderNumber());
+                List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+                //订单扫描记录
+                if(ringScanInformationFirsts.size()<=0){
+                    ringScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformationFirst.setStatus("1");
+                    ringScanInformationFirst.setStartTime(LocalDateTime.now());//开始时间
+                    //查询这个订单的总数量是多少
+                    String sa="{\n" +
+                            "    \"FormId\": \"SAL_SaleOrder\",\n" +
+                            "    \"FieldKeys\": \"FBillNo,FQty\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getOrderNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> mapTotal = JSON.parseObject(sa, Map.class);
+                    String resultJsonTotal = null;
+                    try {
+                        resultJsonTotal = api.billQuery(JSON.toJSONString(mapTotal));
+                    } catch (Exception e) {
+                        System.out.println(e);
+                        throw new RuntimeException(e);
+                    }
+                    List<Map> mapListTotal = JSON.parseArray(resultJsonTotal, Map.class);
+                    if(mapListTotal.size()<=0){
+                        ringScanInformation.setExecutionMark("2");//成功
+                        ringScanInformation.setExecutionMessage("扫描失败");
+                        int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+                        return "订单已关闭-扫描失败";
+                    }
+                    Double totalAmount = mapListTotal.stream()
+                            .filter(map1 -> map1.containsKey("FQty")) // 确保 map 中包含 "amount" 字段
+                            .mapToDouble(map1 -> ((Number) map1.get("FQty")).doubleValue()) // 将 "amount" 字段转换为 double
+                            .sum(); // 求和
+
+                    ringScanInformationFirst.setTotalQuantity(String.valueOf(totalAmount.intValue()));
+                    //第一次扫码记录订单扫描记录信息
+                    int i = ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst);
+                }
+                //先查生产订单日志表没有在新增
+                RingScanInformationProdOrderScanning prodOrderScanning=new RingScanInformationProdOrderScanning();
+                prodOrderScanning.setOrderNumber(ringScanInformation.getOrderNumber());
+                prodOrderScanning.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                List<RingScanInformationProdOrderScanning> ringScanInformationProdOrderScannings =
+                        prodOrderScanningMapper.selectRingScanInformationProdOrderScanningList(prodOrderScanning);
+                if(ringScanInformationProdOrderScannings.size()<0){
+                    //看看这个生产订单包装节点Or检验
+                    String query="{\n" +
+                            "    \"FormId\": \"PRD_MO\",\n" +
+                            "    \"FieldKeys\": \"FMaterialId.FNumber\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"67\",\"Value\":\""+ringScanInformation.getProductionOrderNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> prodListQuery = JSON.parseObject(query, Map.class);
+                    String prodListQueryJson = null;
+                    try {
+                        prodListQueryJson = api.billQuery(JSON.toJSONString(prodListQuery));
+                    } catch (Exception e) {
+                        System.out.println(e);
+                        throw new RuntimeException(e);
+                    }
+                    List<Map> prodListQueryJsonList = JSON.parseArray(prodListQueryJson, Map.class);
+                    //如果ERP存在这个生产订单
+                    if(prodListQueryJsonList.size()>0){
+                        //[{"FMaterialId.FNumber":"1010040050034","FQty":2.0000000000}]
+                        //生产订单日志记录
+                        prodOrderScanning.setTotalQuantity(prodListQueryJsonList.get(0).get("FQty").toString());//数量
+                        if(prodListQueryJsonList.get(0).get("FMaterialId.FNumber").toString().startsWith("1")){
+                            prodOrderScanning.setToPackagingorinspection("1");//到包装
+                        }else if(prodListQueryJsonList.get(0).get("FMaterialId.FNumber").toString().startsWith("2")){
+                            prodOrderScanning.setToPackagingorinspection("2");//到检验
+                        }else {
+                            prodOrderScanning.setToPackagingorinspection("0");//其他
+                        }
+                        int i = prodOrderScanningMapper.insertRingScanInformationProdOrderScanning(prodOrderScanning);
+                        if(i>0){
+                            System.out.println("新增生产订单日志信息成功");
+                        }
+                    }
+                }
+            }
+
+            //插入扫描日志信息
+            int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+
+            if(i2>0){
+                //最后一个节点判定逻辑
+                RingScanInformationProdOrderScanning prodOrderScanning=new RingScanInformationProdOrderScanning();
+                prodOrderScanning.setOrderNumber(ringScanInformation.getOrderNumber());
+                prodOrderScanning.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                List<RingScanInformationProdOrderScanning> ringScanInformationProdOrderScannings =
+                        prodOrderScanningMapper.selectRingScanInformationProdOrderScanningList(prodOrderScanning);
+                if(ringScanInformationProdOrderScannings.size()>0){
+                    String toPackagingorinspection = ringScanInformationProdOrderScannings.get(0).getToPackagingorinspection();
+                    if(toPackagingorinspection.equals("1")){//更新包装数量
+                        String toPackagingorinspection1 = ringScanInformationProdOrderScannings.get(0).getPackingQuantity();
+                        Double d=Double.valueOf(toPackagingorinspection1)+1;
+                        ringScanInformationProdOrderScannings.get(0).setPackingQuantity(d.toString());
+                        int i = prodOrderScanningMapper.updateRingScanInformationProdOrderScanning(ringScanInformationProdOrderScannings.get(0));
+                        System.out.println("包装节点更新成功");
+                        String rk = this.rk(prodOrderScanning);
+                        System.out.println(rk);
+                    }else {//更新检验数量
+                        String toPackagingorinspection1 = ringScanInformationProdOrderScannings.get(0).getInspectionQuantity();
+                        Double d=Double.valueOf(toPackagingorinspection1)+1;
+                        ringScanInformationProdOrderScannings.get(0).setInspectionQuantity(d.toString());
+                        int i = prodOrderScanningMapper.updateRingScanInformationProdOrderScanning(ringScanInformationProdOrderScannings.get(0));
+                        System.out.println("检验节点更新成功");
+                        String rk = this.rk(prodOrderScanning);
+                        System.out.println(rk);
+                    }
+                }
+                return "扫描成功";
+            }else {
+                return "扫描失败";
+            }
+        }
+        return "扫描成功";
+    }
+
+
+    /**
+     * 指环王扫描信息hmc
+     * @param stationProductScanningRingVo
+     * @return
+     */
+    @Override
+    @Transactional
+    public String stationProductScanningRing(StationProductScanningRingVo stationProductScanningRingVo) {
+        //判断扫的是不是厂内流转卡
+//        boolean fjqy = stationProductScanningRingVo.getContentInformation().contains("FJQY");
+//        if(!fjqy){
+//            return "请扫描相关二维码";
+//        };
+        try {
+//            String string = Base64.getDecoder().decode(stationProductScanningRingVo.getDeviceNumber()).toString();
+            String deviceNumberAndName = stationProductScanningRingVo.getDeviceNumber();//设备号
+            String[] split = deviceNumberAndName.split("-");
+            String deviceNumber=split[0];
+            String deviceName=split[1];
+            String scanningTime = stationProductScanningRingVo.getScanningTime();//扫描时间
+            //先获取到当前设备上次的扫描时间
+//            RingScanInformation ringScanInformationQuery=new RingScanInformation();
+//            ringScanInformationQuery.setDeviceName(deviceName);
+//            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+////            if(ringScanInformations!=null){
+//                //拿到上次扫描的时间
+//                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+//                //拿到当前系统时间
+//                LocalDateTime now = LocalDateTime.now();
+//                //计算两次时间的时间差
+//                Duration duration = Duration.between(scanningTime1, now);
+//                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+//                //判断两次时间是否大于
+//                if (isTwoMinutesPassed) {
+//                  return "同一设备,两分钟之内不能重复扫描";
+//                }
+//            }
+            String contentInformation = stationProductScanningRingVo.getContentInformation();//扫描内容
+            RingScanInformation ringScanInformation=new RingScanInformation();
+            ringScanInformation.setContentInformation(contentInformation);
+            LocalDateTime localDateTime = DateUtils.toLocalDateTime(scanningTime, "yyyy-MM-dd HH:mm:ss");
+            ringScanInformation.setScanningTime(localDateTime);
+            ringScanInformation.setDeviceName(deviceName);
+            ringScanInformation.setDeviceNumber(deviceNumber);
+            //赋值当前扫描人
+            TerminalInformation terminalInformation=new TerminalInformation();
+            terminalInformation.setStationName(deviceNumber);
+            List<TerminalInformation> terminalInformations = terminalInformationMapper.selectTerminalInformationList(terminalInformation);
+            if(terminalInformations.size()>0){
+                ringScanInformation.setPersonnelName(terminalInformations.get(0).getPersonnelName());
+                ringScanInformation.setProcess(terminalInformations.get(0).getProcess());
+                ringScanInformation.setProcessName(terminalInformations.get(0).getProcessName());
+            }
+
+            String nativeNumber="";
+            if(contentInformation.contains("Z")){
+                nativeNumber = contentInformation.replace("Z", "");
+            }
+            if(contentInformation.contains("D")){
+                nativeNumber=contentInformation.replace("D","");
+            }
+            if(StringUtils.isNotNull(nativeNumber)&&nativeNumber!=""){
+                //取值真实的扫描内容
+                ringScanInformation.setNativeNumbering(nativeNumber);
+            }else {
+                //扫描内容
+                ringScanInformation.setNativeNumbering(contentInformation);
+            }
+            //根据扫描内容拿到生产订单号和订单号
+            String  queryStringOrderNumberAndProductionOrderNumber="{\n" +
+                    "    \"FormId\": \"PRD_MO\",\n" +
+                    "    \"FieldKeys\": \"FSaleOrderNo,FBillNo\",\n" +
+                    "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSerialNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getNativeNumbering()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
+                    "    \"OrderString\": \"\",\n" +
+                    "    \"TopRowCount\": 0,\n" +
+                    "    \"StartRow\": 0,\n" +
+                    "    \"Limit\": 2000,\n" +
+                    "    \"SubSystemId\": \"\"\n" +
+                    "}";
+            Map<String, Object> map = JSON.parseObject(queryStringOrderNumberAndProductionOrderNumber, Map.class);
+            K3CloudApi api = new K3CloudApi();
+            String resultJson = api.billQuery(JSON.toJSONString(map));
+            //判断内不为空
+            if(resultJson!=""&resultJson!="[]"){
+                List<JdProductionOrder>    jdProductionOrders = JSON.parseArray(resultJson, JdProductionOrder.class);
+                if(jdProductionOrders.size()>0){
+                    //需求单据号
+                    ringScanInformation.setOrderNumber(jdProductionOrders.get(0).getDemandDocument());
+                    //生产订单号
+                    ringScanInformation.setProductionOrderNumber(jdProductionOrders.get(0).getDocumentNumber());
+                }
+            }
+            if(StringUtils.isNotNull(ringScanInformation.getOrderNumber())){
+                //--记录第一扫描(将来第一扫描的单据记录)
+                RingScanInformationFirst ringScanInformationFirst=new RingScanInformationFirst();
+                ringScanInformationFirst.setOrderNumber(ringScanInformation.getOrderNumber());
+                List<RingScanInformationFirst> ringScanInformationFirsts = ringScanInformationFirstMapper.selectRingScanInformationFirstList(ringScanInformationFirst);
+                if(ringScanInformationFirsts.size()<=0){
+                    ringScanInformationFirst.setProductionOrderNumber(ringScanInformation.getProductionOrderNumber());
+                    ringScanInformationFirst.setStatus("1");
+                    ringScanInformationFirst.setStartTime(LocalDateTime.now());//开始时间
+                    //查询这个订单的总数量是多少
+                    String sa="{\n" +
+                            "    \"FormId\": \"SAL_SaleOrder\",\n" +
+                            "    \"FieldKeys\": \"FBillNo,FQty\",\n" +
+                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+ringScanInformation.getOrderNumber()+"+\",\"Right\":\"\",\"Logic\":0}],\n" +
+                            "    \"OrderString\": \"\",\n" +
+                            "    \"TopRowCount\": 0,\n" +
+                            "    \"StartRow\": 0,\n" +
+                            "    \"Limit\": 2000,\n" +
+                            "    \"SubSystemId\": \"\"\n" +
+                            "}";
+                    Map<String, Object> mapTotal = JSON.parseObject(sa, Map.class);
+                    String resultJsonTotal = api.billQuery(JSON.toJSONString(mapTotal));
+                    List<Map> mapListTotal = JSON.parseArray(resultJsonTotal, Map.class);
+                    Double totalAmount = mapListTotal.stream()
+                            .filter(map1 -> map1.containsKey("FQty")) // 确保 map 中包含 "amount" 字段
+                            .mapToDouble(map1 -> ((Number) map1.get("FQty")).doubleValue()) // 将 "amount" 字段转换为 double
+                            .sum(); // 求和
+                    ringScanInformationFirst.setTotalQuantity(String.valueOf(totalAmount.intValue()));
+                    int i = ringScanInformationFirstMapper.insertRingScanInformationFirst(ringScanInformationFirst);
+                }
+            }
+            int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
+            if(i2>0){
+                return "扫描成功";
+            }else {
+                return "扫描失败";
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+//        //产品扫描逻辑
+//            String[] content = stationProductScanningRingVo.getContentInformation().split("&");
+//            StationInformation stationInformation=new StationInformation();
+//            stationInformation.setDeviceName(content[1]);//设备名称
+//            //查询工位信息表
+//            List<StationInformation> stationInformations = stationInformationMapper.selectStationInformationList(stationInformation);
+//            //节点.
+//            if(stationInformations.size()>0){
+//                StationInformation stationInformation1 = stationInformations.get(0);//根据手持机设备名称得到工位信息
+//                ReportInformationSheet reportInformationSheet=new ReportInformationSheet();
+//                reportInformationSheet.setCurrentStationStationPeople(stationInformation1.getPersonnelName());//工位人员姓名
+//                reportInformationSheet.setStationCode(stationInformation1.getStationCode());//工位码
+//                reportInformationSheet.setProcess(stationInformation1.getStationName());//工序名称
+//                reportInformationSheet.setProductCode(content[0]);//产品码
+//                reportInformationSheet.setHandheldDevice(content[1]);//手持机
+//                reportInformationSheet.setCreateTime(new DateTime());//创建时间
+//                //推算出来产品编号或者订单编号
+//                String modifiedString = "DQY" + content[0].substring(0, content[0].length() - 3);
+//                reportInformationSheet.setOrderNumber(modifiedString);//订单号或任务号
+//                //更新节点生产数量
+//                //先拿到当前任务数量
+//                List<ProductionPlanningManagement> productionPlanningManagements = productionPlanningManagementMapper.selectProductionPlanningManagementByOrderNumebrOrPlanNumber(modifiedString, modifiedString);
+//                if(productionPlanningManagements.size()<=0){
+//                    //插入异常报工信息
+//                    extracted(reportInformationSheet,"未找到当前产品计划报工失败--信息不匹配");
+//                    return "未找到当前产品计划报工失败--信息不匹配";
+//                }else {
+//                    boolean equals = productionPlanningManagements.get(0).getPlanType().equals("3");
+//                    if(equals){
+//                        //插入异常报工信息
+//                        extracted(reportInformationSheet,"该计划已经完成--信息不匹配");
+//                        return "该计划已经完成--信息不匹配";
+//                    }else {
+//                        //找到计划了先确认下数量(我计划下的数量)
+//                        ProductionPlanningManagement productionPlanningManagement = productionPlanningManagements.get(0);
+//                        //拿到计划id------->根据计划id查询流程信息
+//                        BpmExecuteProcess process=new BpmExecuteProcess();
+//                        process.setTaskPlanKey(productionPlanningManagement.getId().toString());//计划id
+//                        List<BpmExecuteProcess> bpmExecuteProcesses = bpmExecuteProcessMapper.selectBpmExecuteProcessListfjqy(process);
+//                        if(bpmExecuteProcesses.size()<=0){
+//                            //插入异常报工信息
+//                            extracted(reportInformationSheet,"没有找到当前计划的流程管道--信息不匹配");
+//                            return "没有找到当前计划的流程管道--信息不匹配";
+//                        }else {
+//                            //管道
+//                            String taskKey = bpmExecuteProcesses.get(0).getTaskKey();
+//                            BpmExecuteNodeLog bpmExecuteNodeLog=new BpmExecuteNodeLog();
+//                            bpmExecuteNodeLog.setTaskProcessKey(taskKey);//流程编号
+//                            bpmExecuteNodeLog.setTaskNodeName(stationInformation1.getStationName());//工序名称
+//                            List<BpmExecuteNodeLog> bpmExecuteNodeLogs = bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogListfjqy(bpmExecuteNodeLog);
+//                            String taskNodeNumber = bpmExecuteNodeLogs.get(0).getTaskNodeNumber();//节点数量
+//                            //判断你当前报工工序节点是否已经报够数量了
+//                            if(taskNodeNumber==null||taskNodeNumber.equals("")){
+//                                taskNodeNumber="0";
+//                            }
+//                            if(Integer.parseInt(taskNodeNumber)>=Integer.parseInt(productionPlanningManagement.getQuantity())){
+//                                //插入异常报工信息
+//                                extracted(reportInformationSheet,"当前工序已完成计划数量");
+//                                return "当前工序已完成计划数量";
+//                            }else {
+//                                //否则更新接单已完成数量
+//                                int i = Math.addExact(Integer.parseInt(taskNodeNumber), 1);
+//                                BpmExecuteNodeLog upBpmExecuteNodeLog=new BpmExecuteNodeLog();
+//                                upBpmExecuteNodeLog.setTaskNodeNumber(String.valueOf(i));//更新数量
+//                                upBpmExecuteNodeLog.setId(bpmExecuteNodeLogs.get(0).getId());//节点日志id
+//                                //判断同一部手持机扫描时间间隔是否超过一分钟
+//                                ReportInformationSheet sheetsjjg=new ReportInformationSheet();
+//                                sheetsjjg.setProcess(stationInformation1.getStationName());//工序
+//                                sheetsjjg.setHandheldDevice(content[2]);//设备信息
+//                                ReportInformationSheet reportInformationSheetsSc = reportInformationSheetMapper.selectReportInformationSheetListOrderBy(sheetsjjg);
+//                                Date date1 = reportInformationSheetsSc.getCreateTime(); //上次扫码时间
+//                                Date date2 = new Date();//当前时间
+//                                String s = DateUtils.timeDistanceMin(date2, date1);
+//                                if(Integer.parseInt(s)<1){
+//                                    //插入异常报工信息
+//                                    extracted(reportInformationSheet,"两次扫码之间的间隔不能小于1分钟");//???? 看看那个小工人有这个坏心思
+//                                    return "两次扫码之间的间隔不能小于1分钟";
+//                                }
+//                                //工序--产品重复扫描
+//                                ReportInformationSheet reportInformationSheet1=new ReportInformationSheet();
+//                                reportInformationSheet1.setProcess(stationInformation1.getStationName());//工序名称
+//                                reportInformationSheet1.setProductCode(stationInformation1.getStationName());//产品码
+//                                List<ReportInformationSheet> reportInformationSheets = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1);
+//                                if(reportInformationSheets.size()>0){
+//                                    //插入异常报工信息
+//                                    extracted(reportInformationSheet,"产品不能重复扫描");
+//                                    return "产品不能重复扫描";
+//                                }
+//
+//                                //当前产品只能被下一个工序进行扫描
+//                                //查询当前计划的所有工序信息
+//                                BpmExecuteNodeLog bpmExecuteNodeLogString=new BpmExecuteNodeLog();
+//                                bpmExecuteNodeLog.setTaskProcessKey(taskKey);//流程编号
+//                                List<BpmExecuteNodeLog> bpmExecuteNodeLogsString = bpmExecuteNodeLogMapper.selectBpmExecuteNodeLogListfjqy(bpmExecuteNodeLogString);
+//                                List<String> collect = bpmExecuteNodeLogsString.stream().map(BpmExecuteNodeLog::getTaskNodeName).collect(Collectors.toList());
+//                                //所有的集合我拿到了
+//                                ReportInformationSheet reportInformationSheet1String=new ReportInformationSheet();
+//                                reportInformationSheet1String.setProductCode(stationInformation1.getStationName());//产品码
+//                                List<ReportInformationSheet> reportInformationSheetsString = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1String);
+//                                ReportInformationSheet reportInformationSheet2 = reportInformationSheetsString.get(0);
+//                                String process1 = reportInformationSheet2.getProcess();//这个产品编码上一次是那个工序扫的?
+//                                int nextIndex=0;
+//                                for (int i1 = 0; i1 < collect.size(); i1++) {
+//                                    //如果工序名称相同
+//                                    if(collect.get(i1).equals(process1)){
+//                                        nextIndex=i1+1;
+//                                    }
+//                                }
+//                                //说明已经在最后一个节点了,你前边的手持工序在怎么扫都扫不上的
+//                                if(nextIndex>=collect.size()){
+//                                    //插入异常报工信息
+//                                    extracted(reportInformationSheet,"请选择对应工序的手持机进行扫描");
+//                                    return "请选择对应工序的手持机进行扫描";
+//                                }else {
+//                                    if(!stationInformation1.getStationName().equals(collect.get(nextIndex))){
+//                                        //插入异常报工信息
+//                                        extracted(reportInformationSheet,"请选择当前产品对应的工序信息进行扫描");
+//                                        return "请选择当前产品对应的工序信息进行扫描";
+//                                    }
+//                                }
+//                                //当前工序有没有漏扫
+//                                int result = Math.subtractExact(Integer.parseInt(stationInformation1.getStationName()), 1);
+//                                reportInformationSheet1.setProductCode(String.valueOf(result));//产品码
+//                                List<ReportInformationSheet> reportInformationSheetsLS = reportInformationSheetMapper.selectReportInformationSheetList(reportInformationSheet1);
+//                                if(reportInformationSheetsLS.size()>0){
+//                                    //插入异常报工信息
+//                                    extracted(reportInformationSheet,"当前工序漏扫了一个产品信息--请核对信息");
+//                                    return "当前工序漏扫了一个产品信息--请核对信息";
+//                                }
+//                                //根据工位码查询 ---->节点报工日志
+//                                reportInformationSheetMapper.insertReportInformationSheet(reportInformationSheet);
+//                                int i1 = bpmExecuteNodeLogMapper.updateBpmExecuteNodeLogfjqy(upBpmExecuteNodeLog);
+//                                //更新当前工序节点信息
+//                                if(i1 >0){
+//                                    return "产品信息扫描成功";
+//                                }else {
+//                                    extracted(reportInformationSheet,"更新节点管道工序任务数量失败");
+//                                    return "扫码报工失败";
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }else{
+//                return  "当前设备未绑定工位信息";
+//            }
+    }
+
+
+    /**
+     * 插入异常报工信息
+     * @param reportInformationSheet
+     * @param msg
+     */
+    private void extracted(ReportInformationSheet reportInformationSheet,String msg) {
+        ExceptionReportInformationSheet exceptionReportInformationSheet = new ExceptionReportInformationSheet();
+        BeanUtils.copyProperties(reportInformationSheet, exceptionReportInformationSheet);
+        exceptionReportInformationSheet.setExceptionMessage(msg);
+        exceptionReportInformationSheetMapper.insertExceptionReportInformationSheet(exceptionReportInformationSheet);
+    }
+
+}
+
+
+
+

+ 425 - 637
zkqy-fujian-amichi/src/main/java/com/zkqy/amichi/service/impl/StationInformationServiceImpl.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.kingdee.bos.webapi.sdk.K3CloudApi;
+
 import com.zkqy.amichi.domain.*;
 import com.zkqy.amichi.domain.vo.ScanStatistics;
 import com.zkqy.amichi.domain.vo.StationProductScanningRingVo;
@@ -18,7 +19,6 @@ import com.zkqy.amichi.jd.domain.JdProductionOrder;
 import com.zkqy.amichi.jd.domain.MaterialRetentionLogVo;
 import com.zkqy.amichi.mapper.*;
 import com.zkqy.amichi.service.IStationInformationService;
-import com.zkqy.amichi.service.RkService;
 import com.zkqy.amichi.utils.WarehouseEntryNumberGenerator;
 import com.zkqy.common.core.domain.entity.SysTenant;
 import com.zkqy.common.utils.DateUtils;
@@ -30,6 +30,7 @@ import com.zkqy.execution.produce.dispersed.mapper.BpmExecuteProcessMapper;
 import com.zkqy.framework.web.service.SysLoginService;
 import com.zkqy.system.mapper.SysDictDataMapper;
 import com.zkqy.system.mapper.SysTenantMapper;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -40,13 +41,13 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.io.IOException;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.*;
 import java.util.stream.Collectors;
 
 
-
 /**
  * 工位信息Service业务层处理
  *
@@ -54,6 +55,7 @@ import java.util.stream.Collectors;
  * @date 2024-08-20
  */
 @Service
+@Slf4j
 public class StationInformationServiceImpl implements IStationInformationService
 {
     @Autowired
@@ -113,9 +115,12 @@ public class StationInformationServiceImpl implements IStationInformationService
     @Value("classpath:processReport.json")
     private Resource processReport;
 
+    @Value("classpath:xt.json")
+    private Resource xt;
+
 
-    @Value("classpath:storage.json")
-    private Resource storage;
+    @Value("classpath:bc.json")
+    private Resource bc;
 
     @Autowired
     SysDictDataMapper dictDataMapper;
@@ -284,22 +289,22 @@ public class StationInformationServiceImpl implements IStationInformationService
             if(!fjqyD||!fjqyZ){return "请扫描相关二维码";}*/
 
             //2、扫描间距判断
-            /* RingScanInformation ringScanInformationQuery=new RingScanInformation();
-            ringScanInformationQuery.setDeviceNumber(split[1]);//设备Mac地址
-            RingScanInformation ringScanInformations = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
-            if(ringScanInformations!=null){
+            RingScanInformation ringScanInformationQuery=new RingScanInformation();
+            ringScanInformationQuery.setDeviceNumber(s2);//设备Mac地址
+            RingScanInformation ringScanInformationsjg = ringScanInformationMapper.selectRingScanInformationListDateTimeMax(ringScanInformationQuery);
+            if(ringScanInformationsjg!=null){
                 //拿到上次扫描的时间
-                LocalDateTime scanningTime1 = ringScanInformations.getScanningTime();
+                LocalDateTime scanningTime1 = ringScanInformationsjg.getScanningTime();
                 //拿到当前系统时间
-                LocalDateTime now = LocalDateTime.now();
+                LocalDateTime now1 = LocalDateTime.now();
                 //计算两次时间的时间差
-                Duration duration = Duration.between(scanningTime1, now);
-                boolean isTwoMinutesPassed = duration.toMinutes() < 1;
+                Duration duration = Duration.between(scanningTime1, now1);
+                boolean isTwoMinutesPassed = duration.toMillis() < 2000;
                 //判断两次时间是否大于
                 if (isTwoMinutesPassed) {
-                  return "同一设备,两分钟之内不能重复扫描";
+                    return "同一设备-五秒之内-不能重复扫描-0-0-0-0";
                 }
-            }*/
+            }
 
             //扫码内容
             RingScanInformation ringScanInformation=new RingScanInformation();
@@ -496,18 +501,34 @@ public class StationInformationServiceImpl implements IStationInformationService
                         RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getPackingQuantity(), ringScanInformation, "1");
                         ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
                         String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "3", ringScanInformation);//生产订单号,工序名
-                        if(aa.equals("工序汇报创建失败")){
+                        if(aa.equals("工序汇报单下推失败")){
+                            if(aa.contains("返还件退料套数小于累计汇报数")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                            }
+                            if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                            }
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-创建失败-扫描失败-0-0-0-0";
                         }
-                        if(aa.equals("工序汇报提交失败")){
+                        if(aa.equals("工序汇报单修改保存失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-修改保存失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报单提交失败")){
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-提交失败-扫描失败-0-0-0-0";
                         }
-                        if(aa.equals("工序汇报审核失败")){
+                        if(aa.equals("工序汇报审核失败")){
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-审核失败-扫描失败-0-0-0-0";
                         }
+                        if(aa.contains("不成功")||aa.contains("失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                        }
                     }else if(materialId.startsWith("2")&&ringScanInformation.getProcessName().equals("试机检验")) {
 
                         //更新成品检验(只扫一次也需要更新包装或者检验的数量)
@@ -518,18 +539,34 @@ public class StationInformationServiceImpl implements IStationInformationService
                         RingScanInformationFirst newRingScanInformationFirst = getRingScanInformationFirst(ringScanInformationFirstNumber.getPackingQuantity(), ringScanInformation, "1");
                         ringScanInformationFirstMapper.updateRingScanInformationFirstByproductionOrderNumber(newRingScanInformationFirst);
                         String aa= generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(),ringScanInformation.getProcessName(),"4",ringScanInformation);//生产订单号,工序名
-                        if(aa.equals("工序汇报创建失败")){
+                        if(aa.equals("工序汇报单下推失败")){
+                            if(aa.contains("返还件退料套数小于累计汇报数")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                            }
+                            if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                            }
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-创建失败-扫描失败-0-0-0-0";
                         }
-                        if(aa.equals("工序汇报提交失败")){
+                        if(aa.equals("工序汇报单修改保存失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "汇报单-修改保存失败-扫描失败-0-0-0-0";
+                        }
+                        if(aa.equals("工序汇报单提交失败")){
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-提交失败-扫描失败-0-0-0-0";
                         }
-                        if(aa.equals("工序汇报审核失败")){
+                        if(aa.equals("工序汇报审核失败")){
                             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                             return "汇报单-审核失败-扫描失败-0-0-0-0";
                         }
+                        if(aa.contains("不成功")||aa.contains("失败")){
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                            return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                        }
                     }
                 }}
             }else {
@@ -597,6 +634,14 @@ public class StationInformationServiceImpl implements IStationInformationService
                             //生产汇报  等于代表走工序汇报逻辑 1 和 2代表入的什么仓库(1:成品 2:利库)   3和4 代表走工序汇报逻辑(3:成品 4:利库)
                             String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "3", ringScanInformation);//生产订单号,工序名
                             if(aa.equals("工序汇报创建失败")){
+                                if(aa.contains("返还件退料套数小于累计汇报数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                                }
+                                if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                                }
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "汇报单-创建失败-扫描失败-0-0-0-0";
                             }
@@ -608,6 +653,10 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "汇报单-审核失败-扫描失败-0-0-0-0";
                             }
+                            if(aa.contains("不成功")||aa.contains("失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                            }
                         }
                     }else if(materialId.startsWith("2")&&ringScanInformation.getProcessName().equals("试机检验")) {
                         //有关于这个产品的扫描信息就不更新数量了
@@ -621,10 +670,22 @@ public class StationInformationServiceImpl implements IStationInformationService
                             //生产汇报
                             //等于代表走工序汇报逻辑 1 和 2代表入的什么仓库(1:成品 2:利库)   3和4 代表走工序汇报逻辑(3:成品 4:利库)
                             String aa = generateWarehouseWarrant(ringScanInformation.getProductionOrderNumber(), ringScanInformation.getProcessName(), "4", ringScanInformation);//生产订单号,工序名
-                            if(aa.equals("工序汇报创建失败")){
+                            if(aa.equals("工序汇报单下推失败")){
+                                if(aa.contains("返还件退料套数小于累计汇报数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(未退料)-扫描失败-0-0-0-0";
+                                }
+                                if(aa.contains("下达日期大于生产汇报单的单据日期")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "汇报单-创建失败(下达日期大于单据日期)-扫描失败-0-0-0-0";
+                                }
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "汇报单-创建失败-扫描失败-0-0-0-0";
                             }
+                            if(aa.equals("工序汇报单修改保存失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "汇报单-修改保存失败-扫描失败-0-0-0-0";
+                            }
                             if(aa.equals("工序汇报提交失败")){
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "汇报单-提交失败-扫描失败-0-0-0-0";
@@ -633,6 +694,10 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "汇报单-审核失败-扫描失败-0-0-0-0";
                             }
+                            if(aa.contains("不成功")||aa.contains("失败")){
+                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                return "有问题-请联系管理员-扫描失败-0-0-0-0";
+                            }
                         }
                     }
                     else if(materialId.startsWith("1")&&ringScanInformation.getProcessName().equals("入库")){//1开头产品的入库逻辑
@@ -648,9 +713,17 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "未查询到-生产汇报信息-扫描失败-0-0-0-0";
                             }
-                            if(s.contains("入库单创建失败")){
+                            if(s.contains("入库单下推失败")){
+                                if(s.contains("存在以下领用套数小于累计入库数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "入库单-"+("创建失败(车间仓物料不足)")+"-扫描失败-0-0-0-0";
+                                }
+                                if(s.contains("当前单据中物料的基本单位/库存辅单位与即时库存中的基本单位/库存辅单位不一致")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "入库单-"+("单位问题,请联系管理员")+"-扫描失败-0-0-0-0";
+                                }
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                                return "入库单-"+("创建失败(车间仓物料不足)")+"-扫描失败-0-0-0-0";
+                                return "入库单-"+("下推失败")+"-扫描失败-0-0-0-0";
                             }
                             if(s.contains("入库单提交失败")){
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -660,7 +733,7 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "入库单-审核失败-扫描失败-0-0-0-0";
                             }
-                            if(s.contains("有问题请联系管理员")){
+                            if(s.contains("不成功")||s.contains("失败")){
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "有问题-请联系管理员-扫描失败-0-0-0-0";
                             }
@@ -678,9 +751,17 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "未查询到-生产汇报信息-扫描失败-0-0-0-0";
                             }
-                            if(s.contains("入库单创建失败")){
+                            if(s.contains("入库单下推失败")){
+                                if(s.contains("存在以下领用套数小于累计入库数")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "入库单-"+("创建失败(车间仓物料不足)")+"-扫描失败-0-0-0-0";
+                                }
+                                if(s.contains("当前单据中物料的基本单位/库存辅单位与即时库存中的基本单位/库存辅单位不一致")){
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return "入库单-"+("单位问题,请联系管理员")+"-扫描失败-0-0-0-0";
+                                }
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                                return "入库单-"+s+"-扫描失败-0-0-0-0";
+                                return "入库单-"+("下推失败")+"-扫描失败-0-0-0-0";
                             }
                             if(s.contains("入库单提交失败")){
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -690,7 +771,7 @@ public class StationInformationServiceImpl implements IStationInformationService
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "入库单-审核失败-扫描失败-0-0-0-0";
                             }
-                            if(s.contains("有问题请联系管理员")){
+                            if(s.contains("不成功")||s.contains("失败")){
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return "有问题-请联系管理员-扫描失败-0-0-0-0";
                             }
@@ -783,7 +864,6 @@ public class StationInformationServiceImpl implements IStationInformationService
             }
             int i2 = ringScanInformationMapper.insertRingScanInformation(ringScanInformation);
 
-
             //查询当前工位信息
             ScanStatistics scanStatistics = null;
             RingScanInformation ringScanInformation1=new RingScanInformation();
@@ -1169,7 +1249,7 @@ public class StationInformationServiceImpl implements IStationInformationService
      * @param productionOrderNumber
      * type 1入成品 type 2 入利库 type 3走工序汇报逻辑,实际我并没有获取这个参数
      */
-    public  String  generateWarehouseWarrant(String productionOrderNumber,String gxName,String type,RingScanInformation ringScanInformation){
+    public  String  generateWarehouseWarrant(String productionOrderNumber,String gxName,String type,RingScanInformation ringScanInformation) throws Exception {
         if(gxName.equals("入库")){
             RingScanInformationFirst newRingScanInformationFirst = new RingScanInformationFirst();
             newRingScanInformationFirst.setProductionOrderNumber(productionOrderNumber);
@@ -1194,8 +1274,8 @@ public class StationInformationServiceImpl implements IStationInformationService
                     if(ac.get("msg").equals("未查询到生产汇报信息")){
                         return "未查询到生产汇报信息";
                     }
-                    if(ac.get("msg").equals("入库单创建失败")){
-                        return "入库单创建失败"+ac.get("error");
+                    if(ac.get("msg").equals("入库单下推失败")){
+                        return "入库单下推失败"+ac.get("error");
                     }
                     if(ac.get("msg").equals("入库单提交失败")){
                         return "入库单提交失败";
@@ -1217,11 +1297,11 @@ public class StationInformationServiceImpl implements IStationInformationService
                         if(ac.get("msg").equals("未查询到生产汇报信息")){
                             return "未查询到生产汇报信息";
                         }
-                        if(ac.get("msg").equals("入库单创建失败")){
-                            return "入库单创建失败"+ac.get("error");
+                        if(ac.get("msg").equals("入库单下推失败")){
+                            return "入库单下推失败"+ac.get("error");
                         }
                         if(ac.get("msg").equals("入库单提交失败")){
-                            return "入库单创建失败";
+                            return "入库单提交失败";
                         }
                         if(ac.get("msg").equals("入库单审核失败")){
                             return "入库单审核失败";
@@ -1255,38 +1335,41 @@ public class StationInformationServiceImpl implements IStationInformationService
                         planTaskDetails.setStatus("2");//生产完成
                         int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
                         //扣料操作
-                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
-                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
+//                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
+//                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
                     }
                     //工序汇报 0 为单个推送
-                    String aa =  erpProcessReport(planTaskDetails1.get(0),type,"单量推送",ringScanInformation);
-                    if(aa.equals("工序汇报创建失败")){
-                        return aa;
+                    Map<String,String> aa =  erpProcessReport(planTaskDetails1.get(0),type,"单量推送",ringScanInformation);
+                    if(aa.get("msg").equals("工序汇报单下推失败")){
+                        return aa.get("msg")+aa.get("error");
                     }
-                    if(aa.equals("工序汇报提交失败")){
-                        return aa;
+                    if(aa.get("msg").equals("工序汇报单修改保存失败")){
+                        return aa.get("msg")+aa.get("error");
                     }
-                    if(aa.equals("工序汇报审核失败")){
-                        return aa;
+                    if(aa.get("msg").equals("工序汇报单提交失败")){
+                        return aa.get("msg")+aa.get("error");
+                    }
+                    if(aa.get("msg").equals("工序汇报单审核失败")){
+                        return aa.get("msg")+aa.get("error");
                     }
                     System.out.println("工序汇报单量推送");
                 }else if(packingOrInspection.equals("2")){ //试机数量--下推生产汇报单
                     //看包装跟当前生产订单总数量是否相等
                     if(ringScanInformationFirst.getInspectionQuantity().equals(ringScanInformationFirst.getProductionOrderTotalQuantity())){
                         //生产汇报 1为批量推送
-                        String aa = erpProcessReport(planTaskDetails1.get(0), type, "全量推送", ringScanInformation);
-                        if(aa.equals("工序汇报创建失败")){
-                            return aa;
+                        Map<String,String> aa = erpProcessReport(planTaskDetails1.get(0), type, "全量推送", ringScanInformation);
+                        if(aa.get("msg").equals("工序汇报单下推失败")){
+                            return aa.get("msg")+aa.get("error");
                         }
-                        if(aa.equals("工序汇报提交失败")){
-                            return aa;
+                        if(aa.get("msg").equals("工序汇报提交失败")){
+                            return aa.get("msg")+aa.get("error");
                         }
-                        if(aa.equals("工序汇报审核失败")){
-                            return aa;
+                        if(aa.get("msg").equals("工序汇报审核失败")){
+                            return aa.get("msg")+aa.get("error");
                         }
                         //扣料操作
-                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
-                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
+//                        String s = sweepingMaterial(ringScanInformation.getOrderNumber(), ringScanInformation.getProductionOrderNumber(), //订单号   生产订单号
+//                                ringScanInformation.getProcessName(), ringScanInformation.getNativeNumbering());//工序     流转卡信息
                         //加更正生产订单状态
                         planTaskDetails.setStatus("2");//生产完成
                         int i2 = planTaskDetailsMapper.updatePlanTaskDetailsByDemandDocument(planTaskDetails);
@@ -1304,281 +1387,175 @@ public class StationInformationServiceImpl implements IStationInformationService
      * txfs:判断是成品检验还是试机检验
      * @param planTaskDetails1
      */
-    private String erpProcessReport(PlanTaskDetails planTaskDetails1,String type,String txfs,RingScanInformation ringScanInformation) {
-
+    private Map<String,String> erpProcessReport(PlanTaskDetails planTaskDetails1,String type,String txfs,RingScanInformation ringScanInformation) throws Exception {
         //生产汇报
         ObjectMapper objectMapper = new ObjectMapper();
-        try {
-            Map<String, Object> jsonData = objectMapper.readValue(processReport.getInputStream(), Map.class);
-            //得到Model
-            String model1 = objectMapper.writeValueAsString(jsonData.get("Model"));
-            Map<String,Object> modelMap = objectMapper.readValue(model1, Map.class);
-            String localDateTimeStr = DateUtils.toLocalDateTimeStr(LocalDateTime.now());
-            modelMap.put("FDate",localDateTimeStr);
-            //得到FEntity
-            String fEntityString = objectMapper.writeValueAsString(modelMap.get("FEntity"));
-            List<Map> list = objectMapper.readValue(fEntityString, List.class);
-            Map map = list.get(0);
-            String fMaterialId = map.get("FMaterialId").toString();
-            map.put("FSrcEntryId",planTaskDetails1.getFtreeEntityFentryid());
-            String fMaterialIdString = objectMapper.writeValueAsString(map.get("FMaterialId"));
-            Map<String,String > map1 = objectMapper.readValue(fMaterialIdString, Map.class);
-            map1.put("FNumber",planTaskDetails1.getMaterialId());
-            map.put("FMaterialId",map1);
-
-            //生产车间信息
-            boolean present = Optional.ofNullable(planTaskDetails1.getShopCoding()).filter(a -> !a.isEmpty()).isPresent();
-            if(present){
-                HashMap<String, String> shopCoding = new HashMap<>();
-                shopCoding.put("FNumber",planTaskDetails1.getShopCoding());
-                map.put("FWorkshipId",shopCoding);
-            }
-
-            map.put("FMoBillNo",planTaskDetails1.getDemandDocument());
-            map.put("FSrcBillNo",planTaskDetails1.getDemandDocument()); //生产订单号
-            map.put("FReqBillNo",ringScanInformation.getOverNumber()); //订单号
-            map.put("FStartTime",localDateTimeStr);
-            map.put("FEndTime",localDateTimeStr);
-            HashMap fbomdIdMap=new HashMap();
-            fbomdIdMap.put("FNumber",planTaskDetails1.getFbomIdFnumber());
-            map.put("FBomId",fbomdIdMap);
-
-            //单位
-            HashMap<String,String>  dw=new HashMap();
-            dw.put("FNumber",planTaskDetails1.getFunitidfNumber());
-            map.put("FUnitID",dw);
-
-
-
-            //基本单位
-            HashMap<String,String>  baseUtil=new HashMap();
-            baseUtil.put("FNumber",planTaskDetails1.getfBaseUnitId());
-            map.put("FBaseUnitId",baseUtil);
-
-
-            HashMap FStockId=new HashMap();
-            if(type.equals("3")){
-                FStockId.put("FNumber","CK007"); //成品仓
-            }else if(type.equals("4")) {
-                FStockId.put("FNumber","CK006"); //利库仓
-            }
-
-            map.put("FStockId",FStockId);
-
-            //序列号单位
-            String FSNUnitIDJson = objectMapper.writeValueAsString( map.get("FSNUnitID"));
-            Map<String,String > FSNUnitIDMap = objectMapper.readValue(FSNUnitIDJson, Map.class);
-            FSNUnitIDMap.put("FNumber",planTaskDetails1.getFunitidfNumber());
-            map.put("FSNUnitID",FSNUnitIDMap);//序列号单位
-
-            map.put("FReqBillNo",planTaskDetails1.getFsrcbillno()); //源单编号
-            map.put("FSrcInterId",planTaskDetails1.getFid());
-            map.put("FMoId",planTaskDetails1.getFid());
-            map.put("FMoEntryId",planTaskDetails1.getFtreeEntityFentryid());
-            map.put("FMOMAINENTRYID",planTaskDetails1.getFtreeEntityFentryid());
-
-            if(txfs.equals("全量推送")){
-                //序列号单据体---循环
-                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-                productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
-                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-
-                map.put("FSNQty",productionCardFlows.size()); //序列号数量
-                map.put("FFinishQty",planTaskDetails1.getQuantity()); //完成数量
-                map.put("FFinishQty",planTaskDetails1.getQuantity()); //合格数量
-
-                List<Map> list1=new ArrayList<>();
-                //String FSerialSubEntity = map.get("FSerialSubEntity").toString();
-                String FSerialSubEntityJson = objectMapper.writeValueAsString( map.get("FSerialSubEntity"));
-                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
-                productionCardFlows.forEach(item->{
-                    try {
-                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
-                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
-                        Map<String, Object> map2 = objectMapper.readValue(map2Json, Map.class);
-
-                        // 修改 map2 中的 FSerialNo
-                        map2.put("FSerialNo", item.getSerialNumber());
-
-                        // 处理 FSerialId
-                        Map<String, String> fSerialIdMap = null;
-                        if (map2.get("FSerialId") != null) {
-                            String fSerialIdJson = objectMapper.writeValueAsString(map2.get("FSerialId"));
-                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
-                        } else {
-                            fSerialIdMap = new HashMap<>();
-                        }
-
-                        // 修改 FSerialId 中的 FNUMBER
-                        fSerialIdMap.put("FNUMBER", item.getSerialNumber());
-                        map2.put("FSerialId", fSerialIdMap);
-
-                        // 将修改后的 map2 添加到 list1
-                        list1.add(map2);
-                    } catch (JsonProcessingException e) {
-                        System.out.println(e);
-                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                    }
-                });
-                map.put("FSerialSubEntity",list1);
-            }else if(txfs.equals("单量推送")) { //==等于0的情况
-                //序列号单据体---循环
-                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-                productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
-                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-
-                map.put("FSNQty","1"); //序列号数量
-                map.put("FFinishQty","1"); //完成数量
-                map.put("FFinishQty","1"); //合格数量
-
-                List<Map> list1=new ArrayList<>();
-                String FSerialSubEntityJson = objectMapper.writeValueAsString( map.get("FSerialSubEntity"));
-                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
-                productionCardFlows.forEach(item->{
-                    try {
-                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
-                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
-                        Map<String, Object> map2 = objectMapper.readValue(map2Json, Map.class);
-
-                        // 修改 map2 中的 FSerialNo
-                        map2.put("FSerialNo", item.getSerialNumber());
-
-                        // 处理 FSerialId
-                        Map<String, String> fSerialIdMap = null;
-                        if (map2.get("FSerialId") != null) {
-                            String fSerialIdJson = objectMapper.writeValueAsString(map2.get("FSerialId"));
-                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
-                        } else {
-                            fSerialIdMap = new HashMap<>();
-                        }
-                        // 修改 FSerialId 中的 FNUMBER
-                        fSerialIdMap.put("FNUMBER", item.getSerialNumber());
-                        map2.put("FSerialId", fSerialIdMap);
-
-                        // 将修改后的 map2 添加到 list1
-                        list1.add(map2);
-                    } catch (JsonProcessingException e) {
-                        System.out.println(e);
-                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                    }
-                });
-                map.put("FSerialSubEntity",list1);
+        Map<String, Object> jsonData = objectMapper.readValue(xt.getInputStream(), Map.class);
+        //下推json
+        ArrayList arrayList=new ArrayList();
+        arrayList.add(planTaskDetails1.getDemandDocument());//生产订单号
+        jsonData.put("Numbers",arrayList);
+        if(ObjectUtil.isNotNull(planTaskDetails1.getDocumentType())){
+            if(planTaskDetails1.getDocumentType().equals("123f39178eb2424c8449f992e1fff1ee")){
+                jsonData.put("RuleId","0985f692-abbb-4d30-95b0-706dab1d1e22");
+            }else {
+                jsonData.put("RuleId","729e0697-95e2-40a2-af12-d50ca8908204");
             }
-            //表连接关系
-            String FEntity_LinkJSON = objectMapper.writeValueAsString(map.get("FEntity_Link"));
-            List<Map> FEntity_LinkJSONList = objectMapper.readValue(FEntity_LinkJSON, List.class);
-            Map map3 = FEntity_LinkJSONList.get(0);
-            map3.put("FEntity_Link_FSBillId",planTaskDetails1.getFid());
-            map3.put("FEntity_Link_FSId",planTaskDetails1.getFtreeEntityFentryid());
-            List<Map> list2=new ArrayList<>();
-            list2.add(map3);
-            map.put("FEntity_Link",list2);
-            List<Map> FEntityList=new ArrayList<>();
-            FEntityList.add(map);
-            modelMap.put("FEntity",FEntityList);
-
-            //转成String 字符
-
-            jsonData.put("Model", modelMap);
-
-            String zxJson = objectMapper.writeValueAsString(jsonData);
-            //生产用料清单结果
-            K3CloudApi api = new K3CloudApi();
-            try {
-                //执行JSO结果
-                String resultJsonJG = api.save("PRD_MORPT", zxJson);
-                //分析结构
-                Map resultString = objectMapper.readValue(resultJsonJG, Map.class);
-
-                String result = objectMapper.writeValueAsString(resultString.get("Result"));
-                Map<String,Object>  resultMap= objectMapper.readValue(result, Map.class);
-                String number = resultMap.get("Number").toString();//编号
-
-                String s4 = documentExecutionJudgment1(objectMapper, resultJsonJG, "工序汇报创建成功", "工序汇报创建失败");
-                if(s4.equals("工序汇报创建失败")){
-                    return s4;
-                }
-                //执行提交
-                String tjQuery="{\n" +
-                        "    \"Numbers\": [],\n" +
-                        "    \"Ids\": \"\",\n" +
-                        "    \"SelectedPostId\": 0,\n" +
-                        "    \"NetworkCtrl\": \"\",\n" +
-                        "    \"IgnoreInterationFlag\": \"true\"\n" +
-                        "}";
-                Map map4 = objectMapper.readValue(tjQuery, Map.class);
-
-                List<String> numberjson = new ArrayList<>();
-                numberjson.add(number);
-                map4.put("Numbers",numberjson);
-                String tjExeJSON = objectMapper.writeValueAsString(map4);
-                String s1 = api.submit("PRD_MORPT",tjExeJSON);
-                String s3 = documentExecutionJudgment1(objectMapper, s1, "工序汇提交成功", "工序汇报提交失败");
-                if(s3.equals("工序汇报提交失败")){
-                    return s3;
-                }
-                //执行审核
-                String shQuery="{\n" +
-                        "    \"Numbers\": [],\n" +
-                        "    \"Ids\": \"\",\n" +
-                        "    \"InterationFlags\": \"\",\n" +
-                        "    \"NetworkCtrl\": \"\",\n" +
-                        "    \"IsVerifyProcInst\": \"\",\n" +
-                        "    \"IgnoreInterationFlag\": \"true\",\n" +
-                        "    \"UseBatControlTimes\": \"false\"\n" +
-                        "}";
-
-                Map map5 = objectMapper.readValue(shQuery, Map.class);
-                List<String> number2json = new ArrayList<>();
-                number2json.add(number);
-                map5.put("Numbers",number2json);
-                String shExeJSON = objectMapper.writeValueAsString(map4);
-                String s2 = api.audit("PRD_MORPT",shExeJSON);
-                String s = documentExecutionJudgment1(objectMapper, s2, "工序汇报审核成功", "工序汇报审核失败");
-                if(s.equals("工序汇报审核失败")){
-                    return s;
+        }
+        String zxJson = objectMapper.writeValueAsString(jsonData);
+        K3CloudApi api = new K3CloudApi();
+        String resultJsonJG = api.push("PRD_MO", zxJson);
+        Map map1 = objectMapper.readValue(resultJsonJG, Map.class);
+        //拿到的是字符串
+        String result = objectMapper.writeValueAsString(map1.get("Result"));
+        //具体的内容转json
+        Map<String,Object>  map2= objectMapper.readValue(result, Map.class);
+        //判断是否成功
+        String responseStatus3 = objectMapper.writeValueAsString(map2.get("ResponseStatus"));
+        Map<String,Object> map3 = objectMapper.readValue(responseStatus3, Map.class);
+        String  isSuccess = map3.get("IsSuccess").toString();
+        //生产订单下推
+        if(isSuccess.equals("true")){ //下推成功
+            //拿到Result对应的值
+            Map<String,Object> xtJsonMap= objectMapper.readValue(resultJsonJG, Map.class);
+            Map<String,Object> resoultJsonMap = (Map<String, Object>) xtJsonMap.get("Result");
+            //拿到返回的东西 SuccessEntitys
+            Map<String,Object>   ResponseStatus = (Map<String, Object>) resoultJsonMap.get("ResponseStatus");
+            List<Map> successEntitys = (List<Map>) ResponseStatus.get("SuccessEntitys");
+            if(successEntitys.size()>0){
+                //number
+                String number1 = successEntitys.get(0).get("Number").toString();
+                //id
+                String Id = successEntitys.get(0).get("Id").toString();
+                //EntryIds
+                Map<String,Object> entryIds = (Map<String, Object>) successEntitys.get(0).get("EntryIds");
+                List<Integer> fEntity = (List<Integer>) entryIds.get("FEntity");
+                //子序列id
+                String fEntryID = fEntity.get(0).toString();
+
+
+                //判断是否保存成功(保存及时修改)
+                Boolean isSuccess1=false;
+                Map<String,Object> resoultJsonMap11=new HashMap<>();
+
+                if(txfs.equals("单量推送")){
+                    //调用保存接口
+                    Map<String, Object> bcJsonData = objectMapper.readValue(bc.getInputStream(), Map.class);
+                    //得到Map
+                    Map<String,Object> model = (Map<String, Object>) bcJsonData.get("Model");
+                    model.put("FID",Id);
+                    //得到FEntity
+                    List<Object> fEntity1 = (List<Object>) model.get("FEntity");
+                    //得到内容(第一个数组里的对象)
+                    Map<String,Object> obj = (Map<String, Object>) fEntity1.get(0);
+                    obj.put("FEntryID",fEntryID);
+
+                    List<Map<String,Object>> maps=new ArrayList<>();
+                    HashMap hashMap=new HashMap();
+                    hashMap.put("FSerialNo",ringScanInformation.getNativeNumbering());
+                    Map<String,String> FNUMBER=new HashMap<>();
+                    FNUMBER.put("FNUMBER",ringScanInformation.getNativeNumbering());
+                    hashMap.put("FSerialId",FNUMBER);
+                    maps.add(hashMap);
+                    //添加梳理好
+                    obj.put("FSerialSubEntity",maps);
+                    //从新添加
+                    bcJsonData.put("Model",model);
+                    K3CloudApi apiSave = new K3CloudApi();
+                    String s = objectMapper.writeValueAsString(bcJsonData);
+                    String prdMo = apiSave.save("PRD_MORPT", s);
+                    //保存结果
+                    Map<String,Object> saveJG= objectMapper.readValue(prdMo, Map.class);
+                    //
+                    Map<String,Object> resoultJsonMap1 = (Map<String, Object>) saveJG.get("Result");
+                    resoultJsonMap11 = (Map<String, Object>) resoultJsonMap1.get("ResponseStatus");
+                    //拿到执行结果
+                    isSuccess1 = (Boolean) resoultJsonMap11.get("IsSuccess");
                 }
-                if(s.equals("工序汇报审核成功")){
-                    //添加一张审核记录表,单据编号,序列号,数量
-                    ProductionReportingRecord productionReportingRecord=new ProductionReportingRecord();
-                    if(txfs.equals("全量推送")) {
-                        //序列号单据体---循环
-                        ProductionCardFlow productionCardFlow = new ProductionCardFlow();
-                        productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
-                        List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-                        if(productionCardFlows.size()>0){
-                            //单据编号
-                            productionReportingRecord.setNumber(number);
-                            //整体的所有序列号
-                            productionReportingRecord.setXlhArray(productionCardFlows.stream().map(ProductionCardFlow::getSerialNumber).collect(Collectors.joining(",")));
-                            productionReportingRecord.setType("2");//试机检验
-                        }
-                        productionReportingRecordMapper.insertProductionReportingRecord(productionReportingRecord);
-                    }else if(txfs.equals("单量推送")) {
-                        //序列号单据体---循环
-                        ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-                        productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
-                        List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-                        if (productionCardFlows.size()>0){
-                            //单据编号
-                            productionReportingRecord.setNumber(number);
-                            //只有一个序列号
-                            productionReportingRecord.setXlh(productionCardFlows.get(0).getSerialNumber());
-                            productionReportingRecord.setType("1");//成品检验
-                            productionReportingRecordMapper.insertProductionReportingRecord(productionReportingRecord);
-                            System.out.println("保存工序汇报单据数据成功");
+                //单据执行成功
+                if(isSuccess1||txfs.equals("全量推送")){
+                    //下推----保存---->提交
+                    String tjQuery="{\n" +
+                            "    \"Numbers\": [],\n" +
+                            "    \"Ids\": \"\",\n" +
+                            "    \"SelectedPostId\": 0,\n" +
+                            "    \"NetworkCtrl\": \"\",\n" +
+                            "    \"IgnoreInterationFlag\": \"true\"\n" +
+                            "}";
+                    Map map4 = objectMapper.readValue(tjQuery, Map.class);
+                    List<String> numberjson = new ArrayList<>();
+                    numberjson.add(number1);
+                    map4.put("Numbers",numberjson);
+                    String tjExeJSON = objectMapper.writeValueAsString(map4);
+                    String s1 = api.submit("PRD_MORPT",tjExeJSON);
+                    Map<String,Object> tj= objectMapper.readValue(s1, Map.class);
+                    Map<String,Object> tjMap = (Map<String, Object>) tj.get("Result");
+                    Map<String,Object>  responseStatus = (Map<String, Object>) tjMap.get("ResponseStatus");
+                    boolean isSuccess2 = (boolean) responseStatus.get("IsSuccess");
+                    if(isSuccess2){
+                        //执行审核
+                        String shQuery="{\n" +
+                                "    \"Numbers\": [],\n" +
+                                "    \"Ids\": \"\",\n" +
+                                "    \"InterationFlags\": \"\",\n" +
+                                "    \"NetworkCtrl\": \"\",\n" +
+                                "    \"IsVerifyProcInst\": \"\",\n" +
+                                "    \"IgnoreInterationFlag\": \"true\",\n" +
+                                "    \"UseBatControlTimes\": \"false\"\n" +
+                                "}";
+                        Map map5 = objectMapper.readValue(shQuery, Map.class);
+                        List<String> number2json = new ArrayList<>();
+                        number2json.add(number1);
+                        map5.put("Numbers",number2json);
+                        String shExeJSON = objectMapper.writeValueAsString(map4);
+                        String s2 = api.audit("PRD_MORPT",shExeJSON);
+                        Map<String,Object> shenhe= objectMapper.readValue(s2, Map.class);
+                        Map<String,Object> resoultJsonMap3 = (Map<String, Object>) shenhe.get("Result");
+                        Map<String,Object>  resoultJsonMap4 = (Map<String, Object>) resoultJsonMap3.get("ResponseStatus");
+                        //拿到执行结果
+                        Boolean isSuccess3 = (Boolean) resoultJsonMap4.get("IsSuccess");
+                        if(!isSuccess3){
+                            ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) resoultJsonMap4.get("Errors");
+                            Map<String, String> stringStringMap = Errors.get(0);
+                            HashMap hashMap1 =new HashMap();
+                            hashMap1.put("msg","工序汇报单审核失败");
+                            hashMap1.put("error",stringStringMap.get("Message"));
+                            return  hashMap1;
+                        }else {
+                            HashMap hashMap1 =new HashMap();
+                            hashMap1.put("msg","审核成功");
+                            hashMap1.put("error","工序汇报单审核成功");
+                            return  hashMap1;
                         }
+                    }else {
+                        ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) responseStatus.get("Errors");
+                        Map<String, String> stringStringMap = Errors.get(0);
+                        HashMap hashMap1 =new HashMap();
+                        hashMap1.put("msg","工序汇报单提交失败");
+                        hashMap1.put("error",stringStringMap.get("Message"));
+                        return  hashMap1;
                     }
+                }else {
+                    ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) resoultJsonMap11.get("Errors");
+                    Map<String, String> stringStringMap = Errors.get(0);
+                    HashMap hashMap1 =new HashMap();
+                    hashMap1.put("msg","工序汇报单修改保存失败");
+                    hashMap1.put("error",stringStringMap.get("Message"));
+                    return  hashMap1;
                 }
-            } catch (Exception e) {
-                System.out.println(e);
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             }
-        } catch (IOException e) {
-            System.out.println(e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            HashMap hashMap=new HashMap();
+            hashMap.put("msg","工序汇报单下推失败");
+            hashMap.put("error","工序汇报单下推失败");
+            return hashMap;
+        }else {
+            ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) map3.get("Errors");
+            Map<String, String> stringStringMap = Errors.get(0);
+            HashMap hashMap1 =new HashMap();
+            hashMap1.put("msg","工序汇报单下推创建失败");
+            hashMap1.put("error",stringStringMap.get("Message"));
+            return hashMap1;
         }
-        return "汇报成功";
     }
 
     /**
@@ -1588,338 +1565,149 @@ public class StationInformationServiceImpl implements IStationInformationService
      * type 入那个库
      * ringScanInformation 扫描信息
      */
-    private  Map<String,String> erpWareHouSing(PlanTaskDetails planTaskDetails1,String type,RingScanInformation ringScanInformation,String isDOrQ){
+    private  Map<String,String> erpWareHouSing(PlanTaskDetails planTaskDetails1,String type,RingScanInformation ringScanInformation,String isDOrQ) throws Exception {
         //生产汇报
         ObjectMapper objectMapper = new ObjectMapper();
         //生产用料清单结果
         K3CloudApi api = new K3CloudApi();
-        try {
-            String nr="";
-            if(isDOrQ.equals("单量推送")){
-                //当前扫描的序列号信息
-                String nativeNumbering = ringScanInformation.getNativeNumbering();
-                ProductionReportingRecord productionReportingRecord=new ProductionReportingRecord();
-                productionReportingRecord.setXlh(nativeNumbering);
-                List<ProductionReportingRecord> productionReportingRecords = productionReportingRecordMapper.selectProductionReportingRecordList(productionReportingRecord);
-                if(productionReportingRecords.size()>0){
-                    //查询生产汇报工序的基本信息
-                    nr="{\n" +
-                            "    \"FormId\": \"PRD_MORPT\",\n" +
-                            "    \"FieldKeys\": \"fbillno,fid,FSrcBillNo,FEntity_FEntryId,FDate,FUnitID.FNumber\",\n" +
-                            "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FBillNo\",\"Compare\":\"17\",\"Value\":\""+productionReportingRecords.get(0).getNumber()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
-                            "    \"OrderString\": \"\",\n" +
-                            "    \"TopRowCount\": 0,\n" +
-                            "    \"StartRow\": 0,\n" +
-                            "    \"Limit\": 2000,\n" +
-                            "    \"SubSystemId\": \"\"\n" +
-                            "}";
-                }else{
-                    Map<String,String> abc= new HashMap<>();
-                    abc.put("msg","未查询到生产汇报信息");
-                    return abc;
-                }
-            }else {
-                //查询生产汇报工序的基本信息
-                nr="{\n" +
-                        "    \"FormId\": \"PRD_MORPT\",\n" +
-                        "    \"FieldKeys\": \"fbillno,fid,FSrcBillNo,FEntity_FEntryId,FDate,FUnitID.FNumber\",\n" +
-                        "    \"FilterString\": [{\"Left\":\"\",\"FieldName\":\"FSrcBillNo\",\"Compare\":\"17\",\"Value\":\""+planTaskDetails1.getDemandDocument()+"\",\"Right\":\"\",\"Logic\":0}],\n" +
-                        "    \"OrderString\": \"\",\n" +
-                        "    \"TopRowCount\": 0,\n" +
-                        "    \"StartRow\": 0,\n" +
-                        "    \"Limit\": 2000,\n" +
-                        "    \"SubSystemId\": \"\"\n" +
-                        "}";
-            }
-
-            //查询结果
-            String nrString = api.billQuery(nr);
-
-            List<Map> mapList1 = JSONArray.parseArray(nrString, Map.class);
-            Map map2 = mapList1.get(0);
-            String fbillno = map2.get("fbillno").toString();
-            String fid = map2.get("fid").toString();
-            String FEntityFEntryId = map2.get("FEntity.FEntryId").toString();
-            String FDate = map2.get("FDate").toString();
-            String FSrcBillNo = map2.get("FSrcBillNo").toString();
-            String FUnitIDFNumber = map2.get("FUnitID.FNumber").toString();//基本单位
-
-            //生成入库单
-            Map<String, Object> jsonData2 = objectMapper.readValue(storage.getInputStream(), LinkedHashMap.class);
-            //得到Model
-            String model2 = objectMapper.writeValueAsString(jsonData2.get("Model"));
-            LinkedHashMap map6 = JSONObject.parseObject(model2, LinkedHashMap.class);
-            map6.put("FDate",DateUtils.toLocalDateTimeStr(LocalDateTime.now()));
-            String fEntity1 = objectMapper.writeValueAsString(map6.get("FEntity"));
-            List<LinkedHashMap> mapList = JSONArray.parseArray(fEntity1, LinkedHashMap.class);
-            LinkedHashMap map7 = mapList.get(0);
-            map7.put("F_PONP_HBRQ",FDate);
-
-            map7.put("FSrcEntryId",FEntityFEntryId);
-            map7.put("FSrcInterId",fid);
-            map7.put("FSrcBillNo",fbillno);
-            map7.put("FMoBillNo",planTaskDetails1.getDemandDocument());
-            map7.put("FMoId",planTaskDetails1.getFid());
-            map7.put("FMoEntryId",planTaskDetails1.getFtreeEntityFentryid());
-            map7.put("FReqBillNo",planTaskDetails1.getFsrcbillno()); //订单号
-            map7.put("FMOMAINENTRYID",planTaskDetails1.getFtreeEntityFentryid());
-            HashMap<String, String> fStockId = new HashMap<>();
-            if(type.equals("1")){
-                fStockId.put("FNumber","CK007"); //成品仓
-            }else {
-                fStockId.put("FNumber","CK006"); //利库仓
-            }
-            map7.put("FStockId",fStockId);
-            HashMap<String, String> fNumber = new HashMap<>();
-            fNumber.put("FNumber",planTaskDetails1.getMaterialId());
-            map7.put("FMaterialId",fNumber);
-
-            //生产车间信息
-            boolean present = Optional.ofNullable(planTaskDetails1.getShopCoding()).filter(a -> !a.isEmpty()).isPresent();
-            if(present){
-                HashMap<String, String> shopCoding = new HashMap<>();
-                shopCoding.put("FNumber",planTaskDetails1.getShopCoding());
-                map7.put("FWorkshipId",shopCoding);
-            }
-
-            //单位
-            HashMap<String, String> fUnitIDfNumber = new HashMap<>();
-            fUnitIDfNumber.put("FNumber",FUnitIDFNumber);
-            map7.put("FUnitID",fUnitIDfNumber);
-
-            //基本单位
-            HashMap<String, String> fBaseUnitIdFNumber = new HashMap<>();
-            fBaseUnitIdFNumber.put("FNumber",planTaskDetails1.getfBaseUnitId());
-            map7.put("FBaseUnitId",fBaseUnitIdFNumber);
-
-            //库存单位
-            HashMap<String, String> kudw = new HashMap<>();
-            fBaseUnitIdFNumber.put("FNumber",FUnitIDFNumber);
-            map7.put("FStockUnitId",kudw);
-
-            if(isDOrQ.equals("全量推送")){
-                //序列号单据体---循环
-                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-                productionCardFlow.setDemandDocumentNumber(planTaskDetails1.getDemandDocument());//流转卡序列号
-                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-                map7.put("FSNQty",productionCardFlows.size()); //序列号数量
-                map7.put("FMustQty",productionCardFlows.size()); //应收实收
-                map7.put("FRealQty",productionCardFlows.size()); //实收
-
-                map7.put("FBaseMustQty",productionCardFlows.size());  //基本单位实收数量
-                map7.put("FBaseRealQty",productionCardFlows.size()); //基本单位库存实收数量
-                List<Map> list1=new ArrayList<>();
-                String FSerialSubEntityJson = objectMapper.writeValueAsString( map7.get("FSerialSubEntity"));
-                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
-                productionCardFlows.forEach(item->{
-                    try {
-                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
-                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
-                        Map<String, Object> map2two = objectMapper.readValue(map2Json, Map.class);
-
-                        // 修改 map2 中的 FSerialNo
-                        map2two.put("FSerialNo", item.getSerialNumber());
-
-                        // 处理 FSerialId
-                        Map<String, String> fSerialIdMap = null;
-                        if (map2two.get("FSerialId") != null) {
-                            String fSerialIdJson = objectMapper.writeValueAsString(map2two.get("FSerialId"));
-                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
-                        } else {
-                            fSerialIdMap = new HashMap<>();
-                        }
-
-                        // 修改 FSerialId 中的 FNUMBER
-                        fSerialIdMap.put("FNumber", item.getSerialNumber());
-                        map2two.put("FSerialId", fSerialIdMap);
-
-                        // 将修改后的 map2 添加到 list1
-                        list1.add(map2two);
-                    } catch (JsonProcessingException e) {
-                        System.out.println(e);
-                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                    }
-                });
-            }else if(isDOrQ.equals("单量推送")) {
-                //序列号单据体---循环
-                ProductionCardFlow productionCardFlow=new ProductionCardFlow();
-                productionCardFlow.setSerialNumber(ringScanInformation.getNativeNumbering());//流转卡序列号
-                List<ProductionCardFlow> productionCardFlows = productionCardFlowMapper.selectProductionCardFlowList(productionCardFlow);
-                map7.put("FSNQty","1"); //序列号数量
-                map7.put("FMustQty","1"); //应收实收
-                map7.put("FRealQty","1"); //实收
-
-                map7.put("FBaseMustQty","1");  //基本单位实收数量
-                map7.put("FBaseRealQty","1"); //基本单位库存实收数量
-                List<Map> list1=new ArrayList<>();
-                String FSerialSubEntityJson = objectMapper.writeValueAsString( map7.get("FSerialSubEntity"));
-                List<Map> fSerialSubEntitylist = objectMapper.readValue(FSerialSubEntityJson, List.class);
-                productionCardFlows.forEach(item->{
-                    try {
-                        // 将 fSerialSubEntitylist.get(0) 转换为 JSON 字符串,再反序列化为新的 Map
-                        String map2Json = objectMapper.writeValueAsString(fSerialSubEntitylist.get(0));
-                        Map<String, Object> map2two = objectMapper.readValue(map2Json, Map.class);
-
-                        // 修改 map2 中的 FSerialNo
-                        map2two.put("FSerialNo", item.getSerialNumber());
-
-                        // 处理 FSerialId
-                        Map<String, String> fSerialIdMap = null;
-                        if (map2two.get("FSerialId") != null) {
-                            String fSerialIdJson = objectMapper.writeValueAsString(map2two.get("FSerialId"));
-                            fSerialIdMap = objectMapper.readValue(fSerialIdJson, Map.class);
-                        } else {
-                            fSerialIdMap = new HashMap<>();
-                        }
-
-                        // 修改 FSerialId 中的 FNUMBER
-                        fSerialIdMap.put("FNumber", item.getSerialNumber());
-                        map2two.put("FSerialId", fSerialIdMap);
+        //生产汇报单下推
 
-                        // 将修改后的 map2 添加到 list1
-                        list1.add(map2two);
-                    } catch (JsonProcessingException e) {
-                        System.out.println(e);
-                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                    }
-                });
-                map7.put("FSerialSubEntity",list1);
-                System.out.println("入库单量推送流转卡逻辑");
-            }
-            List<Map> fEntityLinkList=new ArrayList<>();
-            String FenJson="{\n" +
-                    "\"FEntity_Link_FRuleId\": \"PRD_MO2INSTOCK\",\n" +
-                    "\"FEntity_Link_FSTableName\": \"T_PRD_MORPTENTRY\",\n" +
-                    "\"FEntity_Link_FSBillId\": \"168691\",\n" +
-                    "\"FEntity_Link_FSId\": \"168691\"\n" +
-                    "}";
-            Map<String,String> map8 = JSONObject.parseObject(FenJson, Map.class);
-            map8.put("FEntity_Link_FSBillId",fid);
-            map8.put("FEntity_Link_FSId",FEntityFEntryId);
-            fEntityLinkList.add(map8);
-            map7.put("FEntity_Link",fEntityLinkList);
-            List<LinkedHashMap> map7List = new ArrayList<>();
-            map7List.add(map7);
-            map6.put("FEntity",map7List);
-
-            jsonData2.put("Model",map6);
-
-            String rkdcrateJosn = api.save("PRD_INSTOCK",JSONObject.toJSONString(jsonData2));
-            Map<String, String> stringStringMap1 = documentExecutionJudgment(objectMapper, rkdcrateJosn, "生成入库单创建", "入库单创建失败");
-            if(stringStringMap1.get("msg").equals("入库单创建失败")){
-                return stringStringMap1;
-            }
-            //解析入库单创建结果
-            Map rkdCrateJsonResultString = objectMapper.readValue(rkdcrateJosn, Map.class);
-            String rkdCrateResultJson = objectMapper.writeValueAsString(rkdCrateJsonResultString.get("Result"));
-            Map<String,String>  rkdResultMap= objectMapper.readValue(rkdCrateResultJson, Map.class);
-            String rkdNumber = rkdResultMap.get("Number");//编号
-
-            //提交
-            String rkdtj="{\n" +
-                    "    \"Numbers\": [],\n" +
-                    "    \"Ids\": \"\",\n" +
-                    "    \"SelectedPostId\": 0,\n" +
-                    "    \"NetworkCtrl\": \"\",\n" +
-                    "    \"IgnoreInterationFlag\": \"\"\n" +
-                    "}";
-            Map<String, Object> jsonData3 = objectMapper.readValue(rkdtj, Map.class);
-            List<String> list5 =new ArrayList<>();
-            list5.add(rkdNumber);
-            jsonData3.put("Numbers",list5);
-            String tkdtjR = api.submit("PRD_INSTOCK",JSONObject.toJSONString(jsonData3));
-            Map<String, String> stringStringMap2 = documentExecutionJudgment(objectMapper, tkdtjR, "入库单提交成功", "入库单提交失败");
-            if(stringStringMap2.get("msg").equals("入库单提交失败")){
-                return stringStringMap2;
-            }
-
-            //审核
-            String rkdsh="{\n" +
-                    "    \"Numbers\": [],\n" +
-                    "    \"Ids\": \"\",\n" +
-                    "    \"InterationFlags\": \"\",\n" +
-                    "    \"NetworkCtrl\": \"\",\n" +
-                    "    \"IsVerifyProcInst\": \"\",\n" +
-                    "    \"IgnoreInterationFlag\": \"\",\n" +
-                    "    \"UseBatControlTimes\": \"false\"\n" +
-                    "}";
-            Map<String, Object> jsonData4 = objectMapper.readValue(rkdsh, Map.class);
-            jsonData4.put("Number",list5);
+        //查询当前序列号的生产订单号
+        String query = "{\n" +
+                "    \"FormId\": \"PRD_MORPT\",\n" +
+                "    \"FieldKeys\": \"FBillNo\",\n" +
+                "    \"FilterString\": [\n" +
+                "        {\n" +
+                "            \"Left\": \"\",\n" +
+                "            \"FieldName\": \"FSerialNo\",\n" +
+                "            \"Compare\": \"67\",\n" +
+                "            \"Value\": \"" + ringScanInformation.getNativeNumbering() + "\",\n" +
+                "            \"Right\": \"\",\n" +
+                "            \"Logic\": 0\n" +
+                "        }\n" +
+                "    ],\n" +
+                "    \"OrderString\": \"\",\n" +
+                "    \"TopRowCount\": 0,\n" +
+                "    \"StartRow\": 0,\n" +
+                "    \"Limit\": 2000,\n" +
+                "    \"SubSystemId\": \"\"\n" +
+                "}";
 
-            String rkdshR = api.audit("PRD_INSTOCK",JSONObject.toJSONString(jsonData3));
-            Map<String, String> stringStringMap = documentExecutionJudgment(objectMapper, rkdshR, "入库单审核成功", "入库单审核失败");
-            if(stringStringMap.get("msg").equals("入库单审核失败")){
-                return stringStringMap;
-            }
-        } catch (Exception e) {
-            System.out.println(e);
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            Map<String,String>  abc=new HashMap<>();
-            abc.put("msg", "入库单创建失败");
-            abc.put("error","入库单创建失败");
+        String nrString = api.billQuery(query);
+        List<Map> mapList1 = JSONArray.parseArray(nrString, Map.class);
+        Map map2 = mapList1.get(0);
+        String fbillno = map2.get("FBillNo").toString();
+        if(ObjectUtil.isNull(fbillno)){ //没查到当前序列号信息代表没有此信息的汇报单
+            Map<String,String> abc= new HashMap<>();
+            abc.put("msg","未查询到生产汇报信息");
             return abc;
         }
-        Map<String,String>  abc=new HashMap<>();
-        abc.put("msg","入库成功");
-        return abc;
-    }
-
-    /**
-     * erp创建单据是否成功
-     * @param objectMapper
-     * @param resultJson
-     * @param
-     * @param msg2
-     * @return
-     * @throws JsonProcessingException
-     */
-    private Map<String,String>  documentExecutionJudgment(ObjectMapper objectMapper, String resultJson,String msg1,String msg2) throws JsonProcessingException {
-        Map s2Map = objectMapper.readValue(resultJson, Map.class);
-        String result = objectMapper.writeValueAsString(s2Map.get("Result"));
-        System.out.println(result+"执行结果");
-        Map<String,Object>  s2MapResultJsonMap= objectMapper.readValue(result, Map.class);
-        //判断是否成功
-        String responseStatus3 = objectMapper.writeValueAsString(s2MapResultJsonMap.get("ResponseStatus"));
-        Map map11 = objectMapper.readValue(responseStatus3, Map.class);
-        String isSuccess3 = map11.get("IsSuccess").toString();
-        String  isSuccess4= map11.get("Errors").toString();
-        if(isSuccess3.equals("true")){
-            HashMap hashMap=new HashMap();
-            hashMap.put("msg",msg1);
-            return hashMap;
+        String xtJson="{\n" +
+                "    \"Ids\": \"\",\n" +
+                "    \"Numbers\": [\""+fbillno+"\"],\n" +
+                "    \"EntryIds\": \"\",\n" +
+                "    \"RuleId\":\"\",\n" +
+                "    \"TargetBillTypeId\": \"\",\n" +
+                "    \"TargetFormId\": \"PRD_INSTOCK\",\n" +
+                "    \"IsEnableDefaultRule\": \"true\",\n" +
+                "    \"IsDraftWhenSaveFail\": \"false\",\n" +
+                "    \"CustomParams\": {}\n" +
+                "}";
+        K3CloudApi api2 = new K3CloudApi();
+        String resultJsonJG = api2.push("PRD_MORPT", xtJson);
+        //保存结果
+        Map<String,Object> tj1= objectMapper.readValue(resultJsonJG, Map.class);
+        //
+        Map<String,Object> resoultJsonMap1 = (Map<String, Object>) tj1.get("Result");
+        Map<String,Object>  ResponseStatus = (Map<String, Object>) resoultJsonMap1.get("ResponseStatus");
+        //拿到执行结果
+        Boolean isSuccess1 = (Boolean) ResponseStatus.get("IsSuccess");
+        //生产订单下推结果
+        if(isSuccess1){
+            Map<String,Object> xtJsonMap= objectMapper.readValue(resultJsonJG, Map.class);
+            Map<String,Object> resoultJsonMap = (Map<String, Object>) xtJsonMap.get("Result");
+            Map<String,Object> responseStatus1 = (Map<String, Object>)resoultJsonMap.get("ResponseStatus");
+            //拿到返回的东西 SuccessEntitys
+            List<Map> successEntitys = (List<Map>) responseStatus1.get("SuccessEntitys");
+            if(successEntitys.size()>0){
+                //number
+                String number1 = successEntitys.get(0).get("Number").toString();
+
+                //入库单提交
+                String rkdtj="{\n" +
+                        "    \"Numbers\": [],\n" +
+                        "    \"Ids\": \"\",\n" +
+                        "    \"SelectedPostId\": 0,\n" +
+                        "    \"NetworkCtrl\": \"\",\n" +
+                        "    \"IgnoreInterationFlag\": \"\"\n" +
+                        "}";
+                Map<String, Object> jsonData3 = objectMapper.readValue(rkdtj, Map.class);
+                List<String> list5 =new ArrayList<>();
+                list5.add(number1);
+                jsonData3.put("Numbers",list5);
+                String tkdtjR = api.submit("PRD_INSTOCK",JSONObject.toJSONString(jsonData3));
+                Map<String,Object> tj= objectMapper.readValue(tkdtjR, Map.class);
+                Map<String,Object> tjMap = (Map<String, Object>) tj.get("Result");
+                Map<String,Object>  responseStatus = (Map<String, Object>) tjMap.get("ResponseStatus");
+                Boolean isSuccess2 = (Boolean) responseStatus.get("IsSuccess");
+                if(isSuccess2){
+                    String rkdsh="{\n" +
+                            "    \"Numbers\": [],\n" +
+                            "    \"Ids\": \"\",\n" +
+                            "    \"InterationFlags\": \"\",\n" +
+                            "    \"NetworkCtrl\": \"\",\n" +
+                            "    \"IsVerifyProcInst\": \"\",\n" +
+                            "    \"IgnoreInterationFlag\": \"\",\n" +
+                            "    \"UseBatControlTimes\": \"false\"\n" +
+                            "}";
+                    Map map5 = objectMapper.readValue(rkdsh, Map.class);
+                    List<String> number2json = new ArrayList<>();
+                    number2json.add(number1);
+                    map5.put("Numbers",number2json);
+                    String shExeJSON = objectMapper.writeValueAsString(map5);
+                    String s2 = api.audit("PRD_INSTOCK",shExeJSON);
+                    Map<String,Object> shenhe= objectMapper.readValue(s2, Map.class);
+                    Map<String,Object> resoultJsonMap3 = (Map<String, Object>) shenhe.get("Result");
+                    Map<String,Object>  resoultJsonMap4 = (Map<String, Object>) resoultJsonMap3.get("ResponseStatus");
+                    //拿到执行结果
+                    Boolean isSuccess3 = (Boolean) resoultJsonMap4.get("IsSuccess");
+                    if(!isSuccess3){
+                        ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) resoultJsonMap4.get("Errors");
+                        Map<String, String> stringStringMap = Errors.get(0);
+                        HashMap hashMap1 =new HashMap();
+                        hashMap1.put("msg","入库单审核失败");
+                        hashMap1.put("error",stringStringMap.get("Message"));
+                        return  hashMap1;
+                    }else {
+                        HashMap hashMap1 =new HashMap();
+                        hashMap1.put("msg","入库单审核成功");
+                        hashMap1.put("error","入库单审核成功");
+                        return  hashMap1;
+                    }
+                }else {
+                    ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) responseStatus.get("Errors");
+                    Map<String, String> stringStringMap = Errors.get(0);
+                    HashMap hashMap1 =new HashMap();
+                    hashMap1.put("msg","入库单提交失败");
+                    hashMap1.put("error",stringStringMap.get("Message"));
+                    return  hashMap1;
+                }
+            }
+            HashMap hashMap1 =new HashMap();
+            hashMap1.put("msg","入库单下推失败");
+            hashMap1.put("error","入库单下推失败");
+            return hashMap1;
         }else {
-            System.out.println(isSuccess4);
-            HashMap hashMap=new HashMap();
-            hashMap.put("msg",msg2);
-            hashMap.put("error",isSuccess4);
-            return hashMap;
+            ArrayList<Map<String,String>> Errors = (ArrayList<Map<String, String>>) ResponseStatus.get("Errors");
+            Map<String, String> stringStringMap = Errors.get(0);
+            HashMap hashMap1 =new HashMap();
+            hashMap1.put("msg","入库单下推失败");
+            hashMap1.put("error",stringStringMap.get("Message"));
+            return hashMap1;
         }
     }
 
 
-    private String  documentExecutionJudgment1(ObjectMapper objectMapper, String resultJson,String msg1,String msg2) throws JsonProcessingException {
-        Map s2Map = objectMapper.readValue(resultJson, Map.class);
-        String result = objectMapper.writeValueAsString(s2Map.get("Result"));
-        System.out.println(result+"执行结果");
-        Map<String,Object>  s2MapResultJsonMap= objectMapper.readValue(result, Map.class);
-        //判断是否成功
-        String responseStatus3 = objectMapper.writeValueAsString(s2MapResultJsonMap.get("ResponseStatus"));
-        Map map11 = objectMapper.readValue(responseStatus3, Map.class);
-        String isSuccess3 = map11.get("IsSuccess").toString();
-        String  isSuccess4= map11.get("Errors").toString();
-        if(isSuccess3.equals("true")){
-//            HashMap hashMap=new HashMap();
-//            hashMap.put("msg",);
-            return msg1;
-        }else {
-            System.out.println(isSuccess4);
-//            HashMap hashMap=new HashMap();
-//            hashMap.put("msg",msg1);
-//            hashMap.put("error",isSuccess4);
-            return msg2;
-        }
-    }
-
 
 
     /**

+ 37 - 0
zkqy-fujian-amichi/src/main/resources/bc.json

@@ -0,0 +1,37 @@
+{
+  "NeedUpDateFields": ["FSNQty","FSerialSubEntity"],
+  "NeedReturnFields": ["FSNQty","FSerialSubEntity"],
+  "IsDeleteEntry": "false",
+  "SubSystemId": "",
+  "IsVerifyBaseDataField": "false",
+  "IsEntryBatchFill": "true",
+  "ValidateFlag": "true",
+  "NumberSearch": "true",
+  "IsAutoAdjustField": "false",
+  "InterationFlags": "",
+  "IgnoreInterationFlag": "",
+  "IsControlPrecision": "false",
+  "ValidateRepeatJson": "false",
+  "Model": {
+    "FID":105895,
+    "FEntity": [
+      {
+        "FEntryID": 107573,
+        "FSNQty": 1.0000,
+        "FSerialSubEntity": [
+          {
+            "FInspectResult": "1",
+            "FQCQty": 1.0,
+            "FSerialNo": "251315015",
+            "FSerialId": {
+              "FNUMBER": "251315015"
+            },
+            "FQCStockInSelQty": 0.0,
+            "FBaseQCQty": 1.0,
+            "FBaseQCStockInSelQty": 0.0
+          }
+        ]
+      }
+    ]
+  }
+}

+ 0 - 242
zkqy-fujian-amichi/src/main/resources/mapper/JdProductionOrderMapper.xml

@@ -1,242 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.zkqy.amichi.jd.mapper.JdProductionOrderMapper">
-    
-    <resultMap type="com.zkqy.amichi.jd.domain.JdProductionOrder" id="JdProductionOrderResult">
-        <result property="id"    column="id"    />
-        <result property="documentNumber"    column="document_number"    />
-        <result property="documentTyep"    column="document_tyep"    />
-        <result property="documentDate"    column="document_date"    />
-        <result property="documentStatus"    column="document_status"    />
-        <result property="productType"    column="product_type"    />
-        <result property="materialCode"    column="material_code"    />
-        <result property="materialName"    column="material_name"    />
-        <result property="modelNumber"    column="model_number"    />
-        <result property="specification"    column="specification"    />
-        <result property="productionWorkshop"    column="production_workshop"    />
-        <result property="unit"    column="unit"    />
-        <result property="quantity"    column="quantity"    />
-        <result property="serviceStatus"    column="service_status"    />
-        <result property="demandDocument"    column="demand_document"    />
-        <result property="materialRequisitionStatus"    column="material_requisition_status"    />
-        <result property="createById"    column="create_by_id"    />
-        <result property="createBy"    column="create_by"    />
-        <result property="createTime"    column="create_time"    />
-        <result property="updateById"    column="update_by_id"    />
-        <result property="updateBy"    column="update_by"    />
-        <result property="updateTime"    column="update_time"    />
-        <result property="delFlag"    column="del_flag"    />
-        <result property="byOne"    column="by_one"    />
-        <result property="byTwo"    column="by_two"    />
-        <result property="planNumber"    column="plan_number"    />
-        <result property="planName"    column="plan_name"    />
-    </resultMap>
-
-    <sql id="selectJdProductionOrderVo">
-        select id, document_number, document_tyep, document_date, document_status, product_type, material_code, material_name, model_number, specification, production_workshop, unit, quantity, service_status, demand_document, material_requisition_status, create_by_id, create_by, create_time, update_by_id, update_by, update_time, del_flag, by_one, by_two, plan_number, plan_name from fjqydb.jd_production_order
-    </sql>
-
-    <select id="selectJdProductionOrderList" parameterType="com.zkqy.amichi.jd.domain.JdProductionOrder" resultMap="JdProductionOrderResult">
-        <include refid="selectJdProductionOrderVo"/>
-        <where>  
-            <if test="documentNumber != null  and documentNumber != ''">and document_number LIKE concat('%', #{documentNumber}, '%')</if>
-            <if test="documentTyep != null  and documentTyep != ''"> and document_tyep = #{documentTyep}</if>
-            <if test="documentDate != null "> and document_date = #{documentDate}</if>
-            <if test="documentStatus != null  and documentStatus != ''"> and document_status = #{documentStatus}</if>
-            <if test="productType != null  and productType != ''"> and product_type = #{productType}</if>
-            <if test="materialCode != null  and materialCode != ''"> and material_code = #{materialCode}</if>
-            <if test="materialName != null  and materialName != ''"> and material_name like concat('%', #{materialName}, '%')</if>
-            <if test="modelNumber != null  and modelNumber != ''"> and model_number = #{modelNumber}</if>
-            <if test="specification != null  and specification != ''"> and specification = #{specification}</if>
-            <if test="productionWorkshop != null  and productionWorkshop != ''"> and production_workshop = #{productionWorkshop}</if>
-            <if test="unit != null  and unit != ''"> and unit = #{unit}</if>
-            <if test="quantity != null  and quantity != ''"> and quantity = #{quantity}</if>
-            <if test="serviceStatus != null  and serviceStatus != ''"> and service_status = #{serviceStatus}</if>
-            <if test="demandDocument != null  and demandDocument != ''"> and demand_document = #{demandDocument}</if>
-            <if test="materialRequisitionStatus != null  and materialRequisitionStatus != ''"> and material_requisition_status = #{materialRequisitionStatus}</if>
-            <if test="createById != null "> and create_by_id = #{createById}</if>
-            <if test="updateById != null "> and update_by_id = #{updateById}</if>
-            <if test="byOne != null  and byOne != ''"> and by_one = #{byOne}</if>
-            <if test="byTwo != null  and byTwo != ''"> and by_two = #{byTwo}</if>
-            <if test="planNumber != null  and planNumber != ''"> and plan_number = #{planNumber}</if>
-            <if test="planName != null  and planName != ''"> and plan_name like concat('%', #{planName}, '%')</if>
-        </where>
-    </select>
-    
-    <select id="selectJdProductionOrderById" parameterType="Long" resultMap="JdProductionOrderResult">
-        <include refid="selectJdProductionOrderVo"/>
-        where id = #{id}
-    </select>
-
-    <select id="selectJdProductionOrderMaxId" resultType="java.lang.String">
-        select MAX(demand_document) as document_number from fjqydb.plan_task_details
-    </select>
-
-    <insert id="insertJdProductionOrder" parameterType="com.zkqy.amichi.jd.domain.JdProductionOrder" useGeneratedKeys="true" keyProperty="id">
-        insert into fjqydb.jd_production_order
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="documentNumber != null">document_number,</if>
-            <if test="documentTyep != null">document_tyep,</if>
-            <if test="documentDate != null">document_date,</if>
-            <if test="documentStatus != null">document_status,</if>
-            <if test="productType != null">product_type,</if>
-            <if test="materialCode != null">material_code,</if>
-            <if test="materialName != null">material_name,</if>
-            <if test="modelNumber != null">model_number,</if>
-            <if test="specification != null">specification,</if>
-            <if test="productionWorkshop != null">production_workshop,</if>
-            <if test="unit != null">unit,</if>
-            <if test="quantity != null">quantity,</if>
-            <if test="serviceStatus != null">service_status,</if>
-            <if test="demandDocument != null">demand_document,</if>
-            <if test="materialRequisitionStatus != null">material_requisition_status,</if>
-            <if test="createById != null">create_by_id,</if>
-            <if test="createBy != null">create_by,</if>
-            <if test="createTime != null">create_time,</if>
-            <if test="updateById != null">update_by_id,</if>
-            <if test="updateBy != null">update_by,</if>
-            <if test="updateTime != null">update_time,</if>
-            <if test="delFlag != null">del_flag,</if>
-            <if test="byOne != null">by_one,</if>
-            <if test="byTwo != null">by_two,</if>
-            <if test="planNumber != null">plan_number,</if>
-            <if test="planName != null">plan_name,</if>
-         </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="documentNumber != null">#{documentNumber},</if>
-            <if test="documentTyep != null">#{documentTyep},</if>
-            <if test="documentDate != null">#{documentDate},</if>
-            <if test="documentStatus != null">#{documentStatus},</if>
-            <if test="productType != null">#{productType},</if>
-            <if test="materialCode != null">#{materialCode},</if>
-            <if test="materialName != null">#{materialName},</if>
-            <if test="modelNumber != null">#{modelNumber},</if>
-            <if test="specification != null">#{specification},</if>
-            <if test="productionWorkshop != null">#{productionWorkshop},</if>
-            <if test="unit != null">#{unit},</if>
-            <if test="quantity != null">#{quantity},</if>
-            <if test="serviceStatus != null">#{serviceStatus},</if>
-            <if test="demandDocument != null">#{demandDocument},</if>
-            <if test="materialRequisitionStatus != null">#{materialRequisitionStatus},</if>
-            <if test="createById != null">#{createById},</if>
-            <if test="createBy != null">#{createBy},</if>
-            <if test="createTime != null">#{createTime},</if>
-            <if test="updateById != null">#{updateById},</if>
-            <if test="updateBy != null">#{updateBy},</if>
-            <if test="updateTime != null">#{updateTime},</if>
-            <if test="delFlag != null">#{delFlag},</if>
-            <if test="byOne != null">#{byOne},</if>
-            <if test="byTwo != null">#{byTwo},</if>
-            <if test="planNumber != null">#{planNumber},</if>
-            <if test="planName != null">#{planName},</if>
-         </trim>
-    </insert>
-
-    <insert id="insertBatchJdProductionOrder" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
-        insert into fjqydb.jd_production_order
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="documentNumber != null">document_number,</if>
-            <if test="documentTyep != null">document_tyep,</if>
-            <if test="documentDate != null">document_date,</if>
-            <if test="documentStatus != null">document_status,</if>
-            <if test="productType != null">product_type,</if>
-            <if test="materialCode != null">material_code,</if>
-            <if test="materialName != null">material_name,</if>
-            <if test="modelNumber != null">model_number,</if>
-            <if test="specification != null">specification,</if>
-            <if test="productionWorkshop != null">production_workshop,</if>
-            <if test="unit != null">unit,</if>
-            <if test="quantity != null">quantity,</if>
-            <if test="serviceStatus != null">service_status,</if>
-            <if test="demandDocument != null">demand_document,</if>
-            <if test="materialRequisitionStatus != null">material_requisition_status,</if>
-            <if test="createById != null">create_by_id,</if>
-            <if test="createBy != null">create_by,</if>
-            <if test="createTime != null">create_time,</if>
-            <if test="updateById != null">update_by_id,</if>
-            <if test="updateBy != null">update_by,</if>
-            <if test="updateTime != null">update_time,</if>
-            <if test="delFlag != null">del_flag,</if>
-            <if test="byOne != null">by_one,</if>
-            <if test="byTwo != null">by_two,</if>
-            <if test="planNumber != null">plan_number,</if>
-            <if test="planName != null">plan_name,</if>
-        </trim>
-        values
-        <foreach collection="list" item="item" separator=",">
-            <trim prefix="(" suffix=")" suffixOverrides=",">
-                <if test="item.documentNumber != null">#{item.documentNumber},</if>
-                <if test="item.documentTyep != null">#{item.documentTyep},</if>
-                <if test="item.documentDate != null">#{item.documentDate},</if>
-                <if test="item.documentStatus != null">#{item.documentStatus},</if>
-                <if test="item.productType != null">#{item.productType},</if>
-                <if test="item.materialCode != null">#{item.materialCode},</if>
-                <if test="item.materialName != null">#{item.materialName},</if>
-                <if test="item.modelNumber != null">#{item.modelNumber},</if>
-                <if test="item.specification != null">#{item.specification},</if>
-                <if test="item.productionWorkshop != null">#{item.productionWorkshop},</if>
-                <if test="item.unit != null">#{item.unit},</if>
-                <if test="item.quantity != null">#{item.quantity},</if>
-                <if test="item.serviceStatus != null">#{item.serviceStatus},</if>
-                <if test="item.demandDocument != null">#{item.demandDocument},</if>
-                <if test="item.materialRequisitionStatus != null">#{item.materialRequisitionStatus},</if>
-                <if test="item.createById != null">#{item.createById},</if>
-                <if test="item.createBy != null">#{item.createBy},</if>
-                <if test="item.createTime != null">#{item.createTime},</if>
-                <if test="item.updateById != null">#{item.updateById},</if>
-                <if test="item.updateBy != null">#{item.updateBy},</if>
-                <if test="item.updateTime != null">#{item.updateTime},</if>
-                <if test="item.delFlag != null">#{item.delFlag},</if>
-                <if test="item.byOne != null">#{item.byOne},</if>
-                <if test="item.byTwo != null">#{item.byTwo},</if>
-                <if test="item.planNumber != null">#{item.planNumber},</if>
-                <if test="item.planName != null">#{item.planName},</if>
-            </trim>
-        </foreach>
-    </insert>
-    <update id="updateJdProductionOrder" parameterType="com.zkqy.amichi.jd.domain.JdProductionOrder">
-        update fjqydb.jd_production_order
-        <trim prefix="SET" suffixOverrides=",">
-            <if test="documentNumber != null">document_number = #{documentNumber},</if>
-            <if test="documentTyep != null">document_tyep = #{documentTyep},</if>
-            <if test="documentDate != null">document_date = #{documentDate},</if>
-            <if test="documentStatus != null">document_status = #{documentStatus},</if>
-            <if test="productType != null">product_type = #{productType},</if>
-            <if test="materialCode != null">material_code = #{materialCode},</if>
-            <if test="materialName != null">material_name = #{materialName},</if>
-            <if test="modelNumber != null">model_number = #{modelNumber},</if>
-            <if test="specification != null">specification = #{specification},</if>
-            <if test="productionWorkshop != null">production_workshop = #{productionWorkshop},</if>
-            <if test="unit != null">unit = #{unit},</if>
-            <if test="quantity != null">quantity = #{quantity},</if>
-            <if test="serviceStatus != null">service_status = #{serviceStatus},</if>
-            <if test="demandDocument != null">demand_document = #{demandDocument},</if>
-            <if test="materialRequisitionStatus != null">material_requisition_status = #{materialRequisitionStatus},</if>
-            <if test="createById != null">create_by_id = #{createById},</if>
-            <if test="createBy != null">create_by = #{createBy},</if>
-            <if test="createTime != null">create_time = #{createTime},</if>
-            <if test="updateById != null">update_by_id = #{updateById},</if>
-            <if test="updateBy != null">update_by = #{updateBy},</if>
-            <if test="updateTime != null">update_time = #{updateTime},</if>
-            <if test="delFlag != null">del_flag = #{delFlag},</if>
-            <if test="byOne != null">by_one = #{byOne},</if>
-            <if test="byTwo != null">by_two = #{byTwo},</if>
-            <if test="planNumber != null">plan_number = #{planNumber},</if>
-            <if test="planName != null">plan_name = #{planName},</if>
-        </trim>
-        where id = #{id}
-    </update>
-
-    <delete id="deleteJdProductionOrderById" parameterType="Long">
-        delete from fjqydb.jd_production_order where id = #{id}
-    </delete>
-
-    <delete id="deleteJdProductionOrderByIds" parameterType="String">
-        delete from fjqydb.jd_production_order where id in
-        <foreach item="id" collection="array" open="(" separator="," close=")">
-            #{id}
-        </foreach>
-    </delete>
-</mapper>

+ 107 - 0
zkqy-fujian-amichi/src/main/resources/storage1.json

@@ -0,0 +1,107 @@
+{
+  "NeedUpDateFields": [],
+  "NeedReturnFields": [],
+  "IsDeleteEntry": "true",
+  "SubSystemId": "",
+  "IsVerifyBaseDataField": "false",
+  "IsEntryBatchFill": "true",
+  "ValidateFlag": "true",
+  "NumberSearch": "true",
+  "IsAutoAdjustField": "false",
+  "InterationFlags": "",
+  "IgnoreInterationFlag": "",
+  "IsControlPrecision": "false",
+  "ValidateRepeatJson": "false",
+  "Model": {
+    "FID": 0,
+    "FBillType": {
+      "FNUMBER": "SCRKD01_SYS"
+    },
+    "FDate": "2024-12-14 00:00:00",
+    "FOwnerTypeId0": "BD_OwnerOrg",
+    "FOwnerId0": {
+      "FNumber": "100"
+    },
+    "FIsEntrust": false,
+    "FCurrId": {
+      "FNumber": "PRE001"
+    },
+    "FEntrustInStockId": 0,
+    "F_PONP_PrintTimes": 0,
+    "FEntity": [
+      {
+        "F_PONP_HBRQ": "2024-12-14 00:00:00",
+        "FSrcEntryId": 102067,
+        "FIsNew": false,
+        "FMaterialId": {
+          "FNumber": "1010010010005"
+        },
+        "FCheckProduct": false,
+        "FProductType": "1",
+        "FInStockType": "1",
+        "FUnitID": {
+          "FNumber": "Pcs"
+        },
+        "FBFLowId": {
+          "FID": "f6e6eec3-5267-4f02-8593-b633da508a72"
+        },
+        "FMustQty": 1.0,
+        "FRealQty": 1.0,
+        "FCostRate": 100.0000000000,
+        "FBaseUnitId": {
+          "FNumber": "Pcs"
+        },
+        "FBaseMustQty": 1.0,
+        "FBaseRealQty": 1.0,
+        "FOwnerTypeId": "BD_OwnerOrg",
+        "FOwnerId": {
+          "FNumber": "100"
+        },
+        "FStockId": {
+          "FNumber": "CK006"
+        },
+        "FISBACKFLUSH": true,
+        "FWorkShopId1": {
+          "FNumber": "BM000003"
+        },
+        "FMoBillNo": "MO046746",
+        "FMoId": 166833,
+        "FMoEntryId": 168714,
+        "FMoEntrySeq": 1,
+        "FStockUnitId": {
+          "FNumber": "UOM001"
+        },
+        "FStockRealQty": 1.0,
+        "FSecRealQty": 0.0,
+        "FSrcBillType": "PRD_MORPT",
+        "FSrcInterId": 101306,
+        "FSrcBillNo": "SCHB00001092",
+        "FReqBillNo": "NQY250342",
+        "FBasePrdRealQty": 1.0,
+        "FIsFinished": false,
+        "FStockStatusId": {
+          "FNumber": "KCZT01_SYS"
+        },
+        "FSrcEntrySeq": 1,
+        "FMOMAINENTRYID": 168714,
+        "FKeeperTypeId": "BD_KeeperOrg",
+        "FKeeperId": {
+          "FNumber": "100"
+        },
+        "FSelReStkQty": 0.0,
+        "FBaseSelReStkQty": 0.0,
+        "FIsOverLegalOrg": false,
+        "FSerialSubEntity": [
+          {
+            "FSerialNo": "240116007",
+            "FSerialId": {
+              "FNumber": "240116007"
+            },
+            "FQty": 1.0,
+            "FBaseSNQty": 1.0000000000
+          }
+        ]
+      }
+    ]
+  }
+}

+ 11 - 0
zkqy-fujian-amichi/src/main/resources/xt.json

@@ -0,0 +1,11 @@
+{
+  "Ids": "",
+  "Numbers": ["MO066682"],
+  "EntryIds": "",
+  "RuleId": "0985f692-abbb-4d30-95b0-706dab1d1e22",
+  "TargetBillTypeId": "",
+  "TargetFormId":"PRD_MORPT",
+  "IsEnableDefaultRule": "true",
+  "IsDraftWhenSaveFail": "false",
+  "CustomParams": {}
+}

+ 4 - 4
zkqy-ui/.env.production

@@ -10,14 +10,14 @@ VUE_APP_BASE_API = '/prod-api'
 # 生产环境
 #VUE_APP_BASE_API1 = 'http://192.168.2.135:8066/'
 #VUE_APP_BASE_API1 = 'http://192.168.3.17:8066/'
-VUE_APP_BASE_API1 = 'http://192.168.110.83:8066/'
-#VUE_APP_BASE_API1 = 'http://175.27.169.173:8066/'
+#VUE_APP_BASE_API1 = 'http://192.168.110.83:8066/'
+VUE_APP_BASE_API1 = 'http://175.27.169.173:8066/'
 
 
 # 图片路径
 #VUE_APP_BASE_IMG_API = 'http://192.168.3.17:1024/prod-api'
-VUE_APP_BASE_IMG_API = 'http://192.168.110.83:1025/prod-api'
-#VUE_APP_BASE_IMG_API = 'http://175.27.169.173:1025/prod-api'
+#VUE_APP_BASE_IMG_API = 'http://192.168.110.83:1025/prod-api'
+VUE_APP_BASE_IMG_API = 'http://175.27.169.173:1025/prod-api'
 
 # ws地址
 VUE_APP_BASE_WS_API = '//127.0.0.1:8721'

+ 1 - 0
zkqy-ui/.eslintrc.js

@@ -15,6 +15,7 @@ module.exports = {
   // add your custom rules here
   //it is base on https://github.com/vuejs/eslint-config-vue
   rules: {
+    "no-redeclare": "error",
     "vue/max-attributes-per-line": [2, {
       "singleline": 10,
       "multiline": {

+ 0 - 35
zkqy-ui/build/index.js

@@ -1,35 +0,0 @@
-const { run } = require('runjs')
-const chalk = require('chalk')
-const config = require('../vue.config.js')
-const rawArgv = process.argv.slice(2)
-const args = rawArgv.join(' ')
-
-if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
-  const report = rawArgv.includes('--report')
-
-  run(`vue-cli-service build ${args}`)
-
-  const port = 9526
-  const publicPath = config.publicPath
-
-  var connect = require('connect')
-  var serveStatic = require('serve-static')
-  const app = connect()
-
-  app.use(
-    publicPath,
-    serveStatic('./dist', {
-      index: ['index.html', '/']
-    })
-  )
-
-  app.listen(port, function () {
-    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
-    if (report) {
-      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
-    }
-
-  })
-} else {
-  run(`vue-cli-service build ${args}`)
-}

+ 23 - 0
zkqy-ui/src/api/tablelist/commonTable.js

@@ -389,6 +389,7 @@ export function oldNoticeOutStorage(data) {
   })
 }
 
+// 检查老库存是否足够
 export function checkOldInventory(data) {
   return request({
     url: '/system/ProductInventory/checkOldInventory',
@@ -399,6 +400,28 @@ export function checkOldInventory(data) {
   })
 }
 
+// 查询待出库的老库存信息
+export function queryTheOldInventoryDeliveryList(data) {
+  return request({
+    url: '/system/ProductInventory/queryTheOldInventoryDeliveryList',
+    method: 'get',
+    // data: data,
+    params: data,
+    timeout: 1000000000, // 设置超时时间为5秒
+    //baseURL: process.env.VUE_APP_BASE_API1
+  })
+}
+
+//0408出库新逻辑(单个库存出库逻辑)
+export function oldInventoryGoOut(data) {
+  return request({
+    url: '/system/ProductInventory/oldInventoryGoOut',
+    method: 'POST',
+    data: data,
+    timeout: 1000000000, // 设置超时时间为5秒
+    //baseURL: process.env.VUE_APP_BASE_API1
+  })
+}
 
 
 // 订单管理  打印出库单  获取详情接口

+ 4 - 1
zkqy-ui/src/permission.js

@@ -9,7 +9,8 @@ import {isRelogin} from '@/utils/request'
 NProgress.configure({showSpinner: false})
 
 const whiteList = ['/login', '/register', '/404', '/401','/redirectAuth',"/pageTransferPage","/amichi/dialogCompments/customizedVersion/processDisplay",
-  "/amichi/bp", "/amichi/ch","/amichi/jl"]
+  "/amichi/bp", "/amichi/ch","/amichi/jl","/planTable/show/southWorkshop","/planTable/show/southWorkshop",
+  "/planTable/show/northWorkshop","/planTable/show/fankuang","/planTable/show/fangsi","/planTable/show/luotong"]
 
 router.beforeEach((to, from, next) => {
   NProgress.start()
@@ -41,6 +42,8 @@ router.beforeEach((to, from, next) => {
       }
     }
   } else {
+    console.log(to.path)
+    console.log(whiteList.indexOf(to.path))
     // 没有token
     if (whiteList.indexOf(to.path) !== -1) {
       // 在免登录白名单,直接进入

+ 4 - 3
zkqy-ui/src/views/bussiness/processMange.vue

@@ -576,7 +576,8 @@ export default {
         this.$nextTick(() => {
           // this.$refs.myFormRef?.resetForm();
         });
-      }else {
+      }
+      else {
         //当前流程数据---->formKey 例如:Notes
         //查询当前组件的表单结构信息
         let pageNameObj={"pageName":row.benTaskNodeFormKey}
@@ -587,7 +588,7 @@ export default {
         const options = {
           moduleCache: {
             vue: Vue,
-            '@/api/bpmprocess/runDialogApi/index': {submitNodeForm} // 注册 API 模块
+            '@/api/bpmprocess/runDialogApi/index/c': {submitNodeForm} // 注册 API 模块
           },
           async getFile () {
             return res.fileStr
@@ -623,7 +624,7 @@ export default {
         this.formType = "designForm";
         this.myForm = preFix;
         let res1 = await getProcessNodeFormInfoData(payLoad);
-        if (res.code == 200) {
+        if (res1.code == 200) {
           this.formData = res1.data;
         } else {
           this.$message.error("网络异常,请稍后再试");

+ 0 - 2
zkqy-ui/src/views/bussiness/processMange2.vue → zkqy-ui/src/views/bussiness/processMange.vueavc

@@ -203,8 +203,6 @@
 </template>
 
 <script>
-import * as Vue from "vue"
-import {loadModule} from "vue3-sfc-loader/dist/vue2-sfc-loader"
 import {
   processList,
   runProcessNodeExecution,

+ 285 - 57
zkqy-ui/src/views/orderMange/oldOutStock/index.vue

@@ -146,9 +146,9 @@
             </el-col> -->
                 <el-col :span="24">
                   <el-form-item>
-                    <el-button type="primary" @click="outStockHandler"
-                      >出库
-                    </el-button>
+<!--                    <el-button type="primary" @click="outStockHandler"-->
+<!--                      >出库-->
+<!--                    </el-button>-->
                     <el-button @click="refreshHandler">刷新</el-button>
                   </el-form-item>
                 </el-col>
@@ -172,6 +172,7 @@
                 label="规格"
                 prop="productSpecifications"
               >
+
               </el-table-column>
               <el-table-column align="center" label="颜色" prop="productColor">
               </el-table-column>
@@ -187,64 +188,69 @@
                 >
                 </el-table-column>
               </el-table-column>
-              <el-table-column align="center" label="实发">
-                <!-- <el-table-column
-                  align="center"
-                  label="总箱数"
-                  prop="coutBoxNum"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.coutBoxNum"
-                      size="mini"
-                      @input="iptChange"
-                    ></el-input>
-                  </template>
-                </el-table-column> -->
-                <el-table-column
-                  align="center"
-                  label="箱数"
-                  prop="oldActualBoxNum"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.oldActualBoxNum"
-                      size="mini"
-                      @input="iptChange"
-                    ></el-input>
-                  </template>
-                </el-table-column>
-                <!-- <el-table-column
-                  align="center"
-                  label="总重量"
-                  prop="coutweight"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.coutweight"
-                      size="mini"
-                      @input="iptChange"
-                    ></el-input>
-                  </template>
-                </el-table-column> -->
-                <el-table-column
-                  align="center"
-                  label="重量"
-                  prop="oldActualWeight"
-                >
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.oldActualWeight"
-                      size="mini"
-                      @input="iptChange"
-                    ></el-input>
-                  </template>
-                </el-table-column>
+               <!-- -->
+              <el-table-column align="center" label="操作">
+                <template slot-scope="scope">
+                  <el-button
+                    type="primary"
+                    @click="handleEditCkDo(scope.$index, scope.row)">出库操作</el-button>
+                </template>
               </el-table-column>
             </el-table>
           </div>
         </el-col>
       </el-row>
+      <!--待出库明细表单-->
+      <el-dialog :title="dckTitle" :visible.sync="dckOpen" append-to-body width="1200px" >
+
+        <div>
+          <p style="font-size: 20px;color: red;margin-left: 815px">需求箱数:<span style="margin-right: 30px">{{xqxs}}</span>需求重量:<span>{{ xqzl }}</span></p>
+        </div>
+        <el-table
+          :data="tableData"
+          border
+          style="width: 100%">
+          <el-table-column prop="productName" label="品名"  align="center" ></el-table-column>
+          <el-table-column prop="lotNum" label="批号"  align="center" ></el-table-column>
+          <el-table-column prop="levels" label="等级"  align="center" ></el-table-column>
+          <el-table-column prop="productColour" label="颜色" align="center" ></el-table-column>
+          <el-table-column prop="totalBoxNum" label="库存箱数" align="center" ></el-table-column>
+          <el-table-column prop="totalGrossWeight" label="库存重量" align="center" ></el-table-column>
+          <el-table-column align="center" label="实发" width="600px">
+
+            <el-table-column align="center" label="箱数" prop="oldActualBoxNum">
+              <template slot-scope="{ row, $index }">
+                <el-form :model="row" :rules="getRules2($index)" :ref="`boxFormRef${$index}`" :inline="true" style="margin-top: 20px;">
+                  <el-form-item prop="oldActualBoxNum">
+                    <el-input v-model.number="row.oldActualBoxNum"  size="mini"  @input="iptChange"></el-input>
+                  </el-form-item>
+                </el-form>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" label="重量" prop="oldActualWeight">
+              <template slot-scope="{ row, $index }">
+                <el-form :model="row" :rules="getRules1($index)"    :ref="`weightFormRef${$index}`":inline="true" style="margin-top: 20px;">
+                  <el-form-item prop="oldActualWeight">
+                    <el-input v-model.number="row.oldActualWeight" size="mini" @input="iptChange"></el-input>
+                  </el-form-item>
+                </el-form>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column align="center" label="操作">
+            <template slot-scope="scope">
+              <el-button type="primary" @click="ckDo(scope.$index, scope.row)">出库</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="handleEditCkDo"
+        />
+      </el-dialog>
     </div>
   </el-card>
 </template>
@@ -256,16 +262,69 @@ import {
   queryDropDownBoxData,
   noticeOutStorage,
   oldNoticeOutStorage, checkOldInventory,
+  queryTheOldInventoryDeliveryList,
+  oldInventoryGoOut
 } from "@/api/tablelist/commonTable";
 import { mapState } from "vuex";
+import FormList from "@/components/FormGroup/formList.vue";
 
 export default {
   name: "OutStock",
   props: [],
   dicts: ["billing_type", "document_type"],
-  components: {},
+  components: {FormList},
   data() {
+    // 校验箱数的自定义校验逻辑 rule:当前校验规则对象,value:当前字段值,callback 回调函数,用于通知校验结果。
+    // const validateOldActualWeight = (rule, value, callback) => {
+    //   if(value==0){
+    //     callback(new Error('重量不能输入0'));
+    //   }
+    //   const currentRow = rule.field.split('.')[0]; // 获取当前行的索引
+    //   const totalGrossWeight = this.tableData[currentRow].totalGrossWeight; // 获取当前行的姓名
+    //   console.log(value,"输入的值是?")
+    //
+    //   if (value>totalGrossWeight) {
+    //     callback(new Error('输入项目不能大于总箱数'));
+    //   } else {
+    //     callback();
+    //   }
+    // };
+    // const validateOldActualBoxNum = (rule, value, callback) => {
+    //   if(value==0){
+    //     callback(new Error('箱数不能输入为0'));
+    //   }
+    //   const currentRow = rule.field.split('.')[0]; // 获取当前行的索引
+    //   console.log(currentRow,"当前行索引")
+    //   const totalBoxNum = this.tableData[currentRow].totalBoxNum; // 获取当前行的姓名
+    //   console.log(value,"输入的值是?")
+    //   if (value>totalBoxNum) {
+    //     callback(new Error('输入的重量不能大于总重量'));
+    //   } else {
+    //     callback();
+    //   }
+    // };
     return {
+
+      // 校验规则
+      // rulesTable: {
+      //   oldActualWeight: [
+      //     { required: true, message: '重量不能为空', trigger: 'blur' },
+      //     { validator: validateOldActualWeight, trigger: 'blur' } // 自定义校验规则
+      //   ],
+      //   oldActualBoxNum: [
+      //     { required: true, message: '箱数不能为空', trigger: 'blur' },
+      //     { validator: validateOldActualBoxNum, trigger: 'blur' } // 自定义校验规则
+      //   ]
+      // },
+      tableData: [],
+      queryParams:{
+        pageNum: 1, // 第几页
+        pageSize: 10, // 每页大小
+      },
+      total:0,
+      currentRowData:{},
+      dckTitle:"待出库老库存",
+      dckOpen:false,
       spanArr: [], // 用于记录每个 productCode 的跨行信息
       loading: false,
       dlotNum: false,
@@ -284,6 +343,7 @@ export default {
         deliveryDate: new Date(), //发货日期
         deliveryWarehouse: "", //发货仓库
         transferWarehouse: "", //调拨仓库
+        saleOrderNo:"",//销售订单号
         id: "",
       },
       leftTableData: [],
@@ -300,9 +360,171 @@ export default {
           { required: true, message: "请选择调拨仓库", trigger: "change" },
         ],
       },
+      //需求箱数|需求重量
+      xqxs:null,
+      xqzl:null,
+      sh:"",
+      productCode:"",
+      productSpecifications:"",
+      // 表单引用数组
+      formRefs: [],
+      clickHook:false,
     };
   },
   methods: {
+    // 动态生成校验规则
+    getRules1(index) {
+      return {
+        oldActualWeight: [
+          { required: true, message: '重量不能为空',trigger: 'blur' },
+          { type: 'number', message: '重量必须是数字', trigger: 'blur' },
+          {
+            validator: (rule, value, callback) => {
+              if(value==0){
+                callback(new Error('重量不能为0'));
+              }
+              const currentRow = this.tableData[index]; // 获取当前行数据
+              if (!value) {
+                callback(new Error('重量不能为空'));
+              } else if (currentRow.oldActualWeight>currentRow.totalGrossWeight) {
+                callback(new Error('重量大于库存重量'));
+              } else {
+                callback();
+              }
+            },
+            trigger: 'blur'
+          }
+        ]
+      };
+    },
+    // 动态生成校验规则
+    getRules2(index) {
+      return {
+        oldActualBoxNum: [
+          { required: true, message: '箱数不能为空', trigger: 'blur' },
+          { type: 'number', message: '重量必须是数字', trigger: 'blur' },
+          {
+            validator: (rule, value, callback) => {
+              if(value==0){
+                callback(new Error('箱数不能为0'));
+              }
+
+              const currentRow = this.tableData[index]; // 获取当前行数据
+              if (!value) {
+                callback(new Error('箱数不能为空'));
+              } else if (currentRow.oldActualBoxNum>currentRow.totalBoxNum) {
+                callback(new Error('箱数大于库存箱数'));
+              } else {
+                callback();
+              }
+            },
+            trigger: 'blur'
+          }
+        ]
+      };
+    },
+    async handleEditCkDo(index,row){
+      console.log(this.clickHook,"点击标识")
+      if(this.clickHook==false){
+        this.$message.warning("请选择对应的通知单");
+        return;
+      }
+      if(this.form.deliveryWarehouse==undefined||this.form.deliveryWarehouse==""){
+        this.$message.warning("请选择发货仓库");
+        return;
+      }
+      console.log(row,"当前行数据........")
+      // return;
+      //判断条件取值 当前行数据点击||保留的当前行数据
+      if(row==null||row==undefined){
+            //如果行数据为空证明点击的是分页,那就取当前行数据
+            row=this.currentRowData;
+      }else {
+        //如果行数据不为空就赋值当前数据
+        this.currentRowData=row;
+      }
+      this.xqxs=row.productWeight;
+      this.xqzl=row.actualWeight;
+      this.sh=row.productColor;
+      this.productCode=row.productCode;
+      this.productSpecifications=row.productSpecifications;
+      //产品编码,产品名称,规格,颜色.
+      //查询老库存列表信息
+      let res1 = await queryTheOldInventoryDeliveryList(row);
+      //打开老库存列表弹窗
+      this.total=res1.total;
+      this.tableData=res1.rows;
+      this.dckOpen=true;
+      // 初始化表单引用数组
+    },
+    async ckDo(index,row){
+      //出库逻辑........
+      console.log("出库逻辑.........")
+      console.log(row.totalBoxNum,row.oldActualBoxNum,row.totalGrossWeight,row.oldActualWeight)
+      if(row.totalBoxNum==row.oldActualBoxNum&&row.oldActualWeight<row.totalGrossWeight){
+        this.$message.warning("箱数出完,必须把重量也出完");
+        return;
+      }
+      // 获取当前行的表单引用
+      const boxFormRef = this.$refs[`boxFormRef${index}`];
+      // 获取重量列的表单引用
+      const weightFormRef = this.$refs[`weightFormRef${index}`];
+      console.log(boxFormRef,weightFormRef);
+      // 成功标记值
+      let isBoxValid = false;
+      let isWeightValid = false;
+      //
+      if (!boxFormRef || !weightFormRef) {
+        console.error('表单引用不存在');
+        return;
+      }
+
+      // 校验箱数列
+      if (boxFormRef) {
+        boxFormRef.validate((valid) => {
+          if (valid) {
+            isBoxValid = true;
+          }
+        });
+      }
+
+      // 校验重量列
+      if (weightFormRef) {
+        weightFormRef.validate((valid) => {
+          if (valid) {
+            isWeightValid = true;
+          }
+        });
+      }
+
+      console.log(isBoxValid,)
+      // 如果都校验通过
+      if (isBoxValid && isWeightValid) {
+        //通知单号,订单号,产品编码,实际出库箱数,实际出库重量,色号,规格
+        // console.log(this.form,"form表单收集的数据");
+        let payLoad={
+          "noticeNumber":this.form.noticeNumber,
+          "saleOrderNo":this.form.saleOrderNo,
+          "productCode":this.productCode,
+          "oldActualBoxNum":row.oldActualBoxNum,
+          "oldActualWeight":row.oldActualWeight,
+          "productColour":this.sh,
+          "productSpecifications":this.productSpecifications,
+          "inventoryId":row.id,
+          "productName":this.productName,
+            ...this.form
+        };
+        console.log(payLoad);
+        let resOut= await oldInventoryGoOut(payLoad)
+        console.log(resOut)
+        if(resOut.code==200){
+          this.$message.success("出库成功");
+        }else {
+          this.$message.error("出库失败");
+        }
+        this.dckOpen=false;
+      }
+    },
     iptChange(value) {
       console.log(value);
       this.$forceUpdate(); //强制刷新
@@ -344,12 +566,14 @@ export default {
     // 刷新回调
     async handleRefresh() {
       this.loading = true;
+      this.clickHook=false; //没有选择对应的单子
       await this.initData();
       await this.initWarehouse();
       this.loading = false;
     },
     // 左侧表格点击回调
     cellClick(row, column, cell, event) {
+      this.clickHook=true;
       this.currentIndex = this.leftTableData.findIndex(
         (item) => item.id == row.id
       );
@@ -502,6 +726,7 @@ export default {
           dispatchNoteRemark: "", //备注
           customerName: "", //客户名称
           deliveryClerk: "", //发货员
+          saleOrderNo:"",//销售订单号
           id: "",
         });
         return;
@@ -519,6 +744,7 @@ export default {
             dispatchNoteRemark, //备注
             saleProductInfoList, //产品信息
             id,
+            saleOrderNo
           } = res.data;
           let documentTypeName = this.getdocumentTypeName(documentType);
           // let list = saleProductInfoList.sort( (a,b)=>{
@@ -571,6 +797,7 @@ export default {
           }else{
             this.dlotNum = false;
           }
+
           Object.assign(this.form, {
             noticeNumber, //通知单号
             documentType, //通知单类型
@@ -581,6 +808,7 @@ export default {
             dispatchNoteRemark, //备注
             customerName, //客户名称
             id,
+            saleOrderNo:saleOrderNo,
           });
           this.form.deliveryClerk = this.nickName;
         } else {

+ 634 - 0
zkqy-ui/src/views/orderMange/oldOutStock/indexCopy.vue

@@ -0,0 +1,634 @@
+<!--老库存自动扣库逻辑已停用-->
+<template>
+  <el-card shadow="always" :body-style="{ padding: '10px' }">
+    <div class="app-container">
+      <el-row :gutter="10">
+        <el-col :span="10">
+          <div class="table-area">
+            <el-button
+              class="mb10"
+              type="success"
+              size="small"
+              @click="handleRefresh"
+              :icon="loading ? 'el-icon-loading' : 'el-icon-refresh'"
+              :disabled="loading"
+              >刷新
+            </el-button>
+
+            <el-table
+              :data="leftTableData"
+              border
+              stripe
+              @selection-change="handleSelectionChange"
+              @cell-click="cellClick"
+              highlight-current-row
+            >
+              <!-- <el-table-column type="selection" width="55" /> -->
+              <el-table-column type="index" label="序号" width="50" />
+              <el-table-column
+                align="center"
+                prop="customerName"
+                label="客户名称"
+              >
+              </el-table-column>
+              <el-table-column
+                align="center"
+                prop="saleOrderNo"
+                label="销售单号"
+              >
+              </el-table-column>
+              <el-table-column
+                align="center"
+                prop="noticeNumber"
+                label="通知单号"
+              >
+              </el-table-column>
+              <el-table-column
+                align="center"
+                prop="noticeDate"
+                label="开单日期"
+              >
+              </el-table-column>
+            </el-table></div
+        ></el-col>
+        <el-col :span="14">
+          <div class="form-area">
+            <el-row :gutter="20">
+              <el-form
+                :model="form"
+                ref="form"
+                label-width="80px"
+                :inline="true"
+                size="mini"
+                :rules="rules"
+              >
+                <el-col :span="16">
+                  <el-form-item label="通知单号" prop="noticeNumber">
+                    <div class="text-area">
+                      <span class="mr10">{{ form.noticeNumber }}</span>
+                      <span>{{ form.documentTypeName }}</span>
+                    </div>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="销售员" prop="salesman">
+                    {{ form.salesman }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="客户名称" prop="customerName">
+                    {{ form.customerName }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="售货单位" prop="sellingUnit">
+                    {{ form.sellingUnit }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="货车信息" prop="truckRegistration">
+                    {{ form.truckRegistration }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="发货员" prop="deliveryClerk">
+                    {{ form.deliveryClerk }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="24">
+                  <el-form-item label="备注" prop="dispatchNoteRemark">
+                    {{ form.dispatchNoteRemark }}
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="发货日期" prop="deliveryDate">
+                    <el-date-picker
+                      v-model="form.deliveryDate"
+                      type="date"
+                      size="mini"
+                      placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="发货仓库" prop="deliveryWarehouse">
+                    <el-select
+                      v-model="form.deliveryWarehouse"
+                      clearable
+                      filterable
+                    >
+                      <el-option
+                        v-for="item in warehouseList"
+                        :key="item.id"
+                        :label="item.warehouseName"
+                        :value="item.id"
+                      >
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <!-- <el-col :span="12">
+              <el-form-item label="调拨仓库" prop="transferWarehouse">
+                <el-select
+                  v-model="form.transferWarehouse"
+                  clearable
+                  filterable
+                >
+                  <el-option
+                    v-for="item in warehouseList"
+                    :key="item.id"
+                    :label="item.warehouseName"
+                    :value="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col> -->
+                <el-col :span="24">
+                  <el-form-item>
+<!--                    <el-button type="primary" @click="outStockHandler"-->
+<!--                      >出库-->
+<!--                    </el-button>-->
+                    <el-button @click="refreshHandler">刷新</el-button>
+                  </el-form-item>
+                </el-col>
+              </el-form>
+            </el-row>
+            <el-table
+              :data="saleProductInfoList"
+              border
+              stripe
+              :span-method="objectSpanMethod"
+              :row-class-name="tableRowClassName"
+            >
+              <el-table-column align="center" label="编码" prop="productCode">
+              </el-table-column>
+              <el-table-column align="center" label="品名" prop="productName">
+              </el-table-column>
+              <el-table-column align="center" label="批号" prop="lotNum" v-if="this.dlotNum">
+              </el-table-column>
+              <el-table-column
+                align="center"
+                label="规格"
+                prop="productSpecifications"
+              >
+              </el-table-column>
+              <el-table-column align="center" label="颜色" prop="productColor">
+              </el-table-column>
+              <!-- <el-table-column align="center" label="批号" prop="lotNum">
+              </el-table-column>
+              <el-table-column align="center" label="等级" prop="levels">
+              </el-table-column> -->
+              <el-table-column align="center" label="通知">
+                <el-table-column
+                  align="center"
+                  label="重量"
+                  prop="actualWeight"
+                >
+                </el-table-column>
+              </el-table-column>
+<!--              -->
+              <el-table-column align="center" label="实发">
+                <!-- <el-table-column
+                  align="center"
+                  label="总箱数"
+                  prop="coutBoxNum"
+                >
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model="scope.row.coutBoxNum"
+                      size="mini"
+                      @input="iptChange"
+                    ></el-input>
+                  </template>
+                </el-table-column> -->
+                <el-table-column
+                  align="center"
+                  label="箱数"
+                  prop="oldActualBoxNum"
+                >
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model="scope.row.oldActualBoxNum"
+                      size="mini"
+                      @input="iptChange"
+                    ></el-input>
+                  </template>
+                </el-table-column>
+                <!-- <el-table-column
+                  align="center"
+                  label="总重量"
+                  prop="coutweight"
+                >
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model="scope.row.coutweight"
+                      size="mini"
+                      @input="iptChange"
+                    ></el-input>
+                  </template>
+                </el-table-column> -->
+                <el-table-column
+                  align="center"
+                  label="重量"
+                  prop="oldActualWeight"
+                >
+                  <template slot-scope="scope">
+                    <el-input
+                      v-model="scope.row.oldActualWeight"
+                      size="mini"
+                      @input="iptChange"
+                    ></el-input>
+                  </template>
+                </el-table-column>
+              </el-table-column>
+            </el-table>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </el-card>
+</template>
+
+<script>
+import {
+  productInvoiceList,
+  saleStorageDetails,
+  queryDropDownBoxData,
+  noticeOutStorage,
+  oldNoticeOutStorage, checkOldInventory,
+} from "@/api/tablelist/commonTable";
+import { mapState } from "vuex";
+
+export default {
+  name: "OutStock",
+  props: [],
+  dicts: ["billing_type", "document_type"],
+  components: {},
+  data() {
+    return {
+      spanArr: [], // 用于记录每个 productCode 的跨行信息
+      loading: false,
+      dlotNum: false,
+      currentIndex: "",
+      form: {
+        noticeNumber: "", //通知单号
+        documentType: "", //通知单类型
+        documentTypeName: "",
+        salesman: "", //销售员
+        sellingUnit: "", //售货单位
+        truckRegistration: "", //货车信息
+        drawer: "", //开票员
+        deliveryClerk: "", // 发货员
+        dispatchNoteRemark: "", //备注
+        customerName: "", //客户名称
+        deliveryDate: new Date(), //发货日期
+        deliveryWarehouse: "", //发货仓库
+        transferWarehouse: "", //调拨仓库
+        id: "",
+      },
+      leftTableData: [],
+      warehouseList: [],
+      saleProductInfoList: [],
+      rules: {
+        deliveryDate: [
+          { required: true, message: "请选择发货日期", trigger: "change" },
+        ],
+        deliveryWarehouse: [
+          { required: true, message: "请选择发货仓库", trigger: "change" },
+        ],
+        transferWarehouse: [
+          { required: true, message: "请选择调拨仓库", trigger: "change" },
+        ],
+      },
+    };
+  },
+  methods: {
+    iptChange(value) {
+      console.log(value);
+      this.$forceUpdate(); //强制刷新
+    },
+    tableRowClassName({ row, rowIndex }) {
+      if (!row.actualWeight && row.actualWeight != 0) {
+        return "warning-row";
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      // 重量
+      if (columnIndex === 6 || columnIndex === 7 || columnIndex === 9) {
+        const prevRow2 = this.saleProductInfoList[rowIndex - 1]; //上一行数据
+        let nextRow2 = this.saleProductInfoList[rowIndex + 1]; //下一行数据
+        // 当上一行的数据等于当前行数据时,当前行单元格隐藏
+        if (
+          prevRow2 &&
+          prevRow2.productCode == row.productCode &&
+          prevRow2.productColor == row.productColor
+        ) {
+          return { rowspan: 0, colspan: 0 };
+        } else {
+          // 反之,则循环判断若下一行数据等于当前行数据,则当前行开始进行合并单元格
+          let countRowspan2 = 1; //用于合并计数多少单元格
+          while (
+            nextRow2 &&
+            nextRow2.productCode == row.productCode &&
+            nextRow2.productColor == row.productColor
+          ) {
+            nextRow2 = this.saleProductInfoList[++countRowspan2 + rowIndex];
+          }
+          if (countRowspan2 > 1) {
+            // this.saleProductInfoList[rowIndex].coutBoxNum = 9;
+            return { rowspan: countRowspan2, colspan: 1 };
+          }
+        }
+      }
+    },
+    // 刷新回调
+    async handleRefresh() {
+      this.loading = true;
+      await this.initData();
+      await this.initWarehouse();
+      this.loading = false;
+    },
+    // 左侧表格点击回调
+    cellClick(row, column, cell, event) {
+      this.currentIndex = this.leftTableData.findIndex(
+        (item) => item.id == row.id
+      );
+      this.initFormData();
+    },
+    // 刷新回调
+    refreshHandler() {
+      this.initFormData();
+    },
+    // 出库回调
+    outStockHandler() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          this.$confirm("是否确认出库?", "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+          })
+            .then(async () => {
+              let payLoad = { ...this.form };
+              payLoad.oldProductInvoiceList = this.saleProductInfoList;
+              payLoad.transferWarehouse = payLoad.deliveryWarehouse;
+              payLoad.saleOrderNo =
+                this.leftTableData[this.currentIndex || 0].saleOrderNo;
+              if (!this.form.id) {
+                return;
+              }
+              delete payLoad.documentTypeName;
+              //校验库存是否足够
+              let res1 = await checkOldInventory(payLoad);
+              //等于200 可以进行老库存出库
+              if (res1.code == 200) {
+                if(res1.isG==1){
+                    this.$confirm(res1.msg, "库存不足提示", {
+                      confirmButtonText: "确定",
+                      cancelButtonText: "取消",
+                      type: "warning",
+                    })
+                    .then(async () => {
+                      this.$message.success("出库成功");
+                      let res = await oldNoticeOutStorage(payLoad);
+                      if (res.code == 200) {
+                        this.$message.success("出库成功");
+                        this.currentIndex = 0;
+                        await this.initData();
+                        this.refreshHandler();
+                      } else {
+                        this.$message.error(res.msg);
+                      }
+                    }).catch(() => {
+                        this.$message({
+                          type: "info",
+                          message: "已取消出库",
+                        });
+                  });
+                }else {
+                  let res = await oldNoticeOutStorage(payLoad);
+                  if (res.code == 200) {
+                    this.$message.success("出库成功");
+                    this.currentIndex = 0;
+                    await this.initData();
+                    this.refreshHandler();
+                  } else {
+                    this.$message.error(res.msg);
+                  }
+                }
+              } else {
+                console.log("当前code",res1);
+
+              }
+            })
+            .catch(() => {
+              this.$message({
+                type: "info",
+                message: "已取消出库",
+              });
+            });
+        } else {
+          return false;
+        }
+      });
+    },
+    handleSelectionChange() {},
+    // 初始化仓库选项数据
+    async initWarehouse() {
+      try {
+        let payload = [
+          {
+            basicMap: {
+              tableName: "warehouse",
+            },
+            conditionMap: {
+              warehouse_type: ["1"],
+            },
+          },
+        ];
+        let res = await queryDropDownBoxData(payload);
+        if (res.code == 200) {
+          this.warehouseList = res.data.resultMap?.warehouse || [];
+        } else {
+          throw new Error(res.msg);
+        }
+      } catch (error) {}
+    },
+    // 初始化数据
+    async initData() {
+      try {
+        let payload = {
+          isEnablePaging: false,
+          status: 1,
+        };
+        let res = await productInvoiceList(payload);
+        if (res.code == 200) {
+          this.leftTableData = res.rows;
+          if (this.leftTableData.length > 0) {
+            this.currentIndex = 0;
+            this.initFormData();
+          }
+        } else {
+          throw new Error(res.msg);
+        }
+      } catch (error) {}
+    },
+    // 根据字典获取文件类型
+    getdocumentTypeName(value) {
+      return (
+        this.dict.type.document_type.find((item) => {
+          return item.value === value;
+        })?.label || ""
+      );
+    },
+    // 加载表单数据
+    async initFormData() {
+      // let { id, customerName } = this.leftTableData[this.currentIndex];
+      let id = false,
+        customerName;
+      if (this.leftTableData[this.currentIndex]) {
+        id = this.leftTableData[this.currentIndex].id;
+        customerName = this.leftTableData[this.currentIndex].customerName;
+      }
+      if (!id) {
+        //重置表单数据
+        Object.assign(this.form, {
+          noticeNumber: "", //通知单号
+          documentType: "", //通知单类型
+          documentTypeName: "", //通知单类型  名
+          salesman: "", //销售员
+          sellingUnit: "", //售货单位
+          truckRegistration: "", //货车信息
+          dispatchNoteRemark: "", //备注
+          customerName: "", //客户名称
+          deliveryClerk: "", //发货员
+          id: "",
+        });
+        return;
+      }
+      try {
+        let res = await saleStorageDetails(id);
+        if (res.code == 200) {
+          let {
+            noticeNumber, //通知单号
+            documentType, //通知单类型
+            salesman, //销售员
+            sellingUnit, //售货单位
+            truckRegistration, //货车信息
+            drawer, //开票员
+            dispatchNoteRemark, //备注
+            saleProductInfoList, //产品信息
+            id,
+          } = res.data;
+          let documentTypeName = this.getdocumentTypeName(documentType);
+          // let list = saleProductInfoList.sort( (a,b)=>{
+          //    let {productColor : colorA,productCode :codeA}=a
+          //    let {productColor : colorB,productCode : codeB}=b
+          //   return (colorA+codeA)-(colorB-codeB)
+          // })
+
+          this.saleProductInfoList = saleProductInfoList;
+          // 使用 reduce 方法来累加相同 productCode 和 productColor 的第一条数据的 boxNum
+          const codeColorSums = this.saleProductInfoList.reduce(
+            (acc, curr, index) => {
+              // 创建一个用于组合 productCode 和 productColor 的键
+              const key = `${curr.productCode}-${curr.productColor}`;
+
+              // 检查当前 key 是否已经存在
+              if (!acc[key]) {
+                // 如果不存在,添加 key 作为键,并将 boxNum 设置为当前值
+                acc[key] = {
+                  firstIndex: index,
+                  sum: curr.boxNum,
+                  weight: curr.weight,
+                  count: 1,
+                };
+              } else {
+                acc[key].count++; // 增加计数
+                acc[key].sum += curr.boxNum;
+                acc[key].weight += curr.weight;
+              }
+              return acc;
+            },
+            {}
+          );
+          this.saleProductInfoList.forEach((item, index) => {
+            if (codeColorSums[`${item.productCode}-${item.productColor}`]) {
+              item.coutBoxNum =
+                codeColorSums[`${item.productCode}-${item.productColor}`].sum;
+              item.coutweight =
+                codeColorSums[
+                  `${item.productCode}-${item.productColor}`
+                ].weight.toFixed(2);
+            }
+          });
+          if(this.saleProductInfoList.length > 0){
+            if(this.saleProductInfoList[0].lotNum == null || this.saleProductInfoList[0].lotNum == '' || this.saleProductInfoList[0].lotNum == undefined){
+              this.dlotNum = false;
+            }else{
+              this.dlotNum = true;
+            }
+          }else{
+            this.dlotNum = false;
+          }
+          Object.assign(this.form, {
+            noticeNumber, //通知单号
+            documentType, //通知单类型
+            documentTypeName, //通知单类型  名
+            salesman, //销售员
+            sellingUnit, //售货单位
+            truckRegistration, //货车信息
+            dispatchNoteRemark, //备注
+            customerName, //客户名称
+            id,
+          });
+          this.form.deliveryClerk = this.nickName;
+        } else {
+          console.log(res);
+          this.$message.error("网络异常");
+        }
+      } catch (error) {
+        console.log(error);
+      }
+    },
+  },
+  computed: {
+    ...mapState({
+      nickName: (state) => state.user.nickName,
+    }),
+  },
+  mounted() {
+    this.initData();
+    this.initWarehouse();
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.app-container {
+  display: flex;
+  width: 100%;
+
+  .table-area {
+    // width: 600px;
+  }
+
+  .form-area {
+    // flex: 1;
+  }
+}
+
+::v-deep .el-table__body tr.current-row > td.el-table__cell {
+  background-color: #55e905 !important;
+}
+
+.table-data > .gutter {
+  display: table-cell !important;
+}
+
+::v-deep .el-table .warning-row {
+  color: red;
+}
+</style>

+ 16 - 2
zkqy-ui/src/views/orderMange/retailMange/index.vue

@@ -496,7 +496,7 @@
                       <el-option
                         v-for="item in productionOptions"
                         :key="item.productName"
-                        :label="item.productName"
+                        :label="item.productName+'--'+item.productNo"
                         :value="item.productName"
                       >
                         <!-- <span class="discribe" style="float: left">{{
@@ -513,6 +513,11 @@
               </el-table-column>
               <el-table-column prop="productSpecifications" label="规格">
                 <template slot-scope="scope">
+                  <el-form-item
+                    :prop="'productSpecifications-' + scope.$index"
+                    :name="'productSpecifications-' + scope.$index"
+                    style="margin: 0px; padding: 0px"
+                  >
                   <el-select
                     v-model="scope.row.productSpecifications"
                     @change="handleSpecificationsChange(scope.row)"
@@ -534,6 +539,7 @@
                       >
                     </el-option>
                   </el-select>
+                  </el-form-item>
                 </template>
               </el-table-column>
               <el-table-column prop="colours" width="150" label="色泽">
@@ -1543,7 +1549,7 @@ export default {
     initTableValidate() {
       let length = this.productionTableData.length;
       for (let i = 0; i < length; i++) {
-        this.rules["productNo-" + i] = [
+        this.rules["productName-" + i] = [
           {
             // required: true,
             message: "请选择货品",
@@ -1551,6 +1557,14 @@ export default {
             validator: this.validateTableField,
           },
         ];
+        this.rules["productSpecifications-" + i] = [
+          {
+            // required: true,
+            message: "请选择规格",
+            trigger: "blur",
+            validator: this.validateTableField,
+          },
+        ];
         this.rules["productNumber-" + i] = [
           {
             // required: true,