DtsController.java 15 KB

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