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

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 SELECT
sick.*, risk_data.*
u.unionname as unionName, FROM (
sfm.isMember, SELECT
IFNULL(NULLIF(sfm.idcard, ''), u.idcard) AS idcard sick.*,
FROM u.unionname AS unionName,
`sick_help` sick u.unionId AS queryUnionId,
LEFT JOIN sick_fund_member sfm on sfm.loginName = sick.loginName u.unitId AS queryUnitId,
LEFT JOIN `user` u ON u.loginname = sick.loginName 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 $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) {