gaoluyang
3 天以前 d39e4f7d839167c16425086dfa2f8747bccfdff9
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
package cn.iocoder.yudao.module.crm.service.invoice;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceEntryReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceImportExcelVO;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceImportRespVO;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoicePageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceSaleOutRespVO;
import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoiceSaveReqVO;
import cn.iocoder.yudao.module.crm.dal.dataobject.invoice.CrmInvoiceDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO;
import jakarta.validation.Valid;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
 
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 
/**
 * CRM 开票 Service 接口
 *
 * @author 超级管理员
 */
public interface CrmInvoiceService {
 
    /**
     * 创建开票
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createInvoice(@Valid CrmInvoiceSaveReqVO createReqVO);
 
    /**
     * 导入开票
     *
     * @param importList 导入的开票列表
     * @return 导入结果
     */
    CrmInvoiceImportRespVO importInvoiceList(List<CrmInvoiceImportExcelVO> importList);
 
    /**
     * 更新开票
     *
     * @param updateReqVO 更新信息
     */
    void updateInvoice(@Valid CrmInvoiceSaveReqVO updateReqVO);
 
    /**
     * 开票申请录入发票
     *
     * 仅审批通过的开票申请可录入;录入后开票进入「已录入」状态,可被回款单关联。
     *
     * @param reqVO 录入信息
     */
    void entryInvoice(@Valid CrmInvoiceEntryReqVO reqVO);
 
    /**
     * 获得开票可选的销售出库单
     *
     * @param saleOrderId      销售订单编号
     * @param excludeInvoiceId 需排除的开票编号,可为空
     * @return 出库单列表(含已开票、剩余可开票金额)
     */
    List<CrmInvoiceSaleOutRespVO> getSaleOutListForInvoice(Long saleOrderId, Long excludeInvoiceId);
 
    /**
     * 获得开票单对应的收款节点
     *
     * @param invoiceId 开票编号
     * @return 收款节点列表
     */
    List<CrmReceivablePlanDO> getPaymentNodeListByInvoiceId(Long invoiceId);
 
    /**
     * 更新开票流程审批结果
     *
     * @param id        开票编号
     * @param bpmResult BPM 审批结果
     */
    void updateInvoiceAuditStatus(Long id, Integer bpmResult);
 
    /**
     * 删除开票
     *
     * @param id 编号
     */
    void deleteInvoice(Long id);
 
    /**
     * 发起开票审批流程
     *
     * @param id     开票编号
     * @param userId 用户编号
     */
    void submitInvoice(Long id, Long userId);
 
    /**
     * 获得开票
     *
     * @param id 编号
     * @return 开票
     */
    CrmInvoiceDO getInvoice(Long id);
 
    /**
     * 获得开票列表
     *
     * @param ids 编号
     * @return 开票列表
     */
    List<CrmInvoiceDO> getInvoiceList(Collection<Long> ids);
 
    /**
     * 获得开票 Map
     *
     * @param ids 编号
     * @return 开票 Map
     */
    default Map<Long, CrmInvoiceDO> getInvoiceMap(Collection<Long> ids) {
        return convertMap(getInvoiceList(ids), CrmInvoiceDO::getId);
    }
 
    /**
     * 获得开票分页
     *
     * 数据权限:基于 {@link CrmInvoiceDO} 读取
     *
     * @param pageReqVO 分页查询
     * @param userId    用户编号
     * @return 开票分页
     */
    PageResult<CrmInvoiceDO> getInvoicePage(CrmInvoicePageReqVO pageReqVO, Long userId);
 
    /**
     * 获得开票分页,基于指定客户
     *
     * @param pageReqVO 分页查询
     * @return 开票分页
     */
    PageResult<CrmInvoiceDO> getInvoicePageByCustomerId(CrmInvoicePageReqVO pageReqVO);
 
    /**
     * 获得待审核开票数量
     *
     * @param userId 用户编号
     * @return 待审批数量
     */
    Long getAuditInvoiceCount(Long userId);
 
    /**
     * 根据合同编号查询开票列表
     *
     * @param contractId   合同编号
     * @param auditStatuses 审批状态集合
     * @return 开票列表
     */
    List<CrmInvoiceDO> getInvoiceListByContractIdAndStatus(Long contractId, Collection<Integer> auditStatuses);
 
    /**
     * 获得合同已开票金额 Map(审批通过 + 审批中,与开票防超校验口径一致)
     *
     * @param contractIds 合同编号
     * @return 开票金额 Map
     */
    Map<Long, BigDecimal> getInvoicePriceMapByContractId(Collection<Long> contractIds);
 
    /**
     * 根据合同编号查询开票数量
     *
     * @param contractId 合同编号
     * @return 开票数量
     */
    Long getInvoiceCountByContractId(Long contractId);
 
}