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 new file mode 100644 index 00000000..e9daa959 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/OutlayManageUnionAllocateService.java @@ -0,0 +1,47 @@ +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 java.math.BigDecimal; + +/** + * 分工会季度额度分配服务。 + * + *

该服务统一处理季度额度的分配、批量分配和重置回滚, + * 保证季度记录与年度预算表金额始终同步。

+ * + * @author zhf + */ +public interface OutlayManageUnionAllocateService extends BaseService { + + /** + * 修改单个分工会的季度分配金额。 + * + * @param id outlay_allocate_union 表主键,用于定位当前编辑的季度分配记录 + * @param allocateMoney 本次要设置的季度分配金额,传入的是最终金额,不是增量金额 + * @return Result 成功时返回 success;失败时返回错误信息,前端据此提示用户 + */ + Result doEdit(String id, BigDecimal allocateMoney); + + /** + * 批量设置某一季度所有分工会的分配金额。 + * + * @param allocateMoney 本次批量设置的季度分配金额,所有命中的分工会都会写入该金额 + * @param quarterly 要操作的季度,例如 1/2/3/4 + * @param year 要操作的年份,用于筛选对应季度的有效分配记录 + * @return Result 成功时返回 success;失败时返回错误信息 + */ + Result doBatchAllocate(BigDecimal allocateMoney, Integer quarterly, Integer year); + + /** + * 重置当前季度的分配记录。 + * + *

重置时会先回滚 outlay_manage_union.totalQuota, + * 再将当前季度的 outlay_allocate_union 记录标记删除。

+ * + * @return Result 成功时返回 success;失败时返回错误信息 + */ + Result deleteAllocateRecord(); +} 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 new file mode 100644 index 00000000..e4dcee80 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/outlay/outlayManage/service/impl/OutlayManageUnionAllocateServiceImpl.java @@ -0,0 +1,167 @@ +package com.budwk.app.zhgh.dayofficework.outlay.outlayManage.service.impl; + +import cn.hutool.core.date.DateUtil; +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 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 java.math.BigDecimal; +import java.util.List; + +/** + * 分工会季度额度分配实现。 + * + * @author zhf + */ +@IocBean(args = {"refer:dao"}) +public class OutlayManageUnionAllocateServiceImpl extends BaseServiceImpl implements OutlayManageUnionAllocateService { + + public OutlayManageUnionAllocateServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Result doEdit(String id, BigDecimal allocateMoney) { + OutLayAllocateUnion allocateUnion = fetch(id); + if (Lang.isEmpty(allocateUnion)) { + return Result.error("分配记录不存在!"); + } + int currentQuarter = getCurrentQuarter(); + if (allocateUnion.getQuarterly() < currentQuarter) { + return Result.error("当前是第【" + currentQuarter + "季度】无法修改【第" + allocateUnion.getQuarterly() + "季度】的额度!"); + } + applyAllocateMoney(allocateUnion, allocateMoney); + return Result.success(); + } + + @Override + public Result doBatchAllocate(BigDecimal allocateMoney, Integer quarterly, Integer year) { + 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("当前季度没有分配记录!"); + } + for (OutLayAllocateUnion allocateUnion : allocateUnionList) { + applyAllocateMoney(allocateUnion, allocateMoney); + } + return Result.success(); + } + + @Override + public Result deleteAllocateRecord() { + int currentQuarter = getCurrentQuarter(); + List allocateUnionList = dao().query(OutLayAllocateUnion.class, + Cnd.where(OutLayAllocateUnion::getQuarterly, "=", currentQuarter) + .and(OutLayAllocateUnion::getYear, "=", DateUtil.thisYear()) + .and(OutLayAllocateUnion::getDelFlag, "=", false)); + if (allocateUnionList == null || allocateUnionList.isEmpty()) { + return Result.error("当前季度还未分配,无法重置!"); + } + + for (OutLayAllocateUnion allocateUnion : allocateUnionList) { + rollbackAllocateMoney(allocateUnion); + } + + dao().update(OutLayAllocateUnion.class, Chain.make("delFlag", true), + Cnd.where(OutLayAllocateUnion::getQuarterly, "=", currentQuarter) + .and(OutLayAllocateUnion::getYear, "=", DateUtil.thisYear()) + .and(OutLayAllocateUnion::getDelFlag, "=", false)); + return Result.success(); + } + + /** + * 按“先回退旧额度,再写入新额度”的方式同步季度记录和年度预算表。 + * + * @param allocateUnion 当前季度分配记录,包含分工会、年份、旧分配额度等上下文 + * @param newAllocateMoney 本次最终要保存的季度分配金额 + */ + private void applyAllocateMoney(OutLayAllocateUnion allocateUnion, BigDecimal newAllocateMoney) { + BigDecimal oldAllocateMoney = defaultValue(allocateUnion.getAllocateMoney()); + OutlayManageUnion manageUnion = dao().fetch(OutlayManageUnion.class, + Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) + .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear())); + + if (Lang.isEmpty(manageUnion)) { + manageUnion = buildManageUnion(allocateUnion, newAllocateMoney); + insert(manageUnion); + } else { + // 当前 totalQuota 里已经包含了旧季度额度,因此要先减旧值,再加新值,避免重复累加。 + BigDecimal newTotalQuota = defaultValue(manageUnion.getTotalQuota()) + .subtract(oldAllocateMoney) + .add(newAllocateMoney); + dao().update(OutlayManageUnion.class, Chain.make("totalQuota", newTotalQuota), + Cnd.where(OutlayManageUnion::getId, "=", manageUnion.getId())); + } + + dao().update(OutLayAllocateUnion.class, Chain.make("allocateMoney", newAllocateMoney), + Cnd.where(OutLayAllocateUnion::getId, "=", allocateUnion.getId())); + } + + /** + * 回滚当前季度已分配到年度预算表中的金额。 + * + * @param allocateUnion 当前季度分配记录,allocateMoney 表示本次需要从年度额度中扣回的金额 + */ + private void rollbackAllocateMoney(OutLayAllocateUnion allocateUnion) { + OutlayManageUnion manageUnion = dao().fetch(OutlayManageUnion.class, + Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) + .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear())); + if (Lang.isEmpty(manageUnion)) { + return; + } + BigDecimal newTotalQuota = defaultValue(manageUnion.getTotalQuota()) + .subtract(defaultValue(allocateUnion.getAllocateMoney())); + dao().update(OutlayManageUnion.class, Chain.make("totalQuota", newTotalQuota), + Cnd.where(OutlayManageUnion::getId, "=", manageUnion.getId())); + } + + /** + * 当前年份预算表不存在时,按“分配前额度 + 本次分配额度”创建年度预算记录。 + * + * @param allocateUnion 当前季度分配记录,allocateHeadMoney 表示生成记录时的剩余额度快照 + * @param allocateMoney 本次要设置的季度分配额度 + * @return OutlayManageUnion 新建的年度预算实体 + */ + private OutlayManageUnion buildManageUnion(OutLayAllocateUnion allocateUnion, BigDecimal allocateMoney) { + Sys_union union = dao().fetch(Sys_union.class, allocateUnion.getUnionId()); + OutlayManageUnion manageUnion = new OutlayManageUnion(); + manageUnion.setYear(DateUtil.thisYear()); + manageUnion.setUnionId(allocateUnion.getUnionId()); + manageUnion.setTotalQuota(defaultValue(allocateUnion.getAllocateHeadMoney()).add(allocateMoney)); + manageUnion.setUsedQuota(BigDecimal.ZERO); + if (Lang.isNotEmpty(union)) { + manageUnion.setUnionName(union.getName()); + manageUnion.setUnionCode(union.getUnionCode()); + } + return manageUnion; + } + + /** + * 统一处理空金额,避免金额运算时出现空指针。 + * + * @param value 可能为空的金额字段 + * @return BigDecimal 非空金额;为空时返回 0 + */ + private BigDecimal defaultValue(BigDecimal value) { + return value == null ? BigDecimal.ZERO : value; + } + + /** + * 计算当前自然季度。 + * + * @return int 当前季度,取值范围 1-4 + */ + private int getCurrentQuarter() { + return DateUtil.month(DateUtil.date()) / 3 + 1; + } +} 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 9edd6f48..9112d0fe 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 @@ -9,13 +9,13 @@ import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; 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 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.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; @@ -45,6 +45,8 @@ public class OutlayManageUnionAllocateController { @Inject private BaseService baseService; + @Inject + private OutlayManageUnionAllocateService outlayManageUnionAllocateService; @At("") @Ok("beetl:/platform/zhgh/dayofficework/outlay/outlayManage/union/allocate/index.html") @@ -88,59 +90,7 @@ public class OutlayManageUnionAllocateController { if (StrUtil.isEmpty(allocateMoney) || StrUtil.isEmpty(id)) { return Result.error("参数错误!"); } - - - OutLayAllocateUnion allocateUnion = baseService.dao().fetch(OutLayAllocateUnion.class, id); - int quarter = DateUtil.month(DateUtil.date()) / 3 + 1; - if (allocateUnion.getQuarterly() < quarter) { - return Result.error("当前是第【" + quarter + "季度】无法修改【第" + allocateUnion.getQuarterly() + "季度】的额度!"); - } - - baseService.dao().update(OutLayAllocateUnion.class, Chain.make("allocateMoney", allocateMoney), - Cnd.where(OutLayAllocateUnion::getId, "=", id)); - - //找出今年工会的预算表 - OutlayManageUnion newOutlayManageUnion = baseService.dao().fetch(OutlayManageUnion.class, - Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) - .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear())); - - if (allocateUnion.getQuarterly() == 1) { - //如果是第一季度,添加年度预算表 - Sys_union union = baseService.dao().fetch(Sys_union.class, allocateUnion.getUnionId()); - //找出去年剩余的钱 - OutlayManageUnion oldOutlayManageUnion = baseService.dao().fetch(OutlayManageUnion.class, - Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) - .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear() - 1)); - - BigDecimal newTotalQuota = Lang.isNotEmpty(oldOutlayManageUnion) ? oldOutlayManageUnion.getTotalQuota().subtract(oldOutlayManageUnion.getUsedQuota()) : new BigDecimal(allocateMoney); - - if (Lang.isNotEmpty(newOutlayManageUnion)) { - //如果有今年的预算,代表第一季度已经分配过一次,现在修改 - newOutlayManageUnion.setTotalQuota(newTotalQuota); - baseService.update(newOutlayManageUnion); - } else { - OutlayManageUnion manageUnion = new OutlayManageUnion(); - manageUnion.setYear(DateUtil.thisYear()); - manageUnion.setUnionId(union.getId()); - manageUnion.setUnionName(union.getName()); - manageUnion.setUnionCode(union.getUnionCode()); - //找出去年剩余多少钱, - if (Lang.isNotEmpty(oldOutlayManageUnion)) { - BigDecimal surplusMoney = oldOutlayManageUnion.getTotalQuota().subtract(oldOutlayManageUnion.getUsedQuota()); - //去年剩余的钱加上当年的分配金额 - manageUnion.setTotalQuota(surplusMoney.add(new BigDecimal(allocateMoney))); - } else { - manageUnion.setTotalQuota(new BigDecimal(allocateMoney)); - } - manageUnion.setUsedQuota(BigDecimal.ZERO); - baseService.insert(manageUnion); - } - } else { - baseService.dao().update(OutlayManageUnion.class, - Chain.make("totalQuota", newOutlayManageUnion.getTotalQuota().add(new BigDecimal(allocateMoney))), - Cnd.where(OutlayManageUnion::getId, "=", newOutlayManageUnion.getId())); - } - return Result.success(); + return outlayManageUnionAllocateService.doEdit(id, new BigDecimal(allocateMoney)); } @At @@ -151,79 +101,20 @@ public class OutlayManageUnionAllocateController { public Result doBatchAllocate(@Param("allocateMoney") BigDecimal allocateMoney, @Param("quarterly") Integer quarterly, @Param("year") Integer year) { - List allocateUnionList = baseService.dao().query(OutLayAllocateUnion.class, - Cnd.where(OutLayAllocateUnion::getQuarterly, "=", quarterly) - .and(OutLayAllocateUnion::getYear, "=", year) - .and(OutLayAllocateUnion::getDelFlag, "=", 0)); - - if (allocateUnionList == null || allocateUnionList.isEmpty()) { - return Result.error("当前季度没有分配记录!"); + if (allocateMoney == null || quarterly == null || year == null) { + return Result.error("参数错误!"); } - - for (OutLayAllocateUnion allocateUnion : allocateUnionList) { - baseService.dao().update(OutLayAllocateUnion.class, - Chain.make("allocateMoney", allocateMoney), - Cnd.where(OutLayAllocateUnion::getId, "=", allocateUnion.getId())); - - OutlayManageUnion newOutlayManageUnion = baseService.dao().fetch(OutlayManageUnion.class, - Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) - .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear())); - - if (allocateUnion.getQuarterly() == 1) { - Sys_union union = baseService.dao().fetch(Sys_union.class, allocateUnion.getUnionId()); - OutlayManageUnion oldOutlayManageUnion = baseService.dao().fetch(OutlayManageUnion.class, - Cnd.where(OutlayManageUnion::getUnionId, "=", allocateUnion.getUnionId()) - .and(OutlayManageUnion::getYear, "=", DateUtil.thisYear() - 1)); - - BigDecimal newTotalQuota = Lang.isNotEmpty(oldOutlayManageUnion) - ? oldOutlayManageUnion.getTotalQuota().subtract(oldOutlayManageUnion.getUsedQuota()) - : allocateMoney; - - if (Lang.isNotEmpty(newOutlayManageUnion)) { - newOutlayManageUnion.setTotalQuota(newTotalQuota); - baseService.update(newOutlayManageUnion); - } else { - OutlayManageUnion manageUnion = new OutlayManageUnion(); - manageUnion.setYear(DateUtil.thisYear()); - manageUnion.setUnionId(union.getId()); - manageUnion.setUnionName(union.getName()); - manageUnion.setUnionCode(union.getUnionCode()); - if (Lang.isNotEmpty(oldOutlayManageUnion)) { - BigDecimal surplusMoney = oldOutlayManageUnion.getTotalQuota().subtract(oldOutlayManageUnion.getUsedQuota()); - manageUnion.setTotalQuota(surplusMoney.add(allocateMoney)); - } else { - manageUnion.setTotalQuota(allocateMoney); - } - manageUnion.setUsedQuota(BigDecimal.ZERO); - baseService.insert(manageUnion); - } - } else { - baseService.dao().update(OutlayManageUnion.class, - Chain.make("totalQuota", newOutlayManageUnion.getTotalQuota().add(allocateMoney)), - Cnd.where(OutlayManageUnion::getId, "=", newOutlayManageUnion.getId())); - } - } - return Result.success(); + return outlayManageUnionAllocateService.doBatchAllocate(allocateMoney, quarterly, year); } @At @ApiOperation("重置预算季度记录") + @Aop(TransAop.READ_COMMITTED) @SLog(tag = "分工会预算-季度预算分配", msg = "重置预算季度记录") @SaCheckPermission("outlay.outlayManage.union.allocate") public Result deleteAllocateRecord() { - int quarter = DateUtil.month(DateUtil.date()) / 3 + 1; - // 查询当前季度 - int count = baseService.dao().count(OutLayAllocateUnion.class, Cnd.where(OutLayAllocateUnion::getQuarterly, "=", quarter) - .and(OutLayAllocateUnion::getYear, "=", DateUtil.thisYear())); - if (count == 0) { - return Result.error("当前季度还未分配,无法重置!"); - } - - baseService.dao().update(OutLayAllocateUnion.class, Chain.make("delFlag", 1), - Cnd.where(OutLayAllocateUnion::getQuarterly, "=", quarter) - .and(OutLayAllocateUnion::getYear, "=", DateUtil.thisYear())); - return Result.success(); + return outlayManageUnionAllocateService.deleteAllocateRecord(); } @At 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 6c9910c9..7320083c 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 @@ -59,7 +59,7 @@ public class AIdFundPayRecordController { @At("") - @Ok("beetl:/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/paexportYearPayRecordyRecord/index.html") + @Ok("beetl:/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/payRecord/index.html") @SaCheckPermission("medicalMutualAid.aidFund.payRecord") public void index() { }