diff --git a/src/main/java/com/budwk/app/sys/controller/SysConfController.java b/src/main/java/com/budwk/app/sys/controller/SysConfController.java index 53847c45..d6a0e76e 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysConfController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysConfController.java @@ -103,6 +103,7 @@ public class SysConfController { private void ensureConfigValueColumn(Sys_config conf) { if (conf == null || (!"AppHomeImg".equals(conf.getConfigKey()) + && !"H5AppHomeImg".equals(conf.getConfigKey()) && !"AppFeaturedActivityImg".equals(conf.getConfigKey()) && !"AppFestivalBenefitImg".equals(conf.getConfigKey()))) { return; @@ -140,6 +141,8 @@ public class SysConfController { @SaCheckPermission("sys.manager.conf") public Object data(@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName, @Param("pageOrderBy") String pageOrderBy) { try { + ensureAppImageConfig("AppHomeImg", "PC首页轮播图"); + ensureAppImageConfig("H5AppHomeImg", "移动端首页轮播图"); ensureAppImageConfig("AppFeaturedActivityImg", "精彩活动页顶部图片"); ensureAppImageConfig("AppFestivalBenefitImg", "节日福利页顶部图片"); Cnd cnd = Cnd.NEW(); diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java index 64e7f963..cb32dd56 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -273,7 +273,7 @@ public class SysHomeController { } FieldFilter fieldFilter = FieldFilter.locked(Sys_home_template.class, "allowUserSql|classPath"); List list = Daos.ext(dao, fieldFilter).query(Sys_home_template.class, - Cnd.NEW().desc("top").desc("sortNo")); + Cnd.where("enable", "=", 1).asc("sortNo")); return Result.success(list); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java index c058ff3d..403c0e1a 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java @@ -167,7 +167,8 @@ public class SysUnionController { cnd.asc("gh.unionCode"); cnd.groupBy("gh.id"); - if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { + boolean schoolUnionAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + if (!schoolUnionAdmin && AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) { cnd.and("gh.id", "=", SecurityUtil.getUnionId()); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java b/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java index 12058174..9d5e7675 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java @@ -39,7 +39,7 @@ public class SysWorkTemplateController { public Result pageData(@Valid SysHomeTemplatePageForm pageForm) { Cnd cnd = Cnd.NEW(); cnd.and(Cnd.likeEX(Sys_home_template::getName, pageForm.getName())); - cnd.desc(Sys_home_template::getSortNo); + cnd.asc(Sys_home_template::getSortNo); Pagination pagination = sysHomeTemplateService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); return Result.success(pagination); } @@ -82,6 +82,28 @@ public class SysWorkTemplateController { return Result.success(); } + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("修改模板文件") + public Result updateTemplateFile(@Valid String id, String templateFile) { + if (StrUtil.isBlank(id)) { + return Result.error("参数错误"); + } + sysHomeTemplateService.update(Chain.make("templateFile", templateFile), Cnd.where("id", "=", id)); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("修改排序") + public Result updateSortNo(@Valid String id, Integer sortNo) { + if (StrUtil.isBlank(id)) { + return Result.error("参数错误"); + } + sysHomeTemplateService.update(Chain.make("sortNo", sortNo == null ? 0 : sortNo), Cnd.where("id", "=", id)); + return Result.success(); + } + @At @SaCheckPermission("sys.worktemplate") @ApiOperation("置顶") diff --git a/src/main/java/com/budwk/app/sys/models/Sys_home_template.java b/src/main/java/com/budwk/app/sys/models/Sys_home_template.java index d59b8553..8938b63b 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_home_template.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_home_template.java @@ -33,6 +33,11 @@ public class Sys_home_template extends BaseModel { @Comment("模板图标") private String templateIcon; + @Column + @ColDefine(type = ColType.VARCHAR, width = 1000) + @Comment("模板文件") + private String templateFile; + @Column @ColDefine(type = ColType.VARCHAR, width = 255) @Comment("模板封面") 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 e1bc6bc4..63a91406 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 @@ -309,9 +309,9 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys String decodePwd = Base64Decoder.decodeStr(passowrd); String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { -// if (Globals.sso){ + if (Globals.sso) { throw new BaseException("用户名或者密码不正确"); -// } + } } user = this.fetchLinks(user, "unit"); if (Lang.isNotEmpty(user.getUnit()) && StrUtil.isNotBlank(user.getUnit().getUnionId())) { diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java index b5101ffe..d9d212be 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureApplyActivityController.java @@ -110,12 +110,17 @@ public class ActivityCultureApplyActivityController { tissue.setUserId(SecurityUtil.getUserId()); tissue.setApplyTime(DateUtil.now()); if (StrUtil.isBlank(tissue.getId())){ + cleanNewActivityData(tissue); activityCultureService.insertWith(tissue, "tissuePersonList"); }else{ - tissue.getTissuePersonList().forEach(tissuePerson -> tissuePerson.setTissueId(tissue.getId())); + if (tissue.getTissuePersonList() != null) { + tissue.getTissuePersonList().forEach(tissuePerson -> tissuePerson.setTissueId(tissue.getId())); + } activityCultureService.insertOrUpdate(tissue); activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", tissue.getId())); - activityCultureService.insert(tissue.getTissuePersonList()); + if (tissue.getTissuePersonList() != null) { + activityCultureService.insert(tissue.getTissuePersonList()); + } } return Result.success(); @@ -132,7 +137,12 @@ public class ActivityCultureApplyActivityController { } tissue.setUserId(SecurityUtil.getUserId()); tissue.setApplyTime(DateUtil.now()); - activityCultureService.insertOrUpdate(tissue); + if (StrUtil.isBlank(tissue.getId())) { + cleanNewActivityData(tissue); + activityCultureService.insertWith(tissue, "tissuePersonList"); + } else { + activityCultureService.insertOrUpdate(tissue); + } if (List.of(40002, 40003).contains(tissue.getActivity_type()) && tissue.getIsEnrollSystem()) { // 开启流程实例 @@ -185,6 +195,36 @@ public class ActivityCultureApplyActivityController { return Result.success(); } + private void cleanNewActivityData(ActivityTissue tissue) { + tissue.setId(null); + tissue.setAuditId(null); + tissue.setState(null); + tissue.setCreatedBy(null); + tissue.setCreatedAt(null); + tissue.setUpdatedBy(null); + tissue.setUpdatedAt(null); + tissue.setDelFlag(null); + if (tissue.getTissuePersonList() == null) { + return; + } + tissue.getTissuePersonList().forEach(this::cleanNewActivityPersonData); + } + + private void cleanNewActivityPersonData(ActivityTissuePerson tissuePerson) { + tissuePerson.setId(null); + tissuePerson.setTissueId(null); + tissuePerson.setSignId(null); + tissuePerson.setSign(false); + tissuePerson.setSignTime(null); + tissuePerson.setApplyDateTime(null); + tissuePerson.setDynamicFormData(null); + tissuePerson.setCreatedBy(null); + tissuePerson.setCreatedAt(null); + tissuePerson.setUpdatedBy(null); + tissuePerson.setUpdatedAt(null); + tissuePerson.setDelFlag(null); + } + @At @SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR) public Result findUser(String serachWord, diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java index 00bd1a7e..72c2b436 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureInfoManageController.java @@ -115,6 +115,9 @@ public class ActivityCultureInfoManageController { if (oldHomeTemplate.getTemplateIcon() != null) { sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } } activityCultureService.dao().insertOrUpdate(sysHomeTemplate); return Result.success(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java index b77320b8..3375b394 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyActivityController.java @@ -1,12 +1,17 @@ package com.budwk.app.zhgh.activity.family.controller.manage; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.activity.family.models.*; import com.budwk.app.zhgh.activity.family.service.FamilyActivityService; @@ -68,7 +73,57 @@ public class FamilyActivityController { cnd.andEX("year", "=", year); cnd.and(Cnd.likeEX("activityName", activityName)); cnd.orderBy("createdAt", "desc"); - return Result.success().addData(familyActivityManageService.pageData(pageForm, cnd)); + Pagination pagination = familyActivityManageService.pageData(pageForm, cnd); + List list = pagination.getList(FamilyActivity.class); + if (list != null && !list.isEmpty()) { + List ids = list.stream().map(FamilyActivity::getId).toList(); + List templateList = dao.query(Sys_home_template.class, Cnd.where("id", "in", ids)); + List templateIds = templateList.stream().map(Sys_home_template::getId).toList(); + list.forEach(activity -> activity.setIsTemplate(templateIds.contains(activity.getId()))); + } + return Result.success().addData(pagination); + } + + @At + @ApiOperation("设为模板") + @SaCheckPermission("family.manage") + public Result setTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + FamilyActivity activity = familyActivityManageService.fetch(id); + if (activity == null) { + return Result.error("活动不存在"); + } + Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = activity.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao.insertOrUpdate(sysHomeTemplate); + return Result.success(); + } + + @At + @ApiOperation("取消模板") + @SaCheckPermission("family.manage") + public Result cancelTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + dao.delete(Sys_home_template.class, id); + return Result.success(); } @At @@ -76,6 +131,9 @@ public class FamilyActivityController { @SaCheckPermission("family.manage") @SLog(tag = "亲子活动-活动管理", msg = "删除活动") public Result onDelete(String id) { + if (dao.fetch(Sys_home_template.class, id) != null) { + return Result.error("该活动已设为模板,请先取消模板后再删除"); + } Trans.exec(() -> { familyActivityManageService.delete(id); dao.clear(FamilyCourse.class, Cnd.where("activityId", "=", id)); @@ -102,7 +160,7 @@ public class FamilyActivityController { @At @ApiOperation("查询单个活动") - @SaCheckPermission("family") + @SaCheckPermission(value = {"family", "family.manage", "family.newcativity"}, mode = SaMode.OR) public Result findOne(@Param("id") @NotNull String id) { NutMap dataMap = familyActivityManageService.findOne(id, null, ""); String activityStartTime = dataMap.getString("activityStartTime"); @@ -150,10 +208,11 @@ public class FamilyActivityController { @At @Ok("json:full") @ApiOperation("亲子活动新增/修改") - @SaCheckPermission("family.manage") + @SaCheckPermission(value = {"family.manage", "family.newcativity"}, mode = SaMode.OR) @SLog(tag = "亲子活动-活动管理", msg = "新增/修改活动") public Result doHandle(FamilyActivity activity) { if (StrUtil.isBlank(activity.getId())) { + cleanNewActivityData(activity); familyActivityManageService.add(activity, null); } else { familyActivityManageService.edit(activity); @@ -161,10 +220,67 @@ public class FamilyActivityController { return Result.success(); } + private void cleanNewActivityData(FamilyActivity activity) { + if (activity == null) { + return; + } + activity.setId(null); + activity.setIsTemplate(false); + activity.setCreatedBy(null); + activity.setCreatedAt(null); + activity.setUpdatedBy(null); + activity.setUpdatedAt(null); + activity.setDelFlag(null); + if (activity.getTypeLimits() != null) { + activity.getTypeLimits().forEach(this::cleanNewTypeLimitData); + } + if (activity.getCourseList() != null) { + activity.getCourseList().forEach(this::cleanNewCourseData); + } + } + + private void cleanNewTypeLimitData(FamilyTypeLimit typeLimit) { + if (typeLimit == null) { + return; + } + typeLimit.setId(null); + typeLimit.setActivityId(null); + } + + private void cleanNewCourseData(FamilyCourse course) { + if (course == null) { + return; + } + course.setId(null); + course.setActivityId(null); + course.setCreatedBy(null); + course.setCreatedAt(null); + course.setUpdatedBy(null); + course.setUpdatedAt(null); + course.setDelFlag(null); + course.setHasRegisterNum(null); + course.setHasWaitingNum(null); + course.setIsSign(false); + course.setCanSignThisCourseType(null); + if (course.getCourseTimeList() != null) { + course.getCourseTimeList().forEach(this::cleanNewCourseTimeData); + } + } + + private void cleanNewCourseTimeData(FamilyActivityCourse courseTime) { + if (courseTime == null) { + return; + } + courseTime.setId(null); + courseTime.setActivityId(null); + courseTime.setCourseId(null); + courseTime.setHasRegisterNum(null); + } + @At @Ok("json:full") @ApiOperation("获取分工会人数限制") - @SaCheckPermission("family.manage") + @SaCheckPermission(value = {"family.manage", "family.newcativity"}, mode = SaMode.OR) public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) { Sql sql = Sqls.create(""" SELECT @@ -188,7 +304,7 @@ public class FamilyActivityController { @At @Ok("json:full") @ApiOperation("获取报名人员数量") - @SaCheckPermission("family.manage") + @SaCheckPermission(value = {"family.manage", "family.newcativity"}, mode = SaMode.OR) public Result getRegisterUserCount(@Param(value = "courseId") String courseId) { return Result.success().addData(dao.count(FamilyUser.class, Cnd.where("courseId", "=", courseId))); } @@ -196,7 +312,7 @@ public class FamilyActivityController { @At @Ok("json:full") @ApiOperation("获取历史活动列表") - @SaCheckPermission("family.manage") + @SaCheckPermission(value = {"family.manage", "family.newcativity"}, mode = SaMode.OR) public Result getHistoricalActList() { List query = dao.query(FamilyActivity.class, Cnd.NEW().desc("activityStartTime")); return Result.success().addData(query); diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyNewActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyNewActivityController.java new file mode 100644 index 00000000..78ab1534 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/family/controller/manage/FamilyNewActivityController.java @@ -0,0 +1,18 @@ +package com.budwk.app.zhgh.activity.family.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/family/newcativity") +public class FamilyNewActivityController { + + @At("") + @SaCheckPermission(value = {"family.manage", "family.newcativity"}, mode = SaMode.OR) + @Ok("beetl:/platform/zhgh/activity/family/newcativity/index.html") + public void index() { + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java index 017b7240..9410d729 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/family/models/FamilyActivity.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.family.models; import com.budwk.app.base.model.BaseModel; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.sys.services.SysHomeConvert; import lombok.Data; import lombok.EqualsAndHashCode; @@ -111,6 +112,8 @@ public class FamilyActivity extends BaseModel implements Serializable, SysHomeCo @Many(field = "activityId") private List typeLimits; + private Boolean isTemplate; + @Column @Comment("活动类型") @ColDefine(type = ColType.VARCHAR, width = 20) @@ -159,4 +162,23 @@ public class FamilyActivity extends BaseModel implements Serializable, SysHomeCo sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); return sysHomeActivity; } + + public Sys_home_template covertToSysHomeTemplate() { + Sys_home_template sysHomeTemplate = new Sys_home_template(); + sysHomeTemplate.setId(this.getId()); + sysHomeTemplate.setName(this.getActivityName()); + sysHomeTemplate.setTemplateName(this.getActivityName()); + sysHomeTemplate.setCover(this.getCover()); + sysHomeTemplate.setContent(this.getIntroduce()); + sysHomeTemplate.setUrl("/platform/family/newcativity?mode=edit&id=" + this.getId()); + sysHomeTemplate.setH5Url(""); + if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) { + sysHomeTemplate.setStartDate(this.getActivitySignUpStartTime()); + sysHomeTemplate.setEndDate(this.getActivitySignUpEndTime()); + } + sysHomeTemplate.setAllowUserGroupId(this.getActivityGroupId()); + sysHomeTemplate.setEnable(!this.isDisabled()); + sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeTemplate; + } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java index 694761a3..fb631300 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsInfoManageController.java @@ -8,6 +8,7 @@ import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; @@ -90,11 +91,13 @@ public class ActivitySportsInfoManageController { school.activityCode, school.foundDate, school.applyType, + IF(sht.id IS NULL, 0, 1) isTemplate, (SELECT COUNT(1) FROM activity_school_apply asa WHERE asa.activityId = school.id and status=2) applyNum FROM activity_school school LEFT JOIN activity_basic_settings ba ON ba.`code` = school.activityLevel LEFT JOIN sys_union un ON un.id = school.belongUnionId + LEFT JOIN sys_home_template sht ON sht.id = school.id $condition """); @@ -131,6 +134,48 @@ public class ActivitySportsInfoManageController { return Result.success(pagination); } + @At + @ApiOperation("设置为模板") + @SaCheckPermission("activity.sports.info") + public Result setTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + ActivitySchool activitySchool = activitySportsService.fetch(id); + if (activitySchool == null) { + return Result.error("活动不存在"); + } + Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = activitySchool.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao.insertOrUpdate(sysHomeTemplate); + return Result.success(); + } + + @At + @ApiOperation("取消模板") + @SaCheckPermission("activity.sports.info") + public Result cancelTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + dao.delete(Sys_home_template.class, id); + return Result.success(); + } + @At @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) @@ -168,12 +213,41 @@ public class ActivitySportsInfoManageController { @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Result doAdd(@Param(value = "data") ActivitySchool activitySchool, @Param(value = "events") ActivitySchoolEvent[] events) { + cleanNewActivityData(activitySchool, events); String id = activitySportsService.doAdd(activitySchool, events); return Result.success().addData(id); } + private void cleanNewActivityData(ActivitySchool activitySchool, ActivitySchoolEvent[] events) { + if (activitySchool != null) { + activitySchool.setId(null); + activitySchool.setFoundDate(null); + activitySchool.setCreatedBy(null); + activitySchool.setCreatedAt(null); + activitySchool.setUpdatedBy(null); + activitySchool.setUpdatedAt(null); + activitySchool.setDelFlag(null); + } + if (events != null) { + for (ActivitySchoolEvent event : events) { + if (event == null) { + continue; + } + if (!"allItems".equals(event.getId())) { + event.setId(null); + } + event.setActivityId(null); + event.setCreatedBy(null); + event.setCreatedAt(null); + event.setUpdatedBy(null); + event.setUpdatedAt(null); + event.setDelFlag(null); + } + } + } + @At @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Result findOne(String id) { @@ -198,6 +272,9 @@ public class ActivitySportsInfoManageController { @SLog(tag = "体育活动", msg = "删除活动") @SaCheckPermission("activity.sports.info") public Result doDelete(String id) { + if (dao.fetch(Sys_home_template.class, id) != null) { + return Result.error("该活动已设为模板,请先取消模板后再删除"); + } activitySportsService.doDelete(id); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java index e576d77b..b9143e94 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/models/ActivitySchool.java @@ -3,10 +3,12 @@ package com.budwk.app.zhgh.activity.sports.models; import cn.hutool.core.date.DateUtil; import com.budwk.app.base.model.BaseModel; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.sys.services.SysHomeConvert; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; +import org.nutz.lang.Lang; import java.io.Serializable; import java.util.List; @@ -213,4 +215,23 @@ public class ActivitySchool extends BaseModel implements Serializable , SysHomeC sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); return sysHomeActivity; } + + public Sys_home_template covertToSysHomeTemplate() { + Sys_home_template sysHomeTemplate = new Sys_home_template(); + sysHomeTemplate.setId(this.getId()); + sysHomeTemplate.setName(this.getName()); + sysHomeTemplate.setTemplateName(this.getName()); + sysHomeTemplate.setCover(this.getImage()); + sysHomeTemplate.setContent(Lang.isNotEmpty(this.getEventNotification()) ? this.getEventNotification() : this.getPrecautions()); + sysHomeTemplate.setUrl("/platform/activity/sports/new?mode=edit&id=" + this.getId() + (this.getApplyType() == null ? "" : "&applyType=" + this.getApplyType())); + sysHomeTemplate.setH5Url(""); + if (Lang.isNotEmpty(this.getApplyStartTime())) { + sysHomeTemplate.setStartDate(DateUtil.parseDate(this.getApplyStartTime())); + sysHomeTemplate.setEndDate(DateUtil.parseDate(this.getApplyEndTime())); + } + sysHomeTemplate.setAllowUserGroupId(this.getActivityGroupId()); + sysHomeTemplate.setEnable(!Boolean.TRUE.equals(this.getClose())); + sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeTemplate; + } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java index 9354203f..c67fba16 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java @@ -111,6 +111,9 @@ public class TrainSignUpManageController { if (oldHomeTemplate.getTemplateIcon() != null) { sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } } dao.insertOrUpdate(sysHomeTemplate); return Result.success(); @@ -213,6 +216,7 @@ public class TrainSignUpManageController { @SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动") public Result doHandle(TrainSignUpActivity activity) { if (StrUtil.isBlank(activity.getId())) { + cleanNewActivityData(activity); trainSignUpActivityManageService.add(activity, null); } else { trainSignUpActivityManageService.edit(activity); @@ -220,6 +224,63 @@ public class TrainSignUpManageController { return Result.success(); } + private void cleanNewActivityData(TrainSignUpActivity activity) { + if (activity == null) { + return; + } + activity.setId(null); + activity.setIsTemplate(false); + activity.setCreatedBy(null); + activity.setCreatedAt(null); + activity.setUpdatedBy(null); + activity.setUpdatedAt(null); + activity.setDelFlag(null); + if (activity.getTypeLimits() != null) { + activity.getTypeLimits().forEach(this::cleanNewTypeLimitData); + } + if (activity.getCourseList() != null) { + activity.getCourseList().forEach(this::cleanNewCourseData); + } + } + + private void cleanNewTypeLimitData(TrainSignUpTypeLimit typeLimit) { + if (typeLimit == null) { + return; + } + typeLimit.setId(null); + typeLimit.setActivityId(null); + } + + private void cleanNewCourseData(TrainSignUpCourse course) { + if (course == null) { + return; + } + course.setId(null); + course.setActivityId(null); + course.setCreatedBy(null); + course.setCreatedAt(null); + course.setUpdatedBy(null); + course.setUpdatedAt(null); + course.setDelFlag(null); + course.setHasRegisterNum(null); + course.setHasWaitingNum(null); + course.setIsSign(false); + course.setCanSignThisCourseType(null); + if (course.getCourseTimeList() != null) { + course.getCourseTimeList().forEach(this::cleanNewCourseTimeData); + } + } + + private void cleanNewCourseTimeData(TrainSignUpActivityCourse courseTime) { + if (courseTime == null) { + return; + } + courseTime.setId(null); + courseTime.setActivityId(null); + courseTime.setCourseId(null); + courseTime.setHasRegisterNum(null); + } + @At @Ok("json:full") @ApiOperation("获取分工会人数限制") @@ -267,13 +328,10 @@ public class TrainSignUpManageController { @SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR) public Result selectUnitAndClub() { List result = new ArrayList<>(); - List unitList = dao.query(Sys_unit.class, Cnd.NEW().asc(Sys_unit::getUnitcode)); + java.util.Set optionKeys = new java.util.HashSet<>(); + List unitList = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitLevel, "=", 2).asc(Sys_unit::getUnitcode)); for (Sys_unit unit : unitList) { - NutMap map = new NutMap(); - map.put("id", unit.getId()); - map.put("name", unit.getName()); - map.put("type", "unit"); - result.add(map); + addSelectOption(result, optionKeys, unit.getId(), unit.getName(), "unit"); } List clubList = dao.query(SysClub.class, Cnd.NEW().asc(SysClub::getClubCode)); @@ -286,12 +344,23 @@ public class TrainSignUpManageController { List passClubList = clubList.stream().filter(o -> passList.contains(o.getId())).toList(); for (SysClub sysClub : passClubList) { - NutMap map = new NutMap(); - map.put("id", sysClub.getId()); - map.put("name", sysClub.getClubName()); - map.put("type", "club"); - result.add(map); + addSelectOption(result, optionKeys, sysClub.getId(), sysClub.getClubName(), "club"); } return Result.success(result); } + + private void addSelectOption(List result, java.util.Set optionKeys, String id, String name, String type) { + if (StrUtil.isBlank(id) || StrUtil.isBlank(name)) { + return; + } + String key = type + ":" + name; + if (!optionKeys.add(key)) { + return; + } + NutMap map = new NutMap(); + map.put("id", id); + map.put("name", name); + map.put("type", type); + result.add(map); + } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionManageController.java b/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionManageController.java index 2b4885b2..399b6989 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionManageController.java @@ -1,17 +1,21 @@ package com.budwk.app.zhgh.activity.workscollection.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.sys.services.SysMsgService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.activity.workscollection.models.Activity_works_collection; @@ -63,11 +67,18 @@ public class ActivityWorksCollectionManageController { public Result pageData(@Valid PageForm pageForm, Long year) { Sql sql = Sqls.create(""" select - wc.*, + wc.id, + wc.name, + wc.createdAt, + wc.startDateTime, + wc.endDateTime, + wc.enable, + IF(sht.id IS NULL, 0, 1) isTemplate, u.username as userName from activity_works_collection wc LEFT JOIN vw_user u on u.id = wc.createdBy + LEFT JOIN sys_home_template sht ON sht.id = wc.id $condition """); Cnd cnd = Cnd.NEW(); @@ -82,8 +93,49 @@ public class ActivityWorksCollectionManageController { @At @SaCheckPermission("activity.workscollection.manage") + public Result setTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + Activity_works_collection worksCollection = dao.fetch(Activity_works_collection.class, id); + if (worksCollection == null) { + return Result.error("活动不存在"); + } + Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = worksCollection.covertToSysHomeTemplate(); + if (oldHomeTemplate != null) { + sysHomeTemplate.setTop(oldHomeTemplate.getTop()); + sysHomeTemplate.setPush(oldHomeTemplate.getPush()); + sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo()); + if (oldHomeTemplate.getTemplateName() != null) { + sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName()); + } + if (oldHomeTemplate.getTemplateIcon() != null) { + sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon()); + } + if (oldHomeTemplate.getTemplateFile() != null) { + sysHomeTemplate.setTemplateFile(oldHomeTemplate.getTemplateFile()); + } + } + dao.insertOrUpdate(sysHomeTemplate); + return Result.success(); + } + + @At + @SaCheckPermission("activity.workscollection.manage") + public Result cancelTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + dao.delete(Sys_home_template.class, id); + return Result.success(); + } + + @At + @SaCheckPermission(value = {"activity.workscollection.manage", "activity.workscollection.new"}, mode = SaMode.OR) @Aop(TransAop.READ_COMMITTED) public Result insert(@Param("data") @Valid Activity_works_collection worksCollection) { + cleanNewActivityData(worksCollection); worksCollection.setIsSubmit(true); dao.insertWith(worksCollection, "subjectTypes"); worksCollection.getSubjectTypes().forEach(item -> { @@ -94,9 +146,10 @@ public class ActivityWorksCollectionManageController { } @At - @SaCheckPermission("activity.workscollection.manage") + @SaCheckPermission(value = {"activity.workscollection.manage", "activity.workscollection.new"}, mode = SaMode.OR) @Aop(TransAop.READ_COMMITTED) public Result save(@Param("data") @Valid Activity_works_collection worksCollection) { + cleanNewActivityData(worksCollection); worksCollection.setIsSubmit(false); dao.insertWith(worksCollection, "subjectTypes"); worksCollection.getSubjectTypes().forEach(item -> { @@ -105,8 +158,48 @@ public class ActivityWorksCollectionManageController { return Result.success(); } + private void cleanNewActivityData(Activity_works_collection worksCollection) { + if (worksCollection == null) { + return; + } + worksCollection.setId(null); + worksCollection.setCreatedBy(null); + worksCollection.setCreatedAt(null); + worksCollection.setUpdatedBy(null); + worksCollection.setUpdatedAt(null); + worksCollection.setDelFlag(null); + if (worksCollection.getSubjectTypes() != null) { + worksCollection.getSubjectTypes().forEach(subjectType -> { + if (subjectType == null) { + return; + } + subjectType.setId(null); + subjectType.setActivityId(null); + subjectType.setCreatedBy(null); + subjectType.setCreatedAt(null); + subjectType.setUpdatedBy(null); + subjectType.setUpdatedAt(null); + subjectType.setDelFlag(null); + if (subjectType.getWorksTypes() != null) { + subjectType.getWorksTypes().forEach(worksType -> { + if (worksType == null) { + return; + } + worksType.setId(null); + worksType.setSubjectId(null); + worksType.setCreatedBy(null); + worksType.setCreatedAt(null); + worksType.setUpdatedBy(null); + worksType.setUpdatedAt(null); + worksType.setDelFlag(null); + }); + } + }); + } + } + @At - @SaCheckPermission("activity.workscollection.manage") + @SaCheckPermission(value = {"activity.workscollection.manage", "activity.workscollection.new"}, mode = SaMode.OR) @Aop(TransAop.READ_COMMITTED) public Result update(@Param("data") @Valid Activity_works_collection worksCollection) { dao.update(worksCollection); @@ -134,6 +227,9 @@ public class ActivityWorksCollectionManageController { @SaCheckPermission("activity.workscollection.manage") @Aop(TransAop.READ_COMMITTED) public Result delete(@Valid String id) { + if (dao.fetch(Sys_home_template.class, id) != null) { + return Result.error("该活动已设为模板,请先取消模板后再删除"); + } dao.delete(Activity_works_collection.class, id); dao.clear(Activity_works_collection_upload.class, Cnd.where(Activity_works_collection_upload::getActivityId, "=", id)); dao.clear(Activity_works_subjectType.class, Cnd.where(Activity_works_subjectType::getActivityId, "=", id)); @@ -142,7 +238,7 @@ public class ActivityWorksCollectionManageController { } @At - @SaCheckPermission("activity.workscollection.manage") + @SaCheckPermission(value = {"activity.workscollection.manage", "activity.workscollection.new"}, mode = SaMode.OR) public Result findOne(@Valid String id) { Activity_works_collection worksCollection = dao.fetch(Activity_works_collection.class, id); dao.fetchLinks(worksCollection, "subjectTypes"); diff --git a/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionNewController.java b/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionNewController.java new file mode 100644 index 00000000..eba3d64d --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/workscollection/controller/ActivityWorksCollectionNewController.java @@ -0,0 +1,18 @@ +package com.budwk.app.zhgh.activity.workscollection.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/activity/worksCollection/new") +public class ActivityWorksCollectionNewController { + + @At("") + @Ok("beetl:/platform/zhgh/activity/workscollection/manage/index.html") + @SaCheckPermission(value = {"activity.workscollection.manage", "activity.workscollection.new"}, mode = SaMode.OR) + public void index() { + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java b/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java index b3e50ca9..e4c7a496 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java +++ b/src/main/java/com/budwk/app/zhgh/activity/workscollection/models/Activity_works_collection.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.workscollection.models; import com.budwk.app.base.model.BaseModel; import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.models.Sys_home_template; import com.budwk.app.sys.services.SysHomeConvert; import lombok.Data; import lombok.EqualsAndHashCode; @@ -142,4 +143,21 @@ public class Activity_works_collection extends BaseModel implements SysHomeConve return sysHomeActivity; } + public Sys_home_template covertToSysHomeTemplate() { + Sys_home_template sysHomeTemplate = new Sys_home_template(); + sysHomeTemplate.setId(this.getId()); + sysHomeTemplate.setName(this.getName()); + sysHomeTemplate.setTemplateName(this.getName()); + sysHomeTemplate.setCover(this.getCover()); + sysHomeTemplate.setContent(this.getContent()); + sysHomeTemplate.setUrl("/platform/activity/worksCollection/new?mode=edit&id=" + this.getId()); + sysHomeTemplate.setH5Url(""); + sysHomeTemplate.setStartDate(this.getStartDateTime()); + sysHomeTemplate.setEndDate(this.getEndDateTime()); + sysHomeTemplate.setAllowUserGroupId(this.getActivityGroupId()); + sysHomeTemplate.setEnable(Boolean.TRUE.equals(this.getEnable())); + sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeTemplate; + } + } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareProjectSubjectOption.java b/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareProjectSubjectOption.java index 5729804c..af75f2ee 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareProjectSubjectOption.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/model/WelfareProjectSubjectOption.java @@ -104,4 +104,8 @@ public class WelfareProjectSubjectOption extends BaseModel implements Serializab @Comment("简短备注") @ColDefine(type = ColType.VARCHAR,width = 100) private String simpleDesc; + + private Integer selectedTotal; + + private Integer rankNo; } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java index 25f57345..ce5eb504 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java @@ -41,10 +41,45 @@ public class WelfareProjectServiceImpl extends BaseServiceImpl i @Override public WelfareProject projectInfo(String projectId) { WelfareProject project = fetch(projectId); + if (project == null) { + return null; + } fetchLinks(project, "options", Cnd.NEW().asc("optionSort")); + fillOptionRank(projectId, project.getOptions()); return project; } + private void fillOptionRank(String projectId, List options) { + if (options == null || options.isEmpty()) { + return; + } + Sql sql = Sqls.create(""" + SELECT + selectOptionId, + SUM(IFNULL(selectNum, 0)) AS selectedTotal + FROM welfare_project_user_selection + WHERE welfareId = @projectId + AND selectOptionId IS NOT NULL + GROUP BY selectOptionId + """); + sql.setParam("projectId", projectId); + Map selectedTotalMap = listMap(sql).stream() + .collect(Collectors.toMap( + item -> item.getString("selectOptionId"), + item -> item.getInt("selectedTotal", 0), + Integer::sum + )); + + options.forEach(option -> option.setSelectedTotal(selectedTotalMap.getOrDefault(option.getId(), 0))); + List rankOptions = new ArrayList<>(options); + rankOptions.sort(Comparator + .comparing((WelfareProjectSubjectOption option) -> option.getSelectedTotal() == null ? 0 : option.getSelectedTotal()).reversed() + .thenComparing(option -> option.getOptionSort() == null ? Integer.MAX_VALUE : option.getOptionSort())); + for (int i = 0; i < rankOptions.size(); i++) { + rankOptions.get(i).setRankNo(i + 1); + } + } + @Override @Aop(TransAop.READ_COMMITTED) public void saveProject(WelfareProject project) { diff --git a/src/main/resources/db/sys_home_template_add_template_file.sql b/src/main/resources/db/sys_home_template_add_template_file.sql new file mode 100644 index 00000000..cdaa5e5f --- /dev/null +++ b/src/main/resources/db/sys_home_template_add_template_file.sql @@ -0,0 +1,2 @@ +ALTER TABLE `sys_home_template` + ADD COLUMN `templateFile` varchar(1000) DEFAULT NULL COMMENT 'template file' AFTER `templateIcon`; diff --git a/src/main/resources/db/sys_home_template_create.sql b/src/main/resources/db/sys_home_template_create.sql index 32654ae4..67e419ad 100644 --- a/src/main/resources/db/sys_home_template_create.sql +++ b/src/main/resources/db/sys_home_template_create.sql @@ -3,6 +3,7 @@ CREATE TABLE IF NOT EXISTS `sys_home_template` ( `name` varchar(50) DEFAULT NULL COMMENT 'template name', `templateName` varchar(50) DEFAULT NULL COMMENT 'display template name', `templateIcon` varchar(255) DEFAULT NULL COMMENT 'template icon', + `templateFile` varchar(1000) DEFAULT NULL COMMENT 'template file', `cover` varchar(255) DEFAULT NULL COMMENT 'template cover', `content` text COMMENT 'template content', `url` varchar(1000) DEFAULT NULL COMMENT 'pc url', diff --git a/src/main/resources/views/layouts/platform_tour_signup_h5.html b/src/main/resources/views/layouts/platform_tour_signup_h5.html index 972edb07..8e8ccb5c 100644 --- a/src/main/resources/views/layouts/platform_tour_signup_h5.html +++ b/src/main/resources/views/layouts/platform_tour_signup_h5.html @@ -123,11 +123,17 @@ } } - function historyBack(func) { + function historyBack(fallbackUrl, func) { + if (typeof fallbackUrl === "function") { + func = fallbackUrl + fallbackUrl = "/platform/h5/home" + } else if (typeof fallbackUrl !== "string" || !fallbackUrl) { + fallbackUrl = "/platform/h5/home" + } if (window.history.length > 1) { window.history.back() } else { - window.location.href = "/platform/h5/home" + window.location.replace(fallbackUrl) } func && typeof func === "function" && func() } @@ -139,8 +145,8 @@ Vue.mixin({ methods: { - historyBack: function(func = function(){}) { - historyBack(func) + historyBack: function(fallbackUrl = "/platform/h5/home", func = function(){}) { + historyBack(fallbackUrl, func) }, returnH5Home: function(activeTab = "home") { returnH5Home(activeTab) diff --git a/src/main/resources/views/layouts/v4/home/act.js b/src/main/resources/views/layouts/v4/home/act.js index ac3bd161..a6fb6a6a 100644 --- a/src/main/resources/views/layouts/v4/home/act.js +++ b/src/main/resources/views/layouts/v4/home/act.js @@ -1,7 +1,7 @@ const act = { template: /*language=HTML*/ ` -
+
@@ -77,8 +77,8 @@ const act = { /*初始化Swiper*/ initSwiper() { this.swiper = new Swiper('.activity-swiper', { - slidesPerView: 'auto', - spaceBetween: 30, + slidesPerView: 1, + spaceBetween: 18, centeredSlides: false, loop: false, navigation: { @@ -91,13 +91,13 @@ const act = { }, breakpoints: { 768: { - slidesPerView: 1, - }, - 1024: { slidesPerView: 2, }, + 1024: { + slidesPerView: 4, + }, 1200: { - slidesPerView: 3, + slidesPerView: 5, } } }) @@ -131,7 +131,7 @@ const act = { this.listAct() }, style: /*language=CSS*/ ` - .section-wrapper { + .activity-section-wrapper { width: 100%; } @@ -176,7 +176,7 @@ const act = { .activity-swiper-container { position: relative; width: 100%; - padding: 20px; + padding: 9px 14px; /*margin-top: 30px;*/ } @@ -217,7 +217,7 @@ const act = { /* 进度条样式 */ .activity-swiper-container .swiper-pagination { position: relative; - margin-top: 30px; + margin-top: 12px; height: 4px; } @@ -239,8 +239,8 @@ const act = { .activity-swiper .swiper-slide .item .img-box { width: 100%; - height: 200px; - border-radius: 12px; + height: 128px; + border-radius: 8px; overflow: hidden; position: relative; } @@ -250,10 +250,12 @@ const act = { left: 0; top: 0; background: #c11623; - padding: 6px 2px; - min-width: 50px; + padding: 4px 2px; + min-width: 42px; color: #ffffff; border-radius: 0 0 50% 0; + font-size: 12px; + line-height: 1.2; } @@ -269,16 +271,16 @@ const act = { } .activity-swiper .swiper-slide .item h4 { - font-size: 20px; - margin-top: 10px; - height: 60px; + font-size: 15px; + margin: 8px 0 0; + height: 42px; color: #333; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; - line-height: 1.5; + line-height: 1.4; text-align: left; transition: color 0.3s ease; } @@ -292,14 +294,14 @@ const act = { } .activity-swiper .swiper-slide .item .time p { - font-size: 13px; + font-size: 12px; margin: 0; - /*line-height: 1.5;*/ + line-height: 1.4; color: #666; } .activity-swiper .swiper-slide .item .time i { - margin-right: 5px; + margin-right: 4px; color: var(--color-primary); } diff --git a/src/main/resources/views/layouts/v4/home/entry.js b/src/main/resources/views/layouts/v4/home/entry.js index 70bde389..5ddea7ae 100644 --- a/src/main/resources/views/layouts/v4/home/entry.js +++ b/src/main/resources/views/layouts/v4/home/entry.js @@ -1,7 +1,7 @@ const entry = { template: /*language=HTML*/ `
-
+
@@ -126,6 +126,11 @@ const entry = { margin-top: 22px; } + /* 临时屏蔽“我的收藏”分组,保留原节点和数据逻辑便于恢复 */ + .entry-section-fav { + display: none; + } + .entry-section-header { display: flex; align-items: center; diff --git a/src/main/resources/views/layouts/v4/home/index.html b/src/main/resources/views/layouts/v4/home/index.html index 7ab4b8c3..a2f9f0f2 100644 --- a/src/main/resources/views/layouts/v4/home/index.html +++ b/src/main/resources/views/layouts/v4/home/index.html @@ -16,14 +16,8 @@ layout("/layouts/v4/baseLayout.html"){ .section-banner .banner-img img { width: 100%; - /*height: 100%;*/ - height: 470px; - object-fit: cover; - } - - /* 临时屏蔽首页背景图,保留原图片节点便于恢复 */ - .section-banner .banner-img > img { - display: none; + height: auto; + display: block; } .section-wrapper { @@ -61,12 +55,44 @@ layout("/layouts/v4/baseLayout.html"){ align-items: center; min-width: 320px; background: white; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0,0,0,0.08); - padding: 16px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0,0,0,0.06); + padding: 11px; transition: transform 0.2s, box-shadow 0.2s; } + .home-section { + width: 100%; + } + + .home-section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 10px; + } + + .home-section-title { + display: inline-flex; + align-items: baseline; + gap: 6px; + color: #19324d; + font-size: 18px; + font-weight: 700; + } + + .home-section-title i { + color: #409eff; + font-size: 16px; + } + + .home-section-title em { + color: #b5c0d6; + font-size: 14px; + font-style: normal; + font-weight: 500; + } +
@@ -87,6 +113,21 @@ layout("/layouts/v4/baseLayout.html"){
+
+
+
+
+ + 最新活动 + /Activities +
+
+
+ +
+
+
+ diff --git a/src/main/resources/views/layouts/v4/home/stats.js b/src/main/resources/views/layouts/v4/home/stats.js index 2f877a69..3b3499d5 100644 --- a/src/main/resources/views/layouts/v4/home/stats.js +++ b/src/main/resources/views/layouts/v4/home/stats.js @@ -126,6 +126,11 @@ const stats = { /*border: 1px solid #e8e8e8;*/ } + /* 子内容临时屏蔽时,同步收起统计容器,避免首页 banner 下方出现空白 */ + .stats-section { + display: none; + } + .stats-grid { display: grid; grid-template-columns: repeat(2, 1fr); @@ -135,6 +140,11 @@ const stats = { margin-left: auto; } + /* 临时屏蔽首页右上角“待办、已办、消息、发起”统计卡片,保留原模板便于恢复 */ + .stats-grid { + display: none; + } + .stat-item { background: #f8f9fa; color: #495057; diff --git a/src/main/resources/views/layouts/v4/home/template.js b/src/main/resources/views/layouts/v4/home/template.js index 284a4b9f..9cce68f7 100644 --- a/src/main/resources/views/layouts/v4/home/template.js +++ b/src/main/resources/views/layouts/v4/home/template.js @@ -138,20 +138,28 @@ const workTemplate = { } .work-template-icon { - width: 46px; - height: 46px; + width: 55px; + height: 55px; margin-bottom: 8px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; } .work-template-icon img { - width: 100%; - height: 100%; - object-fit: contain; + width: 55px !important; + height: 55px !important; + max-width: none; + max-height: none; + object-fit: cover; + border-radius: 8px; } .work-template-name { min-height: 34px; - font-size: 12px; + font-size: 12px !important; + font-weight: 400; color: #333; line-height: 1.4; word-break: break-word; diff --git a/src/main/resources/views/layouts/v4/home/user.js b/src/main/resources/views/layouts/v4/home/user.js index 18d97859..6436415e 100644 --- a/src/main/resources/views/layouts/v4/home/user.js +++ b/src/main/resources/views/layouts/v4/home/user.js @@ -305,7 +305,7 @@ const user = { .user-container { width: 80%; - margin: 20px auto; + margin: 12px auto 20px; display: grid; grid-template-columns: 0.7fr 2.3fr; gap: 24px; diff --git a/src/main/resources/views/platform/sys/conf/index.html b/src/main/resources/views/platform/sys/conf/index.html index f4daf824..0c7caf1b 100644 --- a/src/main/resources/views/platform/sys/conf/index.html +++ b/src/main/resources/views/platform/sys/conf/index.html @@ -92,12 +92,24 @@ layout("/layouts/platform.html"){ key="AppHomeImg" style="--upload-width: 214px;--upload-height:64px" :value.sync="formData.configValue" - :upload_number="10" + :upload_number="5" upload_mode="image" upload_result_category="interval" upload_result_type="url" > - 最佳分辨率:2756 x 732,最多可上传 10 张,首页按上传顺序轮播 + PC 首页轮播图,最佳分辨率:2756 x 732,最多可上传 5 张,首页按上传顺序轮播 + + + + + @@ -40,13 +52,20 @@ layout("/layouts/platform.html"){ - + - @@ -190,14 +196,52 @@ layout("/layouts/platform.html"){ } }, async onDelete(row) { + if (row.isTemplate) { + this.$message.warning("该活动已设为模板,请先取消模板后再删除") + return + } this.$confirm("此操作将永久删除, 是否继续?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(async () => { const resp = await this.$axios.post(loc() + "/onDelete", { id: row.id }) - this.$message.success(resp.msg) - this.doSearch() + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.error(resp.msg) + } + }).catch(() => {}) + }, + async setTemplate(row) { + this.$confirm("确定将该活动设为工作模板吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + const resp = await this.$axios.post(loc() + "/setTemplate", { id: row.id }) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.error(resp.msg) + } + }).catch(() => {}) + }, + async cancelTemplate(row) { + this.$confirm("确定取消该活动的工作模板吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + const resp = await this.$axios.post(loc() + "/cancelTemplate", { id: row.id }) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.error(resp.msg) + } }).catch(() => {}) }, }, diff --git a/src/main/resources/views/platform/zhgh/activity/family/newcativity/index.html b/src/main/resources/views/platform/zhgh/activity/family/newcativity/index.html new file mode 100644 index 00000000..1d45cfc4 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/family/newcativity/index.html @@ -0,0 +1,62 @@ + + + + +
+ + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/sports/infoManage/addActivity.js b/src/main/resources/views/platform/zhgh/activity/sports/infoManage/addActivity.js index de242c58..8c0097c1 100644 --- a/src/main/resources/views/platform/zhgh/activity/sports/infoManage/addActivity.js +++ b/src/main/resources/views/platform/zhgh/activity/sports/infoManage/addActivity.js @@ -604,6 +604,8 @@ planList: [], events: [], projectType: "", + copyTemplateMode: false, + copyTemplateName: "", formRules: { name: [{ required: true, message: "必填", trigger: ["blur", "change"] }], address: [{ required: true, message: "必填", trigger: ["blur", "change"] }], @@ -889,7 +891,7 @@ this.eventForm.checkedEventId = this.checkedEvents[0].id this.projectType = this.checkedEvents[0].projectType - if (!formData.id || this.checkedEventInfo.length <= 0) { + if ((!formData.id && !this.copyTemplateMode) || this.checkedEventInfo.length <= 0) { this.eventForm = { checkedEventId: this.checkedEvents[0].id, leanderNum: 0, @@ -937,6 +939,8 @@ this.activityGroupList = data }, async openAdd() { + this.copyTemplateMode = false + this.copyTemplateName = "" this.events = await this.getEvents(2) await this.getActivityGroup() this.active = 0 @@ -964,9 +968,58 @@ const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole") return resp.data }, - async openEdit(row, flag) { + cleanCopyTemplateData(formData, events) { + if (formData) { + formData.id = null + formData.isTemplate = false + formData.createdBy = null + formData.createdAt = null + formData.updatedBy = null + formData.updatedAt = null + formData.delFlag = null + formData.foundDate = null + } + if (Array.isArray(events)) { + events.forEach((event) => { + if (event.id !== "allItems") { + event.id = null + } + event.activityId = null + event.createdBy = null + event.createdAt = null + event.updatedBy = null + event.updatedAt = null + event.delFlag = null + }) + } + }, + async setupCopyTemplateData(formData, events) { + this.cleanCopyTemplateData(formData, events) + if (formData && formData.activityLevel) { + const activityCode = await this.getActivityCode(formData.activityLevel) + this.$set(formData, "activityCode", activityCode) + } + this.eventsIds = [] + this.checkedEvents = this.events.filter((event) => formData.eventsIds.some((id) => id === event.id)) + if (this.checkedEvents.length > 0) { + await this.eventChange(this.checkedEvents[0].id) + } + }, + validateCopyTemplateName() { + if (!this.copyTemplateMode) { + return true + } + const currentName = (this.formData.name || "").trim() + const templateName = (this.copyTemplateName || "").trim() + if (currentName && templateName && currentName === templateName) { + this.$message.warning("请修改活动名称,不能与模板名称一致") + return false + } + return true + }, + async openEdit(row, flag, copyTemplateMode = false) { + this.copyTemplateMode = !!copyTemplateMode this.active = flag ? 0 : this.active - await this.applyTypeChange(row.applyType) await this.getActivityGroup() const { id } = row this.$set(row, "loading", true) @@ -985,10 +1038,17 @@ v.unitSponsor = JSON.parse(v.unitSponsor) v.undertakeUnit = JSON.parse(v.undertakeUnit) v.unitJointly = JSON.parse(v.unitJointly) + v.applyType = parseInt(v.applyType) v.activityGroupId = parseInt(v.activityGroupId) v.activityLevel = parseInt(v.activityLevel) + const applyType = row.applyType ? parseInt(row.applyType) : v.applyType + await this.applyTypeChange(isNaN(applyType) ? v.applyType : applyType) this.formData = clone(v) this.checkedEventInfo = clone(v.schoolEvents) + if (this.copyTemplateMode) { + this.copyTemplateName = this.formData.name + await this.setupCopyTemplateData(this.formData, this.checkedEventInfo) + } this.checkedEventInfo.map((v) => { /*if (v.unionLimit) { v.unionLimit = JSON.parse(v.unionLimit) @@ -1014,9 +1074,15 @@ } }, async doOperate() { - const method = this.formData.id ? "/doEdit" : "/doAdd" + if (!this.validateCopyTemplateName()) { + return + } + const method = this.copyTemplateMode || !this.formData.id ? "/doAdd" : "/doEdit" const formData = clone(this.formData) const events = clone(this.checkedEventInfo) + if (this.copyTemplateMode) { + this.cleanCopyTemplateData(formData, events) + } formData.restrictMaxNum = formData.leanderNum + formData.coachNum + formData.athletesMaxNum + formData.substituteNum formData.restrictMinNum = formData.athletesMaxNum @@ -1035,6 +1101,7 @@ events: JSON.stringify(events) }) if (resp.code === 0) { + this.copyTemplateMode = false this.$emit("flip") } else { this.$notify.error({ title: "错误", message: resp.msg }) @@ -1042,6 +1109,10 @@ loading.close() }, async operate() { + if (this.copyTemplateMode) { + await this.doOperate() + return + } const deleteEventIds = this.eventsIds.filter((v) => !this.formData.eventsIds.includes(v)) const { data } = await $.get("/platform/activity/sports/info/mange/getEventApply", { activityId: this.formData.id, @@ -1061,7 +1132,10 @@ } }, async doSave() { - let url = this.formData.id ? "/doEdit" : "/doAdd" + if (!this.validateCopyTemplateName()) { + return + } + let url = this.copyTemplateMode || !this.formData.id ? "/doAdd" : "/doEdit" this.checkedEventInfo.forEach((v) => { if (this.eventForm.projectType === "1" && this.eventForm.eventId === "eventId") { @@ -1080,6 +1154,9 @@ let events = clone(this.checkedEventInfo) const formData = clone(this.formData) + if (this.copyTemplateMode) { + this.cleanCopyTemplateData(formData, events) + } formData.restrictMaxNum = formData.leanderNum + formData.coachNum + formData.athletesMaxNum + formData.substituteNum formData.restrictMinNum = formData.athletesMaxNum formData.isSave = true @@ -1107,6 +1184,9 @@ this.$set(this.eventForm, "endAgeDate", this.eventForm.ageDate[1]) } events = this.eventForm + if (this.copyTemplateMode) { + this.cleanCopyTemplateData(null, [events]) + } } const loading = this.$loading({ lock: true, @@ -1121,7 +1201,10 @@ }) if (resp.code === 0) { this.$emit("flush") - if (!this.formData.id) formData.id = resp.data + if (this.copyTemplateMode || !this.formData.id) { + formData.id = resp.data + this.copyTemplateMode = false + } await this.openEdit(formData, false) this.$message.success(resp.msg) } else { diff --git a/src/main/resources/views/platform/zhgh/activity/sports/infoManage/index.html b/src/main/resources/views/platform/zhgh/activity/sports/infoManage/index.html index 848577f2..d8d5083f 100644 --- a/src/main/resources/views/platform/zhgh/activity/sports/infoManage/index.html +++ b/src/main/resources/views/platform/zhgh/activity/sports/infoManage/index.html @@ -85,7 +85,15 @@ layout("/layouts/platform.html"){ 查看 导出名单 编辑 - 删除 + 设为模板 + 取消模板 + 删除 @@ -158,6 +166,10 @@ layout("/layouts/platform.html"){ this.openEdit(row) } else if (type === "delete") { this.doDelete(row) + } else if (type === "setTemplate") { + this.setTemplate(row) + } else if (type === "cancelTemplate") { + this.cancelTemplate(row) } else if (type === "exportXlsx") { window.open("/platform/activity/sports/info/mange/exportXlsx?id=" + row.id) } @@ -176,6 +188,10 @@ layout("/layouts/platform.html"){ }, doDelete(row) { const { id } = row + if (row.isTemplate) { + this.$message.warning("该活动已设为模板,请先取消模板后再删除") + return + } this.$confirm("确定要删除该活动吗?", "提示", { type: "warning" }).then(async () => { this.$set(row, "loading", true) const resp = await this.$axios.post(loc() + "/doDelete", { id }) @@ -188,6 +204,38 @@ layout("/layouts/platform.html"){ } }) }, + async setTemplate(row) { + try { + await this.$confirm("确定将该活动设为工作模板吗?", "提示", { type: "warning" }) + this.$set(row, "loading", true) + const resp = await this.$axios.post(loc() + "/setTemplate", { id: row.id }) + this.$set(row, "loading", false) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.notifyWarning(resp.msg) + } + } catch (e) { + this.$set(row, "loading", false) + } + }, + async cancelTemplate(row) { + try { + await this.$confirm("确定取消该工作模板吗?", "提示", { type: "warning" }) + this.$set(row, "loading", true) + const resp = await this.$axios.post(loc() + "/cancelTemplate", { id: row.id }) + this.$set(row, "loading", false) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.notifyWarning(resp.msg) + } + } catch (e) { + this.$set(row, "loading", false) + } + }, async doOperate() { await this.$refs.addActivity.operate() }, diff --git a/src/main/resources/views/platform/zhgh/activity/sports/new/index.html b/src/main/resources/views/platform/zhgh/activity/sports/new/index.html index a0daba0a..6037e739 100644 --- a/src/main/resources/views/platform/zhgh/activity/sports/new/index.html +++ b/src/main/resources/views/platform/zhgh/activity/sports/new/index.html @@ -6,8 +6,8 @@ layout("/layouts/platform.html"){
- 保 存 - 提 交 + {{ copyTemplateMode ? "另存为" : "保 存" }} + {{ copyTemplateMode ? "新活动提交" : "提 交" }}
@@ -31,6 +31,11 @@ layout("/layouts/platform.html"){ components: { "add-activity": ACTIVITY_SPORTS_ADD_ACTIVITY }, + data() { + return { + copyTemplateMode: false + } + }, methods: { back() { commonUtil.pjaxPush("/platform/activity/sports/info/mange") @@ -42,15 +47,19 @@ layout("/layouts/platform.html"){ }, async doOperate() { await this.$refs.addActivity.operate() + this.copyTemplateMode = this.$refs.addActivity.copyTemplateMode }, async doSave() { await this.$refs.addActivity.doSave() + this.copyTemplateMode = this.$refs.addActivity.copyTemplateMode }, initForm() { const mode = GetQueryString("mode") const id = GetQueryString("id") - if (mode === "edit" && id) { - this.$refs.addActivity.openEdit({id}, true) + const applyType = GetQueryString("applyType") + this.copyTemplateMode = mode === "edit" && !!id + if (this.copyTemplateMode) { + this.$refs.addActivity.openEdit({id, applyType}, true, true) } else { this.$refs.addActivity.openAdd() } diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/applyActivity/index.html b/src/main/resources/views/platform/zhgh/activity/trainSignUp/applyActivity/index.html index c44ae31b..be1fc26e 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/applyActivity/index.html +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/applyActivity/index.html @@ -42,7 +42,7 @@ layout("/layouts/platform.html"){ const mode = GetQueryString("mode") const id = GetQueryString("id") const row = mode === "edit" && id ? {id} : undefined - this.$refs.formRef.initData(row) + this.$refs.formRef.initData(row, mode === "edit" && !!id) } }, mounted() { 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 d39b5193..28cf3b60 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 @@ -287,8 +287,8 @@ const basicForm = { 取消 上一步 下一步 - 保存 - 提交 + {{ copyTemplateMode ? "另存为" : "保存" }} + {{ copyTemplateMode ? "新活动提交" : "提交" }}
@@ -323,6 +323,8 @@ const basicForm = { return { signUpDialog: false, step: 1, + copyTemplateMode: false, + copyTemplateName: "", formData: { notice: false, courseList: [ @@ -359,7 +361,7 @@ const basicForm = { }, methods: { async validNumber(row, old) { - if (GetQueryString("id") === "") { + if (this.copyTemplateMode || GetQueryString("id") === "") { if (row.courseReservedNumber > row.coursePeopleNumber && row.reserveMode === 1) { this.$alert("预留人数不能大于" + this.trainType + "人数!", "提示", { confirmButtonText: "确定" @@ -468,6 +470,51 @@ const basicForm = { this.formData = resp.data this.typeChange(this.formData.trainType) this.formData.id = "" + this.cleanCopyTemplateData(this.formData) + } + }, + cleanCopyTemplateData(data) { + if (!data) { + return + } + data.id = null + data.isTemplate = false + data.createdBy = null + data.createdAt = null + data.updatedBy = null + data.updatedAt = null + data.delFlag = null + if (Array.isArray(data.typeLimits)) { + data.typeLimits = data.typeLimits.map((limit) => { + limit.id = null + limit.activityId = null + return limit + }) + } + if (Array.isArray(data.courseList)) { + data.courseList = data.courseList.map((course) => { + course.id = null + course.activityId = null + course.hasRegisterNum = null + course.hasWaitingNum = null + course.isSign = false + course.canSignThisCourseType = null + course.createdBy = null + course.createdAt = null + course.updatedBy = null + course.updatedAt = null + course.delFlag = null + if (Array.isArray(course.courseTimeList)) { + course.courseTimeList = course.courseTimeList.map((courseTime) => { + courseTime.id = null + courseTime.activityId = null + courseTime.courseId = null + courseTime.hasRegisterNum = null + return courseTime + }) + } + return course + }) } }, typeChange(val) { @@ -499,11 +546,17 @@ const basicForm = { this.$message.warning("请输入活动名称") return } - await this.doHandle('保存') + if (!this.validateCopyTemplateName()) { + return + } + await this.doHandle(this.copyTemplateMode ? '另存为' : '保存') }, onSubmit() { this.$refs["form"].validate(async (valid, errMsg) => { if (valid) { + if (!this.validateCopyTemplateName()) { + return + } const courseValid = this.formData.courseList.some((v, i) => { const basicValid = v.courseName && v.coursePeopleNumber && v.courseLocation && v.courseInstructor && v.courseType const timeValid = @@ -535,7 +588,7 @@ const basicForm = { return } this.formData.isDisabled = false - await this.doHandle('提交') + await this.doHandle(this.copyTemplateMode ? '新活动提交' : '提交') } else { if(Object.keys(errMsg).length > 0) { this.$message.warning(errMsg[Object.keys(errMsg)[0]][0].message) @@ -545,8 +598,23 @@ const basicForm = { } }) }, + validateCopyTemplateName() { + if (!this.copyTemplateMode) { + return true + } + const currentName = (this.formData.activityName || "").trim() + const templateName = (this.copyTemplateName || "").trim() + if (currentName && templateName && currentName === templateName) { + this.$message.warning("请修改活动名称,不能与模板名称一致") + return false + } + return true + }, async doHandle(type) { const cloneData = clone(this.formData) + if (this.copyTemplateMode) { + this.cleanCopyTemplateData(cloneData) + } cloneData.activitySignUpStartTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[0] : null cloneData.activitySignUpEndTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[1] : null cloneData.activityStartTime = cloneData.activityTime !== undefined ? cloneData.activityTime[0] : null @@ -554,7 +622,7 @@ const basicForm = { if (cloneData.activitySignUpStartTime !== undefined && cloneData.activitySignUpStartTime !== null) { cloneData.year = new Date(cloneData.activitySignUpStartTime).getFullYear() } - cloneData.typeLimits = JSON.stringify(this.formData.typeLimits) + cloneData.typeLimits = JSON.stringify(cloneData.typeLimits) cloneData.courseList = JSON.stringify(cloneData.courseList) cloneData.hostUnits = JSON.stringify(cloneData.hostUnits) cloneData.helpUnits = JSON.stringify(cloneData.helpUnits) @@ -584,10 +652,15 @@ const basicForm = { if (resp.code === 0) { this.formData = resp.data this.typeChange(this.formData.trainType) + if (this.copyTemplateMode) { + this.copyTemplateName = this.formData.activityName + this.cleanCopyTemplateData(this.formData) + } } } }, - async initData(row) { + async initData(row, copyTemplateMode = false) { + this.copyTemplateMode = copyTemplateMode this.activityGroupList = await this.getActivityGroup() this.historicalActList = await this.getHistoricalActList() this.courseTypeList = await this.getAllType() diff --git a/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html b/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html index d1258524..526f8e75 100644 --- a/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html +++ b/src/main/resources/views/platform/zhgh/activity/workscollection/manage/index.html @@ -48,11 +48,27 @@ layout("/layouts/platform.html"){ > - + @@ -61,6 +77,7 @@ layout("/layouts/platform.html"){ - - + { + this.activityGroupList = activityGroupList + this.clubOptions = clubOptions + this.clubOptions.map((v) => { + v.name = v.clubName + }) + this.unitOptions = this.clubOptions.concat(units) + this.formOptionsLoaded = true + }).finally(() => { + this.formOptionsPromise = null + }) + return this.formOptionsPromise + }, addType(index) { let item = {} this.initData(item) @@ -410,7 +496,11 @@ layout("/layouts/platform.html"){ this.$set(worksType, "allowFileTypes", worksType.allowFileTypes ? worksType.allowFileTypes : []) }, - openAdd() { + async openAdd() { + this.copyTemplateMode = false + this.copyTemplateName = "" + await this.loadFormOptions() + this.formVisible = true this.$refs.guava.edit() this.$nextTick(() => { this.formData = { @@ -422,9 +512,80 @@ layout("/layouts/platform.html"){ this.initData(this.formData.subjectTypes[0].worksTypes[0]) }) }, - async openEdit(id) { - const resp = await this.$axios.post(loc() + "/findOne", {id}) + cleanCopyTemplateData(data) { + if (!data) { + return + } + data.id = null + data.isTemplate = false + data.createdBy = null + data.createdAt = null + data.updatedBy = null + data.updatedAt = null + data.delFlag = null + if (Array.isArray(data.subjectTypes)) { + data.subjectTypes = data.subjectTypes.map((subjectType) => { + subjectType.id = null + subjectType.activityId = null + subjectType.createdBy = null + subjectType.createdAt = null + subjectType.updatedBy = null + subjectType.updatedAt = null + subjectType.delFlag = null + if (Array.isArray(subjectType.worksTypes)) { + subjectType.worksTypes = subjectType.worksTypes.map((worksType) => { + worksType.id = null + worksType.subjectId = null + worksType.createdBy = null + worksType.createdAt = null + worksType.updatedBy = null + worksType.updatedAt = null + worksType.delFlag = null + return worksType + }) + } + return subjectType + }) + } + }, + validateCopyTemplateName() { + if (!this.copyTemplateMode) { + return true + } + const currentName = (this.formData.name || "").trim() + const templateName = (this.copyTemplateName || "").trim() + if (currentName && templateName && currentName === templateName) { + this.$message.warning("请修改活动名称,不能与模板名称一致") + return false + } + return true + }, + buildSubmitData() { + const data = clone(this.formData) + data.startDateTime = data.activityTime[0] + data.endDateTime = data.activityTime[1] + data.nbStartDateTime = data.nbTime ? data.nbTime[0] : null + data.nbEndDateTime = data.nbTime ? data.nbTime[1] : null + data.type = "1" + if (this.copyTemplateMode) { + this.cleanCopyTemplateData(data) + } + return data + }, + async openEdit(id, copyTemplateMode = false) { + this.copyTemplateMode = !!copyTemplateMode + const [resp] = await Promise.all([ + this.$axios.post("/platform/activity/worksCollection/manage/findOne", {id}), + this.loadFormOptions() + ]) + this.formVisible = true this.formData = resp.data + if (this.copyTemplateMode) { + this.copyTemplateName = this.formData.name + this.cleanCopyTemplateData(this.formData) + } else { + this.copyTemplateName = "" + } this.$set(this.formData, "activityTime", [this.formData.startDateTime, this.formData.endDateTime]) // this.formData.activityTime = [this.formData.startDateTime, this.formData.endDateTime] if (this.formData.nbStartDateTime && this.formData.nbEndDateTime) { @@ -436,27 +597,30 @@ layout("/layouts/platform.html"){ }) }, close() { - this.$refs.guava.index() + this.formVisible = false + if (this.isNewPage()) { + this.backToManage() + } else { + this.$refs.guava.index() + } }, doSubmit() { this.$refs.formRef.validate((valid) => { if (valid) { - this.formData.startDateTime = this.formData.activityTime[0] - this.formData.endDateTime = this.formData.activityTime[1] - this.formData.nbStartDateTime = this.formData.nbTime[0] - this.formData.nbEndDateTime = this.formData.nbTime[1] - this.formData.type = "1" + if (!this.validateCopyTemplateName()) { + return + } + const submitData = this.buildSubmitData() let loading = this.$loading({ lock: true, text: "数据正在提交中,请稍后...", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)" }) - this.$axios.post(loc() + (this.formData.id ? "/update" : "/insert"), {data: JSON.stringify(this.formData)}).then((res) => { + this.$axios.post("/platform/activity/worksCollection/manage" + (this.copyTemplateMode || !this.formData.id ? "/insert" : "/update"), {data: JSON.stringify(submitData)}).then((res) => { if (res.code === 0) { this.$message.success(res.msg) - this.doSearch() - this.$refs.guava.index() + this.afterSaveSuccess() } else { this.$message.warning(res.msg) } @@ -466,22 +630,20 @@ layout("/layouts/platform.html"){ }) }, doSave() { - this.formData.startDateTime = this.formData.activityTime[0] - this.formData.endDateTime = this.formData.activityTime[1] - this.formData.nbStartDateTime = this.formData.nbTime[0] - this.formData.nbEndDateTime = this.formData.nbTime[1] - this.formData.type = "1" + if (!this.validateCopyTemplateName()) { + return + } + const submitData = this.buildSubmitData() let loading = this.$loading({ lock: true, text: "数据正在保存中,请稍后...", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)" }) - this.$axios.post("/platform/activity/worksCollection/manage" + (this.formData.id ? "/update" : "/insert"), {data: JSON.stringify(this.formData)}).then((res) => { + this.$axios.post("/platform/activity/worksCollection/manage" + (this.copyTemplateMode || !this.formData.id ? "/save" : "/update"), {data: JSON.stringify(submitData)}).then((res) => { if (res.code === 0) { this.$message.success(res.msg) - this.doSearch() - this.$refs.guava.index() + this.afterSaveSuccess() } else { this.$message.warning(res.msg) } @@ -489,6 +651,11 @@ layout("/layouts/platform.html"){ }) }, doDelete(id) { + const row = this.tableData.find((item) => item.id === id) + if (row && row.isTemplate) { + this.$message.warning("该活动已设为模板,请先取消模板后再删除") + return + } this.$confirm("您确定要删除吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", @@ -502,6 +669,32 @@ layout("/layouts/platform.html"){ }) }) }, + async setTemplate(row) { + try { + await this.$confirm("确定将该活动设为工作模板吗?", "提示", {type: "warning"}) + const resp = await this.$axios.post(loc() + "/setTemplate", {id: row.id}) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.warning(resp.msg) + } + } catch (e) { + } + }, + async cancelTemplate(row) { + try { + await this.$confirm("确定取消该工作模板吗?", "提示", {type: "warning"}) + const resp = await this.$axios.post(loc() + "/cancelTemplate", {id: row.id}) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.warning(resp.msg) + } + } catch (e) { + } + }, enableChange(enable, id) { this.$axios.post(loc() + "/enableChange", {id, enable}).then((res) => { @@ -540,15 +733,15 @@ layout("/layouts/platform.html"){ }, }, async created() { - this.activityGroupList = await this.getActivityGroup() - this.pageData() - - this.clubOptions = await this.getClubsByRole() - this.clubOptions.map((v) => { - v.name = v.clubName - }) - const units = await this.$businessTool.listUnit() - this.unitOptions = this.clubOptions.concat(units) + if (this.isNewPage()) { + await this.loadFormOptions() + this.$nextTick(() => { + this.initNewPage() + }) + } else { + this.pageData() + this.loadFormOptions() + } } }) diff --git a/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html b/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html index 8de3835d..d7962456 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/outlay/activityBudget/apply/index.html @@ -224,7 +224,7 @@ layout("/layouts/platform.html"){ unionChange(id) { if (id) { const union = this.unionList.find(c => c.id === id) - this.$set(this.formData, "helpUnitName", union.unionname) + this.$set(this.formData, "helpUnitName", union ? union.name : "") } else { this.$set(this.formData, "helpUnitName", '') } @@ -243,42 +243,61 @@ layout("/layouts/platform.html"){ } if (val) { const budgetType = this.budgetTypeOption.find(b => b.code === val) - this.$set(this.formData, "budgetTypeId", budgetType.code) + this.$set(this.formData, "budgetTypeId", budgetType ? budgetType.code : "") } }, async getActivityBudgetType() { const data = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE") - let budgetTypeOption = [] - if (this.$auth.hasPermission(['activity.budget.apply.system'])) { + const budgetTypeOption = [] + if (this.canApplyAllBudgetType()) { this.budgetTypeOption = data } else { - if (this.$auth.hasPermission(['activity.budget.apply.schoolAdmin'])) { - data.map(v => { - if (["ACTIVITY_BUDGET_TYPE_ONE"].includes(v.code)) { - budgetTypeOption.push(v) - } - }) + if (this.canApplySchoolBudget()) { + this.pushBudgetTypeOption(data, budgetTypeOption, "ACTIVITY_BUDGET_TYPE_ONE") } - if (this.$auth.hasPermission(['activity.budget.apply.branchAdmin'])) { - data.map(v => { - if (["ACTIVITY_BUDGET_TYPE_TWO"].includes(v.code)) { - budgetTypeOption.push(v) - } - }) + if (this.canApplyBranchBudget()) { + this.pushBudgetTypeOption(data, budgetTypeOption, "ACTIVITY_BUDGET_TYPE_TWO") } - if (this.$auth.hasPermission(['activity.budget.apply.clubPresident'])) { - data.map(v => { - if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(v.code)) { - budgetTypeOption.push(v) - } - }) + if (this.canApplyClubBudget()) { + this.pushBudgetTypeOption(data, budgetTypeOption, "ACTIVITY_BUDGET_TYPE_THREE") } this.budgetTypeOption = budgetTypeOption - if (this.budgetTypeOption.length === 1){ - this.$set(this.formData, "outlayManageSource", this.budgetTypeOption[0].code) - this.budgetTypeCodeChange(this.budgetTypeOption[0].code) - } } + this.initDefaultBudgetType() + }, + pushBudgetTypeOption(source, target, code) { + const option = source.find(v => v.code === code) + if (option && !target.some(v => v.code === code)) { + target.push(option) + } + }, + canApplyAllBudgetType() { + return this.$auth.hasPermission('activity.budget.apply.system') + || this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN']) + }, + canApplySchoolBudget() { + return this.$auth.hasPermission('activity.budget.apply.schoolAdmin') + || this.$auth.hasRoleOr(['SCHOOL_REIMBURSEMENT_MANAGER', 'SCHOOL_OUTLAY_ADMIN']) + }, + canApplyBranchBudget() { + return this.$auth.hasPermission('activity.budget.apply.branchAdmin') + || this.$auth.hasRoleOr(['UNION_REIMBURSEMENT_MANAGER', 'BRANCH_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN', 'BRANCH_UNION_OPERATOR', 'BRANCH_UNION_WENTI_SPORTS']) + }, + canApplyClubBudget() { + return this.$auth.hasPermission('activity.budget.apply.clubPresident') + || this.$auth.hasRoleOr(['CLUB_REIMBURSEMENT_MANAGER', 'CLUB_MANAGER', 'CLUB_PRESIDENT']) + }, + initDefaultBudgetType() { + if (this.bizId || this.formData.outlayManageSource || this.budgetTypeOption.length === 0) { + return + } + const defaultBudgetType = this.budgetTypeOption[0].code + this.$set(this.formData, "outlayManageSource", defaultBudgetType) + this.budgetTypeCodeChange(defaultBudgetType) + }, + async loadUnionList() { + const unionId = this.canApplyAllBudgetType() ? null : this.$store.state.user.union.id + this.unionList = await this.$businessTool.listUnion(unionId) }, getSchoolBudget() { this.$axios.post("/platform/activity/budget/apply/getSchoolBudget").then((res) => { @@ -343,7 +362,7 @@ layout("/layouts/platform.html"){ this.init() await this.getActivityBudgetType() await this.getSchoolBudget() - this.unionList = await this.$businessTool.listUnion(this.$store.state.user.union.id) + await this.loadUnionList() this.clubOption = await this.$businessTool.listClubByRole() } }) diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/apply.html b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/apply.html index a0a5958a..3d2a701d 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/apply.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/apply.html @@ -99,7 +99,7 @@ layout("/layouts/platform_tour_signup_h5.html"){
- +
加载中... @@ -544,7 +544,7 @@ layout("/layouts/platform_tour_signup_h5.html"){ message: res.msg || "报名成功", confirmButtonColor: "#1867b0" }).then(() => { - window.location.href = "/platform/tour/signup/h5/signup" + window.location.replace("/platform/tour/signup/h5/signup") }) } else { vant.Dialog.alert({ diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/lineInfo.html b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/lineInfo.html index c6c58a66..6d5cbb23 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/lineInfo.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/lineInfo.html @@ -173,7 +173,7 @@ layout("/layouts/platform_tour_signup_h5.html"){
- +
加载中... diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html index 778dc0a5..fdba8668 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html @@ -379,7 +379,7 @@ layout("/layouts/platform_tour_signup_h5.html"){
- +
diff --git a/src/main/resources/views/platform/zhghh5/learning/course/study.html b/src/main/resources/views/platform/zhghh5/learning/course/study.html index d4b53d54..4b51ff42 100644 --- a/src/main/resources/views/platform/zhghh5/learning/course/study.html +++ b/src/main/resources/views/platform/zhghh5/learning/course/study.html @@ -411,7 +411,8 @@ layout("/layouts/platform_h5.html"){ currentSegmentId: "", studying: false, pendingSeconds: 0, - heartbeatTimer: null + heartbeatTimer: null, + navigatingBack: false } }, computed: { @@ -685,9 +686,29 @@ layout("/layouts/platform_h5.html"){ this.finishStudy(false) this.playerVisible = false }, - goBack() { - this.finishStudy(true) - pjaxReplace("/platform/learning/course/h5") + async goBack() { + if (this.navigatingBack) return + this.navigatingBack = true + try { + await this.finishStudy(true) + } finally { + this.navigateBack() + } + }, + navigateBack() { + if (window.history.length > 1) { + window.history.back() + return + } + $.pjax({ + url: "/platform/learning/course/h5", + container: "#container", + maxCacheLength: 0, + push: false, + replace: true, + fragment: "#container", + timeout: 8000 + }) } }, async mounted() { diff --git a/src/main/resources/views/platform/zhghh5/sys/home/home.js b/src/main/resources/views/platform/zhghh5/sys/home/home.js index 794af311..1b5ddee2 100644 --- a/src/main/resources/views/platform/zhghh5/sys/home/home.js +++ b/src/main/resources/views/platform/zhghh5/sys/home/home.js @@ -230,18 +230,18 @@ const home = { .map(src => ({ src })) }, listHomeBanner() { - const cached = this.readHomeCache("banner") + const cached = this.readHomeCache("h5Banner") if (cached && cached.length) { this.bannerList = cached this.activeBannerIndex = 0 } - this.$axios.post("/open/common/getConfigKey", { key: "AppHomeImg" }).then((res) => { + this.$axios.post("/open/common/getConfigKey", { key: "H5AppHomeImg" }).then((res) => { if (res.code === 0) { const configBannerList = this.parseBannerList(res.data) const nextBannerList = configBannerList.length > 0 ? configBannerList : this.defaultBannerList this.bannerList = nextBannerList this.activeBannerIndex = 0 - this.writeHomeCache("banner", nextBannerList, this.homeCacheTtl.banner) + this.writeHomeCache("h5Banner", nextBannerList, this.homeCacheTtl.banner) this.cacheBannerImages(nextBannerList) } }).catch(() => { diff --git a/src/main/resources/views/platform/zhghh5/welfare/select/index.html b/src/main/resources/views/platform/zhghh5/welfare/select/index.html index b2596a47..aa55aa7d 100644 --- a/src/main/resources/views/platform/zhghh5/welfare/select/index.html +++ b/src/main/resources/views/platform/zhghh5/welfare/select/index.html @@ -164,7 +164,7 @@ layout("/layouts/platform_h5.html"){ position: relative; display: flex; flex-direction: row; - height: 90px; + min-height: 120px; } .welfare-option.selected { @@ -185,49 +185,87 @@ layout("/layouts/platform_h5.html"){ } .welfare-option-image { - width: 90px; - height: 90px; + width: 100px; + height: 100px; + margin: 10px 0 10px 10px; position: relative; flex-shrink: 0; + border-radius: 8px; + overflow: hidden; + background: #f7f8fa; } .welfare-option-content { - padding: 6px 12px; + padding: 10px 12px; flex: 1; display: flex; flex-direction: column; position: relative; + min-width: 0; } .welfare-option-title { font-size: 15px; font-weight: bold; color: var(--text-primary); - margin-bottom: 0; - padding-right: 30px; + margin-bottom: 5px; + padding-right: 34px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.4; + } + + .welfare-option-type-tag { + display: inline-flex; + align-items: center; + height: 17px; + padding: 0 4px; + margin-right: 5px; + border-radius: 3px; + background: var(--primary-color); + color: #fff; + font-size: 11px; + line-height: 17px; + vertical-align: 1px; + } + + .welfare-option-rank { + margin-bottom: 4px; + color: #d6a21e; + font-size: 12px; + line-height: 1.3; + display: flex; + align-items: center; + } + + .welfare-option-rank .van-icon { + margin-right: 3px; + font-size: 14px; + } + + .welfare-option-desc { + padding-right: 4px; + color: var(--text-secondary); + font-size: 12px; + line-height: 1.45; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; - line-height: 1.4; - } - - .welfare-option-desc { - display: none; } .welfare-option-footer { margin-top: auto; display: flex; - justify-content: space-between; + justify-content: flex-end; align-items: center; + gap: 10px; } .welfare-option-checkbox { - position: absolute; - bottom: 12px; - right: 12px; + flex-shrink: 0; } .welfare-option-checkbox .van-stepper { @@ -240,13 +278,16 @@ layout("/layouts/platform_h5.html"){ } .welfare-detail-btn { - position: absolute; - bottom: 12px; - left: 12px; - color: var(--primary-color); + height: 24px; + padding: 0 10px; + border-radius: 12px; + background: var(--primary-color); + color: #fff; font-size: 13px; display: flex; align-items: center; + justify-content: center; + flex-shrink: 0; } .welfare-detail-btn .van-icon { @@ -640,14 +681,17 @@ layout("/layouts/platform_h5.html"){
-
{{ option.optionName }}
- - -
- - 查看详情 +
+ 套餐{{ option.optionName }}
+
+ + {{ optionRankText(option) }} +
+ +
{{ optionBrief(option) }}
+
- -
- +
@@ -894,6 +946,19 @@ layout("/layouts/platform_h5.html"){ }, methods: { + optionRankText(option) { + if (option.rankNo) { + return "此套餐在本次福利排行第" + option.rankNo + "名" + } + return "此套餐暂无排行数据" + }, + optionBrief(option) { + const content = option.simpleDesc || option.description || option.supplier || "" + const div = document.createElement("div") + div.innerHTML = content + const text = (div.textContent || div.innerText || "").replace(/\s+/g, " ").trim() + return text || "暂无套餐详情" + }, selectNumChange(index, newValue) { const option = this.projectInfo.options[index]; const maxSelect = this.projectInfo.multiSelectNum || this.projectInfo.options.length; @@ -1221,8 +1286,6 @@ layout("/layouts/platform_h5.html"){ // 显示选项详情 showOptionDetail(option) { - // 阻止事件冒泡,避免触发父元素的点击事件 - event.stopPropagation() this.selectedOption = option this.showOptionDetailDialog = true },