Explorar el Código

优化费用停机

李进 hace 1 año
padre
commit
d5e2acf313

+ 42 - 9
device-api-service/src/main/java/com/xy/job/DeviceAlgorithmChargingJob.java

@@ -5,18 +5,23 @@ import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xy.annotate.RestMappingController;
 import com.xy.collections.list.JArrayList;
+import com.xy.collections.list.JList;
 import com.xy.collections.map.JMap;
 import com.xy.dto.MercAccountDto;
+import com.xy.dto.MercArrearageConfigDto;
+import com.xy.dto.MercBalanceArrearageDto;
 import com.xy.entity.DeviceAlgorithmCharging;
 import com.xy.entity.DeviceInfo;
-import com.xy.service.DeviceAlgorithmChargingServiceImpl;
-import com.xy.service.DeviceInfoServiceImpl;
-import com.xy.service.MercAccountService;
+import com.xy.service.*;
+import com.xy.sys.EnumMercCostMsgConfig;
 import com.xy.utils.Emptys;
+import com.xy.utils.SysDictUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
@@ -29,32 +34,59 @@ import java.util.List;
 @Slf4j
 @Component
 @AllArgsConstructor
+@RestMappingController("test")
 public class DeviceAlgorithmChargingJob {
 
     private MercAccountService mercAccountService;
 
+    private MercBalanceArrearageService mercBalanceArrearageService;
+
     private DeviceInfoServiceImpl deviceInfoService;
 
     private DeviceAlgorithmChargingServiceImpl deviceAlgorithmChargingService;
 
+    private MercArrearageConfigService mercArrearageConfigService;
+
     /**
      * 算法费设备停机
      *
      * @return
      */
+    @GetMapping("test")
     @XxlJob("deviceAlgorithmChargingHalt")
     public ReturnT<String> deviceAlgorithmChargingHalt() {
         //查询余额<=0商户
-        List<MercAccountDto.Vo> mercAccounts = mercAccountService.list(new MercAccountDto.SelectList().setEndBalance(0)).getData();
-        if (!Emptys.check(mercAccounts)) {
+        List<MercAccountDto.Vo> list = mercAccountService.list(new MercAccountDto.SelectList().setEndBalance(0)).getData();
+        if (!Emptys.check(list)) {
             return ReturnT.SUCCESS;
         }
-        mercAccounts.forEach(mercAccount -> {
-            List<DeviceInfo> updateDeviceInfos = new ArrayList<>();
+        JList<MercAccountDto.Vo> mercAccounts = new JArrayList<>(list);
+        //查询商户欠费天数
+        int day = SysDictUtils.getValue(EnumMercCostMsgConfig.Code.CODE.getCode(), EnumMercCostMsgConfig.ARREARAGE_DAY.getCode(), Integer.class);
+        List<MercBalanceArrearageDto.Vo> mercBalanceArrearages = mercBalanceArrearageService.list(new MercBalanceArrearageDto.SelectList()
+                .setMercId(mercAccounts.getProperty(MercAccountDto.Vo::getMercId))
+                .setBeginArrearageDay(day)
+        ).getData();
+        if (!Emptys.check(mercBalanceArrearages)) {
+            return ReturnT.SUCCESS;
+        }
+        //查询白名单
+        MercArrearageConfigDto.SelectList selectList = new MercArrearageConfigDto.SelectList();
+        selectList.setType(2);
+        List<MercArrearageConfigDto.Vo> data = mercArrearageConfigService.list(selectList).getData();
+        JMap<Long, MercArrearageConfigDto.Vo> mercArrearageConfigJMaps = new JArrayList<>(data).toMap(MercArrearageConfigDto.Vo::getMercId).cover();
+        mercBalanceArrearages.forEach(mercBalanceArrearage -> {
+            //验证白名单
+            MercArrearageConfigDto.Vo mercArrearageConfig = mercArrearageConfigJMaps.get(mercBalanceArrearage.getMercId());
+            if (Emptys.check(mercArrearageConfig)) {
+                if (mercBalanceArrearage.getArrearageDay() < mercArrearageConfig.getArrearageDay()) {
+                    return;
+                }
+            }
             //查询商户未冻结设备
             List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
                     .in(DeviceInfo::getDeviceType, Arrays.asList(1, 2))
-                    .eq(DeviceInfo::getMercId, mercAccount.getMercId())
+                    .eq(DeviceInfo::getMercId, mercBalanceArrearage.getMercId())
                     .eq(DeviceInfo::getActiveState, 1)
                     .eq(DeviceInfo::getFreezeStatus, 1)
             );
@@ -66,7 +98,7 @@ public class DeviceAlgorithmChargingJob {
             String algorithmDate = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
             LambdaQueryWrapper<DeviceAlgorithmCharging> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceAlgorithmCharging>()
                     .select(DeviceAlgorithmCharging::getDeviceId)
-                    .eq(DeviceAlgorithmCharging::getMercId, mercAccount.getMercId())
+                    .eq(DeviceAlgorithmCharging::getMercId, mercBalanceArrearage.getMercId())
                     .gt(DeviceAlgorithmCharging::getUnusedSize, 0)
                     .in(DeviceAlgorithmCharging::getDeviceId, deviceInfosJMaps.getKeys())
                     .and(deviceAlgorithmChargingLambdaQueryWrapper -> deviceAlgorithmChargingLambdaQueryWrapper
@@ -80,6 +112,7 @@ public class DeviceAlgorithmChargingJob {
             List<DeviceAlgorithmCharging> deviceAlgorithmChargings = deviceAlgorithmChargingService.list(lambdaQueryWrapper);
             JMap<Long, DeviceAlgorithmCharging> deviceAlgorithmChargingsJMaps = new JArrayList<>(deviceAlgorithmChargings).toMap(DeviceAlgorithmCharging::getDeviceId).cover();
             //判断是否过期
+            List<DeviceInfo> updateDeviceInfos = new ArrayList<>();
             LocalDateTime now = LocalDateTime.now();
             deviceInfosJMaps.forEach((deviceId, deviceInfo) -> {
                 if (deviceAlgorithmChargingsJMaps.containsKey(deviceId)) {

+ 37 - 9
device-api-service/src/main/java/com/xy/job/DeviceChargingJob.java

@@ -9,11 +9,13 @@ import com.xy.collections.list.JArrayList;
 import com.xy.collections.map.JHashMap;
 import com.xy.collections.map.JMap;
 import com.xy.device.EnumDeviceCharging;
+import com.xy.dto.MercArrearageConfigDto;
 import com.xy.dto.MercMsgInfoDto;
 import com.xy.entity.DeviceCharging;
 import com.xy.entity.DeviceInfo;
 import com.xy.mapper.DeviceChargingMapper;
 import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.service.MercArrearageConfigService;
 import com.xy.service.MercMsgInfoService;
 import com.xy.sys.EnumMercCostMsgConfig;
 import com.xy.utils.*;
@@ -22,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -38,6 +41,8 @@ public class DeviceChargingJob {
 
     private DeviceInfoServiceImpl deviceInfoService;
 
+    private MercArrearageConfigService mercArrearageConfigService;
+
     /**
      * 管理费设备停机
      *
@@ -47,10 +52,16 @@ public class DeviceChargingJob {
     public ReturnT<String> deviceChargingHalt() {
         LocalDateTime now = LocalDateTime.now();
         int day = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.ARREARAGE_DAY.getCode(), Integer.class);
-        String timeout = DataTime.getStringAround(0, 0, (~(day - 1)), 0, 0, 0);
+        String timeout = DataTime.getStringAround(0, 0, (~(day - 1)), 0, 0, 0, DataTime.toString(now));
         LambdaQueryWrapper<DeviceCharging> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceCharging>()
-                .select(DeviceCharging::getDeviceId)
+                .select(DeviceCharging::getDeviceId, DeviceCharging::getTimeout)
                 .le(DeviceCharging::getTimeout, timeout);
+        //查询白名单
+        MercArrearageConfigDto.SelectList selectList = new MercArrearageConfigDto.SelectList();
+        selectList.setType(1);
+        List<MercArrearageConfigDto.Vo> data = mercArrearageConfigService.list(selectList).getData();
+        JMap<Long, MercArrearageConfigDto.Vo> mercArrearageConfigJMaps = new JArrayList<>(data).toMap(MercArrearageConfigDto.Vo::getMercId).cover();
+        //递归处理
         RecursionUtils.recursion(current -> {
             //查询已过期设备管理费
             IPage<DeviceCharging> iPage = deviceChargingMapper.selectPage(Page.of(current, 200), lambdaQueryWrapper);
@@ -58,20 +69,37 @@ public class DeviceChargingJob {
             if (!Emptys.check(records)) {
                 return false;
             }
+            JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(records).toMap(DeviceCharging::getDeviceId).cover();
             //查询未冻结设备
             LambdaQueryWrapper<DeviceInfo> deviceInfoLambdaQueryWrapper = new LambdaQueryWrapper<DeviceInfo>()
-                    .select(DeviceInfo::getDeviceId)
-                    .in(DeviceInfo::getDeviceId, new JArrayList<>(records).getProperty(DeviceCharging::getDeviceId))
+                    .select(DeviceInfo::getDeviceId, DeviceInfo::getMercId)
+                    .in(DeviceInfo::getDeviceId, deviceChargingsJMaps.getKeys())
                     .eq(DeviceInfo::getActiveState, 1)
                     .eq(DeviceInfo::getFreezeStatus, 1);
             List<DeviceInfo> deviceInfos = deviceInfoService.list(deviceInfoLambdaQueryWrapper);
             //冻结设备
             if (Emptys.check(deviceInfos)) {
-                deviceInfos.forEach(deviceInfo -> deviceInfo
-                        .setFreezeStatus(2)
-                        .setUpdateTime(now)
-                );
-                deviceInfoService.updateBatchById(deviceInfos);
+                List<DeviceInfo> updateDeviceInfos = new ArrayList<>();
+                deviceInfos.forEach(deviceInfo -> {
+                    //验证白名单
+                    MercArrearageConfigDto.Vo mercArrearageConfig = mercArrearageConfigJMaps.get(deviceInfo.getMercId());
+                    if (Emptys.check(mercArrearageConfig)) {
+                        DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceInfo.getDeviceId());
+                        String newTime = DataTime.getStringAround(0, 0, (~(mercArrearageConfig.getArrearageDay() - 1)), 0, 0, 0, DataTime.toString(now));
+                        //过期时间 > (当前时间 - 配置天)
+                        if (DataTime.stringContrast(DataTime.toString(deviceCharging.getTimeout()), newTime) > 0) {
+                            return;
+                        }
+                    }
+                    updateDeviceInfos.add(deviceInfo
+                            .setDeviceId(deviceInfo.getDeviceId())
+                            .setFreezeStatus(2)
+                            .setUpdateTime(now)
+                    );
+                });
+                if (Emptys.check(updateDeviceInfos)) {
+                    deviceInfoService.updateBatchById(updateDeviceInfos);
+                }
             }
             return true;
         });