diff --git a/src/main/java/io/v/nutz/sys/models/SysHoliday.java b/src/main/java/io/v/nutz/sys/models/SysHoliday.java new file mode 100644 index 0000000..6a6141f --- /dev/null +++ b/src/main/java/io/v/nutz/sys/models/SysHoliday.java @@ -0,0 +1,38 @@ +package io.v.nutz.sys.models; + +import lombok.Data; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * @Author: JyuHsin + * @Date: 2024/6/6 15:33 + * @Version: v1.0.0 + * @Description: TODO + **/ +@Data +@Table("sys_holiday") +public class SysHoliday { + + @Name + @ColDefine + @Column + @PrevInsert(uu32 = true) + @Comment("id") + private String id; + + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("名称") + @Column + private String name; + + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("日期") + @Column + private String day; + + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("周几") + @Column + private String week; +} diff --git a/src/main/java/io/v/nutz/task/job/holiday/HolidayJob.java b/src/main/java/io/v/nutz/task/job/holiday/HolidayJob.java new file mode 100644 index 0000000..c4bd8ec --- /dev/null +++ b/src/main/java/io/v/nutz/task/job/holiday/HolidayJob.java @@ -0,0 +1,54 @@ +package io.v.nutz.task.job.holiday; + +import cn.hutool.http.HttpUtil; +import io.v.nutz.sys.models.SysHoliday; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: JyuHsin + * @Date: 2024/6/6 15:16 + * @Version: v1.0.0 + * @Description: 获取所有节假日,每年执行一次 + **/ +@IocBean +public class HolidayJob implements Job { + + private static final String URL = "https://timor.tech/api/holiday/year?type=Y"; + + @Inject + private Dao dao; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + NutMap resMap = Json.fromJson(NutMap.class, HttpUtil.get(URL)); + if(resMap.getInt("code") == 0) { + NutMap holidayMap = resMap.getAs("type", NutMap.class); + List result = new ArrayList<>(); + holidayMap.keySet().forEach(k -> { + NutMap day = (NutMap) holidayMap.get(k); + if(day.getInt("type") == 2) { + SysHoliday h = new SysHoliday(); + h.setDay(k); + h.setName(day.getString("name")); + h.setWeek(day.getString("week")); + result.add(h); + } + }); + if(Lang.isNotEmpty(result)) { + dao.insert(result); + } + } + } + +} diff --git a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/controller/baseManage/TheRapyRecuperationBaseManagerController.java b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/controller/baseManage/TheRapyRecuperationBaseManagerController.java index 0a57db3..3df3048 100644 --- a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/controller/baseManage/TheRapyRecuperationBaseManagerController.java +++ b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/controller/baseManage/TheRapyRecuperationBaseManagerController.java @@ -6,21 +6,26 @@ import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.wizzer.framework.base.Result; import io.v.nutz.base.annontation.ViReturn; import io.v.nutz.base.dao.CndPlus; +import io.v.nutz.base.query.PageForm; import io.v.nutz.base.service.BaseService; import io.v.nutz.base.utils.Vi; -import io.v.nutz.base.query.PageForm; +import io.v.nutz.base.utils.ViTool; +import io.v.nutz.sys.models.SysHoliday; +import io.v.nutz.sys.models.User; import io.v.nutz.web.commons.utils.ShiroUtil; import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationBaseManagement; +import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationEnroll; import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationLot; import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationTravelAgency; import io.v.nutz.zhgh.therapyRecuperation.service.baseManage.TheRapyRecuperationBaseManagerService; -import io.v.nutz.base.utils.ViTool; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresAuthentication; @@ -32,6 +37,7 @@ 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.Daos; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -45,11 +51,13 @@ import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** - * @FileName io.v.nutz.zhgh.therapyRecuperation.controller.baseManage.TheBaseManagerController + * @FileName io.v.nutz.therapyRecuperation.controller.baseManage.TheBaseManagerController * @Description: 疗休养基地管理 * @Author zzr * @Date 2023/6/5 @@ -71,7 +79,7 @@ public class TheRapyRecuperationBaseManagerController { @At("") @Ok("beetl:/platform/theRapyRecuperation/baseManage/baseManagement.html") - @RequiresPermissions("theRapyRecuperation.line") + @RequiresPermissions("theRapyRecuperation.TheBaseManagement") public void index() { } @@ -92,7 +100,7 @@ public class TheRapyRecuperationBaseManagerController { @POST @Ok("json:full") @ViReturn - @RequiresRoles(value = {"sysadmin", "SchoolUnionAdmin", "H04"}, logical = Logical.OR) + @RequiresRoles(value = {"sysadmin", "A06", "H04"}, logical = Logical.OR) public Object pageData(PageForm pageForm, Integer year, String lotId, String baseName, String unionId, String travelAgencyId, String regionalNature) { Cnd cnd = Cnd.NEW(); Sql sql = Sqls.create(""" @@ -114,8 +122,8 @@ public class TheRapyRecuperationBaseManagerController { tb.files, tb.baseContactPerson, tb.baseContactNumber, - cast( tb.files ->> '$[0].id' AS CHAR ) AS fileId, - gh.unionname createUnionName, + tb.files as fileId, + ifnull(gh.unionname, '校工会') AS createUnionName, u.username createUserName, ta.travelAgencyName, ta.contact, @@ -133,10 +141,8 @@ public class TheRapyRecuperationBaseManagerController { cnd.and(Cnd.likeEX("tb.baseName", baseName)); cnd.and(Cnd.likeEX("tb.travelAgencyId", travelAgencyId)); cnd.and(Cnd.likeEX("tb.regionalNature", regionalNature)); - cnd.desc("tb.`year`"); - cnd.asc("tb.sortNumber"); - cnd.asc("tb.id"); - if (!ShiroUtil.hasAnyRoles(List.of("sysadmin", "SchoolUnionAdmin"))) { + cnd.desc("regionalNature").asc("tb.sortNumber * 1").asc("tb.opBy"); + if (!ShiroUtil.hasAnyRoles(List.of("sysadmin", "A06"))) { if (ShiroUtil.hasRole("H04")) { cnd.and("tb.createUnionId", "=", Vi.getUnionId()); } @@ -147,6 +153,16 @@ public class TheRapyRecuperationBaseManagerController { return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); } + @At + @POST + @ViReturn + @RequiresAuthentication + @RequiresRoles(value = {"sysadmin", "A06", "H04"}, logical = Logical.OR) + public Object getNo() { + Object sortNumber = dao.func2(TheRapyRecuperationBaseManagement.class, "max", "sortNumber"); + sortNumber = Objects.requireNonNullElse(sortNumber, 0); + return Integer.parseInt(sortNumber.toString()) + 1; + } /** * 是否启用基地线路 @@ -192,8 +208,8 @@ public class TheRapyRecuperationBaseManagerController { @POST @ViReturn @RequiresAuthentication - @RequiresRoles(value = {"sysadmin", "SchoolUnionAdmin", "H04"}, logical = Logical.OR) - public Object doSubmit(@Param("base") TheRapyRecuperationBaseManagement baseManagement) { + @RequiresRoles(value = {"sysadmin", "A06", "H04"}, logical = Logical.OR) + public Object doSubmit(TheRapyRecuperationBaseManagement baseManagement) { baseManagement.setOpBy((String) ShiroUtil.getPrincipalProperty("id")); baseManagement.setCreateUnionId((String) ShiroUtil.getPrincipalProperty("unionid")); baseManagement.setOpAt(String.valueOf(new Date().getTime())); @@ -229,7 +245,15 @@ public class TheRapyRecuperationBaseManagerController { @ViReturn @RequiresAuthentication public Object listAllBase(String startYear, String endYear, String year) { - Sql sql = Sqls.create("select * from `the_rapy_recuperation_base_management` tb left join `the_rapy_recuperation_lot` lot on lot.id=tb.lotId $condition"); + Sql sql = Sqls.create(""" + SELECT + tb.*, + tl.lotName + FROM + `the_rapy_recuperation_base_management` tb + LEFT JOIN the_rapy_recuperation_lot tl ON tb.lotId = tl.id + $condition + """); CndPlus cnd = new CndPlus(); cnd.andEX("tb.`year`", ">=", startYear); @@ -254,6 +278,88 @@ public class TheRapyRecuperationBaseManagerController { return theRapyRecuperationBaseManagerService.selectBaseAllInfo(id); } + @At("/getTimeArray") + @ViReturn + @RequiresAuthentication + public Object getTimeArray(@Param("id") String id) { + + if (StrUtil.isBlank(id)) { + return Result.error("参数错误"); + } + //获取线路对应的标段 + TheRapyRecuperationBaseManagement management = dao.fetch(TheRapyRecuperationBaseManagement.class, id); + TheRapyRecuperationLot lot = dao.fetch(TheRapyRecuperationLot.class, management.getLotId()); + + //获取当年的节假日 + List holidayList = dao.query(SysHoliday.class, Cnd.where("year(day)", "=", DateUtil.thisYear()).asc("day")); + List holidays = holidayList.stream().map(SysHoliday::getDay).collect(Collectors.toList()); + //按月份分组 + Map> listMap = holidayList.stream().collect(Collectors.groupingBy(o -> DateUtil.month(DateUtil.parse(o.getDay())))); + //获取前一天 + listMap.forEach((k, v) -> { + SysHoliday sysHoliday = v.get(0); + Date date = DateUtil.parse(sysHoliday.getDay()); + Date previousDay = DateUtil.offsetDay(date, -1); + holidays.add(DateUtil.formatDate(previousDay)); + }); + + List weeks = management.getWeekCheckIn(); + + // 解析日期 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate startDate = LocalDate.parse(DateUtil.formatDate(management.getActivityStartTime()), formatter); + LocalDate endDate = LocalDate.parse(DateUtil.formatDate(management.getActivityEndTime()), formatter); + + //现在的日期 + LocalDate now = LocalDate.parse(DateUtil.today(), formatter); + + // 创建结果列表 + List resultDates = new ArrayList<>(); + + // 生成时间区间内的所有日期,并根据条件过滤 + LocalDate currentDate = startDate; + if(!now.isBefore(startDate)) { + currentDate = now; + } + while (!currentDate.isAfter(endDate)) { + // 检查是否为节假日 + String currentDateString = currentDate.format(formatter); + if (holidays.contains(currentDateString) && lot.getFilterHolidays()) { + currentDate = currentDate.plusDays(1); + continue; + } + // 检查是否为需要排除的周几 + int dayOfWeek = currentDate.getDayOfWeek().getValue() % 7; // 1是周一,7是周日 + if (Lang.isNotEmpty(weeks) && !weeks.contains(dayOfWeek)) { + currentDate = currentDate.plusDays(1); + continue; + } + resultDates.add(currentDateString); + // 递增日期 + currentDate = currentDate.plusDays(1); + } + + Sql schoolTimeSql = Sqls.create("select schoolTime from sys_user where id=@id").setParam("id", ShiroUtil.getPlatformUid()); + String schoolTime = (String) Daos.query(dao, schoolTimeSql.toString(), Sqls.callback.str()); + String minDate = DateUtil.formatDate(management.getActivityStartTime()); + //如果入职日期在活动开始时间之后的 + try { + if (StrUtil.isNotBlank(schoolTime) + && String.valueOf(DateUtil.thisYear() - 1).equals(DateUtil.format(DateUtil.parse(schoolTime), "yyyy")) + && DateUtil.compare(DateUtil.parse(schoolTime), management.getActivityStartTime(), "MM") > 0) { + minDate = DateUtil.format(DateUtil.offset(DateUtil.parse(schoolTime), DateField.YEAR, 1), "yyyy-MM-dd"); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return Map.of("days", resultDates, + "holidays", holidays, + "lotValue", lot.getLotValue(), + "minDate", minDate, + "maxDate", DateUtil.formatDate(management.getActivityEndTime())); + } + /** * 目的地导入模版 @@ -358,4 +464,17 @@ public class TheRapyRecuperationBaseManagerController { return null; } + @At + @ViReturn + public Object getUserByLoginName(String loginName) { + return baseService.dao().fetch(User.class, Cnd.where("loginname", "=", loginName)); + } + + + @At + @ViReturn + public Object isTakePart(String loginName) { + return baseService.dao().count(TheRapyRecuperationEnroll.class, Cnd.where("YEAR(takePartInTime)", "=", Calendar.getInstance().get(Calendar.YEAR)).and("loginname", "=", loginName)); + } + } diff --git a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationBaseManagement.java b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationBaseManagement.java index bc8006e..6e50962 100644 --- a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationBaseManagement.java +++ b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationBaseManagement.java @@ -1,7 +1,7 @@ package io.v.nutz.zhgh.therapyRecuperation.model; import cn.afterturn.easypoi.excel.annotation.Excel; -import io.v.nutz.sys.models.Sys_file; +import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationTravelAgency; import lombok.Data; import lombok.experimental.Accessors; import org.nutz.dao.entity.annotation.*; @@ -11,7 +11,7 @@ import java.util.Date; import java.util.List; /** - * @FileName io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationBaseManagement + * @FileName io.v.nutz.therapyRecuperation.model.TheRapyRecuperationBaseManagement * @Description: TODO * @Author zzr * @Date 2023/6/5 @@ -35,10 +35,10 @@ public class TheRapyRecuperationBaseManagement { private Integer year; @Column - @ColDefine(type = ColType.VARCHAR, width = 50) + @ColDefine(type = ColType.INT) @Comment("排序编号") @Excel(name = "排序编号") - private String sortNumber; + private Integer sortNumber; @Column @ColDefine(type = ColType.VARCHAR, width = 50) @@ -118,9 +118,9 @@ public class TheRapyRecuperationBaseManagement { private String estimatedCost; @Column - @ColDefine(type = ColType.MYSQL_JSON) + @ColDefine(type = ColType.VARCHAR, width = 100) @Comment("缩略图") - private List files; + private String files; @Column @ColDefine(type = ColType.INT) @@ -152,6 +152,10 @@ public class TheRapyRecuperationBaseManagement { @Comment("操作时间") private String opAt; + @Column + @ColDefine(type = ColType.MYSQL_JSON) + @Comment("报名选择周几入住") + private List weekCheckIn; @One(field = "travelAgencyId") private TheRapyRecuperationTravelAgency travelAgency; diff --git a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationLot.java b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationLot.java index 72f84c4..9373ce3 100644 --- a/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationLot.java +++ b/src/main/java/io/v/nutz/zhgh/therapyRecuperation/model/TheRapyRecuperationLot.java @@ -5,6 +5,8 @@ import lombok.experimental.Accessors; import org.nutz.dao.entity.annotation.*; import org.nutz.dao.interceptor.annotation.PrevInsert; +import java.util.List; + /** * @FileName io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationLot * @Description: TODO @@ -44,4 +46,13 @@ public class TheRapyRecuperationLot { @Comment("配置ID") private String configId; + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("排除节假日及前一天") + private Boolean filterHolidays; + + @Column + @ColDefine(type = ColType.MYSQL_JSON) + @Comment("报名选择周几入住") + private List weekCheckIn; } diff --git a/src/main/resources/views/mobile/therapyRecuperation/baseManagement.html b/src/main/resources/views/mobile/therapyRecuperation/baseManagement.html index 089937c..ed760ec 100644 --- a/src/main/resources/views/mobile/therapyRecuperation/baseManagement.html +++ b/src/main/resources/views/mobile/therapyRecuperation/baseManagement.html @@ -3,6 +3,12 @@ layout("/mobile/platform.html"){ #-->
@@ -234,14 +292,9 @@ layout("/mobile/platform.html"){
- -
-
- + 上下滑动翻页,单击查看,再单击返回 +
+
@@ -251,15 +304,22 @@ layout("/mobile/platform.html"){ class="top_icon"> - + + diff --git a/src/main/resources/views/platform/theRapyRecuperation/baseManage/baseManagement.html b/src/main/resources/views/platform/theRapyRecuperation/baseManage/baseManagement.html index 013e7be..44be92d 100644 --- a/src/main/resources/views/platform/theRapyRecuperation/baseManage/baseManagement.html +++ b/src/main/resources/views/platform/theRapyRecuperation/baseManage/baseManagement.html @@ -76,7 +76,8 @@ layout("/layouts/platform.html"){ @@ -109,6 +110,9 @@ layout("/layouts/platform.html"){ {{item.lotName}} + - + +