diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java index 9806de9b80..3d7a57cce9 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/constant/ActMessageConstant.java @@ -8,6 +8,7 @@ package com.epmet.constant; */ public interface ActMessageConstant { String TITLE="您有一条活动消息"; + String WXMP_TITLE="活动消息"; /** * 报名审核成功,给居民端用户发送消息 */ @@ -29,5 +30,5 @@ public interface ActMessageConstant { /** * 工作端-重新发布活动,通知待审核+已经审核通过的用户 */ - String RE_PUBLISH_ACT="您好,您参与的%s活动,%s,请注意查看"; + String RE_PUBLISH_ACT="您参与的%s活动,%s,请注意查看"; } diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java index f8cd7eb1d2..68915220c9 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActServiceImpl.java @@ -24,6 +24,7 @@ import com.epmet.constant.ReadFlagConstant; import com.epmet.dao.*; import com.epmet.dto.*; import com.epmet.dto.form.UserMessageFormDTO; +import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.form.work.*; import com.epmet.dto.result.ActSponsorResultDTO; import com.epmet.dto.result.work.*; @@ -31,6 +32,7 @@ import com.epmet.entity.*; import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.GovOrgOpenFeignClient; import com.epmet.service.*; +import com.epmet.utils.ModuleConstant; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -680,6 +682,7 @@ public class WorkActServiceImpl implements WorkActService { List userIdList=actUserRelationDao.selectUserIdList(formDTO.getActId(),ActConstant.ACT_USER_STATUS_PASSED); if(null!=userIdList&&userIdList.size()>0){ List userMessageFormDTOS=new ArrayList<>(); + List msgList = new ArrayList<>(); for(String userId:userIdList){ UserMessageFormDTO userMessageFormDTO = new UserMessageFormDTO(); userMessageFormDTO.setCustomerId(actInfoDTO.getCustomerId()); @@ -692,11 +695,25 @@ public class WorkActServiceImpl implements WorkActService { actInfoDTO.getTitle(), formDTO.getCancelReason())); userMessageFormDTOS.add(userMessageFormDTO); + //2020.10.26 添加发送微信订阅消息功能 sun + WxSubscribeMessageFormDTO dto = new WxSubscribeMessageFormDTO(); + dto.setCustomerId(actInfoDTO.getCustomerId()); + dto.setClientType(AppClientConstant.APP_RESI); + dto.setUserId(userId); + dto.setBehaviorType(ActMessageConstant.WXMP_TITLE); + dto.setMessageContent(String.format(ActMessageConstant.ACT_CANCELED, actInfoDTO.getTitle(), formDTO.getCancelReason())); + dto.setMessageTime(new Date()); + dto.setGridId("*"); + msgList.add(dto); } Result sendMessageRes= epmetMessageOpenFeignClient.saveUserMessageList(userMessageFormDTOS); if(sendMessageRes.success()){ logger.info("给审核通过的用户发送消息成功"); } + Result wxmpMsg = epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + if (wxmpMsg.success()) { + logger.info("给审核通过的用户推送微信订阅消息成功"); + } } } diff --git a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java index 879213f11a..9e58336c61 100644 --- a/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java +++ b/epmet-module/epmet-heart/epmet-heart-server/src/main/java/com/epmet/service/impl/WorkActUserServiceImpl.java @@ -19,6 +19,7 @@ import com.epmet.dto.ActUserLogDTO; import com.epmet.dto.ActUserRelationDTO; import com.epmet.dto.HeartUserInfoDTO; import com.epmet.dto.form.UserMessageFormDTO; +import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.form.work.AactUserDetailFormDTO; import com.epmet.dto.form.work.ActIdFormDTO; import com.epmet.dto.form.work.AuditUserFormDTO; @@ -464,6 +465,8 @@ public class WorkActUserServiceImpl implements WorkActUserService { actUserLogDao.insert(actUserLogEntity); //给居民发消息 this.saveUserMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_PASSED,actInfo); + //给居民发送微信订阅消息 sun + this.saveWxmpMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_PASSED,actInfo); } /** @@ -511,6 +514,8 @@ public class WorkActUserServiceImpl implements WorkActUserService { actUserLogDao.insert(actUserLogEntity); //给居民发消息 this.saveUserMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_REFUSED,actInfo); + //给居民发送微信订阅消息 sun + this.saveWxmpMessage(actUserRelationEntity,ActConstant.ACT_USER_STATUS_REFUSED,actInfo); } /** @@ -645,6 +650,38 @@ public class WorkActUserServiceImpl implements WorkActUserService { } } + /** + * @param actUserRelationEntity type actInfo + * @author sun + * @description 报名审核--给报名申请人发送微信订阅消息 + **/ + private void saveWxmpMessage(ActUserRelationEntity actUserRelationEntity, String type, ActInfoEntity actInfo) { + List list = new ArrayList<>(); + try { + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(actInfo.getCustomerId()); + msg.setClientType(AppClientConstant.APP_RESI); + msg.setUserId(actUserRelationEntity.getUserId()); + msg.setBehaviorType(ActMessageConstant.WXMP_TITLE); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + if (ActConstant.ACT_USER_STATUS_PASSED.equals(type)) { + msg.setMessageContent(String.format(ActMessageConstant.AUDIT_PASSED, actInfo.getTitle())); + } else if (ActConstant.ACT_USER_STATUS_REFUSED.equals(type)) { + msg.setMessageContent(String.format(ActMessageConstant.AUDIT_REFUSED, actInfo.getTitle(), actUserRelationEntity.getFailureReason())); + } + list.add(msg); + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(list); + if (result.success()) { + logger.info("审核成功,已成功发送微信订阅消息"); + } else { + logger.error("审核成功,发送微信订阅消息失败" + JSON.toJSONString(result)); + } + } catch (Exception e) { + logger.error("审核结果,发送微信订阅消息异常", e.getMessage()); + } + } + /** * @return com.epmet.dto.result.work.HistoricalActInfo * @param userId diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java index 99149fde28..745708b221 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/WxmpMsgSendRecordDTO.java @@ -42,6 +42,10 @@ public class WxmpMsgSendRecordDTO implements Serializable { * 客户Id 客户Id */ private String customerId; + /** + * 网格Id(居民端跟网格有关的则有值,工作端以及一些居民端和网格没关的存*) + */ + private String gridId; /** * 所属端类型 居民端:resi 工作端:work diff --git a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java index 84ec028cc5..c9f8b1e4a6 100644 --- a/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java +++ b/epmet-module/epmet-message/epmet-message-client/src/main/java/com/epmet/dto/form/WxSubscribeMessageFormDTO.java @@ -54,4 +54,9 @@ public class WxSubscribeMessageFormDTO implements Serializable { @NotNull(message = "消息时间不能为空") private Date messageTime; + /** + * 网格id-居民端用 + */ + private String gridId; + } diff --git a/epmet-module/epmet-message/epmet-message-server/pom.xml b/epmet-module/epmet-message/epmet-message-server/pom.xml index 6a93633d7b..f547d633ba 100644 --- a/epmet-module/epmet-message/epmet-message-server/pom.xml +++ b/epmet-module/epmet-message/epmet-message-server/pom.xml @@ -165,6 +165,12 @@ false + + + 5 + 8 + 10 + 30 @@ -197,6 +203,12 @@ false + + + 5 + 8 + 10 + 30 @@ -229,6 +241,12 @@ true + + + 5 + 8 + 10 + 30 @@ -258,6 +276,12 @@ true + + + 5 + 8 + 10 + 30 diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java new file mode 100644 index 0000000000..95c0b0c55a --- /dev/null +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/config/AsyncConfig.java @@ -0,0 +1,49 @@ +package com.epmet.config; + +import com.epmet.properties.ThreadProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置类 + */ +@Configuration +@EnableConfigurationProperties(ThreadProperties.class) +@EnableAsync +public class AsyncConfig { + + @Autowired + private ThreadProperties threadProperties; + + @Bean + public Executor executor() { + ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool(); + + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(threadPoolProps.getCorePoolSize()); + executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize()); + executor.setQueueCapacity(threadPoolProps.getQueueCapacity()); + executor.setThreadNamePrefix("epmet-message-"); + // rejection-policy:当pool已经达到max size的时候,如何处理新任务 + // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略 + executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive()); + executor.initialize(); + return executor; + } + + @Bean + public ExecutorService executorService() { + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor(); + return executor.getThreadPoolExecutor(); + } + +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java index 667a8b3bfc..62c9e16dcb 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/constant/WxmpMessageConstant.java @@ -22,7 +22,9 @@ public interface WxmpMessageConstant { String RESI = "resi"; - String WORK = "work"; + String GOV_REDIS = "work"; + + String GOV_DB = "gov"; String ACCESS_TOKEN = "access_token"; @@ -30,17 +32,21 @@ public interface WxmpMessageConstant { String TEMPLATE_ID = "template_id"; + String TEMPLATE_TYPE = "1832"; + String PAGE = "page"; - String TITLE = "title"; + String PAGE_URL = "/subpages/mine/pages/message/skip"; + + String TITLE = "thing5"; int TITLE_LIMIT = 20; - String MESSAGE_CONTENT = "message_content"; + String MESSAGE_CONTENT = "thing4"; int MESSAGE_CONTENT_LIMIT = 20; - String MESSAGE_TIME = "message_time"; + String MESSAGE_TIME = "date2"; String DATA = "data"; @@ -50,10 +56,6 @@ public interface WxmpMessageConstant { String ERROR = "error"; - String PAGE_RESI = ""; - - String PAGE_WORK = ""; - String STATE_DEV = "developer"; String STATE_TEST = "trial"; diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java index 15e8e81d0e..030d2a634d 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/controller/WxmpMessageController.java @@ -17,6 +17,7 @@ package com.epmet.controller; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; @@ -26,10 +27,13 @@ import com.epmet.dto.form.WxSubscribeMessageFormDTO; import com.epmet.dto.result.GetTemplateListResultDTO; import com.epmet.dto.result.WxMsgAuthInfoResultDTO; import com.epmet.service.WxmpMessageService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.ExecutorService; /** @@ -42,12 +46,17 @@ import java.util.List; @RequestMapping("wxmpmessage") public class WxmpMessageController { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired private WxmpMessageService wxmpMessageService; @Autowired private LoginUserUtil loginUserUtil; + @Autowired + private ExecutorService executorService; + /** * @Description 保存系统自身的弹框授权信息 * @return com.epmet.commons.tools.utils.Result @@ -74,7 +83,16 @@ public class WxmpMessageController { for (WxSubscribeMessageFormDTO wxSubscribeMessageFormDTO : msgList) { ValidatorUtils.validateEntity(wxSubscribeMessageFormDTO); } - wxmpMessageService.sendWxSubscribeMessage(msgList); + executorService.execute(() -> { + try { + long startTs = System.currentTimeMillis(); + wxmpMessageService.sendWxSubscribeMessage(msgList); + long endTs = System.currentTimeMillis(); + logger.info("异步发送消息成功,执行时长:{}", endTs - startTs); + } catch (Exception e) { + logger.error("异步发送消息失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e)); + } + }); return new Result(); } diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java index 28080d66e7..2a525fa7c0 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java +++ b/epmet-module/epmet-message/epmet-message-server/src/main/java/com/epmet/dao/WxmpResiUserSubscribeDao.java @@ -67,13 +67,12 @@ public interface WxmpResiUserSubscribeDao extends BaseDao authorizerRefreshToken = new HashMap<>(); try { authorizerRefreshToken = wxmpMessageRedis.getAuthorizerRefreshToken(key.toString()); @@ -168,20 +169,35 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { } //获取模板id - if (WxmpMessageConstant.RESI.equals(clientType)) { - templateId = wxmpResiUserSubscribeDao.getResiSubscribeTemplateId(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - templateId = wxmpWorkUserSubscribeDao.getWorkSubscribeTemplateId(openId, templateId, customerId); +// if (WxmpMessageConstant.RESI.equals(clientType)) { +// templateId = wxmpResiUserSubscribeDao.getResiSubscribeTemplateId(openId, customerId); +// } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { +// templateId = wxmpWorkUserSubscribeDao.getWorkSubscribeTemplateId(openId, customerId); +// } + CustomerTemplateListFormDTO customerTemplateListFormDTO = new CustomerTemplateListFormDTO(); + customerTemplateListFormDTO.setCustomerId(customerId); + customerTemplateListFormDTO.setPublicId(WxmpMessageConstant.TEMPLATE_TYPE); + List customerTemplateListResultDTOS = customerTemplateList(customerTemplateListFormDTO); + if (customerTemplateListResultDTOS.size() > NumConstant.ZERO) { + for (CustomerTemplateListResultDTO customerTemplateListResultDTO : customerTemplateListResultDTOS) { + if (WxmpMessageConstant.GOV_REDIS.equals(customerTemplateListResultDTO.getClientType())){ + customerTemplateListResultDTO.setClientType(WxmpMessageConstant.GOV_DB); + } + if (clientType.equals(customerTemplateListResultDTO.getClientType())) { + templateId = customerTemplateListResultDTO.getTemplateId(); + } + } + } else { + throw new WxSubscribeException("获取模板id失败", "", openId); } if (StringUtils.isBlank(templateId)) { throw new WxSubscribeException("获取模板id失败", "", openId); } - //判断用户是否有次数 Integer count = null; if (WxmpMessageConstant.RESI.equals(clientType)) { count = wxmpResiUserSubscribeDao.getResiSubscribeInfo(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { count = wxmpWorkUserSubscribeDao.getWorkSubscribeInfo(openId, templateId, customerId); } if (count == null) { @@ -199,16 +215,30 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { jsonObject.put(WxmpMessageConstant.ACCESS_TOKEN, accessToken); jsonObject.put(WxmpMessageConstant.TOUSER, openId); jsonObject.put(WxmpMessageConstant.TEMPLATE_ID, templateId); - data.put(WxmpMessageConstant.TITLE, new JSONObject().put("value", ("您有一条" + msg.getBehaviorType()).substring(0, WxmpMessageConstant.TITLE_LIMIT))); - data.put(WxmpMessageConstant.MESSAGE_CONTENT, new JSONObject().put("value", msg.getMessageContent().substring(0, WxmpMessageConstant.MESSAGE_CONTENT_LIMIT))); - data.put(WxmpMessageConstant.MESSAGE_TIME, new JSONObject().put("value", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(msg.getMessageTime()))); + //标题 + String title = "您有一条" + msg.getBehaviorType(); + JSONObject titleJson = new JSONObject(); + titleJson.put("value", title.length() > WxmpMessageConstant.TITLE_LIMIT ? title.substring(0, WxmpMessageConstant.TITLE_LIMIT) : title); + data.put(WxmpMessageConstant.TITLE, titleJson); + //内容 + JSONObject contentJson = new JSONObject(); + contentJson.put("value", msg.getMessageContent().length() > WxmpMessageConstant.MESSAGE_CONTENT_LIMIT ? msg.getMessageContent().substring(0, WxmpMessageConstant.MESSAGE_CONTENT_LIMIT) : msg.getMessageContent()); + data.put(WxmpMessageConstant.MESSAGE_CONTENT, contentJson); + //时间 + JSONObject timeJson = new JSONObject(); + timeJson.put("value", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(msg.getMessageTime())); + data.put(WxmpMessageConstant.MESSAGE_TIME, timeJson); jsonObject.put(WxmpMessageConstant.DATA, data); EnvEnum envEnum = EnvEnum.getCurrentEnv(); //选填项 if (WxmpMessageConstant.RESI.equals(clientType)) { - jsonObject.put(WxmpMessageConstant.PAGE, WxmpMessageConstant.PAGE_RESI); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { - jsonObject.put(WxmpMessageConstant.PAGE, WxmpMessageConstant.PAGE_WORK); + StringBuilder resiPage = new StringBuilder(WxmpMessageConstant.PAGE_URL); + resiPage.append("?customerId=").append(customerId).append("&gridId=").append(msg.getGridId()); + jsonObject.put(WxmpMessageConstant.PAGE, resiPage.toString()); + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { + StringBuilder govPage = new StringBuilder(WxmpMessageConstant.PAGE_URL); + govPage.append("?customerId=").append(customerId).append("&userId=").append(userId); + jsonObject.put(WxmpMessageConstant.PAGE, govPage.toString()); } //开发环境 if ("dev".equals(envEnum.getCode())) { @@ -229,7 +259,7 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { int decrease = 0; if (WxmpMessageConstant.RESI.equals(clientType)) { decrease = wxmpResiUserSubscribeDao.decreaseResiSubscribeCount(openId, templateId, customerId, 1); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { decrease = wxmpWorkUserSubscribeDao.decreaseWorkSubscribeCount(openId, templateId, customerId, 1); } if (decrease == 0) { @@ -247,7 +277,7 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { int clear = 0; if (WxmpMessageConstant.RESI.equals(clientType)) { clear = wxmpResiUserSubscribeDao.clearResiSubscribeCount(openId, templateId, customerId); - } else if (WxmpMessageConstant.WORK.equals(clientType)) { + } else if (WxmpMessageConstant.GOV_DB.equals(clientType)) { clear = wxmpWorkUserSubscribeDao.clearWorkSubscribeCount(openId, templateId, customerId); } if (clear == 0) { @@ -256,9 +286,8 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { } //抛出错误 - throw new WxSubscribeException(String.valueOf(resultMap.get(WxmpMessageConstant.ERR_MSG)),templateId, openId); + throw new WxSubscribeException(String.valueOf(resultMap.get(WxmpMessageConstant.ERR_MSG)), templateId, openId); } - succecssCount++; } catch (Exception e) { String errMsg = e.getMessage(); @@ -289,6 +318,7 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { wxmpMsgSendRecordEntity.setCustomerId(msg.getCustomerId()); wxmpMsgSendRecordEntity.setClientType(msg.getClientType()); wxmpMsgSendRecordEntity.setTemplateId(templateId); + wxmpMsgSendRecordEntity.setGridId(msg.getGridId()==null?"":msg.getGridId()); wxmpMsgSendRecordEntity.setUserId(msg.getUserId()); wxmpMsgSendRecordEntity.setWxOpenId(openId); wxmpMsgSendRecordEntity.setBehaviorType(msg.getBehaviorType()); @@ -299,175 +329,197 @@ public class WxmpMessageServiceImpl implements WxmpMessageService { return wxmpMsgSendRecordEntity; } - /** - * @return - * @Description 居民端、工作端-获取客户小程序模板列表 - * @author sun - */ - @Override - public List templateList(GetTemplateListFormDTO formDTO) { - GetTemplateListFormDTO dto = ConvertUtils.sourceToTarget(formDTO, GetTemplateListFormDTO.class); - String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/templatelist"; - //String url = "http://localhost:8080/api/third/personaltemplate/templatelist"; - String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(dto)).getData(); - logger.info("ThirdLoginServiceImpl.getUserWeChat:httpclient->url:"+url+",结果->"+data); - JSONObject toResult = JSON.parseObject(data); - Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); - if (null != toResult.get("code")) { - mapToResult.setCode(((Integer) toResult.get("code")).intValue()); - } - if (!mapToResult.success()) { - logger.error("调用epmet_third服务获取小程序消息订阅模板数据失败"); - throw new RenException(mapToResult.getCode()); - } - List resultList = (List) mapToResult.getData(); - return resultList; - } - - @Override - public WxMsgAuthInfoResultDTO getAuthorizationInfo(String customerId, String clientType, String loginUserId, String templateId) { - return msgSubscribeStatusDao.getUserSubscribeStatusDTO(loginUserId, customerId, clientType, templateId); - } - - @Override - public void saveWxSubscribe(String customerId, String clientType, String templateId, String wxAlwaysVisit, - String wxSubscribeStatus, String behaviorType, String userId) { - - String openId; - // 1. 用户订阅信息表新增或者更新 - if (AppClientConstant.APP_GOV.equals(clientType)) { - // 工作端 - openId = getWorkOpenId(userId); - saveWxWorkSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId); - } else { - //居民端 - openId = getResiOpenId(userId); - saveWxResiSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId); - } - - // 2.保存行为记录 - WxmpUserSubscribeRecordEntity record = new WxmpUserSubscribeRecordEntity(); - record.setBehaviorType(behaviorType); - record.setCustomerId(customerId); - record.setTemplateId(templateId); - record.setUserId(userId); - record.setWxAlwaysVisit(wxAlwaysVisit); - record.setWxOpenId(openId); - record.setWxSubscribeStatus(wxSubscribeStatus); - subscribeRecordDao.insert(record); - - // 3.更新用户模板订阅状态 - WxmpTemplateMsgSubscribeStatusEntity subscribeStatusEntity = msgSubscribeStatusDao.getUserSubscribeStatusEntity(userId, customerId, clientType, templateId); - if (subscribeStatusEntity == null) { - subscribeStatusEntity = new WxmpTemplateMsgSubscribeStatusEntity(); - subscribeStatusEntity.setUserId(userId); - subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); - subscribeStatusEntity.setTemplateId(templateId); - subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); - subscribeStatusEntity.setCustomerId(customerId); - subscribeStatusEntity.setClientType(clientType); - msgSubscribeStatusDao.insert(subscribeStatusEntity); - return; - } - - subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); - subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); - - msgSubscribeStatusDao.updateById(subscribeStatusEntity); - } - - /** - * @Description 保存居民端微信订阅信息 - * @return void - * @author wxz - * @date 2020.10.22 09:56 - */ - private void saveWxResiSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, String openId) { - - WxmpResiUserSubscribeEntity wxResiSubscribe = wxmpResiUserSubscribeDao.getWxResiSubscribe(userId, customerId, templateId); - if (wxResiSubscribe == null) { - WxmpResiUserSubscribeEntity insert = new WxmpResiUserSubscribeEntity(); - insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); - insert.setCustomerId(customerId); - insert.setTemplateId(templateId); - insert.setUserId(userId); - insert.setWxOpenId(openId); - insert.setWxSubscribeStatus(wxSubscribeStatus); - return; - } - - if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { + /** + * @return + * @Description 居民端、工作端-获取客户小程序模板列表 + * @author sun + */ + @Override + public List templateList(GetTemplateListFormDTO formDTO) { + GetTemplateListFormDTO dto = ConvertUtils.sourceToTarget(formDTO, GetTemplateListFormDTO.class); + String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/templatelist"; + //String url = "http://localhost:8080/api/third/personaltemplate/templatelist"; + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(dto)).getData(); + logger.info("ThirdLoginServiceImpl.getUserWeChat:httpclient->url:" + url + ",结果->" + data); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + logger.error("调用epmet_third服务获取小程序消息订阅模板数据失败"); + throw new RenException(mapToResult.getCode()); + } + List resultList = (List) mapToResult.getData(); + return resultList; + } + + /** + * @return + * @Description 查询客户两个端小程序对应的站内信模板Id + * @author sun + */ + private List customerTemplateList(CustomerTemplateListFormDTO formDTO) { + String url = "https://epmet-cloud.elinkservice.cn/api/third/personaltemplate/templatelist"; + String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(formDTO)).getData(); + logger.info("ThirdLoginServiceImpl.customerTemplateList:httpclient->url:" + url + ",结果->" + data); + JSONObject toResult = JSON.parseObject(data); + Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class); + if (null != toResult.get("code")) { + mapToResult.setCode(((Integer) toResult.get("code")).intValue()); + } + if (!mapToResult.success()) { + logger.error("调用epmet_third服务获取客户小程序消息订阅模板数据失败"); + throw new RenException(mapToResult.getCode()); + } + List resultList = (List) mapToResult.getData(); + return resultList; + } + + @Override + public WxMsgAuthInfoResultDTO getAuthorizationInfo(String customerId, String clientType, String loginUserId, String templateId) { + return msgSubscribeStatusDao.getUserSubscribeStatusDTO(loginUserId, customerId, clientType, templateId); + } + + @Override + public void saveWxSubscribe(String customerId, String clientType, String templateId, String wxAlwaysVisit, + String wxSubscribeStatus, String behaviorType, String userId) { + + String openId; + // 1. 用户订阅信息表新增或者更新 + if (AppClientConstant.APP_GOV.equals(clientType)) { + // 工作端 + openId = getWorkOpenId(userId); + saveWxWorkSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId); + } else { + //居民端 + openId = getResiOpenId(userId); + saveWxResiSubscribe(customerId, templateId, wxSubscribeStatus, userId, openId); + } + + // 2.保存行为记录 + WxmpUserSubscribeRecordEntity record = new WxmpUserSubscribeRecordEntity(); + record.setBehaviorType(behaviorType); + record.setCustomerId(customerId); + record.setTemplateId(templateId); + record.setUserId(userId); + record.setWxAlwaysVisit(wxAlwaysVisit); + record.setWxOpenId(openId); + record.setWxSubscribeStatus(wxSubscribeStatus); + subscribeRecordDao.insert(record); + + // 3.更新用户模板订阅状态 + WxmpTemplateMsgSubscribeStatusEntity subscribeStatusEntity = msgSubscribeStatusDao.getUserSubscribeStatusEntity(userId, customerId, clientType, templateId); + if (subscribeStatusEntity == null) { + subscribeStatusEntity = new WxmpTemplateMsgSubscribeStatusEntity(); + subscribeStatusEntity.setUserId(userId); + subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); + subscribeStatusEntity.setTemplateId(templateId); + subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); + subscribeStatusEntity.setCustomerId(customerId); + subscribeStatusEntity.setClientType(clientType); + msgSubscribeStatusDao.insert(subscribeStatusEntity); + return; + } + + subscribeStatusEntity.setWxAlwaysVisit(wxAlwaysVisit); + subscribeStatusEntity.setWxSubscribeStatus(wxSubscribeStatus); + + msgSubscribeStatusDao.updateById(subscribeStatusEntity); + } + + /** + * @return void + * @Description 保存居民端微信订阅信息 + * @author wxz + * @date 2020.10.22 09:56 + */ + private void saveWxResiSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, String openId) { + + WxmpResiUserSubscribeEntity wxResiSubscribe = wxmpResiUserSubscribeDao.getWxResiSubscribe(userId, customerId, templateId); + if (wxResiSubscribe == null) { + WxmpResiUserSubscribeEntity insert = new WxmpResiUserSubscribeEntity(); + insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); + insert.setCustomerId(customerId); + insert.setTemplateId(templateId); + insert.setUserId(userId); + insert.setWxOpenId(openId); + insert.setWxSubscribeStatus(wxSubscribeStatus); + return; + } + + if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { wxmpResiUserSubscribeDao.incrSubscribeCount(1, userId, customerId, templateId, openId); - } else { + } else { wxmpResiUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); - } - } - - /** - * @Description 保存工作端订阅信息 - * @return void - * @author wxz - * @date 2020.10.22 14:21 - */ - private void saveWxWorkSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, String openId) { - WxmpWorkUserSubscribeEntity wxWorkSubscribe = wxmpWorkUserSubscribeDao.getWxWorkSubscribe(userId, customerId, templateId); - if (wxWorkSubscribe == null) { - WxmpWorkUserSubscribeEntity insert = new WxmpWorkUserSubscribeEntity(); - insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); - insert.setCustomerId(customerId); - insert.setTemplateId(templateId); - insert.setUserId(userId); - insert.setWxOpenId(openId); - insert.setWxSubscribeStatus(wxSubscribeStatus); - wxmpWorkUserSubscribeDao.insert(insert); - return ; - } - - if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { - wxmpWorkUserSubscribeDao.incrSubscribeCount(1, userId, customerId, templateId, openId); - } else { - wxmpWorkUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); - } - - } - - /** - * @Description 根据UserId查询居民OpenId - * @return string - * @author wxz - * @date 2020.10.22 13:35 - */ - public String getResiOpenId(String userId) { - UserBasicInfoFormDTO bif = new UserBasicInfoFormDTO(); - bif.setUserId(userId); - Result result = epmetUserOpenFeignClient.getUserBasicInfo(bif); - if (!result.success()) { - throw new RenException(String.format("查询居民OpenId失败,userId:%s,错误信息:%s",userId , result.getInternalMsg())); - } - UserBasicInfo userBasicInfo = result.getData(); - if (userBasicInfo == null) { - throw new RenException(String.format("根据userId:%s,没有查询到居民OpenId",userId)); - } - return userBasicInfo.getOpenId(); - } - - /** - * @Description 查询工作人员openId - * @return java.lang.String - * @author wxz - * @date 2020.10.22 14:46 - */ - public String getWorkOpenId(String userId) { - StaffBasicInfoFormDTO form = new StaffBasicInfoFormDTO(); - form.setStaffId(userId); - Result result = epmetUserOpenFeignClient.getStaffBasicInfo(form); - if (!result.success()) { - throw new RenException(String.format("查询工作人员OpenId失败,userId:%s,错误信息:%s",userId , result.getInternalMsg())); - } - StaffBasicInfo staffBasicInfo = result.getData(); - if (staffBasicInfo == null) { - throw new RenException(String.format("根据userId:%s,没有查询到工作人员OpenId",userId)); - } - return staffBasicInfo.getOpenId(); - } -} \ No newline at end of file + } + } + + /** + * @return void + * @Description 保存工作端订阅信息 + * @author wxz + * @date 2020.10.22 14:21 + */ + private void saveWxWorkSubscribe(String customerId, String templateId, String wxSubscribeStatus, String userId, String openId) { + WxmpWorkUserSubscribeEntity wxWorkSubscribe = wxmpWorkUserSubscribeDao.getWxWorkSubscribe(userId, customerId, templateId); + if (wxWorkSubscribe == null) { + WxmpWorkUserSubscribeEntity insert = new WxmpWorkUserSubscribeEntity(); + insert.setCount(WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus) ? 1 : 0); + insert.setCustomerId(customerId); + insert.setTemplateId(templateId); + insert.setUserId(userId); + insert.setWxOpenId(openId); + insert.setWxSubscribeStatus(wxSubscribeStatus); + wxmpWorkUserSubscribeDao.insert(insert); + return; + } + + if (WxMsgTemplateSubscribeStatus.SUBSCRIBE.equals(wxSubscribeStatus)) { + wxmpWorkUserSubscribeDao.incrSubscribeCount(1, userId, customerId, templateId, openId); + } else { + wxmpWorkUserSubscribeDao.unSubscribe(userId, customerId, templateId, openId); + } + + } + + /** + * @return string + * @Description 根据UserId查询居民OpenId + * @author wxz + * @date 2020.10.22 13:35 + */ + public String getResiOpenId(String userId) { + UserBasicInfoFormDTO bif = new UserBasicInfoFormDTO(); + bif.setUserId(userId); + Result result = epmetUserOpenFeignClient.getUserBasicInfo(bif); + if (!result.success()) { + throw new RenException(String.format("查询居民OpenId失败,userId:%s,错误信息:%s", userId, result.getInternalMsg())); + } + UserBasicInfo userBasicInfo = result.getData(); + if (userBasicInfo == null) { + throw new RenException(String.format("根据userId:%s,没有查询到居民OpenId", userId)); + } + return userBasicInfo.getOpenId(); + } + + /** + * @return java.lang.String + * @Description 查询工作人员openId + * @author wxz + * @date 2020.10.22 14:46 + */ + public String getWorkOpenId(String userId) { + StaffBasicInfoFormDTO form = new StaffBasicInfoFormDTO(); + form.setStaffId(userId); + Result result = epmetUserOpenFeignClient.getStaffBasicInfo(form); + if (!result.success()) { + throw new RenException(String.format("查询工作人员OpenId失败,userId:%s,错误信息:%s", userId, result.getInternalMsg())); + } + StaffBasicInfo staffBasicInfo = result.getData(); + if (staffBasicInfo == null) { + throw new RenException(String.format("根据userId:%s,没有查询到工作人员OpenId", userId)); + } + return staffBasicInfo.getOpenId(); + } +} diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/bootstrap.yml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/bootstrap.yml index 0f9afbef03..0ccb3c1213 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/bootstrap.yml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/bootstrap.yml @@ -118,4 +118,12 @@ ribbon: #pageHelper分页插件 pagehelper: helper-dialect: mysql - reasonable: false #分页合理化配置,例如输入页码为-1,则自动转化为最小页码1 \ No newline at end of file + reasonable: false #分页合理化配置,例如输入页码为-1,则自动转化为最小页码1 + +thread: + # 线程池配置 + threadPool: + corePoolSize: @thread.pool.core-pool-size@ + maxPoolSize: @thread.pool.max-pool-size@ + queueCapacity: @thread.pool.queue-capacity@ + keepAlive: @thread.pool.keep-alive@ \ No newline at end of file diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpMsgSendRecordDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpMsgSendRecordDao.xml index da33d13106..198d5cd529 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpMsgSendRecordDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpMsgSendRecordDao.xml @@ -11,6 +11,7 @@ template_id, user_id, wx_open_id, + grid_id behavior_type, title, message_content, @@ -30,6 +31,7 @@ #{templateId}, #{userId}, #{wxOpenId}, + #{gridId}, #{behaviorType}, #{title}, #{messageContent}, diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml index 099108d016..842e3a9e70 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpResiUserSubscribeDao.xml @@ -44,7 +44,6 @@ where del_flag = 0 and customer_id = #{customerId} - and template_id = #{templateId} and wx_open_id = #{openId} and wx_subscribe_status = 'subscribe' limit 1 diff --git a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml index 7c9e547118..b1e092a166 100644 --- a/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml +++ b/epmet-module/epmet-message/epmet-message-server/src/main/resources/mapper/WxmpWorkUserSubscribeDao.xml @@ -50,7 +50,6 @@ where del_flag = 0 and customer_id = #{customerId} - and template_id = #{templateId} and wx_open_id = #{openId} and wx_subscribe_status = 'subscribe' limit 1 diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/CustomerTemplateListFormDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/CustomerTemplateListFormDTO.java new file mode 100644 index 0000000000..9dbabbfdbe --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/CustomerTemplateListFormDTO.java @@ -0,0 +1,27 @@ +package com.epmet.dto.form; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Description 获取客户小程序模板列表-接口入参 + * @Author sun + */ +@Data +public class CustomerTemplateListFormDTO implements Serializable { + + /** + * 客户Id + */ + @NotBlank(message="客户Id不能为空", groups = {AddUserInternalGroup.class}) + private String customerId; + /** + * 微信公共模板库模板Id + */ + @NotBlank(message="公共模板Id不能为空", groups = {AddUserInternalGroup.class}) + private String publicId; + public interface AddUserInternalGroup {} +} + diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/CustomerTemplateListResultDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/CustomerTemplateListResultDTO.java new file mode 100644 index 0000000000..e6d92fd8f3 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/CustomerTemplateListResultDTO.java @@ -0,0 +1,30 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description 获取客户小程序模板列表-接口返参 + * @Author sun + */ +@Data +public class CustomerTemplateListResultDTO implements Serializable { + private static final long serialVersionUID = 6856602932571839314L; + + /** + * 模板Id + */ + private String templateId; + + /** + * 模板类型(站内信提醒) + */ + private String templateType; + + /** + * 所属端(居民端:resi 工作端:work) + */ + private String clientType; + +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PersonalTemplateController.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PersonalTemplateController.java index bec7a2d3a8..dc6099d9fe 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PersonalTemplateController.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/PersonalTemplateController.java @@ -1,7 +1,10 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.form.CustomerTemplateListFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; +import com.epmet.dto.result.CustomerTemplateListResultDTO; import com.epmet.dto.result.GetTemplateListResultDTO; import com.epmet.service.PersonalTemplateService; import org.springframework.beans.factory.annotation.Autowired; @@ -30,8 +33,20 @@ public class PersonalTemplateController { */ @PostMapping("templatelist") public Result> templateList(@RequestBody GetTemplateListFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, GetTemplateListFormDTO.AddUserInternalGroup.class); return new Result>().ok(personalTemplateService.templateList(formDTO)); } + /** + * @return + * @Description 获取客户两个端站内信模板Id + * @author sun + */ + @PostMapping("customertemplatelist") + public Result> customerTemplateList(@RequestBody CustomerTemplateListFormDTO formDTO) { + ValidatorUtils.validateEntity(formDTO, CustomerTemplateListFormDTO.AddUserInternalGroup.class); + return new Result>().ok(personalTemplateService.customerTemplateList(formDTO)); + } + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/PersonalTemplateDao.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/PersonalTemplateDao.java index a92981e0d4..6e229dc052 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/PersonalTemplateDao.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/PersonalTemplateDao.java @@ -19,8 +19,10 @@ package com.epmet.dao; import com.epmet.commons.mybatis.dao.BaseDao; import com.epmet.dto.PersonalTemplateDTO; +import com.epmet.dto.form.CustomerTemplateListFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; import com.epmet.dto.result.CustomerTempResultDTO; +import com.epmet.dto.result.CustomerTemplateListResultDTO; import com.epmet.dto.result.GetTemplateListResultDTO; import com.epmet.dto.result.TemplateDTO; import com.epmet.entity.PersonalTemplateEntity; @@ -85,4 +87,11 @@ public interface PersonalTemplateDao extends BaseDao { * @author sun */ List selectTemplateList(GetTemplateListFormDTO formDTO); + + /** + * @return + * @Description 获取客户两个端站内信模板Id + * @author sun + */ + List selectCustomerTemplateList(CustomerTemplateListFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PersonalTemplateService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PersonalTemplateService.java index 9f79ece63c..f3f0da9b49 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PersonalTemplateService.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/PersonalTemplateService.java @@ -20,7 +20,9 @@ package com.epmet.service; import com.epmet.commons.mybatis.service.BaseService; import com.epmet.commons.tools.page.PageData; import com.epmet.dto.PersonalTemplateDTO; +import com.epmet.dto.form.CustomerTemplateListFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; +import com.epmet.dto.result.CustomerTemplateListResultDTO; import com.epmet.dto.result.GetTemplateListResultDTO; import com.epmet.dto.result.TemplateDTO; import com.epmet.entity.PersonalTemplateEntity; @@ -132,4 +134,11 @@ public interface PersonalTemplateService extends BaseService templateList(GetTemplateListFormDTO formDTO); + + /** + * @return + * @Description 获取客户两个端站内信模板Id + * @author sun + */ + List customerTemplateList(CustomerTemplateListFormDTO formDTO); } \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PersonalTemplateServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PersonalTemplateServiceImpl.java index 8a5764427a..154cca9082 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PersonalTemplateServiceImpl.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/PersonalTemplateServiceImpl.java @@ -25,7 +25,9 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.dao.PersonalTemplateDao; import com.epmet.dto.PersonalTemplateDTO; +import com.epmet.dto.form.CustomerTemplateListFormDTO; import com.epmet.dto.form.GetTemplateListFormDTO; +import com.epmet.dto.result.CustomerTemplateListResultDTO; import com.epmet.dto.result.GetTemplateListResultDTO; import com.epmet.dto.result.TemplateDTO; import com.epmet.entity.PersonalTemplateEntity; @@ -129,4 +131,14 @@ public class PersonalTemplateServiceImpl extends BaseServiceImpl customerTemplateList(CustomerTemplateListFormDTO formDTO) { + return baseDao.selectCustomerTemplateList(formDTO); + } + } \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/wxapi/enums/WxMaErrorMsgEnum.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/wxapi/enums/WxMaErrorMsgEnum.java index 29e341df7a..1e9425c7ec 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/wxapi/enums/WxMaErrorMsgEnum.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/wxapi/enums/WxMaErrorMsgEnum.java @@ -476,6 +476,17 @@ public enum WxMaErrorMsgEnum { CODE_85012(85012, "无效的审核 id"), + CODE_87006(87006, "小游戏不能提交"), + CODE_86007(86007, "小程序禁止提交"), + CODE_85051(85012, "version_desc或者preview_info超限"), + CODE_85092(85092, "preview_info格式错误"), + CODE_85093(85093, "preview_info 视频或者图片个数超限"), + CODE_85094(85094, "需提供审核机制说明信息"), + CODE_86009(86009, "服务商新增小程序代码提审能力被限制"), + CODE_86010(86010, "服务商迭代小程序代码提审能力被限制"), + CODE_9400001(9400001, "该开发小程序已开通小程序直播权限,不支持发布版本。如需发版,请解绑开发小程序后再操作"), + CODE_9402202(9402202, "请勿频繁提交,待上一次操作完成后再提交"), + CODE_87013(87013, "撤回次数达到上限(每天一次,每个月 10 次)"), CODE_85019(85019, "没有审核版本"), @@ -539,6 +550,38 @@ public enum WxMaErrorMsgEnum { CODE_200020(200020, "关键词列表 kidList 参数错误"), CODE_200021(200021, "场景描述 sceneDesc 参数错误"), + + CODE_20002(20002, "商品id不存在"), + CODE_1003(1003, "POST参数非法"), + CODE_40005(40005, "上传素材文件格式不对"), + CODE_40006(40006, "上传素材文件大小超出限制"), + CODE_40008(40008, "不合法的消息类型"), + CODE_40010(40010, "不合法的语音文件大小"), + CODE_40011(40011, "不合法的视频文件大小"), + CODE_40012(40012, "不合法的缩略图文件大小"), + CODE_40015(40015, "不合法的菜单类型"), + CODE_40016(40016, "不合法的按钮个数"), + CODE_40017(40017, "不合法的按钮类型"), + CODE_40018(40018, "不合法的按钮名字长度"), + CODE_40019(40019, "不合法的按钮 KEY 长度"), + CODE_40020(40020, "不合法的按钮 URL 长度"), + CODE_40021(40021, "不合法的菜单版本号"), + CODE_40022(40022, "不合法的子菜单级数"), + CODE_40023(40023, "不合法的子菜单按钮个数"), + CODE_40024(40024, "不合法的子菜单按钮类型"), + CODE_40025(40025, "不合法的子菜单按钮名字长度"), + CODE_40026(40026, "不合法的子菜单按钮 KEY 长度"), + CODE_40027(40027, "不合法的子菜单按钮 URL 长度"), + CODE_40028(40028, "不合法的自定义菜单使用用户"), + CODE_40030(40030, "不合法的 refresh_token"), + CODE_40031(40031, "不合法的 openid 列表"), + CODE_40032(40032, "不合法的 openid 列表长度"), + CODE_40033(40033, "不合法的请求字符,不能包含 \\uxxxx 格式的字符"), + CODE_40034(40034, "无效的模板大小"), + CODE_40035(40035, "不合法的参数"), + CODE_40036(40036, "不合法的 template_id 长度"), + CODE_40038(40038, "不合法的请求格式"), + ; private int code; diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml index 0b3f7ace51..7eab9a2e63 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml +++ b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/PersonalTemplateDao.xml @@ -89,4 +89,19 @@ ORDER BY CREATED_TIME DESC + + \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/constant/UserMessageConstant.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/constant/UserMessageConstant.java index 5bea3d3a3a..2a0cf7b35f 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/constant/UserMessageConstant.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/constant/UserMessageConstant.java @@ -10,6 +10,7 @@ public interface UserMessageConstant { * 消息标题 */ String ISSUE_TITLE = "您有一条议题消息"; + String WXMP_ISSUE_TITLE = "议题消息"; /** * 项目跟踪-消息标题 */ @@ -18,21 +19,21 @@ public interface UserMessageConstant { /** * 议题关闭时,选择已解决 */ - String ISSUE_RESOLVED_MSG = "您好,您发表的话题\"%s\"问题已解决,解决方案是:%s"; + String ISSUE_RESOLVED_MSG = "您发表的话题\"%s\"问题已解决,解决方案是:%s"; /** * 议题关闭时,选择无需解决 */ - String ISSUE_UNRESOLVED_MSG = "您好,您发表的话题\"%s\"问题无需解决,原因:%s"; + String ISSUE_UNRESOLVED_MSG = "您发表的话题\"%s\"问题无需解决,原因:%s"; /** * 议题转项目消息模板 */ - String ISSUE_SHIFT_PROJECT_MSG = "您好,您发表的话题\"%s\"的问题,已由%s部门处理,请查看。"; + String ISSUE_SHIFT_PROJECT_MSG = "您发表的话题\"%s\"的问题,已由%s部门处理,请查看。"; /** * 议题转项目消息模板 */ - String PROJECT_RESOLVED_MSG = "您好。您收到一条【%s】的新信息,请您尽快处理。"; + String PROJECT_RESOLVED_MSG = "您收到一条【%s】的新信息,请您尽快处理。"; } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java index f5c690be74..ba08dc7952 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueServiceImpl.java @@ -92,6 +92,8 @@ public class IssueServiceImpl extends BaseServiceImpl imp private IssueVoteStatisticalDao issueVoteStatisticalDao; @Autowired private EpmetUserFeignClient epmetUserFeignClient; + @Autowired + private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; @Value("${openapi.scan.server.url}") private String scanApiUrl; @Value("${openapi.scan.method.textSyncScan}") @@ -434,6 +436,10 @@ public class IssueServiceImpl extends BaseServiceImpl imp if (!saveUserMessageList(topicDTO, messageContent, entity).success()) { throw new RenException(IssueConstant.SAVE_MSG_EXCEPTION); } + //4.4:2020.10.26 添加推送微信订阅消息功能 sun + if (!saveWxmpMessageList(topicDTO, messageContent, entity).success()) { + logger.error("议题关闭,推送微信订阅消息失败!"); + } //5:缓存中网格下表决中的议题总数减1 govIssueRedis.subtractWorkGrassrootsIssueRedDotValue(entity.getGridId()); @@ -468,6 +474,30 @@ public class IssueServiceImpl extends BaseServiceImpl imp } return messageFeignClient.saveUserMessageList(msgList); } + /** + * @Description 关闭议题时给话题创建人和议题发起人推送微信订阅消息 + * @author sun + */ + private Result saveWxmpMessageList(ResiTopicDTO topicDTO, String messageContent, IssueEntity entity) { + List msgList = new ArrayList<>(); + //2:分别给话题创建人、议题发起人发送消息 + WxSubscribeMessageFormDTO msgDTO = new WxSubscribeMessageFormDTO(); + msgDTO.setCustomerId(entity.getCustomerId()); + msgDTO.setClientType(AppClientConstant.APP_RESI); + msgDTO.setUserId(topicDTO.getCreatedBy()); + msgDTO.setBehaviorType(UserMessageConstant.WXMP_ISSUE_TITLE); + msgDTO.setMessageContent(messageContent); + msgDTO.setMessageTime(new Date()); + msgDTO.setGridId(entity.getGridId()); + msgList.add(msgDTO); + //话题人和议题人是同一个人时则只发送一条居民消息 + if (!topicDTO.getCreatedBy().equals(entity.getCreatedBy())) { + WxSubscribeMessageFormDTO msgIssue = ConvertUtils.sourceToTarget(msgDTO,WxSubscribeMessageFormDTO.class); + msgIssue.setUserId(entity.getCreatedBy()); + msgList.add(msgIssue); + } + return epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + } /** * @param formDTO @@ -583,6 +613,10 @@ public class IssueServiceImpl extends BaseServiceImpl imp 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 govIssueRedis.subtractWorkGrassrootsIssueRedDotValue(entity.getGridId()); @@ -637,6 +671,49 @@ public class IssueServiceImpl extends BaseServiceImpl imp }); return messageFeignClient.saveUserMessageList(msgList); } + /** + * @Description 议题转项目时给话题创建人、议题发起人、勾选的工作人员分别推送微信订阅消息 + * @author sun + */ + private Result wxmpShiftProjectMessage(IssueProjectResultDTO issueProjectResultDTO, ShiftProjectFormDTO formDTO, IssueEntity entity) { + List msgList = new ArrayList<>(); + //1:创建话题发起人、议题发表人消息对象 + WxSubscribeMessageFormDTO msgDTO = new WxSubscribeMessageFormDTO(); + msgDTO.setCustomerId(entity.getCustomerId()); + msgDTO.setClientType(AppClientConstant.APP_RESI); + msgDTO.setUserId(formDTO.getTopicDTO().getCreatedBy()); + msgDTO.setBehaviorType(UserMessageConstant.WXMP_ISSUE_TITLE); + String topicIssueMessage = String.format(UserMessageConstant.ISSUE_SHIFT_PROJECT_MSG, formDTO.getTopicDTO().getTopicContent(), issueProjectResultDTO.getOrgName()); + msgDTO.setMessageContent(topicIssueMessage); + msgDTO.setMessageTime(new Date()); + msgDTO.setGridId(entity.getGridId()); + msgList.add(msgDTO); + //话题人和议题人是同一个人时则只发送一条居民消息 + if (!formDTO.getTopicDTO().getCreatedBy().equals(entity.getCreatedBy())) { + WxSubscribeMessageFormDTO msgIssue = ConvertUtils.sourceToTarget(msgDTO, WxSubscribeMessageFormDTO.class); + msgIssue.setUserId(entity.getCreatedBy()); + msgList.add(msgIssue); + } + //2:创建项目工作人员消息对象 + String projectStaffMessage = String.format(UserMessageConstant.PROJECT_RESOLVED_MSG, entity.getIssueTitle()); + //所选人员如果即在部门下又在网格下则只发一条消息 + Map map = new HashMap<>(); + formDTO.getStaffList().forEach(staff->{ + if(!map.containsKey(staff.getStaffId())){ + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(entity.getCustomerId()); + msg.setClientType(AppClientConstant.APP_GOV); + msg.setUserId(staff.getStaffId()); + msg.setBehaviorType(UserMessageConstant.WXMP_ISSUE_TITLE); + msg.setMessageContent(projectStaffMessage); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + msgList.add(msg); + map.put(staff.getStaffId(),staff.getStaffId()); + } + }); + return epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + } /** * @Description diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java index fb70cb2906..d529abf12e 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/ProjectConstant.java @@ -105,6 +105,10 @@ public interface ProjectConstant { * 调用user-message服务失败 */ String SAVE_MSG_EXCEPTION = "发送消息失败"; + /** + * 调用user-message服务失败 + */ + String SAVE_WXMP_MSG_EXCEPTION = "发送微信订阅消息失败"; /** * 查询项目表数据失败 */ diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java index 9b0882e2cf..9a1323f55f 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/constant/UserMessageConstant.java @@ -11,15 +11,20 @@ public interface UserMessageConstant { */ String PROJECT_TITLE = "您有一条项目消息"; + /** + * 微信订阅消息部分标题 + */ + String WXMP_PROJECT_TITLE = "您有一条项目消息"; + /** * 议题转项目、项目流转、项目退回消息模板 */ - String PROJECT_RESOLVED_MSG = "您好。您收到一条【%s】的新信息,请您尽快处理。"; + String PROJECT_RESOLVED_MSG = "您收到一条【%s】的新信息,请您尽快处理。"; /** * 项目结案消息模板 */ - String PROJECT_CLOSED_MSG = "您好,您参与的【%s】项目已结案,原因:%s"; + String PROJECT_CLOSED_MSG = "您参与的【%s】项目已结案,原因:%s"; /** diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java index e4d9dc1074..c9cdefdf32 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java @@ -50,6 +50,7 @@ import com.epmet.entity.ProjectEntity; import com.epmet.entity.ProjectOrgRelationEntity; import com.epmet.entity.ProjectProcessEntity; import com.epmet.entity.ProjectStaffEntity; +import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.feign.EpmetUserFeignClient; import com.epmet.feign.EpmetUserOpenFeignClient; @@ -107,6 +108,8 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl page(Map params) { @@ -348,6 +351,11 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + ProjectEntity projectEntity = projectService.selectById(formDTO.getProjectId()); + if (null == projectEntity) { + throw new RenException(ProjectConstant.SELECT_PROJECT_EXCEPTION); + } + //3:创建项目工作人员消息对象 + //所选人员如果即在部门下又在网格下则只发一条消息 + Map map = new HashMap<>(); + String projectStaffMessage = String.format(UserMessageConstant.PROJECT_RESOLVED_MSG, projectEntity.getTitle()); + formDTO.getStaffList().forEach(staff->{ + if(!map.containsKey(staff.getStaffId())){ + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(ProjectConstant.GOV); + msg.setUserId(staff.getStaffId()); + msg.setBehaviorType(UserMessageConstant.WXMP_PROJECT_TITLE); + msg.setMessageContent(projectStaffMessage); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + msgList.add(msg); + map.put(staff.getStaffId(),staff.getStaffId()); + } + }); + return epmetMessageOpenFeignClient.sendWxSubscribeMessage(msgList); + } /** * @Description 议题处理进展——已转项目 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 2c62bff5b9..5fb0b85205 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 @@ -47,6 +47,8 @@ import org.apache.commons.collections4.CollectionUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -67,7 +69,7 @@ import java.util.stream.Collectors; @Service @Slf4j public class ProjectServiceImpl extends BaseServiceImpl implements ProjectService { - + private Logger logger = LogManager.getLogger(ProjectServiceImpl.class); @Autowired private ProjectRedis projectRedis; @Autowired @@ -90,6 +92,8 @@ public class ProjectServiceImpl extends BaseServiceImpl msgList = new ArrayList<>(); + //2020.10.26 添加项目结案发送微信订阅消息操作 sun + List wxmpMsgList = new ArrayList<>(); //通知项目相关人员 List personnelList = projectRelatedPersonnelService.getPersonnelListByProjectId(fromDTO.getProjectId()); personnelList.forEach(p -> { @@ -454,6 +460,15 @@ public class ProjectServiceImpl extends BaseServiceImpl staffList = projectStaffService.getStaffsByProjectId(fromDTO.getProjectId()); @@ -468,8 +483,22 @@ public class ProjectServiceImpl extends BaseServiceImpl wxmpMsgList = new ArrayList<>(); + WxSubscribeMessageFormDTO msg = new WxSubscribeMessageFormDTO(); + msg.setCustomerId(projectEntity.getCustomerId()); + msg.setClientType(AppClientConstant.APP_GOV); + msg.setUserId(projectStaffDTO.getStaffId()); + msg.setBehaviorType("项目消息"); + msg.setMessageContent(String.format(UserMessageConstant.PROJECT_RESOLVED_MSG, projectEntity.getTitle())); + msg.setMessageTime(new Date()); + msg.setGridId("*"); + wxmpMsgList.add(msg); + //发送微信订阅消息 sun + Result result = epmetMessageOpenFeignClient.sendWxSubscribeMessage(wxmpMsgList); + if (!result.success()) { + logger.error("项目退回成功,发送微信订阅消息失败" + JSON.toJSONString(result)); + } } @Override diff --git a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml index 18df0a762a..3ecb531145 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml +++ b/epmet-module/gov-project/gov-project-server/src/main/resources/mapper/ProjectStaffDao.xml @@ -41,7 +41,9 @@ LIMIT 1