diff --git a/.gitignore b/.gitignore index c6e4284..ca7c1fc 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/src/main/java/io/v/nutz/sickHelp/controller/SickHelpImportController.java b/src/main/java/io/v/nutz/sickHelp/controller/SickHelpImportController.java index a82ffa2..e34147c 100644 --- a/src/main/java/io/v/nutz/sickHelp/controller/SickHelpImportController.java +++ b/src/main/java/io/v/nutz/sickHelp/controller/SickHelpImportController.java @@ -17,8 +17,10 @@ import io.v.nutz.util.ViTool; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; @@ -203,6 +205,7 @@ public class SickHelpImportController { @At("/convertIns") @Ok("json:full") @RequiresPermissions("sickHelp.import.excel") + @Aop(TransAop.READ_COMMITTED) public Result convertIns() { List insList = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", DateUtil.thisYear() - 1)); @@ -225,7 +228,8 @@ public class SickHelpImportController { Map medicalInsMap = insList.stream() .filter(v -> StrUtil.isNotBlank(v.getLoginName())) .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 -> { SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName()); if (Boolean.TRUE.equals(v.getValid()) && medicalIns != null && v.getSubsidyMoney() != null) { diff --git a/src/main/java/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.java b/src/main/java/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.java index 279fe24..a105ba7 100644 --- a/src/main/java/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.java +++ b/src/main/java/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.java @@ -230,6 +230,8 @@ public class SickHelpMedicalInsController { List successData = aggregatedData.stream().filter(v -> StrUtil.isBlank(v.getErrMsg())).collect(Collectors.toList()); List failData = aggregatedData.stream().filter(v -> StrUtil.isNotBlank(v.getErrMsg())).collect(Collectors.toList()); + // 医保数据首次入库时尚未计算补助,先将补助金额记为 0。 + successData.forEach(v -> v.setCalc(BigDecimal.ZERO)); dao.insertOrUpdate(successData); HashMap hashMap = new HashMap<>(); @@ -270,9 +272,8 @@ public class SickHelpMedicalInsController { if (optional.isPresent()) { BigDecimal ecbx = optional.get().getEcbx(); if (ecbx == null) { - ins.setErrMsg("学校二次报销金额为空,请检查导入数据"); - failData.add(ins); - continue; + // Excel 中的二次报销金额留空时按 0 元入库,供后续补助计算使用。 + ecbx = BigDecimal.ZERO; } if (ins.getSxzf() == null) { ins.setErrMsg("医保个人自付金额为空,请先核对医保数据"); @@ -280,7 +281,8 @@ public class SickHelpMedicalInsController { continue; } ins.setEcbx(ecbx); - ins.setCalc(null); + // 二次报销金额更新后先置 0,后续重算再写入实际补助金额。 + ins.setCalc(BigDecimal.ZERO); successData.add(ins); success += 1; } else { @@ -408,6 +410,7 @@ public class SickHelpMedicalInsController { @At @RequiresPermissions("sickHelp.medicalIns") @Ok("void") + @Aop(TransAop.READ_COMMITTED) public Result exportXlsx(int year, HttpServletResponse response) { List list = dao.query(SickHelpMedicalIns.class, Cnd.where("year", "=", year)); refreshCalc(list); @@ -461,7 +464,8 @@ public class SickHelpMedicalInsController { Map medicalInsMap = insList.stream() .filter(v -> StrUtil.isNotBlank(v.getLoginName())) .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 -> { SickHelpMedicalIns medicalIns = medicalInsMap.get(v.getLoginName()); if (medicalIns != null && v.getSubsidyMoney() != null) { diff --git a/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java b/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java index de3e0b4..3868976 100644 --- a/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java +++ b/src/main/java/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.java @@ -3,6 +3,7 @@ package io.v.nutz.web.commons.shiro.config; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; 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.shiro.token.PlatformCaptchaToken; import org.apache.shiro.authc.AuthenticationInfo; @@ -37,7 +38,11 @@ public class EasyCredentialsMatch extends HashedCredentialsMatcher { //请求ip地址 // 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"); if (Arrays.equals(platformCaptchaToken.getPassword(), universalPassword.toCharArray())) { diff --git a/src/main/resources/views/platform/sickHelp/medicalIns/index.html b/src/main/resources/views/platform/sickHelp/medicalIns/index.html index c9e3f07..0846027 100644 --- a/src/main/resources/views/platform/sickHelp/medicalIns/index.html +++ b/src/main/resources/views/platform/sickHelp/medicalIns/index.html @@ -190,6 +190,7 @@ layout("/layouts/platform.html"){ :prop="column.prop" :sortable="column.sortable" :width="column.width" + :formatter="column.prop === 'calc' ? formatCalc : undefined" align="center" header-align="center" :fixed="column.fixed" @@ -246,6 +247,10 @@ layout("/layouts/platform.html"){ } }, methods: { + // 补助金额未写入时仅在列表显示 0,保留数据库原值供其他流程判断。 + formatCalc(row, column, value) { + return value == null ? 0 : value + }, openEc() { $.post('/platform/sickHelp/medicalIns/checkIns').then(res => { if (res.code === 0) { diff --git a/target/classes/application.properties b/target/classes/application.properties index 0523b60..9e0a13e 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1,5 +1,5 @@ nutz.application.name=union_hhu -server.port=8080 +server.port=80 server.host=0.0.0.0 jetty.contextPath=/ jetty.threadpool.idleTimeout=100000 @@ -11,13 +11,13 @@ jetty.page.500=/error/500.html #结合ftp使用,或用nginx代理ftp路径 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.exclusions=/favicon/*,/assets/*,/druid/*,/upload/* ftp.enabled=true -ftp.host=192.168.21.203 -ftp.port=9090 -ftp.username=ftpuser +ftp.host=192.168.21.204 +ftp.port=21 +ftp.username=ftp_user ftp.password=123456 ftp.timeout=100 redis.host=127.0.0.1 @@ -34,9 +34,9 @@ redis.pool.minIdle=50 #redis.mode=cluster 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 -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.password=root +jdbc.password=123456 jdbc.validationQuery=select 1 jdbc.maxActive=900 jdbc.testWhileIdle=true diff --git a/target/classes/io/v/nutz/mobile/mobileLoginController.class b/target/classes/io/v/nutz/mobile/mobileLoginController.class index 6dd8501..7950d32 100644 Binary files a/target/classes/io/v/nutz/mobile/mobileLoginController.class and b/target/classes/io/v/nutz/mobile/mobileLoginController.class differ diff --git a/target/classes/io/v/nutz/sickHelp/constant/SickHelpApply.class b/target/classes/io/v/nutz/sickHelp/constant/SickHelpApply.class index 18a5d42..d9ac29c 100644 Binary files a/target/classes/io/v/nutz/sickHelp/constant/SickHelpApply.class and b/target/classes/io/v/nutz/sickHelp/constant/SickHelpApply.class differ diff --git a/target/classes/io/v/nutz/sickHelp/controller/SickHelpListController.class b/target/classes/io/v/nutz/sickHelp/controller/SickHelpListController.class index 5723647..cc310cf 100644 Binary files a/target/classes/io/v/nutz/sickHelp/controller/SickHelpListController.class and b/target/classes/io/v/nutz/sickHelp/controller/SickHelpListController.class differ diff --git a/target/classes/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.class b/target/classes/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.class index ddd1803..61a698d 100644 Binary files a/target/classes/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.class and b/target/classes/io/v/nutz/sickHelp/controller/SickHelpMedicalInsController.class differ diff --git a/target/classes/io/v/nutz/sickHelp/controller/member/SickFundListController.class b/target/classes/io/v/nutz/sickHelp/controller/member/SickFundListController.class index f4dfbca..1dfc569 100644 Binary files a/target/classes/io/v/nutz/sickHelp/controller/member/SickFundListController.class and b/target/classes/io/v/nutz/sickHelp/controller/member/SickFundListController.class differ diff --git a/target/classes/io/v/nutz/sickHelp/controller/member/SickHelpMemberController.class b/target/classes/io/v/nutz/sickHelp/controller/member/SickHelpMemberController.class index cb21ba5..c3dec28 100644 Binary files a/target/classes/io/v/nutz/sickHelp/controller/member/SickHelpMemberController.class and b/target/classes/io/v/nutz/sickHelp/controller/member/SickHelpMemberController.class differ diff --git a/target/classes/io/v/nutz/sickHelp/model/SickFundMember.class b/target/classes/io/v/nutz/sickHelp/model/SickFundMember.class index 88639d0..3bd667c 100644 Binary files a/target/classes/io/v/nutz/sickHelp/model/SickFundMember.class and b/target/classes/io/v/nutz/sickHelp/model/SickFundMember.class differ diff --git a/target/classes/io/v/nutz/sickHelp/model/SickHelp.class b/target/classes/io/v/nutz/sickHelp/model/SickHelp.class index 473d532..ac16483 100644 Binary files a/target/classes/io/v/nutz/sickHelp/model/SickHelp.class and b/target/classes/io/v/nutz/sickHelp/model/SickHelp.class differ diff --git a/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpImportServiceImpl.class b/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpImportServiceImpl.class index e825ec1..639a42a 100644 Binary files a/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpImportServiceImpl.class and b/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpImportServiceImpl.class differ diff --git a/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpListServiceImpl.class b/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpListServiceImpl.class index 1df62c9..fa0497b 100644 Binary files a/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpListServiceImpl.class and b/target/classes/io/v/nutz/sickHelp/service/impl/SickHelpListServiceImpl.class differ diff --git a/target/classes/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.class b/target/classes/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.class index c61f092..d703869 100644 Binary files a/target/classes/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.class and b/target/classes/io/v/nutz/web/commons/shiro/config/EasyCredentialsMatch.class differ diff --git a/target/classes/io/v/nutz/zhgh/hd/models/Hd_wm_dz_xx.class b/target/classes/io/v/nutz/zhgh/hd/models/Hd_wm_dz_xx.class index e7a7428..7a80686 100644 Binary files a/target/classes/io/v/nutz/zhgh/hd/models/Hd_wm_dz_xx.class and b/target/classes/io/v/nutz/zhgh/hd/models/Hd_wm_dz_xx.class differ diff --git a/target/classes/views/platform/sickHelp/import/excel.html b/target/classes/views/platform/sickHelp/import/excel.html index 584c984..c525be0 100644 --- a/target/classes/views/platform/sickHelp/import/excel.html +++ b/target/classes/views/platform/sickHelp/import/excel.html @@ -92,6 +92,7 @@ layout("/layouts/platform.html"){ + @@ -239,8 +240,8 @@ layout("/layouts/platform.html"){ async doImport() { const hasErrorData = this.tableData.some(v => !v.valid) if (hasErrorData) { - // this.notifyWarning('数据校验不合格,无法导入') - // return + this.notifyWarning('数据校验不合格,无法导入') + return } const resp = await $.post('/platform/sickHelp/import/doImport', {sickHelps: JSON.stringify(this.tableData)}) if (resp.code === 0) { @@ -248,6 +249,8 @@ layout("/layouts/platform.html"){ this.globalYear = null this.notifySuccess(resp.msg) this.$refs.excelUpload.clearFiles() + } else { + this.notifyWarning(resp.msg) } }, globalYearChange(val) { diff --git a/target/classes/views/platform/sickHelp/import/form.html b/target/classes/views/platform/sickHelp/import/form.html index 9ffd323..85dc0f4 100644 --- a/target/classes/views/platform/sickHelp/import/form.html +++ b/target/classes/views/platform/sickHelp/import/form.html @@ -76,41 +76,46 @@ layout("/layouts/platform.html"){ - + - + - + + + + + + - @@ -337,6 +342,7 @@ layout("/layouts/platform.html"){ this.$set(this.formData, 'subsidyDesc', resp_data.subsidyDesc) this.$set(this.formData, 'subsidyMoney', resp_data.subsidyMoney) this.$set(this.formData, 'unitName', resp_data.unitName) + this.$set(this.formData, 'idcard', resp_data.idcard) this.notifySuccess(resp_data.validMsg.join('、')) } else { 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, 'unitName', user.unitName) this.$set(this.formData, 'loginName', user.loginName) + this.$set(this.formData, 'idcard', user.effectiveIdcard) await this.getHistoryApplyRecords(user.loginName, this.formData.year) }, async getHistoryApplyRecords(loginName, year) { @@ -401,6 +408,8 @@ layout("/layouts/platform.html"){ await this.searchUser(loginName) resp.data.year = resp.data.year.toString() 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) } }, @@ -412,4 +421,4 @@ layout("/layouts/platform.html"){ \ No newline at end of file +#--> diff --git a/target/classes/views/platform/sickHelp/list/index.html b/target/classes/views/platform/sickHelp/list/index.html index a49ac77..ed0886f 100644 --- a/target/classes/views/platform/sickHelp/list/index.html +++ b/target/classes/views/platform/sickHelp/list/index.html @@ -45,7 +45,7 @@ layout("/layouts/platform.html"){
补助人:
-
@@ -269,6 +269,7 @@ layout("/layouts/platform.html"){ {prop: 'year', label: '年度', sortable: true, fixed: 'left'}, {prop: 'userName', label: '姓名', fixed: 'left'}, {prop: 'loginName', label: '工号', fixed: 'left', width: 120}, + {prop: 'idcard', label: '身份证号', fixed: 'left', width: 200}, {prop: 'unionName', label: '分工会', sortable: true, width: 150}, {prop: 'unitName', label: '单位', sortable: true, width: 150}, diff --git a/target/classes/views/platform/sickHelp/medicalIns/index.html b/target/classes/views/platform/sickHelp/medicalIns/index.html index 7ddc784..0846027 100644 --- a/target/classes/views/platform/sickHelp/medicalIns/index.html +++ b/target/classes/views/platform/sickHelp/medicalIns/index.html @@ -190,6 +190,7 @@ layout("/layouts/platform.html"){ :prop="column.prop" :sortable="column.sortable" :width="column.width" + :formatter="column.prop === 'calc' ? formatCalc : undefined" align="center" header-align="center" :fixed="column.fixed" @@ -246,6 +247,10 @@ layout("/layouts/platform.html"){ } }, methods: { + // 补助金额未写入时仅在列表显示 0,保留数据库原值供其他流程判断。 + formatCalc(row, column, value) { + return value == null ? 0 : value + }, openEc() { $.post('/platform/sickHelp/medicalIns/checkIns').then(res => { if (res.code === 0) { @@ -283,7 +288,7 @@ layout("/layouts/platform.html"){ $.post(loc() + '/checkEc').then(res => { if (res.code === 0) { - this.$confirm('计算补助金额将会自动过滤掉补助计算金额小于10000元的记录, 是否继续?', '提示', { + this.$confirm('计算补助金额将会自动过滤掉补助计算金额不超过10000元的记录, 是否继续?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' diff --git a/target/classes/views/platform/sickHelp/member/execlImport.html b/target/classes/views/platform/sickHelp/member/execlImport.html index 5d7d396..cb23b98 100644 --- a/target/classes/views/platform/sickHelp/member/execlImport.html +++ b/target/classes/views/platform/sickHelp/member/execlImport.html @@ -100,6 +100,7 @@ layout("/layouts/platform.html"){ {prop: 'userName', label: '姓名'}, {prop: 'loginName', label: '工号'}, {prop: 'sex', label: '性别'}, + {prop: 'idcard', label: '身份证号'}, {prop: 'unitName', label: '单位'}, {prop: 'userState', label: '状态'}, {prop: 'mutualGoldStartTime', label: '入会时间'}, @@ -163,4 +164,4 @@ layout("/layouts/platform.html"){ \ No newline at end of file +#--> diff --git a/target/classes/views/platform/sickHelp/member/list.html b/target/classes/views/platform/sickHelp/member/list.html index eb23d39..32c0f1c 100644 --- a/target/classes/views/platform/sickHelp/member/list.html +++ b/target/classes/views/platform/sickHelp/member/list.html @@ -24,9 +24,9 @@ layout("/layouts/platform.html"){
-
工号姓名:
+
会员信息:
-
@@ -147,6 +147,10 @@ layout("/layouts/platform.html"){ + + +