Explorar o código

迁移定时任务

ssk hai 4 meses
pai
achega
39a9aa3d21

+ 0 - 1
alien-job/src/main/java/shop/alien/job/AlienJobApplication.java

@@ -6,7 +6,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 
-
 @SpringBootApplication
 @ComponentScan({"shop.alien.job.*", "shop.alien.config.redis", "shop.alien.config.databases",})
 @MapperScan({"shop.alien.mapper"})

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

@@ -13,4 +13,34 @@ public interface AlienStoreFeign {
             @RequestParam(value = "messageReceiverId") String messageReceiverId,
             @RequestParam(value = "webSocketVoStr") String webSocketVoStr);
 
+    /**
+     * 转账
+     *
+     * @param name
+     * @param idCard
+     * @param phone
+     * @param money
+     * @return
+     */
+    @GetMapping("/ali/pay")
+    JSONObject aliPay(
+            @RequestParam(value = "name") String name,
+            @RequestParam(value = "idCard") String idCard,
+            @RequestParam(value = "phone") String phone,
+            @RequestParam(value = "money") String money
+    );
+
+    /**
+     * 删除附近商家
+     *
+     * @param flag
+     * @param content
+     * @return
+     */
+    @GetMapping("/near/me/delMer")
+    JSONObject delMer(
+            @RequestParam(value = "flag") Boolean flag,
+            @RequestParam(value = "content") String content
+    );
+
 }

+ 9 - 9
alien-store/src/main/java/shop/alien/store/job/DeliciousFoodJob.java → alien-job/src/main/java/shop/alien/job/store/DeliciousFoodJob.java

@@ -1,13 +1,13 @@
-package shop.alien.store.job;
+package shop.alien.job.store;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.store.*;
 import shop.alien.mapper.*;
-import shop.alien.store.config.BaseRedisService;
 
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -61,7 +61,7 @@ public class DeliciousFoodJob {
     /**
      * 美食筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("deliciousFoodJob")
     public void deliciousFoodJob() {
         // 获取所有美食筛选
         List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(
@@ -486,7 +486,7 @@ public class DeliciousFoodJob {
     /**
      * 酒店和民宿筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("hotelAndHomestayJob")
     public void hotelAndHomestayJob() {
         // 获取所有酒店民宿筛选
         List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(
@@ -1033,7 +1033,7 @@ public class DeliciousFoodJob {
     /**
      * 汗蒸洗浴筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("takeABathAndSaunaJob")
     public void takeABathAndSaunaJob() {
         // 获取所有洗浴汗蒸筛选
         List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(
@@ -1284,7 +1284,7 @@ public class DeliciousFoodJob {
     /**
      * 丽人美发筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("lirenHairdressingJob")
     public void lirenHairdressingJob() {
         // 获取所有丽人筛选
         List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(
@@ -1299,7 +1299,7 @@ public class DeliciousFoodJob {
     /**
      * 运动健身筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("sportsAndFitnessJob")
     public void sportsAndFitnessJob() {
         // 获取所有的运动健身1级菜单
         List<EssentialModuleInformation> moduleInformations = informationMapper.selectList(
@@ -1385,7 +1385,7 @@ public class DeliciousFoodJob {
     /**
      * 医美医疗筛选标签定时存储数据
      */
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("medicalAestheticsJob")
     public void medicalAestheticsJob() {
         // 获取所有医美医疗筛选标签
         List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(

+ 4 - 4
alien-store/src/main/java/shop/alien/store/job/KTVJob.java → alien-job/src/main/java/shop/alien/job/store/KTVJob.java

@@ -1,13 +1,13 @@
-package shop.alien.store.job;
+package shop.alien.job.store;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.store.*;
-import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.EssentialModuleInformationMapper;
 import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.StoreInfoMapper;
@@ -37,7 +37,7 @@ public class KTVJob {
 
     private final StoreLabelTypeMapper storeLabelTypeMapper;
 
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("ktvJob")
     public void ktvJob() {
 
         // 获取所有的商家信息

+ 164 - 0
alien-job/src/main/java/shop/alien/job/store/LifeCouponJob.java

@@ -0,0 +1,164 @@
+package shop.alien.job.store;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.store.LifeCoupon;
+import shop.alien.entity.store.LifeUserOrder;
+import shop.alien.mapper.LifeCouponMapper;
+import shop.alien.mapper.LifeUserOrderMapper;
+import shop.alien.util.common.AlipayTradeRefund;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 优惠券定时任务
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/8/6 14:19
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class LifeCouponJob {
+
+    private final LifeCouponMapper lifeCouponMapper;
+
+    private final LifeUserOrderMapper lifeUserOrderMapper;
+
+    private final AlipayTradeRefund alipayTradeRefund;
+
+    /**
+     * 该方法用于定时更新生活优惠券(LifeCoupon)的状态
+     */
+    @XxlJob("quanStatusUpdateTask")
+    public void quanStatusUpdateTask() {
+        //执行修改代金券状态
+        System.out.println("执行修改代金券状态 ===>");
+        // 获取当前时间
+        Date now = new Date();
+        // 创建一个 Calendar 实例,用于对日期进行操作
+        Calendar calendar = Calendar.getInstance();
+        // 将 Calendar 的时间设置为当前时间
+        calendar.setTime(now);
+        // 将 Calendar 的小时设置为 0
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        // 将 Calendar 的分钟设置为 0
+        calendar.set(Calendar.MINUTE, 0);
+        // 将 Calendar 的秒设置为 0
+        calendar.set(Calendar.SECOND, 0);
+        // 将 Calendar 的毫秒设置为 0
+        calendar.set(Calendar.MILLISECOND, 0);
+        // 获取处理后的时间,即当前日期的零点
+        now = calendar.getTime();
+
+        // 创建一个 LambdaUpdateWrapper 用于查询生活优惠券,这里实际上主要用于查询操作
+        LambdaUpdateWrapper<LifeCoupon> selectWrapper = new LambdaUpdateWrapper<>();
+        // 创建一个集合,用于存储要查询的优惠券状态值
+        List<Integer> ids = new ArrayList<>();
+        // 待审核
+        ids.add(0);
+        // 进行中
+        ids.add(1);
+        // 已暂停
+        ids.add(2);
+        // 设置查询条件,查询状态为 0、1 或 2 的生活优惠券
+        selectWrapper.in(LifeCoupon::getStatus, ids);
+        // 调用 lifeCouponMapper 的 selectList 方法,根据上述条件查询生活优惠券列表
+        List<LifeCoupon> jinxingzhongList = lifeCouponMapper.selectList(selectWrapper);
+        // 判断查询结果列表是否不为空
+        if (!jinxingzhongList.isEmpty()) {
+            // 遍历查询到的生活优惠券列表
+            for (LifeCoupon quan : jinxingzhongList) {
+                // 获取当前优惠券的结束日期
+                Date endTime = quan.getEndDate();
+                // 比较当前日期(零点)和优惠券的结束日期,如果当前日期大于结束日期  将状态变成已结束
+                if (now.compareTo(endTime) > 0) {
+                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
+                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
+                    // 设置更新条件,根据优惠券的 ID 进行更新
+                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
+                            // 设置要更新的字段,将优惠券的状态更新为 3
+                            .set(LifeCoupon::getStatus, 3);
+                    // 调用 lifeCouponMapper 的 update 方法,根据上述条件更新优惠券的状态
+                    lifeCouponMapper.update(null, updateWrapper);
+                }
+            }
+        }
+
+        // 创建另一个 LambdaUpdateWrapper 用于查询状态为 0 的生活优惠券
+        LambdaUpdateWrapper<LifeCoupon> selectWrapper2 = new LambdaUpdateWrapper<>();
+        // 设置查询条件,查询状态为 0 的生活优惠券
+        selectWrapper2.eq(LifeCoupon::getStatus, 0);
+        // 调用 lifeCouponMapper 的 selectList 方法,根据上述条件查询生活优惠券列表
+        List<LifeCoupon> weikaishiList = lifeCouponMapper.selectList(selectWrapper2);
+        // 判断查询结果列表是否不为空
+        if (!weikaishiList.isEmpty()) {
+            // 遍历查询到的生活优惠券列表
+            for (LifeCoupon quan : weikaishiList) {
+                // 获取当前优惠券的开始日期
+                Date startTime = quan.getStartDate();
+                // 获取当前优惠券的结束日期
+                Date endTime = quan.getEndDate();
+                // 判断当前日期(零点)是否在优惠券的开始日期和结束日期之间  将待使用变成进行中
+                if (now.compareTo(startTime) >= 0 && now.compareTo(endTime) <= 0) {
+                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
+                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
+                    // 设置更新条件,根据优惠券的 ID 进行更新
+                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
+                            // 设置要更新的字段,将优惠券的状态更新为 1
+                            .set(LifeCoupon::getStatus, 1);
+                    // 调用 lifeCouponMapper 的 update 方法,根据上述条件更新优惠券的状态
+                    lifeCouponMapper.update(null, updateWrapper);
+                }
+            }
+        }
+    }
+
+    /**
+     * 过期自动退
+     */
+    @XxlJob("orderStatusUpdateTask")
+    public void orderStatusUpdateTask() {
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        now = calendar.getTime();
+        LambdaUpdateWrapper<LifeUserOrder> selectWrapper = new LambdaUpdateWrapper<>();
+        List<Integer> ids = new ArrayList<>();
+        ids.add(0);
+        ids.add(3);
+        selectWrapper.in(LifeUserOrder::getStatus, ids);
+        List<LifeUserOrder> orderList = lifeUserOrderMapper.selectList(selectWrapper);
+        if (!orderList.isEmpty()) {
+            for (LifeUserOrder order : orderList) {
+                Date payTime = order.getPayTime();
+                LifeCoupon quan = lifeCouponMapper.selectById(order.getQuanId());
+                calendar.setTime(payTime);
+                calendar.add(Calendar.DAY_OF_MONTH, quan.getExpirationDate());
+                Date guoqiDate = calendar.getTime();
+                Date endDate = quan.getEndDate();
+                if (now.compareTo(guoqiDate) > 0 || now.compareTo(endDate) > 0) {
+                    String result = alipayTradeRefund.processRefund(order.getOrderNo(), order.getFinalPrice(), "过期自动退");
+                    if (result.equals("调用成功")) {
+                        LambdaUpdateWrapper<LifeUserOrder> updateWrapper = new LambdaUpdateWrapper<>();
+                        updateWrapper.eq(LifeUserOrder::getId, order.getId()).set(LifeUserOrder::getStatus, 4).set(LifeUserOrder::getRefundTime, new Date());
+                        lifeUserOrderMapper.update(null, updateWrapper);
+                    }
+                }
+            }
+        }
+    }
+
+
+}

+ 79 - 0
alien-job/src/main/java/shop/alien/job/store/LifeReverseGroupBuyingJob.java

@@ -0,0 +1,79 @@
+package shop.alien.job.store;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.store.LifeMessage;
+import shop.alien.entity.store.LifeReverseGroupBuying;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.LifeUserOrder;
+import shop.alien.mapper.LifeMessageMapper;
+import shop.alien.mapper.LifeReverseGroupBuyingMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.LifeUserOrderMapper;
+import shop.alien.util.common.AlipayTradeRefund;
+import shop.alien.util.common.DateUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 反向团购job
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/8/6 14:21
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class LifeReverseGroupBuyingJob {
+
+    private final LifeUserOrderMapper lifeUserOrderMapper;
+
+    private final AlipayTradeRefund alipayTradeRefund;
+
+    private final LifeReverseGroupBuyingMapper lifeReverseGroupBuyingMapper;
+
+    private final LifeMessageMapper lifeMessageMapper;
+
+    private final LifeUserMapper lifeUserMapper;
+
+    /**
+     * 反向团购订单自动退款
+     */
+    @XxlJob("reverseGroupOrder")
+    public void reverseGroupOrder() {
+        LambdaQueryWrapper<LifeReverseGroupBuying> wrapper = new LambdaQueryWrapper<>();
+        //状态, 0:待审核, 1:未通过, 2:已通过, 3:待接单, 4:未接单(已截止), 5:待使用, 6:已完成, 7:已退款
+        wrapper.eq(LifeReverseGroupBuying::getStatus, 4);
+        List<LifeReverseGroupBuying> list = lifeReverseGroupBuyingMapper.selectList(new LambdaQueryWrapper<>());
+        for (LifeReverseGroupBuying lifeReverseGroupBuying : list) {
+            //竞价结束
+            if (DateUtils.dateCompare(new Date(), lifeReverseGroupBuying.getBiddingEndTime())) {
+                LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(lifeReverseGroupBuying.getOrderId());
+                String s = alipayTradeRefund.processRefund(lifeUserOrder.getOrderNo(), new BigDecimal(lifeReverseGroupBuying.getGroupMoney()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString(), "用户反向团购, 未有商家接单");
+                if (s.contains("成功")) {
+                    //修改状态
+                    lifeReverseGroupBuying.setStatus(7);
+                    lifeReverseGroupBuyingMapper.updateById(lifeReverseGroupBuying);
+                } else {
+                    LifeUser lifeUser = lifeUserMapper.selectById(lifeUserOrder.getUserId());
+                    LifeMessage lifeMessage = new LifeMessage();
+                    lifeMessage.setSenderName("system");
+                    if (lifeUser != null) {
+                        lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
+                        lifeMessage.setContent("你有一笔反向团购退款失败, 请联系管理员");
+                        lifeMessage.setType("2");
+                        lifeMessageMapper.insert(lifeMessage);
+                    }
+
+                }
+            }
+        }
+    }
+}

+ 14 - 32
alien-store/src/main/java/shop/alien/store/job/MassageFootBathJob.java → alien-job/src/main/java/shop/alien/job/store/MassageFootBathJob.java

@@ -1,15 +1,15 @@
-package shop.alien.store.job;
+package shop.alien.job.store;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.store.EssentialModuleInformation;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.StoreBusinessInfo;
 import shop.alien.entity.store.StoreLabelType;
-import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.EssentialModuleInformationMapper;
 import shop.alien.mapper.LifeCouponMapper;
 import shop.alien.mapper.StoreBusinessInfoMapper;
@@ -49,12 +49,11 @@ public class MassageFootBathJob {
 
     private final StoreLabelTypeMapper storeLabelTypeMapper;
 
-//    @Scheduled(cron = "0 0 0/2 * * ?")
+    @XxlJob("MassageFootBathJob")
     public void MassageFootBathJob() {
 
         // 获取所有足浴按摩筛选
-        List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(
-                new LambdaQueryWrapper<EssentialModuleInformation>().eq(EssentialModuleInformation::getParentId, 1360));
+        List<EssentialModuleInformation> essentialModuleInformations = informationMapper.selectList(new LambdaQueryWrapper<EssentialModuleInformation>().eq(EssentialModuleInformation::getParentId, 1360));
 
         // 获取所有商家的营业时间
         List<StoreBusinessInfo> storeBusinessInfos = storeBusinessInfoMapper.selectBusinessInfo("按摩足浴");
@@ -68,8 +67,7 @@ public class MassageFootBathJob {
         for (EssentialModuleInformation essentialModuleInformation : essentialModuleInformations) {
             Integer informationId = essentialModuleInformation.getId();
             // 获取所有数据值
-            List<EssentialModuleInformation> businessHours = informationMapper.selectList(
-                    new LambdaQueryWrapper<EssentialModuleInformation>().eq(EssentialModuleInformation::getParentId, informationId));
+            List<EssentialModuleInformation> businessHours = informationMapper.selectList(new LambdaQueryWrapper<EssentialModuleInformation>().eq(EssentialModuleInformation::getParentId, informationId));
             switch (informationId) {
                 case 1587:
                     for (EssentialModuleInformation businessHour : businessHours) {
@@ -87,23 +85,15 @@ public class MassageFootBathJob {
                                 // 将字符串解析为 LocalTime 对象
                                 LocalTime localTime = LocalTime.parse(time);
                                 // 获取当前在营业的商家
-                                list = storeBusinessInfos.stream()
-                                        .filter(item -> localTime.isBefore(LocalTime.parse(item.getEndTime())))
-                                        .collect(Collectors.toList());
-                                storeIds = list.stream()
-                                        .map(item -> String.valueOf(item.getStoreId()))
-                                        .collect(Collectors.joining(","));
+                                list = storeBusinessInfos.stream().filter(item -> localTime.isBefore(LocalTime.parse(item.getEndTime()))).collect(Collectors.toList());
+                                storeIds = list.stream().map(item -> String.valueOf(item.getStoreId())).collect(Collectors.joining(","));
                                 // 将商家storeId添加到redis中
                                 baseRedisService.setString("1599", storeIds);
                                 break;
                             case 1600: // 24小时营业
-                                list = storeBusinessInfos.stream()
-                                        .filter(item -> ZERO_TIME.equals(item.getStartTime()) && TWENTY_FOUR_TIME.equals(item.getEndTime()))
-                                        .collect(Collectors.toList());
+                                list = storeBusinessInfos.stream().filter(item -> ZERO_TIME.equals(item.getStartTime()) && TWENTY_FOUR_TIME.equals(item.getEndTime())).collect(Collectors.toList());
                                 // 获取过滤后列表中每个对象的 storeId 字段,并用逗号连接成字符串
-                                storeIds = list.stream()
-                                        .map(item -> String.valueOf(item.getStoreId()))
-                                        .collect(Collectors.joining(","));
+                                storeIds = list.stream().map(item -> String.valueOf(item.getStoreId())).collect(Collectors.joining(","));
                                 // 将商家storeId添加到redis中
                                 baseRedisService.setString("1600", storeIds);
                                 break;
@@ -444,13 +434,9 @@ public class MassageFootBathJob {
      * @return
      */
     private String getLifeCoupons(List<LifeCoupon> lifeCoupons, Integer startNum, Integer endNum) {
-        List<LifeCoupon> list = lifeCoupons.stream()
-                .filter(item -> Integer.parseInt(item.getPrice()) >= startNum && Integer.parseInt(item.getPrice()) < endNum)
-                .collect(Collectors.toList());
+        List<LifeCoupon> list = lifeCoupons.stream().filter(item -> Integer.parseInt(item.getPrice()) >= startNum && Integer.parseInt(item.getPrice()) < endNum).collect(Collectors.toList());
         // 获取过滤后列表中每个对象的 storeId 字段,并用逗号连接成字符串
-        return list.stream()
-                .map(item -> String.valueOf(item.getStoreId()))
-                .collect(Collectors.joining(","));
+        return list.stream().map(item -> String.valueOf(item.getStoreId())).collect(Collectors.joining(","));
     }
 
     /**
@@ -461,12 +447,8 @@ public class MassageFootBathJob {
      * @return
      */
     private String getStoreLabelTypes(List<StoreLabelType> storeLabelTypes, String label) {
-        List<StoreLabelType> list = storeLabelTypes.stream()
-                .filter(item -> item.getLabel().contains(label))
-                .collect(Collectors.toList());
+        List<StoreLabelType> list = storeLabelTypes.stream().filter(item -> item.getLabel().contains(label)).collect(Collectors.toList());
         // 获取过滤后列表中每个对象的 storeId 字段,并用逗号连接成字符串
-        return list.stream()
-                .map(item -> String.valueOf(item.getStoreId()))
-                .collect(Collectors.joining(","));
+        return list.stream().map(item -> String.valueOf(item.getStoreId())).collect(Collectors.joining(","));
     }
 }

+ 118 - 0
alien-job/src/main/java/shop/alien/job/store/StoreIncomeDetailsJob.java

@@ -0,0 +1,118 @@
+package shop.alien.job.store;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.store.StoreAliPayLog;
+import shop.alien.entity.store.StoreCashOutRecord;
+import shop.alien.entity.store.StoreIncomeDetailsRecord;
+import shop.alien.entity.store.StoreUser;
+import shop.alien.job.feign.AlienStoreFeign;
+import shop.alien.mapper.StoreCashOutRecordMapper;
+import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
+import shop.alien.mapper.StoreUserMapper;
+import shop.alien.util.common.DateUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 我的钱包
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/8/6 14:21
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class StoreIncomeDetailsJob {
+
+    private final StoreIncomeDetailsRecordMapper storeIncomeDetailsRecordMapper;
+
+    private final StoreCashOutRecordMapper storeCashOutRecordService;
+
+    private final StoreUserMapper storeUserService;
+
+    private final AlienStoreFeign alienStoreFeign;
+
+    /**
+     * 我的钱包已到账期自动转账
+     */
+    @XxlJob("autoTransferAccounts")
+    public void autoTransferAccounts() {
+        //获取已到账期
+        LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.lt(StoreIncomeDetailsRecord::getCreatedTime, DateUtils.calcDays(new Date(), -28)).isNull(StoreIncomeDetailsRecord::getCashOutId);
+        List<StoreIncomeDetailsRecord> list = storeIncomeDetailsRecordMapper.selectList(wrapper);
+        // 根据 storeId 分组
+        Map<Integer, List<StoreIncomeDetailsRecord>> groupedByStoreId = list.stream()
+                .collect(Collectors.groupingBy(StoreIncomeDetailsRecord::getStoreId));
+        //获取账户余额
+        List<Integer> storeIds = new ArrayList<>();
+        Map<Integer, Integer> storeMoney = new HashMap<>();
+        Map<Integer, Integer> storeCommission = new HashMap<>();
+        groupedByStoreId.forEach((storeId, records) -> {
+            storeIds.add(storeId);
+            // 对每个 storeId 对应的 records 进行处理
+            int money = 0;
+            int commission = 0;
+            for (StoreIncomeDetailsRecord record : records) {
+                money += record.getMoney() - record.getCommission();
+                commission += record.getCommission();
+            }
+            storeMoney.put(storeId, money);
+            storeCommission.put(storeId, commission);
+        });
+        List<StoreUser> storeUserList = storeUserService.selectList(new LambdaUpdateWrapper<StoreUser>().in(StoreUser::getStoreId, storeIds));
+        //转账
+        storeMoney.forEach((storeId, money) -> {
+            if (money < 10) {
+                log.info("账户已到账期金额小于最小转账金额, 用户id: {},金额: {}", storeId, money);
+            } else {
+                List<StoreUser> userList = storeUserList.stream()
+                        .filter(storeUser -> storeUser.getStoreId().equals(storeId))
+                        .collect(Collectors.toList());
+                if (!userList.isEmpty()) {
+                    StoreUser filteredUsers = userList.get(0);
+                    JSONObject pay = alienStoreFeign.aliPay(filteredUsers.getName(), filteredUsers.getIdCard(), filteredUsers.getPhone(), new BigDecimal(money).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+                    if (null == pay) {
+                        log.error("支付宝转账失败, 用户: {},金额: {}", filteredUsers.getPhone(), money);
+                    } else {
+                        StoreCashOutRecord storeCashOutRecord = new StoreCashOutRecord();
+                        //转账记录表
+                        StoreAliPayLog storeAliPayLog = JSONObject.parseObject(String.valueOf(pay), StoreAliPayLog.class);
+                        storeCashOutRecord.setStoreId(storeId)
+                                .setMoney(money)
+                                .setCommission(storeCommission.get(storeId))
+                                .setCashOutType(1)
+                                .setOrderNo(storeAliPayLog.getOutBizNo())
+                                .setAliOrderNo(storeAliPayLog.getOrderId())
+                                .setIncomeStartTime(groupedByStoreId.get(storeId).get(0).getCreatedTime())
+                                .setIncomeEndTime(groupedByStoreId.get(storeId).get(groupedByStoreId.get(storeId).size() - 1).getCreatedTime())
+                                .setPaymentDate(new Date());
+                        storeCashOutRecordService.insert(storeCashOutRecord);
+                        list.forEach(record -> {
+                            if (record.getStoreId().equals(storeId)) {
+                                record.setCashOutId(storeCashOutRecord.getId());
+                            }
+                            //增加记录
+                            storeIncomeDetailsRecordMapper.insert(record);
+                        });
+                        //减少金额
+                        filteredUsers.setMoney(filteredUsers.getMoney() - money);
+                        storeUserService.updateById(filteredUsers);
+                    }
+                }
+            }
+        });
+
+    }
+
+}

+ 9 - 10
alien-store/src/main/java/shop/alien/store/job/StoreMembershipCardJob.java → alien-job/src/main/java/shop/alien/job/store/StoreMembershipCardJob.java

@@ -1,14 +1,14 @@
-package shop.alien.store.job;
+package shop.alien.job.store;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.store.*;
-import shop.alien.store.config.BaseRedisService;
+import shop.alien.job.feign.AlienStoreFeign;
 import shop.alien.mapper.*;
-import shop.alien.store.service.NearMeService;
 
 import java.util.Calendar;
 import java.util.Date;
@@ -54,15 +54,14 @@ public class StoreMembershipCardJob {
 
     private final LifeUserMapper lifeUserMapper;
 
-    private final NearMeService nearMeService;
-
     private final LifeFansMapper lifeFansMapper;
 
+    private final AlienStoreFeign alienStoreFeign;
+
     /**
      * 会员卡状态及会员卡订单状态变更任务
      */
-//    @Scheduled(cron = "0 0 2 * * ?")
-//    @Scheduled(cron = "0/10 * * * * ?")
+    @XxlJob("storeMembershipCardStatusJob")
     public void storeMembershipCardStatusJob() {
         log.info("会员卡状态及会员卡订单状态变更任务执行: " + new Date());
 
@@ -120,7 +119,7 @@ public class StoreMembershipCardJob {
     /**
      * 定时清理已申请注销超过7天的商家与用户
      */
-//    @Scheduled(cron = "0 0 0 * * ?")
+    @XxlJob("cancellationOfBusinessJob")
     public void cancellationOfBusinessJob() {
         log.info("删除已申请注销超过7天的商家与用户: " + new Date());
 
@@ -140,7 +139,7 @@ public class StoreMembershipCardJob {
                 if (date.compareTo(sevenDay) >= 0) {
                     // 删除已过注销时间的商家
                     storeUserMapper.deleteById(storeUser.getId());
-                    nearMeService.removeGeolocation(Boolean.TRUE, storeUser.getId().toString());
+                    alienStoreFeign.delMer(Boolean.TRUE, storeUser.getId().toString());
                     //删除用户redis中的token
                     baseRedisService.delete("store_" + storeUser.getPhone());
                 }

+ 4 - 2
alien-store/src/main/java/shop/alien/store/controller/AliController.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreAliPayLog;
 import shop.alien.store.service.AliService;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.store.util.ali.AliSms;
@@ -73,8 +74,9 @@ public class AliController {
     @GetMapping("/pay")
     public R pay(String name, String idCard, String phone, String money) {
         log.info("AliController.pay?name={}&idCard={}&phone={}&money={}", name, idCard, phone, money);
-        if (null != aliPayConfig.pay(name, idCard, phone, money)) {
-            return R.success("转账成功");
+        StoreAliPayLog pay = aliPayConfig.pay(name, idCard, phone, money);
+        if (null != pay) {
+            return R.data(pay);
         }
         return R.fail("转账失败");
     }

+ 6 - 21
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -9,7 +9,6 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.vo.LifeFansVo;
 import shop.alien.entity.store.vo.LifeMessageVo;
 import shop.alien.store.service.LifeMessageService;
-import shop.alien.store.task.ScheduledTask;
 
 import java.util.List;
 
@@ -25,18 +24,12 @@ import java.util.List;
 public class LifeMessageController {
 
     private final LifeMessageService lifeMessageService;
-    private final ScheduledTask scheduledTask;
 
     @ApiOperation("消息列表")
     @ApiOperationSupport(order = 1)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "friendType", value = "聊天类型  0-搜索 1-聊过 2-未聊过", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "search", value = "搜索字段", dataType = "Integer", paramType = "query")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "friendType", value = "聊天类型  0-搜索 1-聊过 2-未聊过", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "search", value = "搜索字段", dataType = "Integer", paramType = "query")})
     @GetMapping("/getMessageList")
-    public R<List<LifeMessageVo>> getMessageList(@RequestParam String receiverId,
-                                                  @RequestParam int friendType,
-                                                  String search) throws Exception {
+    public R<List<LifeMessageVo>> getMessageList(@RequestParam String receiverId, @RequestParam int friendType, String search) throws Exception {
         log.info("LifeMessageController.getMessageList?receiverId={}, friendType={}, search={}", receiverId, friendType, search);
         return R.data(lifeMessageService.getMessageList(receiverId, friendType, search));
     }
@@ -61,9 +54,7 @@ public class LifeMessageController {
 
     @ApiOperation("消息详情")
     @ApiOperationSupport(order = 4)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/getMessageListByReceiverId")
     public R<JSONObject> getMessageListByReceiverId(@RequestParam String receiverId, @RequestParam String senderId) throws Exception {
         log.info("LifeMessageController.getMessageListByReceiverId?receiverId={}, senderId={}", receiverId, senderId);
@@ -72,9 +63,7 @@ public class LifeMessageController {
 
     @ApiOperation("是否是陌生人")
     @ApiOperationSupport(order = 5)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/isStranger")
     public R<String> isStranger(@RequestParam String receiverId, @RequestParam String senderId) throws Exception {
         log.info("LifeMessageController.isStranger?receiverId={}, senderId={}", receiverId, senderId);
@@ -83,9 +72,7 @@ public class LifeMessageController {
 
     @ApiOperation("消息已读")
     @ApiOperationSupport(order = 6)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/read")
     public R<Boolean> read(@RequestParam String receiverId, @RequestParam String senderId) throws Exception {
         log.info("LifeMessageController.read?receiverId={}, senderId={}", receiverId, senderId);
@@ -95,9 +82,7 @@ public class LifeMessageController {
 
     @ApiOperation("删除消息")
     @ApiOperationSupport(order = 7)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
     @GetMapping("/deleteMessageByPhoneId")
     public R<Integer> deleteMessageByPhoneId(@RequestParam String senderId, @RequestParam String receiverId) throws Exception {
         log.info("LifeMessageController.deleteMessageByPhoneId?senderId={},receiverId={}", senderId, receiverId);

+ 5 - 29
alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java

@@ -9,7 +9,6 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreIncomeDetailsRecord;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 import shop.alien.store.service.StoreIncomeDetailsRecordService;
-import shop.alien.store.task.ScheduledTask;
 
 import java.util.Map;
 
@@ -30,14 +29,9 @@ public class StoreIncomeDetailsRecordController {
 
     private final StoreIncomeDetailsRecordService storeIncomeDetailsRecordService;
 
-    private final ScheduledTask scheduledTask;
-
     @ApiOperation("提现-提现全部")
     @ApiOperationSupport(order = 1)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true)
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true)})
     @GetMapping("/cashOut")
     public R<Boolean> cashOut(Integer storeId, String payPassword) {
         String s = storeIncomeDetailsRecordService.cashOut(storeId, payPassword);
@@ -59,9 +53,7 @@ public class StoreIncomeDetailsRecordController {
 
     @ApiOperation("今日收益")
     @ApiOperationSupport(order = 3)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/todayIncome")
     public R<String> todayIncome(Integer storeId) {
         return R.data(storeIncomeDetailsRecordService.todayIncome(storeId));
@@ -69,11 +61,7 @@ public class StoreIncomeDetailsRecordController {
 
     @ApiOperation("账期")
     @ApiOperationSupport(order = 4)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "paymentType", value = "账期类型,0:未到,1:已到", dataType = "Integer", paramType = "query")
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "paymentType", value = "账期类型,0:未到,1:已到", dataType = "Integer", paramType = "query")})
     @GetMapping("/noYetPayment")
     public R<JSONObject> noYetPayment(Integer storeId, Integer incomeType, Integer paymentType) {
         return R.data(storeIncomeDetailsRecordService.noYetPayment(storeId, incomeType, paymentType));
@@ -81,9 +69,7 @@ public class StoreIncomeDetailsRecordController {
 
     @ApiOperation("账户余额-总金额, 可提现金额")
     @ApiOperationSupport(order = 5)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/accountBalance")
     public R<Map<String, Object>> accountBalance(Integer storeId) {
         return R.data(storeIncomeDetailsRecordService.accountBalance(storeId));
@@ -91,20 +77,10 @@ public class StoreIncomeDetailsRecordController {
 
     @ApiOperation("团购收益")
     @ApiOperationSupport(order = 6)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "date", value = "日期", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query")
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "date", value = "日期", dataType = "String", paramType = "query", required = true), @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query")})
     @GetMapping("/groupIncome")
     public R<StoreIncomeDetailsRecordVo> groupIncome(Integer storeId, String date, Integer incomeType) {
         return R.data(storeIncomeDetailsRecordService.groupIncome(storeId, date, incomeType));
     }
 
-    //团购详情
-
-    @GetMapping("/autoTransferAccounts")
-    public void autoTransferAccounts() {
-        scheduledTask.autoTransferAccounts();
-    }
 }

+ 0 - 530
alien-store/src/main/java/shop/alien/store/task/ScheduledTask.java

@@ -1,530 +0,0 @@
-package shop.alien.store.task;
-
-import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import shop.alien.entity.second.SecondGoods;
-import shop.alien.entity.second.SecondTradeRecord;
-import shop.alien.entity.store.*;
-import shop.alien.entity.store.vo.WebSocketVo;
-import shop.alien.mapper.*;
-import shop.alien.mapper.second.SecondGoodsMapper;
-import shop.alien.mapper.second.SecondTradeRecordMapper;
-import shop.alien.store.config.BaseRedisService;
-import shop.alien.store.config.WebSocketProcess;
-import shop.alien.store.service.*;
-import shop.alien.store.util.ali.AliApi;
-import shop.alien.util.common.AlipayTradeRefund;
-import shop.alien.util.common.DateUtils;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.*;
-import java.util.stream.Collectors;
-
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class ScheduledTask {
-
-    private final LifeCouponMapper lifeCouponMapper;
-
-    private final LifeUserOrderMapper lifeUserOrderMapper;
-
-    private final AlipayTradeRefund alipayTradeRefund;
-
-    private final StoreIncomeDetailsRecordService storeIncomeDetailsRecordService;
-
-    private final StoreCashOutRecordService storeCashOutRecordService;
-
-    private final StoreUserService storeUserService;
-
-    private final AliApi aliApi;
-
-    private final LifeReverseGroupBuyingService lifeReverseGroupBuyingService;
-
-    private final LifeMessageMapper lifeMessageMapper;
-
-    private final LifeUserService lifeUserService;
-
-    private final SecondTradeRecordMapper secondTradeRecordMapper;
-
-    private final LifeNoticeMapper lifeNoticeMapper;
-
-    private final LifeUserMapper lifeUserMapper;
-
-    private final SecondGoodsMapper secondGoodsMapper;
-
-    private final WebSocketProcess webSocketProcess;
-
-    private final BaseRedisService baseRedisService;
-
-//    @Scheduled(cron = "0 */10 * * * ?")
-    public void sendDiscountCouponRemind() {
-        //查询
-
-    }
-
-//    @Scheduled(cron = "0 */10 * * * ?")
-    // 该方法用于定时更新生活优惠券(LifeCoupon)的状态
-    public void quanStatusUpdateTask() {
-        //执行修改代金券状态
-        System.out.println("执行修改代金券状态 ===>");
-        // 获取当前时间
-        Date now = new Date();
-        // 创建一个 Calendar 实例,用于对日期进行操作
-        Calendar calendar = Calendar.getInstance();
-        // 将 Calendar 的时间设置为当前时间
-        calendar.setTime(now);
-        // 将 Calendar 的小时设置为 0
-        calendar.set(Calendar.HOUR_OF_DAY, 0);
-        // 将 Calendar 的分钟设置为 0
-        calendar.set(Calendar.MINUTE, 0);
-        // 将 Calendar 的秒设置为 0
-        calendar.set(Calendar.SECOND, 0);
-        // 将 Calendar 的毫秒设置为 0
-        calendar.set(Calendar.MILLISECOND, 0);
-        // 获取处理后的时间,即当前日期的零点
-        now = calendar.getTime();
-
-        // 创建一个 LambdaUpdateWrapper 用于查询生活优惠券,这里实际上主要用于查询操作
-        LambdaUpdateWrapper<LifeCoupon> selectWrapper = new LambdaUpdateWrapper<>();
-        // 创建一个集合,用于存储要查询的优惠券状态值
-        List<Integer> ids = new ArrayList<>();
-        // 待审核
-        ids.add(0);
-        // 进行中
-        ids.add(1);
-        // 已暂停
-        ids.add(2);
-        // 设置查询条件,查询状态为 0、1 或 2 的生活优惠券
-        selectWrapper.in(LifeCoupon::getStatus, ids);
-        // 调用 lifeCouponMapper 的 selectList 方法,根据上述条件查询生活优惠券列表
-        List<LifeCoupon> jinxingzhongList = lifeCouponMapper.selectList(selectWrapper);
-        // 判断查询结果列表是否不为空
-        if (!jinxingzhongList.isEmpty()) {
-            // 遍历查询到的生活优惠券列表
-            for (LifeCoupon quan : jinxingzhongList) {
-                // 获取当前优惠券的结束日期
-                Date endTime = quan.getEndDate();
-                // 比较当前日期(零点)和优惠券的结束日期,如果当前日期大于结束日期  将状态变成已结束
-                if (now.compareTo(endTime) > 0) {
-                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
-                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
-                    // 设置更新条件,根据优惠券的 ID 进行更新
-                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
-                            // 设置要更新的字段,将优惠券的状态更新为 3
-                            .set(LifeCoupon::getStatus, 3);
-                    // 调用 lifeCouponMapper 的 update 方法,根据上述条件更新优惠券的状态
-                    lifeCouponMapper.update(null, updateWrapper);
-                }
-            }
-        }
-
-        // 创建另一个 LambdaUpdateWrapper 用于查询状态为 0 的生活优惠券
-        LambdaUpdateWrapper<LifeCoupon> selectWrapper2 = new LambdaUpdateWrapper<>();
-        // 设置查询条件,查询状态为 0 的生活优惠券
-        selectWrapper2.eq(LifeCoupon::getStatus, 0);
-        // 调用 lifeCouponMapper 的 selectList 方法,根据上述条件查询生活优惠券列表
-        List<LifeCoupon> weikaishiList = lifeCouponMapper.selectList(selectWrapper2);
-        // 判断查询结果列表是否不为空
-        if (!weikaishiList.isEmpty()) {
-            // 遍历查询到的生活优惠券列表
-            for (LifeCoupon quan : weikaishiList) {
-                // 获取当前优惠券的开始日期
-                Date startTime = quan.getStartDate();
-                // 获取当前优惠券的结束日期
-                Date endTime = quan.getEndDate();
-                // 判断当前日期(零点)是否在优惠券的开始日期和结束日期之间  将待使用变成进行中
-                if (now.compareTo(startTime) >= 0 && now.compareTo(endTime) <= 0) {
-                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
-                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
-                    // 设置更新条件,根据优惠券的 ID 进行更新
-                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
-                            // 设置要更新的字段,将优惠券的状态更新为 1
-                            .set(LifeCoupon::getStatus, 1);
-                    // 调用 lifeCouponMapper 的 update 方法,根据上述条件更新优惠券的状态
-                    lifeCouponMapper.update(null, updateWrapper);
-                }
-            }
-        }
-    }
-
-//    @Scheduled(cron = "0 */10 * * * ?")
-    public void orderStatusUpdateTask() {
-        Date now = new Date();
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(now);
-        calendar.set(Calendar.HOUR_OF_DAY, 0);
-        calendar.set(Calendar.MINUTE, 0);
-        calendar.set(Calendar.SECOND, 0);
-        calendar.set(Calendar.MILLISECOND, 0);
-        now = calendar.getTime();
-        LambdaUpdateWrapper<LifeUserOrder> selectWrapper = new LambdaUpdateWrapper<>();
-        List<Integer> ids = new ArrayList<>();
-        ids.add(0);
-        ids.add(3);
-        selectWrapper.in(LifeUserOrder::getStatus, ids);
-        List<LifeUserOrder> orderList = lifeUserOrderMapper.selectList(selectWrapper);
-        if (!orderList.isEmpty()) {
-            for (LifeUserOrder order : orderList) {
-                Date payTime = order.getPayTime();
-                LifeCoupon quan = lifeCouponMapper.selectById(order.getQuanId());
-                calendar.setTime(payTime);
-                calendar.add(Calendar.DAY_OF_MONTH, quan.getExpirationDate());
-                Date guoqiDate = calendar.getTime();
-                Date endDate = quan.getEndDate();
-                if (now.compareTo(guoqiDate) > 0 || now.compareTo(endDate) > 0) {
-                    String result = alipayTradeRefund.processRefund(order.getOrderNo(), order.getFinalPrice(), "过期自动退");
-                    if (result.equals("调用成功")) {
-                        LambdaUpdateWrapper<LifeUserOrder> updateWrapper = new LambdaUpdateWrapper<>();
-                        updateWrapper.eq(LifeUserOrder::getId, order.getId()).set(LifeUserOrder::getStatus, 4).set(LifeUserOrder::getRefundTime, new Date());
-                        lifeUserOrderMapper.update(null, updateWrapper);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 自动转账
-     * 一分钟执行一次
-     */
-//    @Scheduled(cron = "0 */1 * * * ?")
-    public void autoTransferAccounts() {
-        //获取已到账期
-        LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
-        wrapper.lt(StoreIncomeDetailsRecord::getCreatedTime, DateUtils.calcDays(new Date(), -28)).isNull(StoreIncomeDetailsRecord::getCashOutId);
-        List<StoreIncomeDetailsRecord> list = storeIncomeDetailsRecordService.list(wrapper);
-        // 根据 storeId 分组
-        Map<Integer, List<StoreIncomeDetailsRecord>> groupedByStoreId = list.stream()
-                .collect(Collectors.groupingBy(StoreIncomeDetailsRecord::getStoreId));
-        //获取账户余额
-        List<Integer> storeIds = new ArrayList<>();
-        Map<Integer, Integer> storeMoney = new HashMap<>();
-        Map<Integer, Integer> storeCommission = new HashMap<>();
-        groupedByStoreId.forEach((storeId, records) -> {
-            storeIds.add(storeId);
-            // 对每个 storeId 对应的 records 进行处理
-            int money = 0;
-            int commission = 0;
-            for (StoreIncomeDetailsRecord record : records) {
-                money += record.getMoney() - record.getCommission();
-                commission += record.getCommission();
-            }
-            storeMoney.put(storeId, money);
-            storeCommission.put(storeId, commission);
-        });
-        List<StoreUser> storeUserList = storeUserService.list(new LambdaUpdateWrapper<StoreUser>().in(StoreUser::getStoreId, storeIds));
-        //转账
-        storeMoney.forEach((storeId, money) -> {
-            if (money < 10) {
-                log.info("账户已到账期金额小于最小转账金额, 用户id: {},金额: {}", storeId, money);
-            } else {
-                List<StoreUser> userList = storeUserList.stream()
-                        .filter(storeUser -> storeUser.getStoreId().equals(storeId))
-                        .collect(Collectors.toList());
-                if (!userList.isEmpty()) {
-                    StoreUser filteredUsers = userList.get(0);
-                    StoreAliPayLog pay = aliApi.pay(filteredUsers.getName(), filteredUsers.getIdCard(), filteredUsers.getPhone(), new BigDecimal(money).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
-                    if (null == pay) {
-                        log.error("支付宝转账失败, 用户: {},金额: {}", filteredUsers.getPhone(), money);
-                    } else {
-                        StoreCashOutRecord storeCashOutRecord = new StoreCashOutRecord();
-                        //转账记录表
-                        storeCashOutRecord.setStoreId(storeId)
-                                .setMoney(money)
-                                .setCommission(storeCommission.get(storeId))
-                                .setCashOutType(1)
-                                .setOrderNo(pay.getOutBizNo())
-                                .setAliOrderNo(pay.getOrderId())
-                                .setIncomeStartTime(groupedByStoreId.get(storeId).get(0).getCreatedTime())
-                                .setIncomeEndTime(groupedByStoreId.get(storeId).get(groupedByStoreId.get(storeId).size() - 1).getCreatedTime())
-                                .setPaymentDate(new Date());
-                        storeCashOutRecordService.save(storeCashOutRecord);
-                        list.forEach(record -> {
-                            if (record.getStoreId().equals(storeId)) {
-                                record.setCashOutId(storeCashOutRecord.getId());
-                            }
-                        });
-                        //减少金额
-                        filteredUsers.setMoney(filteredUsers.getMoney() - money);
-                        storeUserService.updateById(filteredUsers);
-                    }
-                }
-            }
-        });
-        //增加记录
-        storeIncomeDetailsRecordService.saveOrUpdateBatch(list);
-    }
-
-    /**
-     * 反向团购订单自动退款
-     */
-//    @Scheduled(cron = "0 * * * * ?")
-    public void reverseGroupOrder() {
-        LambdaQueryWrapper<LifeReverseGroupBuying> wrapper = new LambdaQueryWrapper<>();
-        //状态, 0:待审核, 1:未通过, 2:已通过, 3:待接单, 4:未接单(已截止), 5:待使用, 6:已完成, 7:已退款
-        wrapper.eq(LifeReverseGroupBuying::getStatus, 4);
-        List<LifeReverseGroupBuying> list = lifeReverseGroupBuyingService.list();
-        for (LifeReverseGroupBuying lifeReverseGroupBuying : list) {
-            //竞价结束
-            if (DateUtils.dateCompare(new Date(), lifeReverseGroupBuying.getBiddingEndTime())) {
-                LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectById(lifeReverseGroupBuying.getOrderId());
-                String s = alipayTradeRefund.processRefund(lifeUserOrder.getOrderNo(), new BigDecimal(lifeReverseGroupBuying.getGroupMoney()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString(), "用户反向团购, 未有商家接单");
-                if (s.contains("成功")) {
-                    //修改状态
-                    lifeReverseGroupBuying.setStatus(7);
-                    lifeReverseGroupBuyingService.updateById(lifeReverseGroupBuying);
-                } else {
-                    LifeUser lifeUser = lifeUserService.getById(lifeUserOrder.getUserId());
-                    LifeMessage lifeMessage = new LifeMessage();
-                    lifeMessage.setSenderName("system");
-                    if (lifeUser != null) {
-                        lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
-                        lifeMessage.setContent("你有一笔反向团购退款失败, 请联系管理员");
-                        lifeMessage.setType("2");
-                        lifeMessageMapper.insert(lifeMessage);
-                    }
-
-                }
-            }
-        }
-    }
-
-    /**
-     * 二手交易平台 - 交易时间前的十分钟和十五分钟之间  给买家和卖家发送通知提醒
-     */
-//    @Scheduled(cron = "0 * * * * ?")
-    public void secondTradeRemind() throws Exception {
-        LocalDateTime now = LocalDateTime.now().withSecond(0).withNano(0);
-
-        // 查询所有待交易
-        LambdaQueryWrapper<SecondTradeRecord> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(SecondTradeRecord::getTradeStatus, 3);
-        List<SecondTradeRecord> tradeRecordList = secondTradeRecordMapper.selectList(wrapper);
-
-        for (SecondTradeRecord tradeRecord : tradeRecordList) {
-            // 十分钟前
-            LocalDateTime tenMinutesAgo = tradeRecord.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(10).withSecond(0).withNano(0);
-            // 交易时间的十分钟前
-            if (now.isEqual(tenMinutesAgo)) {
-                LifeUser buyer = lifeUserMapper.selectById(tradeRecord.getBuyerId());
-                LifeUser seller = lifeUserMapper.selectById(tradeRecord.getSellerId());
-
-                String buyerPhoneId = null == buyer ? "" : "user_" + buyer.getUserPhone();
-                String sellerPhoneId = null == seller ? "" : "user_" + seller.getUserPhone();
-
-                // 封装交易信息
-                JSONObject message = new JSONObject();
-                message.put("tradeId", tradeRecord.getId());
-                message.put("transactionAmount", tradeRecord.getTransactionAmount());
-                message.put("transactionLatitudeLongitude", tradeRecord.getTransactionLatitudeLongitude());
-                message.put("transactionLatitudeLongitudeAddress", tradeRecord.getTransactionLatitudeLongitudeAddress());
-                message.put("transactionLocation", tradeRecord.getTransactionLocation());
-                message.put("transactionTime", tradeRecord.getTransactionTime());
-                message.put("tradeStatus", tradeRecord.getTradeStatus());
-
-                // 给买家发送消息
-                LifeMessage lifeMessage = new LifeMessage();
-                lifeMessage.setSenderId(sellerPhoneId);
-                lifeMessage.setReceiverId(buyerPhoneId);
-                lifeMessage.setContent(message.toJSONString());
-                lifeMessage.setType("5");
-                lifeMessageMapper.insert(lifeMessage);
-
-                // 给买家推送消息
-                WebSocketVo websocketVo = new WebSocketVo();
-                websocketVo.setSenderId(sellerPhoneId);
-                websocketVo.setReceiverId(buyerPhoneId);
-                websocketVo.setCategory("message");
-                websocketVo.setType("5");
-                websocketVo.setText(message.toJSONString());
-                websocketVo.setMessageId(lifeMessage.getId());
-                webSocketProcess.sendMessage(buyerPhoneId, JSONObject.from(websocketVo).toJSONString());
-
-                // 给买家发送通知
-                LifeNotice lifeNotice = new LifeNotice();
-                lifeNotice.setSenderId("system");
-                lifeNotice.setReceiverId(buyerPhoneId);
-                lifeNotice.setBusinessId(tradeRecord.getId());
-                lifeNotice.setTitle("商品交易签到");
-                lifeNotice.setNoticeType(1);
-                // 封装通知信息
-                JSONObject noticeMessage = new JSONObject();
-                noticeMessage.put("tradeId", tradeRecord.getId());
-                noticeMessage.put("otherSideUserId", tradeRecord.getSellerId());
-                noticeMessage.put("otherSidePhoneId", sellerPhoneId);
-                noticeMessage.put("otherSideName", null == seller ? "" : seller.getUserName());
-                noticeMessage.put("otherSideImage", null == seller ? "" : seller.getUserImage());
-                noticeMessage.put("message", "您有一笔交易即将开始, 请及时前往查看");
-                lifeNotice.setContext(noticeMessage.toJSONString());
-                lifeNoticeMapper.insert(lifeNotice);
-
-                // 给买家推送通知
-                websocketVo = new WebSocketVo();
-                websocketVo.setSenderId("system");
-                websocketVo.setReceiverId(buyerPhoneId);
-                websocketVo.setCategory("notice");
-                websocketVo.setNoticeType("1");
-                websocketVo.setType("5");
-                websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
-                websocketVo.setMessageId(lifeMessage.getId());
-                webSocketProcess.sendMessage(buyerPhoneId, JSONObject.from(websocketVo).toJSONString());
-
-                // 给卖家发送消息
-                lifeMessage = new LifeMessage();
-                lifeMessage.setSenderId(buyerPhoneId);
-                lifeMessage.setReceiverId(sellerPhoneId);
-                lifeMessage.setContent(message.toJSONString());
-                lifeMessage.setType("5");
-                lifeMessageMapper.insert(lifeMessage);
-
-                // 给卖家推送消息
-                websocketVo = new WebSocketVo();
-                websocketVo.setSenderId(buyerPhoneId);
-                websocketVo.setReceiverId(sellerPhoneId);
-                websocketVo.setCategory("message");
-                websocketVo.setType("5");
-                websocketVo.setText(message.toJSONString());
-                websocketVo.setMessageId(lifeMessage.getId());
-                webSocketProcess.sendMessage(sellerPhoneId, JSONObject.from(websocketVo).toJSONString());
-
-                // 给卖家发送通知
-                lifeNotice = new LifeNotice();
-                lifeNotice.setSenderId("system");
-                lifeNotice.setReceiverId(sellerPhoneId);
-                lifeNotice.setBusinessId(tradeRecord.getId());
-                lifeNotice.setTitle("商品交易签到");
-                lifeNotice.setNoticeType(1);
-                // 封装通知信息
-                noticeMessage = new JSONObject();
-                noticeMessage.put("tradeId", tradeRecord.getId());
-                noticeMessage.put("otherSideUserId", tradeRecord.getBuyerId());
-                noticeMessage.put("otherSidePhoneId", buyerPhoneId);
-                noticeMessage.put("otherSideName", null == buyer ? "" : buyer.getUserName());
-                noticeMessage.put("otherSideImage", null == buyer ? "" : buyer.getUserImage());
-                noticeMessage.put("message", "您有一笔交易即将开始, 请及时前往查看");
-                lifeNotice.setContext(noticeMessage.toJSONString());
-                lifeNoticeMapper.insert(lifeNotice);
-
-                // 给卖家推送通知
-                websocketVo = new WebSocketVo();
-                websocketVo.setSenderId("system");
-                websocketVo.setReceiverId(sellerPhoneId);
-                websocketVo.setCategory("notice");
-                websocketVo.setNoticeType("1");
-                websocketVo.setType("5");
-                websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
-                websocketVo.setMessageId(lifeMessage.getId());
-                webSocketProcess.sendMessage(sellerPhoneId, JSONObject.from(websocketVo).toJSONString());
-            }
-        }
-    }
-
-    /**
-     * 二手交易平台 - 到达交易时间时,给买家和卖家发送交易确认提醒
-     */
-//    @Scheduled(cron = "0 * * * * ?")
-    public void secondTradeConfirm() throws Exception {
-        LocalDateTime now = LocalDateTime.now().withSecond(0).withNano(0);
-
-        // 查询所有待交易
-        LambdaQueryWrapper<SecondTradeRecord> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(SecondTradeRecord::getTradeStatus, 3);
-        List<SecondTradeRecord> tradeRecordList = secondTradeRecordMapper.selectList(wrapper);
-
-        for (SecondTradeRecord tradeRecord : tradeRecordList) {
-            LocalDateTime tenMinutesAgo = tradeRecord.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().withSecond(0).withNano(0);
-            // 交易时间的十分钟前
-            if (now.isEqual(tenMinutesAgo)) {
-                LifeUser buyer = lifeUserMapper.selectById(tradeRecord.getBuyerId());
-                LifeUser seller = lifeUserMapper.selectById(tradeRecord.getSellerId());
-                SecondGoods goods = secondGoodsMapper.selectById(tradeRecord.getGoodsId());
-
-                String buyerPhoneId = null == buyer ? "" : "user_" + buyer.getUserPhone();
-                String sellerPhoneId = null == seller ? "" : "user_" + seller.getUserPhone();
-
-                // 给买家发送通知
-                LifeNotice lifeNotice = new LifeNotice();
-                lifeNotice.setSenderId("system");
-                lifeNotice.setReceiverId(buyerPhoneId);
-                lifeNotice.setBusinessId(tradeRecord.getId());
-                lifeNotice.setTitle("商品是否交易成功");
-                lifeNotice.setNoticeType(1);
-                // 封装通知信息
-                JSONObject noticeMessage = new JSONObject();
-                noticeMessage.put("goodsId", goods.getId());
-                noticeMessage.put("goodsHomeImage", goods.getHomeImage());
-                noticeMessage.put("goodsTitle", goods.getTitle());
-                noticeMessage.put("tradeId", tradeRecord.getId());
-                noticeMessage.put("transactionAmount", tradeRecord.getTransactionAmount());
-                noticeMessage.put("transactionLatitudeLongitude", tradeRecord.getTransactionLatitudeLongitude());
-                noticeMessage.put("transactionLatitudeLongitudeAddress", tradeRecord.getTransactionLatitudeLongitudeAddress());
-                noticeMessage.put("transactionLocation", tradeRecord.getTransactionLocation());
-                noticeMessage.put("transactionTime", tradeRecord.getTransactionTime());
-                noticeMessage.put("tradeStatus", tradeRecord.getTradeStatus());
-                noticeMessage.put("message", "您有一笔交易已完成, 请前往确认");
-                lifeNotice.setContext(noticeMessage.toJSONString());
-                lifeNoticeMapper.insert(lifeNotice);
-
-                // 给买家推送通知
-                WebSocketVo websocketVo = new WebSocketVo();
-                websocketVo.setSenderId("system");
-                websocketVo.setReceiverId(buyerPhoneId);
-                websocketVo.setCategory("notice");
-                websocketVo.setNoticeType("1");
-                websocketVo.setType("5");
-                websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
-                webSocketProcess.sendMessage(buyerPhoneId, JSONObject.from(websocketVo).toJSONString());
-
-                // 给卖家发送通知
-                lifeNotice = new LifeNotice();
-                lifeNotice.setSenderId("system");
-                lifeNotice.setReceiverId(sellerPhoneId);
-                lifeNotice.setBusinessId(tradeRecord.getId());
-                lifeNotice.setTitle("商品是否交易成功");
-                lifeNotice.setNoticeType(1);
-                lifeNotice.setContext(noticeMessage.toJSONString());
-                lifeNoticeMapper.insert(lifeNotice);
-
-                // 给卖家推送通知
-                websocketVo = new WebSocketVo();
-                websocketVo.setSenderId("system");
-                websocketVo.setReceiverId(sellerPhoneId);
-                websocketVo.setCategory("notice");
-                websocketVo.setNoticeType("1");
-                websocketVo.setType("5");
-                websocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
-                webSocketProcess.sendMessage(buyerPhoneId, JSONObject.from(websocketVo).toJSONString());
-            }
-        }
-    }
-
-    /**
-     * 二手交易平台 - 每分钟从redis中读取已读的消息id 并将数据库设为已读
-     */
-//    @Scheduled(cron = "0 * * * * ?")
-    public void readMessage() {
-        try {
-            if (CollectionUtil.isEmpty(baseRedisService.getList("readMessageIdKey"))) return;
-
-            List<String> dataList = baseRedisService.popBatchFromList("readMessageIdKey");
-            if (CollectionUtil.isNotEmpty(dataList)) {
-                LambdaUpdateWrapper<LifeMessage> wrapper = new LambdaUpdateWrapper<>();
-                wrapper.in(LifeMessage::getId, dataList)
-                        .set(LifeMessage::getIsRead, 1);
-                lifeMessageMapper.update(null, wrapper);
-            }
-        } catch (Exception e) {
-            log.error("ScheduledTask.readMessage Error Mgs={}", e.getMessage());
-        }
-    }
-}

+ 0 - 3
alien-store/src/main/java/shop/alien/store/util/ali/AliApi.java

@@ -16,7 +16,6 @@ import org.springframework.stereotype.Component;
 import shop.alien.entity.store.LifeUser;
 import shop.alien.entity.store.StoreAliPayLog;
 import shop.alien.entity.store.StoreUser;
-import shop.alien.mapper.LifeUserMapper;
 import shop.alien.store.service.LifeUserService;
 import shop.alien.store.service.StoreAliPayLogService;
 import shop.alien.store.service.StoreUserService;
@@ -38,11 +37,9 @@ import java.util.Date;
 @RequiredArgsConstructor
 public class AliApi {
 
-
     private final StoreUserService storeUserService;
 
     private final StoreAliPayLogService storeAliPayLogService;
-    private final LifeUserMapper lifeUserMapper;
 
     private final LifeUserService lifeUserService;