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-07 10:22:12 +08:00
commit a918d028bb
15 changed files with 272 additions and 73 deletions

View File

@ -2,7 +2,7 @@ package cn.axzo.nanopart.visa.api.changerecord;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.visa.api.request.ChangeRecordForbidReq;
import cn.axzo.nanopart.visa.api.request.ChangeRecordButtonOperationReq;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.FetchVisaAllConfirmReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
@ -112,7 +112,7 @@ public interface ChangeRecordApi {
* @return
*/
@PostMapping("/api/visa/change/approve/only/create")
ApiResult<Long> approveExistsVisaChangeRecord(@Validated @RequestBody VisaChangeApproveOnlyReq req);
ApiResult<Long> approveCreateOnlyVisaChangeRecord(@Validated @RequestBody VisaChangeApproveOnlyReq req);
/**
* IM 变洽签群废止按钮
@ -120,5 +120,20 @@ public interface ChangeRecordApi {
* @return
*/
@PostMapping("/api/visa/change/record/forbid")
ApiResult<Void> forbidChangeRecord(@Validated @RequestBody ChangeRecordForbidReq req);
ApiResult<Void> forbidChangeRecord(@Validated @RequestBody ChangeRecordButtonOperationReq req);
/**
* IM 变洽签群重新发起按钮
* @return
*/
@PostMapping("/api/visa/change/reDecision")
ApiResult<Void> reDecisionChangeRecord(@Validated @RequestBody ChangeRecordButtonOperationReq req);
/**
* IM 变洽签全发起执行按钮
* @param req
* @return
*/
@PostMapping("/api/visa/change/execute")
ApiResult<Void> executeChangeRecord(@Validated @RequestBody ChangeRecordButtonOperationReq req);
}

View File

@ -24,9 +24,10 @@ public interface ChangeRecordRelationApi {
@PostMapping("/api/visa/relation/list")
ApiResult<List<VisaRelationResp>> listByVisaId(@Validated @RequestBody VisaRelationReq req) ;
@PostMapping("/api/visa/relation/add")
ApiResult<Boolean> relationAdd(@Validated @RequestBody ImGroupOperationReq req);
@PostMapping("/api/visa/relation/im/operation")
ApiResult<Boolean> saveImOperationParticipate(@Validated @RequestBody ImGroupOperationReq req);
@PostMapping("/api/visa/relation/im/tips")
ApiResult<ImGroupTipsResp> queryImGroupTips(@Validated @RequestBody ImGroupTipsQueryReq req);
}

View File

@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ChangeRecordForbidReq {
public class ChangeRecordButtonOperationReq {
/**
* 变洽签主键 ID
@ -25,6 +25,12 @@ public class ChangeRecordForbidReq {
@NotNull(message = "变洽签 ID 不能为空")
private Long visaId;
/**
* IM ID
*/
@NotNull(message = "IM 群 ID 不能为空")
private Long imGroupId;
/**
* 操作人 personId
*/

View File

@ -38,4 +38,10 @@ public class VisaChangeApproveOnlyReq {
*/
private List<VisaChangeApproveCreateReq.ApprovePersonInfo> approvePersonInfoList;
private Long operatorPersonId;
private Long operatorOuId;
private Long operatorWorkspaceId;
}

View File

@ -64,6 +64,11 @@ public class VisaChangeTempCreateReq {
@NotNull(message = "请选择工程")
@Min(value = 1, message = "请选择工程")
private Long relationProject;
/**
* 工程名称
*/
@NotBlank(message = "工程名称不能为空")
private String relationProjectName;
/**
* 区域集合
@ -108,6 +113,7 @@ public class VisaChangeTempCreateReq {
/**
* 有符号的变更金额
*/
@NotNull(message = "变更金额不能为空")
private BigDecimal amountChange;
/**

View File

@ -5,7 +5,7 @@ import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.framework.domain.web.result.PageData;
import cn.axzo.nanopart.visa.api.changerecord.ChangeRecordApi;
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
import cn.axzo.nanopart.visa.api.request.ChangeRecordForbidReq;
import cn.axzo.nanopart.visa.api.request.ChangeRecordButtonOperationReq;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.FetchVisaAllConfirmReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
@ -21,6 +21,7 @@ import cn.axzo.nanopart.visa.api.response.VisaChangePageSearchResp;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -103,13 +104,25 @@ public class ChangeRecordController implements ChangeRecordApi {
}
@Override
public ApiResult<Long> approveExistsVisaChangeRecord(VisaChangeApproveOnlyReq req) {
return null;
public ApiResult<Long> approveCreateOnlyVisaChangeRecord(VisaChangeApproveOnlyReq req) {
return ApiResult.ok(changeRecordService.approveCreateOnlyVisaChangeRecord(req));
}
@Override
public ApiResult<Void> forbidChangeRecord(ChangeRecordForbidReq req) {
public ApiResult<Void> forbidChangeRecord(ChangeRecordButtonOperationReq req) {
changeRecordService.forbid(req);
return ApiResult.ok();
}
@Override
public ApiResult<Void> reDecisionChangeRecord(ChangeRecordButtonOperationReq req) {
changeRecordService.reDecision(req);
return ApiResult.ok();
}
@Override
public ApiResult<Void> executeChangeRecord(ChangeRecordButtonOperationReq req) {
changeRecordService.doExecute(req);
return ApiResult.ok();
}
}

View File

@ -37,7 +37,7 @@ public class ChangeRecordRelationController implements ChangeRecordRelationApi {
}
@Override
public ApiResult<Boolean> relationAdd(ImGroupOperationReq req) {
public ApiResult<Boolean> saveImOperationParticipate(ImGroupOperationReq req) {
return ApiResult.ok(changeRecordRelationService.saveImOperationParticipate(req));
}

View File

@ -58,8 +58,29 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
/**
* 区域集合
* <pre>
* [
* {
* "areaId": 249556,
* "childrenAreaList": [
* {
* "areaId": 249739,
* "childrenAreaList": []
* }
* ]
* },
* {
* "areaId": 249556,
* "childrenAreaList": [
* {
* "areaId": 249739,
* "childrenAreaList": []
* }
* ]
* }
* ]
* </pre>
*/
@TableField(value = "relation_area", typeHandler = FastjsonTypeHandler.class)
private JSONArray relationArea;

View File

@ -1,6 +1,8 @@
package cn.axzo.nanopart.visa.server.mq.listener.workflow.process;
import cn.axzo.framework.rocketmq.EventProducer;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.server.domain.ChangeRecord;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordLog;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
@ -16,6 +18,7 @@ import cn.axzo.workflow.starter.handler.ProcessInstanceEventHandler;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Objects;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY;
import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVE_COMPLETED;
@ -133,8 +136,9 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
private void updateChangeRecordApprovalStatus(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum) {
// 更新主表审批信息
Long visaId = Long.valueOf(dto.getBusinessKey());
changeRecordService.lambdaQuery()
.eq(ChangeRecord::getId, Long.valueOf(dto.getBusinessKey()))
.eq(ChangeRecord::getId, visaId)
.eq(ChangeRecord::getApprovalId, dto.getProcessInstanceId())
.eq(ChangeRecord::getIsDelete, 0)
.oneOpt()
@ -146,7 +150,7 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
// 更新关联表审批信息
changeRecordRelationService.lambdaQuery()
.eq(ChangeRecordRelation::getVisaId, Long.valueOf(dto.getBusinessKey()))
.eq(ChangeRecordRelation::getVisaId, visaId)
.eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE.getCode())
.eq(ChangeRecordRelation::getContent, dto.getProcessInstanceId())
.oneOpt()
@ -155,5 +159,14 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P
changeRecordRelationService.updateById(changeRecordRelation);
});
if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) {
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)
.build());
}
}

View File

@ -40,6 +40,13 @@ public interface ChangeRecordRelationService extends IService<ChangeRecordRelati
*/
Boolean saveImOperationParticipate(ImGroupOperationReq req);
/**
* IM 群聊中群主操作重新发起清空所有人的操作信息
* @param req
* @return
*/
Boolean clearImOperationParticipate(ImGroupOperationReq req);
/**
* IM 群聊界面查询当前人的 tips 横条
*

View File

@ -2,9 +2,10 @@ package cn.axzo.nanopart.visa.server.service;
import cn.axzo.framework.domain.web.result.PageData;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.request.ChangeRecordForbidReq;
import cn.axzo.nanopart.visa.api.request.ChangeRecordButtonOperationReq;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveOnlyReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
@ -103,5 +104,17 @@ public interface ChangeRecordService extends IService<ChangeRecord> {
*
* @param req
*/
void forbid(ChangeRecordForbidReq req);
void forbid(ChangeRecordButtonOperationReq req);
/**
* IM 群聊中提交审批
*
* @param req
* @return
*/
Long approveCreateOnlyVisaChangeRecord(VisaChangeApproveOnlyReq req);
void reDecision(ChangeRecordButtonOperationReq req);
void doExecute(ChangeRecordButtonOperationReq req);
}

View File

@ -4,6 +4,7 @@ import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext;
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

View File

@ -37,7 +37,6 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -355,8 +354,16 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl<ChangeRecordConf
Map<Long, PersonProfileDto> personMap = buildPersonDtoMap(list.stream()
.map(ChangeRecordConfirm::getPersonId)
.collect(Collectors.toSet()));
list.stream().map(i-> VisaChangeApproveCreateReq.ApprovePersonInfo.builder().build())
return list.stream().map(i -> VisaChangeApproveCreateReq.ApprovePersonInfo.builder()
.workspaceId(i.getWorkspaceId())
.ouId(i.getOuId())
.nodeId(i.getNodeId())
.personId(i.getPersonId())
.realName(personMap.getOrDefault(i.getPersonId(), new PersonProfileDto())
.getRealName())
.avatarUrl(personMap.getOrDefault(i.getPersonId(), new PersonProfileDto())
.getAvatarUrl())
.build())
.collect(Collectors.toList());
return null;
}
}

View File

@ -23,10 +23,10 @@ import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
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 org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@ -134,9 +134,11 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveImOperationParticipate(ImGroupOperationReq req) {
ChangeRecord record = changeRecordService.getById(req.getVisaId());
AssertUtil.notNull(record, "未找到变洽签记录");
AssertUtil.isTrue(Objects.equals(record.getImGroupId(), req.getImGroupId()), "IM群信息不匹配");
ChangeRecordRelation relation = new ChangeRecordRelation();
relation.setVisaId(req.getVisaId());
@ -152,6 +154,17 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean clearImOperationParticipate(ImGroupOperationReq req) {
ChangeRecord record = changeRecordService.getById(req.getVisaId());
AssertUtil.notNull(record, "未找到变洽签记录");
AssertUtil.isTrue(Objects.equals(record.getImGroupId(), req.getImGroupId()), "IM 群信息不匹配");
deleteByVisaId(req.getVisaId(), Lists.newArrayList(VisaRelationFieldEnum.IM_GROUP_PARTICIPATE));
return true;
}
@Override
public ImGroupTipsResp queryImGroupTips(ImGroupTipsQueryReq req) {
ChangeRecord record = changeRecordService.getById(req.getVisaId());

View File

@ -28,9 +28,12 @@ import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaRelationVarTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
import cn.axzo.nanopart.visa.api.request.ChangeRecordForbidReq;
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
import cn.axzo.nanopart.visa.api.request.ChangeRecordButtonOperationReq;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.ImGroupOperationReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveOnlyReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
@ -152,9 +155,6 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private VisaProjectApiGateway visaProjectApiGateway;
@Resource
private VisaCooperateShipGateway visaCooperateShipGateway;
@Resource
private VisaOrganizationalNodeUserGateway nodeUserGateway;
@ -170,6 +170,12 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
*/
@Value("${visa.verifyPersonLimit: 8}")
private Integer verifyPersonLimit;
/**
* 关联变更单个数限制
*/
@Value("${visa.verifyVisaLimit: 5}")
private Integer verifyVisaLimit;
/**
* 最大变化金额
*/
@ -606,7 +612,25 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
/*保存签证信息*/
Long visaId = tempCreateVisaChangeRecord(req);
/*提交审批 TODO 应该可以抽取在IM 中“重新发起”可复用*/
/*提交审批*/
String processInstanceId = createProcessInstance(req, visaId);
AssertUtil.isTrue(StringUtils.hasText(processInstanceId), "创建审批异常");
// 更新主表中的审批字段记录变量表的审批的信息
updateApprovalInfo(visaId, processInstanceId);
// 更新主表状态
changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.updateStatus(VisaStatusEnum.APPROVING)
.personId(req.getOperatorPersonId())
.ouId(req.getOperatorOuId())
.workspaceId(req.getRelationWorkspaceId())
.build());
return visaId;
}
private String createProcessInstance(VisaChangeApproveCreateReq req, Long visaId) {
BpmnProcessInstanceCreateDTO processDto = new BpmnProcessInstanceCreateDTO();
// 发起时指定审批人
processDto.setSpecifyAssignerMap(ImmutableMap.of(req.getActivityId(), buildApprovers(req.getApprovePersonInfoList())));
@ -628,12 +652,17 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
formVariables.put(FORM_FIELD_HAPPEN_TIME, req.getHappenTime());
formVariables.put(FORM_FIELD_TOPIC, req.getTopic());
formVariables.put(FORM_FIELD_RELATION_PROJECT, req.getRelationProject());
formVariables.put(FORM_FIELD_RELATION_PROFESSIONAL, req.getRelationProject());
formVariables.put(FORM_FIELD_RELATION_PROFESSIONAL, req.getRelationProfessional());
formVariables.put(FORM_FIELD_REASON, req.getReason());
formVariables.put(FORM_FIELD_RELATION_AREA, req.getRelationArea());
formVariables.put(FORM_FIELD_CONTEXT_DESCRIPTION, req.getChangeContextAndDescriptionList());
// TODO 变更金额
formVariables.put(FORM_FIELD_AMOUNT_CHANGE, "");
String amountDesc = "不变";
if (req.getAmountChange().compareTo(BigDecimal.ZERO) > 0) {
amountDesc = "增加" + req.getAmountChange().toPlainString() + "";
} else if (req.getAmountChange().compareTo(BigDecimal.ZERO) < 0) {
amountDesc = "减少" + req.getAmountChange().toPlainString() + "";
}
formVariables.put(FORM_FIELD_AMOUNT_CHANGE, amountDesc);
// 三种单据
if (MapUtils.isNotEmpty(req.getRelationOrderMap())) {
@ -658,20 +687,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
Map<String, Object> pendingVariables = new HashMap<>();
pendingVariables.put(WORKFLOW_PENDING_TOPIC, req.getTopic());
processDto.setPendingVariables(pendingVariables);
String processInstanceId = workflowGateway.processInstanceCreate(processDto);
// 更新主表中的审批字段记录变量表的审批的信息
updateApprovalInfo(visaId, processInstanceId);
// 更新主表状态
changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.updateStatus(VisaStatusEnum.APPROVING)
.personId(req.getOperatorPersonId())
.ouId(req.getOperatorOuId())
.workspaceId(req.getRelationWorkspaceId())
.build());
return visaId;
return workflowGateway.processInstanceCreate(processDto);
}
/**
@ -958,34 +974,30 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
});
}
// 相关单位及人员存在性
// if (CollectionUtils.isNotEmpty(req.getRelationUnitAndPersonList())) {
// List<VisaChangeTempCreateReq.RelationUnitAndPerson> team = req.getRelationUnitAndPersonList().stream()
// .filter(r -> {
// AssertUtil.notNull(r.getType(), "相关单位类型错误");
// AssertUtil.isTrue(NumberUtil.isPositiveNumber(r.getOuId()), "请选择" + r.getType().getDesc());
// AssertUtil.isTrue(NumberUtil.isPositiveNumber(r.getNodeId()), "请选择" + r.getType().getDesc());
//// AssertUtil.isTrue(r.getPersonId().size() <= verifyPersonLimit, String.format(r.getType().getDesc() + "确认人,最多支持{}个", verifyPersonLimit));
// return Objects.equals(SaasCooperateShipCooperateTypeEnum.PROJ_TEAM, r.getType());
// })
// .collect(Collectors.toList());
// List<VisaChangeTempCreateReq.RelationUnitAndPerson> unit = req.getRelationUnitAndPersonList();
// if (CollectionUtils.isNotEmpty(team)) {
// // 去除班组
// List<Long> teamNodeId = team.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuIdOrTeamNodeId).distinct().collect(Collectors.toList());
// unit = unit.stream().filter(o -> !teamNodeId.contains(o.getOuIdOrTeamNodeId())).collect(Collectors.toList());
// }
// TODO 相关单位退场状态校验
// CooperateShipQueryReq shipQueryReq = CooperateShipQueryReq.builder()
// .workspaceId(req.getRelationWorkspaceId())
// .workspaceType(WorkspaceTypeEnum.PROJECT.getType())
// .organizationNodeIds(unit.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuIdOrTeamNodeId).collect(Collectors.toList()))
// .nodeIds(team.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuIdOrTeamNodeId).collect(Collectors.toList()))
// .parentNodeIds(unit.stream().map())
// .build();
// cooperateShipGateway.genericQuery()
// 班组存在性及状态
// }
if (CollectionUtils.isNotEmpty(req.getRelationUnitAndPersonList())) {
Map<SaasCooperateShipCooperateTypeEnum, List<VisaChangeTempCreateReq.RelationUnitAndPerson>> cooperateTypeMap = req.getRelationUnitAndPersonList().stream()
.peek(r -> {
AssertUtil.notNull(r.getType(), "相关单位类型错误");
AssertUtil.isTrue(NumberUtil.isPositiveNumber(r.getOuId()), "请选择" + r.getType().getDesc());
AssertUtil.isTrue(NumberUtil.isPositiveNumber(r.getNodeId()), "请选择" + r.getType().getDesc());
AssertUtil.isTrue(NumberUtil.isPositiveNumber(r.getPersonId()), "请选择" + r.getType().getDesc() + "确认人");
})
.collect(Collectors.groupingBy(VisaChangeTempCreateReq.RelationUnitAndPerson::getType));
// 获取项目下所有为退场人员
OrgNodeUserBriefInfoListReq infoListReq = OrgNodeUserBriefInfoListReq.builder()
.workspaceId(req.getRelationWorkspaceId())
.orgNodeIds(req.getRelationUnitAndPersonList().stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getNodeId).collect(Collectors.toList()))
.build();
List<OrgNodeUserBriefInfoResp> nodeUserBriefInfoResps = nodeUserGateway.listOrgNodeUsers(infoListReq);
AssertUtil.notEmpty(nodeUserBriefInfoResps, "所有单位确认人均已退场");
cooperateTypeMap.forEach((k, v) -> {
AssertUtil.isTrue(v.size() <= verifyPersonLimit, String.format(k.getDesc() + "确认人,最多支持%d个", verifyPersonLimit));
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() + "确认人,存在已退场人员,请重新选择"));
});
}
// 金额变化合法性
AssertUtil.isTrue(req.getAmountChange().compareTo(maxAmount) <= 0 && req.getAmountChange().compareTo(minAmount) >= 0, "金额变化超出范围");
// 关联单据合法性
if (CollUtil.isNotEmpty(req.getRelationOrderMap())) {
@ -995,7 +1007,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
} else if (Objects.equals(VisaRelationFieldEnum.RECTIFICATION_ORDER.name(), key)) {
// 整改单 TODO
} else if (Objects.equals(VisaRelationFieldEnum.VISA_ORDER.name(), key)) {
// 变更单 TODO
// 变更单
AssertUtil.isTrue(VisaTypeEnum.TECHNOLOGY_APPROVED.equals(req.getType()) || VisaTypeEnum.PROJECT_VISA.equals(req.getType()), "变更单关联单据仅支持技术核定/工程签证");
AssertUtil.isTrue(value.size() <= verifyVisaLimit, String.format("最多可关联%d个变更单请重新选择", verifyVisaLimit));
List<ChangeRecordBill> mainBill = changeRecordBillService.findMainBill(VisaRelationFieldEnum.VISA_ORDER, value);
} else {
throw new ServiceException("不支持的关联单据类型");
}
@ -1071,9 +1086,12 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
}
@Override
@Transactional(rollbackFor = Exception.class)
public void forbid(ChangeRecordForbidReq req) {
public void forbid(ChangeRecordButtonOperationReq req) {
ChangeRecord record = getById(req.getVisaId());
//校验操作人
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
ChangeStatusRequest changeStatusRequest = new ChangeStatusRequest();
changeStatusRequest.setVisaId(req.getVisaId());
changeStatusRequest.setUpdateStatus(VisaStatusEnum.FORBIDED);
@ -1099,4 +1117,63 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
workflowGateway.processInstanceAbort(abort);
}
}
private void validOperationPermission(Long visaId, Long personId, Long ouId, Long workspaceId) {
List<ChangeRecordConfirm> confirmUsers = changeRecordConfirmService.findByCondition(VisaConfirmDto.builder()
.visaId(visaId)
.bizType(VisaConfirmBizTypeEnum.CREATE)
.build());
AssertUtil.isTrue(CollectionUtils.isNotEmpty(confirmUsers) && confirmUsers.size() == 1, "单据发起人信息数据异常");
ChangeRecordConfirm creator = confirmUsers.get(0);
AssertUtil.isTrue(Objects.equals(creator.getPersonId(), personId)
&& Objects.equals(creator.getOuId(), ouId)
&& Objects.equals(creator.getWorkspaceId(), workspaceId), "不是单据发起人,不能操作");
}
@Override
public Long approveCreateOnlyVisaChangeRecord(VisaChangeApproveOnlyReq req) {
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
VisaChangeApproveCreateReq createReq = buildVisaChangeApproveCreateReqByVisaId(req.getVisaId());
AssertUtil.notNull(createReq, "未找到变洽签单据");
createReq.setApprovePersonInfoList(req.getApprovePersonInfoList());
createReq.setOperatorOuId(req.getOperatorOuId());
createReq.setOperatorPersonId(req.getOperatorPersonId());
createReq.setRelationWorkspaceId(req.getOperatorWorkspaceId());
createProcessInstance(createReq, req.getVisaId());
return req.getVisaId();
}
@Override
public void reDecision(ChangeRecordButtonOperationReq req) {
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
changeRecordRelationService.clearImOperationParticipate(ImGroupOperationReq.builder()
.visaId(req.getVisaId())
.imGroupId(req.getImGroupId())
.build());
}
@Override
public void doExecute(ChangeRecordButtonOperationReq req) {
validOperationPermission(req.getVisaId(), req.getOperatorPersonId(), req.getOperatorOuId(), req.getOperatorWorkspaceId());
changeStatus(ChangeStatusRequest.builder()
.visaId(req.getVisaId())
.updateStatus(VisaStatusEnum.EXECUTING)
.build());
}
/**
* 通过变更单id构建审批提交对象
*
* @param visaId 变更单id
* @return VisaChangeApproveCreateReq
*/
private VisaChangeApproveCreateReq buildVisaChangeApproveCreateReqByVisaId(Long visaId) {
return null;
}
}