Browse Source

修复合同流程审核后,合同状态随之变更

master
周开红 7 months ago
parent
commit
265a9fe25d
  1. 34
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/common/CrmAuditStatusEnum.java
  2. 115
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/contract/CrmContractDO.java
  3. 14
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/contract/CrmContractMapper.java
  4. 21
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/CrmContractService.java
  5. 76
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/CrmContractServiceImpl.java
  6. 32
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/listener/CrmContractStatusListener.java

34
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/common/CrmAuditStatusEnum.java

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.bpm.enums.common;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
* CRM 的审批状态
*
* @author 赤焰
*/
@RequiredArgsConstructor
@Getter
public enum CrmAuditStatusEnum implements ArrayValuable<Integer> {
DRAFT(0, "未提交"),
PROCESS(10, "审批中"),
APPROVE(20, "审核通过"),
REJECT(30, "审核不通过"),
CANCEL(40, "已取消");
private final Integer status;
private final String name;
public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmAuditStatusEnum::getStatus).toArray(Integer[]::new);
@Override
public Integer[] array() {
return ARRAYS;
}
}

115
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/contract/CrmContractDO.java

@ -0,0 +1,115 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.contract;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* CRM 合同 DO
*
* @author dhb52
*/
@TableName("crm_contract")
@KeySequence("crm_contract_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CrmContractDO extends BaseDO {
/**
* 合同编号
*/
@TableId
private Long id;
/**
* 合同名称
*/
private String name;
/**
* 合同编号
*/
private String no;
/**
* 客户编号
*
*/
private Long customerId;
/**
* 商机编号非必须
*
*/
private Long businessId;
/**
* 最后跟进时间
*/
private LocalDateTime contactLastTime;
/**
* 负责人的用户编号
*
* 关联 AdminUserDO id 字段
*/
private Long ownerUserId;
/**
* 工作流编号
*
* 关联 ProcessInstance id 属性
*/
private String processInstanceId;
/**
* 审批状态
*
*/
private Integer auditStatus;
/**
* 下单日期
*/
private LocalDateTime orderDate;
/**
* 开始时间
*/
private LocalDateTime startTime;
/**
* 结束时间
*/
private LocalDateTime endTime;
/**
* 产品总金额单位
*/
private BigDecimal totalProductPrice;
/**
* 整单折扣
*/
private BigDecimal discountPercent;
/**
* 合同总金额单位
*/
private BigDecimal totalPrice;
/**
* 客户签约人非必须
*
*/
private Long signContactId;
/**
* 公司签约人非必须
*
* 关联 AdminUserDO id 字段
*/
private Long signUserId;
/**
* 备注
*/
private String remark;
}

14
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/contract/CrmContractMapper.java

@ -0,0 +1,14 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.contract;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.contract.CrmContractDO;
import org.apache.ibatis.annotations.Mapper;
/**
* CRM 合同 Mapper
*
* @author dhb52
*/
@Mapper
public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
}

21
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/CrmContractService.java

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.bpm.service.contract;
import java.util.Collection;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
/**
* CRM 合同 Service 接口
*
* @author dhb52
*/
public interface CrmContractService {
/**
* 更新合同流程审批结果
*
* @param id 合同编号
* @param bpmResult BPM 审批结果
*/
void updateContractAuditStatus(Long id, Integer bpmResult);
}

76
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/CrmContractServiceImpl.java

@ -0,0 +1,76 @@
package cn.iocoder.yudao.module.bpm.service.contract;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.enums.common.CrmAuditStatusEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import cn.iocoder.yudao.module.bpm.dal.dataobject.contract.CrmContractDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.contract.CrmContractMapper;
/**
* CRM 合同 Service 实现类
*
* @author dhb52
*/
@Service
@Validated
@Slf4j
public class CrmContractServiceImpl implements CrmContractService {
/**
* BPM 合同审批流程标识
*/
public static final String BPM_PROCESS_DEFINITION_KEY = "crm-contract-audit";
@Resource
private CrmContractMapper contractMapper;
@Resource
private AdminUserApi adminUserApi;
@Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
@Override
public void updateContractAuditStatus(Long id, Integer bpmResult) {
// 1.1 校验合同是否存在
CrmContractDO contract = validateContractExists(id);
// 1.2 只有审批中可以更新审批结果
if (ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.PROCESS.getStatus())) {
log.error("[updateContractAuditStatus][contract({}) 不处于审批中,无法更新审批结果({})]",
contract.getId(), bpmResult);
throw exception(new ErrorCode(1_020_000_003, "更新合同审核状态失败,原因:合同不是审核中状态"));
}
// 2. 更新合同审批结果
Integer auditStatus = convertBpmResultToAuditStatus(bpmResult);
contractMapper.updateById(new CrmContractDO().setId(id).setAuditStatus(auditStatus));
}
private CrmContractDO validateContractExists(Long id) {
CrmContractDO contract = contractMapper.selectById(id);
if (contract == null) {
throw exception(new ErrorCode(1_020_000_000, "合同不存在"));
}
return contract;
}
public static Integer convertBpmResultToAuditStatus(Integer bpmResult) {
Integer auditStatus = BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.APPROVE.getStatus()
: BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.REJECT.getStatus()
: BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult) ? BpmTaskStatusEnum.CANCEL.getStatus() : null;
Assert.notNull(auditStatus, "BPM 审批结果({}) 转换失败", bpmResult);
return auditStatus;
}
}

32
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/contract/listener/CrmContractStatusListener.java

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.bpm.service.contract.listener;
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.bpm.service.contract.CrmContractService;
import cn.iocoder.yudao.module.bpm.service.contract.CrmContractServiceImpl;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 合同审批的结果的监听器实现类
*
* @author HUIHUI
*/
@Component
public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {
@Resource
private CrmContractService contractService;
@Override
public String getProcessDefinitionKey() {
return CrmContractServiceImpl.BPM_PROCESS_DEFINITION_KEY;
}
@Override
protected void onEvent(BpmProcessInstanceStatusEvent event) {
contractService.updateContractAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
}
}
Loading…
Cancel
Save