2 天以前 111270df037596a04df97f787ca8b9199dd99866
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package cn.iocoder.yudao.module.mes.service.pro.mps;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO;
import jakarta.validation.Valid;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
 
/**
 * MES 生产主计划(MPS)Service 接口
 *
 * @author 芋道源码
 */
public interface MesProMpsService {
 
    /**
     * 创建 MPS(供 API 调用,自动映射物料)
     *
     * @param saleOrderId 销售订单ID
     * @param saleOrderNo 销售订单号
     * @param saleOrderItemId 销售订单明细ID
     * @param mdmItemId MDM 物料ID
     * @param productName 产品名称(用于错误提示)
     * @param quantity 计划数量
     * @param clientId 客户ID
     * @param requestDate 需求日期
     * @param remark 备注
     * @return MPS 编号,如果 MES 产品不存在返回 null
     * @throws cn.iocoder.yudao.framework.common.exception.ServiceException 如果 MES 产品不存在
     */
    Long createMps(Long saleOrderId, String saleOrderNo, Long saleOrderItemId,
                   Long mdmItemId, String productName, BigDecimal quantity, Long clientId,
                   String requestDate, String remark);
 
    /**
     * 创建 MPS
     *
     * @param createReqVO 创建信息
     * @return MPS 编号
     */
    Long createMps(@Valid MesProMpsSaveReqVO createReqVO);
 
    /**
     * 更新 MPS
     *
     * @param updateReqVO 更新信息
     */
    void updateMps(@Valid MesProMpsSaveReqVO updateReqVO);
 
    /**
     * 删除 MPS(仅草稿状态)
     *
     * @param id 编号
     */
    void deleteMps(Long id);
 
    /**
     * 下发单条 MPS
     *
     * @param id MPS 编号
     * @return 生成的工单 ID
     */
    Long issueMps(Long id);
 
    /**
     * 合并下发多条 MPS
     * 将多条相同产品的 MPS 合并生成一条生产工单
     *
     * @param mpsIds MPS 编号列表
     * @return 生成的工单 ID
     */
    Long mergeAndIssueMps(List<Long> mpsIds);
 
    /**
     * 取消 MPS
     *
     * @param id 编号
     */
    void cancelMps(Long id);
 
    /**
     * 完成 MPS(由生产工单完成时触发)
     *
     * @param id 编号
     */
    void finishMps(Long id);
 
    /**
     * 根据销售订单明细获取 MPS
     *
     * @param saleOrderItemId 销售订单明细ID
     * @return MPS
     */
    MesProMpsDO getMpsBySaleOrderItemId(Long saleOrderItemId);
 
    /**
     * 获取 MPS
     *
     * @param id 编号
     * @return MPS
     */
    MesProMpsDO getMps(Long id);
 
    /**
     * 获取 MPS 分页
     *
     * @param pageReqVO 分页查询
     * @return 分页结果
     */
    PageResult<MesProMpsDO> getMpsPage(MesProMpsPageReqVO pageReqVO);
 
    /**
     * 获取 MPS 列表
     *
     * @param ids 编号列表
     * @return MPS 列表
     */
    List<MesProMpsDO> getMpsList(Collection<Long> ids);
 
    /**
     * 根据销售订单明细ID列表获取 MPS 列表
     *
     * @param saleOrderItemIds 销售订单明细ID列表
     * @return MPS 列表
     */
    List<MesProMpsDO> getMpsListBySaleOrderItemIds(Collection<Long> saleOrderItemIds);
 
    /**
     * 获取可合并的 MPS 列表(相同产品、草稿状态)
     *
     * @param productId 产品ID
     * @return MPS 列表
     */
    List<MesProMpsDO> getMergeableMpsList(Long productId);
 
    /**
     * 更新已生产数量
     *
     * @param id MPS 编号
     * @param incrQuantity 增量
     */
    void updateProducedQuantity(Long id, BigDecimal incrQuantity);
 
    /**
     * 检查销售订单的所有 MPS 是否已完成生产
     *
     * 完成条件:
     * 1. 已生产数量 >= 计划数量
     * 2. 所有报工单状态为 FINISHED(确保质检完成)
     *
     * @param saleOrderId 销售订单ID
     * @return true=全部完成,false=未全部完成
     */
    Boolean checkSaleOrderProductionFinished(Long saleOrderId);
 
    /**
     * 根据工单ID获取 MPS
     *
     * @param workOrderId 工单ID
     * @return MPS
     */
    MesProMpsDO getMpsByWorkOrderId(Long workOrderId);
 
    /**
     * 检查并自动完成 MPS
     *
     * 如果 MPS 满足完成条件(已生产数量 >= 计划数量 且 所有报工已完成),
     * 则自动将 MPS 状态更新为已完成
     *
     * @param mpsId MPS 编号
     * @return true=已完成或本次自动完成,false=未完成
     */
    Boolean checkAndFinishMps(Long mpsId);
 
}