瀏覽代碼

Merge remote-tracking branch 'origin/yonghu' into yonghu

dfsfs 1 年之前
父節點
當前提交
a48603b16d
共有 31 個文件被更改,包括 1091 次插入77 次删除
  1. 21 0
      base_sql/pallet_sql/yonghu_ddl_20230921.sql
  2. 1 0
      base_sql/pallet_sql/yonghu_dml_20230921.sql
  3. 48 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaController.java
  4. 60 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/wms/stock/StockTakeRecordController.java
  5. 1 1
      ruoyi-admin/src/main/resources/application-dev.yml
  6. 6 3
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  7. 8 1
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  8. 41 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/MybatisPlusMetaObjectHandler.java
  9. 6 8
      warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnDetailsServiceImpl.java
  10. 4 15
      warewms-ams/src/main/java/com/ruoyi/ams/box/domain/WmsBoxInfo.java
  11. 9 3
      warewms-ams/src/main/java/com/ruoyi/ams/box/service/IWmsBoxInfoService.java
  12. 11 0
      warewms-ams/src/main/java/com/ruoyi/ams/box/service/impl/WmsBoxInfoServiceImpl.java
  13. 102 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvLotAttDTO.java
  14. 79 0
      warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvLotLocIdDTO.java
  15. 5 1
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotAttService.java
  16. 5 2
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotLocIdService.java
  17. 19 2
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotAttServiceImpl.java
  18. 24 4
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java
  19. 26 21
      warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java
  20. 54 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/domain/StockTakeRecord.java
  21. 25 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/dto/PalletInventoryDetailDTO.java
  22. 38 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/dto/StockTakeRecordDTO.java
  23. 16 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/mapper/StockTakeRecordMapper.java
  24. 47 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/service/StockTakeRecordService.java
  25. 337 0
      warewms-ams/src/main/java/com/ruoyi/ams/stock/service/impl/StockTakeRecordServiceImpl.java
  26. 6 6
      warewms-ams/src/main/resources/mapper/box/WmsBoxInfoMapper.xml
  27. 8 0
      warewms-ams/src/main/resources/mapper/stock/StockTakeRecordMapper.xml
  28. 62 0
      warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java
  29. 4 2
      warewms-base/src/main/java/com/ruoyi/base/mapper/BaseSkuMapper.java
  30. 4 2
      warewms-base/src/main/java/com/ruoyi/base/service/IBaseSkuService.java
  31. 14 5
      warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseSkuServiceImpl.java

+ 21 - 0
base_sql/pallet_sql/yonghu_ddl_20230921.sql

@@ -19,3 +19,24 @@ CREATE TABLE if not exists `pallet_match_log`
     `update_time` datetime                                                      DEFAULT NULL COMMENT '更新时间',
     PRIMARY KEY (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='托盘匹配记录';
+
+CREATE TABLE if not exists `stock_take_record` (
+     `id` varchar(64) NOT NULL COMMENT 'id',
+     `stock_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '盘点单号',
+     `bar_code` varchar(255) DEFAULT NULL COMMENT '条形码',
+     `scan_pallet` varchar(255) DEFAULT NULL COMMENT '扫描托盘',
+     `stock_pallet` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '盘点托盘(实际栈板)',
+     `source_pallet` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '来源托盘(账面栈板)',
+     `stock_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '盘点状态 1:已完成 2:未完成',
+     `stock_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '盘点类型 1:盘亏 2:盘盈',
+     `del_flag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '取消盘点标志 Y/N',
+     `remark` varchar(255) DEFAULT NULL COMMENT '备注',
+     `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 '更新时间',
+     PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='盘点记录';
+
+ALTER TABLE wms_box_info
+    RENAME COLUMN box_remark TO remark;

+ 1 - 0
base_sql/pallet_sql/yonghu_dml_20230921.sql

@@ -38,3 +38,4 @@ INSERT INTO `ams_hexdefine_detail` (`id`, `business_type`, `col_name`, `col_type
 INSERT INTO `ams_hexdefine_detail` (`id`, `business_type`, `col_name`, `col_type`, `bind_table`, `col_val`, `val_type`, `sort_index`) VALUES (260, '78', 'IKEY', 2, NULL, 'iKey', 1, 10);
 INSERT INTO `ams_hexdefine_detail` (`id`, `business_type`, `col_name`, `col_type`, `bind_table`, `col_val`, `val_type`, `sort_index`) VALUES (261, '78', 'LP0', 2, NULL, 'ext1', 1, 11);
 
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2115, '盘点', 0, 4, 'Inventory', 'ams/Inventory/index', NULL, 1, 0, 'C', '0', '0', '', '#', 'admin', '2023-12-28 13:42:43', 'admin', '2023-12-28 13:48:03', '');

+ 48 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/pda/PdaController.java

@@ -40,6 +40,7 @@ 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.ams.stock.service.StockTakeRecordService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.form.BasLocationForm;
@@ -108,6 +109,9 @@ public class PdaController {
     @Autowired
     private IBaseLocationInfoService baseLocationInfoService;
 
+    @Autowired
+    private StockTakeRecordService stockTakeRecordService;
+
 
     //region PDA入库
 
@@ -600,6 +604,49 @@ public class PdaController {
         return wmsDocOrderHeaderService.syncPdaUnbind(unbindDTO);
     }
 
+    /**
+     * PDA盘点出库
+     * @param palletNos
+     * @return
+     */
+    @PostMapping("/stockTake/palletOutOfWarehouse")
+    public AjaxResult palletOutOfWarehouse(@RequestParam String palletNos) {
+        List<String> palletNoList = JSONArray.parseArray(palletNos, String.class);
+        stockTakeRecordService.palletOutOfWarehouse(palletNoList);
+        return AjaxResult.success();
+    }
+
+    /**
+     * PDA盘点托盘列表明细
+     * @param palletNo
+     * @return
+     */
+    @GetMapping("/stockTake/getPalletInventoryDetailList")
+    public AjaxResult getPalletInventoryDetailList(@RequestParam String palletNo) {
+        return AjaxResult.success(stockTakeRecordService.getPalletInventoryDetailList(palletNo));
+    }
+
+    /**
+     * 盘点记录 (盘点过程中调用)
+     * @param palletNo
+     * @param barCode
+     * @return
+     */
+    @PostMapping("/stockTake/stockTakePallet")
+    public AjaxResult stockTakePallet(@RequestParam String palletNo, @RequestParam String barCode) {
+        return AjaxResult.success(stockTakeRecordService.stockTakePallet(palletNo, barCode));
+    }
+
+    /**
+     * 结束盘点 将所有该托盘盘点记录状态更改为盘点完成(盘点完成调用)
+     * @param palletNo
+     * @return
+     */
+    @PostMapping("/stockTake/finishStockTakePallet")
+    public AjaxResult finishStockTakePallet(@RequestParam String palletNo) {
+        return AjaxResult.success(stockTakeRecordService.finishStockTakePallet(palletNo));
+    }
+
     /**
      * 分拣出库
      *
@@ -748,7 +795,7 @@ public class PdaController {
     }
 
     /**
-     * PDA库位释放
+     * PDA库位释放
      * 1.将出库位库存移动到分拣区
      * 2.移库出来的库存不可操作
      */

+ 60 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/wms/stock/StockTakeRecordController.java

@@ -0,0 +1,60 @@
+package com.ruoyi.web.controller.warewms.wms.stock;
+
+import com.ruoyi.ams.stock.domain.StockTakeRecord;
+import com.ruoyi.ams.stock.dto.StockTakeRecordDTO;
+import com.ruoyi.ams.stock.service.StockTakeRecordService;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.service.bean.PageData;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.Map;
+
+/**
+ * AGV任务Controller
+ *
+ * @author andy
+ * @date 2022-03-10
+ */
+@RestController
+@RequestMapping("/stock")
+public class StockTakeRecordController extends BaseController {
+
+    @Autowired
+    private StockTakeRecordService stockTakeRecordService;
+
+    @GetMapping("page")
+    @ApiOperation("分页")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = Constants.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = Constants.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = Constants.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = Constants.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "stockNo", value = "盘点单号", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "barCode", value = "条码", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "scanPallet", value = "扫描托盘", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "stockPallet", value = "盘点托盘(实际栈板)", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "sourcePallet", value = "来源托盘(账面栈板)", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "stockType", value = "盘点类型", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "beginTime", value = "起始时间", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String")
+    })
+    public AjaxResult page(@ApiIgnore @RequestParam Map<String, Object> params){
+        PageData<StockTakeRecordDTO> page = stockTakeRecordService.page(params);
+        return AjaxResult.success(page);
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation("信息")
+    public AjaxResult get(@PathVariable("id") String id){
+        StockTakeRecord data = stockTakeRecordService.selectById(id);
+        return AjaxResult.success(data);
+    }
+
+}

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

@@ -91,4 +91,4 @@ logging:
 testtag:
     autosend: false
     aciservice: false
-    gsService: true
+    gsService: false

+ 6 - 3
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java

@@ -1,13 +1,14 @@
 package com.ruoyi.common.core.domain;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.fasterxml.jackson.annotation.JsonFormat;
-
 /**
  * Entity基类
  *
@@ -26,6 +27,7 @@ public class BaseEntity implements Serializable
 
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
     private Date createTime;
 
     /** 更新者 */
@@ -33,6 +35,7 @@ public class BaseEntity implements Serializable
 
     /** 更新时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.UPDATE)
     private Date updateTime;
 
     /** 备注 */

+ 8 - 1
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -1,10 +1,13 @@
 package com.ruoyi.common.utils;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
  * 时间工具类
@@ -152,4 +155,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
+
+    public static Date offsetYear(Date date, int offset){
+        return DateUtil.offset(date, DateField.YEAR, offset);
+    }
 }

+ 41 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/MybatisPlusMetaObjectHandler.java

@@ -0,0 +1,41 @@
+package com.ruoyi.framework.mybatis;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Date;
+
+@Slf4j
+@Configuration
+public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
+
+    /**
+     * 插入时候的填充策略
+     *
+     * @param metaObject
+     */
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        this.setFieldValByName("createTime", new Date(), metaObject);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        this.setFieldValByName("createBy", loginUser.getUsername(), metaObject);
+
+    }
+
+    /**
+     * 更新时候的填充策略
+     *
+     * @param metaObject
+     */
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        this.setFieldValByName("updateTime", new Date(), metaObject);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        this.setFieldValByName("updateBy", loginUser.getUsername(), metaObject);
+    }
+
+}

+ 6 - 8
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnDetailsServiceImpl.java

@@ -1,18 +1,16 @@
 package com.ruoyi.ams.asn.service.impl;
 
-import java.util.HashMap;
-import java.util.List;
-
-import com.ruoyi.ams.asn.form.DelDocAsnDetailsForm;
-import com.ruoyi.ams.asn.form.StockForm;
+import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
+import com.ruoyi.ams.asn.mapper.WmsDocAsnDetailsMapper;
+import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
 import com.ruoyi.common.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.ams.asn.mapper.WmsDocAsnDetailsMapper;
-import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
-import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * 入库单明细Service业务层处理
  *

+ 4 - 15
warewms-ams/src/main/java/com/ruoyi/ams/box/domain/WmsBoxInfo.java

@@ -1,9 +1,10 @@
 package com.ruoyi.ams.box.domain;
 
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import com.baomidou.mybatisplus.annotation.TableField;
 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;
 
 /**
  * 容器管理对象 wms_box_info
@@ -26,10 +27,6 @@ public class WmsBoxInfo extends BaseEntity
     @Excel(name = "容器类型",type = Excel.Type.EXPORT)
     private String boxType;
 
-    /** 备注 */
-//    @Excel(name = "备注")
-    private String boxRemark;
-
     /** 状态 */
     @Excel(name = "状态",type = Excel.Type.EXPORT)
     private Integer boxState;
@@ -48,6 +45,7 @@ public class WmsBoxInfo extends BaseEntity
 
     /** 绑定库位 */
     @Excel(name = "绑定库位",type = Excel.Type.EXPORT)
+    @TableField(exist = false)
     private String locationNo;
 
     private Long locationId;
@@ -80,14 +78,6 @@ public class WmsBoxInfo extends BaseEntity
         this.boxType = boxType;
     }
 
-    public String getBoxRemark() {
-        return boxRemark;
-    }
-
-    public void setBoxRemark(String boxRemark) {
-        this.boxRemark = boxRemark;
-    }
-
     public Integer getBoxState() {
         return boxState;
     }
@@ -150,7 +140,6 @@ public class WmsBoxInfo extends BaseEntity
             .append("id", getId())
             .append("boxNo", getBoxNo())
             .append("boxType", getBoxType())
-            .append("boxRemark", getBoxRemark())
             .append("boxState", getBoxState())
             .append("isEmpty", getIsEmpty())
             .append("createBy", getCreateBy())

+ 9 - 3
warewms-ams/src/main/java/com/ruoyi/ams/box/service/IWmsBoxInfoService.java

@@ -1,12 +1,11 @@
 package com.ruoyi.ams.box.service;
 
-import java.util.List;
-
 import com.ruoyi.ams.box.domain.WmsBoxInfo;
 import com.ruoyi.ams.box.form.AddBoxForm;
-import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.common.core.domain.AjaxResult;
 
+import java.util.List;
+
 /**
  * 容器管理Service接口
  *
@@ -130,6 +129,13 @@ public interface IWmsBoxInfoService {
      */
     AjaxResult importLocation(List<WmsBoxInfo> list, boolean updateSupport, String opname);
 
+    /**
+     * 根据托盘号获取详细信息
+     * @param palletList
+     * @return
+     */
+    List<WmsBoxInfo> queryWmsBoxInfoByPalletNoList(List<String> palletList);
+
     /**
      * 修改托盘区域信息
      * @param boxNo

+ 11 - 0
warewms-ams/src/main/java/com/ruoyi/ams/box/service/impl/WmsBoxInfoServiceImpl.java

@@ -237,6 +237,17 @@ public class WmsBoxInfoServiceImpl implements IWmsBoxInfoService {
         return AjaxResult.success(successMsg);
     }
 
+    /**
+     * 根据托盘号获取详细信息
+     * @param palletList
+     * @return
+     */
+    @Override
+    public List<WmsBoxInfo> queryWmsBoxInfoByPalletNoList(List<String> palletList){
+        return wmsBoxInfoMapper.selectList(Wrappers.<WmsBoxInfo>lambdaQuery()
+                .in(WmsBoxInfo::getBoxNo, palletList));
+    }
+
     /**
      * 修改托盘区域信息
      * @param boxNo

+ 102 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvLotAttDTO.java

@@ -0,0 +1,102 @@
+package com.ruoyi.ams.inv.dto;
+
+import com.ruoyi.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 批次属性对象 inv_lot_att
+ * 
+ * @author andy
+ * @date 2022-03-09
+ */
+@Data
+public class InvLotAttDTO implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private String lotnum;
+
+    /** 货主代码 */
+    @Excel(name = "货主代码")
+    private String customerId;
+
+    /** 物料编码 */
+    @Excel(name = "物料编码")
+    private String sku;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt01;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt02;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt03;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt04;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt05;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt06;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt07;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt08;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt09;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt10;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt11;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt12;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt13;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt14;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt15;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt16;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt17;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String lotatt18;
+
+}

+ 79 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/dto/InvLotLocIdDTO.java

@@ -0,0 +1,79 @@
+package com.ruoyi.ams.inv.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 库位库存信息对象 inv_lot_loc_id
+ *
+ * @author andy
+ * @date 2022-03-03
+ */
+@Data
+public class InvLotLocIdDTO implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 批次号 */
+    private String lotnum;
+
+    @TableField(exist = false)
+    private String lotnumTo;
+
+    /** 库位 */
+    private String locationId;
+
+    /** 跟踪号 */
+    @Excel(name = "跟踪号")
+    private String traceid;
+
+    /** 客户 */
+    private String customerId;
+
+    /** 产品 */
+    private String sku;
+
+    /** 库存数量(件) */
+    @Excel(name = "库存数量(件)")
+    private BigDecimal qty;
+
+    /** 库存数量 */
+    @Excel(name = "库存数量")
+    private BigDecimal qtyEach;
+
+    /** 分配数量 */
+    @Excel(name = "分配数量")
+    private BigDecimal qtyallocated;
+
+    /** 库存数量(件) */
+    @Excel(name = "库存数量(件)")
+    private BigDecimal qtyallocatedEach;
+
+    /** 上架数量 */
+    @Excel(name = "上架数量")
+    private BigDecimal qtypa;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private BigDecimal qtyrpin;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private BigDecimal qtyrpout;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private BigDecimal qtymvin;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private BigDecimal qtymvout;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private BigDecimal qtyonhold;
+}

+ 5 - 1
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotAttService.java

@@ -1,8 +1,10 @@
 package com.ruoyi.ams.inv.service;
 
 import com.ruoyi.ams.inv.domain.InvLotAtt;
+import com.ruoyi.ams.inv.dto.InvLotAttDTO;
 import com.ruoyi.ams.inv.dto.InvLotAttPalletTotalDTO;
 import com.ruoyi.ams.order.dto.ReversePickInventoryMatchDTO;
+import com.ruoyi.framework.service.CrudService;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -14,7 +16,7 @@ import java.util.Map;
  * @author andy
  * @date 2022-03-09
  */
-public interface IInvLotAttService
+public interface IInvLotAttService extends CrudService<InvLotAtt, InvLotAttDTO>
 {
     /**
      * 查询批次属性
@@ -127,6 +129,8 @@ public interface IInvLotAttService
      */
     List<InvLotAtt> queryInvLotAtt(String palletNo, String sn, String orderNo);
 
+    List<InvLotAtt> queryInvLotAttByBarCodeList(String sn);
+
     /**
      * 根据出库单号查询已备货/出库批次
      * @param orderNoList

+ 5 - 2
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotLocIdService.java

@@ -9,12 +9,13 @@ 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.InvLotLocIdDTO;
 import com.ruoyi.ams.inv.dto.InvLotLocIdSurplusQtyDTO;
 import com.ruoyi.ams.order.domain.ActAllocationDTO;
-import com.ruoyi.ams.order.domain.ActAllocationDetails;
 import com.ruoyi.ams.order.form.LineReleaseFrom;
 import com.ruoyi.base.domain.form.BasLocationForm;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.service.CrudService;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -25,7 +26,7 @@ import java.util.List;
  * @author andy
  * @date 2022-03-03
  */
-public interface IInvLotLocIdService {
+public interface IInvLotLocIdService extends CrudService<InvLotLocId, InvLotLocIdDTO> {
     /**
      * 查询库位库存信息
      *
@@ -435,6 +436,8 @@ public interface IInvLotLocIdService {
      */
     Boolean updateInvLotLocId(String lotNum, BigDecimal qtyAllocated, String sku);
 
+    Boolean updateInvLotLocIdLotNum(String lotNum, String lotNumTo, String locationId);
+
     /**
      * 修改库位库存主键以及库位id
      * @param lotNum

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

@@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.ams.inv.domain.InvLotAtt;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
+import com.ruoyi.ams.inv.dto.InvLotAttDTO;
 import com.ruoyi.ams.inv.dto.InvLotAttPalletTotalDTO;
 import com.ruoyi.ams.inv.dto.InvLotLocIdSurplusQtyDTO;
 import com.ruoyi.ams.inv.mapper.InvLotAttMapper;
@@ -16,6 +18,7 @@ import com.ruoyi.ams.order.dto.ReversePickInventoryMatchDTO;
 import com.ruoyi.common.utils.ConvertUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.service.impl.CrudServiceImpl;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,7 +37,7 @@ import java.util.stream.Collectors;
  * @date 2022-03-09
  */
 @Service
-public class InvLotAttServiceImpl implements IInvLotAttService {
+public class InvLotAttServiceImpl extends CrudServiceImpl<InvLotAttMapper, InvLotAtt, InvLotAttDTO> implements IInvLotAttService {
     @Autowired
     private InvLotAttMapper invLotAttMapper;
 
@@ -246,6 +249,17 @@ public class InvLotAttServiceImpl implements IInvLotAttService {
                 .eq(StringUtils.isNotBlank(orderNo), InvLotAtt::getLotatt14, orderNo));
     }
 
+    /**
+     * 根据条码获取批次信息
+     * @param sn
+     * @return
+     */
+    @Override
+    public List<InvLotAtt> queryInvLotAttByBarCodeList(String sn){
+        return invLotAttMapper.selectList(Wrappers.<InvLotAtt>lambdaQuery()
+                .eq(InvLotAtt::getLotatt02, sn));
+    }
+
     /**
      * 根据出库单号查询已备货/出库批次
      * @param orderNoList
@@ -256,7 +270,6 @@ public class InvLotAttServiceImpl implements IInvLotAttService {
         return queryOrderSameSkuInvLotAttList(Lists.newArrayList(), orderNoList);
     }
 
-
     /**
      * 根据出库单号及物料码查询出库单与扫描物料相同已分配数量
      * @param sku
@@ -299,4 +312,8 @@ public class InvLotAttServiceImpl implements IInvLotAttService {
     }
 
 
+    @Override
+    public QueryWrapper<InvLotAtt> getWrapper(Map<String, Object> params) {
+        return null;
+    }
 }

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

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.ams.box.domain.WmsBoxInfo;
@@ -19,12 +20,12 @@ 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.InvLotLocIdDTO;
 import com.ruoyi.ams.inv.dto.InvLotLocIdSurplusQtyDTO;
 import com.ruoyi.ams.inv.mapper.InvLotAttMapper;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.order.domain.ActAllocationDTO;
-import com.ruoyi.ams.order.domain.ActAllocationDetails;
 import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
 import com.ruoyi.ams.order.form.LineReleaseFrom;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
@@ -41,6 +42,7 @@ import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.ConvertUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.service.impl.CrudServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.BeanUtils;
@@ -52,6 +54,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -62,7 +65,7 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
-public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
+public class InvLotLocIdServiceImpl extends CrudServiceImpl<InvLotLocIdMapper, InvLotLocId, InvLotLocIdDTO> implements IInvLotLocIdService {
 
     @Autowired
     private InvLotLocIdMapper invLotLocIdMapper;
@@ -1113,7 +1116,8 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
     public List<InvLotLocIdSurplusQtyDTO> buildInvLotLocIdSurplusQtyDTOList(List<String> skuList){
         List<InvLotLocId> invLotLocIdList = queryInvLotLocIdBySkuList(skuList);
         if (CollectionUtil.isEmpty(invLotLocIdList)) return Lists.newArrayList();
-        return invLotLocIdList.stream().filter(item -> ObjectUtil.isNotNull(item.getQty()) && NumberUtil.isGreater(item.getQty().subtract(item.getQtyallocated()), BigDecimal.ZERO)).map(item -> {
+        return invLotLocIdList.stream().filter(item -> ObjectUtil.isNotNull(item.getQty()) &&
+                NumberUtil.isGreater(item.getQty().subtract(item.getQtyallocated()), BigDecimal.ZERO) && !Constant.LOC_SORTATION_CACHE.equals(Long.parseLong(item.getLocationId()))).map(item -> {
             InvLotLocIdSurplusQtyDTO invLotLocIdSurplusQtyDTO = ConvertUtils.sourceToTarget(item, InvLotLocIdSurplusQtyDTO.class);
             invLotLocIdSurplusQtyDTO.setSurplusQty(ObjectUtil.isNotNull(item.getQtyallocated()) ? item.getQty().subtract(item.getQtyallocated()) : item.getQty());
             return invLotLocIdSurplusQtyDTO;
@@ -1174,6 +1178,18 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return updateInvLotLocId(lotNum, null, null, qtyAllocated, sku, null);
     }
 
+    /**
+     * 修改库位库存主键以及库位id
+     * @param lotNum
+     * @param lotNumTo
+     * @param locationId
+     * @return
+     */
+    @Override
+    public Boolean updateInvLotLocIdLotNum(String lotNum, String lotNumTo, String locationId) {
+        return updateInvLotLocIdLotNum(lotNum, lotNumTo, locationId, null);
+    }
+
     /**
      * 修改库位库存主键以及库位id
      * @param lotNum
@@ -1187,7 +1203,7 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
                 .eq(InvLotLocId::getLotnum, lotNum)
                 .set(StringUtils.isNotBlank(lotNumTo), InvLotLocId::getLotnum, lotNumTo)
                 .set(StringUtils.isNotBlank(locationId), InvLotLocId::getLocationId, locationId)
-                .set(InvLotLocId::getQtyallocated, qtyAllocated)
+                .set(ObjectUtil.isNotNull(qtyAllocated), InvLotLocId::getQtyallocated, qtyAllocated)
         ) > 0;
     }
 
@@ -1218,4 +1234,8 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
         return invLotLocIdMapper.selectAllocationList(actAllocationDTO);
     }
 
+    @Override
+    public QueryWrapper<InvLotLocId> getWrapper(Map params) {
+        return null;
+    }
 }

+ 26 - 21
warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java

@@ -1315,14 +1315,14 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
     @Override
     public AjaxResult groupDiskBHCheck(GroupDiskFrom groupDiskFrom) {
 
-        //根据托盘号和库位查询托盘信息
-        WmsBoxInfo queryBoxInfo = new WmsBoxInfo();
-        queryBoxInfo.setBoxNo(groupDiskFrom.getPalletNoTo());
-        queryBoxInfo.setLocationId(Constant.LOC_SORTATION_CACHE);
-        WmsBoxInfo boxInfo = wmsBoxInfoService.selectWmsBoxInfoByModel(queryBoxInfo);
-        if (ObjectUtil.isNull(boxInfo) || StringUtils.isBlank(boxInfo.getBoxNo())) {
-            return AjaxResult.error(queryBoxInfo.getLocationId()+"库位不存在存在该托盘");
-        }
+//        //根据托盘号和库位查询托盘信息
+//        WmsBoxInfo queryBoxInfo = new WmsBoxInfo();
+//        queryBoxInfo.setBoxNo(groupDiskFrom.getPalletNoTo());
+//        queryBoxInfo.setLocationId(Constant.LOC_SORTATION_CACHE);
+//        WmsBoxInfo boxInfo = wmsBoxInfoService.selectWmsBoxInfoByModel(queryBoxInfo);
+//        if (ObjectUtil.isNull(boxInfo) || StringUtils.isBlank(boxInfo.getBoxNo())) {
+//            return AjaxResult.error(queryBoxInfo.getLocationId()+"库位不存在存在该托盘");
+//        }
 
         //通过ERP单号获取WMS的出库单号
         String orderNo = wmsDocOrderHeaderService.changeErpNoToOrderNo(groupDiskFrom.getOrderNo());
@@ -2853,7 +2853,8 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public Boolean separatePick(String orderNos) {
         List<String> orderList = JSONArray.parseArray(orderNos, String.class);
-        List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
+        List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().
+                in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
         if (CollectionUtil.isEmpty(wmsDocOrderHeaderList)) {
             throw new BaseException("请扫描正确的出库单号");
         }
@@ -2901,11 +2902,13 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
         List<String> orderList = JSONArray.parseArray(orderNos, String.class);
         String order = String.join(",", orderList);
         List<PalletMatchLog> palletMatchLogList = palletMatchLogService.queryPalletMatchLogByOrderNos(order);
-        List<BaseLocationInfo> baseLocationInfoList = baseLocationInfoService.selectBaseLocationInfoList(palletMatchLogList.stream().map(PalletMatchLog::getLocationId).collect(Collectors.toList()));
+        List<BaseLocationInfo> baseLocationInfoList = baseLocationInfoService.selectBaseLocationInfoList(palletMatchLogList.stream().
+                map(PalletMatchLog::getLocationId).collect(Collectors.toList()));
 
         return palletMatchLogList.stream().map(item -> {
             PalletMatchLogDTO palletMatchLogDTO = ConvertUtils.sourceToTarget(item, PalletMatchLogDTO.class);
-            BaseLocationInfo locationInfo = baseLocationInfoList.stream().filter(baseLocationInfo -> baseLocationInfo.getId().equals(Long.parseLong(item.getLocationId()))).findFirst().orElseThrow(() -> new BaseException("库位信息有误"));
+            BaseLocationInfo locationInfo = baseLocationInfoList.stream().filter(baseLocationInfo ->
+                    baseLocationInfo.getId().equals(Long.parseLong(item.getLocationId()))).findFirst().orElseThrow(() -> new BaseException("库位信息有误"));
             palletMatchLogDTO.setLocationNo(locationInfo.getLocationNo());
             return palletMatchLogDTO;
         }).collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PalletMatchLogDTO::getPalletNo))), ArrayList::new));
@@ -2962,7 +2965,8 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
         InvLotLocId invLotLocId = invLotLocIdService.queryInvLotLocIdByLotnum(unbindDTO.getLotnum());
         Long locationId = unbindWmsBox(unbindDTO.getPalletTo(), unbindDTO.getPalletFrom());
         unbindInvLotLoc(unbindDTO.getLotnum(), locationId, unbindDTO.getPalletFrom(), unbindDTO.getSku());
-        if (StringUtils.isBlank(unbindDTO.getErpNo())) return AjaxResult.success("托盘:" + unbindDTO.getPalletTo() + "解绑成功!托盘数量: " + invLotAttService.queryPalletTotal(unbindDTO.getPalletTo(), locationId.toString()));
+        if (StringUtils.isBlank(unbindDTO.getErpNo())) return AjaxResult.success("托盘:" + unbindDTO.getPalletTo() + "解绑成功!托盘数量: " +
+                invLotAttService.queryPalletTotal(unbindDTO.getPalletTo(), locationId.toString()));
         // 删除条码扫描记录
         erpBarcodesService.untieRecordErpBarcodeListAsnSo(unbindDTO.getErpNo(), null, unbindDTO.getSn());
         unbindWmsDocOrder(unbindDTO.getErpNo(), invLotLocId.getQty(), unbindDTO.getSku());
@@ -2971,7 +2975,8 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
 
     private List<WmsDocOrderDetails> getWmsDocOrderDetailsList(List<String> orderList, String orderType){
         //根据erp单号获取出库单头列表
-        List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
+        List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery()
+                .in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
         if (CollectionUtil.isEmpty(wmsDocOrderHeaderList)) {
             throw new BaseException("请扫描正确的出库单号");
         }
@@ -3074,14 +3079,14 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
         //所需出库托盘
         List<InvLotAttPalletTotalDTO> result = new ArrayList<>();
         //sku出库单需求总数
-        if (CollectionUtil.isNotEmpty(palletMatchLogList)){
-            List<InvLotAttPalletTotalDTO> invLotAttMatchPalletTotalList = lotAttPalletTotalDTOList.stream().filter(item -> !palletMatchLogList.stream().map(PalletMatchLog::getPalletNo).collect(Collectors.toList()).contains(item.getPalletNo())).collect(Collectors.toList());
-            if (CollectionUtil.isEmpty(invLotAttMatchPalletTotalList)) {
-                result.addAll(lotAttPalletTotalDTOList);
-                return result;
-            }
-            lotAttPalletTotalDTOList = invLotAttMatchPalletTotalList;
-        }
+//        if (CollectionUtil.isNotEmpty(palletMatchLogList)){
+//            List<InvLotAttPalletTotalDTO> invLotAttMatchPalletTotalList = lotAttPalletTotalDTOList.stream().filter(item -> !palletMatchLogList.stream().map(PalletMatchLog::getPalletNo).collect(Collectors.toList()).contains(item.getPalletNo())).collect(Collectors.toList());
+//            if (CollectionUtil.isEmpty(invLotAttMatchPalletTotalList)) {
+//                result.addAll(lotAttPalletTotalDTOList);
+//                return result;
+//            }
+//            lotAttPalletTotalDTOList = invLotAttMatchPalletTotalList;
+//        }
 
         for (InvLotAttPalletTotalDTO invLotAttPalletTotalDTO : lotAttPalletTotalDTOList) {
             BigDecimal palletTotal = new BigDecimal(invLotAttPalletTotalDTO.getTotalQty());

+ 54 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/domain/StockTakeRecord.java

@@ -0,0 +1,54 @@
+package com.ruoyi.ams.stock.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 托盘匹配记录对象 pallet_match_log
+ * 
+ * @author ruoyi
+ * @date 2023-08-23
+ */
+@Data
+public class StockTakeRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /** 盘点单号 */
+    @Excel(name = "盘点单号")
+    private String stockNo;
+
+    /** 条形码 */
+    @Excel(name = "条形码")
+    private String barCode;
+
+    /** 扫描托盘 */
+    @Excel(name = "扫描托盘")
+    private String scanPallet;
+
+    /** 盘点托盘(实际栈板) */
+    @Excel(name = "盘点托盘(实际栈板)")
+    private String stockPallet;
+
+    /** 来源托盘(账面栈板) */
+    @Excel(name = "来源托盘(账面栈板)")
+    private String sourcePallet;
+
+    /** 盘点状态 1:已完成 2:未完成 */
+    @Excel(name = "盘点状态")
+    private String stockStatus;
+
+    /** 盘点类型 1:盘亏 2:盘盈*/
+    private String stockType;
+
+    /** 取消盘点标志 Y/N*/
+    private String delFlag;
+
+}

+ 25 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/dto/PalletInventoryDetailDTO.java

@@ -0,0 +1,25 @@
+package com.ruoyi.ams.stock.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PalletInventoryDetailDTO implements Serializable {
+
+    private static final long serialVersionUID = 3440857699154179029L;
+
+    @ApiModelProperty("产品/物料")
+    private String sku;
+
+    @ApiModelProperty("品名")
+    private String desc;
+
+    @ApiModelProperty("规格")
+    private String model;
+
+    @ApiModelProperty("条码")
+    private String barCode;
+
+}

+ 38 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/dto/StockTakeRecordDTO.java

@@ -0,0 +1,38 @@
+package com.ruoyi.ams.stock.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class StockTakeRecordDTO implements Serializable {
+
+    private static final long serialVersionUID = -3052302494611264008L;
+
+    /** id */
+    private String id;
+
+    /** 盘点单号 */
+    private String stockNo;
+
+    /** 条形码 */
+    private String barCode;
+
+    /** 扫描托盘 */
+    private String scanPallet;
+
+    /** 盘点托盘(实际栈板) */
+    private String stockPallet;
+
+    /** 来源托盘(账面栈板) */
+    private String sourcePallet;
+
+    /** 盘点状态 1:已完成 2:未完成 */
+    private String stockStatus;
+
+    /** 盘点类型 1:盘亏 2:盘盈*/
+    private String stockType;
+
+    /** 取消盘点标志 Y/N*/
+    private String delFlag;
+}

+ 16 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/mapper/StockTakeRecordMapper.java

@@ -0,0 +1,16 @@
+package com.ruoyi.ams.stock.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.ams.stock.domain.StockTakeRecord;
+
+/**
+ * 托盘匹配记录Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2023-08-23
+ */
+public interface StockTakeRecordMapper extends BaseMapper<StockTakeRecord>
+{
+
+
+}

+ 47 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/service/StockTakeRecordService.java

@@ -0,0 +1,47 @@
+package com.ruoyi.ams.stock.service;
+
+import com.ruoyi.ams.stock.domain.StockTakeRecord;
+import com.ruoyi.ams.stock.dto.PalletInventoryDetailDTO;
+import com.ruoyi.ams.stock.dto.StockTakeRecordDTO;
+import com.ruoyi.framework.service.CrudService;
+
+import java.util.List;
+
+/**
+ * 托盘匹配记录Service接口
+ * 
+ * @author ruoyi
+ * @date 2023-08-23
+ */
+public interface StockTakeRecordService extends CrudService<StockTakeRecord, StockTakeRecordDTO>
+{
+
+    /**
+     * 盘点出库
+     * @param palletNoList
+     */
+    void palletOutOfWarehouse(List<String> palletNoList);
+
+    /**
+     * PDA盘点托盘列表明细
+     * @param palletNo
+     * @return
+     */
+    List<PalletInventoryDetailDTO> getPalletInventoryDetailList(String palletNo);
+
+    /**
+     * 盘点记录 (盘点过程中调用)
+     *
+     * @param palletNo
+     * @param barCode
+     * @return
+     */
+    Boolean stockTakePallet(String palletNo, String barCode);
+
+    /**
+     * 结束盘点 将所有该托盘盘点记录状态更改为盘点完成(盘点完成调用)
+     * @param palletNo
+     * @return
+     */
+    Boolean finishStockTakePallet(String palletNo);
+}

+ 337 - 0
warewms-ams/src/main/java/com/ruoyi/ams/stock/service/impl/StockTakeRecordServiceImpl.java

@@ -0,0 +1,337 @@
+package com.ruoyi.ams.stock.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.ams.box.domain.WmsBoxInfo;
+import com.ruoyi.ams.box.service.IWmsBoxInfoService;
+import com.ruoyi.ams.inv.domain.InvLotAtt;
+import com.ruoyi.ams.inv.domain.InvLotLocId;
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
+import com.ruoyi.ams.order.form.CheckOutInfoForm;
+import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
+import com.ruoyi.ams.stock.domain.StockTakeRecord;
+import com.ruoyi.ams.stock.dto.PalletInventoryDetailDTO;
+import com.ruoyi.ams.stock.dto.StockTakeRecordDTO;
+import com.ruoyi.ams.stock.mapper.StockTakeRecordMapper;
+import com.ruoyi.ams.stock.service.StockTakeRecordService;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseSku;
+import com.ruoyi.base.service.IBaseSkuService;
+import com.ruoyi.base.service.ICodeSkuRelationshipService;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.ConvertUtils;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.service.impl.CrudServiceImpl;
+import io.jsonwebtoken.lang.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 托盘匹配记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-08-23
+ */
+@Service
+public class StockTakeRecordServiceImpl extends CrudServiceImpl<StockTakeRecordMapper, StockTakeRecord, StockTakeRecordDTO> implements StockTakeRecordService {
+    @Autowired
+    private IWmsDocOrderHeaderService wmsDocOrderHeaderService;
+
+    @Autowired
+    private IWmsBoxInfoService wmsBoxInfoService;
+
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+
+    @Autowired
+    private IInvLotAttService invLotAttService;
+
+    @Autowired
+    private IBaseSkuService baseSkuService;
+
+    @Autowired
+    private ICodeSkuRelationshipService codeSkuRelationshipService;
+
+    /**
+     * 盘点出库
+     *
+     * @param palletNoList
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void palletOutOfWarehouse(List<String> palletNoList) {
+        Assert.isTrue(CollectionUtil.isNotEmpty(palletNoList), "托盘号不能为空!");
+        List<WmsBoxInfo> wmsBoxInfoList = wmsBoxInfoService.queryWmsBoxInfoByPalletNoList(palletNoList);
+        List<CheckOutInfoForm> checkOutInfoFormList = wmsBoxInfoList.stream().filter(item ->
+                        //过滤掉托盘号、库位信息丢失托盘信息
+                        StringUtils.isNotBlank(item.getBoxNo()) && ObjectUtil.isNotNull(item.getLocationId()))
+                .map(item -> {
+                    CheckOutInfoForm checkOutInfoForm = ConvertUtils.sourceToTarget(item, CheckOutInfoForm.class);
+                    checkOutInfoForm.setPalletNo(item.getBoxNo());
+                    checkOutInfoForm.setLocationNo(item.getLocationId().toString());
+                    return checkOutInfoForm;
+                }).collect(Collectors.toList());
+        Assert.isTrue(CollectionUtil.isNotEmpty(checkOutInfoFormList), "托盘信息丢失!");
+        //下发ams任务 物料拉动
+        checkOutInfoFormList.forEach(item -> wmsDocOrderHeaderService.doCheckout(item));
+    }
+
+    /**
+     * 根据托盘号获取明细
+     *
+     * @param palletNo
+     * @return
+     */
+    @Override
+    public List<PalletInventoryDetailDTO> getPalletInventoryDetailList(String palletNo) {
+        List<InvLotAtt> invLotAttList = getInventoryListByPalletNo(palletNo);
+        List<BaseSku> baseSkuList = baseSkuService.queryActiveSkuList(invLotAttList.stream().map(InvLotAtt::getSku).collect(Collectors.toList()));
+        Assert.isTrue(CollectionUtil.isNotEmpty(baseSkuList), "物料信息系统未维护!");
+        Map<String, List<BaseSku>> skuInfoMap = baseSkuList.stream().collect(Collectors.groupingBy(BaseSku::getSku));
+        List<StockTakeRecord> stockTakeRecordByPalletList = getStockTakeRecordByPalletList(palletNo);
+        return invLotAttList.stream().filter(item ->
+                        stockTakeRecordByPalletList.stream().noneMatch(stockTakeRecord ->
+                                StrUtil.equals(stockTakeRecord.getBarCode(), item.getLotatt02())))
+                .map(item -> {
+                    PalletInventoryDetailDTO palletInventoryDetailDTO = new PalletInventoryDetailDTO();
+                    palletInventoryDetailDTO.setSku(item.getSku());
+                    //品号
+                    BaseSku baseSku = CollectionUtil.isNotEmpty(skuInfoMap.get(item.getSku())) ?
+                            skuInfoMap.get(item.getSku()).stream().findFirst().get() : null;
+                    palletInventoryDetailDTO.setDesc(ObjectUtil.isNotNull(baseSku) ? baseSku.getDesc1() : null);
+                    //规格
+                    palletInventoryDetailDTO.setModel(ObjectUtil.isNotNull(baseSku) ? baseSku.getModel() : null);
+                    //条码
+                    palletInventoryDetailDTO.setBarCode(item.getLotatt02());
+                    return palletInventoryDetailDTO;
+                }).collect(Collectors.toList());
+    }
+
+    /**
+     * 盘点记录 (盘点过程中调用)
+     *
+     * @param palletNo
+     * @param barCode
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean stockTakePallet(String palletNo, String barCode) {
+        codeSkuRelationshipService.checkIsProduct(barCode);
+        List<StockTakeRecord> stockTakeRecordByPalletList = getStockTakeRecordByPalletList(palletNo);
+        String stockNo = null;
+        if (CollectionUtil.isNotEmpty(stockTakeRecordByPalletList)){
+            stockNo = stockTakeRecordByPalletList.stream().map(StockTakeRecord::getStockNo).findFirst().get();
+            List<StockTakeRecord> stockTakeRecordFilterByBarCodeList = stockTakeRecordByPalletList.stream().filter(item ->
+                    StringUtils.equals(item.getBarCode(), barCode)).collect(Collectors.toList());
+            Assert.isTrue(CollectionUtil.isEmpty(stockTakeRecordFilterByBarCodeList), "该条码已盘点!");
+        }
+        List<InvLotAtt> palletInventoryList = getInventoryListByPalletNo(palletNo);
+        List<InvLotAtt> barCodeList = palletInventoryList.stream().filter(item ->
+                StrUtil.equals(item.getLotatt02(), barCode)).collect(Collectors.toList());
+        //根据扫描条码过滤的集合不为空 说明盘点状态为正常库存状态
+        if (CollectionUtil.isNotEmpty(barCodeList)) {
+            return baseDao.insert(buildStockTakeRecord(Constant.STOCK_TAKE_TYPE.NORMAL.getValue(), palletNo, barCode, stockNo)) > 0;
+        }
+        //1.根据扫描条码过滤的集合如果为空 则说明该条码账面托盘不是扫描托盘
+        //2.判断在盘点记录表中是否有该条码盘点状态为盈亏的记录 如果有更改盈亏记录状态为正常 此条记录盘点状态也为正常状态
+        //3.如不存在 则记录此条码状态为盘盈
+        List<StockTakeRecord> stockTakeRecordByBarCodeList = getStockTakeRecordByBarCodeList(ListUtil.toList(barCode), Constant.STOCK_TAKE_TYPE.LOSS.getValue());
+        String stockType = Constant.STOCK_TAKE_TYPE.SURPLUS.getValue();
+        if (CollectionUtil.isNotEmpty(stockTakeRecordByBarCodeList)) {
+            stockType = Constant.STOCK_TAKE_TYPE.NORMAL.getValue();
+            updateStockTakeRecordType(stockTakeRecordByBarCodeList.stream().findFirst().get().getId(), stockType);
+        } else {
+            operateInventory(barCode, palletNo);
+        }
+        return baseDao.insert(buildStockTakeRecord(stockType, palletNo, barCode, stockNo)) > 0;
+    }
+
+    /**
+     * 结束盘点 将所有该托盘盘点记录状态更改为盘点完成(盘点完成调用)
+     *
+     * @param palletNo
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean finishStockTakePallet(String palletNo) {
+        //结束盘点时 查询托盘上是否还存在库存
+        try {
+            //如果捕捉到IllegalArgumentException异常 则说明托盘无库存 直接进行盘点记录状态更改
+            //如果未发生异常则说明有条码为盘亏状态
+            List<InvLotAtt> palleInventoryList = getInventoryListByPalletNo(palletNo);
+            //查询盘亏条码在盘点记录中是否存在盘盈
+            List<StockTakeRecord> stockTakeRecordByBarCodeList = getStockTakeRecordByBarCodeList(palleInventoryList.stream()
+                    .map(InvLotAtt::getLotatt02).collect(Collectors.toList()), Constant.STOCK_TAKE_TYPE.SURPLUS.getValue());
+            //如果条码存在盘盈记录 将之前盘点盘盈记录状态更改为正常 此次盘点记录为正常
+            if (CollectionUtil.isNotEmpty(stockTakeRecordByBarCodeList)) {
+                stockTakeRecordByBarCodeList.forEach(item -> item.setStockType(Constant.STOCK_TAKE_TYPE.NORMAL.getValue()));
+                //过滤出盘点记录中不存在盘盈状态的条码
+                palleInventoryList = palleInventoryList.stream().filter(item ->
+                        stockTakeRecordByBarCodeList.stream().noneMatch(stockTakeRecord ->
+                                StrUtil.equals(item.getLotatt02(), stockTakeRecord.getBarCode()))).collect(Collectors.toList());
+                updateBatchById(stockTakeRecordByBarCodeList);
+            }
+            //如果palleInventoryList不为空则说明有盘亏状态产生
+            if (CollectionUtil.isNotEmpty(palleInventoryList)) {
+                List<StockTakeRecord> stockTakeLossTypeList = new ArrayList<>();
+                List<StockTakeRecord> stockTakeRecordByPalletList = getStockTakeRecordByPalletList(palletNo);
+                String stockNo = CollectionUtil.isNotEmpty(stockTakeRecordByPalletList) ?
+                        stockTakeRecordByPalletList.stream().map(StockTakeRecord::getStockNo).findFirst().get() : null;
+                palleInventoryList.forEach(item ->
+                        stockTakeLossTypeList.add(buildStockTakeRecord(Constant.STOCK_TAKE_TYPE.LOSS.getValue(), palletNo, item.getLotatt02(), stockNo)));
+                //添加盘亏记录
+                insertBatch(stockTakeLossTypeList);
+                operateInventory(palleInventoryList, palletNo);
+            }
+        } catch (IllegalArgumentException e) {
+        }
+        //将所有该托盘盘点记录状态更改为盘点完成
+        return baseDao.update(new StockTakeRecord(), Wrappers.<StockTakeRecord>lambdaUpdate()
+                .set(StockTakeRecord::getStockStatus, Constant.STOCK_TAKE_STATUS.FINISHED.getValue())
+                .eq(StockTakeRecord::getScanPallet, palletNo)
+                .eq(StockTakeRecord::getDelFlag, Constants.NO)
+                .eq(StockTakeRecord::getStockStatus, Constant.STOCK_TAKE_STATUS.UNFINISHED.getValue())) > 0;
+    }
+
+    private void operateInventory(String barCode, String palletNo) {
+        //根据条码获取到有效库存
+        List<InvLotAtt> invLotAttList = getInventoryListByBarCode(barCode);
+        operateInventory(invLotAttList, palletNo);
+    }
+
+    /**
+     * 修改库存、增加盘点批次
+     *
+     * @param lotAttList
+     * @param palletNo
+     */
+    private void operateInventory(List<InvLotAtt> lotAttList, String palletNo) {
+        List<InvLotAtt> invLotAttInsertList = new ArrayList<>();
+        WmsBoxInfo wmsBoxInfo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(palletNo);
+        lotAttList.forEach(item -> {
+            String lotNum = IdWorker.getIdStr();
+            invLotAttInsertList.add(buildInvLotAtt(lotNum, palletNo, item));
+            //修改库存
+            invLotLocIdService.updateInvLotLocIdLotNum(item.getLotnum(), lotNum, wmsBoxInfo.getLocationId().toString());
+        });
+        invLotAttService.insertBatch(invLotAttInsertList);
+    }
+
+    private List<InvLotAtt> getInventoryListByBarCode(String barCode) {
+        return getInventoryList(null, barCode);
+    }
+
+    private List<InvLotAtt> getInventoryListByPalletNo(String palletNo) {
+        return getInventoryList(palletNo, null);
+    }
+
+    private List<InvLotAtt> getInventoryList(String palletNo, String barCode) {
+        Assert.isTrue(StringUtils.isNotBlank(palletNo) || StringUtils.isNotBlank(barCode), "托盘和条码不能都为空!");
+        List<InvLotAtt> invLotAttList = StringUtils.isNotBlank(palletNo) ? invLotAttService.queryInvLotAtt(palletNo) :
+                invLotAttService.queryInvLotAttByBarCodeList(barCode);
+        Assert.isTrue(CollectionUtil.isNotEmpty(invLotAttList), "无库存信息!");
+        List<InvLotLocId> invLotLocIdList = invLotLocIdService.queryInvLotLocIdByLotnum(invLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList()));
+        Assert.isTrue(CollectionUtil.isNotEmpty(invLotLocIdList), "无库存信息!");
+        return invLotAttList.stream().filter(item ->
+                //通过库存筛选出对应的批次列表
+                invLotLocIdList.stream().anyMatch(invLotLocId -> StringUtils.equals(invLotLocId.getLotnum(), item.getLotnum()))).collect(Collectors.toList());
+    }
+
+    private StockTakeRecord buildStockTakeRecord(String stockType, String scanPallet, String barCode, String stockNo) {
+        //true为正常状态 false为发生盘盈or盘亏
+        boolean flag = StrUtil.equals(Constant.STOCK_TAKE_TYPE.NORMAL.getValue(), stockType);
+        StockTakeRecord stockTakeRecord = new StockTakeRecord();
+        stockTakeRecord.setDelFlag(Constants.NO);
+        stockTakeRecord.setStockType(stockType);
+        //新增时默认状态为未完成 当pda点击完成后 根据托盘整体修改状态为完成
+        stockTakeRecord.setStockStatus(Constant.STOCK_TAKE_STATUS.UNFINISHED.getValue());
+        //盘盈的时候,账面栈板为虚拟栈板 盘亏和正常的时候 账面栈板为扫描栈板
+        stockTakeRecord.setSourcePallet(flag || StrUtil.equals(Constant.STOCK_TAKE_TYPE.LOSS.getValue(), stockType) ?
+                scanPallet : Constant.VIRTUAL_PALLET);
+        //盘亏的时候,实际栈板为虚拟栈板 盘盈和正常的时候 实际栈板为扫描栈板
+        stockTakeRecord.setStockPallet(flag || StrUtil.equals(Constant.STOCK_TAKE_TYPE.SURPLUS.getValue(), stockType) ?
+                scanPallet : Constant.VIRTUAL_PALLET);
+        stockTakeRecord.setScanPallet(scanPallet);
+        stockTakeRecord.setBarCode(barCode);
+        stockTakeRecord.setId(IdWorker.getIdStr());
+        stockTakeRecord.setStockNo(StringUtils.isNotBlank(stockNo) ? stockNo : Constant.PD.concat(stockTakeRecord.getId()));
+        return stockTakeRecord;
+    }
+
+    private InvLotAtt buildInvLotAtt(String lotNum, String palletNo, InvLotAtt invLotAtt) {
+        InvLotAtt convertInvLotAtt = ConvertUtils.sourceToTarget(invLotAtt, InvLotAtt.class);
+        convertInvLotAtt.setLotnum(lotNum);
+        convertInvLotAtt.setLotatt07(palletNo);
+        convertInvLotAtt.setCreateBy("stock");
+        convertInvLotAtt.setRemark("add inv lot att cause by stock take");
+        return convertInvLotAtt;
+    }
+
+    private List<StockTakeRecord> getStockTakeRecordByBarCodeList(List<String> barCodeList, String stockType) {
+        return baseDao.selectList(Wrappers.<StockTakeRecord>lambdaQuery()
+                .in(StockTakeRecord::getBarCode, barCodeList)
+                .eq(StockTakeRecord::getDelFlag, Constants.NO)
+                .eq(StockTakeRecord::getStockType, stockType));
+    }
+
+    private void updateStockTakeRecordType(String id, String stockType) {
+        baseDao.update(new StockTakeRecord(), Wrappers.<StockTakeRecord>lambdaUpdate()
+                .set(StockTakeRecord::getStockType, stockType)
+                .eq(StockTakeRecord::getId, id));
+    }
+
+    private List<StockTakeRecord> getStockTakeRecordByPalletList(String palletNo) {
+        return getStockTakeRecordByPalletList(palletNo, null);
+    }
+
+    private List<StockTakeRecord> getStockTakeRecordByPalletList(String palletNo, String barCode) {
+        return baseDao.selectList(Wrappers.<StockTakeRecord>lambdaQuery()
+                .eq(StockTakeRecord::getScanPallet, palletNo)
+                .eq(StringUtils.isNotBlank(barCode), StockTakeRecord::getBarCode, barCode)
+                .eq(StockTakeRecord::getDelFlag, Constants.NO)
+                .eq(StockTakeRecord::getStockStatus, Constant.STOCK_TAKE_STATUS.UNFINISHED.getValue()));
+    }
+
+    @Override
+    public QueryWrapper<StockTakeRecord> getWrapper(Map<String, Object> params) {
+        QueryWrapper<StockTakeRecord> queryWrapper = new QueryWrapper<>();
+        String stockNo = (String) params.get("stockNo");
+        String barCode = (String) params.get("barCode");
+        String scanPallet = (String) params.get("scanPallet");
+        String stockPallet = (String) params.get("stockPallet");
+        String sourcePallet = (String) params.get("sourcePallet");
+        String stockType = (String) params.get("stockType");
+        //如果不传则默认起始时间为去年今日
+        Date beginTime = StringUtils.isNotBlank((String) params.get("beginTime")) ?
+                DateUtil.parse((String) params.get("beginTime"), DateUtils.YYYY_MM_DD_HH_MM_SS) : DateUtils.offsetYear(DateUtils.getNowDate(), -1);
+        //如果不传则默认结束时间为今日
+        Date endTime = StringUtils.isNotBlank((String) params.get("endTime")) ?
+                DateUtil.parse((String) params.get("endTime"), DateUtils.YYYY_MM_DD_HH_MM_SS) : DateUtils.getNowDate();
+        queryWrapper.lambda()
+                .like(StringUtils.isNotBlank(stockNo), StockTakeRecord::getStockNo, stockNo)
+                .like(StringUtils.isNotBlank(barCode), StockTakeRecord::getBarCode, barCode)
+                .like(StringUtils.isNotBlank(scanPallet), StockTakeRecord::getScanPallet, scanPallet)
+                .like(StringUtils.isNotBlank(stockPallet), StockTakeRecord::getStockPallet, stockPallet)
+                .like(StringUtils.isNotBlank(sourcePallet), StockTakeRecord::getSourcePallet, sourcePallet)
+                .eq(StringUtils.isNotBlank(stockType), StockTakeRecord::getStockType, stockType)
+                .between(StockTakeRecord::getCreateTime, beginTime, endTime);
+        return queryWrapper;
+    }
+}

+ 6 - 6
warewms-ams/src/main/resources/mapper/box/WmsBoxInfoMapper.xml

@@ -8,7 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="id"    column="id"    />
         <result property="boxNo"    column="box_no"    />
         <result property="boxType"    column="box_type"    />
-        <result property="boxRemark"    column="box_remark"    />
+        <result property="remark"    column="remark"    />
         <result property="boxState"    column="box_state"    />
         <result property="isEmpty"    column="is_empty"    />
         <result property="createBy"    column="create_by"    />
@@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectWmsBoxInfoVo">
-        select id, box_no, box_type, box_remark, box_state, is_empty, create_by, create_time, update_by, update_time, userdefine1, userdefine2, location_id, is_full from wms_box_info
+        select id, box_no, box_type, remark, box_state, is_empty, create_by, create_time, update_by, update_time, userdefine1, userdefine2, location_id, is_full from wms_box_info
     </sql>
 
     <select id="selectWmsBoxInfoList" parameterType="WmsBoxInfo" resultMap="WmsBoxInfoResult">
@@ -48,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="boxNo != null">box_no,</if>
             <if test="boxType != null">box_type,</if>
-            <if test="boxRemark != null">box_remark,</if>
+            <if test="remark != null">remark,</if>
             <if test="boxState != null">box_state,</if>
             <if test="isEmpty != null">is_empty,</if>
             <if test="createBy != null">create_by,</if>
@@ -63,7 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="boxNo != null">#{boxNo},</if>
             <if test="boxType != null">#{boxType},</if>
-            <if test="boxRemark != null">#{boxRemark},</if>
+            <if test="remark != null">#{remark},</if>
             <if test="boxState != null">#{boxState},</if>
             <if test="isEmpty != null">#{isEmpty},</if>
             <if test="createBy != null">#{createBy},</if>
@@ -82,7 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="boxNo != null">box_no = #{boxNo},</if>
             <if test="boxType != null">box_type = #{boxType},</if>
-            <if test="boxRemark != null">box_remark = #{boxRemark},</if>
+            <if test="remark != null">remark = #{remark},</if>
             <if test="boxState != null">box_state = #{boxState},</if>
             <if test="isEmpty != null">is_empty = #{isEmpty},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
@@ -102,7 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             location_id = null,
             <if test="boxNo != null">box_no = #{boxNo},</if>
             <if test="boxType != null">box_type = #{boxType},</if>
-            <if test="boxRemark != null">box_remark = #{boxRemark},</if>
+            <if test="remark != null">remark = #{remark},</if>
             <if test="boxState != null">box_state = #{boxState},</if>
             <if test="isEmpty != null">is_empty = #{isEmpty},</if>
             <if test="createBy != null">create_by = #{createBy},</if>

+ 8 - 0
warewms-ams/src/main/resources/mapper/stock/StockTakeRecordMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.ams.stock.mapper.StockTakeRecordMapper">
+
+
+</mapper>

+ 62 - 0
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -27,6 +27,11 @@ public class Constant {
      */
     public static final int FLOW_ID_RSO = 9;
 
+    /**
+     * 盘点单号单头
+     */
+    public static final String PD = "PD";
+
 
     /**
      * 入库缓存位
@@ -49,6 +54,11 @@ public class Constant {
      */
     public static final Long LOC_MIDDLE_CACHE = 99999l;
 
+    /**
+     * 虚拟栈板
+     */
+    public static final String VIRTUAL_PALLET = "YZB9999";
+
     /**
      * 是否
      */
@@ -836,4 +846,56 @@ public class Constant {
                     .map(GRATING_RELIEVE_CMD::getKey).findFirst().orElseGet(() -> null);
         }
     }
+
+    /**
+     * 盘点状态
+     */
+    public enum STOCK_TAKE_STATUS {
+        /**
+         * 完成
+         */
+        FINISHED("1"),
+        /**
+         * 未完成
+         */
+        UNFINISHED("2");
+
+        private String value;
+
+        STOCK_TAKE_STATUS(String value) {
+            this.value = value;
+        }
+
+        public String getValue() {
+            return value;
+        }
+    }
+
+    /**
+     * 盘点类型
+     */
+    public enum STOCK_TAKE_TYPE {
+        /**
+         * 正常
+         */
+        NORMAL("0"),
+        /**
+         * 盘盈
+         */
+        SURPLUS("1"),
+        /**
+         * 盘亏
+         */
+        LOSS("2");
+
+        private String value;
+
+        STOCK_TAKE_TYPE(String value) {
+            this.value = value;
+        }
+
+        public String getValue() {
+            return value;
+        }
+    }
 }

+ 4 - 2
warewms-base/src/main/java/com/ruoyi/base/mapper/BaseSkuMapper.java

@@ -1,16 +1,18 @@
 package com.ruoyi.base.mapper;
 
-import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.base.domain.BaseSku;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 物料信息Mapper接口
  * 
  * @author andy
  * @date 2022-02-21
  */
-public interface BaseSkuMapper 
+public interface BaseSkuMapper extends BaseMapper<BaseSku>
 {
     /**
      * 查询物料信息

+ 4 - 2
warewms-base/src/main/java/com/ruoyi/base/service/IBaseSkuService.java

@@ -1,9 +1,9 @@
 package com.ruoyi.base.service;
 
-import java.util.List;
-
 import com.ruoyi.base.domain.BaseSku;
 
+import java.util.List;
+
 /**
  * 物料信息Service接口
  *
@@ -67,6 +67,8 @@ public interface IBaseSkuService {
      */
     List<BaseSku> selectBaseSkuBySkuTypeList(List<String> list);
 
+    List<BaseSku> queryActiveSkuList(List<String> skuList);
+
     /**
      * 新建或者保存
      * @param baseSku

+ 14 - 5
warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseSkuServiceImpl.java

@@ -1,14 +1,16 @@
 package com.ruoyi.base.service.impl;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseSku;
+import com.ruoyi.base.mapper.BaseSkuMapper;
+import com.ruoyi.base.service.IBaseSkuService;
+import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.base.mapper.BaseSkuMapper;
-import com.ruoyi.base.domain.BaseSku;
-import com.ruoyi.base.service.IBaseSkuService;
+
+import java.util.List;
 
 /**
  * 物料信息Service业务层处理
@@ -95,6 +97,13 @@ public class BaseSkuServiceImpl implements IBaseSkuService {
         return baseSkuMapper.selectBaseSkuBySkuTypeList(list);
     }
 
+    @Override
+    public List<BaseSku> queryActiveSkuList(List<String> skuList) {
+        return baseSkuMapper.selectList(Wrappers.<BaseSku>lambdaQuery()
+                .in(BaseSku::getSku, skuList)
+                .eq(BaseSku::getActiveFlag, Constants.YES));
+    }
+
     @Override
     public int saveOrUpdate(BaseSku baseSku) {
         BaseSku basSku = baseSkuMapper.selectBaseSkuByCustomerId(Constant.CUSTOMER_ID, baseSku.getSku());