diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStore.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStore.java index f9042b0..07ea5f7 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStore.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStore.java @@ -48,6 +48,9 @@ public class GaoStore extends UUIDEntity { /// 备注 private String remark; + /// true 为启用自动计算营业日休息日 + private Boolean autoClosedDay; + /// 排序值 private Integer sort; diff --git a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStoreBusinessDay.java b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStoreBusinessDay.java index 6192ef0..a83aa61 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStoreBusinessDay.java +++ b/src/main/java/com/imyeyu/api/modules/gao/entity/GaoStoreBusinessDay.java @@ -18,7 +18,7 @@ public class GaoStoreBusinessDay extends UUIDEntity { /// /// @author Codex /// @since 2026-08-06 - public enum OpenStatus { + public enum Status { /// 营业 OPEN, @@ -34,7 +34,7 @@ public class GaoStoreBusinessDay extends UUIDEntity { private Integer dateValue; /// 营业状态 - private OpenStatus openStatus; + private Status status; /// 营业日递增序号,仅营业日有值 private Long businessDayNo; diff --git a/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoStoreMapper.java b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoStoreMapper.java index 0dcb790..27ec207 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoStoreMapper.java +++ b/src/main/java/com/imyeyu/api/modules/gao/mapper/GaoStoreMapper.java @@ -3,6 +3,7 @@ package com.imyeyu.api.modules.gao.mapper; import com.imyeyu.api.modules.gao.entity.GaoStore; import com.imyeyu.spring.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import java.util.Collection; import java.util.List; @@ -16,6 +17,12 @@ public interface GaoStoreMapper extends BaseMapper { List selectByIdList(@Param("idList") Collection idList); + /// 查询启用自动计算营业日休息日的可用门店 + /// + /// @return 门店列表 + @Select("SELECT * FROM `gao_store` WHERE `auto_closed_day` = TRUE AND `status` = 'ACTIVE' " + NOT_DELETE) + List selectAllByAutoClosedDay(); + /// 查询用户所属的可用门店 /// /// @param userId 用户 ID diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/GaoStoreBusinessDayService.java b/src/main/java/com/imyeyu/api/modules/gao/service/GaoStoreBusinessDayService.java index fb6eb78..a64f449 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/GaoStoreBusinessDayService.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/GaoStoreBusinessDayService.java @@ -23,6 +23,12 @@ public interface GaoStoreBusinessDayService extends BaseService { String getBelongIdByRequiredLoginUserId(); + List listByAutoClosedDay(); + /// 导出门店列表 /// /// @param page 分页查询条件 diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoStoreBusinessDayServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoStoreBusinessDayServiceImplement.java index a359323..2fa8fd6 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoStoreBusinessDayServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoStoreBusinessDayServiceImplement.java @@ -37,7 +37,7 @@ public class GaoStoreBusinessDayServiceImplement extends AbstractEntityService listByDateRange(String storeId, Integer beginDateValue, Integer endDateValue) { TimiException.required(storeId, "not found storeId"); @@ -120,8 +140,8 @@ public class GaoStoreBusinessDayServiceImplement extends AbstractEntityService listByAutoClosedDay() { + return mapper.selectAllByAutoClosedDay(); + } + @Override public byte[] export(Page page) throws IOException { page.setIndex(0); diff --git a/src/main/java/com/imyeyu/api/modules/gao/task/GaoStoreAutoCloseDayTask.java b/src/main/java/com/imyeyu/api/modules/gao/task/GaoStoreAutoCloseDayTask.java new file mode 100644 index 0000000..583cf75 --- /dev/null +++ b/src/main/java/com/imyeyu/api/modules/gao/task/GaoStoreAutoCloseDayTask.java @@ -0,0 +1,43 @@ +package com.imyeyu.api.modules.gao.task; + +import com.imyeyu.api.modules.gao.entity.GaoStore; +import com.imyeyu.api.modules.gao.service.GaoStoreBusinessDayService; +import com.imyeyu.api.modules.gao.service.GaoStoreService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; + +/// +/// GAO 门店营业日自动休息任务 +/// +/// @author Codex +/// @since 2026-08-12 +@Slf4j +@Service +@RequiredArgsConstructor +public class GaoStoreAutoCloseDayTask { + + private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + + private final GaoStoreService storeService; + private final GaoStoreBusinessDayService businessDayService; + + /// 每天零点后自动补记前一天无登记门店的休息日 + @Scheduled(cron = "0 1 0 * * ?") + public void run() { + int dateValue = Integer.parseInt(DAY_FORMATTER.format(LocalDate.now().minusDays(1))); + List storeList = storeService.listByAutoClosedDay(); + for (GaoStore store : storeList) { + try { + businessDayService.autoCloseBusinessDay(store.getId(), dateValue); + } catch (Exception e) { + log.error("自动补记 GAO 门店休息日失败: storeId[{}], dateValue[{}]", store.getId(), dateValue, e); + } + } + } +} diff --git a/src/main/java/com/imyeyu/api/modules/gao/util/StoreXSSFBuilder.java b/src/main/java/com/imyeyu/api/modules/gao/util/StoreXSSFBuilder.java index 000f7eb..a002b41 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/util/StoreXSSFBuilder.java +++ b/src/main/java/com/imyeyu/api/modules/gao/util/StoreXSSFBuilder.java @@ -35,7 +35,7 @@ public class StoreXSSFBuilder extends BaseXSSFBuilder { appendRow(sheet, 0, titleStyle, "门店列表导出"); appendRow(sheet, 1, null, "生成时间", Time.nowString()); appendRow(sheet, 2, null, "记录总数", String.valueOf(list.size())); - appendRow(sheet, 3, headerStyle, "门店编码", "门店名称", "状态", "电话", "地址", "备注", "排序", "创建时间"); + appendRow(sheet, 3, headerStyle, "门店编码", "门店名称", "状态", "电话", "地址", "备注", "自动计算休息日", "排序", "创建时间"); int rowIndex = 4; for (GaoStore store : list) { appendRow(sheet, rowIndex, null, @@ -45,12 +45,13 @@ public class StoreXSSFBuilder extends BaseXSSFBuilder { text(store.getTelephone()), text(store.getAddress()), text(store.getRemark()), + Boolean.TRUE.equals(store.getAutoClosedDay()) ? "是" : "否", store.getSort() == null ? "" : String.valueOf(store.getSort()), Time.toDateTime(store.getCreatedAt()) ); rowIndex++; } - for (int index = 0; index < 8; index++) { + for (int index = 0; index < 9; index++) { sheet.autoSizeColumn(index); sheet.setColumnWidth(index, Math.clamp(sheet.getColumnWidth(index), 10 * 256, 36 * 256)); } diff --git a/src/main/resources/db/migration/timiserver/V30__add_gao_store_auto_closed_day.sql b/src/main/resources/db/migration/timiserver/V30__add_gao_store_auto_closed_day.sql new file mode 100644 index 0000000..dcd4103 --- /dev/null +++ b/src/main/resources/db/migration/timiserver/V30__add_gao_store_auto_closed_day.sql @@ -0,0 +1,4 @@ +ALTER TABLE `gao_store` + ADD COLUMN `auto_closed_day` BOOLEAN NOT NULL DEFAULT FALSE COMMENT 'true 为启用自动计算休息日' AFTER `remark`; +ALTER TABLE `gao_store_business_day` + RENAME COLUMN `open_status` TO `status`; \ No newline at end of file