DtsController.java 14 KB

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