diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundChangeRecordController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundChangeRecordController.java index ce54435a..3c3e9e86 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundChangeRecordController.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundChangeRecordController.java @@ -1,24 +1,18 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.param.AidFundPageForm; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.service.AidFundMemberChangeRecordService; -import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.service.AidFundMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.ioc.TransAop; -import org.nutz.dao.Cnd; -import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -26,6 +20,8 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; +import javax.servlet.http.HttpServletResponse; + /** * @author zhf * @date 2026/1/19 17:55 @@ -52,73 +48,36 @@ public class AidFundChangeRecordController { } + /** + * 按页面条件分页返回基金会员变更记录。 + * + * @param pageForm 年度、姓名/工号、会员类型、变更类型、工会、单位、排序及页码/每页条数 + * @return Result.data 为 Pagination,list 为当前页记录,totalCount 为匹配总条数 + */ @At @ApiOperation("分页查询") @SaCheckPermission("medicalMutualAid.aidFund.changeRecord") public Result pageData(AidFundPageForm pageForm) { - Sql sql = Sqls.create(""" - SELECT - info.*, - us.sex, - us.username, - us.loginname, - us.arrivalAtSchoolDate, - us.mobile, - us.unitName, - us.unionName, - ins.id AS instanceId, - ins.businessNo, - ins.state instanceState, - ins.variable instanceVariable, - ins.processDefineId instanceProcessDefineId, - t.id taskId, - t.taskName AS taskKey, - t.displayName taskName, - t.taskType, - t.performType taskPerformType, - t.taskState, - t.finishTime, - t.taskParentId, - t.variable taskVariable, - IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, - (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId - FROM - `aid_fund_member_change_record` info - LEFT JOIN vw_user us ON us.id = info.userId - LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 - LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id - $condition - """); - Cnd cnd = Cnd.NEW(); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.or("us.loginname", "like", "%" + pageForm.getSearchKeyword() + "%"); - seg.or("us.username", "like", "%" + pageForm.getSearchKeyword() + "%"); - cnd.and(seg); - } - cnd.andEX("IFNULL(info.aidFundMemberUserType, us.aidFundMemberUserType)", "=", pageForm.getAidFundMemberUserType()); - cnd.andEX("us.unitid", "=", pageForm.getUnitId()); - cnd.andEX("us.unionid", "=", pageForm.getUnionId()); - cnd.andEX("info.changeType", "=", pageForm.getChangeType()); - cnd.andEX("YEAR(info.applyTime)", "=", pageForm.getYear()); - - SqlExpressionGroup group = new SqlExpressionGroup(); - group.or("ins.state","=",20); - group.or("ins.state","is",null); - cnd.and(group); - if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { - cnd.desc("us.unitCode"); - } else { - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } - cnd.groupBy("info.id"); - sql.setCondition(cnd); + Sql sql = changeRecordService.getChangeRecordSql(pageForm); Pagination pagination = changeRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success(pagination); } + /** + * 导出页面筛选条件下的全部基金会员变更记录。 + * + * @param pageForm 年度、姓名/工号、会员类型、变更类型、工会、单位及排序参数;忽略分页参数 + * @param response 输出包含页面业务列的 XLSX 文件流,无 JSON 返回值 + */ + @At + @Ok("void") + @ApiOperation("导出变更记录") + @SaCheckPermission("medicalMutualAid.aidFund.changeRecord") + public void exportChangeRecord(AidFundPageForm pageForm, HttpServletResponse response) { + changeRecordService.exportChangeRecord(pageForm, response); + } + /** * 删除基金会员变更记录。 * diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberChangeRecordService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberChangeRecordService.java index eb1160ce..db13868f 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberChangeRecordService.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberChangeRecordService.java @@ -7,10 +7,27 @@ import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.model.AidFundMem import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.model.AidFundMemberPay; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.util.List; public interface AidFundMemberChangeRecordService extends BaseService { + /** + * 构建变更记录列表与导出共用的查询 SQL。 + * + * @param pageForm 年度、姓名/工号、会员类型、变更类型、工会、单位及排序参数;空筛选项不限制 + * @return 未设置分页的 SQL,包含申请、人员和 WF 流程字段 + */ + Sql getChangeRecordSql(AidFundPageForm pageForm); + + /** + * 导出当前筛选条件下的全部变更记录,列顺序与页面业务列一致。 + * + * @param pageForm 与列表相同的筛选和排序参数;页码、每页条数不参与导出限制 + * @param response XLSX 文件流的 HTTP 响应,无 JSON 返回值 + */ + void exportChangeRecord(AidFundPageForm pageForm, HttpServletResponse response); + /** * 构建互管会审核页面查询 SQL。 * diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberChangeRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberChangeRecordServiceImpl.java index f34337a8..07332817 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberChangeRecordServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberChangeRecordServiceImpl.java @@ -1,5 +1,9 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; @@ -8,6 +12,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.entity.ProcessInstance; @@ -24,6 +29,7 @@ import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.model.AidFundMem import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.model.AidFundMemberPay; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.param.AidFundPageForm; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.service.AidFundMemberChangeRecordService; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; @@ -38,6 +44,7 @@ import org.nutz.json.Json; import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.util.*; /** @@ -64,6 +71,119 @@ public class AidFundMemberChangeRecordServiceImpl extends BaseServiceImpl list = listMap(getChangeRecordSql(pageForm)); + Map memberTypeMap = getDictNameMap("AIDFUND_MEMBER_USER_TYPE"); + Map changeTypeMap = getDictNameMap("AIDFUND_MEMBER_CHANGE_TYPE"); + for (int index = 0; index < list.size(); index++) { + NutMap row = list.get(index); + row.put("sequence", index + 1); + String memberType = row.getString("aidFundMemberUserType"); + String changeType = row.getString("changeType"); + // 空值保持空白,未配置的字典编码保留原值,避免导出时丢失业务信息。 + row.put("aidFundMemberUserType", memberTypeMap.getOrDefault(memberType, memberType)); + row.put("changeType", changeTypeMap.getOrDefault(changeType, changeType)); + row.put("applyTime", row.getTime("applyTime") == null ? "" : DateUtil.formatDate(row.getTime("applyTime"))); + } + + List columns = new ArrayList<>(); + ExcelExportEntity sequence = new ExcelExportEntity("序号", "sequence", 10); + sequence.setType(10); + columns.add(sequence); + // 工号使用文本单元格,保留前导零;其余业务列与页面显示顺序一致。 + columns.add(new ExcelExportEntity("工号", "loginname", 20)); + columns.add(new ExcelExportEntity("姓名", "username", 20)); + columns.add(new ExcelExportEntity("性别", "sex", 10)); + columns.add(new ExcelExportEntity("入校时间", "arrivalAtSchoolDate", 20)); + columns.add(new ExcelExportEntity("所属单位", "unitName", 25)); + columns.add(new ExcelExportEntity("所属工会", "unionName", 25)); + columns.add(new ExcelExportEntity("基金会员类型", "aidFundMemberUserType", 20)); + columns.add(new ExcelExportEntity("变更类型", "changeType", 20)); + columns.add(new ExcelExportEntity("变更时间", "applyTime", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, columns, list); + String fileName = (pageForm.getYear() == null ? "" : pageForm.getYear()) + "基金会员变更记录.xlsx"; + CommonDownloadUtil.download(fileName, workbook, response); + } + @Override public Sql getFoundationAuditSql(AidFundPageForm pageForm) { Sql sql = Sqls.create(""" diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalCalculateMoneyController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalCalculateMoneyController.java index 909c53f3..5dc44f46 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalCalculateMoneyController.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalCalculateMoneyController.java @@ -1,20 +1,14 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.controller; -import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.ExportParams; -import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; -import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalApply; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalMoneyDetail; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.MedicalCalculateMoneyService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Workbook; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; @@ -28,11 +22,11 @@ import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -97,12 +91,28 @@ public class MedicalCalculateMoneyController { } + /** + * 按页面测算结果分配补助,并保存该年度结余。 + * 爱心金额显式按参数名绑定,避免 Nutz 将 BigDecimal 当作对象解析其内部字段。 + * + * @param data 申请记录的 JSON 数组,包含申请 id 和最终测算金额 forecastSubsidyMoney + * @param ratio 页面当前补助比例,单位为百分比 + * @param aidFund 本年度会员缴费总额,单位为元 + * @param inComeSum 本年度收入累计总额,单位为元 + * @param loveSubsidyMoney 实际爱心补助合计,单位为元,支持小数;未传时按零处理 + * @return Result 操作结果,code 为 0 表示补助金额与年度结余保存成功 + */ @At @ApiOperation("按比例修改补助金额") @Aop(TransAop.READ_COMMITTED) @SLog(tag = "医疗补助系统-医疗补助预测", msg = "按比例修改补助金额") @SaCheckPermission("medicalMutualAid.medical.calculateMoney") - public Result doHandle(String data, float ratio, double aidFund, double inComeSum, long loveSubsidyMoney){ + public Result doHandle(String data, float ratio, double aidFund, double inComeSum, + @Param("loveSubsidyMoney") BigDecimal loveSubsidyMoney){ + // 延续原整数参数未传时按零处理的行为,同时保留实际爱心补助的小数精度。 + if (loveSubsidyMoney == null) { + loveSubsidyMoney = BigDecimal.ZERO; + } //获取申请最新年份 Sql yearSql = Sqls.create("SELECT MAX(YEAR(applyTime)) AS currentYear FROM medical_apply"); yearSql.setCallback(Sqls.callback.longs()); @@ -122,7 +132,7 @@ public class MedicalCalculateMoneyController { BigDecimal incomeRounded = BigDecimal.valueOf(Math.round(inComeSum)); BigDecimal thisYearBalance = incomeRounded .subtract(subsidyMoney) - .subtract(BigDecimal.valueOf(loveSubsidyMoney)); + .subtract(loveSubsidyMoney); MedicalMoneyDetail moneyDetail = medicalCalculateMoneyService.dao().fetch(MedicalMoneyDetail.class, Cnd.where("year", "=", year)); @@ -143,70 +153,17 @@ public class MedicalCalculateMoneyController { } + /** + * 导出当前比例的测算结果;返回类型为 void,Excel 文件写入 response。 + * + * @param ratio 页面当前补助比例,单位为百分比 + * @param response 接收 Excel 下载内容的 HTTP 响应 + */ @At @Ok("void") @SaCheckPermission("medicalMutualAid.medical.calculateMoney") public void doExport(double ratio, HttpServletResponse response){ - List list = medicalCalculateMoneyService.getApplyData(ratio); - - list.forEach(l -> { - l.put("majorDisease", l.getBoolean("isMajorDisease") ? "是" : "否"); - }); - List exportEntities = new ArrayList<>(); - exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); - exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); - exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 20)); - exportEntities.add(new ExcelExportEntity("所属分工会", "unionName", 20)); - exportEntities.add(new ExcelExportEntity("疾病种类", "diseaseName", 20)); - exportEntities.add(new ExcelExportEntity("重大疾病", "majorDisease", 20)); - exportEntities.add(new ExcelExportEntity("申请时间", "applyTime", 20)); - exportEntities.add(new ExcelExportEntity("申请次数", "applyNum", 20)); - - exportEntities.add(new ExcelExportEntity("起扣时间", "aidFundDeductTime", 20)); - exportEntities.add(new ExcelExportEntity("缴费年数", "yearsSinceDeduct", 20)); - ExcelExportEntity hospitalSumMoneyExcelExportEntity = new ExcelExportEntity("住院医疗总额(不含门诊)", "hospitalSumMoney$", 20); - hospitalSumMoneyExcelExportEntity.setType(10); - exportEntities.add(hospitalSumMoneyExcelExportEntity); - ExcelExportEntity reimbursementMoneyExcelExportEntity = new ExcelExportEntity("实际报销总额", "reimbursementMoney$", 20); - reimbursementMoneyExcelExportEntity.setType(10); - exportEntities.add(reimbursementMoneyExcelExportEntity); - ExcelExportEntity singleBearMoneyExcelExportEntity = new ExcelExportEntity("(住院医疗)允许报销范围内个人承担部分总额", "singleBearMoney$", 20); - singleBearMoneyExcelExportEntity.setType(10); - exportEntities.add(singleBearMoneyExcelExportEntity); - ExcelExportEntity personExpenseMoneyExcelExportEntity = new ExcelExportEntity("(住院医疗)自费部分总额", "personExpenseMoney$", 20); - personExpenseMoneyExcelExportEntity.setType(10); - exportEntities.add(personExpenseMoneyExcelExportEntity); - ExcelExportEntity outpatientServiceMoneyExcelExportEntity = new ExcelExportEntity("重病门诊自费金额", "outpatientServiceMoney$", 20); - outpatientServiceMoneyExcelExportEntity.setType(10); - exportEntities.add(outpatientServiceMoneyExcelExportEntity); - ExcelExportEntity bxyMoneyExcelExportEntity = new ExcelExportEntity("非住院肾衰竭治疗、靶向药", "bxyMoney$", 20); - bxyMoneyExcelExportEntity.setType(10); - exportEntities.add(bxyMoneyExcelExportEntity); - ExcelExportEntity totalMoneyExcelExportEntity = new ExcelExportEntity("合计金额", "totalMoney", 20); - totalMoneyExcelExportEntity.setType(10); - exportEntities.add(totalMoneyExcelExportEntity); - ExcelExportEntity loveSubsidyMoneyExcelExportEntity = new ExcelExportEntity("爱心补助", "loveSubsidyMoney", 20); - loveSubsidyMoneyExcelExportEntity.setType(10); - exportEntities.add(loveSubsidyMoneyExcelExportEntity); - ExcelExportEntity subsidyMoneyExcelExportEntity = new ExcelExportEntity("当前补助金额", "subsidyMoney", 20); - subsidyMoneyExcelExportEntity.setType(10); - exportEntities.add(subsidyMoneyExcelExportEntity); - ExcelExportEntity ExcelExportEntityForecastSubsidyMoney = new ExcelExportEntity("按" + ratio + "%补助金额", "forecastSubsidyMoney", 20); - ExcelExportEntityForecastSubsidyMoney.setType(10); - exportEntities.add(ExcelExportEntityForecastSubsidyMoney); - ExcelExportEntity medicalSubsidyMoneyExcelExportEntity = new ExcelExportEntity("以往累计补助金额", "medicalSubsidyMoney", 20); - medicalSubsidyMoneyExcelExportEntity.setType(10); - exportEntities.add(medicalSubsidyMoneyExcelExportEntity); - try { - ExportParams exportParams = new ExportParams(); - exportParams.setType(ExcelType.XSSF); - Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); - CommonDownloadUtil.download("测算补助金额汇总表.xlsx", workbook, response); - }catch (Exception e){ - e.printStackTrace(); - } - - + medicalCalculateMoneyService.doExport(ratio, response); } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalStatisticsController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalStatisticsController.java index 89321b9b..0da2a2fa 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/controller/MedicalStatisticsController.java @@ -1,14 +1,9 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.controller; -import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.ExportParams; -import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; -import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -17,7 +12,6 @@ import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.MedicalA import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.entity.Record; @@ -30,7 +24,6 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; import java.util.List; /** @@ -124,115 +117,19 @@ public class MedicalStatisticsController { return Result.success(pagination); } + /** + * 导出医疗补助统计表,返回类型为 void,Excel 文件直接写入 response。 + * + * @param pageForm 页面筛选、分页及排序条件 + * @param isMajorDiseases true 为重疾,false 为普通疾病,null 不限制类型 + * @param response 接收下载内容的 HTTP 响应 + */ @At @Ok("void") - @ApiOperation("分页查询") + @ApiOperation("导出医疗补助统计表") @SaCheckPermission("medicalMutualAid.medical.statistics") public void doExport(MedicalPageForm pageForm, Boolean isMajorDiseases, HttpServletResponse response) { - Sql sql = Sqls.create(""" - SELECT - info.*, - type.diseaseName, - type.diseaseCode, - type.isMajorDiseases, - us.username, - us.loginname, - us.unitName, - us.unitCode, - us.unionName, - us.unionCode, - ins.id AS instanceId, - ins.businessNo, - ins.state instanceState, - ins.variable instanceVariable, - ins.processDefineId instanceProcessDefineId, - t.id taskId, - t.taskName AS taskKey, - t.displayName taskName, - t.taskType, - t.performType taskPerformType, - t.taskState, - t.finishTime, - t.taskParentId, - t.variable taskVariable, - IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, - (SELECT MAX(id) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'startTask') AS startTaskId - FROM - medical_apply info - LEFT JOIN medical_disease_type type ON info.diseaseId = type.id - LEFT JOIN aid_fund_member_pay member ON member.userId = info.userId - LEFT JOIN vw_user us ON us.id = info.userId - LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id - AND t.taskState = 10 - LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id - $condition - """); - Cnd cnd = Cnd.NEW(); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orLike("us.loginname", pageForm.getSearchKeyword()); - seg.orLike("us.username", pageForm.getSearchKeyword()); - cnd.and(seg); - } - cnd.andEX("year(info.applyTime)", "=", pageForm.getYear()); - cnd.andEX("info.diseaseId", "=", pageForm.getDiseaseId()); - cnd.andEX("us.unionId", "=", pageForm.getUnionId()); - cnd.andEX("us.unitId", "=", pageForm.getUnitId()); - cnd.andEX("member.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType()); - cnd.andEX("type.isMajorDiseases", "=", isMajorDiseases); - - if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) { - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } else { - cnd.desc("info.applyTime"); - } - cnd.and("ins.state", "=", 20); - cnd.groupBy("info.id"); - sql.setCondition(cnd); - Pagination pagination = medicalApplyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - List list = medicalApplyService.getCostList(pagination.getList()); - for (NutMap map : list) { - boolean isMajor = map.getBoolean("isMajorDiseases"); - map.put("isMajorDiseasesDisplay", isMajor ? "是" : "否"); - } - List excelExportEntities = new ArrayList<>(); - excelExportEntities.add(new ExcelExportEntity("姓名","username",20)); - excelExportEntities.add(new ExcelExportEntity("工号","loginname",20)); - excelExportEntities.add(new ExcelExportEntity("单位","unitName",20)); - excelExportEntities.add(new ExcelExportEntity("单位编码","unitCode",20)); - excelExportEntities.add(new ExcelExportEntity("工会","unionName",20)); - excelExportEntities.add(new ExcelExportEntity("工会编码","unionCode",20)); - excelExportEntities.add(new ExcelExportEntity("疾病名称","diseaseName",20)); - excelExportEntities.add(new ExcelExportEntity("疾病编码","diseaseCode",20)); - excelExportEntities.add(new ExcelExportEntity("是否重疾","isMajorDiseasesDisplay",20)); - excelExportEntities.add(new ExcelExportEntity("申请时间","applyTime",20)); - excelExportEntities.add(new ExcelExportEntity("申请次数","applyNum",20)); - excelExportEntities.add(new ExcelExportEntity("住院医疗费总额(不含门诊)","hospitalSumMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("实际报销总额","reimbursementMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("(住院医疗)允许报销范围内个人承担部分金额","singleBearMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("(住院医疗)自费部分金额","personExpenseMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("重病门诊自费金额","outpatientServiceMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("非住院肾衰竭治疗、靶向药金额","bxyMoney$",20)); - excelExportEntities.add(new ExcelExportEntity("合计","totalMoney",20)); - excelExportEntities.add(new ExcelExportEntity("预测补助金额","forecastSubsidyMoney",20)); - excelExportEntities.add(new ExcelExportEntity("补助金额","subsidyMoney",20)); - excelExportEntities.add(new ExcelExportEntity("爱心基金","loveSubsidyMoney",20)); - - String exportYear = String.valueOf(pageForm.getYear()); - if (StrUtil.isBlank(exportYear)) { - exportYear = String.valueOf(java.time.Year.now().getValue()); - } - String fileName = exportYear + "年补助人员列表.xlsx"; - - try { - ExportParams exportParams = new ExportParams(); - exportParams.setType(ExcelType.XSSF); - Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelExportEntities, list); - CommonDownloadUtil.download(fileName, workbook, response); - } catch (Exception e) { - log.error("导出补助人员列表失败", e); - } + medicalApplyService.exportStatistics(pageForm, isMajorDiseases, response); } } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalApplyService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalApplyService.java index 8cd08f83..842c6cf6 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalApplyService.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalApplyService.java @@ -2,8 +2,10 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalApply; +import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.param.MedicalPageForm; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.util.List; public interface MedicalApplyService extends BaseService { @@ -27,6 +29,16 @@ public interface MedicalApplyService extends BaseService { */ List getCostList(List list); + /** + * 导出医疗补助统计记录,金额列为数值类型,最后一行为本次导出记录的逐列合计。 + * 返回类型为 void,XSSF 文件内容直接写入 response。 + * + * @param pageForm 页面筛选与分页条件,包含年度、姓名或工号、疾病、工会、单位、会员类型和排序 + * @param isMajorDiseases true 导出重疾,false 导出普通疾病,null 不限制疾病类型 + * @param response 接收 Excel 下载内容的 HTTP 响应 + */ + void exportStatistics(MedicalPageForm pageForm, Boolean isMajorDiseases, HttpServletResponse response); + /** * 查询是否有进行中的申请 diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalCalculateMoneyService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalCalculateMoneyService.java index 343c6e25..19a75d43 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalCalculateMoneyService.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/MedicalCalculateMoneyService.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service; import com.budwk.app.base.service.BaseService; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.util.List; public interface MedicalCalculateMoneyService extends BaseService { @@ -14,4 +15,12 @@ public interface MedicalCalculateMoneyService extends BaseService { NutMap getData(); List getApplyData(double ratio); + + /** + * 按列表测算口径导出申请数据;返回类型为 void,Excel 列对应申请信息、费用和测算金额。 + * + * @param ratio 页面当前补助比例,单位为百分比 + * @param response 用于写入 Excel 文件的 HTTP 响应 + */ + void doExport(double ratio, HttpServletResponse response); } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalApplyServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalApplyServiceImpl.java index 8a71c1c9..c0955998 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalApplyServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalApplyServiceImpl.java @@ -1,9 +1,16 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -11,7 +18,10 @@ import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalApp import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalApplyCost; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalDiseaseType; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalSetting; +import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.param.MedicalPageForm; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.MedicalApplyService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; @@ -21,9 +31,11 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; @@ -35,6 +47,7 @@ import java.util.Objects; * @description */ @IocBean(args = {"refer:dao"}) +@Slf4j public class MedicalApplyServiceImpl extends BaseServiceImpl implements MedicalApplyService { public MedicalApplyServiceImpl(Dao dao) { super(dao); @@ -109,6 +122,151 @@ public class MedicalApplyServiceImpl extends BaseServiceImpl imple return list; } + @Override + public void exportStatistics(MedicalPageForm pageForm, Boolean isMajorDiseases, HttpServletResponse response) { + // 沿用统计页的筛选、排序及分页范围,合计金额只覆盖本次实际导出的记录。 + Sql sql = Sqls.create(""" + SELECT + info.*, + type.diseaseName, + type.diseaseCode, + type.isMajorDiseases, + us.username, + us.loginname, + us.unitName, + us.unitCode, + us.unionName, + us.unionCode, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, + t.id taskId, + t.taskName AS taskKey, + t.displayName taskName, + t.taskType, + t.performType taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable taskVariable, + IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, + (SELECT MAX(id) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'startTask') AS startTaskId + FROM + medical_apply info + LEFT JOIN medical_disease_type type ON info.diseaseId = type.id + LEFT JOIN aid_fund_member_pay member ON member.userId = info.userId + LEFT JOIN vw_user us ON us.id = info.userId + LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id + AND t.taskState = 10 + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + $condition + """); + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("us.loginname", pageForm.getSearchKeyword()); + seg.orLike("us.username", pageForm.getSearchKeyword()); + cnd.and(seg); + } + cnd.andEX("year(info.applyTime)", "=", pageForm.getYear()); + cnd.andEX("info.diseaseId", "=", pageForm.getDiseaseId()); + cnd.andEX("us.unionId", "=", pageForm.getUnionId()); + cnd.andEX("us.unitId", "=", pageForm.getUnitId()); + cnd.andEX("member.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType()); + cnd.andEX("type.isMajorDiseases", "=", isMajorDiseases); + + if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } else { + cnd.desc("info.applyTime"); + } + cnd.and("ins.state", "=", 20); + cnd.groupBy("info.id"); + sql.setCondition(cnd); + Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List list = getCostList(pagination.getList()); + for (NutMap map : list) { + boolean isMajor = map.getBoolean("isMajorDiseases"); + map.put("isMajorDiseasesDisplay", isMajor ? "是" : "否"); + } + String exportYear = String.valueOf(pageForm.getYear()); + if (StrUtil.isBlank(exportYear)) { + exportYear = String.valueOf(java.time.Year.now().getValue()); + } + String fileName = exportYear + "年补助人员列表.xlsx"; + + try { + Workbook workbook = createStatisticsExportWorkbook(list); + CommonDownloadUtil.download(fileName, workbook, response); + } catch (Exception e) { + log.error("导出补助人员列表失败", e); + } + } + + /** + * 生成统计导出工作簿,统一金额列类型并追加逐列合计。 + * + * @param list 已补齐费用汇总字段的申请记录,不包含合计行 + * @return XSSF 工作簿;申请信息保持原列顺序,十个金额列及末尾合计金额均为数值类型 + */ + private Workbook createStatisticsExportWorkbook(List list) { + List excelExportEntities = new ArrayList<>(); + excelExportEntities.add(new ExcelExportEntity("姓名","username",20)); + excelExportEntities.add(new ExcelExportEntity("工号","loginname",20)); + excelExportEntities.add(new ExcelExportEntity("单位","unitName",20)); + excelExportEntities.add(new ExcelExportEntity("单位编码","unitCode",20)); + excelExportEntities.add(new ExcelExportEntity("工会","unionName",20)); + excelExportEntities.add(new ExcelExportEntity("工会编码","unionCode",20)); + excelExportEntities.add(new ExcelExportEntity("疾病名称","diseaseName",20)); + excelExportEntities.add(new ExcelExportEntity("疾病编码","diseaseCode",20)); + excelExportEntities.add(new ExcelExportEntity("是否重疾","isMajorDiseasesDisplay",20)); + excelExportEntities.add(new ExcelExportEntity("申请时间","applyTime",20)); + excelExportEntities.add(new ExcelExportEntity("申请次数","applyNum",20)); + excelExportEntities.add(new ExcelExportEntity("住院医疗费总额(不含门诊)","hospitalSumMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("实际报销总额","reimbursementMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("(住院医疗)允许报销范围内个人承担部分金额","singleBearMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("(住院医疗)自费部分金额","personExpenseMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("重病门诊自费金额","outpatientServiceMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("非住院肾衰竭治疗、靶向药金额","bxyMoney$",20)); + excelExportEntities.add(new ExcelExportEntity("合计","totalMoney",20)); + excelExportEntities.add(new ExcelExportEntity("预测补助金额","forecastSubsidyMoney",20)); + excelExportEntities.add(new ExcelExportEntity("补助金额","subsidyMoney",20)); + excelExportEntities.add(new ExcelExportEntity("爱心基金","loveSubsidyMoney",20)); + + List moneyFields = List.of("hospitalSumMoney$", "reimbursementMoney$", "singleBearMoney$", + "personExpenseMoney$", "outpatientServiceMoney$", "bxyMoney$", "totalMoney", + "forecastSubsidyMoney", "subsidyMoney", "loveSubsidyMoney"); + // 与测算页导出一致,金额写入 Excel 数值单元格;工号和单位编码仍按文本输出。 + for (ExcelExportEntity entity : excelExportEntities) { + if (moneyFields.contains(entity.getKey())) { + entity.setType(10); + } + } + + NutMap summary = new NutMap(); + summary.put("username", "合计"); + // 空金额按零参与汇总,使用十进制累加避免浮点误差;没有记录时合计也为零。 + for (String field : moneyFields) { + BigDecimal sum = BigDecimal.ZERO; + for (NutMap row : list) { + String rawValue = row.getString(field); + BigDecimal money = StrUtil.isBlank(rawValue) ? BigDecimal.ZERO : new BigDecimal(rawValue); + row.put(field, money); + sum = sum.add(money); + } + summary.put(field, sum); + } + List exportList = new ArrayList<>(list); + exportList.add(summary); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + return ExcelExportUtil.exportExcel(exportParams, excelExportEntities, exportList); + } + @Override public Boolean getIsAfootMedicalApply(String userId, String id) { Sql sql = Sqls.create(""" diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalCalculateMoneyServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalCalculateMoneyServiceImpl.java index 4e67cb0d..1c8c5042 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalCalculateMoneyServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/medical/service/impl/MedicalCalculateMoneyServiceImpl.java @@ -1,12 +1,19 @@ package com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.model.AidFundMemberPay; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalApply; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.model.MedicalMoneyDetail; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.MedicalApplyService; import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.medical.service.MedicalCalculateMoneyService; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; @@ -16,9 +23,10 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.DecimalFormat; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -70,10 +78,12 @@ public class MedicalCalculateMoneyServiceImpl extends BaseServiceImpl implements double subsidyMoney = applyList.stream().mapToDouble(apply -> apply.getDouble("subsidyMoney")).sum(); nutMap.setv("subsidyMoney", subsidyMoney); - //获取申请成功的爱心补助金额 - //找到有多少数据 - int firstApplyCount = applyList.stream().filter(apply -> apply.getInt("applyNum") == 1).toList().size(); - nutMap.setv("loveSubsidyMoney", firstApplyCount * 5000); + // 与列表使用相同的已办结申请记录,汇总实际爱心补助;零金额和空值不增加合计。 + BigDecimal loveSubsidyMoney = applyList.stream() + .map(apply -> apply.getString("loveSubsidyMoney")) + .map(money -> StrUtil.isBlank(money) ? BigDecimal.ZERO : new BigDecimal(money)) + .reduce(BigDecimal.ZERO, BigDecimal::add); + nutMap.setv("loveSubsidyMoney", loveSubsidyMoney); //查询申请成功后的住院缴费金额 List applyIds = applyList.stream().map(v -> v.getString("id")).toList(); @@ -85,6 +95,12 @@ public class MedicalCalculateMoneyServiceImpl extends BaseServiceImpl implements return nutMap; } + /** + * 返回最新申请年度的已办结测算列表,供页面和导出共用。 + * + * @param ratio 补助比例的百分数,例如 60 表示按 60% 测算 + * @return 每项为申请及费用字段的 NutMap;subsidyMoney、forecastSubsidyMoney 按笔四舍五入到整数元 + */ @Override public List getApplyData(double ratio) { //获取申请最新年份 @@ -98,12 +114,100 @@ public class MedicalCalculateMoneyServiceImpl extends BaseServiceImpl implements applyList.forEach(apply -> { apply.putAll(medicalApplyService.calcMedicalMoney(apply.getString("id"),null, ratio)); + // 本页按每笔补助四舍五入到元,列表、导出和按比例分配共用取整后的金额;空金额按零处理。 + for (String field : List.of("subsidyMoney", "forecastSubsidyMoney")) { + String money = apply.getString(field); + apply.put(field, StrUtil.isBlank(money) ? BigDecimal.ZERO + : new BigDecimal(money).setScale(0, RoundingMode.HALF_UP)); + } }); return applyList; } + @Override + public void doExport(double ratio, HttpServletResponse response) { + // 导出复用列表查询结果,保证服务端测算金额与页面初次加载时的口径一致。 + List list = getApplyData(ratio); + list.forEach(apply -> apply.put("majorDisease", apply.getBoolean("isMajorDiseases") ? "是" : "否")); + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); + exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 20)); + exportEntities.add(new ExcelExportEntity("所属分工会", "unionName", 20)); + exportEntities.add(new ExcelExportEntity("疾病种类", "diseaseName", 20)); + exportEntities.add(new ExcelExportEntity("重大疾病", "majorDisease", 20)); + exportEntities.add(new ExcelExportEntity("申请时间", "applyTime", 20)); + exportEntities.add(new ExcelExportEntity("申请次数", "applyNum", 20)); + + exportEntities.add(new ExcelExportEntity("起扣时间", "aidFundDeductTime", 20)); + exportEntities.add(new ExcelExportEntity("缴费年数", "yearsSinceDeduct", 20)); + ExcelExportEntity hospitalSumMoneyExcelExportEntity = new ExcelExportEntity("住院医疗总额(不含门诊)", "hospitalSumMoney$", 20); + hospitalSumMoneyExcelExportEntity.setType(10); + exportEntities.add(hospitalSumMoneyExcelExportEntity); + ExcelExportEntity reimbursementMoneyExcelExportEntity = new ExcelExportEntity("实际报销总额", "reimbursementMoney$", 20); + reimbursementMoneyExcelExportEntity.setType(10); + exportEntities.add(reimbursementMoneyExcelExportEntity); + ExcelExportEntity singleBearMoneyExcelExportEntity = new ExcelExportEntity("(住院医疗)允许报销范围内个人承担部分总额", "singleBearMoney$", 20); + singleBearMoneyExcelExportEntity.setType(10); + exportEntities.add(singleBearMoneyExcelExportEntity); + ExcelExportEntity personExpenseMoneyExcelExportEntity = new ExcelExportEntity("(住院医疗)自费部分总额", "personExpenseMoney$", 20); + personExpenseMoneyExcelExportEntity.setType(10); + exportEntities.add(personExpenseMoneyExcelExportEntity); + ExcelExportEntity outpatientServiceMoneyExcelExportEntity = new ExcelExportEntity("重病门诊自费金额", "outpatientServiceMoney$", 20); + outpatientServiceMoneyExcelExportEntity.setType(10); + exportEntities.add(outpatientServiceMoneyExcelExportEntity); + ExcelExportEntity bxyMoneyExcelExportEntity = new ExcelExportEntity("非住院肾衰竭治疗、靶向药", "bxyMoney$", 20); + bxyMoneyExcelExportEntity.setType(10); + exportEntities.add(bxyMoneyExcelExportEntity); + ExcelExportEntity totalMoneyExcelExportEntity = new ExcelExportEntity("合计金额", "totalMoney", 20); + totalMoneyExcelExportEntity.setType(10); + exportEntities.add(totalMoneyExcelExportEntity); + ExcelExportEntity loveSubsidyMoneyExcelExportEntity = new ExcelExportEntity("爱心补助", "loveSubsidyMoney", 20); + loveSubsidyMoneyExcelExportEntity.setType(10); + exportEntities.add(loveSubsidyMoneyExcelExportEntity); + // 页面“当前补助金额”展示的是测算字段,导出同名列保持相同取值。 + ExcelExportEntity subsidyMoneyExcelExportEntity = new ExcelExportEntity("当前补助金额", "forecastSubsidyMoney", 20); + subsidyMoneyExcelExportEntity.setType(10); + exportEntities.add(subsidyMoneyExcelExportEntity); + ExcelExportEntity forecastSubsidyMoneyExcelExportEntity = new ExcelExportEntity("按" + ratio + "%补助金额", "forecastSubsidyMoney", 20); + forecastSubsidyMoneyExcelExportEntity.setType(10); + exportEntities.add(forecastSubsidyMoneyExcelExportEntity); + ExcelExportEntity medicalSubsidyMoneyExcelExportEntity = new ExcelExportEntity("以往累计补助金额", "medicalSubsidyMoney", 20); + medicalSubsidyMoneyExcelExportEntity.setType(10); + exportEntities.add(medicalSubsidyMoneyExcelExportEntity); + try { + List moneyFields = List.of("hospitalSumMoney$", "reimbursementMoney$", "singleBearMoney$", + "personExpenseMoney$", "outpatientServiceMoney$", "bxyMoney$", "totalMoney", + "loveSubsidyMoney", "forecastSubsidyMoney", "medicalSubsidyMoney"); + NutMap summary = new NutMap(); + summary.put("username", "合计"); + // 按金额字段精确累加;两个测算金额列共用的字段只汇总一次,空金额按零处理。 + for (String field : moneyFields) { + BigDecimal sum = BigDecimal.ZERO; + for (NutMap row : list) { + String rawValue = row.getString(field); + BigDecimal money = StrUtil.isBlank(rawValue) ? BigDecimal.ZERO : new BigDecimal(rawValue); + row.put(field, money); + sum = sum.add(money); + } + summary.put(field, sum); + } + // 仅在导出数据末尾追加合计行,未查询到申请时各金额列显示数值零。 + List exportList = new ArrayList<>(list); + exportList.add(summary); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, exportList); + CommonDownloadUtil.download("测算补助金额汇总表.xlsx", workbook, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * 根据申请id查询出住院缴费金额 diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 87e2ef24..53662f21 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -54,86 +54,7 @@ - - - - - diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/changeRecord/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/changeRecord/index.html index 2749892a..ea33bf7e 100644 --- a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/changeRecord/index.html +++ b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/changeRecord/index.html @@ -54,6 +54,7 @@ layout("/layouts/platform.html"){ + 导出 -