From 34627245ace5689a8b2ff53538906dd5ae0eafb1 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 3 Jul 2026 17:25:27 +0800 Subject: [PATCH] commit --- .../controller/SiteCugApplyController.java | 27 +++ .../controller/SiteCugManageController.java | 7 + .../controller/SiteCugRecordController.java | 24 ++ .../siteCug/model/SiteCugApply.java | 10 + .../siteCug/model/SiteCugInfo.java | 12 + .../siteCug/service/SiteCugApplyService.java | 10 + .../service/impl/SiteCugApplyServiceImpl.java | 229 +++++++++++++++++- .../dayofficework/siteCug/manage/basicForm.js | 33 +++ .../dayofficework/siteCug/record/index.html | 176 ++++++++++++-- 9 files changed, 503 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java index 2344dfcd..034dae82 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java @@ -307,6 +307,9 @@ public class SiteCugApplyController { if (item == null || StrUtil.hasBlank(item.getReserveStartTime(), item.getReserveEndTime())) { continue; } + if (isOccupiedByCurrentUser(item)) { + continue; + } DateTime reserveStart = DateUtil.parseDateTime(item.getReserveStartTime()); DateTime reserveEnd = DateUtil.parseDateTime(item.getReserveEndTime()); if (!reserveEnd.isAfter(reserveStart)) { @@ -389,6 +392,13 @@ public class SiteCugApplyController { } } + // 当前登录人占用了该预约时,该预约占用的时间块对当前登录人放开,对其他人仍保持锁定 + private boolean isOccupiedByCurrentUser(SiteCugApply apply) { + return apply != null + && StrUtil.isNotBlank(apply.getOccupyUserId()) + && StrUtil.equals(apply.getOccupyUserId(), SecurityUtil.getUserId()); + } + private boolean intersectsAny(int start, int end, List ranges) { for (int[] range : ranges) { if (range != null && start < range[1] && end > range[0]) { @@ -821,5 +831,22 @@ public class SiteCugApplyController { for (ProcessTask task : doingTaskList) { flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); } + if (applyService.shouldDirectFinishOccupiedApply(apply)) { + directFinishOccupiedApply(instance, args); + } + } + + // 占用人提交与占用时间交叉的预约时,复用已有流程引擎自动结束后续审核任务 + private void directFinishOccupiedApply(ProcessInstance instance, Dict args) { + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + if (doingTaskList.isEmpty()) { + return; + } + Dict directArgs = args.clone(); + directArgs.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.AGREE.getCode()); + directArgs.set(FlowConst.APPROVAL_COMMENT, "占用预约自动通过"); + for (ProcessTask task : doingTaskList) { + flowEngine.executeAndJumpToEnd(task.getId(), FlowConst.AUTO_ID, directArgs); + } } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java index d95de001..b90572dd 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java @@ -105,6 +105,13 @@ public class SiteCugManageController { if ((fullDayOpenHour == null || fullDayOpenHour.isEmpty()) && info.getReserveTimeType() == 2 && info.getOpenHours() != null && !info.getOpenHours().isEmpty()) { fullDayOpenHour = info.getOpenHours().get(0); } + // 场地预约次数限制作为后续提交校验的依据,保存场地时必须配置为正整数 + if (info.getUnionYearReserveLimit() == null || info.getUnionYearReserveLimit() <= 0) { + return Result.error("分工会每年预约次数必须大于0"); + } + if (info.getClubWeekReserveLimit() == null || info.getClubWeekReserveLimit() <= 0) { + return Result.error("社团每周预约次数必须大于0"); + } if (info.getReserveTimeType() == 1) { if (segmentedOpenHours == null || segmentedOpenHours.isEmpty()) { return Result.error("Please add at least one booking slot"); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugRecordController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugRecordController.java index 6baeb458..fc888b8a 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugRecordController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugRecordController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.dayofficework.siteCug.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.flow.engine.FlowEngine; @@ -24,6 +25,7 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Map; @IocBean @Ok("json:full") @@ -87,6 +89,28 @@ public class SiteCugRecordController { return Result.success(); } + @At + @ApiOperation("占用预约记录") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("siteCug.record") + public Result occupy(@Param("id") String id, @Param("message") String message) { + Map result = applyService.occupyRecord(id, message, false); + return result.containsKey(false) ? Result.error(result.get(false)) : Result.success(result.get(true)); + } + + @At + @ApiOperation("批量占用预约记录") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("siteCug.record") + public Result occupyBatch(@Param("ids") String ids, @Param("message") String message) { + if (StrUtil.isBlank(ids)) { + return Result.error("请选择需要占用的预约"); + } + List idList = StrUtil.split(ids, ",").stream().filter(StrUtil::isNotBlank).toList(); + Map result = applyService.occupyRecords(idList, message, false); + return result.containsKey(false) ? Result.error(result.get(false)) : Result.success(result.get(true)); + } + @At @Ok("void") @ApiOperation("导出预约记录") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugApply.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugApply.java index 4857fa3d..5ecd0785 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugApply.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugApply.java @@ -110,5 +110,15 @@ public class SiteCugApply extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 200) private String backOption; + @Column + @Comment("占用人ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String occupyUserId; + + @Column + @Comment("占用通知消息") + @ColDefine(type = ColType.VARCHAR, width = 1000) + private String occupyMessage; + private String yearlyReserveEndDate; } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java index f0f4c32e..20ace0b0 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/model/SiteCugInfo.java @@ -83,6 +83,18 @@ public class SiteCugInfo extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 20) private String termEndDate; + @Column + @Comment("分工会每年预约次数") + @ColDefine(type = ColType.INT) + @Default("2") + private Integer unionYearReserveLimit; + + @Column + @Comment("社团每周预约次数") + @ColDefine(type = ColType.INT) + @Default("2") + private Integer clubWeekReserveLimit; + @Column @Comment("场地的禁用时间") @ColDefine(type = ColType.MYSQL_JSON) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugApplyService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugApplyService.java index 1be3c7a1..71e9d845 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugApplyService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugApplyService.java @@ -7,6 +7,7 @@ import org.nutz.dao.Cnd; import org.nutz.dao.sql.Sql; import javax.servlet.http.HttpServletResponse; +import java.util.List; import java.util.Map; public interface SiteCugApplyService extends BaseService { @@ -21,4 +22,13 @@ public interface SiteCugApplyService extends BaseService { // 场馆预约查询页的导出逻辑统一放在 service,controller 只负责接收请求 void exportRecord(SiteCugRecordPageForm pageForm, HttpServletResponse response); + + // 占用单条预约记录,保存占用人和通知内容;真实发送消息代码当前保留为注释,便于测试流程 + Map occupyRecord(String id, String message, boolean sendMsg); + + // 批量占用预约记录,先统一校验再保存,避免出现部分记录已占用、部分记录失败的状态 + Map occupyRecords(List ids, String message, boolean sendMsg); + + // 判断当前预约是否命中当前登录人的占用时间段,命中后提交预约可自动通过审核 + boolean shouldDirectFinishOccupiedApply(SiteCugApply apply); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugApplyServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugApplyServiceImpl.java index dba66f65..bb248871 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugApplyServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugApplyServiceImpl.java @@ -10,10 +10,10 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; -import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.sys.models.SysHoliday; import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.services.SysMsgService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.club.model.SysClub; import com.budwk.app.zhgh.club.service.SysClubService; @@ -46,6 +46,8 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple @Inject private SysClubService sysClubService; + @Inject + private SysMsgService sysMsgService; public SiteCugApplyServiceImpl(Dao dao) { super(dao); @@ -96,6 +98,10 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple if (intersectsDisabledTime(siteInfo, apply.getReserveStartTime(), apply.getReserveEndTime())) { return Map.of(false, "预约时间落在禁用时间内"); } + Map reserveLimitValidate = validateReserveLimit(apply, siteInfo); + if (reserveLimitValidate.containsKey(false)) { + return reserveLimitValidate; + } Sql sql = Sqls.create(""" select @@ -108,8 +114,7 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple Cnd cnd = Cnd.NEW(); cnd.and(SiteCugApply::getSiteId, "=", apply.getSiteId()); cnd.andEX("sa.id", "!=", apply.getId()); - List stateList = List.of(ProcessInstanceStateEnum.DOING.getCode(), ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.PENDING.getCode()); - cnd.and(ProcessInstance::getState, "in", stateList); + cnd.and("ins.state", "in", buildEffectiveProcessStateList()); sql.setCondition(cnd); List applyList = listEntity(sql); @@ -118,6 +123,9 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple boolean overlap = DateUtil.parseDateTime(item.getReserveStartTime()).isBefore(DateUtil.parseDateTime(apply.getReserveEndTime())) && DateUtil.parseDateTime(item.getReserveEndTime()).isAfter(DateUtil.parseDateTime(apply.getReserveStartTime())); if (overlap) { + if (isOccupiedByCurrentUser(item)) { + continue; + } if (StrUtil.isBlank(apply.getId()) && StrUtil.equals(item.getApplyUserId(), SecurityUtil.getUserId())) { return Map.of(false, "该时间段您已存在预约"); } @@ -127,6 +135,216 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple return Map.of(true, ""); } + @Override + public Map occupyRecord(String id, String message, boolean sendMsg) { + if (StrUtil.isBlank(message)) { + return Map.of(false, "请填写通知消息"); + } + SiteCugApply apply = fetch(id); + if (apply == null) { + return Map.of(false, "记录不存在"); + } + Map validate = validateOccupyApply(apply); + if (validate.containsKey(false)) { + return validate; + } + saveOccupyApply(apply, message, sendMsg); + return Map.of(true, "占用成功"); + } + + // 已通过校验后统一保存占用信息;测试阶段真实发送消息代码保留注释 + private void saveOccupyApply(SiteCugApply apply, String message, boolean sendMsg) { + // 保存占用人和通知内容,后续预约校验据此只放行当前占用人 + apply.setOccupyUserId(SecurityUtil.getUserId()); + apply.setOccupyMessage(message); + updateIgnoreNull(apply); + // 测试占用流程时先不真实发送消息,保留日志用于确认保存和跳转链路是否正常 + log.info("场地预约占用测试消息,applyId={},receiverLoginName={},message={}", apply.getId(), apply.getApplyLoginName(), message); + if (sendMsg) { + // sysMsgService.sendMsgInSys(List.of(apply.getApplyLoginName()), "场地预约占用通知", message, SecurityUtil.getUserId()); + } + } + + @Override + public Map occupyRecords(List ids, String message, boolean sendMsg) { + if (ids == null || ids.isEmpty()) { + return Map.of(false, "请选择需要占用的预约"); + } + if (StrUtil.isBlank(message)) { + return Map.of(false, "请填写通知消息"); + } + List applyList = new ArrayList<>(); + for (String id : ids) { + SiteCugApply apply = fetch(id); + if (apply == null) { + return Map.of(false, "记录不存在"); + } + Map validate = validateOccupyApply(apply); + if (validate.containsKey(false)) { + return validate; + } + applyList.add(apply); + } + for (SiteCugApply apply : applyList) { + saveOccupyApply(apply, message, sendMsg); + } + return Map.of(true, "占用成功"); + } + + // 占用前统一校验预约状态,避免单条和批量接口出现不同判断 + private Map validateOccupyApply(SiteCugApply apply) { + if (StrUtil.isBlank(apply.getApplyLoginName())) { + return Map.of(false, "预约人工号为空,无法发送消息"); + } + if (StrUtil.isBlank(apply.getReserveStartTime()) || !DateUtil.parseDateTime(apply.getReserveStartTime()).isAfter(DateUtil.date())) { + return Map.of(false, "预约已开始,不能占用"); + } + Integer state = queryInstanceState(apply.getId()); + if (state == null || state != ProcessInstanceStateEnum.FINISHED.getCode()) { + return Map.of(false, "仅可占用已通过且未开始的预约记录"); + } + if (StrUtil.isNotBlank(apply.getOccupyUserId()) && !StrUtil.equals(apply.getOccupyUserId(), SecurityUtil.getUserId())) { + return Map.of(false, "该预约已被其他人占用"); + } + return Map.of(true, ""); + } + + private Integer queryInstanceState(String id) { + Sql sql = Sqls.create(""" + SELECT + ins.state AS instanceState + FROM + site_cug_apply info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE info.id = @id + """); + sql.params().set("id", id); + sql.setCallback(Sqls.callback.maps()); + dao().execute(sql); + List list = sql.getList(NutMap.class); + return list != null && !list.isEmpty() ? list.get(0).getInt("instanceState") : null; + } + + // 当前登录人占用了该记录时,允许其再次提交与该记录有交叉的预约 + private boolean isOccupiedByCurrentUser(SiteCugApply apply) { + return apply != null + && StrUtil.isNotBlank(apply.getOccupyUserId()) + && StrUtil.equals(apply.getOccupyUserId(), SecurityUtil.getUserId()); + } + + @Override + public boolean shouldDirectFinishOccupiedApply(SiteCugApply apply) { + if (apply == null || StrUtil.hasBlank(apply.getSiteId(), apply.getReserveStartTime(), apply.getReserveEndTime())) { + return false; + } + Sql sql = Sqls.create(""" + select + sa.* + from + site_cug_apply sa + left join wf_process_instance ins on ins.businessNo = sa.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("sa.siteId", "=", apply.getSiteId()); + cnd.andEX("sa.id", "!=", apply.getId()); + cnd.and("sa.occupyUserId", "=", SecurityUtil.getUserId()); + cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode()); + sql.setCondition(cnd); + List applyList = listEntity(sql); + + // 只要新预约时间和当前登录人占用的已通过预约有交叉,就允许本次预约免审通过 + return applyList.stream().anyMatch(item -> + DateUtil.parseDateTime(item.getReserveStartTime()).isBefore(DateUtil.parseDateTime(apply.getReserveEndTime())) + && DateUtil.parseDateTime(item.getReserveEndTime()).isAfter(DateUtil.parseDateTime(apply.getReserveStartTime())) + ); + } + + // 按预约主体统计有效预约次数,批量预约同一个批次号只计一次,避免一次批量提交占用多次额度 + private Map validateReserveLimit(SiteCugApply apply, SiteCugInfo siteInfo) { + if (StrUtil.equals(apply.getReserveType(), "union")) { + if (siteInfo.getUnionYearReserveLimit() == null || siteInfo.getUnionYearReserveLimit() <= 0) { + return Map.of(false, "请先配置分工会每年预约次数"); + } + String[] range = buildYearRange(apply.getReserveStartTime()); + long count = countEffectiveReserveTimes(apply, "sa.applyUnionId", apply.getApplyUnionId(), range[0], range[1]); + if (count >= siteInfo.getUnionYearReserveLimit()) { + return Map.of(false, "该分工会本年度预约次数已达" + siteInfo.getUnionYearReserveLimit() + "次,不能继续预约"); + } + } + if (StrUtil.equals(apply.getReserveType(), "club")) { + if (siteInfo.getClubWeekReserveLimit() == null || siteInfo.getClubWeekReserveLimit() <= 0) { + return Map.of(false, "请先配置社团每周预约次数"); + } + String[] range = buildWeekRange(apply.getReserveStartTime()); + long count = countEffectiveReserveTimes(apply, "sa.clubId", apply.getClubId(), range[0], range[1]); + if (count >= siteInfo.getClubWeekReserveLimit()) { + return Map.of(false, "该协会本周预约次数已达" + siteInfo.getClubWeekReserveLimit() + "次,不能继续预约"); + } + } + return Map.of(true, ""); + } + + // 分工会每年次数按预约开始时间所在自然年统计 + private String[] buildYearRange(String reserveStartTime) { + DateTime reserveStart = DateUtil.parseDateTime(reserveStartTime); + String year = String.valueOf(reserveStart.year()); + return new String[]{year + "-01-01 00:00:00", year + "-12-31 23:59:59"}; + } + + // 协会每周次数按自然周统计,周一为开始、周日为结束 + private String[] buildWeekRange(String reserveStartTime) { + DateTime reserveStart = DateUtil.parseDateTime(reserveStartTime); + int week = reserveStart.dayOfWeek() - 1; + int offsetToMonday = week == 0 ? -6 : 1 - week; + DateTime weekStart = DateUtil.offsetDay(reserveStart, offsetToMonday); + DateTime weekEnd = DateUtil.offsetDay(weekStart, 6); + return new String[]{DateUtil.formatDate(weekStart) + " 00:00:00", DateUtil.formatDate(weekEnd) + " 23:59:59"}; + } + + // 统计预约主体在指定时间范围内的有效预约次数,所有场地合计,不按场地过滤 + private long countEffectiveReserveTimes(SiteCugApply apply, String targetField, String targetId, String rangeStart, String rangeEnd) { + if (StrUtil.isBlank(targetId)) { + return 0; + } + Sql sql = Sqls.create(""" + select + sa.* + from + site_cug_apply sa + left join wf_process_instance ins on ins.businessNo = sa.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("sa.reserveType", "=", apply.getReserveType()); + cnd.andEX(targetField, "=", targetId); + cnd.andEX("sa.reserveStartTime", ">=", rangeStart); + cnd.andEX("sa.reserveStartTime", "<=", rangeEnd); + if (StrUtil.isNotBlank(apply.getId())) { + cnd.andEX("sa.id", "!=", apply.getId()); + } + cnd.and("ins.state", "in", buildEffectiveProcessStateList()); + sql.setCondition(cnd); + List applyList = listEntity(sql); + return applyList.stream() + .map(this::buildReserveCountKey) + .distinct() + .count(); + } + + // 只有待审核、办理中、已通过的流程占用预约次数,驳回记录不占额度 + private List buildEffectiveProcessStateList() { + return List.of(ProcessInstanceStateEnum.DOING.getCode(), ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.PENDING.getCode()); + } + + // 批量预约同一批次号只算一次,普通预约按单条申请计算 + private String buildReserveCountKey(SiteCugApply apply) { + if (apply != null && StrUtil.isNotBlank(apply.getBackOption()) && apply.getBackOption().startsWith("YEARLY_BATCH:")) { + return apply.getBackOption(); + } + return apply == null ? "" : apply.getId(); + } + @Override public Sql buildRecordSql() { // 场馆预约查询页和导出页共用同一套返回字段,统一在 service 中维护,避免 controller 重复拼 SQL @@ -135,6 +353,7 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple info.*, si.name AS siteName, ins.id AS instanceId, + ins.state AS instanceState, ins.processDefineId instanceProcessDefineId, CASE WHEN info.backOption LIKE 'YEARLY_BATCH:%' THEN 1 ELSE 0 END AS yearlyBatch, CASE WHEN info.reserveType = 'club' THEN '协会预约' ELSE '分工会预约' END AS reserveTypeName, @@ -315,7 +534,3 @@ public class SiteCugApplyServiceImpl extends BaseServiceImpl imple return Map.of(false, "预约类型不合法"); } } - - - - diff --git a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/basicForm.js b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/basicForm.js index 3cf0f2b0..7bd80953 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/basicForm.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/basicForm.js @@ -138,6 +138,33 @@ + + + + + + + + + + + + + + + 场次信息
@@ -339,6 +366,8 @@ state: true, sexLimit: 0, termDateRange: [], + unionYearReserveLimit: 2, + clubWeekReserveLimit: 2, filterHolidays: false, reserveTimeType: 1, openHours: [{ startTime: '', endTime: '', timeUnit: 30 }], @@ -358,6 +387,8 @@ maxNum: [{required: true, message: '必填', trigger: ['blur', 'change']}], typeId: [{required: true, message: '必填', trigger: ['blur', 'change']}], sexLimit: [{required: true, message: '必填', trigger: ['blur', 'change']}], + unionYearReserveLimit: [{required: true, type: 'number', min: 1, message: '必填且必须大于0', trigger: ['blur', 'change']}], + clubWeekReserveLimit: [{required: true, type: 'number', min: 1, message: '必填且必须大于0', trigger: ['blur', 'change']}], filterHolidays: [{required: true, message: '必填', trigger: ['blur', 'change']}], state: [{required: true, message: '必填', trigger: ['blur', 'change']}], reserveTimeType: [{required: true, message: '必填', trigger: ['blur', 'change']}], @@ -687,6 +718,8 @@ state: true, sexLimit: 0, termDateRange: [], + unionYearReserveLimit: 2, + clubWeekReserveLimit: 2, filterHolidays: false, reserveTimeType: 1, openHours: [{ startTime: '', endTime: '', timeUnit: 30 }], diff --git a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/record/index.html b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/record/index.html index 2ca98d3e..63576dbc 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/record/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/record/index.html @@ -9,9 +9,7 @@ layout("/layouts/platform.html"){ } .record-batch-empty { - display: inline-block; - width: 16px; - height: 16px; + display: none; } .record-batch-child-row { @@ -31,6 +29,13 @@ layout("/layouts/platform.html"){ height: 1px; background: #c8d3df; } + + .record-site-name-cell { + display: inline-flex; + align-items: center; + gap: 6px; + max-width: 100%; + }
@@ -113,25 +118,16 @@ layout("/layouts/platform.html"){ + 占用 导出表格 - - - + - +