大病互助

This commit is contained in:
那些花儿
2025-03-27 18:37:37 +08:00
parent 0eefa34be5
commit 9952b56011
10 changed files with 229 additions and 51 deletions
@@ -31,6 +31,7 @@ import org.nutz.mvc.upload.UploadAdaptor;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -197,7 +198,7 @@ public class SickHelpImportController {
@At("/convertIns") @At("/convertIns")
@Ok("json:full") @Ok("json:full")
@RequiresPermissions("sickHelp.import.excel") @RequiresPermissions("sickHelp.import.excel")
public Result convertIns(){ public Result convertIns() {
List<SickHelpMedicalIns> insList = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1)); List<SickHelpMedicalIns> insList = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1));
List<SickHelp> collect = insList.stream().map(v -> { List<SickHelp> collect = insList.stream().map(v -> {
@@ -210,7 +211,7 @@ public class SickHelpImportController {
sickHelp.setSchoolSecondSubsidyMoney(v.getEcbx()); sickHelp.setSchoolSecondSubsidyMoney(v.getEcbx());
sickHelp.setSelfPayMoney(v.getCalc()); sickHelp.setSelfPayMoney(v.getCalc());
return sickHelp; return sickHelp;
}).collect(Collectors.toList()); }).filter(v -> v.getSelfPayMoney().compareTo(BigDecimal.valueOf(10000)) >= 0).collect(Collectors.toList());
List<SickHelp> sickHelps = sickHelpImportService.checkData(collect); List<SickHelp> sickHelps = sickHelpImportService.checkData(collect);
return Result.success(sickHelps); return Result.success(sickHelps);
@@ -71,6 +71,10 @@ public class SickHelpMedicalInsController {
return Result.error("请上传xlsx格式的excel文件"); return Result.error("请上传xlsx格式的excel文件");
} }
// 查询已经导入的数据
List<SickHelpMedicalIns> dataList = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1));
// excel数据
List<SickHelpMedicalIns> list = ExcelImportUtil.importExcel(tempFile.getFile(), SickHelpMedicalIns.class, new ImportParams()); List<SickHelpMedicalIns> list = ExcelImportUtil.importExcel(tempFile.getFile(), SickHelpMedicalIns.class, new ImportParams());
// 按身份证分组并聚合数据 过滤出四项之和大于10000的 // 按身份证分组并聚合数据 过滤出四项之和大于10000的
@@ -109,40 +113,119 @@ public class SickHelpMedicalInsController {
"""); """);
sql.setCallback(Sqls.callback.maps()); sql.setCallback(Sqls.callback.maps());
dao.execute(sql); dao.execute(sql);
// 会员库数据
List<NutMap> userList = sql.getList(NutMap.class); List<NutMap> userList = sql.getList(NutMap.class);
for (SickHelpMedicalIns ins : aggregatedData) { // for (SickHelpMedicalIns ins : aggregatedData) {
String idCard = ins.getIdCard(); // String idCard = ins.getIdCard();
String userName = ins.getUserName(); // String userName = ins.getUserName();
ins.setYear(DateUtil.thisYear() - 1); // ins.setYear(DateUtil.thisYear() - 1);
// 先通过身份证匹配用户 //
Optional<NutMap> idCardOptional = userList.stream().filter(v -> v.getString("idCard", "").equals(idCard)).findFirst(); // // 先通过身份证匹配
if (idCardOptional.isPresent()) { // List<NutMap> idCardMatchList = userList.stream()
ins.setUserId(idCardOptional.get().getString("id")); // .filter(v -> v.getString("idCard", "").equals(idCard))
ins.setLoginName(idCardOptional.get().getString("loginName")); // .collect(Collectors.toList());
ins.setUserName(idCardOptional.get().getString("userName")); //
ins.setUserId(idCardOptional.get().getString("id")); // if (idCardMatchList.size() == 1) {
} // // 身份证唯一匹配成功
// ins.setLoginName(idCardMatchList.get(0).getString("loginName"));
// ins.setUserName(idCardMatchList.get(0).getString("userName"));
//
// // 精准匹配
// dataList.stream()
// .filter(v -> v.getLoginName().equals(idCardMatchList.get(0).getString("loginName")))
// .findFirst()
// .ifPresent(v -> ins.setId(v.getId()));
// continue;
// } else if (idCardMatchList.size() > 1) {
// // 身份证匹配到多条
// ins.setErrMsg("大病互助会员库多条记录身份证号重复,请手动核对");
// continue;
// }
//
// // 身份证未匹配到,继续用姓名匹配
// List<NutMap> nameMatchList = userList.stream()
// .filter(v -> v.getString("userName", "").equals(userName))
// .collect(Collectors.toList());
//
// if (nameMatchList.size() == 1) {
// // 姓名唯一匹配成功
// ins.setLoginName(nameMatchList.get(0).getString("loginName"));
// ins.setUserName(nameMatchList.get(0).getString("userName"));
//
// // 精准匹配
// dataList.stream()
// .filter(v -> v.getLoginName().equals(nameMatchList.get(0).getString("loginName")))
// .findFirst()
// .ifPresent(v -> ins.setId(v.getId()));
// } else if (nameMatchList.size() > 1) {
// // 姓名匹配到多条
// ins.setErrMsg("大病互助会员库多条记录姓名重复,请手动核对");
// } else {
// // 身份证和姓名都未匹配到
// ins.setErrMsg("大病互助会员库无匹配记录,请手动核对");
// }
// }
// 如果没有匹配到用户,则通过姓名匹配用户 aggregatedData = aggregatedData.stream()
if (idCardOptional.isEmpty()) { .filter(ins -> {
if (StrUtil.isNotBlank(userName) && userName.equals("徐为民")) { String idCard = ins.getIdCard();
System.out.println(1); String userName = ins.getUserName();
} ins.setYear(DateUtil.thisYear() - 1);
Optional<NutMap> userNameOptional = userList.stream().filter(v -> v.getString("userName", "").equals(userName)).findFirst();
if (userNameOptional.isPresent()) { // 先通过身份证匹配
ins.setUserId(userNameOptional.get().getString("id")); List<NutMap> idCardMatchList = userList.stream()
ins.setLoginName(userNameOptional.get().getString("loginName")); .filter(v -> v.getString("idCard", "").equals(idCard))
ins.setUserName(userNameOptional.get().getString("userName")); .collect(Collectors.toList());
}
} if (idCardMatchList.size() == 1) {
} // 身份证唯一匹配成功
ins.setLoginName(idCardMatchList.get(0).getString("loginName"));
ins.setUserName(idCardMatchList.get(0).getString("userName"));
// 精准匹配
dataList.stream()
.filter(v -> v.getLoginName().equals(idCardMatchList.get(0).getString("loginName")))
.findFirst()
.ifPresent(v -> ins.setId(v.getId()));
return true; // 保留这条记录
} else if (idCardMatchList.size() > 1) {
// 身份证匹配到多条
ins.setErrMsg("大病互助会员库多条记录身份证号重复,请手动核对");
return true; // 保留这条记录
}
// 身份证未匹配到,继续用姓名匹配
List<NutMap> nameMatchList = userList.stream()
.filter(v -> v.getString("userName", "").equals(userName))
.collect(Collectors.toList());
if (nameMatchList.size() == 1) {
// 姓名唯一匹配成功
ins.setLoginName(nameMatchList.get(0).getString("loginName"));
ins.setUserName(nameMatchList.get(0).getString("userName"));
// 精准匹配
dataList.stream()
.filter(v -> v.getLoginName().equals(nameMatchList.get(0).getString("loginName")))
.findFirst()
.ifPresent(v -> ins.setId(v.getId()));
return true; // 保留这条记录
} else if (nameMatchList.size() > 1) {
// 姓名匹配到多条
ins.setErrMsg("大病互助会员库多条记录姓名重复,请手动核对");
return true; // 保留这条记录(即使重复)
} else {
// 身份证和姓名都未匹配到
ins.setErrMsg("大病互助会员库无匹配记录,请手动核对");
return false; // 过滤掉这条记录
}
}).collect(Collectors.toList());
// 再次过滤 // 再次过滤
List<SickHelpMedicalIns> successData = aggregatedData.stream().filter(v -> StrUtil.isNotBlank(v.getLoginName())).collect(Collectors.toList()); List<SickHelpMedicalIns> successData = aggregatedData.stream().filter(v -> StrUtil.isBlank(v.getErrMsg())).collect(Collectors.toList());
List<SickHelpMedicalIns> failData = aggregatedData.stream().filter(v -> StrUtil.isBlank(v.getLoginName())).collect(Collectors.toList()); List<SickHelpMedicalIns> failData = aggregatedData.stream().filter(v -> StrUtil.isNotBlank(v.getErrMsg())).collect(Collectors.toList());
dao.clear(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1)); dao.insertOrUpdate(successData);
dao.insert(successData);
HashMap<String, Object> hashMap = new HashMap<>(); HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("total", aggregatedData.size()); hashMap.put("total", aggregatedData.size());
@@ -15,6 +15,7 @@ import org.nutz.dao.Dao;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
@@ -63,7 +64,14 @@ public class SickFundListController {
@Ok("json:full") @Ok("json:full")
@ViReturn @ViReturn
@RequiresPermissions("sickFund.member.list") @RequiresPermissions("sickFund.member.list")
public Object pageData(PageForm pageForm, Integer mutualGoldStartTime, String keyWord, String unitName, String unionId, String unitId, String userState) { public Object pageData(PageForm pageForm,
Integer mutualGoldStartTime,
String keyWord,
String unitName,
String unionId,
String unitId,
String userState,
Integer checkMode) {
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
select select
sfm.id, sfm.id,
@@ -75,12 +83,39 @@ public class SickFundListController {
sfm.isMember, sfm.isMember,
sfm.remark, sfm.remark,
u.unitid as unitId, u.unitid as unitId,
u.unitname as unitName u.unitname as unitName,
u.idcard
from sick_fund_member sfm from sick_fund_member sfm
left join `user` u on u.loginname = sfm.loginName left join `user` u on u.loginname = sfm.loginName
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
if (checkMode != null) {
if (checkMode == 1) {
cnd.and(new Static("""
sfm.userName IN (
SELECT userName
FROM sick_fund_member
GROUP BY userName
HAVING COUNT(*) > 1
)
"""));
cnd.asc("sfm.userName");
}
if (checkMode == 2) {
cnd.and(new Static("""
u.idcard IN (
SELECT idcard
FROM user
GROUP BY idcard
HAVING COUNT(*) > 1
)
"""));
cnd.asc("u.idcard");
}
}
cnd.andEX("YEAR(mutualGoldStartTime)", "=", mutualGoldStartTime); cnd.andEX("YEAR(mutualGoldStartTime)", "=", mutualGoldStartTime);
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
if (StrUtil.isNotBlank(keyWord)) { if (StrUtil.isNotBlank(keyWord)) {
@@ -142,7 +177,7 @@ public class SickFundListController {
if (count > 0) { if (count > 0) {
return Result.error("该记录已存在,请勿重复添加!"); return Result.error("该记录已存在,请勿重复添加!");
}*/ }*/
Trans.exec(()->{ Trans.exec(() -> {
dao.update(Sys_user.class, Chain.make("unitId", fundMember.getUnitId()), Cnd.where("loginname", "=", fundMember.getLoginName())); dao.update(Sys_user.class, Chain.make("unitId", fundMember.getUnitId()), Cnd.where("loginname", "=", fundMember.getLoginName()));
dao.update(fundMember); dao.update(fundMember);
}); });
@@ -96,4 +96,9 @@ public class SickHelpMedicalIns extends BaseModel {
@Comment("年份") @Comment("年份")
private Integer year; private Integer year;
/**
* 错误信息
*/
private String errMsg;
} }
File diff suppressed because one or more lines are too long
@@ -23,7 +23,6 @@
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wp-upload-vue/font/iconfont.css"> <link rel="stylesheet" href="${base!}/assets/platform/plugins/wp-upload-vue/font/iconfont.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/video/css/video-js.min.css"> <link rel="stylesheet" href="${base!}/assets/platform/plugins/video/css/video-js.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/vivify.min.css"> <link rel="stylesheet" href="${base!}/assets/platform/css/vivify.min.css">
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
<script> <script>
window._AMapSecurityConfig = { window._AMapSecurityConfig = {
@@ -101,6 +100,7 @@
<script src="${base!}/assets/platform/plugins/moment/moment.min.js"></script> <script src="${base!}/assets/platform/plugins/moment/moment.min.js"></script>
<!-- 浏览器通知 --> <!-- 浏览器通知 -->
<script src="${base!}/assets/platform/plugins/push/push.min.js"></script> <script src="${base!}/assets/platform/plugins/push/push.min.js"></script>
<script src="${base!}/assets/platform/plugins/xlsx/xlsx.full.min.js"></script>
<script src="${base!}/assets/platform/js/main.js?v=1.0.1"></script> <script src="${base!}/assets/platform/js/main.js?v=1.0.1"></script>
<script src="${base!}/assets/platform/js/offscreen.js"></script> <script src="${base!}/assets/platform/js/offscreen.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/vue-echarts@4.0.2"></script>--> <!-- <script src="https://cdn.jsdelivr.net/npm/vue-echarts@4.0.2"></script>-->
@@ -115,6 +115,7 @@
<script src="${base!}/assets/platform/js/jr-qrcode.js"></script> <script src="${base!}/assets/platform/js/jr-qrcode.js"></script>
<!-- <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.6/theme-chalk/index.min.css">--> <!-- <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.6/theme-chalk/index.min.css">-->
<!-- <script src="https://cdn.staticfile.org/element-ui/2.15.6/index.min.js"></script>--> <!-- <script src="https://cdn.staticfile.org/element-ui/2.15.6/index.min.js"></script>-->
@@ -87,6 +87,14 @@ const ecImport = {
methods: { methods: {
onOpen() { onOpen() {
this.importVisible = true this.importVisible = true
this.importResult = {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
}
}, },
handleSuccess(resp) { handleSuccess(resp) {
@@ -150,7 +150,7 @@ layout("/layouts/platform.html"){
<div class="search-item"> <div class="search-item">
<div class="search-item-label">数据检查:</div> <div class="search-item-label">数据检查:</div>
<div class="search-item-option"> <div class="search-item-option">
<el-select v-model="pageForm.dataCheck" clearable style="width: 100%"> <el-select v-model="pageForm.dataCheck" clearable style="width: 100%" placeholder="请选择">
<el-option label="医保数据匹配失败记录" value="1"></el-option> <el-option label="医保数据匹配失败记录" value="1"></el-option>
<el-option label="学习二次报销数据匹配失败记录" value="2"></el-option> <el-option label="学习二次报销数据匹配失败记录" value="2"></el-option>
</el-select> </el-select>
@@ -176,7 +176,6 @@ layout("/layouts/platform.html"){
</template> </template>
</table-tool> </table-tool>
<el-table :data="tableData" <el-table :data="tableData"
:row-class-name="tableRowClassName"
:size="tableSize" :size="tableSize"
@sort-change="pageOrder" @sort-change="pageOrder"
align="center" align="center"
@@ -283,7 +282,16 @@ layout("/layouts/platform.html"){
if (code === 0) { if (code === 0) {
$.post(loc() + '/checkEc').then(res => { $.post(loc() + '/checkEc').then(res => {
if (res.code === 0) { if (res.code === 0) {
sublime.jumpPagePjax('/platform/sickHelp/importByExcel?mode=ins')
this.$confirm('计算补助金额将会自动过滤掉补助计算金额小于10000元的记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
sublime.jumpPagePjax('/platform/sickHelp/importByExcel?mode=ins')
}).catch(() => {
});
} else { } else {
this.$message.error(res.msg) this.$message.error(res.msg)
} }
@@ -21,7 +21,7 @@ const insImport = {
<li>导入之前请确认大病互助会员库数据是最新且准确的</li> <li>导入之前请确认大病互助会员库数据是最新且准确的</li>
<li>导入会先过滤掉四项之和小于10000的(达不到补助标准)</li> <li>导入会先过滤掉四项之和小于10000的(达不到补助标准)</li>
<li>导入会过滤掉非会员数据</li> <li>导入会过滤掉非会员数据</li>
<li>导入会覆盖上一次同年份的数据</li> <li>重新导入会自动更新或者新增</li>
</ul> </ul>
</el-alert> </el-alert>
</div> </div>
@@ -102,13 +102,22 @@ const insImport = {
"zhzl": '账户自理', "zhzl": '账户自理',
"zhzf": '账户自付', "zhzf": '账户自付',
"xjzl": '现金自理', "xjzl": '现金自理',
"xjzf": '现金自付' "xjzf": '现金自付',
"errMsg": '错误记录'
} }
} }
}, },
methods: { methods: {
onOpen() { onOpen() {
this.importVisible = true this.importVisible = true
this.importResult = {
totalData: [],
successData: [],
failData: [],
total: 0,
success: 0,
fail: 0
}
}, },
handleSuccess(resp) { handleSuccess(resp) {
@@ -54,13 +54,13 @@ layout("/layouts/platform.html"){
</div> </div>
</div> </div>
<!-- <div class="search-item">--> <!-- <div class="search-item">-->
<!-- <div class="search-item-label">单位:</div>--> <!-- <div class="search-item-label">单位:</div>-->
<!-- <div class="search-item-option">--> <!-- <div class="search-item-option">-->
<!-- <el-input clearable maxlength="200" placeholder="可输入单位进行查询"--> <!-- <el-input clearable maxlength="200" placeholder="可输入单位进行查询"-->
<!-- v-model.trim="pageForm.unitName"></el-input>--> <!-- v-model.trim="pageForm.unitName"></el-input>-->
<!-- </div>--> <!-- </div>-->
<!-- </div>--> <!-- </div>-->
<div class="search-item"> <div class="search-item">
<div class="search-item-label">状态:</div> <div class="search-item-label">状态:</div>
@@ -79,7 +79,13 @@ layout("/layouts/platform.html"){
<el-card class="mt10" shadow="never"> <el-card class="mt10" shadow="never">
<table-tool :app="this" label="大病医疗互助会员"> <table-tool :app="this" label="大病医疗互助会员">
<template #func> <template #func>
<el-button type="primary" size="small" @click="openAdd">新增</el-button> <el-radio-group v-model="pageForm.checkMode" size="small" @change="doSearch" class="mr10">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">姓名重复人员</el-radio-button>
<el-radio-button label="2">身份证号重复人员</el-radio-button>
</el-radio-group>
<el-button type="primary" size="small" icon="el-icon-plus" @click="openAdd">新增</el-button>
</template> </template>
</table-tool> </table-tool>
<el-table :data="tableData" :size="tableSize" <el-table :data="tableData" :size="tableSize"
@@ -107,8 +113,6 @@ layout("/layouts/platform.html"){
<span v-if="row.isMember==false">否</span> <span v-if="row.isMember==false">否</span>
<span v-if="row.isMember==null"></span> <span v-if="row.isMember==null"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template scope="{row}"> <template scope="{row}">
@@ -192,6 +196,7 @@ layout("/layouts/platform.html"){
{prop: 'loginName', label: '工号', sortable: true}, {prop: 'loginName', label: '工号', sortable: true},
{prop: 'sex', label: '性别', sortable: true}, {prop: 'sex', label: '性别', sortable: true},
{prop: 'unitName', label: '单位', sortable: true}, {prop: 'unitName', label: '单位', sortable: true},
{prop: 'idcard', label: '身份证号', sortable: true},
{prop: 'isMember', label: '是否会员', sortable: true}, {prop: 'isMember', label: '是否会员', sortable: true},
{prop: 'userState', label: '状态', sortable: true}, {prop: 'userState', label: '状态', sortable: true},
{prop: 'mutualGoldStartTime', label: '入会时间', sortable: true}, {prop: 'mutualGoldStartTime', label: '入会时间', sortable: true},
@@ -210,7 +215,8 @@ layout("/layouts/platform.html"){
}, },
editDialogVisible: false, editDialogVisible: false,
pageForm: { pageForm: {
unitName: '' unitName: '',
checkMode: ''
}, },
formData: { formData: {
userName: null, userName: null,