package com.xjrsoft.module.oa.service.impl; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.xjrsoft.module.oa.entity.OfficialDocumentReceived; import com.xjrsoft.module.oa.mapper.OfficialDocumentReceivedMapper; import com.xjrsoft.module.oa.service.IOfficialDocumentReceivedService; import com.xjrsoft.module.oa.utils.PostNumberUtil; import com.xjrsoft.module.oa.vo.NextReviewerListVo; import com.xjrsoft.module.organization.dto.WeChatSendMessageDto; import com.xjrsoft.module.organization.entity.Department; import com.xjrsoft.module.organization.entity.Post; import com.xjrsoft.module.organization.entity.User; import com.xjrsoft.module.organization.entity.UserPostRelation; import com.xjrsoft.module.organization.mapper.PostMapper; import com.xjrsoft.module.organization.mapper.UserMapper; import com.xjrsoft.module.organization.service.IWeChatService; import com.xjrsoft.module.teacher.entity.WfTeacherleave; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.mapper.XjrUserMapper; import com.xjrsoft.module.workflow.entity.WorkflowFormRelation; import com.xjrsoft.module.workflow.entity.WorkflowRecord; import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService; import com.xjrsoft.module.workflow.service.IWorkflowRecordService; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * @title: 公文收文 * @Author szs * @Date: 2024-03-13 * @Version 1.0 */ @Service @AllArgsConstructor public class OfficialDocumentReceivedServiceImpl extends MPJBaseServiceImpl implements IOfficialDocumentReceivedService { private final OfficialDocumentReceivedMapper officialDocumentReceivedMapper; private final IWeChatService weChatService; private final UserMapper userMapper; private final IWorkflowFormRelationService workflowFormRelationService; private final IWorkflowRecordService workflowRecordService; private final PostMapper postMapper; private final XjrUserMapper xjrUserMapper; @Override public String getMaxReceivedNumber() { Integer maxReceivedNumber = officialDocumentReceivedMapper.getMaxReceivedNumber(); return PostNumberUtil.initMaxPostNumber(maxReceivedNumber, 3); } @Override public String getMaxMeetingNumber() { Integer maxReceivedNumber = officialDocumentReceivedMapper.getMaxMeetingNumber(); return PostNumberUtil.initMaxPostNumber(maxReceivedNumber, 3); } @Override public Boolean noticeHandleDutyUser(Long formId) { OfficialDocumentReceived documentReceived = this.getById(formId); if(documentReceived.getHandleDutyUserId() != null){ User user = userMapper.selectById(documentReceived.getHandleDutyUserId()); WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto(); weChatSendMessageDto.setUserId(user.getOpenId()); weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo"); //weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id)); weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextIdStr()); JSONObject data = new JSONObject(); JSONObject thing23 = new JSONObject(); thing23.put("value", "您有一个行政收文待处理"); data.put("thing23", thing23); JSONObject data2 = new JSONObject(); data2.put("value", user.getName()); data.put("thing29", data2); JSONObject data3 = new JSONObject(); data3.put("value", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); data.put("time17", data3); weChatSendMessageDto.setContent(data); weChatService.sendTemplateMessage(weChatSendMessageDto); } return true; } @Override @Transactional(rollbackFor = Exception.class) public void taskIdPersist(Long id) { // 根据当前表单数据获取流程信息 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper .eq(WorkflowFormRelation::getFormKeyValue, id) ; WorkflowFormRelation workflowFormRelation = workflowFormRelationService.getOne(wrapper); if(ObjectUtils.isNotEmpty(workflowFormRelation)){ OfficialDocumentReceived update = new OfficialDocumentReceived(); update.setId(id); update.setTaskId(workflowFormRelation.getProcessId()); officialDocumentReceivedMapper.updateById(update); } } /** * 获取当前行政收文流程下一节点审核人列表 * @param taskId */ @Override @Transactional(rollbackFor = Exception.class) public List nextReviewerList(String taskId) { // 根据流程Id获取分管领导审核节点的审核人 LambdaQueryWrapper workflowRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); workflowRecordLambdaQueryWrapper .eq(WorkflowRecord::getNodeType, "开始节点") .eq(WorkflowRecord::getNodeName, "分管领导意见") .ne(WorkflowRecord::getCreateUserId, 0) .eq(WorkflowRecord::getProcessId, taskId) .orderByDesc(WorkflowRecord::getRecordTime) .last("limit 1") ; WorkflowRecord workflowRecord = workflowRecordService.getOne(workflowRecordLambdaQueryWrapper); if(ObjectUtils.isEmpty(workflowRecord)){ return new ArrayList<>(); } // 取出分管领导姓名 String message = workflowRecord.getMessage(); if(StringUtils.isEmpty(message)){ return new ArrayList<>(); } Pattern pattern = Pattern.compile("【(.*?)】"); Matcher matcher = pattern.matcher(message); if (!matcher.find()) { return new ArrayList<>(); } String name = matcher.group(1); // 根据当前分管领导获取其负责的部门 MPJLambdaWrapper postMPJLambdaWrapper = new MPJLambdaWrapper<>(); postMPJLambdaWrapper .select(Post::getId) .innerJoin(UserPostRelation.class, UserPostRelation::getPostId, Post::getId) .innerJoin(XjrUser.class, XjrUser::getId, UserPostRelation::getUserId) .eq(XjrUser::getName, name) ; List posts = postMapper.selectJoinList(Post.class, postMPJLambdaWrapper); List postIds = posts.stream() .map(Post::getId) .collect(Collectors.toList()); if(CollectionUtils.isEmpty(postIds)){ return new ArrayList<>(); } // 根据部门获取部门管理人员 MPJLambdaWrapper xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>(); xjrUserMPJLambdaWrapper .selectAs(XjrUser::getId, NextReviewerListVo::getValue) .selectAs(XjrUser::getName, NextReviewerListVo::getLabel) .selectAs(Department::getName, NextReviewerListVo::getDeptName) .innerJoin(UserPostRelation.class, UserPostRelation::getUserId, XjrUser::getId) .innerJoin(Post.class, Post::getId, UserPostRelation::getPostId) .leftJoin(Department.class, Department::getId, Post::getDeptId) .in(Post::getParentId, postIds) .and(wrapper -> wrapper .like(Post::getName, "主任") .or() .like(Post::getName, "书记") ) ; List voList = xjrUserMapper.selectJoinList(NextReviewerListVo.class, xjrUserMPJLambdaWrapper); for (NextReviewerListVo vo : voList){ if(ObjectUtils.isNotEmpty(vo.getDeptName())){ vo.setLabel(vo.getLabel() + "(" + vo.getDeptName() + ")"); } } return voList; } @Override @Transactional(rollbackFor = Exception.class) public List nextExecutorList(String taskId) { // 根据流程Id获取部门主任意见审核节点的审核人 LambdaQueryWrapper workflowRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); workflowRecordLambdaQueryWrapper .eq(WorkflowRecord::getNodeType, "开始节点") .eq(WorkflowRecord::getNodeName, "部门主任意见") .ne(WorkflowRecord::getCreateUserId, 0) .eq(WorkflowRecord::getProcessId, taskId) .orderByDesc(WorkflowRecord::getRecordTime) .last("limit 1") ; WorkflowRecord workflowRecord = workflowRecordService.getOne(workflowRecordLambdaQueryWrapper); if(ObjectUtils.isEmpty(workflowRecord)){ return new ArrayList<>(); } // 取出分管领导姓名 String message = workflowRecord.getMessage(); if(StringUtils.isEmpty(message)){ return new ArrayList<>(); } Pattern pattern = Pattern.compile("【(.*?)】"); Matcher matcher = pattern.matcher(message); if (!matcher.find()) { return new ArrayList<>(); } String name = matcher.group(1); // 根据当前主任获取其负责的部门 MPJLambdaWrapper postMPJLambdaWrapper = new MPJLambdaWrapper<>(); postMPJLambdaWrapper .select(Post::getId) .innerJoin(UserPostRelation.class, UserPostRelation::getPostId, Post::getId) .innerJoin(XjrUser.class, XjrUser::getId, UserPostRelation::getUserId) .eq(XjrUser::getName, name) ; List posts = postMapper.selectJoinList(Post.class, postMPJLambdaWrapper); List postIds = posts.stream() .map(Post::getId) .collect(Collectors.toList()); if(CollectionUtils.isEmpty(postIds)){ return new ArrayList<>(); } // 根据部门获取部门管理人员 MPJLambdaWrapper xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>(); xjrUserMPJLambdaWrapper .selectAs(XjrUser::getId, NextReviewerListVo::getValue) .selectAs(XjrUser::getName, NextReviewerListVo::getLabel) .selectAs(Department::getName, NextReviewerListVo::getDeptName) .innerJoin(UserPostRelation.class, UserPostRelation::getUserId, XjrUser::getId) .innerJoin(Post.class, Post::getId, UserPostRelation::getPostId) .leftJoin(Department.class, Department::getId, Post::getDeptId) .in(Post::getParentId, postIds) .and(wrapper -> wrapper .like(Post::getName, "副主任") .or() .like(Post::getName, "副书记") ) ; List voList = xjrUserMapper.selectJoinList(NextReviewerListVo.class, xjrUserMPJLambdaWrapper); for (NextReviewerListVo vo : voList){ if(ObjectUtils.isNotEmpty(vo.getDeptName())){ vo.setLabel(vo.getLabel() + "(" + vo.getDeptName() + ")"); } } return voList; } }