skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sjztmd/feign/IAttResManagePersonClient.java
@@ -6,9 +6,11 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Set; /** * @ClassName AttResManagePersonClent @@ -30,6 +32,7 @@ String GET_USER_LIST_BY_RES_GUID = API_PREFIX + "/getUserListByResGuid"; String SYNCHARONIZATION_ADD_USER = API_PREFIX + "/synchronizationAddUser"; String SYNCHARONIZATION_UPDATE_USER = API_PREFIX + "/synchronizationUpdateUser"; String GET_PERSON_LIST_BY_WATER_CODE_LIST = API_PREFIX + "/getPersonListByWaterCodeList"; @GetMapping(QUERY_LIST_BY_PHONE) R queryListByPhone(@RequestParam("userPhone") String userPhone); @@ -60,4 +63,11 @@ @PostMapping(SYNCHARONIZATION_UPDATE_USER) int syncharonization_update_user(); /** * 通过水库代码获取巡查责任人及技术责任人手机号 * @param list * @return */ @PostMapping(GET_PERSON_LIST_BY_WATER_CODE_LIST) Set<String> getPersonListByWaterCodeList(@RequestBody List<String> list); } skjcmanager/skjcmanager-service-api/skjcmanager-sm-api/src/main/java/cn/gistack/sm/sjztmd/feign/IAttResManagePersonClientFallback.java
@@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.Set; /** * @ClassName Feign失败配置 @@ -46,4 +47,9 @@ public int syncharonization_update_user() { return 0; } @Override public Set<String> getPersonListByWaterCodeList(List<String> list) { return null; } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java
@@ -299,7 +299,7 @@ * @param endTime 短信内容填报截止时间 * @return */ @GetMapping("/import-send-rain-sms") @PostMapping("/import-send-rain-sms") public R importSendRainSms(MultipartFile file,String startTime,String endTime){ ExcelListener<SendRainSmsExcel> listener = new ExcelListener<>(); //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsAsyncService.java
New file @@ -0,0 +1,68 @@ package cn.gistack.alerts.sms.service.impl; import cn.com.flaginfo.sdk.cmc.api.result.ComResult; import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendDataResult; import cn.gistack.alerts.sms.entity.SmsRecord; import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.entity.SmsTemplate; import cn.gistack.alerts.sms.service.ISmsRecordService; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 异步调用方法 */ @Component public class SmsAsyncService { @Autowired private ISmsRecordService smsRecordService; /** * 异步记录发送记录 * @param smsResult * @param rows * @param smsTemplate * @param resultComResult */ @Async public void batchSaveSendRecord(SmsResult smsResult, String[] rows, SmsTemplate smsTemplate, ComResult<DynSMSSendDataResult> resultComResult) { if (null != smsResult){ List<SmsRecord> list = new ArrayList<>(); // 遍历保存 for (String row : rows) { SmsRecord smsRecord = new SmsRecord(); smsRecord.setId(IdWorker.getId()); String[] split = row.split(","); smsRecord.setTel(split[0]); List<Object> arrayList = new ArrayList<>(); for (int i = 0; i < split.length; i++) { // 第一个手机号码不要 if (i!=0){ arrayList.add(split[i]); } } String s = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s"); // 格式转换 String format = String.format(s, arrayList.toArray()); // 设置内容 smsRecord.setContent(format); smsRecord.setTemplateId(smsTemplate.getTemplateId()); smsRecord.setResultId(smsResult.getId()); smsRecord.setResponseStatus(resultComResult.getCode().toString()); smsRecord.setResponseMsg(resultComResult.getMsg()); // 加入集合 list.add(smsRecord); } // 批量保存记录 smsRecordService.batchSaveSendRecord(list); } } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -7,6 +7,7 @@ import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest; import cn.gistack.alerts.alarmRule.entity.AlarmRecordDetail; import cn.gistack.alerts.alarmRule.service.AlarmRecordDetailService; import cn.gistack.alerts.notice.util.FormatUtil; import cn.gistack.alerts.sms.constant.MinConstant; import cn.gistack.alerts.sms.entity.SmsRecord; import cn.gistack.alerts.sms.entity.SmsResult; @@ -18,7 +19,6 @@ import cn.gistack.alerts.sms.service.SmsService; import cn.gistack.alerts.sms.util.SmsUtils; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import cn.gistack.common.cache.CacheNames; import cn.gistack.sm.intelligentCall.entity.CallNotFillRecord; import cn.gistack.sm.intelligentCall.feign.OutCallClient; import cn.gistack.sm.sjztmd.feign.IAttResManagePersonClient; @@ -27,16 +27,14 @@ import org.jetbrains.annotations.NotNull; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 短信发送服务实现层 @@ -66,6 +64,9 @@ @Autowired private IAttResManagePersonClient attResManagePersonClient; @Autowired private SmsAsyncService asyncService; /** * 发送 xx 变量模板短信 @@ -228,6 +229,8 @@ String[] titleArr = params.get("title").toString().split(","); String data = params.get("data").toString(); String templateId = params.get("templateId").toString(); // 查询短信模板 SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id", templateId)); String content = params.get("content").toString(); List<String> phones = (List<String>)params.get("phones"); List<String> errPhones = new ArrayList<>(); @@ -236,46 +239,11 @@ for (String phone : phones) { hashSet.add(phone); } StringBuilder builder = new StringBuilder(); // 变量 for (String phone : hashSet) { if (validator(phone)){ builder.append(phone+","+data).append(";"); }else { // 异常手机号 errPhones.add(phone); } } String datas = builder.toString(); String[] rows = datas.split(";"); String[][] dyns = new String[rows.length + 1][titleArr.length]; dyns[0] = titleArr; int rowNum = 1; for (String row : rows) { String[] cols = row.split(","); dyns[rowNum++] = cols; } //请求参数 ComResult<DynSMSSendDataResult> resultComResult = sendDynSMSSendDataResultComResult(templateId, dyns); SmsResult smsResult = getSaveSmsResult(templateId, rows, content); if (null != smsResult){ List<SmsRecord> list = new ArrayList<>(); // 遍历保存 for (String phone : hashSet) { SmsRecord smsRecord = new SmsRecord(); smsRecord.setId(IdWorker.getId()); smsRecord.setTel(phone); smsRecord.setContent(content); smsRecord.setTemplateId(templateId); smsRecord.setResultId(smsResult.getId()); smsRecord.setResponseStatus(resultComResult.getCode().toString()); smsRecord.setResponseMsg(resultComResult.getMsg()); // 加入集合 list.add(smsRecord); } // 批量保存记录 smsRecordService.batchSaveSendRecord(list); } // 批量发送短信 Map<String, Object> batchSendSmsMap = batchSendSms(hashSet, titleArr, data, smsTemplate,errPhones); ComResult<DynSMSSendDataResult> resultComResult = (ComResult<DynSMSSendDataResult>)batchSendSmsMap.get("resultComResult"); errPhones = (List<String>) batchSendSmsMap.get("errPhones"); // 计算差值 Integer diff = phones.size() - hashSet.size(); if (resultComResult.getCode()==0){ String successMsg = "发送成功!共提交号码 "+phones.size()+" 个,其中重复号码 "+diff+" 个,错误号码 " @@ -538,13 +506,87 @@ */ @Override public Object importSendRainSms(List<SendRainSmsExcel> list,String startTime,String endTime) { String templateId = "2431012251309"; // 获取水库个数 Integer size = list.size(); List<String> errPhones = new ArrayList<>(); // 转换 List<String> stringList = list.stream().map(SendRainSmsExcel::getWaterCode).collect(Collectors.toList()); // 通过水库代码获取巡查责任人及技术责任人手机号 // Set<String> personList = attResManagePersonClient.getPersonListByWaterCodeList(list); Set<String> personList = attResManagePersonClient.getPersonListByWaterCodeList(stringList); // 查询短信模板 SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id", templateId)); String param = startTime + "-" + endTime; // 拼接短信标题数组 String [] titleArr = getSmsTitleArr(smsTemplate); // 批量发送短信 Map<String, Object> batchSendSmsMap = batchSendSms(personList, titleArr, param, smsTemplate,errPhones); ComResult<DynSMSSendDataResult> resultComResult = (ComResult<DynSMSSendDataResult>)batchSendSmsMap.get("resultComResult"); errPhones = (List<String>) batchSendSmsMap.get("errPhones"); // 计算差值 Integer diff = size - errPhones.size(); if (resultComResult.getCode()==0){ String successMsg = "发送成功!共导入水库个数 "+ size +" 个,其中发送号码 "+ diff + " 个。"; // 返回 return R.data(200,successMsg,null); } String errorMsg = "发送失败!共导入水库个数 "+ size +" 个,发送异常号码 "+ diff + " 个,异常原因" + resultComResult.getMsg() + "。"; // 返回 return null; return R.data(400,errorMsg,null); } /** * 拼接短信标题数组 * @param smsTemplate * @return */ private String[] getSmsTitleArr(SmsTemplate smsTemplate) { String title = FormatUtil.composeMessage(smsTemplate.getContent()); // 返回 return title.split(","); } /** * 批量发送动态短信 * @param phoneList * @param titleArr 示例: [手机号码,水库名称,水位值] * @param param 示例: ***水库,15.12 * @param smsTemplate * @return */ private Map<String, Object> batchSendSms(Set<String> phoneList,String[] titleArr,String param,SmsTemplate smsTemplate,List<String> errPhones){ Map<String, Object> map = new HashMap<>(); StringBuilder builder = new StringBuilder(); // 遍历,拼接短信 if (phoneList.size()>0){ for (String phone : phoneList) { if (validator(phone)){ builder.append(phone+","+ param).append(";"); }else { // 异常手机号 errPhones.add(phone); } } } String datas = builder.toString(); String[] rows = datas.split(";"); String[][] dyns = new String[rows.length + 1][titleArr.length]; dyns[0] = titleArr; int rowNum = 1; for (String row : rows) { String[] cols = row.split(","); dyns[rowNum++] = cols; } //请求参数 ComResult<DynSMSSendDataResult> resultComResult = sendDynSMSSendDataResultComResult(smsTemplate.getTemplateId(), dyns); SmsResult smsResult = getSaveSmsResult(smsTemplate.getTemplateId(), rows, ""); // 异步记录发送记录 asyncService.batchSaveSendRecord(smsResult,rows,smsTemplate,resultComResult); // 返回 map.put("errPhones",errPhones); map.put("resultComResult",resultComResult); return map; } } skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml
@@ -29,6 +29,9 @@ <groupId>cn.com.flaginfo.sdk.cmc</groupId> <artifactId>send-api-sdk</artifactId> <version>1.2.1</version> <!-- <type>jar</type>--> <!-- <scope>system</scope>--> <!-- <systemPath>${project.basedir}/libs/send-api-sdk-1.2.1.jar</systemPath>--> </dependency> <!--开启多数据源--> <dependency> skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/feign/AttResManagePersonClient.java
@@ -12,12 +12,14 @@ import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; /** * @ClassName SM服务Feign实现类 @@ -91,4 +93,15 @@ public int syncharonization_update_user() { return attResManagePersonService.synchronizationUpdateUser(); } /** * 通过水库代码获取巡查责任人及技术责任人手机号 * @param list * @return */ @Override @PostMapping(GET_PERSON_LIST_BY_WATER_CODE_LIST) public Set<String> getPersonListByWaterCodeList(List<String> list) { return attResManagePersonService.getPersonListByWaterCodeList(list); } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/mapper/AttResManagePersonMapper.java
@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Set; /** * @ClassName AttResManagePersonMapper @@ -20,6 +21,7 @@ public interface AttResManagePersonMapper extends BaseMapper<AttResManagePerson> { Integer updateResManagePersonByGuid(@Param("attResManagePerson")AttResManagePerson attResManagePerson); Integer insertResManagePersion(@Param("attResManagePerson")AttResManagePerson attResManagePerson); List<AttResManagePerson> attResManagePersonListByResId(List<Long> resId); @@ -38,6 +40,14 @@ List<UserPersonVO> getPersonByUserNotExists(); List<UserPersonVO> getPersonByUser(); int updateUserByPerson(); /** * 通过水库代码获取巡查责任人及技术责任人手机号 * @param list * @return */ @DS("zt") Set<String> getPersonListByWaterCodeList(@Param("list") List<String> list); } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/mapper/AttResManagePersonMapper.xml
@@ -154,4 +154,24 @@ where a.phone = b."user_phone" and a.role_id <> b.role_id </update> <!--通过水库代码获取巡查责任人及技术责任人手机号--> <select id="getPersonListByWaterCodeList" resultType="java.lang.String"> SELECT b."user_phone" FROM SJZT_MD."att_res_base" a LEFT JOIN SJZT_MD."att_res_manage_person" b ON a."guid" = b."res_guid" where 1=1 and (b."type" = 4 or b."type" = 5) <choose> <when test="list!=null and list.size()>0"> and "sk_code" in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> </when> <otherwise> and "sk_code" in ('') </otherwise> </choose> group by b."user_phone" </select> </mapper> skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/IAttResManagePersonService.java
@@ -8,6 +8,7 @@ import org.springblade.core.tool.api.R; import java.util.List; import java.util.Set; /** * @ClassName AttResManagePerson @@ -55,4 +56,10 @@ */ int synchronizationUpdateUser(); /** * 通过水库代码获取巡查责任人及技术责任人手机号 * @param list * @return */ Set<String> getPersonListByWaterCodeList(List<String> list); } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResManagePersonServiceImpl.java
@@ -18,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Set; /** * @ClassName AttResManagePersonServiceImpl @@ -128,4 +129,13 @@ return ret; } /** * 通过水库代码获取巡查责任人及技术责任人手机号 * @param list * @return */ @Override public Set<String> getPersonListByWaterCodeList(List<String> list) { return baseMapper.getPersonListByWaterCodeList(list); } }