Просмотр исходного кода

收银台功能 菜品优惠 定时刷状态

liudongzhi 3 недель назад
Родитель
Сommit
49d724f100

+ 8 - 0
alien-job/src/main/java/shop/alien/job/feign/AlienStoreFeign.java

@@ -101,4 +101,12 @@ public interface AlienStoreFeign {
     @org.springframework.web.bind.annotation.PostMapping("/serviceFee/job/autoCloseExpiredCustomRules")
     R<Integer> autoCloseExpiredCustomRules();
 
+    /**
+     * 菜品优惠定时任务:自动关闭已过期的自定义日期规则
+     *
+     * @return R.data 为本次关闭数量
+     */
+    @org.springframework.web.bind.annotation.PostMapping("/store/productDiscount/job/autoCloseExpiredCustomRules")
+    R<Integer> autoCloseExpiredProductDiscountRules();
+
 }

+ 29 - 0
alien-job/src/main/java/shop/alien/job/store/StoreProductDiscountRuleJob.java

@@ -0,0 +1,29 @@
+package shop.alien.job.store;
+
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import shop.alien.entity.result.R;
+import shop.alien.job.feign.AlienStoreFeign;
+
+/**
+ * 菜品优惠规则自动关闭定时任务
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class StoreProductDiscountRuleJob {
+
+    private final AlienStoreFeign alienStoreFeign;
+
+    @XxlJob("storeProductDiscountRuleAutoCloseJob")
+    public R<Integer> autoCloseExpiredCustomRules() {
+        log.info("【定时任务】菜品优惠自动关闭过期规则:开始执行");
+        R<Integer> result = alienStoreFeign.autoCloseExpiredProductDiscountRules();
+        int count = (result != null && result.getData() != null) ? result.getData() : 0;
+        log.info("【定时任务】菜品优惠自动关闭过期规则:执行完成,本次关闭条数={}", count);
+        return R.data(count);
+    }
+}
+

+ 7 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreProductDiscountController.java

@@ -89,5 +89,12 @@ public class StoreProductDiscountController {
 	public R<Boolean> switchStatus(@RequestParam Integer id, @RequestParam Integer status) {
 		return discountService.switchStatus(id, status);
 	}
+
+	@ApiOperation("定时任务-自动关闭已过期自定义日期菜品优惠")
+	@PostMapping("/job/autoCloseExpiredCustomRules")
+	public R<Integer> autoCloseExpiredCustomRules() {
+		int count = discountService.autoCloseExpiredCustomRules();
+		return R.data(count);
+	}
 }
 

+ 7 - 0
alien-store/src/main/java/shop/alien/store/service/StoreProductDiscountService.java

@@ -19,5 +19,12 @@ public interface StoreProductDiscountService {
 	R<Boolean> deleteRule(Integer id);
 
 	R<Boolean> switchStatus(Integer id, Integer status);
+
+    /**
+     * 自动关闭已过期的自定义日期优惠规则
+     *
+     * @return 本次关闭数量
+     */
+    int autoCloseExpiredCustomRules();
 }
 

+ 42 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreProductDiscountServiceImpl.java

@@ -21,6 +21,7 @@ import shop.alien.store.service.StoreProductDiscountService;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -158,6 +159,47 @@ public class StoreProductDiscountServiceImpl implements StoreProductDiscountServ
 		return R.data(true);
 	}
 
+	@Override
+	public int autoCloseExpiredCustomRules() {
+		LocalDate today = LocalDate.now();
+		LocalDateTime now = LocalDateTime.now();
+		List<StoreProductDiscountRule> candidates = ruleMapper.selectList(
+				new LambdaQueryWrapper<StoreProductDiscountRule>()
+						.eq(StoreProductDiscountRule::getStatus, 1)
+						.eq(StoreProductDiscountRule::getEffectiveMode, MODE_CUSTOM)
+						.isNotNull(StoreProductDiscountRule::getEndDate)
+						.le(StoreProductDiscountRule::getEndDate, java.sql.Date.valueOf(today)));
+		if (candidates == null || candidates.isEmpty()) {
+			return 0;
+		}
+		List<Integer> ruleIds = candidates.stream().map(StoreProductDiscountRule::getId).collect(Collectors.toList());
+		Map<Integer, List<StoreProductDiscountRuleSlot>> slotMap = ruleSlotMapper.selectList(
+				new LambdaQueryWrapper<StoreProductDiscountRuleSlot>().in(StoreProductDiscountRuleSlot::getRuleId, ruleIds))
+				.stream().collect(Collectors.groupingBy(StoreProductDiscountRuleSlot::getRuleId));
+		int closed = 0;
+		for (StoreProductDiscountRule rule : candidates) {
+			LocalDate endDate = new java.sql.Date(rule.getEndDate().getTime()).toLocalDate();
+			LocalTime maxEnd = slotMap.getOrDefault(rule.getId(), Collections.emptyList()).stream()
+					.map(StoreProductDiscountRuleSlot::getEndTime)
+					.filter(Objects::nonNull)
+					.max(LocalTime::compareTo)
+					.orElse(LocalTime.of(23, 59, 59));
+			LocalDateTime expireAt = LocalDateTime.of(endDate, maxEnd);
+			if (!now.isBefore(expireAt)) {
+				StoreProductDiscountRule update = new StoreProductDiscountRule();
+				update.setId(rule.getId());
+				update.setStatus(0);
+				if (ruleMapper.updateById(update) > 0) {
+					closed++;
+				}
+			}
+		}
+		if (closed > 0) {
+			log.info("自动关闭菜品优惠过期规则完成,本次关闭数量={}", closed);
+		}
+		return closed;
+	}
+
 	/* ---------------- private helpers ---------------- */
 
 	private Map<Integer, String> buildProductNameMap(Integer storeId) {