diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 862c522..32cd934 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.budwk - zhgh_jshvc + mini 5.6.0-plus diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementApplyController.java index 117c64a..53d99f2 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementApplyController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; @@ -75,6 +76,12 @@ public class ActivityReimbursementApplyController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.apply") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/apply/index.html") + public void h5Index() { + } + @At @SaCheckPermission("activityReimbursement.apply") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/apply/form.html") @@ -84,7 +91,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("保存申请") - @SaCheckPermission("member.apply.submit") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) @SLog(tag = "活动申报", msg = "保存申请,申请人: ${args[0].username}") public Result save(@Param("data") ActivityReimbursementInfo activityReimbursementInfo) { activityReimbursementInfo.setUserId(SecurityUtil.getUserId()); @@ -113,7 +120,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("提交申请") @Aop(TransAop.READ_COMMITTED) - @SaCheckPermission("member.apply.submit") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) @SLog(tag = "活动申报", msg = "提交申请,申请人: ${args[0].username}") public Result submit(@Param("data") ActivityReimbursementInfo activityReimbursementInfo) { activityReimbursementInfo.setUserId(SecurityUtil.getUserId()); @@ -160,7 +167,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("重新提交申请") @Aop(TransAop.READ_COMMITTED) - @SaCheckPermission("member.apply.submit") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) @SLog(tag = "活动申报", msg = "重新提交申请,申请人: ${args[0].username}") public Result submitAgain(@Param("data") ActivityReimbursementInfo activityReimbursementInfo, @Param("taskId") Long taskId) { if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) { @@ -191,7 +198,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("获取当前用户活动报销") - @SaCheckPermission("activityReimbursement.apply") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) public Result getActivityReimbursementByUser(String id, String outlayManageSource, String clubId) { String activityType = ""; if (StrUtil.isNotBlank(id)) { @@ -286,7 +293,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("获取收款人卡号") - @SaCheckPermission("activityReimbursement.apply") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) public Result getCardNumberByPayeeId(String username) { Sql sql = Sqls.create(""" SELECT @@ -315,7 +322,7 @@ public class ActivityReimbursementApplyController { @At @ApiOperation("获取申报的记录") - @SaCheckPermission("activityReimbursement.apply") + @SaCheckPermission(value = {"activityReimbursement.apply", "h5.activityReimbursement.apply"}, mode = SaMode.OR) public Result getBudgetByYear(String outlayManageSource, String clubId) { List budgetMoney = activityReimbursementService.getBudgetMoney(outlayManageSource, clubId); return Result.success(budgetMoney); diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementBranchUnionController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementBranchUnionController.java index 281f1a2..c5f5052 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementBranchUnionController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementBranchUnionController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; @@ -13,6 +14,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -43,6 +45,12 @@ public class ActivityReimbursementBranchUnionController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.branchUnion") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/branchUnion/index.html") + public void h5Index() { + } + @At @SaCheckPermission("activityReimbursement.branchUnion") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/branchunion/form.html") @@ -52,7 +60,7 @@ public class ActivityReimbursementBranchUnionController { @At @ApiOperation("活动报销,分工会审核列表") - @SaCheckPermission("activityReimbursement.branchUnion") + @SaCheckPermission(value = {"activityReimbursement.branchUnion", "h5.activityReimbursement.branchUnion"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -111,6 +119,8 @@ public class ActivityReimbursementBranchUnionController { cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementCashierController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementCashierController.java index aa5743c..d1ba898 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementCashierController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementCashierController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; @@ -15,6 +16,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -43,9 +45,15 @@ public class ActivityReimbursementCashierController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.cashier") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/cashier/index.html") + public void h5Index() { + } + @At @ApiOperation("活动报销,出纳支付列表") - @SaCheckPermission("activityReimbursement.cashier") + @SaCheckPermission(value = {"activityReimbursement.cashier", "h5.activityReimbursement.cashier"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -112,6 +120,8 @@ public class ActivityReimbursementCashierController { cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementClubPrincipalController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementClubPrincipalController.java index 973fbe9..925b7e5 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementClubPrincipalController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementClubPrincipalController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; @@ -13,6 +14,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -43,6 +45,12 @@ public class ActivityReimbursementClubPrincipalController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.clubPrincipal") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/clubPrincipal/index.html") + public void h5Index() { + } + @At @SaCheckPermission("activityReimbursement.clubPrincipal") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/clubprincipal/form.html") @@ -52,7 +60,7 @@ public class ActivityReimbursementClubPrincipalController { @At @ApiOperation("活动报销,协会负责人审核列表") - @SaCheckPermission("activityReimbursement.clubPrincipal") + @SaCheckPermission(value = {"activityReimbursement.clubPrincipal", "h5.activityReimbursement.clubPrincipal"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -111,6 +119,8 @@ public class ActivityReimbursementClubPrincipalController { cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java index 35095b4..d15f04e 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; @@ -22,6 +23,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -58,9 +60,15 @@ public class ActivityReimbursementDeputySchoolUnionController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.deputySchoolUnion") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html") + public void h5Index() { + } + @At @ApiOperation("活动报销,校工会副主席审核") - @SaCheckPermission("activityReimbursement.deputySchoolUnion") + @SaCheckPermission(value = {"activityReimbursement.deputySchoolUnion", "h5.activityReimbursement.deputySchoolUnion"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -131,6 +139,8 @@ public class ActivityReimbursementDeputySchoolUnionController { if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } @@ -140,7 +150,7 @@ public class ActivityReimbursementDeputySchoolUnionController { } else { cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy())); } - cnd.groupBy("info.id"); + cnd.groupBy("t.id"); sql.setCondition(cnd); Pagination pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql); return Result.success().addData(pagination); @@ -148,7 +158,7 @@ public class ActivityReimbursementDeputySchoolUnionController { @At @ApiOperation("预算/报销汇总表") - @SaCheckPermission("activityReimbursement.deputySchoolUnion") + @SaCheckPermission(value = {"activityReimbursement.deputySchoolUnion", "h5.activityReimbursement.deputySchoolUnion"}, mode = SaMode.OR) public Result budgetSummaryData(CommonPageParam pageParam) { if (pageParam.getYear() == null) { return Result.error("请选择年度"); @@ -168,7 +178,7 @@ public class ActivityReimbursementDeputySchoolUnionController { @At @SLog(tag = "报销", msg = "校工会副主席审核了一条记录") - @SaCheckPermission("activityReimbursement.deputySchoolUnion") + @SaCheckPermission(value = {"activityReimbursement.deputySchoolUnion", "h5.activityReimbursement.deputySchoolUnion"}, mode = SaMode.OR) public Result doReview(@Param("data") String param, String id) { Dict args = Json.fromJson(Dict.class, param); if (args.getInt("submitType") == 1) { diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementMineController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementMineController.java index 24fff3a..4ce52f5 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementMineController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementMineController.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controlle import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.convert.NumberChineseFormatter; import cn.hutool.core.convert.NumberWordFormatter; import cn.hutool.core.date.DateUtil; @@ -89,9 +90,15 @@ public class ActivityReimbursementMineController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.mine") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/mine/index.html") + public void h5Index() { + } + @At @ApiOperation("活动报销,我的申请列表") - @SaCheckPermission("activityReimbursement.mine") + @SaCheckPermission(value = {"activityReimbursement.mine", "h5.activityReimbursement.mine"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -215,7 +222,7 @@ public class ActivityReimbursementMineController { @At @Ok("void") - @SaCheckPermission("activityReimbursement.mine") + @SaCheckPermission(value = {"activityReimbursement.mine", "h5.activityReimbursement.mine"}, mode = SaMode.OR) @SLog(tag = "活动报销", msg = "导出报销凭证") public void doExportReimbursement(@Valid String id, HttpServletResponse response) { HashMap docData = new HashMap<>(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolFinanceController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolFinanceController.java index f51fc02..0a44230 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolFinanceController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolFinanceController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; @@ -15,6 +16,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -45,9 +47,15 @@ public class ActivityReimbursementSchoolFinanceController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.schoolFinance") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolFinance/index.html") + public void h5Index() { + } + @At @ApiOperation("活动报销,校工会财务审核") - @SaCheckPermission("activityReimbursement.schoolFinance") + @SaCheckPermission(value = {"activityReimbursement.schoolFinance", "h5.activityReimbursement.schoolFinance"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -114,6 +122,8 @@ public class ActivityReimbursementSchoolFinanceController { cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolPrincipalController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolPrincipalController.java index 734e2d5..b2b7299 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolPrincipalController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolPrincipalController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; @@ -15,6 +16,7 @@ import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Exps; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -46,6 +48,12 @@ public class ActivityReimbursementSchoolPrincipalController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.schoolPrincipal") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolPrincipal/index.html") + public void h5Index() { + } + @At @SaCheckPermission("activityReimbursement.schoolPrincipal") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolprincipal/form.html") @@ -55,7 +63,7 @@ public class ActivityReimbursementSchoolPrincipalController { @At @ApiOperation("活动报销,校工会负责人审核列表") - @SaCheckPermission("activityReimbursement.schoolPrincipal") + @SaCheckPermission(value = {"activityReimbursement.schoolPrincipal", "h5.activityReimbursement.schoolPrincipal"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -123,6 +131,8 @@ public class ActivityReimbursementSchoolPrincipalController { cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolUnionController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolUnionController.java index c706d8e..8fa28f0 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolUnionController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementSchoolUnionController.java @@ -23,6 +23,7 @@ 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.Exps; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; @@ -61,6 +62,12 @@ public class ActivityReimbursementSchoolUnionController { public void index() { } + @At("/h5") + @SaCheckPermission("h5.activityReimbursement.schoolUnion") + @Ok("beetl:/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolUnion/index.html") + public void h5Index() { + } + @At @SaCheckPermission("activityReimbursement.schoolUnion") @Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolunion/form.html") @@ -70,7 +77,7 @@ public class ActivityReimbursementSchoolUnionController { @At @ApiOperation("活动报销,校工会审核列表") - @SaCheckPermission("activityReimbursement.schoolUnion") + @SaCheckPermission(value = {"activityReimbursement.schoolUnion", "h5.activityReimbursement.schoolUnion"}, mode = SaMode.OR) public Result pageData(CommonPageParam pageParam) { Sql sql = Sqls.create(""" SELECT @@ -139,6 +146,8 @@ public class ActivityReimbursementSchoolUnionController { if (pageParam.getAudit()) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + // 已审核列表只展示同一流程实例同一节点最新的历史任务,避免退回重提后重复显示。 + cnd.and(Exps.inSql("t.id", "SELECT MAX(latestTask.id) FROM wf_process_task latestTask WHERE latestTask.processInstanceId = t.processInstanceId AND latestTask.taskName = t.taskName AND latestTask.taskState IN (" + ProcessTaskStateEnum.FINISHED.getCode() + "," + ProcessTaskStateEnum.WITHDRAW.getCode() + "," + ProcessTaskStateEnum.INTERRUPT.getCode() + ")")); } else { cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } @@ -157,7 +166,7 @@ public class ActivityReimbursementSchoolUnionController { @At @SLog(tag = "报销", msg = "校工会审核了一条记录") - @SaCheckPermission("activityReimbursement.schoolUnion") + @SaCheckPermission(value = {"activityReimbursement.schoolUnion", "h5.activityReimbursement.schoolUnion"}, mode = SaMode.OR) public Result doReview(@Param("data") String param, String id) { activityReimbursementSchoolUnionService.doReview(param, id); return Result.success(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java index f77322c..eb39b80 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/controller/BuildHomeLittleHouseController.java @@ -1,31 +1,17 @@ package com.budwk.app.zhgh.dayofficework.buildHome.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; -import com.budwk.app.base.exception.BaseException; -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.service.BaseService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; -import com.budwk.app.sys.models.Sys_union; -import com.budwk.app.web.commons.auth.utils.AuthUtil; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeLittleHouse; import com.budwk.app.zhgh.dayofficework.buildHome.param.BuildHomeLittleHousePageForm; +import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeLittleHouseService; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; @@ -34,12 +20,8 @@ import org.nutz.mvc.annotation.Ok; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.stream.IntStream; @IocBean @At("/platform/buildHome/littleHouse") @@ -48,10 +30,9 @@ import java.util.stream.IntStream; @Api(value = "建家小家建设情况") public class BuildHomeLittleHouseController { - @Inject - private Dao dao; - @Inject - private BaseService baseService; + @Inject("refer:buildHomeLittleHouseServiceImpl") + private BuildHomeLittleHouseService buildHomeLittleHouseService; + @Inject private SysOfficeTemplateUtil sysOfficeTemplateUtil; @@ -65,41 +46,47 @@ public class BuildHomeLittleHouseController { @At @SaCheckPermission("buildHome.littleHouse") public Result pageData(BuildHomeLittleHousePageForm pageForm) { - Sql sql = Sqls.create("select * from build_home_little_house $condition"); - Cnd cnd = Cnd.NEW(); - cnd.and("unionId", "=", SecurityUtil.getUnionId()); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - cnd.where().andLike("unitName", pageForm.getSearchKeyword()); - } - cnd.asc("sortNum"); - sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + return Result.success(buildHomeLittleHouseService.pageData(pageForm)); + } + + @At + @SaCheckPermission("buildHome.littleHouse") + public Result currentUserOrg() { + return Result.success(buildHomeLittleHouseService.currentUserOrg()); } @At @SaCheckPermission("buildHome.littleHouse") public Result save(BuildHomeLittleHouse house) { - if (house.getId() == null) { - house.setUnionId(SecurityUtil.getUnionId()); - house.setUnionName(SecurityUtil.getUnionId()); - } - dao.insertOrUpdate(house); + buildHomeLittleHouseService.saveHouse(house); return Result.success(); } @At("/delete/?") @SaCheckPermission("buildHome.littleHouse") public Result delete(@Valid Long id) { - dao.delete(BuildHomeLittleHouse.class, id); + buildHomeLittleHouseService.delete(id); return Result.success(); } @At("/detail/?") @SaCheckPermission("buildHome.littleHouse") public Result detail(@Valid Long id) { - BuildHomeLittleHouse house = dao.fetch(BuildHomeLittleHouse.class, id); - return Result.success(house); + return Result.success(buildHomeLittleHouseService.fetch(id)); + } + + @At + @SaCheckPermission("buildHome.littleHouse") + public Result saveCoordinate(Long id, Double mapX, Double mapY) { + buildHomeLittleHouseService.saveCoordinate(id, mapX, mapY); + return Result.success(); + } + + @At + @SaCheckPermission("buildHome.littleHouse") + public Result clearCoordinate(Long id) { + buildHomeLittleHouseService.clearCoordinate(id); + return Result.success(); } @At("/exportXlsx") @@ -107,23 +94,7 @@ public class BuildHomeLittleHouseController { @Ok("void") public void exportXlsx(HttpServletResponse response) { try { - String unionId = SecurityUtil.getUnionId(); - Cnd cnd = Cnd.where("unionId", "=", unionId); - - Sys_union union = dao.fetch(Sys_union.class, unionId); - if (union == null) { - throw new BaseException("未找到ID为 " + unionId + " 的工会信息"); - } - - // 准备文档数据Map - Map docMap = new HashMap<>(); - docMap.put("unionName", union.getName()); // 工会名称 - docMap.put("date", DateUtil.today()); // 当前日期 - - // 查询小家建设数据并设置序号 - List list = dao.query(BuildHomeLittleHouse.class, cnd); - IntStream.range(0, list.size()).forEach(i -> list.get(i).setIndex(i + 1)); // 为每条数据设置序号 - docMap.put("list", list); // 将数据列表放入Map + Map docMap = buildHomeLittleHouseService.buildExportData(); // 配置表格渲染策略 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java index 954ef1c..4d5ec99 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java @@ -1,10 +1,13 @@ package com.budwk.app.zhgh.dayofficework.buildHome.models; +import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; +import java.util.List; + @Data @EqualsAndHashCode(callSuper = true) @Table("build_home_little_house") @@ -22,6 +25,11 @@ public class BuildHomeLittleHouse extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 100) private String unitName; + @Column + @Comment("单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String unitId; + @Column @Comment("分工会ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -52,6 +60,21 @@ public class BuildHomeLittleHouse extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 100) private String openTime; + @Column + @Comment("图片视频资料") + @ColDefine(type = ColType.MYSQL_JSON) + private List mediaFiles; + + @Column + @Comment("地图X坐标百分比") + @ColDefine(type = ColType.FLOAT, width = 8, precision = 4) + private Double mapX; + + @Column + @Comment("地图Y坐标百分比") + @ColDefine(type = ColType.FLOAT, width = 8, precision = 4) + private Double mapY; + @Column @Comment("排序") @ColDefine(type = ColType.INT) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeLittleHouseService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeLittleHouseService.java new file mode 100644 index 0000000..c7ed026 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/BuildHomeLittleHouseService.java @@ -0,0 +1,56 @@ +package com.budwk.app.zhgh.dayofficework.buildHome.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeLittleHouse; +import com.budwk.app.zhgh.dayofficework.buildHome.param.BuildHomeLittleHousePageForm; + +import java.util.Map; + +public interface BuildHomeLittleHouseService extends BaseService { + + /** + * 分页查询小家建设数据,系统管理员查看全部,其他用户查看本分工会。 + * + * @param pageForm 查询分页参数。 + * @return 小家建设分页数据。 + */ + Pagination pageData(BuildHomeLittleHousePageForm pageForm); + + /** + * 获取当前登录用户所属工会和单位,用于新增小家记录时自动带出组织信息。 + * + * @return 当前用户组织信息。 + */ + Map currentUserOrg(); + + /** + * 保存小家建设记录,新增时写入当前用户组织,编辑时保留原组织归属。 + * + * @param house 小家建设记录。 + */ + void saveHouse(BuildHomeLittleHouse house); + + /** + * 保存小家地图坐标,仅允许系统管理员操作。 + * + * @param id 小家记录ID。 + * @param mapX 地图X坐标百分比。 + * @param mapY 地图Y坐标百分比。 + */ + void saveCoordinate(Long id, Double mapX, Double mapY); + + /** + * 清空小家地图坐标,仅允许系统管理员操作。 + * + * @param id 小家记录ID。 + */ + void clearCoordinate(Long id); + + /** + * 准备小家建设汇总导出数据。 + * + * @return 模板渲染数据。 + */ + Map buildExportData(); +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeLittleHouseServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeLittleHouseServiceImpl.java new file mode 100644 index 0000000..fe16694 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/service/impl/BuildHomeLittleHouseServiceImpl.java @@ -0,0 +1,167 @@ +package com.budwk.app.zhgh.dayofficework.buildHome.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.views.View_user; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeLittleHouse; +import com.budwk.app.zhgh.dayofficework.buildHome.param.BuildHomeLittleHousePageForm; +import com.budwk.app.zhgh.dayofficework.buildHome.service.BuildHomeLittleHouseService; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + +@IocBean(args = {"refer:dao"}) +public class BuildHomeLittleHouseServiceImpl extends BaseServiceImpl implements BuildHomeLittleHouseService { + + public BuildHomeLittleHouseServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(BuildHomeLittleHousePageForm pageForm) { + Sql sql = Sqls.create("select * from build_home_little_house $condition"); + Cnd cnd = Cnd.NEW(); + if (!isSysAdmin()) { + cnd.and("unionId", "=", SecurityUtil.getUnionId()); + } + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup searchGroup = new SqlExpressionGroup(); + searchGroup.orLike("unitName", pageForm.getSearchKeyword()); + searchGroup.orLike("unionName", pageForm.getSearchKeyword()); + cnd.where().and(searchGroup); + } + cnd.asc("sortNum"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + @Override + public Map currentUserOrg() { + Map currentUserOrg = new HashMap<>(); + View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())); + + String unionId = user != null && StrUtil.isNotBlank(user.getUnionId()) ? user.getUnionId() : SecurityUtil.getUnionId(); + String unionName = user != null ? user.getUnionName() : null; + if (StrUtil.isBlank(unionName) && StrUtil.isNotBlank(unionId)) { + Sys_union union = dao().fetch(Sys_union.class, unionId); + unionName = union != null ? union.getName() : unionId; + } + + currentUserOrg.put("unionId", unionId); + currentUserOrg.put("unionName", unionName); + currentUserOrg.put("unitId", user != null ? user.getUnitId() : SecurityUtil.getUnitId()); + currentUserOrg.put("unitName", user != null ? user.getUnitName() : null); + return currentUserOrg; + } + + @Override + public void saveHouse(BuildHomeLittleHouse house) { + if (house.getId() == null) { + fillCurrentUserOrg(house); + } else { + keepOriginalOrg(house); + } + dao().insertOrUpdate(house); + } + + @Override + public void saveCoordinate(Long id, Double mapX, Double mapY) { + if (!isSysAdmin()) { + throw new BaseException("仅系统管理员可以采集坐标"); + } + BuildHomeLittleHouse house = fetchRequiredHouse(id); + if (!isValidCoordinate(mapX) || !isValidCoordinate(mapY)) { + throw new BaseException("坐标范围必须在0到100之间"); + } + dao().update(BuildHomeLittleHouse.class, Chain.make("mapX", mapX).add("mapY", mapY), Cnd.where("id", "=", house.getId())); + } + + @Override + public void clearCoordinate(Long id) { + if (!isSysAdmin()) { + throw new BaseException("仅系统管理员可以清空坐标"); + } + BuildHomeLittleHouse house = fetchRequiredHouse(id); + dao().update(BuildHomeLittleHouse.class, Chain.make("mapX", null).add("mapY", null), Cnd.where("id", "=", house.getId())); + } + + @Override + public Map buildExportData() { + boolean sysAdmin = isSysAdmin(); + String unionId = SecurityUtil.getUnionId(); + Cnd cnd = Cnd.NEW(); + if (!sysAdmin) { + cnd.and("unionId", "=", unionId); + } + cnd.asc("sortNum"); + + Sys_union union = dao().fetch(Sys_union.class, unionId); + if (!sysAdmin && union == null) { + throw new BaseException("未找到ID为 " + unionId + " 的工会信息"); + } + + List list = query(cnd); + IntStream.range(0, list.size()).forEach(i -> list.get(i).setIndex(i + 1)); + + Map docMap = new HashMap<>(); + docMap.put("unionName", sysAdmin ? "全部工会" : union.getName()); + docMap.put("date", DateUtil.today()); + docMap.put("list", list); + return docMap; + } + + private void fillCurrentUserOrg(BuildHomeLittleHouse house) { + Map currentUserOrg = currentUserOrg(); + house.setUnionId(currentUserOrg.get("unionId")); + house.setUnionName(currentUserOrg.get("unionName")); + house.setUnitId(currentUserOrg.get("unitId")); + house.setUnitName(currentUserOrg.get("unitName")); + } + + private void keepOriginalOrg(BuildHomeLittleHouse house) { + BuildHomeLittleHouse oldHouse = dao().fetch(BuildHomeLittleHouse.class, house.getId()); + if (oldHouse == null) { + fillCurrentUserOrg(house); + return; + } + house.setUnionId(oldHouse.getUnionId()); + house.setUnionName(oldHouse.getUnionName()); + house.setUnitId(oldHouse.getUnitId()); + house.setUnitName(oldHouse.getUnitName()); + } + + private BuildHomeLittleHouse fetchRequiredHouse(Long id) { + if (id == null) { + throw new BaseException("小家记录ID不能为空"); + } + BuildHomeLittleHouse house = dao().fetch(BuildHomeLittleHouse.class, id); + if (house == null) { + throw new BaseException("未找到小家记录"); + } + return house; + } + + private boolean isSysAdmin() { + return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name()); + } + + private boolean isValidCoordinate(Double value) { + return value != null && value >= 0 && value <= 100; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java new file mode 100644 index 0000000..efb987d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java @@ -0,0 +1,110 @@ +package com.budwk.app.zhgh.dayofficework.caredata; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.dayofficework.caredata.service.CareDataLeaderService; +import io.swagger.annotations.Api; +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; + +@IocBean +@At("/platform/careData/leader") +@Api("领导驾驶舱") +@Ok("json:full") +public class CareDataLeaderCon { + + @Inject("refer:careDataLeaderServiceImpl") + private CareDataLeaderService careDataLeaderService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/indexOverlay.html") + @SaCheckPermission("careData.union") + public void index() { + } + + @At("proposal") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html") + @SaCheckPermission("careData.union") + public void proposal() { + } + + @At("condolence") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html") + @SaCheckPermission("careData.union") + public void condolence() { + } + + @At("baseUnion") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html") + @SaCheckPermission("careData.union") + public void baseUnion() { + } + + @At("club") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/clubOverlay.html") + @SaCheckPermission("careData.union") + public void club() { + } + + @At("dataMetric") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html") + @SaCheckPermission("careData.union") + public void dataMetric() { + } + + @At("assetData") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html") + @SaCheckPermission("careData.union") + public void assetData() { + } + + @At("staffHome") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html") + @SaCheckPermission("careData.union") + public void staffHome() { + } + + @At + @SaCheckPermission("careData.union") + public Result proposalData(String sessionId) { + return Result.success(careDataLeaderService.proposalData(sessionId)); + } + + @At + @SaCheckPermission("careData.union") + public Result condolenceData(Integer year) { + return Result.success(careDataLeaderService.condolenceData(year)); + } + + @At + @SaCheckPermission("careData.union") + public Result baseUnionData() { + return Result.success(careDataLeaderService.baseUnionData()); + } + + @At + @SaCheckPermission("careData.union") + public Result clubData() { + return Result.success(careDataLeaderService.clubData()); + } + + @At + @SaCheckPermission("careData.union") + public Result dataMetricData(Integer year) { + return Result.success(careDataLeaderService.dataMetricData(year)); + } + + @At + @SaCheckPermission("careData.union") + public Result assetDataData() { + return Result.success(careDataLeaderService.assetDataData()); + } + + @At + @SaCheckPermission("careData.union") + public Result staffHomeData() { + return Result.success(careDataLeaderService.staffHomeData()); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/CareDataLeaderService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/CareDataLeaderService.java new file mode 100644 index 0000000..d65f43d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/CareDataLeaderService.java @@ -0,0 +1,61 @@ +package com.budwk.app.zhgh.dayofficework.caredata.service; + +import org.nutz.lang.util.NutMap; + +/** + * 领导驾驶舱数据服务。 + */ +public interface CareDataLeaderService { + + /** + * 查询提案概览、办结和满意率数据。 + * + * @param sessionId 教代会届次ID,为空时取最新届次。 + * @return 提案概览数据,包含 session、overview、caseResults。 + */ + NutMap proposalData(String sessionId); + + /** + * 查询慰问类型排行数据。 + * + * @param year 年份,为空时取当前年份。 + * @return 慰问排行数据。 + */ + NutMap condolenceData(Integer year); + + /** + * 查询分工会会员数排行。 + * + * @return 分工会会员统计数据。 + */ + NutMap baseUnionData(); + + /** + * 查询协会人数排行。 + * + * @return 协会人员统计数据。 + */ + NutMap clubData(); + + /** + * 查询驾驶舱中部指标数据。 + * + * @param year 年份,为空时取当前年份。 + * @return 预算、疗休养、荣誉、困难帮扶和报销统计数据。 + */ + NutMap dataMetricData(Integer year); + + /** + * 查询资产使用状态分布。 + * + * @return 资产使用状态统计数据。 + */ + NutMap assetDataData(); + + /** + * 查询职工小家地图点位数据。 + * + * @return 职工小家列表数据。 + */ + NutMap staffHomeData(); +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/impl/CareDataLeaderServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/impl/CareDataLeaderServiceImpl.java new file mode 100644 index 0000000..c8b67c6 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/service/impl/CareDataLeaderServiceImpl.java @@ -0,0 +1,475 @@ +package com.budwk.app.zhgh.dayofficework.caredata.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.caredata.service.CareDataLeaderService; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class CareDataLeaderServiceImpl implements CareDataLeaderService { + + private static final int FINISHED_STATE = 20; + + private final Dao dao; + + public CareDataLeaderServiceImpl(Dao dao) { + this.dao = dao; + } + + @Override + public NutMap proposalData(String sessionId) { + String currentSessionId = StrUtil.blankToDefault(sessionId, latestSessionId()); + if (StrUtil.isBlank(currentSessionId)) { + return NutMap.NEW(); + } + + NutMap session = sessionInfo(currentSessionId); + List caseResults = caseResultData(currentSessionId); + NutMap overview = overviewData(currentSessionId, caseResults); + + return NutMap.NEW() + .addv("session", session) + .addv("overview", overview) + .addv("caseResults", caseResults); + } + + @Override + public NutMap condolenceData(Integer year) { + int targetYear = year == null ? LocalDate.now().getYear() : year; + List rows = condolenceTypeRows(targetYear); + long total = rows.stream().mapToLong(row -> row.getLong("count", 0L)).sum(); + List sortedRows = new ArrayList<>(rows); + sortedRows.sort((left, right) -> Long.compare(right.getLong("count", 0L), left.getLong("count", 0L))); + List topRows = new ArrayList<>(); + int index = 1; + for (NutMap row : sortedRows) { + if (index > 5) { + break; + } + long count = row.getLong("count", 0L); + topRows.add(NutMap.NEW() + .addv("index", index++) + .addv("typeId", row.getString("id", "")) + .addv("typeCode", row.getString("code", "")) + .addv("name", row.getString("name", "")) + .addv("count", count) + .addv("rate", percent(count, total)) + .addv("rateValue", percentValue(count, total))); + } + + return NutMap.NEW() + .addv("year", targetYear) + .addv("total", total) + .addv("types", topRows); + } + + @Override + public NutMap baseUnionData() { + return NutMap.NEW().addv("unions", baseUnionRows()); + } + + @Override + public NutMap clubData() { + return NutMap.NEW().addv("clubs", clubRows()); + } + + @Override + public NutMap dataMetricData(Integer year) { + int targetYear = year == null ? LocalDate.now().getYear() : year; + return NutMap.NEW() + .addv("year", targetYear) + .addv("budgetTotal", schoolBudgetTotal(targetYear)) + .addv("tourCount", tourCount(targetYear)) + .addv("honorCount", honorCount(targetYear)) + .addv("difficultCount", difficultCount(targetYear)) + .addv("reimburseTotal", reimburseTotal(targetYear)); + } + + @Override + public NutMap assetDataData() { + List states = assetUsageStateRows(); + long total = states.stream().mapToLong(row -> row.getLong("value", 0L)).sum(); + return NutMap.NEW() + .addv("total", total) + .addv("states", states); + } + + @Override + public NutMap staffHomeData() { + return NutMap.NEW().addv("houses", littleHouseRows()); + } + + private List littleHouseRows() { + Sql sql = Sqls.create(""" + SELECT + id, + unionName, + unitName, + address, + mediaFiles, + mapX, + mapY, + sortNum + FROM build_home_little_house + WHERE mapX IS NOT NULL + AND mapY IS NOT NULL + $unionFilter + ORDER BY sortNum ASC, id ASC + """); + setUnionFilter(sql, "unionId", null); + return listMap(sql); + } + + private String latestSessionId() { + Sql sql = Sqls.create(""" + SELECT id + FROM teacher_congress_session + ORDER BY startDate DESC + LIMIT 1 + """); + return firstMap(sql).getString("id", ""); + } + + private List condolenceTypeRows(int year) { + Sql sql = Sqls.create(""" + SELECT + t.id, + t.code, + t.name, + COUNT(info.id) AS count + FROM condolence_type t + LEFT JOIN condolence info ON info.type = t.id + AND YEAR(info.createTime) = @year + $unionFilter + WHERE t.enable = 1 + GROUP BY t.id, t.code, t.name, t.sortNum + ORDER BY count DESC, t.sortNum ASC, t.code ASC + """); + sql.setParam("year", year); + setUnionFilter(sql, "info.applyUnionId", null); + return listMap(sql); + } + + private List baseUnionRows() { + Sql sql = Sqls.create(""" + SELECT + un.id, + un.name AS unionname, + un.unionCode, + ( + SELECT COUNT(1) + FROM vw_user u + WHERE u.member = 1 + AND u.unionId = un.id + ) AS value + FROM sys_union un + WHERE un.delFlag = 0 + $unionFilter + ORDER BY un.unionCode + """); + setUnionFilter(sql, "un.id", null); + return listMap(sql); + } + + private List clubRows() { + Sql sql = Sqls.create(""" + SELECT + c.id, + c.clubName, + c.clubCode, + ( + SELECT COUNT(1) + FROM club_user cu + WHERE cu.clubId = c.id + AND cu.delFlag = 0 + ) AS value + FROM sys_club c + WHERE c.delFlag = 0 + AND c.dismiss = 0 + ORDER BY c.clubCode + """); + return listMap(sql); + } + + private List assetUsageStateRows() { + Sql sql = Sqls.create(""" + SELECT + IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName) AS name, + SUM(IFNULL(t1.assetQuantity, 0)) AS value + FROM `asset` t1 + WHERE 1 = 1 + $unionFilter + GROUP BY IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName) + ORDER BY value DESC, name ASC + """); + sql.setParam("emptyName", "未填写"); + setUnionFilter(sql, "t1.assetUseUnionId", null); + return listMap(sql); + } + + private BigDecimal schoolBudgetTotal(int year) { + Sql sql = Sqls.create(""" + SELECT IFNULL(SUM(totalQuota), 0) AS total + FROM outlay_manage_school + WHERE delFlag = 0 + AND `year` = @year + """); + sql.setParam("year", year); + return decimalValue(firstMap(sql), "total"); + } + + private long tourCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(DISTINCT info.id) AS count + FROM recuperation_enroll info + WHERE info.isNormal = 1 + AND info.stateId NOT IN (2715, 2725, 2735) + AND YEAR(info.signingUptime) = @year + $unionFilter + """); + // 当前项目没有参考项目的 tour_ledger 表,疗休养人数改用现有报名表统计正常且未被驳回的数据。 + sql.setParam("year", year); + setUnionFilter(sql, "info.takePartInUnionId", null); + return firstMap(sql).getLong("count", 0L); + } + + private long honorCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(h.id) AS count + FROM honor h + WHERE h.delFlag = 0 + AND YEAR(h.grantDate) = @year + $unionFilter + """); + sql.setParam("year", year); + setUnionFilter(sql, "h.unionId", null); + return firstMap(sql).getLong("count", 0L); + } + + private long difficultCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(DISTINCT info.id) AS count + FROM difficult_help_info info + INNER JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE info.delFlag = 0 + AND ins.state = @finished + AND YEAR(info.applyTime) = @year + $unionFilter + """); + sql.setParam("year", year); + sql.setParam("finished", FINISHED_STATE); + setUnionFilter(sql, "info.unionId", null); + return firstMap(sql).getLong("count", 0L); + } + + private BigDecimal reimburseTotal(int year) { + Sql sql = Sqls.create(""" + SELECT IFNULL(SUM(IFNULL(info.money, 0)), 0) AS total + FROM union_reimburse info + WHERE YEAR(info.createTime) = @year + $unionFilter + """); + // 当前项目 union_reimburse 没有参考项目的 realMoney、condolenceMoney、stateId 字段,金额按现有 money 字段统计。 + sql.setParam("year", year); + setUnionFilter(sql, "info.unionId", null); + return decimalValue(firstMap(sql), "total"); + } + + private NutMap sessionInfo(String sessionId) { + Sql sql = Sqls.create(""" + SELECT id, fullName + FROM teacher_congress_session + WHERE id = @sessionId + """); + sql.setParam("sessionId", sessionId); + return firstMap(sql); + } + + private NutMap overviewData(String sessionId, List caseResults) { + Sql sql = Sqls.create(""" + SELECT + COUNT(info.id) AS total, + SUM(CASE WHEN ins.state = @finished THEN 1 ELSE 0 END) AS doneCount + FROM proposal_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE info.sessionId = @sessionId + """); + sql.setParam("sessionId", sessionId); + sql.setParam("finished", FINISHED_STATE); + NutMap overview = firstMap(sql); + + long filedCount = 0L; + long rejectedCount = 0L; + long suggestionCount = 0L; + for (NutMap item : caseResults) { + String name = item.getString("name", ""); + long count = item.getLong("count", 0L); + if (containsAny(name, "不予", "不立案")) { + rejectedCount += count; + } else if (containsAny(name, "意见", "建议")) { + suggestionCount += count; + } else if (name.contains("立案")) { + filedCount += count; + } + } + + long total = overview.getLong("total", 0L); + long doneCount = overview.getLong("doneCount", 0L); + long satisfiedCount = satisfiedCount(sessionId); + + return NutMap.NEW() + .addv("total", total) + .addv("filedCount", filedCount) + .addv("suggestionCount", suggestionCount) + .addv("rejectedCount", rejectedCount) + .addv("doneCount", doneCount) + .addv("satisfiedRate", percent(satisfiedCount, doneCount)); + } + + private List caseResultData(String sessionId) { + Sql sql = Sqls.create(""" + SELECT + d.code, + d.name, + COUNT(info.id) AS count + FROM sys_dict parent + INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0 + LEFT JOIN proposal_info info ON info.caseFilingResult = d.code AND info.sessionId = @sessionId + WHERE parent.code = 'PROPOSAL_CASE_FILING_RESULT' + GROUP BY d.id, d.code, d.name, d.location + ORDER BY d.location + """); + sql.setParam("sessionId", sessionId); + return listMap(sql); + } + + private long satisfiedCount(String sessionId) { + List dicts = feedbackDicts(); + List rows = feedbackRows(sessionId); + return dicts.stream() + .filter(dict -> { + String name = dict.getString("name", ""); + return name.contains("满意") && !name.contains("不满意"); + }) + .mapToLong(dict -> rows.stream() + .filter(row -> dict.getString("code", "").equals(row.getString("feedbackCode", ""))) + .count()) + .sum(); + } + + private List feedbackDicts() { + Sql sql = Sqls.create(""" + SELECT d.code, d.name + FROM sys_dict parent + INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0 + WHERE parent.code = 'PROPOSAL_FEEDBACK' + ORDER BY d.location + """); + return listMap(sql); + } + + private List feedbackRows(String sessionId) { + Sql sql = Sqls.create(""" + SELECT + t.variable + FROM proposal_info info + 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 = 20 + AND t.taskName = 'feedback' + WHERE ins.state = @finished + AND info.sessionId = @sessionId + GROUP BY info.id, t.variable + """); + sql.setParam("sessionId", sessionId); + sql.setParam("finished", FINISHED_STATE); + List rawRows = listMap(sql); + List rows = new ArrayList<>(); + for (NutMap row : rawRows) { + String variableStr = row.getString("variable", ""); + if (StrUtil.isBlank(variableStr)) { + continue; + } + NutMap variable = Json.fromJson(NutMap.class, variableStr); + rows.add(NutMap.NEW().addv("feedbackCode", variable.getString("tf_feedback", ""))); + } + return rows; + } + + private void setUnionFilter(Sql sql, String columnName, String varName) { + String targetVarName = StrUtil.blankToDefault(varName, "unionFilter"); + if (canViewAllUnionData()) { + sql.setVar(targetVarName, ""); + } else { + sql.setVar(targetVarName, "AND " + columnName + " = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + } + + private boolean canViewAllUnionData() { + return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + } + + private BigDecimal decimalValue(NutMap map, String key) { + BigDecimal value = map.getAs(key, BigDecimal.class); + return value == null ? BigDecimal.ZERO : value; + } + + private List listMap(Sql sql) { + sql.setCallback(Sqls.callback.maps()); + dao.execute(sql); + return sql.getList(NutMap.class); + } + + private NutMap firstMap(Sql sql) { + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap map = sql.getObject(NutMap.class); + return map == null ? NutMap.NEW() : map; + } + + private boolean containsAny(String text, String... keywords) { + if (StrUtil.isBlank(text)) { + return false; + } + for (String keyword : keywords) { + if (text.contains(keyword)) { + return true; + } + } + return false; + } + + private String percent(long count, long total) { + if (total <= 0) { + return "0%"; + } + BigDecimal value = BigDecimal.valueOf(count) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP); + return value.stripTrailingZeros().toPlainString() + "%"; + } + + private BigDecimal percentValue(long count, long total) { + if (total <= 0) { + return BigDecimal.ZERO; + } + return BigDecimal.valueOf(count) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP) + .stripTrailingZeros(); + } +} diff --git a/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png new file mode 100644 index 0000000..095ebdb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png new file mode 100644 index 0000000..095ebdb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png new file mode 100644 index 0000000..5f24206 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png new file mode 100644 index 0000000..dfbfabc Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png new file mode 100644 index 0000000..095ebdb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png new file mode 100644 index 0000000..54564a4 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png new file mode 100644 index 0000000..095ebdb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png new file mode 100644 index 0000000..7b4ba43 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg new file mode 100644 index 0000000..cf5f40c Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png b/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png new file mode 100644 index 0000000..07c3af2 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png new file mode 100644 index 0000000..ff05006 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png new file mode 100644 index 0000000..ae7f627 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png new file mode 100644 index 0000000..fb7f419 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png new file mode 100644 index 0000000..3b3c016 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png new file mode 100644 index 0000000..f203f65 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png new file mode 100644 index 0000000..fd7a803 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png new file mode 100644 index 0000000..2c2546d Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png new file mode 100644 index 0000000..cfc6e98 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png new file mode 100644 index 0000000..a6ee860 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png new file mode 100644 index 0000000..0af01c2 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png new file mode 100644 index 0000000..25fd3a4 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png new file mode 100644 index 0000000..9e49776 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png new file mode 100644 index 0000000..abdc93d Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png new file mode 100644 index 0000000..095ebdb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png new file mode 100644 index 0000000..b87e8b4 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png b/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png new file mode 100644 index 0000000..0fb8cf9 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png b/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png new file mode 100644 index 0000000..3d95e6b Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png differ diff --git a/src/main/resources/views/layouts/platform_leader_dashboard.html b/src/main/resources/views/layouts/platform_leader_dashboard.html new file mode 100644 index 0000000..888ce12 --- /dev/null +++ b/src/main/resources/views/layouts/platform_leader_dashboard.html @@ -0,0 +1,47 @@ + + + + + + + 数智工会领导驾驶舱 + + + + + + + + + + +${layoutContent!} + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js index e0bdc68..ddd0da8 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js @@ -1,39 +1,69 @@ const form = { - template: /*language=HTML*/ ` - - - - - - - - - - - - - - - - - - - - - `, + template: [ + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "
", + " 取消", + " 确定", + "
", + "
" + ].join(""), data() { return { dialogVisible: false, formData: {}, + currentUserOrg: {}, + mediaAccept: ".jpg,.jpeg,.png,.mp4,.mov", rules: { - unitName: [{ required: true, message: "请输入单位", trigger: "blur" }], + unitName: [{ required: true, message: "未获取到当前单位", trigger: "blur" }], + unionName: [{ required: true, message: "未获取到当前工会", trigger: "blur" }], address: [{ required: true, message: "请输入地点", trigger: "blur" }], area: [{ required: true, message: "请输入面积", trigger: "blur" }], facility: [{ required: true, message: "请输入设施", trigger: "blur" }], @@ -42,23 +72,30 @@ const form = { } }, methods: { - onOpen(id) { + async onOpen(id) { + this.$set(this, "dialogVisible", true) + this.resetForm() + await this.loadCurrentUserOrg() if (id) { - this.dialogVisible = true - this.resetForm() $.post("/platform/buildHome/littleHouse/detail/" + id).then((resp) => { if (resp.code === 0) { - this.formData = resp.data + this.$set(this, "formData", Object.assign({}, this.currentUserOrg, resp.data, { + mediaFiles: this.parseFiles(resp.data.mediaFiles) + })) } }) } else { - this.dialogVisible = true - this.formData = {} + this.$set(this, "formData", Object.assign({}, this.currentUserOrg, { + mediaFiles: [] + })) this.$nextTick(() => { this.$refs.formRef.clearValidate() }) } }, + closeDialog() { + this.$set(this, "dialogVisible", false) + }, resetForm() { this.$nextTick(() => { if (this.$refs.formRef) { @@ -67,14 +104,49 @@ const form = { } }) }, + async loadCurrentUserOrg() { + const resp = await $.post("/platform/buildHome/littleHouse/currentUserOrg") + if (resp.code === 0) { + this.$set(this, "currentUserOrg", resp.data || {}) + } + }, + parseFiles(value) { + if (!value) { + return [] + } + if (Array.isArray(value)) { + return value + } + try { + return JSON.parse(value) + } catch (e) { + return [] + } + }, + getFileExt(file) { + const name = file.name || file.url || (file.response && file.response.data) || file.data || "" + const index = name.lastIndexOf(".") + return index > -1 ? name.substring(index + 1).toLowerCase() : "" + }, + validateMediaFiles(files) { + const acceptExts = this.mediaAccept.split(",").map(v => v.replace(".", "").toLowerCase()) + return (files || []).every(file => acceptExts.includes(this.getFileExt(file))) + }, onSubmit() { this.$refs.formRef.validate((valid) => { if (valid) { - $.post("/platform/buildHome/littleHouse/save", this.formData).then((resp) => { + if (!this.validateMediaFiles(this.formData.mediaFiles)) { + this.$message.warning("仅支持上传 jpg、jpeg、png、mp4、mov 格式文件") + return + } + const data = Object.assign({}, this.formData, { + mediaFiles: JSON.stringify(this.formData.mediaFiles || []) + }) + $.post("/platform/buildHome/littleHouse/save", data).then((resp) => { if (resp.code === 0) { this.$message.success(resp.msg) this.$emit("refresh") - this.dialogVisible = false + this.closeDialog() } }) } diff --git a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/index.html b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/index.html index ce532b3..9441f87 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/index.html @@ -6,8 +6,8 @@ layout("/layouts/platform.html"){ - - + + @@ -18,6 +18,7 @@ layout("/layouts/platform.html"){ + @@ -25,8 +26,9 @@ layout("/layouts/platform.html"){ - + @@ -63,12 +65,78 @@ layout("/layouts/platform.html"){ }) }) }, + openCoordinate(row) { + if (!row || !row.id) { + this.$message.warning("未获取到小家记录") + return + } + if (this.hasCoordinate(row)) { + this.$confirm( + "当前记录已有坐标,是修改还是清空?", + "提示", + { + type: "warning", + distinguishCancelAndClose: true, + confirmButtonText: "修改坐标", + cancelButtonText: "清空坐标" + } + ).then(() => { + this.doOpenCoordinate(row) + }).catch((action) => { + if (action === "cancel") { + this.clearCoordinate(row) + } + }) + return + } + this.doOpenCoordinate(row) + }, + hasCoordinate(row) { + return row + && row.mapX !== null + && row.mapX !== undefined + && row.mapX !== "" + && row.mapY !== null + && row.mapY !== undefined + && row.mapY !== "" + }, + doOpenCoordinate(row) { + const params = [ + "coordinateMode=1", + "houseId=" + encodeURIComponent(row.id), + "t=" + Date.now() + ] + window.open("/platform/careData/leader?" + params.join("&"), "_blank") + }, + clearCoordinate(row) { + $.post("/platform/buildHome/littleHouse/clearCoordinate", { id: row.id }).then((resp) => { + if (resp.code === 0) { + this.$message.success("坐标已清空") + this.doSearch() + } + }) + }, + handleCoordinateMessage(event) { + if (event.origin !== window.location.origin) { + return + } + const data = event.data || {} + if (data.type !== "littleHouseCoordinateSaved") { + return + } + this.$message.success("坐标采集成功") + this.doSearch() + }, onExport() { this.$downLoad("/platform/buildHome/littleHouse/exportXlsx") } }, created() { + window.addEventListener("message", this.handleCoordinateMessage) this.pageData() + }, + beforeDestroy() { + window.removeEventListener("message", this.handleCoordinateMessage) } }) diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html new file mode 100644 index 0000000..58f36bc --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html @@ -0,0 +1,287 @@ + + + + +
+
+
+
资产数据
+
+
暂无数据
+
不同颜色代表不同使用状况
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html new file mode 100644 index 0000000..732755c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html @@ -0,0 +1,257 @@ + + + +
+
+
+
基层工会
+
+
+
{{ item.unionname || "--" }}
+
{{ item.value || 0 }}
+
+
+
暂无数据
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/clubOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/clubOverlay.html new file mode 100644 index 0000000..f4df20c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/clubOverlay.html @@ -0,0 +1,252 @@ + + + +
+
+
+
协会社团
+
+
+
{{ item.clubName || "--" }}
+
{{ item.value || 0 }}
+
+
+
暂无数据
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html new file mode 100644 index 0000000..cc45465 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html @@ -0,0 +1,282 @@ + + + +
+
+
+
慰问汇总
+
+
暂无数据
+
+
{{ item.rate || "0%" }}
+
+
{{ shortName(item.name) }}
+
+
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html new file mode 100644 index 0000000..ada1203 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html @@ -0,0 +1,248 @@ + + + +
+
+
+
数据指标
+
+
+
{{ item.value }}{{ item.unit }}
+
{{ item.label }}
+
+
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/index.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/index.html new file mode 100644 index 0000000..9e8627d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/index.html @@ -0,0 +1,599 @@ + + + +
+
+
+ + 智慧工会 · 领导驾驶舱 +
+

数智工会领导驾驶舱

+
+
{{ currentDate }}
+
{{ currentTime }}
+
+
+ +
+
+
提案征集与办理
+
+
+ +
提案总数
+
{{ overview.total || 0 }}
+
+
+ +
立案数量
+
{{ overview.filedCount || 0 }}
+
+
+ +
意见建议梳理
+
{{ overview.suggestionCount || 0 }}
+
+
+ +
不予立案
+
{{ overview.rejectedCount || 0 }}
+
+
+ +
办结数量
+
{{ overview.doneCount || 0 }}
+
+
+ +
满意率
+
{{ overview.satisfiedRate || '0%' }}
+
+
+
+ +
+
{{ session.fullName || '当前届次' }}
+
+
+
+ +
+
专题指标总览
+
+
+ {{ overview.total || 0 }} + 提案指标 +
+
+
+ +
+
办理进度排行
+
+
+ {{ pad(index + 1) }} +
+
{{ item.name }}
+
+
+ {{ item.rate }} +
+
+
+ +
+
专题模块预留
+
+
+ {{ pad(index + 1) }} +
{{ item }}
+ 待接入 +
+
+
+ +
+
数据趋势预留
+
+
+ {{ item.index }} +
+
{{ item.name }}
+
+
+ {{ item.rate }} +
+
+
+ +
+
重点数据预留
+
+
+ {{ item.index }} +
{{ item.name }}
+ {{ item.value }} +
+
+
+
+ + +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/indexOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/indexOverlay.html new file mode 100644 index 0000000..8849546 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/indexOverlay.html @@ -0,0 +1,2021 @@ + + + + +
+
+
+
+ + {{ weatherText }} +
+

数智工会领导驾驶舱

+
{{ currentDateTime }}
+
+
+
+
{{ item.label }}
+
+ {{ digit }} +
+
+
+
+
提案征集和办理
+
+
+
{{ item.label }}
+
{{ item.value }}
+
+
+
+
+
慰问汇总
+
+
暂无数据
+
+
{{ item.rate || "0%" }}
+
+
{{ shortCondolenceName(item.name) }}
+
+
+
+
+
资产数据
+
+
暂无数据
+
不同颜色代表不同使用状况
+
+
+
基层工会
+
+
+
{{ item.unionname || "--" }}
+
{{ item.value || 0 }}
+
+
+
暂无数据
+
+
+
协会社团
+
+
+
{{ item.clubName || "--" }}
+
{{ item.value || 0 }}
+
+
+
暂无数据
+
+
+
数据指标
+
+
+
{{ item.value }}{{ item.unit }}
+
{{ item.label }}
+
+
+
+
+
职工小家
+
+ + +
+
+ +
+
请在地图上点击要采集的小家位置
+
+
是否采集当前坐标?
+
{{ coordinateHouse.unionName || coordinateHouse.unitName || "--" }}
+
X: {{ pendingCoordinate.mapX }}%, Y: {{ pendingCoordinate.mapY }}%
+
+ + +
+
+
+
+
+
{{ videoDialogTitle }}
+ +
+ +
暂无视频资料
+
+ +
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposal.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposal.html new file mode 100644 index 0000000..1840cf7 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposal.html @@ -0,0 +1,142 @@ + + + +
+
+
{{ displayNumber(overview.total) }}
+
{{ displayNumber(overview.filedCount) }}
+
{{ displayNumber(overview.suggestionCount) }}
+
{{ displayNumber(overview.rejectedCount) }}
+
{{ displayNumber(overview.doneCount) }}
+
{{ overview.satisfiedRate || "0%" }}
+
+
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html new file mode 100644 index 0000000..3a794f0 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html @@ -0,0 +1,260 @@ + + + +
+
+
+
提案征集和办理
+
+
+
{{ item.label }}
+
{{ item.value }}
+
+
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html new file mode 100644 index 0000000..5ae6073 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html @@ -0,0 +1,173 @@ + + + +
+
+
+
职工小家
+
+ +
+
+
+ +
+ + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/apply/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/apply/index.html new file mode 100644 index 0000000..0e62bca --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/apply/index.html @@ -0,0 +1,850 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 查看申报信息 +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
+
+
+
+ + + + + + + + + + + + + + +
+ 保存 + 提交 + 提交 +
+
+ + +
+ + {{ declareViewData.activityName || '暂无' }} + {{ getActivityTypeName(declareViewData.activityType) || '暂无' }} + {{ formatUser(declareViewData.userName, declareViewData.loginName) }} + {{ declareViewData.declareUnitName || '暂无' }} + {{ declareViewData.mobile || '暂无' }} + {{ formatDate(declareViewData.applyTime) }} + {{ formatRange(declareViewData.planStartTime, declareViewData.planEndTime) }} + {{ declareViewData.activityNumber || '暂无' }} + {{ declareViewData.activityAddress || '暂无' }} + + + +
费用项目名称:{{ item.name || '暂无' }}
+
预算费用:{{ item.budgetPrice || 0 }}
+
+ +
+ + +
+
+ + + 暂无 + + + + 暂无 + +
+
+
+
+ + + + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/branchUnion/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/branchUnion/index.html new file mode 100644 index 0000000..c607834 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/branchUnion/index.html @@ -0,0 +1,75 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/cashier/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/cashier/index.html new file mode 100644 index 0000000..fa64610 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/cashier/index.html @@ -0,0 +1,74 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 确认 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/clubPrincipal/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/clubPrincipal/index.html new file mode 100644 index 0000000..068d809 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/clubPrincipal/index.html @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/auditPage.js b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/auditPage.js new file mode 100644 index 0000000..b7ad183 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/auditPage.js @@ -0,0 +1,170 @@ +function createActivityReimbursementAuditPage(options) { + return new Vue({ + el: options.el || '#app', + store, + dicts: ['ACTIVITY_BUDGET_TYPE', 'ACTIVITY_BUDGET_REIMBURSE_TYPE'], + components: { + 'h5-activity-reimbursement-info': H5_ACTIVITY_REIMBURSEMENT_INFO + }, + data() { + return { + title: options.title, + api: options.api, + reviewUrl: options.reviewUrl || '', + pageForm: { + pageNumber: 1, + pageSize: 10, + totalCount: 0, + year: new Date().getFullYear(), + audit: false, + auditText: '0', + searchKeyword: '', + activityReimbursementMode: '', + outlayManageSource: '', + budgetReimburseType: '' + }, + modeOptions: [ + {text: '全部报销模式', value: ''}, + {text: '活动报销', value: 'activity'}, + {text: '日常报销', value: 'daily'} + ], + budgetTypeOptions: [{text: '全部经费类型', value: ''}], + budgetReimburseTypeOptions: [{text: '全部预算类型', value: ''}], + formData: {}, + showApprovalForm: false, + opinionMessage: options.opinionMessage || '请填写审批意见' + } + }, + methods: { + async onReady() { + await this.initDictOptions() + this.doSearch() + }, + async initDictOptions() { + const budgetTypeList = await this.getDictOptionList('ACTIVITY_BUDGET_TYPE') + const budgetReimburseTypeList = await this.getDictOptionList('ACTIVITY_BUDGET_REIMBURSE_TYPE') + this.$set(this, 'budgetTypeOptions', this.buildDropdownOptions('全部经费类型', budgetTypeList)) + this.$set(this, 'budgetReimburseTypeOptions', this.buildDropdownOptions('全部预算类型', budgetReimburseTypeList)) + }, + // 下拉选项依赖异步字典加载,统一兜底可避免首次进入时 Vant 下拉渲染为空。 + async getDictOptionList(dictType) { + try { + if (this.$businessTool && this.$businessTool.getDictOptions) { + const data = await this.$businessTool.getDictOptions(dictType) + return data || [] + } + } catch (error) { + if (this.dict && this.dict.type && this.dict.type[dictType]) { + return this.dict.type[dictType] + } + return [] + } + if (this.dict && this.dict.type && this.dict.type[dictType]) { + return this.dict.type[dictType] + } + return [] + }, + buildDropdownOptions(defaultText, list) { + return [{text: defaultText, value: ''}].concat((list || []).map((item) => { + return { + text: item.name || item.label || item.text, + value: item.code || item.value || '' + } + })) + }, + onAuditChange(val) { + this.$set(this.pageForm, 'audit', val === '1') + this.doSearch() + }, + onView(row) { + this.showApprovalForm = false + this.$refs.infoRef.onOpen(row) + }, + onAudit(row) { + this.showApprovalForm = true + this.$set(this, 'formData', {}) + this.$set(this.formData, 'id', row.id) + this.$set(this.formData, 'processTaskId', row.taskId) + this.$set(this.formData, 'taskName', row.curTaskName) + this.$set(this.formData, 'tf_opinion', null) + this.$set(this.formData, 'tf_userSign', null) + this.$refs.infoRef.onOpen(row) + }, + handleTaskAction(val) { + if (!this.validateApprovalForm()) { + return + } + this.$refs.formRef.validate().then(() => { + this.$dialog.confirm({ + title: '温馨提示', + message: '您确定要提交吗?' + }).then(() => { + this.submitReview(val) + }).catch(() => {}) + }).catch(() => {}) + }, + // 自定义签字组件在 van-field 插槽中,需要先按真实表单值做提交前校验。 + validateApprovalForm() { + if (!this.formData.tf_opinion) { + this.$toast.fail(this.opinionMessage) + return false + } + if (!this.formData.tf_userSign) { + this.$toast.fail('请签字') + return false + } + return true + }, + submitReview(val) { + const data = { + id: this.formData.id, + processTaskId: this.formData.processTaskId, + tf_opinion: this.formData.tf_opinion, + tf_userSign: this.formData.tf_userSign, + submitType: val + } + if (this.reviewUrl) { + this.$axios.post(this.reviewUrl, { + data: JSON.stringify(data), + id: this.formData.id + }).then(this.afterSubmit) + } else { + this.$axios.post('/flow/common/executeTask', { + data: JSON.stringify(data) + }).then(this.afterSubmit) + } + }, + afterSubmit(res) { + if (res.code === 0) { + this.$toast.success(res.msg) + this.$refs.infoRef.onClose() + this.doSearch() + } else { + this.$toast.fail(res.msg) + } + }, + onRevoke(row) { + this.$dialog.confirm({ + title: '温馨提示', + message: '您确定要撤回吗?' + }).then(() => { + this.$axios.post('/flow/common/revokeTask', {taskId: row.taskId}).then((res) => { + if (res.code === 0) { + this.$toast.success(res.msg) + this.doSearch() + } else { + this.$toast.fail(res.msg) + } + }) + }).catch(() => {}) + }, + doSearch() { + this.$nextTick(() => { + this.$set(this.pageForm, 'pageNumber', 1) + this.$set(this.pageForm, 'totalCount', 0) + this.$refs.tableListRef.doSearch() + }) + } + } + }) +} diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/info.js b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/info.js new file mode 100644 index 0000000..11c12cb --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/common/info.js @@ -0,0 +1,170 @@ +const H5_ACTIVITY_REIMBURSEMENT_INFO = { + template: [ + '', + '
', + ' ', + ' {{ viewData.activityReimbursementMode === "activity" ? "活动报销" : "日常报销" }}', + ' ', + ' ', + ' ', + ' {{ viewData.deductionBudgetName || "暂无" }}', + ' {{ viewData.activityName || "暂无" }}', + ' {{ formatUser(viewData.userName, viewData.loginName) }}', + ' {{ viewData.declareUnitName || "暂无" }}', + ' {{ viewData.applyTime || "暂无" }}', + ' ', + ' ', + ' ', + ' ', + '
费用项目名称:{{ item.name || "暂无" }}
', + '
预算费用:{{ item.budgetPrice || 0 }}
', + '
实际费用:{{ item.actualPrice || 0 }}
', + '
收款人:{{ item.username || "暂无" }}
', + '
支行名称:{{ item.bankName || "暂无" }}
', + '
报销卡号:{{ item.bankCardNum || "暂无" }}
', + '
备注:{{ item.remark || "暂无" }}
', + '
', + ' {{ totalActualMoney }} 元', + '
', + ' ', + ' ', + ' ', + ' 暂无', + ' ', + ' ', + ' ', + ' ', + ' 暂无签字', + ' ', + ' ', + ' ', + '
', + ' ', + '
' + ].join(''), + store, + dicts: ['PROCESS_TASK_SUBMIT_TYPE', 'ACTIVITY_BUDGET_TYPE'], + data() { + return { + visible: false, + viewData: {}, + doneTasks: [], + row: null + } + }, + computed: { + totalActualMoney() { + if (!this.viewData.budgets || this.viewData.budgets.length === 0) { + return '0.00' + } + const sum = this.viewData.budgets.reduce((total, item) => { + return total + Number(item.actualPrice || 0) + }, 0) + return sum.toFixed(2) + } + }, + methods: { + onOpen(row) { + this.row = row + this.visible = true + this.getInfo() + this.getDoneTasks() + }, + onClose() { + this.visible = false + }, + getInfo() { + this.$axios.post('/platform/activityReimbursement/mine/findOne', {id: this.row.id}).then((res) => { + if (res.code === 0) { + this.viewData = this.normalizeInfo(res.data || {}) + } + }) + }, + getDoneTasks() { + this.$axios.post('/flow/common/doneTasks', {bizId: this.row.id}).then((res) => { + if (res.code === 0) { + this.doneTasks = res.data || [] + } + }) + }, + normalizeInfo(data) { + data.budgets = this.parseJsonArray(data.budgets) + data.billFiles = this.parseJsonArray(data.billFiles) + data.photoFiles = this.parseJsonArray(data.photoFiles) + data.otherFiles = this.parseJsonArray(data.otherFiles) + return data + }, + parseJsonArray(value) { + if (!value) { + return [] + } + if (Array.isArray(value)) { + return value + } + try { + return JSON.parse(value) + } catch (e) { + return [] + } + }, + formatDate(value) { + return value ? this.$moment(value).format('YYYY-MM-DD') : '未填写' + }, + formatRange(start, end) { + return this.formatDate(start) + ' ~ ' + this.formatDate(end) + }, + formatUser(userName, loginName) { + if (!userName && !loginName) { + return '暂无' + } + return (userName || '') + (loginName ? '(' + loginName + ')' : '') + }, + formatTaskUser(task) { + if (!task || !task.taskFormData) { + return '暂无' + } + const name = task.taskFormData.tf_userName || task.taskFormData.userName || '' + const account = task.taskFormData.loginName || '' + return this.formatUser(name, account) + } + }, + style: [ + '.activity-reimbursement-detail .fee-row{line-height:24px;}' + ].join('') +} diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html new file mode 100644 index 0000000..e7fc0ca --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html @@ -0,0 +1,74 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/mine/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/mine/index.html new file mode 100644 index 0000000..e916ce2 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/mine/index.html @@ -0,0 +1,130 @@ + + +
+ + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolFinance/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolFinance/index.html new file mode 100644 index 0000000..1a71774 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolFinance/index.html @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolPrincipal/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolPrincipal/index.html new file mode 100644 index 0000000..cd0e37a --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolPrincipal/index.html @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolUnion/index.html b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolUnion/index.html new file mode 100644 index 0000000..77601aa --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/activity/declarereimbursement/reimbursement/schoolUnion/index.html @@ -0,0 +1,74 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
{{ formData.taskName }}
+
+ + + + + +
+ 退回 + 拒绝 + 同意 +
+
+
+
+
+
+ + + +