From 2cdda235451d7e755924debc55392bd842669fe3 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Tue, 7 Apr 2026 18:04:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=B4=E8=B4=B9=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemberPaymentSummaryController.java | 42 ++- .../service/MemberPaymentService.java | 12 + .../impl/MemberPaymentServiceImpl.java | 340 ++++++++++++++++++ .../template/MemberPaymentUserImportTemp.java | 32 ++ .../views/platform/membercost/config.html | 6 +- .../views/platform/membercost/project.html | 4 +- .../views/platform/membercost/summary.html | 70 +++- 7 files changed, 488 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/v/nutz/zhgh/memberCost/template/MemberPaymentUserImportTemp.java diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentSummaryController.java b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentSummaryController.java index 89ec302..4c91b2b 100644 --- a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentSummaryController.java +++ b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentSummaryController.java @@ -19,6 +19,7 @@ import io.v.nutz.web.commons.utils.ShiroUtil; import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo; import io.v.nutz.zhgh.memberCost.service.MemberPaymentService; import io.v.nutz.zhgh.memberCost.template.MemberPaymentTemp; +import io.v.nutz.zhgh.memberCost.template.MemberPaymentUserImportTemp; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -228,7 +229,7 @@ public class MemberPaymentSummaryController { List errorInfos = new ArrayList<>(); List needInsertList = new ArrayList<>(); - //缴费比例 + // 原有导入逻辑:按导入的缴费基数更新已存在名单中的缴费信息。 BigDecimal paymentProportion = new BigDecimal("0.005"); memberPaymentTempList.forEach(v -> { if (infoMap.containsKey(v.getLoginname().trim())) { @@ -238,14 +239,12 @@ public class MemberPaymentSummaryController { memberPaymentInfo.setPaymentBaseOne(v.getPaymentBaseOne()); memberPaymentInfo.setPaymentBaseTwo(v.getPaymentBaseTwo()); - //缴费金额,精度计算 DecimalFormat df = new DecimalFormat("#0.000"); BigDecimal baseOne = new BigDecimal(v.getPaymentBaseOne()); BigDecimal baseTwo = new BigDecimal(v.getPaymentBaseTwo()); String paymentMoney = df.format((baseOne.add(baseTwo)).multiply(paymentProportion)); memberPaymentInfo.setPaymentMoney(paymentMoney); -// memberPaymentInfo.setPaymentTime(v.getPaymentTime() != null ? v.getPaymentTime() : new Date()); memberPaymentInfo.setRemark(v.getRemark()); memberPaymentInfo.setPaymentMethod("导入"); needInsertList.add(memberPaymentInfo); @@ -268,9 +267,10 @@ public class MemberPaymentSummaryController { nutMap.setv("totalCount", memberPaymentTempList.size()); nutMap.setv("successCount", i); nutMap.setv("errorCount", errorInfos.size()); - nutMap.setv("errorList", errorInfos.stream().map(v -> { - return NutMap.NEW().addv("工号", v.getLoginname()).addv("姓名", v.getUsername()).addv("错误原因", v.getResult()); - }).collect(Collectors.toList())); + nutMap.setv("errorList", errorInfos.stream().map(v -> NutMap.NEW() + .addv("工号", v.getLoginname()) + .addv("姓名", v.getUsername()) + .addv("错误原因", v.getResult())).collect(Collectors.toList())); return Result.success(nutMap); } return Result.success(); @@ -280,6 +280,36 @@ public class MemberPaymentSummaryController { } } + @At + @Ok("void") + @RequiresPermissions("member.payment.summary") + public void downloadUserImportTemp(HttpServletResponse response) { + try { + ViTool.excelResponse(response, "缴费人员导入模版.xlsx"); + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook sheets = ExcelExportUtil.exportExcel(exportParams, MemberPaymentUserImportTemp.class, new ArrayList<>()); + ServletOutputStream outputStream = response.getOutputStream(); + sheets.write(outputStream); + outputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @At + @RequiresPermissions("member.payment.summary") + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + public Object doUserImport(TempFile file, String projectId, @Param(value = "isFlag", required = false) Boolean isFlag) { + try { + List importList = ExcelImportUtil.importExcel(file.getFile(), MemberPaymentUserImportTemp.class, new ImportParams()); + return memberPaymentService.importPaymentUsers(projectId, importList, Boolean.TRUE.equals(isFlag)); + } catch (Exception e) { + e.printStackTrace(); + return Result.error(); + } + } + @At @Ok("void") diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/service/MemberPaymentService.java b/src/main/java/io/v/nutz/zhgh/memberCost/service/MemberPaymentService.java index bd06971..ef326af 100644 --- a/src/main/java/io/v/nutz/zhgh/memberCost/service/MemberPaymentService.java +++ b/src/main/java/io/v/nutz/zhgh/memberCost/service/MemberPaymentService.java @@ -1,9 +1,11 @@ package io.v.nutz.zhgh.memberCost.service; import io.v.nutz.base.service.ViService; +import io.v.nutz.base.result.Result; import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig; import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo; import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject; +import io.v.nutz.zhgh.memberCost.template.MemberPaymentUserImportTemp; import org.apache.poi.ss.usermodel.Workbook; import org.nutz.lang.util.NutMap; @@ -21,4 +23,14 @@ public interface MemberPaymentService extends ViService { List getPaymentConfigList(); MemberPaymentConfig getConfigById(String configId); + + /** + * 导入缴费人员到缴费名单,并根据缴费配置生成缴费金额。 + * + * @param projectId 缴费项目id + * @param importList 导入名单 + * @param isClearImport 是否清空当前项目原有名单后再导入 + * @return 导入结果 + */ + Result importPaymentUsers(String projectId, List importList, boolean isClearImport); } diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/service/impl/MemberPaymentServiceImpl.java b/src/main/java/io/v/nutz/zhgh/memberCost/service/impl/MemberPaymentServiceImpl.java index f87114a..af85579 100644 --- a/src/main/java/io/v/nutz/zhgh/memberCost/service/impl/MemberPaymentServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/memberCost/service/impl/MemberPaymentServiceImpl.java @@ -1,28 +1,51 @@ package io.v.nutz.zhgh.memberCost.service.impl; import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.annotation.Excel; 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.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import io.v.nutz.base.result.Result; import io.v.nutz.base.service.impl.ViServiceImpl; +import io.v.nutz.sys.models.Sys_user; import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig; import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo; import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject; import io.v.nutz.zhgh.memberCost.service.MemberPaymentService; +import io.v.nutz.zhgh.memberCost.template.MemberPaymentUserImportTemp; 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.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; +import org.nutz.trans.Atom; +import org.nutz.trans.Trans; import java.io.OutputStream; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; @Slf4j @IocBean(args = {"refer:dao"}) public class MemberPaymentServiceImpl extends ViServiceImpl implements MemberPaymentService { + private static final BigDecimal MEMBER_PAYMENT_RATE = new BigDecimal("0.005"); + public MemberPaymentServiceImpl(Dao dao) { super(dao); } @@ -72,4 +95,321 @@ public class MemberPaymentServiceImpl extends ViServiceImpl i public MemberPaymentConfig getConfigById(String configId) { return dao().fetch(MemberPaymentConfig.class,configId); } + + @Override + public Result importPaymentUsers(String projectId, List importList, boolean isClearImport) { + if (Strings.isBlank(projectId)) { + return Result.error("请先选择缴费项目后再导入!"); + } + if (Lang.isEmpty(importList)) { + return Result.error("导入文件中未读取到有效数据!"); + } + MemberPaymentProject project = dao().fetch(MemberPaymentProject.class, projectId); + if (project == null) { + return Result.error("未找到对应的缴费项目!"); + } + MemberPaymentConfig config = dao().fetch(MemberPaymentConfig.class, project.getConfigId()); + if (config == null || Lang.isEmpty(config.getPayStandards())) { + return Result.error("当前缴费项目未配置缴费规则,无法导入!"); + } + + // 追加模式下需要校验数据库中是否已存在该工号;清空模式会先删除原记录,因此不参与重复校验。 + List existsInfoList = isClearImport ? new ArrayList<>() : dao().query(MemberPaymentInfo.class, Cnd.where("paymentProjectId", "=", projectId)); + Set existsLoginnameSet = existsInfoList.stream() + .map(MemberPaymentInfo::getLoginname) + .filter(Strings::isNotBlank) + .map(this::normalizeExcelText) + .collect(Collectors.toSet()); + + List loginnameList = importList.stream() + .map(MemberPaymentUserImportTemp::getLoginname) + .filter(Strings::isNotBlank) + .map(this::normalizeExcelText) + .distinct() + .collect(Collectors.toList()); + Map userMap = new HashMap<>(); + if (Lang.isNotEmpty(loginnameList)) { + userMap = dao().query(Sys_user.class, Cnd.where("loginname", "in", loginnameList)).stream() + .collect(Collectors.toMap(v -> normalizeExcelText(v.getLoginname()), v -> v, (left, right) -> left)); + } + + List errorInfos = new ArrayList<>(); + List needInsertList = new ArrayList<>(); + Set currentImportLoginnameSet = new HashSet<>(); + + for (MemberPaymentUserImportTemp importTemp : importList) { + String errorMsg = validateImportRow(importTemp, currentImportLoginnameSet, existsLoginnameSet, userMap); + if (Strings.isNotBlank(errorMsg)) { + importTemp.setResult(errorMsg); + errorInfos.add(importTemp); + continue; + } + + try { + Sys_user sysUser = userMap.get(normalizeExcelText(importTemp.getLoginname())); + MemberPaymentInfo paymentInfo = buildImportPaymentInfo(sysUser, projectId, config, importTemp); + needInsertList.add(paymentInfo); + currentImportLoginnameSet.add(normalizeExcelText(importTemp.getLoginname())); + } catch (IllegalArgumentException e) { + importTemp.setResult(e.getMessage()); + errorInfos.add(importTemp); + } + } + + if (isClearImport || Lang.isNotEmpty(needInsertList)) { + Trans.exec(new Atom() { + @Override + public void run() { + if (isClearImport) { + // 清空导入时仅清理当前缴费项目的名单,避免影响其他项目数据。 + dao().clear(MemberPaymentInfo.class, Cnd.where("paymentProjectId", "=", projectId)); + } + if (Lang.isNotEmpty(needInsertList)) { + dao().insert(needInsertList); + } + } + }); + } + + if (Lang.isNotEmpty(errorInfos)) { + NutMap resultData = NutMap.NEW(); + resultData.setv("totalCount", importList.size()); + resultData.setv("successCount", needInsertList.size()); + resultData.setv("errorCount", errorInfos.size()); + resultData.setv("errorList", errorInfos.stream().map(v -> + NutMap.NEW() + .addv("工号", v.getLoginname()) + .addv("姓名", v.getUsername()) + .addv("错误原因", v.getResult()) + ).collect(Collectors.toList())); + return Result.success(resultData); + } + return Result.success(); + } + + /** + * 按导入行生成待缴费记录。 + * 这里统一处理会员类型判断、缴费月数计算、规则匹配和金额计算,避免控制层重复拼装业务逻辑。 + */ + private MemberPaymentInfo buildImportPaymentInfo(Sys_user sysUser, String projectId, MemberPaymentConfig config, MemberPaymentUserImportTemp importTemp) { + PaymentPeriodInfo periodInfo = getPaymentPeriodInfo(sysUser, config); + MemberPaymentConfig.PayStandards standards = findPayStandard(config.getPayStandards(), periodInfo.getPayPersonnel(), normalizeText(importTemp.getUserState())); + if (standards == null) { + throw new IllegalArgumentException("未找到【" + normalizeText(importTemp.getUserState()) + " / " + periodInfo.getPayPersonnel() + "】对应的缴费配置!"); + } + + MemberPaymentInfo paymentInfo = new MemberPaymentInfo(); + paymentInfo.setUserId(sysUser.getId()); + paymentInfo.setLoginname(normalizeExcelText(importTemp.getLoginname())); + paymentInfo.setPaymentProjectId(projectId); + paymentInfo.setPayment(false); + paymentInfo.setPaymentMonth(String.valueOf(periodInfo.getPaymentMonth())); + // member_payment_info.personType 在当前模块中实际用于匹配配置里的“在职状态”。 + paymentInfo.setPersonType(normalizeText(importTemp.getUserState())); + paymentInfo.setPayPersonnel(periodInfo.getPayPersonnel()); + paymentInfo.setPaymentMoney(calculatePaymentMoney(standards, periodInfo.getPaymentMonth(), importTemp)); + return paymentInfo; + } + + /** + * 校验导入行的基础数据,优先拦住工号重复、名单已存在、人员不存在等明显问题。 + */ + private String validateImportRow(MemberPaymentUserImportTemp importTemp, + Set currentImportLoginnameSet, + Set existsLoginnameSet, + Map userMap) { + String loginname = normalizeExcelText(importTemp.getLoginname()); + String username = normalizeText(importTemp.getUsername()); + String userState = normalizeText(importTemp.getUserState()); + if (Strings.isBlank(loginname)) { + return "工号不能为空!"; + } + if (Strings.isBlank(username)) { + return "姓名不能为空!"; + } + if (Strings.isBlank(userState)) { + return "在职状态不能为空!"; + } + if (currentImportLoginnameSet.contains(loginname)) { + return "导入文件中工号重复,请检查后重试!"; + } + if (existsLoginnameSet.contains(loginname)) { + return "该工号已存在于当前缴费名单中,无需重复导入!"; + } + Sys_user sysUser = userMap.get(loginname); + if (sysUser == null) { + return "系统中未找到该工号对应的会员信息!"; + } + if (!Objects.equals(normalizeText(sysUser.getUsername()), username)) { + return "导入姓名与系统姓名不一致,请检查工号或姓名!"; + } + if (!Objects.equals(sysUser.getMember(), 1)) { + return "该人员不是工会会员,无法加入缴费名单!"; + } + return null; + } + + /** + * 根据缴费周期和会员状态判断本次导入属于哪类缴费人员,并计算应缴月份。 + */ + private PaymentPeriodInfo getPaymentPeriodInfo(Sys_user sysUser, MemberPaymentConfig config) { + DateTime beginDate = DateUtil.parse(config.getPaymentStartMonth() + "-01"); + DateTime endDate = DateUtil.endOfMonth(DateUtil.parse(config.getPaymentEndMonth() + "-01")); + Date memberJoinTime = sysUser.getMemberJoinTime(); + Date retireDate = sysUser.getRetireDate(); + + if (isDateBetween(memberJoinTime, beginDate, endDate)) { + long differMonth = DateUtil.betweenMonth(memberJoinTime, endDate, false) + 1; + return new PaymentPeriodInfo("新进会员", differMonth); + } + if (isDateBetween(retireDate, beginDate, endDate)) { + long differMonth = DateUtil.betweenMonth(beginDate, retireDate, false) + 1; + return new PaymentPeriodInfo("退休会员", differMonth); + } + long differMonth = DateUtil.betweenMonth(beginDate, endDate, false) + 1; + return new PaymentPeriodInfo("普通会员", differMonth); + } + + private boolean isDateBetween(Date currentDate, Date beginDate, Date endDate) { + if (currentDate == null) { + return false; + } + return !currentDate.before(beginDate) && !currentDate.after(endDate); + } + + /** + * 根据缴费配置匹配当前导入人员对应的规则。 + */ + private MemberPaymentConfig.PayStandards findPayStandard(List payStandards, + String payPersonnel, + String userState) { + return payStandards.stream() + .filter(item -> Objects.equals(normalizeText(item.getPayPersonnel()), payPersonnel) + && Objects.equals(normalizeText(item.getPersonType()), userState)) + .findFirst() + .orElse(null); + } + + /** + * 统一按配置计算缴费金额。 + * 当前业务以 payModeValueList 为主,只要配置了工资项,就按“工资项求和 * 0.5% * 缴费月数”计算; + * 若未配置工资项,再兜底按固定金额 * 缴费月数计算,兼容旧配置。 + */ + private String calculatePaymentMoney(MemberPaymentConfig.PayStandards standards, + long paymentMonth, + MemberPaymentUserImportTemp importTemp) { + if (Lang.isNotEmpty(standards.getPayModeValueList())) { + BigDecimal totalBase = BigDecimal.ZERO; + for (NutMap item : standards.getPayModeValueList()) { + String salaryFieldName = normalizeText(item.getString("name")); + if (Strings.isBlank(salaryFieldName)) { + throw new IllegalArgumentException("缴费配置中存在空的工资项,请先完善缴费配置后再导入!"); + } + totalBase = totalBase.add(resolveSalaryValue(importTemp, salaryFieldName)); + } + BigDecimal paymentMoney = totalBase.multiply(MEMBER_PAYMENT_RATE).multiply(BigDecimal.valueOf(paymentMonth)); + return formatMoney(paymentMoney.setScale(2, RoundingMode.HALF_UP)); + } + if (Strings.isNotBlank(standards.getPayModeValue())) { + BigDecimal fixedMoney = parseNumber(standards.getPayModeValue(), "固定缴费金额"); + return formatMoney(fixedMoney.multiply(BigDecimal.valueOf(paymentMonth))); + } + throw new IllegalArgumentException("当前缴费规则未配置可计算的金额信息,请先完善缴费配置!"); + } + + /** + * 按导入模板上的 Excel 列名动态匹配工资项。 + * 后续如果模板新增了新的工资字段,只要字段上配置了同名 @Excel(name="..."), + * 并且不是工号、姓名、在职状态这类基础字段,就可以直接参与金额计算。 + */ + private BigDecimal resolveSalaryValue(MemberPaymentUserImportTemp importTemp, String salaryFieldName) { + Map salaryFieldMap = getImportSalaryFieldMap(importTemp); + if (salaryFieldMap.containsKey(salaryFieldName)) { + return parseNumber(salaryFieldMap.get(salaryFieldName), salaryFieldName); + } + throw new IllegalArgumentException("缴费配置中的工资项【" + salaryFieldName + "】暂不支持导入,请检查缴费配置!"); + } + + /** + * 动态提取导入模板中的工资类字段,key 为 Excel 列名,value 为导入值。 + */ + private Map getImportSalaryFieldMap(MemberPaymentUserImportTemp importTemp) { + Map salaryFieldMap = new HashMap<>(); + for (Field field : MemberPaymentUserImportTemp.class.getDeclaredFields()) { + Excel excel = field.getAnnotation(Excel.class); + if (excel == null) { + continue; + } + String excelName = normalizeText(excel.name()); + if (isBasicImportField(excelName)) { + continue; + } + field.setAccessible(true); + try { + Object fieldValue = field.get(importTemp); + salaryFieldMap.put(excelName, fieldValue == null ? "" : String.valueOf(fieldValue)); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException("读取导入字段【" + excelName + "】失败,请重试!"); + } + } + return salaryFieldMap; + } + + /** + * 这些字段用于人员匹配和规则匹配,不参与工资基数求和。 + */ + private boolean isBasicImportField(String excelName) { + return Objects.equals("工号", excelName) + || Objects.equals("姓名", excelName) + || Objects.equals("在职状态", excelName); + } + + private BigDecimal parseNumber(String value, String fieldName) { + String normalizedValue = normalizeExcelText(value); + if (Strings.isBlank(normalizedValue)) { + throw new IllegalArgumentException(fieldName + "不能为空!"); + } + try { + return new BigDecimal(normalizedValue); + } catch (Exception e) { + throw new IllegalArgumentException(fieldName + "格式不正确,请填写数字!"); + } + } + + /** + * Excel 中的工号、工资值可能被转成 123.0,这里统一做兼容处理,避免因格式问题匹配失败。 + */ + private String normalizeExcelText(String value) { + String normalizedValue = normalizeText(value); + if (normalizedValue.matches("^-?\\d+\\.0+$")) { + return normalizedValue.substring(0, normalizedValue.indexOf(".")); + } + return normalizedValue; + } + + private String normalizeText(String value) { + return Strings.isBlank(value) ? "" : value.trim(); + } + + private String formatMoney(BigDecimal value) { + return value.stripTrailingZeros().toPlainString(); + } + + private static class PaymentPeriodInfo { + private final String payPersonnel; + private final long paymentMonth; + + private PaymentPeriodInfo(String payPersonnel, long paymentMonth) { + this.payPersonnel = payPersonnel; + this.paymentMonth = paymentMonth; + } + + public String getPayPersonnel() { + return payPersonnel; + } + + public long getPaymentMonth() { + return paymentMonth; + } + } } diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/template/MemberPaymentUserImportTemp.java b/src/main/java/io/v/nutz/zhgh/memberCost/template/MemberPaymentUserImportTemp.java new file mode 100644 index 0000000..5eb713f --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/memberCost/template/MemberPaymentUserImportTemp.java @@ -0,0 +1,32 @@ +package io.v.nutz.zhgh.memberCost.template; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +/** + * 缴费名单导入模板 + * 按工号导入待缴费人员,并根据缴费配置计算应缴金额。 + */ +@Data +public class MemberPaymentUserImportTemp { + + @Excel(name = "工号") + private String loginname; + + @Excel(name = "姓名") + private String username; + + @Excel(name = "岗位工资") + private String postSalary; + + @Excel(name = "薪级工资") + private String salaryGrade; + + @Excel(name = "在职状态") + private String userState; + + /** + * 导入失败时回填错误原因,供前端导出错误记录使用。 + */ + private String result; +} diff --git a/src/main/resources/views/platform/membercost/config.html b/src/main/resources/views/platform/membercost/config.html index fab43cf..ed7bf1a 100644 --- a/src/main/resources/views/platform/membercost/config.html +++ b/src/main/resources/views/platform/membercost/config.html @@ -150,11 +150,11 @@ layout("/layouts/platform.html"){ - + diff --git a/src/main/resources/views/platform/membercost/project.html b/src/main/resources/views/platform/membercost/project.html index 5629280..e3c72de 100644 --- a/src/main/resources/views/platform/membercost/project.html +++ b/src/main/resources/views/platform/membercost/project.html @@ -105,13 +105,13 @@ layout("/layouts/platform.html"){ 编辑 - 更新缴费人员 {{scope.row.created?'重置缴费人员':'生成缴费人员'}} - + --> 删除 diff --git a/src/main/resources/views/platform/membercost/summary.html b/src/main/resources/views/platform/membercost/summary.html index 4df4fdc..20fed36 100644 --- a/src/main/resources/views/platform/membercost/summary.html +++ b/src/main/resources/views/platform/membercost/summary.html @@ -192,9 +192,13 @@ layout("/layouts/platform.html"){ 批量设为未缴 - + 导入 + + + 导入缴费人员 + 导出 @@ -254,9 +258,11 @@ layout("/layouts/platform.html"){ @@ -291,14 +297,15 @@ layout("/layouts/platform.html"){ units: [], unions: [], tableColumns: [ + { prop: "projectName", label: "缴费项目" }, { prop: "loginname", label: "工号", sortable: true }, { prop: "username", label: "姓名" }, { prop: "mobile", label: "联系电话" }, - { prop: "schoolTime", label: "入职时间" }, + { prop: "schoolTime", label: "入职时间" , checked: 0}, // { prop: "retireDate", label: "退休时间" }, - { prop: "personType", label: "人员类型", sortable: true }, + { prop: "personType", label: "人员类型", sortable: true , checked: 0}, { prop: "userState", label: "在职状态", sortable: true }, - { prop: "unionname", label: "所属工会", sortable: true }, + { prop: "unionname", label: "所属工会", sortable: true , checked: 0}, { prop: "unitname", label: "所属单位", sortable: true }, { prop: "isPayment", label: "是否缴费", sortable: true }, { prop: "paymentMoney", label: "缴费金额", sortable: true } @@ -319,6 +326,13 @@ layout("/layouts/platform.html"){ checkUsers: [], modifyVisible: false, + importConfig: { + tempUrl: "/platform/member/payment/summary/downloadImportTemp", + postUrl: "/platform/member/payment/summary/doImport", + text: "", + isShowRadio: false + }, + importAjaxSuccessHandler: null, formData: { ids: [] }, @@ -452,7 +466,26 @@ layout("/layouts/platform.html"){ } } }, - openImport() { + openImport(type) { + if (!this.pageForm.paymentProjectId) { + this.notifyWarning("请先选择缴费项目后再导入!") + return + } + if (type === "user") { + this.importConfig = { + tempUrl: "/platform/member/payment/summary/downloadUserImportTemp", + postUrl: "/platform/member/payment/summary/doUserImport", + text: "模板字段:工号、姓名、岗位工资、薪级工资、在职状态", + isShowRadio: true + } + } else { + this.importConfig = { + tempUrl: "/platform/member/payment/summary/downloadImportTemp", + postUrl: "/platform/member/payment/summary/doImport", + text: "", + isShowRadio: false + } + } this.$refs.guava.edit() this.$refs.viewImport.resetImportData() }, @@ -528,6 +561,29 @@ layout("/layouts/platform.html"){ this.pageData() } }, + mounted() { + /** + * 仅在当前页面监听导入接口返回。 + * 导入存在错误明细时组件不会触发 flush,这里统一补一次列表刷新。 + */ + this.importAjaxSuccessHandler = (event, xhr, settings) => { + if (!settings || !settings.url) { + return + } + if ( + settings.url.indexOf("/platform/member/payment/summary/doImport") > -1 || + settings.url.indexOf("/platform/member/payment/summary/doUserImport") > -1 + ) { + this.pageData() + } + } + $(document).ajaxSuccess(this.importAjaxSuccessHandler) + }, + beforeDestroy() { + if (this.importAjaxSuccessHandler) { + $(document).off("ajaxSuccess", this.importAjaxSuccessHandler) + } + }, async created() { this.isThreeUnit = (await getConfigKey("isThreeUnit")) === "true" if (this.isThreeUnit) {