diff --git a/src/main/java/com/budwk/app/base/constant/RoleConstant.java b/src/main/java/com/budwk/app/base/constant/RoleConstant.java index 33c8016..3c7a3b8 100644 --- a/src/main/java/com/budwk/app/base/constant/RoleConstant.java +++ b/src/main/java/com/budwk/app/base/constant/RoleConstant.java @@ -34,6 +34,7 @@ RoleConstant { BRANCH_UNION_CHAIRMAN("分工会主席"), BRANCH_UNION_VICE_CHAIRMAN("分工会副主席"), BRANCH_UNION_OPERATOR("分工会操作员"), + BRANCH_UNION_MANAGER("机关分工会负责人"), BRANCH_UNION_GROUP_LEADER("工会小组组长"), BRANCH_UNION_ARTICLE_WRITER("分工会新闻投稿员"), BRANCH_UNION_WY("分工会委员"), diff --git a/src/main/java/com/budwk/app/base/sms/impl/hgu/SmsHguServiceImpl.java b/src/main/java/com/budwk/app/base/sms/impl/hgu/SmsHguServiceImpl.java index 7b0c83d..39782aa 100644 --- a/src/main/java/com/budwk/app/base/sms/impl/hgu/SmsHguServiceImpl.java +++ b/src/main/java/com/budwk/app/base/sms/impl/hgu/SmsHguServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.budwk.app.base.sms.SmsService; import com.budwk.app.base.sms.impl.hgu.util.SignUtil; +import com.budwk.app.web.commons.base.Globals; import lombok.extern.slf4j.Slf4j; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; @@ -47,13 +48,6 @@ public class SmsHguServiceImpl implements SmsService { doSend(title, content, receivers); } - /** - * 如果要发链接的消息,请以html的形式写在content中,就这么规定的,我也没办法 - * channels,多个使用英文逗号进行分隔.一般情况下短信id是1;邮件是2;app消息是3;微信是4;钉钉是5;welink是6,目前先写死微信通道了 - * @param title - * @param content - * @param receivers - */ private void doSend(String title, String content, List> receivers) { // 随机字符串 String nonce = R.UU32(); @@ -75,27 +69,30 @@ public class SmsHguServiceImpl implements SmsService { log.debug("send params: {}", Json.toJson(paramsMap)); - HttpRequest request = HttpRequest.post(URL) - .header("sd-appid", APPID) - .header("sd-algorithm", SignUtil.ALGORITHM_SHA1) - .header("sd-timestamp", String.valueOf(timestamp)) - .header("sd-nonce", nonce) - .header("sd-signature", signature) - .body(Json.toJson(paramsMap)); + if (Globals.MyConfig.getBoolean("AppSms")){ + HttpRequest request = HttpRequest.post(URL) + .header("sd-appid", APPID) + .header("sd-algorithm", SignUtil.ALGORITHM_SHA1) + .header("sd-timestamp", String.valueOf(timestamp)) + .header("sd-nonce", nonce) + .header("sd-signature", signature) + .body(Json.toJson(paramsMap)); - try { - HttpResponse response = request.execute(); - NutMap bodyMap = Json.fromJson(NutMap.class, response.body()); - NutMap resultMap = bodyMap.getAs("result", NutMap.class); - NutMap dataMap = resultMap.getAs("data", NutMap.class); - log.info("send response body: {}", response.body()); - if(dataMap.getBoolean("successed")) { - log.info("send success code: {}, successed: {}", dataMap.getInt("code"), dataMap.getBoolean("successed")); - } else { - log.error("send error code: {}, successed: {}", dataMap.getInt("code"), dataMap.getBoolean("successed")); + try { + HttpResponse response = request.execute(); + NutMap bodyMap = Json.fromJson(NutMap.class, response.body()); + NutMap resultMap = bodyMap.getAs("result", NutMap.class); + NutMap dataMap = resultMap.getAs("data", NutMap.class); + log.info("send response body: {}", response.body()); + if(dataMap.getBoolean("successed")) { + log.info("send success code: {}, successed: {}", dataMap.getInt("code"), dataMap.getBoolean("successed")); + } else { + log.error("send error code: {}, successed: {}", dataMap.getInt("code"), dataMap.getBoolean("successed")); + } + } catch (Exception e) { + log.error("Failed to send: {}", e.getMessage(), e); } - } catch (Exception e) { - log.error("Failed to send: {}", e.getMessage(), e); } + } } diff --git a/src/main/java/com/budwk/app/flow/enums/ProcessSubmitTypeEnum.java b/src/main/java/com/budwk/app/flow/enums/ProcessSubmitTypeEnum.java index afdb4bf..c8523b2 100644 --- a/src/main/java/com/budwk/app/flow/enums/ProcessSubmitTypeEnum.java +++ b/src/main/java/com/budwk/app/flow/enums/ProcessSubmitTypeEnum.java @@ -1,5 +1,7 @@ package com.budwk.app.flow.enums; +import com.budwk.app.base.annotation.DictEnum; +import lombok.AllArgsConstructor; import lombok.Getter; /** @@ -9,6 +11,7 @@ import lombok.Getter; * @date 2023/10/7 */ @Getter +@DictEnum(key = "ProcessSubmitTypeEnum", name = "流程提交类型(操作类型)") public enum ProcessSubmitTypeEnum { APPLY(0, "发起申请"), AGREE(1, "同意"), diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java new file mode 100644 index 0000000..e138e1a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java @@ -0,0 +1,25 @@ +package com.budwk.app.zhgh.activity.fellowship.constant; + +import com.budwk.app.base.annotation.DictEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Author JyuHsin + * @Date 2022/11/18 + * @Description + */ +@Getter +@DictEnum(key = "ColumnFormTypeEnum", name = "控件类型") +@AllArgsConstructor +public enum ColumnFormTypeEnum { + + INPUT("INPUT", "输入框"), + SELECT("SELECT", "选择框"), + STEPPER("STEPPER", "步进器"), + //RADIO("RADIO", "单选框"),//选项数组 + FILE("FILE", "文件"); + + private String code; + private String description; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java new file mode 100644 index 0000000..39a7fda --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java @@ -0,0 +1,179 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateUtil; +import com.budwk.app.base.annotation.SLog; +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.zhgh.activity.fellowship.models.FellowshipActivity; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivityCourse; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUserCourse; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author JyuHsin + * @Date 2022/9/21 + * @Description 人员调整 + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "交友联谊人员调整") +@At("/platform/fellowship/adjust") +public class FellowshipAdjustController { + + @Inject + private Dao dao; + @Inject + private BaseService baseService; + @Inject + private FellowshipActivityService fellowshipActivityManageService; + @Inject + private FellowshipActivityStatisticsService fellowshipActivityStatisticsService; + + @At("") + @SaCheckPermission("fellowship.adjust") + @Ok("beetl:/platform/zhgh/activity/fellowship/userAdjust/index.html") + public void index() { + } + + /** + * 活动list + * @param year 年度 + * @return + */ + @At + @ApiOperation("活动列表") + @SaCheckPermission("fellowship.adjust") + public Result activityList(@Param(value = "year") Integer year) { + List activityList = dao.query(FellowshipActivity.class, Cnd.NEW().andEX("year", "=", year).andEX("isDisabled", "=", false).desc("activityStartTime")); + return Result.success(activityList); + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("fellowship.adjust") + public Result pageData(PageForm pageForm, + @Param(value = "activityId") String activityId) { + Pagination pagination = fellowshipActivityStatisticsService.pageData(pageForm, activityId); + return Result.success(pagination); + } + + @At + @ApiOperation("子活动查询") + @SaCheckPermission("fellowship.adjust") + public Result getCourse(String activityId) { + Sql sql = Sqls.create(""" + SELECT + tsuc.id, + tsuc.courseName, + tsuc.coursePeopleNumber, + tsuc.courseType, + tsuc.courseLocation, + tsuc.courseInstructor, + tsuc.courseReservedNumber, + tsuc.waitingNum, + tsuc.reserveMode + FROM + `fellowship_course` tsuc + WHERE + tsuc.activityId = @activityId + ORDER BY courseName asc + """); + sql.setParam("activityId", activityId); + List courseList = baseService.listMap(sql); + courseList.forEach(c -> { + c.put("registerNum", fellowshipActivityStatisticsService.queryCourseCount(c.getString("id"), c.getString("courseType"))); + c.put("hasWaitingNum", fellowshipActivityStatisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType"))); + }); + return Result.success(courseList); + } + + @At + @ApiOperation("报名用户列表") + @SaCheckPermission("fellowship.adjust") + public Result registerUserList(@Param("courseId") String courseId, + @Param(value = "unionId") String unionId, + @Param(value = "unitId") String unitId, + @Param(value = "searchName") String searchName, + @Param(value = "searchKeyword") String searchKeyword) { + List list = fellowshipActivityStatisticsService.registerUserList(courseId, unionId, unitId, searchName, searchKeyword); + return Result.success(list); + } + + @At + @ApiOperation("人员调整") + @SaCheckPermission("fellowship.adjust") + @SLog(tag = "交友联谊-人员调整", msg = "人员调整") + public Result adjust(String activityId, String oldCourseId, String newCourseId, String userId) { + + Cnd oldCnd = Cnd.where("activityId", "=", activityId) + .and("courseId", "=", oldCourseId).and("userId", "=", userId); + + Cnd newCnd = Cnd.where("activityId", "=", activityId) + .and("courseId", "=", newCourseId).and("userId", "=", userId); + + //旧的报名信息 + FellowshipUser oldfellowshipUser = dao.fetch(FellowshipUser.class, oldCnd); + oldfellowshipUser.setCourseId(newCourseId); + oldfellowshipUser.setSignUpTime(DateUtil.date()); + dao.update(oldfellowshipUser); + + //新的课程的信息,上课时间 + List activityCourseList = dao.query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activityId) + .and("courseId", "=", newCourseId)); + //先清楚旧的信息 + dao.clear(FellowshipUserCourse.class, oldCnd); + //添加新的信息 + List fellowshipUserCourseList = new ArrayList<>(); + activityCourseList.forEach(item -> { + FellowshipUserCourse course = new FellowshipUserCourse(); + course.setActivityCourseId(activityId); + course.setCourseId(newCourseId); + course.setUserId(userId); + course.setCourseStartTime(item.getCourseStartTime()); + course.setCourseEndTime(item.getCourseEndTime()); + course.setActivityCourseId(item.getId()); + fellowshipUserCourseList.add(course); + }); + dao.insert(fellowshipUserCourseList); + return Result.success(); + } + + @At + @ApiOperation("删除报名人员") + @SaCheckPermission("fellowship.adjust") + @SLog(tag = "交友联谊-人员调整", msg = "删除报名人员") + public Result deleteSignUser(String activityId, String courseId, String userId) { + + //删除 + Cnd cnd = Cnd.NEW(); + cnd.and("activityId", "=", activityId); + cnd.and("courseId", "=", courseId); + cnd.and("userId", "=", userId); + + dao.clear(FellowshipUser.class, cnd); + dao.clear(FellowshipUserCourse.class, cnd); + return Result.success(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java new file mode 100644 index 0000000..9515eec --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java @@ -0,0 +1,437 @@ +package com.budwk.app.zhgh.activity.fellowship.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.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.utils.ConditionGroupUtil; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.sys.services.SysDictService; +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.fellowship.models.*; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +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.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.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "活动报名") +@At("/platform/fellowship/apply") +public class FellowshipApplyController { + + private final ReentrantLock lock = new ReentrantLock(true); + + @Inject + private FellowshipActivityService fellowshipActivityService; + @Inject + private SysDictService dictService; + @Inject + private FellowshipActivityStatisticsService statisticsService; + @Inject + private Dao dao; + + @At("/") + @SaCheckPermission("fellowship.apply") + @Ok("beetl:/platform/zhgh/activity/fellowship/apply/index.html") + public void index() { + } + + @At("/h5") + @SaCheckPermission("h5.fellowship.apply") + @Ok("beetl:/platform/zhghh5/activity/fellowship/apply/index.html") + public void h5Index() { + } + + @At("/list/h5") + @SaCheckPermission("h5.fellowship.apply") + @Ok("beetl:/platform/zhghh5/activity/fellowship/list/index.html") + public void listIndex() { + } + + @At + @ApiOperation("活动查询") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result activityPageData(PageForm pageForm, + @Param(value = "year") Integer year, + @Param(value = "activityType") Integer activityType, + @Param(value = "id") String id, + @Param(value = "dataType") String dataType) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("id", "=", id); + cnd.andEX("`year`", "=", year); + //查询报名中 + if (activityType == 2) { + cnd.and(new Static("now() < activitySignUpEndTime")); + }//查询已结束的 + else if (activityType == 3) { + cnd.and(new Static("now() >= activityEndTime")); + } + + if (AuthUtil.hasRole("H04") && !AuthUtil.hasRoleOr("sysadmin, A06")) { + cnd.and("activityMode", "=", 2).and("createdBy", "=", SecurityUtil.getUserId()); + } + + if("mine".equals(dataType)) { + cnd.and(new Static("id in (select activityId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId()))); + } + + Pagination pagination = fellowshipActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + List fellowshipActivities = pagination.getList(); + Map fellowshipTypeMap = dictService.getSubListByCode("FELLOWSHIP_TYPE").stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); + fellowshipActivities.forEach(v -> v.setTrainType(fellowshipTypeMap.get(v.getTrainType()))); + return Result.success(pagination); + } + + @At + @ApiOperation("分活动查询") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result pageData(PageForm pageForm, + @Param(value = "courseTypeId") String courseTypeId, + @Param(value = "activityId") String activityId, + @Param(value = "assortTypes") String[] assortTypes, + @Param(value = "dataType") String dataType) { + Sql sql = Sqls.create(""" + SELECT + tsuc.id, + tsuc.activityId, + tsuc.courseName, + tsuc.coursePeopleNumber, + tsuc.courseLocation, + tsuc.courseType, + tsuc.courseLocationCoordinates, + tsuc.courseReservedNumber, + tsuc.courseInstructor, + tsuc.campus, + tsuc.unionLimit, + tsuc.isMobileSign, + tsuc.signType, + tsuc.isReceiveGift, + tsuc.giftType, + tsuc.reserveMode, + tsuc.waitingNum, + tsuc.assort, + tsuc.introduce, + type.typeName, + tsuc.courseIsLimitApply + FROM + `fellowship_course` tsuc + LEFT JOIN fellowship_type type ON type.id = tsuc.courseType + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("type.id", "=", courseTypeId); + cnd.and("tsuc.activityId", "=", activityId); + + if (Lang.isNotEmpty(assortTypes)) { + cnd.and("tsuc.assort", "in", assortTypes); + } + + if("mine".equals(dataType)) { + cnd.and(new Static("tsuc.id in (select courseId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId()))); + } + + List courseArray = fellowshipActivityService.dao().query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + courseArray = fellowshipActivityService.filterCourseByHostUnion(courseArray); + cnd.and("tsuc.id", "in", courseArray.stream().map(FellowshipCourse::getId).toList()); + + cnd.asc("tsuc.orderNum"); + cnd.asc("type.code"); + sql.setCondition(cnd); + + Pagination pagination = fellowshipActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List courseList = pagination.getList(); + + courseList.forEach(c -> { + List courseTimes = dao.query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", c.getString("id")).asc("courseDate")); + c.put("courseTimes", courseTimes); + + c.put("hasRegisterNum", statisticsService.queryCourseCount(c.getString("id"), c.getString("courseType"))); + c.put("hasWaitingNum", statisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType"))); + //当前用户是否报过 + c.put("isSign", fellowshipActivityService.isSignCourseByUser(c.getString("id"), SecurityUtil.getUserId())); + + if (StrUtil.isNotBlank(c.getString("unionLimit"))) { + List unionLimit = Json.fromJsonAsList(NutMap.class, c.getString("unionLimit")); + if (Lang.isNotEmpty(unionLimit)) { + NutMap nutMap = unionLimit.stream().filter(o -> o.getString("id").equals(SecurityUtil.getUnionId())).findFirst().orElse(null); + if (nutMap != null) { + c.put("coursePeopleNumber", nutMap.getInt("limitCount")); + } + } + } + }); + return Result.success(pagination); + } + + @At + @ApiOperation("获取分活动时间") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result getCourseTime(String id) { + List list = fellowshipActivityService.dao().query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", id)); + return Result.success(list); + } + + @At + @ApiOperation("查询分类标识集合") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result queryCourseAssort(String activityId) { + List courseList = fellowshipActivityService.dao().query(FellowshipCourse.class, Cnd.where(FellowshipCourse::getActivityId, "=", activityId).asc(FellowshipCourse::getOrderNum)); + if (Lang.isEmpty(courseList)) { + return Result.success(new ArrayList<>()); + } + List assortList = courseList.stream().map(FellowshipCourse::getAssort).filter(StrUtil::isNotBlank).distinct().toList(); + return Result.success(assortList); + } + + @At + @ApiOperation("验证是否能报名") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result validateSignUp(String courseId, + @Param(value = "currentFamilyNumber") Integer currentFamilyNumber) { + try { + lock.lock(); + if (StrUtil.isBlank(courseId)) { + return Result.error("报名信息为空"); + } + + currentFamilyNumber = currentFamilyNumber != null ? currentFamilyNumber : 0; + FellowshipCourse course = dao.fetch(FellowshipCourse.class, courseId); + FellowshipActivity activity = dao.fetch(FellowshipActivity.class, course.getActivityId()); + + //判断时间 + if (DateUtil.compare(new Date(), activity.getActivitySignUpStartTime(), "yyyy-MM-dd HH:mm:ss") < 0) { + return Result.error("报名未开始"); + } + if (DateUtil.compare(new Date(), activity.getActivitySignUpEndTime(), "yyyy-MM-dd HH:mm:ss") > 0) { + return Result.error("报名已结束"); + } + //新增:基于条件组的用户资格验证 + if (course.getMatchCnd() != null) { + Cnd userCnd = Cnd.where("id", "=", SecurityUtil.getUserId()); + ConditionGroupUtil.applyConditionGroup(userCnd, course.getMatchCnd()); + int userCount = dao.count(Sys_user.class, userCnd); + if (userCount == 0) { + return Result.error("您不符合该活动的报名条件"); + } + } + + //判断活动组别 + int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId())); + if (count == 0) { + return Result.error("抱歉,您没有此次活动的权限"); + } + + //判断是否报名 + boolean courseByUser = fellowshipActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId()); + if (courseByUser) { + return Result.error("抱歉,您已经报名"); + } + + //判断活动人数 + boolean signFull = fellowshipActivityService.isSignFull(course, currentFamilyNumber); + if (signFull) { + return Result.error("名额剩余数量不足"); + } + + //判断活动限制 + boolean signCourse = fellowshipActivityService.isSignCourse(course, activity); + if (!signCourse) { + if (activity.getRestrictLimit() != 3) { + return Result.error("您选择的类型已达上限,不能再报该类型的了"); + } else { + return Result.error(activity.getActivityName() + "限制报" + activity.getLimitNum() + "个活动,已达上限"); + } + } + + //判断分工会人数限制 + boolean signFullByUnionId = fellowshipActivityService.isSignFullByUnionId(course, currentFamilyNumber); + if (signFullByUnionId) { + return Result.error("您所在的分工会名额不足"); + } + + + return Result.success(); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("报名失败"); + } finally { + lock.unlock(); + } + } + + @At + @ApiOperation("查询子活动时间段") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result getCourseTimeSelectList(String courseId) { + // 查课程的时间段 + List courseList = dao.query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime")); + + // 查课程的报名人数 + List applyUserList = dao.query(FellowshipUserCourse.class, Cnd.where("courseId", "=", courseId)); + + List userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1)); + List idList = userList.stream().map(FellowshipUser::getUserId).toList(); + + applyUserList = applyUserList.stream().filter(o -> idList.contains(o.getUserId())).toList(); + + // 按照课程下面时间段去分组 + Map> collectMap = applyUserList.stream().collect(Collectors.groupingBy(FellowshipUserCourse::getActivityCourseId)); + List list = courseList.stream().map(v -> { + String id = v.getId(); + NutMap nutMap = NutMap.NEW(); + List fellowshipUserCourses = collectMap.get(id); + int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0; + if (Lang.isNotEmpty(fellowshipUserCourses)) { + remainingNum = v.getCourseLimitNum() - fellowshipUserCourses.size(); + } + nutMap.put("remainingNum", remainingNum); + nutMap.put("text", DateUtil.format(v.getCourseStartTime(), "MM月dd日 HH:mm") + "至" + DateUtil.format(v.getCourseEndTime(), "HH:mm") + "段(剩" + remainingNum + ")"); + nutMap.put("value", id); + nutMap.put("disabled", remainingNum == 0); + return nutMap; + }).toList(); + return Result.success(list); + } + + @At + @ApiOperation("验证子活动是否能报名") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + public Result validateSourceSignUp(String activityCourseId, String courseId) { + try { + lock.lock(); + + List userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1)); + List isList = userList.stream().map(FellowshipUser::getUserId).toList(); + + // 该时间段下已报名的人数 + int count = dao.count(FellowshipUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId) + .and("courseId", "=", courseId).and("userId", "in", isList)); + // 获取该时间段下的活动课程限制报名人数 + FellowshipActivityCourse course = dao.fetch(FellowshipActivityCourse.class, activityCourseId); + Integer courseLimitNum = course.getCourseLimitNum(); + // 报名加上自己,如果大于了限制人数,那就无法报名 + if (count + 1 > courseLimitNum) { + return Result.error("该时间段名额已报满,请选择其他时段报名"); + } else { + return Result.success(); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error("报名失败"); + } finally { + lock.unlock(); + } + } + + @At + @ApiOperation("活动报名") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + @SLog(tag = "交友联谊-活动报名", msg = "活动报名") + public Result doSignUp(FellowshipUser fellowshipUser) { + try { + lock.lock(); + boolean courseByUser = fellowshipActivityService.isSignCourseByUser(fellowshipUser.getCourseId(), SecurityUtil.getUserId()); + if (courseByUser) { + return Result.error("您已报过该活动"); + } + //判断人数 + int number = 0; + FellowshipCourse course = fellowshipActivityService.dao().fetch(FellowshipCourse.class, fellowshipUser.getCourseId()); + FellowshipType type = fellowshipActivityService.dao().fetch(FellowshipType.class, course.getCourseType()); + if (type != null) { + if (type.getIsBringFamily() && type.getIsAddFamily()) { + List mobileColumnsValue = fellowshipUser.getMobileColumnsValue(); + NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null); + number = map != null ? map.getInt("columnValue") : 0; + } + } + boolean signFull = fellowshipActivityService.isSignFull(course, number); + if (signFull) { + return Result.error("当前报名人数已满"); + } + boolean signFullByUnionId = fellowshipActivityService.isSignFullByUnionId(course, number); + if (signFullByUnionId) { + return Result.error("该活动您所在的分工会名额不足"); + } + fellowshipActivityService.doSignUp(fellowshipUser); + return Result.success("报名成功"); + } catch (Exception e) { + e.printStackTrace(); + return Result.success("报名失败"); + } finally { + lock.unlock(); + } + } + + @At + @ApiOperation("取消报名") + @SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR) + @SLog(tag = "交友联谊-活动报名", msg = "取消报名") + public Result cancelSignUp(@Param("activityId") String activityId, @Param("courseId") String courseId) { + String userId = SecurityUtil.getUserId(); + //取消分两种情况 + //第一种没有设置分工会人数限制,那么将候补的人按时间倒叙往上补 + //第二种如果设置了分工会人数限制,那么只将本分工会的候补人员按照时间倒叙往上补,如果本分工会没有候补人员,则名额空出来,由校工会手动调整 + FellowshipCourse course = dao.fetch(FellowshipCourse.class, courseId); + FellowshipType type = dao.fetch(FellowshipType.class, course.getCourseType()); + //如果是正常报名取消了,将候补报名的按时间倒叙第一个改为正常报名 + Cnd cnd = Cnd.where("activityId", "=", activityId).and("courseId", "=", courseId) + .and("state", "=", 2); + //如果设置了分工会报名人数限制,则只查本分工会 + if (Lang.isNotEmpty(course.getUnionLimit())) { + cnd.and(new Static(" userId in (select id from user where unionid = '%s')".formatted(SecurityUtil.getUnionId()))); + } + cnd.asc("signUpTime"); + if (!type.getIsBringFamily() && course.getReserveMode() == 2) { + List signUpUsers = dao.query(FellowshipUser.class, cnd); + int thisSignUpUserCount = dao.count(FellowshipUser.class, + Cnd.where("activityId", "=", activityId) + .and("courseId", "=", courseId).and("userId", "=", userId) + .and("state", "in", List.of(1, 3))); + if (!signUpUsers.isEmpty() && thisSignUpUserCount > 0) { + FellowshipUser fellowshipUser = signUpUsers.get(0); + fellowshipUser.setState(1); + dao.update(fellowshipUser); + Sys_user user = dao.fetch(Sys_user.class, fellowshipUser.getUserId()); + //msgApi.sendTextMsg("【" + activity.getActivityName() + "】已候补成功,请按时参加活动!", user.getLoginname()); + } + } + //删除报名记录 + dao.clear("fellowship_user_course", Cnd.where("activityId", "=", activityId) + .and("courseId", "=", courseId).and("userId", "=", userId)); + + dao.clear("fellowship_user", Cnd.where("activityId", "=", activityId) + .and("courseId", "=", courseId).and("userId", "=", userId)); + return Result.success(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java new file mode 100644 index 0000000..73ccdab --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java @@ -0,0 +1,200 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +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.zhgh.activity.fellowship.models.*; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.trans.Trans; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author zxy + * @Description 培训报名 活动管理 + * @createTime 2022年02月23日 09:57:00 + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "活动管理") +@At("/platform/fellowship/manage") +public class FellowshipManageController { + + @Inject + private FellowshipActivityService fellowshipActivityManageService; + @Inject + private Dao dao; + + @At("") + @SaCheckPermission("fellowship.manage") + @Ok("beetl:/platform/zhgh/activity/fellowship/manage/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("fellowship.manage") + public Result pageData(PageForm pageForm, + @Param(value = "year") Integer year, + @Param(value = "activityName") String activityName) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("year", "=", year); + cnd.and(Cnd.likeEX("activityName", activityName)); + cnd.orderBy("createdAt", "desc"); + return Result.success().addData(fellowshipActivityManageService.pageData(pageForm, cnd)); + } + + @At + @ApiOperation("活动删除") + @SaCheckPermission("fellowship.manage") + @SLog(tag = "交友联谊-活动管理", msg = "删除活动") + public Result onDelete(String id) { + Trans.exec(() -> { + fellowshipActivityManageService.delete(id); + dao.clear(FellowshipCourse.class, Cnd.where("activityId", "=", id)); + dao.clear(FellowshipActivityCourse.class, Cnd.where("activityId", "=", id)); + dao.clear(FellowshipUser.class, Cnd.where("activityId", "=", id)); + dao.clear(FellowshipUserCourse.class, Cnd.where("activityId", "=", id)); + dao.clear(FellowshipActivity.class, Cnd.where("id", "=", id)); + dao.clear(FellowshipTypeLimit.class, Cnd.where("activityId", "=", id)); + dao.delete(Sys_home_activity.class, id); + }); + return Result.success(); + } + + @At + @ApiOperation("活动状态变更") + @SaCheckPermission("fellowship.manage") + public Result activityStatusChange(FellowshipActivity activity) { + fellowshipActivityManageService.updateActivityStatus(activity); + dao.update(Sys_home_activity.class, + Chain.make("enable", !activity.isDisabled()), + Cnd.where("id", "=", activity.getId())); + return Result.success(); + } + + @At + @ApiOperation("查询单个活动") + @SaCheckPermission("fellowship") + public Result findOne(@Param("id") @NotNull String id) { + NutMap dataMap = fellowshipActivityManageService.findOne(id, null, ""); + String activityStartTime = dataMap.getString("activityStartTime"); + String activityEndTime = dataMap.getString("activityEndTime"); + if(StrUtil.isNotBlank(activityStartTime) && StrUtil.isNotBlank(activityEndTime)) { + dataMap.put("activityTime", List.of(activityStartTime, activityEndTime)); + } else { + dataMap.put("activityTime", new ArrayList<>()); + } + + String activitySignUpStartTime = dataMap.getString("activitySignUpStartTime"); + String activitySignUpEndTime = dataMap.getString("activitySignUpEndTime"); + if(StrUtil.isNotBlank(activitySignUpStartTime) && StrUtil.isNotBlank(activitySignUpEndTime)) { + dataMap.put("activitySignTime", List.of(activitySignUpStartTime, activitySignUpEndTime)); + } else { + dataMap.put("activitySignTime", new ArrayList<>()); + } + + List courseList = dataMap.getList("courseList", NutMap.class); + + //查询所有的课程类型 + List fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW()); + Map typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, FellowshipType::getTypeName)); + + courseList.forEach(v -> { + + List courseTimeList = v.getList("courseTimeList", NutMap.class); + //选择课程日期 下拉框 + List setUpCourseData = courseTimeList.stream().map(cd -> cd.getString("courseDate")).distinct().collect(Collectors.toList()); + v.put("setUpCourseData", setUpCourseData); + + courseTimeList.forEach(ct -> { + String courseStartTime = DateUtil.format(ct.getTime("courseStartTime"), "HH:mm"); + String courseEndTime = DateUtil.format(ct.getTime("courseEndTime"), "HH:mm"); + ct.put("courseStartTime", courseStartTime); + ct.put("courseEndTime", courseEndTime); + }); + + v.put("courseTypeName", typeMap.get(v.getString("courseType"))); + }); + + return Result.success().addData(dataMap); + } + + @At + @Ok("json:full") + @ApiOperation("交友联谊新增/修改") + @SaCheckPermission("fellowship.manage") + @SLog(tag = "交友联谊-活动管理", msg = "新增/修改活动") + public Result doHandle(FellowshipActivity activity) { + if (StrUtil.isBlank(activity.getId())) { + fellowshipActivityManageService.add(activity, null); + } else { + fellowshipActivityManageService.edit(activity); + } + return Result.success(); + } + + @At + @Ok("json:full") + @ApiOperation("获取分工会人数限制") + @SaCheckPermission("fellowship.manage") + 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 (select userId from activity_user_scope where groupId = '" + activityScopeId + "')"); + } + List list = fellowshipActivityManageService.listMap(sql); + return Result.success().addData(list); + } + + @At + @Ok("json:full") + @ApiOperation("获取报名人员数量") + @SaCheckPermission("fellowship.manage") + public Result getRegisterUserCount(@Param(value = "courseId") String courseId) { + return Result.success().addData(dao.count(FellowshipUser.class, Cnd.where("courseId", "=", courseId))); + } + + @At + @Ok("json:full") + @ApiOperation("获取历史活动列表") + @SaCheckPermission("fellowship.manage") + public Result getHistoricalActList() { + List query = dao.query(FellowshipActivity.class, Cnd.NEW().desc("activityStartTime")); + return Result.success().addData(query); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java new file mode 100644 index 0000000..22958cd --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java @@ -0,0 +1,163 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUserCourse; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +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.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import java.util.Date; +import java.util.List; + +/** + * @ClassName fellowshipMineController + * @Author JyuHsin + * @Date 2025/9/13 16:56 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "活动报名") +@At("/platform/fellowship/mine") +public class FellowshipMineController { + + @Inject + private Dao dao; + @Inject + private FellowshipActivityService activityService; + + @At("/") + @SaCheckPermission("fellowship.mine") + @Ok("beetl:/platform/zhgh/activity/fellowship/mine/index.html") + public void index() { + } + + @At("/h5") + @SaCheckPermission("h5.fellowship.mine") + @Ok("beetl:/platform/zhghh5/activity/fellowship/mine/index.html") + public void h5Index() { + } + + @At + @ApiOperation("主动扫码签到") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR) + @SLog(tag = "交友联谊-活动签到", msg = "主动扫码签到") + public Result drivingScan(String courseId) { + + // 主动扫码签到是用户自己打开扫一扫,扫二维码签到 + int count = dao.count(FellowshipUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId())); + if (count == 0) { + return Result.error(99, "未查询到您的报名记录"); + } + + // 获取现在的日期,并往后推1个小时 + String oneHourLater = DateUtil.offsetHour(new Date(), 1).toString("yyyy-MM-dd HH:mm:ss"); + FellowshipUserCourse userCourse = dao.fetch( + FellowshipUserCourse.class, + Cnd.where("courseId", "=", courseId) + .and("userId", "=", SecurityUtil.getUserId()) + .and("courseStartTime", "<=", oneHourLater) + .and("courseEndTime", ">=", oneHourLater) + ); + if (userCourse == null) { + return Result.error(99, "未到签到时间"); + } + + userCourse.setAttend(true); + userCourse.setAttendTime(DateUtil.date()); + dao.update(userCourse); + + return Result.success(); + } + + @At + @ApiOperation("被动扫码签到") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR) + @SLog(tag = "交友联谊-活动签到", msg = "被动扫码签到") + public Result passiveScan(String id) { + + // id表示课程的某个时间段,userId表示是谁出示的二维码 + FellowshipUserCourse userCourse = dao.fetch(FellowshipUserCourse.class, id); + if (userCourse == null) { + return Result.error("未查询到报名记录"); + } + int isAfter = DateUtil.compare(new Date(), userCourse.getCourseStartTime()); + if (isAfter > 0) { + return Result.error("抱歉,已经开始,无法签到"); + } + long diffMillis = Math.abs(DateUtil.between(new Date(), userCourse.getCourseStartTime(), DateUnit.MS)); + long oneHourInMs = 3600 * 1000; + if (diffMillis > oneHourInMs) { + return Result.error("签到时间为开始前1个小时"); + } + + userCourse.setAttend(true); + userCourse.setAttendTime(DateUtil.date()); + dao.update(userCourse); + + return Result.success(); + } + + @At + @ApiOperation("分活动查询") + @SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR) + public Result queryCourseSign(String courseId) { + Sql sql = Sqls.create(""" + SELECT + uc.*, + date(uc.courseStartTime) as courseDate + FROM + `fellowship_user_course` uc + WHERE + courseId = @courseId and userId = @userId + """); + sql.setParam("userId", SecurityUtil.getUserId()); + sql.setParam("courseId", courseId); + List listMap = activityService.listMap(sql); + return Result.success(listMap); + } + + @At + @ApiOperation("获取我报名的课程") + @SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR) + public Result queryMineCourse(String activityId) { + + Sql sql = Sqls.create(""" + SELECT + c.*, + u.mobileColumnsValue + FROM + fellowship_user u + LEFT JOIN fellowship_course c ON c.id = u.courseId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("u.activityId", "=", activityId); + cnd.and("u.userId", "=", SecurityUtil.getUserId()); + sql.setCondition(cnd); + List listMap = activityService.listMap(sql); + return Result.success(listMap); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java new file mode 100644 index 0000000..37550b2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java @@ -0,0 +1,167 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.manage; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.EnumUtil; +import com.budwk.app.base.annotation.SLog; +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.PageUtil; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.entity.annotation.ColType; +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; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.List; + +/** + * @Author JyuHsin + * @Date 2022/9/22 + * @Description + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "活动类型管理") +@At("/platform/fellowship/type") +public class FellowshipTypeController { + + @Inject + private Dao dao; + @Inject + private BaseService baseService; + + @At("") + @SaCheckPermission("fellowship.type") + @Ok("beetl:/platform/zhgh/activity/fellowship/type/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("fellowship.type") + public Result pageData(PageForm pageForm, + @Param(value = "typeName") String typeName) { + Cnd cnd = Cnd.NEW(); + Sql sql = Sqls.create(""" + select * from fellowship_type $condition + """); + if (Strings.isNotBlank(typeName)) { + cnd.and("typeName", "like", "%" + typeName + "%"); + } + if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){ + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } else { + cnd.asc("xh"); + } + sql.setCondition(cnd); + Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List list = pagination.getList(); + list.forEach(item -> { + Cnd c = Cnd.NEW(); + c.and("typeId", "=", item.getString("id")); + c.asc("columnIndex"); + List signColumns = dao.query(FellowshipMobileSignColumn.class, c); + item.put("mobileSignColumnList", signColumns); + + }); + return Result.success().addData(pagination); + } + + @At + @ApiOperation("活动类型新增") + @SaCheckPermission("fellowship.type") + @SLog(tag = "交友联谊-类型管理", msg = "活动类型新增") + public Result doAdd(@Param("data") String data) throws Exception { + FellowshipType type = Json.fromJson(FellowshipType.class, data); + int count = dao.count(FellowshipType.class, Cnd.where("code", "=", type.getCode())); + if (count > 0) { + return Result.error("编码重复!"); + } + int totalCount = dao.count(FellowshipType.class); + type.setXh(totalCount + 1); + dao.insertWith(type, "mobileSignColumnList"); + return Result.success(); + } + + @At + @ApiOperation("活动类型修改") + @SaCheckPermission("fellowship.type") + @SLog(tag = "交友联谊-类型管理", msg = "活动类型修改") + public Result doEdit(FellowshipType type) { + int count = dao.count(FellowshipType.class, Cnd.where("code", "=", type.getCode()).and("id", "!=", type.getId())); + if (count > 0) { + return Result.error("编码重复!"); + } + dao.update(type); + dao.clear(FellowshipMobileSignColumn.class, Cnd.where("typeId", "=", type.getId())); + dao.insertLinks(type, "mobileSignColumnList"); + return Result.success(); + } + + @At + @ApiOperation("活动类型删除") + @SaCheckPermission("fellowship.type") + @SLog(tag = "交友联谊-类型管理", msg = "活动类型删除") + public Object doDelete(@Param(value = "id") String id) { + dao.clear(FellowshipType.class, Cnd.where("id", "=", id)); + dao.clear(FellowshipMobileSignColumn.class, Cnd.where("typeId", "=", id)); + return Result.success(); + } + + @At + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("排序号变更") + @SaCheckPermission("fellowship.type") + public Object xhChange(String id, Integer xh, boolean toDown) { + if (toDown) { + FellowshipType next = dao.fetch(FellowshipType.class, Cnd.where("xh", "=", xh + 1)); + next.setXh(next.getXh() - 1); + dao.update(next); + dao.update(FellowshipType.class, Chain.make("xh", xh + 1), Cnd.where("id", "=", id)); + } else { + FellowshipType pre = dao.fetch(FellowshipType.class, Cnd.where("xh", "=", xh - 1)); + pre.setXh(pre.getXh() + 1); + dao.update(pre); + dao.update(FellowshipType.class, Chain.make("xh", xh - 1), Cnd.where("id", "=", id)); + } + return Result.success(); + } + + @At + @ApiOperation("获取所有类型") + @SaCheckLogin + public Result getAllType(@Param(value = "id") String id) { + List fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW().andEX("id", "=", id).asc("xh")); + dao.fetchLinks(fellowshipTypeList, "mobileSignColumnList", Cnd.NEW().asc("columnIndex")); + return Result.success().addData(fellowshipTypeList); + } + + @At + @ApiOperation("自定义表单字段类型") + @SaCheckPermission("fellowship.type") + public Result getColumnType() { + List names = EnumUtil.getNames(ColType.class); + names.add("JSON"); + return Result.success(names); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java new file mode 100644 index 0000000..ba17187 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java @@ -0,0 +1,350 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.manage; + +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +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.utils.PageUtil; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipBlackListService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author zxy + * @Description 人员管理 + * @createTime 2022年03月07日 14:27:00 + */ +@IocBean +@Ok("json:full") +@Api(tags = "交友联谊人员黑名单") +@At("/platform/fellowship/userManage") +public class FellowshipUserManageController { + + @Inject + private Dao dao; + @Inject + private FellowshipBlackListService fellowshipBlackListService; + + @At("") + @SaCheckPermission("fellowship.userManage") + @Ok("beetl:/platform/zhgh/activity/fellowship/userManage/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("fellowship.userManage") + public Result pageData(PageForm pageForm, + @Param(value = "activityId") String activityId, + @Param(value = "courseId") String courseId, + @Param(value = "year") Integer year, + @Param(value = "userKeyWord") String userKeyWord) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("tsuu.activityId", "=", activityId); + cnd.andEX("tsuu.courseId", "=", courseId); + cnd.andEX("act.year", "=", year); + if (StrUtil.isNotBlank(userKeyWord)) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + cnd.and(seg.andLike("u.username", userKeyWord).orLike("u.loginname", userKeyWord)); + } + if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){ + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + + Pagination pagination = fellowshipBlackListService.pageData(pageForm, cnd, activityId, courseId); + return Result.success(pagination); + } + + @At + @ApiOperation("报名人员处理") + @SaCheckPermission("fellowship.userManage") + @SLog(tag = "交友联谊-人员管理", msg = "报名人员处理") + public Result doHandleUser(@Param("userId") String userId) { + fellowshipBlackListService.doHandleUser(userId); + return Result.success(); + } + + @At + @ApiOperation("根据活动Id获取子活动") + @SaCheckPermission("fellowship.userManage") + public Result getCourseByActivityId(@Param("activityId") String activityId) { + List list = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + return Result.success(list); + } + + @At + @ApiOperation("获取子活动具体时间") + @SaCheckPermission("fellowship.userManage") + public Result attendClassRecord(String userId) { + fellowshipBlackListService.attendClassRecord(userId); + return Result.success(); + } + + @At + @ApiOperation("获取候补人员") + @SaCheckPermission("fellowship.userManage") + public Result getReserveUser(String courseId) { + Sql sql = Sqls.create(""" + SELECT + uc.* , + (select signUpTime from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime, + (select state from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state, + u.username, + u.loginname, + u.mobile, + u.unitName, + u.unionName + FROM + fellowship_user_course uc LEFT JOIN `vw_user` u on uc.userId = u.id + WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 2 order by signUpTime desc + """).setParam("courseId", courseId); + return Result.success(fellowshipBlackListService.listMap(sql)); + } + + @At + @ApiOperation("补充人员") + @SaCheckPermission("fellowship.userManage") + @SLog(tag = "交友联谊-人员管理", msg = "补充人员") + public Result reserveSingUp(String[] ids, String courseId) { + //先查询这个课程有多少个未签到的人员 + Sql sql = Sqls.create(""" + SELECT + uc.* , + (select signUpTime from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime, + (select state from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state + FROM + fellowship_user_course uc + WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 1 order by signUpTime desc + """).setParam("courseId", courseId); + List list = fellowshipBlackListService.listMap(sql); + if(ids.length > list.size()) { + return Result.error("您选择了" + ids.length + "位,未签到人员只有" + list.size() + "位"); + } + //ids的长度为几,就搞几个 + List mapList = list.subList(0, ids.length); + List idList = mapList.stream().map(o -> o.getString("userId")).collect(Collectors.toList()); + //将这几个没签到的设置为4 + dao.update(FellowshipUser.class, Chain.make("state", 4), Cnd.where("courseId", "=", courseId) + .and("userId", "in", idList)); + //将补充的设置为1 + dao.update(FellowshipUser.class, Chain.make("state", 1), Cnd.where("courseId", "=", courseId) + .and("userId", "in", ids)); + return Result.success(); + } + + @At + @Ok("void") + @ApiOperation("导出签到人员") + public void exportSignPerson(@Param(value = "activityId") String activityId, + HttpServletResponse response) { + FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId); + + Sql sql = Sqls.create(""" + SELECT + uc.*, + DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel, + DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel, + DATE_FORMAT(uc.attendTime, '%Y-%m-%d %H:%i:%s') as attendTimeExcel, + u.username, + u.loginname, + u.unitName, + u.unionName, + u.sex + FROM + fellowship_user_course uc + left join fellowship_course course on uc.courseId = course.id + left join `vw_user` u on u.id = uc.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("uc.activityId", "=", activityId); + cnd.and("course.isMobileSign", "=", true); + cnd.desc("isAttend").desc("attendTime"); + sql.setCondition(cnd); + + List userList = fellowshipBlackListService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List> sheetsList = new ArrayList<>(); + + List excelCommonExportEntity = new ArrayList<>(); + excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22)); + excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22)); + excelCommonExportEntity.add(new ExcelExportEntity("是否签到", "isAttend", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("签到时间", "attendTimeExcel", 22)); + + for (FellowshipCourse c : courseList) { + if(!c.isMobileSign()) { + continue; + } + String courseId = c.getId(); + String courseName = c.getCourseName(); + List v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList()); + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(courseName); + + List currentEntities = new ArrayList<>(excelCommonExportEntity); + for (NutMap userSignData : v) { + if(!userSignData.getBoolean("isAttend")) { + userSignData.put("isAttend", "未签到"); + userSignData.put("attendTimeExcel", "未签到"); + }else { + userSignData.put("isAttend", "已签到"); + } + } + + Map userExportMap = new HashMap<>(); + userExportMap.put("name", courseName); + userExportMap.put("title", userExportParams); + userExportMap.put("entity", currentEntities); + userExportMap.put("data", v); + + sheetsList.add(userExportMap); + } + try { + String fileName = activity.getActivityName() + "签到人员名单.xls"; + String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"); + response.setCharacterEncoding("utf-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", disposition); + + Workbook workbook = new HSSFWorkbook(); + for (Map map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List) map.get("entity"),(Collection) map.get("data")); + } + + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @At + @Ok("void") + @ApiOperation("导出领取人员") + public void exportGiftPerson(@Param(value = "activityId") String activityId, + HttpServletResponse response) { + FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId); + + Sql sql = Sqls.create(""" + SELECT + uc.*, + DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel, + DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel, + DATE_FORMAT(uc.receiveTime, '%Y-%m-%d %H:%i:%s') as receiveTimeExcel, + u.username, + u.loginname, + u.unitName, + u.unionName, + u.sex + FROM + fellowship_user_course uc + left join fellowship_course course on uc.courseId = course.id + left join `vw_user` u on u.id = uc.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("uc.activityId", "=", activityId); + cnd.and("course.isReceiveGift", "=", true).and("course.giftType" ,"=", 1); + cnd.desc("isReceive").desc("receiveTime"); + sql.setCondition(cnd); + + List userList = fellowshipBlackListService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List> sheetsList = new ArrayList<>(); + + List excelCommonExportEntity = new ArrayList<>(); + excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22)); + excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22)); + excelCommonExportEntity.add(new ExcelExportEntity("是否领取", "isReceive", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("领取时间", "receiveTimeExcel", 22)); + + for (FellowshipCourse c : courseList) { + String courseId = c.getId(); + String courseName = c.getCourseName(); + List v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList()); + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(courseName); + + List currentEntities = new ArrayList<>(excelCommonExportEntity); + for (NutMap userSignData : v) { + if(!userSignData.getBoolean("isReceive")) { + userSignData.put("isReceive", "未领取"); + userSignData.put("receiveTimeExcel", "未领取"); + }else { + userSignData.put("isReceive", "已领取"); + } + } + + Map userExportMap = new HashMap<>(); + userExportMap.put("name", courseName); + userExportMap.put("title", userExportParams); + userExportMap.put("entity", currentEntities); + userExportMap.put("data", v); + + sheetsList.add(userExportMap); + } + try { + String fileName = activity.getActivityName() + "礼品领取人员名单.xls"; + String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"); + response.setCharacterEncoding("utf-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", disposition); + + Workbook workbook = new HSSFWorkbook(); + for (Map map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List) map.get("entity"),(Collection) map.get("data")); + } + + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java new file mode 100644 index 0000000..3340de1 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java @@ -0,0 +1,254 @@ +package com.budwk.app.zhgh.activity.fellowship.controller.statistics; + +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.export.ExcelExportService; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +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.utils.CommonDownloadUtil; +import com.budwk.app.sys.models.Sys_file; +import com.budwk.app.sys.utils.SysFileMinIoUtil; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * @author zxy + * @Description 培训报名 统计 + * @createTime 2022年02月23日 09:57:00 + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "交友联谊统计") +@At("/platform/fellowship/statistics") +public class FellowshipActivityStatisticsController { + + @Inject + private FellowshipActivityService fellowshipActivityManageService; + @Inject + private FellowshipActivityStatisticsService fellowshipActivityStatisticsService; + @Inject + private Dao dao; + + @At("") + @SaCheckPermission("fellowship.statistics") + @Ok("beetl:/platform/zhgh/activity/fellowship/statistics/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("fellowship.statistics") + public Result pageData(PageForm pageForm, + @Param(value = "activityId") String activityId) { + Pagination pagination = fellowshipActivityStatisticsService.pageData(pageForm, activityId); + return Result.success(pagination); + } + + /** + * 活动list + * + * @param year 年度 + * @return + */ + @At + @ApiOperation("活动列表") + @SaCheckPermission("fellowship.statistics") + public Result activityList(@Param(value = "year") Integer year) { + List list = dao.query(FellowshipActivity.class, Cnd.NEW().andEX("year", "=", year).desc("activityStartTime")); + return Result.success(list); + } + + /** + * 培训班报名人员list + * + * @param courseId + * @return + */ + @At + @ApiOperation("报名人员列表") + @SaCheckPermission("fellowship.statistics") + public Result registerUserList(@Param(value = "courseId") String courseId) { + return Result.success(fellowshipActivityStatisticsService.registerUserList(courseId)); + } + + @At + @ApiOperation("报名动态列") + @SaCheckPermission("fellowship.statistics") + public Object getTaleColumnInfo(@Param(value = "courseId") String courseId) { + return Result.success(fellowshipActivityStatisticsService.getTaleColumnInfo(courseId)); + } + + /** + * 培训班上课签到信息 + * + * @param courseId + * @return + */ + @At + @ApiOperation("获取签到信息") + @SaCheckPermission("fellowship.statistics") + public Result getSignInfo(@Param("courseId") String courseId) { + return Result.success(fellowshipActivityStatisticsService.getSignInfo(courseId)); + } + + @At + @ApiOperation("开放报名") + @SaCheckPermission("fellowship.statistics") + public Result signChange(@Param("courseId") String courseId, @Param("openOtherUnion") Boolean openOtherUnion) { + dao.update(FellowshipCourse.class, Chain.make("openOtherUnion", openOtherUnion) + , Cnd.where("id", "=", courseId)); + return Result.success(); + } + + @At + @Ok("void") + @ApiOperation("导出签到名单") + @SaCheckPermission("fellowship.statistics") + public void exportSignUser(@Param(value = "activityId") String activityId, + HttpServletResponse response) throws IOException { + try { + FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId); + Sql sql = Sqls.create(""" + SELECT + ts.*, + CONCAT(DATE_FORMAT(ac.courseStartTime, '%H:%i:%s'),'至',DATE_FORMAT(ac.courseEndTime, '%H:%i:%s')) AS courseTime, + u.username, + u.loginname, + u.sex, + ifnull(ts.mobile, u.mobile) as mobile, + u.birthday, + tsc.courseName + FROM + fellowship_user ts + left join fellowship_activity_course ac on ts.activityCourseId = ac.id + left join `vw_user` u on u.id = ts. userId + left join fellowship_course tsc on tsc.id = ts.courseId + WHERE + ts.activityId = @activityId + """).setParam("activityId", activityId); + List userList = fellowshipActivityManageService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW()); + dao.fetchLinks(fellowshipTypeList, "mobileSignColumnList", Cnd.NEW().asc("columnIndex")); + Map typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, o -> o)); + + List> sheetsList = new ArrayList<>(); + + List excelCommonExportEntity = new ArrayList<>(); + excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("手机号", "mobile", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("生日", "birthday", 20)); + excelCommonExportEntity.add(new ExcelExportEntity("报名时段", "courseTime", 20)); + + for (FellowshipCourse c : courseList) { + String k = c.getCourseName(); + List v = userList.stream().filter(x -> x.getString("courseName").equals(k)).collect(Collectors.toList()); + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(k); + userExportParams.setType(ExcelType.HSSF); + + List currentEntities = new ArrayList<>(); + currentEntities.addAll(excelCommonExportEntity); + + FellowshipType signUpType = typeMap.get(c.getCourseType()); + if (Lang.isNotEmpty(signUpType.getMobileSignColumnList())) { + for (FellowshipMobileSignColumn column : signUpType.getMobileSignColumnList()) { + ExcelExportEntity entity = new ExcelExportEntity(); + entity.setName(column.getColumnName()); + entity.setKey(column.getColumnCode()); + entity.setWidth(20); + if (column.getColumnFormType().equals("FILE")) { + entity.setType(2); + entity.setExportImageType(2); + } + currentEntities.add(entity); + } + } + for (NutMap userSignData : v) { + String mobileColumnsValueStr = userSignData.getString("mobileColumnsValue"); + if (StrUtil.isNotBlank(mobileColumnsValueStr)) { + List mobileColumnsValue = Json.fromJsonAsList(NutMap.class, mobileColumnsValueStr); + for (NutMap cv : mobileColumnsValue) { + if (!"FILE".equals(cv.getString("columnFormType"))) { + userSignData.put(cv.getString("columnCode"), cv.getString("columnValue")); + } else { + if (StrUtil.isNotBlank(cv.getString("columnValue"))) { + List columnValue = Json.fromJsonAsList(JSONObject.class, cv.getString("columnValue")); + if (columnValue.size() == 1) { + JSONObject sysFile = columnValue.get(0); + Sys_file file = dao.fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", sysFile.get("url"))); + byte[] imageBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath()); + if (imageBytes.length > 0) { + userSignData.put(cv.getString("columnCode"), imageBytes); + } + } + } + } + } + + } + } + + Map userExportMap = new HashMap<>(); + userExportMap.put("name", k); + userExportMap.put("title", userExportParams); + userExportMap.put("entity", currentEntities); + userExportMap.put("data", v); + + sheetsList.add(userExportMap); + } + + Workbook workbook = new HSSFWorkbook(); + for (Map map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook, (ExportParams) map.get("title"), (List) map.get("entity"), (Collection) map.get("data")); + } + workbook.write(response.getOutputStream()); + workbook.close(); + + CommonDownloadUtil.download(activity.getActivityName() + "报名人员名单" + ".xlsx", workbook, response); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java new file mode 100644 index 0000000..e007311 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java @@ -0,0 +1,144 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import com.budwk.app.base.model.BaseModel; +import com.budwk.app.sys.models.Sys_home_activity; +import com.budwk.app.sys.services.SysHomeConvert; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; +import org.nutz.lang.Lang; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@Accessors(chain = true) +@Comment("交友联谊") +@Table +@EqualsAndHashCode(callSuper = false) +public class FellowshipActivity extends BaseModel implements Serializable, SysHomeConvert { + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("活动名称") + private String activityName; + + @Column + @ColDefine(type = ColType.INT) + @Comment("年度") + private Integer year; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("活动报名开始时间") + private Date activitySignUpStartTime; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("活动报名开始时间") + private Date activitySignUpEndTime; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("活动开始时间") + private Date activityStartTime; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("活动结束时间") + private Date activityEndTime; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否禁用") + private boolean isDisabled; + + @Column + @ColDefine(customType = "longtext") + @Comment("活动介绍") + private String introduce; + + @Column + @ColDefine(type = ColType.INT, width = 10) + @Comment("活动限制标识") + private Integer restrictLimit; + + @Column + @ColDefine(type = ColType.INT, width = 10) + @Comment("活动限制报名个数") + private Integer limitNum; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + @Comment("活动封面") + private String cover; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + @Comment("微信群二维码") + private String wechat; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("上课前是否通知") + private boolean notice; + + @Column + @Comment("活动范围Id") + @ColDefine(type = ColType.INT, width = 32) + private Integer activityGroupId; + + @Column + @Comment("活动范围名称") + @ColDefine(type = ColType.VARCHAR, width = 40) + private String activityGroupName; + + /** + * 所有的培训班 + */ + @Many(field = "activityId") + private List courseList; + + @Many(field = "activityId") + private List typeLimits; + + @Column + @Comment("活动类型") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String trainType; + + @Column + @Comment("主办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List hostUnitIds; + + @Column + @Comment("承办单位") + @ColDefine(type = ColType.MYSQL_JSON) + private List undertakeUnitIds; + + @Override + public Sys_home_activity covertToSysHomeActivity() { + Sys_home_activity sysHomeActivity = new Sys_home_activity(); + sysHomeActivity.setId(this.getId()); + sysHomeActivity.setName(this.getActivityName()); + sysHomeActivity.setCover(this.getCover()); + sysHomeActivity.setUrl("/platform/fellowship/apply?id=" + this.getId()); + sysHomeActivity.setH5Url("/platform/fellowship/apply/h5?id=" + this.getId()); + if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) { + sysHomeActivity.setStartDate(this.getActivitySignUpStartTime()); + sysHomeActivity.setEndDate(this.getActivitySignUpEndTime()); + } + sysHomeActivity.setAllowUserGroupId(this.getActivityGroupId()); + sysHomeActivity.setEnable(!this.isDisabled()); + sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeActivity; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java new file mode 100644 index 0000000..3ff3d5a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java @@ -0,0 +1,54 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; + +@Data +@Accessors(chain = true) +@Comment("交友联谊下的子活动") +@Table +@EqualsAndHashCode(callSuper = false) +public class FellowshipActivityCourse { + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("活动ID") + private String activityId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("课程ID") + private String courseId; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("课程开始时间") + private Date courseStartTime; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("课程结束时间") + private Date courseEndTime; + + @Column + @ColDefine(type = ColType.DATE) + @Comment("课程时间") + private Date courseDate; + + @Column + @ColDefine(type = ColType.INT, width = 4) + @Comment("限制人数") + private Integer courseLimitNum; + + private Integer hasRegisterNum; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java new file mode 100644 index 0000000..1152abe --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java @@ -0,0 +1,31 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +@Data +@Accessors(chain = true) +@Comment("交友联谊黑名单") +@Table +@EqualsAndHashCode(callSuper = false) +public class FellowshipBlackList { + + @Name + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("用户id") + private String userId; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否禁用") + private Boolean isDisabled; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java new file mode 100644 index 0000000..bdb95a0 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java @@ -0,0 +1,169 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import com.budwk.app.base.model.BaseModel; +import com.budwk.app.base.param.ConditionGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; +import org.nutz.lang.util.NutMap; + +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +@Comment("交友联谊的子活动") +@Table +@EqualsAndHashCode(callSuper = false) +public class FellowshipCourse extends BaseModel implements Serializable { + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("活动ID") + private String activityId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("课程名称") + private String courseName; + + @Column + @ColDefine(type = ColType.INT) + @Comment("课程人数") + private int coursePeopleNumber; + + @Column + @ColDefine(type = ColType.INT) + @Default(value = "0") + @Comment("预留名额") + private int courseReservedNumber; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("课程地点") + private String courseLocation; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("课程类型") + private String courseType; + + @Column + @ColDefine(type = ColType.MYSQL_JSON) + @Comment("课程地点坐标") + private List courseLocationCoordinates; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("课程讲师") + private String courseInstructor; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("校区") + private String campus; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("报名人数是否限制") + private Boolean courseIsLimitApply; + + @Column + @ColDefine(type = ColType.INT) + @Comment("序号") + private int orderNum; + + @Column + @ColDefine(customType = "longtext") + @Comment("详细信息") + private String introduce; + + @Many(field = "courseId") + private List courseTimeList; + + //已报人数 + private Integer hasRegisterNum; + + private Boolean isBringFamily; + + private Boolean isAddFamily; + + //是否报过该课程 + private Boolean isSign; + + //还能报该类型的课程吗 + private Boolean canSignThisCourseType; + + @Column + @Comment("分工会人数限制") + @ColDefine(type = ColType.MYSQL_JSON) + private List unionLimit; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("移动端是否签到") + private boolean isMobileSign; + + @Column + @ColDefine(type = ColType.INT) + @Comment("签到方式 1.扫描二维码签到 2.被扫 3.gps签到") + private Integer signType; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("移动端是否签收礼品") + private boolean isReceiveGift; + + @Column + @ColDefine(type = ColType.INT) + @Comment("领取礼品方式 1.扫描二维码 2.线下") + private Integer giftType; + + @Column + @ColDefine(type = ColType.INT) + @Comment("预留名额方式 1.报名人员减少模式 2.报名人数不变模式") + private Integer reserveMode; + + @Column + @Comment("承办工会") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String hostUnionId; + + @Column + @Comment("对内报名时间") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String interTime; + + @Column + @Comment("是否开放给其他工会") + @ColDefine(type = ColType.BOOLEAN, width = 4) + private Boolean openOtherUnion; + + @Column + @Comment("分类标识") + @ColDefine(type = ColType.VARCHAR, width = 30) + private String assort; + + @Column + @ColDefine(type = ColType.INT) + @Default(value = "0") + @Comment("候补名额数") + private Integer waitingNum; + + //候补已报人数 + private Integer hasWaitingNum; + + private String courseTimeName; + + @Column + @Comment("条件") + @ColDefine(type = ColType.MYSQL_JSON) + private ConditionGroup matchCnd; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java new file mode 100644 index 0000000..ea50fd3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java @@ -0,0 +1,84 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.List; + +@Data +@Accessors(chain = true) +@Comment("交友联谊移动端动态表单") +@Table("fellowship_mobile_sign_column") +@EqualsAndHashCode(callSuper = false) +public class FellowshipMobileSignColumn { + + private static final long serialVersionUID = 1L; + + @Name + @Comment("id") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + /** + * train_sign_up_type id + */ + @Column + @Comment("类型id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String typeId; + + @Column + @Comment("字段名称") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String columnName; + + @Column + @Comment("字段编码") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String columnCode; + + @Column + @Comment("字段值") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String columnValue; + + @Column + @Comment("字段类型") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String columnType; + + @Column + @Comment("下拉框的值") + @ColDefine(type = ColType.MYSQL_JSON) + private List selectValues; + + @Column + @Comment("是否必填") + @ColDefine(type = ColType.BOOLEAN) + private Boolean isRequired; + + @Column + @Comment("控件类型") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String columnFormType; + + @Column + @Comment("文件个数") + @ColDefine(type = ColType.INT) + private Integer fileNumber; + + @Column + @Comment("文件类型") + @ColDefine(type = ColType.MYSQL_JSON) + private List fileType; + + @Column + @Comment("序号") + @ColDefine(type = ColType.INT, width = 1) + private Integer columnIndex; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java new file mode 100644 index 0000000..e8bc8f0 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java @@ -0,0 +1,65 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +@Comment("交友联谊的子活动类型") +@Table("fellowship_type") +@EqualsAndHashCode(callSuper = false) +public class FellowshipType extends BaseModel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Name + @Comment("id") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("类型编码") + @ColDefine(type = ColType.VARCHAR, width = 80) + private String code; + + @Column + @Comment("类型名称") + @ColDefine(type = ColType.VARCHAR, width = 80) + private String typeName; + + @Column + @Comment("序号") + @ColDefine(type = ColType.INT, width = 1) + private Integer xh; + + @Column + @Comment("是否携带家属") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean isBringFamily; + + @Column + @Comment("家属纳入总人数") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean isAddFamily; + + @Column + @Comment("本人纳入总人数") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean selfAddFamily; + + @Many(field = "typeId") + private List mobileSignColumnList; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java new file mode 100644 index 0000000..266744c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java @@ -0,0 +1,40 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +@Comment("交友联谊类型限制条件") +@Table("fellowship_type_limit") +@EqualsAndHashCode(callSuper = false) +public class FellowshipTypeLimit implements Serializable { + + private static final long serialVersionUID = 1L; + + @Name + @Comment("id") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("活动id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String activityId; + + @Column + @Comment("活动类型id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String typeId; + + @Column + @Comment("限制个数") + @ColDefine(type = ColType.INT, width = 10) + private int limitNum; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java new file mode 100644 index 0000000..c15237f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java @@ -0,0 +1,86 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; +import org.nutz.lang.util.NutMap; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@Accessors(chain = true) +@Comment("交友联谊报名人员") +@Table +@EqualsAndHashCode(callSuper = false) +@TableIndexes({@Index(name = "INDEX_FELLOWSHIP_USER_COURSEID", fields = {"courseId"}, unique = false)}) +public class FellowshipUser implements Serializable { + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("活动ID") + private String activityId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("课程ID") + private String courseId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("用户ID") + private String userId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("工会ID") + private String unionId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("单位ID") + private String unitId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + @Comment("工会") + private String unionName; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + @Comment("单位") + private String unitName; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("联系方式") + private String mobile; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("报名时间") + private Date signUpTime; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("活动课程时段id") + private String activityCourseId; + + @Column + @ColDefine(type = ColType.MYSQL_JSON) + @Comment("手机端报名字段和值") + private List mobileColumnsValue; + + @Column + @ColDefine(type = ColType.INT) + @Comment("用户报名状态(1.正常 2.待报名成功 3.也是正常,但是是从2变为1的 4.废弃[就是没签到的意思])") + private Integer state; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java new file mode 100644 index 0000000..701dfc8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java @@ -0,0 +1,87 @@ +package com.budwk.app.zhgh.activity.fellowship.models; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@Comment("交友联谊报名人员子活动表") +@Table +@EqualsAndHashCode(callSuper = false) +@TableIndexes({ + @Index(name = "INDEX_FELLOWSHIP_USER_COURSE_USERID", fields = {"userId"}, unique = false), + @Index(name = "INDEX_FELLOWSHIP_USER_COURSE_COURSEID", fields = {"courseId"}, unique = false) +}) +public class FellowshipUserCourse implements Serializable { + + @Name + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("活动ID") + private String activityId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("课程ID") + private String courseId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("用户ID") + private String userId; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("课程开始时间") + private Date courseStartTime; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("课程结束时间") + private Date courseEndTime; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否上课") + private boolean isAttend; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("上课打卡时间") + private Date attendTime; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否领取礼品") + private Boolean isReceive; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("领取礼品时间") + private Date receiveTime; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("签到扫码人员id(二维码模式)") + private String signScannerCodeUserId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("礼品扫码人员id(二维码模式)") + private String giftScannerCodeUserId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 32) + @Comment("关联train_sign_up_activity_course表的id") + private String activityCourseId; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java new file mode 100644 index 0000000..9140513 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java @@ -0,0 +1,127 @@ +package com.budwk.app.zhgh.activity.fellowship.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser; +import org.nutz.dao.Cnd; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +/** + * @author zxy + * @Description TODO + * @createTime 2022年02月23日 17:14:00 + */ +public interface FellowshipActivityService extends BaseService { + + /** + * 添加活动 + * + * @param activity 活动信息 + * @param course 培训班信息 + */ + void add(FellowshipActivity activity, FellowshipCourse course); + + /** + * 编辑活动 + * + * @param activity 活动信息 + */ + void edit(FellowshipActivity activity); + + /** + * 更新活动状态 + * + * @param activity 活动信息 + */ + void updateActivityStatus(FellowshipActivity activity); + + /** + * 查询单条活动信息 + * + * @param id 活动ID + * @return 返回的数据与前端符合 + */ + NutMap findOne(String id, Cnd cnd, String fromMode); + + /** + * pc分页查询 + * + * @param pageForm + * @param cnd + * @return + */ + Pagination pageData(PageForm pageForm, Cnd cnd); + + + /** + * 手机端分页查询 + * + * @param pageForm 分页 + * @param year 年度 + * @param activityStatus 报名状态 0全部 1进行中 2结束 + * @return + */ + Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType); + + /** + * 手机端报名 + */ + void doSignUp(FellowshipUser fellowshipUser) throws Exception; + + /** + * 异步插入每个报名成功人员的课程数据 + * + * @param activityId + * @param courseId + * @param userId + */ + void asyncInsertUserCourse(String activityId, String courseId, String userId); + + /** + * 该培训班每个分工会名额是否报满 + * @return + */ + boolean isSignFullByUnionId(FellowshipCourse course, Integer currentFamilyNumber); + + /** + * 该培训班是否报满 + */ + boolean isSignFull(FellowshipCourse course, Integer currentFamilyNumber); + + /** + * 还能报该类型的培训班吗 比如书画班最多报一项 健身班两项 + * @return + */ + boolean isSignCourse(FellowshipCourse course, FellowshipActivity activity); + + /** + * 当前用户是否已报过该培训班 + * + * @param courseId + * @param userId + * @return + */ + boolean isSignCourseByUser(String courseId, String userId); + + /** + * 手机端签到 + * + * @param id 每个培训班每节课每个用户的记录ID + */ + void doQd(String id); + + /** + * 某个用户的签到信息 + * + * @param userId 用户id + * @param activityId 活动id + */ + List qdInfoByUserId(String userId, String activityId); + + List filterCourseByHostUnion(List courseList); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java new file mode 100644 index 0000000..7bf3583 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java @@ -0,0 +1,68 @@ +package com.budwk.app.zhgh.activity.fellowship.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser; +import org.nutz.lang.util.NutMap; + +import java.util.List; +import java.util.Map; + +/** + * @author zxy + * @Description 报名统计service + * @createTime 2022年03月03日 10:00:00 + */ +public interface FellowshipActivityStatisticsService extends BaseService { + + /** + * 统计分页 + * + * @param pageForm + * @param activityId + * @return + */ + Pagination pageData(PageForm pageForm, String activityId); + + /** + * 该课程下的报名人员信息 + * + * @param courseId + * @return + */ + List registerUserList(String courseId); + + List getTaleColumnInfo(String courseId); + + /** + * 该课程下的报名人员信息 + * + * @param courseId + * @return + */ + List registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword); + + /** + * 获取每个课程的签到情况 + * + * @param courseId + * @return k->每个培训班每节课的上课时间 v->上课记录list + */ + Map> getSignInfo(String courseId); + + /** + * 报名人员list 导出 + * @param activityId + * @return + */ + List baoMingUserList(String activityId); + + int queryCourseCount(String courseId, String courseType); + + int queryCourseWaitCount(String courseId, String courseType); + + int queryCourseCount(String courseId, String courseType, String unionId); + + int queryCourseWaitCount(String courseId, String courseType, String unionId); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java new file mode 100644 index 0000000..da32388 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java @@ -0,0 +1,43 @@ +package com.budwk.app.zhgh.activity.fellowship.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipBlackList; +import org.nutz.dao.Cnd; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +/** + * @author zxy + * @Description TODO + * @createTime 2022年03月07日 14:29:00 + */ +public interface FellowshipBlackListService extends BaseService { + + /** + * 分页 + * + * @param pageForm 分页 + * @return Pagination + */ + Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId); + + /** + * 拉黑、解封用户 + * + * @param userId + */ + void doHandleUser(String userId); + + /** + * 上课记录 + * + * @param userId + * @return + */ + List attendClassRecord(String userId); + + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java new file mode 100644 index 0000000..f78208f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java @@ -0,0 +1,473 @@ +package com.budwk.app.zhgh.activity.fellowship.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +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.sys.views.View_user; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.activity.fellowship.models.*; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.async.Async; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.Static; +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 java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zxy + * @Description TODO + * @createTime 2022年02月23日 17:14:00 + */ +@Slf4j +@IocBean(args = {"refer:dao"}) +public class FellowshipActivityServiceImpl extends BaseServiceImpl implements FellowshipActivityService { + + @Inject + private FellowshipActivityStatisticsService statisticsService; + + public FellowshipActivityServiceImpl(Dao dao) { + super(dao); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void add(FellowshipActivity activity, FellowshipCourse course) { + + dao().insert(activity); + + //插入类型限制 + List typeLimits = activity.getTypeLimits(); + typeLimits.forEach(v -> v.setActivityId(activity.getId())); + dao().insert(typeLimits); + + List courseList = activity.getCourseList(); + for (FellowshipCourse v : courseList) { + v.setActivityId(activity.getId()); + v.setOpenOtherUnion(false); + dao().insert(v); + this.setCourseTimeAndInsert(v); + } + + if (!activity.isDisabled()) { + Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity(); + dao().insertOrUpdate(sysHomeActivity); + } + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void edit(FellowshipActivity activity) { + + //修改活动 + update(activity); + + //修改类型限制 + List typeLimits = activity.getTypeLimits(); + typeLimits.forEach(v -> v.setActivityId(activity.getId())); + if(Lang.isNotEmpty(typeLimits)) { + insertOrUpdate(typeLimits); + } + + List courseList = activity.getCourseList(); + courseList.forEach(v -> { + v.setActivityId(activity.getId()); + dao().insertOrUpdate(v); + if (Lang.isNotEmpty(v.getCourseTimeList())) { + this.setCourseTimeAndInsert(v); + } + }); + + //查询原来的活动 + List oldCourseList = dao().query(FellowshipCourse.class, Cnd.where("activityId", "=", activity.getId())); + //原来的培训班id + List oldCourseIdList = oldCourseList.stream().map(FellowshipCourse::getId).toList(); + + //原来的上课时间 + List oldActCourseTimeList = dao().query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activity.getId())); + + //现在的上课时间 + List nowCourseTimeListId = new ArrayList<>(); + activity.getCourseList().forEach(v -> { + if (v.getCourseTimeList() != null) { + nowCourseTimeListId.addAll(v.getCourseTimeList().stream().map(FellowshipActivityCourse::getId).toList()); + } + }); + + List deleteCourseTimeListId = oldActCourseTimeList.stream().map(FellowshipActivityCourse::getId).filter(id -> !nowCourseTimeListId.contains(id)).collect(Collectors.toList()); + List courseIdList = courseList.stream().map(FellowshipCourse::getId).collect(Collectors.toList()); + + //删除关联的培训班 + List deleteIdList = oldCourseIdList.stream().filter(v -> !courseIdList.contains(v)).collect(Collectors.toList()); + dao().clear(FellowshipCourse.class, Cnd.where("id", "in", deleteIdList)); + + dao().clear(FellowshipActivityCourse.class, Cnd.where("id", "in", deleteCourseTimeListId)); + dao().clear(FellowshipUser.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId())); + dao().clear(FellowshipUserCourse.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId())); + + //查询修改过培训时间的记录 + Sql tsuucSql = Sqls.create(""" + SELECT + tsuuc.id, + tsuac.courseStartTime, + tsuac.courseEndTime + FROM + `fellowship_user_course` tsuuc + LEFT JOIN fellowship_activity_course tsuac ON tsuac.id = tsuuc.activityCourseId + where tsuuc.courseStartTime != tsuac.courseStartTime or tsuuc.courseEndTime != tsuac.courseEndTime + """); + List tsuucList = listMap(tsuucSql); + tsuucList.forEach(v -> { + Chain chain = Chain.make("courseStartTime", v.getTime("courseStartTime")); + chain.add("courseEndTime", v.getTime("courseEndTime")); + Cnd cnd = Cnd.where("id", "=", v.getString("id")); + dao().update("fellowship_user_course", chain, cnd); + }); + + if (!activity.isDisabled()) { + Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity(); + dao().insertOrUpdate(sysHomeActivity); + } else { + dao().delete(Sys_home_activity.class, activity.getId()); + } + } + + private void setCourseTimeAndInsert(FellowshipCourse course) { + course.getCourseTimeList().forEach(courseTime -> { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(courseTime.getCourseDate()); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DATE); + + Calendar startCalendar = Calendar.getInstance(); + startCalendar.setTime(courseTime.getCourseStartTime()); + startCalendar.set(year, month, day); + courseTime.setCourseStartTime(startCalendar.getTime()); + + Calendar endCalendar = Calendar.getInstance(); + endCalendar.setTime(courseTime.getCourseEndTime()); + endCalendar.set(year, month, day); + courseTime.setCourseEndTime(endCalendar.getTime()); + + courseTime.setActivityId(course.getActivityId()); + courseTime.setCourseId(course.getId()); + dao().insertOrUpdate(courseTime); + }); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void updateActivityStatus(FellowshipActivity activity) { + updateIgnoreNull(activity); + } + + @Override + public NutMap findOne(String id, Cnd cnd, String fromMode) { + if (Lang.isEmpty(cnd)) { + cnd = Cnd.NEW(); + } + + cnd.asc("orderNum").asc("campus").desc("courseLocation").asc("courseType").asc("courseName"); + List courseArray = dao().query(FellowshipCourse.class, cnd.and("activityId", "=", id)); + + if (StrUtil.isNotBlank(fromMode) && "mobile".equals(fromMode)) { + courseArray = this.filterCourseByHostUnion(courseArray); + } + + FellowshipActivity activity = fetchLinks(dao().fetch(FellowshipActivity.class, id), "^(conditionStructure|typeLimits)$"); + activity.setCourseList(courseArray); + + List courseList = activity.getCourseList(); + + courseList.forEach(c -> { + if (StrUtil.isNotBlank(c.getCourseType())) { + dao().fetchLinks(c, "^(courseTimeList)$", Cnd.NEW().asc("courseStartTime")); + int courseCount = statisticsService.queryCourseCount(c.getId(), c.getCourseType()); + c.setHasRegisterNum(courseCount); + int courseWaitCount = statisticsService.queryCourseWaitCount(c.getId(), c.getCourseType()); + c.setHasWaitingNum(courseWaitCount); + //当前用户是否报过 + c.setIsSign(isSignCourseByUser(c.getId(), SecurityUtil.getUserId())); + } + }); + return Lang.obj2nutmap(activity); + } + + @Override + public Pagination pageData(PageForm pageForm, Cnd cnd) { + Pagination pagination = listPageLinks(pageForm.getPageNumber(), pageForm.getPageSize(), cnd, "^(courseList)$"); + return pagination; + } + + @Override + public Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("year", "=", year); + switch (activityStatus) { + case 2 -> { + cnd.and(new Static("activitySignUpStartTime < now()")); + cnd.and(new Static("activitySignUpEndTime > now()")); + } + case 3 -> { + cnd.and(new Static("activityStartTime < now()")); + cnd.and(new Static("activityEndTime > now()")); + } + case 4 -> cnd.and(new Static("activityEndTime < now()")); + case 5 -> cnd.and(new Static("activityStartTime < now()")); + case 6 -> cnd.and(new Static("activityStartTime > now()")); + } + if (activityType != null && activityType == 1) { + cnd.and(new Static("id in (select activityId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId()))); + } + cnd.and("isDisabled", "=", 0); + cnd.orderBy("activityEndTime", "desc"); + cnd.orderBy("isDisabled", "desc"); + cnd.orderBy("createdAt", "desc"); + return listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void doSignUp(FellowshipUser fellowshipUser) throws Exception { + String userId = SecurityUtil.getUserId(); + + //查询课程 + FellowshipCourse course = dao().fetch(FellowshipCourse.class, fellowshipUser.getCourseId()); + FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType()); + //如果这个课程的预留名额方式为报名人数不变 + if (course.getReserveMode() == 2) { + //如果当前报名+已报小于这个课程限制人数 + //课程已报人数 + int normalCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType()); + //+1是算自己 + int hasRegisterNum = type.getSelfAddFamily() ? normalCount + 1 : 0; + fellowshipUser.setState((hasRegisterNum + course.getCourseReservedNumber()) > course.getCoursePeopleNumber() ? 2 : 1); + } else { + fellowshipUser.setState(1); + } + + View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId())); + fellowshipUser.setUnionId(SecurityUtil.getUnionId()); + fellowshipUser.setUnionName(user.getUnionName()); + fellowshipUser.setUnitId(SecurityUtil.getUnitId()); + fellowshipUser.setUnitName(user.getUnitName()); + fellowshipUser.setUserId(userId); + fellowshipUser.setSignUpTime(new Date()); + + dao().insert(fellowshipUser); + + if (StrUtil.isNotBlank(fellowshipUser.getActivityCourseId())) { + FellowshipActivityCourse fetch = dao().fetch(FellowshipActivityCourse.class, fellowshipUser.getActivityCourseId()); + FellowshipUserCourse userCourse = new FellowshipUserCourse(); + userCourse.setActivityId(fellowshipUser.getActivityId()); + userCourse.setCourseId(fellowshipUser.getCourseId()); + userCourse.setUserId(fellowshipUser.getUserId()); + userCourse.setCourseStartTime(fetch.getCourseStartTime()); + userCourse.setCourseEndTime(fetch.getCourseEndTime()); + userCourse.setAttend(false); + userCourse.setAttendTime(null); + userCourse.setActivityCourseId(fetch.getId()); + dao().insert(userCourse); + } else { + asyncInsertUserCourse(fellowshipUser.getActivityId(), fellowshipUser.getCourseId(), fellowshipUser.getUserId()); + } + } + + @Async + @Override + public void asyncInsertUserCourse(String activityId, String courseId, String userId) { + log.info("异步插入{}的上课信息,课程ID为{},活动ID为{}", userId, courseId, activityId); + List courseList = dao().query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId)); + List list = new ArrayList<>(); + courseList.forEach(v -> { + FellowshipUserCourse userCourse = new FellowshipUserCourse(); + userCourse.setActivityId(activityId); + userCourse.setCourseId(courseId); + userCourse.setUserId(userId); + userCourse.setCourseStartTime(v.getCourseStartTime()); + userCourse.setCourseEndTime(v.getCourseEndTime()); + userCourse.setAttend(false); + userCourse.setAttendTime(null); + userCourse.setActivityCourseId(v.getId()); + list.add(userCourse); + }); + dao().insert(list); + } + + /** + * 该培训班每个分工会名额是否报满 + * @return + */ + @Override + public boolean isSignFullByUnionId(FellowshipCourse course, Integer currentFamilyNumber) { + List unionLimit = course.getUnionLimit(); + if (Lang.isEmpty(unionLimit)) { + return false; + } + String unionId = SecurityUtil.getUnionId(); + NutMap unionLimitMap = unionLimit.stream().filter(v -> v.getString("id").equals(unionId)).findAny().orElse(null); + if (Lang.isEmpty(unionLimitMap)) { + return true; + } + + FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType()); + //分工会限制人数 + int limitCount = unionLimitMap.getInt("limitCount"); + + //该课程已经报名的总人数 + int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType(), unionId); + int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType()); + + //+1是算自己 + int current = type.getSelfAddFamily() ? 1 : 0; + currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0; + //如果还有正常名额 + if(limitCount - hasSignCount > 0) { + return (hasSignCount + current + currentFamilyNumber) > limitCount; + } else { + return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum(); + } + } + + @Override + public boolean isSignFull(FellowshipCourse course, Integer currentFamilyNumber) { + //课程限制人数 + int coursePeopleNumber = course.getCoursePeopleNumber(); + if (coursePeopleNumber == 0) { + return true; + } + //查询课程对应的类型 + FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType()); + //课程已报人数 + int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType()); + int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType()); + + //+1是算自己 + int current = type.getSelfAddFamily() ? 1 : 0; + currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0; + //如果还有正常名额 + if(coursePeopleNumber - hasSignCount > 0) { + return (hasSignCount + current + currentFamilyNumber + course.getCourseReservedNumber()) > coursePeopleNumber; + } else { + return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum(); + } + } + + @Override + public boolean isSignCourse(FellowshipCourse course, FellowshipActivity activity) { + //培训班类型 + String courseType = course.getCourseType(); + + Sql sql = Sqls.create(""" + SELECT + count( tsus.id ) + FROM + `fellowship_user` tsus + LEFT JOIN fellowship_course tsuc ON tsuc.id = tsus.courseId + WHERE + tsuc.courseType = @courseType + AND tsus.userId = @userId + AND tsus.activityId = @activityId + """); + sql.setParam("courseType", courseType); + sql.setParam("activityId", activity.getId()); + sql.setParam("userId", SecurityUtil.getUserId()); + int hasRegisterNum = count(sql); + + //第一种无限制报名 + if (activity.getRestrictLimit() == null || activity.getRestrictLimit() == 1) { + return true; + } else if (activity.getRestrictLimit() == 2) { + FellowshipTypeLimit signUpTypeLimit = dao().fetch(FellowshipTypeLimit.class, Cnd.where("typeId", "=", courseType).and("activityId", "=", activity.getId())); + if (signUpTypeLimit == null) { + return true; + } + //此类型的班最多可报几项 + int personMaxRegisterNum = signUpTypeLimit.getLimitNum(); + if (personMaxRegisterNum == 0) { + return true; + } + return hasRegisterNum < personMaxRegisterNum; + } else if (activity.getRestrictLimit() == 3) { + //第三种,限制报几个,不跟类型挂钩 + int aCount = dao().count(FellowshipUser.class, Cnd.where("activityId", "=", activity.getId()).and("userId", "=", SecurityUtil.getUserId())); + return aCount < activity.getLimitNum(); + } + return false; + } + + @Override + public boolean isSignCourseByUser(String courseId, String userId) { + return dao().count(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("userId", "=", userId)) > 0; + } + + @Override + public void doQd(String id) { + NutMap updateMap = NutMap.NEW(); + updateMap.put("isAttend", true); + updateMap.put("attendTime", new Date()); + dao().update(FellowshipUserCourse.class, Chain.from(updateMap), Cnd.where("id", "=", id)); + } + + @Override + public List qdInfoByUserId(String userId, String activityId) { + Sql sql = Sqls.create(""" + SELECT + c.*, + t.courseLocationCoordinates, + t.isMobileSign, + t.signType, + t.isReceiveGift, + t.giftType, + (select state from fellowship_user su where su.activityId = c.activityId and su.courseId = c.courseId and su.userId = c.userId) as state + FROM + `fellowship_user_course` c + LEFT JOIN fellowship_course t ON t.id = c.courseId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("c.activityId", "=", activityId); + cnd.and("c.userId", "=", userId); + cnd.asc("c.courseStartTime"); + + sql.setCondition(cnd); + return listMap(sql); + } + + @Override + public List filterCourseByHostUnion(List courseList) { + if (Lang.isEmpty(courseList)) { + return new ArrayList<>(); + } + return courseList.stream().filter(o -> { + if (StrUtil.isBlank(o.getInterTime()) || o.getOpenOtherUnion() == null || o.getOpenOtherUnion()) { + return true; + } else { + if (SecurityUtil.getUnionId().equals(o.getHostUnionId())) { + return true; + } else { + int compare = cn.hutool.core.date.DateUtil.compare(cn.hutool.core.date.DateUtil.date(), cn.hutool.core.date.DateUtil.parse(o.getInterTime()), "yyyy-MM-dd HH:mm"); + return compare >= 0; + } + } + }).toList(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java new file mode 100644 index 0000000..5590dbe --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java @@ -0,0 +1,263 @@ +package com.budwk.app.zhgh.activity.fellowship.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService; +import lombok.extern.slf4j.Slf4j; +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.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; + +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @author zxy + * @Description TODO + * @createTime 2022年03月03日 10:02:00 + */ +@IocBean(args = {"refer:dao"}) +@Slf4j +public class FellowshipActivityStatisticsServiceImpl extends BaseServiceImpl implements FellowshipActivityStatisticsService { + + public FellowshipActivityStatisticsServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(PageForm pageForm, String activityId) { + Sql sql = Sqls.create(""" + SELECT + tsuc.id, + tsuc.courseName, + tsuc.coursePeopleNumber, + tsuc.courseReservedNumber, + type.typeName as courseType, + tsuc.courseLocation, + tsuc.courseInstructor, + tsuc.reserveMode, + tsuc.isMobileSign, + tsuc.hostUnionId, + tsuc.interTime, + tsuc.waitingNum, + tsuc.openOtherUnion, + tsuc.courseType as cType + FROM + `fellowship_course` tsuc + LEFT JOIN + fellowship_type type on tsuc.courseType = type.id + WHERE + tsuc.activityId = @activityId + ORDER BY tsuc.orderNum + """); + sql.setParam("activityId", activityId); + Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List courseList = pagination.getList(); + courseList.forEach(c -> { + c.put("registerNum", queryCourseCount(c.getString("id"), c.getString("cType"))); + c.put("hasWaitingNum", queryCourseWaitCount(c.getString("id"), c.getString("cType"))); + }); + return pagination; + } + + @Override + public List registerUserList(String courseId) { + Sql sql = Sqls.create(""" + SELECT + u.loginname, + u.username, + u.sex, + tsuu.unionId, + tsuu.unionName, + tsuu.unitId, + tsuu.unitName, + ifnull(tsuu.mobile, u.mobile) as mobile, + tsuu.signUpTime, + tsuu.state, + tsuu.mobileColumnsValue + FROM + fellowship_user tsuu + LEFT JOIN `vw_user` u ON u.id = tsuu.userId + $condition + ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("tsuu.courseId", "=", courseId); + sql.setCondition(cnd); + List list = listMap(sql); + for (NutMap o : list) { + if(StrUtil.isBlank(o.getString("mobileColumnsValue"))) { + continue; + } + List mobileColumnsValue = Json.fromJsonAsList(NutMap.class, o.getString("mobileColumnsValue")); + if(Lang.isNotEmpty(mobileColumnsValue)) { + mobileColumnsValue.forEach(m -> { + o.put(m.getString("columnCode"), m.getString("columnValue")); + }); + } + } + return list; + } + + @Override + public List getTaleColumnInfo(String courseId) { + FellowshipCourse course = dao().fetch(FellowshipCourse.class, courseId); + FellowshipType upType = dao().fetch(FellowshipType.class, course.getCourseType()); + dao().fetchLinks(upType, "mobileSignColumnList", Cnd.NEW().asc("columnIndex")); + + List columnList = upType.getMobileSignColumnList(); + List columnTableList = columnList.stream().map(o -> NutMap.NEW().setv("label", o.getColumnName()).setv("prop", o.getColumnCode())).collect(Collectors.toList()); + return columnTableList; + } + + @Override + public List registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword) { + Sql sql = Sqls.create(""" + SELECT + tsuu.id, + u.id as userId, + u.loginname, + u.username, + u.unitName, + u.unionName, + u.sex, + ifnull(tsuu.mobile, u.mobile) as mobile, + tsuu.signUpTime, + tsuu.state + FROM + fellowship_user tsuu + LEFT JOIN `vw_user` u ON u.id = tsuu.userId + $condition + ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("tsuu.courseId", "=", courseId); + cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unitid", "=", unitId); + if (StrUtil.isNotBlank(searchKeyword)) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.andLike("username", searchKeyword).orLike("loginname", searchKeyword); + cnd.and(group); + } + sql.setCondition(cnd); + return listMap(sql); + } + + @Override + public Map> getSignInfo(String courseId) { + Sql sql = Sqls.create(""" + SELECT + tsuuc.courseStartTime, + tsuuc.courseEndTime, + tsuuc.isAttend, + tsuuc.attendTime, + u.username, + u.loginname, + u.unitname, + u.unionname + FROM + `fellowship_user_course` tsuuc + LEFT JOIN `vw_user` u ON u.id = tsuuc.userId + WHERE + tsuuc.courseId = @courseId + """); + sql.setParam("courseId", courseId); + List list = listMap(sql); + + Map> courseTimeMap = list.stream().map(v -> { + String courseTime = v.getString("courseStartTime") + " 至 " + v.getString("courseEndTime"); + v.put("courseTime", courseTime); + return v; + }).collect(Collectors.groupingBy(v -> v.getString("courseTime"))); + + // 使用Stream API进行降序排序 + Map> sortedDataMap = courseTimeMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey(Comparator.naturalOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + + return sortedDataMap; + } + + @Override + public List baoMingUserList(String activityId) { + Sql sql = Sqls.create(""" + SELECT + u.loginname, + u.username, + u.unitname, + u.unionname, + u.sex, + u.mobile, + uc.courseName, + uc.campus + FROM + `fellowship_user` uu + RIGHT JOIN fellowship_course uc ON uc.id = uu.courseId + LEFT JOIN `vw_user` u ON u.id = uu.userId + WHERE + uc.activityId = @activityId + ORDER BY u.unitCode,u.unioncode,u.sex + """); + sql.setParam("activityId", activityId); + return listMap(sql); + } + + @Override + public int queryCourseCount(String courseId, String courseType) { + return this.queryCourseCount(courseId, courseType, null); + } + + @Override + public int queryCourseWaitCount(String courseId, String courseType) { + return this.queryCourseWaitCount(courseId, courseType, null); + } + + @Override + public int queryCourseCount(String courseId, String courseType, String unionId) { + return this.calcSignCount(courseId, courseType, unionId, List.of(1, 3)); + } + + @Override + public int queryCourseWaitCount(String courseId, String courseType, String unionId) { + return this.calcSignCount(courseId, courseType, unionId, List.of(2)); + } + + private int calcSignCount(String courseId, String courseType, String unionId, List stateList) { + if(StrUtil.isBlank(courseId) || StrUtil.isBlank(courseType)) { + return 0; + } + FellowshipType type = dao().fetch(FellowshipType.class, courseType); + AtomicInteger hasRegisterNum = new AtomicInteger(); + List signUpUsers = dao().query(FellowshipUser.class, Cnd.where("courseId", "=", courseId) + .and("state", "in", stateList) + .andEX("unionId", "=", unionId)); + signUpUsers.forEach(item -> { + if (type.getSelfAddFamily()) { + hasRegisterNum.getAndIncrement(); + } + if(type.getIsBringFamily() && type.getIsAddFamily()) { + List mobileColumnsValue = item.getMobileColumnsValue(); + NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null); + int number = map != null ? map.getInt("columnValue") : 0; + hasRegisterNum.addAndGet(number); + } + }); + return hasRegisterNum.get(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java new file mode 100644 index 0000000..a7710d8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java @@ -0,0 +1,103 @@ +package com.budwk.app.zhgh.activity.fellowship.service.impl; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.activity.fellowship.models.FellowshipBlackList; +import com.budwk.app.zhgh.activity.fellowship.service.FellowshipBlackListService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Criteria; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; + +import java.util.List; + +/** + * @author zxy + * @Description TODO + * @createTime 2022年03月07日 14:29:00 + */ +@IocBean(args = {"refer:dao"}) +public class FellowshipUserServiceImpl extends BaseServiceImpl implements FellowshipBlackListService { + + public FellowshipUserServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId) { + Sql sql = Sqls.create(""" + SELECT + u.id AS userId, + u.username, + u.loginname, + ifnull(tsuu.mobile, u.mobile) as mobile, + u.unitName, + u.unionName, + tsuc.courseName, + tsuu.state, + ( SELECT count( 1 ) FROM fellowship_user_course WHERE userId = tsuu.userId $var) courseTotal, + ( SELECT count( 1 ) FROM fellowship_user_course WHERE userId = tsuu.userId AND isAttend = 0 and tsuu.state!=2 AND now()> courseEndTime $var) AS absentCount, + if(tsubl.isDisabled=1,true,false) isDisabled, + group_CONCAT( tsuc.courseName ) AS courseNames + FROM + `fellowship_user` tsuu + LEFT JOIN `vw_user` u ON u.id = tsuu.userId + LEFT JOIN fellowship_activity act on act.id = tsuu.activityId + LEFT JOIN fellowship_course tsuc ON tsuc.id = tsuu.courseId + LEFT JOIN fellowship_black_list tsubl on tsubl.userId = tsuu.userId + $condition + ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ) + """); + cnd.groupBy("tsuu.userId"); + Criteria varCnd = Cnd.cri(); + varCnd.where().setTop(false); + varCnd.where().andEX("activityId", "=", activityId); + varCnd.where().andEX("courseId", "=", courseId); + if (!varCnd.where().isEmpty()) { + sql.vars().set("var", "and " + varCnd.toSql(null)); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + + @Override + public void doHandleUser(String userId) { + FellowshipBlackList blackRecord = dao().fetch(FellowshipBlackList.class, Cnd.where("userId", "=", userId)); + if (Lang.isEmpty(blackRecord)) { + FellowshipBlackList blackList = new FellowshipBlackList(); + blackList.setUserId(userId); + blackList.setIsDisabled(true); + dao().insert(blackList); + } else { +// blackRecord.setIsDisabled(!blackRecord.getIsDisabled()); +// dao().update(blackRecord); + dao().delete(blackRecord); + } + + } + + @Override + public List attendClassRecord(String userId) { + Sql sql = Sqls.create(""" + SELECT + c.courseName, + uc.courseStartTime, + courseEndTime, + uc.isAttend, + uc.attendTime + FROM + `fellowship_user_course` uc + LEFT JOIN fellowship_course c ON c.id = uc.courseId + WHERE + uc.userId = @userId + """); + sql.setParam("userId", userId); + return listMap(sql); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetAnalyzeController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetAnalyzeController.java new file mode 100644 index 0000000..d9a2ade --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/asset/controller/AssetAnalyzeController.java @@ -0,0 +1,73 @@ +package com.budwk.app.zhgh.dayofficework.asset.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.dayofficework.asset.model.Asset; +import com.budwk.app.zhgh.dayofficework.asset.model.AssetCategory; +import com.budwk.app.zhgh.dayofficework.asset.service.AssetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.random.R; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhf + * @date 2025/12/1 15:35 + * @description 数据分析 + */ +@IocBean +@At("/platform/asset/analyze") +@Ok("json:full") +@Slf4j +@Api(tags = "资产分析") +public class AssetAnalyzeController { + + + @Inject + private AssetService assetService; + + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/asset/analyze/index.html") + @SaCheckPermission("asset.analyze") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("asset.analyze") + public Result pageData(String assetUsageStateName) { + + List zclbList = assetService.dao().query(AssetCategory.class, Cnd.NEW().asc("categoryCode")); + + List zcxxList = assetService.query(Cnd.NEW().andEX(Asset::getAssetUsageStateName, "=", assetUsageStateName)); + + List list = new ArrayList<>(); + zclbList.forEach(z -> { + int sl = zcxxList.stream().filter(zc -> zc.getAssetCategoryId().equals(z.getId())).mapToInt(Asset::getAssetQuantity).sum(); + zcxxList.stream().filter(zc -> zc.getAssetCategoryId().equals(z.getId())).toList().forEach(zc -> { + zc.setAllMoney(zc.getAssetUnitPrice().multiply(new BigDecimal(zc.getAssetQuantity()))); + }); + Double je = zcxxList.stream().filter(zc -> zc.getAssetCategoryId().equals(z.getId())).mapToDouble(v -> v.getAllMoney().doubleValue()).sum(); + NutMap map = new NutMap(); + map.setv("typeCode", z.getCategoryCode()); + map.setv("type", z.getCategoryName()); + map.setv("sl", sl); + map.setv("je", String.format("%.2f", je)); + list.add(map); + }); + return Result.success(list); + } + + +} 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 91da438..cbcd0d7 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 @@ -138,5 +138,7 @@ public class Asset extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR,width = 30) private String assetStorageLocation; + private BigDecimal allMoney; + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBasicSettingsController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBasicSettingsController.java index 9a47ee8..7552095 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBasicSettingsController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBasicSettingsController.java @@ -73,19 +73,18 @@ public class HonorBasicSettingsController { @SaCheckPermission("honor.basic.setting") public Result doSubmit(HonorBasicSettings honorBasicSettings) { try { - Dao dao = honorCommonService.dao(); if (StrUtil.isBlank(honorBasicSettings.getId())) { int count = dao.count(HonorBasicSettings.class, Cnd.where("name", "=", honorBasicSettings.getName())); if (count > 0) { return Result.error("名称已存在,请勿重复添加。"); } else { - dao.insert(honorBasicSettings); + honorCommonService.insert(honorBasicSettings); return Result.success(); } } else { - dao.updateIgnoreNull(honorBasicSettings); + honorCommonService.updateIgnoreNull(honorBasicSettings); } - dao.update(Chain.make("hasChildren", true), Cnd.where("id", "=", honorBasicSettings.getParentId())); + honorCommonService.dao().update(HonorBasicSettings.class,Chain.make("hasChildren", true), Cnd.where("id", "=", honorBasicSettings.getParentId())); return Result.success(); } catch (Exception e) { return Result.error(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/HonorBasicSettings.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/HonorBasicSettings.java index 464dffe..a427356 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/HonorBasicSettings.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/models/HonorBasicSettings.java @@ -22,7 +22,7 @@ public class HonorBasicSettings extends BaseModel { @Column @Name @ColDefine(type = ColType.VARCHAR, width = 32) - @PrevInsert(uu32 = true) + @PrevInsert(els = {@EL("uuid()")}) private String id; @Column diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java index 4e8d21a..6aa8591 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseCollectController.java @@ -72,6 +72,7 @@ public class UnionReimburseCollectController { @Param(value = "unionId") String unionId, @Param(value = "unitId") String unitId, @Param(value = "reimburseProject") String reimburseProject, + @Param(value = "reimburseFundSource") String reimburseFundSource, @Param(value = "userName") String searchKeyword) { Sql sql = Sqls.create(""" SELECT @@ -109,6 +110,7 @@ public class UnionReimburseCollectController { // 报销项目查询条件 cnd.andEX("info.reimburseProject", "=", reimburseProject); + cnd.andEX("info.reimburseFundSource", "=", reimburseFundSource); // 姓名和工号查询条件 if (StrUtil.isNotBlank(searchKeyword)) { SqlExpressionGroup seg = new SqlExpressionGroup(); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseReviewController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseReviewController.java index fc05c74..40a3549 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseReviewController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/controller/UnionReimburseReviewController.java @@ -89,7 +89,7 @@ public class UnionReimburseReviewController { """); Cnd cnd = Cnd.NEW(); cnd.and("t.taskName", "=", "019925d2-6f33-449a-9fb0-34c470222e99"); - cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); +// 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())); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/model/UnionReimburse.java b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/model/UnionReimburse.java index 04bc72c..b83c734 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/model/UnionReimburse.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/unionReimburse/model/UnionReimburse.java @@ -139,6 +139,11 @@ public class UnionReimburse extends BaseModel { @ColDefine(type = ColType.MYSQL_JSON) private List files; + @Column + @Comment("申请人签字") + @ColDefine(type = ColType.TEXT) + private String applySign; + /** * 慰问 diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java index 991936e..929c5bb 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java @@ -17,6 +17,7 @@ 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.sms.SmsService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; @@ -91,6 +92,9 @@ public class TeacherCongressDelegatePushController { @Inject private TeacherCongressDelegatePushService teacherCongressDelegatePushService; + @Inject + private SmsService smsService; + @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/index.html") @SaCheckPermission("tc.delegate.push") @@ -308,6 +312,8 @@ public class TeacherCongressDelegatePushController { flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); } }); + List loginnames = list.stream().map(TeacherCongressDelegatePush::getLoginName).toList(); + smsService.massSend(loginnames, "智慧工会", SecurityUtil.getUserUsername() + "推选了您为代表请到智慧工会PC端进行填写信息!"); return Result.success(); } @@ -321,35 +327,62 @@ public class TeacherCongressDelegatePushController { return Result.success(); } - @At - @ApiOperation("提交到资格审查") - @SaCheckPermission("tc.delegate.push") - @SLog(tag = "代表管理-代表推选", msg = "提交到资格审查") - public Result batchSubmit(String sessionId) { - String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, "JG"); - if (StrUtil.isNotBlank(str)) { - return Result.error(str); - } - teacherCongressDelegatePushService.batchSubmit("JG", sessionId); - return Result.success(); - } - @At @ApiOperation("本单位代表上报情况") - @SaCheckPermission(value = {"tc.delegate.push", "tc.delegate.push.dwSjAudit"}, mode = SaMode.OR) + @SaCheckPermission(value = {"tc.delegate.push", "tc.delegate.push.dwSjAudit", "tc.delegate.push.unionFzrAudit"}, mode = SaMode.OR) public Result selfUnionPushMetric(String sessionId, String unionId, String submitType) { - if (StrUtil.isBlank(unionId)) { - unionId = SecurityUtil.getUnionId(); - } + Integer allocationNum = 0; + Integer femaleNum = 0; + Integer seniorTeaNum = 0; + Integer intermediateBelowNum = 0; + Integer cadreNum = 0; + Integer ordinaryTeaNum = 0; + Integer less45Num = 0; + Integer workerNum = 0; + + List unionIds = new ArrayList<>(); + if (StrUtil.isBlank(unionId)) { + if (!AuthUtil.hasRole(RoleConstant.BRANCH_UNION_MANAGER.name())) { + unionId = SecurityUtil.getUnionId(); + } else { + unionIds.add("563dcfc5033d4631bc7f6482b2d427b9"); + unionIds.add("9b2650eec5114a18a0d2a09803800a39"); + } + } Teacher_congress_quota_allocation allocation = dao.fetch(Teacher_congress_quota_allocation.class, Cnd.where(Teacher_congress_quota_allocation::getSessionId, "=", sessionId) .and(Teacher_congress_quota_allocation::getUnionId, "=", unionId)); - if (allocation == null) { + if (allocation != null) { + allocationNum = allocation.getAllocationNum(); + femaleNum = allocation.getFemaleNum(); + seniorTeaNum = allocation.getSeniorTeaNum(); + intermediateBelowNum = allocation.getIntermediateBelowNum(); + cadreNum = allocation.getCadreNum(); + ordinaryTeaNum = allocation.getOrdinaryTeaNum(); + less45Num = allocation.getLess45Num(); + workerNum = allocation.getWorkerNum(); + } + + if (!unionIds.isEmpty()) { + List allocationList = dao.query(Teacher_congress_quota_allocation.class, + Cnd.where(Teacher_congress_quota_allocation::getSessionId, "=", sessionId) + .and(Teacher_congress_quota_allocation::getUnionId, "in", unionIds)); + allocationNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getAllocationNum).sum(); + femaleNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getFemaleNum).sum(); + seniorTeaNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getSeniorTeaNum).sum(); + intermediateBelowNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getIntermediateBelowNum).sum(); + cadreNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getCadreNum).sum(); + ordinaryTeaNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getOrdinaryTeaNum).sum(); + less45Num = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getLess45Num).sum(); + workerNum = allocationList.stream().mapToInt(Teacher_congress_quota_allocation::getWorkerNum).sum(); + } + if (allocation == null && unionIds.isEmpty()) { return Result.success(); } + Sql sql = Sqls.create(""" SELECT info.* @@ -361,18 +394,20 @@ public class TeacherCongressDelegatePushController { $condition """); Cnd cnd = Cnd.NEW(); + cnd.andEX("info.pushUnionId", "in", unionIds); SqlExpressionGroup group = new SqlExpressionGroup(); if (submitType.equals("JG")) { - group.or("t.taskName", "=", "tcDelegatePushDwSjTj"); + group.or("t.taskName", "=", "tcDelegatePushUnionFzr"); } else { - group.or("t.taskName", "=", "tcDelegatePushUnion"); + group.or("t.taskName", "=", "tcDelegatePushDwSjTj"); + } group.or("t.taskName", "=", "tcDelegatePushZg"); group.or("t.taskName", "is", null); cnd.and(group); cnd.and("ins.state", "!=", ProcessInstanceStateEnum.REJECT.getCode()); cnd.andEX("info.sessionId", "=", sessionId); - cnd.andEX("info.unionId", "=", unionId); + cnd.andEX("info.pushUnionId", "=", unionId); cnd.andEX("info.schoolLeader", "!=", 1); cnd.andEX("info.representativeType", "=", "正式代表"); sql.setCondition(cnd); @@ -406,58 +441,58 @@ public class TeacherCongressDelegatePushController { HashMap totalMap = new HashMap<>(); totalMap.put("current", total); - totalMap.put("target", allocation.getAllocationNum()); - totalMap.put("progress", allocation.getAllocationNum() != 0 ? (double) total / allocation.getAllocationNum() : 0.0); - totalMap.put("remaining", allocation.getAllocationNum() - total); + totalMap.put("target", allocationNum); + totalMap.put("progress", allocationNum != 0 ? (double) total / allocationNum : 0.0); + totalMap.put("remaining", allocationNum - total); hashMap.put("total", totalMap); HashMap femaleMap = new HashMap<>(); femaleMap.put("current", female); - femaleMap.put("target", allocation.getFemaleNum()); - femaleMap.put("progress", allocation.getFemaleNum() != 0 ? (double) female / allocation.getFemaleNum() : 0.0); - femaleMap.put("remaining", allocation.getFemaleNum() - female); + femaleMap.put("target", femaleNum); + femaleMap.put("progress", femaleNum != 0 ? (double) female / femaleNum : 0.0); + femaleMap.put("remaining", femaleNum - female); hashMap.put("female", femaleMap); HashMap seniorTeaMap = new HashMap<>(); seniorTeaMap.put("current", seniorTeacher); - seniorTeaMap.put("target", allocation.getSeniorTeaNum()); - seniorTeaMap.put("progress", allocation.getSeniorTeaNum() != 0 ? (double) seniorTeacher / allocation.getSeniorTeaNum() : 0.0); - seniorTeaMap.put("remaining", allocation.getSeniorTeaNum() - seniorTeacher); + seniorTeaMap.put("target", seniorTeaNum); + seniorTeaMap.put("progress", seniorTeaNum != 0 ? (double) seniorTeacher / seniorTeaNum : 0.0); + seniorTeaMap.put("remaining", seniorTeaNum - seniorTeacher); hashMap.put("seniorTeacher", seniorTeaMap); HashMap intermediateBelowMap = new HashMap<>(); intermediateBelowMap.put("current", intermediateBelow); - intermediateBelowMap.put("target", allocation.getIntermediateBelowNum()); - intermediateBelowMap.put("progress", allocation.getIntermediateBelowNum() != 0 ? (double) intermediateBelow / allocation.getIntermediateBelowNum() : 0.0); - intermediateBelowMap.put("remaining", allocation.getIntermediateBelowNum() - intermediateBelow); + intermediateBelowMap.put("target", intermediateBelowNum); + intermediateBelowMap.put("progress", intermediateBelowNum != 0 ? (double) intermediateBelow / intermediateBelowNum : 0.0); + intermediateBelowMap.put("remaining", intermediateBelowNum - intermediateBelow); hashMap.put("intermediateBelow", intermediateBelowMap); HashMap cadreMap = new HashMap<>(); cadreMap.put("current", cadre); - cadreMap.put("target", allocation.getCadreNum()); - cadreMap.put("progress", allocation.getCadreNum() != 0 ? (double) cadre / allocation.getCadreNum() : 0.0); - cadreMap.put("remaining", allocation.getCadreNum() - cadre); + cadreMap.put("target", cadreNum); + cadreMap.put("progress", cadreNum != 0 ? (double) cadre / cadreNum : 0.0); + cadreMap.put("remaining", cadreNum - cadre); hashMap.put("cadre", cadreMap); HashMap workerMap = new HashMap<>(); workerMap.put("current", worker); - workerMap.put("target", allocation.getWorkerNum()); - workerMap.put("progress", allocation.getWorkerNum() != 0 ? (double) worker / allocation.getWorkerNum() : 0.0); - workerMap.put("remaining", allocation.getWorkerNum() - cadre); + workerMap.put("target", workerNum); + workerMap.put("progress", workerNum != 0 ? (double) worker / workerNum : 0.0); + workerMap.put("remaining", workerNum - cadre); hashMap.put("worker", workerMap); HashMap ordinaryTeaMap = new HashMap<>(); ordinaryTeaMap.put("current", ordinaryTeacher); - ordinaryTeaMap.put("target", allocation.getOrdinaryTeaNum()); - ordinaryTeaMap.put("progress", allocation.getOrdinaryTeaNum() != 0 ? (double) ordinaryTeacher / allocation.getOrdinaryTeaNum() : 0.0); - ordinaryTeaMap.put("remaining", allocation.getOrdinaryTeaNum() - ordinaryTeacher); + ordinaryTeaMap.put("target", ordinaryTeaNum); + ordinaryTeaMap.put("progress", ordinaryTeaNum != 0 ? (double) ordinaryTeacher / ordinaryTeaNum : 0.0); + ordinaryTeaMap.put("remaining", ordinaryTeaNum - ordinaryTeacher); hashMap.put("ordinaryTeacher", ordinaryTeaMap); HashMap under45Map = new HashMap<>(); under45Map.put("current", under45); - under45Map.put("target", allocation.getLess45Num()); - under45Map.put("progress", allocation.getLess45Num() != 0 ? (double) under45 / allocation.getLess45Num() : 0.0); - under45Map.put("remaining", allocation.getLess45Num() - under45); + under45Map.put("target", less45Num); + under45Map.put("progress", less45Num != 0 ? (double) under45 / less45Num : 0.0); + under45Map.put("remaining", less45Num - under45); hashMap.put("under45", under45Map); /* HashMap ethnicMinorityMap = new HashMap<>(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwFzrAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwFzrAuditController.java index 9f2a800..661b7ee 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwFzrAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwFzrAuditController.java @@ -9,10 +9,13 @@ 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.sms.SmsService; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.FlowCommonService; @@ -64,6 +67,9 @@ public class TeacherCongressDelegatePushDwFzrAuditController { @Inject private FlowEngine flowEngine; + @Inject + private SmsService smsService; + @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/dwFzrAudit.html") @SaCheckPermission("tc.delegate.push.dwFzrAudit") @@ -117,7 +123,7 @@ public class TeacherCongressDelegatePushDwFzrAuditController { cnd.and("info.representativeType", "=", isFormalOrAttendance); } cnd.andEX("info.sessionId", "=", sessionId); - cnd.andEX("info.unionId", "=", unionId); + cnd.andEX("info.pushUnionId", "=", unionId); if (approval) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); } else { @@ -142,5 +148,15 @@ public class TeacherCongressDelegatePushDwFzrAuditController { return Result.success(pageVO); } + @At + @ApiOperation("分页查询") + @SaCheckPermission("tc.delegate.push.dwFzrAudit") + public void sms(String tf_type, String instanceId) { + if ("ROLLBACK".equals(tf_type)) { + ProcessTask task = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instanceId).desc("id")); + ProcessTaskActor processTask = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + smsService.send(processTask.getActorAccount(), "智慧工会", "单位负责人退回您填写的代表信息,请前往PC端进行修改!"); + } + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwSjAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwSjAuditController.java index d46f4c1..c8f9e64 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwSjAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushDwSjAuditController.java @@ -148,11 +148,11 @@ public class TeacherCongressDelegatePushDwSjAuditController { @SaCheckPermission("tc.delegate.push.dwSjAudit") public Result batchSubmit(String sessionId) { - String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, "XY"); + String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, null,"XY"); if (StrUtil.isNotBlank(str)) { return Result.error(str); } - teacherCongressDelegatePushService.batchSubmit("XY", sessionId); + teacherCongressDelegatePushService.batchSubmit("XY", null,sessionId); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushUnionFzrAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushUnionFzrAuditController.java new file mode 100644 index 0000000..b12edcc --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushUnionFzrAuditController.java @@ -0,0 +1,159 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.base.service.BaseService; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.flow.service.FlowCommonService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCongressDelegatePushService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +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.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author zhf + * @date 2025/11/26 19:02 + * @description 分工会负责人提交 + */ +@IocBean +@At("/platform/teacherCongress/delegate/push/unionFzrAudit") +@Ok("json:full") +@Slf4j +@Api(value = "/platform/teacherCongress/delegate/push/unionFzrAudit", tags = "分工会负责人提交") +public class TeacherCongressDelegatePushUnionFzrAuditController { + + + @Inject + private Dao dao; + + @Inject + private BaseService baseService; + + @Inject + private FlowCommonService flowCommonService; + + @Inject + private FlowEngine flowEngine; + + @Inject + private TeacherCongressDelegatePushService teacherCongressDelegatePushService; + + @At("") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/unionFzrAudit.html") + @SaCheckPermission("tc.delegate.push.unionFzrAudit") + public void index() { + } + + + @At + @ApiOperation("分页查询") + @SaCheckPermission("tc.delegate.push.unionFzrAudit") + public Result pageData(PageForm pageForm, + @Param(value = "sessionId") String sessionId, + @Param(value = "unionId") String unionId, + @Param(value = "approval") Boolean approval, + @Param(value = "isFormalOrAttendance") String isFormalOrAttendance) { + + Sql sql = Sqls.create(""" + SELECT + info.*, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariable, + 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 taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke + FROM + wf_process_task t + LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId + LEFT JOIN teacher_congress_delegate_push info ON info.id = ins.businessNo + 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", "=", "tcDelegatePushUnionFzr"); + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name())) { + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + } + if (!"全部".equals(isFormalOrAttendance)) { + cnd.and("info.representativeType", "=", isFormalOrAttendance); + } + cnd.andEX("info.sessionId", "=", sessionId); + cnd.andEX("info.pushUnionId", "=", unionId); + if (approval) { + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.orLike("info.userName", pageForm.getSearchKeyword()); + group.orLike("info.loginName", pageForm.getSearchKeyword()); + cnd.and(group); + } + + cnd.groupBy("t.id"); + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("t.createdAt"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + sql.setCondition(cnd); + Pagination pageVO = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pageVO); + } + + @At + @ApiOperation("分工会负责人提交") + @SaCheckPermission("tc.delegate.push.unionFzrAudit") + @SLog(tag = "代表管理-分工会负责人提交", msg = "提交到资格审查") + public Result batchSubmit(@Valid String sessionId, @Valid String unionId) { + String str = teacherCongressDelegatePushService.batchSubmitWhere(sessionId, unionId, "JG"); + if (StrUtil.isNotBlank(str)) { + return Result.error(str); + } + if (StrUtil.isBlank(unionId)) { + return Result.error("请选择工会"); + } + teacherCongressDelegatePushService.batchSubmit("JG", unionId, sessionId); + return Result.success(); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushWriteController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushWriteController.java index f6e18f0..c8ed06c 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushWriteController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushWriteController.java @@ -7,7 +7,10 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.sms.SmsService; import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.entity.ProcessTaskActor; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.sys.views.View_user; @@ -51,6 +54,8 @@ public class TeacherCongressDelegatePushWriteController { @Inject private FlowCommonService flowCommonService; + @Inject + private SmsService smsService; @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/write.html") @@ -118,7 +123,7 @@ public class TeacherCongressDelegatePushWriteController { @ApiOperation("代表信息填写提交") @SaCheckLogin @Aop(TransAop.READ_COMMITTED) - public Result submit(TeacherCongressDelegatePush teacherCongressDelegatePush,String taskId){ + public Result submit(TeacherCongressDelegatePush teacherCongressDelegatePush,String taskId,String instanceId){ dao.updateIgnoreNull(teacherCongressDelegatePush); Dict dict = Dict.create(); @@ -133,6 +138,9 @@ public class TeacherCongressDelegatePushWriteController { dict.set("argsUnitId",teacherCongressDelegatePush.getPushUnitId()); } flowCommonService.executeTask(dict); + ProcessTask task = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instanceId).desc("id")); + ProcessTaskActor processTask = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); + smsService.send(processTask.getActorAccount(), "智慧工会", teacherCongressDelegatePush.getUserName() + "填写了代表信息请您审核!"); return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushService.java index 08f8de1..1414c02 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushService.java @@ -5,8 +5,8 @@ import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCong public interface TeacherCongressDelegatePushService extends BaseService { - void batchSubmit(String submitType, String sessionId); + void batchSubmit(String submitType, String unionId ,String sessionId); - String batchSubmitWhere(String sessionId,String submitType); + String batchSubmitWhere(String sessionId,String unionId,String submitType); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushServiceImpl.java index b266c0a..b6e7362 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/TeacherCongressDelegatePushServiceImpl.java @@ -3,12 +3,14 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegate.service; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.service.FlowCommonService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCongressDelegatePush; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_quota_allocation; @@ -21,6 +23,7 @@ import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; +import java.util.ArrayList; import java.util.List; /** @@ -38,7 +41,7 @@ public class TeacherCongressDelegatePushServiceImpl extends BaseServiceImpl list = listMap(sql); + for (NutMap nutMap : list) { + if (StrUtil.isNotBlank(nutMap.getString("userSign"))) { + try { + Sys_file userSign = dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", nutMap.getString("userSign"))); + byte[] userSigns = sysFileService.download(userSign.getId()); + nutMap.put("userSign",userSigns); + }catch (Exception e){ + log.error("下载图片失败",e); + } + + } + } // 项目 WelfareProject project = dao().fetch(WelfareProject.class, pageForm.getProjectId()); @@ -169,16 +193,20 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + 提 交 + + + + `, + store, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + signDialog: false, + formData: {}, + courseRow: {}, + courseTimeSelectList: [], + } + }, + methods: { + async getCourseTimeSelectList(o) { + const resp = await $.post('/platform/fellowship/apply/getCourseTimeSelectList',{ courseId: o.id }) + if (resp.code === 0) { + this.courseTimeSelectList = resp.data + } else { + this.$message.warning('获取时段信息失败,请联系管理员') + } + }, + async onOpen(row, course) { + this.initData(row, course) + if (row.courseIsLimitApply) { + await this.getCourseTimeSelectList(row) + } + this.courseRow = row + this.signDialog = true + this.$nextTick(() => { + this.$refs.form.clearValidate() + }) + }, + async validateSignUp() { + // 获取家属人数 + let familyCount = this.formData.mobileSignColumnList.filter(o => o.columnCode === 'xdqsrs').reduce((sum, item) => { + return sum + (Number(item.columnValue) || 0) + }, 0) + const res = await this.$axios.post("/platform/fellowship/apply/validateSignUp", { + courseId: this.formData.courseId, + currentFamilyNumber: familyCount + }) + return res.code === 0 + }, + async validateCourseTime() { + const res = await this.$axios.post('/platform/fellowship/apply/validateSourceSignUp', { + activityCourseId: this.formData.activityCourseId, + courseId: this.courseRow.id + }) + return res.code === 0 + }, + async onSubmit() { + if(!await this.validateSignUp()) return + + this.$refs["form"].validate(async (valid) => { + if (valid) { + if(this.courseRow.courseIsLimitApply && !await this.validateCourseTime()) return + this.$confirm("您确定要提交吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + const mobileColumnsValue = this.formData.mobileSignColumnList.map((v) => { + return { + columnName: v.columnName, + columnValue: v.columnValue, + columnCode: v.columnCode, + columnFormType: v.columnFormType + } + }) + this.formData.mobileColumnsValue = JSON.stringify(mobileColumnsValue) + const resp = await this.$axios.post("/platform/fellowship/apply/doSignUp", this.formData) + if (resp.code === 0) { + this.signDialog = false + this.$message.success(resp.msg) + this.$emit('refresh') + } else { + this.$message.warning(resp.msg) + } + }) + } + }) + }, + initData(row, course) { + this.$set(this.formData, 'username', this.$store.state.user.username) + this.$set(this.formData, 'loginname', this.$store.state.user.loginname) + this.$set(this.formData, 'unionName', this.$store.state.user.union.name) + this.$set(this.formData, 'unitName', this.$store.state.user.unit.name) + this.$set(this.formData, 'sex', this.$store.state.user.sex) + this.$set(this.formData, 'activityId', row.activityId) + this.$set(this.formData, 'courseId', row.id) + this.$set(this.formData, 'mobileSignColumnList', course.mobileSignColumnList) + + this.formData.mobileSignColumnList.forEach((item) => { + item.columnValue = this.$store.state.user[item.columnCode] || "" + }) + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js new file mode 100644 index 0000000..4b2a9ea --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js @@ -0,0 +1,340 @@ + +const courseList = { + template: /*language=HTML*/ ` +
+ + + + + 类  型: + + + + + + + + 分类标识: + + + {{ item }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + + + + +
+ + 取 消 + +
+ + +
+ + 取 消 + +
+ + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + mixins: [initTableMixins], + components: { + "apply-form": applyForm, + }, + data() { + return { + pageForm: { + assortTypes: [], + }, + assortList: [], + courseTimeListDialog: false, + viewMapDialog: false, + courseTimeList: [], + tableColumns: [ + { prop: "courseName", label: "名称" }, + { prop: "typeName", label: "类型", width: 130}, + { prop: "campus", label: "校区", width: 160 }, + { prop: "courseLocationCoordinates", label: "地点", width: 200 }, + { prop: "courseInstructor", label: "联系人", width: 100 }, + { prop: "courseTime", label: "时间", width: 160 }, + { prop: "introduce", label: "详细信息", width: 100 }, + { prop: "applyNum", label: "已报名人数", width: 200 } + ], + activity: {}, + courseTypeList: [], + + trainType: '', + pdf: false, + infoVisible: false, + introduce: '', + } + }, + methods: { + async onPreview(introduce) { + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(introduce, 'text/html'); + const link = doc.querySelector('a'); + const href = link.getAttribute('href'); + + const id = href.substring(href.indexOf("=") + 1) + const res = await this.$axios.post("/platform/sys/file/previewFileData", { ids: JSON.stringify([id]) }) + + this.pdf = true + window.open("/assets/platform/plugins/pdfJs/web/viewer.html?file=" + encodeURIComponent(res.data[0].downloadPath), res.data[0].name) + } catch (e) { + this.introduce = introduce + this.pdf = false + this.infoVisible = true + } + }, + tagClick(key, val) { + let idx = this.pageForm[key].indexOf(val) + if (idx !== -1) { + this.pageForm[key].splice(idx, 1) + } else { + this.pageForm[key].push(val) + } + this.doSearch() + }, + async onOpen(row) { + this.activity = row + this.$set(this.pageForm, 'activityId', row.id) + await this.pageData() + await this.getCourseTypeList() + this.queryCourseAssort() + }, + onSign(row) { + const course = this.courseTypeList.find((v) => v.id === row.courseType) + this.$axios.post("/platform/fellowship/apply/validateSignUp", {courseId: row.id}) + .then((res) => { + if (res.code !== 0) { + this.$alert(res.msg, "提示", { + confirmButtonText: "确定", + type: "warning" + }) + } else { + let lave = row.coursePeopleNumber - (row.hasRegisterNum + row.courseReservedNumber) + if(row.reserveMode === 2 && lave <= 0) { + this.$alert('您当前的报名为候补报名状态', "提示", { + confirmButtonText: "确定", + type: "warning" + }) + } + this.$refs.formRef.onOpen(row, course) + } + }) + }, + onCancel(row) { + this.$confirm("您确定要取消吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "info" + }).then(async () => { + const resp = await this.$axios.post("/platform/fellowship/apply/cancelSignUp", { + activityId: row.activityId, + courseId: row.id + }) + if (resp.code === 0) { + await this.pageData() + this.$message.success(resp.msg) + } else { + this.$message.warning(resp.msg) + } + }) + }, + async getCourseTypeList() { + const resp = await this.$axios.post("/platform/fellowship/type/getAllType") + if (resp.code === 0) { + this.courseTypeList = resp.data + } + }, + async openViewCourseTime(id) { + const resp = await this.$axios.post(loc() + "/getCourseTime", { id: id }) + this.courseTimeList = resp.data + this.courseTimeListDialog = true + }, + openViewMap(point) { + if (!Array.isArray(point)) { + this.$message.warning("没有设置点位,无法通过地图查看") + return + } + this.viewMapDialog = true + this.$nextTick(() => { + const viewMap = new AMap.Map("viewMap", { + resizeEnable: true, + center: point, + zoom: 16 + }) + if (viewMarker) { + viewMap.remove(viewMarker) + } + viewMarker = new AMap.Marker({ + position: point, + offset: new AMap.Pixel(-13, -30) + }) + viewMap.add(viewMarker) + viewMap.setFitView(null, false, [150, 60, 100, 60]) + }) + }, + calcSignUpCount(o) { + let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber) + if(o.reserveMode === 2) { + let lave2 = o.waitingNum - o.hasWaitingNum + return "余" + lave +"/" + o.coursePeopleNumber + "人" + + ",候补余" + lave2 + "/" + o.waitingNum + "人" + } else { + return "余" + lave +"/" + o.coursePeopleNumber + "人" + } + }, + async pageData() { + const pageForm = clone({...this.pageForm}) + pageForm.assortTypes = JSON.stringify(pageForm.assortTypes) + const resp = await this.$axios.post(loc() + "/pageData", pageForm) + if (resp.code === 0) { + this.tableData = resp.data.list + this.pageForm.totalCount = resp.data.totalCount + } else { + this.$message.warning(resp.msg) + } + }, + queryCourseAssort() { + this.$axios.post(loc() + "/queryCourseAssort", {activityId: this.activity.id}) + .then((resp) => { + this.assortList = resp.data + }) + }, + }, + created() { + + }, + style: /*language=CSS*/ ` + /deep/ .glow-box { + min-height: calc(100vh - 56px - 40px - 50px - 80px); + max-height: calc(100vh - 56px - 40px - 50px - 80px); + overflow-y: auto; + background: #F0F2F5; + } + /deep/ img { + width: 100%; + height: 180px; + } + /deep/ .title { + background: white; + height: 20px; + } + /deep/ .query-row { + display: flex; + align-items: center; + padding: 6px 0; + } + /deep/ .query-row:not(:last-child) { + border-bottom: 1px dashed rgb(230, 230, 230); + } + /deep/ .query-row > .query-title { + width: 100px; + max-width: 100px; + min-width: 100px; + overflow: hidden; + } + /deep/ .query-row > .query-content { + min-width: 200px; + overflow: hidden; + } + /deep/ .query-row > .query-content > .el-tag { + margin-bottom: 5px; + margin-top: 5px; + } + /deep/ @media screen and (max-width: 992px) { + .query-row:nth-child(4) .query-content .el-col:not(:last-child) { + margin-bottom: 5px; + } + + .query-title { + display: none; + } + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html new file mode 100644 index 0000000..bd24180 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html @@ -0,0 +1,175 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js new file mode 100644 index 0000000..ed35712 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js @@ -0,0 +1,666 @@ + + +const basicForm = { + template: /*language=HTML*/ ` +
+ +
+ + + + + 沿用之前活动 + 不沿用之前活动 + + + + + + + + + + + + + + + + + + + + + 通知 + 不通知 + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ + 设置 + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+
+
{{trainType + '信息(温馨提示:如不需要人数限制,下方人数框填写0或者不填)'}}
+
+ 添加{{ trainType }} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
个人报名数量限制
+ + + 无限制 + 按类型限制 + 按活动限制 + +
+
+ 注:无限制指对报名的个数不做任何限制 +
+
+
+ 设置报名限制 + + 注:按类型限制指对每个类型下的个数进行限制 +
+
+
+
+ + 注:按活动限制指只能报{{formData.limitNum}}个,不与类型关联 +
+
+
+
+
+
+
+ 取消 + 上一步 + 下一步 + 保存 + 提交 +
+ + + + + + + + + + + 取消 + 确定 + + + + + + + + +
+ `, + dicts: ["USER_CAMPUS", "FELLOWSHIP_TYPE"], + data() { + return { + signUpDialog: false, + step: 1, + formData: { + notice: false, + courseList: [ + { orderNum: 1, courseName: "", courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1, courseIsLimitApply: false }, + ], + conditionStructure: { + method: "AND", + conditions: [{}] + }, + restrictLimit: 1, + limitNum: 1, + typeLimits: [] + }, + historicalActList: [], + trainTypeList: [], + trainType: "", + activityGroupList: [], + pickerOptions: { + disabledDate(time) { + return time.getTime() < Date.now() - 24 * 60 * 60 * 1000 + } + }, + campusList: [], + courseTypeList: [], + + unitOptions: [], + clubOptions: [], + } + }, + components: { + "drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue"), + "course-time": courseTime, + "custom-form": customForm, + }, + methods: { + async validNumber(row, old) { + if (GetQueryString("id") === "") { + if (row.courseReservedNumber > row.coursePeopleNumber && row.reserveMode === 1) { + this.$alert("预留人数不能大于" + this.trainType + "人数!", "提示", { + confirmButtonText: "确定" + }) + row.courseReservedNumber = 0 + } + } else { + const registerUserCount = await this.getRegisterUserCount(row.id) + if (row.courseReservedNumber + registerUserCount > row.coursePeopleNumber) { + if (row.reserveMode === 1) { + let num = row.coursePeopleNumber - registerUserCount + let str = + "您设置的" + + this.trainType + + "人数为" + + row.coursePeopleNumber + + "人,当前报名人数为" + + registerUserCount + + "人,预留名额上限为" + + num + + "人!" + this.$alert(str, "提示", { + confirmButtonText: "确定" + }) + row.courseReservedNumber = 0 + } + } + } + }, + async getRegisterUserCount(courseId) { + const resp = await this.$axios.post("/platform/fellowship/manage/getRegisterUserCount", { courseId }) + return resp.code === 0 ? resp.data : 0 + }, + courseTypeChange(val, row) { + row.reserveMode = 1 + }, + setSignUpCondition() { + if (this.formData.courseList !== undefined && this.formData.courseList.length > 0) { + const courseValid = this.formData.courseList.some((item, index) => { + if (item.courseType === undefined) { + this.$message.warning("请在" + (index + 1) + "行" + this.trainType + "信息中选择类型!") + return true + } + return false + }) + if (courseValid) { + return + } + const array = [...new Set(this.formData.courseList.map((o) => o.courseType))] + const typeArray = clone([...this.courseTypeList].filter((x) => array.some((y) => x.id === y))) + const arr = [] + typeArray.forEach((item) => { + const t = this.formData.typeLimits.find(o => o.typeId === item.id) + if (t) { + const type = this.courseTypeList.find(o => o.id === t.typeId) + t.code = type.code + t.typeName = type.typeName + arr.push(t) + } else { + arr.push({ + code: item.code, + typeName: item.typeName, + typeId: item.id, + limitNum: 0 + }) + } + }) + this.formData.typeLimits = arr + this.signUpDialog = true + } else { + this.$message.warning("请在" + this.trainType + "信息中选择类型!") + } + }, + doLimitNum() { + this.signUpDialog = false + }, + openMoreInfo(row, index) { + this.$refs.customFormRef.onOpen(this.formData, row, index) + }, + async removeTableCourse(index) { + const confirm = await this.$confirm( + "请确认是否删除此" + this.trainType + "?如果该" + this.trainType + "已有报名人员,会随之一起删除!确定吗?", + "提示", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + } + ) + if (confirm) { + this.formData.courseList.splice(index, 1) + } + }, + openSetUpCourseTime(index) { + this.$refs.courseTimeRef.onOpen(this.formData, index) + }, + courseOrderNumChange() { + this.formData.courseList = this.formData.courseList.sort((a, b) => a.orderNum - b.orderNum) + }, + addCourse() { + this.formData.courseList.push({ courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1, courseIsLimitApply: false }) + }, + async historicalActChange(val) { + const resp = await this.$axios.post("/platform/fellowship/manage/findOne", {id: val}) + if (resp.code === 0) { + this.formData = resp.data + this.typeChange(this.formData.trainType) + this.formData.id = "" + } + }, + typeChange(val) { + const type = this.dict.type.FELLOWSHIP_TYPE.find(o => o.code === val) + this.trainType = type?.name || "培训班" + }, + changeActivity(val) { + if (val) { + const group = this.activityGroupList.find(v => v.groupId === val) + this.$set(this.formData, "activityGroupName", group.groupName) + } else { + this.$set(this.formData, "activityGroupName", "全部教职工") + } + }, + async getActivityGroup() { + const { data } = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup") + return data + }, + async getHistoricalActList() { + const resp = await this.$axios.post("/platform/fellowship/manage/getHistoricalActList", {}) + return resp.data + }, + async onSave() { + let valid = false + this.$refs.form.validateField("activityName", (errMsg) => { + valid = errMsg === "" + }) + if (!valid) { + this.$message.warning("请输入活动名称") + return + } + await this.doHandle('保存') + }, + onSubmit() { + this.$refs["form"].validate(async (valid, errMsg) => { + if (valid) { + const courseValid = this.formData.courseList.some((v, i) => { + const basicValid = v.courseName && v.coursePeopleNumber && v.courseLocation && v.courseInstructor && v.courseType + const timeValid = + v.courseTimeList.length > 0 && + v.courseTimeList.every((x) => { + return x.courseStartTime && x.courseEndTime && x.courseStartTime < x.courseEndTime + }) + if (!timeValid) { + this.$message.warning("第" + (i + 1) + "行时间填写有误,请核查") + return true + } + if (!basicValid) { + this.$message.warning("第" + (i + 1) + "行信息填写有误,请核查") + return true + } + if (v.isMobileSign === true && v.signType === 3 && (v.courseLocationCoordinates === undefined || v.courseLocationCoordinates.length < 2)) { + this.$message.warning("第" + (i + 1) + "行地点坐标填写有误,请核查") + return true + } + if (v.isMobileSign === true && v.signType === 3 && (v.signType === "" || v.signType === undefined)) { + this.$message.warning("第" + (i + 1) + "行签到方式填写有误,请核查") + return true + } + return false + }) + if (courseValid) return + if (this.formData.restrictLimit === 2 && this.formData.typeLimits.length === 0) { + this.$message.warning("请设置报名限制") + return + } + this.formData.isDisabled = false + await this.doHandle('提交') + } else { + if(Object.keys(errMsg).length > 0) { + this.$message.warning(errMsg[Object.keys(errMsg)[0]][0].message) + return + } + this.$message.warning("存在必填项未填写") + } + }) + }, + async doHandle(type) { + const cloneData = clone(this.formData) + cloneData.activitySignUpStartTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[0] : null + cloneData.activitySignUpEndTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[1] : null + cloneData.activityStartTime = cloneData.activityTime !== undefined ? cloneData.activityTime[0] : null + cloneData.activityEndTime = cloneData.activityTime !== undefined ? cloneData.activityTime[1] : null + if (cloneData.activityStartTime !== undefined && cloneData.activityStartTime !== null) { + cloneData.year = new Date(cloneData.activityStartTime).getFullYear() + } + cloneData.typeLimits = JSON.stringify(this.formData.typeLimits) + cloneData.courseList = JSON.stringify(cloneData.courseList) + cloneData.undertakeUnitIds = JSON.stringify(cloneData.undertakeUnitIds) + cloneData.hostUnitIds = JSON.stringify(cloneData.hostUnitIds) + const confirm = await this.$confirm("您确定要" + type + "吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + if (confirm !== "confirm") return + const resp = await this.$axios.post("/platform/fellowship/manage/doHandle", cloneData) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.step = 1 + this.$emit('refresh') + this.$emit('back') + } else { + this.$message.warning(resp.msg) + } + }, + async getAllType() { + const resp = await this.$axios.post("/platform/fellowship/type/getAllType", {}) + return resp.data + }, + async init(row) { + if (row && row.id) { + const resp = await this.$axios.post("/platform/fellowship/manage/findOne", {id: row.id}) + if (resp.code === 0) { + this.formData = resp.data + this.typeChange(this.formData.trainType) + } + } + }, + async getClubsByRole() { + const resp = await this.$axios.post("/platform/club/examine/apply/getClubsByRole") + return resp.data + }, + async initData(row) { + this.activityGroupList = await this.getActivityGroup() + this.historicalActList = await this.getHistoricalActList() + this.courseTypeList = await this.getAllType() + await this.init(row) + + 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) + }, + }, + watch: { + 'formData.restrictLimit'(val) { + if (!this.formData.id) { + this.formData.limitNum = val === 3 ? 1 : '' + } + }, + 'formData.activityGroupId': { + async handler(newVal, oldVal) { + this.activityGroupList = await this.getActivityGroup() + this.userScopeDialog = false + }, + deep: true + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js new file mode 100644 index 0000000..5b17666 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js @@ -0,0 +1,215 @@ +const courseTime = { + template: /*language=HTML*/ ` +
+ +
温馨提示:有人员报名后,禁止修改下列时间,如有修改,请联系管理员
+
选择日期
+ +
设置时间
+ + + + 一键设置开始/结束时间 + 报名人数是否限制: + + + + + + + + + + + + + + + + + + + + + + + 确定 + +
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + const that = this + return { + setUpCourseDialog: false, + courseIndex: 0, + formData: {}, + courseTimeOneKeySet: { + startTime: "", + endTime: "" + }, + setUpCoursePickerOptions: { + disabledDate(time) { + return ( + time.getTime() < Date.parse(that.$moment(that.formData.activityTime[0]).format("YYYY-MM-DD") + " 00:00:00") || + time.getTime() > Date.parse(that.$moment(that.formData.activityTime[1]).format("YYYY-MM-DD") + " 00:00:00") + ) + } + }, + } + }, + methods: { + removeSetUpTableCourseRow(row, index) { + this.formData.courseList[this.courseIndex].courseTimeList.splice(index, 1) + //培训时间列表日期数组 + const courseDateArray = this.formData.courseList[this.courseIndex].courseTimeList.map((v) => + this.$moment(v.courseDate).format("YYYY-MM-DD") + ) + //选择课程日期数组 + const scdList = this.formData.courseList[this.courseIndex].setUpCourseData + + this.formData.courseList[this.courseIndex].setUpCourseData = scdList.filter((v) => { + return courseDateArray.includes(this.$moment(v).format("YYYY-MM-DD")) + }) + }, + oneKeySetStartEndTime() { + const { startTime, endTime } = this.courseTimeOneKeySet + this.formData.courseList[this.courseIndex].courseTimeList.forEach((v) => { + this.$set(v, "courseStartTime", startTime) + this.$set(v, "courseEndTime", endTime) + }) + this.$forceUpdate() + }, + setUpCourseDataChange(val) { + if (!val) { + this.formData.courseList[this.courseIndex].courseTimeList = [] + return + } + //培训时间日期Set + if (this.formData.courseList[this.courseIndex].courseTimeList === undefined) { + this.$set(this.formData.courseList[this.courseIndex], "courseTimeList", []) + } + const ctList = new Set( + this.formData.courseList[this.courseIndex].courseTimeList.map((v) => this.$moment(v.courseDate).format("YYYY-MM-DD")) + ) + val.forEach((v) => { + if (!ctList.has(v)) { + this.formData.courseList[this.courseIndex].courseTimeList.push({ + courseDate: v, + courseTime: null + }) + } + }) + this.formData.courseList[this.courseIndex].courseTimeList = this.formData.courseList[this.courseIndex].courseTimeList.filter((v) => { + return val.includes(this.$moment(v.courseDate).format("YYYY-MM-DD")) + }) + this.formData.courseList[this.courseIndex].courseTimeList.sort((a, b) => { + return Date.parse(a["courseDate"]) - Date.parse(b["courseDate"]) + }) + }, + //设置课程时间确定 + doConfirmSetUpCourse() { + const courseTableData = this.formData.courseList[this.courseIndex].courseTimeList + if (courseTableData.length === 0) { + this.$message.warning("请填写时间!") + return + } + if (courseTableData && courseTableData.length > 0) { + const valid = courseTableData.every((v) => v.courseStartTime && v.courseEndTime && v.courseStartTime < v.courseEndTime) + if (!valid) { + this.$message.warning("时间填写不完整或者有误!") + return + } + this.setUpCourseDialog = false + } + }, + onOpen(formData, index) { + this.formData = formData + this.courseIndex = index + if (!this.formData.activityTime || this.formData.activityTime.length === 0) { + this.$message.warning("请先设置活动起止时间") + return + } + this.courseIndex = index + this.setUpCourseDialog = true + }, + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js new file mode 100644 index 0000000..8b33a6c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js @@ -0,0 +1,302 @@ + +const customForm = { + template: /*language=HTML*/ ` +
+ + + + 分工会人数限制 + + + + 设置分工会人数限制 + + + 已设置 + + 未设置 + + + + + + 承办工会 + + + + + + + + + + + 对内报名时间 + + + + + + + + + 是否签到 + + + + 签到 + 不签到 + + + + + + + 签到方式 + + + + 扫描二维码 + 被扫 + GPS定位签到 + + + + + + + 地点坐标 + + + 设置签到点 + + + + + + 是否领取礼品 + + + + 领取 + 不领取 + + + + + + + 领取方式 + + + + 扫描二维码 + 面对面确认 + + + + + + + 报名方式 + + + + 报名人员减少模式 + 候补模式 + + + + + + 候补数量 + + + + + + + + + + 可选条件 + + + 设置可选条件 + + + + + + 详细信息 + + + + + + +
+ 取 消 + 保 存 +
+
+ + + + + 确 定 + + + + + +
+ 取消 + 确定 +
+
+ + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + moreInfoDrawer: false, + unionList: [], + formData: {}, + moreInfoRow: {}, + moreInfoIndex: 0, + + mapDialog: false, + mapIndex: 0, + + // 条件构造器相关 + conditionStructureDialogVisible: false, + // 可选字段列表 + fieldOptions: [ + {label: "姓名", value: "username"}, + {label: "工号", value: "loginname"}, + {label: "性别", value: "sex"}, + {label: "年龄", value: "age"}, + {label: "婚姻状况", value: "marriage"}, + {label: "在职状态", value: "userState"}, + {label: "编制类别", value: "preparedBy"}, + {label: "教职工类别", value: "personType"}, + ], + + conditionGroup: { + logic: "AND", + conditions: [], + groups: [] + }, + + // 条件构造器相关 + currentCourseIndex: -1, // 当前编辑的课程索引 + subjectMoneyIndex: null, + hospitalIndex: null + } + }, + components: { + "union-form": unionForm, + "map-container": httpVueLoader("/components/plugins/mapContainer/MapContainer.vue?v=1.0.1"), + }, + methods: { + removeRootGroup() { + // 重置根条件组 + this.conditionGroup = { + logic: "AND", + conditions: [], + groups: [] + } + }, + openCnd(moreInfoIndex) { + this.currentCourseIndex = moreInfoIndex; + this.conditionStructureDialogVisible = true + const currentCourse = this.formData.courseList[moreInfoIndex]; + if (currentCourse.matchCnd) { + this.conditionGroup = JSON.parse(JSON.stringify(currentCourse.matchCnd)); + } else { + this.conditionGroup = { + logic: "AND", + conditions: [], + groups: [] + } + } + // this.$refs.conditionStructureDialog.onOpen(row.matchCnd ? row.matchCnd : null) + }, + // 条件构造器确认 + confirmCnd() { + if (this.currentCourseIndex >= 0) { + this.$set( + this.formData.courseList[this.currentCourseIndex], + 'matchCnd', + JSON.parse(JSON.stringify(this.conditionGroup)) + ); + } + this.conditionStructureDialogVisible = false; + this.currentCourseIndex = -1; + }, + openMap(index) { + this.mapIndex = index + this.mapDialog = true + }, + openSetUpUnionLimit(index) { + this.$refs.unionFormRef.onOpen(this.formData, index) + }, + async onOpen(formData, chooseRow, index) { + this.formData = formData + this.moreInfoRow = chooseRow + this.moreInfoIndex = index + this.unionList = await this.$businessTool.listUnion() + this.moreInfoDrawer = true + }, + addCondition(val) { + // 保存条件到对应的课程 + if (this.currentCourseIndex >= 0) { + this.$set( + this.formData.courseList[this.currentCourseIndex], + 'matchCnd', + val + ); + } + + this.currentCourseIndex = -1; + } + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html new file mode 100644 index 0000000..7d03454 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html @@ -0,0 +1,212 @@ + + + + +
+ + + + + + + + + + + + + + + + 新建活动 + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + 关 闭 + +
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js new file mode 100644 index 0000000..d440f17 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js @@ -0,0 +1,111 @@ +const info = { + template: /*language=HTML*/ ` +
+ + + + {{viewData.activityName}} + {{viewData.year}} + {{$moment(viewData.createdAt).format('YYYY-MM-DD HH:mm:ss')}} + {{viewData.activityStartTime}} + {{viewData.activityEndTime}} + {{viewData.activitySignUpStartTime}} + {{viewData.activitySignUpEndTime}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 关 闭 + + + + +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + trainType: '', + viewData: {}, + courseTimeListDialog: false, + courseTimeList: [], + + viewMapDialog: false, + } + }, + methods: { + initData(id) { + this.$axios.post("/platform/fellowship/manage/findOne", { id: id }) + .then((resp) => { + if (resp.code === 0) { + this.viewData = resp.data + const type = this.dict.type.FELLOWSHIP_TYPE.find((o) => o.code === resp.data.trainType) + this.trainType = type?.name || "" + } + }) + }, + openViewCourseTime(courseTimeList) { + this.courseTimeList = courseTimeList + this.courseTimeListDialog = true + }, + openViewMap(point) { + if (!Array.isArray(point)) { + this.$message.warning("没有设置点位,无法通过地图查看") + return + } + this.viewMapDialog = true + this.$nextTick(() => { + viewMap = new AMap.Map("viewMap", { + resizeEnable: true, + center: point, + zoom: 16 + }) + if (viewMarker) { + viewMap.remove(viewMarker) + } + viewMarker = new AMap.Marker({ + position: point, + offset: new AMap.Pixel(-13, -30) + }) + viewMap.add(viewMarker) + viewMap.setFitView(null, false, [150, 60, 100, 60]) + }) + }, + }, + style: /*language=CSS*/ ` + /deep/ .el-button--text { + padding: 0; + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js new file mode 100644 index 0000000..c96de11 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js @@ -0,0 +1,84 @@ +const makeQrcode = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + + + + + + + + + 关 闭 + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + courseDialog: false, + trainType: "", + courseList: [], + } + }, + methods: { + initData(row) { + this.courseList = row.courseList + const type = this.dict.type.FELLOWSHIP_TYPE.find((o) => o.code === row.trainType) + this.trainType = type?.name || "培训班" + this.courseDialog = true + }, + makeCourseCode(row) { + const url = '/platform/fellowship/mine/drivingScan' + const data = url + '?courseId=' + row.id + console.log(data) + const content = jrQrcode.getQrBase64(data) + let image = new Image() + image.src = content + let viewer = new Viewer(image, { + zIndex: 99999999, + }) + viewer.show() + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js new file mode 100644 index 0000000..b12becb --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js @@ -0,0 +1,221 @@ +const unionForm = { + template: /*language=HTML*/ ` +
+ +
+
分段设置
+
+ 应用分段设置 +
+
+ + + + + + + + + + + + + + + + + +
+ ({{index+1}}). + {{item}} +
+
+ +
+
比例设置
+
+ 一键比例: + + 应用比例设置 +
+
+ + + + + + + + + + + + +
+ 限制总人数:{{summaryCount}}人 +
+ 清空分工会人数限制 + 取消 + 确定 +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + formData: {}, + unionLimitIndex: 0, + setUpUnionLimitDialog: false, + unionList: [], + unionUserNumCalc: [{}], + unionUserNumOneKeyRatio: null, + summaryCount: 0, + } + }, + computed: { + unionUserNumCalcTips() { + return this.unionUserNumCalc.map((v) => { + return ( + (v.startNum ? v.startNum : "?") + + "-" + + (v.endNum ? v.endNum : "?") + + "人的分工会,限报" + + (v.resultNum ? v.resultNum : "?") + + "人" + ) + }) + } + }, + methods: { + calSummaryCount() { + const array = this.formData.courseList[this.unionLimitIndex].unionLimit + if (array) { + this.summaryCount = array.reduce((prev, curr) => { + const value = Number(curr.limitCount) + if (!isNaN(value)) { + return prev + curr.limitCount + } else { + return prev + } + }, 0) + } + }, + async onOpen(formData, index) { + this.unionList = await this.$businessTool.listUnion() + this.formData = formData + this.unionLimitIndex = index + this.setUpUnionLimitDialog = true + if ( + !this.formData.courseList[this.unionLimitIndex].unionLimit || + this.formData.courseList[this.unionLimitIndex].unionLimit.length === 0 + ) { + const resp = await this.$axios.get("/platform/fellowship/manage/getUnionLimit", { + activityScopeId: this.formData.activityGroupId + }) + if (resp.code === 0) { + this.$set(this.formData.courseList[this.unionLimitIndex], "unionLimit", resp.data) + } + } + this.summaryCount = this.formData.courseList[this.unionLimitIndex].unionLimit.reduce((prev, curr) => { + const value = Number(curr.limitCount) + if (!isNaN(value)) { + return prev + curr.limitCount + } else { + return prev + } + }, 0) + }, + unionLimitQuickSetting() { + this.unionUserNumCalc.forEach((v, i) => { + const startNum = v.startNum + const endNum = v.endNum + const resultNum = v.resultNum + if (startNum > endNum) { + this.$message.warning("第" + (i + 1) + "行设置错误") + } else { + this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((x) => { + if (x.teacherCount >= startNum && x.teacherCount <= endNum) { + x.limitCount = resultNum + } + }) + this.calSummaryCount() + } + }) + }, + doConfirmSetUpUnionLimit() { + this.setUpUnionLimitDialog = false + }, + //应用比例设置 + applyScaleSettings() { + this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((v) => { + v.limitCount = parseFloat(((v.teacherCount * this.unionUserNumOneKeyRatio) / 100).toFixed(0)) + if (v.ratio) { + v.limitCount = parseFloat(((v.teacherCount * v.ratio) / 100).toFixed(0)) + } + }) + this.calSummaryCount() + }, + async clearUnionLimit() { + const confirm = await this.$confirm("确定要清空分工会人数限制吗, 是否继续?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + if ("confirm" === confirm) { + this.formData.courseList[this.unionLimitIndex].unionLimit = [] + this.unionUserNumOneKeyRatio = null + this.unionUserNumCalc = [{}] + this.setUpUnionLimitDialog = false + } + }, + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html new file mode 100644 index 0000000..b3db951 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html @@ -0,0 +1,156 @@ + + + + +
+ + + + + + + + + + + + + + + + 导出报名人员 + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js new file mode 100644 index 0000000..e50f130 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js @@ -0,0 +1,98 @@ +const info = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + {{key}} + + + + + + + + + + + + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + registerUserTableData: [], + registerUserTableColumns: [ + { label: "姓名", prop: "username" }, + { label: "工号", prop: "loginname" }, + { label: "单位", prop: "unitName" }, + { label: "分工会", prop: "unionName" }, + { label: "联系方式", prop: "mobile" }, + { label: "报名时间", prop: "signUpTime" }, + { label: "报名状态", prop: "state" } + ], + cloneTableColumns: [ + {label: '姓名', prop: 'username'}, + {label: '工号', prop: 'loginname'}, + {label: '单位', prop: 'unitName'}, + {label: '分工会', prop: 'unionName'}, + {label: '联系方式', prop: 'mobile'}, + {label: '报名时间', prop: 'signUpTime'}, + {label: '报名状态', prop: 'state'}, + ], + userSignInfo: {}, + clickRow: {} + } + }, + methods: { + async onOpen(row) { + this.clickRow = row + const resp_register = await this.$axios.post(loc() + "/registerUserList", {courseId: row.id}) + this.registerUserTableData = resp_register.data + const resp_signInfo = await this.$axios.post(loc() + "/getSignInfo", {courseId: row.id}) + this.userSignInfo = resp_signInfo.data + const resp_columnInfo = await $.get(loc() + '/getTaleColumnInfo', {courseId: row.id}) + if (resp_columnInfo.data) { + this.registerUserTableColumns = [] + this.registerUserTableColumns = this.cloneTableColumns.concat(resp_columnInfo.data) + } + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js new file mode 100644 index 0000000..4b3012b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js @@ -0,0 +1,354 @@ +const basicForm = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + 携带 + 不携带 + + + + + 纳入 + 不纳入 + + + + + 纳入 + 不纳入 + + + + +
+
+ 报名填写字段 + + 注:移动端报名时字段的显示顺序会按照下面表格中的序号进行排列、字段编码不能重复 + +
+
+ + + 添加 + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 取 消 + 确 定 +
+ + + + + + + + + + + +
+ 取 消 + 确 定 +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + formData: { + mobileSignColumnList: [{ isRequired: false }], + isBringFamily: false, + isAddFamily: false, + selfAddFamily: true, + }, + rules: { + typeName: [{ required: true, message: "请输入类型名称", trigger: ["change", "blur"] }], + code: [{ required: true, message: "请输入类型编码", trigger: ["change", "blur"] }], + isBringFamily: [{ required: true, message: "请选择是否携带家属", trigger: ["blur", "change"] }], + isAddFamily: [{ required: true, message: "请选择家属是否纳入总人数", trigger: ["blur", "change"] }] + }, + columnTypeOptions: [], + columnFormTypeList: [], + clickRow: {}, + paramFormRules: { + selectValues: [{ required: true, message: "请选择选项列表", trigger: ["blur"] }], + fileType: [{ required: true, message: "请选择文件类型", trigger: ["blur"] }], + fileNumber: [{ required: true, message: "请输入文件个数", trigger: ["blur", "change"] }] + }, + detailedParamsVisible: false, + } + }, + methods: { + isBringFamilyInput(o) { + this.$set(this.formData, "isAddFamily", o === true ? false : null) + if (o === true) { + this.formData.mobileSignColumnList.unshift({ + columnName: "携带亲属人数", + columnCode: "xdqsrs", + columnFormType: "INPUT", + columnType: "INT", + isRequired: true + }) + } else { + this.formData.mobileSignColumnList.forEach((item, index) => { + if (item.columnCode === "xdqsrs" && this.formData.isBringFamily === false) { + this.formData.mobileSignColumnList.splice(index, 1) + } + }) + } + }, + columnFormTypeChange(val, index) { + if (val === "FILE") { + this.formData.mobileSignColumnList[index].columnType = "JSON" + this.formData.mobileSignColumnList[index].isDisabled = true + } else { + // this.formData.mobileSignColumnList[index].columnType = "" + this.formData.mobileSignColumnList[index].isDisabled = false + } + }, + doHandle() { + if (this.formData.id) { + this.doEdit() + } else { + this.doAdd() + } + }, + async doDetailParams() { + const isValid = await this.$refs["paramForm"].validate() + if (isValid) { + this.detailedParamsVisible = false + } + }, + openDetailedParams(row, index) { + this.clickRow = row + this.detailedParamsVisible = true + if (this.$refs["paramForm"]) this.$refs["paramForm"].clearValidate() + }, + doAdd() { + this.$refs["addForm"].validate((valid) => { + if (valid) { + const newListLength = new Set(this.formData.mobileSignColumnList.map((item) => item.columnCode)).size + const listLength = this.formData.mobileSignColumnList.length + if (listLength > newListLength) { + this.$message.warning('字段编码不能重复') + return + } + const cloneData = clone(this.formData) + this.$axios.post(loc() + "/doAdd", { data: JSON.stringify(cloneData) }).then((res) => { + if (res.code === 0) { + this.$message.success(res.msg) + this.$emit('refresh') + } else { + this.$message.error(res.msg) + } + }) + } + }) + }, + doEdit() { + this.$refs["addForm"].validate((valid) => { + if (valid) { + const newListLength = new Set(this.formData.mobileSignColumnList.map((item) => item.columnCode)).size + const listLength = this.formData.mobileSignColumnList.length + if (listLength > newListLength) { + this.$message.warning('字段编码不能重复') + return + } + const cloneData = clone(this.formData) + cloneData.mobileSignColumnList = JSON.stringify(cloneData.mobileSignColumnList) + this.$axios.post(loc() + "/doEdit", cloneData).then((res) => { + if (res.code === 0) { + this.$message.success(res.msg) + this.$emit('refresh') + } else { + this.$message.error(res.msg) + } + }) + } + }) + }, + async getColTypeOptions() { + const resp = await this.$axios.get(loc() + "/getColumnType") + this.columnTypeOptions = resp.data + }, + async getEnumOptions() { + const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ColumnFormTypeEnum" }) + return resp.data + }, + initData(row) { + if(row && row.id) { + this.formData = JSON.parse(JSON.stringify(row)) + if (!this.formData.mobileSignColumnList || !Array.isArray(this.formData.mobileSignColumnList)) { + this.formData.mobileSignColumnList = [{ isRequired: false }] + } else { + this.formData.mobileSignColumnList.forEach((item) => { + item.isDisabled = item.columnFormType === "FILE" + }) + } + } else { + this.formData = { + mobileSignColumnList: [{ isRequired: false }], + isBringFamily: false, + isAddFamily: false, + selfAddFamily: true, + } + if (this.$refs["addForm"]) this.$refs["addForm"].resetFields() + } + }, + }, + async created() { + await this.getColTypeOptions() + this.columnFormTypeList = await this.getEnumOptions() + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html new file mode 100644 index 0000000..6d74bf8 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html @@ -0,0 +1,120 @@ + + + + +
+ + + + + + +
+ + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html new file mode 100644 index 0000000..6f18421 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html @@ -0,0 +1,138 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js new file mode 100644 index 0000000..753a54c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js @@ -0,0 +1,226 @@ +const userInfo = { + template: /*language=HTML*/ ` +
+
{{ registerCourse.courseName + '报名人员' }}
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + 注:如单选为灰色选择不了,则表示对应的{{ trainType }}人数已满!候补报名不做调整。 + + + + + + + + + + + + + 取 消 + 确 定 + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + afterAdjustCourse: "", + adjustDialogVisible: false, + unionList: [], + unitList: [], + registerForm: { + unionId: "", + unitId: "" + }, + registerCourse: {}, + courseList: [], + userInfo: {}, + chooseRow: {}, + registerUserTableData: [], + registerUserTableColumns: [ + { label: "姓名", prop: "username" }, + { label: "工号", prop: "loginname" }, + { label: "单位", prop: "unitName" }, + { label: "分工会", prop: "unionName" }, + { label: "联系方式", prop: "mobile" }, + { label: "报名时间", prop: "signUpTime" }, + { label: "报名状态", prop: "state" } + ], + trainType: '', + activity: {}, + } + }, + methods: { + async onOpen(row, activity) { + this.registerCourse = row + this.registerForm.courseId = row.id + this.activity = activity + const resp_register = await this.$axios.post(loc() + "/registerUserList", this.registerForm) + this.registerUserTableData = resp_register.data + + const type = this.dict.type.FELLOWSHIP_TYPE.find(o => o.code === activity.trainType) + this.trainType = type?.name || "培训班" + }, + getCurrentRow(row) { + this.chooseRow = row + }, + async doAdjust() { + if (!this.afterAdjustCourse) { + this.$message.warning("请选择要调整的" + this.trainType + "!") + return + } + this.$confirm( + "您确定要将" + + "" + + this.userInfo.username + + "" + + "的报名信息调整到" + + "" + + this.chooseRow.courseName + + "" + + "中吗?", + "提示", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + dangerouslyUseHTMLString: true + } + ) + .then(async () => { + const loading = this.$loading({ + lock: true, + text: "努力调整中,感谢您的耐心等待。。。", + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)" + }) + const resp = await this.$axios.post(loc() + "/adjust", { + activityId: this.activity.id, + oldCourseId: this.registerCourse.id, + newCourseId: this.afterAdjustCourse, + userId: this.userInfo.userId + }) + loading.close() + if (resp.code === 0) { + this.$message.success(resp.msg) + this.adjustDialogVisible = false + await this.registerSearch() + this.$emit("refresh", null) + } else { + this.$message.warning(resp.msg) + } + }) + .catch(() => {}) + }, + async adjust(o) { + this.userInfo = o + this.afterAdjustCourse = "" + await this.getCourse(this.activity.id) + this.adjustDialogVisible = true + }, + deleteSignUser(o) { + this.$confirm("您确定要删除" + "" + o.username + "" + "的报名信息吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + dangerouslyUseHTMLString: true + }) + .then(async () => { + const resp = await this.$axios.post(loc() + "/deleteSignUser", { + activityId: this.activity.id, + courseId: this.registerCourse.id, + userId: o.userId + }) + if (resp.code === 0) { + this.$message.success(resp.msg) + await this.registerSearch() + this.$emit("refresh", null) + } else { + this.$message.warning(resp.msg) + } + }) + .catch(() => {}) + }, + async registerSearch() { + this.registerForm.courseId = this.registerCourse.id + const resp_register = await $.get(loc() + "/registerUserList", this.registerForm) + this.registerUserTableData = resp_register.data + }, + async getCourse(val) { + const {data} = await this.$axios.post(loc() + "/getCourse", {activityId: val}) + this.courseList = data + }, + async getUnitList() { + this.unitList = await this.$businessTool.listUnit(this.registerForm.unionId) + } + }, + async created() { + this.unionList = await this.$businessTool.listUnion() + this.unitList = await this.$businessTool.listUnit(this.registerForm.unionId) + }, + style: /*language=CSS*/ ` + /deep/ .adjustDialog .el-radio__label { + display: none; + } + /deep/ .adjustDialog .el-dialog__body { + max-height: 600px; + overflow-y: auto; + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html new file mode 100644 index 0000000..07296de --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html @@ -0,0 +1,235 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + 补充人员 + 导出签到名单 + 导出领取名单 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + 确 定 + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/benefit/shop/buyInfo.js b/src/main/resources/views/platform/zhgh/benefit/shop/buyInfo.js index 0798ef1..b7f433d 100644 --- a/src/main/resources/views/platform/zhgh/benefit/shop/buyInfo.js +++ b/src/main/resources/views/platform/zhgh/benefit/shop/buyInfo.js @@ -2,15 +2,14 @@ const BUY_INFO = { /*language=HTML*/ template: ` - - + :append-to-body="true" + :modal-append-to-body="false" + :close-on-click-modal="false" + :visible.sync="dialogVisible" + title="收货地址" + width="70%"> + + @@ -18,8 +17,10 @@ const BUY_INFO = { @@ -173,6 +187,7 @@ const BUY_INFO = { }, onClose() { this.$emit("close_cart") + this.dialogVisible = false }, openAddress() { if (this.icon == "el-icon-arrow-right el-icon--right") { @@ -219,7 +234,7 @@ const BUY_INFO = { }) }, async doDefault(row) { - const resp = await this.$axios.post("/platform/benefit/address/doDefault", { id: row.id }) + const resp = await this.$axios.post("/platform/benefit/address/doDefault", {id: row.id}) if (resp.code === 0) { this.getAddress() this.$message({ @@ -279,7 +294,7 @@ const BUY_INFO = { cancelButtonText: "取消", type: "warning" }).then(async () => { - const resp = await this.$axios.post("/platform/benefit/shop/deleteCart", { id: id }) + const resp = await this.$axios.post("/platform/benefit/shop/deleteCart", {id: id}) if (resp.code === 0) { this.getCart() this.$message({ @@ -313,18 +328,21 @@ const BUY_INFO = { text-overflow: ellipsis; /* 用省略号表示被隐藏的部分 */ max-width: 200px; /* 设置最大宽度以限制文本的显示长度 */ } + .price-show { font-weight: bold; font-size: 27px; color: #E1140A; } - .cart-price{ + + .cart-price { font-size: 16px; color: #e2231a; font-family: verdana; font-weight: 700; } - .desc{ + + .desc { color: #A2A2A2; font-size: 14px; margin-top: 8px; @@ -336,42 +354,50 @@ const BUY_INFO = { .shopCart { .table { position: relative; - .el-input__inner { + + .el-input__inner { text-align: center; } - .el-input-group__append { + + .el-input-group__append { padding: 0 15px; } - .el-input-group__prepend { + + .el-input-group__prepend { padding: 0 15px; } + .shopImg { width: 100%; height: 100px; } + .price, .shop { color: #000733; } + .count { color: #bfa548; } - .el-checkbox__inner { + + .el-checkbox__inner { width: 20px; height: 20px; border-radius: 50%; } - .el-checkbox__inner::after { + .el-checkbox__inner::after { left: 7px; top: 3px; } - .el-checkbox__input.is-indeterminate .el-checkbox__inner::before { + + .el-checkbox__input.is-indeterminate .el-checkbox__inner::before { top: 7px; } } } - + .shopCart .table { margin-top: 50px; @@ -410,8 +436,7 @@ const BUY_INFO = { } - - .shopCart .tab le .el-checkbox__inner::after { + .shopCart .tab le .el-checkbox__inner::after { left: 7px; top: 3px; } @@ -421,7 +446,7 @@ const BUY_INFO = { } .el-empty__image { - width: 500px; + width: 500px; } ` -} +}; diff --git a/src/main/resources/views/platform/zhgh/benefit/shop/index.html b/src/main/resources/views/platform/zhgh/benefit/shop/index.html index d72e840..2f943b0 100644 --- a/src/main/resources/views/platform/zhgh/benefit/shop/index.html +++ b/src/main/resources/views/platform/zhgh/benefit/shop/index.html @@ -13,10 +13,10 @@ layout("/layouts/platform.html"){ a { text-decoration: none; } - a:link, + /* a:link, a:visited { color: #5e5e5e; - } + }*/ /* END */ /* 左侧分类菜单 */ @@ -265,15 +265,19 @@ layout("/layouts/platform.html"){ + + + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/honor/basic/index.html b/src/main/resources/views/platform/zhgh/dayofficework/honor/basic/index.html index ff653da..5a4d4db 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/honor/basic/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/honor/basic/index.html @@ -74,7 +74,7 @@ layout("/layouts/platform.html"){ - + - + 暂无 diff --git a/src/main/resources/views/platform/zhgh/dayofficework/honor/registration/index.html b/src/main/resources/views/platform/zhgh/dayofficework/honor/registration/index.html index d5de5db..ae26ee5 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/honor/registration/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/honor/registration/index.html @@ -269,8 +269,15 @@ layout("/layouts/platform.html"){ - + + @@ -317,7 +324,8 @@ layout("/layouts/platform.html"){ }, doBack() { if (GetQueryString("id")) { - this.$store.dispatch("pjaxRoute", "/platform/honor/manage") + pjaxReplace("/platform/honor/manage") + // this.$store.dispatch("pjaxRoute", "/platform/honor/manage") } }, doSubmit() { @@ -405,22 +413,24 @@ layout("/layouts/platform.html"){ }, async findData(id) { const resp = await this.$axios.post(loc() + "/findData", {id: id}) - const data1 = resp.data - this.formData = resp.data + const data1 = clone(resp.data) + this.formData = clone(resp.data) if (this.formData.userId && this.formData.userId !== "") { await this.userRemoteMethod(this.formData.userName) } else { this.$set(this.formData, "userName", this.formData.userName) } - await this.honorTypeChange(data1.honorType) - /* this.$set(this.formData, "prize", data1.prize) + await this.honorTypeChange(resp.data.honorType) + this.$set(this.formData, "prize", data1.prize) + /* this.$set(this.formData, "honorLevel", data1.honorLevel) this.$set(this.formData, "political", data1.political) this.$set(this.formData, "post", data1.post) this.$set(this.formData, "title", data1.title) this.$set(this.formData, "unionId", data1.unionId) this.$set(this.formData, "unionLeader", data1.unionLeader)*/ - console.log(this.formData) + console.log(data1) + }, async initData() { await this.getHonorType() diff --git a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/apply/index.html b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/apply/index.html index 046b3fb..bdc2f47 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/apply/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/apply/index.html @@ -40,8 +40,8 @@ layout("/layouts/platform.html"){ - - + + {{item.name}} @@ -201,6 +201,7 @@ layout("/layouts/platform.html"){ placeholder="请填写发票号码,如有多个请用逗号分隔"> + @@ -223,6 +224,11 @@ layout("/layouts/platform.html"){ > + + + + + @@ -258,6 +264,7 @@ layout("/layouts/platform.html"){ condolenceTime: [{required: true, message: '请选择慰问时间', trigger: ["change", "blur"]}], invoiceNumber: [{required: true, message: '请填写发票张数', trigger: ["change", "blur"]}], invoice: [{required: true, message: '请填写发票号码', trigger: ["change", "blur"]}], + applySign: [{required: true, message: '请签字', trigger: ["change", "blur"]}], paymentNotes: [{required: true, message: '请填写支付内容', trigger: ["change", "blur"]}], }, chooseType: {}, diff --git a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/collect/index.html b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/collect/index.html index 02381bc..8d79a8d 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/collect/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/collect/index.html @@ -13,25 +13,32 @@ layout("/layouts/platform.html"){ - - - + + + - - - - + + + + + @@ -42,6 +49,10 @@ layout("/layouts/platform.html"){ > + + + @@ -68,6 +79,13 @@ layout("/layouts/platform.html"){ + + + @@ -80,7 +98,9 @@ layout("/layouts/platform.html"){ @@ -95,13 +115,12 @@ layout("/layouts/platform.html"){ - diff --git a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/info.js b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/info.js index 01215c8..eb6ec77 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/info.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/info.js @@ -25,7 +25,7 @@ const unionReimburseInfo = { :value="viewData.reimburseProject"> - + @@ -54,6 +54,10 @@ const unionReimburseInfo = { 暂无附件 + + + diff --git a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/mine/index.html b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/mine/index.html index 848ec56..04c1d83 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/mine/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/unionReimburse/mine/index.html @@ -75,13 +75,15 @@ layout("/layouts/platform.html"){ size="small"> - + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/auditInfo.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/auditInfo.js index add1e4c..9f2cf1a 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/auditInfo.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/auditInfo.js @@ -42,7 +42,6 @@ const auditInfo = {
{{ task.displayName }}
- {{ task.taskFormData.userName @@ -50,8 +49,10 @@ const auditInfo = { {{ task.finishTime }} - + {{processSubmitTypeEnums.find(v=>v.name===task.ext.tf_type)?.message}} + + {{ task.taskFormData.opinion }} @@ -76,7 +77,8 @@ const auditInfo = { loading: true, search: "", tableKey: "", - activeName: "1" + activeName: "1", + processSubmitTypeEnums:[] } }, methods: { @@ -93,6 +95,7 @@ const auditInfo = { this.visible = true; this.findOne(); this.getDoneTasks(); + this.getEnumOptions() }, // 获取已办任务审批记录 getDoneTasks() { @@ -102,6 +105,10 @@ const auditInfo = { } }) }, + async getEnumOptions() { + const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ProcessSubmitTypeEnum" }) + this.processSubmitTypeEnums=resp.data + }, // 查看流程图 openChart() { this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwFzrAudit.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwFzrAudit.html index fdfbabc..576c8aa 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwFzrAudit.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/dwFzrAudit.html @@ -200,6 +200,11 @@ layout("/layouts/platform.html"){ this.$message.success(res.msg) this.doSearch() this.$refs.guava.index() + this.$axios.post("/platform/teacherCongress/delegate/push/dwFzrAudit/sms", { + "tf_type": tf_type, + "instanceId": this.formData.instanceId + }) + } }) }) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html index 0bf53c4..c938a13 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html @@ -46,8 +46,6 @@ layout("/layouts/platform.html"){ 导出 { - const loading = createLoading('正在提交中') - this.$axios.post('/platform/teacherCongress/delegate/push/batchSubmit', { - sessionId: this.pageForm.sessionId - }).then(resp => { - if (resp.code === 0) { - this.$message.success(resp.msg) - this.doSearch() - this.$refs.tableRef.clearSelection() - } - }).finally(() => { - loading.close() - }) - - }) - }, listUnion() { this.$businessTool.listUnion().then((res) => { this.unionOptions = res diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-progress.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-progress.js index eed09fa..67bb533 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-progress.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/push-progress.js @@ -493,18 +493,20 @@ const pushProgress = { methods: { async refreshData(sessionId, teacherMeetName, unionId, submitType) { this.teacherMeetName = teacherMeetName - const {code, data} = await $.get('/platform/teacherCongress/delegate/push/selfUnionPushMetric', { + this.$axios.post('/platform/teacherCongress/delegate/push/selfUnionPushMetric', { sessionId: sessionId, unionId: unionId, submitType: submitType - }) - if (code === 0) { - if (data) { - this.metrics = data - } else { - this.$message.error('暂未分配名额') + }).then(resp=>{ + if (resp.code === 0) { + if (resp.data) { + this.metrics = resp.data + } else { + this.$message.error('暂未分配名额') + } } - } + }) + } }, style: /*language=CSS*/ ` diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/unionFzrAudit.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/unionFzrAudit.html new file mode 100644 index 0000000..f36c729 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/unionFzrAudit.html @@ -0,0 +1,293 @@ + +
+ + + + + + + + + + + + + + + + + + + + + 正式代表提交上报 + + + + 全部 + 机关党群 + 机关行政 + + + 已审核 + 未审核 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/write.js b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/write.js index 5d68136..2d29eed 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/write.js +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/write.js @@ -242,8 +242,9 @@ const write = { {{ task.finishTime }} - + {{processSubmitTypeEnums.find(v=>v.name===task.ext.tf_type)?.message}} + {{ task.taskFormData.opinion }} @@ -311,6 +312,7 @@ const write = { }, sessionOptions: [], representativeTypeList: ['正式代表', '列席代表'], + processSubmitTypeEnums:[] } }, computed: { @@ -375,7 +377,10 @@ const write = { } } }, - + async getEnumOptions() { + const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ProcessSubmitTypeEnum" }) + this.processSubmitTypeEnums=resp.data + }, async initInfo() { const {code, data} = await $.get('/platform/teacherCongress/delegate/push/write/info', { sessionId: this.formData.sessionId @@ -385,6 +390,7 @@ const write = { if (this.isSelected) { this.formData = data.delegate this.getDoneTasks() + this.getEnumOptions() } } }, diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/excellentRecuperation/summary/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/excellentRecuperation/summary/index.html index c25720d..99106e5 100644 --- a/src/main/resources/views/platform/zhgh/staffbenefit/excellentRecuperation/summary/index.html +++ b/src/main/resources/views/platform/zhgh/staffbenefit/excellentRecuperation/summary/index.html @@ -19,6 +19,7 @@ layout("/layouts/platform.html"){ style="width: 100%" :clearable="false" value-format="yyyy" + @change="getActivityList" placeholder="请选择年度" > @@ -35,6 +36,28 @@ layout("/layouts/platform.html"){ > + + + + + + + + + + @@ -67,6 +90,7 @@ layout("/layouts/platform.html"){ +