医疗互助系统-医保报销数据导入和补助台账:新增身份证号匹配类型查询(方便搜索身份证号码匹配异常的数据);

This commit is contained in:
2026-10-12 14:23:39 +08:00
parent 19ebd4cac3
commit 1cd0552a26
7 changed files with 164 additions and 39 deletions
@@ -81,8 +81,8 @@ public class SickHelpListController {
@Ok("json:full")
@ViReturn
@RequiresPermissions("sickHelp.list")
public Object pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept) {
return sickHelpListService.pageData(pageForm, year, subsidyUser, unionId, unitId, isMember, isMeetRequirements, isAccept);
public Object pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept, Integer riskType) {
return sickHelpListService.pageData(pageForm, year, subsidyUser, unionId, unitId, isMember, isMeetRequirements, isAccept, riskType);
}
@At
@@ -315,33 +315,77 @@ public class SickHelpMedicalInsController {
@At
@RequiresPermissions("sickHelp.medicalIns")
public Result pageData(PageForm pageForm, Integer year, String dataCheck) {
Sql sql = Sqls.create("select * from sick_help_medical_ins $condition");
public Result pageData(PageForm pageForm, Integer year, String dataCheck, Integer riskType) {
Sql sql = Sqls.create("""
SELECT
risk_data.*
FROM (
SELECT
medical.*,
COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) AS systemIdcard,
IFNULL(same_name.sameNameCount, 0) AS sameNameCount,
CASE
WHEN NULLIF(TRIM(medical.idCard), '') IS NOT NULL
AND COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) IS NOT NULL
AND UPPER(REPLACE(TRIM(medical.idCard), ' ', '')) != UPPER(REPLACE(COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')), ' ', ''))
THEN 1 ELSE 0
END AS idcardMismatchRisk,
CASE
WHEN IFNULL(same_name.sameNameCount, 0) > 1
AND (NULLIF(TRIM(medical.idCard), '') IS NULL
OR COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) IS NULL)
THEN 1 ELSE 0
END AS duplicateMissingIdRisk
FROM sick_help_medical_ins medical
LEFT JOIN `user` u ON u.loginname = medical.loginName
LEFT JOIN sick_fund_member sfm ON sfm.loginName = medical.loginName
LEFT JOIN (
SELECT TRIM(userName) AS userName, COUNT(DISTINCT loginName) AS sameNameCount
FROM sick_fund_member
WHERE NULLIF(TRIM(userName), '') IS NOT NULL
GROUP BY TRIM(userName)
HAVING COUNT(DISTINCT loginName) > 1
) same_name ON same_name.userName = TRIM(medical.userName)
) risk_data
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.asc("ecbx");
cnd.asc("loginName");
cnd.andEX("year", "=", year);
cnd.asc("risk_data.ecbx");
cnd.asc("risk_data.loginName");
cnd.andEX("risk_data.year", "=", year);
if (StrUtil.isNotBlank(dataCheck)) {
if (dataCheck.equals("1")) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("loginName", "is", null);
seg.or("loginName", "=", "");
seg.or("risk_data.loginName", "is", null);
seg.or("risk_data.loginName", "=", "");
cnd.and(seg);
}
if (dataCheck.equals("2")) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("ecbx", "is", null);
seg.or("ecbx", "=", "");
seg.or("risk_data.ecbx", "is", null);
seg.or("risk_data.ecbx", "=", "");
cnd.and(seg);
}
}
if (riskType != null && riskType == 1) {
cnd.and("risk_data.idcardMismatchRisk", "=", 1);
} else if (riskType != null && riskType == 2) {
cnd.and("risk_data.duplicateMissingIdRisk", "=", 1);
} else if (riskType != null && riskType == 3) {
SqlExpressionGroup riskSeg = new SqlExpressionGroup();
riskSeg.or("risk_data.idcardMismatchRisk", "=", 1);
riskSeg.or("risk_data.duplicateMissingIdRisk", "=", 1);
cnd.and(riskSeg);
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("loginName", pageForm.getSearchKeyword());
seg.orLike("userName", pageForm.getSearchKeyword());
seg.orLike("idCard", pageForm.getSearchKeyword());
seg.orLike("risk_data.loginName", pageForm.getSearchKeyword());
seg.orLike("risk_data.userName", pageForm.getSearchKeyword());
seg.orLike("risk_data.idCard", pageForm.getSearchKeyword());
seg.orLike("risk_data.systemIdcard", pageForm.getSearchKeyword());
cnd.and(seg);
}
sql.setCondition(cnd);
@@ -21,7 +21,7 @@ public interface SickHelpListService extends ViService<SickHelp> {
* @param isMember 是成员
* @return {@link Pagination}
*/
Pagination pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept);
Pagination pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept, Integer riskType);
/**
@@ -46,38 +46,82 @@ public class SickHelpListServiceImpl extends ViServiceImpl<SickHelp> implements
}
@Override
public Pagination pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept) {
public Pagination pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer isAccept, Integer riskType) {
Sql sql = Sqls.create("""
SELECT
sick.*,
u.unionname as unionName,
sfm.isMember,
IFNULL(NULLIF(sfm.idcard, ''), u.idcard) AS idcard
FROM
`sick_help` sick
LEFT JOIN sick_fund_member sfm on sfm.loginName = sick.loginName
LEFT JOIN `user` u ON u.loginname = sick.loginName
risk_data.*
FROM (
SELECT
sick.*,
u.unionname AS unionName,
u.unionId AS queryUnionId,
u.unitId AS queryUnitId,
sfm.isMember,
IFNULL(NULLIF(sfm.idcard, ''), u.idcard) AS idcard,
COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) AS systemIdcard,
medical.idcard AS medicalIdcard,
IFNULL(same_name.sameNameCount, 0) AS sameNameCount,
CASE
WHEN medical.idcard IS NOT NULL
AND COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) IS NOT NULL
AND UPPER(REPLACE(TRIM(medical.idcard), ' ', '')) != UPPER(REPLACE(COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')), ' ', ''))
THEN 1 ELSE 0
END AS idcardMismatchRisk,
CASE
WHEN medical.loginName IS NOT NULL
AND IFNULL(same_name.sameNameCount, 0) > 1
AND (medical.idcard IS NULL OR COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) IS NULL)
THEN 1 ELSE 0
END AS duplicateMissingIdRisk
FROM `sick_help` sick
LEFT JOIN sick_fund_member sfm ON sfm.loginName = sick.loginName
LEFT JOIN `user` u ON u.loginname = sick.loginName
LEFT JOIN (
SELECT `year`, loginName, MAX(NULLIF(TRIM(idCard), '')) AS idcard
FROM sick_help_medical_ins
GROUP BY `year`, loginName
) medical ON medical.loginName = sick.loginName AND medical.`year` = sick.`year`
LEFT JOIN (
SELECT TRIM(userName) AS userName, COUNT(DISTINCT loginName) AS sameNameCount
FROM sick_fund_member
WHERE NULLIF(TRIM(userName), '') IS NOT NULL
GROUP BY TRIM(userName)
HAVING COUNT(DISTINCT loginName) > 1
) same_name ON same_name.userName = TRIM(sick.userName)
) risk_data
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("sick.year", "=", year);
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("u.unitId", "=", unitId);
cnd.andEX("risk_data.year", "=", year);
cnd.andEX("risk_data.queryUnionId", "=", unionId);
cnd.andEX("risk_data.queryUnitId", "=", unitId);
cnd.andEX("sfm.isMember", "=", isMember);
cnd.andEX("risk_data.isMember", "=", isMember);
cnd.andEX("sick.isMeetRequirements", "=", isMeetRequirements);
cnd.andEX("risk_data.isMeetRequirements", "=", isMeetRequirements);
if (isMeetRequirements != null && isMeetRequirements != 0) {
cnd.andEX("isAccept", "=", isAccept);
cnd.andEX("risk_data.isAccept", "=", isAccept);
}
if (riskType != null && riskType == 1) {
cnd.and("risk_data.idcardMismatchRisk", "=", 1);
} else if (riskType != null && riskType == 2) {
cnd.and("risk_data.duplicateMissingIdRisk", "=", 1);
} else if (riskType != null && riskType == 3) {
SqlExpressionGroup riskSeg = new SqlExpressionGroup();
riskSeg.or("risk_data.idcardMismatchRisk", "=", 1);
riskSeg.or("risk_data.duplicateMissingIdRisk", "=", 1);
cnd.and(riskSeg);
}
if (StrUtil.isNotBlank(subsidyUser)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("sick.userName", subsidyUser);
seg.orLike("sick.loginName", subsidyUser);
seg.orLike("sfm.idcard", subsidyUser);
seg.orLike("u.idcard", subsidyUser);
seg.orLike("risk_data.userName", subsidyUser);
seg.orLike("risk_data.loginName", subsidyUser);
seg.orLike("risk_data.idcard", subsidyUser);
seg.orLike("risk_data.systemIdcard", subsidyUser);
seg.orLike("risk_data.medicalIdcard", subsidyUser);
cnd.and(seg);
}
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
@@ -86,7 +130,7 @@ public class SickHelpListServiceImpl extends ViServiceImpl<SickHelp> implements
case "ascending" -> cnd.asc(pageForm.getPageOrderName());
}
}
cnd.desc("sick.year");
cnd.desc("risk_data.year");
sql.setCondition(cnd);
return list(pageForm, sql);
}
@@ -111,6 +111,16 @@ layout("/layouts/platform.html"){
</div>
</div>
<div class="search-item">
<div class="search-item-label">身份证号匹配:</div>
<div class="search-item-option">
<el-select clearable style="width: 100%" v-model="pageForm.riskType">
<el-option label="全部风险数据" :value="3"></el-option>
<el-option label="工号身份证与医保身份证不一致" :value="1"></el-option>
<el-option label="同名且身份证缺失无法确认" :value="2"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
@@ -180,6 +190,10 @@ layout("/layouts/platform.html"){
<span v-if="row.isMember==false" class="text-danger">否</span>
<span v-if="row.isMember==null"></span>
</template>
<template scope="{row}" v-else-if="column.prop=='relationRisk'">
<el-tag size="mini" type="danger" v-if="row.idcardMismatchRisk==1">身份证不一致</el-tag>
<el-tag size="mini" type="warning" v-if="row.duplicateMissingIdRisk==1">重名且身份证缺失</el-tag>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="300">
<template scope="{row}">
@@ -276,7 +290,9 @@ layout("/layouts/platform.html"){
{prop: 'year', label: '年度', sortable: true, fixed: 'left'},
{prop: 'userName', label: '姓名', fixed: 'left'},
{prop: 'loginName', label: '工号', fixed: 'left', width: 120},
{prop: 'idcard', label: '身份证号', fixed: 'left', width: 200},
{prop: 'systemIdcard', label: '工号身份证号', fixed: 'left', width: 200},
{prop: 'medicalIdcard', label: '医保身份证号', width: 200},
{prop: 'relationRisk', label: '关联风险', width: 180},
{prop: 'unionName', label: '分工会', sortable: true, width: 150},
{prop: 'unitName', label: '单位', sortable: true, width: 150},
@@ -312,7 +328,8 @@ layout("/layouts/platform.html"){
isMember: null,
unitName: '',
isMeetRequirements: null,
isAccept: null
isAccept: null,
riskType: null
},
unions: [],
units: [],
@@ -158,6 +158,16 @@ layout("/layouts/platform.html"){
</div>
<div class="search-item">
<div class="search-item-label">身份证号匹配:</div>
<div class="search-item-option">
<el-select clearable style="width: 100%" v-model="pageForm.riskType">
<el-option label="全部风险数据" :value="3"></el-option>
<el-option label="工号身份证与医保身份证不一致" :value="1"></el-option>
<el-option label="同名且身份证缺失无法确认" :value="2"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
@@ -198,6 +208,12 @@ layout("/layouts/platform.html"){
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column label="关联风险" align="center" header-align="center" width="180">
<template scope="{row}">
<el-tag size="mini" type="danger" v-if="row.idcardMismatchRisk==1">身份证不一致</el-tag>
<el-tag size="mini" type="warning" v-if="row.duplicateMissingIdRisk==1">重名且身份证缺失</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" header-align="center" fixed="right" width="300">
<template scope="scope">
<el-button @click="onRebind(scope.row)" size="mini" type="warning">重新关联人员</el-button>
@@ -235,7 +251,8 @@ layout("/layouts/platform.html"){
tableColumns: [
{prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'},
{prop: 'idCard', label: '身份证号', width: 200},
{prop: 'systemIdcard', label: '工号身份证号', width: 200},
{prop: 'idCard', label: '医保身份证号', width: 200},
{prop: 'zhzl', label: '账户自理'},
{prop: 'zhzf', label: '账户自付'},
{prop: 'xjzl', label: '现金自理'},
@@ -246,7 +263,8 @@ layout("/layouts/platform.html"){
{prop: 'calc', label: '补助计算金额'},
],
pageForm: {
year: (new Date().getFullYear() - 1).toString()
year: (new Date().getFullYear() - 1).toString(),
riskType: null
}
}
},
@@ -151,6 +151,8 @@ const rebindForm = {
}
this.source = resp.data
this.form.medicalInsId = resp.data.id
this.form.ecbx = resp.data.ecbx === null || resp.data.ecbx === undefined || resp.data.ecbx === ''
? 0 : Number(resp.data.ecbx)
},
async remoteMethod(query) {
if (!query) {