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

This commit is contained in:
xudawei 2025-02-06 10:41:04 +08:00
commit 3aa67ead16
9 changed files with 169 additions and 26 deletions

View File

@ -2,6 +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.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
@ -10,10 +11,10 @@ import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaDetailByIdRequest;
import cn.axzo.nanopart.visa.api.request.VisaInitiatorListReq;
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
import cn.axzo.nanopart.visa.api.request.VisaRecordSelectReq;
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 org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
@ -104,4 +105,12 @@ public interface ChangeRecordApi {
*/
@PostMapping("/api/visa/change/initiator/list")
ApiResult<List<VisaChangeInitiatorResp>> listInitiator(@RequestBody @Validated VisaInitiatorListReq req);
/**
* 变洽签废止
*
* @return
*/
@PostMapping("/api/visa/change/record/forbid")
ApiResult<Void> forbidChangeRecord(@Validated @RequestBody ChangeRecordForbidReq req);
}

View File

@ -17,6 +17,10 @@ public interface VisaConstant {
* 用于发送待办的变量名
*/
String WORKFLOW_PENDING_TOPIC = "theme";
/**
* IM 群的扩展信息
*/
String IM_GROUP_BIZ_INFO_RECORD_ID = "visaId";
// **************** 业务传入审批的表单项组件的唯一的 KEY *****************
// 单号
String FORM_FIELD_NO = "no";

View File

@ -0,0 +1,45 @@
package cn.axzo.nanopart.visa.api.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* 变洽签废止
*
* @author wangli
* @since 2025-02-05 20:26
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ChangeRecordForbidReq {
/**
* 变洽签主键 ID
*/
@NotNull(message = "变洽签 ID 不能为空")
private Long visaId;
/**
* 操作人 personId
*/
@NotNull(message = "操作人 personId 不能为空")
private Long operatorPersonId;
/**
* 操作人 ouId
*/
@NotNull(message = "操作人 ouId 不能为空")
private Long operatorOuId;
/**
* 操作人 workspaceId
*/
@NotNull(message = "操作人 workspaceId 不能为空")
private Long operatorWorkspaceId;
}

View File

@ -34,7 +34,7 @@ public class ImGroupTipsQueryReq {
* 当前登录人是否是群主
*/
@NotNull(message = "群主标识不能为空")
private Boolean groupOwner;
private Boolean isGroupOwner;
/**
* 当前群成员总数, 包含群主

View File

@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiPageResult;
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.request.ChangeRecordForbidReq;
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
@ -97,4 +98,10 @@ public class ChangeRecordController implements ChangeRecordApi {
public ApiResult<List<VisaChangeInitiatorResp>> listInitiator(VisaInitiatorListReq req) {
return ApiResult.ok(changeRecordService.listInitiator(req));
}
@Override
public ApiResult<Void> forbidChangeRecord(ChangeRecordForbidReq req) {
changeRecordService.forbid(req);
return ApiResult.ok();
}
}

View File

@ -1,6 +1,7 @@
package cn.axzo.nanopart.visa.server.rpc;
import cn.axzo.pokonyan.util.RpcUtil;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
import cn.axzo.workflow.starter.api.WorkflowCoreService;
@ -28,6 +29,11 @@ public class WorkflowGateway {
return workflowCoreService.createProcessInstance(dto);
}
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "中止流程实例")
public void processInstanceAbort(BpmnProcessInstanceAbortDTO dto) {
workflowCoreService.abortProcessInstance(dto);
}
@MethodAroundLog(target = "workflow-engine", source = "nanopart", value = "查询某个人是否是指定流程的审批人")
public Boolean checkInstanceApprover(BpmnProcessInstanceCheckApproverDTO dto) {
try {

View File

@ -2,6 +2,7 @@ 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.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
@ -95,4 +96,11 @@ public interface ChangeRecordService {
* @param req 筛查条件和导出字段
*/
void export(VisaChangeExportReq req);
/**
* 变洽签单据废止并解散 IM 群聊中止审批
*
* @param req
*/
void forbid(ChangeRecordForbidReq req);
}

View File

@ -164,7 +164,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
.varName(VisaRelationFieldEnum.IM_GROUP_PARTICIPATE.getCode())
.build());
List<ImGroupButton> buttons = new ArrayList<>();
if (Boolean.TRUE.equals(req.getGroupOwner())) {
if (Boolean.TRUE.equals(req.getIsGroupOwner())) {
Map<String, Long> countMap = imGroupParticipate.stream()
.collect(Collectors.groupingBy(ChangeRecordRelation::getVarExt, Collectors.counting()));
Long agreeCount = countMap.getOrDefault(VisaButtonTypeEnum.AGREE.getCode(), 0L);

View File

@ -12,11 +12,33 @@ import cn.axzo.basics.report.api.ReportServiceSDK;
import cn.axzo.basics.report.api.sheet.SheetWrapper;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.framework.domain.web.result.PageData;
import cn.axzo.im.center.api.vo.PersonAccountAttribute;
import cn.axzo.im.center.api.vo.req.GroupCreateRequest;
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.OrgNodeUserBriefInfoListReq;
import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp;
import cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaChangeFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
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.request.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
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.domain.ChangeRecord;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordBill;
import cn.axzo.nanopart.visa.server.domain.ChangeRecordConfirm;
@ -36,31 +58,15 @@ import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway;
import cn.axzo.nanopart.visa.server.rpc.ProjectApiGateway;
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
import cn.axzo.nanopart.visa.server.rpc.WorkspaceGateway;
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
import cn.axzo.thor.client.model.DrawingMajorResp;
import cn.axzo.nanopart.visa.api.enums.VisaBillTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaChangeFieldEnum;
import cn.axzo.nanopart.visa.api.enums.VisaConfirmBizTypeEnum;
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.ChangeStatusRequest;
import cn.axzo.nanopart.visa.api.request.VisaChangeApproveCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeDiscussCreateReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeExportReq;
import cn.axzo.nanopart.visa.api.request.VisaChangePageSearchReq;
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
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.service.ChangeRecordBillService;
import cn.axzo.nanopart.visa.server.service.ChangeRecordConfirmService;
import cn.axzo.nanopart.visa.server.service.ChangeRecordLogService;
import cn.axzo.nanopart.visa.server.service.ChangeRecordRelationService;
import cn.axzo.nanopart.visa.server.service.ChangeRecordService;
import cn.axzo.nanopart.visa.server.service.VisaHelper;
import cn.axzo.thor.client.model.DrawingMajorResp;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.hutool.core.bean.BeanUtil;
@ -76,6 +82,7 @@ import com.google.common.collect.Sets;
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.stereotype.Service;
@ -107,6 +114,7 @@ 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.IM_GROUP_BIZ_INFO_RECORD_ID;
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;
@ -149,6 +157,8 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
private ReportServiceSDK reportServiceSDK;
@Resource
private WorkflowGateway workflowGateway;
@Resource
private MsgCenterGateway msgCenterGateway;
/**
* 相关单位确认人人数限制
@ -170,8 +180,6 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
@Resource
private WorkspaceGateway workspaceGateway;
@Resource
private MsgCenterGateway msgCenterGateway;
@Resource
private VisaHelper visaHelper;
@ -476,6 +484,32 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
Long visaId = tempCreateVisaChangeRecord(req);
/*创建群聊*/
GroupCreateRequest request = new GroupCreateRequest();
request.setGroupType(GroupType.VISA);
request.setBizCode(String.valueOf(visaId));
request.setName(req.getTopic());
// 群主
request.setOwner(PersonAccountAttribute.builder()
.personId(String.valueOf(req.getOperatorPersonId()))
.ouId(req.getOperatorOuId())
.workspaceId(req.getRelationWorkspaceId())
.appType(AppTypeEnum.CMP)
.build());
// 群成员
if (CollectionUtils.isNotEmpty(req.getDiscussPersonInfoList())) {
request.setMembers(req.getDiscussPersonInfoList().stream()
.filter(i -> !i.getIsAdmin())
.map(i -> PersonAccountAttribute.builder()
.personId(String.valueOf(i.getPersonId()))
.ouId(i.getUnitId())
.workspaceId(i.getWorkspaceId())
.appType(AppTypeEnum.CMP)
.build())
.collect(Collectors.toSet()));
}
// 群头像
request.setAvatar("");
request.setMemberLimit(100L);
request.setBizGroupInfo(Maps.of(IM_GROUP_BIZ_INFO_RECORD_ID, visaId));
GroupCreateResponse imGroup = msgCenterGateway.createImGroup(request);
updateImInfo(visaId, imGroup);
@ -494,6 +528,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
ChangeRecord changeRecord = new ChangeRecord();
changeRecord.setId(visaId);
changeRecord.setImGroupId(imGroup.getTid());
updateById(changeRecord);
}
/**
@ -568,7 +603,7 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
updateApprovalInfo(visaId, processInstanceId);
// 更新主表状态
changeStatus(ChangeStatusRequest.builder()
changeStatus(ChangeStatusRequest.builder()
.visaId(visaId)
.updateStatus(VisaStatusEnum.APPROVING)
.personId(req.getOperatorPersonId())
@ -936,5 +971,34 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
.eq(ChangeRecord::getId, visaId).one();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void forbid(ChangeRecordForbidReq req) {
ChangeRecord record = getById(req.getVisaId());
ChangeStatusRequest changeStatusRequest = new ChangeStatusRequest();
changeStatusRequest.setVisaId(req.getVisaId());
changeStatusRequest.setUpdateStatus(VisaStatusEnum.FORBIDED);
changeStatusRequest.setPersonId(req.getOperatorPersonId());
changeStatusRequest.setOuId(req.getOperatorOuId());
changeStatusRequest.setWorkspaceId(req.getOperatorWorkspaceId());
changeStatus(changeStatusRequest);
if (Objects.nonNull(record.getImGroupId())) {
GroupDismissRequest request = new GroupDismissRequest();
req.setVisaId(req.getVisaId());
// 解散 IM 群聊
msgCenterGateway.dismissImGroup(request);
}
if (StringUtils.hasText(record.getApprovalId())) {
BpmnProcessInstanceAbortDTO abort = new BpmnProcessInstanceAbortDTO();
abort.setProcessInstanceId(record.getApprovalId());
// TODO 中止审批的原因
abort.setReason("变更签证单据被废止,中止审批流");
abort.setAssigner(BpmnTaskDelegateAssigner.builder()
.personId(String.valueOf(req.getOperatorPersonId()))
.ouId(String.valueOf(req.getOperatorOuId()))
.tenantId(String.valueOf(req.getOperatorWorkspaceId()))
.build());
workflowGateway.processInstanceAbort(abort);
}
}
}