This commit is contained in:
@jyuhsin
2025-08-27 17:21:42 +08:00
parent 3171c30d43
commit 3dcf833e7a
34 changed files with 1745 additions and 124 deletions
@@ -63,7 +63,7 @@ public class ClubAuditManagerController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
@@ -51,7 +51,7 @@ public class ClubSchoolAuditReportController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
@@ -51,7 +51,7 @@ public class ClubSchoolAuditRuleController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
@@ -1,29 +1,52 @@
package com.budwk.app.zhgh.dayofficework.site.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
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.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.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.SysHoliday;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import com.budwk.app.zhgh.dayofficework.site.model.SiteInfo;
import com.budwk.app.zhgh.dayofficework.site.model.SiteType;
import com.budwk.app.zhgh.dayofficework.site.service.SiteApplyService;
import com.budwk.app.zhgh.dayofficework.site.service.SiteInfoService;
import com.budwk.app.zhgh.dayofficework.site.service.SiteTypeService;
import com.budwk.app.zhgh.staffbenefit.condolence.model.Condolence;
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.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.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.stream.Collectors;
@@ -48,6 +71,10 @@ public class SiteApplyController {
private SiteApplyService applyService;
@Inject
private SiteInfoService infoService;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@At("")
@SaCheckPermission("site.apply")
@@ -56,7 +83,7 @@ public class SiteApplyController {
@At
@ApiOperation("分页查询")
@SaCheckPermission("site.type")
@SaCheckPermission("site.apply")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("type") String type) {
@@ -86,4 +113,225 @@ public class SiteApplyController {
}
return Result.success(pagination);
}
@At
@ApiOperation("新增/修改场地预约")
@SaCheckPermission("site.apply")
@SLog(type = "site", tag = "新增/修改场地预约", msg = "新增/修改场地预约")
public Result submit(@Param("data") SiteApply siteApply, @Param("days") String[] days) {
Map<Boolean, String> validate = applyService.validateApply(siteApply, days[0]);
if(validate.containsKey(false)) {
return Result.error(validate.get(false));
}
siteApply.setApplyDay(days[0]);
dao.insertOrUpdate(siteApply);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, siteApply);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("CDYY", siteApply.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("site.apply")
public Result submitAgain(@Param("data") SiteApply siteApply,
@Param("days") String[] days,
@Param("taskId") String taskId) {
Map<Boolean, String> validate = applyService.validateApply(siteApply, days[0]);
if(validate.containsKey(false)) {
return Result.error(validate.get(false));
}
siteApply.setApplyDay(days[0]);
dao.insertOrUpdate(siteApply);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@ApiOperation("查询可以预约的日期")
@SaCheckPermission("site.apply")
public Result queryAllowTime(String siteId, String startTime, String endTime) {
if(StrUtil.isBlank(siteId)) {
return Result.success(new ArrayList<>());
}
// 转化对象
DateTime startDate = DateUtil.parseDate(startTime);
Date endDate = DateUtil.parseDate(endTime);
// 获取区间内的每一天
List<DateTime> fullDateList = DateUtil.rangeToList(startDate, endDate, DateField.DAY_OF_MONTH);
// 查询场地
SiteInfo siteInfo = infoService.fetch(siteId);
List<NutMap> openHours = siteInfo.getOpenHours();
List<Integer> weekNumList = openHours.stream().map(o -> o.getInt("weekNum")).distinct().toList();
// 查询节假日
List<String> holidayList = null;
if(siteInfo.getFilterHolidays()) {
List<SysHoliday> holidays = dao.query(SysHoliday.class, Cnd.where("year(day)", "=", DateUtil.thisYear()));
holidayList = holidays.stream().map(SysHoliday::getDay).collect(Collectors.toList());
}
List<String> result = new ArrayList<>();
//循环时间段
for (DateTime day : fullDateList) {
if(Lang.isNotEmpty(holidayList) && holidayList.contains(DateUtil.formatDate(day))) {
continue;
}
//先判断星期
int week = day.dayOfWeek() - 1;
if(weekNumList.contains(week)) {
result.add(DateUtil.format(day, "yyyy-MM-dd"));
}
}
return Result.success(result);
}
@At
@ApiOperation("查询可以预约的时间")
@SaCheckPermission("site.apply")
public Result queryTimesByDay(String siteId, String day) {
//获取场地
SiteInfo siteInfo = infoService.fetch(siteId);
List<NutMap> openHours = siteInfo.getOpenHours();
Integer maxNum = siteInfo.getMaxNum();
//获取星期
DateTime dateTime = DateUtil.parse(day);
int week = dateTime.dayOfWeek() - 1;
List<NutMap> result = new ArrayList<>();
//这个是满足星期的所有时间
List<NutMap> mapList = openHours.stream().filter(o -> o.getInt("weekNum") == week).toList();
for (NutMap nutMap : mapList) {
String startTime = nutMap.getString("startTime");
String endTime = nutMap.getString("endTime");
double timeUnit = nutMap.getDouble("timeUnit");
if(timeUnit == 0) {
result.add(NutMap.NEW().addv("startTime", startTime).addv("endTime", endTime));
} else {
// 构造起始时间
DateTime start = DateUtil.parse(startTime, "HH:mm");
DateTime end = DateUtil.parse(endTime, "HH:mm");
DateTime current = start;
while (DateUtil.compare(current, end) < 0) {
DateTime next = DateUtil.offsetSecond(current, (int) (timeUnit * 3600));
// 如果超过结束时间,则使用 endTime
if (DateUtil.compare(next, end) > 0) {
result.add(NutMap.NEW().addv("startTime", DateUtil.format(current, "HH:mm")).addv("endTime", DateUtil.format(end, "HH:mm")));
break;
} else {
result.add(NutMap.NEW().addv("startTime", DateUtil.format(current, "HH:mm")).addv("endTime", DateUtil.format(next, "HH:mm")));
}
current = next;
}
}
}
// 获取当前时间的时分
String nowTimeStr = DateUtil.format(DateUtil.date(), "HH:mm");
DateTime nowTime = DateUtil.parseTimeToday(nowTimeStr);
for (NutMap nutMap : result) {
String startTimeStr = nutMap.getString("startTime");
String endTimeStr = nutMap.getString("endTime");
if (day.equals(DateUtil.today())) {
DateTime startTime = DateUtil.parseTimeToday(startTimeStr);
// 计算时间差(单位:分钟)
long diffMinutes = Math.abs(DateUtil.between(nowTime, startTime, DateUnit.MINUTE));
// 相差不足4小时
if (nowTime.getTime() > startTime.getTime() || diffMinutes <= 240) {
nutMap.addv("disabled", true);
nutMap.addv("tooltip", "不可预约");
continue;
}
}
if(!this.isTimeInRange(siteInfo, day, startTimeStr, endTimeStr)) {
nutMap.addv("disabled", true);
nutMap.addv("tooltip", "不可预约");
continue;
}
Sql sql = Sqls.create("""
select
sa.*
from
site_apply sa
left join wf_process_instance ins on ins.businessNo = sa.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(SiteApply::getSiteId, "=", siteId);
cnd.and(SiteApply::getApplyDay, "=", day);
cnd.and(SiteApply::getStartTime, "=", startTimeStr);
cnd.and(SiteApply::getEndTime, "=", endTimeStr);
List<Integer> stateList = List.of(ProcessInstanceStateEnum.DOING.getCode(), ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.PENDING.getCode());
cnd.and(ProcessInstance::getState, "in", stateList);
sql.setCondition(cnd);
List<SiteApply> applyList = applyService.listEntity(sql);
int count = Lang.isNotEmpty(applyList) ? applyList.stream().mapToInt(SiteApply::getJoinCount).sum() : 0;
if(count >= maxNum) {
nutMap.addv("disabled", true);
nutMap.addv("tooltip", "已约满");
}
long hasReserve = applyList.stream().filter(o -> o.getApplyUserId().equals(SecurityUtil.getUserId())).count();
if(hasReserve > 0) {
nutMap.addv("disabled", true);
nutMap.addv("tooltip", "已预约");
}
}
return Result.success(result);
}
public boolean isTimeInRange(SiteInfo site, String day, String startTime, String endTime) {
startTime = day + " " + startTime + ":00";
endTime = day + " " + endTime + ":00";
List<NutMap> timeRanges = site.getNotApplyTimeList();
for (NutMap range : timeRanges) {
// 将时间范围转换为完整的日期时间
String startRange = range.getString("date") + " " + range.getString("startTime") + ":00";
String endRange = range.getString("date") + " " + range.getString("endTime")+ ":00";
DateTime start = DateUtil.parseDateTime(startRange);
DateTime end = DateUtil.parseDateTime(endRange);
if(StrUtil.isNotBlank(startTime)) {
DateTime targetTime = DateUtil.parseDateTime(startTime);
if (targetTime.isAfterOrEquals(start) && targetTime.isBeforeOrEquals(end)) {
return false;
}
}
if(StrUtil.isNotBlank(endTime)) {
DateTime targetTime = DateUtil.parseDateTime(endTime);
if (targetTime.isAfterOrEquals(start) && targetTime.isBeforeOrEquals(end)) {
return false;
}
}
if(StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {
DateTime startTargetTime = DateUtil.parseDateTime(startTime);
DateTime endTargetTime = DateUtil.parseDateTime(endTime);
if(startTargetTime.isBeforeOrEquals(start) && endTargetTime.isAfterOrEquals(end)) {
return false;
}
}
}
return true;
}
}
@@ -16,8 +16,6 @@ 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;
@@ -42,7 +40,7 @@ import java.util.stream.Collectors;
@Ok("json:full")
@Api(tags = "场地管理")
@At("/platform/site/manage")
public class SiteInfoController {
public class SiteManageController {
@Inject
private Dao dao;
@@ -111,4 +109,12 @@ public class SiteInfoController {
List<SiteInfo> list = infoService.query(Cnd.where(SiteInfo::getState, "=", true).desc(SiteInfo::getSortNum));
return Result.success(list);
}
@At
@ApiOperation("查询单个场地")
@SaCheckLogin
public Result info(String id) {
SiteInfo info = infoService.fetch(id);
return Result.success(info);
}
}
@@ -0,0 +1,127 @@
package com.budwk.app.zhgh.dayofficework.site.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
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.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import com.budwk.app.zhgh.dayofficework.site.service.SiteApplyService;
import com.budwk.app.zhgh.staffbenefit.condolence.model.Condolence;
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.dao.util.cri.SqlExpressionGroup;
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 org.nutz.mvc.annotation.Param;
/**
* @ClassName SiteMineController
* @Author JyuHsin
* @Date 2025/8/27 15:49
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "场地我的预约")
@At("/platform/site/mine")
public class SiteMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SiteApplyService applyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/site/mine/index.html")
@SaCheckLogin
public void index() {}
@At
@ApiOperation("分页查询")
@SaCheckPermission("site.mine")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("siteType") String siteType,
@Param("siteId") String siteId) {
Sql sql = Sqls.create("""
SELECT
info.*,
si.name as siteName,
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,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId
FROM
site_apply info
LEFT JOIN site_info si ON info.siteId = si.id
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(SiteApply::getApplyUserName, "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or(SiteApply::getApplyLoginName, "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
cnd.andEX("year(info.applyDay)", "=", year);
cnd.andEX("si.typeId", "=", siteType);
cnd.andEX("info.siteId", "=", siteId);
cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.desc("info.createdAt");
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = applyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("site.mine")
@SLog(type = "site", tag = "删除场地预约", msg = "删除场地预约")
public Result delete(@Param("id") String id) {
applyService.delete(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -0,0 +1,108 @@
package com.budwk.app.zhgh.dayofficework.site.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
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.utils.PageUtil;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import com.budwk.app.zhgh.dayofficework.site.service.SiteApplyService;
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;
/**
* @ClassName SiteRecordController
* @Author JyuHsin
* @Date 2025/8/27 16:58
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "场地预约查询")
@At("/platform/site/record")
public class SiteRecordController {
@Inject
private Dao dao;
@Inject
private SiteApplyService applyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/site/record/index.html")
@SaCheckLogin
public void index() {}
@At
@ApiOperation("分页查询")
@SaCheckPermission("site.mine")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("siteType") String siteType,
@Param("siteId") String siteId) {
Sql sql = Sqls.create("""
SELECT
info.*,
si.name as siteName,
ins.id AS instanceId,
ins.state instanceState,
ins.processDefineId instanceProcessDefineId,
t.displayName taskName
FROM
site_apply info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (
SELECT
processInstanceId,
displayName,
createdAt,
ROW_NUMBER() OVER (PARTITION BY processInstanceId ORDER BY createdAt DESC) AS rn
FROM wf_process_task
) t ON t.processInstanceId = ins.id AND t.rn = 1
LEFT JOIN site_info si ON info.siteId = si.id
$condition
""");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(SiteApply::getApplyUserName, "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or(SiteApply::getApplyLoginName, "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
cnd.andEX("year(info.applyDay)", "=", year);
cnd.andEX("si.typeId", "=", siteType);
cnd.andEX("info.siteId", "=", siteId);
cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("info.applyUnionId", "=", SecurityUtil.getUnionId());
}
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.desc("info.createdAt");
}
sql.setCondition(cnd);
Pagination<NutMap> pageVO = applyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
}
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.dayofficework.site.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import com.budwk.app.zhgh.dayofficework.site.service.SiteApplyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
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 java.util.List;
/**
* @ClassName SiteSchoolUnionAuditController
* @Author JyuHsin
* @Date 2025/8/27 16:42
* @Version 1.0
* @Description TODO
*/
@IocBean
@At("/platform/site/schoolUnionAudit")
@Api("场地预约校工会审核")
@Ok("json:full")
public class SiteSchoolUnionAuditController {
@Inject
private SiteApplyService applyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/site/schoolUnionAudit/index.html")
@SaCheckLogin
public void index() {}
@At
@ApiOperation("分页查询")
@SaCheckPermission("site.schoolUnionAudit")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("siteType") String siteType,
@Param("siteId") String siteId,
@Param("approval") Boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
si.name as siteName,
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 site_apply info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN site_info si ON info.siteId = si.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();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(SiteApply::getApplyUserName, "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or(SiteApply::getApplyLoginName, "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
cnd.andEX("year(info.applyDay)", "=", year);
cnd.andEX("si.typeId", "=", siteType);
cnd.andEX("info.siteId", "=", siteId);
cnd.and("t.taskName", "=", "c8c03407-cf26-4e0b-82f1-b2afc9c79996");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.desc("info.createdAt");
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pageVO = applyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
}
@@ -47,11 +47,22 @@ public class SiteApply extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 30)
private String applyLoginName;
@Column
@Comment("预约人单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String applyUnitId;
@Column
@Comment("预约人单位")
@ColDefine(type = ColType.VARCHAR, width = 60)
private String applyUnitName;
@Column
@Comment("预约人工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String applyUnionId;
@Column
@Comment("预约人工会")
@ColDefine(type = ColType.VARCHAR, width = 60)
@@ -3,6 +3,8 @@ package com.budwk.app.zhgh.dayofficework.site.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import java.util.Map;
/**
* @ClassName SiteApplyService
* @Author JyuHsin
@@ -11,4 +13,6 @@ import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
* @Description TODO
*/
public interface SiteApplyService extends BaseService<SiteApply> {
Map<Boolean, String> validateApply(SiteApply apply, String day);
}
@@ -1,12 +1,22 @@
package com.budwk.app.zhgh.dayofficework.site.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.site.model.SiteApply;
import com.budwk.app.zhgh.dayofficework.site.model.SiteInfo;
import com.budwk.app.zhgh.dayofficework.site.service.SiteApplyService;
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.IocBean;
import java.util.List;
import java.util.Map;
/**
* @ClassName SiteApplyServiceImpl
* @Author JyuHsin
@@ -21,4 +31,36 @@ public class SiteApplyServiceImpl extends BaseServiceImpl<SiteApply> implements
public SiteApplyServiceImpl(Dao dao) {
super(dao);
}
@Override
public Map<Boolean, String> validateApply(SiteApply apply, String day) {
SiteInfo siteInfo = dao().fetch(SiteInfo.class, apply.getSiteId());
Sql sql = Sqls.create("""
select
sa.*
from
site_apply sa
left join wf_process_instance ins on ins.businessNo = sa.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(SiteApply::getSiteId, "=", apply.getSiteId());
cnd.and(SiteApply::getApplyDay, "=", day);
cnd.and(SiteApply::getStartTime, "=", apply.getStartTime());
cnd.and(SiteApply::getEndTime, "=", apply.getEndTime());
List<Integer> stateList = List.of(ProcessInstanceStateEnum.DOING.getCode(), ProcessInstanceStateEnum.FINISHED.getCode(), ProcessInstanceStateEnum.PENDING.getCode());
cnd.and(ProcessInstance::getState, "in", stateList);
sql.setCondition(cnd);
List<SiteApply> applyList = listEntity(sql);
long hasReserve = applyList.stream().filter(o -> o.getApplyUserId().equals(SecurityUtil.getUserId())).count();
if(hasReserve > 0) {
return Map.of(false, "您已预约该时间段");
}
int count = applyList.stream().mapToInt(SiteApply::getJoinCount).sum();
if((count + apply.getJoinCount()) > siteInfo.getMaxNum()) {
return Map.of(false, "预约人数已满");
}
return Map.of(true, "");
}
}
@@ -59,7 +59,7 @@ public class CondolenceBranchUnionApprovalController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
@@ -8,6 +8,7 @@ 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.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
@@ -98,7 +99,13 @@ public class CondolenceMineController {
cnd.andEX("year(info.createTime)", "=", year);
cnd.andEX("info.type", "=", type);
cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
cnd.desc("info.createTime");
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.desc("info.createTime");
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = condolenceService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
@@ -77,6 +77,7 @@ public class CondolenceReadController {
ins.id AS instanceId,
type.name as typeName,
ins.state instanceState,
ins.processDefineId instanceProcessDefineId,
t.displayName taskName
FROM
condolence info
@@ -61,7 +61,7 @@ public class CondolenceSchoolUnionApprovalController {
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,