This commit is contained in:
2025-09-04 09:40:50 +08:00
parent 5441b1d785
commit 53e6c4bc52
35 changed files with 1924 additions and 1266 deletions
@@ -19,8 +19,10 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.nutz.dao.Cnd;
import org.nutz.dao.FieldFilter;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
@@ -29,6 +31,7 @@ import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.GET;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
@@ -490,4 +493,15 @@ public class SysRoleController {
return Result.success();
}
@At
@Ok("json:full")
@GET
@SaCheckLogin
public Result getMenuOptions() {
FieldFilter fieldFilter = FieldFilter.create(Sys_menu.class, "^id|name$");
Cnd cnd = Cnd.where("disabled", "=", 0);
cnd.and(Cnd.exps("parentId", "is", null).or("parentId", "=", ""));
return Result.success(Daos.ext(sysRoleService.dao(), fieldFilter).query(Sys_menu.class, cnd));
}
}
@@ -5,38 +5,52 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
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.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.EasyExcelUtil;
import com.budwk.app.sys.models.Sys_role;
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.param.ActivityUserScopePageParam;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.basic.template.UserTemp;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -59,6 +73,9 @@ public class ActivityBasicScopeController {
@Inject
private Dao dao;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/userScope/index.html")
@SaCheckPermission("activity.basic.scope")
@@ -90,6 +107,7 @@ public class ActivityBasicScopeController {
FROM
`vw_user` u
LEFT JOIN sys_user_role sur on sur.userid = u.id
LEFT JOIN sys_club_user clubuser ON clubuser.userid=u.id
$condition
""");
try {
@@ -201,8 +219,8 @@ public class ActivityBasicScopeController {
}
@At
public Object getRoleListByMenuId(String menuId) {
return Result.success(dao.query(Sys_role.class, Cnd.where("system_name", "=", menuId).desc("code")));
public Object getRoleListByMenuId() {
return Result.success(dao.query(Sys_role.class, Cnd.NEW().desc("code")));
}
@@ -275,6 +293,7 @@ public class ActivityBasicScopeController {
FROM
`vw_user` u
LEFT JOIN sys_user_role sur on sur.userid = u.id
LEFT JOIN sys_club_user clubuser ON clubuser.userid=u.id
$condition
""");
@@ -342,6 +361,11 @@ public class ActivityBasicScopeController {
}
if (StrUtil.isNotBlank(activityUserScopePageParam.getExistsLoginNameRedisKey())) {
List<String> loginNames = redisService.lrange(activityUserScopePageParam.getExistsLoginNameRedisKey(), 0, -1);
cnd.andEX("u.loginname", "in", loginNames);
}
try {
@@ -350,8 +374,8 @@ public class ActivityBasicScopeController {
cnd.andEX("u.personType", IN_OR_NIN_OP, activityUserScopePageParam.getPersonTypes());
cnd.andEX("u.userState", IN_OR_NIN_OP, activityUserScopePageParam.getUserStates());
cnd.andEX("u.sex", IN_OR_NIN_OP, activityUserScopePageParam.getSexTypes());
cnd.andEX("sur.jdhid", EQ_OR_NEQ_OP, activityUserScopePageParam.getTeacherMeetingId());
cnd.andEX("sur.roleid", IN_OR_NIN_OP, activityUserScopePageParam.getRoleIds());
cnd.andEX("sur.tcSessionId", EQ_OR_NEQ_OP, activityUserScopePageParam.getSessionId());
cnd.andEX("sur.roleId", IN_OR_NIN_OP, activityUserScopePageParam.getRoleIds());
cnd.andEX("clubuser.clubid", EQ_OR_NEQ_OP, activityUserScopePageParam.getClubId());
} catch (Exception e) {
@@ -362,4 +386,82 @@ public class ActivityBasicScopeController {
}
@At
@Ok("void")
@ApiOperation("下载导入人员模板")
@SaCheckPermission("activity.basic.user")
public void downloadImport(HttpServletResponse response) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) {
EasyExcel.write(byteArrayOutputStream, UserTemp.class)
.sheet("福利名单导入模版")
.doWrite(ArrayList::new);
CommonDownloadUtil.download("人员导入模板.xlsx", byteArrayOutputStream.toByteArray(), response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("导入人员核对名单")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doImport(TempFile file) {
String matchUserLoginNamesKey = "ActivityBasicScopeController.doImport.time=" + System.currentTimeMillis();
List<T> ts = EasyExcelUtil.syncReadModel(file.getFile(), UserTemp.class, 0, 1);
List<UserTemp> userImportList = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(UserTemp.class);
//判断人员哪些存在哪些不存在
Sql sql = Sqls.queryString("""
SELECT
u.loginname
FROM
sys_user u
""");
dao.execute(sql);
String[] sysLoginNames = (String[]) sql.getResult();
//存在的工号
List<String> existsLoginNames = new ArrayList<>();
for (UserTemp excelUser : userImportList) {
if (ArrayUtil.contains(sysLoginNames, excelUser.getLoginName())) {
existsLoginNames.add(excelUser.getLoginName());
} else {
excelUser.setErrorInfo("系统查不到此人");
}
}
//匹配不到的用户
List<UserTemp> errorExcelTempUsers = userImportList.stream().filter(v -> StrUtil.isNotBlank(v.getErrorInfo())).collect(Collectors.toList());
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", userImportList.size());
nutMap.setv("successCount", existsLoginNames.size());
nutMap.setv("errorCount", errorExcelTempUsers.size());
nutMap.setv("errorList", errorExcelTempUsers.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginName()).addv("姓名", v.getUserName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
nutMap.setv("existsLoginNameRedisKey", matchUserLoginNamesKey);
//保存存在的工号
if (Lang.isNotEmpty(existsLoginNames)) {
redisService.lpush(matchUserLoginNamesKey, existsLoginNames.toArray(new String[0]));
redisService.expire(matchUserLoginNamesKey, 60 * 3);
}
return Result.success(nutMap);
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("清空查询条件")
public Result clearSearchCnd(String existsLoginNameRedisKey) {
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
redisService.del(existsLoginNameRedisKey);
}
return Result.success();
}
}
@@ -2,26 +2,43 @@ package com.budwk.app.zhgh.activity.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.base.service.BaseService;
import com.budwk.app.base.utils.EasyExcelUtil;
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.template.UserTemp;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityBasicScopeUserDataController
@@ -37,6 +54,9 @@ public class ActivityBasicScopeUserDataController {
@Inject
private BaseService baseService;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/userScopeData/index.html")
@SaCheckPermission("activity.basic.user")
@@ -51,29 +71,8 @@ public class ActivityBasicScopeUserDataController {
@Param(value = "unitId") String unitId,
@Param(value = "personType") String personType,
@Param(value = "userState") String userState,
@Param(value = "groupId") Integer groupId) {
/* Sql sql = Sqls.create("""
SELECT
aus.id,
u.username AS userName,
u.loginname AS loginName,
u.sex,
u.birthday,
u.mobile,
u.personType,
u.userState,
u.unitname AS unitName,
u.unionname AS unionName,
aus.groupId,
aus.groupName,
actun.unionname AS activityUnionName
FROM
activity_user_scope aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
LEFT JOIN activity_basic_unit actit ON actit.id=u.unitid
LEFT JOIN activity_basic_union actun ON actit.unionid=actun.id
$condition
""");*/
@Param(value = "groupId") Integer groupId,
@Param(value = "existsLoginNameRedisKey") String existsLoginNameRedisKey) {
Sql sql = Sqls.create("""
SELECT
aus.id,
@@ -107,9 +106,13 @@ public class ActivityBasicScopeUserDataController {
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("aus.creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
List<String> loginNames = redisService.lrange(existsLoginNameRedisKey, 0, -1);
cnd.andEX("u.loginname", "in", loginNames);
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
@@ -134,7 +137,17 @@ public class ActivityBasicScopeUserDataController {
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "personType") String personType,
@Param(value = "userState") String userState) {
@Param(value = "userState") String userState,
@Param(value = "existsLoginNameRedisKey") String existsLoginNameRedisKey) {
List<String> existsLoginNames = new ArrayList<>();
if(StrUtil.isNotBlank(existsLoginNameRedisKey) && redisService.exists(existsLoginNameRedisKey)){
existsLoginNames = redisService.lrange(existsLoginNameRedisKey, 0, -1);
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
redisService.del(existsLoginNameRedisKey);
}
}
Sql sql = Sqls.create("select id from `vw_user` u $condition");
Cnd userCnd = Cnd.NEW();
if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) {
@@ -145,12 +158,13 @@ public class ActivityBasicScopeUserDataController {
userCnd.andEX("u.personType", "=", personType);
userCnd.andEX("u.userState", "=", userState);
userCnd.andEX("u.id", "=", id);
userCnd.andEX("u.loginname","in",existsLoginNames);
sql.setCondition(userCnd);
Cnd cnd = Cnd.NEW();
cnd.and("groupId", "=", groupId);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(id)) {
@@ -163,5 +177,56 @@ public class ActivityBasicScopeUserDataController {
return Result.success();
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("导入人员核对名单")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doImport(@Valid String groupId, TempFile file) {
String matchUserLoginNamesKey = "ActivityBasicUserController.doImport.groupId=" + groupId + "time=" + System.currentTimeMillis();
List<T> ts = EasyExcelUtil.syncReadModel(file.getFile(), UserTemp.class, 0, 1);
List<UserTemp> userImportList = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(UserTemp.class);
//判断人员哪些存在哪些不存在
Sql sql = Sqls.queryString("""
SELECT
u.loginname
FROM
activity_user_scope aus
LEFT JOIN sys_user u ON u.id = aus.userId
WHERE
aus.groupId = @groupId
""").setParam("groupId", groupId);
baseService.execute(sql);
String[] sysLoginNames = (String[]) sql.getResult();
//存在的工号
List<String> existsLoginNames = new ArrayList<>();
for (UserTemp excelUser : userImportList) {
if (ArrayUtil.contains(sysLoginNames, excelUser.getLoginName())) {
existsLoginNames.add(excelUser.getLoginName());
} else {
excelUser.setErrorInfo("系统查不到此人");
}
}
//匹配不到的用户
List<UserTemp> errorExcelTempUsers = userImportList.stream().filter(v -> StrUtil.isNotBlank(v.getErrorInfo())).collect(Collectors.toList());
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", userImportList.size());
nutMap.setv("successCount", existsLoginNames.size());
nutMap.setv("errorCount", errorExcelTempUsers.size());
nutMap.setv("errorList", errorExcelTempUsers.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginName()).addv("姓名", v.getUserName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
nutMap.setv("existsLoginNameRedisKey", matchUserLoginNamesKey);
//保存存在的工号
if (Lang.isNotEmpty(existsLoginNames)) {
redisService.lpush(matchUserLoginNamesKey, existsLoginNames.toArray(new String[0]));
redisService.expire(matchUserLoginNamesKey, 60 * 3);
}
return Result.success(nutMap);
}
}
@@ -33,7 +33,7 @@ public class ActivityUserScopePageParam extends PageForm {
private Integer setGroupId;
private String setGroupName;
// 教师会议id
private String teacherMeetingId;
private String sessionId;
// 角色id
private String[] roleIds;
// 用户id
@@ -46,4 +46,6 @@ public class ActivityUserScopePageParam extends PageForm {
private String props;
private String existsLoginNameRedisKey;
}
@@ -0,0 +1,27 @@
package com.budwk.app.zhgh.activity.basic.template;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode
@ContentRowHeight(20) // 内容行高
@HeadRowHeight(20) // 表头行高
@ColumnWidth(25)
public class UserTemp {
@ExcelProperty("工号")
private String loginName;
@ExcelProperty("姓名")
private String userName;
@ExcelIgnore
private String errorInfo;
}
@@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
@@ -12,6 +13,7 @@ import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
@@ -79,10 +81,16 @@ public class ActivityCultureApplyActivityController {
@At
@SLog(tag = "文化活动", msg = "添加了一条文化活动记录", param = true, result = true)
@ApiOperation("保存活动申报")
@SLog( tag = "文化活动-活动申报", msg = "保存了一条文化活动记录")
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result doAdd(@Param("tissue") @Valid ActivityTissue tissue) {
activityCultureService.doAddActivity(tissue);
public Result save(@Param("data") ActivityTissue tissue) {
if (tissue.getActivity_type() == 40002) {
tissue.setUnionId(SecurityUtil.getUnionId());
}
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
activityCultureService.insertOrUpdate(tissue);
return Result.success();
}
@@ -3,7 +3,6 @@ package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.stream.CollectorUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
@@ -15,12 +14,10 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureApplyUserService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
@@ -34,7 +31,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityCultureApplyUserController
@@ -115,11 +111,14 @@ public class ActivityCultureApplyUserController {
@At
@SaCheckLogin
@ApiOperation(value = "队友搜索")
public Result queryTeammate(@Valid String keyword) {
public Result queryTeammate(@Valid String keyword,Integer signUpMethod) {
Sql sql = Sqls.create("select id userId,username userName,loginname loginName,sex,mobile,unitName from vw_user $condition limit 0,10");
Cnd cnd = Cnd.NEW();
cnd.or(Cnd.likeEX("username", keyword));
cnd.or(Cnd.likeEX("loginname", keyword));
if (signUpMethod == 3){
cnd.and("unionid", "=", SecurityUtil.getUnionId());
}
sql.setCondition(cnd);
List<NutMap> list = activityCultureApplyUserService.listMap(sql);
return Result.success(list);
@@ -142,6 +141,16 @@ public class ActivityCultureApplyUserController {
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation(value = "查询分工会报名人员")
public Result listTeamUserUnion(@Valid String activityId) {
List<ActivityTissuePerson> list = dao.query(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getApplyUserId, "=", SecurityUtil.getUserId())
);
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation(value = "是否报名")
@@ -1,12 +1,8 @@
package com.budwk.app.zhgh.activity.culture.models;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
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.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
@@ -25,7 +21,7 @@ import java.util.List;
@Data
@Comment("文化活动表")
@Table("activity_tissue")
public class ActivityTissue extends BaseModel implements Serializable, SysHomeConvert {
public class ActivityTissue extends BaseModel implements Serializable {
@Column
@Name
@@ -252,32 +248,5 @@ public class ActivityTissue extends BaseModel implements Serializable, SysHomeCo
@Many(field = "tissueId")
private List<ActivityTissuePerson> tissuePersonList;
@Override
public Sys_home_activity covertToSysHomeActivity() {
Sys_home_activity sysHomeActivity = new Sys_home_activity();
sysHomeActivity.setId(this.getId());
sysHomeActivity.setName(this.getName());
sysHomeActivity.setCover(this.getCover());
if (this.getActivity_type() == 40001) {
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/school");
} else if (this.getActivity_type() == 40002) {
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/union");
} else if (this.getActivity_type() == 40003) {
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/club");
}
sysHomeActivity.setH5Url("/platform/h5/activity/culture/applyUser");
if (StrUtil.isNotBlank(this.getApplyStartTime())) {
sysHomeActivity.setStartDate(DateUtil.parseDate(this.getApplyStartTime()));
sysHomeActivity.setEndDate(DateUtil.parseDate(this.getApplyEndTime()));
}
sysHomeActivity.setAllowUserGroupId(this.getGroupId());
sysHomeActivity.setEnable(this.getIsUnseal());
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
private String username;
private String loginname;
}
@@ -18,7 +18,6 @@ public interface ActivityCultureService extends BaseService<ActivityTissue> {
*/
List<NutMap> getUnionData(String activityScopeGroupId);
void doAddActivity(ActivityTissue tissue);
void doEditActivity(ActivityTissue tissue);
@@ -4,14 +4,11 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
@@ -21,15 +18,11 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -221,23 +214,30 @@ public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<Activit
//分工会报名独有判断
//判断总人数限制
//判断分工会人数限制
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
ActivityTissuePerson activityTissuePerson = new ActivityTissuePerson();
activityTissuePerson.setTissueId(activityId);
activityTissuePerson.setUserId(user.getId());
activityTissuePerson.setUserName(user.getUsername());
activityTissuePerson.setLoginName(user.getLoginname());
activityTissuePerson.setSex(user.getSex());
activityTissuePerson.setMobile(user.getMobile());
activityTissuePerson.setUnitId(user.getUnitId());
activityTissuePerson.setUnitName(user.getUnitName());
activityTissuePerson.setUnionId(user.getUnionId());
activityTissuePerson.setUnionName(user.getUnionName());
activityTissuePerson.setApplyDateTime(DateUtil.now());
activityTissuePerson.setApplyUserId(user.getId());
activityTissuePerson.setApplyUserUserName(user.getUsername());
activityTissuePerson.setDynamicFormData(dynamicFormParam);
insert(activityTissuePerson);
Sql sql = Sqls.create("""
SELECT
id AS userId,
username AS userName,
loginname AS loginName,
sex,
mobile,
unitName,
unionName,
'$activityId' AS tissueId,
'$applyUserId' AS applyUserId,
'$applyUserUserName' AS applyUserUserName,
'$applyDateTime' AS applyDateTime
FROM
`vw_user`
$condition
""");
sql.setVar("activityId", activityId);
sql.setVar("applyUserId", SecurityUtil.getUserId());
sql.setVar("applyDateTime", DateUtil.now());
sql.setVar("applyUserUserName", SecurityUtil.getUserUsername());
sql.setCondition(Cnd.where("id", "in", personIds));
List<ActivityTissuePerson> fullPersonList = listEntity(sql);
insert(fullPersonList);
}
}
@@ -1,12 +1,10 @@
package com.budwk.app.zhgh.activity.culture.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
@@ -72,38 +70,10 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
}
}
@Override
public void doAddActivity(ActivityTissue tissue) {
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
tissue.setIsUnseal(true);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
tissue.setState(1);
} else {
tissue.setState(3);
}
if (tissue.getActivity_type() == 40002) {
tissue.setUnionId(SecurityUtil.getUnionId());
} else if (tissue.getActivity_type() == 40003) {
// tissue.setClubId(vi.getClubId());
}
insertWith(tissue, "tissuePersonList");
if (tissue.getIsEnrollSystem()) {
Sys_home_activity sysHomeActivity = tissue.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
}
}
@Override
public void doEditActivity(ActivityTissue tissue) {
update(tissue);
if (tissue.getIsEnrollSystem()) {
Sys_home_activity sysHomeActivity = tissue.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
} else {
dao().delete(Sys_home_activity.class, tissue.getId());
}
}
@Override
@@ -57,7 +57,7 @@ public class EvaluateBranchUnionApprovalController {
ea.name AS evaluateName,
hb.name AS honorName,
bs.name as honorTypeName,
ins.id AS instanceId,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
@@ -76,17 +76,18 @@ public class EvaluateBranchUnionApprovalController {
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
LEFT JOIN evaluate_apply info ON info.id = ins.businessNo
LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId
LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId
LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078");
cnd.and("info.evaluateId", "=", pageForm.getEvaluateId());
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
@@ -102,6 +102,7 @@ public class EvaluateSchoolUnionApprovalController {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("info.unionId","=",pageForm.getUnionId());
cnd.andEX("info.unitId","=",pageForm.getUnitId());
cnd.andEX("info.evaluateId","=",pageForm.getEvaluateId());
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
@@ -15,13 +15,13 @@ import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.enrollmentRegistration.model.EnrollmentRegistration;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model.ExcellentRecuperationActivity;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model.ExcellentRecuperationLine;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model.ExcellentRecuperationQuotaAllocation;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model.ExcellentRecuperationSignUpUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -149,7 +149,7 @@ public class ExcellentRecuperationActivitySignUpController {
@At
@ApiOperation("删除报名信息")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("enrollmentRegistration.summary")
@SaCheckPermission("excellentRecuperation.activitySignUp")
@SLog(tag = "优秀教职工疗休养-活动报名", type = "excellentRecuperationActivitySignUp", msg = "删除id: ${args[0]}")
public Result doDelete(String id) {
dao.delete(ExcellentRecuperationSignUpUser.class, id);
@@ -205,6 +205,9 @@ public class ExcellentRecuperationActivitySignUpController {
public Result listActivityByYear(String year) {
List<ExcellentRecuperationActivity> activityList = dao.query(ExcellentRecuperationActivity.class,
Cnd.where("YEAR(signUpStartTime)", "=", year).desc("signUpStartTime"));
activityList.forEach(activity -> {
activity.setUnionQuotaAllocationList(dao.query(ExcellentRecuperationQuotaAllocation.class, Cnd.where("activityId", "=", activity.getId())));
});
return Result.success(activityList);
}
@@ -258,5 +261,47 @@ public class ExcellentRecuperationActivitySignUpController {
return Result.success(dao.fetch(ExcellentRecuperationSignUpUser.class, id));
}
@At
@ApiOperation("查询报名人员")
@SaCheckLogin
public Result getSIgnUpUserList(String unionId, String activityId){
Sql sql = Sqls.create("""
SELECT
info.*,
line.lineName,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale,
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' AND taskState IN (10, 20)) AS startTaskId
FROM
excellent_recuperation_sign_user info
LEFT JOIN excellent_recuperation_line line ON line.id = info.lineId
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
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.activityId", "=", activityId);
cnd.and("info.unionId", "=", unionId);
cnd.and("ins.state", "!=", ProcessInstanceStateEnum.REJECT.getCode());
sql.setCondition(cnd);
List<NutMap> map = baseService.listMap(sql);
return Result.success(map);
}
}
@@ -19,7 +19,6 @@ import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model.ExcellentRecuperationTravelAgency;
import com.budwk.app.zhgh.staffbenefit.excellentRecuperation.service.ExcellentRecuperationTravelAgencyService;
import com.budwk.app.zhgh.staffbenefit.recuperation.mode.TravelAgencyExcelMode;
import com.budwk.app.zhgh.staffbenefit.recuperation.model.RecuperationTravelAgency;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -221,8 +220,8 @@ public class ExcellentRecuperationTravelAgencyController {
ExcelImportRes<TravelAgencyExcelMode> excelImportRes = new ExcelImportRes<>();
excelImportRes.setTotalRecords(travelAgency.size());
List<RecuperationTravelAgency> travelAgencyList = dao.query(RecuperationTravelAgency.class, Cnd.NEW().desc("id"));
Map<String, String> map = travelAgencyList.stream().collect(Collectors.toMap(RecuperationTravelAgency::getTravelAgencyName, RecuperationTravelAgency::getId));
List<ExcellentRecuperationTravelAgency> travelAgencyList = dao.query(ExcellentRecuperationTravelAgency.class, Cnd.NEW().desc("id"));
Map<String, String> map = travelAgencyList.stream().collect(Collectors.toMap(ExcellentRecuperationTravelAgency::getTravelAgencyName, ExcellentRecuperationTravelAgency::getId));
for (int i = 0; i < travelAgency.size(); i++) {
TravelAgencyExcelMode travel = travelAgency.get(i);
@@ -234,7 +233,7 @@ public class ExcellentRecuperationTravelAgencyController {
travel.setErrInfo("旅行社名称为空", i + 1);
continue;
}
RecuperationTravelAgency agency = new RecuperationTravelAgency();
ExcellentRecuperationTravelAgency agency = new ExcellentRecuperationTravelAgency();
if (Strings.isNotBlank(map.get(travel.getTravelAgencyName()))){
agency.setId(map.get(travel.getTravelAgencyName()));
}
@@ -1,7 +1,6 @@
package com.budwk.app.zhgh.staffbenefit.excellentRecuperation.model;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.zhgh.staffbenefit.recuperation.model.RecuperationTravelAgency;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
@@ -55,7 +54,7 @@ public class ExcellentRecuperationLine extends BaseModel {
private boolean isDisabled;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@ColDefine(type = ColType.VARCHAR, width = 500)
@Comment("缩略图")
private String file;
@@ -0,0 +1,235 @@
<template>
<div style="padding: 20px 50px">
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" style="width: 200px"
@click="$downLoad('/platform/activity/basic/scope/downloadImport')" icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-form>
<el-upload
action="#"
name="file"
ref="upload"
:on-remove="
(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
importResult = {
errorCount: 0,
successCount: 0,
totalCount: 0,
errorList: []
}
}
"
:on-change="
(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList, { type: ['xls', 'xlsx'] })
}
"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList"
>
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件</el-button>
<div class="el-upload__tip" slot="tip" style="color: #f56c6c">只能上传 xls/xlsx 文件</div>
</el-upload>
</el-form>
</el-card>
</el-timeline-item>
<el-timeline-item placement="top" timestamp="导入结果">
<el-card shadow="never">
<p>总记录数:{{ errorInfoData.totalCount }}</p>
<p>
成功数:
<span class="text-success">{{ errorInfoData.successCount }}</span>
</p>
<p>
错误数:
<span class="text-danger">{{ errorInfoData.errorCount }}</span>
</p>
<el-link @click="exportErrors" type="primary" v-if="errorInfoData.errorCount > 0">下载错误记录</el-link>
</el-card>
</el-timeline-item>
</el-timeline>
<div style="text-align: right">
<span slot="footer" class="dialog-footer">
<el-button @click="clearImportDialog" type="primary"
:disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="clearSearchCnd"
:loading="importLoading">清空查询条件</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">核对人员</el-button>
<el-button type="primary" @click="doImportSearch"
:loading="importLoading">查询人员</el-button>
</span>
</div>
</div>
</template>
<script>
module.exports = {
props: {
exists_login_name_redis_key: {type: String, required: ""},
group_id: {type: Number, required: ""},
do_import_url: {type: String, required: ""}
},
mounted() {
const s = document.createElement("script")
s.type = "text/javascript"
s.src = "/assets/platform/plugins/xlsx/xlsx.full.min.js"
document.body.appendChild(s)
},
data() {
return {
importData: {
fileList: [],
isFlag: false
},
errorInfoData: {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
},
importLoading: false,
doImportUrl:""
}
},
methods: {
clearImportDialog() {
this.$emit("clear_import_dialog")
},
clearSearchCnd() {
this.importData = {
fileList: [],
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: [],
}
$.get('/platform/activity/basic/scope/clearSearchCnd', {existsLoginNameRedisKey: this.exists_login_name_redis_key}).then(res => {
if (res.code === 0) {
this.$emit("flush", this.exists_login_name_redis_key)
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
},
resetImportData() {
this.importData = {
fileList: [],
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
},
doImportSearch() {
this.$emit("flush", this.exists_login_name_redis_key)
this.clearImportDialog()
},
doImport() {
if (this.importData.fileList.length === 0) {
this.$message.error({
title: "错误",
message: "请选择文件!"
})
return
}
const data = new FormData()
data.append("groupId", this.group_id)
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name)
})
this.importLoading = true
this.$axios.post(this.do_import_url, data).then((res) => {
if (res.code === 0) {
if (res.data.errorList && res.data.errorList.length > 0) {
this.$message.warning("核对失败")
} else {
this.$message.success("核对成功")
}
this.errorInfoData = res.data
this.$emit("flush", res.data.existsLoginNameRedisKey)
} else {
this.$message.warning("核对失败")
}
this.importLoading = false
})
},
exportErrors() {
const data = this.errorInfoData.errorList
// 创建工作簿
const workbook = XLSX.utils.book_new()
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(data)
// 将工作表添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
// 将工作簿转换为二进制对象
const excelBuffer = XLSX.write(workbook, {bookType: "xlsx", type: "array"})
// 将二进制对象转换为Blob对象
const blob = new Blob([excelBuffer], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})
// 创建下载链接并设置相关属性
const url = window.URL.createObjectURL(blob)
const link = document.createElement("a")
link.href = url
link.download = "错误记录.xlsx"
// 模拟点击下载链接
document.body.appendChild(link)
link.click()
// 清理下载链接
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
},
fileHandleRemove(file, fileList) {
return fileList
},
fileHandleChange(file, fileList, {type, size}) {
const removeFile = () => {
fileList.splice(fileList.findIndex((v) => v === file))
}
if (!file.size) {
this.$message.warning("您选择的是空文件")
removeFile()
}
if (type && type.length && !type.includes(file.name.split(".").pop().toLowerCase())) {
this.$message.warning(`文件只能是 ${type.map((v) => v.toUpperCase()).join("/")} 格式`)
removeFile()
}
if (size && !file.size < size) {
this.$message.warning(`文件大小不能超过 ${size / 1024 / 1024}MB`)
removeFile()
}
return fileList
}
}
}
</script>
<style>
.el-card__body {
padding: 25px;
}
</style>
@@ -1,319 +1,347 @@
<template>
<div>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">活动分组</div>
<div class="search-item-option">
<el-select
placeholder="活动分组"
v-model="pageForm.groupId"
style="width: 100%"
@change="
<div>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">活动分组</div>
<div class="search-item-option">
<el-select
placeholder="活动分组"
v-model="pageForm.groupId"
style="width: 100%"
@change="
doSearch()
viewGroupName()
"
filterable
>
<el-option
v-for="item in activityGroupList"
:label="item.groupName"
:value="item.groupId"
:key="item.groupId"
></el-option>
</el-select>
</div>
</div>
filterable
>
<el-option
v-for="item in activityGroupList"
:label="item.groupName"
:value="item.groupId"
:key="item.groupId"
></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号</div>
<div class="search-item-option">
<el-input
placeholder="请输入内容"
clearable
v-model="pageForm.searchKeyword"
style="width: 100%"
@keyup.enter.native="doSearch"
>
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型" style="width: 80px">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">姓名工号</div>
<div class="search-item-option">
<el-input
placeholder="请输入内容"
clearable
v-model="pageForm.searchKeyword"
style="width: 100%"
@keyup.enter.native="doSearch"
>
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型" style="width: 80px">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item" v-if="is_sysadmin || is_A06">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select
placeholder="所属工会"
v-model="pageForm.unionId"
style="width: 100%"
clearable
@change="flushUnits"
@clear="flushUnits"
filterable
>
<el-option v-for="item in unions" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item" v-if="is_sysadmin || is_A06">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select
placeholder="所属工会"
v-model="pageForm.unionId"
style="width: 100%"
clearable
@change="flushUnits"
@clear="flushUnits"
filterable
>
<el-option v-for="item in unions" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%" clearable @change="doSearch" filterable>
<el-option v-for="item in units" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId" style="width: 100%" clearable @change="doSearch"
filterable>
<el-option v-for="item in units" :label="item.name" :value="item.id" :key="item.id"></el-option>
</el-select>
</div>
</div>
<!--<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动工会</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.activityUnionId"
style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<el-option v-for="item in ActivityUnions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item" v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动单位</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.activityUnitId"
style="width: 100%;"
clearable="true"
@change="doSearch"
filterable="true">
<el-option v-for="item in ActivityUnits" :label="item.name"
:value="item.id"></el-option>
</el-select>
</div>
</div>-->
<div class="search-item">
<div class="search-item-label">人员类型</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" code="PERSON_TYPE" @change="doSearch" style="width: 100%"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select
v-model="pageForm.userState"
style="width: 100%"
clearable
placeholder="在职状态"
@change="doSearch"
code="USER_STATE"
></dict-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
<!--<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动工会</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.activityUnionId"
style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<el-option v-for="item in ActivityUnions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</el-card>
</div>
<el-card shadow="never" class="mt10">
<table-tool :label="currentGroupName">
<el-button @click="doExportUser" icon="el-icon-printer" size="small" type="primary" :disabled="!pageForm.groupId">
导出活动分组人员xlsx
</el-button>
<el-button @click="doDelete(null)" type="danger" size="small" :disabled="tableData.length === 0">
删除{{ currentGroupName }}
</el-button>
</table-tool>
<el-table ref="userTable" :data="tableData" stripe border :size="tableSize" @sort-change="pageOrder">
<el-table-column label="序号" type="index" width="80">
<template slot-scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }}</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100">
<template slot-scope="{ row }">
<el-button size="mini" type="danger" @click="doDelete(row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[5, 10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount"
></el-pagination>
</el-row>
</el-card>
</div>
<div class="search-item" v-if="${@shiro.hasRole('sysadmin')}">
<div class="search-item-label">活动单位</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.activityUnitId"
style="width: 100%;"
clearable="true"
@change="doSearch"
filterable="true">
<el-option v-for="item in ActivityUnits" :label="item.name"
:value="item.id"></el-option>
</el-select>
</div>
</div>-->
<div class="search-item">
<div class="search-item-label">人员类型</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" code="PERSON_TYPE" @change="doSearch"
style="width: 100%"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select
v-model="pageForm.userState"
style="width: 100%"
clearable
placeholder="在职状态"
@change="doSearch"
code="USER_STATE"
></dict-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :label="currentGroupName">
<el-button v-if="is_sysadmin||is_A06"
type="primary" size="medium" icon="el-icon-printer" @click="importDialogVisible=true">
导入XLSX查询
</el-button>
<el-button @click="doExportUser" icon="el-icon-printer" size="small" type="primary"
:disabled="!pageForm.groupId">
导出活动分组人员xlsx
</el-button>
<el-button @click="doDelete(null)" type="danger" size="small" :disabled="tableData.length === 0">
删除{{ currentGroupName }}
</el-button>
</table-tool>
<el-table ref="userTable" :data="tableData" stripe border :size="tableSize" @sort-change="pageOrder">
<el-table-column label="序号" type="index" width="80">
<template slot-scope="scope">
<span>{{ scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1 }}</span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="100">
<template slot-scope="{ row }">
<el-button size="mini" type="danger" @click="doDelete(row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[5, 10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount"
></el-pagination>
</el-row>
</el-card>
<el-dialog :visible.sync="importDialogVisible" title="人员导入" width="45%" :append-to-body="true"
:close-on-click-modal="false">
<activity-import-user ref="importUserRef"
@clear_import_dialog="clearImportDialog"
@flush="flush"
do_import_url="/platform/activity/basic/user/doImport"
:group_id="pageForm.groupId"
:exists_login_name_redis_key="pageForm.existsLoginNameRedisKey"></activity-import-user>
</el-dialog>
</div>
</template>
<script>
module.exports = {
props: {
group_id: {
type: String,
default: ""
}
},
computed: {
is_H10() {
return this.roleData.is_H10
},
is_A06() {
return this.roleData.is_A06
},
is_H04() {
return this.roleData.is_H04
},
is_H02() {
return this.roleData.is_H02
},
is_H03() {
return this.roleData.is_H03
},
is_sysadmin() {
return this.roleData.is_sysadmin
},
unionid() {
return this.roleData.unionid
}
},
data() {
return {
activityGroupList: [],
ActivityUnions: [],
ActivityUnits: [],
unions: [],
units: [],
pageForm: {
unionId: "",
unitId: "",
searchName: "username",
personTypes: [],
userStates: [],
memberStatus: [],
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "loginName", label: "工号" },
{ prop: "userName", label: "姓名" },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "birthday", label: "出生年月" },
{ prop: "mobile", label: "联系电话" },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "groupName", label: "所属分组", sortable: true }
],
roleData: {},
currentGroupName: null
}
},
mixins: [initTableMixins],
components: {},
methods: {
viewGroupName() {
if (this.pageForm?.groupId) {
const group = this.activityGroupList.find((v) => v.groupId === this.pageForm.groupId)
this.currentGroupName = group.groupName + "人员"
return
}
this.currentGroupName = "全部人员"
},
doExportUser() {
window.open("/platform/activity/basic/user/doExportUser?groupId=" + this.pageForm.groupId)
},
doSearch2() {
this.getActivityGroup()
this.doSearch()
},
async doDelete(id, groupId) {
const confirm = await this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
let pageForm = clone(this.pageForm)
pageForm.id = id
const resp = await $.post("/platform/activity/basic/user/doDelete", pageForm)
if (resp.code === 0) {
this.$message.success(resp.msg)
await this.getActivityGroup(this.pageForm.groupId)
this.$emit("group_change")
} else {
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (this.is_A06 || this.is_sysadmin) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
// this.ActivityUnits = await getActivityUnits(this.pageForm.activityUnionId)
} else {
this.units = await this.$businessTool.listUnit(this.unionid)
}
},
async getActivityGroup(id) {
const resp = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = resp.data
if (resp.data && resp.data.length > 0) {
if (id) {
if (this.activityGroupList.some((v) => v.groupId === id)) {
this.$set(this.pageForm, "groupId", id)
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
}
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
}
}
await this.doSearch()
},
async getRolesAndUnion() {
const { data } = await $.post("/platform/activity/basic/scope/getRolesAndUnion")
this.roleData = data
},
async pageData() {
const resp = await $.post("/platform/activity/basic/user/pageData", this.pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
}
}
},
async created() {
this.unions = await this.$businessTool.listUnion()
// this.ActivityUnions = await getActivityUnions()
await this.flushUnits()
await this.getActivityGroup()
await this.getRolesAndUnion()
this.viewGroupName()
props: {
group_id: {
type: String,
default: ""
}
},
computed: {
is_H10() {
return this.roleData.is_H10
},
is_A06() {
return this.roleData.is_A06
},
is_H04() {
return this.roleData.is_H04
},
is_H02() {
return this.roleData.is_H02
},
is_H03() {
return this.roleData.is_H03
},
is_sysadmin() {
return this.roleData.is_sysadmin
},
unionid() {
return this.roleData.unionid
}
},
data() {
return {
activityGroupList: [],
ActivityUnions: [],
ActivityUnits: [],
unions: [],
units: [],
pageForm: {
unionId: "",
unitId: "",
searchName: "username",
personTypes: [],
userStates: [],
memberStatus: [],
year: moment().format("YYYY")
},
tableColumns: [
{prop: "loginName", label: "工号"},
{prop: "userName", label: "姓名"},
{prop: "sex", label: "性别", sortable: true},
{prop: "birthday", label: "出生年月"},
{prop: "mobile", label: "联系电话"},
{prop: "personType", label: "人员类型", sortable: true},
{prop: "userState", label: "在职状态", sortable: true},
{prop: "unitName", label: "所属单位", sortable: true},
{prop: "unionName", label: "所属工会", sortable: true},
{prop: "groupName", label: "所属分组", sortable: true}
],
roleData: {},
currentGroupName: null,
importDialogVisible: false,
}
},
mixins: [initTableMixins],
components: {
"activity-import-user": httpVueLoader("/components/module/activity/ActivityImportUser.vue?v=" + new Date().getTime())
},
methods: {
flush(exists_login_name_redis_key) {
this.pageForm.existsLoginNameRedisKey = exists_login_name_redis_key
this.doSearch()
},
clearImportDialog() {
this.importDialogVisible = false
},
viewGroupName() {
if (this.pageForm?.groupId) {
const group = this.activityGroupList.find((v) => v.groupId === this.pageForm.groupId)
this.currentGroupName = group.groupName + "人员"
return
}
this.currentGroupName = "全部人员"
},
doExportUser() {
window.open("/platform/activity/basic/user/doExportUser?groupId=" + this.pageForm.groupId)
},
doSearch2() {
this.getActivityGroup()
this.doSearch()
},
async doDelete(id, groupId) {
const confirm = await this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
let pageForm = clone(this.pageForm)
pageForm.id = id
const resp = await $.post("/platform/activity/basic/user/doDelete", pageForm)
if (resp.code === 0) {
this.$message.success(resp.msg)
await this.getActivityGroup(this.pageForm.groupId)
this.$emit("group_change")
} else {
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if (this.is_A06 || this.is_sysadmin) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
// this.ActivityUnits = await getActivityUnits(this.pageForm.activityUnionId)
} else {
this.units = await this.$businessTool.listUnit(this.unionid)
}
},
async getActivityGroup(id) {
const resp = await $.get("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = resp.data
if (resp.data && resp.data.length > 0) {
if (id) {
if (this.activityGroupList.some((v) => v.groupId === id)) {
this.$set(this.pageForm, "groupId", id)
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
}
} else {
this.$set(this.pageForm, "groupId", resp.data[0].groupId)
}
}
await this.doSearch()
},
async getRolesAndUnion() {
const {data} = await $.post("/platform/activity/basic/scope/getRolesAndUnion")
this.roleData = data
},
async pageData() {
const resp = await $.post("/platform/activity/basic/user/pageData", this.pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
}
}
},
async created() {
this.unions = await this.$businessTool.listUnion()
// this.ActivityUnions = await getActivityUnions()
await this.flushUnits()
await this.getActivityGroup()
await this.getRolesAndUnion()
this.viewGroupName()
}
}
</script>
File diff suppressed because it is too large Load Diff
@@ -2,10 +2,11 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
template: /*language=HTML*/ `
<div>
<template>
<el-card shadow="never" style="min-height: calc(100vh - 70px);position: relative">
<el-card shadow="never">
<snaker-start slot="header" label="文化活动申报" define_key="WHHD"
v-if="activity_type===40002||activity_type===40003"></snaker-start>
<el-form :model="formData" :rules="formRules" label-suffix="" label-width="170px"
ref="addForm" v-loading="formLoading">
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane label="活动基础信息" name="1">
<div class="mt20">
@@ -84,20 +85,20 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
</el-form-item>
</el-col>
<!-- <el-col :span="12"-->
<!-- v-if="formData.isEnrollSystem === true">-->
<!-- <el-form-item label="活动计划时间" prop="plannedDate">-->
<!-- <el-date-picker-->
<!-- @change="plannedDateChange"-->
<!-- end-placeholder="结束日期"-->
<!-- range-separator="-"-->
<!-- start-placeholder="开始日期"-->
<!-- style="width: 100%"-->
<!-- type="daterange"-->
<!-- v-model="formData.plannedDate" value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12"-->
<!-- v-if="formData.isEnrollSystem === true">-->
<!-- <el-form-item label="活动计划时间" prop="plannedDate">-->
<!-- <el-date-picker-->
<!-- @change="plannedDateChange"-->
<!-- end-placeholder="结束日期"-->
<!-- range-separator="-"-->
<!-- start-placeholder="开始日期"-->
<!-- style="width: 100%"-->
<!-- type="daterange"-->
<!-- v-model="formData.plannedDate" value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="实际活动时间" prop="time">
@@ -181,7 +182,9 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
<el-form-item label="报名人数限制" prop="userNumberLimit">
<el-radio-group v-model="formData.userNumberLimit" size="small">
<el-radio border :label="1">总人数限制</el-radio>
<el-radio border :label="2" v-if="activity_type===40001">分工会人数限制</el-radio>
<el-radio border :label="2" v-if="activity_type===40001">
分工会人数限制
</el-radio>
<el-radio border :label="null">不限制</el-radio>
</el-radio-group>
</el-form-item>
@@ -472,15 +475,12 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
</el-alert>
</el-tab-pane>
</el-tabs>
<div style="padding: 20px;text-align: center;">
<el-button @click="operation" style="width: 300px" type="primary" :disabled="formLoading">
确 定
</el-button>
</div>
</el-form>
<el-row type="flex" justify="end" class="mt20">
<el-button type="primary" plain @click="onSave">保存</el-button>
<el-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button>
<el-button type="primary" @click="onFinishTask" v-else>提交</el-button>
</el-row>
</el-card>
<drawer-user-scope
@@ -489,7 +489,8 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
:group_id.sync="formData.groupId"
></drawer-user-scope>
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="userDialogVisible" title="添加人员" width="40%">
<el-dialog :append-to-body="true" :close-on-click-modal="false" :visible.sync="userDialogVisible"
title="添加人员" width="40%">
<el-form :model="formData" label-width="100px">
<el-form-item label="参加人员" prop="userId">
@@ -522,25 +523,27 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
`,
props: {
activity_type: {
value: { type: Object, default: "" }
value: {type: Object, default: ""}
}
},
mixins: [initTableMixins],
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
activeName: "1",
pageForm: {
year: new Date().getFullYear() + ""
},
formRules: {
groupId: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
name: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
type: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
projectTypeCode: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
address: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
plannedDate: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
time: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
cover: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
groupId: [{required: true, message: "必填", trigger: ["blur", "change"]}],
name: [{required: true, message: "必填", trigger: ["blur", "change"]}],
type: [{required: true, message: "必填", trigger: ["blur", "change"]}],
projectTypeCode: [{required: true, message: "必填", trigger: ["blur", "change"]}],
address: [{required: true, message: "必填", trigger: ["blur", "change"]}],
plannedDate: [{required: true, message: "必填", trigger: ["blur", "change"]}],
time: [{required: true, message: "必填", trigger: ["blur", "change"]}],
cover: [{required: true, message: "必填", trigger: ["blur", "change"]}]
},
projectTypeList: [],
@@ -557,12 +560,12 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
selectLoading: false,
userColumns: [
{ prop: "userName", label: "姓名" },
{ prop: "loginName", label: "工号" },
{ prop: "sex", label: "性别" },
{ prop: "mobile", label: "联系方式" },
{ prop: "unitName", label: "所属单位" },
{ prop: "unionName", label: "所属工会" }
{prop: "userName", label: "姓名"},
{prop: "loginName", label: "工号"},
{prop: "sex", label: "性别"},
{prop: "mobile", label: "联系方式"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"}
]
}
},
@@ -584,10 +587,50 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
}
},
methods: {
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const formData = JSON.parse(JSON.stringify(this.formData))
formData.activity_type = this.activity_type
const {time, applyTime2, plannedDate} = formData
if (applyTime2 && applyTime2.length) {
formData.applyStartTime = applyTime2[0]
formData.applyEndTime = applyTime2[1]
formData.applyTime2 = null
}
if (time && time.length) {
formData.startTime = formData.time[0]
formData.endTime = formData.time[1]
formData.time = null
}
if (plannedDate && plannedDate.length) {
formData.startPlannedDate = formData.plannedDate[0]
formData.endPlannedDate = formData.plannedDate[1]
formData.plannedDate = null
}
this.$axios.post('/platform/activity/culture/applyActivity/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
if (this.activity_type === 40002) {
window.location.href = "/platform/activity/culture/infoManage/union"
} else if (this.activity_type === 40003) {
window.location.href = "/platform/activity/culture/infoManage/club"
} else {
window.location.href = "/platform/activity/culture/infoManage/school"
}
}
})
})
},
async remoteMethod(query) {
if (query) {
this.selectLoading = true
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/findUser", {
const {data} = await this.$axios.post("/platform/activity/culture/applyActivity/findUser", {
serachWord: query,
activity_type: this.activity_type
})
@@ -624,7 +667,7 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
this.formLoading = true
const formData = JSON.parse(JSON.stringify(this.formData))
formData.activity_type = this.activity_type
const { time, applyTime2, plannedDate } = formData
const {time, applyTime2, plannedDate} = formData
if (applyTime2 && applyTime2.length) {
formData.applyStartTime = applyTime2[0]
formData.applyEndTime = applyTime2[1]
@@ -715,28 +758,28 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
this.$set(this.formData, "mobile", id ? userList.find((v) => v.id === id).mobile : null)
},
async getActivityTwoLevelType(code) {
const { data } = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", { code: code })
const {data} = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", {code: code})
return data
},
async getActivityGroup() {
const { data } = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
const {data} = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = data
},
async generateActivityCode() {
const { data } = await this.$axios.post("/platform/activity/sports/common/generateActivityCode", { activity_type: this.activity_type })
const {data} = await this.$axios.post("/platform/activity/sports/common/generateActivityCode", {activity_type: this.activity_type})
return data
},
async getUnionData() {
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/getUnionData", {
const {data} = await this.$axios.post("/platform/activity/culture/applyActivity/getUnionData", {
activityScopeGroupId: this.formData.groupId
})
return data
},
init(id) {
if (id){
if (id) {
this.activeName = "1"
this.findOne(id)
}else{
} else {
this.formData = {
time: [],
applyTime2: [],
@@ -762,11 +805,11 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
}
},
async queryUserByIds(ids) {
const { data } = await this.$axios.post("/platform/activity/culture/applyActivity/queryUserByIds", { ids: JSON.stringify(ids) })
const {data} = await this.$axios.post("/platform/activity/culture/applyActivity/queryUserByIds", {ids: JSON.stringify(ids)})
return data
},
async findOne(id) {
const { data, code, msg } = await this.$axios.post("/platform/activity/culture/infoManage/findOne", { id })
const {data, code, msg} = await this.$axios.post("/platform/activity/culture/infoManage/findOne", {id})
if (code === 0) {
if (data.userId) {
const user = await this.queryUserByIds([data.userId])
@@ -34,8 +34,8 @@ const ACTIVITY_CULTURE_APPLY_USER = {
<el-card class="mt10" shadow="never">
<table-tool label="活动列表">
<el-radio-group v-model="pageForm.isEnrolled" @change="doSearch" size="mini" class="ml10">
<el-radio-button :label="false">未报名</el-radio-button>
<el-radio-button :label="true">已报名</el-radio-button>
<el-radio-button :label="false">未报名</el-radio-button>
</el-radio-group>
</table-tool>
@@ -17,7 +17,7 @@ const ACTIVITY_CULTURE_INFO_ACTIVITY = {
<el-descriptions-item label="活动编号">
{{ viewData.activityCode }}
</el-descriptions-item>
<el-descriptions-item label="活动编号">
<el-descriptions-item label="活动项目类型">
{{ viewData.projectTypeName }}({{ viewData.projectTypeCode }})
</el-descriptions-item>
<el-descriptions-item label="活动类型" :span="2">
@@ -42,8 +42,8 @@ const ACTIVITY_CULTURE_INFO_ACTIVITY = {
</el-descriptions-item>
<el-descriptions-item label="报名方式">
<span v-if="viewData.signUpMethod===1">个人报名</span>
<span v-else-if="viewData.signUpMethod===2">分工会报名</span>
<span v-else-if="viewData.signUpMethod===3">组队报名</span>
<span v-else-if="viewData.signUpMethod===2">组队报名</span>
<span v-else-if="viewData.signUpMethod===3">分工会报名</span>
<span v-else-if="!viewData.signUpMethod">无需报名</span>
</el-descriptions-item>
<el-descriptions-item label="是否用于报名">
@@ -153,7 +153,43 @@ const singleSignUp = {
</div>
<!-- 分工会报名-->
<div v-else-if="viewData.signUpMethod===3">
<div class="process-title">选择报名人员,报名人数 <span style="color: red">{{viewData.teamNum}}</span>人
</div>
<el-select
v-if="inApplyTime"
v-model="searchTeammateUserId"
filterable
clearable
remote
reserve-keyword
placeholder="请输入关键词"
:remote-method="queryTeammate">
<el-option
v-for="item in teammateOptions"
:key="item.userId"
:label="item.userName + '(' + item.loginName + ')'"
:value="item.userId">
</el-option>
</el-select>
<el-button v-if="inApplyTime" class="ml5" type="primary" icon="el-icon-plus"
@click="addTeamUser">添加
</el-button>
<el-table :data="teamUsers" class="mt10">
<el-table-column label="序号" type="index" width="60px"></el-table-column>
<el-table-column prop="userName" label="姓名"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
<el-table-column prop="unitName" label="单位"></el-table-column>
<el-table-column prop="mobile" label="手机号"></el-table-column>
<el-table-column label="操作" width="100px"
v-if="inApplyTime">
<template slot-scope="scope">
<el-button type="danger" size="mini" @click="removeTeamUser(scope.$index)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 表单填写-->
@@ -243,6 +279,18 @@ const singleSignUp = {
})
},
//查询报名人员
listTeamUserUnion() {
this.$axios.post("/platform/activity/culture/applyUser/listTeamUserUnion", {activityId: this.id}).then((res) => {
if (res.code === 0) {
this.isSignUp = res.data.length > 0
this.teamUsers = res.data
this.defaultAddSelf()
this.customFormInit()
}
})
},
//表单回显
customFormInit() {
if (this.teamUsers && this.teamUsers.length > 0) {
@@ -300,14 +348,14 @@ const singleSignUp = {
//分工会
if (this.viewData.signUpMethod === 3) {
// if (this.teamUsers.length === 0) {
// this.$message.warning("请添加报名人员后再提交!")
// return
// }
// if (this.teamUsers.length > this.viewData.teamNum) {
// this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
// return
// }
if (this.teamUsers.length === 0) {
this.$message.warning("请添加报名人员后再提交!")
return
}
if (this.teamUsers.length > this.viewData.teamNum) {
this.$message.warning("您选择的人数大于" + this.viewData.teamNum + "人,请重新选择!")
return
}
}
let formData = {
@@ -420,7 +468,10 @@ const singleSignUp = {
//查询队友信息
queryTeammate(val) {
if (val) {
this.$axios.post("/platform/activity/culture/applyUser/queryTeammate", {keyword: val}).then((res) => {
this.$axios.post("/platform/activity/culture/applyUser/queryTeammate", {
keyword: val,
signUpMethod: this.viewData.signUpMethod
}).then((res) => {
if (res.code === 0) {
res.data.map(v => v.applyUserId = this.$store.state.user.id)
this.teammateOptions = res.data
@@ -457,11 +508,18 @@ const singleSignUp = {
this.$axios.post("/platform/activity/culture/infoManage/activityInfo", {id: this.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
if (this.viewData.signUpMethod === 3) {
const union = this.viewData.unionUserNumberLimit.find(v => v.id === this.$store.state.user.union.id)
this.viewData.teamNum = union.limitNum
this.listTeamUserUnion()
}else{
this.listTeamUser()
}
if (this.viewData.formConfig) {
this.formCreateRule = formCreate.parseJson(this.viewData.formConfig.rule)
this.formCreateOption = formCreate.parseJson(this.viewData.formConfig.options)
}
this.listTeamUser()
}
})
}
@@ -117,8 +117,8 @@ const ACTIVITY_CULTURE_USER_STATISTICS = {
{ prop: "loginName", label: "工号", width: 180, fixed: "left" },
{ prop: "sex", label: "性别", width: 70 },
{ prop: "mobile", label: "联系方式", width: 180 },
{ prop: "unitName", label: "所属单位", width: 200 },
{ prop: "unionName", label: "所属工会", width: 200 },
{ prop: "unitName", label: "所属单位", width: 200 },
{ prop: "applyDateTime", label: "报名时间", width: 180 },
{ prop: "applyUserUserName", label: "报名人", width: 180 }
],
@@ -56,6 +56,19 @@ layout("/layouts/platform.html"){
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
<search-item label="活动项目" v-if="unionLeaderCoach">
<el-select
@change="doSearch"
clearable
filterable
placeholder="请选择活动项目"
v-model="pageForm.eventId"
>
<el-option :key="item.eventId" :label="item.allName"
:value="item.eventId" v-for="item in eventList"></el-option>
</el-select>
</search-item>
</search>
</el-card>
@@ -136,45 +149,28 @@ layout("/layouts/platform.html"){
<el-card class="mt10" shadow="never">
<table-tool label="活动项目信息">
<div class="search-item-option">
<el-select
@change="doSearch"
clearable
filterable
placeholder="请选择组别"
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
v-if="unionLeaderCoach"
v-model="pageForm.groupName"
>
<el-option :key="item.id" :label="item.name" :value="item.name"
v-for="item in groupList"></el-option>
</el-select>
</div>
<!-- <div class="search-item-option">
<el-select
@change="doSearch"
clearable
filterable
placeholder="请选择组别"
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
v-if="unionLeaderCoach"
v-model="pageForm.groupName"
>
<el-option :key="item.id" :label="item.name" :value="item.name"
v-for="item in groupList"></el-option>
</el-select>
</div>-->
<div class="search-item-option">
<el-select
@change="doSearch"
clearable
filterable
placeholder="请选择活动项目"
style="width: 100%; margin-bottom: 5px; margin-left: 10px"
v-if="unionLeaderCoach"
v-model="pageForm.eventId"
>
<el-option :key="item.eventId" :label="item.allName"
:value="item.eventId" v-for="item in eventList"></el-option>
</el-select>
</div>
<div class="mr10 ml20" v-if="unionLeaderCoach">
<div v-if="unionLeaderCoach">
领队:
<span style="color: #419bf8">{{leaderData.username?leaderData.username:'暂无'}}</span>
&emsp13; 教练:
<span
style="color: #419bf8">{{coachData.username ?coachData.username:'暂无'}}</span>
</div>
<div>
<el-button @click="openLeaderCoach" size="medium" type="primary"
v-if="unionLeaderCoach">设置领队/教练
<span style="color: #419bf8">{{coachData.username ?coachData.username:'暂无'}}</span>
<el-button @click="openLeaderCoach" size="medium" type="primary">设置领队/教练
</el-button>
</div>
</table-tool>
@@ -418,9 +418,10 @@ layout("/layouts/platform.html"){
return v.id === this.pageForm.id
})
await this.getEventsByActivityId()
this.pageForm.activityName = activity.length > 0 ? activity[0].name : null
this.pageForm.applyType = activity[0].applyType
if (activity.length>0){
this.pageForm.activityName = activity.length > 0 ? activity[0].name : null
this.pageForm.applyType = activity[0].applyType
}
const resp = await this.$axios.post(loc() + "/pageData", this.pageForm)
this.tabLoading = false
if (resp.code === 0) {
@@ -184,7 +184,7 @@ const apply_component = {
this.$axios.post("/platform/evaluate/apply/info", {id: row.id}).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.$set(this.formData, "honorTypeName", row.honorTypeName)
}
})
},
@@ -109,7 +109,7 @@ layout("/layouts/platform.html"){
},
openView(row) {
this.$refs.guava.public(() => {
this.$refs.infoRef.onOpen(row.id)
this.$refs.infoRef.onOpen(row)
this.showApprovalForm = false
})
},
@@ -108,7 +108,7 @@ layout("/layouts/platform.html"){
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row.id)
this.$refs.infoRef.onOpen(row)
})
},
exportExcel() {
@@ -303,6 +303,7 @@ layout("/layouts/platform.html"){
}
},
async init() {
this.clubOption = await this.$businessTool.listCLubByRole()
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
const budgetTypeOption = []
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
@@ -364,7 +365,7 @@ layout("/layouts/platform.html"){
},
async created() {
this.init()
this.clubOption = await this.$businessTool.listCLubByRole()
}
})
</script>
@@ -41,7 +41,8 @@ const basicForm = {
</el-col>
<el-col :span="24">
<el-form-item prop="unionQuotaAllocationList" label="工会名额分配">
<el-table :data="formData.unionQuotaAllocationList" size="medium" height="70vh">
<el-table :data="formData.unionQuotaAllocationList" size="medium" max-height="500"
show-summary style="width: 100%">
<el-table-column type="index" label="序号"></el-table-column>
<el-table-column label="工会名称" prop="unionName"></el-table-column>
<el-table-column label="会员人数" prop="memberNum"></el-table-column>
@@ -49,14 +49,17 @@ layout("/layouts/platform.html"){
<el-table-column label="报名结束时间" prop="signUpEndTIme"></el-table-column>
<el-table-column label="所属工会" prop="unionName"></el-table-column>
<el-table-column label="分配名额数" prop="allocationNum"></el-table-column>
<el-table-column label="报名数(已审核通过数)">
<!-- <el-table-column label="报名数(已审核通过数)">
<template v-slot="{ row }">
</template>
</el-table-column>
</el-table-column>-->
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onSignUp(row)" size="mini" type="primary">报名</el-button>
<el-button @click="onSignUp(row)" size="mini" type="primary"
v-if="$moment(row.signUpStartTime).valueOf() < $moment().valueOf()
&&
$moment(row.signUpEndTIme).valueOf() > $moment().valueOf()">报名</el-button>
</template>
</el-table-column>
</el-table>
@@ -94,7 +97,8 @@ layout("/layouts/platform.html"){
methods: {
onSignUp(row){
this.$refs.guava.edit(() => {
this.$refs.signUpFormRef.onOpen(row.activityId, row.unionId)
const activity= this.activityList.find(item => item.id === row.activityId)
this.$refs.signUpFormRef.onOpen(row.activityId, row.unionId,activity)
})
},
onView(row){
@@ -1,11 +1,13 @@
const info = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName" >
<el-tabs v-model="activeName">
<el-tab-pane label="活动基础信息" name="one">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="活动名称">{{ viewData.activityName }}</el-descriptions-item>
<el-descriptions-item label="报名时间">{{ viewData.signUpStartTime }}{{viewData.signUpEndTIme}}</el-descriptions-item>
<el-descriptions-item label="报名时间">{{ viewData.signUpStartTime
}}{{viewData.signUpEndTIme}}
</el-descriptions-item>
<el-descriptions-item label="活动线路" :span="2">{{viewData.linNames}}</el-descriptions-item>
<el-descriptions-item label="工会名额分配" :span="2">
<el-table :data="viewData.unionQuotaAllocationList" size="medium" height="70vh">
@@ -24,20 +26,81 @@ const info = {
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="报名信息" name="two">
<el-table :data="userTableData" :size="tableSize" height="70vh">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="报名线路" prop="lineName"></el-table-column>
<el-table-column prop="signUpTime" label="填报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="230">
<template v-slot="{ row }">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-dialog
:close-on-click-modal="false"
:append-to-body="true"
:visible.sync="userDialogVisible"
title="详细信息查看"
width="40%"
>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="姓名">{{ userViewData.userName }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ userViewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="单位">{{ userViewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="工会">{{ userViewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="附件">
<file-preview :files="userViewData.files" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="userDialogVisible = false" type="primary"> </el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
viewData: {},
activeName:"one"
activeName: "one",
userTableData: [],
activityId: "",
unionId: "",
userDialogVisible:false,
userViewData:{}
}
},
methods: {
async onOpen(id,unionId) {
openView(row) {
this.userViewData = row
this.userViewData.files = JSON.parse(row.files)
this.userDialogVisible = true
},
async onOpen(id, unionId) {
this.activityId = id
this.unionId = unionId
await this.findOne(id)
this.listQuotaAllocation()
},
async findOne(id) {
this.$axios.post("/platform/excellentRecuperation/activityList/findOne", {id}).then(resp => {
@@ -46,6 +109,16 @@ const info = {
}
})
},
listQuotaAllocation() {
this.$axios.post("/platform/excellentRecuperation/activitySignUp/listQuotaAllocation", {
activityId: this.activityId,
unionId: this.unionId
}).then(res => {
if (res.code === 0) {
this.userTableData = res.data
}
})
},
},
}
@@ -77,7 +77,7 @@ const SIGN_UP_FORM = {
</el-row>
</el-card>
<div class="process-title">报名人员信息</div>
<div class="process-title">报名人员信息<span style="color:#ee0a24;">(如需修改或提交报名人员信息请点击编辑后提交)</span></div>
<el-table :data="tableData" @sort-change="pageOrder" :size="tableSize" height="70vh">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="姓名" prop="userName"></el-table-column>
@@ -144,7 +144,8 @@ const SIGN_UP_FORM = {
unionId: "",
lineList: [],
userOptions: [],
userViewData:{},
userViewData: {},
activityData: {},
userDialogVisible: false
}
},
@@ -152,7 +153,7 @@ const SIGN_UP_FORM = {
userChange(val) {
const user = this.userOptions.find(o => o.id === val)
if (user) {
const {userName, loginName, unitId, unitName, unionId, unionName,mobile,idCard} = user
const {userName, loginName, unitId, unitName, unionId, unionName, mobile, idCard} = user
this.$set(this.formData, "userName", userName)
this.$set(this.formData, "loginName", loginName)
this.$set(this.formData, "unitId", unitId)
@@ -168,17 +169,37 @@ const SIGN_UP_FORM = {
}
}
},
async getSIgnUpUserList() {
const res = await this.$axios.post('/platform/excellentRecuperation/activitySignUp/getSIgnUpUserList', {
activityId: this.activityId,
unionId: this.unionId
})
if (res.code === 0) {
return res.data.length
} else {
return 0
}
},
onSave() {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("保存成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
this.getSIgnUpUserList().then(data => {
const union = this.activityData.unionQuotaAllocationList.find(v => v.unionId === this.unionId)
if (data >= union.allocationNum) {
this.$message.error("该活动已满")
return
} else {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("保存成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
}
})
}
})
},
onSubmit() {
this.$refs.formRef.validate(valid => {
@@ -188,14 +209,22 @@ const SIGN_UP_FORM = {
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/submit', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("提交成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
this.getSIgnUpUserList().then(data => {
const union = this.activityData.unionQuotaAllocationList(v => v.unionId === this.unionId)
if (data >= union.allocationNum) {
this.$message.error("该活动已满")
return
} else {
this.$axios.post('/platform/excellentRecuperation/activitySignUp/submit', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.listQuotaAllocation()
this.$message.success("提交成功")
this.formData = {
lineId: this.lineList[0].id,
activityId: this.activityId
}
}
})
}
})
})
@@ -294,9 +323,10 @@ const SIGN_UP_FORM = {
}
})
},
onOpen(activityId, unionId) {
onOpen(activityId, unionId, activity) {
this.activityId = activityId
this.unionId = unionId
this.activityData = activity
this.listQuotaAllocation()
this.getLineList(activityId)
},
@@ -11,7 +11,7 @@ layout("/layouts/platform.html"){
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<search-item label="年度">
<el-date-picker
v-model="pageForm.year"
type="year"
@@ -24,7 +24,7 @@ layout("/layouts/platform.html"){
</el-date-picker>
</search-item>
<search-item label="活动">
<search-item label="活动">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.activityId"
placeholder="请选择活动">