Skip to content

Commit 429a90d

Browse files
xiaomeinvGfit2-zhao
authored andcommitted
refactor: save opportunityQuotationApproval
1 parent fc4c104 commit 429a90d

File tree

9 files changed

+131
-17
lines changed

9 files changed

+131
-17
lines changed

backend/crm/src/main/java/cn/cordys/common/constants/PermissionConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ public class PermissionConstants {
170170
public static final String OPPORTUNITY_QUOTATION_UPDATE = "OPPORTUNITY_QUOTATION:UPDATE";
171171
public static final String OPPORTUNITY_QUOTATION_DELETE = "OPPORTUNITY_QUOTATION:DELETE";
172172
public static final String OPPORTUNITY_QUOTATION_EXPORT = "OPPORTUNITY_QUOTATION:EXPORT";
173+
public static final String OPPORTUNITY_QUOTATION_VOIDED = "OPPORTUNITY_QUOTATION:VOIDED";
173174
public static final String OPPORTUNITY_QUOTATION_APPROVAL = "OPPORTUNITY_QUOTATION:APPROVAL";
174175

175176
/*------ end: OPPORTUNITY_QUOTATION ------*/
Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,52 @@
11
package cn.cordys.crm.opportunity.constants;
22

3+
import cn.cordys.common.util.Translator;
4+
import lombok.Getter;
5+
6+
import static cn.cordys.crm.opportunity.constants.OpportunityStageType.AFOOT;
7+
import static cn.cordys.crm.opportunity.constants.OpportunityStageType.END;
8+
9+
@Getter
310
public enum ApprovalState {
411

512
/**
613
* 通过
714
*/
8-
APPROVED,
15+
APPROVED("APPROVED", Translator.get("log.approvalStatus.VOIDED"), END.toString()),
916

1017
/**
1118
* 不通过
1219
*/
13-
UNAPPROVED,
20+
UNAPPROVED("UNAPPROVED", Translator.get("log.approvalStatus.UNAPPROVED"), END.toString()),
1421

1522
/**
1623
* 提审
1724
*/
18-
APPROVING,
25+
APPROVING("APPROVING", Translator.get("log.approvalStatus.APPROVING"), AFOOT.toString()),
1926

2027
/**
21-
* 作废
28+
* 撤销
2229
*/
23-
VOIDED,
30+
REVOKED("REVOKED", Translator.get("log.approvalStatus.REVOKED"), AFOOT.toString());
2431

2532
/**
26-
* 撤销
33+
* 固定审批节点 ID
34+
*/
35+
private final String id;
36+
/**
37+
* 审批节点名称
2738
*/
28-
REVOKED
39+
private final String name;
40+
41+
/**
42+
* 审批节点类型
43+
*/
44+
private final String type;
45+
46+
ApprovalState(String id, String name, String type) {
47+
this.id = id;
48+
this.name = name;
49+
this.type = type;
50+
}
51+
2952
}

backend/crm/src/main/java/cn/cordys/crm/opportunity/controller/OpportunityQuotationController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public String revoke(@PathVariable("id") String id) {
9292

9393
//作废
9494
@GetMapping("/voided/{id}")
95-
@RequiresPermissions(PermissionConstants.OPPORTUNITY_QUOTATION_UPDATE)
95+
@RequiresPermissions(PermissionConstants.OPPORTUNITY_QUOTATION_VOIDED)
9696
@Operation(summary = "作废报价单")
9797
public String voidQuotation(@PathVariable("id") String id) {
9898
return opportunityQuotationService.voidQuotation(id, SessionUtils.getUserId(), OrganizationContext.getOrganizationId());

backend/crm/src/main/java/cn/cordys/crm/opportunity/domain/OpportunityQuotationApproval.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package cn.cordys.crm.opportunity.domain;
22

3-
import cn.cordys.common.domain.BaseModel;
43
import io.swagger.v3.oas.annotations.media.Schema;
54
import jakarta.persistence.Table;
65
import lombok.Data;
@@ -25,4 +24,16 @@ public class OpportunityQuotationApproval implements Serializable {
2524

2625
@Schema(description = "审核状态")
2726
private String approvalStatus;
27+
28+
@Schema(description = "创建人")
29+
private String createUser;
30+
31+
@Schema(description = "修改人")
32+
private String updateUser;
33+
34+
@Schema(description = "创建时间")
35+
private Long createTime;
36+
37+
@Schema(description = "更新时间")
38+
private Long updateTime;
2839
}

backend/crm/src/main/java/cn/cordys/crm/opportunity/service/OpportunityQuotationService.java

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import cn.cordys.crm.contract.domain.ContractField;
2424
import cn.cordys.crm.opportunity.constants.ApprovalState;
2525
import cn.cordys.crm.opportunity.domain.OpportunityQuotation;
26+
import cn.cordys.crm.opportunity.domain.OpportunityQuotationApproval;
2627
import cn.cordys.crm.opportunity.domain.OpportunityQuotationSnapshot;
2728
import cn.cordys.crm.opportunity.dto.request.OpportunityQuotationAddRequest;
2829
import 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);

backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,7 @@ log.approvalStatus.VOIDED=Voided
441441
log.approvalStatus.APPROVED=Approved
442442
log.approvalStatus.UNAPPROVED=Unapproved
443443
log.approvalStatus.APPROVING=Approving
444+
log.approvalStatus.REVOKED=Revoked
444445
log.customerId=Account name
445446
log.collectionTime=Pick time
446447
log.expectedEndTime=End time
@@ -638,7 +639,6 @@ dashboard_url_not_allowed=Dashboard address denied access
638639
log.mkAddress=MaxKB Address
639640
log.apikey=API Key
640641
log.mkEnable=Status
641-
642642
#contract
643643
contract.not.exist=Contract does not exist
644644
contract.archived.cannot.edit=Archived contracts cannot be edited!

backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ log.approvalStatus.VOIDED=作废
442442
log.approvalStatus.APPROVED=通过
443443
log.approvalStatus.UNAPPROVED=不通过
444444
log.approvalStatus.APPROVING=审批中
445+
log.approvalStatus.REVOKED=撤销
445446
log.customerId=客户名称
446447
log.collectionTime=领取时间
447448
log.expectedEndTime=结束时间
@@ -638,7 +639,6 @@ dashboard_url_not_allowed=仪表板地址拒绝访问
638639
log.mkAddress=MaxKB 地址
639640
log.apiKey=API Key
640641
log.mkEnable=状态
641-
642642
#contract
643643
contract.not.exist=合同不存在
644644
contract.archived.cannot.edit=合同已归档,无法编辑!

backend/crm/src/main/resources/migration/1.4.0/dml/V1.4.0_2_2__permission.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(
77
INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:DELETE');
88
INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:EXPORT');
99
INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:APPROVAL');
10+
INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'OPPORTUNITY_QUOTATION:VOIDED');
1011

1112
-- init price permissions
1213
INSERT INTO sys_role_permission (id, role_id, permission_id) VALUES (UUID_SHORT(), 'org_admin', 'PRICE:READ');

backend/crm/src/main/resources/permission.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@
332332
},
333333
{
334334
"id": "OPPORTUNITY_QUOTATION:APPROVAL"
335+
},
336+
{
337+
"id": "OPPORTUNITY_QUOTATION:VOIDED"
335338
}
336339
]
337340
}

0 commit comments

Comments
 (0)