2026-06-24 f4bd1f3c89d906131495a0aca5aaf82966378510
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package cn.iocoder.yudao.module.mes.service.wm.materialstock;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
import jakarta.validation.Valid;
 
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
 
/**
 * MES 库存台账 Service 接口
 */
public interface MesWmMaterialStockService {
 
    /**
     * 获得库存记录
     *
     * @param id 编号
     * @return 库存记录
     */
    MesWmMaterialStockDO getMaterialStock(Long id);
 
    /**
     * 查询指定库位的库存记录列表
     *
     * @param areaId 库位编号
     * @return 库存记录列表
     */
    List<MesWmMaterialStockDO> getMaterialStockListByAreaId(Long areaId);
 
    /**
     * 获得库存台账分页
     *
     * @param pageReqVO 分页参数
     * @return 库存台账分页
     */
    PageResult<MesWmMaterialStockDO> getMaterialStockPage(MesWmMaterialStockPageReqVO pageReqVO);
 
    /**
     * 更新库存冻结状态
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialStockFrozen(@Valid MesWmMaterialStockFreezeReqVO updateReqVO);
 
    /**
     * 批量更新库存冻结状态
     *
     * @param ids 库存记录编号列表
     * @param frozen 是否冻结
     */
    void updateMaterialStockFrozen(Collection<Long> ids, boolean frozen);
 
    /**
     * 获得仓库下库存记录数量
     *
     * @param warehouseId 仓库编号
     * @return 记录数量
     */
    Long getMaterialStockCountByWarehouseId(Long warehouseId);
 
    /**
     * 获得库区下库存记录数量
     *
     * @param locationId 库区编号
     * @return 记录数量
     */
    Long getMaterialStockCountByLocationId(Long locationId);
 
    /**
     * 获得库位下库存记录数量
     *
     * @param areaId 库位编号
     * @return 记录数量
     */
    Long getMaterialStockCountByAreaId(Long areaId);
 
    /**
     * 按编号集合获得库存记录列表
     *
     * @param ids 编号集合
     * @return 库存记录列表
     */
    List<MesWmMaterialStockDO> getMaterialStockList(Collection<Long> ids);
 
    /**
     * 获得物料库存列表(用于盘点等场景)
     *
     * @param reqVO 查询条件
     * @return 物料库存列表
     */
    List<MesWmMaterialStockDO> getMaterialStockList(MesWmMaterialStockListReqVO reqVO);
 
    /**
     * 获取或创建库存记录(按组合键唯一)
     *
     * @param itemId         物料编号
     * @param warehouseId    仓库编号
     * @param locationId     库区编号
     * @param areaId         库位编号
     * @param batchId        批次编号
     * @param batchCode      批次号
     * @param vendorId       供应商编号
     * @param receiptTime    入库时间(为空则默认当前时间)
     * @return 库存记录
     */
    MesWmMaterialStockDO getOrCreateMaterialStock(Long itemId, Long warehouseId, Long locationId, Long areaId,
                                                  Long batchId, String batchCode, Long vendorId, LocalDateTime receiptTime);
 
    /**
     * 更新库存数量
     *
     * @param id 库存记录编号
     * @param quantity        变动数量(正数=增加,负数=扣减)
     * @param checkFlag       是否校验库存充足(为 true 且扣减后为负则报错)
     */
    void updateMaterialStockQuantity(Long id, BigDecimal quantity, boolean checkFlag);
 
    /**
     * 库位混放规则校验
     *
     * 根据库位配置的物料和批次混放规则,检查是否允许在该库位存放指定物料/批次
     *
     * @param areaId  库位编号
     * @param itemId  物料编号
     * @param batchId 批次编号(可为 null)
     */
    void checkAreaMixingRule(Long areaId, Long itemId, Long batchId);
 
    /**
     * 校验前端选择的库存记录,兜底避免串单或越权提交
     *
     * @param materialStockId 库存记录编号
     * @param itemId          物料编号
     * @param batchId         批次编号
     * @param batchCode       批次号(可选)
     * @param warehouseId     仓库编号
     * @param locationId      库区编号
     * @param areaId          库位编号
     * @param quantity        数量(可选,校验库存充足)
     * @return 校验通过的库存记录
     */
    MesWmMaterialStockDO validateSelectedStock(Long materialStockId, Long itemId, Long batchId, String batchCode,
                                               Long warehouseId, Long locationId, Long areaId, BigDecimal quantity);
 
}