Przeglądaj źródła

导出单据、库位移动1.0

dfsfs 1 rok temu
rodzic
commit
1a71ef9ea7
27 zmienionych plików z 715 dodań i 109 usunięć
  1. 13 0
      base/sql/bsl_sql/bsl_ddl_v1.0.0.sql
  2. 36 27
      base/sql/bsl_sql/bsl_dml_v1.0.0.sql
  3. 19 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/InvLotLocIdController.java
  4. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/doc/BionutritionDocHeaderController.java
  5. 2 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/dto/DocExcelQueryDTO.java
  6. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/FinishedProductReceiptDetailsExcel.java
  7. 20 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionPickingReceiptDetailsExcel.java
  8. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/ProductionReturnOrderDetailsExcel.java
  9. 20 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseOrderDetailsExcel.java
  10. 20 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/PurchaseReceiptDetailsExcel.java
  11. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleOutboundOrderDetailsExcel.java
  12. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/detail/SaleReturnOrderDetailsExcel.java
  13. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/FinishedProductReceiptHeaderExcel.java
  14. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionPickingReceiptHeaderExcel.java
  15. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/ProductionReturnOrderHeaderExcel.java
  16. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseOrderHeaderExcel.java
  17. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/PurchaseReceiptHeaderExcel.java
  18. 22 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleOutboundOrderHeaderExcel.java
  19. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/excel/header/SaleReturnOrderHeaderExcel.java
  20. 1 1
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/BionutritionDocHeaderService.java
  21. 257 74
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/doc/service/impl/BionutritionDocHeaderServiceImpl.java
  22. 21 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvMoveDTO.java
  23. 2 2
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java
  24. 3 0
      warewms-ams/src/main/resources/mapper/doc/BionutritionDocHeaderMapper.xml
  25. 8 1
      warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java
  26. 57 0
      warewms-base/src/main/java/com/ruoyi/base/constant/type/BizEnum.java
  27. 2 2
      warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

+ 13 - 0
base/sql/bsl_sql/bsl_ddl_v1.0.0.sql

@@ -119,3 +119,16 @@ CREATE TABLE `base_org`  (
   PRIMARY KEY (`id`) USING BTREE
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
 
+CREATE TABLE `sys_config` (
+  `config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键',
+  `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数名称',
+  `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键名',
+  `config_value` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键值',
+  `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
+  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`config_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='参数配置表';

Plik diff jest za duży
+ 36 - 27
base/sql/bsl_sql/bsl_dml_v1.0.0.sql


+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/InvLotLocIdController.java

@@ -5,6 +5,7 @@ import com.ruoyi.ams.inv.domain.form.InvLocIdSearchFrom;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdAdjForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.form.InvLotLocIdMoveForm;
 import com.ruoyi.ams.inv.domain.vo.InvLotLocIdLotattVO;
 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.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.annotation.Log;
@@ -74,6 +75,24 @@ public class InvLotLocIdController extends BaseController {
         }
         }
     }
     }
 
 
+    @PreAuthorize("@ss.hasPermi('ams:invLotLocId:move')")
+    @Log(title = "库位库存移动(呼叫agv场景专用)", businessType = BusinessType.UPDATE)
+    @PostMapping("/moveLocInv")
+    public AjaxResult moveLocInv(@RequestBody InvMoveDTO invMoveDTO) {
+        InvLotLocIdMoveForm invLotLocIdMoveForm = buildInvLotLocIdMoveForm(invMoveDTO.getSourceLocationId(), invMoveDTO.getTargetLocationId());
+        return invLotLocIdService.move(invLotLocIdMoveForm);
+    }
+
+    private InvLotLocIdMoveForm buildInvLotLocIdMoveForm(String sourceLocationId, String targetLocationId) {
+        InvLotLocIdMoveForm invLotLocIdMoveForm = new InvLotLocIdMoveForm();
+        invLotLocIdMoveForm.setLocationFrom(sourceLocationId);
+        invLotLocIdMoveForm.setLocationTo(targetLocationId);
+        invLotLocIdMoveForm.setUpdateBy(getUsername());
+        invLotLocIdMoveForm.setWarehouseId(Constant.WAREHOUSE_ID);
+        invLotLocIdMoveForm.setIsCallCar(Constant.IS_YES.Y.getValue());
+        return invLotLocIdMoveForm;
+    }
+
     /**
     /**
      * 库存清理
      * 库存清理
      *
      *

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

@@ -26,6 +26,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
@@ -103,8 +104,7 @@ public class BionutritionDocHeaderController extends BaseController {
     @PreAuthorize("@ss.hasPermi('docAsn:docAsn:export')")
     @PreAuthorize("@ss.hasPermi('docAsn:docAsn:export')")
     @Log(title = "导出单据", businessType = BusinessType.EXPORT)
     @Log(title = "导出单据", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) {
-
+    public void export(HttpServletResponse response, @Valid DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException {
 
 
 /*        docBaseExcels.forEach(item->{
 /*        docBaseExcels.forEach(item->{
             Class<? extends BionutritionDocHeaderBaseExcel> aClass = item.getBionutritionDocHeaderBaseExcelDTO().getClass();
             Class<? extends BionutritionDocHeaderBaseExcel> aClass = item.getBionutritionDocHeaderBaseExcelDTO().getClass();

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

@@ -3,6 +3,7 @@ package com.ruoyi.ams.bionutrition.doc.dto;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 @Data
 @Data
@@ -13,6 +14,7 @@ public class DocExcelQueryDTO implements Serializable {
     @ApiModelProperty("单据头id")
     @ApiModelProperty("单据头id")
     private String[] ids;
     private String[] ids;
 
 
+    @NotBlank(message = "请选择单据类型")
     @ApiModelProperty("单据类型")
     @ApiModelProperty("单据类型")
     private String docType;
     private String docType;
 
 

+ 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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "质检单号/检验单号")
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
     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;
+    }
 }
 }

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

@@ -5,7 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.lang.reflect.Field;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
 /**
  * 生产领料单明细
  * 生产领料单明细
@@ -25,4 +28,21 @@ public class ProductionPickingReceiptDetailsExcel extends BionutritionDocDetails
     @Excel(name = "生产日期")
     @Excel(name = "生产日期")
     private Date 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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "退库人")
     @Excel(name = "退库人")
     private String returner;
     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;
+    }
+
 }
 }

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

@@ -5,7 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.lang.reflect.Field;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
 /**
  * 采购单明细
  * 采购单明细
@@ -28,4 +31,21 @@ public class PurchaseOrderDetailsExcel extends BionutritionDocDetailsBaseExcel {
     @Excel(name = "含税价")
     @Excel(name = "含税价")
     private String priceIncludeTax;
     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;
+    }
+
 }
 }

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

@@ -5,7 +5,10 @@ import com.ruoyi.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.lang.reflect.Field;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
 /**
  * 采购收货单明细
  * 采购收货单明细
@@ -29,4 +32,21 @@ public class PurchaseReceiptDetailsExcel extends BionutritionDocDetailsBaseExcel
     @Excel(name = "含税价")
     @Excel(name = "含税价")
     private String priceIncludeTax;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "质检单号/检验单号")
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "质检单号/检验单号")
     @Excel(name = "质检单号/检验单号")
     private String qualityInspectionDoc;
     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/header/FinishedProductReceiptHeaderExcel.java

@@ -3,6 +3,10 @@ package com.ruoyi.ams.bionutrition.doc.excel.header;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.annotation.Excel;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
 /**
  * 成品入库单单头
  * 成品入库单单头
  */
  */
@@ -15,4 +19,21 @@ public class FinishedProductReceiptHeaderExcel extends BionutritionDocHeaderBase
     @Excel(name = "部门名称")
     @Excel(name = "部门名称")
     private String dept;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "部门名称")
     @Excel(name = "部门名称")
     private String dept;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "部门名称")
     @Excel(name = "部门名称")
     private String dept;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "税率")
     @Excel(name = "税率")
     private String taxRate;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "税率")
     @Excel(name = "税率")
     private String taxRate;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 ="销售合同")
     @Excel(name ="销售合同")
     private String saleContract;
     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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 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 = "仓库类别")
     @Excel(name = "仓库类别")
     private String warehouseType;
     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;
+    }
+
 }
 }

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

@@ -71,5 +71,5 @@ public interface BionutritionDocHeaderService extends CrudService<BionutritionDo
     /**
     /**
      * 导出单据excel方法
      * 导出单据excel方法
      */
      */
-    void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO);
+    <E>void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException;
 }
 }

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

@@ -1,10 +1,12 @@
 package com.ruoyi.ams.bionutrition.doc.service.impl;
 package com.ruoyi.ams.bionutrition.doc.service.impl;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -25,11 +27,18 @@ import com.ruoyi.ams.bionutrition.doc.mapper.BionutritionDocHeaderMapper;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.ams.bionutrition.doc.util.BionutritionDocUtil;
 import com.ruoyi.ams.bionutrition.doc.util.BionutritionDocUtil;
+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.ConvertUtils;
 import com.ruoyi.common.utils.PageUtil;
 import com.ruoyi.common.utils.PageUtil;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.service.impl.BaseServiceImpl;
 import com.ruoyi.framework.service.impl.CrudServiceImpl;
 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 lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.streaming.SXSSFCell;
 import org.apache.poi.xssf.streaming.SXSSFCell;
 import org.apache.poi.xssf.streaming.SXSSFRow;
 import org.apache.poi.xssf.streaming.SXSSFRow;
@@ -42,11 +51,10 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 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;
 import java.util.stream.Collectors;
 
 
 @Service
 @Service
@@ -55,20 +63,24 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     @Autowired
     @Autowired
     private BionutritionDocDetailsService bionutritionDocDetailsService;
     private BionutritionDocDetailsService bionutritionDocDetailsService;
+    @Autowired
+    private ISysConfigService sysConfigService;
 
 
     /**
     /**
      * 查询单据头分页数据
      * 查询单据头分页数据
+     *
      * @param docHeaderDTO
      * @param docHeaderDTO
      * @return
      * @return
      */
      */
     @Override
     @Override
     public PageInfo<BionutritionDocHeaderDTO> getDocHeaderPageInfo(BionutritionDocHeaderDTO docHeaderDTO) {
     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
      * @param docNo
      * @return
      * @return
      */
      */
@@ -79,6 +91,7 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 插入单据头
      * 插入单据头
+     *
      * @param docHeaderDTO
      * @param docHeaderDTO
      * @return
      * @return
      */
      */
@@ -92,19 +105,21 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 修改单据头
      * 修改单据头
+     *
      * @param docHeaderDTO
      * @param docHeaderDTO
      * @return
      * @return
      */
      */
     @Override
     @Override
     public int updateDoc(BionutritionDocHeaderDTO docHeaderDTO) {
     public int updateDoc(BionutritionDocHeaderDTO docHeaderDTO) {
         UpdateWrapper<BionutritionDocHeader> updateWrapper = new UpdateWrapper<>();
         UpdateWrapper<BionutritionDocHeader> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()),BionutritionDocHeader::getId, docHeaderDTO.getId());
+        updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()), BionutritionDocHeader::getId, docHeaderDTO.getId());
 //                .eq(StringUtils.isNotBlank(docHeaderDTO.getDocNo()), BionutritionDocHeader::getDocNo, docHeaderDTO.getDocNo());
 //                .eq(StringUtils.isNotBlank(docHeaderDTO.getDocNo()), BionutritionDocHeader::getDocNo, docHeaderDTO.getDocNo());
         return baseDao.update(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class), updateWrapper);
         return baseDao.update(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class), updateWrapper);
     }
     }
 
 
     /**
     /**
      * 根据id删除单据头
      * 根据id删除单据头
+     *
      * @param ids
      * @param ids
      * @return
      * @return
      */
      */
@@ -123,6 +138,7 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 根据id获取单据数据
      * 根据id获取单据数据
+     *
      * @param ids
      * @param ids
      * @return
      * @return
      */
      */
@@ -130,19 +146,19 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
     public List<BionutritionDocBaseDTO> getDicListByIds(String[] ids) {
     public List<BionutritionDocBaseDTO> getDicListByIds(String[] ids) {
         List<BionutritionDocHeaderDTO> docHeaderDTOList = ArrayUtil.isNotEmpty(ids) ?
         List<BionutritionDocHeaderDTO> docHeaderDTOList = ArrayUtil.isNotEmpty(ids) ?
                 getBionutritionDocHeaderDTOList(Arrays.asList(ids)) :
                 getBionutritionDocHeaderDTOList(Arrays.asList(ids)) :
-                ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()),BionutritionDocHeaderDTO.class);
+                ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()), BionutritionDocHeaderDTO.class);
         return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
         return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
     }
     }
 
 
     /**
     /**
-     * 导出单据excel
-     * @param response
+     * 单据导出excel
+     *
+     * @param response todo 单据单头中文
      * @param docExcelQueryDTO
      * @param docExcelQueryDTO
      */
      */
     @Override
     @Override
-    public void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) {
-        List<BionutritionDocBaseDTO> list = StringUtils.isNotBlank(docExcelQueryDTO.getDocType()) ?
-                getDocList(docExcelQueryDTO) : getDicListByIds(docExcelQueryDTO.getIds());
+    public <E> void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException {
+        List<BionutritionDocBaseDTO> list = getDocList(docExcelQueryDTO);
         List<BionutritionDocBaseExcel> docBaseExcels = list.stream()
         List<BionutritionDocBaseExcel> docBaseExcels = list.stream()
                 .map(item -> BionutritionDocUtil.buildBionutritionDocBaseExcel(item.getBionutritionDocHeaderBaseDTO().getDocType(), item))
                 .map(item -> BionutritionDocUtil.buildBionutritionDocBaseExcel(item.getBionutritionDocHeaderBaseDTO().getDocType(), item))
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
@@ -150,98 +166,261 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
         // 创建工作簿对象
         // 创建工作簿对象
         SXSSFWorkbook workbook = new SXSSFWorkbook();
         SXSSFWorkbook workbook = new SXSSFWorkbook();
         SXSSFSheet sheet = workbook.createSheet();
         SXSSFSheet sheet = workbook.createSheet();
+
+        // 设置单元格样式
+        CellStyle cellStyle = workbook.createCellStyle();
+        // 上下左右居中
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+
         Integer startRow = 0;
         Integer startRow = 0;
         // 总列数
         // 总列数
         Integer collLength = 0;
         Integer collLength = 0;
-        //是同一类型的单据
-        if (StringUtils.isNotBlank(docExcelQueryDTO.getDocType())){
-
-            BionutritionDocBaseExcel bionutritionDocBaseExcel = docBaseExcels.get(0);
-            Class<? extends BionutritionDocHeaderBaseExcel> aClass = bionutritionDocBaseExcel.getBionutritionDocHeaderBaseExcelDTO().getClass();
-            Field[] headerSonFields = aClass.getDeclaredFields();
-            Field[] headerFatherFields = aClass.getSuperclass().getDeclaredFields();
-            //1.设置列数,长度为单头和明细的字段数和
-            // 单头字段数
-            collLength = headerSonFields.length + headerFatherFields.length;
-            log.info("=====单头字段长度:{}",collLength);
-
-            List<BionutritionDocDetailsBaseExcel> detailsBaseExcelList = bionutritionDocBaseExcel.getBionutritionDocDetailsBaseExcelList();
-            Class<? extends BionutritionDocDetailsBaseExcel> bClass = detailsBaseExcelList.get(0).getClass();
-            Field[] detailSonField = bClass.getDeclaredFields();
-            Field[] detailFatherFields = bClass.getSuperclass().getDeclaredFields();
-            // 加上明细字段数
-            collLength = collLength + detailSonField.length +detailFatherFields.length;
-
-            // 获取所有字段
-            Field[] totalFields = new Field[collLength];
-            System.arraycopy(headerSonFields,0,totalFields,0,headerSonFields.length);
-            System.arraycopy(headerFatherFields,0,totalFields,headerSonFields.length,headerFatherFields.length);
-            System.arraycopy(detailSonField,0,totalFields,headerSonFields.length + headerFatherFields.length,detailSonField.length);
-            System.arraycopy(detailFatherFields,0,totalFields,headerSonFields.length + headerFatherFields.length + detailSonField.length,detailFatherFields.length);
-            log.info("==所有字段:{}",totalFields);
-
-            //2.创建第一行标题
-            SXSSFRow row0 = sheet.createRow(0);
-            SXSSFCell cell1 = row0.createCell(0);
-            cell1.setCellValue("单头");
-            SXSSFCell cell2 = row0.createCell(headerSonFields.length + headerFatherFields.length+1);
-            cell2.setCellValue("明细");
-            // ‘单头’标题所占的列合并
-            sheet.addMergedRegion(new CellRangeAddress(0,0,0,headerSonFields.length + headerFatherFields.length));
-            // ‘明细’标题所占的列合并
-            sheet.addMergedRegion(new CellRangeAddress(0,0,headerSonFields.length + headerFatherFields.length+1,collLength));
-
-            //3.创建第二行标题
-            SXSSFRow row1 = sheet.createRow(1);
-            for (int i = 0; i < collLength; i++) {
-                SXSSFCell cell = row1.createCell(i);
-                cell.setCellValue(totalFields[i].getName());
-            }
+        //是同一类型的单据 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.设置数据
             // 4.设置数据
-
-            // 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();
+            for (BionutritionDocBaseExcel baseExcel : docBaseExcels) {
+
+                BionutritionDocHeaderBaseExcel headerExcel = baseExcel.getBionutritionDocHeaderBaseExcelDTO();
+                List<BionutritionDocDetailsBaseExcel> detailsExcelList = baseExcel.getBionutritionDocDetailsBaseExcelList();
+                // 获取当前单头字段值
+                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();
         }
         }
 
 
+    }
 
 
+    /**
+     * 单元格合并同列不合并同行
+     * @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
      * @param docNo
      * @return
      * @return
      */
      */
-    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo){
+    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo) {
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNo(docNo);
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNo(docNo);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
     }
     }
 
 
     /**
     /**
      * 构建类型单据内容(单个)
      * 构建类型单据内容(单个)
+     *
      * @param id
      * @param id
      * @return
      * @return
      */
      */
-    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id){
+    public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id) {
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(id);
         BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(id);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
         return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
     }
     }
 
 
     /**
     /**
      * 构建类型单据内容(多个)
      * 构建类型单据内容(多个)
+     *
      * @param docNoList
      * @param docNoList
      * @return
      * @return
      */
      */
-    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList){
+    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList) {
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOListByDocNo(docNoList);
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOListByDocNo(docNoList);
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
@@ -250,10 +429,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 构建类型单据内容(多个)
      * 构建类型单据内容(多个)
+     *
      * @param idList
      * @param idList
      * @return
      * @return
      */
      */
-    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList){
+    public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList) {
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOList(idList);
         List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOList(idList);
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
         return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
@@ -262,10 +442,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 构建类型单据内容(单个)
      * 构建类型单据内容(单个)
+     *
      * @param bionutritionDocHeaderDTO
      * @param bionutritionDocHeaderDTO
      * @return
      * @return
      */
      */
-    private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO){
+    private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO) {
         BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = BionutritionDocUtil.buildBionutritionDocHeaderDTO(bionutritionDocHeaderDTO);
         BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = BionutritionDocUtil.buildBionutritionDocHeaderDTO(bionutritionDocHeaderDTO);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderBaseDTO.getId());
                 bionutritionDocHeaderBaseDTO.getId());
@@ -279,10 +460,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 构建类型单据内容(多个 相同类型单据)
      * 构建类型单据内容(多个 相同类型单据)
+     *
      * @param bionutritionDocHeaderDTOList
      * @param bionutritionDocHeaderDTOList
      * @return
      * @return
      */
      */
-    private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
+    private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
         List<BionutritionDocHeaderBaseDTO> bionutritionDocHeaderBaseDTOList = BionutritionDocUtil.buildBionutritionDocHeaderDTOList(bionutritionDocHeaderDTOList);
         List<BionutritionDocHeaderBaseDTO> bionutritionDocHeaderBaseDTOList = BionutritionDocUtil.buildBionutritionDocHeaderDTOList(bionutritionDocHeaderDTOList);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
@@ -293,10 +475,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
 
 
     /**
     /**
      * 构建类型单据内容(多个 不同类型单据)
      * 构建类型单据内容(多个 不同类型单据)
+     *
      * @param bionutritionDocHeaderDTOList
      * @param bionutritionDocHeaderDTOList
      * @return
      * @return
      */
      */
-    private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
+    private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
         Map<String, List<BionutritionDocHeaderBaseDTO>> bionutritionDocHeaderMap = BionutritionDocUtil.buildBionutritionDocHeaderDTOByDocTypeMap(bionutritionDocHeaderDTOList);
         Map<String, List<BionutritionDocHeaderBaseDTO>> bionutritionDocHeaderMap = BionutritionDocUtil.buildBionutritionDocHeaderDTOByDocTypeMap(bionutritionDocHeaderDTOList);
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
         List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
                 bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));

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

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

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

@@ -234,7 +234,7 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         wcsTask.setExt8("");
         wcsTask.setExt8("");
         // 三向车叉尺方向(货叉朝左1,朝右2,中位或其他0)
         // 三向车叉尺方向(货叉朝左1,朝右2,中位或其他0)
         // 如果起始点是仓储区,左1,右2,我们系统A是靠马路也就是叉尺的右边
         // 如果起始点是仓储区,左1,右2,我们系统A是靠马路也就是叉尺的右边
-        if (baseLocationFrom.getZoneId() != null
+/*        if (baseLocationFrom.getZoneId() != null
                 && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.STORAGE.getValue())) {
                 && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.STORAGE.getValue())) {
             wcsTask.setExt4(baseLocationFrom.getRowNo().equals("A") ? "2" : "1");
             wcsTask.setExt4(baseLocationFrom.getRowNo().equals("A") ? "2" : "1");
         }
         }
@@ -242,7 +242,7 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         if (baseLocationFrom.getZoneId() != null
         if (baseLocationFrom.getZoneId() != null
                 && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.TRANSIT.getValue())) {
                 && Objects.equals(baseLocationFrom.getZoneId(), Constant.ZONE_TYPE.TRANSIT.getValue())) {
             wcsTask.setExt4("1");
             wcsTask.setExt4("1");
-        }
+        }*/
         iBusinessService.addTask(wcsTask);
         iBusinessService.addTask(wcsTask);
 
 
         // 锁定起始和目标库位任务状态
         // 锁定起始和目标库位任务状态

+ 3 - 0
warewms-ams/src/main/resources/mapper/doc/BionutritionDocHeaderMapper.xml

@@ -69,6 +69,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="docType != null and docType != ''"> and doc_type = #{docType}</if>
             <if test="docType != null and docType != ''"> and doc_type = #{docType}</if>
             <if test="docNo != null and docNo != ''"> and doc_no = #{docNo}</if>
             <if test="docNo != null and docNo != ''"> and doc_no = #{docNo}</if>
             <if test="businessType != null and businessType != ''"> and business_type = #{businessType} </if>
             <if test="businessType != null and businessType != ''"> and business_type = #{businessType} </if>
+            <if test="createDate != null"><!-- 开始时间检索 -->
+                AND date_format(create_date,'%y%m%d') = date_format(#{createDate},'%y%m%d')
+            </if>
         </where>
         </where>
         order by create_date desc
         order by create_date desc
     </select>
     </select>

+ 8 - 1
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -26,6 +26,8 @@ public class Constant {
      */
      */
     public static final Long LOC_MIDDLE_CACHE = 99999l;
     public static final Long LOC_MIDDLE_CACHE = 99999l;
 
 
+    public static final String SYS_DOC_FIELD_REMARK = "sys.doc.field.remark";
+
     /**
     /**
      * 搬运任务配置id
      * 搬运任务配置id
      */
      */
@@ -434,7 +436,12 @@ public class Constant {
         /**
         /**
          * 转发任务
          * 转发任务
          */
          */
-        FORWARD("FW");
+        FORWARD("FW"),
+
+        /**
+         * 移库任务
+         */
+        MV("MV");
         private String value;
         private String value;
 
 
         TASK_TYPE(String value) {
         TASK_TYPE(String value) {

+ 57 - 0
warewms-base/src/main/java/com/ruoyi/base/constant/type/BizEnum.java

@@ -288,4 +288,61 @@ public class BizEnum {
 
 
     }
     }
 
 
+    /**
+     * 单据类型对应单据标题名称
+     */
+    public enum BionutritionExcelDocTitleEnum implements IBaseEnum {
+        /**
+         * 成品入库单
+         */
+        FINISHED_PRODUCT_RECEIPT("FinishedProductReceipt", "成品入库单"),
+        /**
+         * 生产领料单
+         */
+        PRODUCTION_PICKING_RECEIPT("ProductionPickingReceipt", "生产领料单"),
+        /**
+         * 生产退库单
+         */
+        PRODUCTION_RETURN_ORDER("ProductionReturnOrder", "生产退库单"),
+        /**
+         * 采购收货单
+         */
+        PURCHASE_RECEIPT("PurchaseReceipt", "采购收货单"),
+        /**
+         * 销售出库单
+         */
+        SALE_OUTBOUND_ORDER("SaleOutboundOrder", "销售出库单"),
+        /**
+         * 销售退库单
+         */
+        SALE_RETURN_ORDER("SaleReturnOrder", "销售退库单"),
+        /**
+         * 采购单
+         */
+        PURCHASE_ORDER("PurchaseOrder","采购单");
+
+        private String docType;
+
+        private String titleName;
+
+        BionutritionExcelDocTitleEnum(String docType, String titleName) {
+            this.docType = docType;
+            this.titleName = titleName;
+        }
+
+        public String getTitleName() {
+            return titleName;
+        }
+
+        public String getDocType() {
+            return docType;
+        }
+
+        @Override
+        public String getCode() {
+            return getDocType();
+        }
+
+    }
+
 }
 }

+ 2 - 2
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -645,13 +645,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              ,t4.lotatt01,t4.lotatt02,t4.lotatt03,t4.lotatt04,t4.lotatt05,t4.lotatt06
              ,t4.lotatt01,t4.lotatt02,t4.lotatt03,t4.lotatt04,t4.lotatt05,t4.lotatt06
              ,t4.lotatt07,t4.lotatt08,t4.lotatt09,t4.lotatt10,t4.lotatt11,t4.lotatt12
              ,t4.lotatt07,t4.lotatt08,t4.lotatt09,t4.lotatt10,t4.lotatt11,t4.lotatt12
              ,t4.lotatt13,t4.lotatt14,t4.lotatt15,t4.lotatt16,t4.lotatt17,t4.lotatt18
              ,t4.lotatt13,t4.lotatt14,t4.lotatt15,t4.lotatt16,t4.lotatt17,t4.lotatt18
-             ,t5.sku,t5.desc1 skuName,t5.hazard_flag isEmptyPlate
+             ,t5.sku,t5.sku_name
         FROM
         FROM
             base_location_info t1
             base_location_info t1
                 LEFT JOIN base_location_zone t2 on t2.zone_id = t1.zone_id
                 LEFT JOIN base_location_zone t2 on t2.zone_id = t1.zone_id
                 LEFT JOIN (SELECT location_id,any_value(lotnum) lotnum,any_value(customer_id) customer_id,any_value(sku) sku from inv_lot_loc_id GROUP BY location_id) t3 on t3.location_id = t1.id
                 LEFT JOIN (SELECT location_id,any_value(lotnum) lotnum,any_value(customer_id) customer_id,any_value(sku) sku from inv_lot_loc_id GROUP BY location_id) t3 on t3.location_id = t1.id
                 LEFT JOIN inv_lot_att t4 on t4.lotnum = t3.lotnum
                 LEFT JOIN inv_lot_att t4 on t4.lotnum = t3.lotnum
-                LEFT JOIN base_sku t5 on t5.customer_id=t3.customer_id and t5.sku = t3.sku
+                LEFT JOIN base_sku t5 on t5.sku_customer_id=t3.customer_id and t5.sku = t3.sku
         where t1.zone_id = #{zoneId}
         where t1.zone_id = #{zoneId}
         <choose>
         <choose>
             <when test=" sort == '1'.toString() ">
             <when test=" sort == '1'.toString() ">