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
package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
import jakarta.validation.Valid;
 
import java.util.Set;
 
/**
 * MES 盘点任务 Service 接口
 *
 * @author 超级管理员
 */
public interface MesWmStockTakingTaskService {
 
    /**
     * 创建盘点任务
     *
     * @param createReqVO 创建信息
     * @return 盘点任务编号
     */
    Long createStockTakingTask(@Valid MesWmStockTakingTaskSaveReqVO createReqVO);
 
    /**
     * 更新盘点任务
     *
     * @param updateReqVO 更新信息
     */
    void updateStockTakingTask(@Valid MesWmStockTakingTaskSaveReqVO updateReqVO);
 
    /**
     * 删除盘点任务
     *
     * @param id 盘点任务编号
     */
    void deleteStockTakingTask(Long id);
 
    /**
     * 开始盘点(草稿 → 盘点中)
     *
     * <p>仅草稿状态可执行:校验任务行非空后置为盘点中,若开启冻结则冻结任务行的库存。
     * 盘点中可录入实盘数量、Excel 导入实盘。
     *
     * @param id 盘点任务编号
     */
    void submitStockTakingTask(Long id);
 
    /**
     * 提交盘点结果审批(盘点中 → 盘点中·结果审批中)
     *
     * <p>录入/导入完成后提交结果审批:校验盘点中存在且至少一条盘点结果、且本轮结果审批未提交过,
     * 记录提交时间后等待审核。审核人由「系统管理 - 审批配置」按业务类型统一配置
     * (业务编码 stock_taking_result_approve),提交时无需指定;
     * 未启用审批或未配置有效审核人时抛出业务异常。审批通过后才执行差异核销并置为已完成。
     *
     * @param id 盘点任务编号
     */
    void submitStockTakingResultApproval(Long id);
 
    /**
     * 获得盘点结果审批的审核人编号集合
     *
     * 供前端判断当前登录用户是否应展示「审核」按钮;未配置时返回空集合。
     *
     * @return 审核人用户编号集合
     */
    Set<Long> getStockTakingTaskApproverUserIds();
 
    /**
     * 审核盘点结果(盘点中·结果审批中 → 已完成 / 盘点中)
     *
     * <p>仅业务编码 stock_taking_result_approve 配置的审核人可操作(多人时或签),
     * 且仅在结果审批已提交、尚未审核时允许:
     * <ul>
     *     <li>审核通过:解冻库存,同事务自动核销盘盈/盘亏并置为已完成;</li>
     *     <li>审核不通过:必须填写原因,任务保持盘点中,可修改实盘后重新提交结果审批。</li>
     * </ul>
     *
     * @param id           盘点任务编号
     * @param pass         是否通过,true=通过 / false=不通过
     * @param reviewRemark 审核意见,审核不通过时必填
     */
    void auditStockTakingResult(Long id, Boolean pass, String reviewRemark);
 
    /**
     * 取消盘点任务
     *
     * @param id 盘点任务编号
     */
    void cancelStockTakingTask(Long id);
 
    /**
     * 由盘点方案按周期自动生成盘点任务
     *
     * <p>供后台定时任务调用:基于已启用且开启自动生成的方案创建草稿盘点任务并生成明细行,
     * 任务编码自动生成。创建成功后回写方案上次自动生成时间,避免同一周期重复生成。
     *
     * @param planId 盘点方案编号
     * @return 盘点任务编号
     */
    Long createStockTakingTaskFromPlan(Long planId);
 
    /**
     * 获得盘点任务
     *
     * @param id 盘点任务编号
     * @return 盘点任务
     */
    MesWmStockTakingTaskDO getStockTakingTask(Long id);
 
    /**
     * 校验盘点任务是否存在
     *
     * @param id 盘点任务编号
     * @return 盘点任务
     */
    MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id);
 
    /**
     * 校验盘点任务存在,并且处于【准备中】状态
     *
     * @param id 盘点任务编号
     * @return 盘点任务
     */
    MesWmStockTakingTaskDO validateStockTakingTaskExistsAndPrepare(Long id);
 
    /**
     * 校验盘点任务存在,并且处于【盘点中】状态
     *
     * @param id 盘点任务编号
     * @return 盘点任务
     */
    MesWmStockTakingTaskDO validateStockTakingTaskExistsAndApproving(Long id);
 
    /**
     * 分页查询盘点任务
     *
     * @param pageReqVO 分页查询条件
     * @return 盘点任务分页结果
     */
    PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO);
 
}