DtsController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.kxs.transfer.api.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.aliyun.dts.subscribe.clients.record.DefaultUserRecord;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.kxs.product.api.model.KxsMerchant;
  6. import com.kxs.system.api.model.KxsSchoolStudy;
  7. import com.kxs.transfer.api.annotation.DtsMsgListener;
  8. import com.kxs.transfer.api.model.KxsDtsErrorLog;
  9. import com.kxs.transfer.api.model.KxsDtsLog;
  10. import com.kxs.transfer.api.model.table.DMLData;
  11. import com.kxs.transfer.api.service.KxsDtsErrorLogService;
  12. import com.kxs.transfer.api.service.KxsDtsLogService;
  13. import com.kxs.transfer.api.service.product.*;
  14. import com.kxs.transfer.api.service.store.KxsMachineRecycleService;
  15. import com.kxs.transfer.api.service.store.KxsWarehouseService;
  16. import com.kxs.transfer.api.service.sys.KxsMorningLogService;
  17. import com.kxs.transfer.api.service.sys.KxsMorningService;
  18. import com.kxs.transfer.api.service.sys.KxsSchoolStudyService;
  19. import com.kxs.transfer.api.service.user.*;
  20. import com.kxs.user.api.model.KxsPartner;
  21. import lombok.RequiredArgsConstructor;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.commons.lang.exception.ExceptionUtils;
  24. import org.springframework.web.bind.annotation.RestController;
  25. import java.util.List;
  26. /**
  27. * <p>
  28. * DTS控制器
  29. * 在此控制器里做数据分发
  30. * 比如将数据分发到不同的数据源中
  31. * </p>
  32. *
  33. * @author 没秃顶的码农
  34. * @date 2024-01-25
  35. */
  36. @RestController
  37. @Slf4j
  38. @RequiredArgsConstructor
  39. public class DtsController {
  40. private final KxsDtsLogService kxsDtsLogService;
  41. private final KxsDtsErrorLogService kxsDtsErrorLogService;
  42. private final KxsUserService kxsUserService;
  43. private final KxsUserPresetLogService kxsUserPresetLogService;
  44. private final KxsUserAddressService kxsUserAddressService;
  45. private final KxsUserAmountService kxsUserAmountService;
  46. private final KxsUserAdvanceService kxsUserAdvanceService;
  47. private final KxsUserAmountLogService kxsUserAmountLogService;
  48. private final KxsUserWithdrawalService kxsUserWithdrawalService;
  49. private final KxsLeaderService kxsLeaderService;
  50. private final KxsLeaderAmountLogService kxsLeaderAmountLogService;
  51. private final KxsPartnerService kxsPartnerService;
  52. private final KxsMorningService kxsMorningService;
  53. private final KxsSchoolStudyService kxsSchoolStudyService;
  54. private final KxsMachineService kxsMachineService;
  55. //产品模块
  56. private final KxsShopGoodsService kxsShopGoodsService;
  57. private final KxsMachinePledgeService kxsMachinePledgeService;
  58. private final KxsMachineRatioService kxsMachineRatioService;
  59. private final KxsTicketService kxsTicketService;
  60. private final KxsTicketTransferService kxsTicketTransferService;
  61. private final KxsMerchantService kxsMerchantService;
  62. //仓库模块
  63. private final KxsWarehouseService kxsWarehouseService;
  64. private final KxsMachineRecycleService kxsMachineRecycleService;
  65. @DtsMsgListener
  66. public void dtsListener(Long dataId, DMLData dmlData, DefaultUserRecord record) {
  67. try {
  68. //过滤无效数据
  69. if ("Users".equals(dmlData.getTableName())) {
  70. List<String> changeFieldList = dmlData.getChangeFieldList();
  71. //过滤Users老表记录登陆设备的信息日志
  72. if (changeFieldList.size() == 2 && changeFieldList.contains("DeviceId") && changeFieldList.contains("DeviceType")) {
  73. record.commit(String.valueOf(record.getSourceTimestamp()));
  74. return;
  75. }
  76. if (changeFieldList.size() == 1 && changeFieldList.contains("DeviceId")) {
  77. // 如果changeFieldList的大小为1,且changeFieldList包含DeviceId,则提交记录
  78. record.commit(String.valueOf(record.getSourceTimestamp()));
  79. return;
  80. }
  81. //过滤Users本月交易额字段
  82. if (changeFieldList.size() == 1 && changeFieldList.contains("ThisMonthTrade")) {
  83. record.commit(String.valueOf(record.getSourceTimestamp()));
  84. return;
  85. }
  86. //过滤Users库存更新字段
  87. if (changeFieldList.size() == 1 && changeFieldList.contains("StoreStock")) {
  88. record.commit(String.valueOf(record.getSourceTimestamp()));
  89. return;
  90. }
  91. }
  92. //去重数据
  93. KxsDtsLog dtsLog = kxsDtsLogService.getOne(Wrappers.<KxsDtsLog>lambdaQuery().eq(KxsDtsLog::getDataId, dataId));
  94. if (dtsLog != null) {
  95. log.info("dts的数据重复:{},dataID:{}", dmlData.getValidFieldDataMap(), dataId);
  96. record.commit(String.valueOf(record.getSourceTimestamp()));
  97. return;
  98. }
  99. // if (!"UserMoveInfo".equals(dmlData.getTableName())) {
  100. // log.info("开始消费:{}表的数据,dataID:{}, 表名:{}", dmlData.getTableName(), dataId, dmlData.getDatabaseName());
  101. // }
  102. //用户表
  103. if ("Users".equals(dmlData.getTableName())) {
  104. kxsUserService.changeUser(dmlData);
  105. }
  106. //用户预设职级表
  107. if ("UserRankWhite".equals(dmlData.getTableName())) {
  108. kxsUserPresetLogService.changeUser(dmlData);
  109. }
  110. //密码操作
  111. if ("UserMoveInfo".equals(dmlData.getTableName())) {
  112. kxsUserService.changeUserPwd(dmlData);
  113. //密码操作不存储原始数据
  114. record.commit(String.valueOf(record.getSourceTimestamp()));
  115. return;
  116. }
  117. //用户地址表
  118. if ("UserAddress".equals(dmlData.getTableName())) {
  119. kxsUserAddressService.changeData(dmlData);
  120. }
  121. //用户账户
  122. if ("UserAccount".equals(dmlData.getTableName()) && "KxsProfitServer".equals(dmlData.getDatabaseName())) {
  123. kxsUserAmountService.changeData(dmlData);
  124. }
  125. //用户预扣款表
  126. // if ("ToChargeBackRecord".equals(dmlData.getTableName())) {
  127. // kxsUserAdvanceService.changeData(dmlData);
  128. // }
  129. //用户账户余额日志
  130. // if ("UserAccountRecord".equals(dmlData.getTableName())) {
  131. // kxsUserAmountLogService.changeData(dmlData);
  132. // }
  133. //用户提现申请记录
  134. if ("UserCashRecord".equals(dmlData.getTableName()) && "KxsProfitServer".equals(dmlData.getDatabaseName())) {
  135. kxsUserWithdrawalService.changeData(dmlData);
  136. }
  137. //盟主表
  138. if ("Leaders".equals(dmlData.getTableName())) {
  139. kxsLeaderService.changeData(dmlData);
  140. }
  141. //盟主金额变动记录表
  142. // if ("LeaderReserveRecord".equals(dmlData.getTableName())) {
  143. // kxsLeaderAmountLogService.changeData(dmlData);
  144. // }
  145. //合伙人表
  146. if ("OperatorRankWhite".equals(dmlData.getTableName())) {
  147. kxsPartnerService.changeData(dmlData);
  148. }
  149. //合伙人账户 -> 合伙人表
  150. if ("UserAccount".equals(dmlData.getTableName()) && "KxsOpServer".equals(dmlData.getDatabaseName())) {
  151. kxsPartnerService.changeAccountData(dmlData);
  152. }
  153. //商品表同步
  154. if ("Products".equals(dmlData.getTableName())) {
  155. kxsShopGoodsService.changeData(dmlData);
  156. }
  157. //每日晨会同步
  158. if ("SchoolMorningMeet".equals(dmlData.getTableName())) {
  159. kxsMorningService.changeData(dmlData);
  160. }
  161. if ("SchoolMorningMeetLog".equals(dmlData.getTableName())) {
  162. kxsMorningService.changeLogData(dmlData);
  163. }
  164. //创客学堂
  165. if ("SchoolMakerStudy".equals(dmlData.getTableName())) {
  166. kxsSchoolStudyService.changeData(dmlData);
  167. }
  168. //
  169. // //仓库表
  170. // if ("StoreHouse".equals(dmlData.getTableName())) {
  171. // kxsWarehouseService.changeData(dmlData);
  172. // }
  173. // //机具表
  174. if ("PosMachinesTwo".equals(dmlData.getTableName())) {
  175. kxsMachineService.changeData(dmlData);
  176. }
  177. //商户表
  178. if ("PosMerchantInfo".equals(dmlData.getTableName())) {
  179. kxsMerchantService.changeData(dmlData);
  180. }
  181. //机具回收表
  182. if ("RecycMachineOrder".equals(dmlData.getTableName())) {
  183. kxsMachineRecycleService.changeData(dmlData);
  184. }
  185. if ("RecycMachineOrderPos".equals(dmlData.getTableName())) {
  186. kxsMachineRecycleService.changeInfoData(dmlData);
  187. }
  188. //机具押金调整记录
  189. if ("MerchantDepositSet".equals(dmlData.getTableName())) {
  190. kxsMachinePledgeService.changeData(dmlData);
  191. }
  192. //机具费率调整记录
  193. if ("PosMachinesFeeChangeRecord".equals(dmlData.getTableName())) {
  194. kxsMachineRatioService.changeData(dmlData);
  195. }
  196. //券码表同步
  197. if ("PosCoupons".equals(dmlData.getTableName())) {
  198. kxsTicketService.changeData(dmlData);
  199. }
  200. //券码划拨表同步
  201. if ("PosCouponOrders".equals(dmlData.getTableName())) {
  202. kxsTicketTransferService.changeData(dmlData);
  203. }
  204. //券码划拨明细表同步
  205. if ("PosCouponRecord".equals(dmlData.getTableName())) {
  206. kxsTicketTransferService.changeInfoData(dmlData);
  207. }
  208. //存储历史数据
  209. KxsDtsLog kxsDtsLog = new KxsDtsLog();
  210. kxsDtsLog.setDataId(dataId);
  211. // kxsDtsLog.setContent(JSON.toJSONString(dmlData));
  212. kxsDtsLog.setTableName(dmlData.getTableName());
  213. kxsDtsLog.setOperation(dmlData.getOperation().toString());
  214. kxsDtsLogService.save(kxsDtsLog);
  215. //删除错误记录,不管有没有都删除,因为很快
  216. // kxsDtsErrorLogService.removeById(dataId);
  217. record.commit(String.valueOf(record.getSourceTimestamp()));
  218. } catch (Exception e) {
  219. //详细错误信息
  220. String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
  221. //存储错误数据
  222. KxsDtsErrorLog kxsDtsLog = new KxsDtsErrorLog();
  223. kxsDtsLog.setId(dataId);
  224. kxsDtsLog.setContent(JSON.toJSONString(dmlData));
  225. kxsDtsLog.setTableName(dmlData.getTableName());
  226. kxsDtsLog.setOperation(dmlData.getOperation().toString());
  227. kxsDtsLog.setErrorStr(fullStackTrace);
  228. kxsDtsErrorLogService.save(kxsDtsLog);
  229. record.commit(String.valueOf(record.getSourceTimestamp()));
  230. log.error(fullStackTrace);
  231. }
  232. }
  233. }