SmsService.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package com.xunmei.sms.service;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.dc.eai.data.CompositeData;
  6. import com.dcfs.esb.client.ESBClient;
  7. import com.xunmei.common.core.constant.ErrorMsgConstants;
  8. import com.xunmei.common.core.constant.HttpStatus;
  9. import com.xunmei.common.core.constant.SecurityConstants;
  10. import com.xunmei.common.core.domain.reminder.dto.ReminderScheduleMsgDto;
  11. import com.xunmei.common.core.domain.reminder.vo.ReminderScheduleMsgVo;
  12. import com.xunmei.common.core.web.domain.AjaxResult;
  13. import com.xunmei.sms.utils.SmsUtil;
  14. import com.xunmei.system.api.RemoteOrgService;
  15. import com.xunmei.system.api.RemoteRoleService;
  16. import com.xunmei.system.api.domain.SysOrg;
  17. import com.xunmei.system.api.domain.SysUser;
  18. import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
  19. import com.xunmei.system.api.vo.SmsInfoVo;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.scheduling.annotation.Async;
  26. import org.springframework.stereotype.Service;
  27. import java.util.ArrayList;
  28. import java.util.Date;
  29. import java.util.List;
  30. @Service
  31. @Slf4j
  32. public class SmsService implements ISmsService {
  33. private static Logger logger = LoggerFactory.getLogger(SmsService.class);
  34. @Autowired
  35. private RemoteRoleService remoteRoleService;
  36. @Autowired
  37. private RemoteOrgService remoteOrgService;
  38. @Autowired
  39. private ISmsSendRecordService recordService;
  40. //告警代码
  41. private static final String ALARM_CODE = "854002";
  42. //逾期提醒代码
  43. private static final String TODO_CODE = "854001";
  44. /**
  45. * 在ESB系统里的 系统编码
  46. */
  47. @Value("${sms.system.code}")
  48. private String systemCode;
  49. /**
  50. * 系统名称
  51. */
  52. @Value("${sms.system.name}")
  53. private String systemName;
  54. /**
  55. * 服务代码
  56. */
  57. @Value("${sms.service.code}")
  58. private String serviceCode;
  59. /**
  60. * 服务场景
  61. */
  62. @Value("${sms.service.scene}")
  63. private String serviceScene;
  64. /**
  65. * 发送短信
  66. *
  67. * @param data
  68. * @return {@link AjaxResult}
  69. */
  70. @Override
  71. @Async
  72. public AjaxResult send(SmsInfoVo data) {
  73. try {
  74. logger.debug("【发送短信】开始,数据:" + JSONObject.toJSON(data));
  75. CompositeData smsCompositeData = SmsUtil.createSmsBody(data, systemCode, systemName, serviceCode, serviceScene);
  76. logger.debug("【发送短信】转换后数据:" + JSONObject.toJSON(smsCompositeData));
  77. if (smsCompositeData == null) {
  78. logger.error("【发送短信】转换数据出错:原数据:" + JSONObject.toJSON(data));
  79. return AjaxResult.error("【发送短信】转换数据出错");
  80. }
  81. CompositeData rspData = ESBClient.request(smsCompositeData);
  82. logger.debug("【发送短信】返回数据:" + JSONObject.toJSON(rspData));
  83. return getResult(rspData);
  84. } catch (Exception ex) {
  85. logger.error("【发送短信】发送时内部异常:数据:" + JSONObject.toJSON(data), ex);
  86. return AjaxResult.error("【发送短信】发送时内部异常");
  87. }
  88. }
  89. /**
  90. * 根据机构获取机构下网点负责人角色,并发送告警短信
  91. *
  92. * @param orgId
  93. * @param alarmContent
  94. * @return
  95. */
  96. @Override
  97. public void sendSmsIot(Long orgId, String alarmType, String alarmContent, String alarmTime) {
  98. List<SysUser> userList = RemoteCallHandlerExecutor.executeRemoteCall(() ->
  99. remoteRoleService.selectUserByRoleNameAndOrgId("网点负责人", orgId, 0, SecurityConstants.INNER), ErrorMsgConstants.QUERY_USER_DATA_ERROR);
  100. SysOrg sysOrg = remoteOrgService.selectOrgById(orgId, SecurityConstants.INNER);
  101. Date now = new Date();
  102. String date = DateUtil.format(now, "yyyy-MM-dd");
  103. String time = DateUtil.format(now, "HH:mm:ss");
  104. if (ObjectUtil.isNotEmpty(userList)) {
  105. for (SysUser sysUser : userList) {
  106. SmsInfoVo smsInfoVo = new SmsInfoVo();
  107. smsInfoVo.setBelongBranchId(sysOrg.getGuid());
  108. smsInfoVo.setTranType(ALARM_CODE);
  109. smsInfoVo.setMobile(sysUser.getPhone());
  110. smsInfoVo.setOccurDate(date);
  111. smsInfoVo.setOccurTime(time);
  112. smsInfoVo.setRetMsg(alarmType);
  113. smsInfoVo.setBak3(alarmContent);
  114. deal(sysOrg, sysUser, smsInfoVo);
  115. }
  116. }
  117. }
  118. private void deal(SysOrg sysOrg, SysUser sysUser, SmsInfoVo smsInfoVo) {
  119. if (ObjectUtil.isEmpty(sysUser.getPhone())) {
  120. AjaxResult result = AjaxResult.error("用户" + sysUser.getName() + "手机号为空");
  121. recordService.saveSmsRecord(sysOrg, sysUser, result, smsInfoVo);
  122. return;
  123. }
  124. CompositeData smsCompositeData = SmsUtil.createSmsBody(smsInfoVo, systemCode, systemName, serviceCode, serviceScene);
  125. CompositeData rspData = null;
  126. try {
  127. rspData = ESBClient.request(smsCompositeData);
  128. } catch (Exception e) {
  129. logger.error("短信发送时发生异常 :", e);
  130. }
  131. AjaxResult result = getResult(rspData);
  132. recordService.saveSmsRecord(sysOrg, sysUser, result, smsInfoVo);
  133. }
  134. @Override
  135. public void sendSmsTodo(Long orgId, String type, String content, Date time) {
  136. List<SysUser> userList = RemoteCallHandlerExecutor.executeRemoteCall(() ->
  137. remoteRoleService.selectUserByRoleNameAndOrgId("网点负责人", orgId, 0, SecurityConstants.INNER), ErrorMsgConstants.QUERY_USER_DATA_ERROR);
  138. SysOrg sysOrg = remoteOrgService.selectOrgById(orgId, SecurityConstants.INNER);
  139. String date = DateUtil.format(time, "yyyy-MM-dd");
  140. Date now = new Date();
  141. String day = DateUtil.format(now, "yyyy-MM-dd");
  142. String sfm = DateUtil.format(now, "HH:mm:ss");
  143. if (ObjectUtil.isNotEmpty(userList)) {
  144. for (SysUser sysUser : userList) {
  145. SmsInfoVo smsInfoVo = new SmsInfoVo();
  146. smsInfoVo.setBelongBranchId(sysOrg.getGuid());
  147. smsInfoVo.setTranType(TODO_CODE);
  148. smsInfoVo.setMobile(sysUser.getPhone());
  149. smsInfoVo.setOccurDate(day);
  150. smsInfoVo.setOccurTime(sfm);
  151. smsInfoVo.setRetMsg(type);
  152. smsInfoVo.setBak3("任务【" + content + "】未完成,将于" + date + "逾期。");
  153. deal(sysOrg, sysUser, smsInfoVo);
  154. }
  155. }
  156. }
  157. @Override
  158. public List<ReminderScheduleMsgVo> sendReminderSms(List<ReminderScheduleMsgDto> msgDto) {
  159. Date now = new Date();
  160. String date = DateUtil.format(now, "yyyy-MM-dd");
  161. String time = DateUtil.format(now, "HH:mm:ss");
  162. List<ReminderScheduleMsgVo> returnData = new ArrayList<>();
  163. for (ReminderScheduleMsgDto dto : msgDto) {
  164. SmsInfoVo smsInfoVo = new SmsInfoVo();
  165. smsInfoVo.setBelongBranchId(dto.getOrgGuid());
  166. smsInfoVo.setTranType(TODO_CODE);
  167. smsInfoVo.setMobile(dto.getPhone());
  168. smsInfoVo.setOccurDate(date);
  169. smsInfoVo.setOccurTime(time);
  170. smsInfoVo.setRetMsg(dto.getType());
  171. smsInfoVo.setBak3(dto.getMsgContent());
  172. AjaxResult result;
  173. if (ObjectUtil.isEmpty(dto.getPhone())) {
  174. result = AjaxResult.error("用户" + dto.getRecipientName() + "手机号为空");
  175. } else {
  176. CompositeData rspData = null;
  177. CompositeData smsCompositeData = SmsUtil.createSmsBody(smsInfoVo, systemCode, systemName, serviceCode, serviceScene);
  178. try {
  179. rspData = ESBClient.request(smsCompositeData);
  180. } catch (Exception e) {
  181. logger.error("短信发送时发生异常 :", e);
  182. }
  183. result = getResult(rspData);
  184. }
  185. if (result.get(AjaxResult.CODE_TAG).equals(String.valueOf(HttpStatus.ERROR))) {
  186. ReminderScheduleMsgVo msgVo = new ReminderScheduleMsgVo();
  187. String msg = (String) result.get(AjaxResult.MSG_TAG);
  188. msgVo.setMsg(msg);
  189. msgVo.setStatus(2);
  190. msgVo.setScheduleId(dto.getScheduleId());
  191. returnData.add(msgVo);
  192. }
  193. recordService.saveSmsRecord(dto, result, smsInfoVo);
  194. }
  195. return returnData;
  196. }
  197. private AjaxResult getResult(CompositeData repData) {
  198. if (repData == null) {
  199. return AjaxResult.error("【发送短信】发送短信失败,短信发送返回结果为空");
  200. }
  201. boolean result = false;
  202. try {
  203. String retStatus = repData.getStruct("SYS_HEAD")
  204. .getField("RET_STATUS").strValue();
  205. String retCode = repData.getStruct("SYS_HEAD").getArray("RET")
  206. .getStruct(0).getField("RET_CODE").strValue();
  207. if ("S".equals(retStatus) && "000000".equals(retCode)) {
  208. return AjaxResult.success();
  209. } else {
  210. String retMsg = repData.getStruct("SYS_HEAD").getArray("RET")
  211. .getStruct(0).getField("RET_MSG").strValue();
  212. return AjaxResult.error(retMsg);
  213. }
  214. } catch (Exception e) {
  215. return AjaxResult.error("【发送短信】解析发送结果时内部异常");
  216. }
  217. }
  218. }