liu
2026-10-23 5421b8af862890dcf187c2ad5ece55423959ba85
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
package cn.iocoder.yudao.module.mes.service.pd.techconfirm;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pd.techconfirm.vo.ProductTechConfirmSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.techconfirm.ProductTechConfirmDO;
 
import java.util.List;
import java.util.Set;
 
/**
 * MES 产品技术确认函 Service 接口
 *
 * 状态流转完全由业务流程驱动,不接受前端直接指定状态:
 * <pre>
 *   0 草稿 --提交审核--> 1 待审核 --审核通过--> 2 已审核 --客户确认--> 3 客户已确认
 *      ^                    |
 *      |                    +--审核不通过--> 4 审核不通过
 *      |                                        |
 *      +----------------------------------------+  审核不通过可修改后重新提交
 * </pre>
 * 只有草稿与审核不通过状态允许修改业务字段,待审核 / 已审核 / 客户已确认为锁定或终态。
 *
 * @author 超级管理员
 */
public interface ProductTechConfirmService {
 
    /**
     * 创建技术确认函
     *
     * 状态固定为草稿,编制人 / 编制时间取当前登录用户与当前时间。
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTechConfirm(ProductTechConfirmSaveReqVO createReqVO);
 
    /**
     * 修改技术确认函
     *
     * 仅草稿与审核不通过状态允许修改,其余状态一律拒绝。
     *
     * @param updateReqVO 修改信息
     */
    void updateTechConfirm(ProductTechConfirmSaveReqVO updateReqVO);
 
    /**
     * 删除技术确认函
     *
     * 仅草稿与审核不通过状态允许删除。
     *
     * @param id 编号
     */
    void deleteTechConfirm(Long id);
 
    /**
     * 获得技术确认函
     *
     * @param id 编号
     * @return 技术确认函
     */
    ProductTechConfirmDO getTechConfirm(Long id);
 
    /**
     * 获得技术确认函分页
     *
     * @param pageReqVO 分页查询
     * @return 技术确认函分页
     */
    PageResult<ProductTechConfirmDO> getTechConfirmPage(ProductTechConfirmPageReqVO pageReqVO);
 
    /**
     * 提交审核(草稿 / 审核不通过 → 待审核)
     *
     * 审核人由「系统管理 - 审批配置」按业务类型统一配置(业务编码 pd_tech_confirm_approve),
     * 提交时无需指定;未启用审批或未配置有效审核人时抛出业务异常。
     *
     * @param id 编号
     */
    void submitTechConfirmAudit(Long id);
 
    /**
     * 获得技术确认函审核的审核人编号集合
     *
     * 供前端判断当前登录用户是否应展示「审核」按钮;未配置时返回空集合。
     *
     * @return 审核人用户编号集合
     */
    Set<Long> getTechConfirmApproverUserIds();
 
    /**
     * 审核技术确认函(待审核 → 已审核 / 审核不通过)
     *
     * 仅业务编码 pd_tech_confirm_approve 配置的审核人可操作(多人时或签),且仅在待审核状态下允许。
     * 审核通过记录审核人与审核时间;审核不通过必须填写不通过原因,
     * 使单据退回可修改状态,由编制人修改后重新提交。
     *
     * @param id           编号
     * @param pass         是否通过,true=通过 / false=不通过
     * @param reviewRemark 审核意见,审核不通过时必填
     */
    void auditTechConfirm(Long id, Boolean pass, String reviewRemark);
 
    /**
     * 回写 BPM 审批结果(供 BPM 流程状态监听器调用)
     *
     * 仅在单据处于待审核时生效:审批通过置为已审核,审批不通过置为审核不通过。
     * 技术确认函没有「已取消」状态,其余 BPM 结果忽略。
     *
     * @param id        编号
     * @param bpmStatus BPM 任务状态,见 {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    审批意见 / 取消原因
     */
    void updateTechConfirmAuditStatus(Long id, Integer bpmStatus, String reason);
 
    /**
     * 客户确认(已审核 → 客户已确认)
     *
     * 由业务员代客户执行,记录客户确认人与客户确认时间。
     *
     * @param id                  编号
     * @param customerConfirmUser 客户确认人姓名
     */
    void confirmTechConfirmByCustomer(Long id, String customerConfirmUser);
 
    /**
     * 批量导入产品技术确认函
     *
     * @param importList    导入列表
     * @param updateSupport 是否支持更新
     * @return 导入结果
     */
    ProductTechConfirmImportRespVO importTechConfirmList(List<ProductTechConfirmImportExcelVO> importList, boolean updateSupport);
 
}