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
package cn.iocoder.yudao.module.erp.service.purchase;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.plan.ErpPurchasePlanPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.plan.ErpPurchasePlanRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.plan.ErpPurchasePlanSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchasePlanDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchasePlanItemDO;
 
import java.util.Collection;
import java.util.List;
import java.util.Set;
 
/**
 * ERP 采购计划 Service 接口
 *
 * @author xiaoyi
 */
public interface ErpPurchasePlanService {
 
    /**
     * 创建采购计划
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPurchasePlan(ErpPurchasePlanSaveReqVO createReqVO);
 
    /**
     * 更新采购计划
     *
     * @param updateReqVO 更新信息
     */
    void updatePurchasePlan(ErpPurchasePlanSaveReqVO updateReqVO);
 
    /**
     * 删除采购计划
     *
     * @param ids 编号数组
     */
    void deletePurchasePlan(Collection<Long> ids);
 
    /**
     * 获得采购计划
     *
     * @param id 编号
     * @return 采购计划
     */
    ErpPurchasePlanDO getPurchasePlan(Long id);
 
    /**
     * 获得采购计划明细列表
     *
     * @param planId 采购计划编号
     * @return 明细列表
     */
    List<ErpPurchasePlanItemDO> getPurchasePlanItemListByPlanId(Long planId);
 
    /**
     * 按采购计划编号集合获得明细列表
     *
     * @param planIds 采购计划编号集合
     * @return 明细列表
     */
    List<ErpPurchasePlanItemDO> getPurchasePlanItemListByPlanIds(Collection<Long> planIds);
 
    /**
     * 获得采购计划分页
     *
     * @param pageReqVO 分页查询
     * @return 采购计划分页
     */
    PageResult<ErpPurchasePlanDO> getPurchasePlanPage(ErpPurchasePlanPageReqVO pageReqVO);
 
    /**
     * 提交采购计划审核
     *
     * 提交前校验通用审批配置(bizType = purchase_plan_approve)已启用且配置了有效审批人;
     * 校验通过后状态置为「审批中」。草稿与审核不通过状态均可提交。
     *
     * @param id 编号
     */
    void submitPurchasePlan(Long id);
 
    /**
     * 获得采购计划的审批人用户编号集合
     *
     * 供前端列表页判断是否展示「审核」按钮,未配置时返回空集合。
     *
     * @return 审批人用户编号集合
     */
    Set<Long> getPurchasePlanApproverUserIds();
 
    /**
     * 审核采购计划(审批中 → 审核通过 / 审核不通过)
     *
     * 仅通用审批配置中指定的审批人本人可调用;审核不通过时须填写原因。
     * 审核通过后将自动生成采购申请。
     *
     * @param id           采购计划编号
     * @param pass         是否通过
     * @param reviewRemark 审核意见(不通过时为必填的原因)
     */
    void auditPurchasePlan(Long id, Boolean pass, String reviewRemark);
 
    /**
     * BPM 审批结果回调更新采购计划状态
     *
     * 历史兼容接口:改造为轻量级审批后不再由 BPM 事件触发,保留以兼容既有监听器。
     *
     * @param id        采购计划编号
     * @param bpmResult BPM 审批结果
     */
    void updatePurchasePlanAuditStatus(Long id, Integer bpmResult);
 
    /**
     * 获取库存预警建议采购明细
     *
     * <p>遍历启用安全库存的物料,按默认仓库当前库存低于最低库存时,
     * 补足到安全库存(未配置则回落最高/最低库存)得到建议采购明细,不落库,供新增弹窗回填核对。
     *
     * @return 建议采购明细列表
     */
    List<ErpPurchasePlanRespVO.Item> getStockAlertSuggestItems();
 
    /**
     * 根据库存预警自动生成采购计划(草稿)
     *
     * <p>遍历启用安全库存的物料,当前库存低于安全库存下限时,
     * 按缺量生成计划明细。返回草稿计划,由编制人核对后提交审批。
     *
     * @param name       计划名称
     * @param supplierId 供应商编号(可选)
     * @return 生成的采购计划
     */
    ErpPurchasePlanDO generatePlanFromStockAlert(String name, Long supplierId);
 
    /**
     * 审批通过后生成采购申请
     *
     * @param id 采购计划编号
     * @return 生成的采购申请编号列表
     */
    List<Long> generatePurchaseRequests(Long id);
 
}