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 0484ec30..53847c45 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysConfController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysConfController.java @@ -9,6 +9,8 @@ import com.budwk.app.sys.models.Sys_config; import com.budwk.app.sys.services.SysConfigService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; import org.nutz.integration.jedis.pubsub.PubSubService; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -32,6 +34,8 @@ public class SysConfController { private SysConfigService sysConfigService; @Inject private PubSubService pubSubService; + @Inject + private Dao dao; @At("") @Ok("beetl:/platform/sys/conf/index.html") @@ -40,6 +44,18 @@ public class SysConfController { } + private void ensureAppImageConfig(String configKey, String note) { + if (sysConfigService.fetch(configKey) != null) { + return; + } + Sys_config conf = new Sys_config(); + conf.setConfigKey(configKey); + conf.setConfigValue(""); + conf.setNote(note); + conf.setCreatedBy(SecurityUtil.getUserId()); + sysConfigService.insert(conf); + } + @At @Ok("json") @SaCheckPermission("sys.manager.conf.add") @@ -73,13 +89,31 @@ public class SysConfController { @SLog(tag = "修改参数", msg = "${conf.configKey}:${conf.configValue}") public Object editDo(@Param("..") Sys_config conf) { try { + ensureConfigValueColumn(conf); conf.setUpdatedBy(SecurityUtil.getUserId()); if (sysConfigService.updateIgnoreNull(conf) > 0) { pubSubService.fire(RedisConstant.PLATFORM_REDIS_PREFIX + "web:platform", "sys_config"); } return Result.success(); } catch (Exception e) { - return Result.error(); + log.error("Update sys config failed: " + (conf == null ? "" : conf.getConfigKey()), e); + return Result.error("save failed: " + e.getMessage()); + } + } + + private void ensureConfigValueColumn(Sys_config conf) { + if (conf == null || (!"AppHomeImg".equals(conf.getConfigKey()) + && !"AppFeaturedActivityImg".equals(conf.getConfigKey()) + && !"AppFestivalBenefitImg".equals(conf.getConfigKey()))) { + return; + } + String configValue = Strings.sNull(conf.getConfigValue()); + if (configValue.length() <= 100) { + return; + } + String dbType = Strings.sNull(dao.getJdbcExpert().getDatabaseType()).toLowerCase(); + if (dbType.contains("mysql")) { + dao.execute(Sqls.create("ALTER TABLE `sys_config` MODIFY COLUMN `configValue` TEXT")); } } @@ -106,6 +140,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("AppFeaturedActivityImg", "精彩活动页顶部图片"); + ensureAppImageConfig("AppFestivalBenefitImg", "节日福利页顶部图片"); Cnd cnd = Cnd.NEW(); if (Strings.isNotBlank(pageOrderName) && Strings.isNotBlank(pageOrderBy)) { cnd.orderBy(pageOrderName, PageUtil.getOrder(pageOrderBy)); diff --git a/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java b/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java index 4cae5a10..5c222d1e 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysH5IndexController.java @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.result.Result; 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.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import io.swagger.annotations.Api; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -32,6 +32,8 @@ public class SysH5IndexController { @Inject private Dao dao; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At @Ok("beetl:/platform/zhghh5/sys/home/index.html") @@ -40,6 +42,20 @@ public class SysH5IndexController { } + @At + @Ok("beetl:/platform/zhghh5/sys/home/featuredActivity.html") + @SaCheckLogin + public void featuredActivity() { + + } + + @At + @Ok("beetl:/platform/zhghh5/sys/home/festivalBenefit.html") + @SaCheckLogin + public void festivalBenefit() { + + } + @At @Ok("beetl:/platform/zhghh5/index/mine/index.html") @SaCheckLogin @@ -88,8 +104,7 @@ public class SysH5IndexController { } if (allowUserGroupId != null) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", allowUserGroupId).and("userId", "=", userId)); - if (count > 0) { + if (activityBasicScopeService.isUserInGroup(allowUserGroupId, userId)) { allowActivityList.add(activity); continue; } @@ -97,7 +112,9 @@ public class SysH5IndexController { if (StrUtil.isNotBlank(allowUserSql)){ Sql sql = Sqls.create(allowUserSql).setParam("userId", userId); - NutMap nutMap = (NutMap) Daos.query(dao, sql.toString(), Sqls.callback.map()); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap nutMap = (NutMap) sql.getResult(); if (Lang.isNotEmpty(nutMap) && StrUtil.isNotBlank(nutMap.getString("userId"))) { allowActivityList.add(activity); } 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 adccf473..64e7f963 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java @@ -6,13 +6,16 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import cn.hutool.json.JSONObject; +import com.budwk.app.base.constant.RoleConstant; 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.sys.models.Sys_menu; import com.budwk.app.sys.services.SysMenuService; import com.budwk.app.sys.services.SysUserService; +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.models.ActivityUserScope; +import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import io.swagger.annotations.ApiOperation; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -56,6 +59,8 @@ public class SysHomeController { private SysUserService sysUserService; @Inject private RedisService redisService; + @Inject + private ActivityBasicScopeService activityBasicScopeService; @At("") @Ok("re") @@ -223,8 +228,7 @@ public class SysHomeController { } if (allowUserGroupId != null) { - int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", allowUserGroupId).and("userId", "=", userId)); - if (count > 0) { + if (activityBasicScopeService.isUserInGroup(allowUserGroupId, userId)) { allowActivityList.add(activity); continue; } @@ -232,7 +236,9 @@ public class SysHomeController { if (StrUtil.isNotBlank(allowUserSql)) { Sql sql = Sqls.create(allowUserSql).setParam("userId", userId); - NutMap nutMap = (NutMap) Daos.query(dao, sql.toString(), Sqls.callback.map()); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap nutMap = (NutMap) sql.getResult(); if (Lang.isNotEmpty(nutMap) && StrUtil.isNotBlank(nutMap.getString("userId"))) { allowActivityList.add(activity); } @@ -257,6 +263,20 @@ public class SysHomeController { // return Result.success(hasPermisiionList); } + @At + @SaCheckLogin + @ApiOperation("首页工作模板") + @Ok("json") + public Result listHomeTemplate() { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.success(Collections.emptyList()); + } + 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")); + return Result.success(list); + } + @At @SaCheckLogin diff --git a/src/main/java/com/budwk/app/sys/controller/SysUserController.java b/src/main/java/com/budwk/app/sys/controller/SysUserController.java index 9f8b7b63..4e576f1c 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUserController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUserController.java @@ -340,8 +340,11 @@ public class SysUserController { @At @Ok("json") @SaCheckLogin - public Result subAppMenus(@Param("appId") String appId) { + public Result subAppMenus(@Param("appId") String appId, @Param("platform") String platform) { List menus = sysUserService.getMenus(SecurityUtil.getUserId()); + if (StrUtil.isNotBlank(platform)) { + menus = menus.stream().filter(menu -> platform.equals(menu.getPlatform())).toList(); + } List list = SysMenuUtil.createTreeMenus(menus, appId); if (ObjectUtil.isEmpty(list)) { List self = menus.stream().filter(menu -> menu.getId().equals(appId)).toList(); diff --git a/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java b/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java new file mode 100644 index 00000000..12058174 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/controller/SysWorkTemplateController.java @@ -0,0 +1,107 @@ +package com.budwk.app.sys.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.sys.models.Sys_home_template; +import com.budwk.app.sys.param.SysHomeTemplatePageForm; +import com.budwk.app.sys.services.SysHomeTemplateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import javax.validation.Valid; + +@IocBean +@At("/platform/sys/worktemplate") +@Ok("json:full") +@Api(value = "首页工作模板") +public class SysWorkTemplateController { + + @Inject + private SysHomeTemplateService sysHomeTemplateService; + + @At("") + @Ok("beetl:/platform/sys/worktemplate/index.html") + @SaCheckPermission("sys.worktemplate") + public void index() { + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("分页数据") + 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); + Pagination pagination = sysHomeTemplateService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + return Result.success(pagination); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("启用") + public Result enable(@Valid String id) { + sysHomeTemplateService.update(Chain.make("enable", 1), Cnd.where("id", "=", id)); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("关闭") + public Result disable(@Valid String id) { + sysHomeTemplateService.update(Chain.make("enable", 0), Cnd.where("id", "=", id)); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("修改模板名称") + public Result updateTemplateName(@Valid String id, String templateName) { + if (StrUtil.isBlank(id)) { + return Result.error("参数错误"); + } + sysHomeTemplateService.update(Chain.make("templateName", templateName), Cnd.where("id", "=", id)); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("修改模板图标") + public Result updateTemplateIcon(@Valid String id, String templateIcon) { + if (StrUtil.isBlank(id)) { + return Result.error("参数错误"); + } + sysHomeTemplateService.update(Chain.make("templateIcon", templateIcon), Cnd.where("id", "=", id)); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("置顶") + public Result topUp(@Valid String id) { + Sys_home_template sysHomeTemplate = new Sys_home_template(); + sysHomeTemplate.setId(id); + sysHomeTemplate.setTop(true); + sysHomeTemplateService.updateIgnoreNull(sysHomeTemplate); + return Result.success(); + } + + @At + @SaCheckPermission("sys.worktemplate") + @ApiOperation("取消置顶") + public Result cancelTopUp(@Valid String id) { + Sys_home_template sysHomeTemplate = new Sys_home_template(); + sysHomeTemplate.setId(id); + sysHomeTemplate.setTop(false); + sysHomeTemplateService.updateIgnoreNull(sysHomeTemplate); + return Result.success(); + } + +} diff --git a/src/main/java/com/budwk/app/sys/models/Sys_config.java b/src/main/java/com/budwk/app/sys/models/Sys_config.java index c92ac9ab..1fa8a119 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_config.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_config.java @@ -22,7 +22,7 @@ public class Sys_config extends BaseModel implements Serializable { private String configKey; @Column - @ColDefine(type = ColType.VARCHAR, width = 100) + @ColDefine(type = ColType.TEXT) private String configValue; @Column 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 new file mode 100644 index 00000000..d59b8553 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/models/Sys_home_template.java @@ -0,0 +1,104 @@ +package com.budwk.app.sys.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; + +import java.util.Date; + +@EqualsAndHashCode(callSuper = true) +@Data +@Table +@Comment("首页工作模板") +public class Sys_home_template extends BaseModel { + + @Name + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("主键ID,和业务ID保持一致") + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("模板名称") + private String name; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("展示模板名称") + private String templateName; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + @Comment("模板图标") + private String templateIcon; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + @Comment("模板封面") + private String cover; + + @Column + @ColDefine(type = ColType.TEXT) + @Comment("模板内容") + private String content; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 1000) + @Comment("模板链接") + private String url; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 1000) + @Comment("h5模板链接") + private String h5Url; + + @Column + @ColDefine(type = ColType.INT) + @Comment("面向人员分组ID") + private Integer allowUserGroupId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 1000) + @Comment("允许查看的人员sql") + private String allowUserSql; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否启用") + @Default("0") + private Boolean enable; + + @Column + @Comment("类路径") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String classPath; + + @Column + @Comment("是否置顶") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean top; + + @Column + @Comment("是否推送大图") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean push; + + @Column + @Comment("排序号") + @Default("0") + private Integer sortNo; + + @Column + @Comment("开始时间") + @ColDefine(type = ColType.DATETIME) + private Date startDate; + + @Column + @Comment("结束时间") + @ColDefine(type = ColType.DATETIME) + private Date endDate; + +} diff --git a/src/main/java/com/budwk/app/sys/param/SysHomeTemplatePageForm.java b/src/main/java/com/budwk/app/sys/param/SysHomeTemplatePageForm.java new file mode 100644 index 00000000..b675b7a0 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/param/SysHomeTemplatePageForm.java @@ -0,0 +1,17 @@ +package com.budwk.app.sys.param; + +import com.budwk.app.base.param.PageForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("系统首页工作模板管理查询参数") +public class SysHomeTemplatePageForm extends PageForm { + + @ApiModelProperty("模板名称") + private String name; + +} diff --git a/src/main/java/com/budwk/app/sys/services/SysHomeTemplateService.java b/src/main/java/com/budwk/app/sys/services/SysHomeTemplateService.java new file mode 100644 index 00000000..386dbb4b --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/SysHomeTemplateService.java @@ -0,0 +1,7 @@ +package com.budwk.app.sys.services; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.sys.models.Sys_home_template; + +public interface SysHomeTemplateService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysFileServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysFileServiceImpl.java index 92f35e8c..75975cea 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysFileServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysFileServiceImpl.java @@ -42,6 +42,8 @@ import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.Base64; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -50,6 +52,8 @@ import java.util.regex.Pattern; public class SysFileServiceImpl extends BaseServiceImpl implements SysFileService { static String IMG_BASE64_PATTERN = "]*src\\s*=\\s*['\"](data:image/[^'\"]+;base64,[^'\"]+)['\"][^>]*>"; + private static final int DOWNLOAD_FILE_CACHE_LIMIT = 2000; + private final Map downloadFileCache = new ConcurrentHashMap<>(); public SysFileServiceImpl(Dao dao) { super(dao); @@ -77,7 +81,13 @@ public class SysFileServiceImpl extends BaseServiceImpl implements Sys @Override public void download(String id, HttpServletRequest request, HttpServletResponse response) throws IOException { - Sys_file sys_file = this.fetch(id); + if (handleCachedFileRequest(id, request, response)) { + return; + } + Sys_file sys_file = fetchDownloadFile(id); + if (!ObjectUtil.isEmpty(sys_file) && handleCachedImageRequest(sys_file, request, response)) { + return; + } if (ObjectUtil.isEmpty(sys_file)) { sendErrorResponse(response, "文件记录不存在"); return; @@ -88,16 +98,108 @@ public class SysFileServiceImpl extends BaseServiceImpl implements Sys sendErrorResponse(response, "找不到存储的文件"); return; } - CommonDownloadUtil.download(sys_file.getName(), IoUtil.readBytes(FileUtil.getInputStream(file)), response); + byte[] bytes = IoUtil.readBytes(FileUtil.getInputStream(file)); + if (writeImageResponse(sys_file, bytes, response)) { + return; + } + CommonDownloadUtil.download(sys_file.getName(), bytes, response); } else if (sys_file.getEngine().equals(SysFileEngineTypeEnum.MINIO.getValue())) { byte[] bytes = SysFileMinIoUtil.getFileBytes(sys_file.getBucket(), sys_file.getStoragePath()); + if (writeImageResponse(sys_file, bytes, response)) { + return; + } CommonDownloadUtil.download(sys_file.getName(), bytes, response); } } + private boolean handleCachedFileRequest(String id, HttpServletRequest request, HttpServletResponse response) { + String etag = buildFileEtag(id); + if (etag.equals(request.getHeader("If-None-Match"))) { + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + setImageCacheHeaders(response, etag); + return true; + } + return false; + } + + private Sys_file fetchDownloadFile(String id) { + if (StrUtil.isBlank(id)) { + return null; + } + Sys_file cached = downloadFileCache.get(id); + if (cached != null) { + return cached; + } + Sys_file sysFile = this.fetch(id); + if (sysFile != null) { + if (downloadFileCache.size() >= DOWNLOAD_FILE_CACHE_LIMIT) { + downloadFileCache.clear(); + } + downloadFileCache.put(id, sysFile); + } + return sysFile; + } + + private boolean handleCachedImageRequest(Sys_file sysFile, HttpServletRequest request, HttpServletResponse response) { + if (!isImage(sysFile)) { + return false; + } + String etag = buildFileEtag(sysFile); + if (etag.equals(request.getHeader("If-None-Match"))) { + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + setImageCacheHeaders(response, etag); + return true; + } + return false; + } + + private boolean writeImageResponse(Sys_file sysFile, byte[] bytes, HttpServletResponse response) throws IOException { + if (!isImage(sysFile)) { + return false; + } + setImageCacheHeaders(response, buildFileEtag(sysFile)); + response.setHeader("Content-Disposition", "inline;filename=" + java.net.URLEncoder.encode(sysFile.getName(), java.nio.charset.StandardCharsets.UTF_8)); + response.setHeader("Content-Length", String.valueOf(bytes.length)); + response.setContentType(getImageContentType(sysFile)); + IoUtil.write(response.getOutputStream(), true, bytes); + return true; + } + + private void setImageCacheHeaders(HttpServletResponse response, String etag) { + response.setHeader("Cache-Control", "public, max-age=604800, immutable"); + response.setHeader("ETag", etag); + response.setDateHeader("Expires", System.currentTimeMillis() + 604800000L); + } + + private String buildFileEtag(Sys_file sysFile) { + return buildFileEtag(sysFile.getId()); + } + + private String buildFileEtag(String id) { + return "\"" + id + "\""; + } + + private boolean isImage(Sys_file sysFile) { + String suffix = StrUtil.blankToDefault(sysFile.getSuffix(), FileUtil.extName(sysFile.getName())).toLowerCase(); + return "jpg".equals(suffix) || "jpeg".equals(suffix) || "png".equals(suffix) || "gif".equals(suffix) || "webp".equals(suffix) || "bmp".equals(suffix) || "svg".equals(suffix); + } + + private String getImageContentType(Sys_file sysFile) { + String suffix = StrUtil.blankToDefault(sysFile.getSuffix(), FileUtil.extName(sysFile.getName())).toLowerCase(); + return switch (suffix) { + case "jpg", "jpeg" -> "image/jpeg"; + case "png" -> "image/png"; + case "gif" -> "image/gif"; + case "webp" -> "image/webp"; + case "bmp" -> "image/bmp"; + case "svg" -> "image/svg+xml"; + default -> "application/octet-stream"; + }; + } + @Override public byte[] download(String id) throws IOException { - Sys_file sys_file = this.fetch(id); + Sys_file sys_file = fetchDownloadFile(id); if (ObjectUtil.isEmpty(sys_file)) { throw new IOException("文件记录不存在"); } @@ -147,7 +249,7 @@ public class SysFileServiceImpl extends BaseServiceImpl implements Sys @Override public Sys_file detail(String id) { - return fetch(id); + return fetchDownloadFile(id); } @Override diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysHomeTemplateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysHomeTemplateServiceImpl.java new file mode 100644 index 00000000..b024d12d --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/impl/SysHomeTemplateServiceImpl.java @@ -0,0 +1,15 @@ +package com.budwk.app.sys.services.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_home_template; +import com.budwk.app.sys.services.SysHomeTemplateService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +@IocBean(args = {"refer:dao"}) +public class SysHomeTemplateServiceImpl extends BaseServiceImpl implements SysHomeTemplateService { + + public SysHomeTemplateServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilter.java b/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilter.java new file mode 100644 index 00000000..f6a02a0b --- /dev/null +++ b/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilter.java @@ -0,0 +1,99 @@ +package com.budwk.app.web.commons.filter; + +import org.nutz.lang.Strings; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Locale; + +public class StaticResourceCacheFilter implements Filter { + + private static final int ONE_YEAR_SECONDS = 31536000; + private static final int SEVEN_DAYS_SECONDS = 604800; + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + applyCacheHeaders(request, response); + chain.doFilter(req, res); + } + + private void applyCacheHeaders(HttpServletRequest request, HttpServletResponse response) { + String path = Strings.sNull(request.getRequestURI()); + String contextPath = Strings.sNull(request.getContextPath()); + if (!contextPath.isBlank() && path.startsWith(contextPath)) { + path = path.substring(contextPath.length()); + } + if (!isStaticResourcePath(path)) { + return; + } + response.setHeader("Vary", "Accept-Encoding"); + if (hasVersionQuery(request)) { + setPublicCache(response, ONE_YEAR_SECONDS, true); + return; + } + if (path.startsWith("/components/")) { + response.setHeader("Cache-Control", "no-cache"); + return; + } + if (path.startsWith("/favicon/") || "/favicon.ico".equals(path)) { + setPublicCache(response, SEVEN_DAYS_SECONDS, false); + return; + } + if (isCacheableAsset(path)) { + setPublicCache(response, SEVEN_DAYS_SECONDS, false); + } + } + + private boolean isStaticResourcePath(String path) { + return path.startsWith("/assets/") || path.startsWith("/components/") || path.startsWith("/favicon/") || "/favicon.ico".equals(path); + } + + private boolean hasVersionQuery(HttpServletRequest request) { + String version = request.getParameter("v"); + return version != null && !version.isBlank(); + } + + private boolean isCacheableAsset(String path) { + String lowerPath = path.toLowerCase(Locale.ROOT); + return lowerPath.endsWith(".js") + || lowerPath.endsWith(".css") + || lowerPath.endsWith(".png") + || lowerPath.endsWith(".jpg") + || lowerPath.endsWith(".jpeg") + || lowerPath.endsWith(".gif") + || lowerPath.endsWith(".webp") + || lowerPath.endsWith(".svg") + || lowerPath.endsWith(".ico") + || lowerPath.endsWith(".woff") + || lowerPath.endsWith(".woff2") + || lowerPath.endsWith(".ttf") + || lowerPath.endsWith(".eot") + || lowerPath.endsWith(".otf") + || lowerPath.endsWith(".map"); + } + + private void setPublicCache(HttpServletResponse response, int maxAgeSeconds, boolean immutable) { + String cacheControl = "public, max-age=" + maxAgeSeconds; + if (immutable) { + cacheControl += ", immutable"; + } + response.setHeader("Cache-Control", cacheControl); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilterStarter.java b/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilterStarter.java new file mode 100644 index 00000000..4f309e47 --- /dev/null +++ b/src/main/java/com/budwk/app/web/commons/filter/StaticResourceCacheFilterStarter.java @@ -0,0 +1,62 @@ +package com.budwk.app.web.commons.filter; + +import org.nutz.boot.AppContext; +import org.nutz.boot.starter.WebFilterFace; +import org.nutz.ioc.Ioc; +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; + +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + +@IocBean +public class StaticResourceCacheFilterStarter implements WebFilterFace { + + @Inject("refer:$ioc") + protected Ioc ioc; + + @Inject + protected PropertiesProxy conf; + + @Inject + protected AppContext appContext; + + @Override + public String getName() { + return "staticResourceCacheFilterStarter"; + } + + @Override + public String getPathSpec() { + return "/*"; + } + + @Override + public EnumSet getDispatches() { + return EnumSet.of(DispatcherType.REQUEST); + } + + @IocBean(name = "staticResourceCacheFilter") + public StaticResourceCacheFilter createStaticResourceCacheFilter() { + return new StaticResourceCacheFilter(); + } + + @Override + public Filter getFilter() { + return ioc.get(StaticResourceCacheFilter.class, "staticResourceCacheFilter"); + } + + @Override + public Map getInitParameters() { + return new HashMap<>(); + } + + @Override + public int getOrder() { + return 10; + } +} diff --git a/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java b/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java index d6e4beff..08e22e14 100644 --- a/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java +++ b/src/main/java/com/budwk/app/web/controllers/open/commons/CommonController.java @@ -149,7 +149,7 @@ public class CommonController { @ApiOperation("系统配置") public Result getConfigKey(String key) { Sys_config configKey = sysDictService.dao().fetch(Sys_config.class, Cnd.where("configKey", "=", key)); - return Result.success().addData(configKey.getConfigValue()); + return Result.success().addData(configKey == null ? "" : configKey.getConfigValue()); } @At 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 1884735a..00bd1a7e 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 @@ -5,9 +5,12 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.ObjectUtil; import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.constant.RoleConstant; 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.culture.models.ActivityTissue; import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson; import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService; @@ -86,11 +89,56 @@ public class ActivityCultureInfoManageController { return Result.success(); } + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.culture.infoManage.school") + public Result setTemplate(@Valid String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + ActivityTissue tissue = activityCultureService.fetch(id); + if (tissue == null) { + return Result.error("活动不存在"); + } + if (tissue.getActivity_type() == null || tissue.getActivity_type() != 40001) { + return Result.error("仅校工会文化活动可设为模板"); + } + Sys_home_template oldHomeTemplate = activityCultureService.dao().fetch(Sys_home_template.class, id); + Sys_home_template sysHomeTemplate = tissue.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()); + } + } + activityCultureService.dao().insertOrUpdate(sysHomeTemplate); + return Result.success(); + } + + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("activity.culture.infoManage.school") + public Result cancelTemplate(@Valid String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + activityCultureService.dao().delete(Sys_home_template.class, id); + return Result.success(); + } + @At @Aop(TransAop.READ_COMMITTED) @SLog(tag = "文化活动", msg = "删除了一条活动") @SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union", "activity.culture.infoManage.club"}, mode = SaMode.OR) public Result doDelete(@Valid String id) { + if (activityCultureService.dao().fetch(Sys_home_template.class, id) != null) { + return Result.error("该活动已设为模板,请先取消模板后再删除"); + } activityCultureService.delete(id); activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", id)); activityCultureService.dao().delete(Sys_home_activity.class, id); diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java b/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java index b8b94cd9..3acb2ba0 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/models/ActivityTissue.java @@ -5,6 +5,7 @@ import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import com.budwk.app.base.model.CustomFormField; 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; @@ -291,4 +292,29 @@ public class ActivityTissue 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.getName()); + sysHomeTemplate.setTemplateName(this.getName()); + sysHomeTemplate.setCover(this.getCover()); + sysHomeTemplate.setContent(this.getActivityContent()); + if (this.getActivity_type() == 40001) { + sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/school?mode=edit&id=" + this.getId()); + } else if (this.getActivity_type() == 40002) { + sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/union?mode=edit&id=" + this.getId()); + } else { + sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/club?mode=edit&id=" + this.getId()); + } + sysHomeTemplate.setH5Url(""); + if (Lang.isNotEmpty(this.getApplyStartTime())) { + sysHomeTemplate.setStartDate(DateUtil.parseDate(this.getApplyStartTime())); + sysHomeTemplate.setEndDate(DateUtil.parseDate(this.getApplyEndTime())); + } + sysHomeTemplate.setAllowUserGroupId(this.getGroupId()); + sysHomeTemplate.setEnable(this.getIsUnseal()); + sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeTemplate; + } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java index a1e06aa2..bb26209a 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/service/impl/ActivityCultureServiceImpl.java @@ -109,7 +109,8 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl t.taskParentId, t.variable taskVariable, IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, - (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId + (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId, + IF(sht.id IS NULL, 0, 1) AS isTemplate FROM activity_tissue tissue LEFT JOIN sys_union uni ON uni.id = tissue.unionId @@ -118,6 +119,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.id LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN sys_home_template sht ON sht.id = tissue.id $condition """); 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 0892ef8c..694761a3 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 @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.activity.sports.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; @@ -9,6 +10,7 @@ import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; 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.basic.models.ActivityEvent; import com.budwk.app.zhgh.activity.sports.models.ActivitySchool; import com.budwk.app.zhgh.activity.sports.models.ActivitySchoolEvent; @@ -51,6 +53,9 @@ public class ActivitySportsInfoManageController { @Inject private Dao dao; + @Inject + private ActivityBasicScopeService activityBasicScopeService; + @At @SaCheckPermission("activity.sports.info") public Object pageData(PageForm page, @@ -128,7 +133,7 @@ public class ActivitySportsInfoManageController { @At - @SaCheckPermission("activity.sports.info") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Object getEventApply(@Param(value = "activityId") String activityId, @Param(value = "eventId") String[] eventId) { Cnd cnd = Cnd.NEW(); @@ -149,7 +154,7 @@ public class ActivitySportsInfoManageController { @At @SLog(tag = "体育活动", msg = "修改活动") - @SaCheckPermission("activity.sports.info") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Result doEdit(@Param(value = "data") ActivitySchool activitySchool, @Param(value = "events") ActivitySchoolEvent[] events) { activitySportsService.doEdit(activitySchool, events); @@ -160,7 +165,7 @@ public class ActivitySportsInfoManageController { @At @SLog(tag = "体育活动", msg = "添加活动") - @SaCheckPermission("activity.sports.info") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Result doAdd(@Param(value = "data") ActivitySchool activitySchool, @Param(value = "events") ActivitySchoolEvent[] events) { String id = activitySportsService.doAdd(activitySchool, events); @@ -170,7 +175,7 @@ public class ActivitySportsInfoManageController { } @At - @SaCheckPermission("activity.sports.info") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Result findOne(String id) { NutMap nutMap = (NutMap) dao.execute(Sqls.create("SELECT * FROM `activity_school` WHERE id = @id").setParam("id", id) .setCallback(Sqls.callback.map())).getResult(); @@ -199,7 +204,7 @@ public class ActivitySportsInfoManageController { @At @ApiOperation("根据比赛项目基础表统一赋年龄限制") - @SaCheckPermission("activity.sports.info") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) public Object doAssignmentDate(ActivitySchoolEvent[] events) { for (ActivitySchoolEvent event : events) { ActivityEvent activityEvent = dao.fetch(ActivityEvent.class,event.getEventId()); @@ -212,6 +217,28 @@ public class ActivitySportsInfoManageController { return Result.success(events); } + @At + @ApiOperation("获取分工会人数限制") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) + public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) { + Sql sql = Sqls.create(""" + SELECT + gh.id, + gh.name, + gh.unioncode, + (select count(1) from `vw_user` where unionid = gh.id $cnd) as teacherCount, + NULL as ratio, + NULL as limitCount + FROM + sys_union gh + order by gh.unioncode + """); + if (StrUtil.isNotBlank(activityScopeId)) { + sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")"); + } + return Result.success(activitySportsService.listMap(sql)); + } + @At @Ok("void") diff --git a/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsNewController.java b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsNewController.java new file mode 100644 index 00000000..d33ab022 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/sports/controller/ActivitySportsNewController.java @@ -0,0 +1,21 @@ +package com.budwk.app.zhgh.activity.sports.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import io.swagger.annotations.Api; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/activity/sports/new") +@Ok("json:full") +@Api(tags = "新建体育活动") +public class ActivitySportsNewController { + + @At("") + @Ok("beetl:platform/zhgh/activity/sports/new/index.html") + @SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR) + public void index() { + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyActivityController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyActivityController.java new file mode 100644 index 00000000..186ec999 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyActivityController.java @@ -0,0 +1,20 @@ +package com.budwk.app.zhgh.activity.trainSignUp.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.annotations.Api; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/trainSignUp/applyActivity") +@Ok("json:full") +@Api(tags = "品牌活动新建活动") +public class TrainSignUpApplyActivityController { + + @At("") + @Ok("beetl:/platform/zhgh/activity/trainSignUp/applyActivity/index.html") + @SaCheckPermission("trainSignUp.applyActivity") + public void index() { + } +} 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 3c7e66f3..9354203f 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 @@ -1,16 +1,21 @@ package com.budwk.app.zhgh.activity.trainSignUp.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.flow.entity.ProcessInstance; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; 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_union; import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService; import com.budwk.app.zhgh.activity.trainSignUp.models.*; import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService; @@ -72,7 +77,54 @@ public class TrainSignUpManageController { cnd.andEX("year", "=", year); cnd.and(Cnd.likeEX("activityName", activityName)); cnd.orderBy("createdAt", "desc"); - return Result.success().addData(trainSignUpActivityManageService.pageData(pageForm, cnd)); + Pagination pagination = trainSignUpActivityManageService.pageData(pageForm, cnd); + List list = pagination.getList(TrainSignUpActivity.class); + if (list != null && !list.isEmpty()) { + List ids = list.stream().map(TrainSignUpActivity::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("trainSignUp.manage") + public Result setTemplate(String id) { + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { + return Result.error("无权操作"); + } + TrainSignUpActivity activity = trainSignUpActivityManageService.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()); + } + } + dao.insertOrUpdate(sysHomeTemplate); + return Result.success(); + } + + @At + @ApiOperation("取消模板") + @SaCheckPermission("trainSignUp.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 @@ -80,6 +132,9 @@ public class TrainSignUpManageController { @SaCheckPermission("trainSignUp.manage") @SLog(tag = "品牌活动-活动管理", msg = "删除活动") public Result onDelete(String id) { + if (dao.fetch(Sys_home_template.class, id) != null) { + return Result.error("该活动已设为模板,请先取消模板后再删除"); + } Trans.exec(() -> { trainSignUpActivityManageService.delete(id); dao.clear(TrainSignUpCourse.class, Cnd.where("activityId", "=", id)); @@ -106,7 +161,7 @@ public class TrainSignUpManageController { @At @ApiOperation("查询单个活动") - @SaCheckPermission("trainSignUp") + @SaCheckPermission(value = {"trainSignUp", "trainSignUp.manage", "trainSignUp.applyActivity", "h5.trainSignUp.apply"}, mode = SaMode.OR) public Result findOne(@Param("id") @NotNull String id) { NutMap dataMap = trainSignUpActivityManageService.findOne(id, null, ""); String activityStartTime = dataMap.getString("activityStartTime"); @@ -154,7 +209,7 @@ public class TrainSignUpManageController { @At @Ok("json:full") @ApiOperation("品牌活动新增/修改") - @SaCheckPermission("trainSignUp.manage") + @SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR) @SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动") public Result doHandle(TrainSignUpActivity activity) { if (StrUtil.isBlank(activity.getId())) { @@ -168,7 +223,7 @@ public class TrainSignUpManageController { @At @Ok("json:full") @ApiOperation("获取分工会人数限制") - @SaCheckPermission("trainSignUp.manage") + @SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR) public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) { Sql sql = Sqls.create(""" SELECT @@ -192,7 +247,7 @@ public class TrainSignUpManageController { @At @Ok("json:full") @ApiOperation("获取报名人员数量") - @SaCheckPermission("trainSignUp.manage") + @SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR) public Result getRegisterUserCount(@Param(value = "courseId") String courseId) { return Result.success().addData(dao.count(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId))); } @@ -200,7 +255,7 @@ public class TrainSignUpManageController { @At @Ok("json:full") @ApiOperation("获取历史活动列表") - @SaCheckPermission("trainSignUp.manage") + @SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR) public Result getHistoricalActList() { List query = dao.query(TrainSignUpActivity.class, Cnd.NEW().desc("activityStartTime")); return Result.success().addData(query); @@ -209,7 +264,7 @@ public class TrainSignUpManageController { @At @Ok("json:full") @ApiOperation("查询分工会和社团") - @SaCheckPermission("trainSignUp.manage") + @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)); diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java index 2e7809c5..37b39285 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/models/TrainSignUpActivity.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.trainSignUp.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; @@ -109,6 +110,8 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH @Many(field = "activityId") private List typeLimits; + private Boolean isTemplate; + @Column @Comment("活动类型") @ColDefine(type = ColType.VARCHAR, width = 20) @@ -141,4 +144,23 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH 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/trainSignUp/applyActivity?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/dayofficework/asset/controller/AssetManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java index a9346b03..e2df45e8 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetManageController.java @@ -105,12 +105,12 @@ public class AssetManageController { @SLog(type = "assetManage", tag = "资产管理", msg = "编辑了一条资产信息") @SaCheckPermission("asset.manage") public Result doEdit(Asset asset) { + Asset fetch = assetService.fetch(asset.getId()); assetService.update(asset); //增加折旧表记录 - Asset fetch = assetService.fetch(asset.getId()); //如果资产类型不等于原来的或者预计报废时间不等于原来的 - if (!fetch.getAssetCategoryId().equals(asset.getAssetCategoryId()) || !fetch.getAssetRetiredAssetsDate().equals(asset.getAssetRetiredAssetsDate())) { + if (!ObjectUtil.equal(fetch.getAssetCategoryId(), asset.getAssetCategoryId()) || !ObjectUtil.equal(fetch.getAssetRetiredAssetsDate(), asset.getAssetRetiredAssetsDate())) { assetDepreciationRecordService.clear(Cnd.where("assetId", "=", asset.getId())); AssetDepreciationRecord record = assetDepreciationRecordService.initAssetDepreciationRecord(asset.getAssetUnitPrice(), asset.getAssetQuantity(), asset.getAssetUsedDate(), asset.getAssetRetiredAssetsDate()); if (ObjectUtil.isNotEmpty(record)) { diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/Asset.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/Asset.java index d4ec6c5c..03c42f0c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/Asset.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/Asset.java @@ -70,7 +70,7 @@ public class Asset extends BaseModel implements Serializable { @Column @Comment("单价") - @ColDefine(customType = "decimal(10,2)") + @ColDefine(customType = "decimal(18,2)") private BigDecimal assetUnitPrice; @Column diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/AssetDepreciationRecord.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/AssetDepreciationRecord.java index d7ce4ead..01016922 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/AssetDepreciationRecord.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/model/AssetDepreciationRecord.java @@ -43,22 +43,22 @@ public class AssetDepreciationRecord extends BaseModel implements Serializable { @Column @Comment("资产全部的价值") - @ColDefine(customType = "decimal(10,2)") + @ColDefine(customType = "decimal(18,2)") private BigDecimal assetAllMoney; @Column @Comment("剩余价值") - @ColDefine(customType = "decimal(10,2)") + @ColDefine(customType = "decimal(18,2)") private BigDecimal assetSurplusMoney; @Column @Comment("累计折旧多少钱") - @ColDefine(customType = "decimal(10,2)") + @ColDefine(customType = "decimal(18,2)") private BigDecimal assetDepreciationMoney; @Column @Comment("平均一个月多少钱") - @ColDefine(customType = "decimal(10,2)") + @ColDefine(customType = "decimal(18,2)") private BigDecimal assetAverageMonthMoney; @Column diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/service/impl/AssetDepreciationRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/service/impl/AssetDepreciationRecordServiceImpl.java index bc9fce14..8ea16917 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/service/impl/AssetDepreciationRecordServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/service/impl/AssetDepreciationRecordServiceImpl.java @@ -53,6 +53,16 @@ public class AssetDepreciationRecordServiceImpl extends BaseServiceImpl= 0) { //预计折旧到期时间 @@ -73,13 +83,13 @@ public class AssetDepreciationRecordServiceImpl extends BaseServiceImpl docMap = new HashMap<>(); - docMap.put("unionName", union.getName()); // 工会名称 + docMap.put("unionName", sysAdmin ? "全部工会" : union.getName()); // 工会名称 docMap.put("date", DateUtil.today()); // 当前日期 // 查询小家建设数据并设置序号 @@ -151,4 +205,50 @@ public class BuildHomeLittleHouseController { } } + private void fillCurrentUserOrg(BuildHomeLittleHouse house) { + Map currentUserOrg = getCurrentUserOrg(); + house.setUnionId(currentUserOrg.get("unionId")); + house.setUnionName(currentUserOrg.get("unionName")); + house.setUnitId(currentUserOrg.get("unitId")); + house.setUnitName(currentUserOrg.get("unitName")); + } + + private void keepOriginalOrg(BuildHomeLittleHouse house) { + BuildHomeLittleHouse oldHouse = dao.fetch(BuildHomeLittleHouse.class, house.getId()); + if (oldHouse == null) { + fillCurrentUserOrg(house); + return; + } + house.setUnionId(oldHouse.getUnionId()); + house.setUnionName(oldHouse.getUnionName()); + house.setUnitId(oldHouse.getUnitId()); + house.setUnitName(oldHouse.getUnitName()); + } + + private Map getCurrentUserOrg() { + Map currentUserOrg = new HashMap<>(); + View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())); + + String unionId = user != null && StrUtil.isNotBlank(user.getUnionId()) ? user.getUnionId() : SecurityUtil.getUnionId(); + String unionName = user != null ? user.getUnionName() : null; + if (StrUtil.isBlank(unionName) && StrUtil.isNotBlank(unionId)) { + Sys_union union = dao.fetch(Sys_union.class, unionId); + unionName = union != null ? union.getName() : unionId; + } + + currentUserOrg.put("unionId", unionId); + currentUserOrg.put("unionName", unionName); + currentUserOrg.put("unitId", user != null ? user.getUnitId() : SecurityUtil.getUnitId()); + currentUserOrg.put("unitName", user != null ? user.getUnitName() : null); + return currentUserOrg; + } + + private boolean isSysAdmin() { + return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name()); + } + + private boolean isValidCoordinate(Double value) { + return value != null && value >= 0 && value <= 100; + } + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java index 954ef1cf..4d5ec996 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/buildHome/models/BuildHomeLittleHouse.java @@ -1,10 +1,13 @@ package com.budwk.app.zhgh.dayofficework.buildHome.models; +import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; +import java.util.List; + @Data @EqualsAndHashCode(callSuper = true) @Table("build_home_little_house") @@ -22,6 +25,11 @@ public class BuildHomeLittleHouse extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 100) private String unitName; + @Column + @Comment("单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String unitId; + @Column @Comment("分工会ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -52,6 +60,21 @@ public class BuildHomeLittleHouse extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 100) private String openTime; + @Column + @Comment("图片视频资料") + @ColDefine(type = ColType.MYSQL_JSON) + private List mediaFiles; + + @Column + @Comment("地图X坐标百分比") + @ColDefine(type = ColType.FLOAT, width = 8, precision = 4) + private Double mapX; + + @Column + @Comment("地图Y坐标百分比") + @ColDefine(type = ColType.FLOAT, width = 8, precision = 4) + private Double mapY; + @Column @Comment("排序") @ColDefine(type = ColType.INT) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java new file mode 100644 index 00000000..e9a1ed9c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/caredata/CareDataLeaderCon.java @@ -0,0 +1,570 @@ +package com.budwk.app.zhgh.dayofficework.caredata; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import io.swagger.annotations.Api; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@IocBean +@At("/platform/careData/leader") +@Api("Leader dashboard") +@Ok("json:full") +public class CareDataLeaderCon { + + private static final int FINISHED_STATE = 20; + + @Inject + private Dao dao; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/indexOverlay.html") + @SaCheckPermission("careData.union") + public void index() { + } + + @At("proposal") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html") + @SaCheckPermission("careData.union") + public void proposal() { + } + + @At("condolence") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html") + @SaCheckPermission("careData.union") + public void condolence() { + } + + @At("baseUnion") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html") + @SaCheckPermission("careData.union") + public void baseUnion() { + } + + @At("club") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/clubOverlay.html") + @SaCheckPermission("careData.union") + public void club() { + } + + @At("dataMetric") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html") + @SaCheckPermission("careData.union") + public void dataMetric() { + } + + @At("assetData") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html") + @SaCheckPermission("careData.union") + public void assetData() { + } + + @At("staffHome") + @Ok("beetl:/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html") + @SaCheckPermission("careData.union") + public void staffHome() { + } + + @At + @SaCheckPermission("careData.union") + public Result proposalData(String sessionId) { + String currentSessionId = StrUtil.blankToDefault(sessionId, latestSessionId()); + if (StrUtil.isBlank(currentSessionId)) { + return Result.success(NutMap.NEW()); + } + + NutMap session = sessionInfo(currentSessionId); + List caseResults = caseResultData(currentSessionId); + NutMap overview = overviewData(currentSessionId, caseResults); + + return Result.success(NutMap.NEW() + .addv("session", session) + .addv("overview", overview) + .addv("caseResults", caseResults)); + } + + @At + @SaCheckPermission("careData.union") + public Result condolenceData(Integer year) { + int targetYear = year == null ? LocalDate.now().getYear() : year; + List rows = condolenceTypeRows(targetYear); + long total = rows.stream().mapToLong(row -> row.getLong("count", 0L)).sum(); + List sortedRows = new ArrayList<>(rows); + sortedRows.sort((left, right) -> Long.compare(right.getLong("count", 0L), left.getLong("count", 0L))); + List topRows = new ArrayList<>(); + int index = 1; + for (NutMap row : sortedRows) { + if (index > 5) { + break; + } + long count = row.getLong("count", 0L); + topRows.add(NutMap.NEW() + .addv("index", index++) + .addv("typeId", row.getString("id", "")) + .addv("typeCode", row.getString("code", "")) + .addv("name", row.getString("name", "")) + .addv("count", count) + .addv("rate", percent(count, total)) + .addv("rateValue", percentValue(count, total))); + } + + return Result.success(NutMap.NEW() + .addv("year", targetYear) + .addv("total", total) + .addv("types", topRows)); + } + + @At + @SaCheckPermission("careData.union") + public Result baseUnionData() { + return Result.success(NutMap.NEW().addv("unions", baseUnionRows())); + } + + @At + @SaCheckPermission("careData.union") + public Result clubData() { + return Result.success(NutMap.NEW().addv("clubs", clubRows())); + } + + @At + @SaCheckPermission("careData.union") + public Result dataMetricData(Integer year) { + int targetYear = year == null ? LocalDate.now().getYear() : year; + return Result.success(NutMap.NEW() + .addv("year", targetYear) + .addv("budgetTotal", schoolBudgetTotal(targetYear)) + .addv("tourCount", tourCount(targetYear)) + .addv("honorCount", honorCount(targetYear)) + .addv("difficultCount", difficultCount(targetYear)) + .addv("reimburseTotal", reimburseTotal(targetYear))); + } + + @At + @SaCheckPermission("careData.union") + public Result assetDataData() { + List states = assetUsageStateRows(); + long total = states.stream().mapToLong(row -> row.getLong("value", 0L)).sum(); + return Result.success(NutMap.NEW() + .addv("total", total) + .addv("states", states)); + } + + @At + @SaCheckPermission("careData.union") + public Result staffHomeData() { + return Result.success(NutMap.NEW().addv("houses", littleHouseRows())); + } + + private List littleHouseRows() { + Sql sql = Sqls.create(""" + SELECT + id, + unionName, + unitName, + address, + mediaFiles, + mapX, + mapY, + sortNum + FROM build_home_little_house + WHERE mapX IS NOT NULL + AND mapY IS NOT NULL + $unionFilter + ORDER BY sortNum ASC, id ASC + """); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND unionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return listMap(sql); + } + + private String latestSessionId() { + Sql sql = Sqls.create(""" + SELECT id + FROM teacher_congress_session + ORDER BY startDate DESC + LIMIT 1 + """); + return firstMap(sql).getString("id", ""); + } + + private List condolenceTypeRows(int year) { + Sql sql = Sqls.create(""" + SELECT + t.id, + t.code, + t.name, + COUNT(info.id) AS count + FROM condolence_type t + LEFT JOIN condolence info ON info.type = t.id + AND YEAR(info.createTime) = @year + $unionFilter + WHERE t.enable = 1 + GROUP BY t.id, t.code, t.name, t.sortNum + ORDER BY count DESC, t.sortNum ASC, t.code ASC + """); + sql.setParam("year", year); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND info.applyUnionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return listMap(sql); + } + + private List baseUnionRows() { + Sql sql = Sqls.create(""" + SELECT + un.id, + un.name AS unionname, + un.unionCode, + ( + SELECT COUNT(1) + FROM vw_user u + WHERE u.member = 1 + AND u.unionId = un.id + ) AS value + FROM sys_union un + WHERE un.delFlag = 0 + $unionFilter + ORDER BY un.unionCode + """); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND un.id = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return listMap(sql); + } + + private List clubRows() { + Sql sql = Sqls.create(""" + SELECT + c.id, + c.clubName, + c.clubCode, + ( + SELECT COUNT(1) + FROM club_user cu + WHERE cu.clubId = c.id + AND cu.delFlag = 0 + ) AS value + FROM sys_club c + WHERE c.delFlag = 0 + AND c.dismiss = 0 + ORDER BY c.clubCode + """); + return listMap(sql); + } + + private List assetUsageStateRows() { + Sql sql = Sqls.create(""" + SELECT + IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName) AS name, + SUM(IFNULL(t1.assetQuantity, 0)) AS value + FROM `asset` t1 + WHERE 1 = 1 + $unionFilter + GROUP BY IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName) + ORDER BY value DESC, name ASC + """); + sql.setParam("emptyName", "\u672a\u586b\u5199"); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND t1.assetUseUnionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return listMap(sql); + } + + private BigDecimal schoolBudgetTotal(int year) { + Sql sql = Sqls.create(""" + SELECT IFNULL(SUM(totalQuota), 0) AS total + FROM outlay_manage_school + WHERE delFlag = 0 + AND `year` = @year + """); + sql.setParam("year", year); + return firstMap(sql).getAs("total", BigDecimal.class); + } + + private long tourCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(DISTINCT t.id) AS count + FROM tour_ledger t + LEFT JOIN wf_process_instance ins ON ins.businessNo = t.id + WHERE t.delFlag = 0 + AND t.`year` = @year + AND (ins.id IS NULL OR ins.state = @finished) + $unionFilter + """); + sql.setParam("year", year); + sql.setParam("finished", FINISHED_STATE); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND t.unionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return firstMap(sql).getLong("count", 0L); + } + + private long honorCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(h.id) AS count + FROM honor h + WHERE h.delFlag = 0 + AND YEAR(h.grantDate) = @year + $unionFilter + """); + sql.setParam("year", year); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND h.unionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return firstMap(sql).getLong("count", 0L); + } + + private long difficultCount(int year) { + Sql sql = Sqls.create(""" + SELECT COUNT(DISTINCT info.id) AS count + FROM difficult_help_info info + INNER JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE info.delFlag = 0 + AND ins.state = @finished + AND YEAR(info.applyTime) = @year + $unionFilter + """); + sql.setParam("year", year); + sql.setParam("finished", FINISHED_STATE); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND info.unionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return firstMap(sql).getLong("count", 0L); + } + + private BigDecimal reimburseTotal(int year) { + Sql sql = Sqls.create(""" + SELECT + IFNULL(SUM( + CASE + WHEN info.realMoney IS NOT NULL THEN info.realMoney + WHEN info.money IS NOT NULL THEN info.money + WHEN info.condolenceMoney IS NOT NULL THEN info.condolenceMoney + ELSE 0 + END + ), 0) AS total + FROM union_reimburse info + WHERE info.delFlag = 0 + AND info.stateId IN (2, 3) + AND YEAR(info.createTime) = @year + $unionFilter + """); + sql.setParam("year", year); + if (canViewAllUnionData()) { + sql.setVar("unionFilter", ""); + } else { + sql.setVar("unionFilter", "AND info.unionId = @unionId"); + sql.setParam("unionId", SecurityUtil.getUnionId()); + } + return firstMap(sql).getAs("total", BigDecimal.class); + } + + private boolean canViewAllUnionData() { + return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + } + + private NutMap sessionInfo(String sessionId) { + Sql sql = Sqls.create(""" + SELECT id, fullName + FROM teacher_congress_session + WHERE id = @sessionId + """); + sql.setParam("sessionId", sessionId); + return firstMap(sql); + } + + private NutMap overviewData(String sessionId, List caseResults) { + Sql sql = Sqls.create(""" + SELECT + COUNT(info.id) AS total, + SUM(CASE WHEN ins.state = @finished THEN 1 ELSE 0 END) AS doneCount + FROM proposal_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE info.sessionId = @sessionId + """); + sql.setParam("sessionId", sessionId); + sql.setParam("finished", FINISHED_STATE); + NutMap overview = firstMap(sql); + + long filedCount = 0L; + long rejectedCount = 0L; + long suggestionCount = 0L; + for (NutMap item : caseResults) { + String name = item.getString("name", ""); + long count = item.getLong("count", 0L); + if (containsAny(name, "\u4e0d\u4e88", "\u4e0d\u7acb\u6848")) { + rejectedCount += count; + } else if (containsAny(name, "\u610f\u89c1", "\u5efa\u8bae")) { + suggestionCount += count; + } else if (name.contains("\u7acb\u6848")) { + filedCount += count; + } + } + + long total = overview.getLong("total", 0L); + long doneCount = overview.getLong("doneCount", 0L); + long satisfiedCount = satisfiedCount(sessionId); + + return NutMap.NEW() + .addv("total", total) + .addv("filedCount", filedCount) + .addv("suggestionCount", suggestionCount) + .addv("rejectedCount", rejectedCount) + .addv("doneCount", doneCount) + .addv("satisfiedRate", percent(satisfiedCount, doneCount)); + } + + private List caseResultData(String sessionId) { + Sql sql = Sqls.create(""" + SELECT + d.code, + d.name, + COUNT(info.id) AS count + FROM sys_dict parent + INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0 + LEFT JOIN proposal_info info ON info.caseFilingResult = d.code AND info.sessionId = @sessionId + WHERE parent.code = 'PROPOSAL_CASE_FILING_RESULT' + GROUP BY d.id, d.code, d.name, d.location + ORDER BY d.location + """); + sql.setParam("sessionId", sessionId); + return listMap(sql); + } + + private long satisfiedCount(String sessionId) { + List dicts = feedbackDicts(); + List rows = feedbackRows(sessionId); + return dicts.stream() + .filter(dict -> { + String name = dict.getString("name", ""); + return name.contains("\u6ee1\u610f") && !name.contains("\u4e0d\u6ee1\u610f"); + }) + .mapToLong(dict -> rows.stream() + .filter(row -> dict.getString("code", "").equals(row.getString("feedbackCode", ""))) + .count()) + .sum(); + } + + private List feedbackDicts() { + Sql sql = Sqls.create(""" + SELECT d.code, d.name + FROM sys_dict parent + INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0 + WHERE parent.code = 'PROPOSAL_FEEDBACK' + ORDER BY d.location + """); + return listMap(sql); + } + + private List feedbackRows(String sessionId) { + Sql sql = Sqls.create(""" + SELECT + t.variable + FROM proposal_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id + AND t.taskState = 20 + AND t.taskName = 'feedback' + WHERE ins.state = @finished + AND info.sessionId = @sessionId + GROUP BY info.id, t.variable + """); + sql.setParam("sessionId", sessionId); + sql.setParam("finished", FINISHED_STATE); + List rawRows = listMap(sql); + List rows = new ArrayList<>(); + for (NutMap row : rawRows) { + String variableStr = row.getString("variable", ""); + if (StrUtil.isBlank(variableStr)) { + continue; + } + NutMap variable = Json.fromJson(NutMap.class, variableStr); + rows.add(NutMap.NEW().addv("feedbackCode", variable.getString("tf_feedback", ""))); + } + return rows; + } + + private List listMap(Sql sql) { + sql.setCallback(Sqls.callback.maps()); + dao.execute(sql); + return sql.getList(NutMap.class); + } + + private NutMap firstMap(Sql sql) { + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap map = sql.getObject(NutMap.class); + return map == null ? NutMap.NEW() : map; + } + + private boolean containsAny(String text, String... keywords) { + if (StrUtil.isBlank(text)) { + return false; + } + for (String keyword : keywords) { + if (text.contains(keyword)) { + return true; + } + } + return false; + } + + private String percent(long count, long total) { + if (total <= 0) { + return "0%"; + } + BigDecimal value = BigDecimal.valueOf(count) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP); + return value.stripTrailingZeros().toPlainString() + "%"; + } + + private BigDecimal percentValue(long count, long total) { + if (total <= 0) { + return BigDecimal.ZERO; + } + return BigDecimal.valueOf(count) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP) + .stripTrailingZeros(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorManageController.java index 418ea06a..02e647da 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorManageController.java @@ -55,6 +55,43 @@ public class HonorManageController { } + @At("/h5") + @SaCheckLogin + @Ok("beetl:/platform/zhghh5/dayofficework/honor/manage/index.html") + public void h5() { + + } + + @At + @SaCheckLogin + public Result h5Data(HonorPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + h.id, + h.userName, + h.applyUnionName, + h.unionName, + h.grantDate, + h.photoFiles, + prize.`name` AS prizeName, + type.`name` AS typeName, + type.queryTypeCode AS typeQueryTypeCode + FROM + `honor` h + LEFT JOIN honor_basic_settings prize ON prize.id = h.prize + LEFT JOIN honor_basic_settings type ON type.id = h.honorType + $condition + """); + Cnd cnd = Cnd.NEW(); + Integer year = pageForm.getYear() == null ? Calendar.getInstance().get(Calendar.YEAR) : pageForm.getYear(); + cnd.andEX("YEAR(h.grantDate)", "=", year); + cnd.andEX("h.honorType", "=", pageForm.getHonorType()); + cnd.desc("h.grantDate"); + sql.setCondition(cnd); + Pagination pagination = honorViService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + @At @SaCheckPermission("honor.manage") public Result pageData(HonorPageForm pageForm) { diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/Honor.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/Honor.java index c2740480..bc1f4978 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/Honor.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/Honor.java @@ -222,5 +222,10 @@ public class Honor extends BaseModel { @Comment("附件") private List files; + @Column + @ColDefine(type = ColType.MYSQL_JSON) + @Comment("荣誉照片") + private List photoFiles; + private String loginname; } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java index 3289b713..3d5b26d2 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java @@ -92,8 +92,22 @@ public class CondolenceMineController { condolence info LEFT JOIN condolence_type type ON info.type = type.id LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 - LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN ( + SELECT + id, + processInstanceId, + taskName, + displayName, + taskType, + performType, + taskState, + finishTime, + taskParentId, + variable, + ROW_NUMBER() OVER (PARTITION BY processInstanceId ORDER BY createdAt DESC, id DESC) AS rn + FROM wf_process_task + WHERE taskState = 10 + ) t ON t.processInstanceId = ins.id AND t.rn = 1 $condition """); Cnd cnd = Cnd.NEW(); diff --git a/src/main/resources/db/asset_money_decimal_expand.sql b/src/main/resources/db/asset_money_decimal_expand.sql new file mode 100644 index 00000000..80c2cd86 --- /dev/null +++ b/src/main/resources/db/asset_money_decimal_expand.sql @@ -0,0 +1,8 @@ +ALTER TABLE `asset` + MODIFY COLUMN `assetUnitPrice` DECIMAL(18, 2) NULL COMMENT '单价'; + +ALTER TABLE `asset_depreciation_record` + MODIFY COLUMN `assetAllMoney` DECIMAL(18, 2) NULL COMMENT '资产全部的价值', + MODIFY COLUMN `assetSurplusMoney` DECIMAL(18, 2) NULL COMMENT '剩余价值', + MODIFY COLUMN `assetDepreciationMoney` DECIMAL(18, 2) NULL COMMENT '累计折旧多少钱', + MODIFY COLUMN `assetAverageMonthMoney` DECIMAL(18, 2) NULL COMMENT '平均一个月多少钱'; diff --git a/src/main/resources/db/build_home_little_house_add_map_coordinate.sql b/src/main/resources/db/build_home_little_house_add_map_coordinate.sql new file mode 100644 index 00000000..75327274 --- /dev/null +++ b/src/main/resources/db/build_home_little_house_add_map_coordinate.sql @@ -0,0 +1,3 @@ +ALTER TABLE `build_home_little_house` + ADD COLUMN `mapX` DECIMAL(8,4) NULL COMMENT '地图X坐标百分比' AFTER `mediaFiles`, + ADD COLUMN `mapY` DECIMAL(8,4) NULL COMMENT '地图Y坐标百分比' AFTER `mapX`; diff --git a/src/main/resources/db/build_home_little_house_add_unit_media.sql b/src/main/resources/db/build_home_little_house_add_unit_media.sql new file mode 100644 index 00000000..724c601f --- /dev/null +++ b/src/main/resources/db/build_home_little_house_add_unit_media.sql @@ -0,0 +1,3 @@ +ALTER TABLE `build_home_little_house` + ADD COLUMN `unitId` VARCHAR(32) NULL COMMENT '单位ID' AFTER `unitName`, + ADD COLUMN `mediaFiles` JSON NULL COMMENT '图片视频资料' AFTER `openTime`; diff --git a/src/main/resources/db/honor_add_photo_files.sql b/src/main/resources/db/honor_add_photo_files.sql new file mode 100644 index 00000000..d890eb6b --- /dev/null +++ b/src/main/resources/db/honor_add_photo_files.sql @@ -0,0 +1,2 @@ +ALTER TABLE `honor` + ADD COLUMN `photoFiles` JSON NULL COMMENT '荣誉照片' AFTER `files`; diff --git a/src/main/resources/db/menu/init_sys_worktemplate_menu.sql b/src/main/resources/db/menu/init_sys_worktemplate_menu.sql new file mode 100644 index 00000000..a21bc4fc --- /dev/null +++ b/src/main/resources/db/menu/init_sys_worktemplate_menu.sql @@ -0,0 +1,64 @@ +-- Home work template menu. Prefer a sibling of sys.homeActivity, then sys.manager, then sys. +INSERT INTO sys_menu ( + id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, + permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, + delFlag, platform, moduleId, picIcon, initialPinyinName, isRecommendApp, isRecommendService +) +SELECT + 'e6ed122326a8492fa7f415f97eaf4f01', + parent.id, + CONCAT(parent.path, LPAD(IFNULL(child.maxNo, 0) + 1, 4, '0')), + 'Work Template', + 'Work Template', + 'menu', + '/platform/sys/worktemplate', + 'data-pjax', + '', + 1, + 0, + 'sys.worktemplate', + NULL, + IFNULL(child.maxLocation, 0) + 1, + 0, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + '', + UNIX_TIMESTAMP(NOW()) * 1000, + 0, + 'PC', + NULL, + NULL, + 'g', + 0, + 0 +FROM ( + SELECT p.* + FROM sys_menu p + WHERE p.id = (SELECT h.parentId FROM sys_menu h WHERE h.permission = 'sys.homeActivity' LIMIT 1) + OR p.permission IN ('sys.manager', 'sys') + ORDER BY + CASE + WHEN p.id = (SELECT h.parentId FROM sys_menu h WHERE h.permission = 'sys.homeActivity' LIMIT 1) THEN 0 + WHEN p.permission = 'sys.manager' THEN 1 + ELSE 2 + END + LIMIT 1 +) parent +LEFT JOIN ( + SELECT parentId, + MAX(CAST(RIGHT(path, 4) AS UNSIGNED)) AS maxNo, + MAX(location) AS maxLocation + FROM sys_menu + GROUP BY parentId +) child ON child.parentId = parent.id +WHERE NOT EXISTS ( + SELECT 1 FROM sys_menu WHERE permission = 'sys.worktemplate' +); + +INSERT INTO sys_role_menu (roleId, menuId) +SELECT r.id, m.id +FROM sys_role r +JOIN sys_menu m ON m.permission = 'sys.worktemplate' +LEFT JOIN sys_role_menu rm ON rm.roleId = r.id AND rm.menuId = m.id +WHERE r.code = 'SYSADMIN' + AND rm.roleId IS NULL; diff --git a/src/main/resources/db/sys_config_config_value_text.sql b/src/main/resources/db/sys_config_config_value_text.sql new file mode 100644 index 00000000..ddf99609 --- /dev/null +++ b/src/main/resources/db/sys_config_config_value_text.sql @@ -0,0 +1,2 @@ +ALTER TABLE `sys_config` + MODIFY COLUMN `configValue` TEXT; diff --git a/src/main/resources/db/sys_home_template_add_template_icon.sql b/src/main/resources/db/sys_home_template_add_template_icon.sql new file mode 100644 index 00000000..a68436fe --- /dev/null +++ b/src/main/resources/db/sys_home_template_add_template_icon.sql @@ -0,0 +1,2 @@ +ALTER TABLE `sys_home_template` + ADD COLUMN `templateIcon` varchar(255) DEFAULT NULL COMMENT 'template icon' AFTER `templateName`; diff --git a/src/main/resources/db/sys_home_template_add_template_name.sql b/src/main/resources/db/sys_home_template_add_template_name.sql new file mode 100644 index 00000000..6705e146 --- /dev/null +++ b/src/main/resources/db/sys_home_template_add_template_name.sql @@ -0,0 +1,6 @@ +ALTER TABLE `sys_home_template` + ADD COLUMN `templateName` varchar(50) DEFAULT NULL COMMENT 'display template name' AFTER `name`; + +UPDATE `sys_home_template` +SET `templateName` = `name` +WHERE (`templateName` IS NULL OR `templateName` = ''); diff --git a/src/main/resources/db/sys_home_template_create.sql b/src/main/resources/db/sys_home_template_create.sql new file mode 100644 index 00000000..32654ae4 --- /dev/null +++ b/src/main/resources/db/sys_home_template_create.sql @@ -0,0 +1,25 @@ +CREATE TABLE IF NOT EXISTS `sys_home_template` ( + `id` varchar(32) NOT NULL COMMENT 'business id', + `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', + `cover` varchar(255) DEFAULT NULL COMMENT 'template cover', + `content` text COMMENT 'template content', + `url` varchar(1000) DEFAULT NULL COMMENT 'pc url', + `h5Url` varchar(1000) DEFAULT NULL COMMENT 'h5 url', + `allowUserGroupId` int DEFAULT NULL COMMENT 'allowed user group id', + `allowUserSql` varchar(1000) DEFAULT NULL COMMENT 'allowed user sql', + `enable` tinyint(1) DEFAULT 0 COMMENT 'enabled', + `classPath` varchar(500) DEFAULT NULL COMMENT 'source class path', + `top` tinyint(1) DEFAULT 0 COMMENT 'top flag', + `push` tinyint(1) DEFAULT 0 COMMENT 'push flag', + `sortNo` int DEFAULT 0 COMMENT 'sort number', + `startDate` datetime DEFAULT NULL COMMENT 'start date', + `endDate` datetime DEFAULT NULL COMMENT 'end date', + `createdBy` varchar(32) DEFAULT NULL, + `createdAt` bigint DEFAULT NULL, + `updatedBy` varchar(32) DEFAULT NULL, + `updatedAt` bigint DEFAULT NULL, + `delFlag` tinyint(1) DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='home work template'; diff --git a/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png new file mode 100644 index 00000000..095ebdbf Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/asset-data-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png new file mode 100644 index 00000000..095ebdbf Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png new file mode 100644 index 00000000..5f242061 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-a.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png new file mode 100644 index 00000000..dfbfabc2 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/base-union-row-b.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png new file mode 100644 index 00000000..095ebdbf Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/condolence-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png new file mode 100644 index 00000000..54564a4d Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-graph.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png new file mode 100644 index 00000000..095ebdbf Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/data-metric-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png new file mode 100644 index 00000000..7b4ba438 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg-latest.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg new file mode 100644 index 00000000..cf5f40cb Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/leader-bg.jpg differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png b/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png new file mode 100644 index 00000000..07c3af26 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/member-count-bg.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png new file mode 100644 index 00000000..ff05006a Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-circle.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png new file mode 100644 index 00000000..ae7f6278 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-culture.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png new file mode 100644 index 00000000..fb7f4193 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-democracy.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png new file mode 100644 index 00000000..3b3c0160 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-home.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png new file mode 100644 index 00000000..f203f650 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-member.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png b/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png new file mode 100644 index 00000000..fd7a8030 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/nav-rights.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png new file mode 100644 index 00000000..2c2546d9 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-done.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png new file mode 100644 index 00000000..cfc6e98c Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-filed.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png new file mode 100644 index 00000000..a6ee860e Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-rejected.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png new file mode 100644 index 00000000..0af01c25 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-satisfied.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png new file mode 100644 index 00000000..25fd3a40 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-suggestion.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png new file mode 100644 index 00000000..9e497761 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card-total.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png new file mode 100644 index 00000000..abdc93d8 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-card.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png new file mode 100644 index 00000000..095ebdbf Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-panel.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png b/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png new file mode 100644 index 00000000..b87e8b43 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/proposal-title.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png b/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png new file mode 100644 index 00000000..0fb8cf91 Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/staff-home-campus-map.png differ diff --git a/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png b/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png new file mode 100644 index 00000000..3d95e6bd Binary files /dev/null and b/src/main/resources/static/assets/platform/images/careData/leader/system-header-bg.png differ diff --git a/src/main/resources/static/assets/platform/images/tour/tour-direct-family-icon.png b/src/main/resources/static/assets/platform/images/tour/tour-direct-family-icon.png new file mode 100644 index 00000000..4c97f1fa Binary files /dev/null and b/src/main/resources/static/assets/platform/images/tour/tour-direct-family-icon.png differ diff --git a/src/main/resources/static/assets/platform/js/util/voiceMenuNavigator.js b/src/main/resources/static/assets/platform/js/util/voiceMenuNavigator.js index 5fb5aae7..3d5cfd32 100644 --- a/src/main/resources/static/assets/platform/js/util/voiceMenuNavigator.js +++ b/src/main/resources/static/assets/platform/js/util/voiceMenuNavigator.js @@ -18,6 +18,7 @@ recognition: null, listening: false, menus: null, + platform: "PC", parentMap: {}, lastText: "", pendingMatches: [], @@ -128,7 +129,39 @@ } } - function getMenus() { + function getCurrentPlatform() { + const $button = $("#voice-menu-btn") + return String(($button.data("platform") || state.platform || "PC")).toUpperCase() + } + + function setCurrentPlatform(platform) { + const nextPlatform = String(platform || "PC").toUpperCase() + if (state.platform !== nextPlatform) { + state.menus = null + state.parentMap = {} + } + state.platform = nextPlatform + return state.platform + } + + function filterMenusByPlatform(menus, platform) { + const currentPlatform = String(platform || "PC").toUpperCase() + return (menus || []).filter(function (menu) { + return String(menu.platform || "PC").toUpperCase() === currentPlatform + }) + } + + function setMenus(menus, platform) { + state.parentMap = {} + state.menus = filterMenusByPlatform(flattenMenus(menus, "", []), platform).filter(function (menu) { + return menu.href + }) + return state.menus + } + + function getMenus(platform) { + platform = String(platform || getCurrentPlatform()).toUpperCase() + setCurrentPlatform(platform) const cached = state.menus if (cached && cached.length) { return $.Deferred().resolve(cached).promise() @@ -136,35 +169,22 @@ const storeMenus = getStoreMenus() if (storeMenus && storeMenus.length) { - state.menus = flattenMenus(storeMenus, "", []).filter(function (menu) { - return menu.href - }) - return $.Deferred().resolve(state.menus).promise() + return $.Deferred().resolve(setMenus(storeMenus, platform)).promise() } return $.get("/platform/sys/user/getLogonUser").then(function (res) { if (res && res.code === 0 && res.data && res.data.menus) { - state.parentMap = {} - state.menus = flattenMenus(res.data.menus, "", []).filter(function (menu) { - return menu.href - }) - return state.menus + return setMenus(res.data.menus, platform) } const sessionMenus = getSessionMenus() if (sessionMenus && sessionMenus.length) { - state.menus = flattenMenus(sessionMenus, "", []).filter(function (menu) { - return menu.href - }) - return state.menus + return setMenus(sessionMenus, platform) } return [] }, function () { const sessionMenus = getSessionMenus() if (sessionMenus && sessionMenus.length) { - state.menus = flattenMenus(sessionMenus, "", []).filter(function (menu) { - return menu.href - }) - return state.menus + return setMenus(sessionMenus, platform) } return [] }) @@ -409,7 +429,7 @@ }) return } - getMenus().then(function (menus) { + getMenus(getCurrentPlatform()).then(function (menus) { const matches = matchMenus(state.lastText, menus) runAfterRecognitionEnd(function () { chooseMenu(matches) @@ -423,6 +443,7 @@ function init() { $(document).on("click", "#voice-menu-btn", function () { + setCurrentPlatform($(this).data("platform") || "PC") start() }) } diff --git a/src/main/resources/static/components/plugins/sysUpload/index.vue b/src/main/resources/static/components/plugins/sysUpload/index.vue index a48773ac..9ddfa92f 100644 --- a/src/main/resources/static/components/plugins/sysUpload/index.vue +++ b/src/main/resources/static/components/plugins/sysUpload/index.vue @@ -10,7 +10,7 @@ :on-exceed="handleExceed" :on-remove="handleRemove" :before-upload="beforeUpload" - :limit="upload_number" + :limit="uploadLimitNumber" :accept="fileAccept" :multiple="true" > @@ -31,7 +31,7 @@ :on-remove="handleRemove" :before-upload="beforeUpload" :on-exceed="handleExceed" - :limit="upload_number" + :limit="uploadLimitNumber" :accept="fileAccept" :multiple="true" list-type="picture-card" @@ -71,7 +71,7 @@ :on-remove="handleRemove" :on-exceed="handleExceed" :before-upload="beforeUpload" - :limit="upload_number" + :limit="uploadLimitNumber" :accept="fileAccept" class="drag-upload" :class="{ 'drag-upload-disabled': uploadMode !== 'pc' }" @@ -123,7 +123,7 @@ module.exports = { }, // 上传数量 upload_number: { - type: Number, + type: [Number, String], default: 1, required: false }, @@ -198,8 +198,12 @@ module.exports = { action() { return this.upload_result_type === "id" ? this.upload_return_id_api : this.upload_dynamic_return_url_api }, + uploadLimitNumber() { + const number = Number(this.upload_number) + return Number.isFinite(number) && number > 0 ? number : 1 + }, upload_tips() { - const uploadNumber = this.upload_number + const uploadNumber = this.uploadLimitNumber const fileAccept = this.fileAccept const fileSize = this.upload_size @@ -359,10 +363,12 @@ module.exports = { handleRemove(file, fileList) { if (this.upload_result_category === "interval") { - if (this.upload_result_type === "id") { - } - if (this.upload_result_type === "url") { - } + const resultIntervalValue = fileList + .map((item) => item.response && item.response.data ? item.response.data : item.url || item.data) + .filter((item) => item) + .join(",") + this.$emit("update:value", resultIntervalValue) + return } if (this.upload_result_category === "array") { @@ -381,13 +387,11 @@ module.exports = { ) } } - } else { - this.$emit("update:value", fileList) } }, handleExceed(files, fileList) { - this.$message.warning("最多只能上传" + this.upload_number + "个文件") + this.$message.warning("最多只能上传" + this.uploadLimitNumber + "个文件") }, // 上传事件 @@ -562,8 +566,8 @@ module.exports = { const originFileList = this.fileList || [] console.log(data.files) - if (this.upload_number) { - if (originFileList.length + data.files.length > this.upload_number) { + if (this.uploadLimitNumber) { + if (originFileList.length + data.files.length > this.uploadLimitNumber) { this.$message.error("上传文件数量超出限制") return } diff --git a/src/main/resources/views/layouts/platform_h5.html b/src/main/resources/views/layouts/platform_h5.html index 6e0596c1..50966147 100644 --- a/src/main/resources/views/layouts/platform_h5.html +++ b/src/main/resources/views/layouts/platform_h5.html @@ -56,6 +56,7 @@ + @@ -167,10 +168,20 @@ func && typeof func === "function" && func() } + function returnH5Home(activeTab = "home") { + if (window.store && typeof window.store.commit === "function") { + window.store.commit("setActiveTarBar", activeTab || "home") + } + window.location.replace("/platform/h5/home") + } + Vue.mixin({ methods: { historyBack: function(func = ()=>{}) { historyBack(func); + }, + returnH5Home: function(activeTab = "home") { + returnH5Home(activeTab) } }, created() { @@ -397,19 +408,49 @@ +
@@ -417,6 +458,10 @@
${layoutContent}
+ diff --git a/src/main/resources/views/layouts/platform_leader_dashboard.html b/src/main/resources/views/layouts/platform_leader_dashboard.html new file mode 100644 index 00000000..888ce127 --- /dev/null +++ b/src/main/resources/views/layouts/platform_leader_dashboard.html @@ -0,0 +1,47 @@ + + + + + + + 数智工会领导驾驶舱 + + + + + + + + + + +${layoutContent!} + + diff --git a/src/main/resources/views/layouts/platform_tour_signup_h5.html b/src/main/resources/views/layouts/platform_tour_signup_h5.html new file mode 100644 index 00000000..972edb07 --- /dev/null +++ b/src/main/resources/views/layouts/platform_tour_signup_h5.html @@ -0,0 +1,164 @@ + + + + + + + 智慧工会 + + + + + + + + + + + + + + +
+
+
${layoutContent}
+
+
+ + diff --git a/src/main/resources/views/layouts/v4/baseLayout.html b/src/main/resources/views/layouts/v4/baseLayout.html index 32d3fdbe..63e55724 100644 --- a/src/main/resources/views/layouts/v4/baseLayout.html +++ b/src/main/resources/views/layouts/v4/baseLayout.html @@ -709,7 +709,7 @@
- diff --git a/src/main/resources/views/layouts/v4/home.html b/src/main/resources/views/layouts/v4/home.html index 953eaa7a..81a91068 100644 --- a/src/main/resources/views/layouts/v4/home.html +++ b/src/main/resources/views/layouts/v4/home.html @@ -1513,7 +1513,7 @@ layout("/layouts/v4/baseLayout.html"){
- +
@@ -2020,6 +2020,7 @@ layout("/layouts/v4/baseLayout.html"){ recommendServices: [], favoriteItems: [], recommendApps: [], + homeBannerList: "${config.AppHomeImg!}".split(",").map(item => item.trim()).filter(item => item), // 工会网站新闻 websiteNews: {}, diff --git a/src/main/resources/views/layouts/v4/home/index.html b/src/main/resources/views/layouts/v4/home/index.html index d4fd23a3..7ab4b8c3 100644 --- a/src/main/resources/views/layouts/v4/home/index.html +++ b/src/main/resources/views/layouts/v4/home/index.html @@ -73,7 +73,7 @@ layout("/layouts/v4/baseLayout.html"){
@@ -87,6 +87,8 @@ layout("/layouts/v4/baseLayout.html"){
+ + @@ -94,6 +96,7 @@ layout("/layouts/v4/baseLayout.html"){ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js index a75d39e6..72155ba7 100644 --- a/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js +++ b/src/main/resources/views/platform/zhgh/activity/culture/common/applyActivity.js @@ -949,39 +949,44 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { return data }, async init(id) { - if (id) { - this.activeName = "1" - this.findOne(id) - } else { - this.formData = { - time: [], - applyTime2: [], - plannedDate: [], - goods: [], - billFiles: [], - photoFiles: [], - otherFiles: [], - tissuePersonList: [], - unionUserNumberLimit: [], - signUpMethod: null, - rangerMeter: 100, - isEnrollSystem: true, - isPushHome: 0, - isIntegral: false + this.formLoading = true + try { + if (id) { + this.activeName = "1" + await this.findOne(id) + } else { + this.formData = { + time: [], + applyTime2: [], + plannedDate: [], + goods: [], + billFiles: [], + photoFiles: [], + otherFiles: [], + tissuePersonList: [], + unionUserNumberLimit: [], + signUpMethod: null, + rangerMeter: 100, + isEnrollSystem: true, + isPushHome: 0, + isIntegral: false + } + this.generateActivityCode().then((data) => { + this.$set(this.formData, "activityCode", data) + }) + this.getUnionData().then((data) => { + this.$set(this.formData, "unionUserNumberLimit", data) + }) } - this.generateActivityCode().then((data) => { - this.$set(this.formData, "activityCode", data) - }) - this.getUnionData().then((data) => { - this.$set(this.formData, "unionUserNumberLimit", data) + 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) + } finally { + this.formLoading = false } - 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) }, async queryUserByIds(ids) { const {data} = await this.$axios.post("/platform/activity/culture/applyActivity/queryUserByIds", {ids: JSON.stringify(ids)}) @@ -1018,6 +1023,14 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { this.bizId = row.id this.activeName = "1" this.init(row.id) + }, + openUrlEdit() { + const params = new URLSearchParams(window.location.search) + const mode = params.get("mode") + const id = params.get("id") + if (mode === "edit" && id) { + this.openEdit({id}) + } } }, async created() { @@ -1030,5 +1043,8 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = { }) this.getActivityGroup() // this.init() + }, + mounted() { + this.openUrlEdit() } } diff --git a/src/main/resources/views/platform/zhgh/activity/culture/common/infoMange.js b/src/main/resources/views/platform/zhgh/activity/culture/common/infoMange.js index df8c091e..0d742030 100644 --- a/src/main/resources/views/platform/zhgh/activity/culture/common/infoMange.js +++ b/src/main/resources/views/platform/zhgh/activity/culture/common/infoMange.js @@ -112,7 +112,18 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { 撤回 - + 设为模板 + + + 取消模板 + + + 删除 @@ -209,6 +220,10 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { this.onRevoke(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 === "openCode") { this.url = location.origin + "/platform/h5/activity/culture/signUp?id=" + row.id + "&groupId=" + row.groupId this.codeDialogVisible = true @@ -231,6 +246,10 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { }) }, doDelete(row) { + if (row.isTemplate) { + this.$message.warning("该活动已设为模板,请先取消模板后再删除") + return + } const {id} = row this.$confirm("确定要删除该活动吗?", "提示", {type: "warning"}).then(async () => { this.$set(row, "loading", true) @@ -244,6 +263,40 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { this.$set(row, "loading", false) }) }, + setTemplate(row) { + this.$confirm("确定将该活动设为工作模板吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + this.$set(row, "loading", true) + const resp = await this.$axios.post("/platform/activity/culture/infoManage/setTemplate", {id: row.id}) + if (resp.code === 0) { + this.doSearch() + this.$message.success(resp.msg) + } else { + this.$message.error(resp.msg) + } + this.$set(row, "loading", false) + }) + }, + cancelTemplate(row) { + this.$confirm("确定取消该活动的工作模板吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + this.$set(row, "loading", true) + const resp = await this.$axios.post("/platform/activity/culture/infoManage/cancelTemplate", {id: row.id}) + if (resp.code === 0) { + this.doSearch() + this.$message.success(resp.msg) + } else { + this.$message.error(resp.msg) + } + this.$set(row, "loading", false) + }) + }, onRevoke(row) { this.$confirm("您确定要撤回吗?", "提示", { confirmButtonText: "确定", @@ -268,7 +321,8 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { } }) this.tableLoading = false - } + }, + }, async created() { // 根据 activity_type 动态添加流程相关列 @@ -279,5 +333,5 @@ const ACTIVITY_CULTURE_INFO_MANAGE = { ); } this.pageData() - } + }, } 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 5afc5062..de242c58 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 @@ -656,7 +656,7 @@ async applyUserModelInput(val) { if (val === 2) { if (!this.eventForm.unionLimit || this.eventForm.unionLimit.length === 0) { - const resp = await $.get(loc() + "/getUnionLimit", { activityScopeId: this.eventForm.activityGroupId }) + const resp = await $.get("/platform/activity/sports/info/mange/getUnionLimit", { activityScopeId: this.eventForm.activityGroupId }) if (resp.code === 0) { this.$set(this.eventForm, "unionLimit", resp.data) } @@ -736,7 +736,7 @@ spinner: "el-icon-loading", background: "rgba(0,0,0,.45)" }) - const resp = await this.$axios.post(loc() + "/doAssignmentDate", { + const resp = await this.$axios.post("/platform/activity/sports/info/mange/doAssignmentDate", { eventIds: JSON.stringify(this.checkedEventInfo.map((v) => v.id)), events: JSON.stringify(this.checkedEventInfo) }) @@ -1043,7 +1043,7 @@ }, async operate() { const deleteEventIds = this.eventsIds.filter((v) => !this.formData.eventsIds.includes(v)) - const { data } = await $.get(loc() + "/getEventApply", { + const { data } = await $.get("/platform/activity/sports/info/mange/getEventApply", { activityId: this.formData.id, eventId: JSON.stringify(deleteEventIds) }) 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 new file mode 100644 index 00000000..a0daba0a --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/sports/new/index.html @@ -0,0 +1,77 @@ + + +
+ +
+
+ 保 存 + 提 交 + +
+
+ + +
+
+ + + + + + 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 new file mode 100644 index 00000000..c44ae31b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/applyActivity/index.html @@ -0,0 +1,58 @@ + + + + +
+ + + +
+ + + + 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 efcc890b..d39b5193 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 @@ -1,5 +1,5 @@ - - + + const basicForm = { template: /*language=HTML*/ `
diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/index.html b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/index.html index 19d6b61e..891ba5e1 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/index.html +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/index.html @@ -92,7 +92,13 @@ layout("/layouts/platform.html"){ 签到二维码 查看 编辑 - 删除 + 设为模板 + 取消模板 + 删除 @@ -154,9 +160,25 @@ layout("/layouts/platform.html"){ ], codeDialogVisible: false, activityUrl: '', + urlEditInitialized: false, } }, methods: { + pageData(data = null) { + const address = this.pageDataUrl ? this.pageDataUrl : loc() + "/pageData" + this.tableLoading = true + return this.$axios.post(address, data ? data : this.pageForm).then((res) => { + this.tableLoading = false + if (res.code === 0) { + this.tableData = res.data.list + this.pageForm.totalCount = res.data.totalCount + this.$nextTick(() => { + this.openUrlEdit() + }) + } + return res + }) + }, back() { this.$refs.guava.index() }, @@ -170,6 +192,25 @@ layout("/layouts/platform.html"){ this.$refs.formRef.initData(row) }) }, + openUrlEdit() { + if (this.urlEditInitialized) { + return + } + const mode = GetQueryString("mode") + const id = GetQueryString("id") + if (mode !== "edit" || !id) { + return + } + if (!this.$refs.guava) { + this.$nextTick(() => { + this.openUrlEdit() + }) + return + } + this.urlEditInitialized = true + const row = (this.tableData || []).find(item => item.id === id) || { id } + this.openEdit(row) + }, onView(row) { this.$refs.guava.view(() => { this.$refs.infoRef.initData(row.id) @@ -191,18 +232,56 @@ 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(() => {}) }, }, - async created() { + mounted() { this.pageData() } }) diff --git a/src/main/resources/views/platform/zhgh/dayofficework/asset/common/assetForm.js b/src/main/resources/views/platform/zhgh/dayofficework/asset/common/assetForm.js index addbeb88..0360681e 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/asset/common/assetForm.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/asset/common/assetForm.js @@ -242,7 +242,7 @@ let ASSSET_FORM = { this.searchAssetUseUser(this.formData.assetUseUserId) }, assetUseUnionIdChange(val) { - const union = this.unions.find(v => v.id === val) + const union = this.unionList.find(v => v.id === val) if (union) { this.$set(this.formData, "assetUseUnionName", union.name) } else { @@ -260,16 +260,16 @@ let ASSSET_FORM = { }, // 点击责任人 assetUseUserIdChange(val) { - const { - unionname, - unionid - } = this.assetUseUserOption.find(v => v.id === val) - this.formData.assetUseUnionId = unionid + const user = this.assetUseUserOption.find(v => v.id === val) + if (!user) return + const unionId = user.unionId || user.unionid + const unionName = user.unionName || user.unionname + this.formData.assetUseUnionId = unionId if (this.formData.assetTypeCode === 1) { this.formData.assetUseUnionName = "校工会" } else { - this.formData.assetUseUnionName = unionname + this.formData.assetUseUnionName = unionName } }, // 点击开始使用日期🧄预计报废时间 diff --git a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js index e0bdc689..bcf1ed9d 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/buildHome/littleHouse/form.js @@ -1,11 +1,19 @@ const form = { template: /*language=HTML*/ ` - - - - - + + + + + + + + + + + + + + @@ -21,6 +29,28 @@ const form = { + + + + + + + + + + + + + + + +