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

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") @Ok("json:full")
@ViReturn @ViReturn
@RequiresPermissions("sickHelp.list") @RequiresPermissions("sickHelp.list")
public Object pageData(PageForm pageForm, Integer year, String subsidyUser, String unionId, String unitId, Integer isMember, Integer isMeetRequirements, Integer 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); return sickHelpListService.pageData(pageForm, year, subsidyUser, unionId, unitId, isMember, isMeetRequirements, isAccept, riskType);
} }
@At @At
@@ -315,33 +315,77 @@ public class SickHelpMedicalInsController {
@At @At
@RequiresPermissions("sickHelp.medicalIns") @RequiresPermissions("sickHelp.medicalIns")
public Result pageData(PageForm pageForm, Integer year, String dataCheck) { public Result pageData(PageForm pageForm, Integer year, String dataCheck, Integer riskType) {
Sql sql = Sqls.create("select * from sick_help_medical_ins $condition"); 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 cnd = Cnd.NEW();
cnd.asc("ecbx"); cnd.asc("risk_data.ecbx");
cnd.asc("loginName"); cnd.asc("risk_data.loginName");
cnd.andEX("year", "=", year); cnd.andEX("risk_data.year", "=", year);
if (StrUtil.isNotBlank(dataCheck)) { if (StrUtil.isNotBlank(dataCheck)) {
if (dataCheck.equals("1")) { if (dataCheck.equals("1")) {
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("loginName", "is", null); seg.or("risk_data.loginName", "is", null);
seg.or("loginName", "=", ""); seg.or("risk_data.loginName", "=", "");
cnd.and(seg); cnd.and(seg);
} }
if (dataCheck.equals("2")) { if (dataCheck.equals("2")) {
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("ecbx", "is", null); seg.or("risk_data.ecbx", "is", null);
seg.or("ecbx", "=", ""); seg.or("risk_data.ecbx", "=", "");
cnd.and(seg); 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())) { if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("loginName", pageForm.getSearchKeyword()); seg.orLike("risk_data.loginName", pageForm.getSearchKeyword());
seg.orLike("userName", pageForm.getSearchKeyword()); seg.orLike("risk_data.userName", pageForm.getSearchKeyword());
seg.orLike("idCard", pageForm.getSearchKeyword()); seg.orLike("risk_data.idCard", pageForm.getSearchKeyword());
seg.orLike("risk_data.systemIdcard", pageForm.getSearchKeyword());
cnd.and(seg); cnd.and(seg);
} }
sql.setCondition(cnd); sql.setCondition(cnd);
@@ -21,7 +21,7 @@ public interface SickHelpListService extends ViService<SickHelp> {
* @param isMember 是成员 * @param isMember 是成员
* @return {@link Pagination} * @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 @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(""" Sql sql = Sqls.create("""
SELECT
risk_data.*
FROM (
SELECT SELECT
sick.*, sick.*,
u.unionname as unionName, u.unionname AS unionName,
u.unionId AS queryUnionId,
u.unitId AS queryUnitId,
sfm.isMember, sfm.isMember,
IFNULL(NULLIF(sfm.idcard, ''), u.idcard) AS idcard IFNULL(NULLIF(sfm.idcard, ''), u.idcard) AS idcard,
FROM COALESCE(NULLIF(TRIM(u.idcard), ''), NULLIF(TRIM(sfm.idcard), '')) AS systemIdcard,
`sick_help` sick medical.idcard AS medicalIdcard,
LEFT JOIN sick_fund_member sfm on sfm.loginName = sick.loginName 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 `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 $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.andEX("sick.year", "=", year); cnd.andEX("risk_data.year", "=", year);
cnd.andEX("u.unionId", "=", unionId); cnd.andEX("risk_data.queryUnionId", "=", unionId);
cnd.andEX("u.unitId", "=", unitId); 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) { 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)) { if (StrUtil.isNotBlank(subsidyUser)) {
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("sick.userName", subsidyUser); seg.orLike("risk_data.userName", subsidyUser);
seg.orLike("sick.loginName", subsidyUser); seg.orLike("risk_data.loginName", subsidyUser);
seg.orLike("sfm.idcard", subsidyUser); seg.orLike("risk_data.idcard", subsidyUser);
seg.orLike("u.idcard", subsidyUser); seg.orLike("risk_data.systemIdcard", subsidyUser);
seg.orLike("risk_data.medicalIdcard", subsidyUser);
cnd.and(seg); cnd.and(seg);
} }
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) { 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()); case "ascending" -> cnd.asc(pageForm.getPageOrderName());
} }
} }
cnd.desc("sick.year"); cnd.desc("risk_data.year");
sql.setCondition(cnd); sql.setCondition(cnd);
return list(pageForm, sql); return list(pageForm, sql);
} }
@@ -111,6 +111,16 @@ layout("/layouts/platform.html"){
</div> </div>
</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"> <div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button> <el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div> </div>
@@ -180,6 +190,10 @@ layout("/layouts/platform.html"){
<span v-if="row.isMember==false" class="text-danger">否</span> <span v-if="row.isMember==false" class="text-danger">否</span>
<span v-if="row.isMember==null"></span> <span v-if="row.isMember==null"></span>
</template> </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>
<el-table-column fixed="right" label="操作" width="300"> <el-table-column fixed="right" label="操作" width="300">
<template scope="{row}"> <template scope="{row}">
@@ -276,7 +290,9 @@ layout("/layouts/platform.html"){
{prop: 'year', label: '年度', sortable: true, fixed: 'left'}, {prop: 'year', label: '年度', sortable: true, fixed: 'left'},
{prop: 'userName', label: '姓名', fixed: 'left'}, {prop: 'userName', label: '姓名', fixed: 'left'},
{prop: 'loginName', label: '工号', fixed: 'left', width: 120}, {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: 'unionName', label: '分工会', sortable: true, width: 150},
{prop: 'unitName', label: '单位', sortable: true, width: 150}, {prop: 'unitName', label: '单位', sortable: true, width: 150},
@@ -312,7 +328,8 @@ layout("/layouts/platform.html"){
isMember: null, isMember: null,
unitName: '', unitName: '',
isMeetRequirements: null, isMeetRequirements: null,
isAccept: null isAccept: null,
riskType: null
}, },
unions: [], unions: [],
units: [], units: [],
@@ -158,6 +158,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"> <div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button> <el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div> </div>
@@ -198,6 +208,12 @@ layout("/layouts/platform.html"){
v-for="column in tableColumns" v-for="column in tableColumns"
> >
</el-table-column> </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"> <el-table-column label="操作" align="center" header-align="center" fixed="right" width="300">
<template scope="scope"> <template scope="scope">
<el-button @click="onRebind(scope.row)" size="mini" type="warning">重新关联人员</el-button> <el-button @click="onRebind(scope.row)" size="mini" type="warning">重新关联人员</el-button>
@@ -235,7 +251,8 @@ layout("/layouts/platform.html"){
tableColumns: [ tableColumns: [
{prop: 'userName', label: '姓名'}, {prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'}, {prop: 'loginName', label: '工号'},
{prop: 'idCard', label: '身份证号', width: 200}, {prop: 'systemIdcard', label: '工号身份证号', width: 200},
{prop: 'idCard', label: '医保身份证号', width: 200},
{prop: 'zhzl', label: '账户自理'}, {prop: 'zhzl', label: '账户自理'},
{prop: 'zhzf', label: '账户自付'}, {prop: 'zhzf', label: '账户自付'},
{prop: 'xjzl', label: '现金自理'}, {prop: 'xjzl', label: '现金自理'},
@@ -246,7 +263,8 @@ layout("/layouts/platform.html"){
{prop: 'calc', label: '补助计算金额'}, {prop: 'calc', label: '补助计算金额'},
], ],
pageForm: { 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.source = resp.data
this.form.medicalInsId = resp.data.id 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) { async remoteMethod(query) {
if (!query) { if (!query) {