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/pom.xml b/pom.xml index a45499c..f569550 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 jar com.budwk - zhgh_jshvc + mini 5.6.0-plus 2.6.0-SNAPSHOT diff --git a/src/main/java/com/budwk/app/sys/controller/SysH5ScanCodeUploadFileController.java b/src/main/java/com/budwk/app/sys/controller/SysH5ScanCodeUploadFileController.java index 99c44b1..02273a5 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysH5ScanCodeUploadFileController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysH5ScanCodeUploadFileController.java @@ -2,7 +2,6 @@ package com.budwk.app.sys.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONObject; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RedisConstant; import com.budwk.app.base.result.Result; @@ -10,6 +9,7 @@ import com.budwk.app.sys.enums.SysFileEngineTypeEnum; import com.budwk.app.sys.services.SysFileService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; import org.nutz.integration.jedis.RedisService; import org.nutz.integration.jedis.pubsub.PubSubService; import org.nutz.ioc.loader.annotation.Inject; @@ -22,10 +22,13 @@ import org.nutz.mvc.upload.UploadAdaptor; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; +import java.util.List; + @IocBean @At("/platform/sys/h5ScanCodeUploadFile") @Ok("json:full") @Api(tags = "h5扫码上传文件") +@Slf4j public class SysH5ScanCodeUploadFileController { @Inject @@ -55,6 +58,8 @@ public class SysH5ScanCodeUploadFileController { String url = sysFileService.uploadReturnUrl(SysFileEngineTypeEnum.MINIO.getValue(), file); return Result.success().addData(url); } catch (Exception e) { + log.error("h5扫码上传文件失败,loginName={}, fileName={}, fileSize={}", + getCurrentLoginName(), getUploadFileName(file), getUploadFileSize(file), e); return Result.error(e.getMessage()); } } @@ -63,26 +68,59 @@ public class SysH5ScanCodeUploadFileController { @At @SLog(tag = "文件管理", msg = "同步到PC") @SaCheckLogin - public Result syncPc(@Param("files") JSONObject[] jsonObject, @Param("timestamp") String timestamp) { + public Result syncPc(@Param("files") String files, @Param("timestamp") String timestamp) { try { - if(ObjectUtil.isEmpty(jsonObject)){ + if(ObjectUtil.isEmpty(files)){ + return Result.error("请选择要同步的文件"); + } + if(ObjectUtil.isEmpty(timestamp)){ + return Result.error("二维码已失效,请刷新电脑端二维码后重试"); + } + + // 手机端以表单字符串提交附件 JSON,后端显式解析,避免参数自动转换失败导致 500。 + List fileList = Json.fromJsonAsList(NutMap.class, files); + if(ObjectUtil.isEmpty(fileList)){ return Result.error("请选择要同步的文件"); } ScanParams match = new ScanParams().match(RedisConstant.REDIS_KEY_WSROOM + SecurityUtil.getUserLoginname() + ":*"); ScanResult scan = null; + int sendCount = 0; do { scan = redisService.scan(scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); for (String key : scan.getResult()) { - NutMap data = NutMap.NEW().addv("action", "h5-scan-code-upload-file-" + timestamp).addv("files", jsonObject); + NutMap data = NutMap.NEW().addv("action", "h5-scan-code-upload-file-" + timestamp).addv("files", fileList); pubSubService.fire(key, Json.toJson(data)); + sendCount++; } } while (!scan.isCompleteIteration()); + if(sendCount == 0){ + return Result.error("未找到电脑端上传窗口,请保持电脑端二维码页面打开"); + } + return Result.success().addData(null); } catch (Exception e) { + log.error("h5扫码上传文件同步到PC失败,loginName={}, timestamp={}, filesLength={}", + getCurrentLoginName(), timestamp, ObjectUtil.isEmpty(files) ? 0 : files.length(), e); return Result.error(e.getMessage()); } } + private String getCurrentLoginName() { + try { + return SecurityUtil.getUserLoginname(); + } catch (Exception e) { + return "unknown"; + } + } + + private String getUploadFileName(TempFile file) { + return file == null ? "" : file.getSubmittedFileName(); + } + + private long getUploadFileSize(TempFile file) { + return file == null ? 0 : file.getSize(); + } + } 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/StaffCareDataCon.java b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/StaffCareDataCon.java index 275d764..4152ae6 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/StaffCareDataCon.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/StaffCareDataCon.java @@ -1,4 +1,4 @@ -package com.budwk.app.zhgh.dayofficework.careData; +package com.budwk.app.zhgh.dayofficework.caredata; import cn.dev33.satoken.annotation.SaCheckPermission; 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/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvQuizRankServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvQuizRankServiceImpl.java index 7102663..f8ee590 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvQuizRankServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvQuizRankServiceImpl.java @@ -70,12 +70,12 @@ public class QsvQuizRankServiceImpl extends BaseServiceImpl List exportEntities = new ArrayList<>(); exportEntities.add(new ExcelExportEntity("姓名", "userName", 20)); exportEntities.add(new ExcelExportEntity("工号", "loginName", 20)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 30)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30)); exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); - exportEntities.add(new ExcelExportEntity("单位", "unitName", 30)); - exportEntities.add(new ExcelExportEntity("分工会", "unionName", 30)); exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 30)); if ("SCHEDULED".equals(mode) && pageForm.getAttemptDate() != null) { - exportEntities.add(new ExcelExportEntity("答题日期", "attemptDate", 20)); + exportEntities.add(new ExcelExportEntity("答题时间", "submitTime", 20)); exportEntities.add(new ExcelExportEntity("当天得分", "totalScore", 20)); } else { exportEntities.add(new ExcelExportEntity("得分", "sumScore", 20)); @@ -100,6 +100,7 @@ public class QsvQuizRankServiceImpl extends BaseServiceImpl u.mobile, t1.totalScore, t1.attemptDate, + t1.submitTime, sum(t1.totalScore) as sumScore FROM `qsv_user_answer_record` t1 @@ -133,7 +134,9 @@ public class QsvQuizRankServiceImpl extends BaseServiceImpl } cnd.groupBy("t1.userId"); - cnd.desc("t1.totalScore"); + cnd.asc("t1.unionName"); + cnd.asc("t1.unitName"); + cnd.asc("t1.loginName"); Sql sql = Sqls.create(sqlBuilder.toString()); sql.setCondition(cnd); 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/static/components/plugins/sysUpload/index.vue b/src/main/resources/static/components/plugins/sysUpload/index.vue index 370d6cf..a35e1bc 100644 --- a/src/main/resources/static/components/plugins/sysUpload/index.vue +++ b/src/main/resources/static/components/plugins/sysUpload/index.vue @@ -6,6 +6,7 @@ :action="action" :on-change="handleChange" :on-success="handleSuccess" + :on-error="handleError" :on-preview="handlePreview" :on-exceed="handleExceed" :before-upload="beforeUpload" @@ -26,6 +27,7 @@ :action="action" :on-change="handleChange" :on-success="handleSuccess" + :on-error="handleError" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeUpload" @@ -67,6 +69,7 @@ :action="action" :on-change="handleChange" :on-success="handleSuccess" + :on-error="handleError" :on-preview="handlePreview" :on-remove="handleRemove" :on-exceed="handleExceed" @@ -205,15 +208,15 @@ module.exports = { let tips = null if (uploadNumber) { - tips = `只能上传${uploadNumber}个文件;` + tips = '只能上传' + uploadNumber + '个文件;' } if (fileAccept) { - tips = tips + `只能上传${fileAccept}文件;` + tips = tips + '只能上传' + fileAccept + '文件;' } else { tips = tips + '不限格式;' } if (fileSize) { - tips = tips + `单个文件大小不能超过${(fileSize / 1024 / 1024).toFixed(2)}M;` + tips = tips + '单个文件大小不能超过' + (fileSize / 1024 / 1024).toFixed(2) + 'M;' } return tips }, @@ -341,7 +344,7 @@ module.exports = { if (valid) { return true } - this.$message.error(`文件只能是 ${this.fileAccept} 格式!`) + this.$message.error("文件只能是 " + this.fileAccept + " 格式!") return false }, @@ -441,15 +444,15 @@ module.exports = { let result = [] if (response && response.code === 0 && file.status === "success") { fileList.forEach((f) => { - if(f.response.data?.includes('webvpn')) { + if(f.response && f.response.data && f.response.data.includes('webvpn')) { const index = f.response.data.indexOf('/platform') - f.response.data = f.response.data.substring(index) + this.$set(f.response, "data", f.response.data.substring(index)) } result.push(f) }) } else { - this.$message.error(response.msg) - fileList = fileList.splice(file, 1) + this.$message.error(response && response.msg ? response.msg : "文件上传失败,请稍后重试") + fileList = this.filterFileList(fileList, file) } if (result.length > 0) { if (this.upload_result_category === "interval") { @@ -484,6 +487,40 @@ module.exports = { this.$emit("update:value", fileList) }, + handleError(error, file, fileList) { + this.$message.error(this.getUploadErrorMessage(error)) + this.$emit("update:value", this.filterFileList(fileList, file)) + }, + + filterFileList(fileList, file) { + if (!Array.isArray(fileList)) { + return [] + } + return fileList.filter((item) => { + return !file || item.uid !== file.uid + }) + }, + + getUploadErrorMessage(error) { + if (error && error.response && error.response.data && error.response.data.msg) { + return error.response.data.msg + } + if (error && error.status) { + return "文件上传失败,服务器返回" + error.status + } + return "文件上传失败,请检查文件后重试" + }, + + buildQrCodeAddress(timestamp) { + const currentLength = Array.isArray(this.fileList) ? this.fileList.length : 0 + const remainNumber = this.upload_number ? Math.max(this.upload_number - currentLength, 0) : 0 + let address = origin + "/platform/sys/h5ScanCodeUploadFile?timestamp=" + encodeURIComponent(timestamp) + address = address + "&upload_number=" + encodeURIComponent(remainNumber) + address = address + "&upload_size=" + encodeURIComponent(this.upload_size || "") + address = address + "&accept=" + encodeURIComponent(this.fileAccept || "") + return address + }, + // 通过DOM获取上传的文件 uploadFileList() { if (this.fileList) { @@ -546,7 +583,7 @@ module.exports = { mounted() { const timestamp = new Date().getTime() - this.qrCodeAddress = origin + "/platform/sys/h5ScanCodeUploadFile?timestamp=" + timestamp + this.$set(this, "qrCodeAddress", this.buildQrCodeAddress(timestamp)) console.info("qrCodeAddress:", this.qrCodeAddress) // 可选:轮询或 watch ready 状态 const checkReady = () => { @@ -588,7 +625,7 @@ module.exports = { if (validFiles.length < data.files.length) { data.files = validFiles - this.$message.error(`文件只能是 ${this.fileAccept} 格式,已自动过滤掉不符合要求文件!`) + this.$message.error("文件只能是 " + this.fileAccept + " 格式,已自动过滤掉不符合要求文件!") } } 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/sys/h5upload.html b/src/main/resources/views/platform/sys/h5upload.html index 17b2fa9..0d4be91 100644 --- a/src/main/resources/views/platform/sys/h5upload.html +++ b/src/main/resources/views/platform/sys/h5upload.html @@ -44,6 +44,13 @@ text-align: center; } + .upload-tip { + margin-top: 12px; + color: #666; + font-size: 13px; + line-height: 1.6; + } + .van-uploader__tip { color: var(--color-primary); font-size: 14px; @@ -78,8 +85,9 @@ >
- 同步到电脑 + 同步到电脑
+
{{ uploadTips }}
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/zhgh/dayofficework/qsv/quiz/rank.html b/src/main/resources/views/platform/zhgh/dayofficework/qsv/quiz/rank.html index d432e06..f1cce25 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/qsv/quiz/rank.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/qsv/quiz/rank.html @@ -67,7 +67,7 @@ layout("/layouts/platform.html"){ - +