feat: (REQ-3300) 变更单详情-专业与区域优化

This commit is contained in:
xudawei 2025-02-10 11:35:13 +08:00
parent 1414b9cf7f
commit b40f421abb
7 changed files with 200 additions and 69 deletions

View File

@ -5,17 +5,22 @@ import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author xudawei
@ -114,6 +119,11 @@ public class VisaDetailByIdResponse {
*/
private List<RelationAreaDetail> relationAreaList;
/**
* 区域集合名称
*/
private String relationAreaName;
/**
* 提出时间
*/
@ -130,6 +140,11 @@ public class VisaDetailByIdResponse {
*/
private List<RelationProfessionalDetail> relationProfessionalList;
/**
* 专业集合名称
*/
private String relationProfessionalName;
/**
* 相关单位及人员
*/
@ -291,21 +306,40 @@ public class VisaDetailByIdResponse {
@NoArgsConstructor
@AllArgsConstructor
public static class RelationProfessionalDetail {
/**
* id
*/
private Long id;
/**
* code
*/
private String code;
/**
* 名称
* 构建专业集合-对象集合
*/
private String name;
public static List<VisaDetailByIdResponse.RelationProfessionalDetail> buildProfessionWithObject(JSONArray relationProfessional) {
if (CollectionUtils.isEmpty(relationProfessional)) {
return Lists.newArrayList();
}
List<VisaDetailByIdResponse.RelationProfessionalDetail> professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessionalDetail.class);
if (CollectionUtils.isEmpty(professionalList)) {
return Lists.newArrayList();
}
return professionalList;
}
/**
* 构建专业集合-code集合
*/
public static Set<String> buildProfessionWithCode(JSONArray relationProfessional) {
List<RelationProfessionalDetail> relationProfessionalDetails = RelationProfessionalDetail.buildProfessionWithObject(relationProfessional);
if (CollectionUtils.isEmpty(relationProfessionalDetails)) {
return Sets.newHashSet();
}
return relationProfessionalDetails.stream()
.filter(item -> Objects.nonNull(item) && StringUtils.isNotBlank(item.getCode()))
.map(RelationProfessionalDetail::getCode).collect(Collectors.toSet());
}
}
@ -331,10 +365,26 @@ public class VisaDetailByIdResponse {
*/
private Long id;
/**
* 名称
*/
private String name;
public static List<VisaDetailByIdResponse.RelationAreaDetail> buildAreaWithObject(JSONArray relationArea) {
if (CollectionUtils.isEmpty(relationArea)) {
return Lists.newArrayList();
}
List<VisaDetailByIdResponse.RelationAreaDetail> relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationAreaDetail.class);
if (CollectionUtils.isEmpty(relationAreaList)) {
return Lists.newArrayList();
}
return relationAreaList;
}
public static List<Long> buildAreaWithId(JSONArray relationArea) {
List<VisaDetailByIdResponse.RelationAreaDetail> areaDetailList = RelationAreaDetail.buildAreaWithObject(relationArea);
if (CollectionUtils.isEmpty(areaDetailList)) {
return Lists.newArrayList();
}
return areaDetailList.stream().map(VisaDetailByIdResponse.RelationAreaDetail::getId).collect(Collectors.toList());
}
}

View File

@ -13,6 +13,7 @@ import org.apache.commons.collections.CollectionUtils;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@ -79,6 +80,11 @@ public class VisaConfirmDto {
*/
private Long projectId;
/**
* 确认工程集合
*/
private Collection<Long> projectIds;
/**
* 确认节点
*/
@ -115,20 +121,33 @@ public class VisaConfirmDto {
dto.setPersonIds(personIds);
}
Collection<Long> ouIds = dataItems.stream().map(item -> item.getOuId()).collect(Collectors.toSet());
Collection<Long> ouIds = dataItems.stream()
.filter(item -> Objects.nonNull(item.getOuId()))
.map(item -> item.getOuId()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(ouIds)) {
dto.setOuIds(ouIds);
}
Collection<Long> workspaceIds = dataItems.stream().map(item -> item.getWorkspaceId()).collect(Collectors.toSet());
Collection<Long> workspaceIds = dataItems.stream()
.filter(item -> Objects.nonNull(item.getWorkspaceId()))
.map(item -> item.getWorkspaceId()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(workspaceIds)) {
dto.setWorkspaceIds(workspaceIds);
}
Set<Long> nodeIds = dataItems.stream().map(item -> item.getNodeId()).collect(Collectors.toSet());
Set<Long> nodeIds = dataItems.stream()
.filter(item -> Objects.nonNull(item.getNodeId()))
.map(item -> item.getNodeId()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(nodeIds)) {
dto.setNodeIds(nodeIds);
}
Collection<Long> projectIds = dataItems.stream()
.filter(item -> CollectionUtils.isNotEmpty(item.getProjectIds()))
.flatMap(item -> item.getProjectIds().stream()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(projectIds)) {
dto.setProjectIds(projectIds);
}
}
dto.setVisaTypes(visaTypes);
return dto;

View File

@ -6,6 +6,8 @@ import cn.axzo.apollo.core.web.Result;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.springframework.stereotype.Service;
import java.util.List;
@ -23,6 +25,9 @@ public class ApolloConstructionAreaGateway {
public List<ConstructionAreaInfo> getAllConstructionAreaByIds(List<Long> areaIds) {
try {
if (CollectionUtils.isEmpty(areaIds)) {
return Lists.newArrayList();
}
log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,params:{}", JSON.toJSONString(areaIds));
Result<List<ConstructionAreaInfo>> result = apolloConstructionAreaApi.getAllConstructionAreaByIds(areaIds);
log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,result:{}", JSON.toJSONString(result));
@ -34,4 +39,20 @@ public class ApolloConstructionAreaGateway {
}
public String generateAreaFullNameByAreaIds(List<Long> areaIds) {
try {
if (CollectionUtils.isEmpty(areaIds)) {
return "";
}
log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,params:{}", JSON.toJSONString(areaIds));
Result<String> result = apolloConstructionAreaApi.generateAreaFullNameByAreaIds(areaIds);
log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,result:{}", JSON.toJSONString(result));
return result.getData();
} catch (Exception e) {
log.warn("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds exception", e);
throw e;
}
}
}

View File

@ -2,14 +2,27 @@ package cn.axzo.nanopart.visa.server.service;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext;
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway;
import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway;
import cn.axzo.nanopart.visa.server.utils.Constants;
import cn.axzo.thor.client.model.DrawingMajorResp;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author xudawei
@ -26,6 +39,12 @@ public class VisaHelper {
@Resource
private ChangeRecordService changeRecordService;
@Resource
private DrawingMajorGateway drawingMajorGateway;
@Resource
private ApolloConstructionAreaGateway apolloConstructionAreaGateway;
/**
* 状态更新与添加日志此时新增记录时状态没有维护
*/
@ -58,4 +77,71 @@ public class VisaHelper {
}
/**
* 构建详情的专业回显
*/
public String buildProfessionalName(Long projectId, JSONArray professionals) {
if (Objects.isNull(projectId) || CollectionUtils.isEmpty(professionals)) {
return "";
}
Set<String> majorCodes = VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithCode(professionals);
if (CollectionUtils.isEmpty(majorCodes)) {
return "";
}
List<DrawingMajorResp> majorRespList = drawingMajorGateway.list(projectId, majorCodes, true);
// 构建专业集合 key:叶子结点codevalue父节点+子节点的名字
Map<String, String> codeNameMap = this.buildProfessionalLeafName(majorRespList);
if (CollectionUtils.isEmpty(majorCodes)) {
return "";
}
return codeNameMap.values().stream().filter(item -> StringUtils.hasText(item)).collect(Collectors.joining(","));
}
/**
* 构建区域名称
*/
public String buildAreaName(JSONArray areas) {
if (CollectionUtils.isEmpty(areas)) {
return "";
}
return apolloConstructionAreaGateway.generateAreaFullNameByAreaIds(VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithId(areas));
}
/**
* @param list 专业集合
* @return key:叶子结点codevalue父节点+子节点的名字
*/
private Map<String, String> buildProfessionalLeafName(List<DrawingMajorResp> list) {
if (CollectionUtils.isEmpty(list)) {
return Collections.emptyMap();
}
Map<String, String> codeNameMap = new HashMap<>();
for (DrawingMajorResp resp : list) {
recursionProfessional(resp, resp.getName(), codeNameMap);
}
return codeNameMap;
}
/**
* 递归专业
* codeNameMap,key:叶子结点codevalue父节点+子节点的名字
*/
private void recursionProfessional(DrawingMajorResp drawingMajorResp, String name, Map<String, String> codeNameMap) {
if (Objects.isNull(drawingMajorResp) || CollectionUtils.isEmpty(drawingMajorResp.getChildren())) {
return;
}
for (DrawingMajorResp resp : drawingMajorResp.getChildren()) {
if (CollectionUtils.isNotEmpty(resp.getChildren())) {
recursionProfessional(resp, name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName(), codeNameMap);
} else {
codeNameMap.put(resp.getCode(), name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName());
}
}
}
}

View File

@ -303,6 +303,7 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl<ChangeRecordConf
.eq(Objects.nonNull(dto.getNodeId()), ChangeRecordConfirm::getNodeId, dto.getNodeId())
.in(CollectionUtils.isNotEmpty(dto.getNodeIds()), ChangeRecordConfirm::getNodeId, dto.getNodeIds())
.eq(Objects.nonNull(dto.getProjectId()), ChangeRecordConfirm::getProjectId, dto.getProjectId())
.in(CollectionUtils.isNotEmpty(dto.getProjectIds()), ChangeRecordConfirm::getProjectId, dto.getProjectIds())
.eq(Objects.nonNull(dto.getType()), ChangeRecordConfirm::getType, dto.getType())
.eq(Objects.nonNull(dto.getBizType()), ChangeRecordConfirm::getBizType, dto.getBizType())
.in(CollectionUtils.isNotEmpty(dto.getVisaTypes()), ChangeRecordConfirm::getVisaType, dto.getVisaTypes())

View File

@ -1,6 +1,5 @@
package cn.axzo.nanopart.visa.server.service.impl;
import cn.axzo.apollo.api.res.ConstructionAreaInfo;
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;
@ -71,7 +70,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.thor.client.model.DrawingMajorResp;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
@ -82,7 +80,6 @@ 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.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -207,7 +204,6 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway;
/**
* 状态变更
*/
@ -367,8 +363,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.createBy(visa.getCreateBy()) //发起人Id
.happenTime(Objects.nonNull(visa.getHappenTime()) ? DateUtil.format(visa.getHappenTime(), "yyyy-MM-dd") : "") // 提出时间
.approvalCompleteTime(Objects.nonNull(visa.getApprovalCompleteTime()) ? DateUtil.format(visa.getApprovalCompleteTime(), "yyyy-MM-dd HH:mm:ss") : "") //最终审批时间
.relationProfessionalList(this.buildProfession(visa.getRelationProject(), visa.getRelationProfessional()))//专业
.relationAreaList(this.buildArea(visa.getRelationArea())) //区域
.relationProfessionalList(VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithObject(visa.getRelationProfessional()))//专业
.relationProfessionalName(this.visaHelper.buildProfessionalName(visa.getRelationProject(), visa.getRelationProfessional())) //专业名称
.relationAreaList(VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithObject(visa.getRelationArea())) //区域
.relationAreaName(this.visaHelper.buildAreaName(visa.getRelationArea())) // 区域名称
.relationProject(visa.getRelationProject()) // 工程Id
.relationProjectName((Objects.nonNull(projectDetailRes) && Objects.nonNull(projectDetailRes.getProjectInfo())) ? projectDetailRes.getProjectInfo().getName() : "") // 工程名称
.relationWorkspaceId(visa.getRelationWorkspaceId()) // 项目Id
@ -1110,58 +1108,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}));
}
private List<VisaDetailByIdResponse.RelationAreaDetail> buildArea(JSONArray relationArea) {
if (CollectionUtils.isEmpty(relationArea)) {
return Lists.newArrayList();
}
List<VisaDetailByIdResponse.RelationArea> relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationArea.class);
if (CollectionUtils.isEmpty(relationAreaList)) {
return Lists.newArrayList();
}
List<Long> areaIds = relationAreaList.stream()
.filter(item -> Objects.nonNull(item.getId()))
.map(VisaDetailByIdResponse.RelationArea::getId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(areaIds)) {
return Lists.newArrayList();
}
List<ConstructionAreaInfo> list = apolloConstructionAreaGateway.getAllConstructionAreaByIds(areaIds);
if (CollectionUtils.isEmpty(list)) {
return Lists.newArrayList();
}
return list.stream().map(item -> VisaDetailByIdResponse.RelationAreaDetail.builder()
.id(item.getId())
.name(item.getName()).build())
.collect(Collectors.toList());
}
/**
* 构建专业集合
*/
private List<VisaDetailByIdResponse.RelationProfessionalDetail> buildProfession(Long projectId, JSONArray relationProfessional) {
if (Objects.isNull(projectId) || CollectionUtils.isEmpty(relationProfessional)) {
return Lists.newArrayList();
}
List<VisaDetailByIdResponse.RelationProfessional> professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessional.class);
if (CollectionUtils.isEmpty(professionalList)) {
return Lists.newArrayList();
}
Set<String> majorCodes = professionalList.stream()
.filter(item -> StringUtils.hasText(item.getCode()))
.map(VisaDetailByIdResponse.RelationProfessional::getCode).collect(Collectors.toSet());
if (CollectionUtils.isEmpty(majorCodes)) {
return Lists.newArrayList();
}
List<DrawingMajorResp> majorRespList = drawingMajorGateway.list(projectId, majorCodes, true);
if (CollectionUtils.isEmpty(majorCodes)) {
return Lists.newArrayList();
}
return majorRespList.stream()
.map(item -> VisaDetailByIdResponse.RelationProfessionalDetail.builder().id(item.getId()).code(item.getCode()).name(item.getName()).build())
.collect(Collectors.toList());
}
/**
* 通过变更签证Id获取Entity

View File

@ -45,4 +45,9 @@ public class Constants {
* 工程签证数据权限的code
*/
public static final String PROJECT_VISA_DATA_OBJECT = "project_visa";
/**
* 工程签证数据权限的code
*/
public static final String SPLIT_TREE_NODE_CHAT = "-";
}