|
|
@@ -0,0 +1,403 @@
|
|
|
+package org.springblade.u9cloud.job;
|
|
|
+
|
|
|
+import com.xxl.job.core.biz.model.ReturnT;
|
|
|
+import com.xxl.job.core.handler.annotation.XxlJob;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.u9cloud.service.*;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.function.Supplier;
|
|
|
+
|
|
|
+/**
|
|
|
+ * U9同步数据定时任务(通过Feign调用微服务)
|
|
|
+ * 每个方法对应一种数据的同步,支持单独调度
|
|
|
+ *
|
|
|
+ * @author
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class U9CloudTaskJob {
|
|
|
+
|
|
|
+ // 注入Feign客户端
|
|
|
+// @Autowired
|
|
|
+// private U9CloudFeignClient u9CloudFeignClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewCustomerSelService zcrmViewCustomerSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewDepartmentSelService zcrmViewDepartmentSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewItemSelService zcrmViewItemSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewOperatorsSelService zcrmViewOperatorsSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewShipSelService zcrmViewShipSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewSupplierSelService zcrmViewSupplierSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewWhqohSelService zcrmViewWhqohSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewSalePriceSelService zcrmViewSalePriceSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewRecBillHeadSelService zcrmViewRecBillHeadSelService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private final ZcrmViewARBillHeadSelService zcrmViewARBillHeadSelService;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步客户数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncCustomerDataHandler")
|
|
|
+ public ReturnT<String> syncCustomerData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行客户数据同步任务,参数: {}", param);
|
|
|
+ System.err.println("XXL-JOB: 开始执行客户数据同步任务");
|
|
|
+ try {
|
|
|
+ boolean res1 = zcrmViewCustomerSelService.insertBatchCustomers();
|
|
|
+ if (!res1) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 客户数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步部门数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncDepartmentDataHandler")
|
|
|
+ public ReturnT<String> syncDepartmentData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行部门数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res2 = zcrmViewDepartmentSelService.insertBatchDepartments();
|
|
|
+ if (!res2) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 部门数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 部门数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步物料数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncItemDataHandler")
|
|
|
+ public ReturnT<String> syncItemData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行物料数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res3 = zcrmViewItemSelService.insertBatchItems();
|
|
|
+ if (!res3) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 物料数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 物料数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步操作员数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncOperatorsDataHandler")
|
|
|
+ public ReturnT<String> syncOperatorsData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行操作员数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res4 = zcrmViewOperatorsSelService.insertBatchOperators();
|
|
|
+ if (!res4) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 操作员数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 操作员数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步物流数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncShipDataHandler")
|
|
|
+ public ReturnT<String> syncShipData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行物流数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res5 = zcrmViewShipSelService.insertBatchShips();
|
|
|
+ if (!res5) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 物流数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 物流数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步供应商数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncSupplierDataHandler")
|
|
|
+ public ReturnT<String> syncSupplierData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行供应商数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res6 = zcrmViewSupplierSelService.insertBatchSuppliers();
|
|
|
+ if (!res6) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 供应商数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 供应商数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步库存数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncWhqohDataHandler")
|
|
|
+ public ReturnT<String> syncWhqohData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行库存数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res7 = zcrmViewWhqohSelService.insertBatchWhqohs();
|
|
|
+ if (!res7) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 库存数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 库存数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步应收单数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncARBillDataHandler")
|
|
|
+ public ReturnT<String> syncARBillData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行应收单数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res8 = zcrmViewARBillHeadSelService.insertBatchCustomers();
|
|
|
+ if (!res8) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 应收单数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 应收单数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步收款单数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncRecBillDataHandler")
|
|
|
+ public ReturnT<String> syncRecBillData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行收款单数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res9 = zcrmViewRecBillHeadSelService.insertBatchOperators();
|
|
|
+ if (!res9) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 收款单数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 收款单数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步销售价目表数据(单独任务)
|
|
|
+ */
|
|
|
+ @XxlJob("syncSalepriceDataHandler")
|
|
|
+ public ReturnT<String> syncSalepriceData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: 开始执行销售价目表数据同步任务,参数: {}", param);
|
|
|
+ try {
|
|
|
+ boolean res10 = zcrmViewSalePriceSelService.insertBatchOperators();
|
|
|
+ if (!res10) {
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ log.info("XXL-JOB: 销售价目表数据同步任务执行完成");
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("XXL-JOB: U9 销售价目表数据完整同步失败", e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步所有U9数据(完整同步)
|
|
|
+ */
|
|
|
+ @XxlJob("syncAllDataHandler")
|
|
|
+ public ReturnT<String> syncAllData(String param) throws Exception {
|
|
|
+ log.info("XXL-JOB: ===== 开始执行U9数据完整同步,参数: {} =====", param);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 1. 执行各服务的数据同步方法,任一方法返回false则抛出异常触发回滚
|
|
|
+ boolean res1 = zcrmViewCustomerSelService.insertBatchCustomers();
|
|
|
+ if (!res1) {
|
|
|
+ System.out.println("客户数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res2 = zcrmViewDepartmentSelService.insertBatchDepartments();
|
|
|
+ if (!res2) {
|
|
|
+ System.out.println("部门数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res3 = zcrmViewItemSelService.insertBatchItems();
|
|
|
+ if (!res3) {
|
|
|
+ System.out.println("物料数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res4 = zcrmViewOperatorsSelService.insertBatchOperators();
|
|
|
+ if (!res4) {
|
|
|
+ System.out.println("操作员数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res5 = zcrmViewShipSelService.insertBatchShips();
|
|
|
+ if (!res5) {
|
|
|
+ System.out.println("物流数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res6 = zcrmViewSupplierSelService.insertBatchSuppliers();
|
|
|
+ if (!res6) {
|
|
|
+ System.out.println("供应商数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res7 = zcrmViewWhqohSelService.insertBatchWhqohs();
|
|
|
+ if (!res7) {
|
|
|
+ System.out.println("库存数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res8 = zcrmViewARBillHeadSelService.insertBatchCustomers();
|
|
|
+ if (!res8) {
|
|
|
+ System.out.println("应收单数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res9 = zcrmViewRecBillHeadSelService.insertBatchOperators();
|
|
|
+ if (!res9) {
|
|
|
+ System.out.println("收款单数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean res10 = zcrmViewSalePriceSelService.insertBatchOperators();
|
|
|
+ if (!res10) {
|
|
|
+ System.out.println("销售价目表数据批量插入失败");
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ReturnT.SUCCESS;
|
|
|
+ } catch (Exception e) {
|
|
|
+ String errorMsg = "XXL-JOB: U9数据完整同步失败:" + e.getMessage();
|
|
|
+ log.error(errorMsg, e);
|
|
|
+ return ReturnT.FAIL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通用同步逻辑(通过Feign调用)
|
|
|
+ *
|
|
|
+ * @param syncTask 同步任务的具体逻辑
|
|
|
+ * @param dataName 数据类型名称(用于日志和异常信息)
|
|
|
+ */
|
|
|
+ private void executeSyncTask(Supplier<R<Boolean>> syncTask, String dataName) {
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ try {
|
|
|
+ String startMsg = "XXL-JOB: 开始通过Feign同步U9【" + dataName + "】";
|
|
|
+ log.info(startMsg);
|
|
|
+
|
|
|
+ // 通过Feign调用远程服务
|
|
|
+ R<Boolean> result = syncTask.get();
|
|
|
+
|
|
|
+ // 独立判断逻辑,不依赖Func工具类
|
|
|
+ if (isSyncSuccess(result)) {
|
|
|
+ long endTime = System.currentTimeMillis();
|
|
|
+ String successMsg = String.format("XXL-JOB: U9【%s】同步成功,耗时:%s ms", dataName, (endTime - startTime));
|
|
|
+ log.info(successMsg);
|
|
|
+ } else {
|
|
|
+ String errorMsg = buildErrorMessage(dataName, result);
|
|
|
+ log.error(errorMsg);
|
|
|
+ throw new RuntimeException(errorMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (RuntimeException e) {
|
|
|
+ // 已知的业务异常,直接抛出
|
|
|
+ log.error("XXL-JOB: 业务异常:" + e.getMessage());
|
|
|
+ throw e;
|
|
|
+ } catch (Exception e) {
|
|
|
+ String errorMsg = "XXL-JOB: U9【" + dataName + "】同步失败:" + e.getMessage();
|
|
|
+ log.error(errorMsg, e);
|
|
|
+ throw new RuntimeException(errorMsg, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断同步是否成功
|
|
|
+ */
|
|
|
+ private boolean isSyncSuccess(R<Boolean> result) {
|
|
|
+ return result != null
|
|
|
+ && result.isSuccess()
|
|
|
+ && result.getData() != null
|
|
|
+ && result.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建错误信息
|
|
|
+ */
|
|
|
+ private String buildErrorMessage(String dataName, R<Boolean> result) {
|
|
|
+ if (result == null) {
|
|
|
+ return String.format("XXL-JOB: U9【%s】同步失败:返回结果为空", dataName);
|
|
|
+ } else if (!result.isSuccess()) {
|
|
|
+ return String.format("XXL-JOB: U9【%s】同步失败:%s", dataName, result.getMsg());
|
|
|
+ } else if (result.getData() == null) {
|
|
|
+ return String.format("XXL-JOB: U9【%s】同步失败:返回数据为空", dataName);
|
|
|
+ } else {
|
|
|
+ return String.format("XXL-JOB: U9【%s】同步失败:返回结果为false", dataName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|