对接统一监管门户待办,优化信用修复待办取值的部分
This commit is contained in:
parent
6b4f96c8e2
commit
a61d15221b
|
|
@ -212,6 +212,12 @@ public class TSTaskList extends Model<TSTaskList> {
|
||||||
@TableField("ORIGIN")
|
@TableField("ORIGIN")
|
||||||
private String origin;
|
private String origin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统一监管门户推送状态:wA-未推送,wB-已推送
|
||||||
|
*/
|
||||||
|
@TableField("ISPUSH")
|
||||||
|
private String ispush;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主体类型
|
* 主体类型
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -179,4 +179,14 @@ public interface TSTaskListMapper extends BaseMapper<TSTaskList> {
|
||||||
|
|
||||||
List<AbnEntLocStatistic> tsAbnEntLocStatistic(@Param("customParamMap") Map<String, Object> customParamMap);
|
List<AbnEntLocStatistic> tsAbnEntLocStatistic(@Param("customParamMap") Map<String, Object> customParamMap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询 Kettle 写入但尚未创建统一监管门户推送记录的外网信用修复待办
|
||||||
|
*/
|
||||||
|
List<TSTaskList> selectUnpushedJgmhRepairTasks(@Param("limit") Integer limit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量标记待办已推送到统一监管门户
|
||||||
|
*/
|
||||||
|
int updateJgmhPushedByTasklistIds(@Param("tasklistids") List<String> tasklistids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,11 @@ public interface IJgmhPortalTodoService {
|
||||||
*/
|
*/
|
||||||
void createPushRecord(TSTaskList taskListModel);
|
void createPushRecord(TSTaskList taskListModel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描 Kettle 写入的未推送外网信用修复待办,并创建推送记录
|
||||||
|
*/
|
||||||
|
void scanAndCreatePushRecords();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量推送待办事项(定时任务调用)
|
* 批量推送待办事项(定时任务调用)
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package com.chinaweal.aiccs.door.service.impl;
|
package com.chinaweal.aiccs.door.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
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.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.aiccs.business.service.TSTaskListService;
|
||||||
import com.chinaweal.aiccs.common.constant.BaseDataConstant;
|
import com.chinaweal.aiccs.common.constant.BaseDataConstant;
|
||||||
import com.chinaweal.aiccs.door.dto.JgmhDebugPushResult;
|
import com.chinaweal.aiccs.door.dto.JgmhDebugPushResult;
|
||||||
|
|
@ -43,6 +46,8 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
private String redirectUrl;
|
private String redirectUrl;
|
||||||
@Value("${jgmhDoor.mobileRedirectUrl:}")
|
@Value("${jgmhDoor.mobileRedirectUrl:}")
|
||||||
private String mobileRedirectUrl;
|
private String mobileRedirectUrl;
|
||||||
|
@Value("${jgmhDoor.scanBatchSize:200}")
|
||||||
|
private Integer scanBatchSize;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private JgmhDoorApi jgmhDoorApi;
|
private JgmhDoorApi jgmhDoorApi;
|
||||||
|
|
@ -51,6 +56,10 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
@Resource
|
@Resource
|
||||||
private TSTaskListService taskListService;
|
private TSTaskListService taskListService;
|
||||||
@Resource
|
@Resource
|
||||||
|
private TSTaskListMapper taskListMapper;
|
||||||
|
@Resource
|
||||||
|
private TSRefGroupAndUserService refGroupAndUserService;
|
||||||
|
@Resource
|
||||||
private TUsersService tUsersService;
|
private TUsersService tUsersService;
|
||||||
@Resource
|
@Resource
|
||||||
private RedisService redisService;
|
private RedisService redisService;
|
||||||
|
|
@ -106,7 +115,7 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建待推送记录(工作流启动时调用)
|
* 创建待推送记录(工作流启动时调用/定时扫描调用)
|
||||||
*
|
*
|
||||||
* 三重过滤条件:
|
* 三重过滤条件:
|
||||||
* 1. BUSTYPE in ('7','12','14','33','27') — 信用修复业务
|
* 1. BUSTYPE in ('7','12','14','33','27') — 信用修复业务
|
||||||
|
|
@ -140,13 +149,21 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取门户用户ID
|
boolean exists = pushRecordService.lambdaQuery()
|
||||||
String portalUserId = getPortalUserId(taskListModel.getSignuserid());
|
.eq(PortalTodoPushRecord::getTasklistid, taskListModel.getTasklistid())
|
||||||
if (portalUserId == null) {
|
.count() > 0;
|
||||||
log.info("统一监管门户待办推送:用户未关联IMS账号,signuserid={}", taskListModel.getSignuserid());
|
if (exists) {
|
||||||
|
log.debug("统一监管门户待办推送:推送记录已存在,跳过创建。tasklistid={}", taskListModel.getTasklistid());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<String> imsUserIds = resolveCandidateImsUserIds(taskListModel);
|
||||||
|
if (imsUserIds.isEmpty()) {
|
||||||
|
log.info("统一监管门户待办推送:无有效IMS用户,跳过。tasklistid={}", taskListModel.getTasklistid());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String usersidValue = joinAndTruncate(imsUserIds, 500);
|
||||||
|
|
||||||
// 创建推送记录
|
// 创建推送记录
|
||||||
// DBSXID 使用 tasklistid(因为只有2步且无回退,不存在多人共享问题)
|
// DBSXID 使用 tasklistid(因为只有2步且无回退,不存在多人共享问题)
|
||||||
PortalTodoPushRecord record = new PortalTodoPushRecord();
|
PortalTodoPushRecord record = new PortalTodoPushRecord();
|
||||||
|
|
@ -155,15 +172,15 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
record.setDbsxid(taskListModel.getTasklistid());
|
record.setDbsxid(taskListModel.getTasklistid());
|
||||||
record.setDbsxmc(taskListModel.getBusname());
|
record.setDbsxmc(taskListModel.getBusname());
|
||||||
record.setDbsxzt(1); // 待办
|
record.setDbsxzt(1); // 待办
|
||||||
record.setUsersid(portalUserId);
|
record.setUsersid(usersidValue);
|
||||||
record.setPushstatus("0"); // 待推送
|
record.setPushstatus("0"); // 待推送
|
||||||
record.setPushcount(0);
|
record.setPushcount(0);
|
||||||
record.setCreatetime(LocalDateTime.now());
|
record.setCreatetime(LocalDateTime.now());
|
||||||
record.setUpdatetime(LocalDateTime.now());
|
record.setUpdatetime(LocalDateTime.now());
|
||||||
pushRecordService.save(record);
|
pushRecordService.save(record);
|
||||||
|
|
||||||
log.info("统一监管门户待办推送:创建推送记录,tasklistid={}, bustype={}, usersid={}",
|
log.info("统一监管门户待办推送:创建推送记录,tasklistid={}, bustype={}, 候选人数={}, usersid长度={}",
|
||||||
taskListModel.getTasklistid(), taskListModel.getBustype(), portalUserId);
|
taskListModel.getTasklistid(), taskListModel.getBustype(), imsUserIds.size(), usersidValue.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -191,6 +208,31 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
log.info("统一监管门户待办推送:用户点击办理,标记为已办,tasklistid={}", tasklistid);
|
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 {
|
try {
|
||||||
ForestResponse<String> response = jgmhDoorApi.pushTodoItems(token, requestDto);
|
ForestResponse<String> response = jgmhDoorApi.pushTodoItems(token, requestDto);
|
||||||
if (response.isSuccess()) {
|
if (response.isSuccess()) {
|
||||||
|
List<String> tasklistids = new ArrayList<>();
|
||||||
for (PortalTodoPushRecord record : pendingRecords) {
|
for (PortalTodoPushRecord record : pendingRecords) {
|
||||||
record.setPushstatus("1");
|
record.setPushstatus("1");
|
||||||
record.setPushcount(record.getPushcount() + 1);
|
record.setPushcount(record.getPushcount() + 1);
|
||||||
record.setLastpushtime(LocalDateTime.now());
|
record.setLastpushtime(LocalDateTime.now());
|
||||||
|
tasklistids.add(record.getTasklistid());
|
||||||
|
}
|
||||||
|
if (!tasklistids.isEmpty()) {
|
||||||
|
taskListMapper.updateJgmhPushedByTasklistIds(tasklistids);
|
||||||
}
|
}
|
||||||
log.info("统一监管门户待办推送:推送成功,记录数={}", pendingRecords.size());
|
log.info("统一监管门户待办推送:推送成功,记录数={}", pendingRecords.size());
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -322,19 +369,20 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
}
|
}
|
||||||
result.setTaskListPreview(buildTaskListPreview(taskList));
|
result.setTaskListPreview(buildTaskListPreview(taskList));
|
||||||
|
|
||||||
// 3. 获取门户用户ID
|
// 3. 解析候选受理人组 → 拼接 USERSID
|
||||||
String portalUserId = getPortalUserId(taskList.getSignuserid());
|
List<String> imsUserIds = resolveCandidateImsUserIds(taskList);
|
||||||
if (portalUserId == null) {
|
if (imsUserIds.isEmpty()) {
|
||||||
return result.setSuccess(false)
|
return result.setSuccess(false)
|
||||||
.setMessage("当前 tasklistid 的签收人未关联 IMS 账号,无法推送。signuserid="
|
.setMessage("无有效IMS用户,无法推送。signuserid=" + taskList.getSignuserid()
|
||||||
+ taskList.getSignuserid());
|
+ ", acceptgroupid=" + taskList.getAcceptgroupid());
|
||||||
}
|
}
|
||||||
|
String usersidValue = joinAndTruncate(imsUserIds, 500);
|
||||||
|
|
||||||
// 4. 查询或临时构造推送记录(不写库)
|
// 4. 查询或临时构造推送记录(不写库)
|
||||||
PortalTodoPushRecord record = pushRecordService.lambdaQuery()
|
List<PortalTodoPushRecord> records = pushRecordService.lambdaQuery()
|
||||||
.eq(PortalTodoPushRecord::getTasklistid, tasklistid)
|
.eq(PortalTodoPushRecord::getTasklistid, tasklistid)
|
||||||
.last("LIMIT 1")
|
.list();
|
||||||
.one();
|
PortalTodoPushRecord record = records.isEmpty() ? null : records.get(0);
|
||||||
if (record == null) {
|
if (record == null) {
|
||||||
record = new PortalTodoPushRecord();
|
record = new PortalTodoPushRecord();
|
||||||
record.setTasklistid(tasklistid);
|
record.setTasklistid(tasklistid);
|
||||||
|
|
@ -342,8 +390,8 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
record.setDbsxid(tasklistid);
|
record.setDbsxid(tasklistid);
|
||||||
record.setDbsxmc(taskList.getBusname());
|
record.setDbsxmc(taskList.getBusname());
|
||||||
record.setDbsxzt(1); // 默认按"待办"推送
|
record.setDbsxzt(1); // 默认按"待办"推送
|
||||||
record.setUsersid(portalUserId);
|
|
||||||
}
|
}
|
||||||
|
record.setUsersid(usersidValue);
|
||||||
|
|
||||||
// 5. 组装推送数据
|
// 5. 组装推送数据
|
||||||
JgmhTodoItemDto item = buildTodoItem(record);
|
JgmhTodoItemDto item = buildTodoItem(record);
|
||||||
|
|
@ -387,6 +435,57 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
return token.substring(0, 4) + "****" + token.substring(token.length() - 4);
|
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 关键字段用于调试查看 */
|
/** 提取 tstasklist 关键字段用于调试查看 */
|
||||||
private Map<String, Object> buildTaskListPreview(TSTaskList t) {
|
private Map<String, Object> buildTaskListPreview(TSTaskList t) {
|
||||||
Map<String, Object> m = new LinkedHashMap<>();
|
Map<String, Object> m = new LinkedHashMap<>();
|
||||||
|
|
@ -395,7 +494,9 @@ public class JgmhPortalTodoServiceImpl implements IJgmhPortalTodoService {
|
||||||
m.put("busname", t.getBusname());
|
m.put("busname", t.getBusname());
|
||||||
m.put("origin", t.getOrigin());
|
m.put("origin", t.getOrigin());
|
||||||
m.put("busstatus", t.getBusstatus());
|
m.put("busstatus", t.getBusstatus());
|
||||||
|
m.put("ispush", t.getIspush());
|
||||||
m.put("signuserid", t.getSignuserid());
|
m.put("signuserid", t.getSignuserid());
|
||||||
|
m.put("acceptgroupid", t.getAcceptgroupid());
|
||||||
m.put("linkname", t.getLinkname());
|
m.put("linkname", t.getLinkname());
|
||||||
m.put("sendertime", t.getSendertime());
|
m.put("sendertime", t.getSendertime());
|
||||||
m.put("deadlineDate", t.getDeadlineDate());
|
m.put("deadlineDate", t.getDeadlineDate());
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ public class JgmhPortalTodoPushScheduled {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
log.info("【统一监管门户待办推送任务】开始执行");
|
log.info("【统一监管门户待办推送任务】开始执行");
|
||||||
|
jgmhPortalTodoService.scanAndCreatePushRecords();
|
||||||
jgmhPortalTodoService.pushPendingTodoItems();
|
jgmhPortalTodoService.pushPendingTodoItems();
|
||||||
log.info("【统一监管门户待办推送任务】执行完成");
|
log.info("【统一监管门户待办推送任务】执行完成");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
||||||
|
|
@ -152,6 +152,7 @@ jgmhDoor:
|
||||||
redirectUrl: ${JGMH_DOOR_REDIRECT_URL:} # PC端待办跳转地址,需根据环境配置
|
redirectUrl: ${JGMH_DOOR_REDIRECT_URL:} # PC端待办跳转地址,需根据环境配置
|
||||||
mobileRedirectUrl: ${JGMH_DOOR_MOBILE_REDIRECT_URL:} # 移动端待办跳转地址
|
mobileRedirectUrl: ${JGMH_DOOR_MOBILE_REDIRECT_URL:} # 移动端待办跳转地址
|
||||||
debugEnabled: ${JGMH_DOOR_DEBUG_ENABLED:false} # 单笔调试推送接口开关,生产环境建议关闭
|
debugEnabled: ${JGMH_DOOR_DEBUG_ENABLED:false} # 单笔调试推送接口开关,生产环境建议关闭
|
||||||
|
scanBatchSize: ${JGMH_DOOR_SCAN_BATCH_SIZE:200} # 单次扫描Kettle未推送待办的最大处理条数
|
||||||
|
|
||||||
punishment:
|
punishment:
|
||||||
api:
|
api:
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@
|
||||||
<result column="CREATEUSERNAME" property="createUsername" />
|
<result column="CREATEUSERNAME" property="createUsername" />
|
||||||
<result column="CREATETIME" property="createTime" />
|
<result column="CREATETIME" property="createTime" />
|
||||||
<result column="ISDEADLINE" property="isdeadline" />
|
<result column="ISDEADLINE" property="isdeadline" />
|
||||||
|
<result column="ORIGIN" property="origin" />
|
||||||
|
<result column="ISPUSH" property="ispush" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="TaskListUnionMap" type="com.chinaweal.aiccs.aiccs.business.entity.dto.TaskListUnionDto">
|
<resultMap id="TaskListUnionMap" type="com.chinaweal.aiccs.aiccs.business.entity.dto.TaskListUnionDto">
|
||||||
|
|
@ -1764,4 +1766,28 @@
|
||||||
GROUP BY DECORG
|
GROUP BY DECORG
|
||||||
</select>
|
</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 <= #{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>
|
</mapper>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue