对接统一监管门户待办,优化信用修复待办取值的部分

This commit is contained in:
zhouxy 2026-05-23 16:39:21 +08:00
parent 6b4f96c8e2
commit a61d15221b
7 changed files with 167 additions and 17 deletions

View File

@ -212,6 +212,12 @@ public class TSTaskList extends Model<TSTaskList> {
@TableField("ORIGIN")
private String origin;
/**
* 统一监管门户推送状态wA-未推送wB-已推送
*/
@TableField("ISPUSH")
private String ispush;
/**
* 主体类型
*/

View File

@ -179,4 +179,14 @@ public interface TSTaskListMapper extends BaseMapper<TSTaskList> {
List<AbnEntLocStatistic> tsAbnEntLocStatistic(@Param("customParamMap") Map<String, Object> customParamMap);
/**
* 查询 Kettle 写入但尚未创建统一监管门户推送记录的外网信用修复待办
*/
List<TSTaskList> selectUnpushedJgmhRepairTasks(@Param("limit") Integer limit);
/**
* 批量标记待办已推送到统一监管门户
*/
int updateJgmhPushedByTasklistIds(@Param("tasklistids") List<String> tasklistids);
}

View File

@ -10,6 +10,11 @@ public interface IJgmhPortalTodoService {
*/
void createPushRecord(TSTaskList taskListModel);
/**
* 扫描 Kettle 写入的未推送外网信用修复待办并创建推送记录
*/
void scanAndCreatePushRecords();
/**
* 批量推送待办事项定时任务调用
*/

View File

@ -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<String> 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<TSTaskList> 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<String> response = jgmhDoorApi.pushTodoItems(token, requestDto);
if (response.isSuccess()) {
List<String> 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<String> 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<PortalTodoPushRecord> 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<String> resolveCandidateImsUserIds(TSTaskList taskListModel) {
List<String> localUserIds = new ArrayList<>();
if (StringUtils.isNotBlank(taskListModel.getSignuserid())) {
localUserIds.add(taskListModel.getSignuserid());
} else if (StringUtils.isNotBlank(taskListModel.getAcceptgroupid())) {
List<TSRefGroupAndUser> 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<String> 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<String> 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<String, Object> buildTaskListPreview(TSTaskList t) {
Map<String, Object> 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());

View File

@ -35,6 +35,7 @@ public class JgmhPortalTodoPushScheduled {
try {
log.info("【统一监管门户待办推送任务】开始执行");
jgmhPortalTodoService.scanAndCreatePushRecords();
jgmhPortalTodoService.pushPendingTodoItems();
log.info("【统一监管门户待办推送任务】执行完成");
} catch (Exception e) {

View File

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

View File

@ -29,6 +29,8 @@
<result column="CREATEUSERNAME" property="createUsername" />
<result column="CREATETIME" property="createTime" />
<result column="ISDEADLINE" property="isdeadline" />
<result column="ORIGIN" property="origin" />
<result column="ISPUSH" property="ispush" />
</resultMap>
<resultMap id="TaskListUnionMap" type="com.chinaweal.aiccs.aiccs.business.entity.dto.TaskListUnionDto">
@ -1764,4 +1766,28 @@
GROUP BY DECORG
</select>
<select id="selectUnpushedJgmhRepairTasks" resultMap="BaseResultMap">
SELECT * FROM (
SELECT t.*
FROM TSTASKLIST t
LEFT JOIN PORTAL_TODO_PUSH_RECORD p ON t.TASKLISTID = p.TASKLISTID
WHERE t.BUSTYPE IN ('7','12','14','33','27')
AND t.ORIGIN = '1'
AND t.BUSSTATUS = '-1'
AND t.ISPUSH = 'wA'
AND p.ID IS NULL
ORDER BY t.CREATETIME ASC
)
WHERE ROWNUM &lt;= #{limit}
</select>
<update id="updateJgmhPushedByTasklistIds">
UPDATE TSTASKLIST
SET ISPUSH = 'wB'
WHERE TASKLISTID IN
<foreach collection="tasklistids" item="tasklistid" open="(" separator="," close=")">
#{tasklistid}
</foreach>
</update>
</mapper>