SmsUtil.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. package com.xunmei.sms.utils;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.RandomUtil;
  4. import com.dc.eai.data.CompositeData;
  5. import com.dc.eai.data.Field;
  6. import com.dc.eai.data.FieldAttr;
  7. import com.dc.eai.data.FieldType;
  8. import com.xunmei.system.api.vo.SmsInfoVo;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import java.util.Date;
  12. /**
  13. * 短信工具类
  14. */
  15. public class SmsUtil {
  16. private static Logger logger = LoggerFactory.getLogger(SmsUtil.class);
  17. /**
  18. * 消费者系统流水号格式:系统编号(5位)+本系统交易日期(8位:YYYYMMDD)+业务流水序号(10位)
  19. * @param systemCode 系统编号
  20. * @return
  21. */
  22. public static String getConsumerSeqNo(String systemCode,String tranDate){
  23. StringBuffer sb = new StringBuffer();
  24. //系统编号
  25. sb.append(systemCode);
  26. //本系统交易日期
  27. sb.append(tranDate);
  28. //业务流水序号
  29. String seqNo = RandomUtil.randomNumbers(10);
  30. sb.append(seqNo);
  31. return sb.toString();
  32. }
  33. /**
  34. * 生成短信请求系统头
  35. * @return
  36. */
  37. public static CompositeData getSysHead(String systemCode,String systemName,String serviceCode,String serviceScene){
  38. CompositeData sysData = new CompositeData();
  39. Date nowTime = new Date();
  40. String yyyyMMdd = DateUtil.format(nowTime, "yyyyMMdd");
  41. String hhmmss = DateUtil.format(nowTime, "hhmmss");
  42. //发送方机构ID,当前系统没有设置为空
  43. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  44. field.setValue("");
  45. sysData.addField("BRANCH_ID", field);
  46. //消费者系统编号 ESB分配的系统编号
  47. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  48. field.setValue(systemCode);
  49. sysData.addField("CONSUMER_ID", field);
  50. //消费者系统流水号(直接请求系统) 系统编号(5位)+本系统交易日期(8位:YYYYMMDD)+业务流水序号(10位)
  51. String consumerSeqNo = SmsUtil.getConsumerSeqNo(systemCode,yyyyMMdd);
  52. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  53. field.setValue(consumerSeqNo);
  54. sysData.addField("CONSUMER_SEQ_NO", field);
  55. //文件标识 0-非文件,1-文件
  56. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  57. field.setValue("0");
  58. sysData.addField("FILE_FLAG", field);
  59. //原始发起方系统编号 和消费者系统编号一致
  60. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  61. field.setValue(systemCode);
  62. sysData.addField("ORG_SYS_ID", field);
  63. //原始发起方系统流水号 和 消费者系统编号一致
  64. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  65. field.setValue(consumerSeqNo);
  66. sysData.addField("ORG_SYS_SEQ_NO", field);
  67. //服务代码
  68. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  69. field.setValue(serviceCode);
  70. sysData.addField("SERVICE_CODE", field);
  71. //服务场景
  72. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  73. field.setValue(serviceScene);
  74. sysData.addField("SERVICE_SCENE", field);
  75. //发送方网点号,默认设置为空
  76. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  77. field.setValue("");
  78. sysData.addField("SUB_BRANCH_ID", field);
  79. //交易日期 yyyyMMdd
  80. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  81. field.setValue(yyyyMMdd);
  82. sysData.addField("TRAN_DATE", field);
  83. //交易时间 hh:mm:ss
  84. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  85. field.setValue(hhmmss);
  86. sysData.addField("TRAN_TIMESTAMP", field);
  87. //交易标志 0-正常,1-补正,2-冲销
  88. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  89. field.setValue("0");
  90. sysData.addField("TRAN_FLAG", field);
  91. //交易模式
  92. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  93. field.setValue("ONLINE");
  94. sysData.addField("TRAN_MODE", field);
  95. //交易柜员号,默认为空
  96. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  97. field.setValue("");
  98. sysData.addField("USER_ID", field);
  99. //交易系统名
  100. field = new Field(new FieldAttr(FieldType.FIELD_STRING, 15, 0));
  101. field.setValue(systemName);
  102. sysData.addField("WS_ADDR", field);
  103. return sysData;
  104. }
  105. /**
  106. * 构建应用消息体
  107. * @return
  108. */
  109. private static CompositeData getAppHead(){
  110. CompositeData appData = new CompositeData();
  111. //KEY_MSG_FLAG 0-无,1-多页式
  112. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
  113. field.setValue("0");
  114. appData.addField("KEY_MSG_FLAG", field);
  115. return appData;
  116. }
  117. /**
  118. * 构建发送消息体
  119. * @param source
  120. * @return
  121. */
  122. private static CompositeData getBody(SmsInfoVo source){
  123. CompositeData body = new CompositeData();
  124. if (source.getTranType() != null) {
  125. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 6, 0));
  126. field.setValue(source.getTranType());
  127. body.addField("TRAN_TYPE", field);
  128. }
  129. if (source.getBelongBranchId() != null) {
  130. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 9, 0));
  131. field.setValue(source.getBelongBranchId());
  132. body.addField("BELONG_BRANCH_ID", field);
  133. }
  134. if (source.getCustNo() != null) {
  135. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 22, 0));
  136. field.setValue(source.getCustNo());
  137. body.addField("CUST_NO", field);
  138. }
  139. if (source.getCustName() != null) {
  140. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
  141. field.setValue(source.getCustNo());
  142. body.addField("CUST_NAME", field);
  143. }
  144. if (source.getSex() != null) {
  145. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 2, 0));
  146. field.setValue(source.getSex());
  147. body.addField("SEX", field);
  148. }
  149. if (source.getMobile() != null) {
  150. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 20, 0));
  151. field.setValue(source.getMobile());
  152. body.addField("MOBILE", field);
  153. }
  154. if (source.getAcctNo() != null) {
  155. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 32, 0));
  156. field.setValue(source.getAcctNo());
  157. body.addField("ACCT_NO", field);
  158. }
  159. if (source.getOccurDate() != null) {
  160. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 10, 0));
  161. field.setValue(source.getOccurDate());
  162. body.addField("OCCUR_DATE", field);
  163. }
  164. if (source.getOccurTime() != null) {
  165. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 10, 0));
  166. field.setValue(source.getOccurTime());
  167. body.addField("OCCUR_TIME", field);
  168. }
  169. if (source.getTranAmt1() != null) {
  170. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
  171. field.setValue(source.getTranAmt1());
  172. body.addField("TRAN_AMT1", field);
  173. }
  174. if (source.getTranAmt2() != null) {
  175. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
  176. field.setValue(source.getTranAmt2());
  177. body.addField("TRAN_AMT2", field);
  178. }
  179. if (source.getTranAmt3() != null) {
  180. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 17, 0));
  181. field.setValue(source.getTranAmt3());
  182. body.addField("TRAN_AMT3", field);
  183. }
  184. if (source.getPayoutStoreBit1() != null) {
  185. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
  186. field.setValue(source.getPayoutStoreBit1());
  187. body.addField("PAYOUT_STORE_BIT1", field);
  188. }
  189. if (source.getPayoutStoreBit2() != null) {
  190. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
  191. field.setValue(source.getPayoutStoreBit2());
  192. body.addField("PAYOUT_STORE_BIT2", field);
  193. }
  194. if (source.getPayoutStoreBit3() != null) {
  195. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 1, 0));
  196. field.setValue(source.getPayoutStoreBit3());
  197. body.addField("PAYOUT_STORE_BIT3", field);
  198. }
  199. if (source.getTranRemark() != null) {
  200. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 30, 0));
  201. field.setValue(source.getTranRemark());
  202. body.addField("TRAN_REMARK", field);
  203. }
  204. if (source.getAcctStatus() != null) {
  205. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 100, 0));
  206. field.setValue(source.getAcctStatus());
  207. body.addField("ACCT_STATUS", field);
  208. }
  209. if (source.getRetMsg() != null) {
  210. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 10, 0));
  211. field.setValue(source.getRetMsg());
  212. body.addField("RET_MSG", field);
  213. }
  214. if (source.getChannelType() != null) {
  215. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 2, 0));
  216. field.setValue(source.getChannelType());
  217. body.addField("CHANNEL_TYPE", field);
  218. }
  219. if (source.getBak1() != null) {
  220. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
  221. field.setValue(source.getBak1());
  222. body.addField("BAK1", field);
  223. }
  224. if (source.getBak2() != null) {
  225. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
  226. field.setValue(source.getBak2());
  227. body.addField("BAK2", field);
  228. }
  229. if (source.getBak3() != null) {
  230. Field field = new Field(new FieldAttr(FieldType.FIELD_STRING, 50, 0));
  231. field.setValue(source.getBak3());
  232. body.addField("BAK3", field);
  233. }
  234. return body;
  235. }
  236. /**
  237. * 构建发送消息体
  238. * @param source 构建body实体
  239. * @param systemCode 系统编号
  240. * @param systemName 系统名称
  241. * @param serviceCode 服务code
  242. * @param serviceScene 服务场景
  243. * @return
  244. */
  245. public static CompositeData createSmsBody(SmsInfoVo source, String systemCode, String systemName, String serviceCode, String serviceScene) {
  246. try {
  247. /***********************************************************************
  248. * *********构造请求数据,定义相关结构体*******
  249. **********************************************************************/
  250. CompositeData reqData = new CompositeData();
  251. //构建服务
  252. CompositeData sysHead = getSysHead(systemCode, systemName, serviceCode, serviceScene);
  253. CompositeData appHead = getAppHead();
  254. CompositeData body = getBody(source);
  255. reqData.addStruct("SYS_HEAD", sysHead);
  256. reqData.addStruct("APP_HEAD", appHead);
  257. reqData.addStruct("BODY", body);
  258. return reqData;
  259. } catch (Exception ex) {
  260. logger.error("【发送短信】转换数据异常", ex);
  261. return null;
  262. }
  263. }
  264. }