Browse Source
feat(check): 新增日常盘点类型和RFID快照生成盘点功能
feat(check): 新增日常盘点类型和RFID快照生成盘点功能
- 在CountHeader实体中新增COUNT_TYPE_DAILY日常盘点类型常量 - 更新PhysicalInventoryMapper.xml中的盘点类型描述映射,支持DAILY类型显示 - 在RfidCountController中新增generateCountResultFromSnapshot接口 - 实现RfidCountHeaderService.generateCountResultFromSnapshot方法 - 添加RfidCountSnapshotHistory实体、Mapper及XML配置文件 - 实现从RFID快照批量插入count_label、count_pallet、count_result的功能 - 添加快照数据备份到历史表和清空快照表的逻辑 - 新建rfid_count_snapshot_history表用于存储历史快照数据master
10 changed files with 575 additions and 2 deletions
-
21src/main/java/com/gaotao/modules/check/controller/RfidCountController.java
-
4src/main/java/com/gaotao/modules/check/entity/CountHeader.java
-
181src/main/java/com/gaotao/modules/check/entity/RfidCountSnapshotHistory.java
-
17src/main/java/com/gaotao/modules/check/mapper/RfidCountSnapshotHistoryMapper.java
-
68src/main/java/com/gaotao/modules/check/mapper/RfidCountSnapshotMapper.java
-
24src/main/java/com/gaotao/modules/check/service/RfidCountHeaderService.java
-
111src/main/java/com/gaotao/modules/check/service/impl/RfidCountHeaderServiceImpl.java
-
3src/main/resources/mapper/check/PhysicalInventoryMapper.xml
-
7src/main/resources/mapper/check/RfidCountSnapshotHistoryMapper.xml
-
141src/main/resources/mapper/check/RfidCountSnapshotMapper.xml
@ -0,0 +1,181 @@ |
|||
package com.gaotao.modules.check.entity; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.*; |
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import lombok.Data; |
|||
import org.springframework.format.annotation.DateTimeFormat; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* RFID盘点快照历史表 - 记录每次生成盘点单时备份的快照数据 - rqrq |
|||
* |
|||
* <p><b>数据库表名:</b>rfid_count_snapshot_history</p> |
|||
* |
|||
* <p><b>表索引:</b></p> |
|||
* <ul> |
|||
* <li>PRIMARY KEY: site + unit_id + count_no(联合主键)</li> |
|||
* <li>INDEX: IX_snapshot_history_count_no - 按盘点单号查询</li> |
|||
* <li>INDEX: IX_snapshot_history_backup_date - 按备份日期查询</li> |
|||
* <li>INDEX: IX_snapshot_history_part - 按物料号查询</li> |
|||
* <li>INDEX: IX_snapshot_history_pallet - 按托盘号查询</li> |
|||
* </ul> |
|||
* |
|||
* <p><b>核心字段说明:</b></p> |
|||
* <ul> |
|||
* <li><b>count_no</b>:盘点单号(主键之一,关联count_header.count_no)</li> |
|||
* <li><b>backup_date</b>:备份时间(生成盘点单时的时间戳)</li> |
|||
* <li><b>last_count_date</b>:最后一次RFID盘点时间</li> |
|||
* <li><b>count_times</b>:累计盘点次数</li> |
|||
* </ul> |
|||
* |
|||
* <p><b>业务用途:</b></p> |
|||
* <pre> |
|||
* 1. 追溯每次生成盘点单时的原始数据 |
|||
* 2. 统计分析历史盘点情况 |
|||
* 3. 错误恢复(如果盘点单生成错误,可从历史表恢复) |
|||
* 4. 审计和合规要求 |
|||
* </pre> |
|||
* |
|||
* <p><b>数据来源:</b></p> |
|||
* <pre> |
|||
* 生成盘点单时,从 rfid_count_snapshot 表备份而来: |
|||
* INSERT INTO rfid_count_snapshot_history |
|||
* SELECT *, #{countNo}, GETDATE() FROM rfid_count_snapshot |
|||
* </pre> |
|||
* |
|||
* @author rqrq |
|||
* @date 2026/03/16 |
|||
*/ |
|||
@Data |
|||
@TableName("rfid_count_snapshot_history") |
|||
public class RfidCountSnapshotHistory { |
|||
|
|||
/** |
|||
* 工厂编码(联合主键) |
|||
*/ |
|||
@TableField("site") |
|||
private String site; |
|||
|
|||
/** |
|||
* 标签号(联合主键) |
|||
*/ |
|||
@TableField("unit_id") |
|||
private String unitId; |
|||
|
|||
/** |
|||
* 物料号 |
|||
*/ |
|||
@TableField("part_no") |
|||
private String partNo; |
|||
|
|||
/** |
|||
* 数量 |
|||
*/ |
|||
@TableField("qty") |
|||
private BigDecimal qty; |
|||
|
|||
/** |
|||
* 批号 |
|||
*/ |
|||
@TableField("batch_no") |
|||
private String batchNo; |
|||
|
|||
/** |
|||
* 库位 |
|||
*/ |
|||
@TableField("location_id") |
|||
private String locationId; |
|||
|
|||
/** |
|||
* 仓库 |
|||
*/ |
|||
@TableField("warehouse_id") |
|||
private String warehouseId; |
|||
|
|||
/** |
|||
* WDR号 |
|||
*/ |
|||
@TableField("wdr") |
|||
private String wdr; |
|||
|
|||
/** |
|||
* 最后一次盘点时间(来自WCS推送的RFID盘点时间) |
|||
*/ |
|||
@TableField("last_count_date") |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date lastCountDate; |
|||
|
|||
/** |
|||
* 所在托盘号 |
|||
*/ |
|||
@TableField("pallet_id") |
|||
private String palletId; |
|||
|
|||
/** |
|||
* 最新盘点结果 |
|||
* <p><b>枚举值说明:</b></p> |
|||
* <ul> |
|||
* <li>盘点成功 = 最新一次盘点成功</li> |
|||
* <li>盘点失败 = 最新一次盘点失败</li> |
|||
* </ul> |
|||
*/ |
|||
@TableField("count_result") |
|||
private String countResult; |
|||
|
|||
/** |
|||
* 累计盘点次数(每次盘点后+1) |
|||
*/ |
|||
@TableField("count_times") |
|||
private Integer countTimes; |
|||
|
|||
/** |
|||
* 备注 |
|||
*/ |
|||
@TableField("remark") |
|||
private String remark; |
|||
|
|||
/** |
|||
* 首次创建时间(原始快照表的创建时间) |
|||
*/ |
|||
@TableField("created_date") |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date createdDate; |
|||
|
|||
/** |
|||
* 最后更新时间(原始快照表的更新时间) |
|||
*/ |
|||
@TableField("updated_date") |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date updatedDate; |
|||
|
|||
/** |
|||
* 盘点单号(联合主键,关联count_header.count_no)- rqrq |
|||
* <p><b>业务说明:</b></p> |
|||
* <pre> |
|||
* 记录该快照数据是因为哪个盘点单备份的,用于追溯和关联查询。 |
|||
* 示例:PD202603160001 |
|||
* </pre> |
|||
*/ |
|||
@TableField("count_no") |
|||
private String countNo; |
|||
|
|||
/** |
|||
* 备份时间(生成盘点单时的时间戳)- rqrq |
|||
* <p><b>业务说明:</b></p> |
|||
* <pre> |
|||
* 记录备份动作发生的时间,用于统计和查询。 |
|||
* 与 last_count_date 的区别: |
|||
* - last_count_date:标签最后一次被RFID盘点的时间(来自WCS) |
|||
* - backup_date:快照数据被备份到历史表的时间(生成盘点单时) |
|||
* </pre> |
|||
*/ |
|||
@TableField("backup_date") |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date backupDate; |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
package com.gaotao.modules.check.mapper; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import com.gaotao.modules.check.entity.RfidCountSnapshotHistory; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
/** |
|||
* RFID盘点快照历史表Mapper - rqrq |
|||
* |
|||
* @author rqrq |
|||
* @date 2026/03/16 |
|||
*/ |
|||
@Mapper |
|||
public interface RfidCountSnapshotHistoryMapper extends BaseMapper<RfidCountSnapshotHistory> { |
|||
// 基础CRUD操作由BaseMapper提供 |
|||
// 如需自定义查询,可在此添加方法并在XML中实现 |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
<?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.gaotao.modules.check.mapper.RfidCountSnapshotHistoryMapper"> |
|||
|
|||
<!-- rqrq - RFID盘点快照历史表Mapper --> |
|||
|
|||
</mapper> |
|||
@ -0,0 +1,141 @@ |
|||
<?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.gaotao.modules.check.mapper.RfidCountSnapshotMapper"> |
|||
|
|||
<!-- rqrq - 统计在库标签数量 --> |
|||
<select id="countInStockLabels" resultType="java.lang.Integer"> |
|||
SELECT COUNT(1) |
|||
FROM rfid_count_snapshot s |
|||
INNER JOIN handling_unit h |
|||
ON s.site = h.site AND s.unit_id = h.unit_id |
|||
WHERE s.site = #{site} |
|||
AND h.in_stock_flag = 'Y' |
|||
</select> |
|||
|
|||
<!-- rqrq - 从快照插入count_label(只插入在库标签,已盘点状态)--> |
|||
<insert id="insertCountLabelFromSnapshot"> |
|||
INSERT INTO count_label ( |
|||
site, count_no, unit_id, part_no, qty, |
|||
batch_no, location_id, warehouse_id, wdr, pallet_id, |
|||
label_type, count_flag, count_date, count_user, |
|||
created_by, created_date |
|||
) |
|||
SELECT |
|||
s.site, |
|||
#{countNo}, |
|||
s.unit_id, |
|||
s.part_no, |
|||
s.qty, |
|||
s.batch_no, |
|||
s.location_id, |
|||
s.warehouse_id, |
|||
s.wdr, |
|||
s.pallet_id, |
|||
'ASSIGNED', |
|||
'Y', |
|||
s.last_count_date, |
|||
'SYSTEM', |
|||
#{username}, |
|||
GETDATE() |
|||
FROM rfid_count_snapshot s |
|||
INNER JOIN handling_unit h |
|||
ON s.site = h.site AND s.unit_id = h.unit_id |
|||
WHERE s.site = #{site} |
|||
AND h.in_stock_flag = 'Y' |
|||
</insert> |
|||
|
|||
<!-- rqrq - 从快照插入count_pallet(按托盘分组,已盘点状态)--> |
|||
<insert id="insertCountPalletFromSnapshot"> |
|||
INSERT INTO count_pallet ( |
|||
site, count_no, seq_no, pallet_id, |
|||
count_flag, label_count, checked_count, |
|||
count_date, count_user, |
|||
created_by, created_date, location_z |
|||
) |
|||
SELECT |
|||
s.site, |
|||
#{countNo}, |
|||
ROW_NUMBER() OVER (ORDER BY s.pallet_id), |
|||
s.pallet_id, |
|||
'Y', |
|||
COUNT(s.unit_id), |
|||
COUNT(s.unit_id), |
|||
MAX(s.last_count_date), |
|||
'SYSTEM', |
|||
#{username}, |
|||
GETDATE(), |
|||
ISNULL(st.location_z, 1) |
|||
FROM rfid_count_snapshot s |
|||
INNER JOIN handling_unit h |
|||
ON s.site = h.site AND s.unit_id = h.unit_id |
|||
LEFT JOIN pallet p |
|||
ON s.site = p.site AND s.pallet_id = p.pallet_id |
|||
LEFT JOIN agv_station st |
|||
ON p.location_code = st.station_code |
|||
WHERE s.site = #{site} |
|||
AND h.in_stock_flag = 'Y' |
|||
GROUP BY s.site, s.pallet_id, st.location_z |
|||
</insert> |
|||
|
|||
<!-- rqrq - 备份快照数据到历史表 --> |
|||
<insert id="backupSnapshotToHistory"> |
|||
INSERT INTO rfid_count_snapshot_history ( |
|||
site, unit_id, part_no, qty, batch_no, |
|||
location_id, warehouse_id, wdr, |
|||
last_count_date, pallet_id, count_result, count_times, |
|||
remark, created_date, updated_date, |
|||
count_no, backup_date |
|||
) |
|||
SELECT |
|||
site, unit_id, part_no, qty, batch_no, |
|||
location_id, warehouse_id, wdr, |
|||
last_count_date, pallet_id, count_result, count_times, |
|||
remark, created_date, updated_date, |
|||
#{countNo}, |
|||
GETDATE() |
|||
FROM rfid_count_snapshot |
|||
WHERE site = #{site} |
|||
</insert> |
|||
|
|||
<!-- rqrq - 删除快照数据 --> |
|||
<delete id="deleteSnapshotBySite"> |
|||
DELETE FROM rfid_count_snapshot WHERE site = #{site} |
|||
</delete> |
|||
|
|||
<!-- rqrq - 从快照插入count_result(盘点结果,全部为OK无差异)--> |
|||
<insert id="insertCountResultFromSnapshot"> |
|||
INSERT INTO count_result ( |
|||
site, count_no, unit_id, part_no, qty, |
|||
batch_no, location_id, warehouse_id, wdr, pallet_id, |
|||
count_date, count_user, count_result, diff_qty, |
|||
handle_flag, handle_type, remark, |
|||
created_by, created_date |
|||
) |
|||
SELECT |
|||
s.site, |
|||
#{countNo}, |
|||
s.unit_id, |
|||
s.part_no, |
|||
s.qty, |
|||
s.batch_no, |
|||
s.location_id, |
|||
s.warehouse_id, |
|||
s.wdr, |
|||
s.pallet_id, |
|||
s.last_count_date, |
|||
'SYSTEM', |
|||
'OK', |
|||
0, |
|||
'Y', |
|||
'SYSTEM', |
|||
'WCS日常RFID盘点数据(无差异)', |
|||
#{username}, |
|||
GETDATE() |
|||
FROM rfid_count_snapshot s |
|||
INNER JOIN handling_unit h |
|||
ON s.site = h.site AND s.unit_id = h.unit_id |
|||
WHERE s.site = #{site} |
|||
AND h.in_stock_flag = 'Y' |
|||
</insert> |
|||
|
|||
</mapper> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue