This commit is contained in:
2026-09-24 09:56:49 +08:00
parent 1c2630a338
commit f709e3a0e4
24 changed files with 142 additions and 29 deletions
+51 -1
View File
@@ -1 +1,51 @@
/.idea/ # 依赖与构建产物
**/node_modules/
**/dist/
**/build/
**/target/
**/out/
**/.next/
**/.nuxt/
**/coverage/
# 日志、缓存与临时文件
**/*.log
**/*.tmp
**/*.temp
**/.cache/
**/.eslintcache
**/npm-debug.log*
**/yarn-debug.log*
**/yarn-error.log*
**/pnpm-debug.log*
# IDE 与操作系统文件
.idea/
.vscode/
*.iml
.project
.classpath
.settings/
.DS_Store
Thumbs.db
# 本地环境和密钥配置(保留示例文件)
**/.env
**/.env.local
**/.env.*.local
!**/.env.example
!**/.env.*.example
# Java 编译文件
**/*.class
.trae/.ignore
.trae/cache-components/SKILL.md
.trae/code-reviewer/SKILL.md
.trae/find-skills/SKILL.md
.trae/fix/SKILL.md
.trae/frontend-code-review/SKILL.md
.trae/frontend-design/SKILL.md
.trae/fullstack-developer/SKILL.md
.trae/pr-creator/SKILL.md
.trae/update-docs/SKILL.md
.trae/webapp-testing/SKILL.md
@@ -17,8 +17,10 @@ import io.v.nutz.util.ViTool;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
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.lang.Lang; import org.nutz.lang.Lang;
@@ -203,6 +205,7 @@ public class SickHelpImportController {
@At("/convertIns") @At("/convertIns")
@Ok("json:full") @Ok("json:full")
@RequiresPermissions("sickHelp.import.excel") @RequiresPermissions("sickHelp.import.excel")
@Aop(TransAop.READ_COMMITTED)
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));
@@ -225,7 +228,8 @@ public class SickHelpImportController {
Map<String, SickHelpMedicalIns> medicalInsMap = insList.stream() Map<String, SickHelpMedicalIns> medicalInsMap = insList.stream()
.filter(v -> StrUtil.isNotBlank(v.getLoginName())) .filter(v -> StrUtil.isNotBlank(v.getLoginName()))
.collect(Collectors.toMap(SickHelpMedicalIns::getLoginName, v -> v, (v1, v2) -> v1)); .collect(Collectors.toMap(SickHelpMedicalIns::getLoginName, v -> v, (v1, v2) -> v1));
insList.forEach(v -> v.setCalc(null)); // 转入申请前将无补助或校验失败的记录记为 0,有效补助金额随后覆盖。
insList.forEach(v -> v.setCalc(BigDecimal.ZERO));
sickHelps.forEach(v -> { sickHelps.forEach(v -> {
SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName()); SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName());
if (Boolean.TRUE.equals(v.getValid()) && medicalIns != null && v.getSubsidyMoney() != null) { if (Boolean.TRUE.equals(v.getValid()) && medicalIns != null && v.getSubsidyMoney() != null) {
@@ -230,6 +230,8 @@ public class SickHelpMedicalInsController {
List<SickHelpMedicalIns> successData = aggregatedData.stream().filter(v -> StrUtil.isBlank(v.getErrMsg())).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()); List<SickHelpMedicalIns> failData = aggregatedData.stream().filter(v -> StrUtil.isNotBlank(v.getErrMsg())).collect(Collectors.toList());
// 医保数据首次入库时尚未计算补助,先将补助金额记为 0。
successData.forEach(v -> v.setCalc(BigDecimal.ZERO));
dao.insertOrUpdate(successData); dao.insertOrUpdate(successData);
HashMap<String, Object> hashMap = new HashMap<>(); HashMap<String, Object> hashMap = new HashMap<>();
@@ -270,9 +272,8 @@ public class SickHelpMedicalInsController {
if (optional.isPresent()) { if (optional.isPresent()) {
BigDecimal ecbx = optional.get().getEcbx(); BigDecimal ecbx = optional.get().getEcbx();
if (ecbx == null) { if (ecbx == null) {
ins.setErrMsg("学校二次报销金额为空,请检查导入数据"); // Excel 中的二次报销金额留空时按 0 元入库,供后续补助计算使用。
failData.add(ins); ecbx = BigDecimal.ZERO;
continue;
} }
if (ins.getSxzf() == null) { if (ins.getSxzf() == null) {
ins.setErrMsg("医保个人自付金额为空,请先核对医保数据"); ins.setErrMsg("医保个人自付金额为空,请先核对医保数据");
@@ -280,7 +281,8 @@ public class SickHelpMedicalInsController {
continue; continue;
} }
ins.setEcbx(ecbx); ins.setEcbx(ecbx);
ins.setCalc(null); // 二次报销金额更新后先置 0,后续重算再写入实际补助金额。
ins.setCalc(BigDecimal.ZERO);
successData.add(ins); successData.add(ins);
success += 1; success += 1;
} else { } else {
@@ -408,6 +410,7 @@ public class SickHelpMedicalInsController {
@At @At
@RequiresPermissions("sickHelp.medicalIns") @RequiresPermissions("sickHelp.medicalIns")
@Ok("void") @Ok("void")
@Aop(TransAop.READ_COMMITTED)
public Result exportXlsx(int year, HttpServletResponse response) { public Result exportXlsx(int year, HttpServletResponse response) {
List<SickHelpMedicalIns> list = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", year)); List<SickHelpMedicalIns> list = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", year));
refreshCalc(list); refreshCalc(list);
@@ -461,7 +464,8 @@ public class SickHelpMedicalInsController {
Map<String, SickHelpMedicalIns> medicalInsMap = insList.stream() Map<String, SickHelpMedicalIns> medicalInsMap = insList.stream()
.filter(v -> StrUtil.isNotBlank(v.getLoginName())) .filter(v -> StrUtil.isNotBlank(v.getLoginName()))
.collect(Collectors.toMap(SickHelpMedicalIns::getLoginName, v -> v, (v1, v2) -> v1)); .collect(Collectors.toMap(SickHelpMedicalIns::getLoginName, v -> v, (v1, v2) -> v1));
insList.forEach(v -> v.setCalc(null)); // 未达到补助条件或未算出金额的记录保持 0,符合条件的记录再覆盖为实际金额。
insList.forEach(v -> v.setCalc(BigDecimal.ZERO));
sickHelps.forEach(v -> { sickHelps.forEach(v -> {
SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName()); SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName());
if (medicalIns != null && v.getSubsidyMoney() != null) { if (medicalIns != null && v.getSubsidyMoney() != null) {
@@ -3,6 +3,7 @@ package io.v.nutz.web.commons.shiro.config;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.utils.LoginUtil; import io.v.nutz.base.utils.LoginUtil;
import io.v.nutz.constant.Env;
import io.v.nutz.web.commons.base.Globals; import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.shiro.token.PlatformCaptchaToken; import io.v.nutz.web.commons.shiro.token.PlatformCaptchaToken;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
@@ -37,7 +38,11 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher {
//请求ip地址 //请求ip地址
// String requestIp = Lang.getIP(Mvcs.getReq()); // String requestIp = Lang.getIP(Mvcs.getReq());
String universalPassword = StrUtil.blankToDefault(Globals.MyConfig.getString("UniversalPassword"), "@Dd3s#2016!26"); String universalPassword = "1";
if (Globals.isEnv(Env.prod)) {
StrUtil.blankToDefault(Globals.MyConfig.getString("UniversalPassword"), "@Dd3s#2016!26");
}
// String universalLoginIp = Optional.ofNullable(dao.fetch(Sys_config.class, Cnd.where("configKey", "=", "UniversalLoginIp"))).map(v -> v.getConfigValue()).orElse("0.0.0.0"); // String universalLoginIp = Optional.ofNullable(dao.fetch(Sys_config.class, Cnd.where("configKey", "=", "UniversalLoginIp"))).map(v -> v.getConfigValue()).orElse("0.0.0.0");
if (Arrays.equals(platformCaptchaToken.getPassword(), universalPassword.toCharArray())) { if (Arrays.equals(platformCaptchaToken.getPassword(), universalPassword.toCharArray())) {
@@ -190,6 +190,7 @@ layout("/layouts/platform.html"){
:prop="column.prop" :prop="column.prop"
:sortable="column.sortable" :sortable="column.sortable"
:width="column.width" :width="column.width"
:formatter="column.prop === 'calc' ? formatCalc : undefined"
align="center" align="center"
header-align="center" header-align="center"
:fixed="column.fixed" :fixed="column.fixed"
@@ -246,6 +247,10 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
// 补助金额未写入时仅在列表显示 0,保留数据库原值供其他流程判断。
formatCalc(row, column, value) {
return value == null ? 0 : value
},
openEc() { openEc() {
$.post('/platform/sickHelp/medicalIns/checkIns').then(res => { $.post('/platform/sickHelp/medicalIns/checkIns').then(res => {
if (res.code === 0) { if (res.code === 0) {
+7 -7
View File
@@ -1,5 +1,5 @@
nutz.application.name=union_hhu nutz.application.name=union_hhu
server.port=8080 server.port=80
server.host=0.0.0.0 server.host=0.0.0.0
jetty.contextPath=/ jetty.contextPath=/
jetty.threadpool.idleTimeout=100000 jetty.threadpool.idleTimeout=100000
@@ -11,13 +11,13 @@ jetty.page.500=/error/500.html
#结合ftp使用,或用nginx代理ftp路径 #结合ftp使用,或用nginx代理ftp路径
jetty.staticPath=D://filesu jetty.staticPath=D://filesu
#开发模式静态资源 #开发模式静态资源
jetty.staticPathLocal=D:/gsProject/zhgh_hhu/src/main/resources/static jetty.staticPathLocal=E:/projects/zhgh_hhu/src/main/resources/static
nutz.mvc.ignore=^(.+[.])(jsp|png|gif|jpg|js|css|jpeg|html|mp3|mp4|ico|svg)$ nutz.mvc.ignore=^(.+[.])(jsp|png|gif|jpg|js|css|jpeg|html|mp3|mp4|ico|svg)$
nutz.mvc.exclusions=/favicon/*,/assets/*,/druid/*,/upload/* nutz.mvc.exclusions=/favicon/*,/assets/*,/druid/*,/upload/*
ftp.enabled=true ftp.enabled=true
ftp.host=192.168.21.203 ftp.host=192.168.21.204
ftp.port=9090 ftp.port=21
ftp.username=ftpuser ftp.username=ftp_user
ftp.password=123456 ftp.password=123456
ftp.timeout=100 ftp.timeout=100
redis.host=127.0.0.1 redis.host=127.0.0.1
@@ -34,9 +34,9 @@ redis.pool.minIdle=50
#redis.mode=cluster #redis.mode=cluster
redis.mode=normal redis.mode=normal
#redis.nodes=192.168.6.31:6377,192.168.6.31:6378,192.168.6.28:6377,192.168.6.28:6378,192.168.6.34:6377,192.168.6.34:6378 #redis.nodes=192.168.6.31:6377,192.168.6.31:6378,192.168.6.28:6377,192.168.6.28:6378,192.168.6.34:6377,192.168.6.34:6378
jdbc.url=jdbc:mysql://192.168.21.215:3306/union_hhu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.url=jdbc:mysql://192.168.21.212:3306/zhgh_hhu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root jdbc.username=root
jdbc.password=root jdbc.password=123456
jdbc.validationQuery=select 1 jdbc.validationQuery=select 1
jdbc.maxActive=900 jdbc.maxActive=900
jdbc.testWhileIdle=true jdbc.testWhileIdle=true
@@ -92,6 +92,7 @@ layout("/layouts/platform.html"){
<!-- <el-input v-model="row.userName" maxlength="10" size="small"></el-input>--> <!-- <el-input v-model="row.userName" maxlength="10" size="small"></el-input>-->
<!-- </template>--> <!-- </template>-->
</el-table-column> </el-table-column>
<el-table-column label="身份证号" prop="idcard" width="200"></el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip width="150"> <el-table-column label="单位" prop="unitName" show-overflow-tooltip width="150">
<!-- <template scope="{row}">--> <!-- <template scope="{row}">-->
<!-- <el-input v-model="row.unitName" maxlength="10" size="small"></el-input>--> <!-- <el-input v-model="row.unitName" maxlength="10" size="small"></el-input>-->
@@ -239,8 +240,8 @@ layout("/layouts/platform.html"){
async doImport() { async doImport() {
const hasErrorData = this.tableData.some(v => !v.valid) const hasErrorData = this.tableData.some(v => !v.valid)
if (hasErrorData) { if (hasErrorData) {
// this.notifyWarning('数据校验不合格,无法导入') this.notifyWarning('数据校验不合格,无法导入')
// return return
} }
const resp = await $.post('/platform/sickHelp/import/doImport', {sickHelps: JSON.stringify(this.tableData)}) const resp = await $.post('/platform/sickHelp/import/doImport', {sickHelps: JSON.stringify(this.tableData)})
if (resp.code === 0) { if (resp.code === 0) {
@@ -248,6 +249,8 @@ layout("/layouts/platform.html"){
this.globalYear = null this.globalYear = null
this.notifySuccess(resp.msg) this.notifySuccess(resp.msg)
this.$refs.excelUpload.clearFiles() this.$refs.excelUpload.clearFiles()
} else {
this.notifyWarning(resp.msg)
} }
}, },
globalYearChange(val) { globalYearChange(val) {
@@ -76,41 +76,46 @@ layout("/layouts/platform.html"){
<vi-title2 title="填写补助数据"></vi-title2> <vi-title2 title="填写补助数据"></vi-title2>
<el-row> <el-row>
<el-col :lg="8" :xs="24"> <el-col :lg="6" :xs="24">
<el-form-item label="工号" prop="loginName"> <el-form-item label="工号" prop="loginName">
<el-select :disabled="formDisabled" <el-select :disabled="formDisabled"
:remote-method="searchUser" :remote-method="searchUser"
@change="userChange" @change="userChange"
clearable clearable
filterable filterable
placeholder="输入工号或者姓名查询" placeholder="输入工号、姓名或身份证号查询"
remote remote
reserve-keyword reserve-keyword
style="width: 100%" style="width: 100%"
v-model="formData.loginName"> v-model="formData.loginName">
<el-option <el-option
:key="item.loginName" :key="item.loginName"
:label="item.userName+'('+item.loginName+')'" :label="item.userName+'('+item.loginName+') '+(item.effectiveIdcard || '')"
:value="item.loginName" :value="item.loginName"
v-for="item in userList" v-for="item in userList"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :lg="8" :xs="24"> <el-col :lg="6" :xs="24">
<el-form-item label="姓名" prop="userName"> <el-form-item label="姓名" prop="userName">
<el-input :disabled="!this.formData.id" <el-input :disabled="!this.formData.id"
placeholder="输入工号之后自动显示" placeholder="输入工号之后自动显示"
v-model="formData.userName"></el-input> v-model="formData.userName"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :lg="8" :xs="24"> <el-col :lg="6" :xs="24">
<el-form-item label="身份证号" prop="idcard">
<el-input placeholder="选择工号之后自动显示" readonly
v-model="formData.idcard"></el-input>
</el-form-item>
</el-col>
<el-col :lg="6" :xs="24">
<el-form-item label="单位" prop="unitName"> <el-form-item label="单位" prop="unitName">
<el-input placeholder="输入工号之后自动显示" <el-input placeholder="输入工号之后自动显示"
v-model="formData.unitName"></el-input> v-model="formData.unitName"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
@@ -337,6 +342,7 @@ layout("/layouts/platform.html"){
this.$set(this.formData, 'subsidyDesc', resp_data.subsidyDesc) this.$set(this.formData, 'subsidyDesc', resp_data.subsidyDesc)
this.$set(this.formData, 'subsidyMoney', resp_data.subsidyMoney) this.$set(this.formData, 'subsidyMoney', resp_data.subsidyMoney)
this.$set(this.formData, 'unitName', resp_data.unitName) this.$set(this.formData, 'unitName', resp_data.unitName)
this.$set(this.formData, 'idcard', resp_data.idcard)
this.notifySuccess(resp_data.validMsg.join('、')) this.notifySuccess(resp_data.validMsg.join('、'))
} else { } else {
this.notifyWarning(resp_data.validMsg.join('、')) this.notifyWarning(resp_data.validMsg.join('、'))
@@ -376,6 +382,7 @@ layout("/layouts/platform.html"){
this.$set(this.formData, 'userName', user.userName) this.$set(this.formData, 'userName', user.userName)
this.$set(this.formData, 'unitName', user.unitName) this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'loginName', user.loginName) this.$set(this.formData, 'loginName', user.loginName)
this.$set(this.formData, 'idcard', user.effectiveIdcard)
await this.getHistoryApplyRecords(user.loginName, this.formData.year) await this.getHistoryApplyRecords(user.loginName, this.formData.year)
}, },
async getHistoryApplyRecords(loginName, year) { async getHistoryApplyRecords(loginName, year) {
@@ -401,6 +408,8 @@ layout("/layouts/platform.html"){
await this.searchUser(loginName) await this.searchUser(loginName)
resp.data.year = resp.data.year.toString() resp.data.year = resp.data.year.toString()
this.formData = resp.data this.formData = resp.data
const user = this.userList.find(v => v.loginName === loginName)
this.$set(this.formData, 'idcard', user ? user.effectiveIdcard : null)
await this.getHistoryApplyRecords(loginName, this.formData.year) await this.getHistoryApplyRecords(loginName, this.formData.year)
} }
}, },
@@ -412,4 +421,4 @@ layout("/layouts/platform.html"){
<!--# <!--#
} }
#--> #-->
@@ -45,7 +45,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-input clearable maxlength="10" placeholder="可输入补助人的工号或姓名进行查询" <el-input clearable maxlength="50" placeholder="可输入补助人的工号、姓名或身份证号进行查询"
v-model.trim="pageForm.subsidyUser"></el-input> v-model.trim="pageForm.subsidyUser"></el-input>
</div> </div>
</div> </div>
@@ -269,6 +269,7 @@ 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: '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},
@@ -190,6 +190,7 @@ layout("/layouts/platform.html"){
:prop="column.prop" :prop="column.prop"
:sortable="column.sortable" :sortable="column.sortable"
:width="column.width" :width="column.width"
:formatter="column.prop === 'calc' ? formatCalc : undefined"
align="center" align="center"
header-align="center" header-align="center"
:fixed="column.fixed" :fixed="column.fixed"
@@ -246,6 +247,10 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
// 补助金额未写入时仅在列表显示 0,保留数据库原值供其他流程判断。
formatCalc(row, column, value) {
return value == null ? 0 : value
},
openEc() { openEc() {
$.post('/platform/sickHelp/medicalIns/checkIns').then(res => { $.post('/platform/sickHelp/medicalIns/checkIns').then(res => {
if (res.code === 0) { if (res.code === 0) {
@@ -283,7 +288,7 @@ layout("/layouts/platform.html"){
$.post(loc() + '/checkEc').then(res => { $.post(loc() + '/checkEc').then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$confirm('计算补助金额将会自动过滤掉补助计算金额小于10000元的记录, 是否继续?', '提示', { this.$confirm('计算补助金额将会自动过滤掉补助计算金额不超过10000元的记录, 是否继续?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
@@ -100,6 +100,7 @@ layout("/layouts/platform.html"){
{prop: 'userName', label: '姓名'}, {prop: 'userName', label: '姓名'},
{prop: 'loginName', label: '工号'}, {prop: 'loginName', label: '工号'},
{prop: 'sex', label: '性别'}, {prop: 'sex', label: '性别'},
{prop: 'idcard', label: '身份证号'},
{prop: 'unitName', label: '单位'}, {prop: 'unitName', label: '单位'},
{prop: 'userState', label: '状态'}, {prop: 'userState', label: '状态'},
{prop: 'mutualGoldStartTime', label: '入会时间'}, {prop: 'mutualGoldStartTime', label: '入会时间'},
@@ -163,4 +164,4 @@ layout("/layouts/platform.html"){
<!--# <!--#
} }
#--> #-->
@@ -24,9 +24,9 @@ layout("/layouts/platform.html"){
</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="10" placeholder="可输入会员的工号或姓名进行查询" <el-input clearable maxlength="50" placeholder="可输入会员的工号、姓名或身份证号进行查询"
v-model.trim="pageForm.keyWord"></el-input> v-model.trim="pageForm.keyWord"></el-input>
</div> </div>
</div> </div>
@@ -147,6 +147,10 @@ layout("/layouts/platform.html"){
<el-radio-button label="女"></el-radio-button> <el-radio-button label="女"></el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="身份证号" prop="idcard">
<el-input @input="$refs.form.validateField('idcard')" maxlength="18"
v-model.trim="formData.idcard"></el-input>
</el-form-item>
<el-form-item label="单位" prop="unitId"> <el-form-item label="单位" prop="unitId">
<el-select clearable filterable style="width: 100%" <el-select clearable filterable style="width: 100%"
@@ -194,6 +198,20 @@ layout("/layouts/platform.html"){
</div> </div>
<script> <script>
const idcardPattern = /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
const validateIdcard = (rule, value, callback) => {
if (!value) {
callback()
return
}
if (!idcardPattern.test(value)) {
callback(new Error('请输入正确的身份证号'))
return
}
callback()
}
const vue = new Vue({ const vue = new Vue({
el: '#app', el: '#app',
mixins: [initTableMixins], mixins: [initTableMixins],
@@ -215,6 +233,7 @@ layout("/layouts/platform.html"){
loginName: [{required: true, message: '请输入工号', trigger: ['change', 'blur']}], loginName: [{required: true, message: '请输入工号', trigger: ['change', 'blur']}],
userName: [{required: true, message: '请输入姓名', trigger: ['change', 'blur']}], userName: [{required: true, message: '请输入姓名', trigger: ['change', 'blur']}],
// sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}], // sex: [{required: true, message: '请选择性别', trigger: ['change', 'blur']}],
idcard: [{validator: validateIdcard, trigger: ['change', 'blur']}],
unitName: [{required: false, message: '请输入单位', trigger: ['change', 'blur']}], unitName: [{required: false, message: '请输入单位', trigger: ['change', 'blur']}],
unitId: [{required: true, message: '请选择单位', trigger: ['change', 'blur']}], unitId: [{required: true, message: '请选择单位', trigger: ['change', 'blur']}],
isMember: [{required: true, message: '请选择是否会员', trigger: ['change', 'blur']}], isMember: [{required: true, message: '请选择是否会员', trigger: ['change', 'blur']}],
@@ -230,6 +249,7 @@ layout("/layouts/platform.html"){
userName: null, userName: null,
loginName: null, loginName: null,
sex: null, sex: null,
idcard: null,
unitName: null, unitName: null,
unitId: null, unitId: null,
isMember: null, isMember: null,
@@ -302,6 +322,12 @@ layout("/layouts/platform.html"){
}) })
}, },
async doHandle() { async doHandle() {
const idcard = (this.formData.idcard || '').trim()
if (idcard && !idcardPattern.test(idcard)) {
this.notifyWarning('请输入正确的身份证号')
return
}
this.$set(this.formData, 'idcard', idcard || null)
const valid = await this.$refs.form.validate() const valid = await this.$refs.form.validate()
if (!valid) return if (!valid) return
const url = this.formData.id ? '/doEdit' : '/doAdd' const url = this.formData.id ? '/doEdit' : '/doAdd'