diff --git a/pom.xml b/pom.xml index 45e77609..a6f03755 100644 --- a/pom.xml +++ b/pom.xml @@ -252,6 +252,12 @@ ${p6spy.version} + + com.dameng + DmJdbcDriver18 + 8.1.3.140 + + software.amazon.awssdk diff --git a/script/sql/vincent/V1.10.1-数据编目-达梦.sql b/script/sql/vincent/V1.10.1-数据编目-达梦.sql new file mode 100644 index 00000000..000ffe3a --- /dev/null +++ b/script/sql/vincent/V1.10.1-数据编目-达梦.sql @@ -0,0 +1,42 @@ +CREATE TABLE SZ_SFJ_ZFJDM_XZJC_INFO ( + ID BIGINT NOT NULL IDENTITY(1,1) COMMENT '主键,自增ID', + YWID VARCHAR(64) NOT NULL COMMENT '业务ID', + BJQYMC VARCHAR(128) DEFAULT NULL COMMENT '被检查企业名称', + BJQYTYSHXYDM VARCHAR(32) DEFAULT NULL COMMENT '被检查企业统一社会信用代码', + SSQYBM VARCHAR(64) DEFAULT NULL COMMENT '所属区域编码', + SSQYMC VARCHAR(64) DEFAULT NULL COMMENT '所属区域名称', + JCSX VARCHAR(512) DEFAULT NULL COMMENT '检查事项', + RQSJ DATETIME DEFAULT NULL COMMENT '入企时间', + ZFYJ VARCHAR(512) DEFAULT NULL COMMENT '执法依据', + JCLB VARCHAR(2) DEFAULT NULL COMMENT '检查类别:1行政检查|2行政处罚|3行政许可|4行政强制|5行政征收|6行政给付|7行政确认|8行政登记|9行政裁决|10文书送达', + JCYY VARCHAR(2) DEFAULT NULL COMMENT '检查原因:01日常检查|02投诉举报|03上级交办|04部门移送|05重点领域治理部署|06专项行动|09其它', + SFLHJC TINYINT DEFAULT NULL COMMENT '是否联合检查:0否,1是', + LHJCBH VARCHAR(50) DEFAULT NULL COMMENT '联合检查编号', + SFWTJC TINYINT DEFAULT NULL COMMENT '是否委托检查:0否,1是', + WTJCBMMC VARCHAR(128) DEFAULT NULL COMMENT '委托检查部门名称', + SFSM TINYINT DEFAULT NULL COMMENT '是否扫码:0是,1否', + WSMYY VARCHAR(256) DEFAULT NULL COMMENT '未扫码原因:0其他|1企业原因|2系统原因|3扫码未能显示企业信息|9补录', + QTYYXXQ VARCHAR(512) DEFAULT NULL COMMENT '其他原因详情', + ZFRYXM VARCHAR(64) DEFAULT NULL COMMENT '执法人员姓名', + XZZFZH VARCHAR(64) DEFAULT NULL COMMENT '行政执法证号', + QTZFRYXM VARCHAR(64) DEFAULT NULL COMMENT '其他执法人员姓名', + QTXZZFZH VARCHAR(64) DEFAULT NULL COMMENT '其他行政执法证号', + ZFDWID VARCHAR(64) DEFAULT NULL COMMENT '执法单位ID', + ZFDWMC VARCHAR(64) DEFAULT NULL COMMENT '执法单位名称', + ZFBMMC VARCHAR(64) DEFAULT NULL COMMENT '执法部门名称', + SFSC TINYINT DEFAULT 0 COMMENT '是否删除:0否,1是', + YWCJSJ DATETIME DEFAULT NULL COMMENT '业务创建时间', + YWXGSJ DATETIME DEFAULT NULL COMMENT '业务修改时间', + ADD_TIME DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + CD_TIME DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + CD_OPERATION VARCHAR(4) DEFAULT NULL COMMENT '增量标识:I|插入,U|更新,D|删除', + CD_BATCH VARCHAR(32) DEFAULT NULL COMMENT '批次号', + REMARK VARCHAR(256) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (ID) +) COMMENT='深圳市涉企行政执法扫码入企登记信息'; + +-- 索引 +CREATE INDEX IDX_BJQY_CREDIT ON SZ_SFJ_ZFJDM_XZJC_INFO(BJQYTYSHXYDM); +CREATE INDEX IDX_RQSJ ON SZ_SFJ_ZFJDM_XZJC_INFO(RQSJ); +-- YWID 唯一:同一业务ID只保留一行(先查后写的防重兜底) +CREATE UNIQUE INDEX UK_YWID ON SZ_SFJ_ZFJDM_XZJC_INFO(YWID); diff --git a/script/sql/vincent/V1.10.1_20261013_tgk.sql b/script/sql/vincent/V1.10.1_20261013_tgk.sql index 4cd7a9fd..d240cd27 100644 --- a/script/sql/vincent/V1.10.1_20261013_tgk.sql +++ b/script/sql/vincent/V1.10.1_20261013_tgk.sql @@ -1,9 +1,12 @@ DROP TABLE IF EXISTS `SZSFJ_ZFJDM_XZJC_INFO`; + CREATE TABLE `SZSFJ_ZFJDM_XZJC_INFO` ( `ID` bigint NOT NULL AUTO_INCREMENT COMMENT '主键,自增ID', `YWID` varchar(64) NOT NULL COMMENT '业务ID', `BJQYMC` varchar(128) DEFAULT NULL COMMENT '被检查企业名称', `BJQYTYSHXYDM` varchar(32) DEFAULT NULL COMMENT '被检查企业统一社会信用代码', + `SSQYBM` varchar(64) DEFAULT NULL COMMENT '所属区域编码', + `SSQYMC` varchar(64) DEFAULT NULL COMMENT '所属区域名称', `JCSX` varchar(512) DEFAULT NULL COMMENT '检查事项', `RQSJ` datetime DEFAULT NULL COMMENT '入企时间', `ZFYJ` varchar(512) DEFAULT NULL COMMENT '执法依据', @@ -20,15 +23,32 @@ CREATE TABLE `SZSFJ_ZFJDM_XZJC_INFO` ( `XZZFZH` varchar(64) DEFAULT NULL COMMENT '行政执法证号', `QTZFRYXM` varchar(64) DEFAULT NULL COMMENT '其他执法人员姓名', `QTXZZFZH` varchar(64) DEFAULT NULL COMMENT '其他行政执法证号', + `ZFDWID` varchar(64) DEFAULT NULL COMMENT '执法单位ID', `ZFDWMC` varchar(64) DEFAULT NULL COMMENT '执法单位名称', `ZFBMMC` varchar(64) DEFAULT NULL COMMENT '执法部门名称', + `SFSC` tinyint DEFAULT 0 COMMENT '是否删除:0否,1是', `YWCJSJ` datetime DEFAULT NULL COMMENT '业务创建时间', `YWXGSJ` datetime DEFAULT NULL COMMENT '业务修改时间', - `CJSJ` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `XGSJ` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - `ZLBS` varchar(2) DEFAULT '0' COMMENT '增量标识,0|未同步,1|已同步', + `TBZT` varchar(2) DEFAULT '0' COMMENT '同步状态,0|未同步,1|已同步,2|同步失败', + `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `cd_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `cd_operation` varchar(4) DEFAULT NULL COMMENT '增量标识:I|插入,U|更新,D|删除', + `cd_batch` varchar(32) DEFAULT NULL COMMENT '批次号', + `remark` varchar(256) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`ID`), UNIQUE KEY `uk_ywid` (`YWID`), KEY `idx_bjqy_credit` (`BJQYTYSHXYDM`), KEY `idx_rqsj` (`RQSJ`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='行政检查信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='深圳市涉企行政执法扫码入企登记信息'; + +INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, + misfire_policy, concurrent, status, create_by, create_time, remark) +VALUES ('行政检查信息共享同步(tgk到gxk)', + 'DEFAULT', + 'xzjcInfoShareJob.execute()', + '0 30 2 * * ?', + '3', -- misfire: 放弃错过的执行 + '1', -- concurrent: 禁止并发 + '0', -- status: 正常 + 'admin', NOW(), + ''); diff --git a/zdxt-modules/zdxt-enforcement-code/pom.xml b/zdxt-modules/zdxt-enforcement-code/pom.xml index 7ad5a716..75e8e5bf 100644 --- a/zdxt-modules/zdxt-enforcement-code/pom.xml +++ b/zdxt-modules/zdxt-enforcement-code/pom.xml @@ -166,5 +166,9 @@ 1.4 + + com.dameng + DmJdbcDriver18 + diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/XzjcInfoSyncBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/XzjcInfoSyncBo.java index bb4b22ab..72f2d370 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/XzjcInfoSyncBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/XzjcInfoSyncBo.java @@ -21,6 +21,12 @@ public class XzjcInfoSyncBo { /** 被检查企业统一社会信用代码(BJQYTYSHXYDM) */ private String bjqytyshxydm; + /** 所属区域编码-执法单位所属区编码, sys_dept.area_node → dashboard_area_info.code(SSQYBM) */ + private String ssqybm; + + /** 所属区域名称-区级行政区名称, dashboard_area_info.name(SSQYMC) */ + private String ssqymc; + /** 检查事项(JCSX) */ private String jcsx; @@ -69,15 +75,27 @@ public class XzjcInfoSyncBo { /** 其他行政执法证号(QTXZZFZH) */ private String qtxzzfzh; + /** 执法单位ID-执法登记机关部门ID, enforcement_registration.bureau_dept_id(ZFDWID) */ + private String zfdwid; + /** 执法单位名称(ZFDWMC) */ private String zfdwmc; /** 执法部门名称(ZFBMMC) */ private String zfbmmc; + /** 是否删除:0否,1是(SFSC) */ + private Integer sfsc; + /** 业务创建时间(YWCJSJ) */ private Date ywcjsj; /** 业务修改时间(YWXGSJ) */ private Date ywxgsj; + + /** 增量操作类型: I|插入, U|更新, D|删除(CD_OPERATION); 新插入按 SFSC 取 I/D, 冲突更新按 SFSC 取 U/D */ + private String cdOperation; + + /** 同步批次号(CD_BATCH), 单次任务内所有写入行共享同一批次 */ + private String cdBatch; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/datashare/XzjcInfoShareBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/datashare/XzjcInfoShareBo.java new file mode 100644 index 00000000..926642f2 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/datashare/XzjcInfoShareBo.java @@ -0,0 +1,18 @@ +package com.zdxt.enforcementcode.domain.bo.datashare; + +import com.zdxt.enforcementcode.domain.bo.XzjcInfoSyncBo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 行政检查信息共享同步行(tgk 通知行,含行主键 ID 用于同步成功后回写 TBZT) + * + * @author zdxt + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class XzjcInfoShareBo extends XzjcInfoSyncBo { + + /** tgk 表行主键(同步成功后按此回写 TBZT='1') */ + private Long id; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/XzjcInfoSyncTgkMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/XzjcInfoSyncTgkMapper.java index c32f1db5..4254d6a1 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/XzjcInfoSyncTgkMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/XzjcInfoSyncTgkMapper.java @@ -25,10 +25,34 @@ public interface XzjcInfoSyncTgkMapper { Date selectWatermark(); /** - * 批量 upsert 目标表(基于 uk_ywid 唯一键 INSERT ... ON DUPLICATE KEY UPDATE,幂等) + * 查询指定日期(yyyyMMdd)已使用的最大批次号(MAX(cd_batch)) * - * @param list 写入行集合 - * @return 影响行数(MySQL upsert 语义,不代表真实写入条数) + * @param day 日期前缀, 格式 yyyyMMdd + * @return 当天最大批次号(如 2018071500003);当天尚无批次时返回 null */ - int upsertBatch(@Param("list") List list); + String selectMaxBatch(@Param("day") String day); + + /** + * 查询目标表已出现过的业务ID集合(用于 CD_OPERATION 判定:出现过->U,首次->I) + * + * @param list 待判定的业务ID集合 + * @return 目标表中已存在的业务ID + */ + List selectExistingYwids(@Param("list") List list); + + /** + * 插入一条新记录(该 YWID 首次出现,CD_OPERATION='I') + * + * @param item 写入行 + * @return 影响行数 + */ + int insertNew(@Param("item") XzjcInfoSyncBo item); + + /** + * 按业务ID更新已存在记录(CD_OPERATION='U'),并将 TBZT 重新置 '0' 通知推管方拉取 + * + * @param item 写入行 + * @return 影响行数 + */ + int updateByYwid(@Param("item") XzjcInfoSyncBo item); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareGxkMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareGxkMapper.java new file mode 100644 index 00000000..2f04e4af --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareGxkMapper.java @@ -0,0 +1,41 @@ +package com.zdxt.enforcementcode.mapper.datashare; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.zdxt.enforcementcode.domain.bo.datashare.XzjcInfoShareBo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 行政检查信息共享同步 Mapper 接口(zfjd_gxk 达梦目标侧) + *

YWID 唯一口径:不存在则插入(CD_OPERATION='I'),存在则更新(CD_OPERATION='U')

+ * + * @author zdxt + */ +@DS("gxk") +public interface XzjcInfoShareGxkMapper { + + /** + * 查询已存在于目标表的业务ID集合(用于 I/U 判定) + * + * @param list 待判定的业务ID集合 + * @return 目标表中已存在的业务ID + */ + List selectExistingYwids(@Param("list") List list); + + /** + * 插入新行(目标表不存在该 YWID),CD_OPERATION 由调用方置 'I' + * + * @param item 写入行 + * @return 影响行数 + */ + int insertOne(@Param("item") XzjcInfoShareBo item); + + /** + * 按业务ID更新已存在行(目标表存在该 YWID),CD_OPERATION 由调用方置 'U' + * + * @param item 写入行 + * @return 影响行数 + */ + int updateByYwid(@Param("item") XzjcInfoShareBo item); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareMapper.java new file mode 100644 index 00000000..6ac42662 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareMapper.java @@ -0,0 +1,33 @@ +package com.zdxt.enforcementcode.mapper.datashare; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.zdxt.enforcementcode.domain.bo.datashare.XzjcInfoShareBo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 行政检查信息共享同步 Mapper 接口(zfjd_tgk 源侧) + *

读取 TBZT='0' 的未拉取通知行;写入成功后回写 TBZT='1'

+ * + * @author zdxt + */ +@DS("tgk") +public interface XzjcInfoShareMapper { + + /** + * 分页查询未同步(TBZT='0')的通知行,按批次号顺序保证下游按序消费 + * + * @param pageSize 分页大小 + * @return 未同步行 + */ + List selectUnsyncedPage(@Param("pageSize") int pageSize); + + /** + * 回写同步状态:TBZT 置 '1'-已同步(限定 TBZT='0' 保证幂等) + * + * @param ids 已成功写入 gxk 的行主键集合 + * @return 影响行数 + */ + int markSynced(@Param("ids") List ids); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoShareJob.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoShareJob.java new file mode 100644 index 00000000..64257a78 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoShareJob.java @@ -0,0 +1,35 @@ +package com.zdxt.enforcementcode.quartz.job; + +import com.zdxt.enforcementcode.service.IXzjcInfoShareService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 共享库同步到提供库(局级) + * 行政检查信息共享同步定时任务 + *

将 zfjd_tgk.SZSFJ_ZFJDM_XZJC_INFO 中 TBZT=0 的数据同步到 zfjd_gxk.SZ_SFJ_ZFJDM_XZJC_INFO

+ *

默认 cron: 0 30 2 * * ?(每天凌晨 2:30,晚于 2:00 的 tgk 写入任务)

+ * + * @author zdxt + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class XzjcInfoShareJob { + + private final IXzjcInfoShareService xzjcInfoShareService; + + /** + * 任务执行入口(public,供 JobInvokeUtil 通过反射调用) + */ + public void execute() { + log.info("[XzjcInfoShareJob] 定时任务触发:行政检查信息共享同步(tgk->gxk)"); + try { + xzjcInfoShareService.shareSync(); + } catch (Exception e) { + log.error("[XzjcInfoShareJob] 行政检查信息共享同步失败", e); + throw e; + } + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoSyncJob.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoSyncJob.java index 6ebe5974..16bcd790 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoSyncJob.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoSyncJob.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** + * 业务数据同步到共享库(内部) * 行政检查信息同步定时任务 *

每天将 enforcement_registration 增量数据同步到 zfjd_tgk 库的 SZSFJ_ZFJDM_XZJC_INFO(市司法局数据共享表)

*

默认 cron: 0 0 2 * * ?(每天凌晨 2 点)

diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IXzjcInfoShareService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IXzjcInfoShareService.java new file mode 100644 index 00000000..454f8f2a --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IXzjcInfoShareService.java @@ -0,0 +1,16 @@ +package com.zdxt.enforcementcode.service; + +/** + * 行政检查信息共享同步服务(zfjd_tgk -> zfjd_gxk) + * + * @author zdxt + */ +public interface IXzjcInfoShareService { + + /** + * 执行一次共享同步:拉取 tgk 中 TBZT='0' 的通知行写入 gxk,成功后回写 TBZT='1' + * + * @return 实际同步条数 + */ + int shareSync(); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoShareServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoShareServiceImpl.java new file mode 100644 index 00000000..28e8b06b --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoShareServiceImpl.java @@ -0,0 +1,115 @@ +package com.zdxt.enforcementcode.service.impl; + +import com.zdxt.enforcementcode.domain.bo.datashare.XzjcInfoShareBo; +import com.zdxt.enforcementcode.mapper.datashare.XzjcInfoShareGxkMapper; +import com.zdxt.enforcementcode.mapper.datashare.XzjcInfoShareMapper; +import com.zdxt.enforcementcode.service.IXzjcInfoShareService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * 行政检查信息共享同步服务实现 + *

源表:zfjd_tgk.SZSFJ_ZFJDM_XZJC_INFO(TBZT='0');目标表:zfjd_gxk.SZ_SFJ_ZFJDM_XZJC_INFO

+ *

写入成功的行回写源表 TBZT='1';单行失败跳过不标记,下次任务重试

+ * + * @author zdxt + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class XzjcInfoShareServiceImpl implements IXzjcInfoShareService { + + /** 分页读取大小(一页一批) */ + private static final int PAGE_SIZE = 500; + + /** 单次任务最大分页数 */ + private static final int MAX_PAGES = 1000; + + /** 共享同步分布式锁 key */ + private static final String LOCK_KEY = "xzjc_info_share:lock"; + + private final XzjcInfoShareMapper xzjcInfoShareMapper; + private final XzjcInfoShareGxkMapper xzjcInfoShareGxkMapper; + private final RedissonClient redissonClient; + + @Override + public int shareSync() { + RLock lock = redissonClient.getLock(LOCK_KEY); + boolean locked = false; + try { + locked = lock.tryLock(0, -1, TimeUnit.SECONDS); + if (!locked) { + log.warn("[XzjcInfoShare] 上一次共享同步尚未结束(锁被占用),本次触发跳过"); + return 0; + } + return doShare(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("[XzjcInfoShare] 共享同步任务获取锁时被中断", e); + return 0; + } finally { + if (locked && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + private int doShare() { + int total = 0; + for (int page = 1; page <= MAX_PAGES; page++) { + List rows = xzjcInfoShareMapper.selectUnsyncedPage(PAGE_SIZE); + if (rows.isEmpty()) { + break; + } + // 达梦目标表已存在的业务ID -> U,不存在 -> I(YWID 唯一口径) + Set existing = new HashSet<>(); + if (!rows.isEmpty()) { + List ywids = new ArrayList<>(rows.size()); + for (XzjcInfoShareBo bo : rows) { + ywids.add(bo.getYwid()); + } + List hit = xzjcInfoShareGxkMapper.selectExistingYwids(ywids); + if (hit != null) { + existing.addAll(hit); + } + } + // 逐行写入,仅成功行参与回写 TBZT,失败行下轮重试 + List syncedIds = new ArrayList<>(rows.size()); + for (XzjcInfoShareBo bo : rows) { + boolean isUpdate = existing.contains(bo.getYwid()); + bo.setCdOperation(isUpdate ? "U" : "I"); + try { + if (isUpdate) { + xzjcInfoShareGxkMapper.updateByYwid(bo); + } else { + xzjcInfoShareGxkMapper.insertOne(bo); + } + syncedIds.add(bo.getId()); + } catch (Exception rowEx) { + log.error("[XzjcInfoShare] 脏数据跳过: id={}, ywid={}, cd_operation={}", + bo.getId(), bo.getYwid(), bo.getCdOperation(), rowEx); + } + } + if (!syncedIds.isEmpty()) { + xzjcInfoShareMapper.markSynced(syncedIds); + } + total += syncedIds.size(); + log.info("[XzjcInfoShare] 第 {} 页完成, 本页成功 {}/{} 条", page, syncedIds.size(), rows.size()); + + if (rows.size() < PAGE_SIZE) { + break; + } + } + log.info("[XzjcInfoShare] 共享同步完成(zfjd_tgk -> zfjd_gxk): 共处理 {} 条", total); + return total; + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java index 1548d316..03927f7f 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java @@ -7,17 +7,22 @@ import com.zdxt.enforcementcode.mapper.XzjcInfoSyncTgkMapper; import com.zdxt.enforcementcode.service.IXzjcInfoSyncService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RAtomicLong; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import java.sql.Timestamp; +import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -41,6 +46,9 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { /** 同步分布式锁 key */ private static final String LOCK_KEY = "xzjc_info_sync:lock"; + /** 批次号序号 Redis key 前缀(按数据日期分 key) */ + private static final String BATCH_SEQ_KEY = "xzjc_info_sync:batch:seq:"; + /** 源表读取(master) */ private final XzjcInfoSyncMapper xzjcInfoSyncMapper; @@ -94,10 +102,13 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { if (rows.isEmpty()) { break; } - + // rows 整页为一批,页内所有行共享同一批次号 + String batchNo = nextBatchNo(); List batch = new ArrayList<>(rows.size()); for (Map row : rows) { - batch.add(toBo(row)); + XzjcInfoSyncBo bo = toBo(row); + bo.setCdBatch(batchNo); + batch.add(bo); } upsertSafely(batch); total += rows.size(); @@ -106,7 +117,8 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { Map last = rows.get(rows.size() - 1); cursorTime = toTimestamp(last.get("update_time")); cursorId = str(last.get("id")); - log.info("[XzjcInfoSync] 第 {} 页完成, 累计 {} 条, 游标=({}, {})", page, total, cursorTime, cursorId); + log.info("[XzjcInfoSync] 第 {} 页完成, 累计 {} 条, 批次={}, 游标=({}, {})", + page, total, batchNo, cursorTime, cursorId); if (rows.size() < PAGE_SIZE) { break; @@ -124,27 +136,37 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { } /** - * 页级批量 upsert;整批失败时降级为逐条写入,跳过脏数据行,避免单行异常导致游标卡死 + * 页级写入(YWID 唯一口径):不存在则插入(CD_OPERATION='I'),存在则按 YWID 更新(CD_OPERATION='U'); + * 已删除记录置 D 通知下游;更新时 TBZT 重置 '0' 通知推管方再次拉取; + * 单行异常跳过脏数据,避免游标卡死 */ private void upsertSafely(List batch) { -// try { -// xzjcInfoSyncTgkMapper.upsertBatch(batch); -// } catch (Exception e) { -// log.error("[XzjcInfoSync] 批量写入失败,降级逐条写入排查脏数据, 批次大小={}", batch.size(), e); -// for (XzjcInfoSyncBo bo : batch) { -// try { -// xzjcInfoSyncTgkMapper.upsertBatch(List.of(bo)); -// } catch (Exception rowEx) { -// log.error("[XzjcInfoSync] 脏数据跳过: ywid={}", bo.getYwid(), rowEx); -// } -// } -// } - + Set existing = new HashSet<>(); + if (!batch.isEmpty()) { + List ywids = new ArrayList<>(batch.size()); + for (XzjcInfoSyncBo bo : batch) { + ywids.add(bo.getYwid()); + } + List hit = xzjcInfoSyncTgkMapper.selectExistingYwids(ywids); + if (hit != null) { + existing.addAll(hit); + } + } for (XzjcInfoSyncBo bo : batch) { + boolean exists = existing.contains(bo.getYwid()); + if (bo.getSfsc() != null && bo.getSfsc() == 1) { + bo.setCdOperation("D"); + } else { + bo.setCdOperation(exists ? "U" : "I"); + } try { - xzjcInfoSyncTgkMapper.upsertBatch(List.of(bo)); + if (exists) { + xzjcInfoSyncTgkMapper.updateByYwid(bo); + } else { + xzjcInfoSyncTgkMapper.insertNew(bo); + } } catch (Exception rowEx) { - log.error("[XzjcInfoSync] 脏数据跳过: ywid={}", bo.getYwid(), rowEx); + log.error("[XzjcInfoSync] 脏数据跳过: ywid={}, cd_operation={}", bo.getYwid(), bo.getCdOperation(), rowEx); } } } @@ -163,6 +185,8 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { bo.setYwid(str(row.get("id"))); bo.setBjqymc(fit(row.get("enterprise_name"), 128)); bo.setBjqytyshxydm(fit(row.get("enterprise_number"), 32)); + bo.setSsqybm(fit(row.get("ssqybm"), 64)); + bo.setSsqymc(fit(row.get("ssqymc"), 64)); bo.setJcsx(fit(coalesce(row, "law_enforcement_item_text", "law_enforcement_item"), 512)); bo.setRqsj(toDate(row.get("enforcement_time"))); bo.setZfyj(fit(coalesce(row, "law_enforcement_basis_text", "law_enforcement_basis"), 512)); @@ -179,8 +203,10 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { bo.setXzzfzh(fit(row.get("law_enforcer_id"), 64)); bo.setQtzfryxm(fit(row.get("law_enforcer_two"), 64)); bo.setQtxzzfzh(fit(row.get("law_enforcer_id_two"), 64)); + bo.setZfdwid(fit(row.get("bureau_dept_id"), 64)); bo.setZfdwmc(fit(row.get("bureau_dept_name"), 64)); bo.setZfbmmc(fit(row.get("law_enforcement"), 64)); + bo.setSfsc(toLong(row.get("is_delete")) != null && toLong(row.get("is_delete")) == 1 ? 1 : 0); bo.setYwcjsj(toDate(row.get("create_time"))); bo.setYwxgsj(toDate(row.get("update_time"))); return bo; @@ -217,6 +243,36 @@ public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService { } } + /** + * 生成下一批次号:"数据日期+数据序号"(yyyyMMdd + 5位序号) + *

数据日期取当前系统时间所在日期

+ *

数据序号通过 Redis RAtomicLong 原子自增,当天从 00001 开始递增,天然支持多实例并发

+ *

Redis 当天首次使用时,以目标表当天已用最大批次号兜底初始化,防止 Redis 数据丢失后重号

+ */ + private String nextBatchNo() { + String day = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); + RAtomicLong counter = redissonClient.getAtomicLong(BATCH_SEQ_KEY + day); + long seq = counter.incrementAndGet(); + if (seq == 1) { + String maxBatch = xzjcInfoSyncTgkMapper.selectMaxBatch(day); + if (maxBatch != null && maxBatch.length() > 8) { + try { + int dbMax = Integer.parseInt(maxBatch.substring(8)); + // CAS 失败说明并发下已有更新值,直接取当前值 + seq = counter.compareAndSet(1, dbMax + 1) ? dbMax + 1 : counter.get(); + } catch (NumberFormatException e) { + log.warn("[XzjcInfoSync] 当天最大批次号[{}]序号段非法, 从 00001 重新开始", maxBatch); + } + } + // 序号 key 保留 2 天,过期自动清理,避免跨天残留 + counter.expire(Duration.ofDays(2)); + } + if (seq > 99999) { + log.warn("[XzjcInfoSync] 当日序号已达 {} 超出五位,批次号将超过规范长度", seq); + } + return day + String.format("%05d", seq); + } + /** * 时间类型兼容转换(Timestamp / LocalDateTime / 字符串) */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareGxkMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareGxkMapper.xml new file mode 100644 index 00000000..b248927c --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareGxkMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + INSERT INTO SZ_SFJ_ZFJDM_XZJC_INFO + (YWID, BJQYMC, BJQYTYSHXYDM, SSQYBM, SSQYMC, JCSX, RQSJ, ZFYJ, JCLB, JCYY, + SFLHJC, LHJCBH, SFWTJC, WTJCBMMC, SFSM, WSMYY, QTYYXXQ, + ZFRYXM, XZZFZH, QTZFRYXM, QTXZZFZH, ZFDWID, ZFDWMC, ZFBMMC, SFSC, YWCJSJ, YWXGSJ, + CD_OPERATION, CD_BATCH) + VALUES + (#{item.ywid}, #{item.bjqymc}, #{item.bjqytyshxydm}, #{item.ssqybm}, #{item.ssqymc}, #{item.jcsx}, #{item.rqsj}, + #{item.zfyj}, #{item.jclb}, #{item.jcyy}, #{item.sflhjc}, #{item.lhjcbh}, + #{item.sfwtjc}, #{item.wtjcbmmc}, #{item.sfsm}, #{item.wsmyy}, #{item.qtyyxxq}, + #{item.zfryxm}, #{item.xzzfzh}, #{item.qtzfryxm}, #{item.qtxzzfzh}, + #{item.zfdwid}, #{item.zfdwmc}, #{item.zfbmmc}, #{item.sfsc}, #{item.ywcjsj}, #{item.ywxgsj}, + #{item.cdOperation}, #{item.cdBatch}) + + + + + UPDATE SZ_SFJ_ZFJDM_XZJC_INFO + SET BJQYMC = #{item.bjqymc}, + BJQYTYSHXYDM = #{item.bjqytyshxydm}, + SSQYBM = #{item.ssqybm}, + SSQYMC = #{item.ssqymc}, + JCSX = #{item.jcsx}, + RQSJ = #{item.rqsj}, + ZFYJ = #{item.zfyj}, + JCLB = #{item.jclb}, + JCYY = #{item.jcyy}, + SFLHJC = #{item.sflhjc}, + LHJCBH = #{item.lhjcbh}, + SFWTJC = #{item.sfwtjc}, + WTJCBMMC = #{item.wtjcbmmc}, + SFSM = #{item.sfsm}, + WSMYY = #{item.wsmyy}, + QTYYXXQ = #{item.qtyyxxq}, + ZFRYXM = #{item.zfryxm}, + XZZFZH = #{item.xzzfzh}, + QTZFRYXM = #{item.qtzfryxm}, + QTXZZFZH = #{item.qtxzzfzh}, + ZFDWID = #{item.zfdwid}, + ZFDWMC = #{item.zfdwmc}, + ZFBMMC = #{item.zfbmmc}, + SFSC = #{item.sfsc}, + YWCJSJ = #{item.ywcjsj}, + YWXGSJ = #{item.ywxgsj}, + CD_OPERATION = #{item.cdOperation}, + CD_BATCH = #{item.cdBatch}, + CD_TIME = CURRENT_TIMESTAMP + WHERE YWID = #{item.ywid} + + diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareMapper.xml new file mode 100644 index 00000000..e4a685eb --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + UPDATE SZSFJ_ZFJDM_XZJC_INFO + SET TBZT = '1' + WHERE TBZT = '0' + AND ID IN + + #{id} + + + diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml index fb4f19b2..b038a39d 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml @@ -4,44 +4,61 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + 仅同步已提交数据(is_submit=1,临时保存的不外发); + 已删除数据(is_delete=1)也需同步,由 SFSC 字段通知共享方删除状态(逻辑删除为 UPDATE,会触发 update_time 变化被增量捞起); + 所属区域经 sys_dept.area_node → dashboard_area_info(area_code/name, level=3 区级)推导,与大屏统计同口径; + 区域兜底:area_code 为空默认 440300000(深圳市),name 为空默认 深圳市; + cursorTime 为空 -> 全量; + cursorTime 非空且 cursorId 为空 -> update_time >= cursorTime(含边界,防漏,配合幂等 upsert); + 两者均非空 -> 严格游标(大于时刻 或 同时刻且 id 更大),避免页间重复; + endTime 为上界(不含),只读取该时间之前的数据 --> diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml index 229d59b6..9e6f4894 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml @@ -10,44 +10,74 @@ FROM SZSFJ_ZFJDM_XZJC_INFO - - - + + + + + + + + + + INSERT INTO SZSFJ_ZFJDM_XZJC_INFO - (YWID, BJQYMC, BJQYTYSHXYDM, JCSX, RQSJ, ZFYJ, JCLB, JCYY, + (YWID, BJQYMC, BJQYTYSHXYDM, SSQYBM, SSQYMC, JCSX, RQSJ, ZFYJ, JCLB, JCYY, SFLHJC, LHJCBH, SFWTJC, WTJCBMMC, SFSM, WSMYY, QTYYXXQ, - ZFRYXM, XZZFZH, QTZFRYXM, QTXZZFZH, ZFDWMC, ZFBMMC, YWCJSJ, YWXGSJ, ZLBS) + ZFRYXM, XZZFZH, QTZFRYXM, QTXZZFZH, ZFDWID, ZFDWMC, ZFBMMC, SFSC, YWCJSJ, YWXGSJ, + CD_OPERATION, CD_BATCH, TBZT) VALUES - - (#{item.ywid}, #{item.bjqymc}, #{item.bjqytyshxydm}, #{item.jcsx}, #{item.rqsj}, + (#{item.ywid}, #{item.bjqymc}, #{item.bjqytyshxydm}, #{item.ssqybm}, #{item.ssqymc}, #{item.jcsx}, #{item.rqsj}, #{item.zfyj}, #{item.jclb}, #{item.jcyy}, #{item.sflhjc}, #{item.lhjcbh}, #{item.sfwtjc}, #{item.wtjcbmmc}, #{item.sfsm}, #{item.wsmyy}, #{item.qtyyxxq}, #{item.zfryxm}, #{item.xzzfzh}, #{item.qtzfryxm}, #{item.qtxzzfzh}, - #{item.zfdwmc}, #{item.zfbmmc}, #{item.ywcjsj}, #{item.ywxgsj}, '0') - - ON DUPLICATE KEY UPDATE - BJQYMC = VALUES(BJQYMC), - BJQYTYSHXYDM = VALUES(BJQYTYSHXYDM), - JCSX = VALUES(JCSX), - RQSJ = VALUES(RQSJ), - ZFYJ = VALUES(ZFYJ), - JCLB = VALUES(JCLB), - JCYY = VALUES(JCYY), - SFLHJC = VALUES(SFLHJC), - LHJCBH = VALUES(LHJCBH), - SFWTJC = VALUES(SFWTJC), - WTJCBMMC = VALUES(WTJCBMMC), - SFSM = VALUES(SFSM), - WSMYY = VALUES(WSMYY), - QTYYXXQ = VALUES(QTYYXXQ), - ZFRYXM = VALUES(ZFRYXM), - XZZFZH = VALUES(XZZFZH), - QTZFRYXM = VALUES(QTZFRYXM), - QTXZZFZH = VALUES(QTXZZFZH), - ZFDWMC = VALUES(ZFDWMC), - ZFBMMC = VALUES(ZFBMMC), - YWCJSJ = VALUES(YWCJSJ), - YWXGSJ = VALUES(YWXGSJ), - ZLBS = '0' + #{item.zfdwid}, #{item.zfdwmc}, #{item.zfbmmc}, #{item.sfsc}, #{item.ywcjsj}, #{item.ywxgsj}, + #{item.cdOperation}, #{item.cdBatch}, '0') + + + + UPDATE SZSFJ_ZFJDM_XZJC_INFO + SET BJQYMC = #{item.bjqymc}, + BJQYTYSHXYDM = #{item.bjqytyshxydm}, + SSQYBM = #{item.ssqybm}, + SSQYMC = #{item.ssqymc}, + JCSX = #{item.jcsx}, + RQSJ = #{item.rqsj}, + ZFYJ = #{item.zfyj}, + JCLB = #{item.jclb}, + JCYY = #{item.jcyy}, + SFLHJC = #{item.sflhjc}, + LHJCBH = #{item.lhjcbh}, + SFWTJC = #{item.sfwtjc}, + WTJCBMMC = #{item.wtjcbmmc}, + SFSM = #{item.sfsm}, + WSMYY = #{item.wsmyy}, + QTYYXXQ = #{item.qtyyxxq}, + ZFRYXM = #{item.zfryxm}, + XZZFZH = #{item.xzzfzh}, + QTZFRYXM = #{item.qtzfryxm}, + QTXZZFZH = #{item.qtxzzfzh}, + ZFDWID = #{item.zfdwid}, + ZFDWMC = #{item.zfdwmc}, + ZFBMMC = #{item.zfbmmc}, + SFSC = #{item.sfsc}, + YWCJSJ = #{item.ywcjsj}, + YWXGSJ = #{item.ywxgsj}, + CD_OPERATION = #{item.cdOperation}, + CD_BATCH = #{item.cdBatch}, + TBZT = '0' + WHERE YWID = #{item.ywid} + + diff --git a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml index bb5a7466..d1c0cdc2 100644 --- a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml +++ b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml @@ -70,6 +70,12 @@ spring: url: jdbc:mysql://172.16.20.72:3306/zfjd_tgk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: zdxt@8888 + # 共享库(行政检查信息 tgk -> gxk 同步目标库) + gxk: + lazy: true + url: jdbc:mysql://172.16.20.72:3306/zfjd_gxk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: zdxt@8888 hikari: # 最大连接池数量 maxPoolSize: 500 @@ -273,8 +279,6 @@ siq: appId: CE07DEE723E241DFB34D80090A569B12 secretKey: ENC(6+WSjXj7UebpPJGq69e7aVZ1ZIrL9wnPcD+rU5XDFCNYGQM8fVvtcQ==) msgAppId: CE07DEE723E241DFB34D80090A569B12 - siqBaseUrl: https://egbpub.siqhz.com - msgSecretKey: 0C4E08DCC7DD490E86EF2B79E81691D1 msgTemplateId: 2076972618633498625 # 模拟数据开关(true=使用模拟数据,false=调用真实接口) mock: diff --git a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml index 866fcd05..f6b3c22f 100644 --- a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml +++ b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml @@ -65,32 +65,14 @@ spring: url: jdbc:mysql:loadbalance://10.134.89.36:15144,10.134.89.37:15144,10.134.89.38:15144,10.134.89.39:15144/zfjd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: zfjd password: szsf@zfjd - # # 从库数据源 - # slave: - # lazy: true - # type: ${spring.datasource.type} - # driverClassName: com.mysql.cj.jdbc.Driver - # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - # username: - # password: - # oracle: - # type: ${spring.datasource.type} - # driverClassName: oracle.jdbc.OracleDriver - # url: jdbc:oracle:thin:@//localhost:1521/XE - # username: ROOT - # password: root - # postgres: - # type: ${spring.datasource.type} - # driverClassName: org.postgresql.Driver - # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true - # username: root - # password: root - # sqlserver: - # type: ${spring.datasource.type} - # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver - # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true - # username: SA - # password: root + # 共享库(达梦,行政检查信息 tgk -> gxk 同步目标库) + gxk: + lazy: true + type: ${spring.datasource.type} + driverClassName: dm.jdbc.driver.DmDriver + url: jdbc:dm://10.224.157.67:10405?schema=SSFJTGK&compatibleMode=mysql&characterEncoding=utf-8 + username: SSFJJDM + password: "6AK$xi7AH+" hikari: # 最大连接池数量 maxPoolSize: 20