DtsController.java 14 KB

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