Merge remote-tracking branch 'origin/feature/REQ-3982' into feature/REQ-3982

This commit is contained in:
chenwenjian 2025-04-23 15:13:12 +08:00
commit 64976f8505
12 changed files with 268 additions and 211 deletions

View File

@ -3,6 +3,7 @@ package cn.axzo.nanopart.visa.api.request;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -86,7 +87,7 @@ public class ChangeStatusRequest {
*/
private boolean editFormFlag = true;
private VisaTypeEnum visaType;
public void check() {
if (Objects.nonNull(logType) && !VisaLogTypeEnum.isApproveNotAgree(logType)) {
throw new ServiceException("不是审核不通过日志");

View File

@ -79,7 +79,6 @@ public class VisaPayApproveCreateReq {
/**
* 操作人 OUID
*/
@NotNull
private Long operatorOuId;
/**

View File

@ -7,6 +7,18 @@
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<modelVersion>4.0.0</modelVersion>
<artifactId>visa-server</artifactId>

View File

@ -150,7 +150,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 最终审批时间
*/
@TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.IGNORED)
@TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.NOT_EMPTY)
private Date approvalCompleteTime;
/**
@ -222,7 +222,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 最终审批时间
*/
@TableField(value = "approval_complete_time_pay", updateStrategy = FieldStrategy.IGNORED)
@TableField(value = "approval_complete_time_pay", updateStrategy = FieldStrategy.NOT_EMPTY)
private Date approvalCompleteTimePay;
private static final Table<VisaStampStatusEnum, UpdateVisaChangeReq.VisaStampAction, VisaStampStatusEnum> VISA_STAMP_STATUS_ACTION = HashBasedTable.create();

View File

@ -2,6 +2,7 @@ package cn.axzo.nanopart.visa.server.dto;
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
@ -86,6 +87,10 @@ public class VisaLogParam {
*/
private VisaStatusEnum oldStatus;
/**
* 用于区别原始三个单据类型和价款审批
*/
private VisaTypeEnum visaType;
/**
* 获取删除附件信息

View File

@ -140,8 +140,9 @@ public class EssAllEventHandler implements EventHandler, InitializingBean {
.organizationUnitId(approveDetail.getOuId())
.type(1)
.build());
if (CollectionUtils.isEmpty(workspaces) || workspaces.size() != 1) {
if (CollectionUtils.isEmpty(workspaces)) {
log.error("未获取到指定单位的企业工作台信息, ouId{}", approveDetail.getOuId());
return;
}
GetWorkspaceDetailRes entWorkspace = workspaces.get(0);

View File

@ -1,34 +1,5 @@
package cn.axzo.nanopart.visa.server.mq.listener.workflow.process;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPACE_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_OU_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_ABORT;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REJECT_APPROVE;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REVERT_APPROVE;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.DESIGN_CHANGE;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PAY_CONFIRM;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PROJECT_VISA;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.TECHNOLOGY_APPROVED;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.groovy.util.Maps;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
@ -60,7 +31,35 @@ import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinition
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
import cn.azxo.framework.common.model.CommonResponse;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.groovy.util.Maps;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPACE_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_OU_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_ABORT;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_COMPLETED;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REJECT_APPROVE;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.REVERT_APPROVE;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_VISA;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.DESIGN_CHANGE;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PAY_CONFIRM;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.PROJECT_VISA;
import static cn.axzo.nanopart.visa.api.enums.VisaTypeEnum.TECHNOLOGY_APPROVED;
/**
* 工作流广播的实例维度的所有事件类型
@ -129,8 +128,8 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
log.info("send complete notice, onCompleted, processInstanceDTO: {}", JSON.toJSONString(dto));
sendCompleteNotice(dto);
log.info("send complete notice success");
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.APPROVED);
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(dto.getProcessDefinitionKey());
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.APPROVED, processDefinition);
if (isPayConfirm(dto)) {
changeRecordService.lambdaUpdate()
@ -209,7 +208,7 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
.build();
eventProducer.send(VisaChangeLogPayload.form(log));
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.CANCELLED);
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.CANCELLED, processDefinition);
}
/**
@ -234,7 +233,7 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
.build();
eventProducer.send(VisaChangeLogPayload.form(log));
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.REJECTED);
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.REJECTED, processDefinition);
}
@ -284,10 +283,10 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
.build();
eventProducer.send(VisaChangeLogPayload.form(log));
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.ABORTED);
updateChangeRecordApprovalStatus(dto, BpmnProcessInstanceResultEnum.ABORTED, processDefinition);
}
private void updateChangeRecordApprovalStatus(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum) {
private void updateChangeRecordApprovalStatus(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum, BpmnProcessDefinitionVO processDefinition) {
boolean isPayConfirm = isPayConfirm(dto);
// 更新主表审批状态信息
Long visaId = Long.valueOf(dto.getBusinessKey());
@ -333,24 +332,37 @@ public class ProcessInstanceOfVisaAllEventHandler extends BasicLogSupport implem
ChangeRecord visa = changeRecordService.getById(visaId);
BpmnTaskDelegateAssigner lastOperationAssigner = dto.getLastOperationAssigner();
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED) && isPayConfirm) {
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
.updateStatus(VisaStatusEnum.COMPLETED)
.editFormFlag(false)
.build());
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
if (isPayConfirm) {
// 修改状态并记录日志
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
.updateStatus(VisaStatusEnum.COMPLETED)
.visaType(PAY_CONFIRM)
.editFormFlag(false)
.build());
} else {
ChangeRecordLog log = ChangeRecordLog.builder()
.visaId(Long.valueOf(dto.getBusinessKey()))
.action(dto.getType().getTag())
.title(String.format(APPROVE_COMPLETED.getTitle(), processDefinition.getName()))
.content(String.format(APPROVE_COMPLETED.getContent(), processDefinition.getName()))
.build();
eventProducer.send(VisaChangeLogPayload.form(log));
}
return;
}
if (!isPayConfirm) {
// 回退到待提报或决策中
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.personId(Long.valueOf(lastOperationAssigner.getPersonId()))
.ouId(Long.valueOf(lastOperationAssigner.getOuId()))
.workspaceId(Long.valueOf(lastOperationAssigner.getTenantId()))
.personId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getPersonId()) ? lastOperationAssigner.getPersonId() : "0"))
.ouId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getOuId()) ? lastOperationAssigner.getOuId() : "0"))
.workspaceId(Long.valueOf(StringUtils.hasText(lastOperationAssigner.getTenantId()) ? lastOperationAssigner.getTenantId() : "0"))
.updateStatus(Objects.isNull(visa.getImGroupId()) ? VisaStatusEnum.REPORT_FROM_APPROVE : VisaStatusEnum.DECIDING_FROM_APPROVE)
.editFormFlag(false)
.build());

View File

@ -686,7 +686,9 @@ public class VisaHelper {
variables.put(FORM_PAY_ACTUAL_CONSTRUCTION_COMPLETE_DATE, req.getActualConstructionCompleteDate());
variables.put(FORM_PAY_DECLARED_AMOUNT, req.getDeclaredAmount());
variables.put(FORM_PAY_APPROVAL_AMOUNT, null);
variables.put(FORM_PAY_COMPLETE_CONFIRM_ATTACH, req.getAttachments());
if (CollectionUtils.isEmpty(req.getAttachments())) {
variables.put(FORM_PAY_COMPLETE_CONFIRM_ATTACH, req.getAttachments());
}
VisaChangeApproveCreateReq createReq = buildVisaChangeApproveCreateReqByVisaId(visaId);
Map<String, Object> visaFormVariables = buildStartFormVariables(createReq);

View File

@ -162,9 +162,12 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
// .orderBy(Constants.CHANGE_STATUS_FILE_ORDER_BY).build());
// break;
case TO_APPRROVE:
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
BpmnProcessDefinitionVO processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
// 动作:发起审批
// 状态流转:[待提报审批不通过的待提报决策中审批不通过的决策中执行中]-->[审批中]
logList.add(ChangeRecordLog.builder().visaId(visaId)
@ -174,11 +177,14 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
break;
case APPROVED_AGRESS:
changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
// 动作:审批流某审批人审批通过
// 状态流转:仍然是审批中 [审批中] -> [审批中]
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.APPROVED_AGRESS.name())
.title(String.format(VisaLogTypeEnum.APPROVED_AGRESS.getTitle(), userName))
@ -186,11 +192,14 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(Constants.ONE_APPROVED_ORDER_BY).build());
break;
case REVERT_APPROVE:
changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
// 动作:审批流撤回审批
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.REVERT_APPROVE.name())
.title(String.format(VisaLogTypeEnum.REVERT_APPROVE.getTitle(), processDefinition.getName()))
@ -198,11 +207,14 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
break;
case REJECT_APPROVE:
changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
// 动作:审批流撤回审批
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.REJECT_APPROVE.name())
.title(String.format(VisaLogTypeEnum.REJECT_APPROVE.getTitle(), userName, processDefinition.getName()))
@ -210,11 +222,14 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
break;
case TRANSMIT_APPROVE:
changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
// 动作:审批流操作转交
// 状态流转:[审批中] -> [审批到待提报|审批到决策中] 仅限第一个立项审批
userName = this.buildUserName(param.getPersonId(), param.getOuId(), param.getWorkspaceId());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.TRANSMIT_APPROVE.name())
.title(VisaLogTypeEnum.TRANSMIT_APPROVE.getTitle())
@ -232,8 +247,11 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(CHANGE_STATUS_FILE_ORDER_BY).build());
break;
case APPROVE_COMPLETED:
changeRecord = this.changeRecordService.getById(visaId);
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
// 动作:整个审批通过
// 状态流转:[审批中]-->[已完成]
logList.add(ChangeRecordLog.builder().visaId(visaId)
@ -243,10 +261,13 @@ public class ChangeRecordLogServiceImpl extends ServiceImpl<ChangeRecordLogDao,
.orderBy(Constants.APPROVE_COMPLETED_ORDER_BY).build());
break;
case APPROVE_ABORT:
changeRecord = this.changeRecordService.getById(visaId);
if (Objects.isNull(param.getVisaType())) {
ChangeRecord changeRecord = this.changeRecordService.getById(visaId);
param.setVisaType(changeRecord.getType());
}
// 动作:审批过程异常被流程引擎中止
// 状态流转:[审批中]->[审批到待提报|审批到决策中] 仅限第一个立项审批
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(changeRecord.getType().getProcessDefinitionKey());
processDefinition = workflowGateway.getActiveProcessDefinitionByKey(param.getVisaType().getProcessDefinitionKey());
logList.add(ChangeRecordLog.builder().visaId(visaId)
.action(VisaLogTypeEnum.APPROVE_ABORT.name())
.title(String.format(VisaLogTypeEnum.APPROVE_ABORT.getTitle(), processDefinition.getName()))

View File

@ -1,63 +1,5 @@
package cn.axzo.nanopart.visa.server.service.impl;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPACE_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_OU_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE_DESC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_CODE;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_INITIATOR_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.CANCEL;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.COMPLETE;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.TX_CANCEL;
import static cn.axzo.nanopart.visa.server.config.BizResultCode.CHANGE_RECORD_NOT_FOUND;
import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT;
import static cn.axzo.nanopart.visa.server.utils.Constants.FORM_FIELD_BILL_NAME;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import cn.axzo.apollo.api.req.QueryOrderToBasicReq;
import cn.axzo.apollo.api.res.ConstructionAreaDTO;
import cn.axzo.apollo.api.res.ConstructionAreaInfo;
@ -175,7 +117,62 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Pair;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_WORKSPACE_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_OU_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_ID;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE_DESC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_CODE;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_INITIATOR_NAME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.AUTO_COMPLETE;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.CANCEL;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.COMPLETE;
import static cn.axzo.nanopart.visa.api.request.UpdateVisaChangeReq.VisaStampAction.TX_CANCEL;
import static cn.axzo.nanopart.visa.server.config.BizResultCode.CHANGE_RECORD_NOT_FOUND;
import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT;
import static cn.axzo.nanopart.visa.server.utils.Constants.FORM_FIELD_BILL_NAME;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
/**
* @author xudawei
@ -285,7 +282,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.newAmountChange(request.getNewAmountChange())
.oldAmountChange(request.getOldAmountChange())
.uploadAttach(VisaLogParam.uploadAttachWithObject(request.getNewAttach(), request.getOldAttach()))
.deleteAttach(VisaLogParam.deleteAttachWithObject(request.getOldAttach(), request.getNewAttach())).build());
.deleteAttach(VisaLogParam.deleteAttachWithObject(request.getOldAttach(), request.getNewAttach()))
.visaType(request.getVisaType())
.build());
return true;
}
@ -897,7 +896,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
changeRecord.setId(visaId);
if (Objects.equals(VisaTypeEnum.PAY_CONFIRM, visaType)) {
changeRecord.setApprovalIdPay(processInstanceId);
changeRecord.setApprovalStatus(PROCESSING.getStatus());
changeRecord.setApprovalStatusPay(PROCESSING.getStatus());
} else {
// 原三种单据类型主表更新审批信息
changeRecord.setApprovalId(processInstanceId);
@ -1986,10 +1985,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
// 在某些用印操作时需要记录recordLog用于详情展示因为以前详情展示的操作日志是使用的recordLog
insertRecordLog(req);
operateLogService.save(req.getContext(), req.getVisaId(), //
"request", req, //
"oldValue", oldValue, //
"newValue", this.getById(req.getVisaId()));
operateLogService.save(req.getContext(), req.getVisaId(), //
"request", req, //
"oldValue", oldValue, //
"newValue", this.getById(req.getVisaId()));
}
public ChangeRecord toUpdate(UpdateVisaChangeReq req, ChangeRecord oldValue) {
@ -2170,13 +2169,14 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
AssertUtil.isTrue(StringUtils.hasText(processInstanceId), "创建审批异常");
// 更新主表中的审批字段记录变量表的审批的信息
updateApprovalInfo(visa.getId(), processInstanceId, req.getOperatorPersonId(), visa.getType());
updateApprovalInfo(visa.getId(), processInstanceId, req.getOperatorPersonId(), VisaTypeEnum.PAY_CONFIRM);
// 写入发起审批的日志
changeRecordLogService.batchAddLog(changeRecordLogService.buildLogList(visa.getId(), VisaLogTypeEnum.TO_APPRROVE, VisaLogParam.builder()
.ouId(req.getOperatorOuId())
.personId(req.getOperatorPersonId())
.workspaceId(visa.getRelationWorkspaceId())
.visaType(VisaTypeEnum.PAY_CONFIRM)
.build()));
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.visa.server.service.impl;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_PAY;
@ -12,7 +13,6 @@ import java.util.Map;
import java.util.function.Consumer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
import cn.axzo.msg.center.service.pending.request.PendingMessageByBizCodeRequest;
@ -37,79 +37,77 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class DetailCardBuilder {
private final PrintModelService printModelService;
private final ChangeRecordRelationService changeRecordRelationService;
private final PendingMessageClient pendingMessageClient;
private final PrintModelService printModelService;
private final ChangeRecordRelationService changeRecordRelationService;
private final PendingMessageClient pendingMessageClient;
List<DetailCard> build(ChangeRecord visa) {
ArrayList<DetailCard> details = new ArrayList<>();
Consumer<VisaProcessPhase> builder = (phase) -> {
DetailCard detail = new DetailCard();
PrintModelDTO printModel = printModelService.getPrintTemplateConfig(visa, phase);
List<DetailCard> build(ChangeRecord visa) {
ArrayList<DetailCard> details = new ArrayList<>();
Consumer<VisaProcessPhase> builder = (phase) -> {
VisaRelationFieldEnum workflowField = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_VISA
: PROCESS_INSTANCE_OF_PAY;
ChangeRecordRelation workflowRelation = changeRecordRelationService.lambdaQuery() //
.eq(ChangeRecordRelation::getVisaId, visa.getId()) //
.eq(ChangeRecordRelation::getVarName, workflowField.name()) //
.orderByDesc(ChangeRecordRelation::getId) //
.last("LIMIT 1") //
.one();
if (workflowRelation == null)
return;
DetailCard detail = new DetailCard();
detail.setWorkflowInstanceId(workflowRelation.getContent());
FormInstanceVO formInstance = printModelService.getFormInstance(workflowRelation.getContent());
if (formInstance != null)
detail.setFormModel(formInstance.getFormModel());
BpmnProcessInstanceResultEnum workflowStatus = BpmnProcessInstanceResultEnum.valueOfStatus(
workflowRelation.getContentExt());
VisaRelationFieldEnum workflowField = phase == VisaProcessPhase.PROJECT ? PROCESS_INSTANCE_OF_VISA
: PROCESS_INSTANCE_OF_PAY;
ChangeRecordRelation workflowRelation = changeRecordRelationService.lambdaQuery()
.eq(ChangeRecordRelation::getVisaId, visa.getId())
.eq(ChangeRecordRelation::getVarName, workflowField.name())
.orderByDesc(ChangeRecordRelation::getId)
.last("LIMIT 1")
.one();
BpmnProcessInstanceResultEnum workflowStatus = null;
if (workflowRelation != null) {
detail.setWorkflowInstanceId(workflowRelation.getContent());
FormInstanceVO formInstance = printModelService.getFormInstance(workflowRelation.getContent());
if (formInstance != null)
detail.setFormModel(formInstance.getFormModel());
workflowStatus = BpmnProcessInstanceResultEnum.valueOfStatus(workflowRelation.getContentExt());
}
detail.setTitle(printModel.getPrintFileName());
if (workflowStatus != null) {
detail.setWorkflowStatus(workflowStatus.getStatus());
String prefix = phase == VisaProcessPhase.PROJECT ? "立项" : "价款";
detail.setWorkflowStatusDesc(prefix + workflowStatus.getDesc());
}
VisaStampStatusEnum stampStatus = phase == VisaProcessPhase.PROJECT ? visa.getStampStatus() : visa.getStampStatusPay();
if(stampStatus != null && stampStatus != VisaStampStatusEnum.UNKNOWN) {
detail.setStampStatus(stampStatus.name());
detail.setStampStatusDesc(stampStatus.getDesc());
}
detail.addButton("查看详情", WorkflowButtonType.DETAIL);
PrintModelDTO printModel = printModelService.getPrintTemplateConfig(visa.getRelationWorkspaceId() + "");
detail.setTitle(printModel.getPrintFileName());
if (workflowStatus != null) {
detail.setWorkflowStatus(workflowStatus.getStatus());
String prefix = phase == VisaProcessPhase.PROJECT ? "立项" : "价款";
detail.setWorkflowStatusDesc(prefix + workflowStatus.getDesc());
}
VisaStampStatusEnum stampStatus = phase == VisaProcessPhase.PROJECT ? visa.getStampStatus()
: visa.getStampStatusPay();
if (stampStatus != null && stampStatus != VisaStampStatusEnum.UNKNOWN) {
detail.setStampStatus(stampStatus.name());
detail.setStampStatusDesc(stampStatus.getDesc());
}
detail.addButton("查看详情", WorkflowButtonType.DETAIL);
if (workflowStatus == BpmnProcessInstanceResultEnum.APPROVED) {
if (stampStatus == VisaStampStatusEnum.USED_PRINTS)
detail.addButton("打印", WorkflowButtonType.PRINT);
else if (stampStatus == VisaStampStatusEnum.UNPRINTED || stampStatus == VisaStampStatusEnum.WITH_PRINT)
detail.addButton("用印预览", WorkflowButtonType.PRINT_PREVIEW);
if (stampStatus == VisaStampStatusEnum.UNPRINTED)
detail.addButton("申请用印", WorkflowButtonType.REQUEST_STAMP);
else if (stampStatus == VisaStampStatusEnum.WITH_PRINT)
detail.addButton("用印进展", WorkflowButtonType.STAMP_PROGRESS);
else if (stampStatus == VisaStampStatusEnum.UNPRINTED || stampStatus == VisaStampStatusEnum.WITH_PRINT)
detail.addButton("用印预览", WorkflowButtonType.PRINT_PREVIEW);
if (stampStatus == VisaStampStatusEnum.UNPRINTED)
detail.addButton("申请用印", WorkflowButtonType.REQUEST_STAMP);
else if (stampStatus == VisaStampStatusEnum.WITH_PRINT)
detail.addButton("用印进展", WorkflowButtonType.STAMP_PROGRESS);
}
details.add(detail);
};
if (StringUtils.hasText(visa.getApprovalId()))
builder.accept(VisaProcessPhase.PROJECT);
if (StringUtils.hasText(visa.getApprovalIdPay()))
builder.accept(VisaProcessPhase.PAYMENT);
return details;
}
details.add(detail);
};
builder.accept(VisaProcessPhase.PROJECT);
builder.accept(VisaProcessPhase.PAYMENT);
return details;
}
public void populateCardTodoIdentityCode(List<DetailCard> cards, Long personId) {
if (cards == null) return;
List<String> bizCodes = cards.stream()
.map(DetailCard::getWorkflowInstanceId)
.collect(toList());
public void populateCardTodoIdentityCode(List<DetailCard> cards, Long personId) {
if (cards == null)
return;
List<String> bizCodes = cards.stream().map(DetailCard::getWorkflowInstanceId).collect(toList());
PendingMessageByBizCodeRequest request = new PendingMessageByBizCodeRequest();
request.setBizCodes(bizCodes);
request.setOperatorPersonId(personId);
Map<String, List<PendingMessageSimpleDTO>> biz2Todos = pendingMessageClient.getLatestByBizCode(request)
.getData().stream().collect(groupingBy(PendingMessageSimpleDTO::getBizCode));
for (DetailCard card : cards) {
List<PendingMessageSimpleDTO> todos = biz2Todos.getOrDefault(card.getWorkflowInstanceId(), Collections.emptyList());
if (!todos.isEmpty())
card.setTodoIdentityCode(todos.get(0).getIdentityCode());
}
}
request.setOperatorPersonId(personId);
Map<String, List<PendingMessageSimpleDTO>> biz2Todos = pendingMessageClient.getLatestByBizCode(
request).getData().stream().collect(groupingBy(PendingMessageSimpleDTO::getBizCode));
for (DetailCard card : cards) {
List<PendingMessageSimpleDTO> todos = biz2Todos.getOrDefault(card.getWorkflowInstanceId(),
Collections.emptyList());
if (!todos.isEmpty())
card.setTodoIdentityCode(todos.get(0).getIdentityCode());
}
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.visa.server.service.impl;
import org.springframework.stereotype.Component;
@ -19,20 +20,25 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class PrintModelService {
private final WorkflowGateway workflowGateway;
private final RefreshableConfiguration refreshableConfiguration;
private final WorkflowGateway workflowGateway;
private final RefreshableConfiguration refreshableConfiguration;
public PrintModelDTO getPrintTemplateConfig(ChangeRecord visa, VisaProcessPhase phase) {
PrintTemplateConfigQueryDTO request = new PrintTemplateConfigQueryDTO();
request.setProcessDefinitionKey(refreshableConfiguration.getStampProcessDefinitionKey());
request.setTenantId(phase == VisaProcessPhase.PROJECT ? visa.getApprovalId() : visa.getApprovalIdPay());
return workflowGateway.getPrintTemplateConfig(request);
}
public PrintModelDTO getPrintTemplateConfig(ChangeRecord visa, VisaProcessPhase phase) {
return getPrintTemplateConfig(
phase == VisaProcessPhase.PROJECT ? visa.getApprovalId() : visa.getApprovalIdPay());
}
public FormInstanceVO getFormInstance(String approvalId) {
FormDetailDTO request = new FormDetailDTO();
request.setProcessInstanceId(approvalId);
return workflowGateway.getFormInstance(request);
}
public PrintModelDTO getPrintTemplateConfig(String tenantId) {
PrintTemplateConfigQueryDTO request = new PrintTemplateConfigQueryDTO();
request.setProcessDefinitionKey(refreshableConfiguration.getStampProcessDefinitionKey());
request.setTenantId(tenantId);
return workflowGateway.getPrintTemplateConfig(request);
}
public FormInstanceVO getFormInstance(String approvalId) {
FormDetailDTO request = new FormDetailDTO();
request.setProcessInstanceId(approvalId);
return workflowGateway.getFormInstance(request);
}
}