From a61d15221bc31d420f9a6c86e611f192bcba183c Mon Sep 17 00:00:00 2001 From: zhouxy Date: Sat, 23 May 2026 16:39:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=BB=9F=E4=B8=80=E7=9B=91?= =?UTF-8?q?=E7=AE=A1=E9=97=A8=E6=88=B7=E5=BE=85=E5=8A=9E=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BF=A1=E7=94=A8=E4=BF=AE=E5=A4=8D=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E5=8F=96=E5=80=BC=E7=9A=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiccs/business/entity/TSTaskList.java | 6 + .../business/mapper/TSTaskListMapper.java | 10 ++ .../door/service/IJgmhPortalTodoService.java | 5 + .../impl/JgmhPortalTodoServiceImpl.java | 135 +++++++++++++++--- .../schedule/JgmhPortalTodoPushScheduled.java | 1 + src/main/resources/application.yml | 1 + .../aiccs/business/TSTaskListMapper.xml | 26 ++++ 7 files changed, 167 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/business/entity/TSTaskList.java b/src/main/java/com/chinaweal/aiccs/aiccs/business/entity/TSTaskList.java index e061e99..2e1c029 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/business/entity/TSTaskList.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/business/entity/TSTaskList.java @@ -212,6 +212,12 @@ public class TSTaskList extends Model { @TableField("ORIGIN") private String origin; + /** + * 统一监管门户推送状态:wA-未推送,wB-已推送 + */ + @TableField("ISPUSH") + private String ispush; + /** * 主体类型 */ diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/business/mapper/TSTaskListMapper.java b/src/main/java/com/chinaweal/aiccs/aiccs/business/mapper/TSTaskListMapper.java index e23deb0..d6e7dad 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/business/mapper/TSTaskListMapper.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/business/mapper/TSTaskListMapper.java @@ -179,4 +179,14 @@ public interface TSTaskListMapper extends BaseMapper { List tsAbnEntLocStatistic(@Param("customParamMap") Map customParamMap); + /** + * 查询 Kettle 写入但尚未创建统一监管门户推送记录的外网信用修复待办 + */ + List selectUnpushedJgmhRepairTasks(@Param("limit") Integer limit); + + /** + * 批量标记待办已推送到统一监管门户 + */ + int updateJgmhPushedByTasklistIds(@Param("tasklistids") List tasklistids); + } diff --git a/src/main/java/com/chinaweal/aiccs/door/service/IJgmhPortalTodoService.java b/src/main/java/com/chinaweal/aiccs/door/service/IJgmhPortalTodoService.java index 5668459..194e91b 100644 --- a/src/main/java/com/chinaweal/aiccs/door/service/IJgmhPortalTodoService.java +++ b/src/main/java/com/chinaweal/aiccs/door/service/IJgmhPortalTodoService.java @@ -10,6 +10,11 @@ public interface IJgmhPortalTodoService { */ void createPushRecord(TSTaskList taskListModel); + /** + * 扫描 Kettle 写入的未推送外网信用修复待办,并创建推送记录 + */ + void scanAndCreatePushRecords(); + /** * 批量推送待办事项(定时任务调用) */ diff --git a/src/main/java/com/chinaweal/aiccs/door/service/impl/JgmhPortalTodoServiceImpl.java b/src/main/java/com/chinaweal/aiccs/door/service/impl/JgmhPortalTodoServiceImpl.java index f4682ce..ac55202 100644 --- a/src/main/java/com/chinaweal/aiccs/door/service/impl/JgmhPortalTodoServiceImpl.java +++ b/src/main/java/com/chinaweal/aiccs/door/service/impl/JgmhPortalTodoServiceImpl.java @@ -1,7 +1,10 @@ package com.chinaweal.aiccs.door.service.impl; import com.alibaba.fastjson.JSON; +import com.chinaweal.aiccs.aiccs.business.entity.TSRefGroupAndUser; import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList; +import com.chinaweal.aiccs.aiccs.business.mapper.TSTaskListMapper; +import com.chinaweal.aiccs.aiccs.business.service.TSRefGroupAndUserService; import com.chinaweal.aiccs.aiccs.business.service.TSTaskListService; import com.chinaweal.aiccs.common.constant.BaseDataConstant; import com.chinaweal.aiccs.door.dto.JgmhDebugPushResult; @@ -43,6 +46,8 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { private String redirectUrl; @Value("${jgmhDoor.mobileRedirectUrl:}") private String mobileRedirectUrl; + @Value("${jgmhDoor.scanBatchSize:200}") + private Integer scanBatchSize; @Resource private JgmhDoorApi jgmhDoorApi; @@ -51,6 +56,10 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { @Resource private TSTaskListService taskListService; @Resource + private TSTaskListMapper taskListMapper; + @Resource + private TSRefGroupAndUserService refGroupAndUserService; + @Resource private TUsersService tUsersService; @Resource private RedisService redisService; @@ -106,7 +115,7 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { } /** - * 创建待推送记录(工作流启动时调用) + * 创建待推送记录(工作流启动时调用/定时扫描调用) * * 三重过滤条件: * 1. BUSTYPE in ('7','12','14','33','27') — 信用修复业务 @@ -140,13 +149,21 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { return; } - // 获取门户用户ID - String portalUserId = getPortalUserId(taskListModel.getSignuserid()); - if (portalUserId == null) { - log.info("统一监管门户待办推送:用户未关联IMS账号,signuserid={}", taskListModel.getSignuserid()); + boolean exists = pushRecordService.lambdaQuery() + .eq(PortalTodoPushRecord::getTasklistid, taskListModel.getTasklistid()) + .count() > 0; + if (exists) { + log.debug("统一监管门户待办推送:推送记录已存在,跳过创建。tasklistid={}", taskListModel.getTasklistid()); return; } + List imsUserIds = resolveCandidateImsUserIds(taskListModel); + if (imsUserIds.isEmpty()) { + log.info("统一监管门户待办推送:无有效IMS用户,跳过。tasklistid={}", taskListModel.getTasklistid()); + return; + } + String usersidValue = joinAndTruncate(imsUserIds, 500); + // 创建推送记录 // DBSXID 使用 tasklistid(因为只有2步且无回退,不存在多人共享问题) PortalTodoPushRecord record = new PortalTodoPushRecord(); @@ -155,15 +172,15 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { record.setDbsxid(taskListModel.getTasklistid()); record.setDbsxmc(taskListModel.getBusname()); record.setDbsxzt(1); // 待办 - record.setUsersid(portalUserId); + record.setUsersid(usersidValue); record.setPushstatus("0"); // 待推送 record.setPushcount(0); record.setCreatetime(LocalDateTime.now()); record.setUpdatetime(LocalDateTime.now()); pushRecordService.save(record); - log.info("统一监管门户待办推送:创建推送记录,tasklistid={}, bustype={}, usersid={}", - taskListModel.getTasklistid(), taskListModel.getBustype(), portalUserId); + log.info("统一监管门户待办推送:创建推送记录,tasklistid={}, bustype={}, 候选人数={}, usersid长度={}", + taskListModel.getTasklistid(), taskListModel.getBustype(), imsUserIds.size(), usersidValue.length()); } /** @@ -191,6 +208,31 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { log.info("统一监管门户待办推送:用户点击办理,标记为已办,tasklistid={}", tasklistid); } + /** + * 扫描 Kettle 写入的未推送外网信用修复待办,并创建推送记录 + */ + @Override + public void scanAndCreatePushRecords() { + if (!enableTask) return; + + List tasks = taskListMapper.selectUnpushedJgmhRepairTasks(scanBatchSize == null ? 200 : scanBatchSize); + if (tasks == null || tasks.isEmpty()) { + log.info("统一监管门户待办扫描:无 Kettle 未推送待办"); + return; + } + + int count = 0; + for (TSTaskList task : tasks) { + try { + createPushRecord(task); + count++; + } catch (Exception e) { + log.error("统一监管门户待办扫描:创建推送记录失败,tasklistid={}", task.getTasklistid(), e); + } + } + log.info("统一监管门户待办扫描:扫描到{}条,处理{}条", tasks.size(), count); + } + /** * 批量推送待办事项(定时任务调用) */ @@ -231,10 +273,15 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { try { ForestResponse response = jgmhDoorApi.pushTodoItems(token, requestDto); if (response.isSuccess()) { + List tasklistids = new ArrayList<>(); for (PortalTodoPushRecord record : pendingRecords) { record.setPushstatus("1"); record.setPushcount(record.getPushcount() + 1); record.setLastpushtime(LocalDateTime.now()); + tasklistids.add(record.getTasklistid()); + } + if (!tasklistids.isEmpty()) { + taskListMapper.updateJgmhPushedByTasklistIds(tasklistids); } log.info("统一监管门户待办推送:推送成功,记录数={}", pendingRecords.size()); } else { @@ -322,19 +369,20 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { } result.setTaskListPreview(buildTaskListPreview(taskList)); - // 3. 获取门户用户ID - String portalUserId = getPortalUserId(taskList.getSignuserid()); - if (portalUserId == null) { + // 3. 解析候选受理人组 → 拼接 USERSID + List imsUserIds = resolveCandidateImsUserIds(taskList); + if (imsUserIds.isEmpty()) { return result.setSuccess(false) - .setMessage("当前 tasklistid 的签收人未关联 IMS 账号,无法推送。signuserid=" - + taskList.getSignuserid()); + .setMessage("无有效IMS用户,无法推送。signuserid=" + taskList.getSignuserid() + + ", acceptgroupid=" + taskList.getAcceptgroupid()); } + String usersidValue = joinAndTruncate(imsUserIds, 500); // 4. 查询或临时构造推送记录(不写库) - PortalTodoPushRecord record = pushRecordService.lambdaQuery() + List records = pushRecordService.lambdaQuery() .eq(PortalTodoPushRecord::getTasklistid, tasklistid) - .last("LIMIT 1") - .one(); + .list(); + PortalTodoPushRecord record = records.isEmpty() ? null : records.get(0); if (record == null) { record = new PortalTodoPushRecord(); record.setTasklistid(tasklistid); @@ -342,8 +390,8 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { record.setDbsxid(tasklistid); record.setDbsxmc(taskList.getBusname()); record.setDbsxzt(1); // 默认按"待办"推送 - record.setUsersid(portalUserId); } + record.setUsersid(usersidValue); // 5. 组装推送数据 JgmhTodoItemDto item = buildTodoItem(record); @@ -387,6 +435,57 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { return token.substring(0, 4) + "****" + token.substring(token.length() - 4); } + /** + * 解析待办候选受理人对应的统一监管门户用户ID列表 + */ + private List resolveCandidateImsUserIds(TSTaskList taskListModel) { + List localUserIds = new ArrayList<>(); + + if (StringUtils.isNotBlank(taskListModel.getSignuserid())) { + localUserIds.add(taskListModel.getSignuserid()); + } else if (StringUtils.isNotBlank(taskListModel.getAcceptgroupid())) { + List groupUsers = refGroupAndUserService.lambdaQuery() + .eq(TSRefGroupAndUser::getGroupid, taskListModel.getAcceptgroupid()) + .list(); + for (TSRefGroupAndUser groupUser : groupUsers) { + if (StringUtils.isNotBlank(groupUser.getUserid())) { + localUserIds.add(groupUser.getUserid()); + } + } + } else { + log.warn("统一监管门户待办推送:signuserid 和 acceptgroupid 均为空,无法确定候选受理人。tasklistid={}", + taskListModel.getTasklistid()); + } + + List imsUserIds = new ArrayList<>(); + for (String localUserId : localUserIds) { + String portalUserId = getPortalUserId(localUserId); + if (StringUtils.isNotBlank(portalUserId)) { + imsUserIds.add(portalUserId); + } + } + Collections.sort(imsUserIds); + return imsUserIds; + } + + /** + * 将用户ID列表用英文逗号拼接,并截断到指定最大长度 + */ + private String joinAndTruncate(List imsUserIds, int maxLen) { + if (imsUserIds.isEmpty()) return ""; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < imsUserIds.size(); i++) { + String userId = imsUserIds.get(i); + String segment = i == 0 ? userId : "," + userId; + if (sb.length() + segment.length() > maxLen) { + break; + } + sb.append(segment); + } + return sb.toString(); + } + /** 提取 tstasklist 关键字段用于调试查看 */ private Map buildTaskListPreview(TSTaskList t) { Map m = new LinkedHashMap<>(); @@ -395,7 +494,9 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService { m.put("busname", t.getBusname()); m.put("origin", t.getOrigin()); m.put("busstatus", t.getBusstatus()); + m.put("ispush", t.getIspush()); m.put("signuserid", t.getSignuserid()); + m.put("acceptgroupid", t.getAcceptgroupid()); m.put("linkname", t.getLinkname()); m.put("sendertime", t.getSendertime()); m.put("deadlineDate", t.getDeadlineDate()); diff --git a/src/main/java/com/chinaweal/aiccs/schedule/JgmhPortalTodoPushScheduled.java b/src/main/java/com/chinaweal/aiccs/schedule/JgmhPortalTodoPushScheduled.java index dfa5fb4..1eea6ee 100644 --- a/src/main/java/com/chinaweal/aiccs/schedule/JgmhPortalTodoPushScheduled.java +++ b/src/main/java/com/chinaweal/aiccs/schedule/JgmhPortalTodoPushScheduled.java @@ -35,6 +35,7 @@ public class JgmhPortalTodoPushScheduled { try { log.info("【统一监管门户待办推送任务】开始执行"); + jgmhPortalTodoService.scanAndCreatePushRecords(); jgmhPortalTodoService.pushPendingTodoItems(); log.info("【统一监管门户待办推送任务】执行完成"); } catch (Exception e) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b232c42..76b9702 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -152,6 +152,7 @@ jgmhDoor: redirectUrl: ${JGMH_DOOR_REDIRECT_URL:} # PC端待办跳转地址,需根据环境配置 mobileRedirectUrl: ${JGMH_DOOR_MOBILE_REDIRECT_URL:} # 移动端待办跳转地址 debugEnabled: ${JGMH_DOOR_DEBUG_ENABLED:false} # 单笔调试推送接口开关,生产环境建议关闭 + scanBatchSize: ${JGMH_DOOR_SCAN_BATCH_SIZE:200} # 单次扫描Kettle未推送待办的最大处理条数 punishment: api: diff --git a/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml b/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml index 199550c..de49694 100644 --- a/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml +++ b/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml @@ -29,6 +29,8 @@ + + @@ -1764,4 +1766,28 @@ GROUP BY DECORG + + + + UPDATE TSTASKLIST + SET ISPUSH = 'wB' + WHERE TASKLISTID IN + + #{tasklistid} + + +