Browse Source

Merge remote-tracking branch 'origin/bionutrition_dev' into bionutrition

# Conflicts:
#	warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/util/BionutritionDocUtil.java
zhangxin 1 year ago
parent
commit
81b3a78676
100 changed files with 4217 additions and 2948 deletions
  1. 987 75
      base/sql/bsl_sql/bsl_ddl_v1.0.0.sql
  2. 275 32
      base/sql/bsl_sql/bsl_dml_v1.0.0.sql
  3. 3 1
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  4. 10 0
      ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/CallBackDTO.java
  5. 60 0
      ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/PdaAgvCallController.java
  6. 55 0
      ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/PdaDocQcController.java
  7. 25 4
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/InvLotLocIdController.java
  8. 13 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/WcsTaskController.java
  9. 0 4
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/api/HualanApiController.java
  10. 0 118
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseCustomerController.java
  11. 5 4
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseLocationInfoController.java
  12. 0 117
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseSupplierController.java
  13. 0 104
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/CodeSkuRelationshipController.java
  14. 37 35
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/doc/BionutritionDocHeaderController.java
  15. 4 9
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaController.java
  16. 0 95
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaDocQcController.java
  17. 5 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaInvLotLocIdController.java
  18. 0 104
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/wms/qc/DocQcHeaderController.java
  19. 2 2
      ruoyi-admin/src/main/resources/application-dev.yml
  20. 11 11
      ruoyi-admin/src/main/resources/application-prod.yml
  21. 8 8
      ruoyi-admin/src/main/resources/logback-test.xml
  22. 8 8
      ruoyi-admin/src/main/resources/logback.xml
  23. 132 0
      ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java
  24. 2 2
      ruoyi-common/src/main/java/com/ruoyi/common/core/bean/dto/WarewmsExtDTO.java
  25. 5 5
      ruoyi-common/src/main/java/com/ruoyi/common/core/bean/entity/WarewmsExtEntity.java
  26. 2 2
      ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java
  27. 2 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  28. 6 6
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
  29. 2 2
      ruoyi-ui/src/views/wms/docAsn/index.vue
  30. 1 2
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/AciService.java
  31. 1 2
      warewms-ams/src/main/java/com/ruoyi/ams/asn/service/IWmsDocAsnHeaderService.java
  32. 6 25
      warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnHeaderServiceImpl.java
  33. 25 4
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/domain/BionutritionDocDetails.java
  34. 8 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/domain/BionutritionDocHeader.java
  35. 23 4
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/BionutritionDocDetailsDTO.java
  36. 6 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/BionutritionDocHeaderDTO.java
  37. 26 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocExcelQueryDTO.java
  38. 42 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocLotattDTO.java
  39. 12 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocQueryDto.java
  40. 14 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/BionutritionDocDetailsBaseDTO.java
  41. 5 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/ProductionPickingReceiptDetailsDTO.java
  42. 5 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/PurchaseOrderDetailsDTO.java
  43. 5 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/PurchaseReceiptDetailsDTO.java
  44. 6 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/header/BionutritionDocHeaderBaseDTO.java
  45. 0 4
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/BionutritionDocDetailsBaseExcel.java
  46. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/FinishedProductReceiptDetailsExcel.java
  47. 23 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionPickingReceiptDetailsExcel.java
  48. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionReturnOrderDetailsExcel.java
  49. 23 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseOrderDetailsExcel.java
  50. 23 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseReceiptDetailsExcel.java
  51. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleOutboundOrderDetailsExcel.java
  52. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleReturnOrderDetailsExcel.java
  53. 21 2
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/FinishedProductReceiptHeaderExcel.java
  54. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionPickingReceiptHeaderExcel.java
  55. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionReturnOrderHeaderExcel.java
  56. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseOrderHeaderExcel.java
  57. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseReceiptHeaderExcel.java
  58. 22 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleOutboundOrderHeaderExcel.java
  59. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleReturnOrderHeaderExcel.java
  60. 17 3
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/BionutritionDocDetailsService.java
  61. 48 4
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/BionutritionDocHeaderService.java
  62. 86 36
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/impl/BionutritionDocDetailsServiceImpl.java
  63. 583 24
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/impl/BionutritionDocHeaderServiceImpl.java
  64. 11 3
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/util/BionutritionDocUtil.java
  65. 57 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/AsnAgvCallDTO.java
  66. 38 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/DocQcDTO.java
  67. 41 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/GroundingDTO.java
  68. 57 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/OrderAgvCallDTO.java
  69. 1 3
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/org/bean/dto/OrgDTO.java
  70. 4 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/org/service/IOrgService.java
  71. 46 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/IPdaAgvCallService.java
  72. 23 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/IPdaDocQcService.java
  73. 303 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/impl/PdaAgvCallServiceImpl.java
  74. 183 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/impl/PdaDocQcServiceImpl.java
  75. 29 24
      warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java
  76. 5 0
      warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallDTO.java
  77. 32 0
      warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/LotattDTO.java
  78. 186 157
      warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/InvLotAtt.java
  79. 9 162
      warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/InvLotLocId.java
  80. 8 56
      warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/form/InvLocIdSearchFrom.java
  81. 4 247
      warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/vo/InvLotLocIdLotattVO.java
  82. 27 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvMoveDTO.java
  83. 26 10
      warewms-ams/src/main/java/com/ruoyi/ams/inv/mapper/InvLotAttMapper.java
  84. 11 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/mapper/InvLotLocIdMapper.java
  85. 31 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotAttService.java
  86. 32 1
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotLocIdService.java
  87. 27 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotAttServiceImpl.java
  88. 141 29
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java
  89. 3 1
      warewms-ams/src/main/java/com/ruoyi/ams/locationView/service/LocationViewService.java
  90. 3 11
      warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java
  91. 0 375
      warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/DocQcDetails.java
  92. 0 310
      warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/DocQcHeader.java
  93. 0 26
      warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/vo/DocQcListVo.java
  94. 0 62
      warewms-ams/src/main/java/com/ruoyi/ams/qc/mapper/DocQcDetailsMapper.java
  95. 0 87
      warewms-ams/src/main/java/com/ruoyi/ams/qc/mapper/DocQcHeaderMapper.java
  96. 0 84
      warewms-ams/src/main/java/com/ruoyi/ams/qc/service/IDocQcDetailsService.java
  97. 0 96
      warewms-ams/src/main/java/com/ruoyi/ams/qc/service/IDocQcHeaderService.java
  98. 0 148
      warewms-ams/src/main/java/com/ruoyi/ams/qc/service/impl/DocQcDetailsServiceImpl.java
  99. 0 187
      warewms-ams/src/main/java/com/ruoyi/ams/qc/service/impl/DocQcHeaderServiceImpl.java
  100. 0 0
      warewms-ams/src/main/java/com/ruoyi/ams/task/dto/WcsTaskInvLotDTO.java

File diff suppressed because it is too large
+ 987 - 75
base/sql/bsl_sql/bsl_ddl_v1.0.0.sql


File diff suppressed because it is too large
+ 275 - 32
base/sql/bsl_sql/bsl_dml_v1.0.0.sql


+ 3 - 1
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -3,13 +3,15 @@ package com.ruoyi;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
- * 
+ *
  * @author ruoyi
  */
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+@EnableScheduling
 public class RuoYiApplication
 {
     public static void main(String[] args)

+ 10 - 0
ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/CallBackDTO.java

@@ -0,0 +1,10 @@
+package com.ruoyi.bionutrition.pda.controller;
+
+import lombok.Data;
+
+@Data
+public class CallBackDTO {
+    private String taskNo;
+    private Integer state;
+
+}

+ 60 - 0
ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/PdaAgvCallController.java

@@ -0,0 +1,60 @@
+package com.ruoyi.bionutrition.pda.controller;
+
+import cn.hutool.core.lang.Assert;
+import com.ruoyi.ams.bionutrition.dto.AsnAgvCallDTO;
+import com.ruoyi.ams.bionutrition.dto.GroundingDTO;
+import com.ruoyi.ams.bionutrition.pda.IPdaAgvCallService;
+import com.ruoyi.ams.business.IBusinessService;
+import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 佰穗莱pda入库接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/pda/agvCall")
+@Valid
+public class PdaAgvCallController {
+
+    @Autowired
+    private IPdaAgvCallService pdaAgvCallService;
+    @Autowired
+    private IWcsTaskService wcsTaskService;
+    @Autowired
+    private IBusinessService businessService;
+
+    @ApiOperation("pda入库任务")
+    @PostMapping("/intoStorage")
+    public AjaxResult createIntoStorageTask(@RequestBody @Valid AsnAgvCallDTO asnAgvCallDTO) {
+        pdaAgvCallService.createIntoStorageTask(asnAgvCallDTO);
+        return AjaxResult.success("入库任务下发成功");
+    }
+
+    @ApiOperation("pda上架入库")
+    @PostMapping("/grounding")
+    public AjaxResult grounding(@RequestBody @Valid GroundingDTO groundingDTO) {
+        pdaAgvCallService.grounding(groundingDTO);
+        return AjaxResult.success("上架成功");
+    }
+
+    @PostMapping("/testCallBack")
+    public AjaxResult testCallBack(@RequestBody CallBackDTO callBackDTO){
+        wcsTaskService.callBack(callBackDTO.getTaskNo(), callBackDTO.getState(), 1);
+        return AjaxResult.success("任务回调完成");
+    }
+
+    @PostMapping("/testAutoSend")
+    public AjaxResult testAutoSend(){
+        businessService.autoSend();
+        return AjaxResult.success("任务下发完成");
+    }
+
+}

+ 55 - 0
ruoyi-admin/src/main/java/com/ruoyi/bionutrition/pda/controller/PdaDocQcController.java

@@ -0,0 +1,55 @@
+package com.ruoyi.bionutrition.pda.controller;
+
+import com.ruoyi.ams.bionutrition.dto.AsnAgvCallDTO;
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
+import com.ruoyi.ams.bionutrition.pda.IPdaAgvCallService;
+import com.ruoyi.ams.bionutrition.pda.IPdaDocQcService;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.StringUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 佰穗莱pda质检接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/pda/qc")
+@Valid
+public class PdaDocQcController extends BaseController {
+
+    @Autowired
+    private IPdaDocQcService pdaDocQcService;
+
+    /**
+     * 获取质检列表
+     *
+     * @return
+     */
+    @GetMapping("/getQcList")
+    public TableDataInfo getQcList(@RequestParam String sku) {
+        startPage();
+        List<DocQcDTO> qcList = pdaDocQcService.getQcList(sku);
+        return getDataTable(qcList);
+    }
+
+    /**
+     * 质检提交
+     * @param docQcDTO
+     * @return
+     */
+    @ApiOperation("pda质检")
+    @PostMapping("/submit")
+    public AjaxResult docQcSubmit(@RequestBody @Valid DocQcDTO docQcDTO) {
+        pdaDocQcService.docQcSubmit(docQcDTO, getUsername());
+        return AjaxResult.success();
+    }
+
+}

+ 25 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/InvLotLocIdController.java

@@ -1,10 +1,12 @@
 package com.ruoyi.web.controller.warewms.ams;
 
+import cn.hutool.core.lang.Assert;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
 import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
+import com.ruoyi.ams.inv.dto.InvMoveDTO;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.annotation.Log;
@@ -12,6 +14,7 @@ import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -44,6 +47,16 @@ public class InvLotLocIdController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询库位库存是否有过期
+     */
+    @PreAuthorize("@ss.hasPermi('ams:invLotLocId:list')")
+    @GetMapping("/getInvLocIfExpire")
+    public AjaxResult getExpireList() {
+        String msg = invLotLocIdService.getInvLocIfExpire();
+        return AjaxResult.success(msg);
+    }
+
     /**
      * 库存调整
      */
@@ -56,10 +69,8 @@ public class InvLotLocIdController extends BaseController {
         return invLotLocIdService.adj(invLotLocIdAdjForm);
     }
 
-    /**
-     * 库存移动
-     */
-    @PreAuthorize("@ss.hasPermi('ams:invLotLocId:move')")
+
+/*    @PreAuthorize("@ss.hasPermi('ams:invLotLocId:move')")
     @Log(title = "库位库存移动", businessType = BusinessType.UPDATE)
     @PostMapping("/move")
     public AjaxResult move(@RequestBody InvLotLocIdMoveForm invLotLocIdMoveForm) {
@@ -72,6 +83,16 @@ public class InvLotLocIdController extends BaseController {
         } else {
             return invLotLocIdService.moveDirect(invLotLocIdMoveForm);
         }
+    }*/
+
+    /**
+     * 库存移动
+     */
+    @PreAuthorize("@ss.hasPermi('ams:invLotLocId:move')")
+    @Log(title = "库位库存移动", businessType = BusinessType.UPDATE)
+    @PostMapping("/moveLocInv")
+    public AjaxResult moveLocInv(@RequestBody InvMoveDTO invMoveDTO) {
+        return invLotLocIdService.move(invMoveDTO, getUsername());
     }
 
     /**

+ 13 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/WcsTaskController.java

@@ -4,9 +4,11 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 
+import com.ruoyi.ams.bionutrition.dto.OrderAgvCallDTO;
 import com.ruoyi.ams.task.domain.form.TaskDispositionForm;
 import com.ruoyi.ams.task.form.AddTaskForm;
 import com.ruoyi.base.constant.Constant;
@@ -128,7 +130,7 @@ public class WcsTaskController extends BaseController {
         int agvNo = 9999;
         WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
         if (wcsTask == null) {
-           return AjaxResult.error("任务回调失败");
+            return AjaxResult.error("任务回调失败");
         }
         if (StringUtils.isNotEmpty(wcsTask.getAgvNo())) {
             agvNo = Integer.parseInt(wcsTask.getAgvNo());
@@ -202,6 +204,16 @@ public class WcsTaskController extends BaseController {
         return AjaxResult.success("下发充电任务成功");
     }
 
+    /**
+     * 根据单号盒类型创建出库任务
+     *
+     * @param orderAgvCallDTO
+     * @return
+     */
+    @PostMapping("/createOutboundTaskByDoc")
+    public AjaxResult createOutboundTaskByDoc(@RequestBody @Valid OrderAgvCallDTO orderAgvCallDTO) {
+        return wcsTaskService.createOutboundTaskByDoc(orderAgvCallDTO);
+    }
 
     public static class ToChargeForm {
         private Integer agvNo;

+ 0 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/api/HualanApiController.java

@@ -7,9 +7,7 @@ import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.controller.warewms.pda.PdaDocAsnController;
-import com.ruoyi.web.controller.warewms.pda.PdaDocQcController;
 import com.ruoyi.web.controller.warewms.pda.PdaDocSoController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -38,8 +36,6 @@ public class HualanApiController {
     @Autowired
     private PdaDocSoController pdaDocSoController;
     @Autowired
-    private PdaDocQcController pdaDocQcController;
-    @Autowired
     private IInvLotLocIdService invLotLocIdService;
 
     /**

+ 0 - 118
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseCustomerController.java

@@ -1,118 +0,0 @@
-package com.ruoyi.web.controller.warewms.base;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import com.ruoyi.base.domain.BaseSupplier;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.base.domain.BaseCustomer;
-import com.ruoyi.base.service.IBaseCustomerService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 客户Controller
- * 
- * @author andy
- * @date 2022-02-21
- */
-@RestController
-@RequestMapping("/base/customer")
-public class BaseCustomerController extends BaseController
-{
-    @Autowired
-    private IBaseCustomerService baseCustomerService;
-
-    /**
-     * 查询客户列表
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(BaseCustomer baseCustomer)
-    {
-        startPage();
-        List<BaseCustomer> list = baseCustomerService.selectBaseCustomerList(baseCustomer);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出客户列表
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:export')")
-    @Log(title = "客户", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, BaseCustomer baseCustomer)
-    {
-        List<BaseCustomer> list = baseCustomerService.selectBaseCustomerList(baseCustomer);
-        ExcelUtil<BaseCustomer> util = new ExcelUtil<BaseCustomer>(BaseCustomer.class);
-        util.exportExcel(response, list, "客户数据");
-    }
-
-    /**
-     * 获取客户详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:query')")
-    @GetMapping(value = "/{customerId}")
-    public AjaxResult getInfo(@PathVariable("customerId") String customerId)
-    {
-        return AjaxResult.success(baseCustomerService.selectBaseCustomerByCustomerId(customerId));
-    }
-
-    /**
-     * 新增客户
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:add')")
-    @Log(title = "客户", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody BaseCustomer baseCustomer)
-    {
-        return toAjax(baseCustomerService.insertBaseCustomer(baseCustomer));
-    }
-
-    /**
-     * 修改客户
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:edit')")
-    @Log(title = "客户", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody BaseCustomer baseCustomer)
-    {
-        return toAjax(baseCustomerService.updateBaseCustomer(baseCustomer));
-    }
-
-    /**
-     * 删除客户
-     */
-    @PreAuthorize("@ss.hasPermi('base:customer:remove')")
-    @Log(title = "客户", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{customerIds}")
-    public AjaxResult remove(@PathVariable String[] customerIds)
-    {
-        return toAjax(baseCustomerService.deleteBaseCustomerByCustomerIds(customerIds));
-    }
-
-    /**
-     * 获取供应商信息字典
-     */
-    @GetMapping("queryDict")
-    public AjaxResult queryDict()
-    {
-        BaseCustomer query = new BaseCustomer();
-        query.setStatus("0");
-        List<BaseCustomer> suppliers = baseCustomerService.selectBaseCustomerList(query);
-        return AjaxResult.success(suppliers);
-    }
-}

+ 5 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseLocationInfoController.java

@@ -109,9 +109,10 @@ public class BaseLocationInfoController extends BaseController {
      * 获取库位字典
      */
     @GetMapping("/queryDict/{zoneId}")
-    public AjaxResult queryDict(@PathVariable("zoneId") Long zoneId) {
+    public TableDataInfo queryDict(@PathVariable("zoneId") Long zoneId) {
+        startPage();
         List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectSortedLocatinListByZoneId(zoneId, 1L,null);
-        return AjaxResult.success("", locationInfoList);
+        return getDataTable( locationInfoList);
     }
 
     /**
@@ -122,7 +123,7 @@ public class BaseLocationInfoController extends BaseController {
         return AjaxResult.success(baseLocationInfoService.buildLocationTreeSelect());
     }
 
-    @Log(title = "库位导入", businessType = BusinessType.IMPORT)
+    /*@Log(title = "库位导入", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('base:locationInfo:edit')")
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
@@ -131,7 +132,7 @@ public class BaseLocationInfoController extends BaseController {
         List<BaseLocationInfo> list = util.importExcel(file.getInputStream());
         String operName = getUsername();
         return baseLocationInfoService.importLocation(list, updateSupport, operName);
-    }
+    }*/
 
     @PostMapping("/importTemplate")
     public void importTemplate(HttpServletResponse response)

+ 0 - 117
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseSupplierController.java

@@ -1,117 +0,0 @@
-package com.ruoyi.web.controller.warewms.base;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.base.domain.BaseSupplier;
-import com.ruoyi.base.service.IBaseSupplierService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 供应商Controller
- * 
- * @author andy
- * @date 2022-02-21
- */
-@RestController
-@RequestMapping("/base/supplier")
-public class BaseSupplierController extends BaseController
-{
-    @Autowired
-    private IBaseSupplierService baseSupplierService;
-
-    /**
-     * 查询供应商列表
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(BaseSupplier baseSupplier)
-    {
-        startPage();
-        List<BaseSupplier> list = baseSupplierService.selectBaseSupplierList(baseSupplier);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出供应商列表
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:export')")
-    @Log(title = "供应商", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, BaseSupplier baseSupplier)
-    {
-        List<BaseSupplier> list = baseSupplierService.selectBaseSupplierList(baseSupplier);
-        ExcelUtil<BaseSupplier> util = new ExcelUtil<BaseSupplier>(BaseSupplier.class);
-        util.exportExcel(response, list, "供应商数据");
-    }
-
-    /**
-     * 获取供应商详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:query')")
-    @GetMapping(value = "/{supplierId}")
-    public AjaxResult getInfo(@PathVariable("supplierId") String supplierId)
-    {
-        return AjaxResult.success(baseSupplierService.selectBaseSupplierBySupplierId(supplierId));
-    }
-
-    /**
-     * 新增供应商
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:add')")
-    @Log(title = "供应商", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody BaseSupplier baseSupplier)
-    {
-        return toAjax(baseSupplierService.insertBaseSupplier(baseSupplier));
-    }
-
-    /**
-     * 修改供应商
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:edit')")
-    @Log(title = "供应商", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody BaseSupplier baseSupplier)
-    {
-        return toAjax(baseSupplierService.updateBaseSupplier(baseSupplier));
-    }
-
-    /**
-     * 删除供应商
-     */
-    @PreAuthorize("@ss.hasPermi('base:supplier:remove')")
-    @Log(title = "供应商", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{supplierIds}")
-    public AjaxResult remove(@PathVariable String[] supplierIds)
-    {
-        return toAjax(baseSupplierService.deleteBaseSupplierBySupplierIds(supplierIds));
-    }
-
-    /**
-     * 获取供应商信息字典
-     */
-    @GetMapping("queryDict")
-    public AjaxResult queryDict()
-    {
-        BaseSupplier query = new BaseSupplier();
-        query.setStatus("0");
-        List<BaseSupplier> suppliers = baseSupplierService.selectBaseSupplierList(query);
-        return AjaxResult.success(suppliers);
-    }
-}

+ 0 - 104
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/CodeSkuRelationshipController.java

@@ -1,104 +0,0 @@
-package com.ruoyi.web.controller.warewms.base;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.base.domain.CodeSkuRelationship;
-import com.ruoyi.base.service.ICodeSkuRelationshipService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 条码品号关系表Controller
- * 
- * @author andy
- * @date 2022-11-07
- */
-@RestController
-@RequestMapping("/snRelationship/relationship")
-public class CodeSkuRelationshipController extends BaseController
-{
-    @Autowired
-    private ICodeSkuRelationshipService codeSkuRelationshipService;
-
-    /**
-     * 查询条码品号关系表列表
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(CodeSkuRelationship codeSkuRelationship)
-    {
-        startPage();
-        List<CodeSkuRelationship> list = codeSkuRelationshipService.selectCodeSkuRelationshipList(codeSkuRelationship);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出条码品号关系表列表
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:export')")
-    @Log(title = "条码品号关系表", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, CodeSkuRelationship codeSkuRelationship)
-    {
-        List<CodeSkuRelationship> list = codeSkuRelationshipService.selectCodeSkuRelationshipList(codeSkuRelationship);
-        ExcelUtil<CodeSkuRelationship> util = new ExcelUtil<CodeSkuRelationship>(CodeSkuRelationship.class);
-        util.exportExcel(response, list, "条码品号关系表数据");
-    }
-
-    /**
-     * 获取条码品号关系表详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:query')")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return AjaxResult.success(codeSkuRelationshipService.selectCodeSkuRelationshipById(id));
-    }
-
-    /**
-     * 新增条码品号关系表
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:add')")
-    @Log(title = "条码品号关系表", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody CodeSkuRelationship codeSkuRelationship)
-    {
-        return toAjax(codeSkuRelationshipService.insertCodeSkuRelationship(codeSkuRelationship));
-    }
-
-    /**
-     * 修改条码品号关系表
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:edit')")
-    @Log(title = "条码品号关系表", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody CodeSkuRelationship codeSkuRelationship)
-    {
-        return toAjax(codeSkuRelationshipService.updateCodeSkuRelationship(codeSkuRelationship));
-    }
-
-    /**
-     * 删除条码品号关系表
-     */
-    @PreAuthorize("@ss.hasPermi('snRelationship:relationship:remove')")
-    @Log(title = "条码品号关系表", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
-        return toAjax(codeSkuRelationshipService.deleteCodeSkuRelationshipByIds(ids));
-    }
-}

+ 37 - 35
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/doc/BionutritionDocHeaderController.java

@@ -1,24 +1,22 @@
 package com.ruoyi.web.controller.warewms.doc;
 
 import com.github.pagehelper.PageInfo;
-import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
-import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
-import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.*;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
-import com.ruoyi.base.constant.type.BizEnum;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.PageUtils;
-import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.util.Arrays;
 import java.util.List;
 
@@ -35,7 +33,7 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 查询单据头分页列表
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:list')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:list')")
     @GetMapping("/list")
     public TableDataInfo list(BionutritionDocHeaderDTO docHeaderDTO) {
         PageUtils.startPage();
@@ -46,7 +44,7 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 根据单号获取单据信息
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
     @GetMapping(value = "/{docNo}")
     public AjaxResult getInfo(@PathVariable("docNo") String docNo)
     {
@@ -56,18 +54,20 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 新增单据头
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:add')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:add')")
     @Log(title = "新增单据头", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BionutritionDocHeaderDTO docHeaderDTO)
     {
-        return toAjax(bionutritionDocHeaderService.insertDocHeader(docHeaderDTO));
+        String result = bionutritionDocHeaderService.insertDocHeader(docHeaderDTO);
+        docHeaderDTO.setId(result);
+        return Long.valueOf(result) > 0 ? AjaxResult.success(docHeaderDTO) : AjaxResult.error();
     }
 
     /**
      * 修改单据头
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:edit')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:edit')")
     @Log(title = "修改单据头", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody BionutritionDocHeaderDTO docHeaderDTO)
@@ -78,7 +78,7 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 根据id删除单据
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:remove')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:remove')")
     @Log(title = "删除单据头", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids)
@@ -89,50 +89,42 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 导出单据列表
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:export')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:export')")
     @Log(title = "导出单据", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public List<BionutritionDocBaseDTO> export(HttpServletResponse response, String[] ids, BionutritionDocHeaderDTO docHeaderDTO) {
-
-        List<BionutritionDocBaseDTO> list = StringUtils.isNotBlank(docHeaderDTO.getDocType()) ?
-                bionutritionDocHeaderService.getDocList(docHeaderDTO) : bionutritionDocHeaderService.getDicListByIds(ids);
-        /*ExcelUtil<BionutritionDocBaseDTO> util = new ExcelUtil<BionutritionDocBaseDTO>(BionutritionDocBaseDTO.class);
-        util.exportExcel(response, list, "入库单数据");*/
-        return list;
+    public void export(HttpServletResponse response, @Valid DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException {
+        bionutritionDocHeaderService.exportExcel(response,docExcelQueryDTO);
     }
 
+    /********************************** 单据明细 *********************************************/
+
     /**
-     * 导出采购单列表
+     * 根据单号和单据类型获取单据信息
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:export')")
-    @Log(title = "导出采购单", businessType = BusinessType.EXPORT)
-    @PostMapping("/purchase/export")
-    public void purchaseExport(HttpServletResponse response, BionutritionDocHeaderDTO docHeaderDTO) {
-
-        docHeaderDTO.setDocType(BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_ORDER.getDocType());
-        List<BionutritionDocBaseDTO> docList = bionutritionDocHeaderService.getDocList(docHeaderDTO);
-        log.info("---{}",docList);
-        /*ExcelUtil<PurchaseOrderExcel> exportUtil = new ExcelUtil<>(PurchaseOrderExcel.class);
-        exportUtil.exportExcel(response, excelList, "采购单", "采购单");*/
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
+    @GetMapping("/getInfo")
+    public AjaxResult getInfoByDocNoAndDocType(DocQueryDto docQueryDto)
+    {
+        List<BionutritionDocBaseDTO> docBaseDTOList = bionutritionDocDetailsService.selectDetailsByDocNoAndDocType(docQueryDto.getDocNo(), docQueryDto.getDocType());
+        return AjaxResult.success(docBaseDTOList);
     }
 
-    /********************************** 单据明细 *********************************************/
-
     /**
      * 新增单据明细
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:add')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:add')")
     @Log(title = "添加单据明细", businessType = BusinessType.INSERT)
     @PostMapping("/addDocDetails")
     public AjaxResult addDetails(@RequestBody BionutritionDocDetailsDTO docDetailsDTO)
     {
+//        Assert.isTrue(StringUtils.isNotBlank(docDetailsDTO.getDocLineNo()));
         return toAjax(bionutritionDocDetailsService.insertDocDetails(docDetailsDTO));
     }
 
     /**
      * 修改单据明细
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:edit')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:edit')")
     @Log(title = "修改单据明细", businessType = BusinessType.UPDATE)
     @PutMapping("/editDocDetails")
     public AjaxResult editDetails(@RequestBody BionutritionDocDetailsDTO docDetailsDTO)
@@ -143,13 +135,23 @@ public class BionutritionDocHeaderController extends BaseController {
     /**
      * 根据单头id和行号获取单据明细信息
      */
-//    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
     @GetMapping("/queryDocDetailsInfo")
     public AjaxResult getDetailsByLineNo(@RequestParam String docHeaderId, @RequestParam String docLineNo)
     {
         return AjaxResult.success(bionutritionDocDetailsService.selectDocDetailsByLineNo(docHeaderId,docLineNo));
     }
 
+    /**
+     * 根据id获取单据明细信息
+     */
+    @PreAuthorize("@ss.hasPermi('docAsn:docAsn:query')")
+    @GetMapping("/queryDocDetailsInfo/{id}")
+    public AjaxResult getDetailsById(@PathVariable String id)
+    {
+        return AjaxResult.success(bionutritionDocDetailsService.selectById(id));
+    }
+
     /**
      * 根据明细id删除明细
      * @param ids

+ 4 - 9
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaController.java

@@ -37,9 +37,6 @@ import com.ruoyi.ams.order.service.IActAllocationDetailsService;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
 import com.ruoyi.ams.order.vo.CheckOutVO;
 import com.ruoyi.ams.order.vo.PickingListVO;
-import com.ruoyi.base.domain.vo.CodeSkuRelationshipVO;
-import com.ruoyi.base.form.SnCheckForm;
-import com.ruoyi.base.service.ICodeSkuRelationshipService;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -76,8 +73,6 @@ public class PdaController {
     @Autowired
     private IActAllocationDetailsService actAllocationDetailsService;
     @Autowired
-    private ICodeSkuRelationshipService codeSkuRelationshipService;
-    @Autowired
     private ILotattConfigService lotattConfigService;
     @Autowired
     private ISysDictDataService sysDictDataService;
@@ -173,11 +168,11 @@ public class PdaController {
      * @param snCheckForm
      * @return
      */
-    @PostMapping("/docAsn/snCheck")
+/*    @PostMapping("/docAsn/snCheck")
     public AjaxResult snCheck(@Validated @RequestBody SnCheckForm snCheckForm) {
         CodeSkuRelationshipVO codeSkuRelationshipVO = wmsDocAsnHeaderService.searchSn(snCheckForm);
         return AjaxResult.success(codeSkuRelationshipVO);
-    }
+    }*/
 
     /**
      * PDA上架
@@ -445,10 +440,10 @@ public class PdaController {
         LotattDTO lotattDTO = new LotattDTO();
         lotattDTO.setLotatt07(invTransferPickForm.getPalletNoFrom());
         lotattDTO.setLotatt08(invTransferPickForm.getAsnNo());
-        CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.snCheck(invTransferPickForm.getSn());
+        /*CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.snCheck(invTransferPickForm.getSn());
         if (codeSkuRelationshipVO.isProduct()) {
             lotattDTO.setLotatt02(codeSkuRelationshipVO.getSn());
-        }
+        }*/
         return invLotLocIdService.invTransferPick(lotattDTO, new BigDecimal(invTransferPickForm.getQty()), invTransferPickForm.getPalletNoTo());
     }
 }

+ 0 - 95
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaDocQcController.java

@@ -1,95 +0,0 @@
-package com.ruoyi.web.controller.warewms.pda;
-
-import com.ruoyi.ams.qc.domain.vo.DocQcListVo;
-import com.ruoyi.ams.qc.service.IDocQcDetailsService;
-import com.ruoyi.ams.qc.service.IDocQcHeaderService;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author JWK
- * @version 1.0
- * @date 2022/11/14 14:52
- */
-@RestController
-@RequestMapping("/pda/qc")
-public class PdaDocQcController {
-
-
-    @Autowired
-    private IDocQcHeaderService iDocQcHeaderService;
-
-    @Autowired
-    private IDocQcDetailsService iDocQcDetailsService;
-
-
-    /**
-     * 获取质检列表(根据sku)
-     *
-     * @return
-     */
-    @GetMapping("/getQcList")
-    public AjaxResult getQcListByInvLotLocId(String sku) {
-        List<DocQcListVo> qcListByInvLotLocId = iDocQcHeaderService.getQcListByInvLotLocId(sku);
-        if (qcListByInvLotLocId.size() == 0) {
-            return AjaxResult.error("没有需要质检的库存!");
-        }
-        return AjaxResult.success("获取成功!", qcListByInvLotLocId);
-    }
-
-    /**
-     * 质检提交
-     *
-     * @param map
-     * @return
-     */
-    @Log(title = "PDA质检提交(根据库存质检)", businessType = BusinessType.UPDATE)
-    @PostMapping("/submit")
-    public AjaxResult qcSubmit(@RequestBody Map<String, String> map) {
-        return iDocQcHeaderService.qcSubmit(map.get("sku"), map.get("batchNo"), map.get("status"));
-    }
-
-    /**
-     * 获取库位列表(根据批号)
-     *
-     * @return
-     */
-    @GetMapping("/getLocList")
-    public AjaxResult getLocationListByLotNumber(String lotNumber) {
-        if (StringUtils.isEmpty(lotNumber)) {
-            return AjaxResult.error("批号不能为空!");
-        }
-        List<DocQcListVo> qcListByInvLotLocId = iDocQcHeaderService.getLocationListByLotNumber(lotNumber);
-        if (qcListByInvLotLocId.size() == 0) {
-            return AjaxResult.error("没有需要质检的库存!");
-        }
-        return AjaxResult.success("获取成功!", qcListByInvLotLocId);
-    }
-
-
-    /**
-     * 质检提交 此接口暂时作废(暂时不用验收单质检)
-     *
-     * @param qcNo
-     * @param qcLineNo
-     * @param qualityStatus 质量状态
-     * @param description   结果说明
-     * @param updateBy      操作人
-     * @return
-     */
-    @Log(title = "PDA质检提交", businessType = BusinessType.UPDATE)
-    @PostMapping("/submit0")
-    public AjaxResult qcSubmit(String qcNo, String qcLineNo, String qualityStatus
-            , String description, String updateBy) {
-
-        return iDocQcDetailsService.qcSubmit(qcNo, qcLineNo, qualityStatus
-                , description, updateBy);
-    }
-}

+ 5 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaInvLotLocIdController.java

@@ -4,10 +4,12 @@ import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
+import com.ruoyi.ams.inv.dto.InvMoveDTO;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.StringUtils;
@@ -28,7 +30,7 @@ import java.util.stream.Collectors;
 @Api("库内作业")
 @RestController
 @RequestMapping("/pda/inv")
-public class PdaInvLotLocIdController {
+public class PdaInvLotLocIdController extends BaseController {
 
     @Autowired
     private IInvLotLocIdService invLotLocIdService;
@@ -112,7 +114,8 @@ public class PdaInvLotLocIdController {
         // 判断是否叫车
         if (invLotLocIdMoveForm.getIsCallCar() == null
                 || invLotLocIdMoveForm.getIsCallCar().equals(Constant.IS_YES.Y.getValue())) {
-            return invLotLocIdService.move(invLotLocIdMoveForm);
+            InvMoveDTO invMoveDTO = new InvMoveDTO(invLotLocIdMoveForm.getLocationFrom(), invLotLocIdMoveForm.getLocationTo(), invLotLocIdMoveForm.getUpdateBy());
+            return invLotLocIdService.move(invMoveDTO, getUsername());
         } else {
             return invLotLocIdService.moveDirect(invLotLocIdMoveForm);
         }

+ 0 - 104
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/wms/qc/DocQcHeaderController.java

@@ -1,104 +0,0 @@
-package com.ruoyi.web.controller.warewms.wms.qc;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.ams.qc.domain.DocQcHeader;
-import com.ruoyi.ams.qc.service.IDocQcHeaderService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 质检Controller
- * 
- * @author ruoyi
- * @date 2022-11-14
- */
-@RestController
-@RequestMapping("/docQc/docQcHeader")
-public class DocQcHeaderController extends BaseController
-{
-    @Autowired
-    private IDocQcHeaderService docQcHeaderService;
-
-    /**
-     * 查询质检列表
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(DocQcHeader docQcHeader)
-    {
-        startPage();
-        List<DocQcHeader> list = docQcHeaderService.selectDocQcHeaderList(docQcHeader);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出质检列表
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:export')")
-    @Log(title = "质检", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, DocQcHeader docQcHeader)
-    {
-        List<DocQcHeader> list = docQcHeaderService.selectDocQcHeaderList(docQcHeader);
-        ExcelUtil<DocQcHeader> util = new ExcelUtil<DocQcHeader>(DocQcHeader.class);
-        util.exportExcel(response, list, "质检数据");
-    }
-
-    /**
-     * 获取质检详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:query')")
-    @GetMapping(value = "/{qcno}")
-    public AjaxResult getInfo(@PathVariable("qcno") String qcno)
-    {
-        return AjaxResult.success(docQcHeaderService.selectDocQcHeaderByQcno(qcno));
-    }
-
-    /**
-     * 新增质检
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:add')")
-    @Log(title = "质检", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody DocQcHeader docQcHeader)
-    {
-        return toAjax(docQcHeaderService.insertDocQcHeader(docQcHeader));
-    }
-
-    /**
-     * 修改质检
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:edit')")
-    @Log(title = "质检", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody DocQcHeader docQcHeader)
-    {
-        return toAjax(docQcHeaderService.updateDocQcHeader(docQcHeader));
-    }
-
-    /**
-     * 删除质检
-     */
-    @PreAuthorize("@ss.hasPermi('docQc:docQcHeader:remove')")
-    @Log(title = "质检", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{qcnos}")
-    public AjaxResult remove(@PathVariable String[] qcnos)
-    {
-        return toAjax(docQcHeaderService.deleteDocQcHeaderByQcnos(qcnos));
-    }
-}

+ 2 - 2
ruoyi-admin/src/main/resources/application-dev.yml

@@ -4,9 +4,9 @@ spring:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.cj.jdbc.Driver
         druid:
-            # 主库数据源
+            # 主库数据源47.100.220.92
             master:
-                url: jdbc:mysql://localhost:3306/warewms-baicuilai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                url: jdbc:mysql://localhost:3306/baisuilai_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 username: root
                 password: 123456
                 driverClassName: com.mysql.cj.jdbc.Driver

+ 11 - 11
ruoyi-admin/src/main/resources/application-prod.yml

@@ -6,8 +6,8 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/warewms-hualan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
-                username: warewms
+                url: jdbc:mysql://localhost:3306/warewms-baisuilai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                username: root
                 password: warewms123
             # 从库数据源
             slave:
@@ -93,44 +93,44 @@ init-task:
 modbus:
     tcp-master:
         first: # 自动门(靠马路)
-            open: true
+            open: false
             host: 192.168.42.201
             port: 9000
         second: # 自动门(靠里面)
-            open: true
+            open: false
             host: 192.168.42.202
             port: 9000
         sixth: # 自动门(靠马路-第二层)
-            open: true
+            open: false
             host: 192.168.42.210
             port: 9000
         seventh: # 卷帘门
-            open: true
+            open: false
             host: 192.168.42.211
             port: 9000
         third: # 按钮盒
-            open: true
+            open: false
             host: 192.168.42.205
             port: 9000
         fourth: # 充电机(三向车)
-            open: true
+            open: false
             host: 192.168.42.208
             port: 8899
         fifth: # 充电机(迷你堆垛)
-            open: true
+            open: false
             host: 192.168.42.209
             port: 8899
 
 
 rfid:
     first: # 靠马路
-        open: true
+        open: false
         host: 192.168.42.203
         port: 5084
         number-of-tags: 3 # 一次读取标签的数量
         timeout-milliseconds: 5000
     second: # 靠里面
-        open: true
+        open: false
         host: 192.168.42.204
         port: 5084
         number-of-tags: 3 # 一次读取标签的数量

+ 8 - 8
ruoyi-admin/src/main/resources/logback-test.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/Users/gizmo/JavaProjectsFiles/Logs/ruoyi/logs" />
+	<property name="log.path" value="../logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
@@ -11,7 +11,7 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
@@ -34,7 +34,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
@@ -56,7 +56,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-	
+
 	<!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,7 +70,7 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 系统模块日志级别控制  -->
 	<logger name="com.ruoyi" level="info" />
 	<!-- Spring日志级别控制  -->
@@ -79,15 +79,15 @@
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>
-	
+
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />
         <appender-ref ref="file_error" />
     </root>
-	
+
 	<!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
+</configuration>

+ 8 - 8
ruoyi-admin/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="../../../warewms/logs" />
+	<property name="log.path" value="../logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
@@ -11,7 +11,7 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
@@ -34,7 +34,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
@@ -56,7 +56,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-	
+
 	<!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,7 +70,7 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 系统模块日志级别控制  -->
 	<logger name="com.ruoyi" level="info" />
 	<!-- Spring日志级别控制  -->
@@ -79,15 +79,15 @@
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>
-	
+
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />
         <appender-ref ref="file_error" />
     </root>
-	
+
 	<!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
+</configuration>

+ 132 - 0
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java

@@ -1,5 +1,9 @@
 package com.ruoyi.admin.test.base;
 
+import cn.hutool.core.lang.Dict;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.ruoyi.RuoYiApplication;
 import com.ruoyi.ams.agv.ndc.domain.AmsHexdefineDetail;
@@ -9,6 +13,10 @@ import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
 import com.ruoyi.ams.asn.domain.WmsDocAsnHeader;
 import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
+import com.ruoyi.ams.bionutrition.dto.AsnAgvCallDTO;
+import com.ruoyi.ams.bionutrition.pda.IPdaAgvCallService;
+import com.ruoyi.ams.bionutrition.pda.impl.PdaAgvCallServiceImpl;
 import com.ruoyi.ams.business.IBusinessService;
 import com.ruoyi.ams.business.domain.FilterLockInvLocationDTO;
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
@@ -29,6 +37,7 @@ import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
 import com.ruoyi.ams.order.mapper.WmsDocOrderDetailsMapper;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
 import com.ruoyi.ams.order.vo.StockOrderVO;
+import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
@@ -40,11 +49,14 @@ import com.ruoyi.base.service.IBaseIdsequenceService;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.base.service.IBaseWarehouseService;
 import com.ruoyi.base.utils.IdSequenceUtils;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -56,6 +68,7 @@ import java.util.List;
  * User: andy.qu
  * Date: 2022/2/9
  */
+@Slf4j
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = RuoYiApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 public class WarehouseTest {
@@ -316,4 +329,123 @@ public class WarehouseTest {
 
     }
 
+    @Autowired
+    private IPdaAgvCallService pdaAgvCallService;
+
+    @Test
+    public void testAgvIntoStorage(){
+        AsnAgvCallDTO asnAgvCallDTO = new AsnAgvCallDTO();
+        asnAgvCallDTO.setDocNo("i_00909889");
+        asnAgvCallDTO.setLocationFrom("101339");
+        asnAgvCallDTO.setSkuCode("测试物料1");
+        pdaAgvCallService.createIntoStorageTask(asnAgvCallDTO);
+    }
+
+    @Autowired
+    private BionutritionDocHeaderService bionutritionDocHeaderService;
+    @Test
+    public void testUpdateDocStatus(){
+        WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo("1702869769911");
+        bionutritionDocHeaderService.updateDocStatus(wcsTask);
+    }
+
+    @Test
+    public void testCallBack(){
+        wcsTaskService.callBack("1703144270275", 6, 1);
+    }
+
+    @Test
+    public void testInsertBaseLocationInfo(){
+        String s = "[\n" +
+                "{\"第1层\":\"G01-01\",\"站点编号1\":901,\"第2层\":\"G02-01\",\"站点编号2\":902,\"第3层\":\"G03-01\",\"站点编号3\":903,\"第4层\":\"G04-01\",\"站点编号4\":904},\n" +
+                "{\"第1层\":\"G01-02\",\"站点编号1\":905,\"第2层\":\"G02-02\",\"站点编号2\":906,\"第3层\":\"G03-02\",\"站点编号3\":907,\"第4层\":\"G04-02\",\"站点编号4\":908},\n" +
+                "{\"第1层\":\"G01-03\",\"站点编号1\":909,\"第2层\":\"G02-03\",\"站点编号2\":910,\"第3层\":\"G03-03\",\"站点编号3\":911,\"第4层\":\"G04-03\",\"站点编号4\":912},\n" +
+                "{\"第1层\":\"G01-04\",\"站点编号1\":913,\"第2层\":\"G02-04\",\"站点编号2\":914,\"第3层\":\"G03-04\",\"站点编号3\":915,\"第4层\":\"G04-04\",\"站点编号4\":916},\n" +
+                "{\"第1层\":\"G01-05\",\"站点编号1\":917,\"第2层\":\"G02-05\",\"站点编号2\":918,\"第3层\":\"G03-05\",\"站点编号3\":919,\"第4层\":\"G04-05\",\"站点编号4\":920},\n" +
+                "{\"第1层\":\"G01-06\",\"站点编号1\":921,\"第2层\":\"G02-06\",\"站点编号2\":922,\"第3层\":\"G03-06\",\"站点编号3\":923,\"第4层\":\"G04-06\",\"站点编号4\":924},\n" +
+                "{\"第1层\":\"G01-07\",\"站点编号1\":925,\"第2层\":\"G02-07\",\"站点编号2\":926,\"第3层\":\"G03-07\",\"站点编号3\":927,\"第4层\":\"G04-07\",\"站点编号4\":928},\n" +
+                "{\"第1层\":\"G01-08\",\"站点编号1\":929,\"第2层\":\"G02-08\",\"站点编号2\":930,\"第3层\":\"G03-08\",\"站点编号3\":931,\"第4层\":\"G04-08\",\"站点编号4\":932},\n" +
+                "{\"第1层\":\"G01-09\",\"站点编号1\":933,\"第2层\":\"G02-09\",\"站点编号2\":934,\"第3层\":\"G03-09\",\"站点编号3\":935,\"第4层\":\"G04-09\",\"站点编号4\":936},\n" +
+                "{\"第1层\":\"G01-10\",\"站点编号1\":937,\"第2层\":\"G02-10\",\"站点编号2\":938,\"第3层\":\"G03-10\",\"站点编号3\":939,\"第4层\":\"G04-10\",\"站点编号4\":940},\n" +
+                "{\"第1层\":\"G01-11\",\"站点编号1\":941,\"第2层\":\"G02-11\",\"站点编号2\":942,\"第3层\":\"G03-11\",\"站点编号3\":943,\"第4层\":\"G04-11\",\"站点编号4\":944},\n" +
+                "{\"第1层\":\"G01-12\",\"站点编号1\":945,\"第2层\":\"G02-12\",\"站点编号2\":946,\"第3层\":\"G03-12\",\"站点编号3\":947,\"第4层\":\"G04-12\",\"站点编号4\":948},\n" +
+                "{\"第1层\":\"G01-13\",\"站点编号1\":949,\"第2层\":\"G02-13\",\"站点编号2\":950,\"第3层\":\"G03-13\",\"站点编号3\":951,\"第4层\":\"G04-13\",\"站点编号4\":952},\n" +
+                "{\"第1层\":\"G01-14\",\"站点编号1\":953,\"第2层\":\"G02-14\",\"站点编号2\":954,\"第3层\":\"G03-14\",\"站点编号3\":955,\"第4层\":\"G04-14\",\"站点编号4\":956},\n" +
+                "{\"第1层\":\"G01-15\",\"站点编号1\":957,\"第2层\":\"G02-15\",\"站点编号2\":958,\"第3层\":\"G03-15\",\"站点编号3\":959,\"第4层\":\"G04-15\",\"站点编号4\":960},\n" +
+                "{\"第1层\":\"G01-16\",\"站点编号1\":961,\"第2层\":\"G02-16\",\"站点编号2\":962,\"第3层\":\"G03-16\",\"站点编号3\":963,\"第4层\":\"G04-16\",\"站点编号4\":964},\n" +
+                "{\"第1层\":\"G01-17\",\"站点编号1\":965,\"第2层\":\"G02-17\",\"站点编号2\":966,\"第3层\":\"G03-17\",\"站点编号3\":967,\"第4层\":\"G04-17\",\"站点编号4\":968},\n" +
+                "{\"第1层\":\"G01-18\",\"站点编号1\":969,\"第2层\":\"G02-18\",\"站点编号2\":970,\"第3层\":\"G03-18\",\"站点编号3\":971,\"第4层\":\"G04-18\",\"站点编号4\":972},\n" +
+                "{\"第1层\":\"G01-19\",\"站点编号1\":973,\"第2层\":\"G02-19\",\"站点编号2\":974,\"第3层\":\"G03-19\",\"站点编号3\":975,\"第4层\":\"G04-19\",\"站点编号4\":976},\n" +
+                "{\"第1层\":\"G01-20\",\"站点编号1\":977,\"第2层\":\"G02-20\",\"站点编号2\":978,\"第3层\":\"G03-20\",\"站点编号3\":979,\"第4层\":\"G04-20\",\"站点编号4\":980},\n" +
+                "{\"第1层\":\"G01-21\",\"站点编号1\":981,\"第2层\":\"G02-21\",\"站点编号2\":982,\"第3层\":\"G03-21\",\"站点编号3\":983,\"第4层\":\"G04-21\",\"站点编号4\":984},\n" +
+                "{\"第1层\":\"G01-22\",\"站点编号1\":985,\"第2层\":\"G02-22\",\"站点编号2\":986,\"第3层\":\"G03-22\",\"站点编号3\":987,\"第4层\":\"G04-22\",\"站点编号4\":988},\n" +
+                "{\"第1层\":\"G01-23\",\"站点编号1\":989,\"第2层\":\"G02-23\",\"站点编号2\":990,\"第3层\":\"G03-23\",\"站点编号3\":991,\"第4层\":\"G04-23\",\"站点编号4\":992},\n" +
+                "{\"第1层\":\"G01-24\",\"站点编号1\":993,\"第2层\":\"G02-24\",\"站点编号2\":994,\"第3层\":\"G03-24\",\"站点编号3\":995,\"第4层\":\"G04-24\",\"站点编号4\":996},\n" +
+                "{\"第1层\":\"G01-25\",\"站点编号1\":997,\"第2层\":\"G02-25\",\"站点编号2\":998,\"第3层\":\"G03-25\",\"站点编号3\":999,\"第4层\":\"G04-25\",\"站点编号4\":1000},\n" +
+                "{\"第1层\":\"G01-26\",\"站点编号1\":1001,\"第2层\":\"G02-26\",\"站点编号2\":1002,\"第3层\":\"G03-26\",\"站点编号3\":1003,\"第4层\":\"G04-26\",\"站点编号4\":1004},\n" +
+                "{\"第1层\":\"G01-27\",\"站点编号1\":1005,\"第2层\":\"G02-27\",\"站点编号2\":1006,\"第3层\":\"G03-27\",\"站点编号3\":1007,\"第4层\":\"G04-27\",\"站点编号4\":1008},\n" +
+                "{\"第1层\":\"G01-28\",\"站点编号1\":1009,\"第2层\":\"G02-28\",\"站点编号2\":1010,\"第3层\":\"G03-28\",\"站点编号3\":1011,\"第4层\":\"G04-28\",\"站点编号4\":1012},\n" +
+                "{\"第1层\":\"G01-29\",\"站点编号1\":1013,\"第2层\":\"G02-29\",\"站点编号2\":1014,\"第3层\":\"G03-29\",\"站点编号3\":1015,\"第4层\":\"G04-29\",\"站点编号4\":1016},\n" +
+                "{\"第1层\":\"G01-30\",\"站点编号1\":1017,\"第2层\":\"G02-30\",\"站点编号2\":1018,\"第3层\":\"G03-30\",\"站点编号3\":1019,\"第4层\":\"G04-30\",\"站点编号4\":1020},\n" +
+                "{\"第1层\":\"G01-31\",\"站点编号1\":1021,\"第2层\":\"G02-31\",\"站点编号2\":1022,\"第3层\":\"G03-31\",\"站点编号3\":1023,\"第4层\":\"G04-31\",\"站点编号4\":1024},\n" +
+                "{\"第1层\":\"G01-32\",\"站点编号1\":1025,\"第2层\":\"G02-32\",\"站点编号2\":1026,\"第3层\":\"G03-32\",\"站点编号3\":1027,\"第4层\":\"G04-32\",\"站点编号4\":1028},\n" +
+                "{\"第1层\":\"G01-33\",\"站点编号1\":1029,\"第2层\":\"G02-33\",\"站点编号2\":1030,\"第3层\":\"G03-33\",\"站点编号3\":1031,\"第4层\":\"G04-33\",\"站点编号4\":1032},\n" +
+                "{\"第1层\":\"G01-34\",\"站点编号1\":1033,\"第2层\":\"G02-34\",\"站点编号2\":1034,\"第3层\":\"G03-34\",\"站点编号3\":1035,\"第4层\":\"G04-34\",\"站点编号4\":1036},\n" +
+                "{\"第1层\":\"G01-35\",\"站点编号1\":1037,\"第2层\":\"G02-35\",\"站点编号2\":1038,\"第3层\":\"G03-35\",\"站点编号3\":1039,\"第4层\":\"G04-35\",\"站点编号4\":1040},\n" +
+                "{\"第1层\":\"G01-36\",\"站点编号1\":1041,\"第2层\":\"G02-36\",\"站点编号2\":1042,\"第3层\":\"G03-36\",\"站点编号3\":1043,\"第4层\":\"G04-36\",\"站点编号4\":1044},\n" +
+                "{\"第1层\":\"G01-37\",\"站点编号1\":1045,\"第2层\":\"G02-37\",\"站点编号2\":1046,\"第3层\":\"G03-37\",\"站点编号3\":1047,\"第4层\":\"G04-37\",\"站点编号4\":1048},\n" +
+                "{\"第1层\":\"G01-38\",\"站点编号1\":1049,\"第2层\":\"G02-38\",\"站点编号2\":1050,\"第3层\":\"G03-38\",\"站点编号3\":1051,\"第4层\":\"G04-38\",\"站点编号4\":1052}\n" +
+                "]";
+        JSONArray jsonArray = JSONUtil.parseArray(s);
+        List<Dict> dicts = JSONUtil.toList(jsonArray, Dict.class);
+        int totalSize = 848;// 已插入总数量
+        int currentSize = 0;// 本次插入数量
+        for (int i = 0; i < dicts.size(); i++) {
+            Dict dict = dicts.get(i);
+            int size = 4;
+            if (StringUtils.isEmpty(dict.getStr("站点编号4"))){
+                size = 3;
+            }
+            for (int j = 1; j <=size; j++) {
+                currentSize++;
+                totalSize++;
+                String formatTotalSize = String.format("%04d", totalSize);
+
+                BaseLocationInfo baseLocationInfo = new BaseLocationInfo();
+                baseLocationInfo.setWarehouseId(1L);
+                baseLocationInfo.setZoneId(2L);// 库区编号
+                baseLocationInfo.setIsEmpty("Y");
+                baseLocationInfo.setZoneName("原料区");// 库区名称
+                baseLocationInfo.setRowNo("07");// 排编号
+                baseLocationInfo.setRowIndex(7L);// 排号
+                baseLocationInfo.setStockStatus("00");
+                baseLocationInfo.setLocationType("1");
+                baseLocationInfo.setFoldedCount(0L);
+                baseLocationInfo.setFoldedTag("0");
+                baseLocationInfo.setHeightLimit(0d);
+                baseLocationInfo.setWeightLimit(0d);
+                baseLocationInfo.setId(Long.valueOf("10"+formatTotalSize));// 库位id
+
+                baseLocationInfo.setShiftIndex(Long.valueOf(j));
+                baseLocationInfo.setShiftNo(String.valueOf(j));
+                String locationNo = dict.getStr("第" + j + "层");
+                baseLocationInfo.setLocationNo(locationNo);
+                String agvStation = dict.getStr("站点编号" + j);
+                baseLocationInfo.setAgvStation(Long.valueOf(agvStation));
+                String[] split = locationNo.split("-");
+                baseLocationInfo.setColNo(split[1]);
+                baseLocationInfo.setColIndex(Long.parseLong(split[1]));
+                System.out.println(baseLocationInfo);
+
+                baseLocationInfoService.insertBaseLocationInfo(baseLocationInfo);
+            }
+
+        }
+
+        log.info("==本次导入数量:{}",currentSize);
+        log.info("==已导入总数量:{}",totalSize);
+
+    }
+
+
 }

+ 2 - 2
ruoyi-common/src/main/java/com/ruoyi/common/core/bean/dto/WarewmsExtDTO.java

@@ -12,11 +12,11 @@ public class WarewmsExtDTO extends WarewmsDTO {
 
     private String id;
 
-    private Long creator;
+    private String creator;
 
     private Date createDate;
 
-    private Long updater;
+    private String updater;
 
     private Date updateDate;
 

+ 5 - 5
ruoyi-common/src/main/java/com/ruoyi/common/core/bean/entity/WarewmsExtEntity.java

@@ -16,19 +16,19 @@ public class WarewmsExtEntity extends WarewmsEntity {
 
     private static final long serialVersionUID = 5454051931854654410L;
 
-//    @TableId
+    @TableId
     private String id;
 
-//    @TableField(fill = FieldFill.INSERT)
+    @TableField(fill = FieldFill.INSERT)
     private String creator;
 
-//    @TableField(fill = FieldFill.INSERT)
+    @TableField(fill = FieldFill.INSERT)
     private Date createDate;
 
-//    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private String updater;
 
-//    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private Date updateDate;
 
     private String remark;

+ 2 - 2
ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java

@@ -4,7 +4,7 @@ import com.ruoyi.common.utils.StringUtils;
 
 /**
  * 分页数据
- * 
+ *
  * @author ruoyi
  */
 public class PageDomain
@@ -89,7 +89,7 @@ public class PageDomain
     {
         if (StringUtils.isNull(reasonable))
         {
-            return Boolean.TRUE;
+            return Boolean.FALSE;
         }
         return reasonable;
     }

+ 2 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -118,9 +118,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 库位视图
                 .antMatchers("/ams/locationView/**").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
-                /*.anyRequest().authenticated()
+                .anyRequest().authenticated()
                 .and()
-                .headers().frameOptions().disable()*/;
+                .headers().frameOptions().disable();
         httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
         // 添加JWT filter
         httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

+ 6 - 6
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java

@@ -95,10 +95,10 @@ public class PermissionService
     {
         if (StringUtils.isEmpty(role))
         {
-//            return false;
-            return true;
+            return false;
+//            return true;
         }
-        /*LoginUser loginUser = SecurityUtils.getLoginUser();
+        LoginUser loginUser = SecurityUtils.getLoginUser();
         if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
         {
             return false;
@@ -110,9 +110,9 @@ public class PermissionService
             {
                 return true;
             }
-        }*/
-//        return false;
-        return true;
+        }
+        return false;
+//        return true;
     }
 
     /**

+ 2 - 2
ruoyi-ui/src/views/wms/docAsn/index.vue

@@ -213,7 +213,7 @@ export default {
         pageNum: 1,
         pageSize: 10,
         asnNo: null,
-        asnType: null,
+        docType: 'PurchaseOrder',
         asnStatus: null,
         asnReference1: null,
         asnReference2: null,
@@ -434,7 +434,7 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
-      this.download('docAsn/docAsn/export', {
+      this.download('/docHeader/docHeader/export', {
         ...this.queryParams
       }, `docAsn_${new Date().getTime()}.xlsx`)
     },

+ 1 - 2
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/AciService.java

@@ -2,7 +2,6 @@ package com.ruoyi.ams.agv.ndc;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.thread.ThreadUtil;
 import com.alibaba.fastjson.JSON;
 import com.ruoyi.ams.agv.ndc.common.Aci;
 import com.ruoyi.ams.agv.ndc.common.ByteUtil;
@@ -38,7 +37,7 @@ public class AciService {
 
     private static final int BUFF_SIZE = 2048;
 
-    private static final String IP_ADDR = "192.168.1.58";
+    private static final String IP_ADDR = "192.168.88.137";
 
     private static final int IP_PORT = 30002;
 

+ 1 - 2
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/IWmsDocAsnHeaderService.java

@@ -8,7 +8,6 @@ import com.ruoyi.ams.asn.form.PaForm;
 import com.ruoyi.ams.asn.form.StockForm;
 import com.ruoyi.ams.asn.form.UnlockForm;
 import com.ruoyi.ams.asn.vo.SearchStockVO;
-import com.ruoyi.base.domain.vo.CodeSkuRelationshipVO;
 import com.ruoyi.base.form.SnCheckForm;
 import com.ruoyi.common.core.domain.AjaxResult;
 
@@ -153,5 +152,5 @@ public interface IWmsDocAsnHeaderService {
      * @param snCheckForm
      * @return
      */
-    CodeSkuRelationshipVO searchSn(SnCheckForm snCheckForm);
+//    CodeSkuRelationshipVO searchSn(SnCheckForm snCheckForm);
 }

+ 6 - 25
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnHeaderServiceImpl.java

@@ -11,44 +11,27 @@ import com.ruoyi.ams.asn.vo.SearchStockVO;
 import com.ruoyi.ams.box.domain.WmsBoxInfo;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.business.IBusinessService;
-import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
-import com.ruoyi.ams.config.domain.dto.LotattDTO;
-import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
 import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
-import com.ruoyi.ams.inv.domain.ActTransactionLog;
 import com.ruoyi.ams.inv.domain.InvLotAtt;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
-import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
-import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IActTransactionLogService;
 import com.ruoyi.ams.inv.service.IInvLotAttService;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.order.domain.ActAllocationDetails;
-import com.ruoyi.ams.order.domain.WmsDocOrderDetails;
-import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
-import com.ruoyi.ams.order.dto.WmsDocOrderDTO;
 import com.ruoyi.ams.order.mapper.WmsDocOrderDetailsMapper;
 import com.ruoyi.ams.order.service.IActAllocationDetailsService;
-import com.ruoyi.ams.order.service.IWmsDocOrderDetailsService;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
-import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.BaseSku;
-import com.ruoyi.base.domain.vo.CodeSkuRelationshipVO;
 import com.ruoyi.base.form.SnCheckForm;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.base.service.IBaseSkuService;
-import com.ruoyi.base.service.ICodeSkuRelationshipService;
 import com.ruoyi.base.utils.IdSequenceUtils;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -94,8 +77,6 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
     @Autowired
     private IActAllocationDetailsService actAllocationDetailsService;
     @Autowired
-    private ICodeSkuRelationshipService codeSkuRelationshipService;
-    @Autowired
     private IFlowConfigHeaderService flowConfigHeaderService;
     @Autowired
     private IBusinessService businessService;
@@ -266,7 +247,7 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
     @Transactional
     @Override
     public AjaxResult doStock(StockForm stockForm) {
-        LoginUser loginUser = SecurityUtils.getLoginUser();
+        /*LoginUser loginUser = SecurityUtils.getLoginUser();
         String STAGE01 = "900";
         WmsDocOrderHeader wmsDocOrderHeader;
         List<WmsDocOrderDetails> orderDetails = new ArrayList<>();
@@ -305,7 +286,7 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
         }
 
         //判断成品条码
-        CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(stockForm.getSkuSn());
+//        CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(stockForm.getSkuSn());
         //当前订单总数
         BigDecimal totalQty = new BigDecimal(stockForm.getQty());
 
@@ -466,7 +447,7 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
                     }
                 }
             }
-        }
+        }*/
         return AjaxResult.success("操作成功");
     }
 
@@ -595,7 +576,7 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
         return wmsDocAsnDetailsMapper.selectStockingList(asnNos);
     }
 
-    @Override
+/*    @Override
     public CodeSkuRelationshipVO searchSn(SnCheckForm snCheckForm) {
         CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.snCheck(snCheckForm.getSn());
         if (snCheckForm.getAsnNoList() != null && snCheckForm.getAsnNoList().size() > 0) {
@@ -607,6 +588,6 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
         } else {
             codeSkuRelationshipVO.setReceivedQty(0d);
         }
-        return codeSkuRelationshipVO;
-    }
+        return new CodeSkuRelationshipVO();
+    }*/
 }

+ 25 - 4
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/domain/BionutritionDocDetails.java

@@ -1,11 +1,15 @@
 package com.ruoyi.ams.bionutrition.doc.domain;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.core.bean.entity.WarewmsExtEntity;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.Date;
+
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("bsl_doc_details")
@@ -32,17 +36,18 @@ public class BionutritionDocDetails extends WarewmsExtEntity {
     @ApiModelProperty("进厂批号")
     private String incomeLotNumber;
 
-    @ApiModelProperty("产品名称")
-    private String productName;
-
     @ApiModelProperty("产品批号")
     private String productLotNumber;
 
+    @ApiModelProperty("产品名称")
+    private String productName;
+
     @ApiModelProperty("计量单位")
     private String measureUnit;
 
     @ApiModelProperty("生产日期")
-    private String manufactureDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date manufactureDate;
 
     @ApiModelProperty("收货人")
     private String receiver;
@@ -65,4 +70,20 @@ public class BionutritionDocDetails extends WarewmsExtEntity {
     @ApiModelProperty("复审人")
     private String reviewerNext;
 
+    /**
+     * {@link Constant.ASN_STS}
+     * {@link Constant.ORDER_STS}
+     */
+    @ApiModelProperty("明细行状态")
+    private String lineStatus;
+
+    /**
+     * 只有采购收货单有 表示采购收货单的明细属于那一条采购单明细
+     */
+    @ApiModelProperty("所属明细id")
+    private String belongDetailsId;
+
+    @ApiModelProperty("已搬运数量")
+    private String transferredQty;
+
 }

+ 8 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/domain/BionutritionDocHeader.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ams.bionutrition.doc.domain;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.core.bean.entity.WarewmsExtEntity;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -71,4 +72,11 @@ public class BionutritionDocHeader extends WarewmsExtEntity {
     @ApiModelProperty("仓库类别")
     private String warehouseType;
 
+    /**
+     * {@link Constant.ASN_STS}
+     * {@link Constant.ORDER_STS}
+     */
+    @ApiModelProperty("单据状态")
+    private String docStatus;
+
 }

+ 23 - 4
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/BionutritionDocDetailsDTO.java

@@ -1,9 +1,12 @@
 package com.ruoyi.ams.bionutrition.doc.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.core.bean.dto.WarewmsExtDTO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 @Data
 public class BionutritionDocDetailsDTO extends WarewmsExtDTO {
 
@@ -28,17 +31,18 @@ public class BionutritionDocDetailsDTO extends WarewmsExtDTO {
     @ApiModelProperty("进厂批号")
     private String incomeLotNumber;
 
-    @ApiModelProperty("产品名称")
-    private String productName;
-
     @ApiModelProperty("产品批号")
     private String productLotNumber;
 
+    @ApiModelProperty("产品名称")
+    private String productName;
+
     @ApiModelProperty("计量单位")
     private String measureUnit;
 
     @ApiModelProperty("生产日期")
-    private String manufactureDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date manufactureDate;
 
     @ApiModelProperty("收货人")
     private String receiver;
@@ -63,4 +67,19 @@ public class BionutritionDocDetailsDTO extends WarewmsExtDTO {
 
     @ApiModelProperty("备注")
     private String remark;
+    /**
+     * {@link com.ruoyi.base.constant.Constant.ASN_STS}
+     * {@link com.ruoyi.base.constant.Constant.ORDER_STS}
+     */
+    @ApiModelProperty("明细行状态")
+    private String lineStatus;
+
+    /**
+     * 只有采购收货单有 表示采购收货单的明细属于那一条采购单明细
+     */
+    @ApiModelProperty("所属明细id")
+    private String belongDetailsId;
+
+    @ApiModelProperty("已搬运数量")
+    private String transferredQty;
 }

+ 6 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/BionutritionDocHeaderDTO.java

@@ -71,5 +71,11 @@ public class BionutritionDocHeaderDTO extends WarewmsExtDTO {
 
     @ApiModelProperty("备注")
     private String remark;
+    /**
+     * {@link com.ruoyi.base.constant.Constant.ASN_STS}
+     * {@link com.ruoyi.base.constant.Constant.ORDER_STS}
+     */
+    @ApiModelProperty("单据状态")
+    private String docStatus;
 
 }

+ 26 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocExcelQueryDTO.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ams.bionutrition.doc.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 单据导出查询对象
+ */
+@Data
+public class DocExcelQueryDTO implements Serializable {
+
+    private static final long serialVersionUID = 4859167206960471602L;
+
+    @ApiModelProperty("单据头id")
+    private String[] ids;
+
+    @NotBlank(message = "请选择单据类型")
+    @ApiModelProperty("单据类型")
+    private String docType;
+
+    @ApiModelProperty("业务类型 出库/入库")
+    private String businessType;
+}

+ 42 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocLotattDTO.java

@@ -0,0 +1,42 @@
+package com.ruoyi.ams.bionutrition.doc.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 批次属性对象
+ */
+@Data
+public class DocLotattDTO implements Serializable {
+    private static final long serialVersionUID = 7169914453413091188L;
+
+    /**
+     * 供应商编码
+     */
+    private String vendorCode;
+    /**
+     * 原厂批号
+     */
+    private String originalLotNumber;
+    /**
+     * 有效期截止日
+     */
+    private String skuShelflife;
+    /**
+     * 生产日期
+     */
+    private Date manufactureDate;
+    /**
+     * 进厂批号
+     */
+    private String incomeLotNumber;
+    /**
+     * 产品批号
+     */
+    private String productLotNumber;
+
+}

+ 12 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocQueryDto.java

@@ -0,0 +1,12 @@
+package com.ruoyi.ams.bionutrition.doc.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DocQueryDto implements Serializable {
+    private static final long serialVersionUID = 1372260678875020454L;
+    private String docNo;
+    private String docType;
+}

+ 14 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/BionutritionDocDetailsBaseDTO.java

@@ -26,4 +26,18 @@ public class BionutritionDocDetailsBaseDTO extends WarewmsExtDTO {
 
     @ApiModelProperty("备注")
     private String remark;
+    /**
+     * {@link com.ruoyi.base.constant.Constant.ASN_STS}
+     * {@link com.ruoyi.base.constant.Constant.ORDER_STS}
+     */
+    @ApiModelProperty("明细行状态")
+    private String lineStatus;
+    /**
+     * 只有采购收货单有 表示采购收货单的明细属于那一条采购单明细
+     */
+    @ApiModelProperty("所属明细id")
+    private String belongDetailsId;
+
+    @ApiModelProperty("已搬运数量")
+    private String transferredQty;
 }

+ 5 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/ProductionPickingReceiptDetailsDTO.java

@@ -1,8 +1,11 @@
 package com.ruoyi.ams.bionutrition.doc.dto.detail;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 生产领料单明细
  */
@@ -19,6 +22,7 @@ public class ProductionPickingReceiptDetailsDTO extends BionutritionDocDetailsBa
     private String measureUnit;
 
     @ApiModelProperty("生产日期")
-    private String manufactureDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date manufactureDate;
 
 }

+ 5 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/PurchaseOrderDetailsDTO.java

@@ -1,8 +1,11 @@
 package com.ruoyi.ams.bionutrition.doc.dto.detail;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 采购单明细
  */
@@ -19,7 +22,8 @@ public class PurchaseOrderDetailsDTO extends BionutritionDocDetailsBaseDTO {
     private String measureUnit;
 
     @ApiModelProperty("生产日期")
-    private String manufactureDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date manufactureDate;
 
     @ApiModelProperty("含税价")
     private String priceIncludeTax;

+ 5 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/detail/PurchaseReceiptDetailsDTO.java

@@ -1,8 +1,11 @@
 package com.ruoyi.ams.bionutrition.doc.dto.detail;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 采购收货单明细
  */
@@ -20,7 +23,8 @@ public class PurchaseReceiptDetailsDTO extends BionutritionDocDetailsBaseDTO {
     private String measureUnit;
 
     @ApiModelProperty("生产日期")
-    private String manufactureDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date manufactureDate;
 
     @ApiModelProperty("含税价")
     private String priceIncludeTax;

+ 6 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/header/BionutritionDocHeaderBaseDTO.java

@@ -18,4 +18,10 @@ public class BionutritionDocHeaderBaseDTO extends WarewmsExtDTO {
 
     @ApiModelProperty("备注")
     private String remark;
+    /**
+     * {@link com.ruoyi.base.constant.Constant.ASN_STS}
+     * {@link com.ruoyi.base.constant.Constant.ORDER_STS}
+     */
+    @ApiModelProperty("单据状态")
+    private String docStatus;
 }

+ 0 - 4
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/BionutritionDocDetailsBaseExcel.java

@@ -8,10 +8,6 @@ import lombok.Data;
 @Data
 public class BionutritionDocDetailsBaseExcel extends WarewmsExtDTO {
 
-    private static final long serialVersionUID = 1102255580263279150L;
-
-    private String docHeaderId;
-
     @Excel(name = "明细行号")
     private String docLineNo;
 

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/FinishedProductReceiptDetailsExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 成品入库单明细
  */
@@ -29,4 +33,21 @@ public class FinishedProductReceiptDetailsExcel extends BionutritionDocDetailsBa
 
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
+
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
 }

+ 23 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionPickingReceiptDetailsExcel.java

@@ -5,6 +5,11 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 生产领料单明细
  */
@@ -21,6 +26,23 @@ public class ProductionPickingReceiptDetailsExcel extends BionutritionDocDetails
     private String measureUnit;
 
     @Excel(name = "生产日期")
-    private String manufactureDate;
+    private Date manufactureDate;
+
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
 
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionReturnOrderDetailsExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 生产退库单明细
  */
@@ -24,4 +28,21 @@ public class ProductionReturnOrderDetailsExcel extends BionutritionDocDetailsBas
     @Excel(name = "退库人")
     private String returner;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 23 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseOrderDetailsExcel.java

@@ -5,6 +5,11 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 采购单明细
  */
@@ -21,9 +26,26 @@ public class PurchaseOrderDetailsExcel extends BionutritionDocDetailsBaseExcel {
     private String measureUnit;
 
     @Excel(name = "生产日期")
-    private String manufactureDate;
+    private Date manufactureDate;
 
     @Excel(name = "含税价")
     private String priceIncludeTax;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 23 - 1
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseReceiptDetailsExcel.java

@@ -5,6 +5,11 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 采购收货单明细
  */
@@ -22,9 +27,26 @@ public class PurchaseReceiptDetailsExcel extends BionutritionDocDetailsBaseExcel
     private String measureUnit;
 
     @Excel(name = "生产日期")
-    private String manufactureDate;
+    private Date manufactureDate;
 
     @Excel(name = "含税价")
     private String priceIncludeTax;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleOutboundOrderDetailsExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 销售出库单明细
  */
@@ -27,4 +31,21 @@ public class SaleOutboundOrderDetailsExcel extends BionutritionDocDetailsBaseExc
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleReturnOrderDetailsExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 销售退库单明细
  */
@@ -24,4 +28,21 @@ public class SaleReturnOrderDetailsExcel extends BionutritionDocDetailsBaseExcel
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 2
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/FinishedProductReceiptHeaderExcel.java

@@ -3,6 +3,10 @@ package com.ruoyi.ams.bionutrition.doc.excel.header;
 import com.ruoyi.common.annotation.Excel;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 成品入库单单头
  */
@@ -10,9 +14,24 @@ import lombok.Data;
 @Data
 public class FinishedProductReceiptHeaderExcel extends BionutritionDocHeaderBaseExcel {
 
-    private static final long serialVersionUID = 2212371670234029386L;
-
     @Excel(name = "部门名称")
     private String dept;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionPickingReceiptHeaderExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 生产领料单单头
  */
@@ -15,4 +19,21 @@ public class ProductionPickingReceiptHeaderExcel extends BionutritionDocHeaderBa
     @Excel(name = "部门名称")
     private String dept;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionReturnOrderHeaderExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 生产退库单单头
  */
@@ -15,4 +19,21 @@ public class ProductionReturnOrderHeaderExcel extends BionutritionDocHeaderBaseE
     @Excel(name = "部门名称")
     private String dept;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseOrderHeaderExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 采购单单头
  */
@@ -24,4 +28,21 @@ public class PurchaseOrderHeaderExcel extends BionutritionDocHeaderBaseExcel {
     @Excel(name = "税率")
     private String taxRate;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseReceiptHeaderExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 采购收货单单头
  */
@@ -21,4 +25,21 @@ public class PurchaseReceiptHeaderExcel extends BionutritionDocHeaderBaseExcel {
     @Excel(name = "税率")
     private String taxRate;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 22 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleOutboundOrderHeaderExcel.java

@@ -5,6 +5,11 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 销售出库单单头
  */
@@ -39,4 +44,21 @@ public class SaleOutboundOrderHeaderExcel extends BionutritionDocHeaderBaseExcel
     @Excel(name ="销售合同")
     private String saleContract;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 21 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleReturnOrderHeaderExcel.java

@@ -5,6 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 销售退库单单头
  */
@@ -27,4 +31,21 @@ public class SaleReturnOrderHeaderExcel extends BionutritionDocHeaderBaseExcel {
     @Excel(name = "仓库类别")
     private String warehouseType;
 
+    /**
+     * 反射调用 获取当前对象的字段及其对应的值
+     * @param fields
+     * @return
+     */
+    public Map<String,Object> getProperties(Field[] fields){
+        HashMap<String, Object> propertiesMap = new HashMap<>();
+        for (Field field : fields) {
+            try {
+                propertiesMap.put(field.getName(),field.get(this));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return propertiesMap;
+    }
+
 }

+ 17 - 3
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/BionutritionDocDetailsService.java

@@ -3,6 +3,7 @@ package com.ruoyi.ams.bionutrition.doc.service;
 import cn.hutool.core.lang.Assert;
 import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocDetails;
 import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocHeader;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
 import com.ruoyi.common.utils.ConvertUtils;
@@ -22,12 +23,14 @@ public interface BionutritionDocDetailsService extends CrudService<BionutritionD
 
     List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList);
 
+    List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOListByLineStatus(String lineStatus);
     /**
-     * 根据单头id查询当前最大的明细行号
-     * @param docHeaderId
+     * 根据物料编码和批号获取明细信息
+     * @param skuCode
+     * @param batchNumber
      * @return
      */
-    String selectLineNo(String docHeaderId);
+    List<BionutritionDocDetailsDTO> selectDocDetailsDTOList(String skuCode, String batchNumber);
 
     /**
      * 插入单据明细
@@ -36,6 +39,13 @@ public interface BionutritionDocDetailsService extends CrudService<BionutritionD
      */
     int insertDocDetails(BionutritionDocDetailsDTO docDetailsDTO);
 
+    /**
+     * 查询当前最大行号
+     * @param docHeaderId
+     * @return
+     */
+    String selectLineNo(String docHeaderId);
+
     /**
      * 修改单据明细
      * @param docDetailsDTO
@@ -44,4 +54,8 @@ public interface BionutritionDocDetailsService extends CrudService<BionutritionD
     int updateDocDetails(BionutritionDocDetailsDTO docDetailsDTO);
 
     BionutritionDocDetailsDTO selectDocDetailsByLineNo(String docHeaderId, String docLineNo);
+
+    int deleteByHeaderIds(String[] ids);
+
+    List<BionutritionDocBaseDTO> selectDetailsByDocNoAndDocType(String docNo, String docType);
 }

+ 48 - 4
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/BionutritionDocHeaderService.java

@@ -5,8 +5,11 @@ import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocHeader;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.DocExcelQueryDTO;
+import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.framework.service.CrudService;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -36,7 +39,7 @@ public interface BionutritionDocHeaderService extends CrudService<BionutritionDo
      * @param docHeaderDTO
      * @return
      */
-    int insertDocHeader(BionutritionDocHeaderDTO docHeaderDTO);
+    String insertDocHeader(BionutritionDocHeaderDTO docHeaderDTO);
 
     /**
      * 修改单据头
@@ -54,15 +57,56 @@ public interface BionutritionDocHeaderService extends CrudService<BionutritionDo
 
     /**
      * 根据查询条件获取导出单据数据
-     * @param docHeaderDTO
+     * @param docExcelQueryDTO
      * @return
      */
-    List<BionutritionDocBaseDTO> getDocList(BionutritionDocHeaderDTO docHeaderDTO);
+    List<BionutritionDocBaseDTO> getDocList(DocExcelQueryDTO docExcelQueryDTO);
 
     /**
      * 根据单头id获取单据集合
      * @param ids
      * @return
      */
-    List<BionutritionDocBaseDTO> getDicListByIds(String[] ids);
+    List<BionutritionDocBaseDTO> getDicListByIds(List<String> ids);
+
+    List<BionutritionDocHeaderDTO> getBionutritionDocHeaderDTOList(List<String> idList);
+
+    /**
+     * 导出单据excel方法
+     */
+    <E>void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException;
+
+    /**
+     * 根据物料编码、批号、单据类型获取单据信息
+     * @param skuCode
+     * @param batchNumber
+     * @param docType
+     * @return
+     */
+    BionutritionDocBaseDTO selectDocBySkuAndBatchNumber(String skuCode, String batchNumber, String docType);
+
+    /**
+     * 根据单据号和单据类型获取单据信息
+     * @param docNo
+     * @param docType
+     * @return
+     */
+    BionutritionDocBaseDTO selectDocByDocNoAndDocType(String docNo, String docType);
+
+    List<BionutritionDocHeaderDTO> selectDocBaseByDocNoAndDocType(String docNo, String docType);
+    /**
+     * 根据单据号和单据类型获取单据信息 未找到返回null
+     * @param docNo
+     * @param docType
+     * @return
+     */
+    BionutritionDocHeaderDTO getDocHeaderDTOListByDocNoAndDocType(String docNo, String docType);
+
+    /**
+     * 卸货完成后修改单据状态
+     * @param wcsTask
+     */
+    void updateDocStatus(WcsTask wcsTask);
+
+    List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(String docNo, String docType);
 }

+ 86 - 36
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/impl/BionutritionDocDetailsServiceImpl.java

@@ -1,7 +1,9 @@
 package com.ruoyi.ams.bionutrition.doc.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -9,19 +11,25 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocDetails;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.BionutritionDocDetailsBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.mapper.BionutritionDocDetailsMapper;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.constant.type.BizEnum;
 import com.ruoyi.common.utils.ConvertUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.service.impl.CrudServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 分配查询Service业务层处理
@@ -32,27 +40,46 @@ import java.util.Map;
 @Service
 public class BionutritionDocDetailsServiceImpl extends CrudServiceImpl<BionutritionDocDetailsMapper, BionutritionDocDetails, BionutritionDocDetailsDTO> implements BionutritionDocDetailsService {
 
+    @Autowired
+    private BionutritionDocHeaderService bionutritionDocHeaderService;
 
+    @Override
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId) {
+        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), Lists.newArrayList(), Lists.newArrayList());
+    }
 
     @Override
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId){
-        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), Lists.newArrayList());
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList) {
+        return getBionutritionDocDetailsDTOList(docHeaderIdList, Lists.newArrayList(), Lists.newArrayList());
     }
 
+    /**
+     * 根据物料和原厂批号查询单据明细信息(只适用于采购入库)
+     * @param skuCode
+     * @param batchNumber
+     * @return
+     */
     @Override
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList){
-        return getBionutritionDocDetailsDTOList(docHeaderIdList, Lists.newArrayList());
+    public List<BionutritionDocDetailsDTO> selectDocDetailsDTOList(String skuCode, String batchNumber) {
+        Assert.isTrue(StringUtils.isNotBlank(skuCode), "物料编码为空");
+        Assert.isTrue(StringUtils.isNotBlank(batchNumber), "批号为空");
+        List<BionutritionDocDetails> docDetailsList = baseDao.selectList(Wrappers.<BionutritionDocDetails>lambdaQuery()
+                .eq(BionutritionDocDetails::getSkuCode, skuCode)
+                .eq(BionutritionDocDetails::getOriginalLotNumber, batchNumber));
+        return ConvertUtils.sourceToTarget(docDetailsList, BionutritionDocDetailsDTO.class);
     }
 
     /**
      * 查找同单头的明细中最大的行号
+     *
      * @param docHeaderId
      * @return
      */
     @Override
     public String selectLineNo(String docHeaderId) {
-        BionutritionDocDetails bionutritionDocDetails = baseDao.selectOne(Wrappers.<BionutritionDocDetails>lambdaQuery()
-                .eq(StrUtil.isNotBlank(docHeaderId), BionutritionDocDetails::getDocHeaderId, docHeaderId)
+        Assert.isTrue(StrUtil.isNotBlank(docHeaderId),"单头id不能为空");
+                BionutritionDocDetails bionutritionDocDetails = baseDao.selectOne(Wrappers.<BionutritionDocDetails>lambdaQuery()
+                .eq(BionutritionDocDetails::getDocHeaderId, docHeaderId)
                 .orderByDesc(BionutritionDocDetails::getDocLineNo)
                 .last("limit 1"));
         return ObjectUtil.isNotNull(bionutritionDocDetails) ? bionutritionDocDetails.getDocLineNo() : Constant.ZERO;
@@ -60,83 +87,106 @@ public class BionutritionDocDetailsServiceImpl extends CrudServiceImpl<Bionutrit
 
     /**
      * 添加明细
+     *
      * @param docDetailsDTO
      * @return
      */
     @Override
     public int insertDocDetails(BionutritionDocDetailsDTO docDetailsDTO) {
         String lingNo = this.selectLineNo(docDetailsDTO.getDocHeaderId());
-        docDetailsDTO.setDocLineNo(String.valueOf(Long.valueOf(lingNo)+1));
-        return baseDao.insert(ConvertUtils.sourceToTarget(docDetailsDTO,BionutritionDocDetails.class));
+        docDetailsDTO.setDocLineNo(String.valueOf(Long.valueOf(lingNo) + 1));
+        return baseDao.insert(ConvertUtils.sourceToTarget(docDetailsDTO, BionutritionDocDetails.class));
     }
 
     /**
      * 根据单头id和明细行号修改明细
+     *
      * @param docDetailsDTO
      * @return
      */
     @Override
     public int updateDocDetails(BionutritionDocDetailsDTO docDetailsDTO) {
         UpdateWrapper<BionutritionDocDetails> updateWrapper = new UpdateWrapper<>();
-        // id不为空直接根据id修改
-        if (StringUtils.isNotBlank(docDetailsDTO.getId())){
-            BionutritionDocDetailsDTO bionutritionDocDetailsDTO = selectDocDetailsById(docDetailsDTO.getId());
-            Assert.notNull(bionutritionDocDetailsDTO,"该id对应明细不存在");
-            updateWrapper.lambda().eq(BionutritionDocDetails::getId, docDetailsDTO.getId());
-        }else { // 否则根据单头id和行号修改
-            Assert.isTrue(StringUtils.isNotBlank(docDetailsDTO.getDocHeaderId()),"单头id为空");
-            Assert.isTrue(StringUtils.isNotBlank(docDetailsDTO.getDocLineNo()),"单明细行号为空");
-            BionutritionDocDetailsDTO bionutritionDocDetailsDTO = selectDocDetailsByLineNo(docDetailsDTO.getDocHeaderId(), docDetailsDTO.getDocLineNo());
-            Assert.notNull(bionutritionDocDetailsDTO,"所属单头该行号明细不存在");
-            updateWrapper.lambda().eq(BionutritionDocDetails::getDocHeaderId, docDetailsDTO.getDocHeaderId())
-                    .eq(BionutritionDocDetails::getDocLineNo, docDetailsDTO.getDocLineNo());
-        }
+        BionutritionDocDetailsDTO bionutritionDocDetailsDTO = selectDocDetailsById(docDetailsDTO.getId());
+        Assert.notNull(bionutritionDocDetailsDTO, "该id对应明细不存在");
+        updateWrapper.lambda().eq(BionutritionDocDetails::getId, docDetailsDTO.getId());
         return baseDao.update(ConvertUtils.sourceToTarget(docDetailsDTO, BionutritionDocDetails.class), updateWrapper);
     }
 
     /**
      * 根据id查询明细
+     *
      * @param id
      * @return
      */
-    public BionutritionDocDetailsDTO selectDocDetailsById(String id){
+    public BionutritionDocDetailsDTO selectDocDetailsById(String id) {
         BionutritionDocDetails bionutritionDocDetails = baseDao.selectOne(Wrappers.<BionutritionDocDetails>lambdaQuery()
                 .eq(StrUtil.isNotBlank(id), BionutritionDocDetails::getId, id));
-        return ConvertUtils.sourceToTarget(bionutritionDocDetails,BionutritionDocDetailsDTO.class);
+        return ConvertUtils.sourceToTarget(bionutritionDocDetails, BionutritionDocDetailsDTO.class);
     }
 
     /**
      * 根据单头id和行号查询单个明细
+     *
      * @param docHeaderId
      * @param docLineNo
      * @return
      */
     @Override
     public BionutritionDocDetailsDTO selectDocDetailsByLineNo(String docHeaderId, String docLineNo) {
-        Assert.isTrue(StringUtils.isNotBlank(docHeaderId),"单头id为空");
-        Assert.isTrue(StringUtils.isNotBlank(docLineNo),"单明细行号为空");
+        Assert.isTrue(StringUtils.isNotBlank(docHeaderId), "单头id为空");
+        Assert.isTrue(StringUtils.isNotBlank(docLineNo), "单明细行号为空");
         BionutritionDocDetails bionutritionDocDetails = baseDao.selectOne(Wrappers.<BionutritionDocDetails>lambdaQuery()
-                .eq(StrUtil.isNotBlank(docHeaderId), BionutritionDocDetails::getDocHeaderId, docHeaderId)
-                .eq(StrUtil.isNotBlank(docLineNo), BionutritionDocDetails::getDocLineNo, docLineNo));
-        return ConvertUtils.sourceToTarget(bionutritionDocDetails,BionutritionDocDetailsDTO.class);
+                .eq(BionutritionDocDetails::getDocHeaderId, docHeaderId)
+                .eq(BionutritionDocDetails::getDocLineNo, docLineNo));
+        return ConvertUtils.sourceToTarget(bionutritionDocDetails, BionutritionDocDetailsDTO.class);
+    }
+
+    @Override
+    public int deleteByHeaderIds(String[] ids) {
+        return baseDao.delete(Wrappers.<BionutritionDocDetails>lambdaQuery()
+                .in(ArrayUtil.isNotEmpty(ids), BionutritionDocDetails::getDocHeaderId, Arrays.asList(ids)));
+    }
+
+    @Override
+    public List<BionutritionDocBaseDTO> selectDetailsByDocNoAndDocType(String docNo, String docType) {
+        List<BionutritionDocBaseDTO> docBaseDTOList = bionutritionDocHeaderService.buildBionutritionDocBaseDTOByIdList(docNo, docType);
+        if (StringUtils.isNotBlank(docType)) return docBaseDTOList;
+        // 上架入库
+        return docBaseDTOList.stream().map(item->{
+            BionutritionDocBaseDTO bionutritionDocBaseDTO = item;
+            // 只返回完全入库的明细
+            List<BionutritionDocDetailsBaseDTO> docBaseDTOFilterList = item.getBionutritionDocDetailsBaseDTOList().stream().filter(
+                        details -> StringUtils.equals(details.getLineStatus(), Constant.ASN_STS.STS40.getValue()))
+                        .collect(Collectors.toList());
+            bionutritionDocBaseDTO.setBionutritionDocDetailsBaseDTOList(docBaseDTOFilterList);
+            return bionutritionDocBaseDTO;
+            }).filter(item->CollUtil.isNotEmpty(item.getBionutritionDocDetailsBaseDTOList())
+                && !StringUtils.equals(item.getBionutritionDocHeaderBaseDTO().getDocType(), BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_RECEIPT.getDocType()))
+                .collect(Collectors.toList());
+    }
+
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList, String skuCode) {
+        return getBionutritionDocDetailsDTOList(docHeaderIdList, Lists.newArrayList(skuCode), Lists.newArrayList());
     }
 
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList, String skuCode){
-        return getBionutritionDocDetailsDTOList(docHeaderIdList, Lists.newArrayList(skuCode));
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId, String skuCode) {
+        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), Lists.newArrayList(skuCode), Lists.newArrayList());
     }
 
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId, String skuCode){
-        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), Lists.newArrayList(skuCode));
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId, List<String> skuCodeList) {
+        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), skuCodeList, Lists.newArrayList());
     }
 
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(String docHeaderId, List<String> skuCodeList){
-        return getBionutritionDocDetailsDTOList(Lists.newArrayList(docHeaderId), skuCodeList);
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOListByLineStatus(String lineStatus) {
+        return getBionutritionDocDetailsDTOList(Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(lineStatus));
     }
 
-    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList, List<String> skuCodeList){
+    public List<BionutritionDocDetailsDTO> getBionutritionDocDetailsDTOList(List<String> docHeaderIdList, List<String> skuCodeList, List<String> lineStatusList) {
         List<BionutritionDocDetails> bionutritionDocDetailsList = baseDao.selectList(Wrappers.<BionutritionDocDetails>lambdaQuery()
                 .in(CollectionUtil.isNotEmpty(docHeaderIdList), BionutritionDocDetails::getDocHeaderId, docHeaderIdList)
-                .in(CollectionUtil.isNotEmpty(skuCodeList), BionutritionDocDetails::getSkuCode, skuCodeList));
+                .in(CollectionUtil.isNotEmpty(skuCodeList), BionutritionDocDetails::getSkuCode, skuCodeList)
+                .in(CollectionUtil.isNotEmpty(lineStatusList), BionutritionDocDetails::getLineStatus, lineStatusList));
         return ConvertUtils.sourceToTarget(bionutritionDocDetailsList, BionutritionDocDetailsDTO.class);
     }
 

+ 583 - 24
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/impl/BionutritionDocHeaderServiceImpl.java

@@ -1,12 +1,18 @@
 package com.ruoyi.ams.bionutrition.doc.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.PageInfo;
@@ -15,45 +21,81 @@ import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocHeader;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.DocExcelQueryDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.detail.BionutritionDocDetailsBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.header.BionutritionDocHeaderBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.header.FinishedProductReceiptHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.excel.BionutritionDocBaseExcel;
+import com.ruoyi.ams.bionutrition.doc.excel.detail.BionutritionDocDetailsBaseExcel;
+import com.ruoyi.ams.bionutrition.doc.excel.header.BionutritionDocHeaderBaseExcel;
 import com.ruoyi.ams.bionutrition.doc.mapper.BionutritionDocHeaderMapper;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.ams.bionutrition.doc.util.BionutritionDocUtil;
+import com.ruoyi.ams.inv.domain.InvLotLocId;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
+import com.ruoyi.ams.task.domain.WcsTask;
+import com.ruoyi.ams.task.dto.WcsTaskInvLotDTO;
+import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.constant.type.BizEnum;
+import com.ruoyi.common.constant.base.EnumUtils;
 import com.ruoyi.common.utils.ConvertUtils;
 import com.ruoyi.common.utils.PageUtil;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.service.impl.BaseServiceImpl;
 import com.ruoyi.framework.service.impl.CrudServiceImpl;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.impl.SysConfigServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFCell;
+import org.apache.poi.xssf.streaming.SXSSFRow;
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
+@Slf4j
 public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<BionutritionDocHeaderMapper, BionutritionDocHeader, BionutritionDocHeaderDTO> implements BionutritionDocHeaderService {
 
     @Autowired
     private BionutritionDocDetailsService bionutritionDocDetailsService;
+    @Autowired
+    private ISysConfigService sysConfigService;
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+    @Autowired
+    private IWcsTaskService wcsTaskService;
 
     /**
      * 查询单据头分页数据
+     *
      * @param docHeaderDTO
      * @return
      */
     @Override
     public PageInfo<BionutritionDocHeaderDTO> getDocHeaderPageInfo(BionutritionDocHeaderDTO docHeaderDTO) {
-        Page<BionutritionDocHeader> docEntitiesPage = (Page<BionutritionDocHeader>)baseDao.selectDocs(BeanUtil.beanToMap(docHeaderDTO));
-        return PageUtil.convert(docEntitiesPage, BionutritionDocHeaderDTO.class) ;
+        Page<BionutritionDocHeader> docEntitiesPage = (Page<BionutritionDocHeader>) baseDao.selectDocs(BeanUtil.beanToMap(docHeaderDTO));
+        return PageUtil.convert(docEntitiesPage, BionutritionDocHeaderDTO.class);
     }
 
     /**
      * 根据单号查询单据头
+     *
      * @param docNo
      * @return
      */
@@ -64,85 +106,391 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
     /**
      * 插入单据头
+     *
      * @param docHeaderDTO
      * @return
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     @Override
-    public int insertDocHeader(BionutritionDocHeaderDTO docHeaderDTO) {
+    public String insertDocHeader(BionutritionDocHeaderDTO docHeaderDTO) {
         Assert.notNull(docHeaderDTO, "不允许插入空数据");
-        return baseDao.insert(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class));
+        BionutritionDocHeader docHeader = ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class);
+        int result = baseDao.insert(docHeader);
+        return result > 0 ? docHeader.getId() : String.valueOf(result);
     }
 
     /**
      * 修改单据头
+     *
      * @param docHeaderDTO
      * @return
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     @Override
     public int updateDoc(BionutritionDocHeaderDTO docHeaderDTO) {
         UpdateWrapper<BionutritionDocHeader> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()),BionutritionDocHeader::getId, docHeaderDTO.getId())
-                .eq(StringUtils.isNotBlank(docHeaderDTO.getDocNo()), BionutritionDocHeader::getDocNo, docHeaderDTO.getDocNo());
+        updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()), BionutritionDocHeader::getId, docHeaderDTO.getId());
         return baseDao.update(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class), updateWrapper);
     }
 
     /**
      * 根据id删除单据头
+     *
      * @param ids
      * @return
      */
+    @Transactional(rollbackFor = RuntimeException.class)
     @Override
     public int deleteDocByIds(String[] ids) {
-        bionutritionDocDetailsService.deleteBatchIds(Arrays.asList(ids));
+        bionutritionDocDetailsService.deleteByHeaderIds(ids);
         return baseDao.deleteBatchIds(Arrays.asList(ids));
     }
 
     @Override
-    public List<BionutritionDocBaseDTO> getDocList(BionutritionDocHeaderDTO docHeaderDTO) {
-        List<BionutritionDocHeaderDTO> docHeaderDTOList = getBionutritionDocHeaderDTOList(docHeaderDTO.getDocType());
+    public List<BionutritionDocBaseDTO> getDocList(DocExcelQueryDTO docExcelQueryDTO) {
+        List<BionutritionDocHeaderDTO> docHeaderDTOList = getBionutritionDocHeaderDTOList(docExcelQueryDTO.getDocType());
         return buildBionutritionDocSameTypeList(docHeaderDTOList);
-//        return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
     }
 
     /**
      * 根据id获取单据数据
+     *
      * @param ids
      * @return
      */
     @Override
-    public List<BionutritionDocBaseDTO> getDicListByIds(String[] ids) {
+    public List<BionutritionDocBaseDTO> getDicListByIds(List<String> ids) {
         List<BionutritionDocHeaderDTO> docHeaderDTOList = ArrayUtil.isNotEmpty(ids) ?
-                getBionutritionDocHeaderDTOList(Arrays.asList(ids)) :
-                ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()),BionutritionDocHeaderDTO.class);
+                getBionutritionDocHeaderDTOList(ids) :
+                ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()), BionutritionDocHeaderDTO.class);
         return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
     }
 
+
+    /**
+     * 根据物料编码和批号获取单据信息
+     * @param skuCode
+     * @param batchNumber
+     * @return
+     */
+    @Override
+    public BionutritionDocBaseDTO selectDocBySkuAndBatchNumber(String skuCode, String batchNumber, String docType) {
+        List<BionutritionDocDetailsDTO> docDetailsDTOList = bionutritionDocDetailsService.selectDocDetailsDTOList(skuCode, batchNumber);
+        Assert.isTrue(CollUtil.isNotEmpty(docDetailsDTOList), "原厂批号对应单据明细不存在");
+        String headerId = docDetailsDTOList.stream().map(item -> item.getDocHeaderId())
+                .distinct().findFirst().orElse(null);
+        Assert.isTrue(StringUtils.isNotBlank(headerId), "明细对应单据头id不存在");
+        BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(headerId);
+        Assert.isTrue(ObjectUtil.isNotEmpty(bionutritionDocHeaderDTO), "明细对应单据头不存在或单据类型不对应");
+        return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
+    }
+
+    @Override
+    public BionutritionDocBaseDTO selectDocByDocNoAndDocType(String docNo, String docType) {
+        return buildDocBaseDTOByDocNoAndDocType(docNo, docType);
+    }
+
+    @Override
+    public List<BionutritionDocHeaderDTO> selectDocBaseByDocNoAndDocType(String docNo, String docType) {
+        return getBionutritionDocHeaderDTOList(null,  Lists.newArrayList(docNo), docType);
+    }
+
+    private BionutritionDocBaseDTO buildDocBaseDTOByDocNoAndDocType(String docNo, String docType) {
+        BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNoAndDocType(docNo, docType);
+        return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
+    }
+
+    /**
+     * 单据导出excel
+     *
+     * @param response todo 单据单头中文
+     * @param docExcelQueryDTO
+     */
+    @Override
+    public <E> void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException {
+        List<BionutritionDocBaseDTO> list = getDocList(docExcelQueryDTO);
+        List<BionutritionDocBaseExcel> docBaseExcels = list.stream()
+                .map(item -> BionutritionDocUtil.buildBionutritionDocBaseExcel(item.getBionutritionDocHeaderBaseDTO().getDocType(), item))
+                .collect(Collectors.toList());
+
+        // 创建工作簿对象
+        SXSSFWorkbook workbook = new SXSSFWorkbook();
+        SXSSFSheet sheet = workbook.createSheet();
+
+        // 设置单元格样式
+        CellStyle cellStyle = workbook.createCellStyle();
+        // 上下左右居中
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+
+        Integer startRow = 0;
+        // 总列数
+        Integer collLength = 0;
+        //是同一类型的单据 todo 暂时只能导出同一种类型单据
+        Assert.isTrue(StringUtils.isNotBlank(docExcelQueryDTO.getDocType()), "请选择单据类型");
+
+        BizEnum.BionutritionHeaderExcelDocTypeEnum bionutritionHeaderExcelDocTypeEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionHeaderExcelDocTypeEnum.class);
+        Class<E> docHeaderClass = (Class<E>) Class.forName(bionutritionHeaderExcelDocTypeEnum.getClassName());
+        BizEnum.BionutritionDetailsExcelDocTypeEnum bionutritionDetailsExcelDocTypeEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionDetailsExcelDocTypeEnum.class);
+        Class<E> docDetailsClass = (Class<E>) Class.forName(bionutritionDetailsExcelDocTypeEnum.getClassName());
+
+        Field[] headerSonFields = docHeaderClass.getDeclaredFields();
+        Field[] headerFatherFields = docHeaderClass.getSuperclass().getDeclaredFields();
+
+        //1.设置列数,长度为单头和明细的字段数和
+        // 单头字段数
+        collLength = headerSonFields.length + headerFatherFields.length;
+        // 所有单头字段
+        Field[] totalHeaderFields = new Field[collLength];
+        System.arraycopy(headerSonFields, 0, totalHeaderFields, 0, headerSonFields.length);
+        System.arraycopy(headerFatherFields, 0, totalHeaderFields, headerSonFields.length, headerFatherFields.length);
+        // 设置单头字段为可访问
+        totalHeaderFields = setFieldsAccessible(totalHeaderFields);
+        log.info("=====单头字段长度:{}", collLength);
+
+        Field[] detailSonField = docDetailsClass.getDeclaredFields();
+        Field[] detailFatherFields = docDetailsClass.getSuperclass().getDeclaredFields();
+
+        // 所有明细字段
+        Field[] totalDetailFields = new Field[detailSonField.length + detailFatherFields.length];
+        System.arraycopy(detailSonField, 0, totalDetailFields, 0, detailSonField.length);
+        System.arraycopy(detailFatherFields, 0, totalDetailFields, detailSonField.length, detailFatherFields.length);
+        // 设置明细字段为可访问
+        totalDetailFields = setFieldsAccessible(totalDetailFields);
+        // 加上明细字段数
+        collLength = collLength + detailSonField.length + detailFatherFields.length;
+
+        // 获取所有字段
+        Field[] totalFields = new Field[collLength];
+        System.arraycopy(totalHeaderFields, 0, totalFields, 0, totalHeaderFields.length);
+        System.arraycopy(totalDetailFields, 0, totalFields, totalHeaderFields.length, totalDetailFields.length);
+        log.info("==所有字段:{}", totalFields);
+
+        //2.创建第一行和第二行标题
+        SXSSFRow row0 = sheet.createRow(0);
+        SXSSFCell cell0 = row0.createCell(0);
+        BizEnum.BionutritionExcelDocTitleEnum excelDocTitleEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionExcelDocTitleEnum.class);
+        cell0.setCellValue(excelDocTitleEnum.getTitleName());
+        cell0.setCellStyle(cellStyle);
+        // ‘单据’标题所占的列合并
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, collLength - 1));
+
+        SXSSFRow row1 = sheet.createRow(1);
+        SXSSFCell cell1 = row1.createCell(0);
+        cell1.setCellValue("单头");
+        cell1.setCellStyle(cellStyle);
+        SXSSFCell cell2 = row1.createCell(totalHeaderFields.length);
+        cell2.setCellValue("明细");
+        cell2.setCellStyle(cellStyle);
+        // ‘单头’标题所占的列合并
+        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, totalHeaderFields.length - 1));
+        // ‘明细’标题所占的列合并
+        sheet.addMergedRegion(new CellRangeAddress(1, 1, totalHeaderFields.length, collLength - 1));
+
+        //3.创建第二行标题
+        SXSSFRow row2 = sheet.createRow(2);
+        // 获取单据中文字段配置信息
+        String docFieldRemark = sysConfigService.selectConfigByKey(Constant.SYS_DOC_FIELD_REMARK);
+        log.info("单据字段对应配置信息:{}",docFieldRemark);
+        Assert.isTrue(StringUtils.isNotBlank(docFieldRemark),"单据中文字段配置信息获取失败");
+        Map<String, String> docFieldRemarkMap = JSONObject.parseObject(docFieldRemark, Map.class);
+
+        for (int i = 0; i < collLength; i++) {
+            SXSSFCell cell = row2.createCell(i);
+            cell.setCellStyle(cellStyle);
+            // 根据字段名获取对应中文并设置到标题中
+            cell.setCellValue(docFieldRemarkMap.get(totalFields[i].getName()));
+        }
+
+        startRow = 3;
+        try {
+            // 4.设置数据
+            for (BionutritionDocBaseExcel baseExcel : docBaseExcels) {
+
+                BionutritionDocHeaderBaseExcel headerExcel = baseExcel.getBionutritionDocHeaderBaseExcelDTO();
+                List<BionutritionDocDetailsBaseExcel> detailsExcelList = baseExcel.getBionutritionDocDetailsBaseExcelList();
+                // Todo 导出对象转map获取值
+//                DocToMap(headerExcel,docExcelQueryDTO.getDocType());
+
+                // 获取当前单头字段值
+                Map<String, Object> headerPropertyMap = getPropertyMap(docHeaderClass, (Object) totalHeaderFields, headerExcel);
+                log.info("单头字段值:{}", headerPropertyMap);
+                // 明细数据为空 只设置单据头
+                if (CollUtil.isEmpty(detailsExcelList)) {
+                    // 创建行
+                    SXSSFRow row = sheet.createRow(startRow);
+                    Integer cellNum = 0;
+                    // 设置单头字段的值
+                    setExcelField(totalHeaderFields, headerPropertyMap, row, cellNum, cellStyle);
+                    startRow++;
+                    continue;
+                }
+                // 单元格合并 合并列,不合并行 明细只有一条数据无需合并
+                if (detailsExcelList.size() != 1){
+                    mergeSameColumn(sheet, startRow, totalHeaderFields, detailsExcelList);
+                }
+                // 有明细数据 需要合并单头单元格
+                for (BionutritionDocDetailsBaseExcel detailsExcel : detailsExcelList) {
+                    Map<String, Object> detailPropertyMap = getDetailPropertyMap(docDetailsClass, (Object) totalDetailFields, detailsExcel);
+                    // 创建行
+                    SXSSFRow row = sheet.createRow(startRow);
+                    Integer cellNum = 0;
+                    // 设置单头字段的值
+                    cellNum = setExcelField(totalHeaderFields, headerPropertyMap, row, cellNum, cellStyle);
+                    // 设置单明细的值
+                    setExcelField(totalDetailFields, detailPropertyMap, row, cellNum, cellStyle);
+                    startRow++;
+                }
+            }
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+
+        // 5.响应到客户端
+        OutputStream out = null;
+        try {
+            out = response.getOutputStream();
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment;filename=test1");
+            workbook.write(out);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private void DocToMap(BionutritionDocHeaderBaseExcel headerExcel, String docType) throws ClassNotFoundException {
+        /*Map<String, Object> map = BeanUtil.beanToMap(headerExcel);
+
+        String docFieldRemark = sysConfigService.selectConfigByKey(Constant.SYS_DOC_FIELD_REMARK);
+        log.info("单据字段对应配置信息:{}",docFieldRemark);
+        Assert.isTrue(StringUtils.isNotBlank(docFieldRemark),"单据中文字段配置信息获取失败");
+        Map<String, String> docFieldRemarkMap = JSONObject.parseObject(docFieldRemark, Map.class);
+        Map<String, Object> remarkValueMap = docFieldRemarkMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, item -> map.get(item.getKey())));
+        remarkValueMap.forEach(item -> cell.setcell());
+
+
+        map.entrySet().forEach(e-> System.out.println(e.getKey()+":"+e.getValue()));*/
+//        BeanUtil.mapToBean(map, docHeaderClass, true, CopyOptions.create());
+
+
+    }
+
+    /**
+     * 单元格合并同列不合并同行
+     * @param sheet
+     * @param startRow
+     * @param totalHeaderFields
+     * @param detailsExcelList
+     */
+    private void mergeSameColumn(SXSSFSheet sheet, Integer startRow, Field[] totalHeaderFields, List<BionutritionDocDetailsBaseExcel> detailsExcelList) {
+        for (int i = 0; i < totalHeaderFields.length; i++) {
+            sheet.addMergedRegion(new CellRangeAddress(
+                    startRow, startRow + detailsExcelList.size() - 1, i, i));
+        }
+    }
+
+    /**
+     * 获取当前导出单据明细字段值
+     * @param docDetailsClass
+     * @param totalDetailFields
+     * @param detailsExcel
+     * @param <E>
+     * @return
+     * @throws NoSuchMethodException
+     * @throws IllegalAccessException
+     * @throws InvocationTargetException
+     */
+    private <E> Map<String, Object> getDetailPropertyMap(Class<E> docDetailsClass, Object totalDetailFields, BionutritionDocDetailsBaseExcel detailsExcel) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+        //获取当前明细字段值
+        Method getProperties = docDetailsClass.getDeclaredMethod("getProperties", Field[].class);
+        // 获取单头对象的所有字段值
+        Map<String, Object> detailPropertyMap = (Map<String, Object>) getProperties.invoke(detailsExcel, totalDetailFields);
+        return detailPropertyMap;
+    }
+
+    /**
+     * 设置excel单元格值
+     * @param totalFields
+     * @param propertyMap
+     * @param row
+     * @param cellNum
+     * @return
+     */
+    private Integer setExcelField(Field[] totalFields, Map<String, Object> propertyMap, SXSSFRow row, Integer cellNum, CellStyle cellStyle) {
+        for (Field field : totalFields) {
+            SXSSFCell cell = row.createCell(cellNum);
+            cell.setCellStyle(cellStyle);
+            cell.setCellValue(String.valueOf(propertyMap.get(field.getName())) );
+            cellNum++;
+        }
+        return cellNum;
+    }
+
+    /**
+     * 获取当前导出单据头的字段的值
+     *
+     * @param docHeaderClass
+     * @param totalHeaderFields
+     * @param headerExcel
+     * @param <E>
+     * @return
+     * @throws NoSuchMethodException
+     * @throws IllegalAccessException
+     * @throws InvocationTargetException
+     */
+    private <E> Map<String, Object> getPropertyMap(Class<E> docHeaderClass, Object totalHeaderFields, BionutritionDocHeaderBaseExcel headerExcel) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+        Method getProperties = docHeaderClass.getDeclaredMethod("getProperties", Field[].class);
+        // 获取单头对象的所有字段值
+        Map<String, Object> propertyMap = (Map<String, Object>) getProperties.invoke(headerExcel, totalHeaderFields);
+        return propertyMap;
+    }
+
+    /**
+     * 设置字段权限为可访问
+     * @param totalFields
+     * @return
+     */
+    public Field[] setFieldsAccessible(Field[] totalFields) {
+        for (Field field : totalFields) {
+            field.setAccessible(true);
+        }
+        return totalFields;
+    }
+
     /**
      * 构建类型单据内容(单个)
+     *
      * @param docNo
      * @return
      */
-    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo){
+    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo) {
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNo(docNo);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
     }
 
     /**
      * 构建类型单据内容(单个)
+     *
      * @param id
      * @return
      */
-    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id){
+    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id) {
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(id);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
     }
 
     /**
      * 构建类型单据内容(多个)
+     *
      * @param docNoList
      * @return
      */
-    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList){
+    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList) {
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOListByDocNo(docNoList);
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
@@ -151,22 +499,37 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
     /**
      * 构建类型单据内容(多个)
+     *
      * @param idList
      * @return
      */
-    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList){
+    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList) {
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOList(idList);
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
                 buildBionutritionDocDifferentTypeList(bionutritionDocHeaderDTOList) : buildBionutritionDocSameTypeList(bionutritionDocHeaderDTOList);
     }
 
+    /**
+     * 构建类型单据内容(多个)
+     * @param docNo
+     * @param docType
+     * @return
+     */
+    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(String docNo, String docType) {
+        List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getLikeBionutritionDocHeaderDTOList(docNo, docType);
+        List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
+        return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
+                buildBionutritionDocDifferentTypeList(bionutritionDocHeaderDTOList) : buildBionutritionDocSameTypeList(bionutritionDocHeaderDTOList);
+    }
+
     /**
      * 构建类型单据内容(单个)
+     *
      * @param bionutritionDocHeaderDTO
      * @return
      */
-    private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO){
+    private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO) {
         BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = BionutritionDocUtil.buildBionutritionDocHeaderDTO(bionutritionDocHeaderDTO);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderBaseDTO.getId());
@@ -180,10 +543,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
     /**
      * 构建类型单据内容(多个 相同类型单据)
+     *
      * @param bionutritionDocHeaderDTOList
      * @return
      */
-    private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
+    private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
         List<BionutritionDocHeaderBaseDTO> bionutritionDocHeaderBaseDTOList = BionutritionDocUtil.buildBionutritionDocHeaderDTOList(bionutritionDocHeaderDTOList);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
@@ -194,10 +558,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
     /**
      * 构建类型单据内容(多个 不同类型单据)
+     *
      * @param bionutritionDocHeaderDTOList
      * @return
      */
-    private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
+    private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
         Map<String, List<BionutritionDocHeaderBaseDTO>> bionutritionDocHeaderMap = BionutritionDocUtil.buildBionutritionDocHeaderDTOByDocTypeMap(bionutritionDocHeaderDTOList);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
@@ -220,6 +585,17 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
         }).collect(Collectors.toList());
     }
 
+    /**
+     * 未查到返回对象
+     * @param docNo
+     * @param docType
+     * @return
+     */
+    public BionutritionDocHeaderDTO getBionutritionDocHeaderDTOListByDocNoAndDocType(String docNo, String docType) {
+        return getBionutritionDocHeaderDTOList(null, Lists.newArrayList(docNo), docType)
+                .stream().findFirst().orElseGet(() -> new BionutritionDocHeaderDTO());
+    }
+
     public BionutritionDocHeaderDTO getBionutritionDocHeaderDTOListByDocNo(String docNo) {
         return getBionutritionDocHeaderDTOList(null, Lists.newArrayList(docNo), null)
                 .stream().findFirst().orElseGet(() -> new BionutritionDocHeaderDTO());
@@ -230,6 +606,182 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
                 .stream().findFirst().orElseGet(() -> new BionutritionDocHeaderDTO());
     }
 
+    /**
+     * 未查到返回null
+     * @param docNo
+     * @param docType
+     * @return
+     */
+    public BionutritionDocHeaderDTO getDocHeaderDTOListByDocNoAndDocType(String docNo, String docType) {
+        return getBionutritionDocHeaderDTOList(null, Lists.newArrayList(docNo), docType)
+                .stream().findFirst().orElse(null);
+    }
+
+    /**
+     * 任务回调修改单据状态
+     * @param wcsTask
+     * @return
+     */
+    @Override
+    public void updateDocStatus(WcsTask wcsTask) {
+        // 不是出入库任务直接返回
+        if (StringUtils.isEmpty(wcsTask.getExt5())) return;
+
+        String ext5 = wcsTask.getExt5();
+        String docNo = null;
+        String docLineNo = null;
+        String businessType = null;
+        String docType = null;
+
+        if (StringUtils.isNotEmpty(ext5)){
+            String[] docParams = ext5.split(",");
+            docNo = docParams[0];
+            docLineNo = docParams[1];
+            businessType = docParams[2];
+            docType = docParams[3];
+        }
+        //根据单号和类型获取单据信息
+        BionutritionDocBaseDTO bionutritionDocBaseDTO = this.selectDocByDocNoAndDocType(docNo, docType);
+        BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = bionutritionDocBaseDTO.getBionutritionDocHeaderBaseDTO();
+        BionutritionDocDetailsDTO docDetails = bionutritionDocDetailsService.selectDocDetailsByLineNo(bionutritionDocHeaderBaseDTO.getId(), docLineNo);
+        // 根据单据业务类型修改单据状态
+        if (StringUtils.equals(businessType, Constant.BUSINESS_TYPE.ASN.getValue())) {
+            this.updateASNDocStatus(wcsTask, docNo, docType, bionutritionDocHeaderBaseDTO, docDetails);
+        }else {
+            this.updateSODocStatus(wcsTask, docNo, docType, bionutritionDocHeaderBaseDTO, docDetails);
+        }
+    }
+
+    /**
+     * 修改出库单状态
+     * @param bionutritionDocHeaderBaseDTO
+     * @param docDetails
+     */
+    private void updateSODocStatus(WcsTask wcsTask, String docNo, String docType, BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO, BionutritionDocDetailsDTO docDetails) {
+        // 1.修改明细
+        // 比较明细已搬运数量和需搬运数量大小
+        BigDecimal sub = NumberUtil.sub(docDetails.getSkuQty(), docDetails.getTransferredQty());
+        // 明细中需搬运数量大于任务已搬运数量,状态为部分出库,否则为完全出库
+        docDetails.setLineStatus(sub.compareTo(BigDecimal.ZERO) > 0 ? Constant.ORDER_STS.STS10.getValue() : Constant.ORDER_STS.STS20.getValue());
+        bionutritionDocDetailsService.updateDocDetails(docDetails);
+        // 2.修改单头
+        this.updateDocHeaderStatus(bionutritionDocHeaderBaseDTO);
+        log.info("===更改出库单据状态,单号{},明细行号{},单头状态更改为{},明细状态更改为{}",
+                bionutritionDocHeaderBaseDTO.getDocNo(), docDetails.getDocLineNo()
+                , bionutritionDocHeaderBaseDTO.getDocStatus(), docDetails.getLineStatus());
+    }
+
+    /**
+     * 修改入库单状态
+     * @param docNo
+     * @param docType
+     * @param bionutritionDocHeaderBaseDTO
+     * @param docDetails
+     */
+    private void updateASNDocStatus(WcsTask wcsTask, String docNo, String docType, BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO, BionutritionDocDetailsDTO docDetails) {
+        // 1.设置明细状态
+        // 比较明细已搬运数量和需搬运数量大小
+        BigDecimal sub = NumberUtil.sub(docDetails.getSkuQty(), docDetails.getTransferredQty());
+        // 需搬运数量大于已搬运数量,设置单据为部分入库,否则为全部入库
+        docDetails.setLineStatus(sub.compareTo(BigDecimal.ZERO) > 0 ? Constant.ASN_STS.STS30.getValue() : Constant.ASN_STS.STS40.getValue());
+        // 如果采购单的一条明细完全收货
+        if (StringUtils.equals(docType, BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_ORDER.getDocType())
+                && StringUtils.equals(docDetails.getLineStatus(), Constant.ASN_STS.STS40.getValue())){
+            // 修改采购入库单状态
+            this.updatePurchaseReceiptDocStatus(docNo, docDetails);
+        }
+        bionutritionDocDetailsService.updateDocDetails(docDetails);
+        // 2.设置单头状态
+        this.updateDocHeaderStatus(bionutritionDocHeaderBaseDTO);
+        log.info("===更改入库单据状态,单号{},明细行号{},单头状态更改为{},明细状态更改为{}",
+                bionutritionDocHeaderBaseDTO.getDocNo(), docDetails.getDocLineNo()
+                , bionutritionDocHeaderBaseDTO.getDocStatus(), docDetails.getLineStatus());
+    }
+
+    public static void main(String[] args) {
+        BigDecimal sub = NumberUtil.sub("35", "26");
+        // 需搬运数量大于已搬运数量,设置单据为部分入库,否则为全部入库
+        boolean b = sub.compareTo(BigDecimal.ZERO) > 0;
+        System.out.println(b);
+
+    }
+
+    /**
+     * 比较单据的一条明细已生成任务的搬运总数量和明细需要搬运总数量大小
+     * @param wcsTask
+     * @param docDetails
+     * @return
+     */
+    private int getQtyCompare(WcsTask wcsTask, BionutritionDocDetailsDTO docDetails) {
+        // 查询同单号同明细中未取消的任务
+        List<WcsTaskInvLotDTO> wcsTaskInvLots = wcsTaskService.selectWcsTaskListByExt5(wcsTask.getExt5());
+        long sum = wcsTaskInvLots.stream().filter(item -> StringUtils.isNotBlank(item.getQty()))
+                .mapToLong(item -> Long.parseLong(NumberUtil.roundStr(item.getQty(), 0))).sum();
+        int compare = NumberUtil.compare(Long.valueOf(docDetails.getSkuQty()), sum);
+        return compare;
+    }
+
+    /**
+     * 修改单头状态
+     * @param bionutritionDocHeaderBaseDTO
+     */
+    private void updateDocHeaderStatus(BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO) {
+        List<BionutritionDocDetailsDTO> docDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(bionutritionDocHeaderBaseDTO.getId());
+        // 出库 过滤掉不是完全出库状态的明细
+        if (StringUtils.equals(bionutritionDocHeaderBaseDTO.getBusinessType(), Constant.BUSINESS_TYPE.ORDER.getValue())){
+            List<BionutritionDocDetailsDTO> collect = docDetailsDTOList.stream()
+                    .filter(item -> !StringUtils.equals(item.getLineStatus(), Constant.ORDER_STS.STS20.getValue())).collect(Collectors.toList());
+            // 如果存在不是完全出库状态的明细 单头设置为部分出库; 否则设置为完全出库
+            bionutritionDocHeaderBaseDTO.setDocStatus(CollUtil.isNotEmpty(collect) ?
+                    Constant.ORDER_STS.STS10.getValue() : Constant.ORDER_STS.STS20.getValue());
+        } else { // 入库 过滤掉不是完全入库状态的明细
+            List<BionutritionDocDetailsDTO> collect = docDetailsDTOList.stream()
+                    .filter(item -> !StringUtils.equals(item.getLineStatus(), Constant.ASN_STS.STS40.getValue())).collect(Collectors.toList());
+            // 如果存在不是完全收货状态的明细 单头设置为部分收货; 否则设置为完全收货
+            bionutritionDocHeaderBaseDTO.setDocStatus(CollUtil.isNotEmpty(collect) ?
+                    Constant.ASN_STS.STS30.getValue() : Constant.ASN_STS.STS40.getValue());
+        }
+        this.updateDoc(ConvertUtils.sourceToTarget(bionutritionDocHeaderBaseDTO, BionutritionDocHeaderDTO.class));
+    }
+
+    /**
+     * 判断单据的一条明细是否完全搬运
+     * @param docDetails
+     * @param docDetailsDTOList
+     * @return
+     */
+    private boolean ifLessEqualQty(BionutritionDocDetailsDTO docDetails, List<BionutritionDocDetailsBaseDTO> docDetailsDTOList) {
+        long qty = docDetailsDTOList.stream().filter(item -> StringUtils.isNotBlank(item.getSkuQty()))
+                .mapToLong(item -> Long.parseLong(item.getSkuQty())).sum();
+        // 判断已搬运的数量是否小于采购单对应明细的总数量
+        long qtySupposed = Long.parseLong(docDetails.getSkuQty());
+        log.info("当前已搬运数量{},剩余未搬运数量{}", qty, qtySupposed - qty);
+        boolean ifLessEqualQty = qtySupposed - qty > 0;
+        return ifLessEqualQty;
+    }
+
+    /**
+     * 修改采购入库单状态
+     * @param docNo
+     */
+    private void updatePurchaseReceiptDocStatus(String docNo, BionutritionDocDetailsDTO docDetails) {
+        BionutritionDocBaseDTO purchaseReceiptDoc = this.selectDocByDocNoAndDocType(docNo, BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_RECEIPT.getDocType());
+        List<BionutritionDocDetailsBaseDTO> docDetailsDTOList = purchaseReceiptDoc.getBionutritionDocDetailsBaseDTOList();
+        // 将对应的采购收货单改为完全收货
+        /*docDetailsDTOList.forEach(item->{
+            item.setLineStatus(Constant.ASN_STS.STS40.getValue());
+            bionutritionDocDetailsService.updateDocDetails(ConvertUtils.sourceToTarget(item, BionutritionDocDetailsDTO.class));
+        });*/
+        // 修改明细
+        docDetailsDTOList.stream().filter(item->StringUtils.equals(item.getBelongDetailsId(), docDetails.getId())).collect(Collectors.toList())
+                .forEach(item->{
+            item.setLineStatus(Constant.ASN_STS.STS40.getValue());
+            bionutritionDocDetailsService.updateDocDetails(ConvertUtils.sourceToTarget(item, BionutritionDocDetailsDTO.class));
+        });
+        // 修改单头
+        this.updateDocHeaderStatus(purchaseReceiptDoc.getBionutritionDocHeaderBaseDTO());
+    }
+
     public List<BionutritionDocHeaderDTO> getBionutritionDocHeaderDTOListByDocNo(List<String> docNoList) {
         return getBionutritionDocHeaderDTOList(null, docNoList, null);
     }
@@ -242,6 +794,13 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
         return getBionutritionDocHeaderDTOList(null, null, docType);
     }
 
+    private List<BionutritionDocHeaderDTO> getLikeBionutritionDocHeaderDTOList(String docNo, String docType) {
+        List<BionutritionDocHeader> bionutritionDocHeaderList = baseDao.selectList(Wrappers.<BionutritionDocHeader>lambdaQuery()
+                .like(StringUtils.isNotEmpty(docNo), BionutritionDocHeader::getDocNo, docNo)
+                .eq(StringUtils.isNotBlank(docType), BionutritionDocHeader::getDocType, docType));
+        return ConvertUtils.sourceToTarget(bionutritionDocHeaderList, BionutritionDocHeaderDTO.class);
+    }
+
     private List<BionutritionDocHeaderDTO> getBionutritionDocHeaderDTOList(List<String> idList, List<String> docNoList, String docType) {
         List<BionutritionDocHeader> bionutritionDocHeaderList = baseDao.selectList(Wrappers.<BionutritionDocHeader>lambdaQuery()
                 .in(CollectionUtil.isNotEmpty(idList), BionutritionDocHeader::getId, idList)

+ 11 - 3
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/util/BionutritionDocUtil.java

@@ -2,7 +2,6 @@ package com.ruoyi.ams.bionutrition.doc.util;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.google.common.collect.Lists;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
 import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
@@ -73,10 +72,19 @@ public class BionutritionDocUtil {
      */
     @SneakyThrows
     public static <E extends BionutritionDocDetailsBaseDTO> List<E> buildBionutritionDocDetailsDTOList(String docType, List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList) {
-        Assert.isTrue(StringUtils.isNotBlank(docType), "docType is null");
+        /*Assert.isTrue(StringUtils.isNotBlank(docType), "docType is null");
         return CollectionUtil.isNotEmpty(bionutritionDocDetailsDTOList) ?
                 bionutritionDocDetailsDTOList.stream().map(item -> (E) buildBionutritionDocDetailsDTO(docType, item)).collect(Collectors.toList()) :
-                Lists.newArrayList((E) buildBionutritionDocDetailsDTO(docType, new BionutritionDocDetailsDTO()));
+                buildBionutritionDocDetailsDTO(docType, new BionutritionDocDetailsDTO());*/
+        if (CollectionUtil.isNotEmpty(bionutritionDocDetailsDTOList)){
+            Assert.isTrue(StringUtils.isNotBlank(docType), "docType is null");
+            return bionutritionDocDetailsDTOList.stream().map(item -> (E) buildBionutritionDocDetailsDTO(docType, item)).collect(Collectors.toList());
+        } else {
+            List<E> docDetailsDTOList = new ArrayList<>();
+            E docDetailsBaseDTO = buildBionutritionDocDetailsDTO(docType, new BionutritionDocDetailsDTO());
+            docDetailsDTOList.add(docDetailsBaseDTO);
+            return docDetailsDTOList;
+        }
     }
 
     /**

+ 57 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/AsnAgvCallDTO.java

@@ -0,0 +1,57 @@
+package com.ruoyi.ams.bionutrition.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class AsnAgvCallDTO implements Serializable {
+
+    private static final long serialVersionUID = -4456436886909836579L;
+    /**
+     * 单据号
+     */
+    @NotBlank(message = "请填写单据号")
+    private String docNo ;
+    /**
+     * 起始库位
+     */
+    @NotBlank(message = "请选择起始点位")
+    private String locationFrom;
+    /**
+     * 目标库位
+     */
+    private String locationTo;
+    /**
+     * 产品批号
+     */
+    @NotBlank(message = "请填写产品批号")
+    private String batchNumber;
+    /**
+     * 数量
+     */
+    @NotBlank(message = "请填写数量")
+    private String qty;
+    /**
+     * 物料编号
+     */
+    @NotBlank(message = "请填写物料信息")
+    private String skuCode;
+    /**
+     * 单据类型
+     */
+    @NotBlank(message = "单据类型不确定")
+    private String docType;
+    /**
+     * 明细行号
+     */
+    @NotBlank(message = "请填写明细行号")
+    private String lineNo;
+
+    /**
+     * 操作人
+     */
+    private String user;
+
+}

+ 38 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/DocQcDTO.java

@@ -0,0 +1,38 @@
+package com.ruoyi.ams.bionutrition.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 单据质检参数对象
+ */
+@Data
+public class DocQcDTO implements Serializable {
+
+    private static final long serialVersionUID = -35010226008676367L;
+
+    /**
+     * 物料编码
+     */
+    @NotBlank(message = "物料编码不能为空")
+    private String skuCode;
+    /**
+     * 批次状态
+     * HG:合格 BHG:不合格 DJ:待检 FX:放行{@link com.ruoyi.base.constant.Constant.QUALITY_STATUS}
+     */
+    @NotBlank(message = "状态不能为空")
+    private String status;
+    /**
+     * 批次号
+     */
+    @NotBlank(message = "批次号不能为空")
+    private String batchNumber;
+    /**
+     * 单据号
+     */
+    private String docNo;
+
+    private String user;
+}

+ 41 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/GroundingDTO.java

@@ -0,0 +1,41 @@
+package com.ruoyi.ams.bionutrition.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class GroundingDTO implements Serializable {
+
+    private static final long serialVersionUID = -3507477864537906270L;
+    /**
+     * 单据号
+     */
+    @NotBlank(message = "请填写单据号")
+    private String docNo ;
+    /**
+     * 产品批号
+     */
+    @NotBlank(message = "请填写产品批号")
+    private String batchNumber;
+    /**
+     * 数量
+     */
+    @NotBlank(message = "请填写数量")
+    private String qty;
+    /**
+     * 物料编号
+     */
+    @NotBlank(message = "请填写物料信息")
+    private String skuCode;
+    /**
+     * 单据类型
+     */
+    private String docType;
+    /**
+     * 明细行号
+     */
+    @NotBlank(message = "请填写明细行号")
+    private String lineNo;
+}

+ 57 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/dto/OrderAgvCallDTO.java

@@ -0,0 +1,57 @@
+package com.ruoyi.ams.bionutrition.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class OrderAgvCallDTO implements Serializable {
+    private static final long serialVersionUID = 3317702320870220836L;
+
+    /**
+     * 目标库位
+     */
+    @NotBlank(message = "请选择目标库位")
+    private String locationTo;
+    /**
+     * 产品批号
+     */
+    @NotBlank(message = "请填写产品批号")
+    private String batchNumber ;
+    /**
+     * 数量
+     */
+    @NotBlank(message = "请填写数量")
+    private String qty;
+    /**
+     * 物料编号
+     */
+    @NotBlank(message = "请填写物料信息")
+    private String skuCode;
+    /**
+     * 单据类型
+     */
+    @NotBlank(message = "单据类型不确定")
+    private String docType;
+    /**
+     * 单据号
+     */
+    @NotBlank(message = "请填写单据号")
+    private String docNo;
+    /**
+     * 明细行号
+     */
+    @NotBlank(message = "请填写明细行号")
+    private String lineNo;
+    /**
+     * 明细id
+     */
+    private String detailsId;
+
+    /**
+     * 操作人
+     */
+    private String user;
+
+}

+ 1 - 3
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/org/bean/dto/OrgDTO.java

@@ -59,9 +59,7 @@ public class OrgDTO extends WarewmsExtDTO {
 
 
     /**
-     * 组织类型 10客户,00供应商
-     *
-     * @see com.ruoyi.base.constant.type.BizEnum.OrgType#getCode()
+     * 组织类型 10客户,00供应商 {@link com.ruoyi.base.constant.type.BizEnum.OrgType}
      */
     private String orgType;
 

+ 4 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/org/service/IOrgService.java

@@ -7,6 +7,10 @@ import com.ruoyi.framework.service.CrudService;
 
 import java.util.List;
 
+/**
+ * 机构相关接口提供(客户以及供应商)
+ * @author ChenYang
+ */
 public interface IOrgService extends CrudService<OrgEntity, OrgDTO> {
 
     /**

+ 46 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/IPdaAgvCallService.java

@@ -0,0 +1,46 @@
+package com.ruoyi.ams.bionutrition.pda;
+
+import com.ruoyi.ams.bionutrition.doc.dto.DocLotattDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.BionutritionDocDetailsBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.header.BionutritionDocHeaderBaseDTO;
+import com.ruoyi.ams.bionutrition.dto.AsnAgvCallDTO;
+import com.ruoyi.ams.bionutrition.dto.GroundingDTO;
+import com.ruoyi.ams.bionutrition.dto.OrderAgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
+import com.ruoyi.base.domain.BaseSku;
+
+/**
+ * 佰穗莱pda呼叫AGV生成搬运任务
+ */
+public interface IPdaAgvCallService {
+    /**
+     * 创建入库任务
+     * @param asnAgvCallDTO
+     */
+    void createIntoStorageTask(AsnAgvCallDTO asnAgvCallDTO);
+
+    /**
+     * 上架
+     * @param groundingDTO
+     */
+    void grounding(GroundingDTO groundingDTO);
+
+    /**
+     * 根据单据类型获取流程id
+     * @param docType
+     * @return
+     */
+    Long getFlowIdByDocType(String docType);
+
+    /**
+     * 构建批次属性对象
+     * @param docHeaderBaseDTO
+     * @param docLotattDTO
+     * @param baseSku
+     * @return
+     */
+    LotattDTO buildLotattArgument(BionutritionDocHeaderBaseDTO docHeaderBaseDTO,BionutritionDocDetailsBaseDTO docDetailsBaseDTO, DocLotattDTO docLotattDTO, BaseSku baseSku);
+
+    AgvCallDTO getOrderAgvCallDTO(OrderAgvCallDTO orderAgvCallDTO);
+}

+ 23 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/IPdaDocQcService.java

@@ -0,0 +1,23 @@
+package com.ruoyi.ams.bionutrition.pda;
+
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
+
+import java.util.List;
+
+/**
+ * 佰穗莱pda呼叫AGV生成搬运任务
+ */
+public interface IPdaDocQcService {
+
+    /**
+     * 质检提交
+     * @param docQcDTO
+     */
+    void docQcSubmit(DocQcDTO docQcDTO, String updateBy);
+
+    /**
+     * 获取质检列表
+     * @return
+     */
+    List<DocQcDTO> getQcList(String sku);
+}

+ 303 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/impl/PdaAgvCallServiceImpl.java

@@ -0,0 +1,303 @@
+package com.ruoyi.ams.bionutrition.pda.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.ruoyi.ams.agv.ndc.common.Aci;
+import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocDetails;
+import com.ruoyi.ams.bionutrition.doc.domain.BionutritionDocHeader;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.DocLotattDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.BionutritionDocDetailsBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.FinishedProductReceiptDetailsDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.PurchaseOrderDetailsDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.header.BionutritionDocHeaderBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
+import com.ruoyi.ams.bionutrition.dto.AsnAgvCallDTO;
+import com.ruoyi.ams.bionutrition.dto.GroundingDTO;
+import com.ruoyi.ams.bionutrition.dto.OrderAgvCallDTO;
+import com.ruoyi.ams.bionutrition.pda.IPdaAgvCallService;
+import com.ruoyi.ams.business.IBusinessService;
+import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.AgvCallItemDTO;
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.constant.type.BizEnum;
+import com.ruoyi.base.domain.BaseSku;
+import com.ruoyi.base.service.IBaseSkuService;
+import com.ruoyi.common.constant.base.EnumUtils;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.ConvertUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Service
+public class PdaAgvCallServiceImpl implements IPdaAgvCallService {
+
+    @Autowired
+    private BionutritionDocHeaderService bionutritionDocHeaderService;
+    @Autowired
+    private BionutritionDocDetailsService bionutritionDocDetailsService;
+    @Autowired
+    private IBusinessService businessService;
+    @Autowired
+    private ISysConfigService iSysConfigService;
+    @Autowired
+    private IBaseSkuService skuService;
+
+    /**
+     * 根据单号和单据类型生成入库任务
+     * @param asnAgvCallDTO
+     */
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void createIntoStorageTask(AsnAgvCallDTO asnAgvCallDTO) {
+        // 1.校验参数
+        Assert.isFalse(StringUtils.equals(asnAgvCallDTO.getQty(), "0"), "入库数量不能为0");
+        // 根据单号和单据类型查询单据信息
+        BionutritionDocBaseDTO bionutritionDocBaseDTO =
+                bionutritionDocHeaderService.selectDocByDocNoAndDocType(asnAgvCallDTO.getDocNo(), asnAgvCallDTO.getDocType());
+        Assert.isTrue(ObjectUtil.isNotNull(bionutritionDocBaseDTO), "该单据不存在");
+        BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = bionutritionDocBaseDTO.getBionutritionDocHeaderBaseDTO();
+        String docType = bionutritionDocHeaderBaseDTO.getDocType();
+        Assert.isTrue(StringUtils.isNotEmpty(docType), "单据信息中单据类型为空");
+        Assert.isTrue(StringUtils.equals(bionutritionDocHeaderBaseDTO.getBusinessType(),Constant.BUSINESS_TYPE.ASN.getValue())
+                || StringUtils.equals(bionutritionDocHeaderBaseDTO.getBusinessType(),Constant.BUSINESS_TYPE.PO.getValue())
+                , "该单据不是入库单据");
+        List<BionutritionDocDetailsBaseDTO> docDetailsList = bionutritionDocBaseDTO.getBionutritionDocDetailsBaseDTOList();
+        Assert.isTrue(CollUtil.isNotEmpty(docDetailsList), "单据明细数据为空");
+        // 2.根据明细行号筛选明细信息
+        BionutritionDocDetailsBaseDTO docDetailsBaseDTO = docDetailsList.stream().filter(item -> StringUtils.equals(item.getDocLineNo(), asnAgvCallDTO.getLineNo()))
+                .findFirst().orElse(null);
+        Assert.isTrue(ObjectUtil.isNotEmpty(docDetailsBaseDTO), "对应明细行号数据未找到");
+        // 3.判断数量是否超出范围
+        // 记录当前明细已搬运数量
+        BigDecimal transferredQty = NumberUtil.add(docDetailsBaseDTO.getTransferredQty(), asnAgvCallDTO.getQty());
+        Assert.isTrue(NumberUtil.compare(
+                Long.valueOf(docDetailsBaseDTO.getSkuQty()), Long.valueOf(transferredQty.toString())) >= 0
+                , "入库数量超出范围,剩余数量"+NumberUtil.sub(docDetailsBaseDTO.getSkuQty(), docDetailsBaseDTO.getTransferredQty()));
+        docDetailsBaseDTO.setTransferredQty(transferredQty.toString());
+        bionutritionDocDetailsService.updateDocDetails(ConvertUtils.sourceToTarget(docDetailsBaseDTO, BionutritionDocDetailsDTO.class));
+
+        // 如果是采购入库 需要根据采购单生成采购入库单
+        if (StringUtils.equals(docType, BizEnum.BionutritionExcelDocTitleEnum.PURCHASE_ORDER.getDocType())) {
+            this.addPurchaseReceiptDoc(bionutritionDocBaseDTO, docDetailsBaseDTO, asnAgvCallDTO);
+        }
+        // 4.获取配置信息单据类型对应流程id
+        Long flowId = this.getFlowIdByDocType(docType);
+        // 5.生成agv呼叫对象,生成对应wcs任务
+        AgvCallDTO agvCallDTO = this.getASNAgvCallDTO(asnAgvCallDTO, bionutritionDocHeaderBaseDTO, docDetailsBaseDTO);
+        businessService.agvCall(flowId, agvCallDTO);
+    }
+
+    /**
+     * 上架
+     * @param groundingDTO
+     */
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void grounding(GroundingDTO groundingDTO) {
+        // 根据单号和单据类型查询单据信息
+        BionutritionDocBaseDTO bionutritionDocBaseDTO =
+                bionutritionDocHeaderService.selectDocByDocNoAndDocType(groundingDTO.getDocNo(), groundingDTO.getDocType());
+        Assert.isTrue(ObjectUtil.isNotNull(bionutritionDocBaseDTO), "该单据不存在");
+        List<BionutritionDocDetailsBaseDTO> docDetailsList = bionutritionDocBaseDTO.getBionutritionDocDetailsBaseDTOList();
+        Assert.isTrue(CollUtil.isNotEmpty(docDetailsList), "单据明细数据为空");
+        BionutritionDocDetailsBaseDTO docDetailsBaseDTO = docDetailsList.stream().filter(item -> StringUtils.equals(item.getDocLineNo(), groundingDTO.getLineNo()))
+                .findFirst().orElse(null);
+        Assert.isTrue(ObjectUtil.isNotEmpty(docDetailsBaseDTO), "行号对应明细数据未找到");
+        // 修改单据明细状态为完全上架
+        docDetailsBaseDTO.setLineStatus(Constant.ASN_STS.STS60.getValue());
+        bionutritionDocDetailsService.updateDocDetails(ConvertUtils.sourceToTarget(docDetailsBaseDTO, BionutritionDocDetailsDTO.class));
+    }
+
+    /**
+     * 根据单据类型获取流程id
+     * @param docType
+     * @return
+     */
+    @NotNull
+    public Long getFlowIdByDocType(String docType) {
+        JSONArray docTypeFlowObjects = JSONUtil.parseArray(iSysConfigService.selectConfigByKey("sys.docType.corresponding.business"));
+        JSONObject jsonObject = docTypeFlowObjects.stream().map(o -> JSONUtil.parseObj(o.toString()))
+                .filter(entry -> StringUtils.equals(docType, (String) entry.get("docType"))).findFirst().orElse(null);
+        Assert.notNull(jsonObject, "未查找到该单据号对应单据类型");
+        Assert.notNull(jsonObject.get("flowId"), "未找到对应的任务下发流程");
+        Long flowId = Long.parseLong(jsonObject.get("flowId").toString());
+        return flowId;
+    }
+
+    /**
+     * 添加采购入库单
+     * @param bionutritionDocBaseDTO
+     * @param docDetailsBaseDTO
+     */
+    private void addPurchaseReceiptDoc(BionutritionDocBaseDTO bionutritionDocBaseDTO, BionutritionDocDetailsBaseDTO docDetailsBaseDTO, AsnAgvCallDTO asnAgvCallDTO) {
+        BionutritionDocDetailsDTO docDetailsDTO = ConvertUtils.sourceToTarget(docDetailsBaseDTO, BionutritionDocDetailsDTO.class);
+        BionutritionDocHeaderBaseDTO docHeaderBaseDTO = bionutritionDocBaseDTO.getBionutritionDocHeaderBaseDTO();
+        // 根据单号和单据类型查询采购入库单头
+        BionutritionDocHeaderDTO purchaseReceiptDocHeader = bionutritionDocHeaderService.getDocHeaderDTOListByDocNoAndDocType(
+                asnAgvCallDTO.getDocNo(), BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_RECEIPT.getDocType());
+        // 如果没有同单号的采购入库单,则新生成单头 如果有同单号的采购入库单则新生成的明细关联当前单头
+        if (ObjectUtil.isEmpty(purchaseReceiptDocHeader)){
+            // 单头新id主键
+            String headerId = IdWorker.getIdStr();
+            docHeaderBaseDTO.setId(headerId);
+            docDetailsDTO.setDocHeaderId(docHeaderBaseDTO.getId());
+            BionutritionDocHeaderDTO bionutritionDocHeaderDTO = ConvertUtils.sourceToTarget(docHeaderBaseDTO, BionutritionDocHeaderDTO.class);
+            // 设置单据类型为采购入库单
+            bionutritionDocHeaderDTO.setDocType(BizEnum.BionutritionExcelDocTitleEnum.PURCHASE_RECEIPT.getDocType());
+            bionutritionDocHeaderDTO.setBusinessType(Constant.BUSINESS_TYPE.ASN.getValue());
+            bionutritionDocHeaderService.insertDocHeader(bionutritionDocHeaderDTO);
+        }else {
+            BionutritionDocBaseDTO purchaseReceiptDoc = bionutritionDocHeaderService.selectDocByDocNoAndDocType(
+                    asnAgvCallDTO.getDocNo(), BizEnum.BionutritionHeaderDocTypeEnum.PURCHASE_RECEIPT.getDocType());
+            docDetailsDTO.setDocHeaderId(purchaseReceiptDocHeader.getId());
+            // 计算采购入库搬运数量是否合理
+            List<BionutritionDocDetailsBaseDTO> detailsBaseDTOList = purchaseReceiptDoc.getBionutritionDocDetailsBaseDTOList();
+            this.calculateQuantityIfReasonable(detailsBaseDTOList, docDetailsBaseDTO, asnAgvCallDTO);
+        }
+        // 设置属于那条采购单明细
+        docDetailsDTO.setBelongDetailsId(docDetailsDTO.getId());
+        docDetailsDTO.setId(IdWorker.getIdStr());
+        docDetailsDTO.setSkuQty(asnAgvCallDTO.getQty());
+        docDetailsDTO.setTransferredQty(asnAgvCallDTO.getQty());
+        // 生成采购入库单
+        bionutritionDocDetailsService.insertDocDetails(docDetailsDTO);
+    }
+
+    /**
+     * 计算采购入库搬运数量是否合理
+     * @param docDetailsBaseDTOList
+     * @param docDetailsBaseDTO
+     * @param asnAgvCallDTO
+     */
+    private void calculateQuantityIfReasonable(List<BionutritionDocDetailsBaseDTO> docDetailsBaseDTOList, BionutritionDocDetailsBaseDTO docDetailsBaseDTO, AsnAgvCallDTO asnAgvCallDTO) {
+        /*Assert.isTrue(CollUtil.isNotEmpty(docDetailsBaseDTOList), "采购入库单明细为空");
+        long qty = docDetailsBaseDTOList.stream()
+                .filter(item -> StringUtils.equals(item.getSkuCode(), asnAgvCallDTO.getSkuCode()))
+                .filter(item -> StringUtils.isNotBlank(item.getSkuQty()))
+                .mapToLong(item -> Long.parseLong(item.getSkuQty())).sum();*/
+        // 计算当前明细的总数量
+        /*long qty = docDetailsBaseDTOList.stream().filter(item -> StringUtils.isNotBlank(item.getSkuQty()))
+                .mapToLong(item -> Long.parseLong(item.getSkuQty())).sum();*/
+        // 判断已搬运的数量加上当前搬运数量是否小于采购单对应明细的总数量
+        long qty = StrUtil.isBlank(docDetailsBaseDTO.getTransferredQty()) ? 0 : Long.valueOf(docDetailsBaseDTO.getTransferredQty());
+        long qtySupposed = Long.parseLong(docDetailsBaseDTO.getSkuQty());
+        long qtyRemain = qtySupposed - qty;
+        boolean ifLessEqualQty = qty <= qtySupposed;
+        log.info("当前搬运数量{},剩余未搬运数量{}",asnAgvCallDTO.getQty(), qtyRemain);
+        Assert.isTrue(ifLessEqualQty, "搬运数量超出范围,剩余数量为"+qtyRemain);
+    }
+
+    /**
+     * 生成入库agv呼叫对象
+     * @param asnAgvCallDTO
+     * @return
+     */
+    private AgvCallDTO getASNAgvCallDTO(AsnAgvCallDTO asnAgvCallDTO, BionutritionDocHeaderBaseDTO docHeaderBaseDTO, BionutritionDocDetailsBaseDTO docDetailsBaseDTO) {
+        DocLotattDTO docLotattDTO = ConvertUtils.sourceToTarget(docDetailsBaseDTO, DocLotattDTO.class);
+        // 根据物料编码查询物料信息
+        BaseSku baseSku = skuService.selectBaseSkuByCustomerId("default", asnAgvCallDTO.getSkuCode());
+        Assert.isTrue(ObjectUtil.isNotEmpty(baseSku), "物料信息未找到");
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+        // 构建批次属性
+        LotattDTO lotattDTO = this.buildLotattArgument(docHeaderBaseDTO, docDetailsBaseDTO, docLotattDTO, baseSku);
+
+        agvCallItemDTO.setSku(asnAgvCallDTO.getSkuCode());
+        agvCallItemDTO.setQty(Double.valueOf(asnAgvCallDTO.getQty()));
+        agvCallItemDTO.setLotattDTO(lotattDTO);
+        agvCallItemDTOList.add(agvCallItemDTO);
+        AgvCallDTO agvCallDTO = new AgvCallDTO();
+        agvCallDTO.setLocationFrom(asnAgvCallDTO.getLocationFrom());
+        agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
+        agvCallDTO.setDocNo(asnAgvCallDTO.getDocNo());// 设置单号
+        agvCallDTO.setDocLineNo(asnAgvCallDTO.getLineNo()); // 设置明细行号
+        agvCallDTO.setBusinessType(Constant.BUSINESS_TYPE.ASN.getValue()); // 设置单据业务类型 -- 入库
+        agvCallDTO.setDocType(asnAgvCallDTO.getDocType()); // 设置单据类型
+        agvCallDTO.setCreateUser(asnAgvCallDTO.getUser()); // 设置操作人
+        return agvCallDTO;
+    }
+
+    /**
+     * 构建批次属性
+     * @param docHeaderBaseDTO
+     * @param docLotattDTO
+     * @param baseSku
+     */
+    public LotattDTO buildLotattArgument(BionutritionDocHeaderBaseDTO docHeaderBaseDTO, BionutritionDocDetailsBaseDTO docDetailsBaseDTO, DocLotattDTO docLotattDTO, BaseSku baseSku) {
+        LotattDTO lotattDTO = new LotattDTO();
+        lotattDTO.setLotatt01(docLotattDTO.getVendorCode());// 供应商编码
+        if (StringUtils.equals(BizEnum.BionutritionDetailDocTypeEnum.PURCHASE_ORDER.getDocType(), docHeaderBaseDTO.getDocType())){
+            lotattDTO.setLotatt02(docLotattDTO.getOriginalLotNumber()); // 采购收货:原厂批号
+        } else if (StringUtils.equals(BizEnum.BionutritionDetailDocTypeEnum.PRODUCTION_RETURN_ORDER.getDocType(), docHeaderBaseDTO.getDocType())){
+            lotattDTO.setLotatt02(docLotattDTO.getIncomeLotNumber()); // 成品入库、销售退库:产品批号
+        } else {
+            lotattDTO.setLotatt02(docLotattDTO.getProductLotNumber()); // 生产退库:进厂批号
+        }
+        String manufactureDate = DateUtil.format(docLotattDTO.getManufactureDate(), "yyyy-MM-dd");
+        lotattDTO.setLotatt03(manufactureDate);// 生产日期
+        // 计算有效截止日期:生产日期加上有效期(天)
+        DateTime dateTime = DateUtil.offsetDay(DateUtil.parse(manufactureDate), baseSku.getSkuShelflife());
+        lotattDTO.setLotatt04(DateUtil.format(dateTime,"yyyy-MM-dd"));// 有效截止日期
+        lotattDTO.setLotatt05(Constant.QUALITY_STATUS.DJ.getValue());// 质检状态 默认待检
+        lotattDTO.setLotatt06(DateUtil.format(new Date(), "yyyy-MM-dd"));// 入库日期
+        lotattDTO.setLotatt07(docLotattDTO.getIncomeLotNumber());// 进厂批号
+        lotattDTO.setLotatt08(docLotattDTO.getProductLotNumber());// 生产批号
+        lotattDTO.setLotatt09(docHeaderBaseDTO.getId());// 入库单头id
+        lotattDTO.setLotatt10(docDetailsBaseDTO.getDocLineNo()); // 明细行号
+        return lotattDTO;
+    }
+
+    /**
+     * 构建出库agv呼叫对象
+     * @param orderAgvCallDTO
+     * @return
+     */
+    @Override
+    public AgvCallDTO getOrderAgvCallDTO(OrderAgvCallDTO orderAgvCallDTO) {
+        // 根据物料编码查询物料信息
+        BaseSku baseSku = skuService.selectBaseSkuByCustomerId("default", orderAgvCallDTO.getSkuCode());
+        Assert.isTrue(ObjectUtil.isNotEmpty(baseSku), "物料信息未找到");
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+
+        agvCallItemDTO.setSku(orderAgvCallDTO.getSkuCode());
+        agvCallItemDTO.setQty(Double.valueOf(orderAgvCallDTO.getQty()));
+        agvCallItemDTOList.add(agvCallItemDTO);
+        AgvCallDTO agvCallDTO = new AgvCallDTO();
+        agvCallDTO.setLocationFrom(orderAgvCallDTO.getLocationTo());
+        agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
+        agvCallDTO.setDocNo(orderAgvCallDTO.getDocNo());// 设置单号
+        agvCallDTO.setDocLineNo(orderAgvCallDTO.getLineNo()); // 设置明细行号
+        agvCallDTO.setBusinessType(Constant.BUSINESS_TYPE.ORDER.getValue()); // 设置单据业务类型 -- 出库
+        agvCallDTO.setDocType(orderAgvCallDTO.getDocType()); // 设置单据类型
+        agvCallDTO.setCreateUser(orderAgvCallDTO.getUser()); // 设置操作人
+        return agvCallDTO;
+    }
+}

+ 183 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/pda/impl/PdaDocQcServiceImpl.java

@@ -0,0 +1,183 @@
+package com.ruoyi.ams.bionutrition.pda.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.google.common.collect.Lists;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocDetailsDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocHeaderDTO;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
+import com.ruoyi.ams.bionutrition.pda.IPdaDocQcService;
+import com.ruoyi.ams.business.IBusinessService;
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
+import com.ruoyi.ams.inv.domain.InvLotAtt;
+import com.ruoyi.ams.inv.domain.InvLotLocId;
+import com.ruoyi.ams.inv.dto.InvMoveDTO;
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.redis.RedisKey;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class PdaDocQcServiceImpl implements IPdaDocQcService {
+
+    @Autowired
+    private IInvLotAttService invLotAttService;
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+    @Autowired
+    private IBusinessService businessService;
+    @Autowired
+    private IBaseLocationInfoService baseLocationInfoService;
+    @Autowired
+    private BionutritionDocHeaderService bionutritionDocHeaderService;
+    @Autowired
+    private BionutritionDocDetailsService bionutritionDocDetailsService;
+
+    /**
+     * PDA质检
+     * @param docQcDTO
+     * @param updateBy
+     */
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void docQcSubmit(DocQcDTO docQcDTO, String updateBy) {
+        // 根据物料编码和批号查询批次信息
+        List<InvLotAtt> invLotAttList = invLotAttService.selectInvLotAttByBatchNum(docQcDTO.getBatchNumber(), docQcDTO.getSkuCode());
+        Assert.isTrue(CollUtil.isNotEmpty(invLotAttList), "所属批次信息未找到");
+        String lotNumNew = "";
+        for (InvLotAtt invLotAtt : invLotAttList) {
+            String lotnum = invLotAtt.getLotnum();
+            // 根据批次号查询库存信息
+            List<InvLotLocId> invLotLocIds = invLotLocIdService.selectInvLotLocIdByLotnum(lotnum);
+            // 如果没有对应的库存信息,遍历下一条批次数据 因为根据物料和批号会匹配到多条仅仅是质检状态不同批次数据
+            if (CollUtil.isEmpty(invLotLocIds)) continue;
+            invLotAtt.setLotatt05(docQcDTO.getStatus());
+            // 构建lotatt19属性
+            LotattDTO lotattDTO = new LotattDTO();
+            BeanUtils.copyProperties(invLotAtt, lotattDTO);
+            String lotatt19 = invLotLocIdService.buildLotatt19(lotattDTO);
+            // 判断是否存在相同批次的数据
+            InvLotAtt invLotAttSame = invLotAttService.selectInvLotAttByLotatt19(lotatt19);
+            lotNumNew = IdWorker.getIdStr();
+            if (ObjectUtil.isEmpty(invLotAttSame)){ // 没有相同批次的数据,就添加批次信息
+                BeanUtils.copyProperties(lotattDTO, invLotAtt);
+                // 更新批次号
+                invLotAtt.setLotnum(lotNumNew);
+                invLotAtt.setLotatt19(lotatt19);
+                invLotAtt.setCreateTime(DateUtils.getNowDate());
+                invLotAttService.insertInvLotAtt(invLotAtt);
+            }else {
+                lotNumNew = invLotAttSame.getLotnum();
+            }
+            // 修改库存表对应的批次号
+            invLotLocIdService.updateInvLotLocIdByLotNum(lotnum, lotNumNew);
+            // 如果是不合格 生成搬运任务到不合格区
+            if (StringUtils.equals(docQcDTO.getStatus(), Constant.QUALITY_STATUS.BHG.getValue())) {
+                createConveyTaskToBHGZone(updateBy, lotNumNew, docQcDTO);
+            }
+        }
+    }
+
+    /**
+     * 生成搬运任务到不合格区
+     *
+     * @param updateBy
+     * @param lotNumNew
+     */
+    private void createConveyTaskToBHGZone(String updateBy, String lotNumNew, DocQcDTO docQcDTO) {
+        List<InvLotLocId> invLotLocIdList = invLotLocIdService.selectInvLotLocIdByLotnum(lotNumNew);
+        Assert.isTrue(CollUtil.isNotEmpty(invLotLocIdList), "未找到批号对应库存");
+        int availableLocNumber = 0;
+        // 同一批次多个库位库存都需要搬运至不合格区
+        for (InvLotLocId invLotLocId : invLotLocIdList) {
+            // 获取所有不合格区库位
+            List<BaseLocationInfo> baseLocationToList = baseLocationInfoService.selectSortedLocatinListByZoneId(
+                    Long.parseLong(Constant.LOCATION_ZONE.BHG_ZONE.getValue()), Constant.WAREHOUSE_ID, null);
+            BaseLocationInfo locationInfo = null;
+            for (BaseLocationInfo b : baseLocationToList) {
+                // 获取一个没有任务且为空的库位
+                if (StringUtils.equals(b.getStockStatus(), Constant.STOCK_STATUS.STOCK00.getValue())
+                        && StringUtils.equals(b.getIsEmpty(), Constant.IS_YES.Y.name())) {
+                    locationInfo = b;
+                    availableLocNumber++;
+                    break;
+                }
+            }
+            //没有可分配库位
+            if (locationInfo == null) {
+                throw new ServiceException("当前批次库存有" + invLotLocIdList.size() + "托,不合格区可用库位有"+availableLocNumber+"个");
+            }
+            InvMoveDTO invMoveDTO = new InvMoveDTO(invLotLocId.getLocationId(), String.valueOf(locationInfo.getId()), docQcDTO.getUser());
+            invLotLocIdService.move(invMoveDTO, updateBy);
+        }
+    }
+
+    @Override
+    public List<DocQcDTO> getQcList(String sku) {
+        //1.查出所有状态为60的明细 List<Details>
+        List<BionutritionDocDetailsDTO> docDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOListByLineStatus(Constant.ASN_STS.STS60.getValue());
+        Assert.isTrue(CollUtil.isNotEmpty(docDetailsDTOList), "没有状态为上架的信息");
+        //2. 查出单据 List<Header>
+        List<String> headerIdList = docDetailsDTOList.stream().filter(item->StringUtils.isNotBlank(item.getDocHeaderId()))
+                .map(BionutritionDocDetailsDTO::getDocHeaderId).collect(Collectors.toList());
+        List<BionutritionDocHeaderDTO> docHeaderDTOList = bionutritionDocHeaderService.getBionutritionDocHeaderDTOList(headerIdList);
+        //3. 查出所有绑定这些单据的批次 List<Attr>
+        Assert.isTrue(CollUtil.isNotEmpty(docHeaderDTOList), "对应单头未找到");
+        //key: docId  value: docNo
+        Map<String, String> map = docHeaderDTOList.stream().collect(Collectors.toMap(BionutritionDocHeaderDTO::getId, BionutritionDocHeaderDTO::getDocNo));
+        List<InvLotAtt> invLotAttList = invLotAttService.selectInvLotAttListByHeaderIds(headerIdList);
+        //4. 根据查出来的批次list stream.map(Attr::getLotnum)... 根据这个list获取所有库存
+        Assert.isTrue(CollUtil.isNotEmpty(invLotAttList), " 对应批次未找到");
+        List<String> lotNumList = invLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList());
+        List<InvLotLocId> invLotLocIds = invLotLocIdService.selectInvLotLocIdByLotnumList(lotNumList);
+
+        //对每一个库存: 找到对应的批次 根据批次的lot10 找到对应的明细
+        List<String> lotNumListHasLoc = invLotLocIds.stream().map(InvLotLocId::getLotnum).distinct().collect(Collectors.toList());
+        // 所有状态为60的明细行号
+        List<String> lineNoList = docDetailsDTOList.stream().map(item -> item.getDocLineNo()).collect(Collectors.toList());
+        List<DocQcDTO> docQcDTOList = invLotAttList.stream().filter(item -> CollUtil.contains(lotNumListHasLoc, item.getLotnum()))
+                .filter(item -> CollUtil.contains(lineNoList, item.getLotatt10()))
+                .map(item -> {
+                    DocQcDTO docQcDTO = new DocQcDTO();
+                    docQcDTO.setBatchNumber(item.getLotatt02());
+                    docQcDTO.setSkuCode(item.getSku());
+                    docQcDTO.setDocNo(map.get(item.getLotatt09()));
+                    docQcDTO.setStatus(Constant.ASN_STS.STS60.getValue());
+                    return docQcDTO;
+                }).collect(Collectors.toList());
+//        invLotAttService.selectInvLotAttByLotnum()
+        // 5. 构建质检列表
+        /*List<DocQcDTO> docQcDTOList = docDetailsDTOList.stream().filter().map(item -> {
+            DocQcDTO docQcDTO = new DocQcDTO();
+            docQcDTO.setBatchNumber(item.getOriginalLotNumber());
+            docQcDTO.setSkuCode(item.getSkuCode());
+            docQcDTO.setDocNo(map.get(item.getDocHeaderId()));
+            docQcDTO.setStatus(Constant.ASN_STS.STS60.getValue());
+            return docQcDTO;
+        }).collect(Collectors.toList());invLotAttService.getQcList(sku)
+        */
+        return docQcDTOList;
+    }
+}

+ 29 - 24
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -12,6 +12,7 @@ import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
 import com.ruoyi.ams.config.mapper.AsnSoStrategyMapper;
 import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
 import com.ruoyi.ams.config.service.LocationAllocationStrategy;
+import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotAttService;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
@@ -141,19 +142,17 @@ public class BusinessServiceImpl implements IBusinessService {
                 }
 
                 if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
-                    // 统计入库箱数
-                    List<AgvCallItemDTO> agvCallItemDTOList = agvCallDTO.getAgvCallItemDTOList();
-                    int boxNum = agvCallItemDTOList.size();
-//                    int boxNum = agvCallItemDTOList.stream()
-//                            .mapToInt(v -> v.getQty().intValue())
-//                            .reduce(Integer::sum).getAsInt();
-                    asnSoStrategy.setAsnHeightLimit(boxNum + "");
-                    log.info("统计箱数量:" + boxNum);
 
                     List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
                     List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), "shift_no+ 0,shift_index");
+
                     locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, token);
                     locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, token);
+                    // 初始化库存
+                    // 删除起始点库存
+                    invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
+                    // 添加批次和库存信息
+                    invLotLocIdService.initInv(locationFrom.getId().toString(), agvCallDTO);
                     wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
 
                 } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
@@ -166,6 +165,16 @@ public class BusinessServiceImpl implements IBusinessService {
                     locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token);
                     wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
 
+                } else if (flowConfigHeaderVO.getFlowType().equals("BATCHSO")) {
+                    AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
+                    List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
+                    HashMap<String, String> hashMap = JSON.parseObject(JSON.toJSONString(agvCall.getLotattDTO()), HashMap.class);
+                    List<BaseLocationInfo> locationFromList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdList
+                            , agvCallDTO.getWarehouseId(), hashMap, agvCall.getSku(), "lotatt04 , lotatt06");
+                    locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "SO", asnSoStrategy, token);
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token);
+                    wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
+
                 } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
                     List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
                     List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
@@ -303,8 +312,10 @@ public class BusinessServiceImpl implements IBusinessService {
                     if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
                         continue;
                     }
+                    // 优先分配
+
                     // 第六层不能放数量超过2的货
-                    int boxNum = Integer.parseInt(asnSoStrategy.getAsnHeightLimit());
+                    /*int boxNum = Integer.parseInt(asnSoStrategy.getAsnHeightLimit());
                     if (b.getShiftNo().equals("6")) {
                         if (boxNum > 2) continue;
                     } else {
@@ -313,7 +324,7 @@ public class BusinessServiceImpl implements IBusinessService {
                             log.error("入库箱数量不能超过6!");
                             continue;
                         }
-                    }
+                    }*/
                     if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
                         continue;
                     }
@@ -336,7 +347,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     }
                     // 判断起始库位上的库存质检状态是否可以出库
                     boolean con = invLotLocIdService.verifyInventoryCanOutbound(b.getId().toString());
-                    if (!con) {
+                    if (con) {
                         continue;
                     }
                     locationInfo = b;
@@ -452,20 +463,11 @@ public class BusinessServiceImpl implements IBusinessService {
             wcsTask.setCreateDate(new Date());
             wcsTask.setBusinessType("01");
             wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
+            wcsTask.setExt5(agvCallDTO.getDocNo()+","+agvCallDTO.getDocLineNo()+","+agvCallDTO.getBusinessType()+","+agvCallDTO.getDocType());
+            wcsTask.setCreateUser(agvCallDTO.getCreateUser());
             wcsTask.setExt8(token.toString());
             wcsTask.setExt7(flowConfigHeaderVO.getId().toString());
             wcsTask.setExt6(StringUtils.isNotEmpty(agvCallDTO.getToArea()) ? agvCallDTO.getToArea() : "");
-            // 三向车叉尺方向(货叉朝左1,朝右2,中位或其他0)
-            // 如果起始点是仓储区,左1,右2,我们系统A是靠马路也就是叉尺的右边
-            if (locationFrom.getZoneId() != null
-                    && Objects.equals(locationFrom.getZoneId(), Constant.ZONE_TYPE.STORAGE.getValue())) {
-                wcsTask.setExt4(locationFrom.getRowNo().equals("A") ? "2" : "1");
-            }
-            // 如果起始点是接驳位,默认给1
-            if (locationFrom.getZoneId() != null
-                    && Objects.equals(locationFrom.getZoneId(), Constant.ZONE_TYPE.TRANSIT.getValue())) {
-                wcsTask.setExt4("1");
-            }
             wcsTask.setExtParam(agvCallDTO.getExtParam());
             wcsTaskList.add(wcsTask);
             businessService.addTask(wcsTask);
@@ -519,7 +521,7 @@ public class BusinessServiceImpl implements IBusinessService {
     @Transactional
     @Override
     public AjaxResult addTask(WcsTask wcsTask) {
-        //锁定库位
+        //库位状态设置为占用
         if (!StringUtils.isEmpty(wcsTask.getLocationFrom())) {
             baseLocationInfoService.updateLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Constant.STOCK_STATUS.STOCK10.getValue());
         }
@@ -533,6 +535,7 @@ public class BusinessServiceImpl implements IBusinessService {
                 int current = wcsTaskMapper.selectCurrentPriority();
                 priority = current - 100;
             } else {
+                // 查询当前未下发任务的最小优先级
                 int current = wcsTaskMapper.selectCurrentPriority();
                 priority = current + 10;
             }
@@ -642,6 +645,7 @@ public class BusinessServiceImpl implements IBusinessService {
     @Transactional
     @Override
     public void autoSend() {
+        // 未下发任务根据优先级降序,然后根据创建时间升序
         List<WcsTask> wcsTaskList = wcsTaskService.selectWcsUnallocated(Constant.WAREHOUSE_ID);
         if (wcsTaskList != null && wcsTaskList.size() > 0) {
             for (WcsTask wcsTask : wcsTaskList) {
@@ -657,7 +661,8 @@ public class BusinessServiceImpl implements IBusinessService {
 
                 //转发任务
                 if (StringUtils.isNotEmpty(wcsTask.getTaskType())
-                        && wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
+                        && (wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())
+                        || wcsTask.getTaskType().equals(Constant.TASK_TYPE.MV.getValue()))) {
                     sendTask(wcsTask);
                     wcsTask.setState(10L);
                     wcsTaskService.updateWcsTask(wcsTask);

+ 5 - 0
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallDTO.java

@@ -15,6 +15,11 @@ public class AgvCallDTO {
     private String locationTo;
     private String palletNo;
     private String extParam;
+    private String docNo;
+    private String docLineNo;
+    private String businessType;
+    private String docType;
+    private String createUser;
     private Long warehouseId;
     private String toArea;// 目标区域(货物最终去掉区域)
     private List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();

+ 32 - 0
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/LotattDTO.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ams.config.domain.dto;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -8,17 +9,48 @@ import java.util.Map;
 /**
  * 批次属性业务
  */
+@Data
 public class LotattDTO {
 
+    /**
+     * 客户编码
+     */
     private String lotatt01;
+    /**
+     * 批号: 所有批号匹配根据这个字段
+     */
     private String lotatt02;
+    /**
+     * 生产日期
+     */
     private String lotatt03;
+    /**
+     * 有效期截止日 格式yyyy-mm-dd
+     */
     private String lotatt04;
+    /**
+     * 检验状态
+     */
     private String lotatt05;
+    /**
+     * 入库日期
+     */
     private String lotatt06;
+    /**
+     * 进厂批号
+     */
     private String lotatt07;
+    /**
+     * 生产批号
+     */
     private String lotatt08;
+    /**
+     * 入库单头id
+     */
     private String lotatt09;
+    /**
+     * 明细行号
+     */
     private String lotatt10;
     private String lotatt11;
     private String lotatt12;

+ 186 - 157
warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/InvLotAtt.java

@@ -7,316 +7,345 @@ import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * 批次属性对象 inv_lot_att
- * 
+ *
  * @author andy
  * @date 2022-03-09
  */
-public class InvLotAtt extends BaseEntity
-{
+public class InvLotAtt extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 主键 */
+    /**
+     * 主键
+     */
     private String lotnum;
 
-    /** 货主代码 */
+    /**
+     * 货主代码
+     */
     @Excel(name = "货主代码")
     private String customerId;
 
-    /** 物料编码 */
+    /**
+     * 物料编码
+     */
     @Excel(name = "物料编码")
     private String sku;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt01;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt02;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt03;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt04;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt05;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt06;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt07;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt08;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt09;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt10;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt11;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt12;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt13;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt14;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt15;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt16;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt17;
 
-    /** $column.columnComment */
+    /**
+     * $column.columnComment
+     */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String lotatt18;
 
-    public void setLotnum(String lotnum) 
-    {
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt19;
+
+    public String getLotnum() {
+        return lotnum;
+    }
+
+    public void setLotnum(String lotnum) {
         this.lotnum = lotnum;
     }
 
-    public String getLotnum() 
-    {
-        return lotnum;
+    public String getCustomerId() {
+        return customerId;
     }
-    public void setCustomerId(String customerId) 
-    {
+
+    public void setCustomerId(String customerId) {
         this.customerId = customerId;
     }
 
-    public String getCustomerId() 
-    {
-        return customerId;
+    public String getSku() {
+        return sku;
     }
-    public void setSku(String sku) 
-    {
+
+    public void setSku(String sku) {
         this.sku = sku;
     }
 
-    public String getSku() 
-    {
-        return sku;
+    public String getLotatt01() {
+        return lotatt01;
     }
-    public void setLotatt01(String lotatt01) 
-    {
+
+    public void setLotatt01(String lotatt01) {
         this.lotatt01 = lotatt01;
     }
 
-    public String getLotatt01() 
-    {
-        return lotatt01;
+    public String getLotatt02() {
+        return lotatt02;
     }
-    public void setLotatt02(String lotatt02) 
-    {
+
+    public void setLotatt02(String lotatt02) {
         this.lotatt02 = lotatt02;
     }
 
-    public String getLotatt02() 
-    {
-        return lotatt02;
+    public String getLotatt03() {
+        return lotatt03;
     }
-    public void setLotatt03(String lotatt03) 
-    {
+
+    public void setLotatt03(String lotatt03) {
         this.lotatt03 = lotatt03;
     }
 
-    public String getLotatt03() 
-    {
-        return lotatt03;
+    public String getLotatt04() {
+        return lotatt04;
     }
-    public void setLotatt04(String lotatt04) 
-    {
+
+    public void setLotatt04(String lotatt04) {
         this.lotatt04 = lotatt04;
     }
 
-    public String getLotatt04() 
-    {
-        return lotatt04;
+    public String getLotatt05() {
+        return lotatt05;
     }
-    public void setLotatt05(String lotatt05) 
-    {
+
+    public void setLotatt05(String lotatt05) {
         this.lotatt05 = lotatt05;
     }
 
-    public String getLotatt05() 
-    {
-        return lotatt05;
+    public String getLotatt06() {
+        return lotatt06;
     }
-    public void setLotatt06(String lotatt06) 
-    {
+
+    public void setLotatt06(String lotatt06) {
         this.lotatt06 = lotatt06;
     }
 
-    public String getLotatt06() 
-    {
-        return lotatt06;
+    public String getLotatt07() {
+        return lotatt07;
     }
-    public void setLotatt07(String lotatt07) 
-    {
+
+    public void setLotatt07(String lotatt07) {
         this.lotatt07 = lotatt07;
     }
 
-    public String getLotatt07() 
-    {
-        return lotatt07;
+    public String getLotatt08() {
+        return lotatt08;
     }
-    public void setLotatt08(String lotatt08) 
-    {
+
+    public void setLotatt08(String lotatt08) {
         this.lotatt08 = lotatt08;
     }
 
-    public String getLotatt08() 
-    {
-        return lotatt08;
+    public String getLotatt09() {
+        return lotatt09;
     }
-    public void setLotatt09(String lotatt09) 
-    {
+
+    public void setLotatt09(String lotatt09) {
         this.lotatt09 = lotatt09;
     }
 
-    public String getLotatt09() 
-    {
-        return lotatt09;
+    public String getLotatt10() {
+        return lotatt10;
     }
-    public void setLotatt10(String lotatt10) 
-    {
+
+    public void setLotatt10(String lotatt10) {
         this.lotatt10 = lotatt10;
     }
 
-    public String getLotatt10() 
-    {
-        return lotatt10;
+    public String getLotatt11() {
+        return lotatt11;
     }
-    public void setLotatt11(String lotatt11) 
-    {
+
+    public void setLotatt11(String lotatt11) {
         this.lotatt11 = lotatt11;
     }
 
-    public String getLotatt11() 
-    {
-        return lotatt11;
+    public String getLotatt12() {
+        return lotatt12;
     }
-    public void setLotatt12(String lotatt12) 
-    {
+
+    public void setLotatt12(String lotatt12) {
         this.lotatt12 = lotatt12;
     }
 
-    public String getLotatt12() 
-    {
-        return lotatt12;
+    public String getLotatt13() {
+        return lotatt13;
     }
-    public void setLotatt13(String lotatt13) 
-    {
+
+    public void setLotatt13(String lotatt13) {
         this.lotatt13 = lotatt13;
     }
 
-    public String getLotatt13() 
-    {
-        return lotatt13;
+    public String getLotatt14() {
+        return lotatt14;
     }
-    public void setLotatt14(String lotatt14) 
-    {
+
+    public void setLotatt14(String lotatt14) {
         this.lotatt14 = lotatt14;
     }
 
-    public String getLotatt14() 
-    {
-        return lotatt14;
+    public String getLotatt15() {
+        return lotatt15;
     }
-    public void setLotatt15(String lotatt15) 
-    {
+
+    public void setLotatt15(String lotatt15) {
         this.lotatt15 = lotatt15;
     }
 
-    public String getLotatt15() 
-    {
-        return lotatt15;
+    public String getLotatt16() {
+        return lotatt16;
     }
-    public void setLotatt16(String lotatt16) 
-    {
+
+    public void setLotatt16(String lotatt16) {
         this.lotatt16 = lotatt16;
     }
 
-    public String getLotatt16() 
-    {
-        return lotatt16;
+    public String getLotatt17() {
+        return lotatt17;
     }
-    public void setLotatt17(String lotatt17) 
-    {
+
+    public void setLotatt17(String lotatt17) {
         this.lotatt17 = lotatt17;
     }
 
-    public String getLotatt17() 
-    {
-        return lotatt17;
+    public String getLotatt18() {
+        return lotatt18;
     }
-    public void setLotatt18(String lotatt18) 
-    {
+
+    public void setLotatt18(String lotatt18) {
         this.lotatt18 = lotatt18;
     }
 
-    public String getLotatt18() 
-    {
-        return lotatt18;
+    public String getLotatt19() {
+        return lotatt19;
+    }
+
+    public void setLotatt19(String lotatt19) {
+        this.lotatt19 = lotatt19;
     }
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("lotnum", getLotnum())
-            .append("customerId", getCustomerId())
-            .append("sku", getSku())
-            .append("lotatt01", getLotatt01())
-            .append("lotatt02", getLotatt02())
-            .append("lotatt03", getLotatt03())
-            .append("lotatt04", getLotatt04())
-            .append("lotatt05", getLotatt05())
-            .append("lotatt06", getLotatt06())
-            .append("lotatt07", getLotatt07())
-            .append("lotatt08", getLotatt08())
-            .append("lotatt09", getLotatt09())
-            .append("lotatt10", getLotatt10())
-            .append("lotatt11", getLotatt11())
-            .append("lotatt12", getLotatt12())
-            .append("lotatt13", getLotatt13())
-            .append("lotatt14", getLotatt14())
-            .append("lotatt15", getLotatt15())
-            .append("lotatt16", getLotatt16())
-            .append("lotatt17", getLotatt17())
-            .append("lotatt18", getLotatt18())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
+        return "InvLotAtt{" +
+                "lotnum='" + lotnum + '\'' +
+                ", customerId='" + customerId + '\'' +
+                ", sku='" + sku + '\'' +
+                ", lotatt01='" + lotatt01 + '\'' +
+                ", lotatt02='" + lotatt02 + '\'' +
+                ", lotatt03='" + lotatt03 + '\'' +
+                ", lotatt04='" + lotatt04 + '\'' +
+                ", lotatt05='" + lotatt05 + '\'' +
+                ", lotatt06='" + lotatt06 + '\'' +
+                ", lotatt07='" + lotatt07 + '\'' +
+                ", lotatt08='" + lotatt08 + '\'' +
+                ", lotatt09='" + lotatt09 + '\'' +
+                ", lotatt10='" + lotatt10 + '\'' +
+                ", lotatt11='" + lotatt11 + '\'' +
+                ", lotatt12='" + lotatt12 + '\'' +
+                ", lotatt13='" + lotatt13 + '\'' +
+                ", lotatt14='" + lotatt14 + '\'' +
+                ", lotatt15='" + lotatt15 + '\'' +
+                ", lotatt16='" + lotatt16 + '\'' +
+                ", lotatt17='" + lotatt17 + '\'' +
+                ", lotatt18='" + lotatt18 + '\'' +
+                ", lotatt19='" + lotatt19 + '\'' +
+                '}';
     }
 }

+ 9 - 162
warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/InvLotLocId.java

@@ -1,6 +1,8 @@
 package com.ruoyi.ams.inv.domain;
 
 import java.math.BigDecimal;
+
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
@@ -8,10 +10,11 @@ import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * 库位库存信息对象 inv_lot_loc_id
- * 
+ *
  * @author andy
  * @date 2022-03-03
  */
+@Data
 public class InvLotLocId extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -52,6 +55,11 @@ public class InvLotLocId extends BaseEntity
     @Excel(name = "上架数量")
     private BigDecimal qtypa;
 
+    /**
+     * 是否过期
+     */
+    private String isExpire;
+
     /** $column.columnComment */
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private BigDecimal qtyrpin;
@@ -72,165 +80,4 @@ public class InvLotLocId extends BaseEntity
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private BigDecimal qtyonhold;
 
-    public void setLotnum(String lotnum) 
-    {
-        this.lotnum = lotnum;
-    }
-
-    public String getLotnum() 
-    {
-        return lotnum;
-    }
-    public void setLocationId(String locationId) 
-    {
-        this.locationId = locationId;
-    }
-
-    public String getLocationId() 
-    {
-        return locationId;
-    }
-    public void setTraceid(String traceid) 
-    {
-        this.traceid = traceid;
-    }
-
-    public String getTraceid() 
-    {
-        return traceid;
-    }
-    public void setCustomerId(String customerId) 
-    {
-        this.customerId = customerId;
-    }
-
-    public String getCustomerId() 
-    {
-        return customerId;
-    }
-    public void setSku(String sku) 
-    {
-        this.sku = sku;
-    }
-
-    public String getSku() 
-    {
-        return sku;
-    }
-    public void setQty(BigDecimal qty) 
-    {
-        this.qty = qty;
-    }
-
-    public BigDecimal getQty() 
-    {
-        return qty;
-    }
-    public void setQtyEach(BigDecimal qtyEach) 
-    {
-        this.qtyEach = qtyEach;
-    }
-
-    public BigDecimal getQtyEach() 
-    {
-        return qtyEach;
-    }
-    public void setQtyallocated(BigDecimal qtyallocated) 
-    {
-        this.qtyallocated = qtyallocated;
-    }
-
-    public BigDecimal getQtyallocated() 
-    {
-        return qtyallocated;
-    }
-    public void setQtyallocatedEach(BigDecimal qtyallocatedEach) 
-    {
-        this.qtyallocatedEach = qtyallocatedEach;
-    }
-
-    public BigDecimal getQtyallocatedEach() 
-    {
-        return qtyallocatedEach;
-    }
-    public void setQtypa(BigDecimal qtypa) 
-    {
-        this.qtypa = qtypa;
-    }
-
-    public BigDecimal getQtypa() 
-    {
-        return qtypa;
-    }
-    public void setQtyrpin(BigDecimal qtyrpin) 
-    {
-        this.qtyrpin = qtyrpin;
-    }
-
-    public BigDecimal getQtyrpin() 
-    {
-        return qtyrpin;
-    }
-    public void setQtyrpout(BigDecimal qtyrpout) 
-    {
-        this.qtyrpout = qtyrpout;
-    }
-
-    public BigDecimal getQtyrpout() 
-    {
-        return qtyrpout;
-    }
-    public void setQtymvin(BigDecimal qtymvin) 
-    {
-        this.qtymvin = qtymvin;
-    }
-
-    public BigDecimal getQtymvin() 
-    {
-        return qtymvin;
-    }
-    public void setQtymvout(BigDecimal qtymvout) 
-    {
-        this.qtymvout = qtymvout;
-    }
-
-    public BigDecimal getQtymvout() 
-    {
-        return qtymvout;
-    }
-    public void setQtyonhold(BigDecimal qtyonhold) 
-    {
-        this.qtyonhold = qtyonhold;
-    }
-
-    public BigDecimal getQtyonhold() 
-    {
-        return qtyonhold;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("lotnum", getLotnum())
-            .append("locationId", getLocationId())
-            .append("traceid", getTraceid())
-            .append("customerId", getCustomerId())
-            .append("sku", getSku())
-            .append("qty", getQty())
-            .append("qtyEach", getQtyEach())
-            .append("qtyallocated", getQtyallocated())
-            .append("qtyallocatedEach", getQtyallocatedEach())
-            .append("qtypa", getQtypa())
-            .append("qtyrpin", getQtyrpin())
-            .append("qtyrpout", getQtyrpout())
-            .append("qtymvin", getQtymvin())
-            .append("qtymvout", getQtymvout())
-            .append("qtyonhold", getQtyonhold())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
-    }
 }

+ 8 - 56
warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/form/InvLocIdSearchFrom.java

@@ -1,12 +1,15 @@
 package com.ruoyi.ams.inv.domain.form;
 
 import com.ruoyi.ams.config.domain.dto.LotattDTO;
+import com.ruoyi.base.constant.Constant;
+import lombok.Data;
 
 /**
  * Created by IntelliJ IDEA.
  * User: andy.qu
  * Date: 2022/3/14
  */
+@Data
 public class InvLocIdSearchFrom {
     private String sku;
     private String zoneId;
@@ -15,60 +18,9 @@ public class InvLocIdSearchFrom {
     private LotattDTO lotattDTO;
     private String palletNo;
     private String qualityStatus;
-
-    public String getSku() {
-        return sku;
-    }
-
-    public void setSku(String sku) {
-        this.sku = sku;
-    }
-
-    public String getZoneId() {
-        return zoneId;
-    }
-
-    public void setZoneId(String zoneId) {
-        this.zoneId = zoneId;
-    }
-
-    public String getLocationNo() {
-        return locationNo;
-    }
-
-    public void setLocationNo(String locationNo) {
-        this.locationNo = locationNo;
-    }
-
-    public String getIsFull() {
-        return isFull;
-    }
-
-    public void setIsFull(String isFull) {
-        this.isFull = isFull;
-    }
-
-    public LotattDTO getLotattDTO() {
-        return lotattDTO;
-    }
-
-    public void setLotattDTO(LotattDTO lotattDTO) {
-        this.lotattDTO = lotattDTO;
-    }
-
-    public String getPalletNo() {
-        return palletNo;
-    }
-
-    public void setPalletNo(String palletNo) {
-        this.palletNo = palletNo;
-    }
-
-    public String getQualityStatus() {
-        return qualityStatus;
-    }
-
-    public void setQualityStatus(String qualityStatus) {
-        this.qualityStatus = qualityStatus;
-    }
+    /**
+     * 是否过期 EXPIRED-过期;UNEXPIRED-未过期;WITHIN_THIRTY_DAYS-三十天内过期
+     * {@link Constant.EXPIRE_STATUS}
+     */
+    private String isExpire;
 }

+ 4 - 247
warewms-ams/src/main/java/com/ruoyi/ams/inv/domain/vo/InvLotLocIdLotattVO.java

@@ -1,10 +1,13 @@
 package com.ruoyi.ams.inv.domain.vo;
 
+import lombok.Data;
+
 /**
  * Created by IntelliJ IDEA.
  * User: andy.qu
  * Date: 2022/3/14
  */
+@Data
 public class InvLotLocIdLotattVO {
     private Long locationId;
     private String lotnum;
@@ -19,6 +22,7 @@ public class InvLotLocIdLotattVO {
     private Double weight;
     private String palletNo;
     private String isFull;
+    private String isExpire;
     private String lotatt01;
     private String lotatt02;
     private String lotatt03;
@@ -38,251 +42,4 @@ public class InvLotLocIdLotattVO {
     private String lotatt17;
     private String lotatt18;
 
-    public String getLotatt01() {
-        return lotatt01;
-    }
-
-    public void setLotatt01(String lotatt01) {
-        this.lotatt01 = lotatt01;
-    }
-
-    public String getLotatt02() {
-        return lotatt02;
-    }
-
-    public void setLotatt02(String lotatt02) {
-        this.lotatt02 = lotatt02;
-    }
-
-    public String getLotatt03() {
-        return lotatt03;
-    }
-
-    public void setLotatt03(String lotatt03) {
-        this.lotatt03 = lotatt03;
-    }
-
-    public String getLotatt04() {
-        return lotatt04;
-    }
-
-    public void setLotatt04(String lotatt04) {
-        this.lotatt04 = lotatt04;
-    }
-
-    public String getLotatt05() {
-        return lotatt05;
-    }
-
-    public void setLotatt05(String lotatt05) {
-        this.lotatt05 = lotatt05;
-    }
-
-    public String getLotatt06() {
-        return lotatt06;
-    }
-
-    public void setLotatt06(String lotatt06) {
-        this.lotatt06 = lotatt06;
-    }
-
-    public String getLotatt07() {
-        return lotatt07;
-    }
-
-    public void setLotatt07(String lotatt07) {
-        this.lotatt07 = lotatt07;
-    }
-
-    public String getLotatt08() {
-        return lotatt08;
-    }
-
-    public void setLotatt08(String lotatt08) {
-        this.lotatt08 = lotatt08;
-    }
-
-    public String getLotatt09() {
-        return lotatt09;
-    }
-
-    public void setLotatt09(String lotatt09) {
-        this.lotatt09 = lotatt09;
-    }
-
-    public String getLotatt10() {
-        return lotatt10;
-    }
-
-    public void setLotatt10(String lotatt10) {
-        this.lotatt10 = lotatt10;
-    }
-
-    public String getLotatt11() {
-        return lotatt11;
-    }
-
-    public void setLotatt11(String lotatt11) {
-        this.lotatt11 = lotatt11;
-    }
-
-    public String getLotatt12() {
-        return lotatt12;
-    }
-
-    public void setLotatt12(String lotatt12) {
-        this.lotatt12 = lotatt12;
-    }
-
-    public String getLotatt13() {
-        return lotatt13;
-    }
-
-    public void setLotatt13(String lotatt13) {
-        this.lotatt13 = lotatt13;
-    }
-
-    public String getLotatt14() {
-        return lotatt14;
-    }
-
-    public void setLotatt14(String lotatt14) {
-        this.lotatt14 = lotatt14;
-    }
-
-    public String getLotatt15() {
-        return lotatt15;
-    }
-
-    public void setLotatt15(String lotatt15) {
-        this.lotatt15 = lotatt15;
-    }
-
-    public String getLotatt16() {
-        return lotatt16;
-    }
-
-    public void setLotatt16(String lotatt16) {
-        this.lotatt16 = lotatt16;
-    }
-
-    public String getLotatt17() {
-        return lotatt17;
-    }
-
-    public void setLotatt17(String lotatt17) {
-        this.lotatt17 = lotatt17;
-    }
-
-    public String getLotatt18() {
-        return lotatt18;
-    }
-
-    public void setLotatt18(String lotatt18) {
-        this.lotatt18 = lotatt18;
-    }
-
-    public String getLotnum() {
-        return lotnum;
-    }
-
-    public void setLotnum(String lotnum) {
-        this.lotnum = lotnum;
-    }
-
-    public String getCustomerId() {
-        return customerId;
-    }
-
-    public void setCustomerId(String customerId) {
-        this.customerId = customerId;
-    }
-
-    public String getSku() {
-        return sku;
-    }
-
-    public void setSku(String sku) {
-        this.sku = sku;
-    }
-
-    public String getLocationNo() {
-        return locationNo;
-    }
-
-    public void setLocationNo(String locationNo) {
-        this.locationNo = locationNo;
-    }
-
-    public Double getQty() {
-        return qty;
-    }
-
-    public void setQty(Double qty) {
-        this.qty = qty;
-    }
-
-    public Double getQtyallocated() {
-        return qtyallocated;
-    }
-
-    public void setQtyallocated(Double qtyallocated) {
-        this.qtyallocated = qtyallocated;
-    }
-
-    public Long getLocationId() {
-        return locationId;
-    }
-
-    public void setLocationId(Long locationId) {
-        this.locationId = locationId;
-    }
-
-    public String getSkuName() {
-        return skuName;
-    }
-
-    public void setSkuName(String skuName) {
-        this.skuName = skuName;
-    }
-
-    public String getSkuTypeName() {
-        return skuTypeName;
-    }
-
-    public void setSkuTypeName(String skuTypeName) {
-        this.skuTypeName = skuTypeName;
-    }
-
-    public String getPalletNo() {
-        return palletNo;
-    }
-
-    public void setPalletNo(String palletNo) {
-        this.palletNo = palletNo;
-    }
-
-    public String getIsFull() {
-        return isFull;
-    }
-
-    public void setIsFull(String isFull) {
-        this.isFull = isFull;
-    }
-
-    public String getZoneName() {
-        return zoneName;
-    }
-
-    public void setZoneName(String zoneName) {
-        this.zoneName = zoneName;
-    }
-
-    public Double getWeight() {
-        return weight;
-    }
-
-    public void setWeight(Double weight) {
-        this.weight = weight;
-    }
 }

+ 27 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvMoveDTO.java

@@ -0,0 +1,27 @@
+package com.ruoyi.ams.inv.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class InvMoveDTO implements Serializable {
+
+    private static final long serialVersionUID = 6430246122918220656L;
+
+    /**
+     * 起始点
+     */
+    private String sourceLocationId;
+
+    /**
+     * 目标点
+     */
+    private String targetLocationId;
+
+    private String user;
+}

+ 26 - 10
warewms-ams/src/main/java/com/ruoyi/ams/inv/mapper/InvLotAttMapper.java

@@ -1,7 +1,10 @@
 package com.ruoyi.ams.inv.mapper;
 
 import java.util.List;
+
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
 import com.ruoyi.ams.inv.domain.InvLotAtt;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 批次属性Mapper接口
@@ -9,15 +12,14 @@ import com.ruoyi.ams.inv.domain.InvLotAtt;
  * @author andy
  * @date 2022-03-09
  */
-public interface InvLotAttMapper
-{
+public interface InvLotAttMapper {
     /**
      * 查询批次属性
      *
      * @param lotnum 批次属性主键
      * @return 批次属性
      */
-     InvLotAtt selectInvLotAttByLotnum(String lotnum);
+    InvLotAtt selectInvLotAttByLotnum(String lotnum);
 
     /**
      * 查询批次属性列表
@@ -25,7 +27,7 @@ public interface InvLotAttMapper
      * @param invLotAtt 批次属性
      * @return 批次属性集合
      */
-     List<InvLotAtt> selectInvLotAttList(InvLotAtt invLotAtt);
+    List<InvLotAtt> selectInvLotAttList(InvLotAtt invLotAtt);
 
     /**
      * 新增批次属性
@@ -33,7 +35,7 @@ public interface InvLotAttMapper
      * @param invLotAtt 批次属性
      * @return 结果
      */
-     int insertInvLotAtt(InvLotAtt invLotAtt);
+    int insertInvLotAtt(InvLotAtt invLotAtt);
 
     /**
      * 修改批次属性
@@ -41,7 +43,7 @@ public interface InvLotAttMapper
      * @param invLotAtt 批次属性
      * @return 结果
      */
-     int updateInvLotAtt(InvLotAtt invLotAtt);
+    int updateInvLotAtt(InvLotAtt invLotAtt);
 
     /**
      * 删除批次属性
@@ -49,15 +51,15 @@ public interface InvLotAttMapper
      * @param lotnum 批次属性主键
      * @return 结果
      */
-     int deleteInvLotAttByLotnum(String lotnum);
+    int deleteInvLotAttByLotnum(String lotnum);
 
-     /**
+    /**
      * 删除批次属性
      *
      * @param locationId
      * @return 结果
      */
-     int deleteInvLotAttBylocationId(Long locationId);
+    int deleteInvLotAttBylocationId(Long locationId);
 
     /**
      * 批量删除批次属性
@@ -65,5 +67,19 @@ public interface InvLotAttMapper
      * @param lotnums 需要删除的数据主键集合
      * @return 结果
      */
-     int deleteInvLotAttByLotnums(String[] lotnums);
+    int deleteInvLotAttByLotnums(String[] lotnums);
+
+    /**
+     * 根据物料编码和批号查询批次信息
+     * @param sku
+     * @param batchNumber
+     * @return
+     */
+    List<InvLotAtt> selectInvLotAttBySkuAndBatchNumber(@Param("sku") String sku, @Param("batchNumber") String batchNumber);
+
+    List<DocQcDTO> getQcList(@Param("sku") String sku);
+
+    InvLotAtt selectInvLotAttByLotatt19(String lotatt19);
+
+    List<InvLotAtt> selectInvLotAttListByHeaderIds(List<String> headerIds);
 }

+ 11 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/mapper/InvLotLocIdMapper.java

@@ -315,4 +315,15 @@ public interface InvLotLocIdMapper {
      */
     int updateAllocationBy(@Param("lotnum") String lotnum, @Param("locationId") Long locationId, @Param("qty") BigDecimal qty);
 
+    /**
+     * 修改批次号
+     * @param lotnum
+     * @param lotNumNew
+     * @return
+     */
+    int updateInvLotLocIdByLotNum(@Param("lotnum")String lotnum, @Param("lotNumNew")String lotNumNew);
+
+    InvLotLocId selectInvLotLocIdByTraceIdAndLocationId(@Param("locationTo")String locationTo, @Param("taskNo")String taskNo);
+
+    List<InvLotLocId> selectInvLotLocIdByLotnumList(List<String> lotNumList);
 }

+ 31 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotAttService.java

@@ -2,6 +2,7 @@ package com.ruoyi.ams.inv.service;
 
 import java.util.List;
 
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
 import com.ruoyi.ams.inv.domain.InvLotAtt;
 
 /**
@@ -66,4 +67,34 @@ public interface IInvLotAttService {
      * @return
      */
     int deleteInvLotAttBylocationId(Long locationId);
+
+    /**
+     * 根据产品批号和物料编码匹配批次
+     * @param batchNumber
+     * @param sku
+     * @return
+     */
+    List<InvLotAtt> selectInvLotAttByBatchNum(String batchNumber, String sku);
+
+    /**
+     * 添加批次信息
+     * @param invLotAtt
+     * @return
+     */
+    int insertInvLotAtt(InvLotAtt invLotAtt);
+
+    /**
+     * 获取质检列表
+     * @return
+     */
+    List<DocQcDTO> getQcList(String sku);
+
+    /**
+     * 根据lotatt19获取批次信息
+     * @param lotatt19
+     * @return
+     */
+    InvLotAtt selectInvLotAttByLotatt19(String lotatt19);
+
+    List<InvLotAtt> selectInvLotAttListByHeaderIds(List<String> headerIds);
 }

+ 32 - 1
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotLocIdService.java

@@ -13,6 +13,7 @@ import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
+import com.ruoyi.ams.inv.dto.InvMoveDTO;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.vo.BaseLocationLotattVO;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -33,6 +34,14 @@ public interface IInvLotLocIdService {
      */
     List<InvLotLocId> selectInvLotLocIdByLotnum(String lotnum);
 
+    /**
+     * 查询库位库存信息
+     *
+     * @param lotNumList 批次号列表
+     * @return 库位库存信息
+     */
+    List<InvLotLocId> selectInvLotLocIdByLotnumList(List<String> lotNumList);
+
     /**
      * 根据主键查询
      *
@@ -88,7 +97,7 @@ public interface IInvLotLocIdService {
      *
      * @return
      */
-    AjaxResult move(InvLotLocIdMoveForm invLotLocIdMoveForm);
+    AjaxResult move(InvMoveDTO invMoveDTO, String updateBy);
 
 
     /**
@@ -183,6 +192,12 @@ public interface IInvLotLocIdService {
      */
     String initInv(String locationId, AgvCallDTO agvCallDTO);
 
+    /**
+     * 构建lotatt19属性
+     * @param lotattDTO
+     * @return
+     */
+    String buildLotatt19(LotattDTO lotattDTO);
     /**
      * 根据库位id查询库位库存包含批次属性
      *
@@ -282,4 +297,20 @@ public interface IInvLotLocIdService {
      * @return true 代表质检没有问题,可以出库
      */
     boolean verifyInventoryCanOutbound(String locationId);
+
+    int updateInvLotLocIdByLotNum(String lotnum, String lotNumNew);
+
+    /**
+     * 查询是否有过期库存
+     * @return
+     */
+    String getInvLocIfExpire();
+
+    /**
+     * 根据任务号和库位id查询库存
+     * @param locationTo
+     * @param taskNo
+     * @return
+     */
+    InvLotLocId selectInvLotLocIdByTraceIdAndLocationId(String locationTo, String taskNo);
 }

+ 27 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotAttServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.ams.inv.service.impl;
 
 import java.util.List;
 
+import com.ruoyi.ams.bionutrition.dto.DocQcDTO;
 import com.ruoyi.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -96,4 +97,30 @@ public class InvLotAttServiceImpl implements IInvLotAttService {
     public int deleteInvLotAttBylocationId(Long locationId) {
         return invLotAttMapper.deleteInvLotAttBylocationId(locationId);
     }
+
+    @Override
+    public List<InvLotAtt> selectInvLotAttByBatchNum(String batchNumber, String sku) {
+        return invLotAttMapper.selectInvLotAttBySkuAndBatchNumber(sku, batchNumber);
+    }
+
+    @Override
+    public int insertInvLotAtt(InvLotAtt invLotAtt) {
+        return invLotAttMapper.insertInvLotAtt(invLotAtt);
+    }
+
+    @Override
+    public List<DocQcDTO> getQcList(String sku) {
+        return invLotAttMapper.getQcList(sku);
+    }
+
+    @Override
+    public InvLotAtt selectInvLotAttByLotatt19(String lotatt19) {
+        return invLotAttMapper.selectInvLotAttByLotatt19(lotatt19);
+    }
+
+    @Override
+    public List<InvLotAtt> selectInvLotAttListByHeaderIds(List<String> headerIds) {
+        return invLotAttMapper.selectInvLotAttListByHeaderIds(headerIds);
+    }
+
 }

+ 141 - 29
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java

@@ -1,5 +1,12 @@
 package com.ruoyi.ams.inv.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.ruoyi.ams.box.domain.WmsBoxInfo;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.business.IBusinessService;
@@ -12,6 +19,7 @@ import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
+import com.ruoyi.ams.inv.dto.InvMoveDTO;
 import com.ruoyi.ams.inv.mapper.InvLotAttMapper;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
@@ -23,18 +31,21 @@ import com.ruoyi.base.utils.IdSequenceUtils;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.ConvertUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 库位库存信息Service业务层处理
@@ -74,6 +85,11 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return invLotLocIdMapper.selectInvLotLocIdByLotnum(lotnum);
     }
 
+    @Override
+    public List<InvLotLocId> selectInvLotLocIdByLotnumList(List<String> lotNumList) {
+        return invLotLocIdMapper.selectInvLotLocIdByLotnumList(lotNumList);
+    }
+
     @Override
     public InvLotLocId selectInvLotLocIdById(String locationId, String customerId, String sku, String lotnum) {
         InvLotLocId invLotLocId = new InvLotLocId();
@@ -118,6 +134,34 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return invLotLocIdMapper.selectInvLocIdLotattList(invLocIdSearchFrom);
     }
 
+    /**
+     * 定时更新库存过期状态
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    private void refreshExpireStatus() {
+        List<InvLotLocIdLotattVO> invLotLocIdLotattVOS = invLotLocIdMapper.selectInvLocIdLotattList(new InvLocIdSearchFrom());
+        String msg = null;
+        invLotLocIdLotattVOS.stream().forEach(item -> {
+            log.info("库位{}上的库存过期状态为{}", item.getLocationId(), item.getIsExpire());
+            DateTime shelfLife = DateUtil.parse(item.getLotatt04());// 有效期截止日 格式给为yyyy-mm-dd
+            DateTime now = DateUtil.date();
+            long validityDay = DateUtil.between(now, shelfLife, DateUnit.DAY,false);
+            // 有效期大于30天
+            if (validityDay > 30) {
+                item.setIsExpire(Constant.EXPIRE_STATUS.UNEXPIRED.getValue());
+            } else if (validityDay < 30 && validityDay > 1) { // 有效期在30天以内
+                item.setIsExpire(Constant.EXPIRE_STATUS.WITHIN_THIRTY_DAYS.getValue());
+            } else { // 已过期
+                item.setIsExpire(Constant.EXPIRE_STATUS.EXPIRED.getValue());
+            }
+            InvLotLocId invLotLocId = new InvLotLocId();
+            invLotLocId.setLocationId(String.valueOf(item.getLocationId()));
+            BeanUtils.copyProperties(item, invLotLocId);
+            invLotLocIdMapper.updateInvLotLocId(invLotLocId);
+            log.info("修改库位{}上的库存过期状态为{}", item.getLocationId(), item.getIsExpire());
+        });
+    }
+
     /**
      * 查询库位库存信息
      *
@@ -182,15 +226,20 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
     /**
      * 库存移动
      *
-     * @param invLotLocIdMoveForm
+     * @param invMoveDTO
      * @return
      */
     @Override
-    public AjaxResult move(InvLotLocIdMoveForm invLotLocIdMoveForm) {
+    public AjaxResult move(InvMoveDTO invMoveDTO, String updateBy) {
+
+        Boolean isEmpty = StringUtils.isEmpty(invMoveDTO.getSourceLocationId()) || StringUtils.isEmpty(invMoveDTO.getTargetLocationId());
+        Assert.isFalse(isEmpty, "起始点或者终点不能为空");
+        Assert.isFalse(StringUtils.equals(invMoveDTO.getSourceLocationId(), invMoveDTO.getTargetLocationId()), "起始点和终点点位不能相同");
+        InvLotLocIdMoveForm invLotLocIdMoveForm = buildInvLotLocIdMoveForm(invMoveDTO.getSourceLocationId(), invMoveDTO.getTargetLocationId(), updateBy);
+
         String locationFrom = invLotLocIdMoveForm.getLocationFrom();
         String locationTo = invLotLocIdMoveForm.getLocationTo();
         String reason = invLotLocIdMoveForm.getReason();
-        String updateBy = invLotLocIdMoveForm.getUpdateBy();
         Long warehouseId = invLotLocIdMoveForm.getWarehouseId();
         BaseLocationInfo baseLocationFrom = null;
         BaseLocationInfo baseLocationTo = null;
@@ -209,12 +258,14 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         if (isInStock) {
             return AjaxResult.error("目标库位有货!");
         }
+
+
         // 起始和目标库位
         baseLocationFrom = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, warehouseId);
         baseLocationTo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, warehouseId);
 
         // 下发移库任务
-        String taskNo = System.currentTimeMillis() + "";
+        String taskNo = String.valueOf(System.currentTimeMillis());
         WcsTask wcsTask = new WcsTask();
         wcsTask.setTaskNo(taskNo);
         if (locationFrom != null) {
@@ -228,21 +279,13 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         wcsTask.setState(9L);
         wcsTask.setPriority(1L);
         wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
+
         wcsTask.setCreateDate(new Date());
+        wcsTask.setCreateUser(invMoveDTO.getUser());
         wcsTask.setBusinessType("01");
-        wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
-        wcsTask.setExt8("");
-        // 三向车叉尺方向(货叉朝左1,朝右2,中位或其他0)
-        // 如果起始点是仓储区,左1,右2,我们系统A是靠马路也就是叉尺的右边
-        if (baseLocationFrom.getZoneId() != null
-                && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.STORAGE.getValue())) {
-            wcsTask.setExt4(baseLocationFrom.getRowNo().equals("A") ? "2" : "1");
-        }
-        // 如果起始点是接驳位,默认给1
-        if (baseLocationFrom.getZoneId() != null
-                && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.TRANSIT.getValue())) {
-            wcsTask.setExt4("1");
-        }
+        // 设置为移库任务类型
+        wcsTask.setTaskType(Constant.TASK_TYPE.MV.getValue());
+
         iBusinessService.addTask(wcsTask);
 
         // 锁定起始和目标库位任务状态
@@ -252,6 +295,24 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return AjaxResult.success("执行成功");
     }
 
+    /**
+     * 构建库存库位移动对象
+     *
+     * @param sourceLocationId
+     * @param targetLocationId
+     * @param updateBy
+     * @return
+     */
+    public InvLotLocIdMoveForm buildInvLotLocIdMoveForm(String sourceLocationId, String targetLocationId, String updateBy) {
+        InvLotLocIdMoveForm invLotLocIdMoveForm = new InvLotLocIdMoveForm();
+        invLotLocIdMoveForm.setLocationFrom(sourceLocationId);
+        invLotLocIdMoveForm.setLocationTo(targetLocationId);
+        invLotLocIdMoveForm.setUpdateBy(updateBy);
+        invLotLocIdMoveForm.setWarehouseId(Constant.WAREHOUSE_ID);
+        invLotLocIdMoveForm.setIsCallCar(Constant.IS_YES.Y.getValue());
+        return invLotLocIdMoveForm;
+    }
+
     @Override
     public AjaxResult moveDirect(InvLotLocIdMoveForm invLotLocIdMoveForm) {
         String locationFrom = invLotLocIdMoveForm.getLocationFrom();
@@ -319,9 +380,12 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         moveForm.setReason(reason);
         moveForm.setWarehouseId(warehouseId);
         moveForm.setUpdateBy(updateBy);
+        InvMoveDTO invMoveDTO = new InvMoveDTO();
+        invMoveDTO.setSourceLocationId(locationFrom);
+        invMoveDTO.setTargetLocationId(locationTo);
         // 是否叫车
         if (callCar) {
-            return this.move(moveForm);
+            return this.move(invMoveDTO, updateBy);
         }
         return this.moveDirect(moveForm);
     }
@@ -486,15 +550,23 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
             String sku = agvCallItemDTO.getSku();
             Double qty = agvCallItemDTO.getQty() == null ? 1D : agvCallItemDTO.getQty();
             // 批次表
-            String lotnum = idSequenceUtils.generateId("LOTNUMBER");
+            String lotnum = IdWorker.getIdStr();
             LotattDTO lotattDTO = agvCallItemDTO.getLotattDTO();
             InvLotAtt invLotAtt = new InvLotAtt();
-            BeanUtils.copyProperties(lotattDTO, invLotAtt);
-            invLotAtt.setCustomerId(customerId);
-            invLotAtt.setSku(sku);
-            invLotAtt.setLotnum(lotnum);
-            invLotAtt.setCreateTime(DateUtils.getNowDate());
-            invLotAttMapper.insertInvLotAtt(invLotAtt);
+            // 判断是否存在相同批次的数据
+            String lotatt19 = this.buildLotatt19(lotattDTO);
+            InvLotAtt invLotAttSame = invLotAttMapper.selectInvLotAttByLotatt19(lotatt19);
+            if (ObjectUtil.isEmpty(invLotAttSame)){ // 没有相同批次的数据,就添加批次信息;否则只添加库存
+                BeanUtils.copyProperties(lotattDTO, invLotAtt);
+                invLotAtt.setCustomerId(customerId);
+                invLotAtt.setSku(sku);
+                invLotAtt.setLotnum(lotnum);
+                invLotAtt.setLotatt19(lotatt19);
+                invLotAtt.setCreateTime(DateUtils.getNowDate());
+                invLotAttMapper.insertInvLotAtt(invLotAtt);
+            }else {
+                lotnum = invLotAttSame.getLotnum();
+            }
             // 库存表
             InvLotLocId invLotLocId = new InvLotLocId();
             invLotLocId.setLotnum(lotnum);
@@ -507,6 +579,7 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
             invLotLocId.setQtyallocatedEach(BigDecimal.ZERO);
             invLotLocId.setQtypa(BigDecimal.ZERO);
             invLotLocId.setQtyrpin(BigDecimal.ZERO);
+            invLotLocId.setIsExpire(Constant.EXPIRE_STATUS.UNEXPIRED.getValue());
             invLotLocId.setCreateTime(new Date());
             invLotLocIdMapper.insertInvLotLocId(invLotLocId);
         }
@@ -517,6 +590,18 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return "";
     }
 
+    /**
+     * 构建lotatt19
+     * @param lotattDTO
+     */
+    public String buildLotatt19(LotattDTO lotattDTO) {
+        // 拼接lotatt01-lotatt18批次属性,存在相同的批次数据,就不添加
+        Map<String, Object> lotattMap = BeanUtil.beanToMap(lotattDTO);
+        Collection<Object> values = lotattMap.values();
+        String lotatt19 = values.stream().map(String::valueOf).collect(Collectors.joining(","));
+        return lotatt19;
+    }
+
     @Override
     public List<InvLotLocIdLotattVO> selectInvLocIdLotattByLocationId(Long locationId) {
         return invLotLocIdMapper.selectInvLocIdLotattByLocationId(locationId);
@@ -667,6 +752,33 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         InvLocIdSearchFrom invLocIdSearchFrom = new InvLocIdSearchFrom();
         invLocIdSearchFrom.setLocationNo(locationNo);
         List<InvLotLocIdLotattVO> lotattVOList = selectInvLocIdLotattList(invLocIdSearchFrom);
-        return lotattVOList.stream().allMatch(v -> !v.getLotatt05().equals("DJ"));
+        // 过滤掉已经过期的
+        lotattVOList = lotattVOList.stream().filter(
+                item->!StringUtils.equals(item.getIsExpire(), Constant.EXPIRE_STATUS.EXPIRED.getValue()))
+                .collect(Collectors.toList());
+        return lotattVOList.stream().allMatch(v -> !v.getLotatt05().equals("FX"));// 是否所有库存都不是放行状态
+    }
+
+    @Override
+    public int updateInvLotLocIdByLotNum(String lotnum, String lotNumNew) {
+        return invLotLocIdMapper.updateInvLotLocIdByLotNum(lotnum, lotNumNew);
+    }
+
+    /**
+     * 查询是否有过期的库存信息
+     *
+     * @return
+     */
+    @Override
+    public String getInvLocIfExpire() {
+        InvLocIdSearchFrom invLocIdSearchFrom = new InvLocIdSearchFrom();
+        invLocIdSearchFrom.setIsExpire("Y");
+        List<InvLotLocIdLotattVO> invLotLocIdLotattVOS = invLotLocIdMapper.selectInvLocIdLotattList(invLocIdSearchFrom);
+        return invLotLocIdLotattVOS.size() > 0 ? "存在即将过期的库存" : StringUtils.EMPTY;
+    }
+
+    @Override
+    public InvLotLocId selectInvLotLocIdByTraceIdAndLocationId(String locationTo, String taskNo) {
+        return invLotLocIdMapper.selectInvLotLocIdByTraceIdAndLocationId(locationTo, taskNo);
     }
 }

+ 3 - 1
warewms-ams/src/main/java/com/ruoyi/ams/locationView/service/LocationViewService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.ams.locationView.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.locationView.domain.form.LocationViewForm;
@@ -185,11 +186,12 @@ public class LocationViewService {
         // 填充
         for (BasLocationGuiExtDTO guiDTO : guiDTOS) {
             List<BasLocationGuiColDTO> basLocationGuiColDTOList = guiDTO.getBasLocationGuiColDTOS();
+            if (CollUtil.isEmpty(basLocationGuiColDTOList)) continue;
             int maxSize = basLocationGuiColDTOList
                     .stream()
                     .mapToInt(t -> t.getBaseLocationGuiDTOList().size())
                     .max()
-                    .getAsInt();
+                    .orElse(1);
             basLocationGuiColDTOList.stream().forEach(v -> {
                 int size = v.getBaseLocationGuiDTOList().size();
                 List<BaseLocationGuiDTO> locationGuiDTOList = v.getBaseLocationGuiDTOList();

+ 3 - 11
warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java

@@ -8,7 +8,6 @@ import com.ruoyi.ams.box.domain.WmsBoxInfo;
 import com.ruoyi.ams.box.mapper.WmsBoxInfoMapper;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.business.IBusinessService;
-import com.ruoyi.ams.config.domain.FlowConfigHeader;
 import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
 import com.ruoyi.ams.config.domain.dto.LotattDTO;
 import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
@@ -29,13 +28,9 @@ import com.ruoyi.ams.order.service.IActAllocationDetailsService;
 import com.ruoyi.ams.order.vo.CheckOutVO;
 import com.ruoyi.ams.order.vo.PickingListVO;
 import com.ruoyi.ams.order.vo.StockOrderVO;
-import com.ruoyi.ams.task.domain.WcsTask;
-import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
-import com.ruoyi.base.domain.vo.CodeSkuRelationshipVO;
 import com.ruoyi.base.service.IBaseLocationInfoService;
-import com.ruoyi.base.service.ICodeSkuRelationshipService;
 import com.ruoyi.base.utils.IdSequenceUtils;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.model.LoginUser;
@@ -44,7 +39,6 @@ import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import com.ruoyi.ams.order.mapper.WmsDocOrderHeaderMapper;
 import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
@@ -82,8 +76,6 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
     @Autowired
     private IFlowConfigHeaderService flowConfigHeaderService;
     @Autowired
-    private ICodeSkuRelationshipService codeSkuRelationshipService;
-    @Autowired
     private IActTransactionLogService actTransactionLogService;
     @Autowired
     private IdSequenceUtils idSequenceUtils;
@@ -523,11 +515,11 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
 
         WmsBoxInfo boxTo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(arrangeStockForm.getPalletNoTo());
         //物料绑定关系
-        CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(arrangeStockForm.getSn());
-        String sku = codeSkuRelationshipVO.getSku();
+        /*CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(arrangeStockForm.getSn());
+        String sku = codeSkuRelationshipVO.getSku();*/
         //查询分配记录
         ActAllocationDetails query = new ActAllocationDetails();
-        query.setMaterial(sku);
+        query.setMaterial("sku");
         query.setOrderNo(arrangeStockForm.getOrderNo());
         query.setUserdefine1(arrangeStockForm.getPalletNoFrom());
         List<ActAllocationDetails> actAllocationDetailsList = actAllocationDetailsService.selectActAllocationDetailsList(query);

+ 0 - 375
warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/DocQcDetails.java

@@ -1,375 +0,0 @@
-package com.ruoyi.ams.qc.domain;
-
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * 质检对象 wms_doc_qc_details
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-public class DocQcDetails extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** $column.columnComment */
-    private String qcno;
-
-    /** $column.columnComment */
-    private String qclineno;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String linestatus;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private BigDecimal palineno;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String customerid;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String sku;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String lotnum;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private BigDecimal paqtyExpected;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private BigDecimal qcqtyExpected;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private BigDecimal qcqtyCompleted;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine1;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine2;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine3;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine4;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine5;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcdescr;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcresult;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String filecontent;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String notes;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private Date addtime;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String addwho;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private Date edittime;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String editwho;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String packid;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String transactionid;
-
-    public void setQcno(String qcno)
-    {
-        this.qcno = qcno;
-    }
-
-    public String getQcno()
-    {
-        return qcno;
-    }
-    public void setQclineno(String qclineno)
-    {
-        this.qclineno = qclineno;
-    }
-
-    public String getQclineno()
-    {
-        return qclineno;
-    }
-    public void setLinestatus(String linestatus)
-    {
-        this.linestatus = linestatus;
-    }
-
-    public String getLinestatus()
-    {
-        return linestatus;
-    }
-    public void setPalineno(BigDecimal palineno)
-    {
-        this.palineno = palineno;
-    }
-
-    public BigDecimal getPalineno()
-    {
-        return palineno;
-    }
-    public void setCustomerid(String customerid)
-    {
-        this.customerid = customerid;
-    }
-
-    public String getCustomerid()
-    {
-        return customerid;
-    }
-    public void setSku(String sku)
-    {
-        this.sku = sku;
-    }
-
-    public String getSku()
-    {
-        return sku;
-    }
-    public void setLotnum(String lotnum)
-    {
-        this.lotnum = lotnum;
-    }
-
-    public String getLotnum()
-    {
-        return lotnum;
-    }
-    public void setPaqtyExpected(BigDecimal paqtyExpected)
-    {
-        this.paqtyExpected = paqtyExpected;
-    }
-
-    public BigDecimal getPaqtyExpected()
-    {
-        return paqtyExpected;
-    }
-    public void setQcqtyExpected(BigDecimal qcqtyExpected)
-    {
-        this.qcqtyExpected = qcqtyExpected;
-    }
-
-    public BigDecimal getQcqtyExpected()
-    {
-        return qcqtyExpected;
-    }
-    public void setQcqtyCompleted(BigDecimal qcqtyCompleted)
-    {
-        this.qcqtyCompleted = qcqtyCompleted;
-    }
-
-    public BigDecimal getQcqtyCompleted()
-    {
-        return qcqtyCompleted;
-    }
-    public void setUserdefine1(String userdefine1)
-    {
-        this.userdefine1 = userdefine1;
-    }
-
-    public String getUserdefine1()
-    {
-        return userdefine1;
-    }
-    public void setUserdefine2(String userdefine2)
-    {
-        this.userdefine2 = userdefine2;
-    }
-
-    public String getUserdefine2()
-    {
-        return userdefine2;
-    }
-    public void setUserdefine3(String userdefine3)
-    {
-        this.userdefine3 = userdefine3;
-    }
-
-    public String getUserdefine3()
-    {
-        return userdefine3;
-    }
-    public void setUserdefine4(String userdefine4)
-    {
-        this.userdefine4 = userdefine4;
-    }
-
-    public String getUserdefine4()
-    {
-        return userdefine4;
-    }
-    public void setUserdefine5(String userdefine5)
-    {
-        this.userdefine5 = userdefine5;
-    }
-
-    public String getUserdefine5()
-    {
-        return userdefine5;
-    }
-    public void setQcdescr(String qcdescr)
-    {
-        this.qcdescr = qcdescr;
-    }
-
-    public String getQcdescr()
-    {
-        return qcdescr;
-    }
-    public void setQcresult(String qcresult)
-    {
-        this.qcresult = qcresult;
-    }
-
-    public String getQcresult()
-    {
-        return qcresult;
-    }
-    public void setFilecontent(String filecontent)
-    {
-        this.filecontent = filecontent;
-    }
-
-    public String getFilecontent()
-    {
-        return filecontent;
-    }
-    public void setNotes(String notes)
-    {
-        this.notes = notes;
-    }
-
-    public String getNotes()
-    {
-        return notes;
-    }
-    public void setAddtime(Date addtime)
-    {
-        this.addtime = addtime;
-    }
-
-    public Date getAddtime()
-    {
-        return addtime;
-    }
-    public void setAddwho(String addwho)
-    {
-        this.addwho = addwho;
-    }
-
-    public String getAddwho()
-    {
-        return addwho;
-    }
-    public void setEdittime(Date edittime)
-    {
-        this.edittime = edittime;
-    }
-
-    public Date getEdittime()
-    {
-        return edittime;
-    }
-    public void setEditwho(String editwho)
-    {
-        this.editwho = editwho;
-    }
-
-    public String getEditwho()
-    {
-        return editwho;
-    }
-    public void setPackid(String packid)
-    {
-        this.packid = packid;
-    }
-
-    public String getPackid()
-    {
-        return packid;
-    }
-    public void setTransactionid(String transactionid)
-    {
-        this.transactionid = transactionid;
-    }
-
-    public String getTransactionid()
-    {
-        return transactionid;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("qcno", getQcno())
-            .append("qclineno", getQclineno())
-            .append("linestatus", getLinestatus())
-            .append("palineno", getPalineno())
-            .append("customerid", getCustomerid())
-            .append("sku", getSku())
-            .append("lotnum", getLotnum())
-            .append("paqtyExpected", getPaqtyExpected())
-            .append("qcqtyExpected", getQcqtyExpected())
-            .append("qcqtyCompleted", getQcqtyCompleted())
-            .append("userdefine1", getUserdefine1())
-            .append("userdefine2", getUserdefine2())
-            .append("userdefine3", getUserdefine3())
-            .append("userdefine4", getUserdefine4())
-            .append("userdefine5", getUserdefine5())
-            .append("qcdescr", getQcdescr())
-            .append("qcresult", getQcresult())
-            .append("filecontent", getFilecontent())
-            .append("notes", getNotes())
-            .append("addtime", getAddtime())
-            .append("addwho", getAddwho())
-            .append("edittime", getEdittime())
-            .append("editwho", getEditwho())
-            .append("packid", getPackid())
-            .append("transactionid", getTransactionid())
-            .toString();
-    }
-}

+ 0 - 310
warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/DocQcHeader.java

@@ -1,310 +0,0 @@
-package com.ruoyi.ams.qc.domain;
-
-import java.util.List;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
-
-/**
- * 质检对象 wms_doc_qc_header
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-public class DocQcHeader extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** $column.columnComment */
-    private String qcno;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String pano;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String customerid;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcreference1;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcreference2;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcreference3;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcreference4;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcreference5;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qctype;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcstatus;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private Date qccreationtime;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine1;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine2;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine3;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine4;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userdefine5;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String notes;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String qcPrintFlag;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String warehouseid;
-
-    /** 质检信息 */
-    private List<DocQcDetails> docQcDetailsList;
-
-    public void setQcno(String qcno)
-    {
-        this.qcno = qcno;
-    }
-
-    public String getQcno()
-    {
-        return qcno;
-    }
-    public void setPano(String pano)
-    {
-        this.pano = pano;
-    }
-
-    public String getPano()
-    {
-        return pano;
-    }
-    public void setCustomerid(String customerid)
-    {
-        this.customerid = customerid;
-    }
-
-    public String getCustomerid()
-    {
-        return customerid;
-    }
-    public void setQcreference1(String qcreference1)
-    {
-        this.qcreference1 = qcreference1;
-    }
-
-    public String getQcreference1()
-    {
-        return qcreference1;
-    }
-    public void setQcreference2(String qcreference2)
-    {
-        this.qcreference2 = qcreference2;
-    }
-
-    public String getQcreference2()
-    {
-        return qcreference2;
-    }
-    public void setQcreference3(String qcreference3)
-    {
-        this.qcreference3 = qcreference3;
-    }
-
-    public String getQcreference3()
-    {
-        return qcreference3;
-    }
-    public void setQcreference4(String qcreference4)
-    {
-        this.qcreference4 = qcreference4;
-    }
-
-    public String getQcreference4()
-    {
-        return qcreference4;
-    }
-    public void setQcreference5(String qcreference5)
-    {
-        this.qcreference5 = qcreference5;
-    }
-
-    public String getQcreference5()
-    {
-        return qcreference5;
-    }
-    public void setQctype(String qctype)
-    {
-        this.qctype = qctype;
-    }
-
-    public String getQctype()
-    {
-        return qctype;
-    }
-    public void setQcstatus(String qcstatus)
-    {
-        this.qcstatus = qcstatus;
-    }
-
-    public String getQcstatus()
-    {
-        return qcstatus;
-    }
-    public void setQccreationtime(Date qccreationtime)
-    {
-        this.qccreationtime = qccreationtime;
-    }
-
-    public Date getQccreationtime()
-    {
-        return qccreationtime;
-    }
-    public void setUserdefine1(String userdefine1)
-    {
-        this.userdefine1 = userdefine1;
-    }
-
-    public String getUserdefine1()
-    {
-        return userdefine1;
-    }
-    public void setUserdefine2(String userdefine2)
-    {
-        this.userdefine2 = userdefine2;
-    }
-
-    public String getUserdefine2()
-    {
-        return userdefine2;
-    }
-    public void setUserdefine3(String userdefine3)
-    {
-        this.userdefine3 = userdefine3;
-    }
-
-    public String getUserdefine3()
-    {
-        return userdefine3;
-    }
-    public void setUserdefine4(String userdefine4)
-    {
-        this.userdefine4 = userdefine4;
-    }
-
-    public String getUserdefine4()
-    {
-        return userdefine4;
-    }
-    public void setUserdefine5(String userdefine5)
-    {
-        this.userdefine5 = userdefine5;
-    }
-
-    public String getUserdefine5()
-    {
-        return userdefine5;
-    }
-    public void setNotes(String notes)
-    {
-        this.notes = notes;
-    }
-
-    public String getNotes()
-    {
-        return notes;
-    }
-    public void setQcPrintFlag(String qcPrintFlag)
-    {
-        this.qcPrintFlag = qcPrintFlag;
-    }
-
-    public String getQcPrintFlag()
-    {
-        return qcPrintFlag;
-    }
-    public void setWarehouseid(String warehouseid)
-    {
-        this.warehouseid = warehouseid;
-    }
-
-    public String getWarehouseid()
-    {
-        return warehouseid;
-    }
-
-    public List<DocQcDetails> getDocQcDetailsList()
-    {
-        return docQcDetailsList;
-    }
-
-    public void setDocQcDetailsList(List<DocQcDetails> docQcDetailsList)
-    {
-        this.docQcDetailsList = docQcDetailsList;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("qcno", getQcno())
-            .append("pano", getPano())
-            .append("customerid", getCustomerid())
-            .append("qcreference1", getQcreference1())
-            .append("qcreference2", getQcreference2())
-            .append("qcreference3", getQcreference3())
-            .append("qcreference4", getQcreference4())
-            .append("qcreference5", getQcreference5())
-            .append("qctype", getQctype())
-            .append("qcstatus", getQcstatus())
-            .append("qccreationtime", getQccreationtime())
-            .append("userdefine1", getUserdefine1())
-            .append("userdefine2", getUserdefine2())
-            .append("userdefine3", getUserdefine3())
-            .append("userdefine4", getUserdefine4())
-            .append("userdefine5", getUserdefine5())
-            .append("notes", getNotes())
-            .append("createTime", getCreateTime())
-            .append("createBy", getCreateBy())
-            .append("updateTime", getUpdateTime())
-            .append("updateBy", getUpdateBy())
-            .append("qcPrintFlag", getQcPrintFlag())
-            .append("warehouseid", getWarehouseid())
-            .append("docQcDetailsList", getDocQcDetailsList())
-            .toString();
-    }
-}

+ 0 - 26
warewms-ams/src/main/java/com/ruoyi/ams/qc/domain/vo/DocQcListVo.java

@@ -1,26 +0,0 @@
-package com.ruoyi.ams.qc.domain.vo;
-
-import lombok.Data;
-
-/**
- * 质检列表
- *
- * @author JWK
- * @version 1.0
- * @date 2022/11/16 16:36
- */
-@Data
-public class DocQcListVo {
-
-    private String sku;
-
-    private String lotatt01;
-
-    private String locationNo;
-
-    public DocQcListVo(String locationNo, String sku, String lotatt01) {
-        this.locationNo = locationNo;
-        this.sku = sku;
-        this.lotatt01 = lotatt01;
-    }
-}

+ 0 - 62
warewms-ams/src/main/java/com/ruoyi/ams/qc/mapper/DocQcDetailsMapper.java

@@ -1,62 +0,0 @@
-package com.ruoyi.ams.qc.mapper;
-
-import java.util.List;
-
-import com.ruoyi.ams.qc.domain.DocQcDetails;
-
-/**
- * 质检Mapper接口
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-public interface DocQcDetailsMapper {
-    /**
-     * 查询质检
-     *
-     * @param qcno     质检主键
-     * @param qclineno 质检主键
-     * @return 质检
-     */
-    DocQcDetails selectDocQcDetailsByQcno(String qcno, String qclineno);
-
-    /**
-     * 查询质检列表
-     *
-     * @param docQcDetails 质检
-     * @return 质检集合
-     */
-    List<DocQcDetails> selectDocQcDetailsList(DocQcDetails docQcDetails);
-
-    /**
-     * 新增质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    int insertDocQcDetails(DocQcDetails docQcDetails);
-
-    /**
-     * 修改质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    int updateDocQcDetails(DocQcDetails docQcDetails);
-
-    /**
-     * 删除质检
-     *
-     * @param qcno 质检主键
-     * @return 结果
-     */
-    int deleteDocQcDetailsByQcno(String qcno);
-
-    /**
-     * 批量删除质检
-     *
-     * @param qcnos 需要删除的数据主键集合
-     * @return 结果
-     */
-    int deleteDocQcDetailsByQcnos(String[] qcnos);
-}

+ 0 - 87
warewms-ams/src/main/java/com/ruoyi/ams/qc/mapper/DocQcHeaderMapper.java

@@ -1,87 +0,0 @@
-package com.ruoyi.ams.qc.mapper;
-
-import java.util.List;
-import com.ruoyi.ams.qc.domain.DocQcHeader;
-import com.ruoyi.ams.qc.domain.DocQcDetails;
-
-/**
- * 质检Mapper接口
- * 
- * @author ruoyi
- * @date 2022-11-14
- */
-public interface DocQcHeaderMapper 
-{
-    /**
-     * 查询质检
-     * 
-     * @param qcno 质检主键
-     * @return 质检
-     */
-     DocQcHeader selectDocQcHeaderByQcno(String qcno);
-
-    /**
-     * 查询质检列表
-     * 
-     * @param docQcHeader 质检
-     * @return 质检集合
-     */
-     List<DocQcHeader> selectDocQcHeaderList(DocQcHeader docQcHeader);
-
-    /**
-     * 新增质检
-     * 
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-     int insertDocQcHeader(DocQcHeader docQcHeader);
-
-    /**
-     * 修改质检
-     * 
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-     int updateDocQcHeader(DocQcHeader docQcHeader);
-
-    /**
-     * 删除质检
-     * 
-     * @param qcno 质检主键
-     * @return 结果
-     */
-     int deleteDocQcHeaderByQcno(String qcno);
-
-    /**
-     * 批量删除质检
-     * 
-     * @param qcnos 需要删除的数据主键集合
-     * @return 结果
-     */
-     int deleteDocQcHeaderByQcnos(String[] qcnos);
-
-    /**
-     * 批量删除质检
-     * 
-     * @param qcnos 需要删除的数据主键集合
-     * @return 结果
-     */
-     int deleteDocQcDetailsByQcnos(String[] qcnos);
-    
-    /**
-     * 批量新增质检
-     * 
-     * @param docQcDetailsList 质检列表
-     * @return 结果
-     */
-     int batchDocQcDetails(List<DocQcDetails> docQcDetailsList);
-    
-
-    /**
-     * 通过质检主键删除质检信息
-     * 
-     * @param qcno 质检ID
-     * @return 结果
-     */
-     int deleteDocQcDetailsByQcno(String qcno);
-}

+ 0 - 84
warewms-ams/src/main/java/com/ruoyi/ams/qc/service/IDocQcDetailsService.java

@@ -1,84 +0,0 @@
-package com.ruoyi.ams.qc.service;
-
-import com.ruoyi.ams.qc.domain.DocQcDetails;
-import com.ruoyi.common.core.domain.AjaxResult;
-
-import java.util.List;
-
-/**
- * 质检Service接口
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-public interface IDocQcDetailsService {
-    /**
-     * 查询质检
-     *
-     * @param qcno 质检主键
-     * @return 质检
-     */
-    DocQcDetails selectDocQcDetailsByQcno(String qcno, String qclineno);
-
-    /**
-     * 查询质检列表
-     *
-     * @param docQcDetails 质检
-     * @return 质检集合
-     */
-    List<DocQcDetails> selectDocQcDetailsList(DocQcDetails docQcDetails);
-
-    /**
-     * 查询质检
-     *
-     * @param docQcDetails 质检
-     * @return 质检集合
-     */
-    DocQcDetails selectDocQcDetailsByModel(DocQcDetails docQcDetails);
-
-    /**
-     * 新增质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    int insertDocQcDetails(DocQcDetails docQcDetails);
-
-    /**
-     * 修改质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    int updateDocQcDetails(DocQcDetails docQcDetails);
-
-    /**
-     * 批量删除质检
-     *
-     * @param qcnos 需要删除的质检主键集合
-     * @return 结果
-     */
-    int deleteDocQcDetailsByQcnos(String[] qcnos);
-
-    /**
-     * 删除质检信息
-     *
-     * @param qcno 质检主键
-     * @return 结果
-     */
-    int deleteDocQcDetailsByQcno(String qcno);
-
-
-    /**
-     * 质检提交
-     *
-     * @param qcNo
-     * @param qcLineNo
-     * @param qualityStatus
-     * @param description
-     * @param updateBy
-     * @return
-     */
-    AjaxResult qcSubmit(String qcNo, String qcLineNo, String qualityStatus
-            , String description, String updateBy);
-}

+ 0 - 96
warewms-ams/src/main/java/com/ruoyi/ams/qc/service/IDocQcHeaderService.java

@@ -1,96 +0,0 @@
-package com.ruoyi.ams.qc.service;
-
-import java.util.List;
-
-import com.ruoyi.ams.qc.domain.DocQcHeader;
-import com.ruoyi.ams.qc.domain.vo.DocQcListVo;
-import com.ruoyi.common.core.domain.AjaxResult;
-
-/**
- * 质检Service接口
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-public interface IDocQcHeaderService {
-    /**
-     * 查询质检
-     *
-     * @param qcno 质检主键
-     * @return 质检
-     */
-    DocQcHeader selectDocQcHeaderByQcno(String qcno);
-
-    /**
-     * 查询质检列表
-     *
-     * @param docQcHeader 质检
-     * @return 质检集合
-     */
-    List<DocQcHeader> selectDocQcHeaderList(DocQcHeader docQcHeader);
-
-    /**
-     * 查询质检
-     *
-     * @param docQcHeader 质检
-     * @return 质检集合
-     */
-    DocQcHeader selectDocQcHeaderByModel(DocQcHeader docQcHeader);
-
-    /**
-     * 新增质检
-     *
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-    int insertDocQcHeader(DocQcHeader docQcHeader);
-
-    /**
-     * 修改质检
-     *
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-    int updateDocQcHeader(DocQcHeader docQcHeader);
-
-    /**
-     * 批量删除质检
-     *
-     * @param qcnos 需要删除的质检主键集合
-     * @return 结果
-     */
-    int deleteDocQcHeaderByQcnos(String[] qcnos);
-
-    /**
-     * 删除质检信息
-     *
-     * @param qcno 质检主键
-     * @return 结果
-     */
-    int deleteDocQcHeaderByQcno(String qcno);
-
-    /**
-     * 获得质检列表(根据库存)
-     *
-     * @return
-     */
-    List<DocQcListVo> getQcListByInvLotLocId(String sku);
-
-    /**
-     * 获取库位列表根据批号
-     *
-     * @param lotNumber
-     * @return
-     */
-    List<DocQcListVo> getLocationListByLotNumber(String lotNumber);
-
-    /**
-     * 质检提交
-     *
-     * @param sku
-     * @param batchNo
-     * @param status
-     * @return
-     */
-    AjaxResult qcSubmit(String sku, String batchNo, String status);
-}

+ 0 - 148
warewms-ams/src/main/java/com/ruoyi/ams/qc/service/impl/DocQcDetailsServiceImpl.java

@@ -1,148 +0,0 @@
-package com.ruoyi.ams.qc.service.impl;
-
-import java.util.List;
-
-import com.ruoyi.ams.inv.domain.InvLotLocId;
-import com.ruoyi.ams.inv.service.IInvLotLocIdService;
-import com.ruoyi.ams.qc.domain.DocQcHeader;
-import com.ruoyi.ams.qc.domain.vo.DocQcListVo;
-import com.ruoyi.ams.qc.service.IDocQcHeaderService;
-import com.ruoyi.base.constant.Constant;
-import com.ruoyi.common.core.domain.AjaxResult;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.ams.qc.mapper.DocQcDetailsMapper;
-import com.ruoyi.ams.qc.domain.DocQcDetails;
-import com.ruoyi.ams.qc.service.IDocQcDetailsService;
-
-/**
- * 质检Service业务层处理
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-@Service
-public class DocQcDetailsServiceImpl implements IDocQcDetailsService {
-
-    @Autowired
-    private DocQcDetailsMapper docQcDetailsMapper;
-
-    @Autowired
-    private IDocQcHeaderService iDocQcHeaderService;
-
-    /**
-     * 查询质检
-     *
-     * @param qcno 质检主键
-     * @return 质检
-     */
-    @Override
-    public DocQcDetails selectDocQcDetailsByQcno(String qcno, String qclineno) {
-        return docQcDetailsMapper.selectDocQcDetailsByQcno(qcno, qclineno);
-    }
-
-    /**
-     * 查询质检列表
-     *
-     * @param docQcDetails 质检
-     * @return 质检
-     */
-    @Override
-    public List<DocQcDetails> selectDocQcDetailsList(DocQcDetails docQcDetails) {
-        return docQcDetailsMapper.selectDocQcDetailsList(docQcDetails);
-    }
-
-    /**
-     * 查询质检
-     *
-     * @param docQcDetails 质检
-     * @return 质检
-     */
-    @Override
-    public DocQcDetails selectDocQcDetailsByModel(DocQcDetails docQcDetails) {
-        List<DocQcDetails> list = docQcDetailsMapper.selectDocQcDetailsList(docQcDetails);
-        if (list != null && list.size() > 0) {
-            return list.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 新增质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    @Override
-    public int insertDocQcDetails(DocQcDetails docQcDetails) {
-        return docQcDetailsMapper.insertDocQcDetails(docQcDetails);
-    }
-
-    /**
-     * 修改质检
-     *
-     * @param docQcDetails 质检
-     * @return 结果
-     */
-    @Override
-    public int updateDocQcDetails(DocQcDetails docQcDetails) {
-        return docQcDetailsMapper.updateDocQcDetails(docQcDetails);
-    }
-
-    /**
-     * 批量删除质检
-     *
-     * @param qcnos 需要删除的质检主键
-     * @return 结果
-     */
-    @Override
-    public int deleteDocQcDetailsByQcnos(String[] qcnos) {
-        return docQcDetailsMapper.deleteDocQcDetailsByQcnos(qcnos);
-    }
-
-    /**
-     * 删除质检信息
-     *
-     * @param qcno 质检主键
-     * @return 结果
-     */
-    @Override
-    public int deleteDocQcDetailsByQcno(String qcno) {
-        return docQcDetailsMapper.deleteDocQcDetailsByQcno(qcno);
-    }
-
-    /**
-     * 质检提交 此方法暂时作废(暂时不用验收单质检)
-     *
-     * @param qcNo
-     * @param qcLineNo
-     * @param qualityStatus
-     * @param description
-     * @param updateBy
-     * @return
-     */
-    @Override
-    public AjaxResult qcSubmit(String qcNo, String qcLineNo, String qualityStatus, String description, String updateBy) {
-
-        if (Constant.QUALITY_STATUS.DJ.getValue().equals(qualityStatus)) {
-            return AjaxResult.error("质量状态不能为待检!");
-        }
-
-        // 单头
-        DocQcHeader docQcHeader = iDocQcHeaderService.selectDocQcHeaderByQcno(qcNo);
-        if (docQcHeader == null) {
-            return AjaxResult.error("验收头单不存在!" + qcNo);
-        }
-        // 当前子单
-        DocQcDetails docQcDetails = selectDocQcDetailsByQcno(qcNo, qcLineNo);
-        if (docQcDetails == null) {
-            return AjaxResult.error("验收子单不存在!" + qcNo);
-        }
-
-        // 验证
-
-
-        return AjaxResult.success();
-    }
-}

+ 0 - 187
warewms-ams/src/main/java/com/ruoyi/ams/qc/service/impl/DocQcHeaderServiceImpl.java

@@ -1,187 +0,0 @@
-package com.ruoyi.ams.qc.service.impl;
-
-import java.util.List;
-
-import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
-import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
-import com.ruoyi.ams.qc.domain.vo.DocQcListVo;
-import com.ruoyi.base.constant.Constant;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-
-import com.ruoyi.common.utils.StringUtils;
-import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.ams.qc.domain.DocQcDetails;
-import com.ruoyi.ams.qc.mapper.DocQcHeaderMapper;
-import com.ruoyi.ams.qc.domain.DocQcHeader;
-import com.ruoyi.ams.qc.service.IDocQcHeaderService;
-
-/**
- * 质检Service业务层处理
- *
- * @author ruoyi
- * @date 2022-11-14
- */
-@Service
-public class DocQcHeaderServiceImpl implements IDocQcHeaderService {
-    @Autowired
-    private DocQcHeaderMapper docQcHeaderMapper;
-
-    @Autowired
-    private InvLotLocIdMapper invLotLocIdMapper;
-
-    /**
-     * 查询质检
-     *
-     * @param qcno 质检主键
-     * @return 质检
-     */
-    @Override
-    public DocQcHeader selectDocQcHeaderByQcno(String qcno) {
-        return docQcHeaderMapper.selectDocQcHeaderByQcno(qcno);
-    }
-
-    /**
-     * 查询质检列表
-     *
-     * @param docQcHeader 质检
-     * @return 质检
-     */
-    @Override
-    public List<DocQcHeader> selectDocQcHeaderList(DocQcHeader docQcHeader) {
-        return docQcHeaderMapper.selectDocQcHeaderList(docQcHeader);
-    }
-
-    /**
-     * 查询质检
-     *
-     * @param docQcHeader 质检
-     * @return 质检
-     */
-    @Override
-    public DocQcHeader selectDocQcHeaderByModel(DocQcHeader docQcHeader) {
-        List<DocQcHeader> list = docQcHeaderMapper.selectDocQcHeaderList(docQcHeader);
-        if (list != null && list.size() > 0) {
-            return list.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 新增质检
-     *
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int insertDocQcHeader(DocQcHeader docQcHeader) {
-        docQcHeader.setCreateTime(DateUtils.getNowDate());
-        int rows = docQcHeaderMapper.insertDocQcHeader(docQcHeader);
-        insertDocQcDetails(docQcHeader);
-        return rows;
-    }
-
-    /**
-     * 修改质检
-     *
-     * @param docQcHeader 质检
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int updateDocQcHeader(DocQcHeader docQcHeader) {
-        docQcHeader.setUpdateTime(DateUtils.getNowDate());
-        docQcHeaderMapper.deleteDocQcDetailsByQcno(docQcHeader.getQcno());
-        insertDocQcDetails(docQcHeader);
-        return docQcHeaderMapper.updateDocQcHeader(docQcHeader);
-    }
-
-    /**
-     * 批量删除质检
-     *
-     * @param qcnos 需要删除的质检主键
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int deleteDocQcHeaderByQcnos(String[] qcnos) {
-        docQcHeaderMapper.deleteDocQcDetailsByQcnos(qcnos);
-        return docQcHeaderMapper.deleteDocQcHeaderByQcnos(qcnos);
-    }
-
-    /**
-     * 删除质检信息
-     *
-     * @param qcno 质检主键
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int deleteDocQcHeaderByQcno(String qcno) {
-        docQcHeaderMapper.deleteDocQcDetailsByQcno(qcno);
-        return docQcHeaderMapper.deleteDocQcHeaderByQcno(qcno);
-    }
-
-    /**
-     * 新增质检信息
-     *
-     * @param docQcHeader 质检对象
-     */
-    public void insertDocQcDetails(DocQcHeader docQcHeader) {
-        List<DocQcDetails> docQcDetailsList = docQcHeader.getDocQcDetailsList();
-        String qcno = docQcHeader.getQcno();
-        if (StringUtils.isNotNull(docQcDetailsList)) {
-            List<DocQcDetails> list = new ArrayList<DocQcDetails>();
-            for (DocQcDetails docQcDetails : docQcDetailsList) {
-                docQcDetails.setQcno(qcno);
-                list.add(docQcDetails);
-            }
-            if (list.size() > 0) {
-                docQcHeaderMapper.batchDocQcDetails(list);
-            }
-        }
-    }
-
-    @Override
-    public List<DocQcListVo> getQcListByInvLotLocId(String sku) {
-        List<InvLotLocIdLotattVO> qualityInspectionList = invLotLocIdMapper.getQualityInspectionList(sku);
-        List<DocQcListVo> docQcListVoList = new ArrayList<>();
-        qualityInspectionList.forEach(t -> {
-            docQcListVoList.add(new DocQcListVo(null, t.getSku(), t.getLotatt01()));
-        });
-        return docQcListVoList;
-    }
-
-    @Override
-    public List<DocQcListVo> getLocationListByLotNumber(String lotNumber) {
-        List<InvLotLocIdLotattVO> invLotLocIdLotattVOList = invLotLocIdMapper.getQualityLocationListByLotNumber(lotNumber);
-        List<DocQcListVo> docQcListVoList = new ArrayList<>();
-        invLotLocIdLotattVOList.forEach(t -> {
-            docQcListVoList.add(new DocQcListVo(t.getLocationNo(), null, null));
-        });
-        return docQcListVoList;
-    }
-
-    @Override
-    public AjaxResult qcSubmit(String sku, String batchNo, String status) {
-        int successQuantity;
-
-        if (Constant.QUALITY_STATUS.DJ.getValue().equals(status)) {
-            return AjaxResult.error("提交质量状态不能为待检!");
-        }
-
-        // 修改批号对应的库存质量状态
-        int i = invLotLocIdMapper.updateQualityStatusByLotNumber(sku, batchNo, status);
-        successQuantity = i;
-        if (i <= 0) {
-            return AjaxResult.error("质检条数为0条!");
-        }
-        return AjaxResult.success(String.format("操作成功!修改了%d条!",successQuantity));
-    }
-}

+ 0 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/dto/WcsTaskInvLotDTO.java


Some files were not shown because too many files changed in this diff