DtsController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  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.store.api.model.KxsMachineAdvance;
  7. import com.kxs.store.api.model.KxsMachineApply;
  8. import com.kxs.store.api.model.KxsWarehouseLimitLog;
  9. import com.kxs.store.api.model.KxsWarehouseStockLog;
  10. import com.kxs.system.api.model.KxsSchoolStudy;
  11. import com.kxs.transfer.api.annotation.DtsMsgListener;
  12. import com.kxs.transfer.api.mapper.user.KxsUserByStageMapper;
  13. import com.kxs.transfer.api.model.KxsDtsErrorLog;
  14. import com.kxs.transfer.api.model.KxsDtsLog;
  15. import com.kxs.transfer.api.model.table.DMLData;
  16. import com.kxs.transfer.api.service.KxsDtsErrorLogService;
  17. import com.kxs.transfer.api.service.KxsDtsLogService;
  18. import com.kxs.transfer.api.service.product.*;
  19. import com.kxs.transfer.api.service.product.impl.KxsMachineTrackService;
  20. import com.kxs.transfer.api.service.product.impl.KxsShopOrderService;
  21. import com.kxs.transfer.api.service.stat.*;
  22. import com.kxs.transfer.api.service.store.KxsMachineRecycleService;
  23. import com.kxs.transfer.api.service.store.KxsWarehouseService;
  24. import com.kxs.transfer.api.service.store.impl.*;
  25. import com.kxs.transfer.api.service.sys.KxsMorningLogService;
  26. import com.kxs.transfer.api.service.sys.KxsMorningService;
  27. import com.kxs.transfer.api.service.sys.KxsSchoolStudyService;
  28. import com.kxs.transfer.api.service.sys.KxsSysMsgService;
  29. import com.kxs.transfer.api.service.user.*;
  30. import com.kxs.user.api.model.KxsLeaderAmountLog;
  31. import com.kxs.user.api.model.KxsPartner;
  32. import com.kxs.user.api.model.KxsUserByStage;
  33. import lombok.RequiredArgsConstructor;
  34. import lombok.extern.slf4j.Slf4j;
  35. import org.apache.commons.lang.exception.ExceptionUtils;
  36. import org.springframework.beans.factory.annotation.Value;
  37. import org.springframework.web.bind.annotation.RestController;
  38. import java.util.List;
  39. /**
  40. * <p>
  41. * DTS控制器
  42. * 在此控制器里做数据分发
  43. * 比如将数据分发到不同的数据源中
  44. * </p>
  45. *
  46. * @author 没秃顶的码农
  47. * @date 2024-01-25
  48. */
  49. @RestController
  50. @Slf4j
  51. @RequiredArgsConstructor
  52. public class DtsController {
  53. private final KxsDtsLogService kxsDtsLogService;
  54. private final KxsDtsErrorLogService kxsDtsErrorLogService;
  55. private final KxsUserService kxsUserService;
  56. private final KxsUserPresetLogService kxsUserPresetLogService;
  57. private final KxsUserAddressService kxsUserAddressService;
  58. private final KxsUserAmountService kxsUserAmountService;
  59. private final KxsUserAdvanceService kxsUserAdvanceService;
  60. private final KxsUserAmountLogService kxsUserAmountLogService;
  61. private final KxsUserWithdrawalService kxsUserWithdrawalService;
  62. private final KxsLeaderService kxsLeaderService;
  63. private final KxsPartnerService kxsPartnerService;
  64. private final KxsMorningService kxsMorningService;
  65. private final KxsSchoolStudyService kxsSchoolStudyService;
  66. private final KxsSysMsgService kxsSysMsgService;
  67. private final KxsBankChangeLogService kxsBankChangeLogService;
  68. private final KxsUserByStageService kxsUserByStageService;
  69. private final KxsLeaderAmountLogService kxsLeaderAmountLogService;
  70. private final KxsMachineService kxsMachineService;
  71. //产品模块
  72. private final KxsShopGoodsService kxsShopGoodsService;
  73. private final KxsMachinePledgeService kxsMachinePledgeService;
  74. private final KxsMachineRatioService kxsMachineRatioService;
  75. private final KxsTicketService kxsTicketService;
  76. private final KxsTicketTransferService kxsTicketTransferService;
  77. private final KxsMerchantService kxsMerchantService;
  78. private final KxsMachineTransferService kxsMachineTransferService;
  79. private final KxsMachineTrackService kxsMachineTrackService;
  80. private final KxsShopOrderService kxsShopOrderService;
  81. //仓库模块
  82. private final KxsWarehouseService kxsWarehouseService;
  83. private final KxsMachineRecycleService kxsMachineRecycleService;
  84. private final KxsMachineApplyService kxsMachineApplyService;
  85. private final KxsMachineAdvanceService kxsMachineAdvanceService;
  86. private final KxsWarehouseMachineApplyService kxsWarehouseMachineApplyService;
  87. private final KxsWarehouseStockLogService kxsWarehouseStockLogService;
  88. private final KxsWarehouseLimitLogService kxsWarehouseLimitLogService;
  89. private final KxsActTotalService kxsActTotalService;
  90. //统计模块
  91. private final KxsUserTradeService kxsUserTradeService;
  92. private final KxsUserTradeBeforeService kxsUserTradeBeforeService;
  93. private final KxsUserTradeAfterService kxsUserTradeAfterService;
  94. private final KxsUserActTradeService kxsUserActTradeService;
  95. private final KxsMerchantTradeService kxsMerchantTradeService;
  96. private final KxsUserLogoutTradeService kxsUserLogoutTradeService;
  97. @Value("${spring.profiles.active}")
  98. private String active;
  99. @DtsMsgListener
  100. public void dtsListener(Long dataId, DMLData dmlData, DefaultUserRecord record) {
  101. try {
  102. //过滤无效数据
  103. if ("Users".equals(dmlData.getTableName())) {
  104. List<String> changeFieldList = dmlData.getChangeFieldList();
  105. //过滤Users老表记录登陆设备的信息日志
  106. if (changeFieldList.size() == 2 && changeFieldList.contains("DeviceId") && changeFieldList.contains("DeviceType")) {
  107. record.commit(String.valueOf(record.getSourceTimestamp()));
  108. return;
  109. }
  110. if (changeFieldList.size() == 1 && changeFieldList.contains("DeviceId")) {
  111. // 如果changeFieldList的大小为1,且changeFieldList包含DeviceId,则提交记录
  112. record.commit(String.valueOf(record.getSourceTimestamp()));
  113. return;
  114. }
  115. //过滤Users本月交易额字段
  116. if (changeFieldList.size() == 1 && changeFieldList.contains("ThisMonthTrade")) {
  117. record.commit(String.valueOf(record.getSourceTimestamp()));
  118. return;
  119. }
  120. //过滤Users库存更新字段
  121. if (changeFieldList.size() == 1 && changeFieldList.contains("StoreStock")) {
  122. record.commit(String.valueOf(record.getSourceTimestamp()));
  123. return;
  124. }
  125. }
  126. //去重数据
  127. KxsDtsLog dtsLog = kxsDtsLogService.getOne(Wrappers.<KxsDtsLog>lambdaQuery().eq(KxsDtsLog::getDataId, dataId));
  128. if (dtsLog != null) {
  129. // log.info("dts的数据重复:{},dataID:{}", dmlData.getValidFieldDataMap(), dataId);
  130. record.commit(String.valueOf(record.getSourceTimestamp()));
  131. return;
  132. }
  133. // if (!"UserMoveInfo".equals(dmlData.getTableName())) {
  134. // log.info("开始消费:{}表的数据,dataID:{}, 表名:{}", dmlData.getTableName(), dataId, dmlData.getDatabaseName());
  135. // }
  136. //用户表
  137. if ("Users".equals(dmlData.getTableName())) {
  138. kxsUserService.changeUser(dmlData);
  139. }
  140. //用户预设职级表
  141. if ("UserRankWhite".equals(dmlData.getTableName())) {
  142. kxsUserPresetLogService.changeUser(dmlData);
  143. }
  144. //密码操作
  145. if ("UserMoveInfo".equals(dmlData.getTableName())) {
  146. kxsUserService.changeUserPwd(dmlData);
  147. //密码操作不存储原始数据
  148. record.commit(String.valueOf(record.getSourceTimestamp()));
  149. return;
  150. }
  151. //用户地址表
  152. if ("UserAddress".equals(dmlData.getTableName())) {
  153. kxsUserAddressService.changeData(dmlData);
  154. }
  155. //用户账户
  156. if ("UserAccount".equals(dmlData.getTableName()) && ("dev".equals(active) || "test".equals(active) ? "KxsMainServer":"KxsProfitServer").equals(dmlData.getDatabaseName())) {
  157. kxsUserAmountService.changeData(dmlData);
  158. }
  159. //用户预扣款表
  160. if ("ToChargeBackRecord".equals(dmlData.getTableName())) {
  161. kxsUserAdvanceService.changeData(dmlData);
  162. }
  163. //用户账户余额日志
  164. if ("UserAccountRecord".equals(dmlData.getTableName())) {
  165. kxsUserAmountLogService.changeData(dmlData);
  166. }
  167. //用户提现申请记录
  168. if ("UserCashRecord".equals(dmlData.getTableName()) && ("dev".equals(active) || "test".equals(active) ? "KxsMainServer":"KxsProfitServer").equals(dmlData.getDatabaseName())) {
  169. kxsUserWithdrawalService.changeData(dmlData);
  170. }
  171. //盟主表
  172. if ("Leaders".equals(dmlData.getTableName())) {
  173. kxsLeaderService.changeData(dmlData);
  174. }
  175. //盟主金额变动记录表
  176. if ("LeaderReserveRecord".equals(dmlData.getTableName())) {
  177. kxsLeaderAmountLogService.changeData(dmlData);
  178. }
  179. //合伙人表
  180. if ("OperatorRankWhite".equals(dmlData.getTableName())) {
  181. kxsPartnerService.changeData(dmlData);
  182. }
  183. //合伙人账户 -> 合伙人表
  184. if ("UserAccount".equals(dmlData.getTableName()) && "KxsOpServer".equals(dmlData.getDatabaseName())) {
  185. kxsPartnerService.changeAccountData(dmlData);
  186. }
  187. //合伙人账户余额变动记录表
  188. if ("AmountRecordNew".equals(dmlData.getTableName()) && "KxsOpServer".equals(dmlData.getDatabaseName())) {
  189. kxsPartnerService.changeAccountLogData(dmlData);
  190. }
  191. //用户结算卡变更记录
  192. if ("SettlementCardChangeRecord".equals(dmlData.getTableName())) {
  193. kxsBankChangeLogService.changeData(dmlData);
  194. }
  195. //分期表数据同步
  196. if ("ToChargeByStage".equals(dmlData.getTableName())) {
  197. kxsUserByStageService.changeData(dmlData);
  198. }
  199. //分期期数表数据同步
  200. if ("ToChargeBackRecordSub".equals(dmlData.getTableName())) {
  201. kxsUserByStageService.changeInfoData(dmlData);
  202. }
  203. //商品表同步
  204. if ("Products".equals(dmlData.getTableName())) {
  205. kxsShopGoodsService.changeData(dmlData);
  206. }
  207. //商品订单同步
  208. if ("Orders".equals(dmlData.getTableName())) {
  209. kxsShopOrderService.changeData(dmlData);
  210. }
  211. //商品订单详情
  212. if ("OrderProduct".equals(dmlData.getTableName())) {
  213. kxsShopOrderService.changeInfoData(dmlData);
  214. }
  215. //每日晨会同步
  216. if ("SchoolMorningMeet".equals(dmlData.getTableName())) {
  217. kxsMorningService.changeData(dmlData);
  218. }
  219. if ("SchoolMorningMeetLog".equals(dmlData.getTableName())) {
  220. kxsMorningService.changeLogData(dmlData);
  221. }
  222. //创客学堂
  223. if ("SchoolMakerStudy".equals(dmlData.getTableName())) {
  224. kxsSchoolStudyService.changeData(dmlData);
  225. }
  226. //机具表
  227. if ("PosMachinesTwo".equals(dmlData.getTableName())) {
  228. kxsMachineService.changeData(dmlData);
  229. }
  230. //未绑定划拨记录表
  231. if ("UserStoreChange".equals(dmlData.getTableName())) {
  232. kxsMachineTransferService.changeData(dmlData);
  233. }
  234. //机具轨迹记录表
  235. if ("StoreChangeHistory".equals(dmlData.getTableName())) {
  236. kxsMachineTrackService.changeData(dmlData);
  237. }
  238. //商户表
  239. if ("PosMerchantInfo".equals(dmlData.getTableName())) {
  240. kxsMerchantService.changeData(dmlData);
  241. }
  242. //机具回收表
  243. if ("RecycMachineOrder".equals(dmlData.getTableName())) {
  244. kxsMachineRecycleService.changeData(dmlData);
  245. }
  246. if ("RecycMachineOrderPos".equals(dmlData.getTableName())) {
  247. kxsMachineRecycleService.changeInfoData(dmlData);
  248. }
  249. //机具押金调整记录
  250. if ("MerchantDepositSet".equals(dmlData.getTableName())) {
  251. kxsMachinePledgeService.changeData(dmlData);
  252. }
  253. //机具费率调整记录
  254. if ("PosMachinesFeeChangeRecord".equals(dmlData.getTableName())) {
  255. kxsMachineRatioService.changeData(dmlData);
  256. }
  257. //券码表同步
  258. if ("PosCoupons".equals(dmlData.getTableName())) {
  259. kxsTicketService.changeData(dmlData);
  260. }
  261. //券码划拨表同步
  262. if ("PosCouponOrders".equals(dmlData.getTableName())) {
  263. kxsTicketTransferService.changeData(dmlData);
  264. }
  265. //券码划拨记录表同步
  266. if ("PosCouponRecord".equals(dmlData.getTableName())) {
  267. kxsTicketTransferService.changeInfoData(dmlData);
  268. }
  269. //仓库表
  270. if ("StoreHouse".equals(dmlData.getTableName())) {
  271. kxsWarehouseService.changeData(dmlData);
  272. }
  273. //机具申请订单表
  274. if ("MachineApply".equals(dmlData.getTableName())) {
  275. kxsMachineApplyService.changeData(dmlData);
  276. }
  277. //仓库预发机
  278. if ("PreSendStockDetail".equals(dmlData.getTableName())) {
  279. kxsMachineAdvanceService.changeData(dmlData);
  280. }
  281. //分仓机具申请表
  282. if ("StoreMachineApply".equals(dmlData.getTableName())) {
  283. kxsWarehouseMachineApplyService.changeData(dmlData);
  284. }
  285. //仓库担保记录
  286. if ("StoreHouseAmountPromiss".equals(dmlData.getTableName())) {
  287. kxsWarehouseService.changeCreditData(dmlData);
  288. }
  289. //仓库库存变动记录表
  290. if ("StoreBalance".equals(dmlData.getTableName())) {
  291. kxsWarehouseStockLogService.changeData(dmlData);
  292. }
  293. //仓库额度变动记录表
  294. if ("StoreHouseAmountRecord".equals(dmlData.getTableName())) {
  295. kxsWarehouseLimitLogService.changeData(dmlData);
  296. }
  297. //小分仓额度变动记录表
  298. if ("PreAmountRecord".equals(dmlData.getTableName())) {
  299. kxsWarehouseLimitLogService.changeSmallData(dmlData);
  300. }
  301. //仓库激活统计表
  302. if ("StoreSnActivateSummary".equals(dmlData.getTableName())) {
  303. kxsActTotalService.changeData(dmlData);
  304. }
  305. //仓库额度表
  306. if ("UserAccount".equals(dmlData.getTableName()) && ("dev".equals(active) || "test".equals(active) ? "KxsMainServer":"KxsProfitServer").equals(dmlData.getDatabaseName())) {
  307. kxsWarehouseService.changeAccountData(dmlData);
  308. }
  309. //小分仓库额度表
  310. if ("UserAccount".equals(dmlData.getTableName()) && ("dev".equals(active) || "test".equals(active) ? "KxsMainServer":"KxsProfitServer").equals(dmlData.getDatabaseName())) {
  311. kxsWarehouseService.changeAccountMinData(dmlData);
  312. }
  313. //创客消息表
  314. if ("MsgPersonal".equals(dmlData.getTableName())) {
  315. kxsSysMsgService.changeUserData(dmlData);
  316. }
  317. //系统消息表
  318. if ("MsgPlacard".equals(dmlData.getTableName())) {
  319. kxsSysMsgService.changeSysData(dmlData);
  320. }
  321. if ("MsgPlacardRead".equals(dmlData.getTableName())) {
  322. kxsSysMsgService.changeSysReadData(dmlData);
  323. }
  324. //系统弹窗表
  325. if ("MsgAlert".equals(dmlData.getTableName())) {
  326. kxsSysMsgService.changeModalData(dmlData);
  327. }
  328. //创客交易额统计表
  329. if ("TradeDaySummary".equals(dmlData.getTableName())) {
  330. kxsUserTradeService.changeData(dmlData);
  331. }
  332. if ("TradeDaySummary2".equals(dmlData.getTableName())) {
  333. kxsUserTradeService.change2Data(dmlData);
  334. }
  335. //存量
  336. if ("TradeDaySummaryBefore".equals(dmlData.getTableName())) {
  337. kxsUserTradeBeforeService.changeData(dmlData);
  338. }
  339. if ("TradeDaySummary2Before".equals(dmlData.getTableName())) {
  340. kxsUserTradeBeforeService.change2Data(dmlData);
  341. }
  342. //增量
  343. if ("TradeDaySummaryAfter".equals(dmlData.getTableName())) {
  344. kxsUserTradeAfterService.changeData(dmlData);
  345. }
  346. if ("TradeDaySummary2After".equals(dmlData.getTableName())) {
  347. kxsUserTradeAfterService.change2Data(dmlData);
  348. }
  349. //创客激活统计
  350. if ("UserTradeMonthSummary".equals(dmlData.getTableName())) {
  351. kxsUserActTradeService.changeData(dmlData);
  352. }
  353. //商户交易额统计
  354. if ("PosMerchantTradeSummay".equals(dmlData.getTableName())) {
  355. kxsMerchantTradeService.changeData(dmlData);
  356. }
  357. //广电注销统计表
  358. if ("UserSimActSummary".equals(dmlData.getTableName())) {
  359. kxsUserLogoutTradeService.changeData(dmlData);
  360. }
  361. //存储历史数据
  362. KxsDtsLog kxsDtsLog = new KxsDtsLog();
  363. kxsDtsLog.setDataId(dataId);
  364. // kxsDtsLog.setContent(JSON.toJSONString(dmlData));
  365. kxsDtsLog.setTableName(dmlData.getTableName());
  366. kxsDtsLog.setOperation(dmlData.getOperation().toString());
  367. kxsDtsLogService.save(kxsDtsLog);
  368. //删除错误记录,不管有没有都删除,因为很快
  369. // kxsDtsErrorLogService.removeById(dataId);
  370. record.commit(String.valueOf(record.getSourceTimestamp()));
  371. } catch (Exception e) {
  372. //详细错误信息
  373. String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
  374. //存储错误数据
  375. KxsDtsErrorLog kxsDtsLog = new KxsDtsErrorLog();
  376. kxsDtsLog.setId(dataId);
  377. kxsDtsLog.setContent(JSON.toJSONString(dmlData));
  378. kxsDtsLog.setTableName(dmlData.getTableName());
  379. kxsDtsLog.setOperation(dmlData.getOperation().toString());
  380. kxsDtsLog.setErrorStr(fullStackTrace);
  381. kxsDtsErrorLogService.save(kxsDtsLog);
  382. record.commit(String.valueOf(record.getSourceTimestamp()));
  383. log.error(fullStackTrace);
  384. }
  385. }
  386. }