|
@ -9,7 +9,9 @@ import com.epmet.commons.rocketmq.messages.GroupAchievementMQMsg; |
|
|
import com.epmet.commons.tools.constant.AppClientConstant; |
|
|
import com.epmet.commons.tools.constant.AppClientConstant; |
|
|
import com.epmet.commons.tools.constant.FieldConstant; |
|
|
import com.epmet.commons.tools.constant.FieldConstant; |
|
|
import com.epmet.commons.tools.constant.NumConstant; |
|
|
import com.epmet.commons.tools.constant.NumConstant; |
|
|
|
|
|
import com.epmet.commons.tools.distributedlock.DistributedLock; |
|
|
import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; |
|
|
import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; |
|
|
|
|
|
import com.epmet.commons.tools.enums.AchievementTypeEnum; |
|
|
import com.epmet.commons.tools.enums.EventEnum; |
|
|
import com.epmet.commons.tools.enums.EventEnum; |
|
|
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|
|
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|
|
import com.epmet.commons.tools.exception.EpmetException; |
|
|
import com.epmet.commons.tools.exception.EpmetException; |
|
@ -41,7 +43,6 @@ import com.epmet.entity.IssueEntity; |
|
|
import com.epmet.entity.IssueProcessEntity; |
|
|
import com.epmet.entity.IssueProcessEntity; |
|
|
import com.epmet.entity.IssueProjectRelationEntity; |
|
|
import com.epmet.entity.IssueProjectRelationEntity; |
|
|
import com.epmet.feign.*; |
|
|
import com.epmet.feign.*; |
|
|
import com.epmet.commons.tools.enums.AchievementTypeEnum; |
|
|
|
|
|
import com.epmet.redis.GovIssueRedis; |
|
|
import com.epmet.redis.GovIssueRedis; |
|
|
import com.epmet.redis.IssueVoteDetailRedis; |
|
|
import com.epmet.redis.IssueVoteDetailRedis; |
|
|
import com.epmet.resi.group.dto.group.form.AllIssueFormDTO; |
|
|
import com.epmet.resi.group.dto.group.form.AllIssueFormDTO; |
|
@ -62,6 +63,7 @@ import com.epmet.utils.ModuleConstants; |
|
|
import com.github.pagehelper.PageHelper; |
|
|
import com.github.pagehelper.PageHelper; |
|
|
import com.github.pagehelper.PageInfo; |
|
|
import com.github.pagehelper.PageInfo; |
|
|
import org.apache.commons.collections4.CollectionUtils; |
|
|
import org.apache.commons.collections4.CollectionUtils; |
|
|
|
|
|
import org.redisson.api.RLock; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
@ -136,6 +138,8 @@ public class IssueServiceImpl extends BaseServiceImpl<IssueDao, IssueEntity> imp |
|
|
private GovProjectOpenFeignClient govProjectOpenFeignClient; |
|
|
private GovProjectOpenFeignClient govProjectOpenFeignClient; |
|
|
@Autowired |
|
|
@Autowired |
|
|
private IssueVoteDetailService issueVoteDetailService; |
|
|
private IssueVoteDetailService issueVoteDetailService; |
|
|
|
|
|
@Autowired |
|
|
|
|
|
private DistributedLock distributedLock; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Value("${openapi.scan.server.url}") |
|
|
@Value("${openapi.scan.server.url}") |
|
@ -957,127 +961,138 @@ public class IssueServiceImpl extends BaseServiceImpl<IssueDao, IssueEntity> imp |
|
|
* @date 2020/12/9 10:01 |
|
|
* @date 2020/12/9 10:01 |
|
|
*/ |
|
|
*/ |
|
|
@Override |
|
|
@Override |
|
|
public void shiftProjectV2(ShiftProjectFormDTO formDTO) { |
|
|
public Result shiftProjectV2(ShiftProjectFormDTO formDTO) { |
|
|
//1:查询议题数据
|
|
|
RLock lock = null; |
|
|
IssueEntity entity = baseDao.selectById(formDTO.getIssueId()); |
|
|
try { |
|
|
if (null == entity) { |
|
|
// 锁持有10分钟,等待10s
|
|
|
throw new RenException(IssueConstant.SELECT_EXCEPTION); |
|
|
lock = distributedLock.tryLock(formDTO.getIssueId()); |
|
|
} |
|
|
//1:查询议题数据
|
|
|
if (IssueConstant.ISSUE_SHIFT_PROJECT.equals(entity.getIssueStatus())) { |
|
|
IssueEntity entity = baseDao.selectById(formDTO.getIssueId()); |
|
|
throw new RenException(IssueConstant.ISSUE_SHIFT_PROJECT_EXCEPTION); |
|
|
if (null == entity) { |
|
|
} |
|
|
throw new RenException(IssueConstant.SELECT_EXCEPTION); |
|
|
if (!IssueConstant.ISSUE_VOTING.equals(entity.getIssueStatus())) { |
|
|
} |
|
|
throw new RenException(IssueConstant.ISSUE_VOTING_EXCEPTION); |
|
|
if (IssueConstant.ISSUE_SHIFT_PROJECT.equals(entity.getIssueStatus())) { |
|
|
} |
|
|
throw new RenException(IssueConstant.ISSUE_SHIFT_PROJECT_EXCEPTION); |
|
|
formDTO.setIssueDTO(ConvertUtils.sourceToTarget(entity, IssueDTO.class)); |
|
|
} |
|
|
|
|
|
if (!IssueConstant.ISSUE_VOTING.equals(entity.getIssueStatus())) { |
|
|
|
|
|
throw new RenException(IssueConstant.ISSUE_VOTING_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
formDTO.setIssueDTO(ConvertUtils.sourceToTarget(entity, IssueDTO.class)); |
|
|
|
|
|
|
|
|
//获取议题分类
|
|
|
//获取议题分类
|
|
|
List<IssueCategoryDTO> categoryList = issueCategoryService.getCategoryByIssue(formDTO.getIssueId()); |
|
|
List<IssueCategoryDTO> categoryList = issueCategoryService.getCategoryByIssue(formDTO.getIssueId()); |
|
|
if (CollectionUtils.isEmpty(categoryList)) { |
|
|
if (CollectionUtils.isEmpty(categoryList)) { |
|
|
throw new RenException(EpmetErrorCode.CATEGORY_IS_NULL.getCode()); |
|
|
throw new RenException(EpmetErrorCode.CATEGORY_IS_NULL.getCode()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//公开回复内容审核
|
|
|
//公开回复内容审核
|
|
|
if (StringUtils.isNotBlank(formDTO.getPublicReply())) { |
|
|
if (StringUtils.isNotBlank(formDTO.getPublicReply())) { |
|
|
TextScanParamDTO textScanParamDTO = new TextScanParamDTO(); |
|
|
TextScanParamDTO textScanParamDTO = new TextScanParamDTO(); |
|
|
TextTaskDTO taskDTO = new TextTaskDTO(); |
|
|
TextTaskDTO taskDTO = new TextTaskDTO(); |
|
|
taskDTO.setDataId(UUID.randomUUID().toString().replace("-", "")); |
|
|
taskDTO.setDataId(UUID.randomUUID().toString().replace("-", "")); |
|
|
taskDTO.setContent(formDTO.getPublicReply()); |
|
|
taskDTO.setContent(formDTO.getPublicReply()); |
|
|
textScanParamDTO.getTasks().add(taskDTO); |
|
|
textScanParamDTO.getTasks().add(taskDTO); |
|
|
Result<SyncScanResult> textSyncScanResult = ScanContentUtils.textSyncScan(scanApiUrl.concat(textSyncScanMethod), textScanParamDTO); |
|
|
Result<SyncScanResult> textSyncScanResult = ScanContentUtils.textSyncScan(scanApiUrl.concat(textSyncScanMethod), textScanParamDTO); |
|
|
if (!textSyncScanResult.success()) { |
|
|
if (!textSyncScanResult.success()) { |
|
|
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); |
|
|
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode()); |
|
|
} else { |
|
|
} else { |
|
|
if (!textSyncScanResult.getData().isAllPass()) { |
|
|
if (!textSyncScanResult.getData().isAllPass()) { |
|
|
throw new RenException(EpmetErrorCode.TEXT_SCAN_FAILED.getCode()); |
|
|
throw new RenException(EpmetErrorCode.TEXT_SCAN_FAILED.getCode()); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//因需要保证议题表中的转项目时间与创建项目时间一致 因此先新增项目数据再更新议题数据
|
|
|
|
|
|
|
|
|
|
|
|
//2:调用resi-group查询话题创建人数据(目前议题来源只有来自话题),为了到项目服务初始数据以及发送消息使用
|
|
|
|
|
|
Result<ResiTopicDTO> resultTopicDTO = resiGroupFeignClient.getTopicById(entity.getSourceId()); |
|
|
|
|
|
if (!resultTopicDTO.success() || null == resultTopicDTO.getData()) { |
|
|
|
|
|
throw new RenException(IssueConstant.SELECT_TOPIC_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
ResiTopicDTO topicDTO = resultTopicDTO.getData(); |
|
|
|
|
|
formDTO.setTopicDTO(topicDTO); |
|
|
|
|
|
|
|
|
|
|
|
//3:调用gov-project服务,新增项目各业务表初始数据
|
|
|
//因需要保证议题表中的转项目时间与创建项目时间一致 因此先新增项目数据再更新议题数据
|
|
|
formDTO.setCategoryList(categoryList); |
|
|
|
|
|
List<IssueTagsDTO> tagList = issueTagsService.getTagsByIssue(formDTO.getIssueId()); |
|
|
|
|
|
formDTO.setTagList(tagList); |
|
|
|
|
|
Result<IssueProjectResultDTO> resultDTO = govProjectFeignClient.issueShiftProject(formDTO); |
|
|
|
|
|
if (!resultDTO.success() || null == resultDTO.getData()) { |
|
|
|
|
|
logger.error(resultDTO.getInternalMsg()); |
|
|
|
|
|
throw new RenException(IssueConstant.GOV_PRJECT_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
IssueProjectResultDTO issueProjectResultDTO = resultDTO.getData(); |
|
|
|
|
|
//更新项目对标签的引用次数
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(tagList)) { |
|
|
|
|
|
tagList.forEach(item -> { |
|
|
|
|
|
IssueProjectTagDictDTO tag = issueProjectTagDictService.get(item.getTagId()); |
|
|
|
|
|
tag.setProjectUseCount(tag.getProjectUseCount() + NumConstant.ONE); |
|
|
|
|
|
issueProjectTagDictService.update(tag); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//4:更新议题相关业务表数据
|
|
|
//2:调用resi-group查询话题创建人数据(目前议题来源只有来自话题),为了到项目服务初始数据以及发送消息使用
|
|
|
//4.1:更新议题表数据
|
|
|
Result<ResiTopicDTO> resultTopicDTO = resiGroupFeignClient.getTopicById(entity.getSourceId()); |
|
|
entity.setIssueStatus(IssueConstant.ISSUE_SHIFT_PROJECT); |
|
|
if (!resultTopicDTO.success() || null == resultTopicDTO.getData()) { |
|
|
entity.setShiftedTime(issueProjectResultDTO.getShiftedTime()); |
|
|
throw new RenException(IssueConstant.SELECT_TOPIC_EXCEPTION); |
|
|
baseDao.updateById(entity); |
|
|
} |
|
|
|
|
|
ResiTopicDTO topicDTO = resultTopicDTO.getData(); |
|
|
|
|
|
formDTO.setTopicDTO(topicDTO); |
|
|
|
|
|
|
|
|
|
|
|
//3:调用gov-project服务,新增项目各业务表初始数据
|
|
|
|
|
|
formDTO.setCategoryList(categoryList); |
|
|
|
|
|
List<IssueTagsDTO> tagList = issueTagsService.getTagsByIssue(formDTO.getIssueId()); |
|
|
|
|
|
formDTO.setTagList(tagList); |
|
|
|
|
|
Result<IssueProjectResultDTO> resultDTO = govProjectFeignClient.issueShiftProject(formDTO); |
|
|
|
|
|
if (!resultDTO.success() || null == resultDTO.getData()) { |
|
|
|
|
|
logger.error(resultDTO.getInternalMsg()); |
|
|
|
|
|
throw new RenException(IssueConstant.GOV_PRJECT_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
IssueProjectResultDTO issueProjectResultDTO = resultDTO.getData(); |
|
|
|
|
|
//更新项目对标签的引用次数
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(tagList)) { |
|
|
|
|
|
tagList.forEach(item -> { |
|
|
|
|
|
IssueProjectTagDictDTO tag = issueProjectTagDictService.get(item.getTagId()); |
|
|
|
|
|
tag.setProjectUseCount(tag.getProjectUseCount() + NumConstant.ONE); |
|
|
|
|
|
issueProjectTagDictService.update(tag); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//4.2:议题处理进展表新增数据
|
|
|
//4:更新议题相关业务表数据
|
|
|
IssueProcessEntity processEntity = new IssueProcessEntity(); |
|
|
//4.1:更新议题表数据
|
|
|
processEntity.setIssueId(entity.getId()); |
|
|
entity.setIssueStatus(IssueConstant.ISSUE_SHIFT_PROJECT); |
|
|
processEntity.setIssueStatus(IssueConstant.ISSUE_SHIFT_PROJECT); |
|
|
entity.setShiftedTime(issueProjectResultDTO.getShiftedTime()); |
|
|
processEntity.setOrgType(IssueConstant.ISSUE_GRID); |
|
|
baseDao.updateById(entity); |
|
|
processEntity.setOrgId(entity.getGridId()); |
|
|
|
|
|
processEntity.setOrgName(issueProjectResultDTO.getOrgName()); |
|
|
//4.2:议题处理进展表新增数据
|
|
|
issueProcessDao.insert(processEntity); |
|
|
IssueProcessEntity processEntity = new IssueProcessEntity(); |
|
|
|
|
|
processEntity.setIssueId(entity.getId()); |
|
|
|
|
|
processEntity.setIssueStatus(IssueConstant.ISSUE_SHIFT_PROJECT); |
|
|
|
|
|
processEntity.setOrgType(IssueConstant.ISSUE_GRID); |
|
|
|
|
|
processEntity.setOrgId(entity.getGridId()); |
|
|
|
|
|
processEntity.setOrgName(issueProjectResultDTO.getOrgName()); |
|
|
|
|
|
issueProcessDao.insert(processEntity); |
|
|
|
|
|
|
|
|
|
|
|
//4.3:议题项目关系表新增数据
|
|
|
|
|
|
IssueProjectRelationEntity relationEntity = new IssueProjectRelationEntity(); |
|
|
|
|
|
relationEntity.setIssueId(entity.getId()); |
|
|
|
|
|
relationEntity.setProjectId(issueProjectResultDTO.getProjectId()); |
|
|
|
|
|
issueProjectRelationDao.insert(relationEntity); |
|
|
|
|
|
|
|
|
|
|
|
//5:调用epmet-message服务,给居民端话题创建人、议题发起人以及政府端工作人员发送消息
|
|
|
|
|
|
if (!shiftProjectMessage(issueProjectResultDTO, formDTO, entity).success()) { |
|
|
|
|
|
throw new RenException(IssueConstant.SAVE_MSG_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
//5-1:2020.10.26 添加给居民端话题创建人、议题发起人以及政府端工作人员推送微信订阅消息功能 sun
|
|
|
|
|
|
if (!wxmpShiftProjectMessage(issueProjectResultDTO, formDTO, entity).success()) { |
|
|
|
|
|
logger.error("议题转项目,推送微信订阅消息失败!"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//4.3:议题项目关系表新增数据
|
|
|
//6:缓存中网格下表决中的议题总数减1
|
|
|
IssueProjectRelationEntity relationEntity = new IssueProjectRelationEntity(); |
|
|
govIssueRedis.subtractWorkGrassrootsIssueRedDotValue(entity.getGridId()); |
|
|
relationEntity.setIssueId(entity.getId()); |
|
|
try{ |
|
|
relationEntity.setProjectId(issueProjectResultDTO.getProjectId()); |
|
|
issueVoteStatisticalService.syncVotingCacheToDbByParams(formDTO.getIssueId(),entity.getGridId(),null); |
|
|
issueProjectRelationDao.insert(relationEntity); |
|
|
}catch(RenException e){ |
|
|
|
|
|
logger.error(e.getInternalMsg()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//5:调用epmet-message服务,给居民端话题创建人、议题发起人以及政府端工作人员发送消息
|
|
|
|
|
|
if (!shiftProjectMessage(issueProjectResultDTO, formDTO, entity).success()) { |
|
|
|
|
|
throw new RenException(IssueConstant.SAVE_MSG_EXCEPTION); |
|
|
|
|
|
} |
|
|
|
|
|
//5-1:2020.10.26 添加给居民端话题创建人、议题发起人以及政府端工作人员推送微信订阅消息功能 sun
|
|
|
|
|
|
if (!wxmpShiftProjectMessage(issueProjectResultDTO, formDTO, entity).success()) { |
|
|
|
|
|
logger.error("议题转项目,推送微信订阅消息失败!"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//6:缓存中网格下表决中的议题总数减1
|
|
|
//7:发送话题转议题积分事件
|
|
|
govIssueRedis.subtractWorkGrassrootsIssueRedDotValue(entity.getGridId()); |
|
|
TopicEventFormDTO eventParam = new TopicEventFormDTO(); |
|
|
try{ |
|
|
eventParam.setTopicId(entity.getSourceId()); |
|
|
issueVoteStatisticalService.syncVotingCacheToDbByParams(formDTO.getIssueId(),entity.getGridId(),null); |
|
|
eventParam.setEvent(EventEnum.TOPIC_SHIFTED_TO_PROJECT); |
|
|
}catch(RenException e){ |
|
|
if(!resiGroupOpenFeignClient.sendEvent(eventParam).success()){ |
|
|
logger.error(e.getInternalMsg()); |
|
|
logger.warn("com.epmet.service.impl.IssueServiceImpl.shiftProjectV2,话题被转为项目积分事件发送失败,参数:{}", JSON.toJSONString(formDTO)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 8.数据库更新表决统计
|
|
|
|
|
|
SelectIssueVotingDetailFormDTO dto = new SelectIssueVotingDetailFormDTO(); |
|
|
|
|
|
dto.setGridId(entity.getGridId()); |
|
|
|
|
|
dto.setIssueId(formDTO.getIssueId()); |
|
|
|
|
|
issueVoteDetailService.updateVote(dto); |
|
|
|
|
|
|
|
|
//7:发送话题转议题积分事件
|
|
|
//8.记录日志
|
|
|
TopicEventFormDTO eventParam = new TopicEventFormDTO(); |
|
|
//SendMqMsgUtil.build().openFeignClient(messageOpenFeignClient).sendProjectChangedMqMsg();
|
|
|
eventParam.setTopicId(entity.getSourceId()); |
|
|
return new Result(); |
|
|
eventParam.setEvent(EventEnum.TOPIC_SHIFTED_TO_PROJECT); |
|
|
} catch (Exception e) { |
|
|
if(!resiGroupOpenFeignClient.sendEvent(eventParam).success()){ |
|
|
return new Result().error("议题数据正在处理中,请勿重复提交!"); |
|
|
logger.warn("com.epmet.service.impl.IssueServiceImpl.shiftProjectV2,话题被转为项目积分事件发送失败,参数:{}", JSON.toJSONString(formDTO)); |
|
|
} finally { |
|
|
|
|
|
distributedLock.unLock(lock); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 8.数据库更新表决统计
|
|
|
|
|
|
SelectIssueVotingDetailFormDTO dto = new SelectIssueVotingDetailFormDTO(); |
|
|
|
|
|
dto.setGridId(entity.getGridId()); |
|
|
|
|
|
dto.setIssueId(formDTO.getIssueId()); |
|
|
|
|
|
issueVoteDetailService.updateVote(dto); |
|
|
|
|
|
|
|
|
|
|
|
//8.记录日志
|
|
|
|
|
|
//SendMqMsgUtil.build().openFeignClient(messageOpenFeignClient).sendProjectChangedMqMsg();
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|