From 521aaeb3cbaa38d4d483171b21dc14b037d7e2ab Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Tue, 25 Jul 2023 22:50:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5odoo=20CJT=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=88=86=E5=88=AB=E5=AF=B9=E5=BA=94=E9=A3=9E=E4=B9=A6=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/common/enums/AppType.java | 8 +- .../common/enums/TableRelationTypeEnum.java | 7 +- ruoyi-quartz/pom.xml | 5 + .../com/ruoyi/quartz/domain/OdooContext.java | 28 ++ .../task/CJT/ManufactureOrderSyncJob.java | 6 + .../task/CJT/PurchaseArrivalOpenSyncJob.java | 6 + .../quartz/task/CJT/PurchaseOrderSyncJob.java | 6 + .../quartz/task/CJT/SaleDeliverySyncJob.java | 6 + .../quartz/task/CJT/SaleDispatchSyncJob.java | 5 + .../quartz/task/CJT/SaleOrderSyncJob.java | 6 + .../task/CJT/SyncAccountsJobAbstract.java | 4 +- .../quartz/task/odoo/OdooAbstrackob.java | 274 ++++++++++++++++++ .../quartz/task/odoo/ProductProduceJob.java | 56 ++++ 13 files changed, 413 insertions(+), 4 deletions(-) create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/OdooContext.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/OdooAbstrackob.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/ProductProduceJob.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java index 5b90a61..63dfe05 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java @@ -14,7 +14,13 @@ public enum AppType { SYNC_EMAIL("SYNC_EMAIL", "同步邮箱"), SCHEDULED_REMINDERS("SCHEDULED_REMINDERS", "定时提醒"), SYNC_EXTERNAL_DATA_TO_MULTI_TABLE("SYNC_EXTERNAL_DATA_TO_MULTI_TABLE", "同步外部数据到多维表格"), - SYNC_CJT_DATA_TO_MULTI_TABLE("SYNC_CJT_DATA_TO_MULTI_TABLE", "同步CJT数据到多维表格"); + SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE("SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE", "同步CJT生产加工单数据到多维表格"), + SYNC_CJT_PURCHASE_ARRIVAL_ORDER_DATA_TO_MULTI_TABLE("SYNC_CJT_PURCHASE_ARRIVAL_ORDER_DATA_TO_MULTI_TABLE", "同步CJT进货单数据到多维表格"), + SYNC_CJT_PURCHASE_ORDER_DATA_TO_MULTI_TABLE("SYNC_CJT_PURCHASE_ORDER_DATA_TO_MULTI_TABLE", "同步CJT采购订单数据到多维表格"), + SYNC_CJT_SALE_DELIVERY_DATA_TO_MULTI_TABLE("SYNC_CJT_SALE_DELIVERY_DATA_TO_MULTI_TABLE", "同步CJT销货单数据到多维表格"), + SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE("SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE", "同步CJT销售订单数据到多维表格"), + SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE("SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE", "同步CJT销售出库单数据到多维表格"), + SYNC_ODOO_DATA_TO_MULTI_TABLE("SYNC_ODOO_DATA_TO_MULTI_TABLE", "同步odoo数据到多维表格"); private final String code; private final String info; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java index 5c9ff6f..ded67eb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java @@ -22,7 +22,12 @@ public enum TableRelationTypeEnum { SYNC_CJT_PURCHASE_ORDER("SYNC_CJT_PURCHASE_ORDER", "同步畅捷通采购订单"), SYNC_CJT_SALE_DELIVERY("SYNC_CJT_SALE_DELIVERY", "同步畅捷通销货单"), SYNC_CJT_SALE_ORDER("SYNC_CJT_SALE_ORDER", "同步畅捷通销售订单"), - SYNC_CJT_SALE_DISPATCH("SYNC_CJT_SALE_DISPATCH", "同步畅捷通销售出库单"); + SYNC_CJT_SALE_DISPATCH("SYNC_CJT_SALE_DISPATCH", "同步畅捷通销售出库单"), + SYNC_ODOO_ACCOUNT_MOVE_LINE("SYNC_ODOO_ACCOUNT_MOVE_LINE", "每天晚上7点后更新"), + SYNC_ODOO_PRODUCT_PRODUCT("SYNC_ODOO_PRODUCT_PRODUCT", "周日一更"), + SYNC_ODOO_PRODUCT_PACKING("SYNC_ODOO_PRODUCT_PACKING", "周日一更"), + SYNC_ODOO_PRODUCT_PRODUCT1("SYNC_ODOO_PRODUCT_PRODUCT1", "周日一更"), + SYNC_ODOO_STOCK_QUANT("SYNC_ODOO_STOCK_QUANT", "每天晚上7点后更新"); private String code; private String info; diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml index 5d2c7ad..d8e941c 100644 --- a/ruoyi-quartz/pom.xml +++ b/ruoyi-quartz/pom.xml @@ -43,6 +43,11 @@ okhttp 4.9.1 + + org.apache.xmlrpc + xmlrpc-client + 3.1.3 + \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/OdooContext.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/OdooContext.java new file mode 100644 index 0000000..8693a3e --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/OdooContext.java @@ -0,0 +1,28 @@ +package com.ruoyi.quartz.domain; + +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.domain.LarkTableRelation; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.xmlrpc.client.XmlRpcClient; + +import java.io.Serializable; +import java.util.List; + +/** + * @author yuxiangyong + * @create 2023-07-17 20:31 + */ +@Data +@NoArgsConstructor +public class OdooContext implements Serializable { + + private XmlRpcClient models; + private Integer uid; + + /** + * 飞书权限相关即待同步飞书多维表格配置 + */ + private LarkCompanyRelation companyRelation; + private LarkTableRelation tableRelation; +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java index 69a8d0d..9be720e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/ManufactureOrderSyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -34,6 +35,11 @@ public class ManufactureOrderSyncJob extends SyncAccountsJobAbstract{ super.executeSync(); } + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_MANUFACTURE_ORDER_DATA_TO_MULTI_TABLE; + } + @Override protected List getUniqueFields() { return Arrays.asList( diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java index 207c7f0..dd2f9ad 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseArrivalOpenSyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -18,6 +19,11 @@ public class PurchaseArrivalOpenSyncJob extends SyncAccountsJobAbstract{ private static final String urlPath = "/tplus/api/v2/PurchaseArrivalOpenApi/FindVoucherList"; + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_PURCHASE_ARRIVAL_ORDER_DATA_TO_MULTI_TABLE; + } + @Override protected TableRelationTypeEnum syncLarkType() { return TableRelationTypeEnum.SYNC_CJT_PURCHASE_ARRIVAL_ORDER; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java index 1410f97..3f83ee9 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/PurchaseOrderSyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -18,6 +19,11 @@ public class PurchaseOrderSyncJob extends SyncAccountsJobAbstract{ private static final String urlPath = "/tplus/api/v2/PurchaseOrderOpenApi/FindVoucherList"; + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_PURCHASE_ORDER_DATA_TO_MULTI_TABLE; + } + @Override protected TableRelationTypeEnum syncLarkType() { return TableRelationTypeEnum.SYNC_CJT_PURCHASE_ORDER; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java index 34ae123..16ebfd2 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDeliverySyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -18,6 +19,11 @@ public class SaleDeliverySyncJob extends SyncAccountsJobAbstract{ private static final String urlPath = "/tplus/api/v2/SaleDeliveryOpenApi/FindVoucherList"; + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_SALE_DELIVERY_DATA_TO_MULTI_TABLE; + } + @Override protected TableRelationTypeEnum syncLarkType() { return TableRelationTypeEnum.SYNC_CJT_SALE_DELIVERY; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDispatchSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDispatchSyncJob.java index 9ee6c4b..61b2090 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDispatchSyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleDispatchSyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -18,6 +19,10 @@ public class SaleDispatchSyncJob extends SyncAccountsJobAbstract{ private static final String urlPath = "/tplus/api/v2/SaleDispatchOpenApi/FindVoucherList"; + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_SALE_DISPATCH_DATA_TO_MULTI_TABLE; + } @Override protected TableRelationTypeEnum syncLarkType() { diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java index fe2acb7..ad42bea 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SaleOrderSyncJob.java @@ -1,5 +1,6 @@ package com.ruoyi.quartz.task.CJT; +import com.ruoyi.common.enums.AppType; import com.ruoyi.common.enums.TableRelationTypeEnum; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.springframework.stereotype.Component; @@ -18,6 +19,11 @@ public class SaleOrderSyncJob extends SyncAccountsJobAbstract{ private static final String urlPath = "/tplus/api/v2/SaleOrderOpenApi/FindVoucherList"; + @Override + protected AppType syncLarkAppType() { + return AppType.SYNC_CJT_SALE_ORDER_DATA_TO_MULTI_TABLE; + } + @Override protected TableRelationTypeEnum syncLarkType() { return TableRelationTypeEnum.SYNC_CJT_SALE_ORDER; diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java index 6bf6d6c..45c6d53 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CJT/SyncAccountsJobAbstract.java @@ -110,6 +110,7 @@ public abstract class SyncAccountsJobAbstract { /** * 获取同步多维表格类型配置 */ + protected abstract AppType syncLarkAppType(); protected abstract TableRelationTypeEnum syncLarkType(); /** @@ -197,7 +198,6 @@ public abstract class SyncAccountsJobAbstract { //批量同步飞书 List errorCodeList = syncLarkBatch(response.getColumns(), rows, existKeyMap,addRecordRequest); if (!CollectionUtils.isEmpty(errorCodeList)){ - //todo 报错日志 String errorKey = String.join(",", errorCodeList); throw new RuntimeException(String.format("存在同步失败的记录 %s",errorKey)); } @@ -350,7 +350,7 @@ public abstract class SyncAccountsJobAbstract { */ private void initLarkInfo(CJTJobContext context) { LarkCompanyRelation companyRelationQuery = new LarkCompanyRelation(); - companyRelationQuery.setAppType(AppType.SYNC_CJT_DATA_TO_MULTI_TABLE.getCode()); + companyRelationQuery.setAppType(syncLarkAppType().getCode()); companyRelationQuery.setFlag(FlagStatus.OK.getCode()); List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(companyRelationQuery); LarkCompanyRelation companyRelation = larkCompanyRelations.get(0); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/OdooAbstrackob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/OdooAbstrackob.java new file mode 100644 index 0000000..b42d2cf --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/OdooAbstrackob.java @@ -0,0 +1,274 @@ +package com.ruoyi.quartz.task.odoo; + +import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody; +import com.ruoyi.common.enums.AppType; +import com.ruoyi.common.enums.FlagStatus; +import com.ruoyi.common.enums.TableRelationTypeEnum; +import com.ruoyi.flyingbook.LarkHelper.LarkRobotHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper; +import com.ruoyi.flyingbook.domain.ErpLarkRelation; +import com.ruoyi.flyingbook.domain.LarkCompanyRelation; +import com.ruoyi.flyingbook.domain.LarkTableRelation; +import com.ruoyi.flyingbook.domain.lark.LarkTableRequest; +import com.ruoyi.flyingbook.mapper.ErpLarkRelationMapper; +import com.ruoyi.flyingbook.mapper.LarkCompanyRelationMapper; +import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper; +import com.ruoyi.quartz.domain.CJTJobContext; +import com.ruoyi.quartz.domain.OdooContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.xmlrpc.XmlRpcException; +import org.apache.xmlrpc.client.XmlRpcClient; +import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; +import java.util.stream.Collectors; + +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; + +/** + * @author yuxiangyong + * @create 2023-07-23 18:18 + */ +@Slf4j +public abstract class OdooAbstrackob { + @Autowired + protected ErpLarkRelationMapper erpLarkRelationMapper; + @Autowired + private LarkCompanyRelationMapper larkCompanyRelationMapper; + @Autowired + private LarkTableRelationMapper larkTableRelationMapper; + @Autowired + private LarkTableHelper larkTableHelper; + @Autowired + private LarkRobotHelper larkRobotHelper; + @Value("${lark.robot.group}") + private String ROBOT_GROUP; + + public static final String ACCOUNT_MOVE_LINE_MODEL_NAME = "account.move.line"; + public static final String PRODUCT_PRODUCT_MODEL_NAME = "product.product"; + public static final String PRODUCT_PACKING_MODEL_NAME = "product_packaging"; + public static final String PRODUCT_PRODUCT_MODEL_NAME2 = "product_product"; + public static final String STOCK_QUANT_MODEL_NAME = "stock_quant"; + + private static final String GET_DATA_DB = "Fortune_test0716"; + private static final String GET_DATA_NAME = "test"; + private static final String GET_DATA_PASSWORD = "00cc06962c4583e562f7f3fcad2f38ef840e1d02"; + private static final String GET_DATA_P_METHOD_NAME = "execute_kw"; + + private static final String INIT_URL = "http://47.115.191.117:8869"; + + private static final String PAGE_OFFSET_KEY = "offset"; + private static final String PAGE_LIMIT_KEY = "limit"; + private static final Integer PAGE_SIZE = 20; + + protected void execute() { + try { + log.info("===================== {} strat ======================", this.getClassName()); + //初始化调用对象 + OdooContext context = initContext(); + //初始化飞书信息 + initLarkInfo(context); + //分页调用接口批量更新 + batchSync(context); + } catch (Exception e) { + log.error("{} 执行失败" + , getClassName() + , e); + larkRobotHelper.sendMessageByBot(ROBOT_GROUP, buildRobotErrorMessage(e)); + } finally { + log.info("===================== {} end ======================", this.getClassName()); + } + } + + private Map getPageMap() { + return new HashMap() {{ + put(PAGE_OFFSET_KEY, 0);//分页 + put(PAGE_LIMIT_KEY, PAGE_SIZE); + }}; + } + + private void batchSync(OdooContext context) { + //分页对象 + Map pageMap = getPageMap(); + //查询结果 + List dateList = new ArrayList<>(); + //错误信息 + List errorList = new ArrayList<>(); + //构建飞书请求对象 + LarkCompanyRelation companyRelation = context.getCompanyRelation(); + LarkTableRelation tableRelation = context.getTableRelation(); + LarkTableRequest larkRequest = new LarkTableRequest(companyRelation.getAppId(), companyRelation.getSecret(), tableRelation.getToAppToken(), tableRelation.getToTableId()); + //待创建关联关系 + List waitCreateRelation = new ArrayList<>(); + do { + dateList = getDate(context, pageMap, errorList); + Map relationMap = getLarkRelation(dateList); + for (JSONObject jsonObject : dateList) { + sync(jsonObject, errorList, relationMap, larkRequest,waitCreateRelation); + } + } while (dateList == null || (CollectionUtils.isNotEmpty(dateList) && dateList.size() == PAGE_SIZE)); + if (!CollectionUtils.isEmpty(errorList)) { + String errorKey = String.join(",", errorList); + throw new RuntimeException(String.format("存在同步失败的记录 %s", errorKey)); + } + if (CollectionUtils.isNotEmpty(waitCreateRelation)){ + erpLarkRelationMapper.batchInsert(waitCreateRelation); + } + } + + private void sync(JSONObject jsonObject, List errorList + , Map relationMap, LarkTableRequest larkRequest + , List waitCreateRelation) { + String uniqueKey = null; + try { + Map larkBodyMap = this.buildLarkBodyMap(jsonObject); + larkRequest.setBody(larkBodyMap); + uniqueKey = buildUniqueKey(jsonObject); + String larkRecord = relationMap.get(uniqueKey); + if (StringUtils.isNotBlank(larkRecord)) { + larkRequest.setRecord(larkRecord); + larkTableHelper.updateTableRecord(larkRequest); + } else { + CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(larkRequest); + waitCreateRelation.add(buildErpLarkRelation(uniqueKey,respBody.getRecord().getRecordId())); + } + } catch (Exception e) { + log.error("{} addOrUpdate exception {}", this.getClassName(),uniqueKey, e); + errorList.add(String.format("【%s,%s】",uniqueKey,e.getMessage())); + } + } + + //构建飞书行与cjt唯一键的对应关系对象 + private ErpLarkRelation buildErpLarkRelation(String key, String larkKey) { + ErpLarkRelation erpLarkRelation = new ErpLarkRelation(); + erpLarkRelation.setKey(key); + erpLarkRelation.setLarkKey(larkKey); + erpLarkRelation.setMethod(syncLarkType().getCode()); + erpLarkRelation.setFlag(FlagStatus.OK.getCode()); + erpLarkRelation.setCreateBy("SYSTEM"); + erpLarkRelation.setCreateTime(new Date()); + return erpLarkRelation; + } + + private String buildRobotErrorMessage(Exception e) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("同步任务", getClassName()); + jsonObject.put("异常信息", e.getMessage()); + return jsonObject.toJSONString(); + } + + private Map getLarkRelation(List dateList) { + List uniqueKeyList = dateList.stream().map(r -> { + return buildUniqueKey(r); + }).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(uniqueKeyList)) { + return new HashMap<>(); + } + return erpLarkRelationMapper.queryListByKeyList(uniqueKeyList, syncLarkType().getCode()) + .stream().collect(Collectors.toMap(ErpLarkRelation::getKey, ErpLarkRelation::getLarkKey, (k1, k2) -> k1)); + } + + /** + * 生成调用接口的token信息 + */ + private void initLarkInfo(OdooContext context) { + LarkCompanyRelation companyRelationQuery = new LarkCompanyRelation(); + companyRelationQuery.setAppType(AppType.SYNC_ODOO_DATA_TO_MULTI_TABLE.getCode()); + companyRelationQuery.setFlag(FlagStatus.OK.getCode()); + List larkCompanyRelations = larkCompanyRelationMapper.selectLarkCompanyRelationList(companyRelationQuery); + LarkCompanyRelation companyRelation = larkCompanyRelations.get(0); + context.setCompanyRelation(companyRelation); + LarkTableRelation tableRelationQuery = new LarkTableRelation(); + tableRelationQuery.setLarkCompanyRelationId(companyRelation.getId()); + tableRelationQuery.setFlag(FlagStatus.OK.getCode()); + tableRelationQuery.setRelationType(syncLarkType().getCode()); + List larkTableRelations = larkTableRelationMapper.selectLarkTableRelationList(tableRelationQuery); + LarkTableRelation tableRelation = larkTableRelations.get(0); + context.setTableRelation(tableRelation); + } + + private String getClassName() { + return this.getClass().getSimpleName(); + } + + //获取查询model名称 + protected abstract String buildUniqueKey(JSONObject body); + + //获取查询model名称 + protected abstract String getQueryModelName(); + + //获取查询条件 + protected abstract List getQueryConditionList(); + + //获取查询字段信息 + protected abstract Map> getQueryFieldMap(); + + //构建飞书请求体信息 + protected abstract Map buildLarkBodyMap(JSONObject date); + + //获取待同步飞书表格信息 + protected abstract TableRelationTypeEnum syncLarkType(); + + public List getDate(OdooContext odooContext, Map pageMap, List errorList) { + try { + XmlRpcClient models = odooContext.getModels(); + Integer uid = getUserId(); + String modelName = getQueryModelName(); + List ids = asList((Object[]) models.execute(GET_DATA_P_METHOD_NAME, asList( + GET_DATA_DB, uid, GET_DATA_PASSWORD, + modelName, "search", //product.product 表名 + getQueryConditionList(), //查询条件 + pageMap//分页 + ))); + + return asList((JSONObject[]) models.execute(GET_DATA_P_METHOD_NAME, asList( + GET_DATA_DB, uid, GET_DATA_PASSWORD, + modelName, "read", + asList(ids), + getQueryFieldMap() + ))); + } catch (Exception e) { + log.error("{} 获取数据失败", this.getClassName(), e); + errorList.add(String.format("%s 获取第【%s】页数据失败 %s", this.getClassName(), pageMap.get(PAGE_OFFSET_KEY), e.getMessage())); + } + return null; + } + + public OdooContext initContext() { + OdooContext context = new OdooContext(); + try { + final XmlRpcClient models = new XmlRpcClient() {{ + setConfig(new XmlRpcClientConfigImpl() {{ + setServerURL(new URL(String.format("%s/xmlrpc/2/object", INIT_URL))); + }}); + }}; + context.setModels(models); + context.setUid(getUserId()); + } catch (Exception e) { + log.error("{} 初始化链接失败", this.getClassName(), e); + throw new RuntimeException(String.format("%s 初始化链接失败 %s", this.getClassName(), e.getMessage())); + } + return context; + } + + + public Integer getUserId() throws XmlRpcException, MalformedURLException { + XmlRpcClient client = new XmlRpcClient(); + XmlRpcClientConfigImpl common_config = new XmlRpcClientConfigImpl(); + common_config.setServerURL(new URL(String.format("%s/xmlrpc/2/common", INIT_URL))); + Object version = client.execute(common_config, "version", emptyList()); + return (int) client.execute(common_config, "authenticate", asList(GET_DATA_DB, GET_DATA_NAME, GET_DATA_PASSWORD, emptyMap())); + + } + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/ProductProduceJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/ProductProduceJob.java new file mode 100644 index 0000000..13b500d --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/odoo/ProductProduceJob.java @@ -0,0 +1,56 @@ +package com.ruoyi.quartz.task.odoo; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.enums.TableRelationTypeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author yuxiangyong + * @create 2023-07-23 18:18 + */ +@Slf4j +@Component("productProduceJob") +public class ProductProduceJob extends OdooAbstrackob { + + @Override + protected String buildUniqueKey(JSONObject body) { + return null; + } + + @Override + protected String getQueryModelName() { + return "product.product"; + } + + @Override + protected List getQueryConditionList() { + return Arrays.asList( + Arrays.asList( + Arrays.asList("active", "=", true) + ) + ); + } + + @Override + protected Map> getQueryFieldMap() { + return new HashMap() {{ + put("fields", Arrays.asList("default_code", "company_id", "display_name")); + }}; + } + + @Override + protected Map buildLarkBodyMap(JSONObject date) { + return null; + } + + @Override + protected TableRelationTypeEnum syncLarkType() { + return TableRelationTypeEnum.SYNC_ODOO_PRODUCT_PRODUCT; + } +}