diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/FileDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/FileDTO.java new file mode 100644 index 0000000000..32b0bf76c8 --- /dev/null +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/FileDTO.java @@ -0,0 +1,42 @@ +package com.epmet.dto.form; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author zhaoqifeng + * @dscription + * @date 2020/12/21 15:37 + */ +@NoArgsConstructor +@Data +public class FileDTO implements Serializable { + + private static final long serialVersionUID = -5307959406648243353L; + /** + * 文件名 + */ + private String name; + /** + * url地址 + */ + private String url; + /** + * 文件类型(图片 - image、 视频 - video、 语音 - voice、 文档 - doc) + */ + private String type; + /** + * 后缀名 + */ + private String format; + /** + * 文件大小 kb + */ + private Integer size; + /** + * 语音或视频文件时长,单位秒 + */ + private Integer duration; +} diff --git a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/ProjectClosedFromDTO.java b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/ProjectClosedFromDTO.java index 4b9e9a5ff6..75cf13e64e 100644 --- a/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/ProjectClosedFromDTO.java +++ b/epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/ProjectClosedFromDTO.java @@ -5,6 +5,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import java.io.Serializable; +import java.util.List; /** * @author zhaoqifeng @@ -46,4 +47,12 @@ public class ProjectClosedFromDTO implements Serializable { * 部门名 */ private String departmentName; + /** + * 公开答复对应文件集合 + */ + private List publicFile; + /** + * 内部备注对应文件集合 + */ + private List internalFile; } diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectTraceController.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectTraceController.java index 582d4e6413..379e1b2965 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectTraceController.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/ProjectTraceController.java @@ -121,6 +121,13 @@ public class ProjectTraceController { return new Result(); } + @PostMapping("closeproject-v2") + @RequirePermission(requirePermission = RequirePermissionEnum.WORK_PROJECT_TRACE_CLOSE) + public Result closedV2(@LoginUser TokenDto tokenDto, @RequestBody ProjectClosedFromDTO fromDTO) { + projectTraceService.closedV2(tokenDto, fromDTO); + return new Result(); + } + /** * 可退回节点列表 * diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java index 03bb5fc584..3b6a01e5e4 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectService.java @@ -146,6 +146,15 @@ public interface ProjectService extends BaseService { */ void closed(ProjectClosedFromDTO fromDTO); + /** + * 项目结案 + * @author zhaoqifeng + * @date 2020/5/13 9:54 + * @param fromDTO 参数 + * @return void + */ + void closedV2(ProjectClosedFromDTO fromDTO); + /** * 项目退回 * @author zhaoqifeng diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java index d41408524c..88891a3a87 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java @@ -68,6 +68,17 @@ public interface ProjectTraceService { */ void closed(TokenDto tokenDto, ProjectClosedFromDTO fromDTO); + /** + * 项目结案 + * + * @param tokenDto token + * @param fromDTO 入参 + * @return com.epmet.commons.tools.utils.Result + * @author zhaoqifeng + * @date 2020/5/11 16:27 + */ + void closedV2(TokenDto tokenDto, ProjectClosedFromDTO fromDTO); + /** * 可退回节点列表 * diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java index 7334c73c39..23d446b1bf 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectServiceImpl.java @@ -102,6 +102,8 @@ public class ProjectServiceImpl extends BaseServiceImpl periodsToUpdate = relationDao.selectAllUnhandledProcess(fromDTO.getProjectId()); - //if(CollectionUtils.isEmpty(periodsToUpdate)){ - // log.error("com.epmet.service.impl.ProjectServiceImpl.closed,至少存在一条处理时间为空的项目节点耗时记录,但是没有找到,参数:{}",JSON.toJSONString(fromDTO)); - // throw new RenException("至少存在一条处理时间为空的项目节点耗时记录,但是没有找到"); - //} + ProjectOrgRelationEntity orientRelation = relationDao.selectByProjectStaffId(operatorProjectReference.getId()); + if(null == orientRelation){ + log.error("com.epmet.service.impl.ProjectServiceImpl.closed,找不到结案工作人员的节点耗时相关记录,参数:{}",JSON.toJSONString(fromDTO)); + throw new RenException("找不到结案工作人员的节点耗时相关记录"); + } + + Integer delta_t = calculateDelta_T(ProjectConstant.IMPRECISE_CALCULATION, + ProjectConstant.CALCULATION_TYPE_DEFAULT, operatorProjectReference.getId(),orientRelation.getInformedDate(),current); + + ProjectOrgRelationEntity carrier = new ProjectOrgRelationEntity(); + carrier.setProjectStaffId(operatorProjectReference.getId()); + carrier.setOperation(ProjectConstant.OPERATION_CLOSE); + carrier.setTotalPeriod(delta_t); + carrier.setHandledDate(current); + if(null == orientRelation.getFirstDealtDate()){ + carrier.setFirstReplyPeriod(delta_t); + carrier.setFirstDealtDate(current); + } + + relationDao.maintainTimePropertyConsistency(carrier); + + //通知 + List msgList = new ArrayList<>(); + //2020.10.26 添加项目结案发送微信订阅消息操作 sun + List wxmpMsgList = new ArrayList<>(); + //通知项目相关人员 + List personnelList = projectRelatedPersonnelService.getPersonnelListByProjectId(fromDTO.getProjectId()); + personnelList.forEach(p -> { + UserMessageFormDTO messageFormDTO = new UserMessageFormDTO(); + messageFormDTO.setCustomerId(projectEntity.getCustomerId()); + messageFormDTO.setApp(p.getApp()); + messageFormDTO.setGridId(p.getGridId()); + messageFormDTO.setUserId(p.getUserId()); + messageFormDTO.setTitle(UserMessageConstant.PROJECT_TITLE); + messageFormDTO.setMessageContent(String.format(UserMessageConstant.PROJECT_CLOSED_MSG, projectEntity.getTitle(), fromDTO.getPublicReply())); + messageFormDTO.setReadFlag(Constant.UNREAD); + msgList.add(messageFormDTO); + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(p.getApp()); + msg.setUserId(p.getUserId()); + msg.setBehaviorType("项目消息"); + msg.setMessageContent(String.format(UserMessageConstant.PROJECT_CLOSED_MSG, projectEntity.getTitle(), fromDTO.getPublicReply())); + msg.setMessageTime(new Date()); + msg.setGridId(p.getGridId()); + wxmpMsgList.add(msg); + }); + //通知项目关联的部门人员 + List staffList = projectStaffService.getStaffsByProjectId(fromDTO.getProjectId()); + staffList.add(projectEntity.getCreatedBy()); + staffList.stream().distinct().forEach(s -> { + UserMessageFormDTO messageFormDTO = new UserMessageFormDTO(); + messageFormDTO.setCustomerId(projectEntity.getCustomerId()); + messageFormDTO.setApp(ProjectConstant.GOV); + messageFormDTO.setGridId("*"); + messageFormDTO.setUserId(s); + messageFormDTO.setTitle(UserMessageConstant.PROJECT_TITLE); + messageFormDTO.setMessageContent(String.format(UserMessageConstant.PROJECT_CLOSED_MSG, projectEntity.getTitle(), fromDTO.getPublicReply())); + messageFormDTO.setReadFlag(Constant.UNREAD); + msgList.add(messageFormDTO); + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(AppClientConstant.APP_GOV); + msg.setUserId(s); + msg.setBehaviorType("项目消息"); + msg.setMessageContent(String.format(UserMessageConstant.PROJECT_CLOSED_MSG, projectEntity.getTitle(), fromDTO.getPublicReply())); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + wxmpMsgList.add(msg); + }); + messageFeignClient.saveUserMessageList(msgList); + //2020.10.26 发送微信订阅消息 sun + logger.info("项目结案,开始推送微信订阅消息"); + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(wxmpMsgList); + if (!result.success()) { + logger.error("项目结案成功,发送微信订阅消息失败" + JSON.toJSONString(result)); + } + } + + /** + * 项目结案 + * + * @param fromDTO 参数 + * @return void + * @author zhaoqifeng + * @date 2020/5/13 9:54 + */ + @Override + public void closedV2(ProjectClosedFromDTO fromDTO) { +//公开回复内容审核 + if (StringUtils.isNotBlank(fromDTO.getPublicReply())) { + TextScanParamDTO textScanParamDTO = new TextScanParamDTO(); + TextTaskDTO taskDTO = new TextTaskDTO(); + taskDTO.setDataId(UUID.randomUUID().toString().replace("-", "")); + taskDTO.setContent(fromDTO.getPublicReply()); + textScanParamDTO.getTasks().add(taskDTO); + Result textSyncScanResult = ScanContentUtils.textSyncScan(scanApiUrl.concat(textSyncScanMethod), textScanParamDTO); + if (!textSyncScanResult.success()) { + throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); + } else { + if (!textSyncScanResult.getData().isAllPass()) { + throw new RenException(EpmetErrorCode.TEXT_SCAN_FAILED.getCode()); + } + } + } + //更新项目表状态 + ProjectEntity projectEntity = baseDao.selectById(fromDTO.getProjectId()); + if (ProjectConstant.CLOSED.equals(projectEntity.getStatus())) { + throw new RenException(EpmetErrorCode.PROJECT_IS_CLOSED.getCode()); + } - //List intervalList = new LinkedList<>(); - //periodsToUpdate.forEach(local -> { - // TimestampIntervalFormDTO obj = new TimestampIntervalFormDTO(); - // obj.setId(local.getProjectStaffId()); - // obj.setLeft(local.getInformedDate()); - // obj.setRight(current); - // intervalList.add(obj); - //}); + Date current = new Date(); + projectEntity.setStatus(ProjectConstant.CLOSED); + projectEntity.setClosedStatus(fromDTO.getClosedStatus()); + baseDao.updateById(projectEntity); + //更新项目关联表 + ProjectStaffEntity projectStaffEntity = new ProjectStaffEntity(); + projectStaffEntity.setId(fromDTO.getProjectStaffId()); + projectStaffEntity.setIsHandle(ProjectConstant.HANDLE); + projectStaffService.updateById(projectStaffEntity); + + //查询结案人员的信息 + ProjectStaffEntity operatorProjectReference = projectStaffService.selectById(fromDTO.getProjectStaffId()); + if(null == operatorProjectReference){ + log.error("com.epmet.service.impl.ProjectServiceImpl.closed,找不到结案工作人员的相关记录,参数:{}",JSON.toJSONString(fromDTO)); + throw new RenException("找不到结案工作人员的相关记录"); + } + + //结案记录加入项目进展表 + ProjectProcessEntity projectProcessEntity = new ProjectProcessEntity(); + projectProcessEntity.setProjectId(fromDTO.getProjectId()); + projectProcessEntity.setCustomerId(operatorProjectReference.getCustomerId()); + projectProcessEntity.setDepartmentName(fromDTO.getDepartmentName()); + projectProcessEntity.setAgencyId(operatorProjectReference.getOrgId()); + projectProcessEntity.setGridId(operatorProjectReference.getGridId()); + projectProcessEntity.setDepartmentId(operatorProjectReference.getDepartmentId()); + projectProcessEntity.setOrgIdPath(operatorProjectReference.getOrgIdPath()); + projectProcessEntity.setEndTime(new Date()); + projectProcessEntity.setOperation(ProjectConstant.OPERATION_CLOSE); + projectProcessEntity.setOperationName(ProjectConstant.OPERATION_CLOSE_NAME); + projectProcessEntity.setPublicReply(fromDTO.getPublicReply()); + projectProcessEntity.setInternalRemark(fromDTO.getInternalRemark()); + projectProcessEntity.setStaffId(fromDTO.getUserId()); + ProjectDTO projectDto = ConvertUtils.sourceToTarget(projectEntity, ProjectDTO.class); + projectDto.setUpdatedTime(projectDto.getCreatedTime()); + projectProcessEntity.setCostWorkdays(getDetentionDays(projectDto)); + projectProcessService.insert(projectProcessEntity); + + //保存附件 + saveFile(fromDTO.getPublicFile(), fromDTO.getInternalFile(), operatorProjectReference.getCustomerId(), fromDTO.getProjectId(), + projectProcessEntity.getId()); ProjectOrgRelationEntity orientRelation = relationDao.selectByProjectStaffId(operatorProjectReference.getId()); if(null == orientRelation){ @@ -1422,4 +1560,56 @@ public class ProjectServiceImpl extends BaseServiceImpl publicFile, List internalFile, String customerId, String projectId, String processId) { + if (CollectionUtils.isNotEmpty(internalFile)) { + int i = 0; + List list = new ArrayList<>(); + for (FileDTO item : internalFile) { + ProjectProcessAttachmentEntity entity = new ProjectProcessAttachmentEntity(); + entity.setCustomerId(customerId); + entity.setProjectId(projectId); + entity.setProcessId(processId); + entity.setFilePlace("internal"); + entity.setFileName(item.getName()); + entity.setAttachmentName(""); + entity.setAttachmentSize(item.getSize()); + entity.setAttachmentFormat(item.getFormat()); + entity.setAttachmentType(item.getType()); + entity.setAttachmentUrl(item.getUrl()); + entity.setSort(i); + entity.setDuration(item.getDuration()); + entity.setIsRelease(NumConstant.ONE); + list.add(entity); + i++; + } + projectProcessAttachmentService.insertBatch(list); + } + + if (CollectionUtils.isNotEmpty(publicFile)) { + //TODO 内容安全检查 + int i = 0; + List list = new ArrayList<>(); + for (FileDTO item : publicFile) { + ProjectProcessAttachmentEntity entity = new ProjectProcessAttachmentEntity(); + entity.setCustomerId(customerId); + entity.setProjectId(projectId); + entity.setProcessId(processId); + entity.setFilePlace("public"); + entity.setFileName(item.getName()); + entity.setAttachmentName(""); + entity.setAttachmentSize(item.getSize()); + entity.setAttachmentFormat(item.getFormat()); + entity.setAttachmentType(item.getType()); + entity.setAttachmentUrl(item.getUrl()); + entity.setSort(i); + entity.setDuration(item.getDuration()); + entity.setIsRelease(NumConstant.ZERO); + list.add(entity); + i++; + } + projectProcessAttachmentService.insertBatch(list); + } + } } \ No newline at end of file diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java index d8ddde09ba..229bdd5a81 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java @@ -64,6 +64,21 @@ public class ProjectTraceServiceImpl implements ProjectTraceService { projectService.closed(fromDTO); } + /** + * 项目结案 + * + * @param tokenDto token + * @param fromDTO 入参 + * @return com.epmet.commons.tools.utils.Result + * @author zhaoqifeng + * @date 2020/5/11 16:27 + */ + @Override + public void closedV2(TokenDto tokenDto, ProjectClosedFromDTO fromDTO) { + fromDTO.setUserId(tokenDto.getUserId()); + projectService.closedV2(fromDTO); + } + @Override public List getReturnableList(ReturnListFromDTO fromDTO) { return projectProcessService.getReturnableList(fromDTO);