From 1096ea245f4fb301e0e52a59f67d1e2817691e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Mon, 10 Aug 2026 10:48:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96gitignor?= =?UTF-8?q?e=E5=92=8Creadme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ff490a01 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# 依赖与构建产物 +**/node_modules/ +**/dist/ +**/build/ +**/target/ +**/out/ +**/.next/ +**/.nuxt/ +**/coverage/ + +# 日志、缓存与临时文件 +**/*.log +**/*.tmp +**/*.temp +**/.cache/ +**/.eslintcache +**/npm-debug.log* +**/yarn-debug.log* +**/yarn-error.log* +**/pnpm-debug.log* + +# IDE 与操作系统文件 +.idea/ +.vscode/ +*.iml +.project +.classpath +.settings/ +.DS_Store +Thumbs.db + +# 本地环境和密钥配置(保留示例文件) +**/.env +**/.env.local +**/.env.*.local +!**/.env.example +!**/.env.*.example + +# Java 编译文件 +**/*.class +.trae/.ignore +.trae/cache-components/SKILL.md +.trae/code-reviewer/SKILL.md +.trae/find-skills/SKILL.md +.trae/fix/SKILL.md +.trae/frontend-code-review/SKILL.md +.trae/frontend-design/SKILL.md +.trae/fullstack-developer/SKILL.md +.trae/pr-creator/SKILL.md +.trae/update-docs/SKILL.md +.trae/webapp-testing/SKILL.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..1d99f880 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# zhgh_cug_v4 + +智慧工会系统本地开发说明。 + +## 访问入口 + +PC 管理端: + +```text +http://127.0.0.1/platform/login +``` + +H5 端: + +```text +http://127.0.0.1/platform/h5 +``` + +## 登录账号 + +```text +账号:superadmin +密码:以本地数据库或初始化数据为准 +``` + +## 本地启动参数 + +如果使用 `application-dev.yaml`,IDEA 的 VM options 可配置: + +```text +-Dnutz.profiles.active=dev --add-opens java.base/java.lang=ALL-UNNAMED +``` + +如果端口不是 80,需要在访问地址中补上端口号,例如: + +```text +http://127.0.0.1:8080/platform/login +http://127.0.0.1:8080/platform/h5 +``` From 1b17c3434bf60985333bcc36c595e6d2854087b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Wed, 19 Aug 2026 09:17:12 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E5=93=81=E7=89=8C=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=AE=A4=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/base/constant/BpmProcessConstant.java | 2 + .../BrandApplicationFlowController.java | 43 + .../BrandApplicationStatisticsController.java | 47 + .../BrandStudioApplicationController.java | 118 +++ .../controller/BrandStudioPageController.java | 50 + .../convert/BrandApplicationFlowConvert.java | 14 + .../BrandStudioApplicationConvert.java | 41 + .../convert/BrandStudioHonorConvert.java | 24 + .../convert/BrandStudioMemberConvert.java | 19 + .../domain/dto/BrandApplicationAuditDTO.java | 57 + .../dto/BrandApplicationFlowRecallDTO.java | 24 + .../domain/dto/BrandApplicationRecallDTO.java | 26 + .../dto/BrandStudioApplicationCreateDTO.java | 140 +++ .../dto/BrandStudioApplicationPageDTO.java | 149 +++ .../dto/BrandStudioApplicationUpdateDTO.java | 112 ++ .../domain/dto/BrandStudioHonorCreateDTO.java | 34 + .../dto/BrandStudioMemberCreateDTO.java | 79 ++ .../dto/BrandStudioMemberUpdateDTO.java | 79 ++ .../enums/ApplicationFlowStatusEnum.java | 59 ++ .../enums/BrandApplicationStatusEnums.java | 42 + .../domain/vo/ApplicationProgressVO.java | 43 + .../brand/domain/vo/ApplicationWarnVO.java | 29 + .../domain/vo/BrandApplicationFlowVO.java | 66 ++ .../zhgh/brand/domain/vo/BrandFlowUserVO.java | 28 + .../vo/BrandStudioApplicationHonorExport.java | 58 + .../vo/BrandStudioApplicationHonorVO.java | 40 + .../domain/vo/BrandStudioApplicationVO.java | 152 +++ .../domain/vo/BrandStudioApplyFlowVO.java | 168 +++ .../brand/domain/vo/BrandStudioHonorVO.java | 39 + .../brand/domain/vo/BrandStudioMemberVO.java | 84 ++ .../app/zhgh/brand/domain/vo/DeptInfoVO.java | 13 + .../brand/domain/vo/LeaderHonorGroupVO.java | 21 + .../zhgh/brand/domain/vo/LeaderHonorVO.java | 130 +++ .../app/zhgh/brand/domain/vo/SysOrgVO.java | 96 ++ .../zhgh/brand/domain/vo/SysUnionDeptVO.java | 43 + .../brand/domain/vo/UnionApplyStatsVO.java | 56 + .../brand/models/BrandApplicationFlow.java | 99 ++ .../brand/models/BrandStudioApplication.java | 193 ++++ .../zhgh/brand/models/BrandStudioHonor.java | 70 ++ .../zhgh/brand/models/BrandStudioMember.java | 127 +++ .../service/BrandApplicationFlowService.java | 24 + .../BrandApplicationStatisticsService.java | 18 + .../BrandStudioApplicationService.java | 54 + .../service/BrandStudioHonorService.java | 10 + .../service/BrandStudioMemberService.java | 17 + .../impl/BrandApplicationFlowServiceImpl.java | 308 ++++++ ...BrandApplicationStatisticsServiceImpl.java | 139 +++ .../BrandStudioApplicationServiceImpl.java | 446 ++++++++ .../impl/BrandStudioHonorServiceImpl.java | 16 + .../impl/BrandStudioMemberServiceImpl.java | 49 + .../platform/zhgh/brand/api/application.js | 24 + .../views/platform/zhgh/brand/api/brand.js | 92 ++ .../platform/zhgh/brand/api/statistics.js | 37 + .../zhgh/brand/application/index.html | 91 ++ .../platform/zhgh/brand/application/index.vue | 416 ++++++++ .../application/index_bak_2026_02_10.vue | 411 ++++++++ .../platform/zhgh/brand/apply/index-table.vue | 126 +++ .../platform/zhgh/brand/apply/index.html | 209 ++++ .../views/platform/zhgh/brand/apply/index.vue | 149 +++ .../zhgh/brand/components/apply-info.vue | 699 ++++++++++++ .../zhgh/brand/components/flow-audit.vue | 528 +++++++++ .../zhgh/brand/components/flow-view.vue | 50 + .../zhgh/brand/components/info-audit.vue | 242 +++++ .../zhgh/brand/components/param-search.vue | 68 ++ .../brand/components/select-member-btn.vue | 103 ++ .../zhgh/brand/components/table-info.vue | 823 +++++++++++++++ .../platform/zhgh/brand/js/common-brand.js | 27 + .../platform/zhgh/brand/office/index.html | 72 ++ .../platform/zhgh/brand/office/index.vue | 205 ++++ .../overview/components/apply-pending.vue | 145 +++ .../overview/components/apply-progress.vue | 144 +++ .../brand/overview/components/bar-chart.vue | 81 ++ .../brand/overview/components/goal-card.vue | 61 ++ .../brand/overview/components/line-chart.vue | 62 ++ .../brand/overview/components/pie-chart.vue | 76 ++ .../brand/overview/components/union-table.vue | 114 ++ .../platform/zhgh/brand/overview/index.vue | 236 +++++ .../platform/zhgh/brand/review/index.html | 92 ++ .../platform/zhgh/brand/review/index.vue | 270 +++++ .../brand/summary/components/param-search.vue | 68 ++ .../platform/zhgh/brand/summary/index.html | 65 ++ .../platform/zhgh/brand/summary/index.vue | 338 ++++++ .../platform/zhgh/brand/tabs/info-edit.vue | 998 ++++++++++++++++++ 83 files changed, 10917 insertions(+) create mode 100644 src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationFlowController.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationStatisticsController.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioPageController.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/convert/BrandApplicationFlowConvert.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioApplicationConvert.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioHonorConvert.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioMemberConvert.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationFlowRecallDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationRecallDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioHonorCreateDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberCreateDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberUpdateDTO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/enums/ApplicationFlowStatusEnum.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/enums/BrandApplicationStatusEnums.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationProgressVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationWarnVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandApplicationFlowVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandFlowUserVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorExport.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioHonorVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioMemberVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/DeptInfoVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorGroupVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysOrgVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysUnionDeptVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/domain/vo/UnionApplyStatsVO.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/models/BrandApplicationFlow.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioApplication.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioHonor.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioMember.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationFlowService.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationStatisticsService.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioHonorService.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioMemberService.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationStatisticsServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioApplicationServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioHonorServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioMemberServiceImpl.java create mode 100644 src/main/resources/views/platform/zhgh/brand/api/application.js create mode 100644 src/main/resources/views/platform/zhgh/brand/api/brand.js create mode 100644 src/main/resources/views/platform/zhgh/brand/api/statistics.js create mode 100644 src/main/resources/views/platform/zhgh/brand/application/index.html create mode 100644 src/main/resources/views/platform/zhgh/brand/application/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/application/index_bak_2026_02_10.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/apply/index-table.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/apply/index.html create mode 100644 src/main/resources/views/platform/zhgh/brand/apply/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/apply-info.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/flow-audit.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/flow-view.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/info-audit.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/param-search.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/select-member-btn.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/components/table-info.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/js/common-brand.js create mode 100644 src/main/resources/views/platform/zhgh/brand/office/index.html create mode 100644 src/main/resources/views/platform/zhgh/brand/office/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/apply-pending.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/apply-progress.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/bar-chart.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/goal-card.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/line-chart.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/pie-chart.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/components/union-table.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/overview/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/review/index.html create mode 100644 src/main/resources/views/platform/zhgh/brand/review/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/summary/components/param-search.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/summary/index.html create mode 100644 src/main/resources/views/platform/zhgh/brand/summary/index.vue create mode 100644 src/main/resources/views/platform/zhgh/brand/tabs/info-edit.vue diff --git a/src/main/java/com/budwk/app/base/constant/BpmProcessConstant.java b/src/main/java/com/budwk/app/base/constant/BpmProcessConstant.java index f2b252a2..0065cbb5 100644 --- a/src/main/java/com/budwk/app/base/constant/BpmProcessConstant.java +++ b/src/main/java/com/budwk/app/base/constant/BpmProcessConstant.java @@ -41,6 +41,8 @@ public enum BpmProcessConstant { ARTICLE("新闻投稿"), + BRAND_STUDIO("品牌工作室"), + BRANCH_UNION_WEIYUAN_AUTHORIZATION("分工会委员授权") ; diff --git a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationFlowController.java b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationFlowController.java new file mode 100644 index 00000000..177f4de5 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationFlowController.java @@ -0,0 +1,43 @@ +package com.budwk.app.zhgh.brand.controller; + +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationRecallDTO; +import com.budwk.app.zhgh.brand.domain.vo.BrandApplicationFlowVO; +import com.budwk.app.zhgh.brand.service.BrandApplicationFlowService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.validation.Valid; +import java.util.List; + +@IocBean +@Ok("json:full") +@At("/platform/zhgh/brand/flow") +public class BrandApplicationFlowController { + + @Inject + private BrandApplicationFlowService flowService; + + @At("/process") + public Result process(@Param("applicationId") String applicationId) { + List flowList = flowService.getFlowList(applicationId); + return Result.success(flowList); + } + + @At("/audit") + public Result audit(@Param("..") @Valid BrandApplicationAuditDTO dto) { + flowService.audit(dto); + return Result.success(); + } + + @At("/recall") + public Result recall(@Param("..") BrandApplicationRecallDTO dto) { + flowService.recall(dto); + return Result.success(); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationStatisticsController.java b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationStatisticsController.java new file mode 100644 index 00000000..598f3d89 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandApplicationStatisticsController.java @@ -0,0 +1,47 @@ +package com.budwk.app.zhgh.brand.controller; + +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.brand.domain.vo.ApplicationProgressVO; +import com.budwk.app.zhgh.brand.domain.vo.ApplicationWarnVO; +import com.budwk.app.zhgh.brand.domain.vo.UnionApplyStatsVO; +import com.budwk.app.zhgh.brand.service.BrandApplicationStatisticsService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import java.util.List; +import java.util.Map; + +@IocBean +@Ok("json:full") +@At("/platform/zhgh/brand/statistics") +public class BrandApplicationStatisticsController { + + @Inject + private BrandApplicationStatisticsService statisticsService; + + @At("/unionStats") + public Result selectUnionApplyStats() { + List vos = statisticsService.selectUnionApplyStats(); + return Result.success(vos); + } + + @At("/applyProgress") + public Result selectApplyProgressStats() { + List vos = statisticsService.selectApplyProgressStats(); + return Result.success(vos); + } + + @At("/applyWarning") + public Result selectApplyWarningStats() { + List vos = statisticsService.selectApplyWarningStats(); + return Result.success(vos); + } + + @At("/applyCount") + public Result selectApplyMapCount() { + Map> selectApplyMapCount = statisticsService.selectApplyMapCount(); + return Result.success(selectApplyMapCount); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java new file mode 100644 index 00000000..86b9c4b3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java @@ -0,0 +1,118 @@ +package com.budwk.app.zhgh.brand.controller; + +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.brand.convert.BrandStudioApplicationConvert; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationCreateDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationPageDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationUpdateDTO; +import com.budwk.app.zhgh.brand.domain.vo.*; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; +import com.budwk.app.zhgh.brand.service.BrandStudioApplicationService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +@IocBean +@Ok("json:full") +@At("/platform/zhgh/brand/application") +public class BrandStudioApplicationController { + + @Inject + private BrandStudioApplicationService applicationService; + + @At("/leader") + public Result queryLeaderHonor() { + List leaderHonorVO = applicationService.queryLeaderHonor(); + return Result.success(leaderHonorVO); + } + + @At("/page") + public Result page(@Valid BrandStudioApplicationPageDTO dto) { + return Result.success(applicationService.page(dto)); + } + + @At("/{id}") + public Result get(@Param("id") String id) { + BrandStudioApplicationVO applicationVO = applicationService.getDetailById(id); + return Result.success(applicationVO); + } + + @At + public Result save(@Param("..") @Valid BrandStudioApplicationCreateDTO dto) { + applicationService.save(dto); + return Result.success(); + } + + @At("/submitApply") + public Result submitApply(@Param("..") @Valid BrandApplicationAuditDTO dto) { + applicationService.submitApply(dto); + return Result.success(); + } + + @At("/delete") + public Result delete(@Param("..") NutMap request) { + applicationService.delete((List) request.get("data")); + return Result.success(); + } + + @At("/update") + public Result update(@Param("..") @Valid BrandStudioApplicationUpdateDTO updateDTO) { + applicationService.update(updateDTO); + return Result.success(); + } + + @At("/base") + public Result updateBase(@Param("..") BrandStudioApplicationUpdateDTO updateDTO) { + BrandStudioApplication entity = BrandStudioApplicationConvert.convert(updateDTO); + applicationService.updateIgnoreNull(entity); + return Result.success(); + } + + @At("/auditPage") + public Result auditPage(@Valid BrandStudioApplicationPageDTO dto) { +// PageResult page = applicationService.auditPage(dto); + return Result.success(applicationService.flowAuditPage(dto)); + } + + @At("/archive") + public Result archive(@Param("ids") List idList) { + applicationService.archive(idList); + return Result.success(); + } + + @At("/honor/{id}") + public Result honor(@Param("id") String id) { + List vos = applicationService.getHonorDetailById(id); + return Result.success(vos); + } + + @At("/summaryPage") + public Result summaryPage(@Valid BrandStudioApplicationPageDTO dto) { + return Result.success(applicationService.summaryPage(dto)); + } + + @At("/honor") + public Result updateMemberOrHonor(@Param("..") @Valid BrandStudioApplicationUpdateDTO updateDTO) { + applicationService.updateMemberOrHonor(updateDTO); + return Result.success(); + } + + @At("/export") + public void export() { + applicationService.export(); + } + + @At("/export/docx/{id}") + public void exportDocx(@Param("id") String id, HttpServletResponse response) { + applicationService.exportDocx(id, response); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioPageController.java b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioPageController.java new file mode 100644 index 00000000..2cc450a3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioPageController.java @@ -0,0 +1,50 @@ +package com.budwk.app.zhgh.brand.controller; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/zhgh/brand") +public class BrandStudioPageController { + + /** + * 品牌工作室申请列表页面 + */ + @At("/application/index") + @Ok("beetl:/platform/zhgh/brand/application/index.html") + public void applicationIndex() { + } + + /** + * 品牌工作室申请填报页面 + */ + @At("/apply/index") + @Ok("beetl:/platform/zhgh/brand/apply/index.html") + public void applyIndex() { + } + + /** + * 品牌工作室审批页面 + */ + @At("/review/index") + @Ok("beetl:/platform/zhgh/brand/review/index.html") + public void reviewIndex() { + } + + /** + * 品牌工作室汇总页面 + */ + @At("/summary/index") + @Ok("beetl:/platform/zhgh/brand/summary/index.html") + public void summaryIndex() { + } + + /** + * 品牌工作室管理页面 + */ + @At("/office/index") + @Ok("beetl:/platform/zhgh/brand/office/index.html") + public void officeIndex() { + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/convert/BrandApplicationFlowConvert.java b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandApplicationFlowConvert.java new file mode 100644 index 00000000..eadab294 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandApplicationFlowConvert.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.brand.convert; + +import cn.hutool.core.bean.BeanUtil; +import com.budwk.app.zhgh.brand.models.BrandApplicationFlow; +import com.budwk.app.zhgh.brand.domain.vo.BrandApplicationFlowVO; + +import java.util.List; + +public class BrandApplicationFlowConvert { + + public static List convertList(List list) { + return BeanUtil.copyToList(list, BrandApplicationFlowVO.class); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioApplicationConvert.java b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioApplicationConvert.java new file mode 100644 index 00000000..b0f7340d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioApplicationConvert.java @@ -0,0 +1,41 @@ +package com.budwk.app.zhgh.brand.convert; + +import cn.hutool.core.bean.BeanUtil; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationCreateDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationUpdateDTO; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; +import com.budwk.app.zhgh.brand.domain.vo.BrandStudioApplicationVO; +import com.budwk.app.zhgh.brand.domain.vo.BrandStudioApplicationHonorVO; + +import java.util.List; + +public class BrandStudioApplicationConvert { + + public static BrandStudioApplication convert(BrandStudioApplicationCreateDTO dto) { + BrandStudioApplication brandStudioApplication = new BrandStudioApplication(); + BeanUtil.copyProperties(dto, brandStudioApplication); + return brandStudioApplication; + } + + public static BrandStudioApplication convert(BrandStudioApplicationUpdateDTO dto) { + BrandStudioApplication brandStudioApplication = new BrandStudioApplication(); + BeanUtil.copyProperties(dto, brandStudioApplication); + return brandStudioApplication; + } + + public static BrandStudioApplicationVO convert(BrandStudioApplicationHonorVO application) { + BrandStudioApplicationVO vo = new BrandStudioApplicationVO(); + BeanUtil.copyProperties(application, vo); + return vo; + } + + public static BrandStudioApplicationVO convert(BrandStudioApplication application) { + BrandStudioApplicationVO vo = new BrandStudioApplicationVO(); + BeanUtil.copyProperties(application, vo); + return vo; + } + + public static List convertList(List list) { + return BeanUtil.copyToList(list, BrandStudioApplicationVO.class); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioHonorConvert.java b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioHonorConvert.java new file mode 100644 index 00000000..7a702f9a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioHonorConvert.java @@ -0,0 +1,24 @@ +package com.budwk.app.zhgh.brand.convert; + +import cn.hutool.core.bean.BeanUtil; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioHonorCreateDTO; +import com.budwk.app.zhgh.brand.models.BrandStudioHonor; +import com.budwk.app.zhgh.brand.domain.vo.BrandStudioApplicationHonorVO; +import com.budwk.app.zhgh.brand.domain.vo.BrandStudioHonorVO; + +import java.util.List; + +public class BrandStudioHonorConvert { + + public static List convertList(List list) { + return BeanUtil.copyToList(list, BrandStudioApplicationHonorVO.class); + } + + public static List convertListVO(List honorList) { + return BeanUtil.copyToList(honorList, BrandStudioHonorVO.class); + } + + public static List convertListDTO(List honorList) { + return BeanUtil.copyToList(honorList, BrandStudioHonor.class); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioMemberConvert.java b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioMemberConvert.java new file mode 100644 index 00000000..56281327 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/convert/BrandStudioMemberConvert.java @@ -0,0 +1,19 @@ +package com.budwk.app.zhgh.brand.convert; + +import cn.hutool.core.bean.BeanUtil; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioMemberCreateDTO; +import com.budwk.app.zhgh.brand.models.BrandStudioMember; +import com.budwk.app.zhgh.brand.domain.vo.BrandStudioMemberVO; + +import java.util.List; + +public class BrandStudioMemberConvert { + + public static List convertList(List list) { + return BeanUtil.copyToList(list, BrandStudioMember.class); + } + + public static List convertListVO(List list) { + return BeanUtil.copyToList(list, BrandStudioMemberVO.class); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java new file mode 100644 index 00000000..aba2b1e4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java @@ -0,0 +1,57 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 品牌工作室申请审核 + */ +@Data +public class BrandApplicationAuditDTO { + + /** + * 申请 Id + */ + private String applicationId; + + /** + * 状态 + */ + private Integer status; + + /** + * 待处理的 状态流 id + */ + private String flowId; + + /** + * 备注 + */ + private String remark; + + /** + * 流程实例ID + */ + private String processInstanceId; + + /** + * 流程业务ID + */ + private String processInstanceBusinessId; + + /** + * 流程任务ID + */ + private String processInstanceTaskId; + + /** + * 任务审批类型 + */ + private String bpmTaskApprovalType; + + /** + * 下一个任务接收人 + */ + private List assignments; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationFlowRecallDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationFlowRecallDTO.java new file mode 100644 index 00000000..babab3cd --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationFlowRecallDTO.java @@ -0,0 +1,24 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 申请撤回 + */ +@Data +public class BrandApplicationFlowRecallDTO { + + /** + * 当前流程ID + */ + @NotBlank(message = "当前流程ID不能为空") + private String curFlowId; + + /** + * 下个流程ID + */ + @NotBlank(message = "下个流程ID不能为空") + private String nextFlowId; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationRecallDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationRecallDTO.java new file mode 100644 index 00000000..20fa5344 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationRecallDTO.java @@ -0,0 +1,26 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +/** + * 申请撤回 + */ +@Data +public class BrandApplicationRecallDTO { + + /** + * 操作流程 ID + */ + private String flowId; + + /** + * 当前申请 ID + */ + private String applicationId; + + /** + * 流程任务ID + */ + private String processInstanceTaskId; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java new file mode 100644 index 00000000..0732da8c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java @@ -0,0 +1,140 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; + +@Data +public class BrandStudioApplicationCreateDTO { + + /** + * 工作室名称 + */ + @NotBlank(message = "工作室名称不能为空") + private String name; + + /** + * 工会ID + */ + @NotBlank(message = "所属工会不能为空") + private String unionId; + + /** + * 工会名称 + */ + @NotBlank(message = "所属工会不能为空") + private String unionName; + + /** + * 创建年份(格式:2025) + */ + @NotBlank(message = "创建年份不能为空") + @Pattern(regexp = "^\\d{4}$", message = "创建年份格式必须为4位年份") + private String createYear; + + /** + * 工作室领衔人 + */ + @NotBlank(message = "领衔人不能为空") + @Size(max = 20, message = "领衔人最多20个字符") + private String leadPeople; + + /** + * 领衔人年龄 + */ + @NotNull(message = "领衔人年龄不能为空") + @Min(value = 0, message = "年龄不能小于0") + @Max(value = 150, message = "年龄不能超过150") + private Integer leadAge; + + /** + * 领衔人身份(多个用逗号分隔) + */ + @NotBlank(message = "领衔人身份不能为空") + private String leadIdentity; + + /** + * 工作室类型 + */ + @NotBlank(message = "工作室类型不能为空") + private String type; + + /** + * 所属赛道 + */ + @NotBlank(message = "赛道不能为空") + private String track; + + /** + * 工作室具体位置 + */ + @NotBlank(message = "地址不能为空") + private String address; + + /** + * 成员人数 + */ + @NotNull(message = "成员人数不能为空") + @Min(value = 1, message = "成员人数至少1人") + private Integer memberNum; + + /** + * 工作室介绍 + */ + @NotBlank(message = "工作室介绍不能为空") + private String introduction; + + /** + * 申请状态 + */ + @NotNull(message = "申请状态不能为空") + private Integer status; + + /** + * 是否归档(0-否,1-是) + */ + private Integer archive; + + /** + * 创建人姓名 + */ + private String createName; + + /** + * 所属机构ID + */ + @NotBlank(message = "所属机构不能为空") + private String deptid; + + /** + * 机构名称 + */ + @NotBlank(message = "所属机构不能为空") + private String deptName; + + /** + * 所属领域 + */ + @NotBlank(message = "所属领域不能为空") + private String domain; + + /** + * 领衔人荣誉称号 + */ + @NotBlank(message = "领衔人荣誉不能为空") + private String leadHonor; + + /** + * 备注 + */ + private String remark; + + /** + * 工作室成员列表 + */ + @NotEmpty(message = "至少需要1位成员") + @Valid + private List brandStudioMembers; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java new file mode 100644 index 00000000..fd921f34 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java @@ -0,0 +1,149 @@ +package com.budwk.app.zhgh.brand.domain.dto; + + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 品牌工作室申请表 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandStudioApplicationPageDTO extends PageForm { + + private Integer page = 1; + + private Integer limit = 10; + + /** + * 工作室ID,主键 + */ + private String id; + + /** + * 工作室名称 + */ + private String name; + + /** + * 申请人ID,唯一 + */ + private String userId; + + /** + * 申请人所属工会ID + */ + private String unionId; + private List unionIds; + + /** + * 工会名称 + */ + private String unionName; + + /** + * 创建年份(格式如:2025) + */ + private String createYear; + + /** + * 工作室领衔人 + */ + private String leadPeople; + + /** + * 领衔人年龄 + */ + private Integer leadAge; + + /** + * 领衔人身份,多个身份用逗号分隔 + */ + private String leadIdentity; + + /** + * 工作室类型 + */ + private String type; + + /** + * 所属赛道 + */ + private String track; + + /** + * 工作室具体位置 + */ + private String address; + + /** + * 成员人数 + */ + private Integer memberNum; + + /** + * 工作室介绍 + */ + private String introduction; + + /** + * 申请进度 + */ + private Integer status; + + /** + * 归档 + */ + private Integer archive; + + /** + * 创建人姓名 + */ + private String createName; + + /** + * 所属机构 + */ + private String deptid; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 所属领域 + */ + private String domain; + + /** + * 领衔人荣誉称号 + */ + private String leadHonor; + + /** + * 备注 + */ + private String remark; + + /** + * 工作流状态 + */ + private Integer processStatus; + + @Override + public Integer getPageNumber() { + Integer pageNumber = super.getPageNumber(); + return pageNumber == null ? page : pageNumber; + } + + @Override + public Integer getPageSize() { + Integer pageSize = super.getPageSize(); + return pageSize == null ? limit : pageSize; + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java new file mode 100644 index 00000000..a9d109ff --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java @@ -0,0 +1,112 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class BrandStudioApplicationUpdateDTO { + + /** + * 工作室ID,主键 + */ + private String id; + + /** + * 工作室名称 + */ + private String name; + + /** + * 创建年份(格式如:2025) + */ + private String createYear; + + /** + * 工作室领衔人 + */ + private String leadPeople; + + /** + * 领衔人年龄 + */ + private Integer leadAge; + + /** + * 领衔人身份,多个身份用逗号分隔 + */ + private String leadIdentity; + + /** + * 工作室类型 + */ + private String type; + + /** + * 所属赛道 + */ + private String track; + + /** + * 工作室具体位置 + */ + private String address; + + /** + * 成员人数 + */ + private Integer memberNum; + + /** + * 工作室介绍 + */ + private String introduction; + + /** + * 申请进度 + */ + private Integer status; + + /** + * 归档 + */ + private Integer archive; + + /** + * 创建人姓名 + */ + private String createName; + + /** + * 所属机构 + */ + private String deptid; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 所属领域 + */ + private String domain; + + /** + * 领衔人荣誉称号 + */ + private String leadHonor; + + /** + * 备注 + */ + private String remark; + + /** + * 添加的成员 + * */ + private List brandStudioMembers; + + private List brandStudioHonors; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioHonorCreateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioHonorCreateDTO.java new file mode 100644 index 00000000..12640589 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioHonorCreateDTO.java @@ -0,0 +1,34 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +@Data +public class BrandStudioHonorCreateDTO { + + /** + * 工作室申请ID + */ + private String applicationId; + + /** + * 荣誉称号 + */ + private String honorName; + + /** + * 级别 + */ + private String honorGrade; + + /** + * 获取年份 + */ + private String requireYear; + + /** + * 荣誉类别:外部荣誉,行内荣誉 + * 通常可定义为枚举或常量: + * 例如:1 - 外部荣誉,2 - 行内荣誉 + */ + private Short honorCategory; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberCreateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberCreateDTO.java new file mode 100644 index 00000000..815f2a8b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberCreateDTO.java @@ -0,0 +1,79 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * 工作室成员信息表实体类 + */ +@Data +public class BrandStudioMemberCreateDTO { + + /** + * 工作室ID(外键,关联到 BrandStudioApplication) + */ + private String applicationId; + + /** + * 用户 ID + */ + private String userId; + + /** + * 用户 工号 + */ + private String emplid; + + /** + * 成员姓名 + */ + @NotBlank(message = "成员姓名不能为空") + private String name; + + /** + * 成员角色(如:核心成员、技术骨干、助理等) + */ + private String role; + + /** + * 成员出生年月(建议格式:yyyy-MM 或 yyyy,实际为字符串存储) + */ + @NotBlank(message = "成员出生年月不能为空") + private String birthdate; + + /** + * 学历(如:本科、硕士、博士等) + */ + @NotBlank(message = "学历不能为空") + private String grade; + + /** + * 职称(如:高级工程师、教授、技师等) + */ + @NotBlank(message = "职称不能为空") + private String professional; + + /** + * 所在部门 + */ + private String deptName; + + /** + * 加入日期 + */ + private LocalDateTime joinDate; + + /** + * 离开日期(可为空,表示尚未离职) + */ + private LocalDateTime leaveDate; + + /** + * 成员状态: + * 0 - 在职, + * 1 - 离职 + */ + private Integer status; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberUpdateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberUpdateDTO.java new file mode 100644 index 00000000..a3e8fe21 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioMemberUpdateDTO.java @@ -0,0 +1,79 @@ +package com.budwk.app.zhgh.brand.domain.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 工作室成员信息表实体类 + */ +@Data +public class BrandStudioMemberUpdateDTO { + + /** + * ID + */ + private String id; + + /** + * 工作室ID(外键,关联到 BrandStudioApplication) + */ + private String applicationId; + + /** + * 用户 ID + */ + private String userId; + + /** + * 用户 工号 + */ + private String emplid; + + /** + * 成员姓名 + */ + private String name; + + /** + * 成员角色(如:核心成员、技术骨干、助理等) + */ + private String role; + + /** + * 成员出生年月(建议格式:yyyy-MM 或 yyyy,实际为字符串存储) + */ + private String birthdate; + + /** + * 学历(如:本科、硕士、博士等) + */ + private String grade; + + /** + * 职称(如:高级工程师、教授、技师等) + */ + private String professional; + + /** + * 所在部门 + */ + private String deptName; + + /** + * 加入日期 + */ + private LocalDateTime joinDate; + + /** + * 离开日期(可为空,表示尚未离职) + */ + private LocalDateTime leaveDate; + + /** + * 成员状态: + * 0 - 在职, + * 1 - 离职 + */ + private Integer status; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/enums/ApplicationFlowStatusEnum.java b/src/main/java/com/budwk/app/zhgh/brand/domain/enums/ApplicationFlowStatusEnum.java new file mode 100644 index 00000000..cce67ae8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/enums/ApplicationFlowStatusEnum.java @@ -0,0 +1,59 @@ +package com.budwk.app.zhgh.brand.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 荣誉申请状态 + */ +@Getter +@AllArgsConstructor +public enum ApplicationFlowStatusEnum +{ + /** + * 等待审核 + */ + WAIT_AUDIT(0), + /** + * 待审核/审核中 + */ + TO_BE_AUDIT(1), + /** + * 驳回 + */ + REJECT(2), + /** + * 撤销 + */ + REPEAL(3), + /** + * 撤回 -> 取消 + */ + RECALL(4), + /** + * 通过 + */ + PASSED(5), + ; + + private final int value; + + public Integer getValue() { + return this.value; + } + + /** + * 根据状态码获取对应的枚举项 + * + * @param value 状态码 + * @return 对应的枚举,若不存在则返回 null + */ + public static ApplicationFlowStatusEnum getStatusEnumByValue(int value) { + for (ApplicationFlowStatusEnum status : values()) { + if (status.value == value) { + return status; + } + } + return null; // 未找到时返回 null + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/enums/BrandApplicationStatusEnums.java b/src/main/java/com/budwk/app/zhgh/brand/domain/enums/BrandApplicationStatusEnums.java new file mode 100644 index 00000000..b6f890ee --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/enums/BrandApplicationStatusEnums.java @@ -0,0 +1,42 @@ +package com.budwk.app.zhgh.brand.domain.enums; + +import lombok.Getter; + +/** + * 品牌工作室申请进度状态枚举 + */ +@Getter +public enum BrandApplicationStatusEnums { + + DRAFT(0, "草稿"), + IN_REVIEW(1, "审核中/提交申请"), + REJECT(2, "驳回"), + REPEAL(3, "撤销"), + RECALL(4, "撤回"), + PASSED(5, "通过"), + CREATING(6, "正在创建"), + FAIL(7, "创建失败"); + + private final int code; + private final String description; + + BrandApplicationStatusEnums(int code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据状态码获取对应的枚举项 + * + * @param code 状态码 + * @return 对应的枚举,若不存在则返回 null + */ + public static BrandApplicationStatusEnums getStatusByCode(int code) { + for (BrandApplicationStatusEnums status : values()) { + if (status.code == code) { + return status; + } + } + return null; // 未找到时返回 null + } +} \ No newline at end of file diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationProgressVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationProgressVO.java new file mode 100644 index 00000000..072e9816 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationProgressVO.java @@ -0,0 +1,43 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class ApplicationProgressVO { + + /** 申请单 ID */ + private Long applicationId; + + /** 申请工作室名称 */ + private String applicationName; + + /** 申请工会 ID */ + private String unionId; + + /** 申请人直属工会名称 */ + private String unionName; + + /** 用户ID */ + private Long userId; + + /** 申请单状态 */ + private Integer status; + + /** 牵头人 */ + private String leadPeople; + + /** 申请时间 */ + private LocalDateTime createTime; + + /** 总节点数 */ + private Integer totalNodes; + + /** 已通过的节点数 */ + private Integer passedNodes; + + /** 进度百分比(0-100),保留两位小数 */ + private BigDecimal progressPct; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationWarnVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationWarnVO.java new file mode 100644 index 00000000..32c5e354 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/ApplicationWarnVO.java @@ -0,0 +1,29 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class ApplicationWarnVO { + + private String applicationId; + + private String name; + private String leadPeople; + + private Integer status; + + private String unionId; + + private String unionName; + + private LocalDateTime receiveTime; + + private BigDecimal pendingDays; + + private Integer warnStatus; + + private BigDecimal avgAuditDays; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandApplicationFlowVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandApplicationFlowVO.java new file mode 100644 index 00000000..f0e0306d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandApplicationFlowVO.java @@ -0,0 +1,66 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 申请流程 VO + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandApplicationFlowVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 工会ID + */ + private String unionId; + + /** + * 工会 + */ + private String unionName; + + /** + * 审核人ID + */ + private String auditorId; + + /** + * 审核人 + */ + private String auditor; + + /** + * 申请ID + */ + private String applicationId; + + /** + * 状态(0:待审核;1:驳回;2:撤回;3:撤销;4:通过) + */ + private Integer status; + + /** + * 审批内容(意见描述) + */ + private String content; + + /** + * 备注 + */ + private String remark; + + /** + * 序号 + */ + private Integer sortNo; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandFlowUserVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandFlowUserVO.java new file mode 100644 index 00000000..f25714b2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandFlowUserVO.java @@ -0,0 +1,28 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +@Data +public class BrandFlowUserVO { + + /** + * 申请人ID,唯一 + */ + private String userId; + + /** + * 流程 ID + */ + private String flowId; + + /** + * 流程 状态 + */ + private Integer flowStatus; + + /** + * 流程 序号 + */ + private Integer sortNo; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorExport.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorExport.java new file mode 100644 index 00000000..a849b0e7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorExport.java @@ -0,0 +1,58 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +/** + * 品牌工作室荣誉导出写死 + */ +@Data +public class BrandStudioApplicationHonorExport { + + private Integer index; + + /** + * 工作室名称 + */ + private String name; + + + /** + * 创建年份(格式如:2025) + */ + private String createYear; + + /** + * 工作室领衔人 + */ + private String leadPeople; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 荣誉称号 + */ + private String honorName; + + /** + * 所属赛道 + */ + private String track; + + /** + * 领衔人荣誉称号 + */ + private String leadHonor; + + /** + * 成员人数 + */ + private Integer memberNum; + + /** + * 工作室具体位置 + */ + private String address; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorVO.java new file mode 100644 index 00000000..dbd163ab --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationHonorVO.java @@ -0,0 +1,40 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 品牌工作室荣誉 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandStudioApplicationHonorVO extends BrandStudioApplicationVO { + + /** + * 工作室荣誉ID,主键 + */ + private String honorId; + + /** + * 荣誉称号 + */ + private String honorName; + + /** + * 级别 + */ + private String honorGrade; + + /** + * 获取年份 + */ + private String requireYear; + + /** + * 荣誉类别:外部荣誉,行内荣誉 + * 通常可定义为枚举或常量: + * 例如:1 - 外部荣誉,2 - 行内荣誉 + */ + private Short honorCategory; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java new file mode 100644 index 00000000..28725081 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java @@ -0,0 +1,152 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * 品牌工作室 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandStudioApplicationVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 工作室名称 + */ + private String name; + + /** + * 工会ID + */ + private String unionId; + + /** + * 工会名称 + */ + private String unionName; + + /** + * 创建年份(格式如:2025) + */ + private String createYear; + + /** + * 工作室领衔人 + */ + private String leadPeople; + + /** + * 领衔人年龄 + */ + private Integer leadAge; + + /** + * 领衔人身份,多个身份用逗号分隔 + */ + private String leadIdentity; + + /** + * 工作室类型 + */ + private String type; + + /** + * 所属赛道 + */ + private String track; + + /** + * 工作室具体位置 + */ + private String address; + + /** + * 成员人数 + */ + private Integer memberNum; + + /** + * 工作室介绍 + */ + private String introduction; + + /** + * 申请进度 + */ + private Integer status; + + /** + * 归档 + */ + private Integer archive; + + /** + * 流程 ID + */ + private String flowId; + + /** + * 流程 工会名称 + */ + private String flowUnionName; + + /** + * 流程 状态 + */ + private Integer flowStatus; + + /** + * 流程 序号 + */ + private Integer flowSortNo; + + /** + * 创建人姓名 + */ + private String createName; + + /** + * 所属机构 + */ + private String deptid; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 所属领域 + */ + private String domain; + + /** + * 领衔人荣誉称号 + */ + private String leadHonor; + + /** + * 备注 + */ + private String remark; + + /** + * 添加的成员 + * */ + private List brandStudioMembers; + + /** + * 荣誉相关信息 + * */ + private List brandStudioHonors; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java new file mode 100644 index 00000000..e1e19ee3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java @@ -0,0 +1,168 @@ +package com.budwk.app.zhgh.brand.domain.vo; + + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 审核返回数据 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandStudioApplyFlowVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + private String applicationId; + + /** + * 工作室名称 + */ + private String name; + + /** + * 工会ID + */ + private String unionId; + + /** + * 工会名称 + */ + private String unionName; + + /** + * 创建年份(格式如:2025) + */ + private String createYear; + + /** + * 工作室领衔人 + */ + private String leadPeople; + + /** + * 领衔人年龄 + */ + private Integer leadAge; + + /** + * 领衔人身份,多个身份用逗号分隔 + */ + private String leadIdentity; + + /** + * 工作室类型 + */ + private String type; + + /** + * 所属赛道 + */ + private String track; + + /** + * 工作室具体位置 + */ + private String address; + + /** + * 成员人数 + */ + private Integer memberNum; + + /** + * 工作室介绍 + */ + private String introduction; + + /** + * 申请进度 + */ + private Integer status; + + /** + * 归档 + */ + private Integer archive; + + /** + * 流程 ID + */ + private String flowId; + + /** + * 流程 工会名称 + */ + private String flowUnionName; + + /** + * 流程 状态 + */ + private Integer flowStatus; + + /** + * 流程 序号 + */ + private Integer flowSortNo; + + /** + * 创建人姓名 + */ + private String createName; + + /** + * 所属机构 + */ + private String deptid; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 所属领域 + */ + private String domain; + + /** + * 领衔人荣誉称号 + */ + private String leadHonor; + + /** + * 备注 + */ + private String remark; + + + private Integer processUserTaskStatus; + + + private Date processTaskStartTime; + + + private Date processTaskEndTime; + + + private String processTaskReason; + + + private String processTaskNode; + + + private String processInstanceId; + + + private String processInstanceTaskId; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioHonorVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioHonorVO.java new file mode 100644 index 00000000..e25e6636 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioHonorVO.java @@ -0,0 +1,39 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +@Data +public class BrandStudioHonorVO { + + /** + * 工作室荣誉ID,主键 + */ + private String id; + + /** + * 工作室申请ID + */ + private String applicationId; + + /** + * 荣誉称号 + */ + private String honorName; + + /** + * 级别 + */ + private String honorGrade; + + /** + * 获取年份 + */ + private String requireYear; + + /** + * 荣誉类别:外部荣誉,行内荣誉 + * 通常可定义为枚举或常量: + * 例如:1 - 外部荣誉,2 - 行内荣誉 + */ + private Short honorCategory; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioMemberVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioMemberVO.java new file mode 100644 index 00000000..931345d1 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioMemberVO.java @@ -0,0 +1,84 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 工作室成员信息表实体类 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class BrandStudioMemberVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private String id; + + /** + * 工作室ID(外键,关联到 BrandStudioApplication) + */ + private String applicationId; + + /** + * 用户 ID + */ + private String userId; + + /** + * 用户 工号 + */ + private String emplid; + + /** + * 成员姓名 + */ + private String name; + + /** + * 成员角色(如:核心成员、技术骨干、助理等) + */ + private String role; + + /** + * 成员出生年月(建议格式:yyyy-MM 或 yyyy,实际为字符串存储) + */ + private String birthdate; + + /** + * 学历(如:本科、硕士、博士等) + */ + private String grade; + + /** + * 职称(如:高级工程师、教授、技师等) + */ + private String professional; + + /** + * 所在部门 + */ + private String deptName; + + /** + * 加入日期 + */ + private LocalDateTime joinDate; + + /** + * 离开日期(可为空,表示尚未离职) + */ + private LocalDateTime leaveDate; + + /** + * 成员状态: + * 0 - 在职, + * 1 - 离职 + */ + private Integer status; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/DeptInfoVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/DeptInfoVO.java new file mode 100644 index 00000000..5557512f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/DeptInfoVO.java @@ -0,0 +1,13 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +@Data +public class DeptInfoVO { + + private String deptid; + private String deptName; + + private String topParentNextId; + private String topParentNextName; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorGroupVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorGroupVO.java new file mode 100644 index 00000000..4de64ef4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorGroupVO.java @@ -0,0 +1,21 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class LeaderHonorGroupVO { + + private String emplid; + private String userName; + private Integer age; + private List honorNames; + + public LeaderHonorGroupVO(String emplid, String userName, Integer age, List honorNames) { + this.emplid = emplid; + this.userName = userName; + this.age = age; + this.honorNames = honorNames; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorVO.java new file mode 100644 index 00000000..31705115 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/LeaderHonorVO.java @@ -0,0 +1,130 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 领衔人荣誉 + */ +@Data +public class LeaderHonorVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + /** + * 姓名 + */ + //@Excel(name = "姓名") + private String userName; + + /** + * 年龄 + */ + //@Excel(name = "年龄") + private Integer age; + + /** + * 人员编号(工号) + */ + //@Excel(name = "人员编号(工号)") + private String emplid; + + /** + * 机构 + */ + //@Excel(name = "机构") + private String deptid; + + /** + * 工会ID + */ + //@Excel(name = "工会ID") + private String unionId; + + /** + * 机构名称 + */ + //@Excel(name = "机构名称") + private String deptName; + + /** + * 年度 + */ + //@Excel(name = "年度") + private String year; + + /** + * 内外部荣誉 + */ + //@Excel(name = "内外部荣誉") + private String categoryName1; + + /** + * 内外部荣誉编号 + */ + //@Excel(name = "内外部荣誉编号") + private String categoryCode1; + + /** + * 荣誉级别名称 + */ + //@Excel(name = "荣誉级别名称") + private String categoryName2; + + /** + * 荣誉级别编号 + */ + //@Excel(name = "荣誉级别编号") + private String categoryCode2; + + /** + * 荣誉类别名称 + */ + //@Excel(name = "荣誉类别名称") + private String categoryName3; + + /** + * 荣誉类别编号 + */ + //@Excel(name = "荣誉类别编号") + private String categoryCode3; + + /** + * 荣誉名称 + */ + //@Excel(name = "荣誉名称") + private String honorName; + + /** + * 荣誉编号 + */ + //@Excel(name = "荣誉编号") + private String honorCode; + + /** + * 荣誉分类id + */ + private String categoryCode; + + /** + * 当前荣誉分类名称 + */ + private String categoryName; + + /** + * 评选对象(机构/个人) + */ + //@Excel(name = "评选对象(机构/个人)") + private String selectionType; + + /** + * 状态 + */ + private Integer status; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysOrgVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysOrgVO.java new file mode 100644 index 00000000..e0eee410 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysOrgVO.java @@ -0,0 +1,96 @@ +package com.budwk.app.zhgh.brand.domain.vo; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 机构列表 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysOrgVO { + /** + * 机构编号 + */ + private String orgId; + + /** + * 上级编号 + */ + private String parentId; + + /** + * 子节点 + */ + private List children; + + /** + * 机构名称 + */ + private String orgName; + + /** + * 机构代码 + */ + private String orgCode; + + /** + * 排序 + */ + private Integer sort; + + /** + * 负责人ID + */ + private String leaderId; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 上级名称 + */ + private String parentName; + + /** 分行ID */ + //@Excel(name = "分行ID") + private String branchId; + + /** 机构类型 */ + //@Excel(name = "机构类型") + private String orgType; + + /** 描述 */ + //@Excel(name = "描述") + private String description; + + /** 机构状态 */ + //@Excel(name = "机构状态") + private String status; + + /** 党组织md5 */ + //@Excel(name = "党组织md5") + private String orgMd5; + + /** 自定义属性 */ + //@Excel(name = "自定义属性") + private String countryCode; + + /** 工会ID */ + private String unionId; + + /** 工会ID */ + private String childUnionId; + + /** 机构中文全称 */ + private String gcDeptLdescr; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysUnionDeptVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysUnionDeptVO.java new file mode 100644 index 00000000..7b4ff352 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/SysUnionDeptVO.java @@ -0,0 +1,43 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +@Data +public class SysUnionDeptVO { + + /** + * userId + */ + private String userId; + + /** + * unionId + */ + private String unionId; + + /** + * 工会名称 + */ + private String unionName; + + /** + * deptId + */ + private String deptId; + + /** + * 机构名称 + */ + private String deptName; + + /** + * 最上级工会 Id + */ + private String topUnionId; + + /** + * 最上级工会名称 + */ + private String topUnionName; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/UnionApplyStatsVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/UnionApplyStatsVO.java new file mode 100644 index 00000000..e3e790b2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/UnionApplyStatsVO.java @@ -0,0 +1,56 @@ +package com.budwk.app.zhgh.brand.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 工会-用户 工作室申请统计视图对象 + * 按 union_id + user_id 聚合,统计每个用户在其所属工会下的所有申请单的状态分布。 + * 所有比例字段单位为 %,已乘以 100 并保留 2 位小数。 + * @author chen + * @since 2026-01-08 + */ +@Data +public class UnionApplyStatsVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 工会ID */ + private String unionId; + + /** 工会名称 */ + private String unionName; + + /** 用户姓名(来自 sys_user) */ + private String username; + + /** 申请单总量 */ + private Integer applyCnt; + + /** 已通过数量(status = 5) */ + private Integer passedCnt; + + /** 通过率(%) */ + private BigDecimal passRate; + + /** 审核中数量(status = 1) */ + private Integer reviewCnt; + + /** 审核中占比(%) */ + private BigDecimal reviewRate; + + /** 已驳回数量(status = 2) */ + private Integer rejectCnt; + + /** 驳回率(%) */ + private BigDecimal rejectRate; + + /** 已撤销数量(status = 3) */ + private Integer repealCnt; + + /** 撤销率(%) */ + private BigDecimal repealRate; + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/models/BrandApplicationFlow.java b/src/main/java/com/budwk/app/zhgh/brand/models/BrandApplicationFlow.java new file mode 100644 index 00000000..b52bb47f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/models/BrandApplicationFlow.java @@ -0,0 +1,99 @@ +package com.budwk.app.zhgh.brand.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; + +/** + * 品牌工作室申请流程表 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("brand_application_flow") +@Comment("品牌工作室申请流程表") +public class BrandApplicationFlow extends BaseModel implements Serializable { + + /** + * 审批记录ID,主键 + */ + @Name + @Column + @Comment("审批记录ID,主键") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + /** + * 工会ID + */ + @Column + @Comment("工会ID") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String unionId; + + /** + * 工会 + */ + @Column + @Comment("工会") + @ColDefine(type = ColType.VARCHAR, width = 256) + private String unionName; + + /** + * 审核人ID + */ + @Column + @Comment("审核人ID") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String auditorId; + + /** + * 审核人 + */ + @Column + @Comment("审核人") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String auditor; + + /** + * 申请ID + */ + @Column + @Comment("申请ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String applicationId; + + /** + * 状态(0:待审核;1:驳回;2:撤回;3:撤销;4:通过) + */ + @Column + @Comment("状态") + private Integer status; + + /** + * 审批内容(意见描述) + */ + @Column + @Comment("审批内容(意见描述)") + @ColDefine(type = ColType.VARCHAR, customType = "text") + private String content; + + /** + * 备注 + */ + @Column + @Comment("备注") + @ColDefine(type = ColType.VARCHAR, customType = "text") + private String remark; + + /** + * 序号 + */ + @Column + @Comment("序号") + private Integer sortNo; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioApplication.java b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioApplication.java new file mode 100644 index 00000000..864e8bb4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioApplication.java @@ -0,0 +1,193 @@ +package com.budwk.app.zhgh.brand.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; + +/** + * 品牌工作室申请表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("brand_studio_application") +@Comment("品牌工作室申请表") +public class BrandStudioApplication extends BaseModel implements Serializable { + + /** + * 工作室ID,主键 + */ + @Name + @Column + @Comment("工作室ID,主键") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + /** + * 工作室名称 + */ + @Column + @Comment("工作室名称") + @ColDefine(type = ColType.VARCHAR, width = 128) + private String name; + + /** + * 申请人ID,唯一 + */ + @Column + @Comment("申请人ID,唯一") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String userId; + + /** + * 申请人所属工会ID + */ + @Column + @Comment("申请人所属工会ID") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String unionId; + + /** + * 工会名称 + */ + @Column + @Comment("工会名称") + @ColDefine(type = ColType.VARCHAR, width = 256) + private String unionName; + + /** + * 创建年份(格式如:2025) + */ + @Column + @Comment("创建年份") + @ColDefine(type = ColType.VARCHAR, width = 10) + private String createYear; + + /** + * 工作室领衔人 + */ + @Column + @Comment("工作室领衔人") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String leadPeople; + + /** + * 领衔人年龄 + */ + @Column + @Comment("领衔人年龄") + private Integer leadAge; + + /** + * 领衔人身份,多个身份用逗号分隔 + */ + @Column + @Comment("领衔人身份,多个身份用逗号分隔") + @ColDefine(type = ColType.VARCHAR, customType = "text") + private String leadIdentity; + + /** + * 工作室类型 + */ + @Column + @Comment("工作室类型") + @ColDefine(type = ColType.VARCHAR, width = 128) + private String type; + + /** + * 所属赛道 + */ + @Column + @Comment("所属赛道") + @ColDefine(type = ColType.VARCHAR, width = 128) + private String track; + + /** + * 工作室具体位置 + */ + @Column + @Comment("工作室具体位置") + @ColDefine(type = ColType.VARCHAR, width = 256) + private String address; + + /** + * 成员人数 + */ + @Column + @Comment("成员人数") + private Integer memberNum; + + /** + * 工作室介绍 + */ + @Column + @Comment("工作室介绍") + @ColDefine(type = ColType.VARCHAR, customType = "text") + private String introduction; + + /** + * 申请进度 + */ + @Column + @Comment("申请进度") + private Integer status; + + /** + * 归档 + */ + @Column + @Comment("归档") + private Integer archive; + + /** + * 创建人姓名 + */ + @Column + @Comment("创建人姓名") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String createName; + + /** + * 所属机构 + */ + @Column + @Comment("所属机构") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String deptid; + + /** + * 机构名称 + */ + @Column + @Comment("机构名称") + @ColDefine(type = ColType.VARCHAR, width = 256) + private String deptName; + + /** + * 所属领域 + */ + @Column + @Comment("所属领域") + @ColDefine(type = ColType.VARCHAR, width = 128) + private String domain; + + /** + * 领衔人荣誉称号 + */ + @Column + @Comment("领衔人荣誉称号") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String leadHonor; + + /** + * 备注 + */ + @Column + @Comment("备注") + @ColDefine(type = ColType.VARCHAR, customType = "text") + private String remark; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioHonor.java b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioHonor.java new file mode 100644 index 00000000..6187c09c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioHonor.java @@ -0,0 +1,70 @@ +package com.budwk.app.zhgh.brand.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; + +/** + * 工作室荣誉信息实体类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("brand_studio_honor") +@Comment("品牌工作室荣誉信息表") +public class BrandStudioHonor extends BaseModel implements Serializable { + + /** + * 工作室荣誉ID,主键 + */ + @Name + @Column + @Comment("工作室荣誉ID,主键") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + /** + * 工作室申请ID + */ + @Column + @Comment("工作室申请ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String applicationId; + + /** + * 荣誉称号 + */ + @Column + @Comment("荣誉称号") + @ColDefine(type = ColType.VARCHAR, width = 128) + private String honorName; + + /** + * 级别 + */ + @Column + @Comment("级别") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String honorGrade; + + /** + * 获取年份 + */ + @Column + @Comment("获取年份") + @ColDefine(type = ColType.VARCHAR, width = 10) + private String requireYear; + + /** + * 荣誉类别:外部荣誉,行内荣誉 + * 通常可定义为枚举或常量: + * 例如:1 - 外部荣誉,2 - 行内荣誉 + */ + @Column + @Comment("荣誉类别") + private Short honorCategory; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioMember.java b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioMember.java new file mode 100644 index 00000000..7353bfb2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/models/BrandStudioMember.java @@ -0,0 +1,127 @@ +package com.budwk.app.zhgh.brand.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; +import java.util.Date; + +/** + * 工作室成员信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("brand_studio_member") +@Comment("品牌工作室成员信息表") +public class BrandStudioMember extends BaseModel implements Serializable { + + /** + * 成员ID,主键 + */ + @Name + @Column + @Comment("成员ID,主键") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + /** + * 工作室ID(外键,关联到 BrandStudioApplication) + */ + @Column + @Comment("工作室ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String applicationId; + + /** + * 用户 ID + */ + @Column + @Comment("用户ID") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String userId; + + /** + * 用户 工号 + */ + @Column + @Comment("用户工号") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String emplid; + + /** + * 成员姓名 + */ + @Column + @Comment("成员姓名") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String name; + + /** + * 成员角色(如:核心成员、技术骨干、助理等) + */ + @Column + @Comment("成员角色") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String role; + + /** + * 成员出生年月(建议格式:yyyy-MM 或 yyyy,实际为字符串存储) + */ + @Column + @Comment("成员出生年月") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String birthdate; + + /** + * 学历(如:本科、硕士、博士等) + */ + @Column + @Comment("学历") + @ColDefine(type = ColType.VARCHAR, width = 64) + private String grade; + + /** + * 职称(如:高级工程师、教授、技师等) + */ + @Column + @Comment("职称") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String professional; + + /** + * 所在部门 + */ + @Column + @Comment("所在部门") + @ColDefine(type = ColType.VARCHAR, width = 255) + private String deptName; + + /** + * 加入日期 + */ + @Column + @Comment("加入日期") + @ColDefine(type = ColType.DATETIME) + private Date joinDate; + + /** + * 离开日期(可为空,表示尚未离职) + */ + @Column + @Comment("离开日期") + @ColDefine(type = ColType.DATETIME) + private Date leaveDate; + + /** + * 成员状态: + * 0 - 在职, + * 1 - 离职 + */ + @Column + @Comment("成员状态") + private Integer status; +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationFlowService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationFlowService.java new file mode 100644 index 00000000..67bfec78 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationFlowService.java @@ -0,0 +1,24 @@ +package com.budwk.app.zhgh.brand.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationRecallDTO; +import com.budwk.app.zhgh.brand.domain.enums.BrandApplicationStatusEnums; +import com.budwk.app.zhgh.brand.domain.vo.BrandApplicationFlowVO; +import com.budwk.app.zhgh.brand.models.BrandApplicationFlow; +import com.budwk.app.sys.models.Sys_user; + +import java.util.List; + +public interface BrandApplicationFlowService extends BaseService { + + void submitAudit(String applicationId, BrandApplicationStatusEnums statusEnums, Sys_user user); + + void audit(BrandApplicationAuditDTO dto); + + void recall(BrandApplicationRecallDTO dto); + + List getFlowList(String applicationId); + + void deleteByApplicationIds(List ids); +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationStatisticsService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationStatisticsService.java new file mode 100644 index 00000000..270774c2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandApplicationStatisticsService.java @@ -0,0 +1,18 @@ +package com.budwk.app.zhgh.brand.service; + +import com.budwk.app.zhgh.brand.domain.vo.ApplicationProgressVO; +import com.budwk.app.zhgh.brand.domain.vo.ApplicationWarnVO; +import com.budwk.app.zhgh.brand.domain.vo.UnionApplyStatsVO; + +import java.util.List; +import java.util.Map; + +public interface BrandApplicationStatisticsService { + List selectUnionApplyStats(); + + List selectApplyProgressStats(); + + List selectApplyWarningStats(); + + Map> selectApplyMapCount(); +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java new file mode 100644 index 00000000..e49cac26 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java @@ -0,0 +1,54 @@ +package com.budwk.app.zhgh.brand.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationCreateDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationPageDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioApplicationUpdateDTO; +import com.budwk.app.zhgh.brand.domain.vo.*; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +public interface BrandStudioApplicationService extends BaseService { + + Pagination page(BrandStudioApplicationPageDTO pageDTO); + + void save(BrandStudioApplicationCreateDTO dto); + + void submitApply(BrandApplicationAuditDTO dto); + + void oaAuditUpdateStatus(String id, Integer status, String reason); + + void update(BrandStudioApplicationUpdateDTO dto); + + void updateMemberOrHonor(BrandStudioApplicationUpdateDTO dto); + + void delete(List ids); + + SysUnionDeptVO queryUserUnion(); + + BrandStudioApplicationVO getDetailById(String id); + + void archive(List idList); + + /// 之前的工作流逻辑,已废弃 + Pagination auditPage(@Valid BrandStudioApplicationPageDTO pageDTO); + + /// 新的工作流逻辑 + Pagination flowAuditPage(BrandStudioApplicationPageDTO dto); + + List queryLeaderHonor(); + + Pagination summaryPage(@Valid BrandStudioApplicationPageDTO pageDTO); + + List getHonorDetailById(String id); + + void export(); + + // 导出品牌工作室申请文档 + void exportDocx(String id, HttpServletResponse response); +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioHonorService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioHonorService.java new file mode 100644 index 00000000..dac0cc07 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioHonorService.java @@ -0,0 +1,10 @@ +package com.budwk.app.zhgh.brand.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.brand.models.BrandStudioHonor; + + +public interface BrandStudioHonorService extends BaseService { + + +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioMemberService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioMemberService.java new file mode 100644 index 00000000..5fdc598e --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioMemberService.java @@ -0,0 +1,17 @@ +package com.budwk.app.zhgh.brand.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioMemberCreateDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioMemberUpdateDTO; +import com.budwk.app.zhgh.brand.models.BrandStudioMember; + +import java.util.List; + +public interface BrandStudioMemberService extends BaseService { + + void save(BrandStudioMemberCreateDTO dto); + + void update(BrandStudioMemberUpdateDTO dto); + + void delete(List ids); +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java new file mode 100644 index 00000000..44aa69d0 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java @@ -0,0 +1,308 @@ +package com.budwk.app.zhgh.brand.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.bpm.enums.BpmProcessInstanceStatusEnum; +import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; +import com.budwk.app.bpm.models.BpmProcessInstance; +import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.web.controllers.open.commons.service.CommonService; +import com.budwk.app.zhgh.brand.convert.BrandApplicationFlowConvert; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationRecallDTO; +import com.budwk.app.zhgh.brand.domain.enums.ApplicationFlowStatusEnum; +import com.budwk.app.zhgh.brand.domain.enums.BrandApplicationStatusEnums; +import com.budwk.app.zhgh.brand.domain.vo.BrandApplicationFlowVO; +import com.budwk.app.zhgh.brand.domain.vo.BrandFlowUserVO; +import com.budwk.app.zhgh.brand.models.BrandApplicationFlow; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; +import com.budwk.app.zhgh.brand.service.BrandApplicationFlowService; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.ioc.loader.annotation.Inject; + +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +public class BrandApplicationFlowServiceImpl extends BaseServiceImpl implements BrandApplicationFlowService { + + @Inject + private BpmService bpmService; + + @Inject + private CommonService commonService; + + public BrandApplicationFlowServiceImpl(Dao dao) { + super(dao); + } + + /// 提交申请/待审核:插入审核流程记录表 + @Override + public void submitAudit(String applicationId, BrandApplicationStatusEnums statusEnums, Sys_user user) { + if (statusEnums != BrandApplicationStatusEnums.IN_REVIEW) { + throw new RuntimeException("提交申请失败"); + } + // 先获取用户所在工会的关系网 secondUnion -> firstUnion -> 0 + String unionId = SecurityUtil.getUnionId(); + + // 两种方案:先删除之前撤回的审核记录/修改之前的撤回审核记录的状态 + // 0.先删除 撤回审核记录 的 applicationId 记录,如果没有也无所谓 + dao().update(BrandApplicationFlow.class, Chain.make("delFlag", true), Cnd.where("applicationId", "=", applicationId)); + + // 1.先插入当前用户,表示已经通过提交阶段 + BrandApplicationFlow brandApplicationFlow = new BrandApplicationFlow(); + brandApplicationFlow.setApplicationId(applicationId); + brandApplicationFlow.setAuditorId(user.getId()); + brandApplicationFlow.setAuditor(user.getUsername()); + brandApplicationFlow.setSortNo(0); + brandApplicationFlow.setStatus(ApplicationFlowStatusEnum.PASSED.getValue()); + insert(brandApplicationFlow); + + Sys_union union = dao().fetch(Sys_union.class, unionId); + if (union != null) { + BrandApplicationFlow flow = new BrandApplicationFlow(); + flow.setApplicationId(applicationId); + flow.setUnionId(union.getId()); + flow.setUnionName(union.getName()); + flow.setStatus(ApplicationFlowStatusEnum.TO_BE_AUDIT.getValue()); + flow.setSortNo(1); + insert(flow); + } + } + + /// 审核 + @Override + public void audit(BrandApplicationAuditDTO dto) { + String applicationId = StrUtil.blankToDefault(dto.getApplicationId(), dto.getProcessInstanceBusinessId()); + if (StrUtil.isBlank(applicationId)) { + throw new RuntimeException("申请 Id 不能为空"); + } + String taskId = StrUtil.blankToDefault(dto.getProcessInstanceTaskId(), dto.getFlowId()); + if (StrUtil.isBlank(taskId)) { + throw new RuntimeException("流程任务ID不能为空"); + } + BpmTaskApprovalTypeEnum approvalTypeEnum = getBpmTaskApprovalTypeEnum(dto); + HashMap variables = new HashMap<>(BeanUtil.beanToMap(dto)); + variables.put("bpmTaskApprovalType", approvalTypeEnum.name()); + variables.put("approvalOpinion", dto.getRemark()); + bpmService.completeTask(taskId, approvalTypeEnum, variables, getAssignments(dto, approvalTypeEnum)); + + BpmProcessInstance instance = dao().fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", applicationId)); + if (approvalTypeEnum == BpmTaskApprovalTypeEnum.REJECT) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.REJECT.getCode()), + Cnd.where("id", "=", applicationId)); + } else if (approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK || approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK_OTHER_NODE) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Cnd.where("id", "=", applicationId)); + } else if (instance != null && BpmProcessInstanceStatusEnum.COMPLETED.name().equals(instance.getProcessInstanceStatus())) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.PASSED.getCode()), + Cnd.where("id", "=", applicationId)); + } + } + + private List getAssignments(BrandApplicationAuditDTO dto, BpmTaskApprovalTypeEnum approvalTypeEnum) { + if (dto.getAssignments() != null && !dto.getAssignments().isEmpty()) { + return dto.getAssignments(); + } + if (approvalTypeEnum == BpmTaskApprovalTypeEnum.PASS) { + String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN); + if (StrUtil.isBlank(approvalLoginName)) { + throw new RuntimeException("校工会未配置审批人,请联系管理员"); + } + return List.of(approvalLoginName); + } + return null; + } + + private BpmTaskApprovalTypeEnum getBpmTaskApprovalTypeEnum(BrandApplicationAuditDTO dto) { + if (StrUtil.isNotBlank(dto.getBpmTaskApprovalType())) { + return BpmTaskApprovalTypeEnum.valueOf(dto.getBpmTaskApprovalType()); + } + if (dto.getStatus() == null) { + throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。"); + } + ApplicationFlowStatusEnum statusEnum = ApplicationFlowStatusEnum.getStatusEnumByValue(dto.getStatus()); + if (statusEnum == ApplicationFlowStatusEnum.PASSED) { + return BpmTaskApprovalTypeEnum.PASS; + } else if (statusEnum == ApplicationFlowStatusEnum.REJECT) { + return BpmTaskApprovalTypeEnum.REJECT; + } else if (statusEnum == ApplicationFlowStatusEnum.RECALL) { + return BpmTaskApprovalTypeEnum.BACK; + } + throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。"); + } + + /// 审核 + public void auditOld(BrandApplicationAuditDTO dto) { + BrandApplicationFlow applicationFlow = dao().fetch(BrandApplicationFlow.class, Cnd.where("applicationId", "=", dto.getApplicationId()) + .and("id", "=", dto.getFlowId()) + .and("status", "=", ApplicationFlowStatusEnum.TO_BE_AUDIT.getValue()) + .and("delFlag", "=", false)); + if (applicationFlow == null) { + throw new RuntimeException("待操作记录不存在"); + } + Sys_user user = getCurrentUser(); + if (user == null) { + throw new RuntimeException("用户信息过期,请重新登录"); + } + // 先更新 + applicationFlow.setStatus(dto.getStatus()); + applicationFlow.setAuditor(user.getUsername()); + applicationFlow.setAuditorId(user.getId()); + applicationFlow.setRemark(dto.getRemark()); + updateIgnoreNull(applicationFlow); + + List flowList = dao().query(BrandApplicationFlow.class, Cnd.where("applicationId", "=", dto.getApplicationId()).and("delFlag", "=", false)); + if (flowList == null || flowList.isEmpty()) { + throw new RuntimeException("流程记录为空"); + } + + long count = flowList.stream().filter(item -> Objects.equals(item.getStatus(), ApplicationFlowStatusEnum.PASSED.getValue())).count(); + ApplicationFlowStatusEnum statusEnum = ApplicationFlowStatusEnum.getStatusEnumByValue(dto.getStatus()); + //流程审批通过 + if (statusEnum == ApplicationFlowStatusEnum.PASSED) + { + if (count == flowList.size()) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.PASSED.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + } else { + Optional first = flowList.stream().filter(item -> item.getSortNo() == (applicationFlow.getSortNo() + 1)).findFirst(); + if (first.isPresent()) { + BrandApplicationFlow flow = first.get(); + flow.setRemark(dto.getRemark()); + flow.setStatus(ApplicationFlowStatusEnum.TO_BE_AUDIT.getValue()); + updateIgnoreNull(flow); + } + } + } else if (statusEnum == ApplicationFlowStatusEnum.REPEAL) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.REPEAL.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + } else if (statusEnum == ApplicationFlowStatusEnum.RECALL) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + } else if (statusEnum == ApplicationFlowStatusEnum.REJECT) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.REJECT.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + } + } + + @Override + public void recall(BrandApplicationRecallDTO dto) { + String taskId = StrUtil.blankToDefault(dto.getProcessInstanceTaskId(), dto.getFlowId()); + if (StrUtil.isNotBlank(taskId)) { + bpmService.revokeTask(taskId); + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + return; + } + bpmService.revokeApply(dto.getApplicationId()); + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()), + Cnd.where("id", "=", dto.getApplicationId())); + } + + public void recallOld(BrandApplicationRecallDTO dto) { + // 撤回分为 申请人撤回 和 审核人撤回 + // 如果是申请人,需要把 表单状态改为 DRAFT + Sys_user user = getCurrentUser(); + // 查询 申请表单 在 flow 中的 curFlowId 和 nextFlowId + String applicationId = dto.getApplicationId(); + List brandFlowUserVOS = selectApplicationTableVOById(applicationId); + if (user == null || brandFlowUserVOS.isEmpty()) { + throw new RuntimeException("撤回申请失败"); + } + List flowIds = brandFlowUserVOS.stream().map(BrandFlowUserVO::getFlowId).collect(Collectors.toList()); + // 如果 申请人撤回 和 撤回发起人 为同一人,且在 申请模块撤销,就更新 申请表 为 DRAFT + // 如果是在 申请表中 撤回 时,dto.getFlowId() 是 null + boolean isSameUser = brandFlowUserVOS.get(0).getUserId().equals(user.getId()) && dto.getFlowId() == null; + if (isSameUser) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()), + Cnd.where("id", "=", applicationId)); + dto.setFlowId(flowIds.get(0)); + // 把所有 审批流程 状态改为 WAIT_AUDIT 0 + updateStatusByApplicationId(applicationId, 0); + } else { + // 如果 是由上级人员撤回 审批 记录,且是在 审批表中操作, dto.getFlowId() 是 存在的 + // 先修改 申请表 为 待审核状态 + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Cnd.where("id", "=", applicationId)); + // 再把 审批流程 中的状态改为撤回,下级状态改成待审核 + int index = flowIds.indexOf(dto.getFlowId()); + dto.setFlowId(flowIds.get(index)); + Integer sortNo = brandFlowUserVOS.get(index).getSortNo(); + // 把 高于当前 组织的 流状态 置为 0 + updateStatusByApplicationId(applicationId, sortNo); + } + // 把当前记录改为 TO_BE_AUDIT + BrandApplicationFlow brandApplicationFlow = new BrandApplicationFlow(); + brandApplicationFlow.setId(dto.getFlowId()); + brandApplicationFlow.setAuditorId(user.getId()); + brandApplicationFlow.setAuditor(user.getUsername()); + brandApplicationFlow.setStatus(ApplicationFlowStatusEnum.TO_BE_AUDIT.getValue()); + brandApplicationFlow.setRemark(isSameUser ? "申请人操作撤回" : "操作撤回"); + updateIgnoreNull(brandApplicationFlow); + } + + @Override + public List getFlowList(String applicationId) { + List applicationFlows = dao().query(BrandApplicationFlow.class, + Cnd.where("applicationId", "=", applicationId).and("delFlag", "=", false).asc("sortNo")); + return BrandApplicationFlowConvert.convertList(applicationFlows); + } + + @Override + public void deleteByApplicationIds(List ids) { + if (ids == null || ids.isEmpty()) { + return; + } + dao().update(BrandApplicationFlow.class, Chain.make("delFlag", true), Cnd.where("applicationId", "in", ids)); + } + + private void updateStatusByApplicationId(String applicationId, Integer sortNo) { + dao().update(BrandApplicationFlow.class, + Chain.make("status", 0).add("remark", "申请人操作撤回"), + Cnd.where("applicationId", "=", applicationId).and("sortNo", ">", sortNo)); + } + + private List selectApplicationTableVOById(String applicationId) { + List flows = dao().query(BrandApplicationFlow.class, + Cnd.where("applicationId", "=", applicationId).and("delFlag", "=", false).asc("sortNo")); + BrandStudioApplication application = dao().fetch(BrandStudioApplication.class, applicationId); + return flows.stream().map(flow -> { + BrandFlowUserVO vo = BeanUtil.copyProperties(flow, BrandFlowUserVO.class); + vo.setFlowId(flow.getId()); + vo.setSortNo(flow.getSortNo()); + vo.setUserId(application == null ? null : application.getUserId()); + return vo; + }).collect(Collectors.toList()); + } + + private Sys_user getCurrentUser() { + String userId = SecurityUtil.getUserId(); + if (userId == null || userId.isBlank()) { + return null; + } + return dao().fetch(Sys_user.class, userId); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationStatisticsServiceImpl.java new file mode 100644 index 00000000..01937e95 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationStatisticsServiceImpl.java @@ -0,0 +1,139 @@ +package com.budwk.app.zhgh.brand.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.brand.domain.vo.ApplicationProgressVO; +import com.budwk.app.zhgh.brand.domain.vo.ApplicationWarnVO; +import com.budwk.app.zhgh.brand.domain.vo.UnionApplyStatsVO; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; +import com.budwk.app.zhgh.brand.service.BrandApplicationStatisticsService; +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.IocBean; + +import java.util.*; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +public class BrandApplicationStatisticsServiceImpl extends BaseServiceImpl implements BrandApplicationStatisticsService { + + public BrandApplicationStatisticsServiceImpl(Dao dao) { + super(dao); + } + + // 管理员查看 + @Override + public List selectUnionApplyStats() { + Sql sql = Sqls.create(""" + select unionId, + unionName, + createName as username, + count(1) as applyCnt, + sum(case when status = 5 then 1 else 0 end) as passedCnt, + round(sum(case when status = 5 then 1 else 0 end) * 100 / count(1), 2) as passRate, + sum(case when status = 1 then 1 else 0 end) as reviewCnt, + round(sum(case when status = 1 then 1 else 0 end) * 100 / count(1), 2) as reviewRate, + sum(case when status = 2 then 1 else 0 end) as rejectCnt, + round(sum(case when status = 2 then 1 else 0 end) * 100 / count(1), 2) as rejectRate, + sum(case when status = 3 then 1 else 0 end) as repealCnt, + round(sum(case when status = 3 then 1 else 0 end) * 100 / count(1), 2) as repealRate + from brand_studio_application + where delFlag = 0 + group by unionId, unionName, createName + order by unionName + """); + return listVO(sql, UnionApplyStatsVO.class); + } + + @Override + public List selectApplyProgressStats() { + Sql sql = Sqls.create(""" + select bsa.id as applicationId, + bsa.name as applicationName, + bsa.unionId, + bsa.unionName, + bsa.userId, + bsa.status, + bsa.leadPeople, + bsa.createdAt as createTime, + count(baf.id) as totalNodes, + sum(case when baf.status = 5 then 1 else 0 end) as passedNodes, + case when count(baf.id) = 0 then 0 else round(sum(case when baf.status = 5 then 1 else 0 end) * 100 / count(baf.id), 2) end as progressPct + from brand_studio_application bsa + left join brand_application_flow baf on bsa.id = baf.applicationId and baf.delFlag = 0 + where bsa.delFlag = 0 + and bsa.userId = @userId + group by bsa.id, bsa.name, bsa.unionId, bsa.unionName, bsa.userId, bsa.status, bsa.leadPeople, bsa.createdAt + order by bsa.createdAt desc + """); + sql.setParam("userId", SecurityUtil.getUserId()); + return listVO(sql, ApplicationProgressVO.class); + } + + @Override + public List selectApplyWarningStats() { + Sql sql = Sqls.create(""" + select bsa.id as applicationId, + bsa.name, + bsa.leadPeople, + bsa.status, + bsa.unionId, + bsa.unionName, + bsa.createdAt as receiveTime, + round((unix_timestamp(now()) * 1000 - bsa.createdAt) / 86400000, 2) as pendingDays, + case when (unix_timestamp(now()) * 1000 - bsa.createdAt) / 86400000 >= 7 then 1 else 0 end as warnStatus, + round(avg((unix_timestamp(now()) * 1000 - bsa.createdAt) / 86400000), 2) as avgAuditDays + from brand_studio_application bsa + where bsa.delFlag = 0 + and bsa.status = 1 + and (bsa.unionId = @unionId or @unionId = '') + group by bsa.id, bsa.name, bsa.leadPeople, bsa.status, bsa.unionId, bsa.unionName, bsa.createdAt + order by pendingDays desc + """); + sql.setParam("unionId", SecurityUtil.getUnionId()); + return listVO(sql, ApplicationWarnVO.class); + } + + // 对申请单的 type,年龄等等字段分组 + public Map> selectApplyMapCount() { + String userId = SecurityUtil.getUserId(); + List applications = dao().query(BrandStudioApplication.class, + Cnd.where("userId", "=", userId).and("delFlag", "=", false)); + Map createYearCount = applications.stream() + .collect(Collectors.groupingBy(BrandStudioApplication::getCreateYear, Collectors.counting())) + .entrySet() + .stream() + .sorted(Map.Entry.comparingByKey( + Comparator.comparingInt(year -> { + try { + return Integer.parseInt(year); + } catch (NumberFormatException e) { + return Integer.MAX_VALUE; // 非法年份放最后 + } + }) + )) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (e1, e2) -> e1, + LinkedHashMap::new + )); + Map leadPeopleCount = applications.stream() + .collect(Collectors.groupingBy(BrandStudioApplication::getLeadPeople, Collectors.counting())); + Map leadAgeCount = applications.stream() + .collect(Collectors.groupingBy(app -> String.valueOf(app.getLeadAge()), Collectors.counting())); + Map typeCount = applications.stream() + .collect(Collectors.groupingBy(BrandStudioApplication::getType, Collectors.counting())); + Map trackCount = applications.stream() + .collect(Collectors.groupingBy(BrandStudioApplication::getTrack, Collectors.counting())); + Map> mapMap = new HashMap<>(); + mapMap.put("createYear", createYearCount); + mapMap.put("leadPeople", leadPeopleCount); + mapMap.put("leadAge", leadAgeCount); + mapMap.put("type", typeCount); + mapMap.put("track", trackCount); + return mapMap; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioApplicationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioApplicationServiceImpl.java new file mode 100644 index 00000000..1b6ce181 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioApplicationServiceImpl.java @@ -0,0 +1,446 @@ +package com.budwk.app.zhgh.brand.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.BpmProcessConstant; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; +import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.web.controllers.open.commons.service.CommonService; +import com.budwk.app.zhgh.brand.convert.BrandStudioApplicationConvert; +import com.budwk.app.zhgh.brand.convert.BrandStudioHonorConvert; +import com.budwk.app.zhgh.brand.convert.BrandStudioMemberConvert; +import com.budwk.app.zhgh.brand.domain.dto.*; +import com.budwk.app.zhgh.brand.domain.enums.BrandApplicationStatusEnums; +import com.budwk.app.zhgh.brand.domain.vo.*; +import com.budwk.app.zhgh.brand.models.BrandStudioApplication; +import com.budwk.app.zhgh.brand.models.BrandStudioHonor; +import com.budwk.app.zhgh.brand.models.BrandStudioMember; +import com.budwk.app.zhgh.brand.service.BrandApplicationFlowService; +import com.budwk.app.zhgh.brand.service.BrandStudioApplicationService; +import com.budwk.app.zhgh.brand.service.BrandStudioMemberService; +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.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; + +@IocBean(args = {"refer:dao"}) +public class BrandStudioApplicationServiceImpl extends BaseServiceImpl implements BrandStudioApplicationService { + + @Inject + private BrandStudioMemberService studioMemberService; + + @Inject + private BrandApplicationFlowService flowService; + + @Inject + private BpmService bpmService; + + @Inject + private CommonService commonService; + + public BrandStudioApplicationServiceImpl(Dao dao) { + super(dao); + } + + // 分页查询申请表 + @Override + public Pagination page(BrandStudioApplicationPageDTO pageDTO) { + String userId = SecurityUtil.getUserId(); + + Cnd cnd = Cnd.where("delFlag", "=", false); + /// 2. 先写“普通筛选”这一整组 + if (StrUtil.isNotBlank(pageDTO.getName())) { + cnd.and("name", "like", "%" + pageDTO.getName() + "%"); + } + if (StrUtil.isNotBlank(userId)) { + cnd.and("createdBy", "=", userId); + } + if (StrUtil.isNotBlank(pageDTO.getCreateYear())) { + cnd.and("createYear", "=", pageDTO.getCreateYear()); + } + if (pageDTO.getStatus() != null) { + cnd.and("status", "=", pageDTO.getStatus()); + } + if (StrUtil.isNotBlank(pageDTO.getLeadPeople())) { + cnd.and("leadPeople", "like", "%" + pageDTO.getLeadPeople() + "%"); + } + cnd.desc("createYear"); + cnd.desc("createdAt"); + Pagination page = listPage(pageDTO.getPageNumber(), pageDTO.getPageSize(), BrandStudioApplication.class, cnd); + List list = BrandStudioApplicationConvert.convertList(page.getList()); + return new Pagination<>(page.getPageNo(), page.getPageSize(), page.getTotalCount(), list); + } + + private Sys_user getCheckedUserDetail() { + Sys_user user = getCurrentUser(); + if (user == null) { + throw new RuntimeException("用户信息过期,请重新登录"); + } + if (StrUtil.isEmpty(SecurityUtil.getUnionId())) { + throw new RuntimeException("未关联工会"); + } + return user; + } + + @Override + public void save(BrandStudioApplicationCreateDTO dto) { + Sys_user user = getCheckedUserDetail(); + BrandStudioApplication application = BrandStudioApplicationConvert.convert(dto); + application.setUserId(user.getId()); + application.setDeptid(user.getUnitId()); + application.setCreateName(user.getUsername()); + Integer status = dto.getStatus(); + BrandApplicationStatusEnums statusByCode = BrandApplicationStatusEnums.getStatusByCode(status); + if (statusByCode == null) { + throw new RuntimeException("状态异常"); + } + application.setStatus(statusByCode.getCode()); + insert(application); + insertBatchBrandStudioMember(dto.getBrandStudioMembers(), application.getId()); + if (statusByCode == BrandApplicationStatusEnums.CREATING) { + /// 提交审核的话会记录在审核流表中 + submitAudit(application, user); + } + } + + /// 提交申请 + @Override + public void submitApply(BrandApplicationAuditDTO dto) { + String applicationId = dto.getApplicationId(); + BrandApplicationStatusEnums statusEnums = BrandApplicationStatusEnums.getStatusByCode(dto.getStatus()); + if (statusEnums == null) { + throw new RuntimeException("提交申请失败"); + } + Sys_user user = getCurrentUser(); + if (user == null) { + throw new RuntimeException("用户信息过期,请重新登录"); + } + /// 1.先更新工作室申请表的状态 + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.CREATING.getCode()), + Cnd.where("id", "=", applicationId)); + /// 2.插入待审批流程 + if (statusEnums == BrandApplicationStatusEnums.IN_REVIEW) { + /// 提交审核的话会记录在审核流表中 + BrandStudioApplication application = fetch(applicationId); + submitAudit(application, user); + } + } + + private void submitAudit(BrandStudioApplication application, Sys_user user) { + if (application == null) { + throw new RuntimeException("提交申请失败"); + } + String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN, Cnd.where(Sys_user_role::getUnionId, "=", application.getUnionId())); + if (StrUtil.isBlank(approvalLoginName)) { + throw new RuntimeException("分工会未配置审批人,请联系管理员"); + } + try { + HashMap variables = new HashMap<>(); + variables.put("applicationId", application.getId()); + variables.put("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()); + variables.put("userId", user.getId()); + bpmService.startSubmitProcessInstance(BpmProcessConstant.BRAND_STUDIO.name(), application.getName(), application.getId(), List.of(approvalLoginName), variables); + updateApplicationStatusToFail(application.getId(), true); + } catch (RuntimeException e) { + updateApplicationStatusToFail(application.getId(), false); + throw e; + } + } + + private void updateApplicationStatusToFail(String businessId, Boolean success) { + if (success) { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Cnd.where("id", "=", businessId)); + } else { + dao().update(BrandStudioApplication.class, + Chain.make("status", BrandApplicationStatusEnums.FAIL.getCode()), + Cnd.where("id", "=", businessId)); + } + } + + private void insertBatchBrandStudioMember(List memberCreateDTOS, String id) { + List brandStudioMembers = BrandStudioMemberConvert.convertList(memberCreateDTOS); + if (brandStudioMembers != null && !brandStudioMembers.isEmpty()) { + brandStudioMembers.forEach(member -> member.setApplicationId(id)); + dao().insert(brandStudioMembers); + } + } + + @Override + public void oaAuditUpdateStatus(String id, Integer status, String reason) { + this.update(Chain.make("status", status), Cnd.where("id", "=", id)); + } + + @Override + public void update(BrandStudioApplicationUpdateDTO dto) { + BrandStudioApplication entity = BrandStudioApplicationConvert.convert(dto); + updateIgnoreNull(entity); + /// 先删除成员信息 + List ids = Collections.singletonList(dto.getId()); + ((BrandStudioMemberServiceImpl) studioMemberService).deleteByApplicationIds(ids); + BrandApplicationStatusEnums statusByCode = BrandApplicationStatusEnums.getStatusByCode(dto.getStatus()); + if (statusByCode == null) { + throw new RuntimeException("状态异常"); + } + /// 再插入新的成员信息 + insertBatchBrandStudioMember(dto.getBrandStudioMembers(), dto.getId()); + if (statusByCode == BrandApplicationStatusEnums.CREATING) { + /// 提交审核的话会记录在审核流表中 + submitAudit(fetch(dto.getId()), getCheckedUserDetail()); + } + } + + @Override + public void updateMemberOrHonor(BrandStudioApplicationUpdateDTO dto) { + dao().update(BrandStudioApplication.class, Chain.make("memberNum", dto.getMemberNum()), Cnd.where("id", "=", dto.getId())); + /// 先删除成员信息 + List ids = Collections.singletonList(dto.getId()); + ((BrandStudioMemberServiceImpl) studioMemberService).deleteByApplicationIds(ids); + /// 再插入新的成员信息 + insertBatchBrandStudioMember(dto.getBrandStudioMembers(), dto.getId()); + /// 修改荣誉信息 + dao().update(BrandStudioHonor.class, Chain.make("delFlag", true), Cnd.where("applicationId", "in", ids)); + List honorCreateDTOS = dto.getBrandStudioHonors(); + List honors = BrandStudioHonorConvert.convertListDTO(honorCreateDTOS); + if (honors != null && !honors.isEmpty()) { + honors.forEach(honor -> honor.setApplicationId(dto.getId())); + dao().insert(honors); + } + } + + @Override + public void delete(List ids) { + String userId = SecurityUtil.getUserId(); + + List validIds = dao().query(BrandStudioApplication.class, Cnd.where("id", "in", ids) + .and("userId", "=", userId) + .and("delFlag", "=", false)) + .stream().map(BrandStudioApplication::getId).collect(toList()); + + Set inputSet = new HashSet<>(ids); + Set validSet = new HashSet<>(validIds); + if (!validSet.equals(inputSet)) { + throw new RuntimeException("存在不可操作数据,删除失败"); + } + + dao().update(BrandStudioApplication.class, Chain.make("delFlag", true), Cnd.where("id", "in", validIds)); + ((BrandStudioMemberServiceImpl) studioMemberService).deleteByApplicationIds(validIds); + flowService.deleteByApplicationIds(validIds); + } + + @Override + public SysUnionDeptVO queryUserUnion() { + Sys_user user = getCurrentUser(); + if (user == null) { + throw new RuntimeException("用户信息过期,请重新登录"); + } + String unionId = SecurityUtil.getUnionId(); + if (StrUtil.isEmpty(unionId)) { + throw new RuntimeException("未关联工会"); + } + /// 获取用户所属公会和机构名 + SysUnionDeptVO sysUnionDeptVO = new SysUnionDeptVO(); + sysUnionDeptVO.setUserId(user.getId()); + sysUnionDeptVO.setUnionId(unionId); + Sys_union union = dao().fetch(Sys_union.class, unionId); + if (union != null) { + sysUnionDeptVO.setUnionName(union.getName()); + sysUnionDeptVO.setTopUnionId(union.getId()); + sysUnionDeptVO.setTopUnionName(union.getName()); + } + sysUnionDeptVO.setDeptId(user.getUnitId()); + Sys_unit unit = dao().fetch(Sys_unit.class, user.getUnitId()); + sysUnionDeptVO.setDeptName(unit == null ? null : unit.getName()); + return sysUnionDeptVO; + } + + @Override + public List queryLeaderHonor() { + List leaderHonorVOS = selectLeaderHonor(); + Map> grouped = leaderHonorVOS.stream() + .collect(Collectors.groupingBy(LeaderHonorVO::getEmplid)); + + return grouped.entrySet().stream() + .map(entry -> { + String emplid = entry.getKey(); + List list = entry.getValue(); + // 假设同一 emplid 的 userName 相同,取第一个 + String userName = list.get(0).getUserName(); + Integer age = list.get(0).getAge(); + List honorNames = list.stream() + .map(LeaderHonorVO::getHonorName) + .collect(Collectors.toList()); + return new LeaderHonorGroupVO(emplid, userName, age, honorNames); + }) + .collect(Collectors.toList()); + } + + @Override + public BrandStudioApplicationVO getDetailById(String id) { + BrandStudioApplication entity = fetch(id); + if (entity == null || Boolean.TRUE.equals(entity.getDelFlag())) { + throw new RuntimeException("未查询到该申请记录"); + } + BrandStudioApplicationVO applicationVO = BrandStudioApplicationConvert.convert(entity); + List brandStudioMembers = dao().query(BrandStudioMember.class, Cnd.where("applicationId", "=", id).and("delFlag", "=", false)); + if (brandStudioMembers != null && !brandStudioMembers.isEmpty()) { + List brandStudioMembersVO = BrandStudioMemberConvert.convertListVO(brandStudioMembers); + applicationVO.setBrandStudioMembers(brandStudioMembersVO); + } + + List honorList = dao().query(BrandStudioHonor.class, Cnd.where("applicationId", "=", id).and("delFlag", "=", false)); + if (honorList != null && !honorList.isEmpty()) { + List honorVOS = BrandStudioHonorConvert.convertListVO(honorList); + applicationVO.setBrandStudioHonors(honorVOS); + } + + /// 查询当前工作流待审核 ID + return applicationVO; + } + + @Override + public void archive(List idList) { + if (idList == null || idList.isEmpty()) { + return; + } + dao().update(BrandStudioApplication.class, Chain.make("archive", 1), Cnd.where("id", "in", idList)); + } + + /// 之前的工作流逻辑,已废弃 + @Override + public Pagination auditPage(BrandStudioApplicationPageDTO pageDTO) { + return flowAuditPage(pageDTO); + } + + /// 新的工作流逻辑 + @Override + public Pagination flowAuditPage(BrandStudioApplicationPageDTO dto) { + Sql sql = Sqls.create(""" + select bsa.*, inst.id as processInstanceId, inst.processInstanceNodeName as processTaskNode, + task.id as flowId, task.id as processInstanceTaskId, task.taskStatus as processTaskReason, + task.createdOn as processTaskStartTime, task.endOn as processTaskEndTime + from brand_studio_application bsa + inner join bpm_process_instance inst on bsa.id = inst.processInstanceBusinessId + inner join bpm_process_task task on inst.id = task.processInstanceId and task.delFlag = 0 + inner join bpm_process_define def on inst.processDefineId = def.id and def.code = 'BRAND_STUDIO' + where bsa.delFlag = 0 + $condition + order by task.createdOn desc + """); + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(dto.getName())) { + cnd.and("bsa.name", "like", "%" + dto.getName() + "%"); + } + if (StrUtil.isNotBlank(dto.getCreateYear())) { + cnd.and("bsa.createYear", "=", dto.getCreateYear()); + } + if (StrUtil.isNotBlank(dto.getLeadPeople())) { + cnd.and("bsa.leadPeople", "like", "%" + dto.getLeadPeople() + "%"); + } + if (dto.getProcessStatus() != null) { + cnd.and("task.taskStatus", "=", getProcessTaskStatus(dto.getProcessStatus())); + } + if (dto.getStatus() != null) { + cnd.and("bsa.status", "=", dto.getStatus()); + } + sql.setCondition(cnd); + return listPageVO(dto, sql, BrandStudioApplyFlowVO.class); + } + + private String getProcessTaskStatus(Integer processStatus) { + if (Objects.equals(processStatus, 1)) { + return BpmProcessTaskStatusEnum.ACTIVE.name(); + } + if (Objects.equals(processStatus, 5)) { + return BpmProcessTaskStatusEnum.COMPLETE.name(); + } + return String.valueOf(processStatus); + } + + @Override + public Pagination summaryPage(BrandStudioApplicationPageDTO pageDTO) { + Sql sql = Sqls.create(""" + select bsa.*, bsh.id as honorId, bsh.honorName, bsh.honorGrade, bsh.requireYear, bsh.honorCategory + from brand_studio_application bsa + left join brand_studio_honor bsh on bsa.id = bsh.applicationId and bsh.delFlag = 0 + where bsa.delFlag = 0 + $condition + order by bsa.createYear desc, bsa.createdAt desc + """); + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(pageDTO.getName())) { + cnd.and("bsa.name", "like", "%" + pageDTO.getName() + "%"); + } + if (StrUtil.isNotBlank(pageDTO.getCreateYear())) { + cnd.and("bsa.createYear", "=", pageDTO.getCreateYear()); + } + if (StrUtil.isNotBlank(pageDTO.getLeadPeople())) { + cnd.and("bsa.leadPeople", "like", "%" + pageDTO.getLeadPeople() + "%"); + } + if (pageDTO.getStatus() != null) { + cnd.and("bsa.status", "=", pageDTO.getStatus()); + } + sql.setCondition(cnd); + return listPageVO(pageDTO, sql, BrandStudioApplicationHonorVO.class); + } + + @Override + public List getHonorDetailById(String id) { + List brandStudioHonors = dao().query(BrandStudioHonor.class, Cnd.where("applicationId", "=", id).and("delFlag", "=", false)); + return BrandStudioHonorConvert.convertList(brandStudioHonors); + } + + @Override + public void export() { + throw new RuntimeException("当前项目未配置品牌工作室台账导出模板"); + } + + @Override + public void exportDocx(String id, HttpServletResponse response) { + throw new RuntimeException("当前项目未配置品牌工作室申请文档模板"); + } + + private List selectLeaderHonor() { + Sql sql = Sqls.create(""" + select su.id, + su.loginname as emplid, + su.username as userName, + su.unitId as deptid, + su.unitId, + su.birthday, + su.professionalTitle as honorName, + u.unionId as unionId + from sys_user su + left join sys_unit u on su.unitId = u.id + where su.delFlag = 0 + and su.disabled = 0 + """); + return listVO(sql, LeaderHonorVO.class); + } + + private Sys_user getCurrentUser() { + String userId = SecurityUtil.getUserId(); + if (userId == null || userId.isBlank()) { + return null; + } + return dao().fetch(Sys_user.class, userId); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioHonorServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioHonorServiceImpl.java new file mode 100644 index 00000000..3eb8d961 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioHonorServiceImpl.java @@ -0,0 +1,16 @@ +package com.budwk.app.zhgh.brand.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.brand.models.BrandStudioHonor; +import com.budwk.app.zhgh.brand.service.BrandStudioHonorService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + + +@IocBean(args = {"refer:dao"}) +public class BrandStudioHonorServiceImpl extends BaseServiceImpl implements BrandStudioHonorService { + + public BrandStudioHonorServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioMemberServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioMemberServiceImpl.java new file mode 100644 index 00000000..40825630 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandStudioMemberServiceImpl.java @@ -0,0 +1,49 @@ +package com.budwk.app.zhgh.brand.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioMemberCreateDTO; +import com.budwk.app.zhgh.brand.domain.dto.BrandStudioMemberUpdateDTO; +import com.budwk.app.zhgh.brand.models.BrandStudioMember; +import com.budwk.app.zhgh.brand.service.BrandStudioMemberService; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class BrandStudioMemberServiceImpl extends BaseServiceImpl implements BrandStudioMemberService { + + public BrandStudioMemberServiceImpl(Dao dao) { + super(dao); + } + + @Override + public void save(BrandStudioMemberCreateDTO dto) { + BrandStudioMember member = BeanUtil.copyProperties(dto, BrandStudioMember.class); + insert(member); + } + + @Override + public void update(BrandStudioMemberUpdateDTO dto) { + BrandStudioMember member = BeanUtil.copyProperties(dto, BrandStudioMember.class); + updateIgnoreNull(member); + } + + @Override + public void delete(List ids) { + if (ids == null || ids.isEmpty()) { + return; + } + dao().update(BrandStudioMember.class, Chain.make("delFlag", true), Cnd.where("id", "in", ids)); + } + + public void deleteByApplicationIds(List applicationIds) { + if (applicationIds == null || applicationIds.isEmpty()) { + return; + } + dao().update(BrandStudioMember.class, Chain.make("delFlag", true), Cnd.where("applicationId", "in", applicationIds)); + } +} diff --git a/src/main/resources/views/platform/zhgh/brand/api/application.js b/src/main/resources/views/platform/zhgh/brand/api/application.js new file mode 100644 index 00000000..378e3776 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/api/application.js @@ -0,0 +1,24 @@ +import request from '@/utils/request'; + +/** + * 根据id查询流程列表 + */ +export async function getBrandApplyFlowListApi(params) { + return await request.get('/act/application/flow/process', { + params: params + }); +} + +/** + * 审核 + */ +export async function auditApplicationApi(data) { + return await request.put('/act/application/flow/audit', data); +} + +/** + * 撤回 + */ +export async function recallApplicationApi(data) { + return await request.put('/act/application/flow/recall', data); +} diff --git a/src/main/resources/views/platform/zhgh/brand/api/brand.js b/src/main/resources/views/platform/zhgh/brand/api/brand.js new file mode 100644 index 00000000..07f989ac --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/api/brand.js @@ -0,0 +1,92 @@ +import request from '@/utils/request'; + +/** + * 查询申请人工会和机构 + */ +export async function getUserBelongUnionApi(params) { + return request.get('/act/brand/application/union', { params }); +} + +/** + * 查询领衔人和荣誉 + */ +export async function getLeaderHonorApi(params) { + return request.get('/act/brand/application/leader', { params }); +} + +/** + * 分页查询品牌工作室列表 + */ +export async function getBrandStudioApplicationPageApi(params) { + return request.get('/act/brand/application/page', { params }); +} + +/** + * 根据id查询品牌工作室申请信息 + */ +export async function getBrandStudioApplicationApi(id) { + return await request.get('/act/brand/application/' + id); +} + +/** + * 添加品牌工作室 + */ +export async function addBrandStudioApplicationApi(data) { + return await request.post('/act/brand/application', data); +} + +/** + * 修改品牌工作室信息 + */ +export async function updateBrandStudioApplicationApi(data) { + return await request.put('/act/brand/application', data); +} + +/** + * 修改品牌工作室基础信息 + */ +export async function updateBrandStudioBaseInfoApi(data) { + return await request.put('/act/brand/application/base', data); +} + +/** + * 修改品牌工作室成员和荣誉信息 + */ +export async function updateBrandStudioMemberOrHonorApi(data) { + return await request.post('/act/brand/application/honor', data); +} + +/** + * 批量删除品牌工作室 + */ +export async function removeBrandStudioApplicationsApi(ids) { + return await request.post('/act/brand/application/delete', { data: ids }); +} + +/** + * 分页查询品牌工作室 待审核 列表 + */ +export async function getBrandApplicationAuditPageApi(params) { + return request.get('/act/brand/application/auditPage', { params }); +} + +/** + * 分页查询品牌工作室+荣誉列表 + */ +export async function getBrandStudioApplicationHonorPageApi(params) { + return request.get('/act/brand/application/summaryPage', { params }); +} + +/** + * 根据id查询品牌工作室荣誉信息 + */ +export async function getBrandStudioHonorApi(id) { + return await request.get('/act/brand/application/honor/' + id); +} + +/** + * 提交申请 + */ +export async function submitApplicationApi(data) { + return await request.put('/act/brand/application/submitApply', data); +} diff --git a/src/main/resources/views/platform/zhgh/brand/api/statistics.js b/src/main/resources/views/platform/zhgh/brand/api/statistics.js new file mode 100644 index 00000000..c6db670b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/api/statistics.js @@ -0,0 +1,37 @@ +import request from '@/utils/request'; + +/** + * 查询工会审批统计表单 + */ +export async function getUnionApplyStatsApi(params) { + return await request.get('/act/application/statistics/unionStats', { + params: params + }); +} + +/** + * 各申请表单进度情况 + */ +export async function getApplyProgressStatsApi(params) { + return await request.get('/act/application/statistics/applyProgress', { + params: params + }); +} + +/** + * 工会申请预警 + */ +export async function getApplyWarningStatsApi(params) { + return await request.get('/act/application/statistics/applyWarning', { + params: params + }); +} + +/** + * 统计用户申请的各字段分组 + */ +export async function getApplyCountStatsApi(params) { + return await request.get('/act/application/statistics/applyCount', { + params: params + }); +} \ No newline at end of file diff --git a/src/main/resources/views/platform/zhgh/brand/application/index.html b/src/main/resources/views/platform/zhgh/brand/application/index.html new file mode 100644 index 00000000..045ff123 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/application/index.html @@ -0,0 +1,91 @@ + + +
+ + + + + + + + + + 查询 + 新建 + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/application/index.vue b/src/main/resources/views/platform/zhgh/brand/application/index.vue new file mode 100644 index 00000000..5430bb94 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/application/index.vue @@ -0,0 +1,416 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/application/index_bak_2026_02_10.vue b/src/main/resources/views/platform/zhgh/brand/application/index_bak_2026_02_10.vue new file mode 100644 index 00000000..dfa88f03 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/application/index_bak_2026_02_10.vue @@ -0,0 +1,411 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/apply/index-table.vue b/src/main/resources/views/platform/zhgh/brand/apply/index-table.vue new file mode 100644 index 00000000..8317db7e --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/apply/index-table.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/apply/index.html b/src/main/resources/views/platform/zhgh/brand/apply/index.html new file mode 100644 index 00000000..8cedf61c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/apply/index.html @@ -0,0 +1,209 @@ + + +
+ +
+ {{form.id ? '修改申请' : '创建申请'}} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 工作室成员 + + + + + + + + + + + + + + + + + + + + +
+ 添加成员 +
+ + + 返回 + 保存草稿 + 提交申请 + +
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/apply/index.vue b/src/main/resources/views/platform/zhgh/brand/apply/index.vue new file mode 100644 index 00000000..6a6dfbe2 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/apply/index.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/apply-info.vue b/src/main/resources/views/platform/zhgh/brand/components/apply-info.vue new file mode 100644 index 00000000..d3ee30dd --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/apply-info.vue @@ -0,0 +1,699 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/flow-audit.vue b/src/main/resources/views/platform/zhgh/brand/components/flow-audit.vue new file mode 100644 index 00000000..af08d750 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/flow-audit.vue @@ -0,0 +1,528 @@ + + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/flow-view.vue b/src/main/resources/views/platform/zhgh/brand/components/flow-view.vue new file mode 100644 index 00000000..23846172 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/flow-view.vue @@ -0,0 +1,50 @@ + + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/info-audit.vue b/src/main/resources/views/platform/zhgh/brand/components/info-audit.vue new file mode 100644 index 00000000..6d46d7d2 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/info-audit.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/param-search.vue b/src/main/resources/views/platform/zhgh/brand/components/param-search.vue new file mode 100644 index 00000000..c1b8c996 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/param-search.vue @@ -0,0 +1,68 @@ + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/select-member-btn.vue b/src/main/resources/views/platform/zhgh/brand/components/select-member-btn.vue new file mode 100644 index 00000000..a3f598bb --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/select-member-btn.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/components/table-info.vue b/src/main/resources/views/platform/zhgh/brand/components/table-info.vue new file mode 100644 index 00000000..8ad4d44a --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/components/table-info.vue @@ -0,0 +1,823 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/js/common-brand.js b/src/main/resources/views/platform/zhgh/brand/js/common-brand.js new file mode 100644 index 00000000..cddcc8d8 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/js/common-brand.js @@ -0,0 +1,27 @@ +import {h} from "vue"; + +export const withRequiredHeader = (col) => ({ + ...col, + renderHeader: () => { + if (!col.required) return col.label; + return h( + 'span', + { style: { display: 'inline-flex', alignItems: 'center' } }, + [ + h('span', null, col.label), + h( + 'span', + { + style: { + color: '#f56c6c', // 红色 + fontWeight: '700', + fontSize: '16px', + marginLeft: '4px' // 放右侧留间距 + } + }, + '*' + ) + ] + ); + } +}); diff --git a/src/main/resources/views/platform/zhgh/brand/office/index.html b/src/main/resources/views/platform/zhgh/brand/office/index.html new file mode 100644 index 00000000..f2dc4430 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/office/index.html @@ -0,0 +1,72 @@ + + +
+ + + + + + + + + + 查询 + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/office/index.vue b/src/main/resources/views/platform/zhgh/brand/office/index.vue new file mode 100644 index 00000000..042e3afc --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/office/index.vue @@ -0,0 +1,205 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/apply-pending.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/apply-pending.vue new file mode 100644 index 00000000..2d15134d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/apply-pending.vue @@ -0,0 +1,145 @@ + + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/apply-progress.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/apply-progress.vue new file mode 100644 index 00000000..5c322efb --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/apply-progress.vue @@ -0,0 +1,144 @@ + + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/bar-chart.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/bar-chart.vue new file mode 100644 index 00000000..4d97af43 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/bar-chart.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/goal-card.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/goal-card.vue new file mode 100644 index 00000000..5bbaa50d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/goal-card.vue @@ -0,0 +1,61 @@ + + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/line-chart.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/line-chart.vue new file mode 100644 index 00000000..147d7ed3 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/line-chart.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/pie-chart.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/pie-chart.vue new file mode 100644 index 00000000..6b82896e --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/pie-chart.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/components/union-table.vue b/src/main/resources/views/platform/zhgh/brand/overview/components/union-table.vue new file mode 100644 index 00000000..4e5f8816 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/components/union-table.vue @@ -0,0 +1,114 @@ + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/overview/index.vue b/src/main/resources/views/platform/zhgh/brand/overview/index.vue new file mode 100644 index 00000000..ba58435d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/overview/index.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/review/index.html b/src/main/resources/views/platform/zhgh/brand/review/index.html new file mode 100644 index 00000000..29085871 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/review/index.html @@ -0,0 +1,92 @@ + + +
+ + + + + + + + + + + + + + + + 查询 + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/review/index.vue b/src/main/resources/views/platform/zhgh/brand/review/index.vue new file mode 100644 index 00000000..e254e59b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/review/index.vue @@ -0,0 +1,270 @@ + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/summary/components/param-search.vue b/src/main/resources/views/platform/zhgh/brand/summary/components/param-search.vue new file mode 100644 index 00000000..c1b8c996 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/summary/components/param-search.vue @@ -0,0 +1,68 @@ + + + + diff --git a/src/main/resources/views/platform/zhgh/brand/summary/index.html b/src/main/resources/views/platform/zhgh/brand/summary/index.html new file mode 100644 index 00000000..29dacf98 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/summary/index.html @@ -0,0 +1,65 @@ + + +
+ + + + + + + + + + 查询 + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/summary/index.vue b/src/main/resources/views/platform/zhgh/brand/summary/index.vue new file mode 100644 index 00000000..1e455464 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/summary/index.vue @@ -0,0 +1,338 @@ + + + diff --git a/src/main/resources/views/platform/zhgh/brand/tabs/info-edit.vue b/src/main/resources/views/platform/zhgh/brand/tabs/info-edit.vue new file mode 100644 index 00000000..aa2ad028 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/brand/tabs/info-edit.vue @@ -0,0 +1,998 @@ + + + + + From 19bbd61436a83eaca4454038836a29e18e7611c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Wed, 19 Aug 2026 18:04:39 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E5=93=81=E7=89=8C=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=AE=A4=E8=BF=81=E7=A7=BB=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BrandStudioApplicationController.java | 26 +- .../domain/dto/BrandApplicationAuditDTO.java | 5 + .../dto/BrandStudioApplicationCreateDTO.java | 14 + .../dto/BrandStudioApplicationPageDTO.java | 5 + .../dto/BrandStudioApplicationUpdateDTO.java | 31 ++ .../domain/vo/BrandStudioApplicationVO.java | 50 +++ .../domain/vo/BrandStudioApplyFlowVO.java | 45 +++ .../BrandStudioApplicationService.java | 3 + .../impl/BrandApplicationFlowServiceImpl.java | 93 ++--- .../BrandStudioApplicationServiceImpl.java | 271 ++++++++++---- .../zhgh/brand/application/index.html | 190 ++++++++-- .../platform/zhgh/brand/apply/index.html | 312 +++++++++++++--- .../platform/zhgh/brand/office/index.html | 333 ++++++++++++++++-- .../platform/zhgh/brand/review/index.html | 290 ++++++++++++--- .../platform/zhgh/brand/summary/index.html | 127 +++++-- 15 files changed, 1512 insertions(+), 283 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java index 86b9c4b3..8dc7b6e8 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java +++ b/src/main/java/com/budwk/app/zhgh/brand/controller/BrandStudioApplicationController.java @@ -18,6 +18,7 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.util.ArrayList; import java.util.List; @IocBean @@ -34,6 +35,11 @@ public class BrandStudioApplicationController { return Result.success(leaderHonorVO); } + @At("/members") + public Result listMemberCandidates(String unionId, String keyword) { + return Result.success(applicationService.listMemberCandidates(unionId, keyword)); + } + @At("/page") public Result page(@Valid BrandStudioApplicationPageDTO dto) { return Result.success(applicationService.page(dto)); @@ -45,7 +51,7 @@ public class BrandStudioApplicationController { return Result.success(applicationVO); } - @At + @At("") public Result save(@Param("..") @Valid BrandStudioApplicationCreateDTO dto) { applicationService.save(dto); return Result.success(); @@ -59,7 +65,23 @@ public class BrandStudioApplicationController { @At("/delete") public Result delete(@Param("..") NutMap request) { - applicationService.delete((List) request.get("data")); + List ids = new ArrayList<>(); + Object data = request.get("data"); + if (data instanceof List) { + ((List) data).forEach(item -> ids.add(String.valueOf(item))); + } else if (data != null) { + ids.add(String.valueOf(data)); + } + Object id = request.get("id"); + if (id != null) { + ids.add(String.valueOf(id)); + } + request.forEach((key, value) -> { + if (key != null && String.valueOf(key).startsWith("data[") && value != null) { + ids.add(String.valueOf(value)); + } + }); + applicationService.delete(ids); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java index aba2b1e4..e2ffbfe9 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandApplicationAuditDTO.java @@ -50,6 +50,11 @@ public class BrandApplicationAuditDTO { */ private String bpmTaskApprovalType; + /** + * 流程提交类型 + */ + private Integer submitType; + /** * 下一个任务接收人 */ diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java index 0732da8c..240f141e 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationCreateDTO.java @@ -1,6 +1,8 @@ package com.budwk.app.zhgh.brand.domain.dto; import lombok.Data; +import org.nutz.json.Json; +import org.nutz.lang.Strings; import javax.validation.Valid; import javax.validation.constraints.*; @@ -137,4 +139,16 @@ public class BrandStudioApplicationCreateDTO { @NotEmpty(message = "至少需要1位成员") @Valid private List brandStudioMembers; + + /** + * 工作室成员列表 JSON + */ + private String brandStudioMembersJson; + + public void setBrandStudioMembersJson(String brandStudioMembersJson) { + this.brandStudioMembersJson = brandStudioMembersJson; + if (Strings.isNotBlank(brandStudioMembersJson)) { + this.brandStudioMembers = Json.fromJsonAsList(BrandStudioMemberCreateDTO.class, brandStudioMembersJson); + } + } } diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java index fd921f34..c1335e13 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationPageDTO.java @@ -134,6 +134,11 @@ public class BrandStudioApplicationPageDTO extends PageForm { */ private Integer processStatus; + /** + * 是否已审核 + */ + private Boolean audit = false; + @Override public Integer getPageNumber() { Integer pageNumber = super.getPageNumber(); diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java index a9d109ff..cf612899 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/dto/BrandStudioApplicationUpdateDTO.java @@ -1,6 +1,8 @@ package com.budwk.app.zhgh.brand.domain.dto; import lombok.Data; +import org.nutz.json.Json; +import org.nutz.lang.Strings; import java.util.List; @@ -67,6 +69,11 @@ public class BrandStudioApplicationUpdateDTO { */ private Integer status; + /** + * 发起任务ID + */ + private String startTaskId; + /** * 归档 */ @@ -107,6 +114,30 @@ public class BrandStudioApplicationUpdateDTO { * */ private List brandStudioMembers; + /** + * 添加的成员 JSON + */ + private String brandStudioMembersJson; + + public void setBrandStudioMembersJson(String brandStudioMembersJson) { + this.brandStudioMembersJson = brandStudioMembersJson; + if (Strings.isNotBlank(brandStudioMembersJson)) { + this.brandStudioMembers = Json.fromJsonAsList(BrandStudioMemberCreateDTO.class, brandStudioMembersJson); + } + } + private List brandStudioHonors; + /** + * 添加的荣誉 JSON + */ + private String brandStudioHonorsJson; + + public void setBrandStudioHonorsJson(String brandStudioHonorsJson) { + this.brandStudioHonorsJson = brandStudioHonorsJson; + if (Strings.isNotBlank(brandStudioHonorsJson)) { + this.brandStudioHonors = Json.fromJsonAsList(BrandStudioHonorCreateDTO.class, brandStudioHonorsJson); + } + } + } diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java index 28725081..51c4b776 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplicationVO.java @@ -85,6 +85,56 @@ public class BrandStudioApplicationVO implements Serializable { */ private Integer status; + /** + * 流程实例ID + */ + private Long instanceId; + + /** + * 流程业务编号 + */ + private String businessNo; + + /** + * 流程状态 + */ + private Integer instanceState; + + /** + * 流程定义ID + */ + private String instanceProcessDefineId; + + /** + * 当前任务ID + */ + private String taskId; + + /** + * 当前任务标识 + */ + private String taskKey; + + /** + * 当前任务名称 + */ + private String taskName; + + /** + * 当前任务状态 + */ + private Integer taskState; + + /** + * 是否可以撤回 + */ + private Boolean canRevoke; + + /** + * 发起任务ID + */ + private String startTaskId; + /** * 归档 */ diff --git a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java index e1e19ee3..eee26a3a 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java +++ b/src/main/java/com/budwk/app/zhgh/brand/domain/vo/BrandStudioApplyFlowVO.java @@ -156,6 +156,51 @@ public class BrandStudioApplyFlowVO implements Serializable { private String processTaskReason; + /** + * 流程任务状态 + */ + private Integer taskState; + + /** + * 当前任务ID + */ + private String taskId; + + /** + * 当前任务标识 + */ + private String taskKey; + + /** + * 当前任务名称 + */ + private String taskName; + + /** + * 当前节点 + */ + private String curTaskName; + + /** + * 审核时间 + */ + private Date finishTime; + + /** + * 是否可以撤回 + */ + private Boolean canRevoke; + + /** + * 流程状态 + */ + private Integer instanceState; + + /** + * 流程定义ID + */ + private String instanceProcessDefineId; + private String processTaskNode; diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java index e49cac26..89960b9f 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java +++ b/src/main/java/com/budwk/app/zhgh/brand/service/BrandStudioApplicationService.java @@ -12,6 +12,7 @@ import com.budwk.app.zhgh.brand.models.BrandStudioApplication; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; +import org.nutz.lang.util.NutMap; public interface BrandStudioApplicationService extends BaseService { @@ -43,6 +44,8 @@ public interface BrandStudioApplicationService extends BaseService queryLeaderHonor(); + List listMemberCandidates(String unionId, String keyword); + Pagination summaryPage(@Valid BrandStudioApplicationPageDTO pageDTO); List getHonorDetailById(String id); diff --git a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java index 44aa69d0..c5cf150d 100644 --- a/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/brand/service/impl/BrandApplicationFlowServiceImpl.java @@ -1,17 +1,18 @@ package com.budwk.app.zhgh.brand.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.bpm.enums.BpmProcessInstanceStatusEnum; -import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; -import com.budwk.app.bpm.models.BpmProcessInstance; -import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.enums.ProcessInstanceStateEnum; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; +import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.sys.models.Sys_union; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.web.controllers.open.commons.service.CommonService; import com.budwk.app.zhgh.brand.convert.BrandApplicationFlowConvert; import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationAuditDTO; import com.budwk.app.zhgh.brand.domain.dto.BrandApplicationRecallDTO; @@ -28,7 +29,6 @@ import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.Inject; -import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -38,10 +38,10 @@ import java.util.stream.Collectors; public class BrandApplicationFlowServiceImpl extends BaseServiceImpl implements BrandApplicationFlowService { @Inject - private BpmService bpmService; + private FlowCommonService flowCommonService; @Inject - private CommonService commonService; + private FlowEngine flowEngine; public BrandApplicationFlowServiceImpl(Dao dao) { super(dao); @@ -92,56 +92,68 @@ public class BrandApplicationFlowServiceImpl extends BaseServiceImpl variables = new HashMap<>(BeanUtil.beanToMap(dto)); - variables.put("bpmTaskApprovalType", approvalTypeEnum.name()); - variables.put("approvalOpinion", dto.getRemark()); - bpmService.completeTask(taskId, approvalTypeEnum, variables, getAssignments(dto, approvalTypeEnum)); + ApplicationFlowStatusEnum statusEnum = getFlowStatusEnum(dto); + Dict args = Dict.create(); + args.putAll(BeanUtil.beanToMap(dto)); + args.set(FlowConst.PROCESS_TASK_ID_KEY, Long.valueOf(taskId)); + args.set(FlowConst.APPROVAL_COMMENT, dto.getRemark()); + args.set("tf_remark", dto.getRemark()); + args.set(FlowConst.SUBMIT_TYPE, getProcessSubmitType(statusEnum)); + flowCommonService.executeTask(args); - BpmProcessInstance instance = dao().fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", applicationId)); - if (approvalTypeEnum == BpmTaskApprovalTypeEnum.REJECT) { + ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where("businessNo", "=", applicationId)); + if (statusEnum == ApplicationFlowStatusEnum.REJECT) { dao().update(BrandStudioApplication.class, Chain.make("status", BrandApplicationStatusEnums.REJECT.getCode()), Cnd.where("id", "=", applicationId)); - } else if (approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK || approvalTypeEnum == BpmTaskApprovalTypeEnum.BACK_OTHER_NODE) { + } else if (statusEnum == ApplicationFlowStatusEnum.RECALL) { dao().update(BrandStudioApplication.class, - Chain.make("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()), + Chain.make("status", BrandApplicationStatusEnums.DRAFT.getCode()), Cnd.where("id", "=", applicationId)); - } else if (instance != null && BpmProcessInstanceStatusEnum.COMPLETED.name().equals(instance.getProcessInstanceStatus())) { + } else if (instance != null && ProcessInstanceStateEnum.FINISHED.getCode().equals(instance.getState())) { dao().update(BrandStudioApplication.class, Chain.make("status", BrandApplicationStatusEnums.PASSED.getCode()), Cnd.where("id", "=", applicationId)); } } - private List getAssignments(BrandApplicationAuditDTO dto, BpmTaskApprovalTypeEnum approvalTypeEnum) { - if (dto.getAssignments() != null && !dto.getAssignments().isEmpty()) { - return dto.getAssignments(); + private ApplicationFlowStatusEnum getFlowStatusEnum(BrandApplicationAuditDTO dto) { + if (ProcessSubmitTypeEnum.AGREE.getCode().equals(dto.getSubmitType())) { + return ApplicationFlowStatusEnum.PASSED; } - if (approvalTypeEnum == BpmTaskApprovalTypeEnum.PASS) { - String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN); - if (StrUtil.isBlank(approvalLoginName)) { - throw new RuntimeException("校工会未配置审批人,请联系管理员"); - } - return List.of(approvalLoginName); + if (ProcessSubmitTypeEnum.REJECT.getCode().equals(dto.getSubmitType())) { + return ApplicationFlowStatusEnum.REJECT; } - return null; - } - - private BpmTaskApprovalTypeEnum getBpmTaskApprovalTypeEnum(BrandApplicationAuditDTO dto) { - if (StrUtil.isNotBlank(dto.getBpmTaskApprovalType())) { - return BpmTaskApprovalTypeEnum.valueOf(dto.getBpmTaskApprovalType()); + if (ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode().equals(dto.getSubmitType())) { + return ApplicationFlowStatusEnum.RECALL; + } + if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "PASS")) { + return ApplicationFlowStatusEnum.PASSED; + } + if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "REJECT")) { + return ApplicationFlowStatusEnum.REJECT; + } + if (StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "BACK") + || StrUtil.equalsIgnoreCase(dto.getBpmTaskApprovalType(), "BACK_OTHER_NODE")) { + return ApplicationFlowStatusEnum.RECALL; } if (dto.getStatus() == null) { throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。"); } ApplicationFlowStatusEnum statusEnum = ApplicationFlowStatusEnum.getStatusEnumByValue(dto.getStatus()); + if (statusEnum == null) { + throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。"); + } + return statusEnum; + } + + private Integer getProcessSubmitType(ApplicationFlowStatusEnum statusEnum) { if (statusEnum == ApplicationFlowStatusEnum.PASSED) { - return BpmTaskApprovalTypeEnum.PASS; + return ProcessSubmitTypeEnum.AGREE.getCode(); } else if (statusEnum == ApplicationFlowStatusEnum.REJECT) { - return BpmTaskApprovalTypeEnum.REJECT; + return ProcessSubmitTypeEnum.REJECT.getCode(); } else if (statusEnum == ApplicationFlowStatusEnum.RECALL) { - return BpmTaskApprovalTypeEnum.BACK; + return ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode(); } throw new RuntimeException("任务审批类型错误,请传入正确的任务审批类型。"); } @@ -208,16 +220,17 @@ public class BrandApplicationFlowServiceImpl extends BaseServiceImpl page = listPage(pageDTO.getPageNumber(), pageDTO.getPageSize(), BrandStudioApplication.class, cnd); - List list = BrandStudioApplicationConvert.convertList(page.getList()); - return new Pagination<>(page.getPageNo(), page.getPageSize(), page.getTotalCount(), list); + cnd.desc("bsa.createYear"); + cnd.desc("bsa.createdAt"); + sql.setCondition(cnd); + return listPageVO(pageDTO, sql, BrandStudioApplicationVO.class); } private Sys_user getCheckedUserDetail() { @@ -147,16 +168,22 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl variables = new HashMap<>(); - variables.put("applicationId", application.getId()); - variables.put("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()); - variables.put("userId", user.getId()); - bpmService.startSubmitProcessInstance(BpmProcessConstant.BRAND_STUDIO.name(), application.getName(), application.getId(), List.of(approvalLoginName), variables); + Dict args = Dict.create(); + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, application); + args.set("applicationId", application.getId()); + args.set("status", BrandApplicationStatusEnums.IN_REVIEW.getCode()); + args.set("userId", user.getId()); + + // 启动老工作流流程实例,复用 wf_process_define 中的 BRAND_STUDIO 流程定义 + ProcessInstance instance = flowEngine.startProcessInstanceByKey("BRAND_STUDIO", application.getId(), SecurityUtil.getUserId(), args); + + // 自动完成第一个申请任务 + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } updateApplicationStatusToFail(application.getId(), true); } catch (RuntimeException e) { updateApplicationStatusToFail(application.getId(), false); @@ -203,11 +230,32 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id)); } @Override @@ -287,12 +342,51 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl honorNames = list.stream() .map(LeaderHonorVO::getHonorName) + .filter(StrUtil::isNotBlank) + .distinct() .collect(Collectors.toList()); return new LeaderHonorGroupVO(emplid, userName, age, honorNames); }) .collect(Collectors.toList()); } + @Override + public List listMemberCandidates(String unionId, String keyword) { + Sql sql = Sqls.create(""" + select id, + id as userId, + loginname as emplid, + loginname, + username as name, + username, + date_format(birthday, '%Y-%m') as birthdate, + academicDegree as grade, + professionalTitle as professional, + unitName as deptName, + unitName, + unionId + from vw_user + $condition + """); + Cnd cnd = Cnd.NEW(); + boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (isAdmin) { + cnd.andEX("unionId", "=", unionId); + } else { + cnd.and("unionId", "=", SecurityUtil.getUnionId()); + } + if (StrUtil.isNotBlank(keyword)) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.orLike("loginname", keyword, true); + group.orLike("username", keyword, true); + cnd.and(group); + } + cnd.asc("loginname"); + sql.setCondition(cnd); + Pagination pagination = listPageMap(1, 50, sql); + return pagination.getList(); + } + @Override public BrandStudioApplicationVO getDetailById(String id) { BrandStudioApplication entity = fetch(id); @@ -312,7 +406,21 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl flowAuditPage(BrandStudioApplicationPageDTO dto) { Sql sql = Sqls.create(""" - select bsa.*, inst.id as processInstanceId, inst.processInstanceNodeName as processTaskNode, - task.id as flowId, task.id as processInstanceTaskId, task.taskStatus as processTaskReason, - task.createdOn as processTaskStartTime, task.endOn as processTaskEndTime - from brand_studio_application bsa - inner join bpm_process_instance inst on bsa.id = inst.processInstanceBusinessId - inner join bpm_process_task task on inst.id = task.processInstanceId and task.delFlag = 0 - inner join bpm_process_define def on inst.processDefineId = def.id and def.code = 'BRAND_STUDIO' - where bsa.delFlag = 0 + select bsa.*, inst.id as processInstanceId, inst.state as instanceState, + inst.processDefineId as instanceProcessDefineId, + task.id as taskId, task.id as flowId, task.id as processInstanceTaskId, + task.taskName as taskKey, task.displayName as taskName, task.displayName as processTaskNode, + task.taskState, task.finishTime, + ifnull(group_concat(distinct nextTask.displayName), '结束') as curTaskName, + if(revokeTask.id is not null, 1, 0) as canRevoke, + case task.taskState + when 10 then 'ACTIVE' + when 20 then 'COMPLETE' + when 30 then 'WITHDRAW' + when 40 then 'INTERRUPT' + when 50 then 'PENDING' + when 60 then 'TRANSFER' + when 99 then 'ABANDON' + else cast(task.taskState as char) + end as processTaskReason, + from_unixtime(task.createdAt / 1000) as processTaskStartTime, + task.finishTime as processTaskEndTime + from wf_process_task task + left join wf_process_instance inst on inst.id = task.processInstanceId + left join brand_studio_application bsa on bsa.id = inst.businessNo + left join wf_process_task_actor taskActor on taskActor.processTaskId = task.id + left join wf_process_task nextTask on nextTask.processInstanceId = inst.id and nextTask.taskState = 10 + left join wf_process_task revokeTask on revokeTask.processInstanceId = inst.id and revokeTask.taskParentId = task.id and revokeTask.taskState = 10 + inner join wf_process_define def on inst.processDefineId = def.id and def.name = 'BRAND_STUDIO' $condition - order by task.createdOn desc + order by task.createdAt desc """); - Cnd cnd = Cnd.NEW(); + Cnd cnd = Cnd.where("bsa.delFlag", "=", 0); + cnd.and("taskActor.actorId", "in", List.of(SecurityUtil.getUserId())); + cnd.and("task.taskName", "!=", "startTask"); + if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), + RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_VICE_CHAIRMAN.name())) { + cnd.and("task.displayName", "like", "%校工会%"); + } else if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name(), + RoleConstant.BRANCH_UNION_VICE_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name())) { + cnd.and("task.displayName", "like", "%分工会%"); + } if (StrUtil.isNotBlank(dto.getName())) { cnd.and("bsa.name", "like", "%" + dto.getName() + "%"); } @@ -355,37 +490,44 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl summaryPage(BrandStudioApplicationPageDTO pageDTO) { Sql sql = Sqls.create(""" - select bsa.*, bsh.id as honorId, bsh.honorName, bsh.honorGrade, bsh.requireYear, bsh.honorCategory + select bsa.*, group_concat(bsh.honorName order by bsh.requireYear desc separator ',') as honorName from brand_studio_application bsa left join brand_studio_honor bsh on bsa.id = bsh.applicationId and bsh.delFlag = 0 - where bsa.delFlag = 0 $condition + group by bsa.id order by bsa.createYear desc, bsa.createdAt desc """); - Cnd cnd = Cnd.NEW(); + Cnd cnd = Cnd.where("bsa.delFlag", "=", 0); if (StrUtil.isNotBlank(pageDTO.getName())) { cnd.and("bsa.name", "like", "%" + pageDTO.getName() + "%"); } @@ -420,18 +562,23 @@ public class BrandStudioApplicationServiceImpl extends BaseServiceImpl selectLeaderHonor() { Sql sql = Sqls.create(""" - select su.id, - su.loginname as emplid, - su.username as userName, - su.unitId as deptid, - su.unitId, - su.birthday, - su.professionalTitle as honorName, - u.unionId as unionId - from sys_user su - left join sys_unit u on su.unitId = u.id - where su.delFlag = 0 - and su.disabled = 0 + select h.id, + u.loginname as emplid, + h.userName, + timestampdiff(year, u.birthday, curdate()) as age, + h.unitId as deptid, + h.unionId, + h.unitName as deptName, + year(h.grantDate) as year, + prize.name as honorName, + h.prize as honorCode + from honor h + left join vw_user u on h.userId = u.id + left join honor_basic_settings prize on prize.id = h.prize + left join honor_basic_settings type on type.id = h.honorType + where h.userId is not null + and prize.name is not null + and (type.queryTypeCode = 'HONOR_SINGLE' or type.name = '个人荣誉') """); return listVO(sql, LeaderHonorVO.class); } diff --git a/src/main/resources/views/platform/zhgh/brand/application/index.html b/src/main/resources/views/platform/zhgh/brand/application/index.html index 045ff123..f33556d5 100644 --- a/src/main/resources/views/platform/zhgh/brand/application/index.html +++ b/src/main/resources/views/platform/zhgh/brand/application/index.html @@ -3,20 +3,26 @@ layout("/layouts/platform.html"){ #-->
+ + + + - - - 查询 - 新建 - + + + + + 申请品牌工作室 + + @@ -25,28 +31,100 @@ layout("/layouts/platform.html"){ - + - + + + +
+ + diff --git a/src/main/resources/views/platform/zhgh/brand/office/index.html b/src/main/resources/views/platform/zhgh/brand/office/index.html index f2dc4430..a83c3d21 100644 --- a/src/main/resources/views/platform/zhgh/brand/office/index.html +++ b/src/main/resources/views/platform/zhgh/brand/office/index.html @@ -3,34 +3,153 @@ layout("/layouts/platform.html"){ #-->
- - - - - - - - - - 查询 - - - - - - - - - - - - - - + + + + + + + + + + + 查询 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +
+ 取消 + 确定 +
+
+ + diff --git a/src/main/resources/views/platform/zhgh/brand/review/index.html b/src/main/resources/views/platform/zhgh/brand/review/index.html index 29085871..7e16ac1b 100644 --- a/src/main/resources/views/platform/zhgh/brand/review/index.html +++ b/src/main/resources/views/platform/zhgh/brand/review/index.html @@ -3,82 +3,264 @@ layout("/layouts/platform.html"){ #-->
- - - - - - - - - - - - - - - - 查询 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + 已审核 + 未审核 + + + + + + + + + + + + + + + + + + + + + + + + + + + +