From 8bae1cbd351694a5303191c6605c32ec98cddf5d Mon Sep 17 00:00:00 2001 From: "hardy.liu" Date: Fri, 6 Mar 2026 15:00:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E5=94=AE=E6=98=8E=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-local.yaml | 30 ++++- lidee-core/pom.xml | 5 + .../framework/config/job/SaSetdtlSyncJob.java | 37 ++++++ .../core/framework/entity/GrBiSaSetdtl.java | 76 ++++++++++++ .../framework/mapper/GrBiSaSetdtlMapper.java | 55 +++++++++ .../service/IGrBiSaSetdtlService.java | 11 ++ .../service/impl/GrBiSaSetdtlServiceImpl.java | 112 ++++++++++++++++++ .../constant/lideeYunJiBaseConstant.java | 2 + 8 files changed, 323 insertions(+), 5 deletions(-) create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/SaSetdtlSyncJob.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/entity/GrBiSaSetdtl.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/GrBiSaSetdtlMapper.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/service/IGrBiSaSetdtlService.java create mode 100644 lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/GrBiSaSetdtlServiceImpl.java diff --git a/lidee-admin/src/main/resources/application-local.yaml b/lidee-admin/src/main/resources/application-local.yaml index 3da250c..22ded7a 100644 --- a/lidee-admin/src/main/resources/application-local.yaml +++ b/lidee-admin/src/main/resources/application-local.yaml @@ -9,23 +9,43 @@ spring: datasource: master: # MYSQL数据库 主库,业务库 - url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 +# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 username: root password: root lideeyunji: # 从库,框架库 - url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 +# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 username: root password: root slave: # 日志库单独 lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 +# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 username: root password: root + oracle_gryybi: # 报表平台 oracle + url: jdbc:oracle:thin:@//192.168.1.247:1521/gryy?oracle.jdbc.defaultNChar=true&oracle.jdbc.convertNcharLiterals=true + username: GRYYBI + password: xxb147258367 +# driver-class-name: oracle.jdbc.OracleDriver + driver-class-name: oracle.jdbc.driver.OracleDriver + erp_bi_data: # 报表平台 mysql +# url: jdbc:mysql://127.0.0.1:3306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://192.168.126.128:33306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + username: root + password: root + +# redis: +# host: 127.0.0.1 # 地址 +# port: 6379 # 端口 +# database: 2 # 数据库索引 +# password: lidee@123 # 密码,建议生产环境开启 redis: - host: 127.0.0.1 # 地址 + host: 192.168.126.128 # 地址 port: 6379 # 端口 database: 2 # 数据库索引 - password: lidee@123 # 密码,建议生产环境开启 + password: 123456 # 密码,建议生产环境开启 --- #################### 地代码平台相关配置 #################### diff --git a/lidee-core/pom.xml b/lidee-core/pom.xml index f04558d..4719287 100644 --- a/lidee-core/pom.xml +++ b/lidee-core/pom.xml @@ -92,5 +92,10 @@ lidee-service-infra-api ${lidee.version} + + com.oracle.database.nls + orai18n + 21.1.0.0 + diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/SaSetdtlSyncJob.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/SaSetdtlSyncJob.java new file mode 100644 index 0000000..2c55526 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/job/SaSetdtlSyncJob.java @@ -0,0 +1,37 @@ +package com.lideeyunji.core.framework.config.job; + + +import com.lideeyunji.core.framework.service.IGrBiSaSetdtlService; +import com.lideeyunji.core.framework.service.ILideeYunJiService; +import com.lideeyunji.tool.framework.quartz.core.handler.JobHandler; +import com.lideeyunji.tool.framework.tenant.core.aop.TenantIgnore; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 同步销售明细表 + * oracle gryybi GR_BI_SA_SETDTL --> mysql erp_bi_data GR_BI_SA_SETDTL + */ +@Component +@Slf4j +public class SaSetdtlSyncJob implements JobHandler { + + @Autowired + private ILideeYunJiService lideeYunJiService; + + @Autowired + private IGrBiSaSetdtlService grBiSaSetdtlService; + + + @Override + @TenantIgnore + public String execute(String param) throws Exception { + log.info("*********** 开始同步销售明细表 ************"); +// Integer cou = this.lideeYunJiService.saSetdtlSyncJob(); + Integer cou = this.grBiSaSetdtlService.saSetdtlSyncJob(); + String resultStr = "*********** 同步销售明细表,共保存了" + cou + "条数据 ************"; + log.info(resultStr); + return resultStr; + } +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/GrBiSaSetdtl.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/GrBiSaSetdtl.java new file mode 100644 index 0000000..8f9fc01 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/entity/GrBiSaSetdtl.java @@ -0,0 +1,76 @@ +package com.lideeyunji.core.framework.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +@TableName("GR_BI_SA_SETDTL") +@Data +@EqualsAndHashCode +public class GrBiSaSetdtl implements Serializable { + private final static long serialVersionUID = 1L; + @TableId(value = "SASETTLEDTLID", type = IdType.INPUT) + private Integer SASETTLEDTLID; + @TableField(value = "SASETTLEID") + private Integer SASETTLEID; + @TableField(value = "USESTATUS") + private Integer USESTATUS; + @TableField(value = "UPDATE_TIME") + private String UPDATETIME; + @TableField(value = "USEDATE") + private Date USEDATE; + @TableField(value = "USEYEAR") + private Integer USEYEAR; + @TableField(value = "USEMONTH") + private Integer USEMONTH; + @TableField(value = "SALEZONEID") + private Integer SALEZONEID; + @TableField(value = "SALEZONENAME") + private String SALEZONENAME; + @TableField(value = "PROVINCEID") + private Integer PROVINCEID; + @TableField(value = "PROVINCENAME") + private String PROVINCENAME; + @TableField(value = "SALETYPE") + private Integer SALETYPE; + @TableField(value = "SALETYPENAME") + private String SALETYPENAME; + @TableField(value = "CUSTOMID") + private Integer CUSTOMID; + @TableField(value = "CUSTOMNAME") + private String CUSTOMNAME; + @TableField(value = "SALERID") + private Integer SALERID; + @TableField(value = "SALERNAME") + private String SALERNAME; + @TableField(value = "DOSAGEID") + private Integer DOSAGEID; + @TableField(value = "DOSAGENAME") + private String DOSAGENAME; + @TableField(value = "STDGOODSNAME") + private String STDGOODSNAME; + @TableField(value = "GOODSID") + private Integer GOODSID; + @TableField(value = "GOODSNAME") + private String GOODSNAME; + @TableField(value = "GOODSTYPE") + private String GOODSTYPE; + @TableField(value = "GOODSUNIT") + private String GOODSUNIT; + @TableField(value = "SAQTY") + private Integer SAQTY; + @TableField(value = "SAMONEY") + private Integer SAMONEY; + @TableField(value = "SAMONEYTX") + private Integer SAMONEYTX; + @TableField(value = "COST") + private Integer COST; + @TableField(value = "PROFIT") + private Integer PROFIT; +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/GrBiSaSetdtlMapper.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/GrBiSaSetdtlMapper.java new file mode 100644 index 0000000..fd5bcd8 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/mapper/GrBiSaSetdtlMapper.java @@ -0,0 +1,55 @@ +package com.lideeyunji.core.framework.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lideeyunji.core.framework.entity.GrBiSaSetdtl; +import org.apache.ibatis.annotations.Param; + +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Set; + +public interface GrBiSaSetdtlMapper extends BaseMapper { + + @DS(value = "#dataSourceType") + default GrBiSaSetdtl getLastUpdated(@Param("dataSourceType") String dataSourceType) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.orderByDesc("UPDATE_TIME"); + wrapper.last("limit 1"); + return this.selectOne(wrapper); + } + + @DS(value = "#dataSourceType") + default List getByUpdateTime(@Param("dataSourceType") String dataSourceType, String updateTime) { + try { + // 假设 updateTime 格式为 "yyyy-MM-dd HH:mm:ss" + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date startTime = sdf.parse(updateTime); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.gt("UPDATE_TIME", startTime); + return this.selectList(queryWrapper); + } catch (Exception e) { + // 处理异常 + return Collections.emptyList(); + } + } + + @DS(value = "#dataSourceType") + default List queryByIds(@Param("dataSourceType") String dataSourceType, Set ids) { + return this.selectBatchIds(ids); + } + + @DS(value = "#dataSourceType") + default int save(@Param("dataSourceType") String dataSourceType, GrBiSaSetdtl grBiSaSetdtl) { + return this.insert(grBiSaSetdtl); + } + + @DS(value = "#dataSourceType") + default int update(@Param("dataSourceType") String dataSourceType, GrBiSaSetdtl grBiSaSetdtl) { + return this.updateById(grBiSaSetdtl); + } + +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/IGrBiSaSetdtlService.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/IGrBiSaSetdtlService.java new file mode 100644 index 0000000..55106b0 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/IGrBiSaSetdtlService.java @@ -0,0 +1,11 @@ +package com.lideeyunji.core.framework.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.lideeyunji.core.framework.entity.GrBiSaSetdtl; + +public interface IGrBiSaSetdtlService extends IService { + + //同步销售明细表 + Integer saSetdtlSyncJob(); + +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/GrBiSaSetdtlServiceImpl.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/GrBiSaSetdtlServiceImpl.java new file mode 100644 index 0000000..ea380de --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/GrBiSaSetdtlServiceImpl.java @@ -0,0 +1,112 @@ +package com.lideeyunji.core.framework.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lideeyunji.core.framework.entity.GrBiSaSetdtl; +import com.lideeyunji.core.framework.mapper.GrBiSaSetdtlMapper; +import com.lideeyunji.core.framework.service.IGrBiSaSetdtlService; +import com.lideeyunji.tool.framework.common.constant.lideeYunJiBaseConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class GrBiSaSetdtlServiceImpl extends ServiceImpl implements IGrBiSaSetdtlService { + + /** + * 同步销售明细表 + * + * @return + */ + @Override + public Integer saSetdtlSyncJob() { + //获取本地mysql数据库中表中UPDATE_TIME最新的数据 + GrBiSaSetdtl grBiSaSetdtl = this.baseMapper.getLastUpdated(lideeYunJiBaseConstant.DS_ERP_BI_DATA); + + //本地不存在空的情况 之前会手动导入的情况 + //查询大于本地最大更新时间的oracle里的数据 + List grBiSaSetdtlList = this.baseMapper.getByUpdateTime(lideeYunJiBaseConstant.DS_ORACLE_GRYYBI, grBiSaSetdtl.getUPDATETIME()); + + if (CollUtil.isEmpty(grBiSaSetdtlList)) { + return 0; + } + + + //保存数据 + return this.saveSyncData(grBiSaSetdtlList); + } + + + //保存同步数据到本地 + @Transactional + public Integer saveSyncData(List grBiSaSetdtlList) { + + //需要新增的数据 + List needSaveList = grBiSaSetdtlList; + List needUpdateList = null; + //校验哪些数据已经存在需要更新 + List existList = this.baseMapper.queryByIds(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtlList.stream().map(GrBiSaSetdtl::getSASETTLEDTLID).collect(Collectors.toSet())); + if (CollUtil.isNotEmpty(existList)) { + Set needUpdateIdSet = existList.stream().map(GrBiSaSetdtl::getSASETTLEDTLID).collect(Collectors.toSet()); + needSaveList = grBiSaSetdtlList + .stream() + .filter(grBiSaSetdtl -> { + return !needUpdateIdSet.contains(grBiSaSetdtl.getSASETTLEDTLID()); + }) + .collect(Collectors.toList()); + needUpdateList = grBiSaSetdtlList + .stream() + .filter(grBiSaSetdtl -> { + return needUpdateIdSet.contains(grBiSaSetdtl.getSASETTLEDTLID()); + }) + .collect(Collectors.toList()); + } + + //将orcale数据集合分割成100条一组、 + Integer result = 0; + if (CollUtil.isNotEmpty(needSaveList)) { + result += this.saveBatch(needSaveList); + } + if (CollUtil.isNotEmpty(needUpdateList)) { + result += this.updateBatch(needUpdateList); + } + + return result; + } + + + //批量新增 + @Transactional + public Integer saveBatch(List grBiSaSetdtlList) { + Integer result = 0; + for (GrBiSaSetdtl grBiSaSetdtl : grBiSaSetdtlList) { + int re = this.baseMapper.save(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtl); + if (re < 1) { + throw new RuntimeException("批量新增异常"); + } + result += re; + } + return result; + } + + //批量更新 + @Transactional + public Integer updateBatch(List grBiSaSetdtlList) { + Integer result = 0; + for (GrBiSaSetdtl grBiSaSetdtl : grBiSaSetdtlList) { + int re = this.baseMapper.update(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtl); + if (re < 1) { + throw new RuntimeException("批量新增异常"); + } + result += re; + } + return result; + } + + +} diff --git a/lidee-tool/tool-common/src/main/java/com/lideeyunji/tool/framework/common/constant/lideeYunJiBaseConstant.java b/lidee-tool/tool-common/src/main/java/com/lideeyunji/tool/framework/common/constant/lideeYunJiBaseConstant.java index e287e20..b8ee9fd 100644 --- a/lidee-tool/tool-common/src/main/java/com/lideeyunji/tool/framework/common/constant/lideeYunJiBaseConstant.java +++ b/lidee-tool/tool-common/src/main/java/com/lideeyunji/tool/framework/common/constant/lideeYunJiBaseConstant.java @@ -9,6 +9,8 @@ public interface lideeYunJiBaseConstant { //多数据源 String DS_lideeyunji="lideeyunji";//低代码 String DS_MASTER="master";//主服务 + String DS_ORACLE_GRYYBI="oracle_gryybi";//报表平台 oracle + String DS_ERP_BI_DATA="erp_bi_data";//报表平台 mysql String REQUEST_URL_START="/lideeyunji";//公共请求 String BASE_PACKAGES="com.lideeyunji";//公共包名称 -- 2.52.0.windows.1