From e3be4cbd6e327b55563f97290f16716929ccd451 Mon Sep 17 00:00:00 2001
From: zhouhefeng
Date: Sat, 25 Apr 2026 08:53:03 +0800
Subject: [PATCH 1/9] commit
---
.../ActivitySportsApplyUserServiceImpl.java | 1 +
.../AIdFundPayRecordController.java | 31 ++++++
.../AidFundChangeRecordController.java | 28 ++++++
.../AidFundUnionAuditController.java | 53 +++++++++-
.../service/AidFundMemberPayService.java | 8 ++
.../impl/AidFundMemberPayServiceImpl.java | 98 +++++++++++++++++++
.../aidFund/changeRecord/index.html | 18 ++++
.../aidFund/payRecord/index.html | 9 ++
.../aidFund/unionAudit/index.html | 28 +++++-
9 files changed, 272 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java
index 2fa76b3e..748018ff 100644
--- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsApplyUserServiceImpl.java
@@ -153,6 +153,7 @@ public class ActivitySportsApplyUserServiceImpl extends BaseServiceImpl 0 applyed,
(SELECT COUNT(1) FROM activity_school_apply app WHERE app.activityId=school.id AND app.unionId=@unionId AND app.unionLeader=TRUE) LeaderCount,
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AIdFundPayRecordController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AIdFundPayRecordController.java
index 7320083c..e48fc5de 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AIdFundPayRecordController.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AIdFundPayRecordController.java
@@ -126,6 +126,37 @@ public class AIdFundPayRecordController {
CommonDownloadUtil.download(pageForm.getYear() + "会员年度缴费记录.xlsx", workbook, response);
}
+ @At
+ @Ok("void")
+ @ApiOperation("导出年度缴费名单")
+ @SaCheckPermission("medicalMutualAid.aidFund.payRecord")
+ public void exportAnnualPayMemberList(AidFundPageForm pageForm, HttpServletResponse response) {
+ /*
+ * 导出参数说明:
+ * pageForm 可传所属工会、所属单位、会员类型、姓名/工号关键字等筛选条件;
+ * 返回 Excel 列为工号、姓名、单位,以及 2015 到当前年度的动态缴费金额列。
+ */
+ List years = IntStream.rangeClosed(2015, DateUtil.thisYear())
+ .boxed()
+ .toList();
+
+ List entityList = new ArrayList<>();
+ entityList.add(new ExcelExportEntity("工号", "loginname", 20));
+ entityList.add(new ExcelExportEntity("姓名", "username", 20));
+ entityList.add(new ExcelExportEntity("单位", "unitName", 30));
+ years.forEach(year -> {
+ ExcelExportEntity entity = new ExcelExportEntity(String.valueOf(year), String.valueOf(year), 20);
+ entity.setType(10);
+ entityList.add(entity);
+ });
+
+ List list = aidFundMemberPayService.getAnnualPayMemberList(pageForm);
+ ExportParams exportParams = new ExportParams();
+ exportParams.setType(ExcelType.XSSF);
+ Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
+ CommonDownloadUtil.download("年度缴费名单.xlsx", workbook, response);
+ }
+
@At
@Ok("void")
@ApiOperation("导出缴费名单")
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 b0f9a489..fbdf093e 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
@@ -3,23 +3,28 @@ 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;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
+import org.nutz.mvc.annotation.Param;
/**
* @author zhf
@@ -37,6 +42,9 @@ public class AidFundChangeRecordController {
@Inject
private AidFundMemberChangeRecordService changeRecordService;
+ @Inject
+ private FlowEngine flowEngine;
+
@At("")
@Ok("beetl:/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/changeRecord/index.html")
@SaCheckPermission("medicalMutualAid.aidFund.changeRecord")
@@ -105,5 +113,25 @@ public class AidFundChangeRecordController {
return Result.success(pagination);
}
+ /**
+ * 删除基金会员变更记录。
+ *
+ * @param id 变更记录 ID,前端列表行中的 row.id
+ * @return Result,删除成功时返回 success;ID 为空时返回失败提示
+ */
+ @At
+ @ApiOperation("删除")
+ @Aop(TransAop.READ_COMMITTED)
+ @SaCheckPermission("medicalMutualAid.aidFund.changeRecord")
+ @SLog(tag = "基金会员-变更记录", msg = "删除变更记录")
+ public Result delete(@Param("id") String id) {
+ if (StrUtil.isBlank(id)) {
+ return Result.error("请选择需要删除的变更记录");
+ }
+ changeRecordService.delete(id);
+ flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
+ return Result.success();
+ }
+
}
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundUnionAuditController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundUnionAuditController.java
index b93013db..91f31031 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundUnionAuditController.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/controller/AidFundUnionAuditController.java
@@ -3,11 +3,13 @@ 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.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
+import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffbenefit.condolence.model.Condolence;
import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.service.AidFundMemberChangeRecordService;
@@ -26,6 +28,7 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
+import java.util.Objects;
/**
* @author zhf
@@ -115,7 +118,9 @@ public class AidFundUnionAuditController {
cnd.andEX("info.changeType", "=", changeType);
cnd.and("t.taskName", "=", "06ed1d6d-5f96-485f-9150-ed1ef4a082d6");
- cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
+ if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name())){
+ cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
+ }
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
@@ -133,4 +138,50 @@ public class AidFundUnionAuditController {
Pagination pageVO = changeRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
+
+ /**
+ * 查询所有未审核分工会对应的分工会主席工号。
+ *
+ * @param year 年度,按变更记录申请时间的年份筛选
+ * @param aidFundMemberUserType 基金会员类型,传字典编码;为空时不限制
+ * @param changeType 变更类型,传字典编码;为空时不限制
+ * @return Result,data 为需要发送通知的分工会主席工号列表
+ */
+ @At
+ @ApiOperation("查询未审核分工会主席工号")
+ @SaCheckPermission("medicalMutualAid.aidFund.unionAudit")
+ public Result notifyUnapprovedUnionChairman(@Param(value = "year") Integer year,
+ @Param(value = "aidFundMemberUserType") String aidFundMemberUserType,
+ @Param(value = "changeType") String changeType) {
+ Sql sql = Sqls.create("""
+ SELECT DISTINCT
+ chairman.loginname
+ FROM
+ wf_process_task t
+ LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
+ LEFT JOIN aid_fund_member_change_record info ON info.id = ins.businessNo
+ LEFT JOIN vw_user us ON us.id = info.userId
+ LEFT JOIN sys_user_role ur ON ur.unionId = us.unionId
+ LEFT JOIN sys_role role ON role.id = ur.roleId
+ LEFT JOIN sys_user chairman ON chairman.id = ur.userId
+ $condition
+ """);
+ Cnd cnd = Cnd.NEW();
+ cnd.andEX("YEAR(info.applyTime)", "=", year);
+ cnd.andEX("IFNULL(info.aidFundMemberUserType, us.aidFundMemberUserType)", "=", aidFundMemberUserType);
+ cnd.andEX("info.changeType", "=", changeType);
+ cnd.and("t.taskName", "=", "06ed1d6d-5f96-485f-9150-ed1ef4a082d6");
+ cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
+ cnd.and("role.code", "=", RoleConstant.BRANCH_UNION_CHAIRMAN.name());
+ cnd.and("chairman.loginname", "is not", null);
+ sql.setCondition(cnd);
+
+ // 这里只返回需要发送通知的主席工号,真实消息发送功能由后续消息接口接入。
+ List loginNames = changeRecordService.listMap(sql).stream()
+ .map(map -> map.getString("loginname"))
+ .filter(Objects::nonNull)
+ .distinct()
+ .toList();
+ return Result.success(loginNames);
+ }
}
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberPayService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberPayService.java
index e7251ca7..fedc5220 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberPayService.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/AidFundMemberPayService.java
@@ -15,4 +15,12 @@ public interface AidFundMemberPayService extends BaseService {
Sql getSql(AidFundPageForm pageForm);
List getYearPayList(AidFundPageForm pageForm);
+
+ /**
+ * 查询年度缴费名单导出数据。
+ *
+ * @param pageForm 页面筛选参数,包含所属工会、所属单位、会员类型、姓名/工号关键字等条件
+ * @return 返回导出行数据,字段包含 loginname、username、unitName,以及 2015 到当前年度的缴费金额字段
+ */
+ List getAnnualPayMemberList(AidFundPageForm pageForm);
}
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberPayServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberPayServiceImpl.java
index 469e4150..5f054706 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberPayServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberPayServiceImpl.java
@@ -201,4 +201,102 @@ public class AidFundMemberPayServiceImpl extends BaseServiceImpl getAnnualPayMemberList(AidFundPageForm pageForm) {
+ /*
+ * 导出参数说明:
+ * pageForm.unionId:按所属工会筛选;
+ * pageForm.unitId:按所属单位筛选;
+ * pageForm.aidFundMemberUserType:按基金会员类型筛选;
+ * pageForm.searchKeyword:按姓名或工号模糊筛选。
+ * 返回值字段:loginname、username、unitName 为人员基础信息,2015 到当前年度字段为对应年度缴费金额。
+ */
+ List years = IntStream.rangeClosed(2015, DateUtil.thisYear())
+ .boxed()
+ .toList();
+
+ Cnd userCnd = Cnd.where(View_user::getAidFundMember, "=", 1);
+ userCnd.andEX(View_user::getUnionId, "=", pageForm.getUnionId());
+ userCnd.andEX(View_user::getUnitId, "=", pageForm.getUnitId());
+ userCnd.andEX(View_user::getAidFundMemberUserType, "=", pageForm.getAidFundMemberUserType());
+ if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
+ SqlExpressionGroup group = new SqlExpressionGroup();
+ group.orLike(View_user::getLoginname, pageForm.getSearchKeyword(), true);
+ group.orLike(View_user::getUsername, pageForm.getSearchKeyword(), true);
+ userCnd.and(group);
+ }
+ userCnd.desc(View_user::getUnitCode);
+ List userList = dao().query(View_user.class, userCnd);
+
+ Set oldLoginNames = new HashSet<>();
+ Map oldLoginToUserId = new HashMap<>();
+ for (View_user user : userList) {
+ if (StrUtil.isNotBlank(user.getOldLoginName())) {
+ oldLoginNames.add(user.getOldLoginName());
+ }
+ }
+
+ if (!oldLoginNames.isEmpty()) {
+ List oldUsers = dao().query(Sys_user.class,
+ Cnd.where(Sys_user::getLoginname, "in", new ArrayList<>(oldLoginNames)));
+ for (Sys_user oldUser : oldUsers) {
+ oldLoginToUserId.put(oldUser.getLoginname(), oldUser.getId());
+ }
+ }
+
+ Set allUserIds = new HashSet<>();
+ for (View_user user : userList) {
+ allUserIds.add(user.getId());
+ if (StrUtil.isNotBlank(user.getOldLoginName())) {
+ String oldUserId = oldLoginToUserId.get(user.getOldLoginName());
+ if (oldUserId != null) {
+ allUserIds.add(oldUserId);
+ }
+ }
+ }
+
+ List payList = allUserIds.isEmpty()
+ ? new ArrayList<>()
+ : query(Cnd.where(AidFundMemberPay::getUserId, "in", new ArrayList<>(allUserIds)));
+
+ Map> payIndex = new HashMap<>();
+ for (AidFundMemberPay pay : payList) {
+ if (pay.getUserId() == null || pay.getYear() == null || pay.getMoney() == null) {
+ continue;
+ }
+ payIndex.computeIfAbsent(pay.getUserId(), k -> new HashMap<>())
+ .put(pay.getYear(), pay.getMoney());
+ }
+
+ List result = new ArrayList<>();
+ for (View_user user : userList) {
+ NutMap row = NutMap.NEW();
+ row.put("loginname", user.getLoginname());
+ row.put("username", user.getUsername());
+ row.put("unitName", user.getUnitName());
+
+ Set userIds = new HashSet<>();
+ userIds.add(user.getId());
+ if (StrUtil.isNotBlank(user.getOldLoginName())) {
+ String oldUserId = oldLoginToUserId.get(user.getOldLoginName());
+ if (oldUserId != null) {
+ userIds.add(oldUserId);
+ }
+ }
+
+ for (Integer year : years) {
+ Double yearMoney = 0.0;
+ for (String userId : userIds) {
+ Double money = Optional.ofNullable(payIndex.get(userId))
+ .map(map -> map.get(year))
+ .orElse(0.0);
+ yearMoney += money;
+ }
+ row.put(String.valueOf(year), yearMoney == 0.0 ? null : yearMoney);
+ }
+ result.add(row);
+ }
+ return result;
+ }
}
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 a442f2a7..2749892a 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
@@ -84,6 +84,7 @@ layout("/layouts/platform.html"){
查看
+ 删除
@@ -135,6 +136,23 @@ layout("/layouts/platform.html"){
this.$refs.infoRef.onOpen(row)
})
},
+ onDelete(row) {
+ this.$confirm("确定要删除【" + row.username + "】的变更记录吗?删除后将同步删除关联流程记录", "提示", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning"
+ }).then(() => {
+ this.formLoading = true
+ this.$axios.post(loc() + "/delete", {id: row.id}).then((res) => {
+ if (res.code === 0) {
+ this.$message.success(res.msg)
+ this.doSearch()
+ }
+ }).finally(() => {
+ this.formLoading = false
+ })
+ })
+ },
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/payRecord/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/payRecord/index.html
index da383d68..ee4d5d85 100644
--- a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/payRecord/index.html
+++ b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/payRecord/index.html
@@ -75,6 +75,12 @@ layout("/layouts/platform.html"){
type="primary">导出会员缴费金额
+ 导出年度缴费名单
+
+
已审核
未审核
+
+ 一键通知未审核工会
+
+ ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
{
+ this.formLoading = true
+ this.$axios.post(loc() + "/notifyUnapprovedUnionChairman", {
+ year: this.pageForm.year,
+ aidFundMemberUserType: this.pageForm.aidFundMemberUserType,
+ changeType: this.pageForm.changeType
+ }).then((res) => {
+ if (res.code === 0) {
+ const loginNames = res.data || []
+ this.$alert(loginNames.length ? loginNames.join("、") : "暂无需要发送通知的人员", "需要发送人的工号", {
+ confirmButtonText: "确定"
+ })
+ }
+ }).finally(() => {
+ this.formLoading = false
+ })
+ })
+ },
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
From 9b92c2919757d3164d7ecf0594a0c36309228809 Mon Sep 17 00:00:00 2001
From: zhangrui
Date: Sat, 25 Apr 2026 11:41:14 +0800
Subject: [PATCH 2/9] =?UTF-8?q?bug=E6=95=B4=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../OutlayManageUnionAllocateService.java | 41 +++++
.../OutlayManageUnionAllocateServiceImpl.java | 150 ++++++++++++++++++
.../OutlayManageUnionAllocateController.java | 62 ++++++++
.../DifficultHelpApplyController.java | 19 ++-
.../service/DifficultHelpCommonService.java | 18 +++
.../impl/DifficultHelpCommonServiceImpl.java | 32 ++++
.../outlay/activityBudget/apply/index.html | 8 +-
.../outlayManage/union/allocate/index.html | 150 ++++++++++++++++--
.../difficulthelp/apply/index.html | 13 +-
.../schoolunionapproval/index.html | 2 +-
.../unionLeaderApproval/index.html | 19 ++-
11 files changed, 486 insertions(+), 28 deletions(-)
diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionAllocateService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionAllocateService.java
index e9daa959..8b8ac9f1 100644
--- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionAllocateService.java
+++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionAllocateService.java
@@ -3,8 +3,12 @@ package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutLayAllocateUnion;
+import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.vo.OutlayUnionAllocateImportVo;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.nutz.mvc.upload.TempFile;
import java.math.BigDecimal;
+import java.util.List;
/**
* 分工会季度额度分配服务。
@@ -35,6 +39,43 @@ public interface OutlayManageUnionAllocateService extends BaseService只要当前季度记录中存在分配额度大于 0 的有效记录,
+ * 就认为该季度已经分配过额度,前端据此决定是否提示再次分配。
+ *
+ * @param quarterly 要检查的季度,例如 1/2/3/4
+ * @param year 要检查的年份
+ * @return true 已分配过;false 未分配
+ */
+ boolean hasAllocated(Integer quarterly, Integer year);
+
+ /**
+ * 解析导入文件并返回预览数据。
+ *
+ * @param file Excel 文件
+ * @return 解析后的预览数据
+ */
+ List readImportExcel(TempFile file);
+
+ /**
+ * 根据导入数据按分工会逐条分配季度额度。
+ *
+ * @param importList 导入预览数据
+ * @param quarterly 当前季度
+ * @param year 当前年度
+ * @return 导入分配结果
+ */
+ Result doImportAllocate(List importList, Integer quarterly, Integer year);
+
+ /**
+ * 导出分工会额度导入模板。
+ *
+ * @return 模板工作簿
+ */
+ Workbook exportImportTemplate();
+
/**
* 重置当前季度的分配记录。
*
diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionAllocateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionAllocateServiceImpl.java
index e4dcee80..91af4325 100644
--- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionAllocateServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionAllocateServiceImpl.java
@@ -1,20 +1,36 @@
package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.impl;
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.hutool.core.io.FileUtil;
import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionAllocateService;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutLayAllocateUnion;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutlayManageUnion;
+import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.vo.OutlayUnionAllocateImportVo;
+import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
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.mvc.upload.TempFile;
import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* 分工会季度额度分配实现。
@@ -57,6 +73,140 @@ public class OutlayManageUnionAllocateServiceImpl extends BaseServiceImpl", BigDecimal.ZERO));
+ return count > 0;
+ }
+
+ @Override
+ public List readImportExcel(TempFile file) {
+ String extName = FileUtil.extName(file.getFile());
+ if (!"xlsx".equalsIgnoreCase(extName) && !"xls".equalsIgnoreCase(extName)) {
+ throw Lang.makeThrow("请上传xlsx或xls格式文件");
+ }
+ List importList = ExcelImportUtil.importExcel(file.getFile(),
+ OutlayUnionAllocateImportVo.class, new ImportParams());
+ List unionList = dao().query(Sys_union.class, Cnd.NEW());
+ Map unionMap = new HashMap<>();
+ for (Sys_union union : unionList) {
+ unionMap.put(union.getUnionCode(), union);
+ }
+ Set duplicateUnionCodeSet = new LinkedHashSet<>();
+ Set existUnionCodeSet = new LinkedHashSet<>();
+ for (OutlayUnionAllocateImportVo item : importList) {
+ if (StrUtil.isBlank(item.getUnionCode())) {
+ continue;
+ }
+ if (!existUnionCodeSet.add(item.getUnionCode())) {
+ duplicateUnionCodeSet.add(item.getUnionCode());
+ }
+ }
+ for (int i = 0; i < importList.size(); i++) {
+ OutlayUnionAllocateImportVo item = importList.get(i);
+ item.setRowNum(i + 2);
+ if (StrUtil.isBlank(item.getUnionCode())) {
+ item.setErrMsg("工会编码不能为空");
+ continue;
+ }
+ if (item.getAllocateMoney() == null) {
+ item.setErrMsg("分配额度不能为空");
+ continue;
+ }
+ if (item.getAllocateMoney().compareTo(BigDecimal.ZERO) < 0) {
+ item.setErrMsg("分配额度不能小于0");
+ continue;
+ }
+ Sys_union union = unionMap.get(item.getUnionCode());
+ if (Lang.isEmpty(union)) {
+ item.setErrMsg("工会编码不存在");
+ continue;
+ }
+ item.setUnionName(union.getName());
+ if (duplicateUnionCodeSet.contains(item.getUnionCode())) {
+ item.setErrMsg("工会编码重复");
+ }
+ }
+ return importList;
+ }
+
+ @Override
+ public Result doImportAllocate(List importList, Integer quarterly, Integer year) {
+ if (importList == null || importList.isEmpty()) {
+ return Result.error("请先上传导入数据");
+ }
+ List allocateUnionList = dao().query(OutLayAllocateUnion.class,
+ Cnd.where(OutLayAllocateUnion::getQuarterly, "=", quarterly)
+ .and(OutLayAllocateUnion::getYear, "=", year)
+ .and(OutLayAllocateUnion::getDelFlag, "=", false));
+ if (allocateUnionList == null || allocateUnionList.isEmpty()) {
+ return Result.error("当前季度没有分配记录!");
+ }
+ List unionList = dao().query(Sys_union.class, Cnd.NEW());
+ Map unionMap = new HashMap<>();
+ for (Sys_union union : unionList) {
+ unionMap.put(union.getUnionCode(), union);
+ }
+ Map allocateUnionMap = new HashMap<>();
+ for (OutLayAllocateUnion allocateUnion : allocateUnionList) {
+ allocateUnionMap.put(allocateUnion.getUnionId(), allocateUnion);
+ }
+ List errorList = new ArrayList<>();
+ for (OutlayUnionAllocateImportVo item : importList) {
+ if (StrUtil.isBlank(item.getUnionCode())) {
+ errorList.add("第" + item.getRowNum() + "行:工会编码不能为空");
+ continue;
+ }
+ if (item.getAllocateMoney() == null) {
+ errorList.add("第" + item.getRowNum() + "行:分配额度不能为空");
+ continue;
+ }
+ if (item.getAllocateMoney().compareTo(BigDecimal.ZERO) < 0) {
+ errorList.add("第" + item.getRowNum() + "行:分配额度不能小于0");
+ continue;
+ }
+ if (StrUtil.isNotBlank(item.getErrMsg())) {
+ errorList.add("第" + item.getRowNum() + "行:" + item.getErrMsg());
+ continue;
+ }
+ Sys_union union = unionMap.get(item.getUnionCode());
+ if (Lang.isEmpty(union)) {
+ errorList.add("第" + item.getRowNum() + "行:工会编码不存在");
+ continue;
+ }
+ if (!allocateUnionMap.containsKey(union.getId())) {
+ errorList.add("第" + item.getRowNum() + "行:当前季度未生成该分工会分配记录");
+ }
+ }
+ if (!errorList.isEmpty()) {
+ return Result.error(String.join(";", errorList));
+ }
+ for (OutlayUnionAllocateImportVo item : importList) {
+ Sys_union union = unionMap.get(item.getUnionCode());
+ OutLayAllocateUnion allocateUnion = allocateUnionMap.get(union.getId());
+ // 导入分配与手工分配保持同一套金额同步规则,确保季度表和年度预算表数据一致。
+ applyAllocateMoney(allocateUnion, item.getAllocateMoney());
+ }
+ return Result.success("导入分配成功");
+ }
+
+ @Override
+ public Workbook exportImportTemplate() {
+ List entityList = new ArrayList<>();
+ entityList.add(new ExcelExportEntity("工会编码", "unionCode", 20));
+ entityList.add(new ExcelExportEntity("分配额度", "allocateMoney", 20));
+ ExportParams exportParams = new ExportParams();
+ exportParams.setType(ExcelType.XSSF);
+ return ExcelExportUtil.exportExcel(exportParams, entityList, new ArrayList<>());
+ }
+
@Override
public Result deleteAllocateRecord() {
int currentQuarter = getCurrentQuarter();
diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionAllocateController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionAllocateController.java
index 9112d0fe..27bd53fe 100644
--- a/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionAllocateController.java
+++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/union/controller/OutlayManageUnionAllocateController.java
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.controller;
+import com.budwk.app.base.utils.CommonDownloadUtil;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
@@ -12,9 +13,11 @@ import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.OutlayManageUnionAllocateService;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutLayAllocateUnion;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.model.OutlayManageUnion;
+import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.union.vo.OutlayUnionAllocateImportVo;
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.Cnd;
import org.nutz.dao.Sqls;
@@ -22,11 +25,17 @@ import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
+import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
+import org.nutz.mvc.annotation.POST;
+import org.nutz.mvc.upload.TempFile;
+import org.nutz.mvc.upload.UploadAdaptor;
+import org.nutz.mvc.annotation.AdaptBy;
+import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -107,6 +116,59 @@ public class OutlayManageUnionAllocateController {
return outlayManageUnionAllocateService.doBatchAllocate(allocateMoney, quarterly, year);
}
+ @At
+ @ApiOperation("校验当前季度是否已分配额度")
+ @SaCheckPermission("outlay.outlayManage.union.allocate")
+ public Result hasAllocated(@Param("quarterly") Integer quarterly,
+ @Param("year") Integer year) {
+ if (quarterly == null || year == null) {
+ return Result.error("参数错误!");
+ }
+ return Result.success(outlayManageUnionAllocateService.hasAllocated(quarterly, year));
+ }
+
+ @At
+ @POST
+ @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
+ @ApiOperation("读取导入分配Excel")
+ @SaCheckPermission("outlay.outlayManage.union.allocate")
+ public Result readImportExcel(TempFile file) {
+ try {
+ return Result.success(outlayManageUnionAllocateService.readImportExcel(file));
+ } catch (Exception e) {
+ log.error("读取分工会额度导入文件失败", e);
+ return Result.error(e.getMessage());
+ }
+ }
+
+ @At
+ @ApiOperation("导入分配分工会额度")
+ @Aop(TransAop.READ_COMMITTED)
+ @SLog(tag = "分工会预算-季度预算分配", msg = "导入分配分工会额度")
+ @SaCheckPermission("outlay.outlayManage.union.allocate")
+ public Result doImportAllocate(String data,
+ @Param("quarterly") Integer quarterly,
+ @Param("year") Integer year) {
+ if (StrUtil.isBlank(data) || quarterly == null || year == null) {
+ return Result.error("参数错误!");
+ }
+ List importList = Json.fromJsonAsList(OutlayUnionAllocateImportVo.class, data);
+ return outlayManageUnionAllocateService.doImportAllocate(importList, quarterly, year);
+ }
+
+ @At
+ @Ok("void")
+ @ApiOperation("下载导入分配模板")
+ @SaCheckPermission("outlay.outlayManage.union.allocate")
+ public void downloadImportTemplate(HttpServletResponse response) {
+ try {
+ Workbook workbook = outlayManageUnionAllocateService.exportImportTemplate();
+ CommonDownloadUtil.download("分工会额度导入模板.xlsx", workbook, response);
+ } catch (Exception e) {
+ log.error("下载分工会额度导入模板失败", e);
+ }
+ }
+
@At
@ApiOperation("重置预算季度记录")
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/controller/DifficultHelpApplyController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/controller/DifficultHelpApplyController.java
index 9172c36e..c003d660 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/controller/DifficultHelpApplyController.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/controller/DifficultHelpApplyController.java
@@ -84,6 +84,9 @@ public class DifficultHelpApplyController {
public Result getIsCanPlay() {
//获取申请次数,不想再写一个接口, are you ok? .and("zt", "=", 600)
int applyCount = dao.count(DifficultHelpInfo.class, Cnd.where("proxyUserId", "=", SecurityUtil.getUserId()));
+ // 页面初始化时需要先判断当前登录人本年度是否已经申请过,避免重复进入新增申请。
+ boolean hasCurrentYearApply = dao.count(DifficultHelpInfo.class, Cnd.where("userId", "=", SecurityUtil.getUserId())
+ .and("YEAR(applyTime)", "=", DateUtil.getYear())) > 0;
Sys_config startConfig = dao.fetch(Sys_config.class, Cnd.where("configKey", "=", "DifficultyApplyStartTime"));
Sys_config endConfig = dao.fetch(Sys_config.class, Cnd.where("configKey", "=", "DifficultyApplyEndTime"));
if(startConfig != null && endConfig != null) {
@@ -98,9 +101,9 @@ public class DifficultHelpApplyController {
int endResult = cn.hutool.core.date.DateUtil.compare(cn.hutool.core.date.DateUtil.parse(today), cn.hutool.core.date.DateUtil.parse(end));
String time = startConfig.getConfigValue().replace("-", "月") + "日-" + endConfig.getConfigValue().replace("-", "月") + "日";
- return Result.success(Map.of("applyCount", applyCount,"time", time, "result", startResult >=0 && endResult <= 0));
+ return Result.success(Map.of("applyCount", applyCount,"time", time, "result", startResult >=0 && endResult <= 0, "hasCurrentYearApply", hasCurrentYearApply));
} else {
- return Result.success(Map.of("applyCount", applyCount,"time", "", "result", false));
+ return Result.success(Map.of("applyCount", applyCount,"time", "", "result", false, "hasCurrentYearApply", hasCurrentYearApply));
}
}
@@ -110,6 +113,10 @@ public class DifficultHelpApplyController {
@SLog(tag = "困难补助申请", msg = "保存申请,填写人: ${args[0].proxyUserName}")
public Result save(@Param("data") DifficultHelpInfo difficultHelpInfo) {
difficultHelpInfo.setApplyTime(ObjectUtil.defaultIfNull(difficultHelpInfo.getApplyTime(), new Date()));
+ difficultHelpCommonService.refreshApplyCount(difficultHelpInfo);
+ if (difficultHelpCommonService.hasAppliedInYear(difficultHelpInfo.getUserId(), difficultHelpInfo.getApplyTime(), difficultHelpInfo.getId())) {
+ return Result.error("该人员本年度已申请困难帮扶,不能重复申请");
+ }
dao.insertOrUpdate(difficultHelpInfo);
return Result.success();
}
@@ -122,6 +129,10 @@ public class DifficultHelpApplyController {
@SLog(tag = "困难补助申请", msg = "提交申请,填写人: ${args[0].proxyUserName}")
public Result submit(@Param("data") DifficultHelpInfo difficultHelpInfo){
difficultHelpInfo.setApplyTime(new Date());
+ difficultHelpCommonService.refreshApplyCount(difficultHelpInfo);
+ if (difficultHelpCommonService.hasAppliedInYear(difficultHelpInfo.getUserId(), difficultHelpInfo.getApplyTime(), difficultHelpInfo.getId())) {
+ return Result.error("该人员本年度已申请困难帮扶,不能重复申请");
+ }
dao.insertOrUpdate(difficultHelpInfo);
// 开启流程实例
@@ -146,6 +157,10 @@ public class DifficultHelpApplyController {
@SLog(tag = "困难补助申请", msg = "重新提交申请,填写人: ${args[0].proxyUserName}")
public Result submitAgain(@Param("data") DifficultHelpInfo difficultHelpInfo, @Param("taskId") Long taskId) {
difficultHelpInfo.setApplyTime(ObjectUtil.defaultIfNull(difficultHelpInfo.getApplyTime(), new Date()));
+ difficultHelpCommonService.refreshApplyCount(difficultHelpInfo);
+ if (difficultHelpCommonService.hasAppliedInYear(difficultHelpInfo.getUserId(), difficultHelpInfo.getApplyTime(), difficultHelpInfo.getId())) {
+ return Result.error("该人员本年度已申请困难帮扶,不能重复申请");
+ }
dao.insertOrUpdate(difficultHelpInfo);
Dict dict = Dict.create();
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/DifficultHelpCommonService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/DifficultHelpCommonService.java
index 81fa16be..dfa46c34 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/DifficultHelpCommonService.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/DifficultHelpCommonService.java
@@ -7,6 +7,7 @@ import com.budwk.app.zhgh.staffbenefit.medicalMutualAid.aidFund.param.AidFundPag
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.upload.TempFile;
+import java.util.Date;
import java.util.List;
/**
@@ -26,4 +27,21 @@ public interface DifficultHelpCommonService extends BaseService getYearPayList(DifficultHelpPageParam pageForm);
+
+ /**
+ * 校验同一受补助人同一年是否已存在申请记录。
+ *
+ * @param userId 受补助人id
+ * @param applyTime 申请时间
+ * @param excludeRecordId 排除的当前记录id,编辑/重新提交时使用
+ * @return true 已存在同年申请记录
+ */
+ boolean hasAppliedInYear(String userId, Date applyTime, String excludeRecordId);
+
+ /**
+ * 新申请时按历史总申请次数重新计算申请次数字段,已有记录则保留原值。
+ *
+ * @param difficultHelpInfo 申请信息
+ */
+ void refreshApplyCount(DifficultHelpInfo difficultHelpInfo);
}
diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/impl/DifficultHelpCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/impl/DifficultHelpCommonServiceImpl.java
index 49e126c2..0ef9198b 100644
--- a/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/impl/DifficultHelpCommonServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/difficulthelp/service/impl/DifficultHelpCommonServiceImpl.java
@@ -50,6 +50,38 @@ public class DifficultHelpCommonServiceImpl extends BaseServiceImpl", excludeRecordId);
+ }
+ // 按受补助人和申请年份校验,确保同一个人每年只能保留一条申请记录。
+ return dao().count(DifficultHelpInfo.class, cnd) > 0;
+ }
+
+ @Override
+ public void refreshApplyCount(DifficultHelpInfo difficultHelpInfo) {
+ if (difficultHelpInfo == null || StrUtil.isBlank(difficultHelpInfo.getUserId())) {
+ return;
+ }
+ if (StrUtil.isNotBlank(difficultHelpInfo.getId())) {
+ DifficultHelpInfo dbInfo = dao().fetch(DifficultHelpInfo.class, difficultHelpInfo.getId());
+ if (dbInfo != null) {
+ // 已存在的申请记录沿用原申请次数,避免编辑或重新提交时重复累加。
+ difficultHelpInfo.setApplyCount(dbInfo.getApplyCount());
+ return;
+ }
+ }
+ int historyApplyCount = dao().count(DifficultHelpInfo.class, Cnd.where("userId", "=", difficultHelpInfo.getUserId()));
+ // 新申请记录按历史总申请次数 + 1 重新计算申请次数,不使用前端传入值。
+ difficultHelpInfo.setApplyCount(historyApplyCount + 1);
+ }
+
@Override
public List getYearPayList(DifficultHelpPageParam pageForm) {
// 1. 生成年份列表
diff --git a/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html b/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html
index 2806c48f..8de3835d 100644
--- a/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html
+++ b/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html
@@ -249,24 +249,24 @@ layout("/layouts/platform.html"){
async getActivityBudgetType() {
const data = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
let budgetTypeOption = []
- if (this.$auth.hasRoleOr(['SYSADMIN'])) {
+ if (this.$auth.hasPermission(['activity.budget.apply.system'])) {
this.budgetTypeOption = data
} else {
- if (this.$auth.hasRoleOr(['SCHOOL_UNION_ADMIN'])) {
+ if (this.$auth.hasPermission(['activity.budget.apply.schoolAdmin'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_ONE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
- if (this.$auth.hasRoleOr(['BRANCH_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])) {
+ if (this.$auth.hasPermission(['activity.budget.apply.branchAdmin'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_TWO"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
- if (this.$auth.hasRoleOr(['CLUB_PRESIDENT'])) {
+ if (this.$auth.hasPermission(['activity.budget.apply.clubPresident'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(v.code)) {
budgetTypeOption.push(v)
diff --git a/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/allocate/index.html b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/allocate/index.html
index 370df3b5..a7cd5e53 100644
--- a/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/allocate/index.html
+++ b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/allocate/index.html
@@ -98,13 +98,54 @@ layout("/layouts/platform.html"){
-
+
-
+
+
+ 统一分配
+ 导入分配
+
+
+
+
+
+ 下载模板
+ 请按模板填写工会编码和分配额度,导入后将按工会逐条分配。
+
+
+
+
+ 将Excel文件拖到此处,或点击上传
+
+
+
+
+
+
+
+
+
+
+ {{row.errMsg}}
+ 通过
+
+
+
+
+