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

# Conflicts:
#	visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java
This commit is contained in:
xudawei 2025-02-10 11:38:47 +08:00
commit c09bae37c2
7 changed files with 266 additions and 46 deletions

View File

@ -1,14 +1,15 @@
package cn.axzo.nanopart;
import cn.axzo.basics.report.api.ReportServiceSDK;
import cn.axzo.nanopart.config.RocketMQEventConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
@ComponentScan(value = {"cn.axzo.nanopart","cn.axzo.basics"})
@MapperScan(value = {"cn.axzo.**.mapper"})
@SpringBootApplication
@EnableFeignClients(basePackages = {

View File

@ -60,6 +60,7 @@ public interface VisaConstant {
// ***************** IM-Group-Tips ******************
String IM_GROUP_OWNER_TIPS = "群成员共计%d人收到回复%d人其中%d人同意%d人拒绝。";
String IM_GROUP_PARTICIPATE_TIPS = "由%s提交的%s需要你同意是否同意";
String IM_GROUP_PARTICIPATE_TIPS = "由 %s 提交的【%s】需要你处理是否同意";
String IM_GROUP_PARTICIPATE_TIPS_OPERATED = "你已%s由 %s 提交的【%s】";
}

View File

@ -28,7 +28,6 @@ public class ChangeRecordButtonOperationReq {
/**
* IM ID
*/
@NotNull(message = "IM 群 ID 不能为空")
private Long imGroupId;
/**

View File

@ -32,4 +32,16 @@ public class RefreshableConfiguration {
*/
@Value("${visa.im.event.addMember:visaNegotiation}")
private String imGroupAddMemberNoticeEventCode;
/**
* 相关单位确认人人数限制
*/
@Value("${visa.verifyPersonLimit: 8}")
private Integer verifyPersonLimit;
/**
* 关联变更单个数限制
*/
@Value("${visa.verifyVisaLimit: 5}")
private Integer verifyVisaLimit;
}

View File

@ -65,4 +65,6 @@ public interface ChangeRecordRelationService extends IService<ChangeRecordRelati
* @param req
*/
void appendAttachment(ChangeRecordAppendAttachReq req);
boolean deleteByIds(List<Long> ids);
}

View File

@ -45,12 +45,14 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_ATTACH;
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_OWNER_TIPS;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_PARTICIPATE_TIPS;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_PARTICIPATE_TIPS_OPERATED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
/**
@ -161,7 +163,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
ChangeRecordRelation relation = new ChangeRecordRelation();
relation.setVisaId(req.getVisaId());
relation.setVarName(VisaRelationFieldEnum.IM_GROUP_PARTICIPATE.getCode());
relation.setVarExt(req.getButtonType().getCode());
relation.setVarExt(req.getButtonType().name());
relation.setVarType(VisaRelationVarTypeEnum.LONG.getType());
relation.setContentExt(String.valueOf(req.getOperatorWorkspaceId()));
relation.setContent(String.valueOf(req.getOperatorOuId()));
@ -219,6 +221,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
.visaId(req.getVisaId())
.varName(VisaRelationFieldEnum.IM_GROUP_PARTICIPATE.getCode())
.build());
List<ImGroupButton> buttons = new ArrayList<>();
if (Boolean.TRUE.equals(req.getIsGroupOwner())) {
Map<String, Long> countMap = imGroupParticipate.stream()
@ -274,11 +277,16 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
} else if (Objects.equals(VisaStatusEnum.DECIDING, record.getStatus())
|| Objects.equals(VisaStatusEnum.EXECUTING, record.getStatus())) {
// IM 群中非群主的人
boolean operated = imGroupParticipate.stream()
Optional<ChangeRecordRelation> any = imGroupParticipate.stream()
.filter(i -> Objects.equals(i.getCreateBy(), req.getPersonId()))
.anyMatch(i -> Objects.equals(i.getContentExt(), String.valueOf(req.getOuId())));
if (!operated) {
PersonProfileDto profile = visaProfileGateway.getProfile(record.getCreateBy());
.filter(i -> Objects.equals(i.getContentExt(), String.valueOf(req.getOuId())))
.findAny();
PersonProfileDto profile = visaProfileGateway.getProfile(record.getCreateBy());
if (any.isPresent()) {
ChangeRecordRelation operation = any.get();
VisaButtonTypeEnum buttonType = VisaButtonTypeEnum.valueOf(operation.getVarExt());
resp.setTipsText(String.format(IM_GROUP_PARTICIPATE_TIPS_OPERATED, buttonType.getDesc(), profile.getRealName(), record.getTopic()));
} else {
resp.setTipsText(String.format(IM_GROUP_PARTICIPATE_TIPS, profile.getRealName(), record.getTopic()));
buttons.add(ImGroupButton.builder()
.name(VisaButtonTypeEnum.AGREE.getDesc())
@ -288,7 +296,12 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
.name(VisaButtonTypeEnum.REJECT.getDesc())
.type(VisaButtonTypeEnum.REJECT.getCode())
.build());
}
} else {
// 不显示横条
resp.setStatus(null);
resp.setTipsText(null);
}
resp.setButtonList(buttons);
return resp;
@ -331,4 +344,11 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
}
}
@Override
public boolean deleteByIds(List<Long> ids) {
return lambdaUpdate().in(ChangeRecordRelation::getId, ids)
.setSql("is_delete = id")
.update();
}
}

View File

@ -1,5 +1,6 @@
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;
@ -7,6 +8,7 @@ import cn.axzo.basics.common.constant.enums.OrganizationalNodeTypeEnum;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.common.util.NumberUtil;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.basics.report.api.ReportServiceSDK;
import cn.axzo.basics.report.api.sheet.SheetWrapper;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.domain.ServiceException;
@ -17,9 +19,14 @@ import cn.axzo.im.center.api.vo.req.GroupDismissRequest;
import cn.axzo.im.center.api.vo.resp.GroupCreateResponse;
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.response.CooperateShipResp;
import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp;
import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO;
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum;
import cn.axzo.msg.center.service.dto.PeerPerson;
import cn.axzo.msg.center.service.pending.request.CardSendRequest;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaChangeFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
@ -41,6 +48,7 @@ import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
import cn.axzo.nanopart.visa.api.response.VisaChangeInitiatorResp;
import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import cn.axzo.nanopart.visa.server.config.RefreshableConfiguration;
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm;
@ -49,12 +57,14 @@ import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext;
import cn.axzo.nanopart.visa.server.dto.VisaBillDto;
import cn.axzo.nanopart.visa.server.dto.VisaConfirmDto;
import cn.axzo.nanopart.visa.server.dto.VisaExportDto;
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordDao;
import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway;
import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway;
import cn.axzo.nanopart.visa.server.rpc.MsgCenterGateway;
import cn.axzo.nanopart.visa.server.rpc.OrganizationalUnitGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaCooperateShipGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaOrganizationalNodeUserGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaProjectApiGateway;
@ -70,6 +80,7 @@ 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;
@ -80,6 +91,7 @@ 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;
@ -91,14 +103,14 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.beans.factory.annotation.Autowired;
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.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@ -126,6 +138,7 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC;
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.MSG_CENTER_APP_CODE;
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;
@ -136,7 +149,6 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_
*/
@Slf4j
@Service
@RefreshScope
public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, ChangeRecord> implements ChangeRecordService {
@Resource
@ -161,24 +173,14 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaOrganizationalNodeUserGateway nodeUserGateway;
// @Resource
// private ReportServiceSDK reportServiceSDK;
@Resource
private ReportServiceSDK reportServiceSDK;
@Resource
private WorkflowGateway workflowGateway;
@Resource
private MsgCenterGateway msgCenterGateway;
/**
* 相关单位确认人人数限制
*/
@Value("${visa.verifyPersonLimit: 8}")
private Integer verifyPersonLimit;
/**
* 关联变更单个数限制
*/
@Value("${visa.verifyVisaLimit: 5}")
private Integer verifyVisaLimit;
/**
* 最大变化金额
*/
@ -204,6 +206,14 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway;
@Resource
private RefreshableConfiguration refreshableConfiguration;
@Resource
private VisaCooperateShipGateway visaCooperateShipGateway;
@Autowired
private ChangeRecordService changeRecordService;
/**
* 状态变更
*/
@ -463,6 +473,19 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Override
@Transactional(rollbackFor = Exception.class)
public Long tempCreateVisaChangeRecord(VisaChangeTempCreateReq req) {
AssertUtil.isTrue(NumberUtil.isPositiveNumber(req.getRelationWorkspaceId()), "关联项目不能为空");
AssertUtil.isTrue(NumberUtil.isPositiveNumber(req.getOperatorOuId()) && NumberUtil.isPositiveNumber(req.getOperatorPersonId()),
"操作人信息不能为空");
if (NumberUtil.isNotPositiveNumber(req.getOperatorOuType())) {
CooperateShipQueryReq shipQueryReq = CooperateShipQueryReq.builder()
.personId(req.getOperatorPersonId())
.workspaceId(req.getRelationWorkspaceId())
.ouId(req.getOperatorOuId())
.build();
List<CooperateShipResp> shipRespList = visaCooperateShipGateway.genericQuery(shipQueryReq);
AssertUtil.notEmpty(shipRespList, "操作人所在单位信息不能为空");
req.setOperatorOuType(shipRespList.get(0).getCooperateType());
}
ChangeRecord changeRecord;
List<VisaConfirmDto> confirmPerson = Lists.newArrayList();
VisaAddLogContext oldContext = null;
@ -507,9 +530,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/*保存附加关联信息*/
// 相关单位与人员
if (CollectionUtils.isNotEmpty(req.getRelationUnitAndPersonList())) {
confirmPerson = req.getRelationUnitAndPersonList().stream()
confirmPerson.addAll(req.getRelationUnitAndPersonList().stream()
.map(p -> buildConfirmVisaConfirmDto(p, changeRecord, req.getOperatorPersonId()))
.collect(Collectors.toList());
.collect(Collectors.toList()));
}
changeRecordConfirmService.addConfirm(confirmPerson);
// 保存发生内容及说明
@ -660,7 +683,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
processDto.setTenantId(String.valueOf(req.getRelationWorkspaceId()));
Map<String, Object> formVariables = new HashMap<>();
// 传递表单数据
// 传递表单数据 TODO 传递给流程的表单项数据还需要调整内容
formVariables.put(FORM_FIELD_NO, req.getNo());
formVariables.put(FORM_FIELD_HAPPEN_TIME, req.getHappenTime());
formVariables.put(FORM_FIELD_TOPIC, req.getTopic());
@ -799,6 +822,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
public void export(VisaChangeExportReq req) {
VisaChangePageSearchReq filter = req.getFilter();
List<VisaChangeFieldEnum> fields = req.getFields();
// 默认导出全部字段
if (CollectionUtils.isEmpty(fields)) {
fields = Arrays.asList(VisaChangeFieldEnum.values());
}
// Set<Long> permissionVisaIdSet = this.fetchPermissionVisaIdSet(filter);
List<ChangeRecord> changeRecordList = Lists.newArrayList();
@ -808,20 +835,59 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
// }
/*获取数据*/
changeRecordList = getFilter(filter,Sets.newHashSet()).list();
changeRecordList = getFilter(filter, Sets.newHashSet()).list();
AssertUtil.notEmpty(changeRecordList, "没有数据需要导出");
AssertUtil.isTrue(CollUtil.isNotEmpty(changeRecordList), "");
/*数据转换*/
// 所属工程
Map<Long, String> projectInfoMapById;
Map<Long, OrgNodeUserBriefInfoResp> initiatorMap;
if (fields.contains(VisaChangeFieldEnum.RELATION_PROJECT)) {
List<Long> projectIdList = changeRecordList.stream().map(ChangeRecord::getRelationProject).collect(Collectors.toList());
projectInfoMapById = getProjectInfoMapById(projectIdList);
} else {
projectInfoMapById = Collections.emptyMap();
}
// 发起人
if (fields.contains(VisaChangeFieldEnum.CREATE_BY)) {
List<Long> initiatorPersonIdList = changeRecordList.stream().map(ChangeRecord::getCreateBy).distinct().collect(Collectors.toList());
// Map<personId,OrgNodeUserBriefInfoResp>
initiatorMap = getPersonBriefInfoMap(changeRecordList.get(0).getRelationWorkspaceId(), initiatorPersonIdList);
} else {
initiatorMap = Collections.emptyMap();
}
List<Object> data = changeRecordList.stream()
.map(item -> VisaExportDto.builder()
.no(item.getNo())
.type(item.getType().getDesc())
.status(item.getStatus().getDesc())
.topic(item.getTopic())
.relationProject(CollUtil.isNotEmpty(projectInfoMapById) ? projectInfoMapById.getOrDefault(item.getRelationProject(), "") : "")
.happenTime(item.getHappenTime())
.amountChange(item.getAmountChange())
.approvalCompleteTime(Objects.equals(VisaStatusEnum.COMPLETED, item.getStatus()) ? item.getApprovalCompleteTime() : null)
.initiator(CollUtil.isNotEmpty(initiatorMap) ? initiatorMap.getOrDefault(item.getCreateBy(), OrgNodeUserBriefInfoResp.builder().build()).getRealName() : "")
.build())
.collect(Collectors.toList());
/*导出文excel并上传至云*/
String scene = "visa";
String fileName = String.format("变更签证单%s", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
SheetWrapper sheetWrapper = new SheetWrapper();
sheetWrapper.setTitle("变更签证单");
// sheetWrapper
// reportServiceSDK.asyncUploadReportPsw(scene, fileName, null, false, );
String sheetName = "变更签证表";
String headerName = "变更签证单";
SheetWrapper sheetWrapper = SheetWrapper.builder()
.title(headerName)
.sheetName(sheetName)
.includeColumnFieldNames(fields.stream()
.map(VisaChangeFieldEnum::getDesc)
.collect(Collectors.toList()))
.sourceData(data)
.build();
reportServiceSDK.asyncUploadReportPsw(scene, fileName, null, false, sheetWrapper);
}
private LambdaQueryChainWrapper<ChangeRecord> getFilter(VisaChangePageSearchReq filter,Set<Long> permissionVisaIdSet) {
private LambdaQueryChainWrapper<ChangeRecord> getFilter(VisaChangePageSearchReq filter, Set<Long> permissionVisaIdSet) {
LambdaQueryChainWrapper<ChangeRecord> queryChainWrapper = lambdaQuery()
// .in(ChangeRecord::getId, permissionVisaIdSet)
@ -908,10 +974,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}
/*获取工程信息*/
List<Long> projectIdList = records.stream().map(ChangeRecord::getRelationProject).distinct().collect(Collectors.toList());
List<ProjectBriefResp> projectBriefByIds = visaProjectApiGateway.getProjectBriefByIds(projectIdList);
AssertUtil.notEmpty(projectBriefByIds, "工程信息获取失败");
// Map<projectId,name>
Map<Long, String> projectIdNameMap = projectBriefByIds.stream().collect(Collectors.toMap(ProjectBriefResp::getId, ProjectBriefResp::getName));
Map<Long, String> projectIdNameMap = getProjectInfoMapById(projectIdList);
/*获取变更单发起人*/
List<Long> visaIdList = records.stream().map(ChangeRecord::getId).distinct().collect(Collectors.toList());
@ -921,7 +984,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/*获取发起人岗位*/
List<Long> initiatorPersonIdList = visaIdInitiatorMap.values().stream().map(ChangeRecordConfirm::getPersonId).distinct().collect(Collectors.toList());
// Map<id,OrgNodeUserBriefInfoResp>
// Map<personId,OrgNodeUserBriefInfoResp>
Map<Long, OrgNodeUserBriefInfoResp> initiatorMap = getPersonBriefInfoMap(records.get(0).getRelationWorkspaceId(), initiatorPersonIdList);
AssertUtil.isTrue(CollUtil.isNotEmpty(initiatorMap), "发起人信息获取失败");
@ -956,6 +1019,15 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.collect(Collectors.toList());
}
private Map<Long, String> getProjectInfoMapById(List<Long> projectIdList) {
List<ProjectBriefResp> projectBriefByIds = visaProjectApiGateway.getProjectBriefByIds(projectIdList);
if (CollectionUtils.isEmpty(projectBriefByIds)) {
return Collections.emptyMap();
}
// Map<projectId,name>
return projectBriefByIds.stream().collect(Collectors.toMap(ProjectBriefResp::getId, ProjectBriefResp::getName));
}
private Map<Long, ChangeRecordConfirm> getInitiatorMapByVisaId(List<Long> visaIdList) {
VisaConfirmDto visaConfirmDto = VisaConfirmDto.builder()
.bizType(VisaConfirmBizTypeEnum.CREATE)
@ -970,17 +1042,17 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
private static void validSearchCondition(VisaChangePageSearchReq req) {
if (CollectionUtils.isNotEmpty(req.getAmountChange())) {
AssertUtil.notNull(req.getAmountChange().size() < 2, "请填写金额范围");
AssertUtil.isFalse(req.getAmountChange().size() < 2, "请填写金额范围");
// 最大最小值的符号必须相同
AssertUtil.isTrue(Objects.equals(req.getAmountChange().get(0).signum(), req.getAmountChange().get(1).signum()), "请输入合法的变更金额范围");
AssertUtil.isTrue(req.getAmountChange().get(0).compareTo(req.getAmountChange().get(1)) < 0, "最大金额不能小于最小金额");
}
if (CollectionUtils.isNotEmpty(req.getHappenTime())) {
AssertUtil.notNull(req.getHappenTime().size() < 2, "请填写提出时间范围");
AssertUtil.isFalse(req.getHappenTime().size() < 2, "请填写提出时间范围");
AssertUtil.isTrue(req.getHappenTime().get(0).compareTo(req.getHappenTime().get(1)) < 0, "提出结束时间不能小于开始时间");
}
if (CollectionUtils.isNotEmpty(req.getApproveCompletedDate())) {
AssertUtil.notNull(req.getApproveCompletedDate().size() < 2, "请填写审批完成范围");
AssertUtil.isFalse(req.getApproveCompletedDate().size() < 2, "请填写审批完成范围");
AssertUtil.isTrue(req.getApproveCompletedDate().get(0).compareTo(req.getApproveCompletedDate().get(1)) < 0, "审批完成结束时间不能小于开始时间");
}
}
@ -1051,7 +1123,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
List<OrgNodeUserBriefInfoResp> nodeUserBriefInfoResps = nodeUserGateway.listOrgNodeUsers(infoListReq);
AssertUtil.notEmpty(nodeUserBriefInfoResps, "所有单位确认人均已退场");
cooperateTypeMap.forEach((k, v) -> {
AssertUtil.isTrue(v.size() <= verifyPersonLimit, String.format(k.getDesc() + "确认人,最多支持%d个", verifyPersonLimit));
AssertUtil.isTrue(v.size() <= refreshableConfiguration.getVerifyPersonLimit(), String.format(k.getDesc() + "确认人,最多支持%d个", refreshableConfiguration.getVerifyPersonLimit()));
boolean noExit = v.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getPersonId)
.anyMatch(p -> nodeUserBriefInfoResps.stream().anyMatch(u -> Objects.equals(u.getPersonId(), p)));
AssertUtil.isTrue(noExit, String.format(k.getDesc() + "确认人,存在已退场人员,请重新选择"));
@ -1065,18 +1137,21 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
if (Objects.equals(VisaRelationFieldEnum.TASK_ORDER.name(), key)) {
/*任务单*/
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
validBillIfRelated(VisaBillTypeEnum.TASK, value, req.getType());
} else if (Objects.equals(VisaRelationFieldEnum.RECTIFICATION_ORDER.name(), key)) {
/*整改单*/
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
validBillIfRelated(VisaBillTypeEnum.RECTIFY, value, req.getType());
} else if (Objects.equals(VisaRelationFieldEnum.VISA_ORDER.name(), key)) {
/*变更单*/
AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(req.getType()) || VisaTypeEnum.PROJECT_VISA.equals(req.getType()), "变更单关联单据仅支持技术核定/工程签证");
// 关联单据数量限制
AssertUtil.isTrue(value.size() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
AssertUtil.isTrue(value.size() <= refreshableConfiguration.getVerifyVisaLimit(),
String.format("最多可关联%d个变更单请重新选择", refreshableConfiguration.getVerifyVisaLimit()));
// 关联单据合法性是否存在状态是否合法
List<ChangeRecord> relationVisa = listByIds(value);
AssertUtil.notEmpty(relationVisa, "关联的单据不存在");
@ -1108,9 +1183,58 @@ 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
@ -1157,6 +1281,33 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.build());
workflowGateway.processInstanceAbort(abort);
}
// 取消已关联整改单任务单变更单
changeRecordBillService.deleteByVisaId(record.getId());
// 取消关联的图纸
deleteRelateDrawAnnotation(record.getId());
}
/**
* 取消变更签证单关联的图纸
*
* @param visaId 变更签证Id
*/
private boolean deleteRelateDrawAnnotation(Long visaId) {
List<ChangeRecordRelation> contentDescription = changeRecordRelationService.findByVisaAndVarName(visaId, VisaRelationFieldEnum.CONTENT_DESCRIPTION.name());
if (CollectionUtils.isNotEmpty(contentDescription)) {
List<ChangeRecordRelation> annotation = contentDescription.stream()
.filter(item -> {
try {
VisaChangeTempCreateReq.ChangeContextAndDescription parseDescription = JSONObject.parseObject(item.getContent(), VisaChangeTempCreateReq.ChangeContextAndDescription.class);
return Objects.nonNull(parseDescription) && Objects.equals(parseDescription.getType(), 2);
} catch (Exception e) {
throw new ServiceException("发生内容说明解析失败");
}
})
.collect(Collectors.toList());
return changeRecordRelationService.deleteByIds(annotation.stream().map(ChangeRecordRelation::getId).collect(Collectors.toList()));
}
return true;
}
private void validOperationPermission(Long visaId, Long personId, Long ouId, Long workspaceId) {
@ -1204,6 +1355,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Override
public void reDecision(ChangeRecordButtonOperationReq req) {
ChangeRecord visa = changeRecordService.getById(req.getVisaId());
AssertUtil.notNull(visa, "未找到变洽签单据");
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
ImGroupOperationClearReq build = new ImGroupOperationClearReq();
@ -1211,6 +1364,38 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
build.setImGroupId(req.getImGroupId());
build.setClearAll(true);
changeRecordRelationService.clearImOperationParticipate(build);
// 重新发送卡片
sendCardToImGroup(req, visa);
}
private void sendCardToImGroup(ChangeRecordButtonOperationReq req, ChangeRecord visa) {
CardSendRequest cardRequest = new CardSendRequest();
cardRequest.setAppCode(MSG_CENTER_APP_CODE);
cardRequest.setTemplateCode(refreshableConfiguration.getImGroupCardTemplateCode());
cardRequest.setBizCode(IM_GROUP_BIZ_INFO_VISA_ID + ":" + visa.getId());
cardRequest.setSender(PeerPerson.create(req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId()));
cardRequest.setImSenderAccountAppType(AppTypeEnum.CMP);
cardRequest.setImReceiveAccounts(Sets.newHashSet(String.valueOf(visa.getImGroupId())));
OrganizationalUnitVO unitInfo = organizationalUnitGateway.getUnitInfo(req.getOperatorOuId());
PersonProfileDto profile = visaProfileGateway.getProfile(req.getOperatorPersonId());
String amountDesc = "不变";
if (visa.getAmountChange().compareTo(BigDecimal.ZERO) > 0) {
amountDesc = "增加" + visa.getAmountChange().toPlainString() + "";
} else if (visa.getAmountChange().compareTo(BigDecimal.ZERO) < 0) {
amountDesc = "减少" + visa.getAmountChange().toPlainString() + "";
}
cardRequest.setBizParam(new JSONObject(Maps.of(
"topic", visa.getTopic(),
"reason", visa.getReason(),
"initiatorName", profile.getRealName(),
"initiatorUnitName", unitInfo.getName(),
"visaType", visa.getType().getDesc(),
"amountChange", amountDesc
)));
msgCenterGateway.sendCardToCroup(cardRequest);
}
@Override