大病互助
This commit is contained in:
@@ -31,6 +31,7 @@ import org.nutz.mvc.upload.UploadAdaptor;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -197,7 +198,7 @@ public class SickHelpImportController {
|
||||
@At("/convertIns")
|
||||
@Ok("json:full")
|
||||
@RequiresPermissions("sickHelp.import.excel")
|
||||
public Result convertIns(){
|
||||
public Result convertIns() {
|
||||
List<SickHelpMedicalIns> insList = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1));
|
||||
|
||||
List<SickHelp> collect = insList.stream().map(v -> {
|
||||
@@ -210,7 +211,7 @@ public class SickHelpImportController {
|
||||
sickHelp.setSchoolSecondSubsidyMoney(v.getEcbx());
|
||||
sickHelp.setSelfPayMoney(v.getCalc());
|
||||
return sickHelp;
|
||||
}).collect(Collectors.toList());
|
||||
}).filter(v -> v.getSelfPayMoney().compareTo(BigDecimal.valueOf(10000)) >= 0).collect(Collectors.toList());
|
||||
|
||||
List<SickHelp> sickHelps = sickHelpImportService.checkData(collect);
|
||||
return Result.success(sickHelps);
|
||||
|
||||
@@ -71,6 +71,10 @@ public class SickHelpMedicalInsController {
|
||||
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());
|
||||
|
||||
// 按身份证分组并聚合数据 过滤出四项之和大于10000的
|
||||
@@ -109,40 +113,119 @@ public class SickHelpMedicalInsController {
|
||||
""");
|
||||
sql.setCallback(Sqls.callback.maps());
|
||||
dao.execute(sql);
|
||||
// 会员库数据
|
||||
List<NutMap> userList = sql.getList(NutMap.class);
|
||||
for (SickHelpMedicalIns ins : aggregatedData) {
|
||||
String idCard = ins.getIdCard();
|
||||
String userName = ins.getUserName();
|
||||
ins.setYear(DateUtil.thisYear() - 1);
|
||||
// 先通过身份证匹配用户
|
||||
Optional<NutMap> idCardOptional = userList.stream().filter(v -> v.getString("idCard", "").equals(idCard)).findFirst();
|
||||
if (idCardOptional.isPresent()) {
|
||||
ins.setUserId(idCardOptional.get().getString("id"));
|
||||
ins.setLoginName(idCardOptional.get().getString("loginName"));
|
||||
ins.setUserName(idCardOptional.get().getString("userName"));
|
||||
ins.setUserId(idCardOptional.get().getString("id"));
|
||||
}
|
||||
// for (SickHelpMedicalIns ins : aggregatedData) {
|
||||
// String idCard = ins.getIdCard();
|
||||
// String userName = ins.getUserName();
|
||||
// ins.setYear(DateUtil.thisYear() - 1);
|
||||
//
|
||||
// // 先通过身份证匹配
|
||||
// List<NutMap> idCardMatchList = userList.stream()
|
||||
// .filter(v -> v.getString("idCard", "").equals(idCard))
|
||||
// .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()));
|
||||
// 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("大病互助会员库无匹配记录,请手动核对");
|
||||
// }
|
||||
// }
|
||||
|
||||
// 如果没有匹配到用户,则通过姓名匹配用户
|
||||
if (idCardOptional.isEmpty()) {
|
||||
if (StrUtil.isNotBlank(userName) && userName.equals("徐为民")) {
|
||||
System.out.println(1);
|
||||
}
|
||||
Optional<NutMap> userNameOptional = userList.stream().filter(v -> v.getString("userName", "").equals(userName)).findFirst();
|
||||
if (userNameOptional.isPresent()) {
|
||||
ins.setUserId(userNameOptional.get().getString("id"));
|
||||
ins.setLoginName(userNameOptional.get().getString("loginName"));
|
||||
ins.setUserName(userNameOptional.get().getString("userName"));
|
||||
}
|
||||
}
|
||||
}
|
||||
aggregatedData = aggregatedData.stream()
|
||||
.filter(ins -> {
|
||||
String idCard = ins.getIdCard();
|
||||
String userName = ins.getUserName();
|
||||
ins.setYear(DateUtil.thisYear() - 1);
|
||||
|
||||
// 先通过身份证匹配
|
||||
List<NutMap> idCardMatchList = userList.stream()
|
||||
.filter(v -> v.getString("idCard", "").equals(idCard))
|
||||
.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> failData = aggregatedData.stream().filter(v -> StrUtil.isBlank(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.isNotBlank(v.getErrMsg())).collect(Collectors.toList());
|
||||
|
||||
dao.clear(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1));
|
||||
dao.insert(successData);
|
||||
dao.insertOrUpdate(successData);
|
||||
|
||||
HashMap<String, Object> hashMap = new HashMap<>();
|
||||
hashMap.put("total", aggregatedData.size());
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.nutz.dao.Dao;
|
||||
import org.nutz.dao.Sqls;
|
||||
import org.nutz.dao.sql.Sql;
|
||||
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.IocBean;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
@@ -63,7 +64,14 @@ public class SickFundListController {
|
||||
@Ok("json:full")
|
||||
@ViReturn
|
||||
@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("""
|
||||
select
|
||||
sfm.id,
|
||||
@@ -75,12 +83,39 @@ public class SickFundListController {
|
||||
sfm.isMember,
|
||||
sfm.remark,
|
||||
u.unitid as unitId,
|
||||
u.unitname as unitName
|
||||
u.unitname as unitName,
|
||||
u.idcard
|
||||
from sick_fund_member sfm
|
||||
left join `user` u on u.loginname = sfm.loginName
|
||||
$condition
|
||||
""");
|
||||
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);
|
||||
SqlExpressionGroup seg = new SqlExpressionGroup();
|
||||
if (StrUtil.isNotBlank(keyWord)) {
|
||||
@@ -142,7 +177,7 @@ public class SickFundListController {
|
||||
if (count > 0) {
|
||||
return Result.error("该记录已存在,请勿重复添加!");
|
||||
}*/
|
||||
Trans.exec(()->{
|
||||
Trans.exec(() -> {
|
||||
dao.update(Sys_user.class, Chain.make("unitId", fundMember.getUnitId()), Cnd.where("loginname", "=", fundMember.getLoginName()));
|
||||
dao.update(fundMember);
|
||||
});
|
||||
|
||||
@@ -96,4 +96,9 @@ public class SickHelpMedicalIns extends BaseModel {
|
||||
@Comment("年份")
|
||||
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/video/css/video-js.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>
|
||||
window._AMapSecurityConfig = {
|
||||
@@ -101,6 +100,7 @@
|
||||
<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/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/offscreen.js"></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>
|
||||
|
||||
|
||||
<!-- <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>-->
|
||||
|
||||
|
||||
@@ -87,6 +87,14 @@ const ecImport = {
|
||||
methods: {
|
||||
onOpen() {
|
||||
this.importVisible = true
|
||||
this.importResult = {
|
||||
totalData: [],
|
||||
successData: [],
|
||||
failData: [],
|
||||
total: 0,
|
||||
success: 0,
|
||||
fail: 0
|
||||
}
|
||||
},
|
||||
|
||||
handleSuccess(resp) {
|
||||
|
||||
@@ -150,7 +150,7 @@ layout("/layouts/platform.html"){
|
||||
<div class="search-item">
|
||||
<div class="search-item-label">数据检查:</div>
|
||||
<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="2"></el-option>
|
||||
</el-select>
|
||||
@@ -176,7 +176,6 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
</table-tool>
|
||||
<el-table :data="tableData"
|
||||
:row-class-name="tableRowClassName"
|
||||
:size="tableSize"
|
||||
@sort-change="pageOrder"
|
||||
align="center"
|
||||
@@ -283,7 +282,16 @@ layout("/layouts/platform.html"){
|
||||
if (code === 0) {
|
||||
$.post(loc() + '/checkEc').then(res => {
|
||||
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 {
|
||||
this.$message.error(res.msg)
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ const insImport = {
|
||||
<li>导入之前请确认大病互助会员库数据是最新且准确的</li>
|
||||
<li>导入会先过滤掉四项之和小于10000的(达不到补助标准)</li>
|
||||
<li>导入会过滤掉非会员数据</li>
|
||||
<li>导入会覆盖上一次同年份的数据</li>
|
||||
<li>重新导入会自动更新或者新增</li>
|
||||
</ul>
|
||||
</el-alert>
|
||||
</div>
|
||||
@@ -102,13 +102,22 @@ const insImport = {
|
||||
"zhzl": '账户自理',
|
||||
"zhzf": '账户自付',
|
||||
"xjzl": '现金自理',
|
||||
"xjzf": '现金自付'
|
||||
"xjzf": '现金自付',
|
||||
"errMsg": '错误记录'
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen() {
|
||||
this.importVisible = true
|
||||
this.importResult = {
|
||||
totalData: [],
|
||||
successData: [],
|
||||
failData: [],
|
||||
total: 0,
|
||||
success: 0,
|
||||
fail: 0
|
||||
}
|
||||
},
|
||||
|
||||
handleSuccess(resp) {
|
||||
|
||||
@@ -54,13 +54,13 @@ layout("/layouts/platform.html"){
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="search-item">-->
|
||||
<!-- <div class="search-item-label">单位:</div>-->
|
||||
<!-- <div class="search-item-option">-->
|
||||
<!-- <el-input clearable maxlength="200" placeholder="可输入单位进行查询"-->
|
||||
<!-- v-model.trim="pageForm.unitName"></el-input>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- <div class="search-item">-->
|
||||
<!-- <div class="search-item-label">单位:</div>-->
|
||||
<!-- <div class="search-item-option">-->
|
||||
<!-- <el-input clearable maxlength="200" placeholder="可输入单位进行查询"-->
|
||||
<!-- v-model.trim="pageForm.unitName"></el-input>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
|
||||
<div class="search-item">
|
||||
<div class="search-item-label">状态:</div>
|
||||
@@ -79,7 +79,13 @@ layout("/layouts/platform.html"){
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool :app="this" label="大病医疗互助会员">
|
||||
<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>
|
||||
</table-tool>
|
||||
<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==null"></span>
|
||||
</template>
|
||||
|
||||
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200">
|
||||
<template scope="{row}">
|
||||
@@ -192,6 +196,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: 'loginName', label: '工号', sortable: true},
|
||||
{prop: 'sex', label: '性别', sortable: true},
|
||||
{prop: 'unitName', label: '单位', sortable: true},
|
||||
{prop: 'idcard', label: '身份证号', sortable: true},
|
||||
{prop: 'isMember', label: '是否会员', sortable: true},
|
||||
{prop: 'userState', label: '状态', sortable: true},
|
||||
{prop: 'mutualGoldStartTime', label: '入会时间', sortable: true},
|
||||
@@ -210,7 +215,8 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
editDialogVisible: false,
|
||||
pageForm: {
|
||||
unitName: ''
|
||||
unitName: '',
|
||||
checkMode: ''
|
||||
},
|
||||
formData: {
|
||||
userName: null,
|
||||
|
||||
Reference in New Issue
Block a user