package jnpf.flowable.mapper; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.common.collect.ImmutableList; import jnpf.base.mapper.SuperMapper; import jnpf.flowable.entity.DelegateEntity; import jnpf.flowable.entity.OperatorEntity; import jnpf.flowable.entity.RecordEntity; import jnpf.flowable.entity.TaskEntity; import jnpf.flowable.enums.RecordEnum; import jnpf.flowable.model.task.FlowMethod; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.task.TaskPagination; import jnpf.flowable.model.util.FlowNature; import jnpf.util.JsonUtil; import jnpf.util.RandomUtil; import jnpf.util.StringUtil; import jnpf.util.UserProvider; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 类的描述 * * @author JNPF@YinMai Info. Co., Ltd * @version 5.0.x * @since 2024/4/23 9:20 */ public interface RecordMapper extends SuperMapper { // 根据经办主键获取转审/转办记录 default RecordEntity getTransferRecord(String operatorId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(RecordEntity::getOperatorId, operatorId) .in(RecordEntity::getHandleType, RecordEnum.transfer.getCode(), RecordEnum.transferProcessing.getCode()) .orderByDesc(RecordEntity::getHandleTime); queryWrapper.lambda().select(RecordEntity::getId, RecordEntity::getHandleId); List list = this.selectPage(new Page<>(1, 1, false), queryWrapper).getRecords(); if (CollectionUtil.isNotEmpty(list)) { return list.get(0); } return new RecordEntity(); } default List getList(String taskId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(RecordEntity::getTaskId, taskId).orderByAsc(RecordEntity::getHandleTime); return this.selectList(wrapper); } default void updateRecords(List recordList) { if (CollectionUtil.isNotEmpty(recordList)) { this.updateById(recordList); } } // 将经办相关的记录作废 default void invalid(List operatorList) { List opIds = operatorList.stream().map(OperatorEntity::getId).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(opIds)) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(RecordEntity::getOperatorId, opIds); List list = this.selectList(queryWrapper); for (RecordEntity record : list) { record.setStatus(FlowNature.Invalid); } this.updateById(list); } } // 作废加签记录 default void invalidAddSignRecord(OperatorEntity operator) { if (null != operator && null != operator.getId()) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(RecordEntity::getOperatorId, operator.getId()).eq(RecordEntity::getHandleType, RecordEnum.addSign.getCode()); List list = this.selectList(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { for (RecordEntity record : list) { record.setStatus(FlowNature.Invalid); } this.updateById(list); } } } /** * 创建记录 */ default void createRecord(FlowMethod flowMethod) { FlowModel flowModel = flowMethod.getFlowModel(); String userId = flowMethod.getUserId(); OperatorEntity operator = flowMethod.getOperatorEntity(); Integer type = flowMethod.getType(); String handId = flowMethod.getHandId(); // 已存在同意操作的记录(说明是后加签默认同意,无需再次保存) if (ObjectUtil.equals(RecordEnum.audit.getCode(), type)) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(RecordEntity::getOperatorId, operator.getId()).eq(RecordEntity::getHandleType, type) .ne(RecordEntity::getStatus, FlowNature.Invalid); if (this.selectCount(queryWrapper) > 0) return; } RecordEntity entity = new RecordEntity(); entity.setId(RandomUtil.uuId()); entity.setHandleId(handId); if (null != operator) { if (StringUtil.isBlank(handId)) { if (ObjectUtil.equals(operator.getHandleId(), FlowNature.SYSTEM_CODE)) { entity.setHandleId(FlowNature.SYSTEM_CODE); } else { entity.setHandleId(operator.getHandleId()); } } if (StringUtil.isBlank(entity.getHandleId())) { String loginUserId = UserProvider.getLoginUserId(); entity.setHandleId(loginUserId); } entity.setNodeId(operator.getNodeId()); entity.setNodeCode(operator.getNodeCode()); entity.setNodeName(operator.getNodeName()); entity.setTaskId(operator.getTaskId()); entity.setOperatorId(operator.getId()); entity.setHandleType(operator.getHandleStatus()); entity.setHandleTime(operator.getHandleTime() == null ? new Date() : operator.getHandleTime()); entity.setCreatorTime(operator.getCreatorTime() == null ? new Date() : operator.getCreatorTime()); } entity.setHandleOpinion(flowModel.getHandleOpinion()); entity.setHandleUserId(userId); entity.setSignImg(flowModel.getSignImg()); if (CollectionUtil.isNotEmpty(flowModel.getFileList())) { entity.setFileList(JsonUtil.getObjectToString(flowModel.getFileList())); } // 拓展字段 List> expandField = flowModel.getApprovalField(); if (CollectionUtil.isNotEmpty(expandField)) { String str = JsonUtil.getObjectToString(expandField); entity.setExpandField(str); } entity.setHandleType(type); entity.setStatus(FlowNature.Normal); this.insert(entity); } default List getList(TaskPagination pagination, List delegateList) { String loginUserId = UserProvider.getLoginUserId(); if (StringUtil.isNotEmpty(pagination.getUserId())) { loginUserId = pagination.getUserId(); } List handleStatus = ImmutableList.of( RecordEnum.reject.getCode(), RecordEnum.audit.getCode(), RecordEnum.back.getCode(), RecordEnum.addSign.getCode(), RecordEnum.transfer.getCode(), RecordEnum.transferProcessing.getCode() ); MPJLambdaWrapper recordWrapper = JoinWrappers.lambda(RecordEntity.class) .leftJoin(TaskEntity.class, TaskEntity::getId, RecordEntity::getTaskId) .select(RecordEntity::getHandleId) .select(RecordEntity::getNodeCode) .select(RecordEntity::getTaskId) .selectMax(RecordEntity::getHandleTime) .in(RecordEntity::getHandleType, handleStatus) .isNotNull(RecordEntity::getOperatorId) .groupBy(RecordEntity::getTaskId, RecordEntity::getNodeCode, RecordEntity::getHandleId); String finalLoginUserId = loginUserId; recordWrapper.and(t -> { t.eq(RecordEntity::getHandleId, finalLoginUserId); for (DelegateEntity delegate : delegateList) { if (StringUtil.isNotEmpty(delegate.getFlowId())) { String[] flowIds = delegate.getFlowId().split(","); t.or(tw -> tw.in(TaskEntity::getTemplateId, flowIds) .eq(RecordEntity::getHandleId, delegate.getUserId()).eq(RecordEntity::getCreatorUserId, finalLoginUserId) .between(RecordEntity::getHandleTime, delegate.getStartTime(), delegate.getEndTime())); } else { t.or(t1 -> t1.eq(RecordEntity::getHandleId, delegate.getUserId()).eq(RecordEntity::getCreatorUserId, finalLoginUserId) .between(RecordEntity::getHandleTime, delegate.getStartTime(), delegate.getEndTime())); } } }); return this.selectJoinList(RecordEntity.class, recordWrapper); } default List getRecordList(String taskId, List statusList) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(RecordEntity::getTaskId, taskId); if (CollectionUtil.isNotEmpty(statusList)) { queryWrapper.lambda().in(RecordEntity::getHandleType, statusList); } queryWrapper.lambda().orderByAsc(RecordEntity::getHandleTime); return this.selectList(queryWrapper); } default RecordEntity getInfo(String id) { if (StringUtil.isBlank(id)) { return null; } return this.selectById(id); } default void create(RecordEntity entity) { entity.setId(RandomUtil.uuId()); this.insert(entity); } default void update(String id, RecordEntity entity) { entity.setId(id); this.updateById(entity); } default void updateStatusToInvalid(String taskId, List nodeCodeList) { UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(RecordEntity::getTaskId, taskId); if (CollectionUtil.isNotEmpty(nodeCodeList)) { wrapper.lambda().in(RecordEntity::getNodeCode, nodeCodeList); } wrapper.lambda().set(RecordEntity::getStatus, FlowNature.Invalid); this.update(wrapper); } }