Browse Source

执法端-计划

dev-V1.0.1
庄锐波 5 months ago
parent
commit
3a050c5c98
  1. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpReserveController.java
  2. 41
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpReserveOverdueCancelJob.java
  3. 18
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java
  4. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpSettingService.java
  5. 123
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java
  6. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpSettingServiceImpl.java
  7. 1
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpReserveMapper.xml
  8. 4
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml
  9. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/reserve.js
  10. 7
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue
  11. 62
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_system.vue
  12. 30
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue
  13. 56
      zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpReserveOverdueCancelTest.java

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpReserveController.java

@ -43,6 +43,14 @@ public class AppEnfCpReserveController extends EfcodeCpReserveController {
return cpReserveService.queryPageList(bo, pageQuery);
}
/**
* 获取预约记录详情(用于操作前获取最新数据)
*/
@GetMapping("/detail/{id}")
public R<EfcodeCpReserveVo> getDetail(@PathVariable String id) {
return R.ok(cpReserveService.queryById(id));
}
/**
* 同意预约(系统匹配专用分支)
*

41
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpReserveOverdueCancelJob.java

@ -0,0 +1,41 @@
package com.zdxt.enforcementcode.quartz.job;
import com.zdxt.enforcementcode.service.IEfcodeCpReserveService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 预约超期自动取消 - 定时任务
* <p>定期扫描待确认状态的预约记录,超过配置天数未处理的自动设置为超期取消</p>
*
* @author zrb
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class CpReserveOverdueCancelJob {
private final IEfcodeCpReserveService cpReserveService;
/**
* 任务执行入口(public,供 JobInvokeUtil 通过反射调用)
* <p>按配置的超期天数取消手动预约和系统匹配中超期未处理的待确认记录</p>
*/
public void execute() {
log.info("[CpReserveOverdueCancelJob] 定时任务触发:预约超期自动取消");
int manualCount = cpReserveService.cancelOverdueManualReserves(false);
int systemCount = cpReserveService.cancelOverdueSystemReserves(false);
log.info("[CpReserveOverdueCancelJob] 执行完成:手动预约取消{}条,系统匹配取消{}条", manualCount, systemCount);
}
/**
* 强制取消入口(忽略时间限制,将所有待处理记录全部取消)
*/
public void executeForce() {
log.info("[CpReserveOverdueCancelJob] 强制触发:预约全部取消");
int manualCount = cpReserveService.cancelOverdueManualReserves(true);
int systemCount = cpReserveService.cancelOverdueSystemReserves(true);
log.info("[CpReserveOverdueCancelJob] 强制执行完成:手动预约取消{}条,系统匹配取消{}条", manualCount, systemCount);
}
}

18
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java

@ -127,4 +127,22 @@ public interface IEfcodeCpReserveService {
* @return 同组其他预约记录(关联计划信息)
*/
List<EfcodeCpReserveVo> queryGroupMembers(String planGroupId, String excludeId);
/**
* 手动预约超期取消
* <p>将手动预约(resFrom=0)中超过配置天数未处理的待确认记录设置为超期取消</p>
*
* @param ignoreTime 是否忽略时间限制,true=将所有待处理记录全部取消
* @return 取消的记录数
*/
int cancelOverdueManualReserves(boolean ignoreTime);
/**
* 系统匹配预约超期取消
* <p>将系统匹配(resFrom=1)中超过配置天数未处理的待确认记录设置为超期取消</p>
*
* @param ignoreTime 是否忽略时间限制,true=将所有待处理记录全部取消
* @return 取消的记录数
*/
int cancelOverdueSystemReserves(boolean ignoreTime);
}

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpSettingService.java

@ -46,6 +46,11 @@ public interface IEfcodeCpSettingService {
*/
String SETTING_ID_SYSTEM_MATCH_WEEKS = "CP_SETTING_SYSTEM_MATCH_WEEKS";
/**
* 设置项主键:预约自动取消时长(天)
*/
String SETTING_ID_RESERVE_CANCEL_DURATION = "CP_SETTING_RESERVE_CANCEL_DURATION";
/**
* 默认值:下阶段计划提交最晚时间
*/
@ -76,6 +81,11 @@ public interface IEfcodeCpSettingService {
*/
int DEFAULT_SYSTEM_MATCH_WEEKS = 2;
/**
* 默认值:预约自动取消时长(天)
*/
int DEFAULT_RESERVE_CANCEL_DURATION = 7;
/**
* 查询行政执法检查计划-设置
*
@ -126,6 +136,13 @@ public interface IEfcodeCpSettingService {
*/
Integer getSystemMatchWeeks();
/**
* 获取预约自动取消时长(天)
*
* @return 数值,未配置或无法解析时返回默认值 {@link #DEFAULT_RESERVE_CANCEL_DURATION}
*/
Integer getReserveCancelDuration();
/**
* 分页查询行政执法检查计划-设置列表
*

123
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java

@ -496,15 +496,15 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
cpPlanMapper.updateById(planUpdate);
}
// 后置处理:检查是否所有同组记录都已同意,若是则生成任务
afterApproveCheck(reserve);
// 后置处理:检查同组是否全部处理完成,若至少一家同意则生成任务
afterSystemMatchGroupCheck(reserve);
return R.ok();
}
/**
* 同意操作后置检查:检查同组是否全部同意,若是则生成任务
* 系统匹配后置检查:检查同组是否全部处理完成,若是且至少一家同意则生成任务
*/
private void afterApproveCheck(EfcodeCpReserve reserve) {
private void afterSystemMatchGroupCheck(EfcodeCpReserve reserve) {
if (StringUtils.isBlank(reserve.getPlanGroupId())) {
return;
}
@ -513,16 +513,24 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
Wrappers.<EfcodeCpReserve>lambdaQuery()
.eq(EfcodeCpReserve::getPlanGroupId, reserve.getPlanGroupId())
);
// 检查是否全部同意
boolean allApproved = allGroupReserves.stream()
.allMatch(r -> Long.valueOf(1L).equals(r.getOpStatus()));
if (!allApproved) {
log.info("[预约后置] planGroupId={} 尚有未同意的记录,等待其他用户操作", reserve.getPlanGroupId());
// 检查是否全部处理完成(无待确认记录)
boolean allProcessed = allGroupReserves.stream()
.noneMatch(r -> Long.valueOf(3L).equals(r.getOpStatus()));
if (!allProcessed) {
log.info("[系统匹配后置] planGroupId={} 尚有未处理的记录,等待其他用户操作", reserve.getPlanGroupId());
return;
}
// 全部同意:生成1条任务,所有同组计划共享该 task_id
// 筛选同意的记录
List<EfcodeCpReserve> approvedReserves = allGroupReserves.stream()
.filter(r -> Long.valueOf(1L).equals(r.getOpStatus()))
.collect(java.util.stream.Collectors.toList());
if (approvedReserves.isEmpty()) {
log.info("[系统匹配后置] planGroupId={} 全部拒绝,不生成任务", reserve.getPlanGroupId());
return;
}
// 至少一家同意:生成1条任务,只关联同意的计划
String sharedTaskId = null;
for (EfcodeCpReserve r : allGroupReserves) {
for (EfcodeCpReserve r : approvedReserves) {
EfcodeCpPlan plan = cpPlanMapper.selectById(r.getPlanId());
if (plan == null || StringUtils.isNotBlank(plan.getTaskId())) continue;
if (sharedTaskId == null) {
@ -535,8 +543,24 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
cpPlanMapper.updateById(planUpdate);
}
}
log.info("[预约后置] planGroupId={} 全部同意,生成任务taskId={},关联{}条计划",
reserve.getPlanGroupId(), sharedTaskId, allGroupReserves.size());
log.info("[系统匹配后置] planGroupId={} 全部处理完成,同意{}家/拒绝{}家,生成任务taskId={}",
reserve.getPlanGroupId(), approvedReserves.size(),
allGroupReserves.size() - approvedReserves.size(), sharedTaskId);
}
/**
* 手动预约后置检查:同意后直接为该计划生成任务
*/
private void afterManualMatchComplete(EfcodeCpReserve reserve) {
if (StringUtils.isBlank(reserve.getPlanId())) {
return;
}
EfcodeCpPlan plan = cpPlanMapper.selectById(reserve.getPlanId());
if (plan == null || StringUtils.isNotBlank(plan.getTaskId())) {
return;
}
//String taskId = cpTaskService.forceGenerateTask(plan);
//log.info("[手动预约后置] 计划[{}] 同意后生成任务taskId={}", reserve.getPlanId(), taskId);
}
/**
@ -568,6 +592,8 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
reserve.setOpTime(new Date());
baseMapper.updateById(reserve);
afterOperate(reserve, "approve");
// 后置处理:手动预约同意后直接生成任务
afterManualMatchComplete(reserve);
return R.ok();
}
@ -587,6 +613,8 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
reserve.setOpTime(new Date());
baseMapper.updateById(reserve);
afterOperate(reserve, "reject");
// 后置处理:检查同组是否全部处理完成,若至少一家同意则生成任务
afterSystemMatchGroupCheck(reserve);
return R.ok();
}
@ -691,4 +719,73 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
}
return result;
}
/**
* 手动预约超期取消
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int cancelOverdueManualReserves(boolean ignoreTime) {
return doCancelOverdueReserves(0L, ignoreTime);
}
/**
* 系统匹配预约超期取消
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int cancelOverdueSystemReserves(boolean ignoreTime) {
return doCancelOverdueReserves(1L, ignoreTime);
}
/**
* 执行超期取消逻辑
*
* @param resFrom 预约来源:0=手动预约,1=系统匹配
* @param ignoreTime 是否忽略时间,true=将所有待处理记录全部取消
* @return 取消的记录数
*/
private int doCancelOverdueReserves(Long resFrom, boolean ignoreTime) {
LambdaQueryWrapper<EfcodeCpReserve> lqw = Wrappers.<EfcodeCpReserve>lambdaQuery()
.eq(EfcodeCpReserve::getResFrom, resFrom)
.eq(EfcodeCpReserve::getOpStatus, 3L); // 待确认
if (!ignoreTime) {
// 读取配置的超期天数
int cancelDays = cpSettingService.getReserveCancelDuration();
// 计算截止时间:当前时间 - cancelDays 天
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -cancelDays);
Date deadline = cal.getTime();
// 匹配时间(reserveTime) 在截止时间之前的记录
lqw.le(EfcodeCpReserve::getReserveTime, deadline);
}
List<EfcodeCpReserve> overdueList = baseMapper.selectList(lqw);
if (overdueList.isEmpty()) {
log.info("[超期取消] resFrom={} ignoreTime={} 无符合条件的记录", resFrom, ignoreTime);
return 0;
}
Date now = new Date();
for (EfcodeCpReserve reserve : overdueList) {
// 更新预约记录状态为超期取消(4)
EfcodeCpReserve update = new EfcodeCpReserve();
update.setId(reserve.getId());
update.setOpStatus(4L);
update.setOpTime(now);
baseMapper.updateById(update);
// 同步更新关联计划的 reserve_status 为 4(重新预约中)
if (StringUtils.isNotBlank(reserve.getPlanId())) {
EfcodeCpPlan planUpdate = new EfcodeCpPlan();
planUpdate.setId(reserve.getPlanId());
planUpdate.setReserveStatus(4L);
cpPlanMapper.updateById(planUpdate);
}
}
log.info("[超期取消] resFrom={} ignoreTime={} 共取消{}条记录", resFrom, ignoreTime, overdueList.size());
return overdueList.size();
}
}

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpSettingServiceImpl.java

@ -92,6 +92,14 @@ public class EfcodeCpSettingServiceImpl implements IEfcodeCpSettingService {
return getIntSetting(SETTING_ID_SYSTEM_MATCH_WEEKS, DEFAULT_SYSTEM_MATCH_WEEKS);
}
/**
* 获取预约自动取消时长(天)
*/
@Override
public Integer getReserveCancelDuration() {
return getIntSetting(SETTING_ID_RESERVE_CANCEL_DURATION, DEFAULT_RESERVE_CANCEL_DURATION);
}
/**
* 根据设置主键获取整型配置值,不存在或解析失败时返回默认值
*

1
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpReserveMapper.xml

@ -18,6 +18,7 @@
r.op_set_date,
r.op_set_time,
r.res_from,
r.warring_message,
p.plan_date,
p.plan_time,
p.enterprise_name,

4
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml

@ -13,8 +13,6 @@
p.id AS plan_id,
p.plan_date,
p.plan_time,
p.plan_actual_date,
p.plan_actual_time,
p.enforce_content,
p.enterprise_name,
p.is_union,
@ -67,8 +65,6 @@
p.plan_type,
p.plan_date,
p.plan_time,
p.plan_actual_date,
p.plan_actual_time,
p.enforce_content,
p.enterprise_name,
p.enterprise_number,

3
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/reserve.js

@ -7,6 +7,9 @@ const reserveBaseUrl = "/app-enf/cpReserve";
// 预约列表(分页,支持 resFrom 过滤:0=手动预约,1=系统匹配)
export const getReserveList = (params, success, error) => _get(reserveBaseUrl + "/list", params, success, error);
// 获取预约记录详情(用于操作前获取最新数据)
export const getReserveDetail = (id, success, error) => _get(reserveBaseUrl + "/detail/" + id, {}, success, error);
// 预约处理:同意(系统匹配专用,支持传选择的时间参数)
export const approveReserve = (id, params, success, error) => {
let url = reserveBaseUrl + "/approveBySystem/" + id;

7
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue

@ -107,13 +107,14 @@ const finished = ref(false);
const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = 10;
const filterStatus = ref(null); // null=全部, 1=已同意, 2=已拒绝, 3=待确认
const filterStatus = ref(3); // null=全部, 1=已同意, 2=已拒绝, 3=待确认
const filterOptions = [
{ label: '全部', value: null },
{ label: '待确认', value: 3 },
{ label: '已同意', value: 1 },
{ label: '已拒绝', value: 2 },
{ label: '同意', value: 1 },
{ label: '拒绝', value: 2 },
{ label: '超期取消', value: 4 },
];
// 状态文本映射

62
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_system.vue

@ -136,7 +136,7 @@
<script setup name="cpReserveSystem">
import { showConfirmDialog, showSuccessToast, showDialog } from 'vant';
import { getReserveList, approveReserve, rejectReserveBySystem, getReserveGroupMembers } from '@/api/enforcement/reserve';
import { getReserveList, getReserveDetail, approveReserve, rejectReserveBySystem, getReserveGroupMembers } from '@/api/enforcement/reserve';
const selectedId = ref(null);
const groupMembers = ref([]); // 选中卡片的同组关联计划
@ -147,7 +147,7 @@ const finished = ref(false);
const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = 10;
const filterStatus = ref(null); // null=全部, 1=已同意, 2=已拒绝, 3=待确认
const filterStatus = ref(3); // null=全部, 1=已同意, 2=已拒绝, 3=待确认
// 时间选择相关
const showTimePicker = ref(false);
@ -158,8 +158,9 @@ const pendingApproveItem = ref(null); // 待同意的item缓存
const filterOptions = [
{ label: '全部', value: null },
{ label: '待确认', value: 3 },
{ label: '已同意', value: 1 },
{ label: '已拒绝', value: 2 },
{ label: '同意', value: 1 },
{ label: '拒绝', value: 2 },
{ label: '超期取消', value: 4 },
];
// 状态文本映射
@ -296,24 +297,41 @@ const onShowMessage = (item) => {
// 同意
const onApprove = (item) => {
if (item.opOrder === 0 || item.opOrder === null) {
// opOrder==0:第一个操作的用户,弹出时间选择
buildTimeOptions(item);
pendingApproveItem.value = item;
selectedTimeIdx.value = null;
showTimePicker.value = true;
} else {
// opOrder>0:后续用户,弹出 warringMessage 提示
const msg = item.warringMessage || '确定同意该系统匹配吗?';
showConfirmDialog({
title: '时间确认',
message: msg,
confirmButtonText: '确认同意',
cancelButtonText: '取消',
}).then(() => {
doApprove(item.id, null);
}).catch(() => {});
}
// 先从服务端获取最新数据,避免列表缓存过期
getReserveDetail(item.id, (res) => {
if (res.code !== 200 || !res.data) {
showDialog({ title: '提示', message: res.msg || '获取最新数据失败' });
return;
}
const latest = res.data;
if (latest.opStatus !== 3) {
showDialog({ title: '提示', message: '该记录已被处理,请刷新列表' });
onRefresh();
return;
}
if (latest.opOrder === 0 || latest.opOrder === null) {
// opOrder==0:第一个操作的用户,弹出时间选择
buildTimeOptions(item);
pendingApproveItem.value = item;
selectedTimeIdx.value = null;
showTimePicker.value = true;
} else {
// opOrder>0:后续用户,弹出 warringMessage 提示
const myTime = formatDateShort(item.planDate) + ' ' + getPlanTimeText(item.planTime);
const msg = `您计划的时间为:${myTime}<br/>${latest.warringMessage || ''}`;
showConfirmDialog({
title: '时间确认',
message: msg,
allowHtml: true,
confirmButtonText: '确认同意',
cancelButtonText: '取消',
}).then(() => {
doApprove(item.id, null);
}).catch(() => {});
}
}, () => {
showDialog({ title: '提示', message: '网络异常,请稍后重试' });
});
};
// 构建时间选项(从当前卡片+关联计划中提取可选的日期/时段)

30
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue

@ -101,17 +101,24 @@
</template>
<script setup name="cpTaskMine">
import { useRouter } from 'vue-router';
import { useRouter, useRoute } from 'vue-router';
import { getMyTaskList, getMyTaskDates } from '@/api/enforcement/task';
const router = useRouter();
const route = useRoute();
// ========== 日历相关 ==========
const weekDays = ['日', '一', '二', '三', '四', '五', '六'];
const today = new Date();
const currentYear = ref(today.getFullYear());
const currentMonth = ref(today.getMonth() + 1);
const selectedDate = ref(new Date(today.getFullYear(), today.getMonth(), today.getDate()));
// 从路由参数恢复年月日,若无则默认当天
const initYear = route.query.year ? parseInt(route.query.year) : today.getFullYear();
const initMonth = route.query.month ? parseInt(route.query.month) : today.getMonth() + 1;
const initDay = route.query.day ? parseInt(route.query.day) : (route.query.year ? 1 : today.getDate());
const currentYear = ref(initYear);
const currentMonth = ref(initMonth);
const selectedDate = ref(new Date(initYear, initMonth - 1, initDay));
const taskDatesSet = ref(new Set());
// 月份选择器
@ -207,6 +214,17 @@ const formatYearMonth = () => {
return `${currentYear.value}-${String(currentMonth.value).padStart(2, '0')}`;
};
// 同步路由参数
const syncRouteQuery = () => {
router.replace({
query: {
year: String(currentYear.value),
month: String(currentMonth.value),
day: String(selectedDate.value.getDate()),
},
});
};
// 切换月份
const onPrevMonth = () => {
if (currentMonth.value === 1) {
@ -216,6 +234,7 @@ const onPrevMonth = () => {
currentMonth.value--;
}
loadTaskDates();
syncRouteQuery();
};
const onNextMonth = () => {
@ -226,6 +245,7 @@ const onNextMonth = () => {
currentMonth.value++;
}
loadTaskDates();
syncRouteQuery();
};
// 月份选择器确认
@ -234,6 +254,7 @@ const onMonthPickerConfirm = ({ selectedValues }) => {
currentMonth.value = parseInt(selectedValues[1]);
showMonthPicker.value = false;
loadTaskDates();
syncRouteQuery();
};
// 选择日期
@ -241,6 +262,7 @@ const onSelectDate = (cell) => {
if (!cell.isCurrentMonth) return;
selectedDate.value = cell.date;
loadTaskList();
syncRouteQuery();
};
// 返回

56
zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpReserveOverdueCancelTest.java

@ -0,0 +1,56 @@
package com.zdxt.rest.test.cp;
import com.zdxt.enforcementcode.service.IEfcodeCpReserveService;
import org.dromara.ZdxtAdminApplication;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
/**
* 预约超期取消测试
* <p>
* 调用 ignoreTime=true 模式,将所有待处理的手动预约和系统匹配记录全部设置为超期取消(opStatus=4)。
* </p>
*/
@SpringBootTest(classes = ZdxtAdminApplication.class)
@ActiveProfiles({"dev", "dev-cust-zrb"})
@DisplayName("预约超期取消测试")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AppEnfCpReserveOverdueCancelTest {
@Autowired
private IEfcodeCpReserveService cpReserveService;
/**
* 忽略时间 - 手动预约全部取消
* <p>将所有手动预约(resFrom=0)中待确认(opStatus=3)的记录全部设置为超期取消</p>
*/
@DisplayName("忽略时间 - 手动预约全部取消")
@Test
@Order(1)
public void testCancelOverdueManual_ignoreTime() {
System.out.println("========== 开始执行手动预约超期取消(忽略时间) ==========");
int cancelCount = cpReserveService.cancelOverdueManualReserves(true);
System.out.println("手动预约取消记录数: " + cancelCount);
System.out.println("========== 手动预约超期取消完毕 ==========");
}
/**
* 忽略时间 - 系统匹配全部取消
* <p>将所有系统匹配(resFrom=1)中待确认(opStatus=3)的记录全部设置为超期取消</p>
*/
@DisplayName("忽略时间 - 系统匹配全部取消")
@Test
@Order(2)
public void testCancelOverdueSystem_ignoreTime() {
System.out.println("========== 开始执行系统匹配超期取消(忽略时间) ==========");
int cancelCount = cpReserveService.cancelOverdueSystemReserves(true);
System.out.println("系统匹配取消记录数: " + cancelCount);
System.out.println("========== 系统匹配超期取消完毕 ==========");
}
}
Loading…
Cancel
Save