Commit a117e471 by wuchao

回访计划

parent af871952
package com.scpyun.platform.jilinsscgsdp.service.impl;
import com.scpyun.base.core.annotation.Api;
import com.scpyun.base.core.annotation.ApiOperation;
import com.scpyun.base.db.service.CommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author liu
* @Date 2025/9/26 15:38
* @PackageName:com.scpyun.platform.jilinsscgsdp.service.impl
* @ClassName: KeyPersonVisitServiceImpl
* @Description: TODO
* @Version 1.0
*/
//@Api("重度人员回访计划定时任务")
//@Service("keyPersonVisitRecordScheduledTask")
@Component
@Slf4j
public class KeyPersonVisitRecordScheduledTaskServiceImpl {
@Autowired
CommonService commonService;
private final String SUCCESS = "success";
private String namespace = "com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecordScheduledTaskDao.";
/**
* 每天00:10生成回访“待办”记录
*/
// @Scheduled(cron = "0 30 0 * * ?")
@Scheduled(cron = "0/20 * * * * ?")
// @ApiOperation(value = "生成",desc = "生成")
public void generateDailyVisitTodos() {
log.info("定时任务 - 开始生成回访计划");
List<Map<String, Object>> activePlans = commonService.findList(namespace + "selectActiveVisitPlans", new HashMap<>());
if (activePlans == null || activePlans.isEmpty()) {
return;
}
LocalDate today = LocalDate.now();
for (Map<String, Object> plan : activePlans) {
String planId = String.valueOf(plan.get("id"));
String planName = String.valueOf(plan.get("plan_name"));
String planType = String.valueOf(plan.get("plan_type"));
String ratingDictType = String.valueOf(plan.get("rating_dict_type"));
String ratingType = String.valueOf(plan.get("rating_type"));
int startDay = Integer.parseInt(String.valueOf(plan.get("visit_start_day")));
int endDay = Integer.parseInt(String.valueOf(plan.get("visit_end_day")));
int overdueDays = 0;
Object overdueObj = plan.get("overdue_warning_day");
if (overdueObj != null) {
try { overdueDays = Integer.parseInt(String.valueOf(overdueObj)); } catch (Exception ignored) {}
if (overdueDays < 0) { overdueDays = 0; }
}
Map<String, Object> personQuery = new HashMap<>();
personQuery.put("rating_dict_type", ratingDictType);
personQuery.put("rating_type", ratingType);
List<Map<String, Object>> persons;
if ("6".equals(ratingDictType)) {
persons = commonService.findList(namespace + "selectPersonsForMinorByPlan", personQuery);
} else {
persons = commonService.findList(namespace + "selectPersonsForKeyPersonByPlan", personQuery);
}
if (persons == null || persons.isEmpty()) {
continue;
}
for (Map<String, Object> person : persons) {
String personId = String.valueOf(person.get("person_id"));
Map<String, Object> param = new HashMap<>();
param.put("person_id", personId);
// 标记可能已过期的“待办”记录
Map<String, Object> latestBefore = commonService.getObject(namespace + "selectLatestRecordByPerson", param);
if (latestBefore != null) {
commonService.update(namespace + "markOverdueIfExpired", latestBefore);
}
// 重新获取最新记录
Map<String, Object> latest = commonService.getObject(namespace + "selectLatestRecordByPerson", param);
// 4.3 无任何回访记录:直接新增
if (latest == null) {
LocalDate planStart = today;
LocalDate planEnd = today.plusDays(Math.max(0, endDay - startDay));
Map<String, Object> insert = new HashMap<>();
insert.put("person_id", personId);
insert.put("key_person_visit_id", planId);
insert.put("plan_name", planName);
insert.put("plan_type", planType);
insert.put("rating_dict_type", ratingDictType);
insert.put("rating_type", ratingType);
insert.put("plan_start_data", planStart.toString());
insert.put("plan_end_data", planEnd.toString());
if (overdueDays > 0) {
LocalDate overdueDate = planEnd.minusDays(overdueDays);
insert.put("overdue_date", overdueDate.toString());
}
commonService.insert(namespace + "insertVisitRecord", insert);
continue;
}
String statusStr = String.valueOf(latest.get("do_status"));
int status = -1;
try { status = Integer.parseInt(statusStr); } catch (Exception ignored) {}
// 4.2 一个“待办”限制:如仍为“待办”,则不生成;
if (status == 0) {
continue;
}
// 4.4 最新为“已办(1)”或“超期未办(2)”:达到起始天数生成新“待办”
Object planEndObj = latest.get("plan_end_date");
LocalDate baseDate = planEndObj != null ? LocalDate.parse(String.valueOf(planEndObj)) : today;
long daysSinceBase = ChronoUnit.DAYS.between(baseDate, today);
if (daysSinceBase >= startDay) {
LocalDate planStart = baseDate.plusDays(startDay);
LocalDate planEnd = baseDate.plusDays(endDay);
Map<String, Object> insert = new HashMap<>();
insert.put("person_id", personId);
insert.put("key_person_visit_id", planId);
insert.put("plan_name", planName);
insert.put("plan_type", planType);
insert.put("rating_dict_type", ratingDictType);
insert.put("rating_type", ratingType);
insert.put("plan_start_data", planStart.toString());
insert.put("plan_end_data", planEnd.toString());
if (overdueDays > 0) {
LocalDate overdueDate = planEnd.minusDays(overdueDays);
insert.put("overdue_date", overdueDate.toString());
}
commonService.insert(namespace + "insertVisitRecord", insert);
}
}
}
log.info("定时任务 - 回访计划生成结束");
}
/**
* 每天00:10:将所有“待办”中超过临期日期(overdue_date)的记录标记为已临期(is_overdue=1)
* 示例:overdue_date=2025-05-05,则在2025-05-06触发任务后置为1
*/
// @Scheduled(cron = "0 10 0 * * ?")
@Scheduled(cron = "0/20 * * * * ?")
// @ApiOperation(value = "标记临期", desc = "超过 overdue_date 将 is_overdue 置为 1")
public void markOverdueByOverdueDate() {
log.info("定时任务 - 更新回访计划临期状态");
commonService.update(namespace + "markOverdueByOverdueDate", new HashMap<>());
log.info("定时任务 - 回访计划临期状态结束");
}
}
...@@ -10,9 +10,7 @@ import com.scpyun.platform.jilinsscgsdp.utils.DataScopeUtil; ...@@ -10,9 +10,7 @@ import com.scpyun.platform.jilinsscgsdp.utils.DataScopeUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
@Api("重点人员回访记录办理") @Api("重点人员回访记录办理")
@Service("keyPersonVisitRecord") @Service("keyPersonVisitRecord")
...@@ -23,109 +21,290 @@ public class KeyPersonVisitRecordServiceImpl { ...@@ -23,109 +21,290 @@ public class KeyPersonVisitRecordServiceImpl {
private static final String SUCCESS = "success"; private static final String SUCCESS = "success";
private final String namespace = "com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecord."; private final String namespace = "com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecord.";
@ApiOperation(value = "回访记录列表", desc = "回访记录列表(含数据范围、排序)") @ApiOperation(value = "查询回访记录列表", desc = "查询有评分的人员列表(不必须有回访计划),并计算回访状态")
public Page<Map<String, Object>> findVisitRecordList(Page<Map<String, Object>> page) { public Page<Map<String, Object>> findVisitRecordList(Page<Map<String, Object>> page) {
// 处理参数
Map<String, Object> params = page.getParams();
if (params == null) {
params = new HashMap<>();
}
Map<String, Object> params = page.getParams() == null ? new HashMap<>() : page.getParams(); // 获取当前登录用户信息
// 兼容前端入参 { params:{...}, pageNo, pageSize },有些网关会再包一层 params Object _user = params.get("_user");
Object inner = params.get("params"); if (_user == null) {
if (inner instanceof Map) { throw new CustomException("未获取到登录用户信息");
@SuppressWarnings("unchecked")
Map<String, Object> innerParams = (Map<String, Object>) inner;
Map<String, Object> merged = new java.util.HashMap<>(params);
merged.remove("params");
merged.putAll(innerParams);
params = merged;
} }
// 回访状态必传 JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
Object doStatus = params.get("do_status"); String companyName = user.getString("company_name");
if (doStatus == null || String.valueOf(doStatus).trim().isEmpty()) { if (companyName == null || companyName.trim().isEmpty()) {
throw new CustomException("回访状态必传"); throw new CustomException("未获取到用户所属机构名称");
} }
Object _user = params.get("_user"); params.put("company_name", companyName);
if (_user != null) { Map<String, String> pos = DataScopeUtil.getPosition(user);
Map<String, String> pos = DataScopeUtil.getPosition(_user); params.put("scope_grade", pos.get("grade"));
params.put("scope_grade", pos.get("grade")); params.put("scope_area_id", pos.get("area_id"));
params.put("scope_area_id", pos.get("area_id")); // 重置用户信息(用于数据权限)
params = DataScopeUtil.resetUser(params);
Map<String, Object> officeTypeInfo = DataScopeUtil.getOfficeType(_user);
if (officeTypeInfo != null) {
params.putAll(officeTypeInfo);
} }
page.setParams(params); page.setParams(params);
// 根据重点人员类别分流:'6' -> 未成年人表,其它(含'2','3') -> 成人表
String ratingDictType = params.get("rating_dict_type") == null ? null : String.valueOf(params.get("rating_dict_type")); // 查询列表
String stmtId = "findVisitRecordListAdult"; Page<Map<String, Object>> result = commonService.findPage(namespace + "findVisitRecordList", page);
if ("6".equals(ratingDictType)) {
stmtId = "findVisitRecordListMinor"; return result;
}
@ApiOperation(value = "获取人员信息(用于回访)", desc = "根据人员ID和类别获取人员基本信息")
public Map<String, Object> getPersonInfoForVisit(Map<String, Object> map) {
String personId = String.valueOf(map.get("person_id"));
String ratingDictType = String.valueOf(map.get("rating_dict_type"));
String sysType = String.valueOf(map.get("sys_type"));
if (personId == null || "null".equals(personId)) {
throw new CustomException("人员ID不能为空");
}
map.put("id", personId);
map.put("rating_dict_type", ratingDictType);
// 如果传入了sys_type,则传递给SQL用于动态选择表
if (sysType != null && !"null".equals(sysType) && !sysType.trim().isEmpty()) {
map.put("sys_type", sysType);
}
Map<String, Object> result = commonService.getObject(namespace + "getPersonInfoForVisit", map);
if (result == null) {
throw new CustomException("未找到人员信息");
} }
return commonService.findPage(namespace + stmtId, page);
return result;
} }
@ApiOperation(value = "回访记录详情", desc = "人员基本、计划信息与历史记录") @ApiOperation(value = "保存回访记录", desc = "保存回访记录,并更新历史记录状态")
public Map<String, Object> getVisitRecordDetail(Map<String, Object> map) { public String saveVisitRecord(Map<String, Object> map) {
Map<String, Object> detail = commonService.getObject(namespace + "getVisitRecordDetail", map); // 参数校验
if (detail == null) { if (isBlank(map.get("key_person_id"))) {
throw new CustomException("未找到记录"); throw new CustomException("人员ID不能为空");
} }
// 历史列表改为基于详情中的 key_person_id 查询,避免依赖入参方式 if (isBlank(map.get("visit_time"))) {
Map<String, Object> historyParam = new HashMap<>(); throw new CustomException("回访时间不能为空");
historyParam.put("key_person_id", detail.get("key_person_id")); }
List<Map<String, Object>> history = commonService.findList(namespace + "selectVisitHistory", historyParam); if (isBlank(map.get("visit_record"))) {
detail.put("history", history); throw new CustomException("回访记录不能为空");
return detail; }
if (isBlank(map.get("key_person_visit_id"))) {
throw new CustomException("回访计划ID不能为空");
}
if (isBlank(map.get("rating_dict_type"))) {
throw new CustomException("人员类别不能为空");
}
if (isBlank(map.get("sys_type_office_label")) || isBlank(map.get("sys_type_office_value"))) {
throw new CustomException("请携带完整的部门信息");
}
if (isBlank(map.get("rating_type"))) {
throw new CustomException("风险等级不能为空");
}
String keyPersonId = String.valueOf(map.get("key_person_id"));
// 获取当前登录用户信息
Object _user = map.get("_user");
if (_user == null) {
throw new CustomException("未获取到登录用户信息");
}
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
Map<String, Object> officeTypeInfo = DataScopeUtil.getOfficeType(_user);
if (officeTypeInfo != null) {
map.putAll(officeTypeInfo);
}
// 设置回访人信息
map.put("visit_user_id", user.getString("id"));
map.put("visit_user_name", user.getString("name"));
map.put("visit_user_company_name", user.getString("company_name"));
map.put("visit_user_company_code", user.getString("company_code"));
// 生成ID
map.put("id", UUID.randomUUID().toString().replace("-", ""));
// 先将该人员的其他回访记录标记为历史
Map<String, Object> updateHistoryMap = new HashMap<>();
updateHistoryMap.put("key_person_id", keyPersonId);
updateHistoryMap.put("_user", _user);
commonService.update(namespace + "updateVisitHistory", updateHistoryMap);
// 插入新的回访记录
int insertCount = commonService.insert(namespace + "insertVisitRecord", map);
if (insertCount != 1) {
throw new CustomException("保存回访记录失败");
}
return SUCCESS;
} }
@ApiOperation(value = "历史回访记录分页", desc = "按人员分页查询历史回访记录") @ApiOperation(value = "查询回访历史(分页)", desc = "分页查询人员的回访历史记录")
public Page<Map<String, Object>> selectVisitHistoryPage(Page<Map<String, Object>> page) { public Page<Map<String, Object>> selectVisitHistoryPage(Page<Map<String, Object>> page) {
Map<String, Object> params = page.getParams() == null ? new HashMap<>() : page.getParams(); Map<String, Object> params = page.getParams();
Object inner = params.get("params"); if (params == null) {
if (inner instanceof Map) { params = new HashMap<>();
}
Object rawInnerParams = params.get("params");
if (rawInnerParams instanceof Map) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Map<String, Object> innerParams = (Map<String, Object>) inner; Map<String, Object> innerParams = new HashMap<>((Map<String, Object>) rawInnerParams);
Map<String, Object> merged = new java.util.HashMap<>(params); if (!innerParams.containsKey("_user") && params.get("_user") != null) {
merged.remove("params"); innerParams.put("_user", params.get("_user"));
merged.putAll(innerParams); }
params = merged; params = innerParams;
} }
String keyPersonId = String.valueOf(params.get("key_person_id"));
if (keyPersonId == null || "null".equals(keyPersonId) || keyPersonId.trim().isEmpty()) {
throw new CustomException("人员ID不能为空");
}
Object _user = params.get("_user");
if (_user == null) {
throw new CustomException("未获取到登录用户信息");
}
Map<String, Object> officeType = DataScopeUtil.getOfficeType(_user);
if (officeType != null) {
params.put("sys_type_office_label", officeType.get("office_label"));
params.put("sys_type_office_value", officeType.get("office_value"));
}
page.setParams(params); page.setParams(params);
return commonService.findPage(namespace + "selectVisitHistoryPage", page); return commonService.findPage(namespace + "selectVisitHistoryPage", page);
} }
@ApiOperation(value = "获取待办统计", desc = "返回正常待办与临期待办数量")
public Map<String, Object> getPendingStats(Map<String, Object> map) {
Map<String, Object> params = map == null ? new HashMap<>() : new HashMap<>(map);
Object _user = params.get("_user");
if (_user != null) {
Map<String, String> pos = DataScopeUtil.getPosition(_user);
params.put("scope_grade", pos.get("grade"));
params.put("scope_area_id", pos.get("area_id"));
}
// 固定统计待办
params.put("do_status", "0");
return commonService.getObject(namespace + "getPendingStats", params);
}
@ApiOperation(value = "办理回访(更新当前记录)", desc = "按主键更新当前记录并标记,重置同人其它记录的历史标记") @ApiOperation(value = "查询回访记录详情", desc = "根据回访记录ID查询详情")
public String insertVisitRecord(Map<String, Object> map) { public Map<String, Object> getVisitRecordDetail(Map<String, Object> map) {
// 必填校验 String id = String.valueOf(map.get("id"));
if (map.get("key_person_id") == null || map.get("key_person_visit_id") == null) { if (id == null || "null".equals(id) || id.trim().isEmpty()) {
throw new CustomException("缺少关键参数"); throw new CustomException("回访记录ID不能为空");
} }
if (map.get("id") == null || String.valueOf(map.get("id")).trim().isEmpty()) {
throw new CustomException("缺少当前回访记录主键id"); Map<String, Object> result = commonService.getObject(namespace + "getVisitRecordDetail", map);
if (result == null) {
throw new CustomException("未找到回访记录");
} }
// 直接按主键更新当前记录为已回访,并写入办理信息
int r = commonService.update(namespace + "updateVisitRecordById", map); return result;
if (r != 1) { }
throw new CustomException("保存失败");
/**
* 计算回访状态和按钮可用性
* 状态:0-无待访,1-正常待访,2-临期待访,3-超期待访
*/
private void calculateVisitStatus(Map<String, Object> row) {
try {
// 获取回访计划信息
Object visitStartDayObj = row.get("visit_start_day");
Object visitEndDayObj = row.get("visit_end_day");
Object overdueWarningDayObj = row.get("overdue_warning_day");
if (visitStartDayObj == null || visitEndDayObj == null) {
row.put("visit_status", "0");
row.put("can_visit", false);
return;
}
int visitStartDay = Integer.parseInt(String.valueOf(visitStartDayObj));
int visitEndDay = Integer.parseInt(String.valueOf(visitEndDayObj));
int overdueWarningDay = overdueWarningDayObj != null ?
Integer.parseInt(String.valueOf(overdueWarningDayObj)) : 0;
// 获取最后一次回访时间
Object lastVisitTimeObj = row.get("last_visit_time");
Date now = new Date();
Date lastVisitTime = null;
if (lastVisitTimeObj != null && !"null".equals(String.valueOf(lastVisitTimeObj))) {
try {
if (lastVisitTimeObj instanceof Date) {
lastVisitTime = (Date) lastVisitTimeObj;
} else if (lastVisitTimeObj instanceof String) {
// 尝试解析字符串日期
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
lastVisitTime = sdf.parse((String) lastVisitTimeObj);
}
} catch (Exception e) {
// 解析失败,使用当前时间
}
}
// 如果没有回访记录,默认状态为正常待访
if (lastVisitTime == null) {
row.put("visit_status", "1");
row.put("can_visit", true);
return;
}
// 计算回访时间范围
// 起始时间 = 上次回访时间 + visit_start_day
// 结束时间 = 上次回访时间 + visit_end_day
// 预警时间 = 结束时间 - overdue_warning_day
Date startDate = addDays(lastVisitTime, visitStartDay);
Date endDate = addDays(lastVisitTime, visitEndDay);
Date warningDate = addDays(endDate, -overdueWarningDay);
// 判断当前状态
int visitStatus = 0; // 默认无待访
boolean canVisit = false;
// 使用日期比较(忽略时分秒)
java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
String nowDateStr = dateFormat.format(now);
String startDateStr = dateFormat.format(startDate);
String warningDateStr = dateFormat.format(warningDate);
String endDateStr = dateFormat.format(endDate);
if (nowDateStr.compareTo(startDateStr) < 0) {
// 当前日期在起始日期之前,无待访
visitStatus = 0;
canVisit = false;
} else if (nowDateStr.compareTo(warningDateStr) <= 0) {
// 当前日期在起始日期和预警日期之间(包含),正常待访
visitStatus = 1;
canVisit = true;
} else if (nowDateStr.compareTo(endDateStr) <= 0) {
// 当前日期在预警日期和结束日期之间(包含),临期待访
visitStatus = 2;
canVisit = true;
} else {
// 当前日期超过结束日期,超期待访
visitStatus = 3;
canVisit = true;
}
row.put("visit_status", String.valueOf(visitStatus));
row.put("can_visit", canVisit);
} catch (Exception e) {
// 计算失败,默认状态
row.put("visit_status", "0");
row.put("can_visit", false);
} }
// 同人其他记录的 is_history 置为 0
commonService.update(namespace + "resetOtherHistoryByKeyPerson", map);
return SUCCESS;
} }
@ApiOperation(value = "获取回访按钮权限", desc = "返回页面按钮权限映射") /**
public Map getVisitButtonPower(Map<String, Object> map) { * 日期加天数
Object _user = map == null ? null : map.get("_user"); */
if (_user == null) { private Date addDays(Date date, int days) {
return new java.util.HashMap<>(); Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, days);
return cal.getTime();
}
private boolean isBlank(Object value) {
if (value == null) {
return true;
} }
return DataScopeUtil.getButtonPower(_user); String text = String.valueOf(value);
return text == null || "null".equalsIgnoreCase(text) || text.trim().isEmpty();
} }
} }
...@@ -62,6 +62,16 @@ public class KeyPersonVisitServiceImpl { ...@@ -62,6 +62,16 @@ public class KeyPersonVisitServiceImpl {
} catch (Exception ex) { } catch (Exception ex) {
throw new CustomException("临期预警天需为正整数"); throw new CustomException("临期预警天需为正整数");
} }
// 必填:部门类型
Object officeTypeObj = map.get("sys_type_office_value");
if (officeTypeObj == null || String.valueOf(officeTypeObj).trim().length() == 0) {
throw new CustomException("请选择部门类型");
}
// 如果保存时状态为启用,需要先停用同一部门、同一类别、同一风险等级的其他启用记录
Object statusObj = map.get("status");
if ("1".equals(String.valueOf(statusObj))) {
commonService.update(namespace + "disableOtherActives", map);
}
// 区分新增与修改:有id则更新,无id则新增 // 区分新增与修改:有id则更新,无id则新增
Object idObj = map.get("id"); Object idObj = map.get("id");
if (idObj == null || String.valueOf(idObj).trim().length() == 0) { if (idObj == null || String.valueOf(idObj).trim().length() == 0) {
......
...@@ -60,10 +60,15 @@ public class MurderManagementServiceImpl { ...@@ -60,10 +60,15 @@ public class MurderManagementServiceImpl {
private static final Logger log = LoggerFactory.getLogger(MurderManagementServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(MurderManagementServiceImpl.class);
@ApiOperation(value = "查询登录人信息", desc = "") @ApiOperation(value = "查询登录人信息", desc = "")
public Map<String,Object> getLoginUserAreaInfo(Page<Map<String,Object>> map) { public Map<String,Object> getLoginUserAreaInfo(Page<Map<String,Object>> map) {
// Map<String, Object> user = (Map<String, Object>) map.getParams().get("_user"); Map<String, Object> user = (Map<String, Object>) map.getParams().get("_user");
// return commonService.getObject(nameSpace + "getLoginUserAreaInfo", user.get("company_id")); String company_id = user.get("company_id").toString();
String areaId = map.getParams().get("area_id").toString(); if (company_id.length() == 12) {
return commonService.getObject(nameSpace + "getLoginUserAreaInfo",areaId); return commonService.getObject(nameSpace + "getLoginUserAreaInfo", company_id);
} else {
Map<String, String> areaMap = DataScopeUtil.getPosition(user);
String areaId = areaMap.get("area_id").toString();
return commonService.getObject(nameSpace + "getLoginUserAreaInfo",areaId);
}
} }
......
...@@ -58,10 +58,15 @@ public class keyPersonMinorServiceImpl { ...@@ -58,10 +58,15 @@ public class keyPersonMinorServiceImpl {
private static final Logger log = LoggerFactory.getLogger(keyPersonMinorServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(keyPersonMinorServiceImpl.class);
@ApiOperation(value = "查询登录人信息", desc = "") @ApiOperation(value = "查询登录人信息", desc = "")
public Map<String,Object> getLoginUserAreaInfo(Page<Map<String,Object>> map) { public Map<String,Object> getLoginUserAreaInfo(Page<Map<String,Object>> map) {
// Map<String, Object> user = (Map<String, Object>) map.getParams().get("_user"); Map<String, Object> user = (Map<String, Object>) map.getParams().get("_user");
// return commonService.getObject(nameSpace + "getLoginUserAreaInfo", user.get("company_id")); String company_id = user.get("company_id").toString();
String areaId = map.getParams().get("area_id").toString(); if (company_id.length() == 12) {
return commonService.getObject(nameSpace + "getLoginUserAreaInfo",areaId); return commonService.getObject(nameSpace + "getLoginUserAreaInfo", company_id);
} else {
Map<String, String> areaMap = DataScopeUtil.getPosition(user);
String areaId = areaMap.get("area_id").toString();
return commonService.getObject(nameSpace + "getLoginUserAreaInfo",areaId);
}
} }
......
...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; ...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.stream.Collectors;
@Component @Component
public class DataScopeUtil { public class DataScopeUtil {
...@@ -18,6 +18,38 @@ public class DataScopeUtil { ...@@ -18,6 +18,38 @@ public class DataScopeUtil {
private static CommonService commonService; private static CommonService commonService;
private static String namespace = "com.scpyun.platform.standard.jilinsscgsdp.KeyPersonPower."; private static String namespace = "com.scpyun.platform.standard.jilinsscgsdp.KeyPersonPower.";
/**
* 获取当前登录人机构类型
* @param _user
* @return
*/
public static Map<String, Object> getOfficeType(Object _user) {
Map<String, Object> params = new HashMap<>();
Map<String, Object> result = new HashMap<>();
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
String company_id = user.getString("company_id");
String companyName = user.getString("company_name");
if (company_id.length() == 12) {
result.put("office_value", "-9999");
result.put("office_label", "综治中心");
} else {
params.put("type", "sys_type_office");
List<Map<String, Object>> officeTypeList = commonService.findList(namespace + "selectDicByType", params);
officeTypeList = officeTypeList.stream().filter(c->companyName.contains(c.get("label").toString())).collect(Collectors.toList());
if (officeTypeList.size() ==0) {
result.put("office_value", "-9998");
result.put("office_label", "未获取到类型");
} else {
result.put("office_value", officeTypeList.get(0).get("value"));
result.put("office_label", officeTypeList.get(0).get("label"));
}
}
return result;
}
/** /**
* 获取按钮权限 * 获取按钮权限
* @param _user * @param _user
...@@ -67,8 +99,8 @@ public class DataScopeUtil { ...@@ -67,8 +99,8 @@ public class DataScopeUtil {
* area_id: 区域id * area_id: 区域id
*/ */
public static Map<String, String> getPosition(Object _user) { public static Map<String, String> getPosition(Object _user) {
Map queryMap = new HashMap(); Map<String, Object> queryMap = new HashMap<>();
Map resultMap = new HashMap(); Map<String, String> resultMap = new HashMap<>();
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user)); JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
String company_id = user.getString("company_id"); String company_id = user.getString("company_id");
...@@ -80,7 +112,7 @@ public class DataScopeUtil { ...@@ -80,7 +112,7 @@ public class DataScopeUtil {
Map<String, Object> result = commonService.getObject(namespace + "selectOfficeById", queryMap); Map<String, Object> result = commonService.getObject(namespace + "selectOfficeById", queryMap);
resultMap.put("grade", company_grade); resultMap.put("grade", company_grade);
resultMap.put("area_id", result.get("area_id")); resultMap.put("area_id", result.get("area_id") != null ? result.get("area_id").toString() : "");
return resultMap; return resultMap;
} }
...@@ -91,7 +123,7 @@ public class DataScopeUtil { ...@@ -91,7 +123,7 @@ public class DataScopeUtil {
* @return true:是 false:否 * @return true:是 false:否
*/ */
public static Boolean isChanChun(Object _user) { public static Boolean isChanChun(Object _user) {
Map queryMap = new HashMap(); Map<String, Object> queryMap = new HashMap<>();
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user)); JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
String company_id = user.getString("company_id"); String company_id = user.getString("company_id");
if (company_id.length() == 12 && company_id.startsWith("2201")) { if (company_id.length() == 12 && company_id.startsWith("2201")) {
...@@ -112,7 +144,7 @@ public class DataScopeUtil { ...@@ -112,7 +144,7 @@ public class DataScopeUtil {
public static Map<String, Object> resetUser(Map<String, Object> map) { public static Map<String, Object> resetUser(Map<String, Object> map) {
Object _user = map.get("_user"); Object _user = map.get("_user");
Map queryMap = new HashMap(); Map<String, Object> queryMap = new HashMap<>();
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user)); JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(_user));
String company_id = user.getString("company_id"); String company_id = user.getString("company_id");
if (company_id.length() == 12) { if (company_id.length() == 12) {
...@@ -123,7 +155,6 @@ public class DataScopeUtil { ...@@ -123,7 +155,6 @@ public class DataScopeUtil {
queryMap.put("id", company_id); queryMap.put("id", company_id);
Map<String, Object> result = commonService.getObject(namespace + "selectOfficeById", queryMap); Map<String, Object> result = commonService.getObject(namespace + "selectOfficeById", queryMap);
String id = result.get("id").toString();
String area_id = result.get("area_id").toString(); String area_id = result.get("area_id").toString();
user.put("area_id", area_id); user.put("area_id", area_id);
map.put("_user", user); map.put("_user", user);
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
select select
value, value,
label label
from sys_dict where type = #{type} from sys_dict where type = #{type} and del_flag = '0'
</select> </select>
<select id="selectOfficeById" parameterType="map" resultType="map"> <select id="selectOfficeById" parameterType="map" resultType="map">
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
INSERT INTO jl_key_person_visit( INSERT INTO jl_key_person_visit(
id, id,
rating_dict_type, rating_dict_type,
sys_type_office_value,
sys_type_office_label,
plan_name, plan_name,
plan_type, plan_type,
rating_type, rating_type,
...@@ -17,6 +19,8 @@ ...@@ -17,6 +19,8 @@
) VALUES ( ) VALUES (
UUID(), UUID(),
#{rating_dict_type}, #{rating_dict_type},
#{sys_type_office_value},
#{sys_type_office_label},
#{plan_name}, #{plan_name},
#{plan_type}, #{plan_type},
#{rating_type}, #{rating_type},
...@@ -33,6 +37,8 @@ ...@@ -33,6 +37,8 @@
UPDATE jl_key_person_visit UPDATE jl_key_person_visit
SET SET
rating_dict_type = #{rating_dict_type}, rating_dict_type = #{rating_dict_type},
sys_type_office_value = #{sys_type_office_value},
sys_type_office_label = #{sys_type_office_label},
plan_name = #{plan_name}, plan_name = #{plan_name},
plan_type = #{plan_type}, plan_type = #{plan_type},
rating_type = #{rating_type}, rating_type = #{rating_type},
...@@ -164,6 +170,8 @@ ...@@ -164,6 +170,8 @@
SELECT SELECT
id, id,
rating_dict_type, rating_dict_type,
sys_type_office_value,
sys_type_office_label,
plan_name, plan_name,
plan_type, plan_type,
rating_type, rating_type,
...@@ -183,6 +191,9 @@ ...@@ -183,6 +191,9 @@
<if test="params.rating_type != null and params.rating_type != ''"> <if test="params.rating_type != null and params.rating_type != ''">
AND rating_type = #{params.rating_type} AND rating_type = #{params.rating_type}
</if> </if>
<if test="params.sys_type_office_value != null and params.sys_type_office_value != ''">
AND sys_type_office_value = #{params.sys_type_office_value}
</if>
<if test="params.status != null and params.status != ''"> <if test="params.status != null and params.status != ''">
AND status = #{params.status} AND status = #{params.status}
</if> </if>
...@@ -204,9 +215,24 @@ ...@@ -204,9 +215,24 @@
SET status = '2', update_by = #{_user.id}, update_time = NOW() SET status = '2', update_by = #{_user.id}, update_time = NOW()
WHERE rating_dict_type = #{rating_dict_type} WHERE rating_dict_type = #{rating_dict_type}
AND rating_type = #{rating_type} AND rating_type = #{rating_type}
AND id &lt;> #{id} AND IFNULL(sys_type_office_value, '') = IFNULL(#{sys_type_office_value}, '')
AND status = '1' AND status = '1'
<if test="id != null and id != ''">
AND id &lt;> #{id}
</if>
</update> </update>
<!-- 检查唯一性:同一部门、同一类别、同一风险等级是否已存在 -->
<select id="checkUniqueVisitPlan" parameterType="map" resultType="int">
SELECT COUNT(1)
FROM jl_key_person_visit
WHERE rating_dict_type = #{rating_dict_type}
AND rating_type = #{rating_type}
AND IFNULL(sys_type_office_value, '') = IFNULL(#{sys_type_office_value}, '')
<if test="id != null and id != ''">
AND id &lt;> #{id}
</if>
</select>
......
...@@ -2,580 +2,424 @@ ...@@ -2,580 +2,424 @@
<!DOCTYPE mapper PUBLIC "-//oos.juyouhx.com//DTD Mapper 3.0//EN" "http://oss.juyouhx.com/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//oos.juyouhx.com//DTD Mapper 3.0//EN" "http://oss.juyouhx.com/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecord" name="重点人员回访记录"> <mapper namespace="com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecord" name="重点人员回访记录">
<!-- 列表(合并成人与未成年人两表) --> <!-- 查询回访记录列表 -->
<select id="findVisitRecordList" parameterType="page" resultType="map"> <select id="findVisitRecordList" parameterType="page" resultType="map">
SELECT * FROM (
SELECT
jkp.id AS key_person_id,
jkp.name,
jkp.sys_type,
jkp.card_no AS enc_card_no,
CAST(AES_DECRYPT(FROM_BASE64(jkp.card_no),'*#id#') AS CHAR) AS card_no,
jkp.phone,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name,
jlpvr.id AS id,
jlpvr.id AS visit_record_id,
jlpvr.key_person_visit_id,
jlpvr.plan_name,
jlpvr.plan_type,
jlpvr.rating_type,
jlpvr.plan_start_data,
jlpvr.plan_end_data,
jlpvr.overdue_date,
jlpvr.do_status,
CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) &lt; 0 THEN 0
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE())
END AS remain_days,
jlpvr.is_overdue AS is_overdue,
CASE
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() &lt;= jlpvr.plan_end_data THEN '1'
ELSE '0'
END AS is_near_due
FROM jl_key_person jkp
LEFT JOIN jl_key_person_visit_record jlpvr ON jkp.id = jlpvr.key_person_id AND jlpvr.is_history = '2'
LEFT JOIN sys_office so1 ON jkp.city_id = so1.id
LEFT JOIN sys_office so2 ON jkp.area_id = so2.id
LEFT JOIN sys_office so3 ON jkp.street_id = so3.id
LEFT JOIN sys_office so4 ON jkp.community_id = so4.id
UNION ALL
SELECT
jkm.id AS key_person_id,
jkm.name,
jkm.sys_type,
jkm.card_no AS enc_card_no,
CAST(AES_DECRYPT(FROM_BASE64(jkm.card_no),'*#id#') AS CHAR) AS card_no,
jkm.phone,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name,
jlpvr.id AS id,
jlpvr.id AS visit_record_id,
jlpvr.key_person_visit_id,
jlpvr.plan_name,
jlpvr.plan_type,
jlpvr.rating_type,
jlpvr.plan_start_data,
jlpvr.plan_end_data,
jlpvr.overdue_date,
jlpvr.do_status,
CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) &lt; 0 THEN 0
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE())
END AS remain_days,
jlpvr.is_overdue AS is_overdue,
CASE
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() &lt;= jlpvr.plan_end_data THEN '1'
ELSE '0'
END AS is_near_due
FROM jl_key_person_minor jkm
LEFT JOIN jl_key_person_visit_record jlpvr ON jkm.id = jlpvr.key_person_id AND jlpvr.is_history = '2'
LEFT JOIN sys_office so1 ON jkm.city_id = so1.id
LEFT JOIN sys_office so2 ON jkm.area_id = so2.id
LEFT JOIN sys_office so3 ON jkm.street_id = so3.id
LEFT JOIN sys_office so4 ON jkm.community_id = so4.id
) t
<where>
<!-- 仅返回“有计划”的人员:当前记录存在且标记为当前(is_history='2') -->
AND t.visit_record_id IS NOT NULL
<if test="params.name != null and params.name != ''">
AND t.name LIKE CONCAT('%', #{params.name}, '%')
</if>
<if test="params.card_no != null and params.card_no != ''">
AND t.enc_card_no = TO_BASE64(AES_ENCRYPT(#{params.card_no},'*#id#'))
</if>
<if test="params.city_id != null and params.city_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.city_name AND so.id = #{params.city_id}
)
</if>
<if test="params.area_id != null and params.area_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.area_name AND so.id = #{params.area_id}
)
</if>
<if test="params.street_id != null and params.street_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.street_name AND so.id = #{params.street_id}
)
</if>
<if test="params.community_id != null and params.community_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.community_name AND so.id = #{params.community_id}
)
</if>
<if test="params.rating_type != null and params.rating_type != ''">
AND t.rating_type = #{params.rating_type}
</if>
<if test="params.do_status != null and params.do_status != ''">
AND t.do_status = #{params.do_status}
</if>
<if test="params.is_overdue != null and params.is_overdue != ''">
AND t.is_overdue = #{params.is_overdue}
</if>
<!-- 数据范围 -->
<choose>
<when test='params.scope_grade == "3"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.city_name AND so.id = #{params.scope_area_id}
)
</when>
<when test='params.scope_grade == "4"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.area_name AND so.id = #{params.scope_area_id}
)
</when>
<when test='params.scope_grade == "5"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.street_name AND so.id = #{params.scope_area_id}
)
</when>
<when test='params.scope_grade == "6"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.community_name AND so.id = #{params.scope_area_id}
)
</when>
<!-- 0/2 不做范围限制(总机构、省) -->
</choose>
<if test="params.rating_dict_type != null and params.rating_dict_type != ''">
AND t.sys_type = #{params.rating_dict_type}
</if>
</where>
ORDER BY
CASE t.do_status WHEN '0' THEN 0 WHEN '1' THEN 1 WHEN '2' THEN 2 ELSE 9 END ASC,
t.remain_days ASC
</select>
<!-- 成人类(刑满释放人员、严重精神障碍人员)直接内连接当前回访记录,提高性能 -->
<select id="findVisitRecordListAdult" parameterType="page" resultType="map">
SELECT SELECT
jkp.id AS key_person_id, t1.*,
jkp.name,
jkp.sys_type,
CAST(AES_DECRYPT(FROM_BASE64(jkp.card_no),'*#id#') AS CHAR) AS card_no,
jkp.phone,
so1.name AS city_name, so1.name AS city_name,
so2.name AS area_name, so2.name AS area_name,
so3.name AS street_name, so3.name AS street_name,
so4.name AS community_name, so4.name AS community_name,
jlpvr.id AS id, t1.rating_type as rating_level,
jlpvr.id AS visit_record_id, v.sys_type_office_label,
jlpvr.key_person_visit_id, v.sys_type_office_value,
jlpvr.plan_name, v.id AS key_person_visit_id,
jlpvr.plan_type, t1.sys_type AS rating_dict_type,
jlpvr.rating_type, v.plan_name AS plan_name,
jlpvr.plan_start_data, v.plan_type AS plan_type,
jlpvr.plan_end_data, v.rating_type AS plan_rating_type,
jlpvr.overdue_date,
jlpvr.do_status,
CASE CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) &lt; 0 THEN 0 WHEN r.id is NULL THEN
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE()) '1'
END AS remain_days, WHEN
jlpvr.is_overdue AS is_overdue, v.id is NOT NULL AND r.id is not NULL
CASE AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt; DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d') THEN
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() &lt;= jlpvr.plan_end_data THEN '1' '0'
ELSE '0' WHEN
END AS is_near_due v.id is NOT NULL AND r.id is not NULL
FROM jl_key_person jkp AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
INNER JOIN jl_key_person_visit_record jlpvr AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt; DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d') THEN
ON jkp.id = jlpvr.key_person_id '1'
AND jlpvr.do_status = #{params.do_status} WHEN
LEFT JOIN sys_office so1 ON jkp.city_id = so1.id v.id is NOT NULL AND r.id is not NULL
LEFT JOIN sys_office so2 ON jkp.area_id = so2.id AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
LEFT JOIN sys_office so3 ON jkp.street_id = so3.id AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt;= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d') THEN
LEFT JOIN sys_office so4 ON jkp.community_id = so4.id '2'
WHEN
v.id is NOT NULL AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d') THEN
'3'
ELSE
'1'
END AS 'visit_status'
FROM
(
SELECT
kp.id AS person_id,
kp.name,
CAST(AES_DECRYPT(FROM_BASE64(kp.card_no),'*#id#') AS CHAR) AS card_no,
kp.phone,
kp.sys_type,
kp.city_id,
kp.area_id,
kp.street_id,
kp.community_id,
s.rating_type
FROM
(<include refid="getPsersonList"></include>) kp,
jl_key_person_rating_summary s
WHERE
s.key_person_id = kp.id
AND s.is_history = '1'
) t1
LEFT JOIN jl_key_person_visit v ON v.rating_type = t1.rating_type AND v.status = '1' AND v.sys_type_office_label = #{params.office_label} AND v.rating_dict_type = t1.sys_type
LEFT JOIN jl_key_person_visit_record r ON t1.person_id = r.key_person_id AND r.is_new = '1' AND r.sys_type_office_label = #{params.office_label}
LEFT JOIN sys_office so1 ON t1.city_id = so1.id
LEFT JOIN sys_office so2 ON t1.area_id = so2.id
LEFT JOIN sys_office so3 ON t1.street_id = so3.id
LEFT JOIN sys_office so4 ON t1.community_id = so4.id
<where> <where>
<if test="params.name != null and params.name != ''"> <if test="params.rating_level != null and params.rating_level != ''">
AND jkp.name LIKE CONCAT('%', #{params.name}, '%') AND v.rating_type = #{params.rating_level}
</if> </if>
<if test="params.card_no != null and params.card_no != ''"> <if test="params.visit_status != null and params.visit_status != ''">
AND jkp.card_no = TO_BASE64(AES_ENCRYPT(#{params.card_no},'*#id#')) <choose>
</if> <when test='params.visit_status == "0"'>
<if test="params.city_id != null and params.city_id != ''"> AND v.id is NOT NULL
AND jkp.city_id = #{params.city_id} AND r.id is not NULL
</if> AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt; DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
<if test="params.area_id != null and params.area_id != ''"> </when>
AND jkp.area_id = #{params.area_id} <when test='params.visit_status == "1"'>
</if> AND (
<if test="params.street_id != null and params.street_id != ''"> r.id is NULL
AND jkp.street_id = #{params.street_id} or
</if> (
<if test="params.community_id != null and params.community_id != ''"> v.id is NOT NULL
AND jkp.community_id = #{params.community_id} AND r.id is not NULL
</if> AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
<if test="params.rating_type != null and params.rating_type != ''"> AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt; DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
AND jlpvr.rating_type = #{params.rating_type} )
</if> )
<if test="params.rating_dict_type != null and params.rating_dict_type != ''"> </when>
AND jlpvr.rating_dict_type = #{params.rating_dict_type} <when test='params.visit_status == "2"'>
</if> AND v.id is NOT NULL
<if test="params.is_overdue != null and params.is_overdue != ''"> AND r.id is not NULL
AND jlpvr.is_overdue = #{params.is_overdue} AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt;= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d')
</when>
<when test='params.visit_status == "3"'>
AND v.id is NOT NULL
AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d')
</when>
</choose>
</if> </if>
<!-- 数据范围 -->
<choose>
<when test='params.scope_grade == "3"'>
AND jkp.city_id = #{params.scope_area_id}
</when>
<when test='params.scope_grade == "4"'>
AND jkp.area_id = #{params.scope_area_id}
</when>
<when test='params.scope_grade == "5"'>
AND jkp.street_id = #{params.scope_area_id}
</when>
<when test='params.scope_grade == "6"'>
AND jkp.community_id = #{params.scope_area_id}
</when>
</choose>
</where> </where>
ORDER BY
DATEDIFF(jlpvr.plan_end_data, CURDATE()) ASC
</select> </select>
<!-- 重点未成年人,单表(未成年人)直接内连接当前回访记录,提高性能 --> <sql id="getPsersonList">
<select id="findVisitRecordListMinor" parameterType="page" resultType="map"> SELECT t1.* FROM
SELECT
jkm.id AS key_person_id,
jkm.name,
jkm.sys_type,
CAST(AES_DECRYPT(FROM_BASE64(jkm.card_no),'*#id#') AS CHAR) AS card_no,
jkm.phone,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name,
jlpvr.id AS id,
jlpvr.id AS visit_record_id,
jlpvr.key_person_visit_id,
jlpvr.plan_name,
jlpvr.plan_type,
jlpvr.rating_type,
jlpvr.plan_start_data,
jlpvr.plan_end_data,
jlpvr.overdue_date,
jlpvr.do_status,
CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) &lt; 0 THEN 0
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE())
END AS remain_days,
jlpvr.is_overdue AS is_overdue,
CASE
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() &lt;= jlpvr.plan_end_data THEN '1'
ELSE '0'
END AS is_near_due
FROM jl_key_person_minor jkm
INNER JOIN jl_key_person_visit_record jlpvr
ON jkm.id = jlpvr.key_person_id
AND jlpvr.do_status = #{params.do_status}
LEFT JOIN sys_office so1 ON jkm.city_id = so1.id
LEFT JOIN sys_office so2 ON jkm.area_id = so2.id
LEFT JOIN sys_office so3 ON jkm.street_id = so3.id
LEFT JOIN sys_office so4 ON jkm.community_id = so4.id
<where>
<if test="params.name != null and params.name != ''">
AND jkm.name LIKE CONCAT('%', #{params.name}, '%')
</if>
<if test="params.card_no != null and params.card_no != ''">
AND jkm.card_no = TO_BASE64(AES_ENCRYPT(#{params.card_no},'*#id#'))
</if>
<if test="params.city_id != null and params.city_id != ''">
AND jkm.city_id = #{params.city_id}
</if>
<if test="params.area_id != null and params.area_id != ''">
AND jkm.area_id = #{params.area_id}
</if>
<if test="params.street_id != null and params.street_id != ''">
AND jkm.street_id = #{params.street_id}
</if>
<if test="params.community_id != null and params.community_id != ''">
AND jkm.community_id = #{params.community_id}
</if>
<if test="params.rating_type != null and params.rating_type != ''">
AND jlpvr.rating_type = #{params.rating_type}
</if>
<if test="params.rating_dict_type != null and params.rating_dict_type != ''">
AND jlpvr.rating_dict_type = #{params.rating_dict_type}
</if>
<if test="params.is_overdue != null and params.is_overdue != ''">
AND jlpvr.is_overdue = #{params.is_overdue}
</if>
<!-- 数据范围 -->
<choose> <choose>
<when test='params.scope_grade == "3"'> <when test="params.sys_type != null and (params.sys_type == '2'.toString() or params.sys_type == '3'.toString())">
AND jkm.city_id = #{params.scope_area_id} jl_key_person t1
</when>
<when test='params.scope_grade == "4"'>
AND jkm.area_id = #{params.scope_area_id}
</when>
<when test='params.scope_grade == "5"'>
AND jkm.street_id = #{params.scope_area_id}
</when> </when>
<when test='params.scope_grade == "6"'> <when test="params.sys_type != null and params.sys_type == '6'.toString()">
AND jkm.community_id = #{params.scope_area_id} jl_key_person_minor t1
</when> </when>
</choose> </choose>
</where> <where>
ORDER BY <include refid="getPersonWhere"></include>
DATEDIFF(jlpvr.plan_end_data, CURDATE()) ASC </where>
</select>
<select id="getVisitRecordDetail" parameterType="map" resultType="map"> union ALL
SELECT
p.id AS key_person_id, SELECT t1.* FROM
p.name,
p.sys_type,
CAST(AES_DECRYPT(FROM_BASE64(p.card_no),'*#id#') AS CHAR) AS card_no,
p.sex,
p.folk,
p.phone,
p.address,
so1.name AS city,
so2.name AS area,
so3.name AS street,
so4.name AS community,
v.plan_name,
v.plan_type,
vr.*,
vr.id AS current_visit_record_id
FROM
<choose> <choose>
<when test='rating_dict_type == "6"'> <when test="params.sys_type != null and (params.sys_type == '2'.toString() or params.sys_type == '3'.toString())">
jl_key_person_minor p jl_key_person t1,
</when>
<when test="params.sys_type != null and params.sys_type == '6'.toString()">
jl_key_person_minor t1,
</when> </when>
<otherwise>
jl_key_person p
</otherwise>
</choose> </choose>
INNER JOIN jl_key_person_visit_record vr ON vr.key_person_id = p.id jl_key_person_rating_dual_person t2
LEFT JOIN jl_key_person_visit v ON vr.key_person_visit_id = v.id where t1.id = t2.key_person_id
LEFT JOIN sys_office so1 ON p.city_id = so1.id <include refid="getPersonWhere"></include>
LEFT JOIN sys_office so2 ON p.area_id = so2.id
LEFT JOIN sys_office so3 ON p.street_id = so3.id
LEFT JOIN sys_office so4 ON p.community_id = so4.id
WHERE vr.id = #{id}
</select>
<select id="selectVisitHistory" parameterType="map" resultType="map"> </sql>
SELECT id,
visit_time,
visit_record,
img,
do_status,
rating_type,
visit_user,
visit_user_company,
create_time
FROM jl_key_person_visit_record
WHERE key_person_id = #{key_person_id}
ORDER BY create_time DESC
</select>
<!-- 历史回访记录分页 --> <sql id="getPersonWhere">
<select id="selectVisitHistoryPage" parameterType="page" resultType="map">
SELECT id,
visit_time,
visit_record,
img,
do_status,
rating_type,
visit_user,
visit_user_company,
create_time
FROM jl_key_person_visit_record
<where>
AND key_person_id = #{params.key_person_id}
<if test="params.exclude_id != null and params.exclude_id != ''">
AND id &lt;&gt; #{params.exclude_id}
</if>
</where>
<choose> <choose>
<when test='params.order_by != null and params.order_by == "visit_time desc"'> <when test="params.scope_grade == '3'.toString()">
ORDER BY visit_time DESC AND t1.city_id = #{params.scope_area_id}
</when>
<when test="params.scope_grade == '4'.toString()">
AND t1.area_id = #{params.scope_area_id}
</when>
<when test="params.scope_grade == '5'.toString()">
AND t1.street_id = #{params.scope_area_id}
</when>
<when test="params.scope_grade == '6'.toString() ">
AND t1.community_id = #{params.scope_area_id}
</when> </when>
<otherwise>
ORDER BY create_time DESC
</otherwise>
</choose> </choose>
</select> <if test="params.name != null and params.name != ''">
AND t1.name LIKE CONCAT('%', #{params.name}, '%')
</if>
<if test="params.card_no != null and params.card_no != ''">
AND CAST(AES_DECRYPT(FROM_BASE64(t1.card_no),'*#id#') AS CHAR) LIKE CONCAT('%', #{params.card_no}, '%')
</if>
<if test="params.city_id != null and params.city_id != ''">
AND t1.city_id = #{params.city_id}
</if>
<if test="params.area_id != null and params.area_id != ''">
AND t1.area_id = #{params.area_id}
</if>
<if test="params.street_id != null and params.street_id != ''">
AND t1.street_id = #{params.street_id}
</if>
<if test="params.community_id != null and params.community_id != ''">
AND t1.community_id = #{params.community_id}
</if>
</sql>
<update id="updateCurrentToHistory" parameterType="map"> <!-- 获取人员信息(用于回访) -->
UPDATE jl_key_person_visit_record <select id="getPersonInfoForVisit" parameterType="map" resultType="map">
SET is_history = '1', update_time = NOW(), update_by = #{_user.id} SELECT
WHERE id = #{id} kp.id,
</update> kp.name,
kp.card_no,
kp.phone,
kp.sex,
kp.folk,
s.rating_type AS rating_level,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name
FROM (
<choose>
<!-- 当sys_type为'2'或'3'时,使用jl_key_person表 -->
<when test="sys_type != null and (sys_type == '2'.toString() or sys_type == '3'.toString())">
SELECT
id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person
WHERE id = #{id} AND sys_type = #{sys_type}
</when>
<!-- 当sys_type为'6'时,使用jl_key_person_minor表 -->
<when test="sys_type != null and sys_type == '6'.toString()">
SELECT
id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person_minor
WHERE id = #{id} AND sys_type = #{sys_type}
</when>
<!-- 默认情况:兼容旧逻辑,查询两个表 -->
<otherwise>
SELECT
id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person
WHERE id = #{id} AND sys_type IN ('2', '3')
<!-- 根据主键更新当前回访记录为已回访,写入办理信息 --> UNION ALL
<update id="updateVisitRecordById" parameterType="map">
UPDATE jl_key_person_visit_record
SET
do_status = '1',
is_history = '1',
visit_user = #{_user.name},
visit_user_company = #{_user.company_name},
visit_user_id = #{_user.id},
visit_user_company_code = #{_user.company_code},
visit_time = #{visit_time},
visit_record = #{visit_record},
img = #{img},
update_time = NOW(),
update_by = #{_user.id}
WHERE id = #{id}
</update>
<!-- 将同一人员的其他记录标记为非历史(0) --> SELECT
<update id="resetOtherHistoryByKeyPerson" parameterType="map"> id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person_minor
WHERE id = #{id} AND sys_type = '6'
</otherwise>
</choose>
) kp
LEFT JOIN jl_key_person_rating_summary s
ON s.key_person_id = kp.id
AND s.is_history = '1'
AND s.rating_dict_type = #{rating_dict_type}
LEFT JOIN sys_office so1 ON kp.city_id = so1.id
LEFT JOIN sys_office so2 ON kp.area_id = so2.id
LEFT JOIN sys_office so3 ON kp.street_id = so3.id
LEFT JOIN sys_office so4 ON kp.community_id = so4.id
LIMIT 1
</select>
<!-- 更新回访历史记录状态 -->
<update id="updateVisitHistory" parameterType="map">
UPDATE jl_key_person_visit_record UPDATE jl_key_person_visit_record
SET is_history = '0', update_time = NOW(), update_by = #{_user.id} SET is_new = '0',
update_by = #{_user.id},
update_time = NOW()
WHERE key_person_id = #{key_person_id} WHERE key_person_id = #{key_person_id}
AND id &lt;&gt; #{id} AND is_new = '1'
</update> </update>
<!-- 插入回访记录 -->
<insert id="insertVisitRecord" parameterType="map"> <insert id="insertVisitRecord" parameterType="map">
INSERT INTO jl_key_person_visit_record( INSERT INTO jl_key_person_visit_record(
id, id,
key_person_id, key_person_id,
key_person_visit_id, key_person_visit_id,
rating_dict_type,
sys_type_office_label,
sys_type_office_value,
plan_name, plan_name,
plan_type, plan_type,
rating_type, rating_type,
plan_start_data, is_new,
plan_end_data,
overdue_date,
visit_time,
visit_record, visit_record,
img, visit_img,
is_history, visit_time,
do_status, visit_user_id,
is_overdue, visit_user_name,
visit_user, visit_user_company_name,
visit_user_company, visit_user_company_code,
create_by, create_by,
create_time create_time
) VALUES ( )
UUID(), VALUES (
#{id},
#{key_person_id}, #{key_person_id},
#{key_person_visit_id}, #{key_person_visit_id},
#{rating_dict_type},
#{sys_type_office_label},
#{sys_type_office_value},
#{plan_name}, #{plan_name},
#{plan_type}, #{plan_type},
#{rating_type}, #{rating_type},
(
CASE
WHEN #{plan_start_data} IS NULL OR #{plan_start_data} = '' THEN NULL
WHEN CAST(#{plan_start_data} AS CHAR) REGEXP '^[0-9]{13}$' THEN DATE(FROM_UNIXTIME(#{plan_start_data} / 1000))
WHEN CAST(#{plan_start_data} AS CHAR) REGEXP '^[0-9]{10}$' THEN DATE(FROM_UNIXTIME(#{plan_start_data}))
ELSE DATE(#{plan_start_data})
END
),
(
CASE
WHEN #{plan_end_data} IS NULL OR #{plan_end_data} = '' THEN NULL
WHEN CAST(#{plan_end_data} AS CHAR) REGEXP '^[0-9]{13}$' THEN DATE(FROM_UNIXTIME(#{plan_end_data} / 1000))
WHEN CAST(#{plan_end_data} AS CHAR) REGEXP '^[0-9]{10}$' THEN DATE(FROM_UNIXTIME(#{plan_end_data}))
ELSE DATE(#{plan_end_data})
END
),
(
CASE
WHEN #{overdue_date} IS NULL OR #{overdue_date} = '' THEN NULL
WHEN CAST(#{overdue_date} AS CHAR) REGEXP '^[0-9]{13}$' THEN DATE(FROM_UNIXTIME(#{overdue_date} / 1000))
WHEN CAST(#{overdue_date} AS CHAR) REGEXP '^[0-9]{10}$' THEN DATE(FROM_UNIXTIME(#{overdue_date}))
ELSE DATE(#{overdue_date})
END
),
#{visit_time},
#{visit_record},
#{img},
'2',
'1', '1',
CASE #{visit_record},
WHEN ( #{visit_img},
CASE #{visit_time},
WHEN #{plan_end_data} IS NULL OR #{plan_end_data} = '' THEN NULL #{visit_user_id},
WHEN CAST(#{plan_end_data} AS CHAR) REGEXP '^[0-9]{13}$' THEN DATE(FROM_UNIXTIME(#{plan_end_data} / 1000)) #{visit_user_name},
WHEN CAST(#{plan_end_data} AS CHAR) REGEXP '^[0-9]{10}$' THEN DATE(FROM_UNIXTIME(#{plan_end_data})) #{visit_user_company_name},
ELSE DATE(#{plan_end_data}) #{visit_user_company_code},
END
) &lt; CURDATE() THEN '1' ELSE '0'
END,
#{_user.name},
#{_user.company_name},
#{_user.id}, #{_user.id},
NOW() NOW()
) )
</insert> </insert>
<!-- 待办统计(正常/临期) --> <!-- 查询回访历史(分页) -->
<select id="getPendingStats" parameterType="map" resultType="map"> <select id="selectVisitHistoryPage" parameterType="page" resultType="map">
SELECT SELECT
SUM(CASE WHEN r.is_overdue = '0' THEN 1 ELSE 0 END) AS normal, r.id,
SUM(CASE WHEN r.is_overdue = '1' THEN 1 ELSE 0 END) AS nearDue r.key_person_id,
FROM r.rating_type,
<choose> r.visit_time,
<!-- 重要未成年人:使用 jl_key_person_minor --> r.visit_user_name AS visit_user,
<when test='rating_dict_type == "6"'> r.visit_user_company_name AS visit_user_company,
jl_key_person_minor t, r.visit_record,
jl_key_person_visit_record r r.visit_img AS img,
</when> r.is_new,
<!-- 默认:刑满释放人员/严重精神障碍患者 使用 jl_key_person --> CASE
<otherwise> WHEN r.is_new = '1' THEN '1'
jl_key_person t, ELSE '2'
jl_key_person_visit_record r END AS do_status
</otherwise> FROM jl_key_person_visit_record r
</choose>
<where> <where>
AND t.id = r.key_person_id <if test="params.key_person_id != null and params.key_person_id != ''">
<if test="name != null and name != ''"> AND r.key_person_id = #{params.key_person_id}
AND t.name LIKE CONCAT('%', #{name}, '%')
</if> </if>
<if test="card_no != null and card_no != ''"> <if test="params.sys_type_office_label != null and params.sys_type_office_label != ''">
AND t.enc_card_no = TO_BASE64(AES_ENCRYPT(#{card_no},'*#id#')) AND r.sys_type_office_label = #{params.sys_type_office_label}
</if> </if>
<if test="city_id != null and city_id != ''"> <if test="params.rating_dict_type != null and params.rating_dict_type != ''">
AND t.city_id = #{city_id} AND r.rating_dict_type = #{params.rating_dict_type}
</if>
<if test="area_id != null and area_id != ''">
AND t.area_id = #{area_id}
</if>
<if test="street_id != null and street_id != ''">
AND t.street_id = #{street_id}
</if>
<if test="community_id != null and community_id != ''">
AND t.community_id = #{community_id}
</if>
<if test="rating_type != null and rating_type != ''">
AND r.rating_type = #{rating_type}
</if>
<if test="do_status != null and do_status != ''">
AND r.do_status = #{do_status}
</if> </if>
<if test="rating_dict_type != null and rating_dict_type != ''"> <if test="params.exclude_id != null and params.exclude_id != ''">
AND t.sys_type = #{rating_dict_type} AND r.id != #{params.exclude_id}
</if> </if>
<!-- 数据范围(来自服务层注入,位于根参数上) -->
<choose>
<when test='_parameter.scope_grade == "3"'>
AND t.city_id = #{_parameter.scope_area_id}
</when>
<when test='_parameter.scope_grade == "4"'>
AND t.area_id = #{_parameter.scope_area_id}
</when>
<when test='_parameter.scope_grade == "5"'>
AND t.street_id = #{_parameter.scope_area_id}
</when>
<when test='_parameter.scope_grade == "6"'>
AND t.community_id = #{_parameter.scope_area_id}
</when>
</choose>
</where> </where>
ORDER BY r.visit_time DESC, r.create_time DESC
</select> </select>
</mapper> <!-- 查询回访记录详情 -->
<select id="getVisitRecordDetail" parameterType="map" resultType="map">
SELECT
r.id,
r.key_person_id,
r.rating_type,
r.visit_time,
r.visit_user_name AS visit_user,
r.visit_user_company_name AS visit_user_company,
r.visit_record,
r.visit_img AS img,
r.is_new,
kp.name,
kp.card_no,
kp.phone,
kp.sex,
kp.folk,
so1.name AS city,
so2.name AS area,
so3.name AS street,
so4.name AS community,
CASE
WHEN r.is_new = '1' THEN '1'
ELSE '2'
END AS do_status,
r.id AS current_visit_record_id
FROM jl_key_person_visit_record r
LEFT JOIN (
SELECT
id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person
WHERE id = (SELECT key_person_id FROM jl_key_person_visit_record WHERE id = #{id})
UNION ALL
SELECT
id,
name,
CAST(AES_DECRYPT(FROM_BASE64(card_no),'*#id#') AS CHAR) AS card_no,
phone,
sex,
folk,
city_id,
area_id,
street_id,
community_id
FROM jl_key_person_minor
WHERE id = (SELECT key_person_id FROM jl_key_person_visit_record WHERE id = #{id})
) kp ON kp.id = r.key_person_id
LEFT JOIN sys_office so1 ON kp.city_id = so1.id
LEFT JOIN sys_office so2 ON kp.area_id = so2.id
LEFT JOIN sys_office so3 ON kp.street_id = so3.id
LEFT JOIN sys_office so4 ON kp.community_id = so4.id
WHERE r.id = #{id}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//oos.juyouhx.com//DTD Mapper 3.0//EN" "http://oss.juyouhx.com/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.scpyun.platform.standard.jilinsscgsdp.keyPersonVisitRecordScheduledTaskDao" name="重点人员回访计划">
<!-- 计划:启用中 -->
<select id="selectActiveVisitPlans" parameterType="map" resultType="map">
SELECT id,
plan_name,
plan_type,
rating_dict_type,
rating_type,
visit_start_day,
visit_end_day,
overdue_warning_day
FROM jl_key_person_visit
WHERE status = '1'
</select>
<!-- 人员筛选:重点人员(非未成年人),且有最新评分等级 -->
<select id="selectPersonsForKeyPersonByPlan" parameterType="map" resultType="map">
SELECT kp.id AS person_id
FROM jl_key_person kp
INNER JOIN jl_key_person_rating_summary s
ON s.key_person_id = kp.id
WHERE kp.sys_type = #{rating_dict_type}
AND s.rating_type = #{rating_type}
AND s.is_history = '1'
GROUP BY kp.id
</select>
<!-- 人员筛选:重点未成年人,且有最新评分等级 -->
<select id="selectPersonsForMinorByPlan" parameterType="map" resultType="map">
SELECT km.id AS person_id
FROM jl_key_person_minor km
INNER JOIN jl_key_person_rating_summary s
ON s.key_person_id = km.id
WHERE s.rating_type = #{rating_type}
AND s.is_history = '1'
GROUP BY km.id
</select>
<!-- 限制:一个人仅允许一条待办 -->
<select id="selectPendingCountByPerson" parameterType="map" resultType="int">
SELECT COUNT(1)
FROM jl_key_person_visit_record
WHERE key_person_id = #{person_id}
AND do_status = '0'
</select>
<!-- 最新一条回访记录(含计划起止、办理状态) -->
<select id="selectLatestRecordByPerson" parameterType="map" resultType="map">
SELECT id,
key_person_id,
key_person_visit_id,
do_status,
plan_start_data,
plan_end_data AS plan_end_date,
DATE(create_time) AS create_date
FROM jl_key_person_visit_record
WHERE key_person_id = #{person_id}
ORDER BY create_time DESC
LIMIT 1
</select>
<!-- 若超出计划结束日期且仍为待办,则标记为超期未办(不可处理本次回访) -->
<update id="markOverdueIfExpired" parameterType="map">
UPDATE jl_key_person_visit_record
SET do_status = '2',is_history = '0'
WHERE id = #{id}
AND do_status = '0'
AND DATE(NOW()) &gt; plan_end_data
</update>
<!-- 插入新的待办记录 -->
<insert id="insertVisitRecord" parameterType="map">
INSERT INTO jl_key_person_visit_record (
id,
key_person_id,
key_person_visit_id,
rating_dict_type,
plan_name,
plan_type,
rating_type,
plan_start_data,
plan_end_data,
overdue_date,
do_status,
is_overdue,
is_history,
create_time
) VALUES (
UUID(),
#{person_id},
#{key_person_visit_id},
#{rating_dict_type},
#{plan_name},
#{plan_type},
#{rating_type},
#{plan_start_data},
#{plan_end_data},
#{overdue_date},
'0',
'0',
'1',
NOW()
)
</insert>
<!-- 超过临期日期的“待办”置为 is_overdue=1(仅待办) -->
<update id="markOverdueByOverdueDate" parameterType="map">
UPDATE jl_key_person_visit_record
SET is_overdue = '1'
WHERE do_status = '0'
AND overdue_date IS NOT NULL
AND now() > overdue_date
AND (is_overdue IS NULL OR is_overdue = '0')
</update>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论