From 6b9beb7a5e9256337e961880ca9b33137a4aaaff Mon Sep 17 00:00:00 2001 From: zhangrui Date: Thu, 14 May 2026 16:59:22 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=99=E6=A8=9F=E5=B7=A5=E4=BC=9A=E8=AE=B2?= =?UTF-8?q?=E5=A0=82=EF=BC=9A=201=E3=80=81=E6=B4=BB=E5=8A=A8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=9A=E5=BE=AE=E4=BF=A1=E4=BA=8C=E7=BB=B4=E7=A0=81?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88=202=E3=80=81=E6=B4=BB?= =?UTF-8?q?=E5=8A=A8=E6=8A=A5=E5=90=8D=E6=8E=A7=E5=88=B6=E4=B8=8D=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E4=B8=A4=E6=AC=A1=EF=BC=8C=E4=B8=80=E5=B9=B4=E4=B9=8B?= =?UTF-8?q?=E5=86=85=E4=B8=8D=E8=83=BD=E6=8A=A5=E5=90=8D=E3=80=82=E4=B8=80?= =?UTF-8?q?=E5=B9=B4=E4=B9=8B=E5=90=8E=EF=BC=8C=E8=87=AA=E5=8A=A8=E8=A7=A3?= =?UTF-8?q?=E9=99=A4=E9=99=90=E5=88=B6=E3=80=82=203=E3=80=81=E6=8A=A5?= =?UTF-8?q?=E5=90=8D=E7=BB=9F=E8=AE=A1=20=E6=9F=A5=E7=9C=8B=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=8F=B7/=E5=A7=93?= =?UTF-8?q?=E5=90=8D=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/TrainSignUpApplyController.java | 27 +- ...ainSignUpActivityStatisticsController.java | 10 +- .../service/TrainSignUpActivityService.java | 8 + .../TrainSignUpActivityStatisticsService.java | 16 +- .../impl/TrainSignUpActivityServiceImpl.java | 41 +++ ...inSignUpActivityStatisticsServiceImpl.java | 18 +- .../transact/OpinionMineController.java | 24 ++ .../opinion/service/OpinionWriteService.java | 22 +- .../service/impl/OpinionWriteServiceImpl.java | 300 +++++++++++++++++- .../trainSignUp/statistics/index.html | 28 +- .../activity/trainSignUp/statistics/info.js | 73 ++++- .../opinion/transact/mine/index.html | 16 +- 12 files changed, 512 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java index 9c1c38e3..1e733c83 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java @@ -2,8 +2,6 @@ package com.budwk.app.zhgh.activity.trainSignUp.controller.manage; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; -import cn.hutool.core.date.DateField; -import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; @@ -432,31 +430,10 @@ public class TrainSignUpApplyController { @SaCheckPermission(value = {"trainSignUp.apply", "h5.trainSignUp.apply"}, mode = SaMode.OR) @SLog(tag = "品牌活动-活动报名", msg = "判断缺席次数") public Result validSignCount(@Param("activityId") String activityId) { - // 缺席2次,就1年内不能报名 - // 查询今天,然后往前推1年,这段时间有没有缺席超过2次 - DateTime today = DateUtil.date(); - DateTime lastYear = DateUtil.offset(today, DateField.YEAR, -1); - - // 找需要签到的分活动 - List activityList = dao.query(TrainSignUpActivity.class, Cnd.where("year", "in", Lang.array(DateUtil.thisYear(), DateUtil.thisYear() - 1))); - List activityIdList = activityList.stream().map(TrainSignUpActivity::getId).toList(); - - List courses = dao.query(TrainSignUpCourse.class, Cnd.where("isMobileSign", "=", true).and("activityId", "in", activityIdList)); - List courseIdList = courses.stream().map(TrainSignUpCourse::getId).toList(); - - int count = dao.count( - TrainSignUpUserCourse.class, - Cnd.where("userId", "=", SecurityUtil.getUserId()) - .and("courseStartTime", ">", DateUtil.format(lastYear, "yyyy-MM-dd HH:mm:ss")) - .and("courseEndTime", "<", DateUtil.format(today, "yyyy-MM-dd HH:mm:ss")) - .and("isAttend", "=", false) - .and("courseId", "in", courseIdList) - ); - - if(count >= 2) { + if (trainSignUpActivityService.isAbsenceSignUpLimited(SecurityUtil.getUserId())) { return Result.error(99, "您已连续2次未签到活动,不能报名,请联系校工会"); } - return Result.success(); + return Result.success(); } @At diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/statistics/TrainSignUpActivityStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/statistics/TrainSignUpActivityStatisticsController.java index eef7906c..65ec93ec 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/statistics/TrainSignUpActivityStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/statistics/TrainSignUpActivityStatisticsController.java @@ -121,8 +121,9 @@ public class TrainSignUpActivityStatisticsController { @At @ApiOperation("报名人员列表") @SaCheckPermission("trainSignUp.statistics") - public Result registerUserList(@Param(value = "courseId") String courseId) { - return Result.success(trainSignUpActivityStatisticsService.registerUserList(courseId)); + public Result registerUserList(@Param(value = "courseId") String courseId, + @Param("keyword") String keyword) { + return Result.success(trainSignUpActivityStatisticsService.registerUserList(courseId, keyword)); } @At @@ -151,8 +152,9 @@ public class TrainSignUpActivityStatisticsController { @SaCheckPermission("trainSignUp.statistics") public Result getSignInfo(PageForm pageForm, @Param("courseId") String courseId, - String timeId) { - return Result.success(trainSignUpActivityStatisticsService.getSignInfo(pageForm, courseId, timeId)); + @Param("timeId") String timeId, + @Param("keyword") String keyword) { + return Result.success(trainSignUpActivityStatisticsService.getSignInfo(pageForm, courseId, timeId, keyword)); } @At diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java index 173a355f..afd89510 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/TrainSignUpActivityService.java @@ -110,6 +110,14 @@ public interface TrainSignUpActivityService extends BaseService registerUserList(String courseId); + List registerUserList(String courseId, String keyword); List getTaleColumnInfo(String courseId); @@ -45,10 +46,13 @@ public interface TrainSignUpActivityStatisticsService extends BaseService每个培训班每节课的上课时间 v->上课记录list + * @param pageForm 分页参数 + * @param courseId 培训班ID + * @param timeId 课次ID + * @param keyword 工号/姓名,支持模糊查询 + * @return 签到分页列表 */ - Pagination getSignInfo(PageForm pageForm, String courseId, String timeId); + Pagination getSignInfo(PageForm pageForm, String courseId, String timeId, String keyword); /** * 报名人员list 导出 diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityServiceImpl.java index 97bb8edb..3674d9d2 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityServiceImpl.java @@ -1,10 +1,14 @@ package com.budwk.app.zhgh.activity.trainSignUp.service.impl; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; 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.models.Sys_config; import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.trainSignUp.models.*; @@ -38,6 +42,10 @@ import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class TrainSignUpActivityServiceImpl extends BaseServiceImpl implements TrainSignUpActivityService { + private static final String ABSENCE_LIMIT_YEARS_CONFIG_KEY = "train_sign_up_absence_limit_years"; + private static final int DEFAULT_ABSENCE_LIMIT_YEARS = 1; + private static final int ABSENCE_LIMIT_COUNT = 2; + @Inject private TrainSignUpActivityStatisticsService statisticsService; @@ -486,6 +494,39 @@ public class TrainSignUpActivityServiceImpl extends BaseServiceImpl", DateUtil.format(limitStartTime, "yyyy-MM-dd HH:mm:ss")) + .and("courseEndTime", "<", DateUtil.format(today, "yyyy-MM-dd HH:mm:ss")) + .and("isAttend", "=", false) + .and(new Static("courseId in (select id from train_sign_up_course where isMobileSign = 1)")) + ); + return count >= ABSENCE_LIMIT_COUNT; + } + + private int getAbsenceLimitYears() { + Sys_config config = dao().fetch(Sys_config.class, ABSENCE_LIMIT_YEARS_CONFIG_KEY); + if (config == null || StrUtil.isBlank(config.getConfigValue())) { + return DEFAULT_ABSENCE_LIMIT_YEARS; + } + try { + int limitYears = Integer.parseInt(config.getConfigValue().trim()); + // 配置必须为正整数;缺失或非法时使用默认1年,避免误放开报名限制。 + return limitYears > 0 ? limitYears : DEFAULT_ABSENCE_LIMIT_YEARS; + } catch (NumberFormatException e) { + log.warn("培训报名缺席限制年限配置非法,configKey={}, configValue={}", ABSENCE_LIMIT_YEARS_CONFIG_KEY, config.getConfigValue()); + return DEFAULT_ABSENCE_LIMIT_YEARS; + } + } + @Override public void doQd(String id) { NutMap updateMap = NutMap.NEW(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityStatisticsServiceImpl.java index ab0f712f..ae4e323a 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpActivityStatisticsServiceImpl.java @@ -75,7 +75,7 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl registerUserList(String courseId) { + public List registerUserList(String courseId, String keyword) { Sql sql = Sqls.create(""" SELECT u.loginname, @@ -94,9 +94,15 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl list = listMap(sql); for (NutMap o : list) { @@ -158,7 +164,7 @@ public class TrainSignUpActivityStatisticsServiceImpl extends BaseServiceImpl { @@ -17,4 +18,19 @@ public interface OpinionWriteService extends BaseService { */ String generateOpinionCode(String sessionId,String delegationId); + /** + * 下载意见导入模板。 + * + * @param response 文件响应对象 + */ + void downloadImportTemplate(HttpServletResponse response); + + /** + * 导入意见并在校验全部通过后直接提交流程。 + * + * @param file 上传的 Excel 文件 + * @return 导入结果,包含成功数和失败明细 + */ + ExcelImportRes importOpinion(TempFile file); + } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/impl/OpinionWriteServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/impl/OpinionWriteServiceImpl.java index 28214b59..1e0fd528 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/impl/OpinionWriteServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/impl/OpinionWriteServiceImpl.java @@ -1,30 +1,54 @@ package com.budwk.app.zhgh.democratic.opinion.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; 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.model.ExcelImportRes; import com.budwk.app.base.service.impl.BaseServiceImpl; -import com.budwk.app.sys.models.Sys_dict; -import com.budwk.app.sys.services.SysDictService; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.democratic.opinion.mode.OpinionImportExcelMode; import com.budwk.app.zhgh.democratic.opinion.models.OpinionInfo; +import com.budwk.app.zhgh.democratic.opinion.models.OpinionType; import com.budwk.app.zhgh.democratic.opinion.service.OpinionWriteService; -import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; -import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; +import com.budwk.app.zhgh.democratic.teachercongress.discussiongroup.models.Teacher_congress_discussion_group; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; +import org.nutz.dao.entity.Record; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.upload.TempFile; +import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class OpinionWriteServiceImpl extends BaseServiceImpl implements OpinionWriteService { + @Inject + private FlowEngine flowEngine; + public OpinionWriteServiceImpl(Dao dao) { super(dao); } @@ -57,4 +81,270 @@ public class OpinionWriteServiceImpl extends BaseServiceImpl implem } return opinionCode; } + + @Override + public void downloadImportTemplate(HttpServletResponse response) { + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("所属讨论组", "discussionGroupName", 25)); + entities.add(new ExcelExportEntity("建议人", "suggestUserName", 20)); + entities.add(new ExcelExportEntity("建议人所属代表团", "delegationName", 25)); + entities.add(new ExcelExportEntity("所属教代会", "sessionName", 25)); + entities.add(new ExcelExportEntity("意见类别", "typeName", 20)); + entities.add(new ExcelExportEntity("意见时间", "createTime", 20)); + entities.add(new ExcelExportEntity("建议承办单位", "suggestUnits", 35)); + entities.add(new ExcelExportEntity("意见和建议", "name", 50)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, Collections.emptyList()); + CommonDownloadUtil.download("意见导入模板.xlsx", workbook, response); + } + + @Override + public ExcelImportRes importOpinion(TempFile file) { + List importRows = ExcelImportUtil.importExcel(file.getFile(), OpinionImportExcelMode.class, new ImportParams()); + List opinionList = new ArrayList<>(); + ExcelImportRes excelImportRes = new ExcelImportRes<>(); + excelImportRes.setTotalRecords(importRows.size()); + + // 先整表校验并组装入库对象;存在任意错误时不启动流程,避免导入半成功。 + for (int i = 0; i < importRows.size(); i++) { + OpinionImportExcelMode row = importRows.get(i); + if (isEmptyRow(row)) { + continue; + } + OpinionInfo opinionInfo = buildOpinionInfo(row, i); + if (StrUtil.isBlank(row.getErrMsg())) { + opinionList.add(opinionInfo); + } + } + + List errorDetails = importRows.stream() + .filter(row -> StrUtil.isNotBlank(row.getErrMsg())) + .collect(Collectors.toList()); + excelImportRes.setErrorDetails(errorDetails); + excelImportRes.setFailedCount(errorDetails.size()); + if (excelImportRes.getFailedCount() > 0) { + excelImportRes.setSuccessCount(0); + return excelImportRes; + } + + for (OpinionInfo opinionInfo : opinionList) { + submitImportedOpinion(opinionInfo); + } + excelImportRes.setSuccessCount(opinionList.size()); + return excelImportRes; + } + + private OpinionInfo buildOpinionInfo(OpinionImportExcelMode row, int rowIndex) { + List errors = new ArrayList<>(); + // 导入模板只填写业务字段,记录人固定取当前登录人并统一校验跨表关系。 + Teacher_congress_session session = fetchSession(row.getSessionName()); + if (session == null) { + errors.add("所属教代会不存在"); + } + + Teacher_congress_discussion_group discussionGroup = session == null ? null : fetchDiscussionGroup(session.getId(), row.getDiscussionGroupName()); + if (discussionGroup == null) { + errors.add("所属讨论组不存在"); + } + + Record recorderUser = fetchCurrentUser(); + if (recorderUser == null) { + errors.add("当前登录人信息不存在"); + } + if (discussionGroup != null && recorderUser != null && !isRecorderInDiscussionGroup(recorderUser, discussionGroup)) { + errors.add("当前登录人不属于所属讨论组"); + } + + Teacher_congress_delegation delegation = session == null ? null : fetchDelegation(session.getId(), row.getDelegationName()); + if (delegation == null) { + errors.add("建议人所属代表团不存在"); + } + + Teacher_congress_delegate suggestUser = session == null || delegation == null ? null : fetchDelegate(session.getId(), delegation.getId(), row.getSuggestUserName()); + if (suggestUser == null) { + errors.add("建议人不存在或不属于建议人所属代表团"); + } + + OpinionType type = fetchOpinionType(row.getTypeName()); + if (type == null) { + errors.add("意见类别不存在"); + } + + if (StrUtil.isBlank(row.getCreateTime())) { + errors.add("意见时间不能为空"); + } + + List suggestUnits = parseSuggestUnits(row.getSuggestUnits(), errors); + if (StrUtil.isBlank(row.getName())) { + errors.add("意见和建议不能为空"); + } + + if (!errors.isEmpty()) { + // Excel 行号按用户看到的表头后第一行数据计算,便于直接定位错误。 + row.setErrInfo(StrUtil.join(";", errors), rowIndex + 2); + return null; + } + + OpinionInfo opinionInfo = new OpinionInfo(); + opinionInfo.setName(StrUtil.trim(row.getName())); + opinionInfo.setBrief(StrUtil.trim(row.getName())); + opinionInfo.setTypeId(type.getId()); + opinionInfo.setSessionId(session.getId()); + opinionInfo.setCreateTime(StrUtil.trim(row.getCreateTime())); + opinionInfo.setSuggestUnits(suggestUnits); + opinionInfo.setCreateUserId(suggestUser.getUserId()); + opinionInfo.setCreateUserName(suggestUser.getUserName()); + opinionInfo.setCreateUserLoginName(suggestUser.getLoginName()); + opinionInfo.setDelegationId(delegation.getId()); + opinionInfo.setMobile(suggestUser.getMobile()); + opinionInfo.setUnitName(suggestUser.getUnitName()); + opinionInfo.setSuggestUserId(recorderUser.getString("id")); + opinionInfo.setSuggestUserName(recorderUser.getString("username")); + opinionInfo.setSuggestUserLoginName(recorderUser.getString("loginname")); + opinionInfo.setSuggestUserDelegationId(discussionGroup.getId()); + opinionInfo.setSuggestUserDelegationName(discussionGroup.getName()); + return opinionInfo; + } + + private void submitImportedOpinion(OpinionInfo opinionInfo) { + // 编号必须在逐条入库前生成,确保同一代表团连续导入时序号不会重复。 + if (StrUtil.isBlank(opinionInfo.getCode())) { + opinionInfo.setCode(generateOpinionCode(opinionInfo.getSessionId(), opinionInfo.getDelegationId())); + } + insert(opinionInfo); + Dict args = Dict.create(); + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, opinionInfo); + + ProcessInstance instance = flowEngine.startProcessInstanceByKey("JDHYJ", opinionInfo.getId(), SecurityUtil.getUserId(), args); + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } + } + + private Teacher_congress_session fetchSession(String sessionName) { + if (StrUtil.isBlank(sessionName)) { + return null; + } + return dao().fetch(Teacher_congress_session.class, + Cnd.where("fullName", "=", StrUtil.trim(sessionName)).and("delFlag", "=", false)); + } + + private Teacher_congress_discussion_group fetchDiscussionGroup(String sessionId, String discussionGroupName) { + if (StrUtil.isBlank(discussionGroupName)) { + return null; + } + return dao().fetch(Teacher_congress_discussion_group.class, + Cnd.where("sessionId", "=", sessionId) + .and("name", "=", StrUtil.trim(discussionGroupName)) + .and("delFlag", "=", false)); + } + + private Teacher_congress_delegation fetchDelegation(String sessionId, String delegationName) { + if (StrUtil.isBlank(delegationName)) { + return null; + } + return dao().fetch(Teacher_congress_delegation.class, + Cnd.where("sessionId", "=", sessionId) + .and("name", "=", StrUtil.trim(delegationName)) + .and("delFlag", "=", false)); + } + + private Teacher_congress_delegate fetchDelegate(String sessionId, String delegationId, String suggestUserName) { + if (StrUtil.isBlank(suggestUserName)) { + return null; + } + String userKey = normalizeUserKey(suggestUserName); + List delegates = dao().query(Teacher_congress_delegate.class, + Cnd.where("sessionId", "=", sessionId) + .and("delegationId", "=", delegationId) + .and("delFlag", "=", false) + .and(Cnd.exps("userName", "=", userKey).or("loginName", "=", userKey))); + return delegates.size() == 1 ? delegates.get(0) : null; + } + + private OpinionType fetchOpinionType(String typeName) { + if (StrUtil.isBlank(typeName)) { + return null; + } + String name = StrUtil.trim(typeName); + List types = dao().query(OpinionType.class, + Cnd.where("name", "=", name).or("code", "=", name).and("delFlag", "=", false)); + return types.size() == 1 ? types.get(0) : null; + } + + private List parseSuggestUnits(String suggestUnitText, List errors) { + List unitNames = new ArrayList<>(); + if (StrUtil.isBlank(suggestUnitText)) { + errors.add("建议承办单位不能为空"); + return unitNames; + } + String[] items = suggestUnitText.split("[,,]"); + for (String item : items) { + String unitName = StrUtil.trim(item); + if (StrUtil.isBlank(unitName)) { + continue; + } + ProposalUndertake undertake = dao().fetch(ProposalUndertake.class, + Cnd.where("name", "=", unitName).and("delFlag", "=", false)); + if (undertake == null) { + errors.add("建议承办单位不存在:" + unitName); + continue; + } + unitNames.add(undertake.getName()); + } + if (unitNames.isEmpty()) { + errors.add("建议承办单位不能为空"); + } + return unitNames; + } + + private Record fetchCurrentUser() { + Sql sql = Sqls.create(""" + SELECT + id, + username, + loginname + FROM vw_user + WHERE id = @userId + """); + sql.setParam("userId", SecurityUtil.getUserId()); + sql.setCallback(Sqls.callback.record()); + dao().execute(sql); + return sql.getObject(Record.class); + } + + private boolean isRecorderInDiscussionGroup(Record recorderUser, Teacher_congress_discussion_group discussionGroup) { + String userId = recorderUser.getString("id"); + String loginName = recorderUser.getString("loginname"); + String userName = recorderUser.getString("username"); + return StrUtil.equals(userId, discussionGroup.getRecorderUserId()) + || StrUtil.equals(loginName, discussionGroup.getRecorderUserCode()) + || StrUtil.equals(userName, discussionGroup.getRecorderUserName()); + } + + private String normalizeUserKey(String userText) { + String value = StrUtil.trim(userText); + if (value.contains(" - ")) { + return StrUtil.trim(StrUtil.subAfter(value, " - ", true)); + } + if (value.contains("-")) { + return StrUtil.trim(StrUtil.subAfter(value, "-", true)); + } + return value; + } + + private boolean isEmptyRow(OpinionImportExcelMode row) { + return StrUtil.isBlank(row.getDiscussionGroupName()) + && StrUtil.isBlank(row.getSuggestUserName()) + && StrUtil.isBlank(row.getDelegationName()) + && StrUtil.isBlank(row.getSessionName()) + && StrUtil.isBlank(row.getTypeName()) + && StrUtil.isBlank(row.getCreateTime()) + && StrUtil.isBlank(row.getSuggestUnits()) + && StrUtil.isBlank(row.getName()); + } } diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/index.html b/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/index.html index bb7dad2f..32f9fd70 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/index.html +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/index.html @@ -106,13 +106,14 @@ layout("/layouts/platform.html"){ }, methods: { async openSign(row) { - const resp = await this.$axios.post(loc() + "/signChange", { courseId: row.id, openOtherUnion: !row.openOtherUnion }) - if (resp.code === 0) { - this.$message.success(resp.msg) - this.doSearch() - } else { - this.$message.warning(resp.msg) - } + return this.$axios.post(loc() + "/signChange", { courseId: row.id, openOtherUnion: !row.openOtherUnion }).then((resp) => { + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } else { + this.$message.warning(resp.msg) + } + }) }, activityChange(val) { this.$nextTick(() => { @@ -130,12 +131,13 @@ layout("/layouts/platform.html"){ await this.doSearch() }, async getActivityList() { - const resp = await this.$axios.post(loc() + "/activityList", { year: this.pageForm.year }) - this.activityList = resp.data - if (this.activityList && this.activityList.length > 0) { - this.pageForm.activityId = this.activityList[0].id - this.activityChange(this.activityList[0].id) - } + return this.$axios.post(loc() + "/activityList", { year: this.pageForm.year }).then((resp) => { + this.activityList = resp.data + if (this.activityList && this.activityList.length > 0) { + this.pageForm.activityId = this.activityList[0].id + this.activityChange(this.activityList[0].id) + } + }) }, async initData() { await this.getActivityList() diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/info.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/info.js index f78709bf..69d8f891 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/info.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/statistics/info.js @@ -3,6 +3,15 @@ const info = {
+ + + + + + 查询 + 重置 + + + + + + + + 查询 + 重置 + + @@ -87,11 +105,20 @@ const info = { signUserList: [], timeId: '', pageForm: {}, + registerQueryForm: { + keyword: "" + }, + signQueryForm: { + keyword: "" + }, } }, methods: { async onOpen(row) { this.clickRow = row + this.registerQueryForm.keyword = "" + this.signQueryForm.keyword = "" + this.pageForm.pageNumber = 1 await this.registerUserList() await this.selectTimes() await this.getTaleColumnInfo() @@ -100,6 +127,14 @@ const info = { this.pageForm.pageNumber = 1 await this.selectSignUsers(this.timeId) }, + async resetRegisterQuery() { + this.registerQueryForm.keyword = "" + await this.registerUserList() + }, + async resetSignQuery() { + this.signQueryForm.keyword = "" + await this.doSearch() + }, async pageNumberChange(val) { this.pageForm.pageNumber = val await this.selectSignUsers(this.timeId) @@ -126,25 +161,41 @@ const info = { await this.selectSignUsers(this.timeList[val.index].id) }, async registerUserList() { - const res = await this.$axios.post(loc() + "/registerUserList", { courseId: this.clickRow.id }) - this.registerUserTableData = res.data + const params = { + courseId: this.clickRow.id + } + const keyword = this.registerQueryForm.keyword ? this.registerQueryForm.keyword.trim() : "" + if (keyword) { + params.keyword = keyword + } + return this.$axios.post(loc() + "/registerUserList", params).then((res) => { + this.registerUserTableData = res.data + }) }, async selectTimes() { - const res = await this.$axios.post(loc() + "/selectTimes", { courseId: this.clickRow.id }) - this.timeList = res.data - if(this.timeList.length > 0) { - await this.selectSignUsers(this.timeList[0].id) - } + return this.$axios.post(loc() + "/selectTimes", { courseId: this.clickRow.id }).then(async (res) => { + this.timeList = res.data + if(this.timeList.length > 0) { + await this.selectSignUsers(this.timeList[0].id) + } + }) }, async selectSignUsers(timeId) { this.timeId = timeId this.$set(this.pageForm, 'courseId', this.clickRow.id) this.$set(this.pageForm, 'timeId', timeId) - const res = await this.$axios.post(loc() + "/getSignInfo", this.pageForm) - if (res.code === 0) { - this.signUserList = res.data.list - this.pageForm.totalCount = res.data.totalCount + const keyword = this.signQueryForm.keyword ? this.signQueryForm.keyword.trim() : "" + if (keyword) { + this.$set(this.pageForm, 'keyword', keyword) + } else { + this.$delete(this.pageForm, 'keyword') } + return this.$axios.post(loc() + "/getSignInfo", this.pageForm).then((res) => { + if (res.code === 0) { + this.signUserList = res.data.list + this.pageForm.totalCount = res.data.totalCount + } + }) }, async getTaleColumnInfo() { const res = await $.get(loc() + '/getTaleColumnInfo', { courseId: this.clickRow.id }) diff --git a/src/main/resources/views/platform/zhgh/democratic/opinion/transact/mine/index.html b/src/main/resources/views/platform/zhgh/democratic/opinion/transact/mine/index.html index db4d46b8..f14347f4 100644 --- a/src/main/resources/views/platform/zhgh/democratic/opinion/transact/mine/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/opinion/transact/mine/index.html @@ -22,7 +22,9 @@ layout("/layouts/platform.html"){ - + + 导入意见 + + +