From 7e3f424494b249365f5a26c5245db86468c315dc Mon Sep 17 00:00:00 2001 From: zy_Java <654600784@qq.com> Date: Mon, 18 May 2020 11:05:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E4=BA=BA=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/tall/aspect/RobotAspect.java | 51 +++ .../tall/bean/po/SysProjectRobotMessage.java | 12 +- .../po/SysProjectRobotMessageExample.java | 48 +-- .../java/com/ccsens/tall/bean/vo/TaskVo.java | 2 +- .../tall/persist/dao/SysMessageTypeDao.java | 8 + .../tall/persist/dao/SysProjectRobotDao.java | 8 + .../dao/SysProjectRobotMessageDao.java | 8 + .../ccsens/tall/persist/dao/SysUserDao.java | 2 + .../com/ccsens/tall/service/AsyncService.java | 28 ++ .../ccsens/tall/service/ExportWbsService.java | 7 +- .../ccsens/tall/service/IAsyncService.java | 11 + .../ccsens/tall/service/IRobotService.java | 72 ++++ .../tall/service/ITaskPluginService.java | 2 +- .../com/ccsens/tall/service/IUserService.java | 2 + .../ccsens/tall/service/MessageService.java | 2 + .../ccsens/tall/service/ProRoleService.java | 29 +- .../tall/service/ProTaskDetailService.java | 12 +- .../com/ccsens/tall/service/RobotService.java | 316 ++++++++++++++++++ .../tall/service/TaskDeliverService.java | 32 +- .../tall/service/TaskPluginService.java | 23 +- .../tall/service/TaskSubTimeService.java | 23 +- .../com/ccsens/tall/service/UserService.java | 8 + .../tall/service/WbsSubSheetService.java | 57 +++- .../java/com/ccsens/tall/util/RobotUtil.java | 71 ++++ .../com/ccsens/tall/util/TallConstant.java | 17 + .../ccsens/tall/web/DeliverController.java | 4 + .../com/ccsens/tall/web/TaskController.java | 6 +- tall/src/main/resources/application.yml | 4 +- .../main/resources/mapper_dao/SysUserDao.xml | 15 + .../SysProjectRobotMessageMapper.xml | 28 +- .../main/java/com/ccsens/util/CodeEnum.java | 1 + .../ccsens/util/annotation/OperateType.java | 16 + .../java/com/ccsens/util/wx/WxRobotUtil.java | 111 ++++++ 33 files changed, 952 insertions(+), 84 deletions(-) create mode 100644 tall/src/main/java/com/ccsens/tall/aspect/RobotAspect.java create mode 100644 tall/src/main/java/com/ccsens/tall/persist/dao/SysMessageTypeDao.java create mode 100644 tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotDao.java create mode 100644 tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotMessageDao.java create mode 100644 tall/src/main/java/com/ccsens/tall/service/AsyncService.java create mode 100644 tall/src/main/java/com/ccsens/tall/service/IAsyncService.java create mode 100644 tall/src/main/java/com/ccsens/tall/service/IRobotService.java create mode 100644 tall/src/main/java/com/ccsens/tall/service/RobotService.java create mode 100644 tall/src/main/java/com/ccsens/tall/util/RobotUtil.java create mode 100644 tall/src/main/java/com/ccsens/tall/util/TallConstant.java create mode 100644 util/src/main/java/com/ccsens/util/annotation/OperateType.java create mode 100644 util/src/main/java/com/ccsens/util/wx/WxRobotUtil.java diff --git a/tall/src/main/java/com/ccsens/tall/aspect/RobotAspect.java b/tall/src/main/java/com/ccsens/tall/aspect/RobotAspect.java new file mode 100644 index 00000000..73dea104 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/aspect/RobotAspect.java @@ -0,0 +1,51 @@ +package com.ccsens.tall.aspect; + +import com.ccsens.cloudutil.annotation.MustLogin; +import com.ccsens.tall.service.IAsyncService; +import com.ccsens.tall.service.IRobotService; +import com.ccsens.tall.service.RobotService; +import com.ccsens.tall.util.RobotUtil; +import com.ccsens.util.annotation.OperateType; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.lang.reflect.Method; + +@Order(2) +@Slf4j +@Aspect +@Component +public class RobotAspect { + @Autowired + private IRobotService robotService; + @Resource + private IAsyncService asyncService; + + @Pointcut("@annotation(com.ccsens.util.annotation.OperateType)") + public void robotAdvice(){ + + } + + @After("robotAdvice()") + public void robotMessageSend(JoinPoint joinPoint){ + //1.获取方法类型Code + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method targetMethod = methodSignature.getMethod(); + OperateType operateType = targetMethod.getAnnotation(OperateType.class); + //2.获取发送参数 + RobotUtil.Message message = RobotUtil.get(); + asyncService.sendRobotMessage(operateType,message); + + } + +} diff --git a/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessage.java b/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessage.java index 4906811c..40b85144 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessage.java +++ b/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessage.java @@ -8,7 +8,7 @@ public class SysProjectRobotMessage implements Serializable { private Long projectRobotId; - private Long messageId; + private Byte operateType; private Byte allMessage; @@ -36,12 +36,12 @@ public class SysProjectRobotMessage implements Serializable { this.projectRobotId = projectRobotId; } - public Long getMessageId() { - return messageId; + public Byte getOperateType() { + return operateType; } - public void setMessageId(Long messageId) { - this.messageId = messageId; + public void setOperateType(Byte operateType) { + this.operateType = operateType; } public Byte getAllMessage() { @@ -84,7 +84,7 @@ public class SysProjectRobotMessage implements Serializable { sb.append("Hash = ").append(hashCode()); sb.append(", id=").append(id); sb.append(", projectRobotId=").append(projectRobotId); - sb.append(", messageId=").append(messageId); + sb.append(", operateType=").append(operateType); sb.append(", allMessage=").append(allMessage); sb.append(", createdAt=").append(createdAt); sb.append(", updatedAt=").append(updatedAt); diff --git a/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessageExample.java b/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessageExample.java index 1043892c..65a50392 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessageExample.java +++ b/tall/src/main/java/com/ccsens/tall/bean/po/SysProjectRobotMessageExample.java @@ -225,63 +225,63 @@ public class SysProjectRobotMessageExample { return (Criteria) this; } - public Criteria andMessageIdIsNull() { - addCriterion("message_id is null"); + public Criteria andOperateTypeIsNull() { + addCriterion("operate_type is null"); return (Criteria) this; } - public Criteria andMessageIdIsNotNull() { - addCriterion("message_id is not null"); + public Criteria andOperateTypeIsNotNull() { + addCriterion("operate_type is not null"); return (Criteria) this; } - public Criteria andMessageIdEqualTo(Long value) { - addCriterion("message_id =", value, "messageId"); + public Criteria andOperateTypeEqualTo(Byte value) { + addCriterion("operate_type =", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdNotEqualTo(Long value) { - addCriterion("message_id <>", value, "messageId"); + public Criteria andOperateTypeNotEqualTo(Byte value) { + addCriterion("operate_type <>", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdGreaterThan(Long value) { - addCriterion("message_id >", value, "messageId"); + public Criteria andOperateTypeGreaterThan(Byte value) { + addCriterion("operate_type >", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdGreaterThanOrEqualTo(Long value) { - addCriterion("message_id >=", value, "messageId"); + public Criteria andOperateTypeGreaterThanOrEqualTo(Byte value) { + addCriterion("operate_type >=", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdLessThan(Long value) { - addCriterion("message_id <", value, "messageId"); + public Criteria andOperateTypeLessThan(Byte value) { + addCriterion("operate_type <", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdLessThanOrEqualTo(Long value) { - addCriterion("message_id <=", value, "messageId"); + public Criteria andOperateTypeLessThanOrEqualTo(Byte value) { + addCriterion("operate_type <=", value, "operateType"); return (Criteria) this; } - public Criteria andMessageIdIn(List values) { - addCriterion("message_id in", values, "messageId"); + public Criteria andOperateTypeIn(List values) { + addCriterion("operate_type in", values, "operateType"); return (Criteria) this; } - public Criteria andMessageIdNotIn(List values) { - addCriterion("message_id not in", values, "messageId"); + public Criteria andOperateTypeNotIn(List values) { + addCriterion("operate_type not in", values, "operateType"); return (Criteria) this; } - public Criteria andMessageIdBetween(Long value1, Long value2) { - addCriterion("message_id between", value1, value2, "messageId"); + public Criteria andOperateTypeBetween(Byte value1, Byte value2) { + addCriterion("operate_type between", value1, value2, "operateType"); return (Criteria) this; } - public Criteria andMessageIdNotBetween(Long value1, Long value2) { - addCriterion("message_id not between", value1, value2, "messageId"); + public Criteria andOperateTypeNotBetween(Byte value1, Byte value2) { + addCriterion("operate_type not between", value1, value2, "operateType"); return (Criteria) this; } diff --git a/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java b/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java index ff3cfc78..f79bab9e 100644 --- a/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java +++ b/tall/src/main/java/com/ccsens/tall/bean/vo/TaskVo.java @@ -88,7 +88,7 @@ public class TaskVo { private String projectName; @ApiModelProperty("负责人Id") private Long executorRole; - @ApiModelProperty("负责人Id") + @ApiModelProperty("负责人名称") private String executorRoleName; @ApiModelProperty("开始时间") private Long beginTime; diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/SysMessageTypeDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/SysMessageTypeDao.java new file mode 100644 index 00000000..a1e89eee --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/SysMessageTypeDao.java @@ -0,0 +1,8 @@ +package com.ccsens.tall.persist.dao; + +import com.ccsens.tall.persist.mapper.SysMessageTypeMapper; +import org.springframework.stereotype.Repository; + +@Repository +public interface SysMessageTypeDao extends SysMessageTypeMapper { +} diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotDao.java new file mode 100644 index 00000000..4a933ad1 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotDao.java @@ -0,0 +1,8 @@ +package com.ccsens.tall.persist.dao; + +import com.ccsens.tall.persist.mapper.SysProjectRobotMapper; +import org.springframework.stereotype.Repository; + +@Repository +public interface SysProjectRobotDao extends SysProjectRobotMapper { +} diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotMessageDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotMessageDao.java new file mode 100644 index 00000000..18dd566b --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/SysProjectRobotMessageDao.java @@ -0,0 +1,8 @@ +package com.ccsens.tall.persist.dao; + +import com.ccsens.tall.persist.mapper.SysProjectRobotMessageMapper; +import org.springframework.stereotype.Repository; + +@Repository +public interface SysProjectRobotMessageDao extends SysProjectRobotMessageMapper { +} diff --git a/tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java b/tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java index 239a072c..b38b54dd 100644 --- a/tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java +++ b/tall/src/main/java/com/ccsens/tall/persist/dao/SysUserDao.java @@ -20,4 +20,6 @@ public interface SysUserDao extends SysUserMapper { void replaceDeliverPostLog(@Param("oldUserId") Long userId, @Param("newUserId") Long currentUserId); void replaceProLog(@Param("oldUserId") Long userId,@Param("newUserId") Long currentUserId); + + String getUserNameByUserId(@Param("userId") Long userId); } diff --git a/tall/src/main/java/com/ccsens/tall/service/AsyncService.java b/tall/src/main/java/com/ccsens/tall/service/AsyncService.java new file mode 100644 index 00000000..5f3696fa --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/AsyncService.java @@ -0,0 +1,28 @@ +package com.ccsens.tall.service; + +import com.ccsens.tall.util.RobotUtil; +import com.ccsens.util.annotation.OperateType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Slf4j +@Async +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class AsyncService implements IAsyncService{ + + @Resource + private IRobotService robotService; + + + @Override + public void sendRobotMessage(OperateType operateType,RobotUtil.Message message) { + robotService.robotMessage(operateType,message); + } + +} diff --git a/tall/src/main/java/com/ccsens/tall/service/ExportWbsService.java b/tall/src/main/java/com/ccsens/tall/service/ExportWbsService.java index 42132d3b..7762e073 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ExportWbsService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ExportWbsService.java @@ -125,11 +125,6 @@ public class ExportWbsService implements IExportWbsService{ Map secondTaskMap = new HashMap<>(); - //获取项目下所有任务 -// ProTaskDetailExample proTaskDetailExample = new ProTaskDetailExample(); -// proTaskDetailExample.createCriteria().andProjectIdEqualTo(projectId).andLevelNotEqualTo((byte) 0); -// proTaskDetailExample.setOrderByClause("level"); -// List taskDetailList = taskDetailDao.selectByExample(proTaskDetailExample); List taskDetailList = taskDetailDao.selectAllByProject(projectId); if(CollectionUtil.isNotEmpty(taskDetailList)){ for(ProTaskDetail taskDetail : taskDetailList){ @@ -215,7 +210,7 @@ public class ExportWbsService implements IExportWbsService{ List deliverInfoList = new ArrayList<>(); ProTaskDeliverExample deliverExample = new ProTaskDeliverExample(); - deliverExample.createCriteria().andTaskDetailIdEqualTo(taskId); + deliverExample.createCriteria().andTaskDetailIdEqualTo(taskId).andIsInputEqualTo(0); List deliverList = taskDeliverDao.selectByExample(deliverExample); if(CollectionUtil.isNotEmpty(deliverList)){ for(ProTaskDeliver taskDeliver : deliverList){ diff --git a/tall/src/main/java/com/ccsens/tall/service/IAsyncService.java b/tall/src/main/java/com/ccsens/tall/service/IAsyncService.java new file mode 100644 index 00000000..aa8f6c5f --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/IAsyncService.java @@ -0,0 +1,11 @@ +package com.ccsens.tall.service; + +import com.ccsens.tall.util.RobotUtil; +import com.ccsens.util.annotation.OperateType; + +/** + * 异步方法 + */ +public interface IAsyncService { + void sendRobotMessage(OperateType operateType, RobotUtil.Message message); +} diff --git a/tall/src/main/java/com/ccsens/tall/service/IRobotService.java b/tall/src/main/java/com/ccsens/tall/service/IRobotService.java new file mode 100644 index 00000000..9ffa1fea --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/IRobotService.java @@ -0,0 +1,72 @@ +package com.ccsens.tall.service; + +import com.ccsens.tall.bean.po.ProTaskDetail; +import com.ccsens.tall.bean.po.SysProject; +import com.ccsens.tall.bean.vo.TaskVo; +import com.ccsens.tall.util.RobotUtil; +import com.ccsens.util.annotation.OperateType; + +import java.util.Set; + +public interface IRobotService { + void robotMessage(OperateType operateType, RobotUtil.Message message); + + /** + * 完成任务消息 + */ + void finishTaskRobotSend(Long currentUserId,Long projectId, String projectName, String name,Long executorRoleId ,int completedStatus)throws Exception; + + /** + * 添加任务消息 + * @param currentUserId + * @param project + * @param taskName + * @param executorId + */ + void addTaskRobotSend(Long currentUserId, SysProject project, String taskName, Long executorId) throws Exception; + + /** + * 删除任务消息 + * @param currentUserId + * @param taskDetail + */ + void deleteTaskRobotSend(Long currentUserId, ProTaskDetail taskDetail) throws Exception; + + /** + * 修改任务信息 + * @param currentUserId + * @param normalTask + */ + void changeTaskRobotSend(Long currentUserId, TaskVo.NormalTask normalTask) throws Exception; + + /** + * 上传交付物信息 + * @param currentUserId + * @param subTimeId + */ + void addDeliverRobotSend(Long currentUserId,String deliverName, Long subTimeId) throws Exception; + + /** + * 删除交付物信息 + * @param currentUserId + * @param name + * @param subTimeId + */ + void deleteDeliverRobotSend(Long currentUserId, String name, Long subTimeId) throws Exception; + + /** + * 检查交付物信息 + * @param currentUserId + * @param task + * @param userIdSet + * @param name + */ + void checkDeliverRobotSend(Long currentUserId, ProTaskDetail task, Long userIdSet, String name) throws Exception; + + /** + * 评论任务信息 + * @param userId + * @param proTaskDetail + */ + void addCommentRobotSend(Long userId, ProTaskDetail proTaskDetail) throws Exception; +} diff --git a/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java b/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java index a756ae37..36053643 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ITaskPluginService.java @@ -12,7 +12,7 @@ public interface ITaskPluginService { List getPluginByTask(Long taskId, Long userId) throws Exception; - PluginVo.CommentInfo addComment(Long userId,PluginDto.AddCommentPlugin addCommentPlugin); + PluginVo.CommentInfo addComment(Long userId,PluginDto.AddCommentPlugin addCommentPlugin) throws Exception; List getComment(Long currentUserId, Long taskId); diff --git a/tall/src/main/java/com/ccsens/tall/service/IUserService.java b/tall/src/main/java/com/ccsens/tall/service/IUserService.java index bc858faf..87bf61fb 100644 --- a/tall/src/main/java/com/ccsens/tall/service/IUserService.java +++ b/tall/src/main/java/com/ccsens/tall/service/IUserService.java @@ -78,4 +78,6 @@ public interface IUserService { void mergeUserId(Long userId, Long uselessId); UserVo.Account systemRegister(UserDto.UserSignupSystem userSignup); + + String getUserNameByUserId(Long userId); } diff --git a/tall/src/main/java/com/ccsens/tall/service/MessageService.java b/tall/src/main/java/com/ccsens/tall/service/MessageService.java index adfb5912..5898f95b 100644 --- a/tall/src/main/java/com/ccsens/tall/service/MessageService.java +++ b/tall/src/main/java/com/ccsens/tall/service/MessageService.java @@ -96,4 +96,6 @@ public class MessageService implements IMessageService{ rabbitTemplate.convertAndSend(RabbitMQConfig.RabbitMQ_QUEUE_NAME , JacksonUtil.beanToJson(syncMessage)); } + + } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java index c1a014f7..d339b67a 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProRoleService.java @@ -203,14 +203,16 @@ public class ProRoleService implements IProRoleService { public int selectPowerByRoleName(Long userId, Long projectId) { int power = 0; SysProject project = projectDao.selectByPrimaryKey(projectId); - if (project.getCreatorId().longValue() == userId) { - power = 2; - } - List roles = getProRoleByProjectIdAndUserId(projectId, userId); - if (CollectionUtil.isNotEmpty(roles)) { - for (ProRole role : roles) { - int i = proRoleDao.selectPowerByRoleName(role.getDescription()); - power = i > power ? i : power; + if(ObjectUtil.isNotNull(project)) { + if (project.getCreatorId().longValue() == userId) { + power = 2; + } + List roles = getProRoleByProjectIdAndUserId(projectId, userId); + if (CollectionUtil.isNotEmpty(roles)) { + for (ProRole role : roles) { + int i = proRoleDao.selectPowerByRoleName(role.getDescription()); + power = i > power ? i : power; + } } } return power; @@ -221,11 +223,14 @@ public class ProRoleService implements IProRoleService { */ @Override public TaskVo.RoleCheckList selectRoleByCheckOrExecutor(Long roleId) { - TaskVo.RoleCheckList roleCheckList = new TaskVo.RoleCheckList(); - if (roleId != 0) { + TaskVo.RoleCheckList roleCheckList = null; + if (roleId != 0 || ObjectUtil.isNotNull(roleId)) { ProRole role = proRoleDao.selectByPrimaryKey(roleId); - roleCheckList.setId(role.getId()); - roleCheckList.setName(role.getName()); + if(ObjectUtil.isNotNull(role)){ + roleCheckList = new TaskVo.RoleCheckList(); + roleCheckList.setId(role.getId()); + roleCheckList.setName(role.getName()); + } } return roleCheckList; } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java index 33919864..ab566fbf 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java @@ -14,6 +14,7 @@ import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.persist.dao.*; import com.ccsens.tall.persist.dao.ProTaskShowDao; import com.ccsens.tall.persist.mapper.ProPluginConfigMapper; +import com.ccsens.tall.util.RobotUtil; import com.ccsens.tall.util.TaskUtil; import com.ccsens.util.CodeEnum; import com.ccsens.util.DateUtil; @@ -30,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; @Slf4j @@ -47,7 +49,7 @@ public class ProTaskDetailService implements IProTaskDetailService { @Autowired private IProMemberService proMemberService; @Autowired - private IProShowService proShowService; + private IUserService userService; @Autowired private ProTaskShowDao proTaskShowDao; @Autowired @@ -72,6 +74,8 @@ public class ProTaskDetailService implements IProTaskDetailService { private MtFeignClient mtFeignClient; @Resource private ProPluginConfigMapper proPluginConfigMapper; + @Autowired + private IRobotService robotService; @Override public void saveTaskDetail(ProTaskDetail taskDetail) { @@ -989,6 +993,9 @@ public class ProTaskDetailService implements IProTaskDetailService { } else { taskDetail = taskDetailDao.selectByPrimaryKey(taskId); } + if(ObjectUtil.isNull(taskDetail)){ + throw new BaseException(CodeEnum.NOT_TASK); + } // //本用户在项目中的角色 // List proRoles = proRoleService.getProRoleByProjectIdAndUserId(taskDetail.getProjectId(), currentUserId); //用户在项目中的最高权限 @@ -1004,6 +1011,8 @@ public class ProTaskDetailService implements IProTaskDetailService { } else { throw new BaseException(CodeEnum.NOT_POWER); } + //通过智能助手发送消息 + robotService.deleteTaskRobotSend(currentUserId,taskDetail); } @Override @@ -1119,6 +1128,7 @@ public class ProTaskDetailService implements IProTaskDetailService { }else { throw new BaseException(CodeEnum.NOT_TASK); } + robotService.changeTaskRobotSend(currentUserId,normalTask); return normalTask; } private void changeTime(ProTaskDetail taskDetail,Long beginTime,Long endTime,SysProject project){ diff --git a/tall/src/main/java/com/ccsens/tall/service/RobotService.java b/tall/src/main/java/com/ccsens/tall/service/RobotService.java new file mode 100644 index 00000000..ee69ae66 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/service/RobotService.java @@ -0,0 +1,316 @@ +package com.ccsens.tall.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.ccsens.tall.bean.po.*; +import com.ccsens.tall.bean.vo.TaskVo; +import com.ccsens.tall.persist.dao.*; +import com.ccsens.tall.util.RobotUtil; +import com.ccsens.tall.util.TallConstant; +import com.ccsens.util.CodeEnum; +import com.ccsens.util.RedisUtil; +import com.ccsens.util.annotation.OperateType; +import com.ccsens.util.exception.BaseException; +import com.ccsens.util.wx.WxRobotUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) +public class RobotService implements IRobotService{ + @Autowired + private SysProjectDao sysProjectDao; + @Autowired + private SysRobotDao sysRobotDao; + @Autowired + private SysProjectRobotDao sysProjectRobotDao; + @Autowired + private SysMessageTypeDao sysMessageTypeDao; + @Autowired + private SysProjectRobotMessageDao projectRobotMessageDao; + @Autowired + private RedisUtil redisUtil; + @Autowired + private IUserService userService; + @Autowired + private IProRoleService proRoleService; + @Autowired + private IProMemberService proMemberService; + @Autowired + private TaskDetailDao taskDetailDao; + @Autowired + private TaskSubTimeDao taskSubTimeDao; + + @Override + public void robotMessage(OperateType operateType,RobotUtil.Message message){ + //获取机器人信息 + SysProjectRobotExample sysProjectRobotExample = new SysProjectRobotExample(); + sysProjectRobotExample.createCriteria().andProjectIdEqualTo( message.getProjectId()); + List sysProjectRobotList = sysProjectRobotDao.selectByExample(sysProjectRobotExample); + if(CollectionUtil.isNotEmpty(sysProjectRobotList)){ + sysProjectRobotList.forEach(sysProjectRobot -> { + //检查接口是否需要发送消息 + if(isSend(sysProjectRobot.getId(),operateType.value())){ + String content = getRobotTemplate(operateType.value()); + //获取发送参数 + StringBuilder builder = new StringBuilder(content); + String replace = "{{}}"; + message.getParams().forEach(param->{ + int start = builder.indexOf(replace); + builder.replace(start, start + replace.length(),param); + }); + + //获取机器人信息 + SysRobot sysRobot = sysRobotDao.selectByPrimaryKey(sysProjectRobot.getRobotId()); + //4.发送消息 + if(ObjectUtil.isNotNull(sysRobot)){ + switch (sysRobot.getClientType()){ + case 0://微信 + try { + WxRobotUtil.sendRobotInfo(sysRobot.getWebHook(),builder,message.getMsgType(),message.getMentionedList(),message.getMentionedMobileList()); + } catch (Exception e) { + e.printStackTrace(); + } + //删除线程 + RobotUtil.del(); + break; + case 1://钉钉 + //删除线程 + RobotUtil.del(); + break; + default: + //删除线程 + RobotUtil.del(); + } + } + } + }); + } + } + + private boolean isSend(Long projectRobotId,int operateType){ + AtomicBoolean flag = new AtomicBoolean(false); + SysProjectRobotMessageExample messageExample = new SysProjectRobotMessageExample(); + messageExample.createCriteria().andProjectRobotIdEqualTo(projectRobotId); + List sysProjectRobotMessageList = projectRobotMessageDao.selectByExample(messageExample); + if(CollectionUtil.isNotEmpty(sysProjectRobotMessageList)){ + sysProjectRobotMessageList.forEach(projectRobotMessage->{ + if(projectRobotMessage.getAllMessage() == 1 || projectRobotMessage.getOperateType() == operateType){ + flag.set(true); + } + }); + } + return flag.get(); + } + + private String getRobotTemplate(int code){ + String robotKey = TallConstant.getRobotTemplateKey(code); + String template = ""; + template = (String)redisUtil.get(robotKey); + if(StrUtil.isEmpty(template)){ + SysMessageTypeExample sysMessageTypeExample = new SysMessageTypeExample(); + sysMessageTypeExample.createCriteria().andOperateTypeEqualTo((byte) code); + List sysMessageTypeList = sysMessageTypeDao.selectByExample(sysMessageTypeExample); + if(CollectionUtil.isNotEmpty(sysMessageTypeList)){ + template = sysMessageTypeList.get(0).getTemplate(); + redisUtil.set(robotKey,template); + } + } + return template; + } + + private String[] getMemberPhonesByRoleId(Long roleId) throws Exception { + String[] memberPhone = new String[]{}; + List memberList = proMemberService.selectByRole(roleId); + if(CollectionUtil.isNotEmpty(memberList)){ + String[] phones = new String[memberList.size()]; + AtomicInteger i = new AtomicInteger(0); + memberList.forEach(proMember -> { + if(StrUtil.isNotEmpty(proMember.getPhone())) { + phones[i.get()] = proMember.getPhone(); + i.set(i.get() + 1); + } + }); + memberPhone = phones; + } + return memberPhone; + } + + @Override + public void finishTaskRobotSend(Long currentUserId,Long projectId, String projectName, String taskName,Long executorRoleId , int completedStatus) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + String isFinish = ""; + if(completedStatus == 2){ + isFinish = "完成"; + }else { + isFinish = "取消完成"; + } + + RobotUtil.Message message = new RobotUtil.Message(projectId); + message.appendParams(userName,projectName,isFinish,taskName); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(executorRoleId); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void addTaskRobotSend(Long currentUserId, SysProject project, String taskName, Long executorId) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + String projectName = ""; + String executorName = ""; + TaskVo.RoleCheckList role = proRoleService.selectRoleByCheckOrExecutor(executorId); + if(ObjectUtil.isNotNull(role)){ + executorName = role.getName(); + } + if(ObjectUtil.isNotNull(project)){ + projectName = project.getName(); + } + RobotUtil.Message message = new RobotUtil.Message(project.getId()); + message.appendParams(userName,projectName,taskName,executorName); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(executorId); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void deleteTaskRobotSend(Long currentUserId, ProTaskDetail taskDetail) throws Exception { + SysProject sysProject = sysProjectDao.selectByPrimaryKey(taskDetail.getProjectId()); + String userName = userService.getUserNameByUserId(currentUserId); + String projectName = ""; + if(ObjectUtil.isNotNull(sysProject)){ + projectName = sysProject.getName(); + } + RobotUtil.Message message = new RobotUtil.Message(sysProject.getId()); + message.appendParams(userName,projectName,taskDetail.getName()); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(taskDetail.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void changeTaskRobotSend(Long currentUserId, TaskVo.NormalTask normalTask) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + RobotUtil.Message message = new RobotUtil.Message(normalTask.getProjectId()); + message.appendParams(userName,normalTask.getProjectName(),normalTask.getName(),normalTask.getExecutorRoleName()); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(normalTask.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void addDeliverRobotSend(Long currentUserId, String deliverName, Long subTimeId) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + String projectName = ""; + ProTaskSubTime proTaskSubTime = taskSubTimeDao.selectByPrimaryKey(subTimeId); + if(ObjectUtil.isNull(proTaskSubTime)){ + throw new BaseException(CodeEnum.NOT_TASK); + } + ProTaskDetail taskDetail = taskDetailDao.selectByPrimaryKey(proTaskSubTime.getTaskDetailId()); + if(ObjectUtil.isNull(taskDetail)){ + throw new BaseException(CodeEnum.NOT_TASK); + } + SysProject project = sysProjectDao.selectByPrimaryKey(taskDetail.getProjectId()); + if(ObjectUtil.isNotNull(project)){ + projectName = project.getName(); + } + //生成消息 + RobotUtil.Message message = new RobotUtil.Message(project.getId()); + message.appendParams(userName,projectName,taskDetail.getName(),deliverName); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(taskDetail.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void deleteDeliverRobotSend(Long currentUserId, String deliverName, Long subTimeId) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + String projectName = ""; + ProTaskSubTime proTaskSubTime = taskSubTimeDao.selectByPrimaryKey(subTimeId); + if(ObjectUtil.isNull(proTaskSubTime)){ + throw new BaseException(CodeEnum.NOT_TASK); + } + ProTaskDetail taskDetail = taskDetailDao.selectByPrimaryKey(proTaskSubTime.getTaskDetailId()); + if(ObjectUtil.isNull(taskDetail)){ + throw new BaseException(CodeEnum.NOT_TASK); + } + SysProject project = sysProjectDao.selectByPrimaryKey(taskDetail.getProjectId()); + if(ObjectUtil.isNotNull(project)){ + projectName = project.getName(); + } + //生成消息 + RobotUtil.Message message = new RobotUtil.Message(project.getId()); + message.appendParams(userName,projectName,taskDetail.getName(),deliverName); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(taskDetail.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void checkDeliverRobotSend(Long currentUserId, ProTaskDetail task, Long uploadUserId, String deliverName) throws Exception { + String userName = userService.getUserNameByUserId(currentUserId); + String uploadUserName = ""; + if(ObjectUtil.isNotNull(uploadUserId)){ + uploadUserName = userService.getUserNameByUserId(uploadUserId); + } + String projectName = ""; + SysProject project = sysProjectDao.selectByPrimaryKey(task.getProjectId()); + if(ObjectUtil.isNotNull(project)){ + projectName = project.getName(); + } + //生成消息 + RobotUtil.Message message = new RobotUtil.Message(project.getId()); + message.appendParams(userName,uploadUserName,projectName,task.getName(),deliverName); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(task.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } + + @Override + public void addCommentRobotSend(Long userId, ProTaskDetail proTaskDetail) throws Exception { + String userName = userService.getUserNameByUserId(userId); + String projectName = ""; + SysProject project = sysProjectDao.selectByPrimaryKey(proTaskDetail.getProjectId()); + if(ObjectUtil.isNotNull(project)){ + projectName = project.getName(); + } + //生成消息 + RobotUtil.Message message = new RobotUtil.Message(project.getId()); + message.appendParams(userName,projectName,proTaskDetail.getName()); + //获取角色内成员的手机号 + String[] memberPhone = getMemberPhonesByRoleId(proTaskDetail.getExecutorRole()); + if(memberPhone.length != 0){ + message.appendMentionedMobileList(memberPhone); + } + RobotUtil.set(message); + } +} diff --git a/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java b/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java index 7d98a429..d8c0942d 100644 --- a/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java +++ b/tall/src/main/java/com/ccsens/tall/service/TaskDeliverService.java @@ -21,6 +21,7 @@ import com.ccsens.util.bean.message.common.MessageRule; import com.ccsens.util.config.RabbitMQConfig; import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; +import org.omg.CORBA.OBJ_ADAPTER; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -63,6 +64,8 @@ public class TaskDeliverService implements ITaskDeliverService { private Snowflake snowflake; @Autowired private AmqpTemplate rabbitTemplate; + @Autowired + private IRobotService robotService; @Override public void saveDeliver(ProTaskDeliver taskDeliver) { @@ -279,6 +282,8 @@ public class TaskDeliverService implements ITaskDeliverService { } else { throw new BaseException(CodeEnum.IS_NOT_EXECUTOR); } + //用智能助手发送消息 + robotService.addDeliverRobotSend(currentUserId,d.getName(),subTimeId); return deliverInfo; } @@ -477,10 +482,17 @@ public class TaskDeliverService implements ITaskDeliverService { BaseMessageDto.MessageUser messageUser = null; ProRole checkRole = null; Set userIdSet = new HashSet<>(); + Long uploadUserId = null; //查找该用户在此项目的角色 ProTaskDeliver deliver = taskDeliverDao.selectByPrimaryKey(checkDeliver.getDeliverId()); + if(ObjectUtil.isNull(deliver)){ + throw new BaseException(CodeEnum.NOT_DELIVER); + } ProTaskDetail task = taskDetailDao.selectByPrimaryKey(deliver.getTaskDetailId()); + if(ObjectUtil.isNull(task)){ + throw new BaseException(CodeEnum.NOT_TASK); + } ProRole proRole = proRoleDao.selectByPrimaryKey(task.getExecutorRole()); List roleList = proMemberService.selectRolesByUserIdAndProjectId(currentUserId, task.getProjectId()); if (CollectionUtil.isNotEmpty(roleList)) { @@ -510,6 +522,7 @@ public class TaskDeliverService implements ITaskDeliverService { } } userIdSet.add(postLog.getUserId().toString()); + uploadUserId = postLog.getUserId(); checkRole = role; // } } @@ -523,7 +536,7 @@ public class TaskDeliverService implements ITaskDeliverService { DeliverMessageWithCheckerDto checkerDto = new DeliverMessageWithCheckerDto(); DeliverMessageWithCheckerDto.Data checkerDtoData = new DeliverMessageWithCheckerDto.Data(); checkerDtoData.setProjectId(task.getProjectId()); - if (proRole.getName().equals(WebConstant.ROLE_NAME.AllMember.phase)) { + if (ObjectUtil.isNotNull(proRole) && proRole.getName().equals(WebConstant.ROLE_NAME.AllMember.phase)) { checkerDtoData.setRoleId(roleList.get(0).getId()); } else { checkerDtoData.setRoleId(task.getExecutorRole()); @@ -547,8 +560,11 @@ public class TaskDeliverService implements ITaskDeliverService { //检查完,返回数据 DeliverVo.DeliverInfo deliverInfo = selectDeliverInfo(currentUserId, deliver.getId(), checkDeliver.getTaskId()); + //用智能助手发送消息 + robotService.checkDeliverRobotSend(currentUserId,task,uploadUserId,deliver.getName()); return deliverInfo; } + /** * 检查未通过,将任务设为未完成 */ @@ -658,12 +674,14 @@ public class TaskDeliverService implements ITaskDeliverService { @Override public void deleteDeliver(Long currentUserId, Long deliverId, Long taskId) throws Exception { ProTaskDeliver deliver = taskDeliverDao.selectByPrimaryKey(deliverId); + if(ObjectUtil.isNull(deliver)){ + throw new BaseException(CodeEnum.NOT_DELIVER); + } Long subTimeId = isTaskOrSubTime(taskId); //接受消息的角色 List messageUserList = new ArrayList<>(); BaseMessageDto.MessageUser messageUser = null; List userIdList = new ArrayList<>(); - //同步锁,防止多个用户同时操作该数据 synchronized (this) { //查找此交付物与文件的中间表 @@ -715,12 +733,7 @@ public class TaskDeliverService implements ITaskDeliverService { DeliverMessageWithDeleteDto deleteMessage = new DeliverMessageWithDeleteDto(); DeliverMessageWithDeleteDto.Data deleteMessageData = new DeliverMessageWithDeleteDto.Data(); deleteMessageData.setProjectId(task.getProjectId()); -// if (role.getName().equalsIgnoreCase(WebConstant.ROLE_NAME.AllMember.phase)) { -// List roleList = memberService.selectRolesByUserIdAndProjectId(currentUserId, task.getProjectId()); -// deleteMessageData.setRoleId(roleList.get(0).getId()); -// } else { -// -// } + deleteMessageData.setRoleId(task.getExecutorRole()); deleteMessageData.setTaskId(task.getId()); deleteMessageData.setDeliverId(deliverId); @@ -734,6 +747,9 @@ public class TaskDeliverService implements ITaskDeliverService { InMessage inMessage = InMessage.newToUserMessage(currentUserId.toString(),userIdSet,null,messageRule,s); messageService.sendDeliverMessageWithDelete(inMessage); + + //用智能助手发送消息 + robotService.deleteDeliverRobotSend(currentUserId,deliver.getName(),subTimeId); } } diff --git a/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java b/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java index 78f48e8d..c1f6048d 100644 --- a/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java +++ b/tall/src/main/java/com/ccsens/tall/service/TaskPluginService.java @@ -29,8 +29,12 @@ public class TaskPluginService implements ITaskPluginService{ @Autowired private TaskDetailDao taskDetailDao; @Autowired + private TaskSubTimeDao taskSubTimeDao; + @Autowired private SysPluginDao sysPluginDao; @Autowired + private SysProjectDao sysProjectDao; + @Autowired private ProRoleDao roleDao; @Autowired private IProMemberService proMemberService; @@ -44,6 +48,8 @@ public class TaskPluginService implements ITaskPluginService{ private SysAuthDao sysAuthDao; @Autowired private IProRoleService proRoleService; + @Autowired + private IRobotService robotService; @Override public void savePlugin(ProTaskPlugin taskPlugin) { @@ -101,7 +107,19 @@ public class TaskPluginService implements ITaskPluginService{ * @return */ @Override - public PluginVo.CommentInfo addComment(Long userId, PluginDto.AddCommentPlugin addCommentPlugin) { + public PluginVo.CommentInfo addComment(Long userId, PluginDto.AddCommentPlugin addCommentPlugin) throws Exception { + ProTaskDetail proTaskDetail = null; + ProTaskSubTime subTime = taskSubTimeDao.selectByPrimaryKey(addCommentPlugin.getTaskId()); + if(ObjectUtil.isNotNull(subTime)) { + proTaskDetail = taskDetailDao.selectByPrimaryKey(subTime.getTaskDetailId()); + if (ObjectUtil.isNull(proTaskDetail)) { + throw new BaseException(CodeEnum.NOT_TASK); + } + } + SysProject sysProject = sysProjectDao.selectByPrimaryKey(proTaskDetail.getProjectId()); + if(ObjectUtil.isNull(sysProject)){ + throw new BaseException(CodeEnum.NOT_PROJECT); + } //保存评论信息 ProTaskComment proTaskComment = new ProTaskComment(); proTaskComment.setId(snowflake.nextId()); @@ -109,6 +127,7 @@ public class TaskPluginService implements ITaskPluginService{ proTaskComment.setTaskSubTimeId(addCommentPlugin.getTaskId()); proTaskComment.setDescription(addCommentPlugin.getDescription()); proTaskComment.setTime(System.currentTimeMillis()); + proTaskComment.setProjectid(sysProject.getId()); proTaskCommentDao.insertSelective(proTaskComment); //返回发送的信息 PluginVo.CommentInfo commentInfo = new PluginVo.CommentInfo(); @@ -132,6 +151,8 @@ public class TaskPluginService implements ITaskPluginService{ commentInfo.setUserName(sysAuthList.get(0).getIdentifier()); } } + //用智能助手发送消息 + robotService.addCommentRobotSend(userId,proTaskDetail); return commentInfo; } diff --git a/tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java b/tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java index a1eaa4b8..313df616 100644 --- a/tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java +++ b/tall/src/main/java/com/ccsens/tall/service/TaskSubTimeService.java @@ -12,6 +12,7 @@ import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.TaskVo; import com.ccsens.tall.persist.dao.*; +import com.ccsens.tall.util.RobotUtil; import com.ccsens.util.CodeEnum; import com.ccsens.util.WebConstant; import com.ccsens.util.cron.CronConstant; @@ -19,13 +20,17 @@ import com.ccsens.util.cron.NatureToDate; import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; @Slf4j @Service @@ -42,7 +47,7 @@ public class TaskSubTimeService implements ITaskSubTimeService { @Autowired private ProSubTimeMemberDao proSubTimeMemberDao; @Autowired - private TaskMemberDao taskMemberDao; + private IUserService userService; @Autowired private ProTaskDeliverPostLogDao proTaskDeliverPostLogDao; @Autowired @@ -54,6 +59,8 @@ public class TaskSubTimeService implements ITaskSubTimeService { @Autowired private IProMemberService proMemberService; @Autowired + private IProRoleService proRoleService; + @Autowired private IProTaskDetailService taskDetailService; @Autowired private IMessageService messageService; @@ -61,6 +68,8 @@ public class TaskSubTimeService implements ITaskSubTimeService { private IProLogService proLogService; @Autowired private Snowflake snowflake; + @Autowired + private IRobotService robotService; @Override public void saveProTaskSubTask(ProTaskSubTime proTaskSubTime) { @@ -162,8 +171,11 @@ public class TaskSubTimeService implements ITaskSubTimeService { } //返回的任务详细信息 TaskVo.NormalTask normalTask = taskDetailService.getTaskInfoByTaskId(currentUserId,taskDetail.getProjectId(),subTimeId.getId()); + //用智能助手发送消息 + robotService.finishTaskRobotSend(currentUserId,normalTask.getProjectId(),normalTask.getProjectName(),normalTask.getName(),normalTask.getExecutorRole(),completedStatus); return normalTask; } + /** * 该成员是否完成了此任务(返回成员对任务的完成情况) */ @@ -290,8 +302,9 @@ public class TaskSubTimeService implements ITaskSubTimeService { detail.setParentId(addTask.getParentTaskId()); detail.setExecutorRole(addTask.getExecutorId()); + SysProject project = null; if(ObjectUtil.isNotNull(addTask.getProjectId())){ - SysProject project = sysProjectDao.selectByPrimaryKey(addTask.getProjectId()); + project = sysProjectDao.selectByPrimaryKey(addTask.getProjectId()); if (ObjectUtil.isNotNull(project)) { detail.setProjectId(addTask.getProjectId()); detail.setBeginTime(project.getBeginTime()); @@ -330,7 +343,6 @@ public class TaskSubTimeService implements ITaskSubTimeService { } taskDetailDao.insertSelective(detail); if(ObjectUtil.isNotNull(addTask.getProjectId())){ - SysProject project = sysProjectDao.selectByPrimaryKey(addTask.getProjectId()); if(ObjectUtil.isNotNull(project)) { if (detail.getBeginTime() < project.getBeginTime()) { project.setBeginTime(detail.getBeginTime()); @@ -372,7 +384,7 @@ public class TaskSubTimeService implements ITaskSubTimeService { } } //交付物 - if(ObjectUtil.isNotNull(addTask.getTaskDeliver())){ + if(StrUtil.isNotEmpty(addTask.getTaskDeliver())){ ProTaskDeliver deliver = new ProTaskDeliver(); deliver.setId(snowflake.nextId()); deliver.setTaskDetailId(detail.getId()); @@ -400,9 +412,12 @@ public class TaskSubTimeService implements ITaskSubTimeService { if(ObjectUtil.isNotNull(taskDetail)) { taskDetailService.managePlugin(currentUserId, detail.getExecutorRole(), taskDetail); } + //通过智能助手发送通知 + robotService.addTaskRobotSend(currentUserId,project,addTask.getTaskName(),addTask.getExecutorId()); return taskDetail; } + /** * 清空项目下所有任务的实际开始结束时间,和运行状态 * @param projectId diff --git a/tall/src/main/java/com/ccsens/tall/service/UserService.java b/tall/src/main/java/com/ccsens/tall/service/UserService.java index b91c063a..daca9f61 100644 --- a/tall/src/main/java/com/ccsens/tall/service/UserService.java +++ b/tall/src/main/java/com/ccsens/tall/service/UserService.java @@ -1533,4 +1533,12 @@ public class UserService implements IUserService { account.setUsername(accountAuth.getIdentifier()); return account; } + + /** + * 通过userId获取用户名 + */ + @Override + public String getUserNameByUserId(Long userId) { + return userDao.getUserNameByUserId(userId); + } } diff --git a/tall/src/main/java/com/ccsens/tall/service/WbsSubSheetService.java b/tall/src/main/java/com/ccsens/tall/service/WbsSubSheetService.java index fdb795c2..daecfc3f 100644 --- a/tall/src/main/java/com/ccsens/tall/service/WbsSubSheetService.java +++ b/tall/src/main/java/com/ccsens/tall/service/WbsSubSheetService.java @@ -19,7 +19,6 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.sql.Struct; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -49,6 +48,12 @@ public class WbsSubSheetService implements IWbsSubSheetService { private ProPluginConfigDao proPluginConfigDao; @Autowired private SysRobotDao sysRobotDao; + @Autowired + private SysProjectRobotDao sysProjectRobotDao; + @Autowired + private SysMessageTypeDao sysMessageTypeDao; + @Autowired + private SysProjectRobotMessageDao projectRobotMessageDao; /** * 读取子任务表 @@ -462,13 +467,17 @@ public class WbsSubSheetService implements IWbsSubSheetService { */ @Override public void getRoBotSheet(Long projectId, XSSFWorkbook xssfWorkbook) { - XSSFSheet robotSheet = xssfWorkbook.getSheet("插件配置"); + XSSFSheet robotSheet = xssfWorkbook.getSheet("智能助手"); if(ObjectUtil.isNotNull(robotSheet)){ for (int i = 1; i <= robotSheet.getLastRowNum(); i++) { + //机器人与项目关联信息的id + Long projectRobotId = null; String robotName = ExcelUtil.getCellValue(robotSheet.getRow(i).getCell(0)); String webHookPath = ExcelUtil.getCellValue(robotSheet.getRow(i).getCell(1)); String messageType = ExcelUtil.getCellValue(robotSheet.getRow(i).getCell(2)); + String robotType = ExcelUtil.getCellValue(robotSheet.getRow(i).getCell(3)); if(StrUtil.isNotEmpty(webHookPath)){ + //添加机器人并关联项目 SysRobotExample sysRobotExample = new SysRobotExample(); sysRobotExample.createCriteria().andWebHookEqualTo(webHookPath); List sysRobotList = sysRobotDao.selectByExample(sysRobotExample); @@ -478,8 +487,50 @@ public class WbsSubSheetService implements IWbsSubSheetService { sysProjectRobot.setId(snowflake.nextId()); sysProjectRobot.setRobotId(sysRobot.getId()); sysProjectRobot.setProjectId(projectId); + sysProjectRobotDao.insertSelective(sysProjectRobot); + projectRobotId = sysProjectRobot.getId(); }else { - + SysRobot sysRobot = new SysRobot(); + sysRobot.setId(snowflake.nextId()); + sysRobot.setName(robotName); + sysRobot.setWebHook(webHookPath); + sysRobot.setClientType(Byte.valueOf(robotType)); + sysRobotDao.insertSelective(sysRobot); + SysProjectRobot sysProjectRobot = new SysProjectRobot(); + sysProjectRobot.setId(snowflake.nextId()); + sysProjectRobot.setRobotId(sysRobot.getId()); + sysProjectRobot.setProjectId(projectId); + sysProjectRobotDao.insertSelective(sysProjectRobot); + projectRobotId = sysProjectRobot.getId(); + } + } + if(ObjectUtil.isNotNull(projectRobotId)){ + //将机器人关联接口 + if(StrUtil.isNotEmpty(messageType) && !"全部".equalsIgnoreCase(messageType)){ + messageType = StringUtil.replaceComma(messageType); + String[] messages = messageType.split(","); + for(int a = 0; a < messages.length; a++){ + SysMessageTypeExample sysMessageTypeExample = new SysMessageTypeExample(); + sysMessageTypeExample.createCriteria().andNameEqualTo(messages[a]); + List sysMessageTypeList = sysMessageTypeDao.selectByExample(sysMessageTypeExample); + if(CollectionUtil.isNotEmpty(sysMessageTypeList)){ + SysMessageType sysMessageType = sysMessageTypeList.get(0); + SysProjectRobotMessage sysProjectRobotMessage = new SysProjectRobotMessage(); + sysProjectRobotMessage.setId(snowflake.nextId()); + sysProjectRobotMessage.setProjectRobotId(projectRobotId); + sysProjectRobotMessage.setOperateType(sysMessageType.getOperateType()); + sysProjectRobotMessage.setAllMessage((byte) 0); + projectRobotMessageDao.insertSelective(sysProjectRobotMessage); + }else { + throw new BaseException(CodeEnum.NOT_MESSAGE_TYPE.addMsg(robotSheet.getSheetName() + i)); + } + } + }else { + SysProjectRobotMessage sysProjectRobotMessage = new SysProjectRobotMessage(); + sysProjectRobotMessage.setId(snowflake.nextId()); + sysProjectRobotMessage.setProjectRobotId(projectRobotId); + sysProjectRobotMessage.setAllMessage((byte) 1); + projectRobotMessageDao.insertSelective(sysProjectRobotMessage); } } } diff --git a/tall/src/main/java/com/ccsens/tall/util/RobotUtil.java b/tall/src/main/java/com/ccsens/tall/util/RobotUtil.java new file mode 100644 index 00000000..d8c799cb --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/util/RobotUtil.java @@ -0,0 +1,71 @@ +package com.ccsens.tall.util; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class RobotUtil { + + @Data + public static class Message{ + private String msgType = "text"; + private List mentionedList = new ArrayList<>(); + private List mentionedMobileList = new ArrayList<>(); + private boolean isAtAll = false; + private Long projectId; + private List params = new ArrayList<>(); + + public Message(){ + } + + public Message(String msgType,Long projectId){ + this.msgType = msgType; + this.projectId = projectId; + } + + public Message(Long projectId){ + this.projectId = projectId; + } + + public void appendMentionedList(String... mentionedList){ + if(mentionedList == null || mentionedList.length == 0){ + return; + } + this.mentionedList.addAll(Arrays.asList(mentionedList)); + } + + public void appendMentionedMobileList(String... mentionedMobileList){ + if(mentionedMobileList == null || mentionedMobileList.length == 0){ + return; + } + this.mentionedMobileList.addAll(Arrays.asList(mentionedMobileList)); + } + + public void appendParams(String... params){ + if(params == null || params.length == 0){ + return; + } + this.params.addAll(Arrays.asList(params)); + } + + } + + static final ThreadLocal robotThreadLocal = new ThreadLocal(); + + public static Message get() { + return robotThreadLocal.get(); + } + + public static void set(Message message) { + robotThreadLocal.set(message); + } + + public static void del() { + robotThreadLocal.remove(); + } + + + +} diff --git a/tall/src/main/java/com/ccsens/tall/util/TallConstant.java b/tall/src/main/java/com/ccsens/tall/util/TallConstant.java new file mode 100644 index 00000000..3d20a301 --- /dev/null +++ b/tall/src/main/java/com/ccsens/tall/util/TallConstant.java @@ -0,0 +1,17 @@ +package com.ccsens.tall.util; + +/** + * @author 逗 + */ +public class TallConstant { + + /** + * 接口发送的信息模板 + * @param operateType 接口code + * @return + */ + public static String getRobotTemplateKey(int operateType) { + return "operate_type_" + operateType; + } + +} diff --git a/tall/src/main/java/com/ccsens/tall/web/DeliverController.java b/tall/src/main/java/com/ccsens/tall/web/DeliverController.java index c96a0c8a..1af36fba 100644 --- a/tall/src/main/java/com/ccsens/tall/web/DeliverController.java +++ b/tall/src/main/java/com/ccsens/tall/web/DeliverController.java @@ -7,6 +7,7 @@ import com.ccsens.tall.service.ITaskDeliverService; import com.ccsens.util.JsonResponse; import com.ccsens.util.UploadFileUtil_Servlet3; import com.ccsens.util.WebConstant; +import com.ccsens.util.annotation.OperateType; import io.jsonwebtoken.Claims; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +44,7 @@ public class DeliverController { return JsonResponse.newInstance().ok(dFile); } + @OperateType(value = 7) @ApiOperation(value = "上传交付物信息", notes = "") @ApiImplicitParams({ }) @@ -94,6 +96,7 @@ public class DeliverController { return JsonResponse.newInstance().ok(deliverInfo); } + @OperateType(value = 9) @ApiOperation(value = "检查人评价交付物",notes = "") @ApiImplicitParams({ }) @@ -127,6 +130,7 @@ public class DeliverController { return JsonResponse.newInstance().ok(deliverFileList); } + @OperateType(value = 8) @ApiOperation(value = "删除交付物",notes = "") @ApiImplicitParams({ @ApiImplicitParam(name="deliverId",value = "交付物Id",required = true,paramType = "query",dataType="String"), diff --git a/tall/src/main/java/com/ccsens/tall/web/TaskController.java b/tall/src/main/java/com/ccsens/tall/web/TaskController.java index f6d45c1f..1177cf84 100644 --- a/tall/src/main/java/com/ccsens/tall/web/TaskController.java +++ b/tall/src/main/java/com/ccsens/tall/web/TaskController.java @@ -7,6 +7,7 @@ import com.ccsens.tall.service.IProTaskDetailService; import com.ccsens.tall.service.ITaskSubTimeService; import com.ccsens.util.JsonResponse; import com.ccsens.util.WebConstant; +import com.ccsens.util.annotation.OperateType; import io.jsonwebtoken.Claims; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +26,7 @@ public class TaskController { @Autowired private IProTaskDetailService taskDetailService; + @OperateType(value = 6) @ApiOperation(value = "完成任务",notes = "") @ApiImplicitParams({ }) @@ -122,6 +124,7 @@ public class TaskController { //============================================================== + @OperateType(value = 3) @ApiOperation(value = "添加清单(任务)",notes = "") @ApiImplicitParams({ }) @@ -134,6 +137,7 @@ public class TaskController { return JsonResponse.newInstance().ok(normalTask); } + @OperateType(value = 4) @ApiOperation(value = "删除任务",notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "taskId", value = "任务id", required = true, paramType = "query") @@ -146,7 +150,7 @@ public class TaskController { return JsonResponse.newInstance().ok(); } - + @OperateType(value = 5) @ApiOperation(value = "修改任务信息",notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "taskId", value = "任务id", required = true, paramType = "query") diff --git a/tall/src/main/resources/application.yml b/tall/src/main/resources/application.yml index c88e995d..b2acd365 100644 --- a/tall/src/main/resources/application.yml +++ b/tall/src/main/resources/application.yml @@ -1,4 +1,4 @@ spring: profiles: - active: test - include: util-test,common + active: dev + include: util-dev,common diff --git a/tall/src/main/resources/mapper_dao/SysUserDao.xml b/tall/src/main/resources/mapper_dao/SysUserDao.xml index 4e33a7ff..2a575dcb 100644 --- a/tall/src/main/resources/mapper_dao/SysUserDao.xml +++ b/tall/src/main/resources/mapper_dao/SysUserDao.xml @@ -66,4 +66,19 @@ where user_id = #{oldUserId} + + \ No newline at end of file diff --git a/tall/src/main/resources/mapper_raw/SysProjectRobotMessageMapper.xml b/tall/src/main/resources/mapper_raw/SysProjectRobotMessageMapper.xml index 87cc4f09..8718e752 100644 --- a/tall/src/main/resources/mapper_raw/SysProjectRobotMessageMapper.xml +++ b/tall/src/main/resources/mapper_raw/SysProjectRobotMessageMapper.xml @@ -4,7 +4,7 @@ - + @@ -69,7 +69,7 @@ - id, project_robot_id, message_id, all_message, created_at, updated_at, rec_status + id, project_robot_id, operate_type, all_message, created_at, updated_at, rec_status