Browse Source

身数据编目

dev^2
vincent 1 hour ago
parent
commit
82efe1623b
  1. 6
      pom.xml
  2. 42
      script/sql/vincent/V1.10.1-数据编目-达梦.sql
  3. 28
      script/sql/vincent/V1.10.1_20261013_tgk.sql
  4. 4
      zdxt-modules/zdxt-enforcement-code/pom.xml
  5. 18
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/XzjcInfoSyncBo.java
  6. 18
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/datashare/XzjcInfoShareBo.java
  7. 32
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/XzjcInfoSyncTgkMapper.java
  8. 41
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareGxkMapper.java
  9. 33
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/datashare/XzjcInfoShareMapper.java
  10. 35
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoShareJob.java
  11. 1
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/XzjcInfoSyncJob.java
  12. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IXzjcInfoShareService.java
  13. 115
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoShareServiceImpl.java
  14. 94
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java
  15. 67
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareGxkMapper.xml
  16. 29
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareMapper.xml
  17. 67
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml
  18. 96
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml
  19. 8
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml
  20. 34
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml

6
pom.xml

@ -252,6 +252,12 @@
<version>${p6spy.version}</version>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
</dependency>
<!-- AWS SDK for Java 2.x -->
<dependency>
<groupId>software.amazon.awssdk</groupId>

42
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);

28
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(),
'');

4
zdxt-modules/zdxt-enforcement-code/pom.xml

@ -166,5 +166,9 @@
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
</dependency>
</dependencies>
</project>

18
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;
}

18
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;
}

32
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<XzjcInfoSyncBo> list);
String selectMaxBatch(@Param("day") String day);
/**
* 查询目标表已出现过的业务ID集合(用于 CD_OPERATION 判定:出现过->U,首次->I)
*
* @param list 待判定的业务ID集合
* @return 目标表中已存在的业务ID
*/
List<String> selectExistingYwids(@Param("list") List<String> 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);
}

41
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 达梦目标侧)
* <p>YWID 唯一口径:不存在则插入(CD_OPERATION='I'),存在则更新(CD_OPERATION='U')</p>
*
* @author zdxt
*/
@DS("gxk")
public interface XzjcInfoShareGxkMapper {
/**
* 查询已存在于目标表的业务ID集合(用于 I/U 判定)
*
* @param list 待判定的业务ID集合
* @return 目标表中已存在的业务ID
*/
List<String> selectExistingYwids(@Param("list") List<String> 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);
}

33
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 源侧)
* <p>读取 TBZT='0' 的未拉取通知行;写入成功后回写 TBZT='1'</p>
*
* @author zdxt
*/
@DS("tgk")
public interface XzjcInfoShareMapper {
/**
* 分页查询未同步(TBZT='0')的通知行,按批次号顺序保证下游按序消费
*
* @param pageSize 分页大小
* @return 未同步行
*/
List<XzjcInfoShareBo> selectUnsyncedPage(@Param("pageSize") int pageSize);
/**
* 回写同步状态:TBZT 置 '1'-已同步(限定 TBZT='0' 保证幂等)
*
* @param ids 已成功写入 gxk 的行主键集合
* @return 影响行数
*/
int markSynced(@Param("ids") List<Long> ids);
}

35
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;
/**
* 共享库同步到提供库(局级)
* 行政检查信息共享同步定时任务
* <p>将 zfjd_tgk.SZSFJ_ZFJDM_XZJC_INFO 中 TBZT=0 的数据同步到 zfjd_gxk.SZ_SFJ_ZFJDM_XZJC_INFO</p>
* <p>默认 cron: 0 30 2 * * ?(每天凌晨 2:30,晚于 2:00 的 tgk 写入任务)</p>
*
* @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;
}
}
}

1
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;
/**
* 业务数据同步到共享库(内部)
* 行政检查信息同步定时任务
* <p>每天将 enforcement_registration 增量数据同步到 zfjd_tgk 库的 SZSFJ_ZFJDM_XZJC_INFO(市司法局数据共享表)</p>
* <p>默认 cron: 0 0 2 * * ?(每天凌晨 2 点)</p>

16
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();
}

115
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;
/**
* 行政检查信息共享同步服务实现
* <p>源表:zfjd_tgk.SZSFJ_ZFJDM_XZJC_INFO(TBZT='0');目标表:zfjd_gxk.SZ_SFJ_ZFJDM_XZJC_INFO</p>
* <p>写入成功的行回写源表 TBZT='1';单行失败跳过不标记,下次任务重试</p>
*
* @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<XzjcInfoShareBo> rows = xzjcInfoShareMapper.selectUnsyncedPage(PAGE_SIZE);
if (rows.isEmpty()) {
break;
}
// 达梦目标表已存在的业务ID -> U,不存在 -> I(YWID 唯一口径)
Set<String> existing = new HashSet<>();
if (!rows.isEmpty()) {
List<String> ywids = new ArrayList<>(rows.size());
for (XzjcInfoShareBo bo : rows) {
ywids.add(bo.getYwid());
}
List<String> hit = xzjcInfoShareGxkMapper.selectExistingYwids(ywids);
if (hit != null) {
existing.addAll(hit);
}
}
// 逐行写入,仅成功行参与回写 TBZT,失败行下轮重试
List<Long> 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;
}
}

94
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<XzjcInfoSyncBo> batch = new ArrayList<>(rows.size());
for (Map<String, Object> 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<String, Object> 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<XzjcInfoSyncBo> 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<String> existing = new HashSet<>();
if (!batch.isEmpty()) {
List<String> ywids = new ArrayList<>(batch.size());
for (XzjcInfoSyncBo bo : batch) {
ywids.add(bo.getYwid());
}
List<String> 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位序号)
* <p>数据日期取当前系统时间所在日期</p>
* <p>数据序号通过 Redis RAtomicLong 原子自增,当天从 00001 开始递增,天然支持多实例并发</p>
* <p>Redis 当天首次使用时,以目标表当天已用最大批次号兜底初始化,防止 Redis 数据丢失后重号</p>
*/
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 / 字符串)
*/

67
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareGxkMapper.xml

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.enforcementcode.mapper.datashare.XzjcInfoShareGxkMapper">
<!-- 已存在业务ID查询:I/U 判定依据 -->
<select id="selectExistingYwids" resultType="java.lang.String">
SELECT YWID
FROM SZ_SFJ_ZFJDM_XZJC_INFO
WHERE YWID IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 插入新行(不存在该 YWID -> I);ADD_TIME 由数据库默认值维护 -->
<insert id="insertOne">
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})
</insert>
<!-- 按业务ID更新已存在行(存在该 YWID -> U);CD_BATCH/CD_OPERATION 刷新为最新批次通知再次拉取 -->
<update id="updateByYwid">
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}
</update>
</mapper>

29
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoShareMapper.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.enforcementcode.mapper.datashare.XzjcInfoShareMapper">
<!-- 未同步通知行:TBZT='0',按批次号+行号顺序,保证下游按序消费 -->
<select id="selectUnsyncedPage" resultType="com.zdxt.enforcementcode.domain.bo.datashare.XzjcInfoShareBo">
SELECT ID, 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
FROM SZSFJ_ZFJDM_XZJC_INFO
WHERE TBZT = '0'
ORDER BY CD_BATCH ASC, ID ASC
LIMIT #{pageSize}
</select>
<!-- 回写已同步:限定 TBZT='0' 防并发重复标记 -->
<update id="markSynced">
UPDATE SZSFJ_ZFJDM_XZJC_INFO
SET TBZT = '1'
WHERE TBZT = '0'
AND ID IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>

67
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncMapper.xml

@ -4,44 +4,61 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.enforcementcode.mapper.XzjcInfoSyncMapper">
<!-- 按 (update_time, id) 键集分页查询源表增量数据:
仅同步已提交数据(is_submit=1,临时保存的不外发);
cursorTime 为空 -> 全量;
cursorTime 非空且 cursorId 为空 -> update_time >= cursorTime(含边界,防漏,配合幂等 upsert);
两者均非空 -> 严格游标(大于时刻 或 同时刻且 id 更大),避免页间重复;
endTime 为上界(不含),只读取该时间之前的数据 -->
仅同步已提交数据(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 为上界(不含),只读取该时间之前的数据 -->
<select id="selectIncrementalPage" resultType="java.util.HashMap">
SELECT
id, enterprise_name, enterprise_number,
law_enforcement_item_text, law_enforcement_item,
enforcement_time,
law_enforcement_basis_text, law_enforcement_basis,
law_enforce_category, check_category,
has_union, union_no, has_auto, entrust_dept_name, other_reasons,
law_enforcer, law_enforcer_id,
law_enforcer_two, law_enforcer_id_two,
bureau_dept_name, law_enforcement,
enforce, check_css,
create_time, update_time
FROM enforcement_registration
WHERE is_delete = 0
AND is_submit = 1
AND update_time IS NOT NULL
er.id, er.enterprise_name, er.enterprise_number,
IFNULL(NULLIF(TRIM(dai.area_code), ''), '440300000') AS ssqybm,
IFNULL(NULLIF(TRIM(dai.name), ''), '深圳市') AS ssqymc,
er.law_enforcement_item_text, er.law_enforcement_item,
er.enforcement_time,
er.law_enforcement_basis_text, er.law_enforcement_basis,
er.law_enforce_category, er.check_category,
er.has_union, er.union_no, er.has_auto, er.entrust_dept_name, er.other_reasons,
er.law_enforcer, er.law_enforcer_id,
er.law_enforcer_two, er.law_enforcer_id_two,
er.bureau_dept_id, er.bureau_dept_name, er.law_enforcement,
er.enforce, er.check_css, er.is_delete,
er.create_time, er.update_time
FROM enforcement_registration er
LEFT JOIN sys_dept sd ON er.bureau_dept_id = sd.dept_id
LEFT JOIN dashboard_area_info dai ON sd.area_node = dai.code AND dai.`level` = 3
WHERE er.is_submit = 1
AND er.update_time IS NOT NULL
AND er.bureau_dept_name IS NOT NULL
AND er.law_enforcement_id IS NOT NULL
AND er.enterprise_name IS NOT NULL
AND er.enterprise_number IS NOT NULL
AND er.law_enforcer IS NOT NULL
AND er.law_enforcer_two IS NOT NULL
AND er.is_complaint IS NOT NULL
AND er.check_category IS NOT NULL
AND er.bureau_dept_id IS NOT NULL
AND TRIM(IFNULL(er.law_enforcement_item_text, '')) != ''
<if test="endTime != null">
AND update_time &lt; #{endTime}
AND er.update_time &lt; #{endTime}
</if>
<if test="cursorTime != null">
<choose>
<when test="cursorId != null">
AND (update_time &gt; #{cursorTime}
OR (update_time = #{cursorTime} AND id &gt; #{cursorId}))
AND (er.update_time &gt; #{cursorTime}
OR (er.update_time = #{cursorTime} AND er.id &gt; #{cursorId}))
</when>
<otherwise>
AND update_time &gt;= #{cursorTime}
AND er.update_time &gt;= #{cursorTime}
</otherwise>
</choose>
</if>
ORDER BY update_time ASC, id ASC
ORDER BY er.update_time ASC, er.id ASC
LIMIT #{pageSize}
</select>

96
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/XzjcInfoSyncTgkMapper.xml

@ -10,44 +10,74 @@
FROM SZSFJ_ZFJDM_XZJC_INFO
</select>
<!-- 批量 upsert(uk_ywid 冲突时更新);注:affected 返回值(插入 1/更新 2)不代表真实行数 -->
<!-- ZLBS 增量标识:每次写入(插入/更新)均置 '0'-未同步,由推管方拉取后置 1 -->
<insert id="upsertBatch">
<!-- 当天已使用的最大批次号,用于"数据日期+五位序号"批次号生成(序号每天从 00001 递增) -->
<select id="selectMaxBatch" resultType="java.lang.String">
SELECT MAX(cd_batch)
FROM SZSFJ_ZFJDM_XZJC_INFO
WHERE cd_batch LIKE CONCAT(#{day}, '%')
</select>
<!-- 已出现过的业务ID查询:CD_OPERATION 判定依据(出现过->U,首次->I) -->
<select id="selectExistingYwids" resultType="java.lang.String">
SELECT YWID
FROM SZSFJ_ZFJDM_XZJC_INFO
WHERE YWID IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 插入新的通知行(append-only):TBZT='0' 通知推管方拉取,拉取后由推管方置 1 -->
<!-- CD_OPERATION 由服务层按"该 YWID 是否推送过"判定:首次 I/再次 U/删除 D -->
<!-- add_time/cd_time 由数据库自动维护,不显式写入;remark 由推管方回填,不写入 -->
<insert id="insertNew">
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
<foreach collection="list" item="item" separator=",">
(#{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')
</foreach>
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')
</insert>
<!-- 按业务ID更新已存在行(存在该 YWID);TBZT 重新置 '0' 通知推管方再次拉取 -->
<update id="updateByYwid">
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}
</update>
</mapper>

8
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:

34
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

Loading…
Cancel
Save