2323import cn .cordys .crm .contract .domain .ContractField ;
2424import cn .cordys .crm .opportunity .constants .ApprovalState ;
2525import cn .cordys .crm .opportunity .domain .OpportunityQuotation ;
26+ import cn .cordys .crm .opportunity .domain .OpportunityQuotationApproval ;
2627import cn .cordys .crm .opportunity .domain .OpportunityQuotationSnapshot ;
2728import cn .cordys .crm .opportunity .dto .request .OpportunityQuotationAddRequest ;
2829import cn .cordys .crm .opportunity .dto .request .OpportunityQuotationBatchRequest ;
@@ -87,6 +88,8 @@ public class OpportunityQuotationService {
8788 private BaseMapper <OpportunityQuotationSnapshot > snapshotBaseMapper ;
8889 @ Resource
8990 private BaseMapper <ContractField > contractFieldMapper ;
91+ @ Resource
92+ private BaseMapper <OpportunityQuotationApproval > approvalBaseMapper ;
9093
9194
9295 /**
@@ -119,10 +122,31 @@ public OpportunityQuotation add(OpportunityQuotationAddRequest request, String o
119122 OpportunityQuotationGetResponse response = getOpportunityQuotationGetResponse (opportunityQuotation , moduleFields , moduleFormConfigDTO );
120123 saveSnapshot (opportunityQuotation , moduleFormConfigDTO , response );
121124
125+ //保存报价单审批表
126+ addQuotationApproval (userId , opportunityQuotation .getId ());
127+
122128 return opportunityQuotation ;
123129
124130 }
125131
132+ /**
133+ * 新增报价单审批表
134+ *
135+ * @param userId 用户ID
136+ * @param quotationId 报价单ID
137+ */
138+ private void addQuotationApproval (String userId , String quotationId ) {
139+ OpportunityQuotationApproval opportunityQuotationApproval = new OpportunityQuotationApproval ();
140+ opportunityQuotationApproval .setId (IDGenerator .nextStr ());
141+ opportunityQuotationApproval .setQuotationId (quotationId );
142+ opportunityQuotationApproval .setApprovalStatus (ApprovalState .APPROVING .toString ());
143+ opportunityQuotationApproval .setCreateUser (userId );
144+ opportunityQuotationApproval .setUpdateUser (userId );
145+ opportunityQuotationApproval .setCreateTime (System .currentTimeMillis ());
146+ opportunityQuotationApproval .setUpdateTime (System .currentTimeMillis ());
147+ approvalBaseMapper .insert (opportunityQuotationApproval );
148+ }
149+
126150 /**
127151 * 保存商机报价单快照
128152 *
@@ -169,7 +193,9 @@ public OpportunityQuotationGetResponse get(String id) {
169193 if (opportunityQuotation == null ) {
170194 throw new GenericException (Translator .get ("opportunity.quotation.not.exist" ));
171195 }
172- if (Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVED .toString ()) || Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVING .toString ())) {
196+ //获取ApprovalState中所有状态的id属性(以后改成获取自定义的审批状态)
197+ List <String > approvalStatusList = Arrays .stream (ApprovalState .values ()).map (ApprovalState ::getId ).toList ();
198+ if (approvalStatusList .contains (opportunityQuotation .getApprovalStatus ()) && (Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVED .toString ()) || Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVING .toString ()))) {
173199 // 已审核,查询最新快照
174200 LambdaQueryWrapper <OpportunityQuotationSnapshot > wrapper = new LambdaQueryWrapper <>();
175201 wrapper .eq (OpportunityQuotationSnapshot ::getQuotationId , id );
@@ -205,6 +231,11 @@ public String revoke(String id, String userId) {
205231 opportunityQuotation .setUpdateUser (userId );
206232 opportunityQuotation .setUpdateTime (System .currentTimeMillis ());
207233 opportunityQuotationMapper .updateById (opportunityQuotation );
234+
235+ //更新报价单审批表
236+ updateQuotationApproval (userId , id , ApprovalState .REVOKED .toString ());
237+
238+
208239 return opportunityQuotation .getApprovalStatus ();
209240 }
210241
@@ -220,7 +251,7 @@ public String voidQuotation(String id, String userId, String orgId) {
220251 throw new GenericException (Translator .get ("opportunity.quotation.not.exist" ));
221252 }
222253 String oldApprovalStatus = oldOpportunityQuotation .getApprovalStatus ();
223- OpportunityQuotation opportunityQuotation = updateApprovalState (oldOpportunityQuotation , ApprovalState .VOIDED . toString () , userId );
254+ OpportunityQuotation opportunityQuotation = updateApprovalState (oldOpportunityQuotation , LogType .VOIDED , userId );
224255 if (opportunityQuotation == null ) {
225256 throw new GenericException (Translator .get ("opportunity.quotation.not.exist" ));
226257 }
@@ -253,7 +284,9 @@ private void checkQuotationLinked(String id, String key) {
253284 * @param userId 用户ID
254285 */
255286 public String approve (OpportunityQuotationEditRequest request , String userId , String orgId ) {
256- String noticeKey = Strings .CI .equals (request .getApprovalStatus (), ApprovalState .APPROVED .toString ()) ?
287+ //获取ApprovalState中APPROVED状态的id属性(以后改成获取自定义的审批状态)
288+ List <String > approvalStatusList = Arrays .stream (ApprovalState .values ()).map (ApprovalState ::getId ).filter (status -> ApprovalState .APPROVED .toString ().equals (status )).toList ();
289+ String noticeKey = approvalStatusList .contains (request .getApprovalStatus ()) ?
257290 "opportunity.quotation.status.approved" : "opportunity.quotation.status.unapproved" ;
258291 OpportunityQuotation oldOpportunityQuotation = opportunityQuotationMapper .selectByPrimaryKey (request .getId ());
259292 if (oldOpportunityQuotation == null ) {
@@ -358,6 +391,11 @@ public void delete(String id, String userId, String organizationId) {
358391 wrapper .eq (OpportunityQuotationSnapshot ::getQuotationId , id );
359392 snapshotBaseMapper .deleteByLambda (wrapper );
360393
394+ //删除审批记录
395+ LambdaQueryWrapper <OpportunityQuotationApproval > approvalWrapper = new LambdaQueryWrapper <>();
396+ approvalWrapper .eq (OpportunityQuotationApproval ::getQuotationId , id );
397+ approvalBaseMapper .deleteByLambda (approvalWrapper );
398+
361399 //记录日志
362400 saveSateChangeLog (organizationId , null , userId , LogType .DELETE , opportunityQuotation );
363401
@@ -421,6 +459,10 @@ public OpportunityQuotation update(OpportunityQuotationEditRequest request, Stri
421459 opportunityQuotation .setApprovalStatus (ApprovalState .APPROVING .toString ());
422460 updateFields (moduleFields , opportunityQuotation , orgId , userId );
423461 opportunityQuotationMapper .update (opportunityQuotation );
462+
463+ //更新报价单审批表
464+ updateQuotationApproval (userId , id , ApprovalState .APPROVING .toString ());
465+
424466 // 处理日志上下文
425467 baseService .handleUpdateLog (oldOpportunityQuotation , opportunityQuotation , originFields , moduleFields , id , opportunityQuotation .getName ());
426468
@@ -435,6 +477,37 @@ public OpportunityQuotation update(OpportunityQuotationEditRequest request, Stri
435477 return opportunityQuotationMapper .selectByPrimaryKey (id );
436478 }
437479
480+ /**
481+ * 更新报价单审批状态
482+ *
483+ * @param userId 更新用户ID
484+ * @param quotationId 报价单ID
485+ */
486+ private void updateQuotationApproval (String userId , String quotationId , String approvalStatus ) {
487+ LambdaQueryWrapper <OpportunityQuotationApproval > wrapper = new LambdaQueryWrapper <>();
488+ wrapper .eq (OpportunityQuotationApproval ::getQuotationId , quotationId );
489+ List <OpportunityQuotationApproval > approvalList = approvalBaseMapper .selectListByLambda (wrapper );
490+ if (CollectionUtils .isEmpty (approvalList )) {
491+ addQuotationApproval (userId , quotationId );
492+ } else {
493+ updateQuotationApprovalState (userId , approvalList .getFirst (), approvalStatus );
494+ }
495+ }
496+
497+ /**
498+ * 更新报价单审批状态
499+ *
500+ * @param userId 更新用户ID
501+ * @param quotationApproval 报价单审批实体
502+ * @param approvalStatus 审批状态
503+ */
504+ private void updateQuotationApprovalState (String userId , OpportunityQuotationApproval quotationApproval , String approvalStatus ) {
505+ quotationApproval .setApprovalStatus (approvalStatus );
506+ quotationApproval .setUpdateTime (System .currentTimeMillis ());
507+ quotationApproval .setUpdateUser (userId );
508+ approvalBaseMapper .update (quotationApproval );
509+ }
510+
438511 /**
439512 * 更新自定义字段
440513 *
@@ -539,11 +612,11 @@ public BatchAffectReasonResponse batchVoidQuotation(OpportunityQuotationBatchReq
539612 successIds .add (item .getId ());
540613 LogDTO logDTO = new LogDTO (organizationId , item .getId (), userId , LogType .VOIDED , LogModule .OPPORTUNITY_QUOTATION , item .getName ());
541614 logDTO .setOriginalValue (item .getApprovalStatus ());
542- logDTO .setModifiedValue (ApprovalState .VOIDED . toString () );
615+ logDTO .setModifiedValue (LogType .VOIDED );
543616 logs .add (logDTO );
544617
545618 });
546- batchUpdateMapper .batchUpdateApprovalStatus (successIds , ApprovalState .VOIDED . toString () , userId , System .currentTimeMillis ());
619+ batchUpdateMapper .batchUpdateApprovalStatus (successIds , LogType .VOIDED , userId , System .currentTimeMillis ());
547620 logService .batchAdd (logs );
548621 sqlSession .flushStatements ();
549622 SqlSessionUtils .closeSqlSession (sqlSession , sqlSessionFactory );
@@ -630,7 +703,9 @@ public ModuleFormConfigDTO getFormSnapshot(String id, String orgId) {
630703 if (opportunityQuotation == null ) {
631704 throw new GenericException (Translator .get ("opportunity.quotation.not.exist" ));
632705 }
633- if (Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVED .toString ()) || Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVING .toString ())) {
706+ //获取ApprovalState中所有状态的id属性(以后改成获取自定义的审批状态)
707+ List <String > approvalStatusList = Arrays .stream (ApprovalState .values ()).map (ApprovalState ::getId ).toList ();
708+ if (approvalStatusList .contains (opportunityQuotation .getApprovalStatus ()) && (Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVED .toString ()) || Strings .CI .equals (opportunityQuotation .getApprovalStatus (), ApprovalState .APPROVING .toString ()))) {
634709 LambdaQueryWrapper <OpportunityQuotationSnapshot > wrapper = new LambdaQueryWrapper <>();
635710 wrapper .eq (OpportunityQuotationSnapshot ::getQuotationId , id );
636711 OpportunityQuotationSnapshot snapshot = snapshotBaseMapper .selectListByLambda (wrapper ).stream ().findFirst ().orElse (null );
0 commit comments