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

This commit is contained in:
chenwenjian 2025-02-17 09:36:17 +08:00
commit f9f3fd79f5
8 changed files with 143 additions and 25 deletions

View File

@ -45,8 +45,14 @@ public interface VisaConstant {
String FORM_FIELD_REASON = "reason";
// 发生区域
String FORM_FIELD_RELATION_AREA = "relationArea";
// 发生内容
// 发生内容及说明
String FORM_FIELD_CONTEXT_DESCRIPTION = "contextDescription";
String FORM_FIELD_CONTEXT = "context";
String FORM_FIELD_DESCRIPTION = "description";
// 相关单位和人员
String FORM_FIELD_UNIT_PERSON = "unitPerson";
String FORM_FIELD_UNIT = "unit";
String FORM_FIELD_PERSON = "person";
// 变更金额
String FORM_FIELD_AMOUNT_CHANGE = "amountChange";
// 关联的任务单单据

View File

@ -357,7 +357,12 @@ public class VisaDetailByIdResponse {
if (CollectionUtils.isEmpty(professionalList)) {
return Lists.newArrayList();
}
return professionalList;
List<RelationProfessionalDetail> filter = professionalList.stream().filter(item -> Objects.nonNull(item) && StringUtils.isNotBlank(item.getCode())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filter)) {
return Lists.newArrayList();
}
return filter;
}
/**
@ -407,7 +412,11 @@ public class VisaDetailByIdResponse {
if (CollectionUtils.isEmpty(relationAreaList)) {
return Lists.newArrayList();
}
return relationAreaList;
List<RelationAreaDetail> filter = relationAreaList.stream().filter(item -> Objects.nonNull(item) && Objects.nonNull(item.getAreaId())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filter)) {
return Lists.newArrayList();
}
return filter;
}
public static List<Long> buildAreaWithId(JSONArray relationArea) {

View File

@ -87,8 +87,8 @@ public class ChangeRecordController implements ChangeRecordApi {
@Override
public ApiResult<VisaDetailByIdResponse> visaDetailById(@RequestBody @Valid VisaDetailByIdRequest req) {
VisaDetailByIdResponse resp = changeRecordService.detailById(req.getVisaId());
resp.setBtnList(VisaButtonTypeEnum.all());
// resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(req.getVisaId(), req.getPersonId(), req.getOuId(), req.getWorkspaceId(), resp.getStatus()));
// resp.setBtnList(VisaButtonTypeEnum.all());
resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(req.getVisaId(), req.getPersonId(), req.getOuId(), req.getWorkspaceId(), resp.getStatus()));
return ApiResult.ok(resp);
}

View File

@ -5,6 +5,7 @@ import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
@ -127,7 +128,7 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 最终审批时间
*/
@TableField(value = "approval_complete_time")
@TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.IGNORED)
private Date approvalCompleteTime;
/**

View File

@ -29,7 +29,7 @@ public abstract class BasicLogSupport {
return buildLogUserInfo(oneUserInfo);
}
protected String buildLogUserInfo(OrgNodeUserBriefInfoResp user) {
String userInfo = "";
String userInfo = "";
if (Objects.nonNull(user)) {
userInfo = user.getRealName() + "" + user.getJob().getName() + "-" + user.getOrganizationalUnitName() + "";
}
@ -37,10 +37,15 @@ public abstract class BasicLogSupport {
}
protected OrgNodeUserBriefInfoResp getOneUserInfo(BpmnTaskDelegateAssigner assigner) {
if (Objects.isNull(assigner)) {
return null;
}
List<OrgNodeUserBriefInfoResp> users = visaOrganizationalNodeUserGateway.listOrgNodeUsers(OrgNodeUserBriefInfoListReq.builder()
.workspaceId(Long.valueOf(assigner.getTenantId()))
.ouId(Long.valueOf(assigner.getOuId()))
.personIds(Lists.newArrayList(Long.valueOf(assigner.getPersonId())))
.needUnit(true)
.needJob(true)
.build());
return CollectionUtils.isEmpty(users) ? null : users.get(0);
}

View File

@ -86,6 +86,7 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
String visaType = (String) dto.getVariables().getOrDefault(WORKFLOW_VAR_VISA_TYPE_KEY, "");
return StringUtils.hasText(visaType) ? VisaTypeEnum.valueOf(visaType).getDesc() : "";
}
@Override
public void onCompleted(ProcessInstanceDTO dto) {
String visaTypeDesc = parseVisaType(dto);
@ -157,15 +158,21 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
.eq(ChangeRecord::getIsDelete, 0)
.oneOpt()
.ifPresent(changeRecord -> {
changeRecord.setApprovalStatus(resultEnum.getStatus());
changeRecord.setApprovalCompleteTime(new Date());
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
changeRecord.setApprovalStatus(resultEnum.getStatus());
changeRecord.setApprovalCompleteTime(new Date());
} else {
changeRecord.setApprovalId("");
changeRecord.setApprovalStatus("");
changeRecord.setApprovalCompleteTime(null);
}
changeRecordService.updateById(changeRecord);
});
// 更新关联表审批信息
changeRecordRelationService.lambdaQuery()
.eq(ChangeRecordRelation::getVisaId, visaId)
.eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE.getCode())
.eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE.name())
.eq(ChangeRecordRelation::getContent, dto.getProcessInstanceId())
.oneOpt()
.ifPresent(changeRecordRelation -> {
@ -173,11 +180,15 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
changeRecordRelationService.updateById(changeRecordRelation);
});
ChangeRecord visa = changeRecordService.getById(visaId);
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.updateStatus(VisaStatusEnum.COMPLETED)
.build());
return;
}
// 回退到待提报或决策中
ChangeRecord visa = changeRecordService.getById(visaId);
changeRecordService.changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.updateStatus(Objects.isNull(visa.getImGroupId()) ? VisaStatusEnum.REPORT_FROM_APPROVE : VisaStatusEnum.DECIDING_FROM_APPROVE)

View File

@ -10,6 +10,8 @@ import cn.axzo.workflow.common.model.response.mq.ProcessTaskDTO;
import cn.axzo.workflow.starter.handler.ProcessTaskEventHandler;
import org.springframework.stereotype.Component;
import java.util.Objects;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVED_AGRESS;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.TRANSMIT_APPROVE;
@ -53,8 +55,8 @@ public class ProcessTaskAllEventHandler extends BasicLogSupport implements Proce
ChangeRecordLog log = ChangeRecordLog.builder()
.visaId(Long.valueOf(dto.getBusinessKey()))
.action(dto.getType().getTag())
.title(String.format(APPROVED_AGRESS.getTitle(), user.getRealName()))
.content(String.format(APPROVED_AGRESS.getContent(), buildLogUserInfo(user)))
.title(String.format(APPROVED_AGRESS.getTitle(), Objects.isNull(user) ? "" : user.getRealName()))
.content(String.format(APPROVED_AGRESS.getContent(), Objects.isNull(user) ? "系统自动通过" : buildLogUserInfo(user)))
.build();
eventProducer.send(VisaChangeLogPayload.form(log));
}

View File

@ -6,6 +6,7 @@ import cn.axzo.apollo.workspace.api.workspace.res.GetDetailRes;
import cn.axzo.apollo.workspace.api.workspace.res.ProjectBriefResp;
import cn.axzo.apollo.workspace.api.workspace.res.ProjectDetailRes;
import cn.axzo.basics.common.constant.enums.OrganizationalNodeTypeEnum;
import cn.axzo.basics.common.constant.enums.OrganizationalUnitTypeEnum;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.common.util.NumberUtil;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
@ -26,6 +27,7 @@ import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.im.center.common.enums.GroupType;
import cn.axzo.maokai.api.vo.request.CooperateShipQueryReq;
import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq;
import cn.axzo.maokai.api.vo.request.OrganizationalUnitQuery;
import cn.axzo.maokai.api.vo.response.CooperateShipResp;
import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp;
import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO;
@ -90,7 +92,6 @@ import cn.axzo.nanopart.visa.server.utils.Constants;
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
@ -136,9 +137,12 @@ import java.util.stream.Collectors;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_AMOUNT_CHANGE;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_ATTACH;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT_DESCRIPTION;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_DESCRIPTION;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_HAPPEN_TIME;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_NO;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_PERSON;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_REASON;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_AREA;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_PROFESSIONAL;
@ -147,6 +151,8 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATIO
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_TASK_ORDER;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_VISA_ORDER;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT_PERSON;
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;
@ -154,6 +160,7 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_COD
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.server.utils.Constants.DATE_FORMAT;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
/**
* @author xudawei
@ -714,19 +721,21 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
formVariables.put(FORM_FIELD_HAPPEN_TIME, sdf.format(req.getHappenTime()));
formVariables.put(FORM_FIELD_TOPIC, req.getTopic());
formVariables.put(FORM_FIELD_RELATION_PROJECT, req.getRelationProject());
ProjectDetailRes projectDetailRes = visaProjectApiGateway.getProjectById(req.getRelationProject());
formVariables.put(FORM_FIELD_RELATION_PROJECT, projectDetailRes.getProjectInfo().getName());
formVariables.put(FORM_FIELD_RELATION_PROFESSIONAL, visaHelper.buildProfessionalName(req.getRelationProject(), req.getRelationProfessional()));
formVariables.put(FORM_FIELD_REASON, req.getReason());
formVariables.put(FORM_FIELD_RELATION_AREA, visaHelper.buildAreaName(req.getRelationArea()));
formVariables.put(FORM_FIELD_CONTEXT_DESCRIPTION, req.getChangeContextAndDescriptionList());
formVariables.put(FORM_FIELD_CONTEXT_DESCRIPTION, buildContextDescription(req.getChangeContextAndDescriptionList()));
formVariables.put(FORM_FIELD_UNIT_PERSON, buildUnitPerson(req.getRelationUnitAndPersonList(), req.getRelationWorkspaceId()));
// 非必填项
if (Objects.nonNull(req.getAmountChange())) {
String amountDesc = "不变";
if (req.getAmountChange().compareTo(BigDecimal.ZERO) > 0) {
amountDesc = "增加" + req.getAmountChange().toPlainString() + "";
amountDesc = "增加" + req.getAmountChange().abs().toPlainString() + "";
} else if (req.getAmountChange().compareTo(BigDecimal.ZERO) < 0) {
amountDesc = "减少" + req.getAmountChange().toPlainString() + "";
amountDesc = "减少" + req.getAmountChange().abs().toPlainString() + "";
}
formVariables.put(FORM_FIELD_AMOUNT_CHANGE, amountDesc);
}
@ -765,6 +774,76 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
return workflowGateway.processInstanceCreate(processDto);
}
private List<Map<String, Object>> buildUnitPerson(List<VisaChangeTempCreateReq.RelationUnitAndPerson> list, Long workspaceId) {
if (CollectionUtils.isEmpty(list)) {
return Collections.emptyList();
}
List<Long> ouIds = list.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuId).distinct().collect(Collectors.toList());
Map<Long, OrganizationalUnitVO> unitMap = organizationalUnitGateway.list(OrganizationalUnitQuery.builder().unitIds(ouIds).build())
.stream().collect(Collectors.toMap(OrganizationalUnitVO::getId, Function.identity(), (s, t) -> s));
Map<Long, List<VisaChangeTempCreateReq.RelationUnitAndPerson>> unitGroupBy = list.stream().collect(Collectors.groupingBy(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuId, Collectors.toList()));
List<Map<String, Object>> unitPersons = new ArrayList<>();
unitGroupBy.forEach((unitId, persons) -> {
Map<String, Object> unitPerson = new HashMap<>();
OrganizationalUnitVO unitVo = unitMap.get(unitId);
unitPerson.put(FORM_FIELD_UNIT, Objects.isNull(unitVo) ? "" : unitVo.getName() + "(" + OrganizationalUnitTypeEnum.getByType(unitVo.getType()).getDesc() + ")");
List<OrgNodeUserDTO> personInfos = getPersonInfos(workspaceId, unitId, persons);
unitPerson.put(FORM_FIELD_PERSON, buildPersonInfosStr(personInfos));
unitPersons.add(unitPerson);
});
return unitPersons;
}
private String buildPersonInfosStr(List<OrgNodeUserDTO> personInfos) {
StringBuilder personInfosStr = new StringBuilder();
if (CollectionUtils.isEmpty(personInfos)) {
return personInfosStr.toString();
}
for (OrgNodeUserDTO info : personInfos) {
if (personInfosStr.length() > 0) {
personInfosStr.append(",");
}
personInfosStr.append(info.getPersonProfile().getRealName())
.append("-")
.append(info.getJob().getName());
}
return personInfosStr.toString();
}
private List<OrgNodeUserDTO> getPersonInfos(Long workspaceId, Long unitId, List<VisaChangeTempCreateReq.RelationUnitAndPerson> persons) {
PageResp<OrgNodeUserDTO> pageResp = visaOrganizationalNodeUserGateway.list(ListOrgNodeUserReq.builder()
.personIds(persons.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getPersonId).collect(Collectors.toList()))
.organizationalUnitId(unitId)
.workspaceId(workspaceId)
.needs(ListNodeUserReq.Needs.builder().job(true).personProfile(true).build()).build());
if (Objects.isNull(pageResp) || CollectionUtils.isEmpty(pageResp.getData())) {
return Collections.emptyList();
}
return pageResp.getData();
}
private List<Map<String, Object>> buildContextDescription(List<VisaChangeTempCreateReq.ChangeContextAndDescription> list) {
if (CollectionUtils.isEmpty(list)) {
return Collections.emptyList();
}
List<Map<String, Object>> contextDescriptions = new ArrayList<>();
list.forEach(i -> {
Map<String, Object> contextDescription = new HashMap<>();
UploadFieldDTO uploadFieldDTO = new UploadFieldDTO();
uploadFieldDTO.setFileKey(i.getFileKey());
uploadFieldDTO.setFileName(i.getFileName());
uploadFieldDTO.setFileUrl(i.getFileUrl());
contextDescription.put(FORM_FIELD_CONTEXT, uploadFieldDTO);
contextDescription.put(FORM_FIELD_DESCRIPTION, i.getText());
contextDescriptions.add(contextDescription);
});
return contextDescriptions;
}
/**
* 更新
*
@ -776,16 +855,16 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
ChangeRecord changeRecord = new ChangeRecord();
changeRecord.setId(visaId);
changeRecord.setApprovalId(processInstanceId);
changeRecord.setApprovalStatus(BpmnProcessInstanceResultEnum.PROCESSING.getStatus());
changeRecord.setApprovalStatus(PROCESSING.getStatus());
updateById(changeRecord);
// 设置关联表的审批信息
ChangeRecordRelation processRelation = new ChangeRecordRelation();
processRelation.setVisaId(visaId);
processRelation.setVarName(VisaRelationFieldEnum.PROCESS_INSTANCE.getCode());
processRelation.setVarName(VisaRelationFieldEnum.PROCESS_INSTANCE.name());
processRelation.setVarType(VisaRelationVarTypeEnum.STRING.getType());
processRelation.setContent(processInstanceId);
processRelation.setContentExt(BpmnProcessInstanceResultEnum.PROCESSING.getStatus());
processRelation.setContentExt(PROCESSING.getStatus());
changeRecordRelationService.save(processRelation);
}
@ -1391,11 +1470,16 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long approveCreateOnlyVisaChangeRecord(VisaChangeApproveOnlyReq req) {
ChangeRecord visa = getById(req.getVisaId());
req.setOperatorWorkspaceId(visa.getRelationWorkspaceId());
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
AssertUtil.isTrue(!StringUtils.hasText(visa.getApprovalId())
|| (StringUtils.hasText(visa.getApprovalId()) && !Objects.equals(VisaStatusEnum.APPROVING.name(), visa.getApprovalStatus())),
"当前单据审批中,不允许操作");
// 组装 REQ 参数
VisaChangeApproveCreateReq createReq = buildVisaChangeApproveCreateReqByVisaId(req.getVisaId());
AssertUtil.notNull(createReq, "未找到变洽签单据");
@ -1408,10 +1492,6 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
createReq.setOperatorOuId(req.getOperatorOuId());
createReq.setOperatorPersonId(req.getOperatorPersonId());
createReq.setRelationWorkspaceId(req.getOperatorWorkspaceId());
String processInstanceId = createProcessInstance(createReq, req.getVisaId());
// 更新主表中的审批字段记录变量表的审批的信息
updateApprovalInfo(visa.getId(), processInstanceId);
// 更新主表状态
changeStatus(ChangeStatusRequest.builder()
@ -1421,6 +1501,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.ouId(req.getOperatorOuId())
.workspaceId(req.getOperatorWorkspaceId())
.build());
String processInstanceId = createProcessInstance(createReq, req.getVisaId());
// 更新主表中的审批字段记录变量表的审批的信息
updateApprovalInfo(visa.getId(), processInstanceId);
return req.getVisaId();
}