Browse Source

事件管理_立项、转需求

dev
sunyuchao 3 years ago
parent
commit
820f558278
  1. 3
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcDemandFormDTO.java
  2. 2
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcEventAddEditFormDTO.java
  3. 110
      epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcEventToProjectFormDTO.java
  4. 29
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/IcEventController.java
  5. 16
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/IcEventService.java
  6. 6
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java
  7. 58
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/IcEventServiceImpl.java
  8. 230
      epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java

3
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcDemandFormDTO.java

@ -30,6 +30,9 @@ public class IcDemandFormDTO implements Serializable {
public interface UpdateInternalGroup {
}
@NotBlank(message = "事件id不能为空",groups = AddInternalGroup.class)
private String icEventId;
@NotBlank(message = "需求id不能为空",groups = UpdateInternalGroup.class)
private String demandRecId;

2
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcEventAddEditFormDTO.java

@ -92,7 +92,7 @@ public class IcEventAddEditFormDTO implements Serializable {
/**
* 立项接口入参对象
*/
private EventToProjectFormDTO project;
private IcEventToProjectFormDTO project;
/**
* 转需求接口入参对象
*/

110
epmet-module/gov-project/gov-project-client/src/main/java/com/epmet/dto/form/IcEventToProjectFormDTO.java

@ -0,0 +1,110 @@
package com.epmet.dto.form;
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.List;
/**
* 事件管理-立项
*
* @author sun
*/
@Data
public class IcEventToProjectFormDTO implements Serializable {
private static final long serialVersionUID = 3392008990676159012L;
public interface AddUserInternalGroup {
}
public interface ApprovalCategory extends CustomerClientShowGroup {
}
/**
* 事件id
*/
@NotBlank(message = "事件id不能为空", groups = AddUserInternalGroup.class)
private String icEventId;
/**
* 项目方案 1000
*/
@Length(min = 1, max = 1000, message = "项目方案1000字", groups = {ApprovalCategory.class})
private String publicReply;
/**
* 内部备注 1000
* 21.08.09 直接立项的内部备注是必填的然后议题转项目和我要直报转项目的都是非必填的
*/
//@Length(min = 1, max = 1000, message = "内部备注1000字", groups = {ApprovalCategory.class})
private String internalRemark;
/**
* 吹哨勾选的工作人员信息集合,不可为空
*/
@Valid
private List<TickStaffFormDTO> staffList;
/**
* 项目所选分类集合不可为空
*/
@Valid
private List<CategoryOrTagFormDTO> categoryList;
/**
* 项目所选标签集合
*/
private List<CategoryOrTagFormDTO> tagList;
@Length(min = 1, max = 20, message = "项目标题不能超过20位", groups = {ApprovalCategory.class})
private String title;
/**
* 公开答复对应文件集合
*/
private List<FileDTO> publicFile;
/**
* 内部备注对应文件集合
*/
private List<FileDTO> internalFile;
//定位地址[立项项目指的项目发生位置,议题转的项目指的话题发生位置]
private String locateAddress;
//定位经度
private String locateLongitude;
//定位纬度
private String locateDimension;
//以下参数从token中获取
/**
* 当前用户id
*/
@NotBlank(message = "userId不能为空",groups = AddUserInternalGroup.class)
private String userId;
/**
* 当前客户id
*/
@NotBlank(message = "customerId不能为空",groups = AddUserInternalGroup.class)
private String customerId;
private String app;
private String client;
/**
* 网格id
*/
@NotBlank(message = "网格id不能为空", groups = AddUserInternalGroup.class)
private String gridId;
/**
* 协办单位ID
*/
private String assistanceUnitId;
/**
* 协办单位类型1社区自组织2联建单位
*/
private String assistanceUnitType;
}

29
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/controller/IcEventController.java

@ -14,6 +14,7 @@ import com.epmet.commons.tools.validator.group.DefaultGroup;
import com.epmet.commons.tools.validator.group.UpdateGroup;
import com.epmet.dto.IcEventDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.form.demand.ReportDemandFormDTO;
import com.epmet.dto.result.IcEventListResultDTO;
import com.epmet.dto.result.IcEventMonthlyIncrementResultDTO;
import com.epmet.dto.result.IcEventResultDTO;
@ -153,6 +154,34 @@ public class IcEventController {
return new Result();
}
/**
* @Author sun
* @Description 事件管理-立项
**/
@PostMapping("icEventToProject")
public Result icEventToProject(@LoginUser TokenDto tokenDto, @RequestBody IcEventToProjectFormDTO formDTO){
formDTO.setCustomerId(tokenDto.getCustomerId());
formDTO.setUserId(tokenDto.getUserId());
formDTO.setApp(tokenDto.getApp());
formDTO.setClient(tokenDto.getClient());
ValidatorUtils.validateEntity(formDTO,IcEventToProjectFormDTO.ApprovalCategory.class,IcEventToProjectFormDTO.AddUserInternalGroup.class);
icEventService.icEventToProject(formDTO);
return new Result();
}
/**
* @Author sun
* @Description 事件管理-转需求
**/
@PostMapping("icEventToDemand")
public Result icEventToDemand(@LoginUser TokenDto tokenDto, @RequestBody IcDemandFormDTO formDTO){
formDTO.setCustomerId(tokenDto.getCustomerId());
formDTO.setDemandUserId(tokenDto.getUserId());
ValidatorUtils.validateEntity(formDTO, IcDemandFormDTO.Add.class,IcDemandFormDTO.AddInternalGroup.class);
icEventService.icEventToDemand(formDTO);
return new Result();
}
}

16
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/IcEventService.java

@ -3,9 +3,7 @@ package com.epmet.service;
import com.epmet.commons.mybatis.service.BaseService;
import com.epmet.commons.tools.page.PageData;
import com.epmet.dto.IcEventDTO;
import com.epmet.dto.form.IcEventAddEditFormDTO;
import com.epmet.dto.form.IcEventListFormDTO;
import com.epmet.dto.form.IcEventReplyFormDTO;
import com.epmet.dto.form.*;
import com.epmet.dto.result.IcEventListResultDTO;
import com.epmet.dto.result.IcEventMonthlyIncrementResultDTO;
import com.epmet.dto.result.IcEventResultDTO;
@ -106,4 +104,16 @@ public interface IcEventService extends BaseService<IcEventEntity> {
* @Description 事件管理-回复
**/
void reply(IcEventReplyFormDTO formDTO);
/**
* @Author sun
* @Description 事件管理-立项
**/
void icEventToProject(IcEventToProjectFormDTO formDTO);
/**
* @Author sun
* @Description 事件管理-转需求
**/
void icEventToDemand(IcDemandFormDTO formDTO);
}

6
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/ProjectTraceService.java

@ -205,4 +205,10 @@ public interface ProjectTraceService {
* @Date 2022/1/4 15:33
*/
void approvaledListExport(HttpServletResponse response, ApprovaledListFromDTO formDTO);
/**
* 事件管理-事件立项
* @author sun
*/
EventToProjectResultDTO icEventToProject(IcEventToProjectFormDTO formDTO);
}

58
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/IcEventServiceImpl.java

@ -208,7 +208,7 @@ public class IcEventServiceImpl extends BaseServiceImpl<IcEventDao, IcEventEntit
//2.判断是否立项或转需求
//2-1.项目立项
if (StringUtils.isNotBlank(formDTO.getOperationType()) && "1".equals(formDTO.getOperationType())) {
EventToProjectResultDTO project = projectTraceService.eventToProject(formDTO.getProject());
EventToProjectResultDTO project = projectTraceService.icEventToProject(formDTO.getProject());
formDTO.setOperationId(project.getProjectId());
}
//2-2.转需求
@ -581,4 +581,60 @@ public class IcEventServiceImpl extends BaseServiceImpl<IcEventDao, IcEventEntit
}
/**
* @Author sun
* @Description 事件管理-立项
**/
@Override
@Transactional(rollbackFor = Exception.class)
public void icEventToProject(IcEventToProjectFormDTO formDTO) {
//1.查询事件数据
IcEventEntity entity = baseDao.selectById(formDTO.getIcEventId());
if (null == entity || "1".equals(entity.getOperationType()) || "2".equals(entity.getOperationType())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "当前事件不允许立项");
}
//2.调用事件立项接口
EventToProjectResultDTO project = projectTraceService.icEventToProject(formDTO);
//3.更新事件数据
entity.setOperationType("1");
entity.setOperationId(project.getProjectId());
entity.setLatestOperatedTime(new Date());
baseDao.updateById(entity);
//4.新增操作记录
IcEventOperationLogEntity logEntity = logEntity(formDTO.getCustomerId(), formDTO.getIcEventId(), formDTO.getUserId(), new Date(), "shift_project", "shift_project");
icEventOperationLogService.insert(logEntity);
}
/**
* @Author sun
* @Description 事件管理-转需求
**/
@Override
public void icEventToDemand(IcDemandFormDTO formDTO) {
//1.查询事件数据
IcEventEntity entity = baseDao.selectById(formDTO.getIcEventId());
if (null == entity || "1".equals(entity.getOperationType()) || "2".equals(entity.getOperationType())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "当前事件不允许转需求");
}
//2.调用转需求接口
Result<DemandRecId> recIdResult = epmetHeartOpenFeignClient.icEventToDemand(formDTO);
if (!recIdResult.success() || recIdResult.getData() == null) {
throw new RenException(recIdResult.getCode(), recIdResult.getMsg());
}
//3.更新事件数据
entity.setOperationType("2");
entity.setOperationId(recIdResult.getData().getDemandRecId());
entity.setLatestOperatedTime(new Date());
baseDao.updateById(entity);
//4.新增操作记录
IcEventOperationLogEntity logEntity = logEntity(formDTO.getCustomerId(), formDTO.getIcEventId(), formDTO.getDemandUserId(), new Date(), "shift_demand", "shift_demand");
icEventOperationLogService.insert(logEntity);
}
}

230
epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectTraceServiceImpl.java

@ -1225,4 +1225,234 @@ public class ProjectTraceServiceImpl<ProjectTagService> implements ProjectTraceS
epmetMessageOpenFeignClient.saveUserMessage(userMessage);
}
/**
* 事件管理-事件立项赶时间没空兼容
* @author sun
*/
@Override
public EventToProjectResultDTO icEventToProject(IcEventToProjectFormDTO formDTO) {
//判断是否存在已立项
List<ProjectEntity> projectEntityList = projectService.getByOriginId(formDTO.getIcEventId());
if (!CollectionUtils.isEmpty(projectEntityList)) {
throw new RenException(EpmetErrorCode.RESI_EVENT_SHIFT_PROJECT.getCode(), EpmetErrorCode.RESI_EVENT_SHIFT_PROJECT.getMsg());
}
List<TickStaffFormDTO> staffList = formDTO.getStaffList();
//1.文字内容安全校验
List<String> list = new ArrayList<>();
list.add(formDTO.getTitle());
list.add(formDTO.getPublicReply());
list.add(formDTO.getPublicReply());
list.add(formDTO.getInternalRemark());
safetyCheck(list);
//2.数据准备
//2-1获取当前工作人员基本信息
EventToProjectFormDTO eventToProjectFormDTO = ConvertUtils.sourceToTarget(formDTO, EventToProjectFormDTO.class);
LoginUserDetailsResultDTO loginUser = queryLoginUserInfo(eventToProjectFormDTO);
//2-2.调用gov-org服务,获取所有勾选人员以及议题数据对应的组织信息、部门信息、网格信息用于对处理部门和ORG_ID_PATH字段的赋值使用
AgencyDeptGridResultDTO agencyDeptGrid = getAgencyDeptGridRes(formDTO.getStaffList(), loginUser.getAgencyId());
//2-3.调用issue服务,查询分类、标签数据信息
CategoryTagResultDTO categoryTagResultDTO = queryCategoryTagRes(eventToProjectFormDTO);
List<IssueProjectCategoryDictDTO> categoryList = categoryTagResultDTO.getCategoryList();
List<IssueProjectTagDictDTO> tagList = categoryTagResultDTO.getTagList();
//2-4.批量查询被勾选工作人员基础信息
List<StaffListResultDTO> staffInfoList = queryStaffListRes(formDTO.getStaffList(), formDTO.getUserId());
//3.封装保存业务数据
//3-1.项目主表新增数据
ProjectEntity projectEntity = new ProjectEntity();
projectEntity.setCustomerId(formDTO.getCustomerId());
//立项人的所属组织id
projectEntity.setAgencyId(loginUser.getAgencyId());
projectEntity.setOrigin("ic_event");
projectEntity.setOriginId(formDTO.getIcEventId());
projectEntity.setTitle(formDTO.getTitle());
projectEntity.setBackGround(formDTO.getPublicReply());
projectEntity.setGridId(formDTO.getGridId());
projectEntity.setStatus(ProjectConstant.PENDING);
projectEntity.setOrgIdPath(loginUser.getOrgIdPath());
projectEntity.setLocateAddress(null == formDTO.getLocateAddress() ? "" : formDTO.getLocateAddress());
projectEntity.setLocateLongitude(null == formDTO.getLocateLongitude() ? "" : formDTO.getLocateLongitude());
projectEntity.setLocateDimension(null == formDTO.getLocateDimension() ? "" : formDTO.getLocateDimension());
projectService.insert(projectEntity);
//3-2.项目进展表新增第一个节点数据
ProjectProcessEntity processEntity = new ProjectProcessEntity();
processEntity.setProjectId(projectEntity.getId());
processEntity.setCustomerId(formDTO.getCustomerId());
processEntity.setStaffId(formDTO.getUserId());
processEntity.setOperation(ProjectConstant.OPERATION_CREATED);
processEntity.setOperationName(ProjectConstant.OPERATION_PROJECT_APPROVAL);
processEntity.setPublicReply(formDTO.getPublicReply());
processEntity.setInternalRemark(formDTO.getInternalRemark());
processEntity.setAssistanceUnitId(formDTO.getAssistanceUnitId());
processEntity.setAssistanceUnitType(formDTO.getAssistanceUnitType());
agencyDeptGrid.getAgencyList().forEach(agency -> {
if (loginUser.getAgencyId().equals(agency.getId())) {
processEntity.setDepartmentName(agency.getOrganizationName());
processEntity.setAgencyId(agency.getId());
if (org.apache.commons.lang3.StringUtils.isBlank(agency.getPids()) || org.apache.commons.lang3.StringUtils.equals(NumConstant.ZERO_STR, agency.getPids().trim()) || "".equals(agency.getPids().trim())) {
processEntity.setOrgIdPath(agency.getId());
} else {
processEntity.setOrgIdPath(agency.getPids().concat(":").concat(agency.getId()));
}
}
});
projectProcessService.insert(processEntity);
//3-3.项目人员表批量新增数据
List<ProjectStaffEntity> entityList = new ArrayList<>();
staffList.forEach(ts -> {
ProjectStaffEntity entity = ConvertUtils.sourceToTarget(ts, ProjectStaffEntity.class);
entity.setOrgId(ts.getAgencyId());
entity.setProjectId(projectEntity.getId());
entity.setProcessId(processEntity.getId());
entity.setIsHandle(ProjectConstant.UNHANDLED);
agencyDeptGrid.getAgencyList().forEach(agency -> {
if (ts.getAgencyId().equals(agency.getId())) {
entity.setCustomerId(agency.getCustomerId());
entity.setOrgIdPath(("".equals(agency.getPids()) ? "" : agency.getPids() + ":") + agency.getId());
entity.setDepartmentName(agency.getOrganizationName());
}
});
if (org.apache.commons.lang3.StringUtils.isNotBlank(ts.getDepartmentId())) {
agencyDeptGrid.getDeptList().forEach(dept -> {
if (ts.getDepartmentId().equals(dept.getId())) {
entity.setDepartmentName(entity.getDepartmentName() + "-" + dept.getDepartmentName());
}
});
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(ts.getGridId())) {
agencyDeptGrid.getGridList().forEach(grid -> {
if (ts.getGridId().equals(grid.getId())) {
entity.setDepartmentName(entity.getDepartmentName() + "-" + grid.getGridName());
}
});
}
entityList.add(entity);
});
projectStaffService.insertBatch(entityList);
//3-4.项目附件表新增数据
if ((null != formDTO.getPublicFile() && formDTO.getPublicFile().size() > NumConstant.ZERO)
|| (null != formDTO.getInternalFile() && formDTO.getInternalFile().size() > NumConstant.ZERO)) {
projectService.saveFile(formDTO.getPublicFile(), formDTO.getInternalFile(), formDTO.getCustomerId(), projectEntity.getId(), processEntity.getId());
}
//3-5.项目分类表新增数据
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(formDTO.getCategoryList())) {
List<ProjectCategoryEntity> categoryEntityList = new ArrayList<>();
formDTO.getCategoryList().forEach(item -> {
categoryList.forEach(ca -> {
if (item.getId().equals(ca.getId())) {
ProjectCategoryEntity entity = new ProjectCategoryEntity();
entity.setCustomerId(formDTO.getCustomerId());
entity.setProjectId(projectEntity.getId());
entity.setCategoryId(item.getId());
entity.setCategoryPids(ca.getPids());
entity.setCategoryCode(ca.getCategoryCode());
entity.setGridId(formDTO.getGridId());
categoryEntityList.add(entity);
}
});
});
projectCategoryService.insertBatch(categoryEntityList);
}
//3-6.项目标签表新增数据
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(formDTO.getTagList())) {
List<ProjectTagsEntity> tagEntityList = new ArrayList<>();
formDTO.getTagList().forEach(item -> {
tagList.forEach(ta -> {
if (item.getId().equals(ta.getId())) {
ProjectTagsEntity entity = new ProjectTagsEntity();
entity.setCustomerId(formDTO.getCustomerId());
entity.setProjectId(projectEntity.getId());
entity.setTagId(item.getId());
entity.setTagName(ta.getTagName());
tagEntityList.add(entity);
}
});
});
projectTagsService.insertBatch(tagEntityList);
}
//3-7:初始化机关-项目时间关联数据
Date current = new Date();
List<String> projectStaffIds = entityList.stream().map(ProjectStaffEntity::getId).distinct().collect(Collectors.toList());
if (!org.apache.commons.collections4.CollectionUtils.isEmpty(projectStaffIds)) {
List<ProjectOrgRelationEntity> container = new LinkedList<>();
projectStaffIds.forEach(o -> {
ProjectOrgRelationEntity period = new ProjectOrgRelationEntity();
period.setProjectStaffId(o);
period.setInformedDate(current);
period.setSourceOperation(ProjectConstant.OPERATION_CREATED);
period.setCreatedBy(formDTO.getUserId());
container.add(period);
});
relationDao.insertBatch(container);
}
//4.推送站内信、微信、短信消息
//4-1.调用epmet-message服务,给工作端勾选的工作人员发送消息
if (!shiftProjectMessage(formDTO.getStaffList(), formDTO.getCustomerId(), formDTO.getTitle(), projectEntity.getId()).success()) {
throw new RenException("事件转为项目,推送站内信失败");
}
//4-2.以及政府端调用epmet-message服务,给工作端工作人员推送微信订阅消息
if (!wxmpShiftProjectMessage(formDTO.getStaffList(), formDTO.getCustomerId(), formDTO.getTitle()).success()) {
logger.error("事件转为项目,推送微信订阅消息失败!");
}
//4-3.吹哨短信消息
List<ProjectSendMsgFormDTO> smsList = new ArrayList<>();
staffList.forEach(staff -> {
staffInfoList.forEach(st -> {
if (staff.getStaffId().equals(st.getStaffId())) {
ProjectSendMsgFormDTO sms = new ProjectSendMsgFormDTO();
sms.setCustomerId(st.getCustomerId());
sms.setMobile(st.getMobile());
sms.setAliyunTemplateCode(SmsTemplateConstant.PROJECT_TRANSFER);
sms.setParameterKey("send_msg");
smsList.add(sms);
}
});
});
Result result = epmetMessageOpenFeignClient.projectSendMsg(smsList);
if (!result.success()) {
logger.error("项目吹哨,发送手机短信失败" + JSON.toJSONString(result));
}
//5.项目实时统计消息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String mqMsgBrief = String.format("创建了\"%s\"的项目", formDTO.getTitle());
ProjectChangedMQMsg mqMsg = new ProjectChangedMQMsg(projectEntity.getCustomerId(), ProjectConstant.OPERATION_CREATED,
projectEntity.getId(),
formDTO.getUserId(),
new Date(),
mqMsgBrief,
IpUtils.getIpAddr(request),
loginUserUtil.getLoginUserApp(),
loginUserUtil.getLoginUserClient());
boolean msgResult = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendProjectChangedMqMsg(mqMsg);
if (!msgResult) {
log.error("项目实时统计消息发送失败");
}
// 数据上链
try {
blockChainUploadService.send2BlockChain(projectEntity, processEntity, entityList, null);
} catch (Exception e) {
String errorMsg = ExceptionUtils.getThrowableErrorStackTrace(e);
log.error("【项目流转】上链失败,错误信息:{}", errorMsg);
}
EventToProjectResultDTO resultDTO = new EventToProjectResultDTO();
resultDTO.setProjectId(projectEntity.getId());
return resultDTO;
}
}

Loading…
Cancel
Save