From 455e4ca1171fc4a56466d6e9154c15b2b950f6c7 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Tue, 16 Jun 2026 10:28:26 +0800 Subject: [PATCH 01/11] commit --- dependency-reduced-pom.xml | 2 +- src/main/resources/application-dev.yaml | 27 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index d83f4c98..5b84c298 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.budwk - v4 + zhgh_cug_v4 5.6.0-plus diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index bd0e6322..49351962 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -174,4 +174,31 @@ data-center: urls: teacher: https://bd.whcp.edu.cn/sjjkfwpt/api/bd-api/get/JZGJCSJZLB unit: https://bd.whcp.edu.cn/sjjkfwpt/api/bd-api/get/YXSDWJBSJZLB +msg: + platform: + enabled: false + # 地大通讯平台基础地址,默认对接正式地址 + base-url: https://msg.cug.edu.cn + # 授权系统名称,对应文档中的 tp_name + tp-name : nwszl.cug.edu.cn + # 便捷发送方法默认发送人工号,controller 只传接收人和内容时会读取这里 + default-send-user-id: 790036 + # 便捷发送方法默认发送人姓名,controller 只传接收人和内容时会读取这里 + default-send-user-name: 周斐霏 + # 便捷发送方法默认发送机构ID,可不填 + default-send-unit-id: 421 + # 便捷发送方法默认发送机构名称,可不填 + default-send-unit-name: 工会 + # 便捷发送方法默认签名,可不填 + default-send-user-sign: + #短信中如果不包含链接和电话,可以使用公共模板ID: + default-template-id: 1978744168869937153 + # 原始密钥,未提前加密时可直接填这里,程序会按 Base64 后 SHA 自动计算 secret_key + raw-secret-key: Z21kbDlwYWJ4c2Vtbnk4NjlxeQ== + # 如果对方已经提供了可直接使用的 secret_key,也可以直接配置该值,优先级高于 raw-secret-key + encrypted-secret-key: + # HTTP连接超时时间,单位毫秒 + connect-timeout: 5000 + # HTTP读取超时时间,单位毫秒 + read-timeout: 10000 From 3f8f8f5f4422537d972718964444f2b1de16213d Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Tue, 16 Jun 2026 10:29:29 +0800 Subject: [PATCH 02/11] commit --- .../com/budwk/app/sys/services/impl/SysUserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 81a7a58a..4ffba70d 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -310,7 +310,7 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { // if (Globals.sso) { -// throw new BaseException("用户名或者密码不正确"); + throw new BaseException("用户名或者密码不正确"); // } } user = this.fetchLinks(user, "unit"); From 2e3c3e87dad1f8caa7e12c084cbc8958b3260900 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 1 Jul 2026 09:21:06 +0800 Subject: [PATCH 03/11] commit --- .../sports/models/ActivitySchoolApply.java | 8 ++-- .../impl/ActivitySportsServiceImpl.java | 16 ++++++- .../manage/TrainSignUpApplyController.java | 1 + .../trainSignUp/models/TrainSignUpCourse.java | 5 +++ .../controller/SiteCugApplyController.java | 8 ++-- .../siteCug/model/SiteCugInfo.java | 10 +++++ .../activity/trainSignUp/manage/basicForm.js | 14 +++++- .../trainSignUp/userManage/index.html | 2 +- .../zhgh/dayofficework/siteCug/apply/apply.js | 14 ++++++ .../dayofficework/siteCug/manage/basicForm.js | 43 ++++++++++++++++--- .../unionReimburse/apply/index.html | 7 +++ .../member/change/manage/index.html | 2 +- .../activity/trainSignUp/list/index.html | 1 + .../dayofficework/siteCug/apply/form/apply.js | 15 ++++++- 14 files changed, 128 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchoolApply.java b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchoolApply.java index 4bbada6e..2133cecc 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchoolApply.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchoolApply.java @@ -169,16 +169,16 @@ public class ActivitySchoolApply extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, width = 50) private String mobile; +// @Excel(name = "身份证号", width = 20) + @Excel(name = "身份证", width = 25) + private String idCard; + @Column @Comment("职级") @Excel(name = "职级", width = 20) @ColDefine(type = ColType.VARCHAR, width = 50) private String professionalLevel; - -// @Excel(name = "身份证号", width = 20) - private String idCard; - @Column @Comment("性别") @Excel(name = "性别", width = 20) diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java index fa8161a6..2f68847f 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/service/impl/ActivitySportsServiceImpl.java @@ -10,6 +10,7 @@ import com.budwk.app.base.utils.DateUtil; import com.budwk.app.sys.models.Sys_home_activity; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit; +import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnion; import com.budwk.app.zhgh.activity.culture.models.ActivityTissue; import com.budwk.app.zhgh.activity.sports.models.ActivitySchool; import com.budwk.app.zhgh.activity.sports.models.ActivitySchoolApply; @@ -200,6 +201,7 @@ public class ActivitySportsServiceImpl extends BaseServiceImpl i app.activityUnionName unionname, app.sex, app.mobile, + u.idcard AS idCard, app.professionalLevel, u.userState, ev.allName, @@ -242,13 +244,25 @@ public class ActivitySportsServiceImpl extends BaseServiceImpl i ExportParams exportParams = new ExportParams(); exportParams.setType(ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ActivitySchoolApply.class, excels); - CommonDownloadUtil.download("报名表.xlsx", workbook, response); + CommonDownloadUtil.download(getUnionApplyExportFileName(unionId), workbook, response); } catch (Exception e) { e.printStackTrace(); } } + private String getUnionApplyExportFileName(String unionId) { + String unionName = "分工会"; + if (Strings.isNotBlank(unionId)) { + ActivityBasicUnion union = dao().fetch(ActivityBasicUnion.class, unionId); + if (union != null && Strings.isNotBlank(union.getName())) { + unionName = union.getName(); + } + } + // 分工会名称可能已经包含“分工会”后缀,避免导出文件名重复拼接。 + return unionName.endsWith("分工会") ? unionName + "报名表.xlsx" : unionName + "分工会报名表.xlsx"; + } + private static class personType { diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java index be239c2e..c875314d 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java @@ -135,6 +135,7 @@ public class TrainSignUpApplyController { tsuc.courseLocationCoordinates, tsuc.courseReservedNumber, tsuc.courseInstructor, + tsuc.courseInstructorMobile, tsuc.campus, tsuc.unionLimit, tsuc.isMobileSign, diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpCourse.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpCourse.java index ed6a4535..b4258c32 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpCourse.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpCourse.java @@ -68,6 +68,11 @@ public class TrainSignUpCourse extends BaseModel implements Serializable { @Comment("课程讲师") private String courseInstructor; + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("负责人手机号") + private String courseInstructorMobile; + @Column @ColDefine(type = ColType.VARCHAR, width = 32) @Comment("校区") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java index f95e3eef..2344dfcd 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java @@ -693,11 +693,11 @@ public class SiteCugApplyController { @SaCheckPermission(value = {"siteCug.apply", "h5.siteCug.apply"}, mode = SaMode.OR) public Result timeLimitConfig(@Param("siteId") String siteId) { if (StrUtil.isBlank(siteId)) { - return Result.success(NutMap.NEW().addv("filterHolidays", false).addv("holidayList", new ArrayList<>()).addv("notApplyTimeList", new ArrayList<>())); + return Result.success(NutMap.NEW().addv("filterHolidays", false).addv("holidayList", new ArrayList<>()).addv("notApplyTimeList", new ArrayList<>()).addv("termStartDate", "").addv("termEndDate", "")); } SiteCugInfo info = infoService.fetch(siteId); if (info == null) { - return Result.success(NutMap.NEW().addv("filterHolidays", false).addv("holidayList", new ArrayList<>()).addv("notApplyTimeList", new ArrayList<>())); + return Result.success(NutMap.NEW().addv("filterHolidays", false).addv("holidayList", new ArrayList<>()).addv("notApplyTimeList", new ArrayList<>()).addv("termStartDate", "").addv("termEndDate", "")); } List holidayList = new ArrayList<>(); if (Boolean.TRUE.equals(info.getFilterHolidays())) { @@ -713,7 +713,9 @@ public class SiteCugApplyController { return Result.success(NutMap.NEW() .addv("filterHolidays", Boolean.TRUE.equals(info.getFilterHolidays())) .addv("holidayList", holidayList) - .addv("notApplyTimeList", info.getNotApplyTimeList() == null ? new ArrayList<>() : info.getNotApplyTimeList())); + .addv("notApplyTimeList", info.getNotApplyTimeList() == null ? new ArrayList<>() : info.getNotApplyTimeList()) + .addv("termStartDate", info.getTermStartDate() != null ? info.getTermStartDate() : "") + .addv("termEndDate", info.getTermEndDate() != null ? info.getTermEndDate() : "")); } private List buildYearlyApplyList(SiteCugApply apply) { diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java index 96be2a49..f0f4c32e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java @@ -73,6 +73,16 @@ public class SiteCugInfo extends BaseModel { @ColDefine(type = ColType.INT) private Integer sexLimit; + @Column + @Comment("本学期开始时间") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String termStartDate; + + @Column + @Comment("本学期结束时间") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String termEndDate; + @Column @Comment("场地的禁用时间") @ColDefine(type = ColType.MYSQL_JSON) diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js index 28cf3b60..f6d1abfa 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js @@ -239,6 +239,12 @@ const basicForm = { + + + + @@ -170,48 +206,62 @@ layout("/layouts/platform.html"){ unionList: [], tableColumns: [ {prop: 'year', label: '年度'}, - {prop: 'quarterly', label: '季度'}, + {prop: 'quarterly', label: '分配项目'}, {prop: 'unionName', label: '工会名称'}, {prop: 'allocateHeadMoney', label: '分配前额度'}, {prop: 'allocateMoney', label: '分配额度'}, ], - quarterlyList: [], + periodList: [], batchAllocateDialogVisible: false, batchAllocateForm: { allocateMode: "uniform", allocateMoney: 0, importPreviewList: [] }, - importFileList: [] + importFileList: [], + awardAllocateDialogVisible: false, + awardAllocateForm: { + year: this.$moment().format("YYYY"), + unionId: "", + allocateMoney: 0 + } } }, methods: { /** - * 确认提示文案优先展示页面当前筛选季度。 - * 未选择季度时再回退到系统当前自然季度,避免提示文案与用户当前查看条件不一致。 + * 确认提示文案优先展示页面当前筛选的分配项目名称。 + * 未选择分配项目时再回退到当前会费项目,避免提示文案与用户当前查看条件不一致。 */ - getPromptQuarter() { - return this.pageForm.quarterly || this.$moment().quarter() + getPromptProjectName() { + return this.getProjectName(this.pageForm.quarterly || this.getCurrentFeeProject()) }, /** - * 季度记录生成、重置记录都要按页面当前筛选的年度和季度执行。 - * 这里统一封装请求参数,避免前后端再次出现“提示季度”和“实际执行季度”不一致的问题。 + * 分配记录生成、重置记录都要按页面当前筛选的年度和分配项目执行。 + * quarterly 参数承载 OUTLAY_QUARTERLY 字典编码,例如 1-4月会费、5-8月会费、9-12月会费、评优奖励。 */ - getCurrentQuarterParams() { + getCurrentProjectParams() { return { - quarterly: this.pageForm.quarterly || this.$moment().quarter(), + quarterly: this.pageForm.quarterly || this.getCurrentFeeProject(), year: this.pageForm.year } }, /** - * 生成、重置、一键分配都只允许操作当前自然季度。 - * 这里统一做前端入口校验,避免同类判断分散在多个按钮方法里难维护。 + * 生成、重置、一键分配都只允许操作当前会费项目。 + * 当前会费项目按月份划分:1-4月会费、5-8月会费、9-12月会费。 */ - validateCurrentQuarterAction(actionName) { - const currentQuarter = this.$moment().quarter() - const selectedQuarter = Number(this.getCurrentQuarterParams().quarterly) - if (selectedQuarter !== currentQuarter) { - this.$message.warning('当前仅允许操作第' + currentQuarter + '季度' + actionName + ',请切换后再操作') + getCurrentFeeProject() { + return Math.floor(this.$moment().month() / 4) + 1 + }, + getProjectName(code) { + const options = this.dict.type.OUTLAY_QUARTERLY || [] + const project = options.find((item) => String(item.code || item.value || item.dictValue) === String(code)) + return project ? (project.label || project.name || project.dictLabel || code) : code + }, + validateCurrentProjectAction(actionName) { + const currentProject = this.getCurrentFeeProject() + const selectedProject = Number(this.getCurrentProjectParams().quarterly) + if (selectedProject !== currentProject) { + this.$message.warning('当前仅允许操作【' + this.getProjectName(currentProject) + '】' + actionName + ',请切换后再操作') return false } return true @@ -237,7 +287,7 @@ layout("/layouts/platform.html"){ }) }, deleteAllocateRecord() { - if (!this.validateCurrentQuarterAction('记录重置')) { + if (!this.validateCurrentProjectAction('记录重置')) { return } // 重置动作以当前列表是否已有记录为前置条件,避免用户在空列表场景下误操作。 @@ -245,13 +295,13 @@ layout("/layouts/platform.html"){ this.$message.warning('当前列表无可重置记录') return } - this.$confirm('确定要重置【第' + this.getPromptQuarter() + '季度】的预算记录吗?', '提示', { + this.$confirm('确定要重置【' + this.getPromptProjectName() + '】的预算记录吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { this.formLoading = true - this.$axios.post("/platform/outlay/outlayManage/unionAllocate/deleteAllocateRecord", this.getCurrentQuarterParams()).then((resp) => { + this.$axios.post("/platform/outlay/outlayManage/unionAllocate/deleteAllocateRecord", this.getCurrentProjectParams()).then((resp) => { if (resp.code === 0) { this.$message.success(resp.msg) this.doSearch() @@ -262,16 +312,16 @@ layout("/layouts/platform.html"){ }) }, doAllocateRecord() { - if (!this.validateCurrentQuarterAction('记录生成')) { + if (!this.validateCurrentProjectAction('记录生成')) { return } - this.$confirm('确定要生成【第' + this.getPromptQuarter() + '季度】的预算记录吗?', '提示', { + this.$confirm('确定要生成【' + this.getPromptProjectName() + '】的预算记录吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { this.formLoading = true - this.$axios.post("/platform/outlay/outlayManage/unionAllocate/doAllocateRecord", this.getCurrentQuarterParams()).then((resp) => { + this.$axios.post("/platform/outlay/outlayManage/unionAllocate/doAllocateRecord", this.getCurrentProjectParams()).then((resp) => { if (resp.code === 0) { this.$message.success(resp.msg) this.doSearch() @@ -282,14 +332,14 @@ layout("/layouts/platform.html"){ }) }, showBatchAllocateDialog() { - if (!this.validateCurrentQuarterAction('一键分配')) { + if (!this.validateCurrentProjectAction('一键分配')) { return } if (this.tableData.length === 0) { - this.$message.warning('当前没有可分配的工会记录,请先生成季度记录') + this.$message.warning('当前没有可分配的工会记录,请先生成分配记录') return } - const currentParams = this.getCurrentQuarterParams() + const currentParams = this.getCurrentProjectParams() const openDialog = () => { this.resetBatchAllocateForm() this.batchAllocateDialogVisible = true @@ -302,7 +352,7 @@ layout("/layouts/platform.html"){ return } if (resp.data) { - this.$confirm('温馨提示:当前季度已分配过额度,再次分配将覆盖本季度原有分配结果,是否继续?', '温馨提示', { + this.$confirm('温馨提示:当前分配项目已分配过额度,再次分配将覆盖本项目原有分配结果,是否继续?', '温馨提示', { confirmButtonText: '继续', cancelButtonText: '取消', type: 'warning' @@ -323,6 +373,46 @@ layout("/layouts/platform.html"){ } this.importFileList = [] }, + showAwardAllocateDialog() { + this.$set(this.awardAllocateForm, "year", this.pageForm.year) + this.$set(this.awardAllocateForm, "unionId", this.pageForm.unionId || "") + this.$set(this.awardAllocateForm, "allocateMoney", 0) + this.$set(this, "awardAllocateDialogVisible", true) + }, + closeAwardAllocateDialog() { + this.$set(this, "awardAllocateDialogVisible", false) + }, + doAddAwardAllocate() { + if (!this.awardAllocateForm.year) { + this.$message.warning("请选择年度") + return + } + if (!this.awardAllocateForm.unionId) { + this.$message.warning("请选择所属工会") + return + } + if (!this.awardAllocateForm.allocateMoney || this.awardAllocateForm.allocateMoney <= 0) { + this.$message.warning("请输入有效的评优奖励金额") + return + } + this.formLoading = true + this.$axios.post("/platform/outlay/outlayManage/unionAllocate/doAddAwardAllocate", { + year: this.awardAllocateForm.year, + unionId: this.awardAllocateForm.unionId, + allocateMoney: this.awardAllocateForm.allocateMoney + }).then((resp) => { + if (resp.code === 0) { + this.$message.success(resp.msg) + this.closeAwardAllocateDialog() + this.$set(this.pageForm, "year", this.awardAllocateForm.year) + this.$set(this.pageForm, "quarterly", "4") + this.$set(this.pageForm, "unionId", this.awardAllocateForm.unionId) + this.doSearch() + } + }).finally(() => { + this.formLoading = false + }) + }, downloadImportTemplate() { this.$downLoad("/platform/outlay/outlayManage/unionAllocate/downloadImportTemplate") }, @@ -349,7 +439,7 @@ layout("/layouts/platform.html"){ this.$set(this.batchAllocateForm, "importPreviewList", []) }, doBatchAllocate() { - const currentParams = this.getCurrentQuarterParams() + const currentParams = this.getCurrentProjectParams() if (this.batchAllocateForm.allocateMode === "uniform") { if (!this.batchAllocateForm.allocateMoney || this.batchAllocateForm.allocateMoney <= 0) { this.$message.warning('请输入有效的分配额度') @@ -401,8 +491,8 @@ layout("/layouts/platform.html"){ this.unionList = data }) this.$businessTool.getDictOptions("OUTLAY_QUARTERLY").then((data) => { - let quarter = this.$moment().quarter(); - this.$set(this.pageForm, "quarterly", data[quarter - 1].code) + let project = this.getCurrentFeeProject(); + this.$set(this.pageForm, "quarterly", data[project - 1].code) this.pageData() }) diff --git a/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/incomeExpense/index.html b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/incomeExpense/index.html new file mode 100644 index 00000000..11cd4393 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/incomeExpense/index.html @@ -0,0 +1,163 @@ + + + +
+ + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/quarterlyOutlayAllocate.js b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/quarterlyOutlayAllocate.js index 98a5a2ac..4d5d5226 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/quarterlyOutlayAllocate.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/outlay/outlayManage/union/useDetail/quarterlyOutlayAllocate.js @@ -4,10 +4,10 @@ let OUTLAY_MANAGE_UNION_QUARTERLY_ALLOCATE = { `