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

Merge remote-tracking branch 'origin/test'

谭斌 1 год назад
Родитель
Сommit
39a6671af9

+ 20 - 10
device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java

@@ -4,8 +4,11 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xy.annotate.RestMappingController;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.map.JMap;
 import com.xy.device.EnumDeviceActiveStatus;
 import com.xy.device.EnumDeviceFreezeStatus;
 import com.xy.device.EnumDeviceType;
@@ -36,6 +39,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
@@ -156,8 +160,8 @@ public class MercMiniDeviceController {
                 if (AlgorithmTypeEnum.ALIPAY.getId() == algorithmId) {
                     String deviceId = String.valueOf(vo.getDeviceId());
                     //主动查询一次温度、音量 温度:TEMP 音量:VOL
-                    alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("VOL"));
-                    alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("TEMP"));
+//                    alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("VOL"));
+//                    alipayDeviceService.queryAttributes(new DeviceQueryAttr().setTerminalId(deviceId).setType("TEMP"));
                     //支付宝状态实时返回
                     DeviceDetailVO deviceDetailVO = alipayDeviceService.queryDetail(new DeviceDetailDTO().setTerminalId(String.valueOf(vo.getDeviceId())));
                     Boolean online = deviceDetailVO.getOnline();
@@ -240,16 +244,22 @@ public class MercMiniDeviceController {
 
     @PostMapping("active")
     @ApiOperation("激活设备")
-    public R active(@RequestBody MercMiniDeviceDto.Active active) {
-        DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
-        int factory = deviceInfo.getDeviceType() == EnumDeviceType.N_5.getIntCode() ? 2 : 1;
-        if (factory == 1) {
-            R r = checkDeviceByMerc(deviceInfo);
-            if (r.getCode() == R.Enum.FAIL.getCode()) {
-                return r;
+    public R active(@RequestBody MercMiniDeviceDto.Active2 active) {
+        List<Long> deviceIds = active.getDeviceId();
+        List<DeviceInfo> list = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
+                .in(DeviceInfo::getDeviceId, deviceIds)
+        );
+        JMap<Integer, DeviceInfo> cover = new JArrayList<>(list).toMap(DeviceInfo::getDeviceType).cover();
+        if (cover.size() > 1) {
+            return R.fail("批量激活设备类型必须一致");
+        }
+        for (DeviceInfo deviceInfo : list) {
+            R checkR = this.checkDeviceByMerc(deviceInfo);
+            if (checkR.getCode() == R.Enum.FAIL.getCode()) {
+                return checkR;
             }
         }
-        return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).active(active);
+        return FactoryUtils.getServiceRoute(DeviceFactory.class, list.get(0).getDeviceType()).active(active);
     }
 
     @ApiOperation("运营状态修改")

+ 18 - 0
device-api-service/src/main/java/com/xy/config/DeviceThreadPoolConfig.java

@@ -17,6 +17,8 @@ public class DeviceThreadPoolConfig {
 
     public static final String ALIPAY_DEVICE_DETAIL = "alipayDeviceDetail";
 
+    public static final String ALI_DEVICE_ACTIVE = "aliDeviceActive";
+
     /**
      * 公用线程池
      */
@@ -80,4 +82,20 @@ public class DeviceThreadPoolConfig {
                 .queueSize(coreSize * 10)
                 .builder();
     }
+
+    /**
+     * 支付宝设备激活线程池
+     */
+    @DynamicTp
+    @Bean(ALI_DEVICE_ACTIVE)
+    public ThreadPoolTaskExecutor aliDeviceActive() {
+        int coreSize = 1;
+        return ThreadPoolUtils.newPoll()
+                .name(ALI_DEVICE_ACTIVE)
+                .coreSize(coreSize)
+                .maxSize(coreSize * 10)
+                .keepAlive(30)
+                .queueSize(coreSize)
+                .builder();
+    }
 }

+ 43 - 6
device-api-service/src/main/java/com/xy/service/DeviceAlgorithmChargingServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xy.service;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -9,16 +10,14 @@ import com.xy.collections.list.JArrayList;
 import com.xy.collections.list.JList;
 import com.xy.collections.map.JHashMap;
 import com.xy.collections.map.JMap;
+import com.xy.config.DeviceThreadPoolConfig;
 import com.xy.device.EnumAlgorithmPayConfig;
 import com.xy.device.EnumDeviceAlgorithmChargingHistoryStatus;
 import com.xy.device.EnumDeviceAlgorithmChargingType;
-import com.xy.dto.DeviceAlgorithmChargingDto;
-import com.xy.dto.DeviceInfoDto;
+import com.xy.device.EnumDeviceType;
+import com.xy.dto.*;
 import com.xy.dto.be.MercDto;
-import com.xy.entity.DeviceAlgorithmCharging;
-import com.xy.entity.DeviceAlgorithmChargingHistory;
-import com.xy.entity.DeviceInfo;
-import com.xy.entity.SysDictRedis;
+import com.xy.entity.*;
 import com.xy.mapper.DeviceAlgorithmChargingMapper;
 import com.xy.mapper.entity.DeviceAlgorithmChargingChargingQueryParams;
 import com.xy.service.be.MercService;
@@ -26,6 +25,7 @@ import com.xy.utils.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -47,6 +47,7 @@ import static com.xy.utils.PlusBeans.toPageBean;
  * @author lijin
  * @since 2023-06-29
  */
+@Slf4j
 @Service
 @AllArgsConstructor
 @Api(tags = "设备算法计费表")
@@ -58,6 +59,10 @@ public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgori
 
     private MercService mercService;
 
+    private DeviceSysinfoServiceImpl deviceSysinfoService;
+
+    private AlipayDeviceService alipayDeviceService;
+
     @PostMapping("page")
     @ApiOperation("分页查询")
     public R<PageBean<DeviceAlgorithmChargingDto.Vo>> page(@RequestBody @Validated DeviceAlgorithmChargingDto.Page page) {
@@ -135,6 +140,9 @@ public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgori
         //查询设备信息
         List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId)));
         JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
+        //查询设备系统信息
+        List<DeviceSysinfoDto.Vo> deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId))).getData();
+        JMap<Long, DeviceSysinfoDto.Vo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
         //获取算法包月字典
         Map<String, SysDictRedis> algorithmMoonConfigMaps = SysDictUtils.get(EnumAlgorithmPayConfig.Code.CODE.getCode());
         //获取类型字典
@@ -143,6 +151,8 @@ public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgori
         List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getMercId))).getData();
         JMap<Long, MercDto.Vo> mercsMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
         JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
+        JList<Tuple.Tuple2<BindDeviceDTO, BindActiveDTO>> ailiActive = new JArrayList<>();
+        int aliDeviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
         //处理有效期
         deviceAlgorithmChargingHistories.forEach(deviceAlgorithmChargingHistory -> {
             //解冻设备 激活设备
@@ -160,6 +170,22 @@ public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgori
                 }
                 updateDeviceInfos.add(updateDeviceInfo);
             }
+            //支付宝设备
+            DeviceInfo deviceInfo = deviceInfoJMap.get(deviceAlgorithmChargingHistory.getDeviceId());
+            if (deviceInfo.getDeviceType() == aliDeviceType) {
+                if (deviceAlgorithmChargingHistory.getChargingType() != 100 && deviceInfo.getActiveState() == 2) {
+                    //支付宝绑定
+                    DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceAlgorithmChargingHistory.getDeviceId());
+                    BindDeviceDTO bindDeviceDTO = new BindDeviceDTO().setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
+                            .setBoardSn(deviceSysinfo.getDeviceSn());
+                    //支付宝激活
+                    BindActiveDTO bindActiveDTO = new BindActiveDTO()
+                            .setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
+                            .setBoardSn(deviceSysinfo.getDeviceSn())
+                            .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceInfo.getDeviceId()));
+                    ailiActive.add(new Tuple.Tuple2<>(bindDeviceDTO, bindActiveDTO));
+                }
+            }
             Integer type = deviceAlgorithmChargingHistory.getType();
             SysDictRedis deviceAlgorithmChargingType2 = deviceAlgorithmChargingTypeMaps.get(EnumDeviceAlgorithmChargingType.N_2.getCode());
             if (type.equals(Integer.valueOf(deviceAlgorithmChargingType2.getValue()))) {
@@ -255,6 +281,17 @@ public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgori
         if (Emptys.check(updateDeviceInfos)) {
             deviceInfoService.updateBatch(updateDeviceInfos);
         }
+        //支付宝刷脸柜激活请求
+        log.info("支付宝刷脸柜激活请求参数:{}", ailiActive.toString());
+        if (Emptys.check(ailiActive)) {
+            ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, ailiActive.size());
+            ailiActive.forEach(bindDeviceDTOBindActiveDTOTuple2 -> execute.execute(() -> {
+                //调用支付宝绑定
+                R.feignCheckData(alipayDeviceService.deviceBind(bindDeviceDTOBindActiveDTOTuple2.getV1()));
+                //调用支付宝激活
+                R.feignCheckData(alipayDeviceService.deviceActive(bindDeviceDTOBindActiveDTOTuple2.getV2()));
+            }));
+        }
         return R.ok();
     }
 

+ 121 - 46
device-api-service/src/main/java/com/xy/service/DeviceChargingServiceImpl.java

@@ -1,17 +1,17 @@
 package com.xy.service;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xy.collections.list.JArrayList;
 import com.xy.collections.list.JList;
+import com.xy.collections.map.JHashMap;
 import com.xy.collections.map.JMap;
+import com.xy.config.DeviceThreadPoolConfig;
 import com.xy.device.*;
-import com.xy.dto.DeviceAlgorithmChargingDto;
-import com.xy.dto.DeviceChargingConfigDto;
-import com.xy.dto.DeviceChargingDto;
-import com.xy.dto.DeviceInfoDto;
+import com.xy.dto.*;
 import com.xy.entity.*;
 import com.xy.mapper.DeviceChargingMapper;
 import com.xy.utils.*;
@@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -59,6 +60,12 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
 
     private DeviceAlgorithmChargingServiceImpl deviceAlgorithmChargingService;
 
+    private DeviceStatusServiceImpl deviceStatusService;
+
+    private DeviceSysinfoServiceImpl deviceSysinfoService;
+
+    private AlipayDeviceService alipayDeviceService;
+
     @PostMapping("init")
     @ApiOperation("初始化")
     public R init() {
@@ -86,56 +93,93 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
 
     @PostMapping("payCheck")
     @ApiOperation("购买反显")
-    public R<DeviceChargingDto.PayCheckVo> payCheck(@RequestBody @Validated DeviceChargingDto.PayCheck payCheck) {
-        DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(payCheck.getDeviceId()).setIsStatus(true)).getData();
-        if (deviceInfo == null) {
+    public R<Map<Long, DeviceChargingDto.PayCheckVo>> payCheck(@RequestBody @Validated DeviceChargingDto.PayCheck payCheck) {
+        Map<Long, DeviceChargingDto.PayCheckVo> result = new HashMap<>();
+        List<Long> deviceIds = payCheck.getDeviceId();
+        List<DeviceInfo> list = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
+                .in(DeviceInfo::getDeviceId, deviceIds)
+        );
+        if (!Emptys.check(list)) {
             return R.fail("设备不存在");
         }
-        //封装设备信息
-        DeviceChargingDto.PayCheckVo payCheckVo = new DeviceChargingDto.PayCheckVo();
-        String deviceTypeName = SysDictUtils.get(EnumDeviceType.Code.CODE.getCode(), String.valueOf(deviceInfo.getDeviceType())).getMsg();
-        //查询设备计费配置表
+        JList<DeviceInfo> deviceInfos = new JArrayList<>(list);
+        JMap<Integer, DeviceInfo> cover = deviceInfos.toMap(DeviceInfo::getDeviceType).cover();
+        if (cover.size() > 1) {
+            return R.fail("设备类型必须一致");
+        }
+        //查询设备状态信息
+        List<DeviceStatus> deviceStatuses = deviceStatusService.list(new LambdaQueryWrapper<DeviceStatus>().in(DeviceStatus::getDeviceId, deviceIds));
+        JMap<Long, DeviceStatus> deviceStatusesJMaps = new JArrayList<>(deviceStatuses).toMap(DeviceStatus::getDeviceId).cover();
         List<String> mercCodes = new ArrayList<>();
-        deviceAlgorithmChargingService.getMercCodes(deviceInfo.getMercCode(), mercCodes);
+        deviceAlgorithmChargingService.getMercCodes(list.get(0).getMercCode(), mercCodes);
+        //查询设备计费配置表
         List<DeviceChargingConfig> deviceChargingConfigs = deviceChargingConfigService.list(new LambdaQueryWrapper<DeviceChargingConfig>()
                 .in(DeviceChargingConfig::getMercCode, mercCodes)
                 .eq(DeviceChargingConfig::getType, SysDictUtils.getValue(EnumDeviceChargingConfigType.Code.CODE.getCode(), EnumDeviceChargingConfigType.N_2.getCode(), Integer.class))
-                .eq(DeviceChargingConfig::getDeviceType, deviceInfo.getDeviceType())
+                .eq(DeviceChargingConfig::getDeviceType, list.get(0).getDeviceType())
                 .orderByDesc(DeviceChargingConfig::getMercCode)
         );
         //有则使用,无则使用默认字典
         int standard = Emptys.check(deviceChargingConfigs) ? deviceChargingConfigs.get(0).getConfigValue()
-                : SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), String.valueOf(deviceInfo.getDeviceType()), Integer.class);
-        DeviceChargingDto.PayCheckVo.DeviceInfo deviceInfoObj = Beans.copy(Beans.copy(DeviceChargingDto.PayCheckVo.DeviceInfo.class, deviceInfo), deviceInfo.getDeviceStatus())
-                .setDeviceTypeName(deviceTypeName)
-                .setStandard(BigDecimal.valueOf(standard).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/年")
-                .setMoney(standard);
-        //封装算法购买信息
-        DeviceTypeAlgorithmBeforConfig deviceTypeAlgorithmBeforConfig = deviceTypeAlgorithmBeforConfigService.getOne(new LambdaQueryWrapper<DeviceTypeAlgorithmBeforConfig>()
-                .eq(DeviceTypeAlgorithmBeforConfig::getDeviceType, deviceInfo.getDeviceType())
-                .eq(DeviceTypeAlgorithmBeforConfig::getMercId, deviceInfo.getMercId())
-                .eq(DeviceTypeAlgorithmBeforConfig::getAlgorithmId, deviceInfo.getAlgorithmId())
+                : SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), String.valueOf(list.get(0).getDeviceType()), Integer.class);
+        String deviceTypeName = SysDictUtils.get(EnumDeviceType.Code.CODE.getCode(), String.valueOf(list.get(0).getDeviceType())).getMsg();
+        //查询算法预充配置
+        JList<DeviceInfo> values = cover.getValues();
+        List<DeviceTypeAlgorithmBeforConfig> deviceTypeAlgorithmBeforConfigs = deviceTypeAlgorithmBeforConfigService.list(new LambdaQueryWrapper<DeviceTypeAlgorithmBeforConfig>()
+                .eq(DeviceTypeAlgorithmBeforConfig::getDeviceType, list.get(0).getDeviceType())
+                .eq(DeviceTypeAlgorithmBeforConfig::getMercId, list.get(0).getMercId())
+                .in(DeviceTypeAlgorithmBeforConfig::getAlgorithmId, values.getProperty(DeviceInfo::getAlgorithmId))
         );
-        SysDictRedis moonAlgorithmTypes = SysDictUtils.get(EnumAlgorithmTypes.Code.CODE.getCode(), String.valueOf(deviceInfo.getAlgorithmId()));
-        String algorithmPayConfig = SysDictUtils.getValue(EnumAlgorithmPayConfig.Code.CODE.getCode(), String.valueOf(deviceInfo.getAlgorithmId()), String.class);
-        DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmPayConfig).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
-        DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Inf inf = algorithmMoonConfig.getInf();
-        DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging infDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
-                .setDeviceTypeName(deviceTypeName)
-                .setAlgorithmId(deviceInfo.getAlgorithmId())
-                .setAlgorithmName(moonAlgorithmTypes.getMsg())
-                .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/每笔(" + inf.getSize() + "笔)")
-                .setMoney(deviceTypeAlgorithmBeforConfig == null ? inf.getMoney() : deviceTypeAlgorithmBeforConfig.getMoney());
-        //封装算法包月信息
-        DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
-        DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging moonDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
-                .setDeviceTypeName(deviceTypeName)
-                .setAlgorithmId(deviceInfo.getAlgorithmId())
-                .setAlgorithmName(moonAlgorithmTypes.getMsg())
-                .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/包月(" + moon.getSize() + "笔)")
-                .setMoney(moon.getMoney());
-        payCheckVo.setDeviceInfo(deviceInfoObj).setInfDeviceAlgorithmCharging(infDeviceAlgorithmCharging).setMoonDeviceAlgorithmCharging(moonDeviceAlgorithmCharging);
-        return R.ok(payCheckVo);
+        JMap<Long, DeviceTypeAlgorithmBeforConfig> deviceTypeAlgorithmBeforConfigsJMaps = Emptys.check(deviceTypeAlgorithmBeforConfigs) ? new JArrayList<>(deviceTypeAlgorithmBeforConfigs).toMap(DeviceTypeAlgorithmBeforConfig::getAlgorithmId).cover()
+                : new JHashMap<>();
+        //查询默认算法信息
+        JList<Long> algorithmIds = deviceInfos.getProperty(DeviceInfo::getAlgorithmId);
+        Map<Long, String> moonAlgorithmTypesMap = new HashMap<>();
+        Map<Long, String> algorithmPayConfigMap = new HashMap<>();
+        for (Long algorithmId : algorithmIds) {
+            SysDictRedis moonAlgorithmTypes = SysDictUtils.get(EnumAlgorithmTypes.Code.CODE.getCode(), String.valueOf(algorithmId));
+            SysDictRedis algorithmPayConfig = SysDictUtils.get(EnumAlgorithmPayConfig.Code.CODE.getCode(), String.valueOf(algorithmId));
+            if (Emptys.check(moonAlgorithmTypes)) {
+                moonAlgorithmTypesMap.put(algorithmId, moonAlgorithmTypes.getMsg());
+            }
+            if (Emptys.check(algorithmPayConfig)) {
+                algorithmPayConfigMap.put(algorithmId, algorithmPayConfig.getValue());
+            }
+        }
+        for (DeviceInfo deviceInfo : list) {
+            //封装设备信息
+            DeviceChargingDto.PayCheckVo payCheckVo = new DeviceChargingDto.PayCheckVo();
+            DeviceStatus deviceStatus = deviceStatusesJMaps.get(deviceInfo.getDeviceId());
+            DeviceChargingDto.PayCheckVo.DeviceInfo deviceInfoObj = Beans.copy(Beans.copy(DeviceChargingDto.PayCheckVo.DeviceInfo.class, deviceInfo), deviceStatus)
+                    .setDeviceTypeName(deviceTypeName)
+                    .setStandard(BigDecimal.valueOf(standard).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/年")
+                    .setMoney(standard);
+            //封装算法购买信息
+            DeviceTypeAlgorithmBeforConfig deviceTypeAlgorithmBeforConfig = deviceTypeAlgorithmBeforConfigsJMaps.get(deviceInfo.getAlgorithmId());
+            String algorithmName = moonAlgorithmTypesMap.get(deviceInfo.getAlgorithmId());
+            String algorithmPayConfig = algorithmPayConfigMap.get(deviceInfo.getAlgorithmId());
+            DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmPayConfig).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
+            DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Inf inf = algorithmMoonConfig.getInf();
+            DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging infDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
+                    .setDeviceTypeName(deviceTypeName)
+                    .setAlgorithmId(deviceInfo.getAlgorithmId())
+                    .setAlgorithmName(algorithmName)
+                    .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/每笔(" + inf.getSize() + "笔)")
+                    .setMoney(deviceTypeAlgorithmBeforConfig == null ? inf.getMoney() : deviceTypeAlgorithmBeforConfig.getMoney());
+            //封装算法包月信息
+            DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
+            DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging moonDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
+                    .setDeviceTypeName(deviceTypeName)
+                    .setAlgorithmId(deviceInfo.getAlgorithmId())
+                    .setAlgorithmName(algorithmName)
+                    .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/包月(" + moon.getSize() + "笔)")
+                    .setMoney(moon.getMoney());
+            payCheckVo.setDeviceInfo(deviceInfoObj)
+                    .setInfDeviceAlgorithmCharging(infDeviceAlgorithmCharging)
+                    .setMoonDeviceAlgorithmCharging(moonDeviceAlgorithmCharging);
+            result.put(deviceInfo.getDeviceId(), payCheckVo);
+        }
+        return R.ok(result);
     }
 
     @PostMapping("check")
@@ -178,6 +222,7 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
     @ApiOperation("分页查询")
     public R<PageBean<DeviceChargingDto.PageVo>> page(@RequestBody DeviceChargingDto.Page page) {
         Integer value = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
+        Integer prep = SysDictUtils.getValue(EnumDeviceChargingConfigType.Code.CODE.getCode(), EnumDeviceChargingConfigType.N_2.getCode(), Integer.class);
         String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
         page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
         IPage<DeviceChargingDto.PageVo> iPage = baseMapper.page(toIPage(page.getPage()), page);
@@ -197,12 +242,11 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
                 }
                 record.getDeviceCharging().setTimeoutStatus(timeoutStatus);
                 DeviceInfoDto.Vo deviceInfo = record.getDeviceInfo();
-
                 //查询设备计费配置
                 DeviceChargingConfigDto.SelectList selectList = new DeviceChargingConfigDto.SelectList()
                         .setDeviceType(deviceInfo.getDeviceType())
                         .setMercId(deviceInfo.getMercId());
-                selectList.setType(value);
+                selectList.setType(prep);
                 List<DeviceChargingConfigDto.Vo> deviceChargingConfigs = deviceChargingConfigService.list2(selectList).getData();
                 if (Emptys.check(deviceChargingConfigs)) {
                     //获取自定义配置计费标准
@@ -259,9 +303,13 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
         }
         LocalDateTime now = LocalDateTime.now();
         JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>(list);
+        int aliDeviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
         //查询设备信息
         List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
         JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
+        //查询设备系统信息
+        List<DeviceSysinfoDto.Vo> deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId))).getData();
+        JMap<Long, DeviceSysinfoDto.Vo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
         //查询设备计费表
         List<DeviceCharging> deviceChargings = list(new LambdaQueryWrapper<DeviceCharging>().in(DeviceCharging::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
         JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(deviceChargings).toMap(DeviceCharging::getDeviceId).cover();
@@ -270,7 +318,9 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
         JList<DeviceCharging> updateDeviceCharging = new JArrayList<>();
         JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
         JList<DeviceChargingHistory> updateDeviceChargingHistory = new JArrayList<>();
+        JList<Tuple.Tuple2<BindDeviceDTO, BindActiveDTO>> ailiActive = new JArrayList<>();
         for (DeviceChargingHistory deviceChargingHistory : deviceChargingHistories) {
+            DeviceInfo deviceInfo = deviceInfoJMap.get(deviceChargingHistory.getDeviceId());
             DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceChargingHistory.getDeviceId())
                     .setLastChargingPayType(deviceChargingHistory.getChargingType())
                     .setLastChargingMoney(deviceChargingHistory.getChargingMoney())
@@ -294,7 +344,6 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
                 updateDeviceInfo.setBusyState(1);
                 //激活设备
                 if (deviceChargingHistory.getChargingType() != 100) {
-                    DeviceInfo deviceInfo = deviceInfoJMap.get(deviceChargingHistory.getDeviceId());
                     if (deviceInfo.getActiveState() == 2) {
                         updateDeviceInfo.setActiveState(1);
                     }
@@ -304,6 +353,21 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
                 }
                 updateDeviceInfos.add(updateDeviceInfo);
             }
+            //支付宝设备
+            if (deviceInfo.getDeviceType() == aliDeviceType) {
+                if (deviceChargingHistory.getChargingType() != 100 && deviceInfo.getActiveState() == 2) {
+                    //支付宝绑定
+                    DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceChargingHistory.getDeviceId());
+                    BindDeviceDTO bindDeviceDTO = new BindDeviceDTO().setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
+                            .setBoardSn(deviceSysinfo.getDeviceSn());
+                    //支付宝激活
+                    BindActiveDTO bindActiveDTO = new BindActiveDTO()
+                            .setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
+                            .setBoardSn(deviceSysinfo.getDeviceSn())
+                            .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceInfo.getDeviceId()));
+                    ailiActive.add(new Tuple.Tuple2<>(bindDeviceDTO, bindActiveDTO));
+                }
+            }
             updateDeviceCharging.add(deviceCharging);
             updateDeviceChargingHistory.add(deviceChargingHistory);
         }
@@ -323,6 +387,17 @@ public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper,
             JList<JList<DeviceInfoDto.Update>> partition = updateDeviceInfos.partition(size);
             partition.forEach(data -> deviceInfoService.updateBatch(data));
         }
+        //支付宝刷脸柜激活请求
+        log.info("支付宝刷脸柜激活请求参数:{}", ailiActive.toString());
+        if (Emptys.check(ailiActive)) {
+            ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, ailiActive.size());
+            ailiActive.forEach(bindDeviceDTOBindActiveDTOTuple2 -> execute.execute(() -> {
+                //调用支付宝绑定
+                R.feignCheckData(alipayDeviceService.deviceBind(bindDeviceDTOBindActiveDTOTuple2.getV1()));
+                //调用支付宝激活
+                R.feignCheckData(alipayDeviceService.deviceActive(bindDeviceDTOBindActiveDTOTuple2.getV2()));
+            }));
+        }
         return R.ok();
     }
 }

+ 1 - 1
device-api-service/src/main/java/com/xy/service/factory/device/DeviceFactory.java

@@ -25,7 +25,7 @@ public interface DeviceFactory {
      * @param active
      * @return
      */
-    R active(MercMiniDeviceDto.Active active);
+    R active(MercMiniDeviceDto.Active2 active);
 
     /**
      * 发送指令

+ 38 - 51
device-api-service/src/main/java/com/xy/service/factory/device/impl/alipay/AliPayOpenDeviceFatoryImpl.java

@@ -6,6 +6,9 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.xy.alipay.SpiDeviceService;
 import com.xy.annotate.Factory;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.list.JList;
+import com.xy.collections.map.JMap;
 import com.xy.config.DeviceThreadPoolConfig;
 import com.xy.constants.SpiResponseConst;
 import com.xy.consumer.connected.ConnectedMqttConfiguration;
@@ -20,13 +23,11 @@ import com.xy.dto.spi.DeviceSetAttributesNotifyDTO;
 import com.xy.dto.spi.DeviceStatusChangeNotifyDTO;
 import com.xy.entity.DeviceInfo;
 import com.xy.entity.DeviceStatus;
-import com.xy.entity.DeviceSysinfo;
 import com.xy.error.CommRuntimeException;
 import com.xy.service.*;
 import com.xy.service.factory.device.DeviceFactory;
 import com.xy.service.factory.device.impl.open.OpenDeviceFactoryImpl;
 import com.xy.utils.*;
-import com.xy.utils.enums.DeviceActiveStateEnum;
 import com.xy.utils.enums.DeviceErrorRecordTypesEnum;
 import com.xy.vo.DeviceDetailVO;
 import io.swagger.annotations.Api;
@@ -36,7 +37,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
-import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -80,8 +81,39 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
     }
 
     @Override
-    public R active(MercMiniDeviceDto.Active active) {
-        return openDeviceFactoryImpl.active(active);
+    public R active(MercMiniDeviceDto.Active2 active) {
+        R<List<MercMiniDeviceDto.ActiveVo>> result = openDeviceFactoryImpl.active(active);
+        if (R.Enum.FAIL.getCode() == result.getCode()) {
+            return result;
+        }
+        //获取差集,得到已激活设备
+        JList<Long> costDeviceIds = new JArrayList<>(result.getData()).getProperty(MercMiniDeviceDto.ActiveVo::getDeviceId);
+        JList<Long> deviceIds = new JArrayList<>(active.getDeviceId());
+        JList<Long> diff = deviceIds.diff(costDeviceIds);
+        //查询设备系统信息
+        List<DeviceSysinfoDto.Vo> deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(diff)).getData();
+        JMap<Long, DeviceSysinfoDto.Vo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
+        //查询设备信息
+        List<DeviceInfoDto.Vo> deviceInfos = deviceInfoService.list(new DeviceInfoDto.ListDto().setDeviceIds(diff)).getData();
+        JMap<Long, DeviceInfoDto.Vo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfoDto.Vo::getDeviceId).cover();
+        ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, diff.size());
+        diff.forEach(deviceId -> execute.execute(() -> {
+            DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceId);
+            DeviceInfoDto.Vo deviceInfo = deviceInfosJMaps.get(deviceId);
+            //调用支付宝绑定
+            R.feignCheckData(alipayDeviceService.deviceBind(new BindDeviceDTO()
+                    .setTerminalId(String.valueOf(deviceId))
+                    .setBoardSn(deviceSysinfo.getDeviceSn()))
+            );
+            //调用支付宝激活
+            R.feignCheckData(alipayDeviceService.deviceActive(new BindActiveDTO()
+                    .setTerminalId(String.valueOf(deviceId))
+                    .setBoardSn(deviceSysinfo.getDeviceSn())
+                    .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceId)))
+            );
+        }));
+        execute.end();
+        return result;
     }
 
     @Override
@@ -197,7 +229,7 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         //激活状态
         FunctionUtils.NoParamsNoResult active = () -> {
             if (deviceStatusChangeNotifyDTO.getActiveStatus() != null && deviceStatusChangeNotifyDTO.getActiveStatus() == 1) {
-                active(new MercMiniDeviceDto.Active().setDeviceId(deviceInfo.getDeviceId()));
+                active(new MercMiniDeviceDto.Active2().setDeviceId(Arrays.asList(deviceInfo.getDeviceId())));
             }
         };
         busyStatus.run();
@@ -307,49 +339,4 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         return R.ok();
     }
 
-    @ApiOperation("设备注册&激活")
-    @PostMapping("deviceActive")
-    public R deviceActive(@RequestBody AlipayDeviceActiveDto dto) {
-        Long deviceId = dto.getDeviceId();
-        String sn = dto.getSn();
-        DeviceInfoDto.Vo deviceInfo = R.feignCheckData(deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(deviceId).setIsSysinfo(Boolean.TRUE)));
-        Long mercId = deviceInfo.getMercId();
-        Integer activeState = deviceInfo.getActiveState();
-        if (DeviceActiveStateEnum.TRUE.getCode().equals(String.valueOf(activeState))) {
-            throw new CommRuntimeException("此设备已经在平台激活,请到货柜操作!");
-        }
-        DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
-        if (deviceSysinfo != null) {
-            String deviceSn = deviceSysinfo.getDeviceSn();
-            if (StrUtil.isNotEmpty(deviceSn)) {
-                //存在绑定关系了
-                //绑定sn与扫码获取的sn是否一致
-                if (!deviceSn.equals(sn)) {
-                    throw new CommRuntimeException("SN号与平台登记的不一致,请联系客服!");
-                }
-
-            } else {
-                //登记了 but 没有sn ,则启用扫码获取的sn
-                //调用支付宝 注册
-
-            }
-            Boolean regOk = R.feignCheckData(alipayDeviceService.deviceBind(new BindDeviceDTO().setTerminalId(String.valueOf(deviceId)).setBoardSn(sn)));
-            if (regOk) {
-                deviceSysinfoService.updateById(new DeviceSysinfo().setDeviceId(deviceId).setDeviceSn(sn));
-            }
-            String deviceName = deviceInfo.getDeviceName();
-            deviceName = StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceName : String.valueOf(deviceId);
-            //调用支付宝激活
-            Boolean activeOk = R.feignCheckData(alipayDeviceService.deviceActive(new BindActiveDTO().setTerminalId(String.valueOf(deviceId)).setBoardSn(sn).setDeviceName(deviceName)));
-            if (!activeOk) {
-                throw new CommRuntimeException("设备激活失败,请联系客服!");
-            }
-            //更新激活状态
-            deviceInfoService.updateById(new DeviceInfo().setDeviceId(deviceId).setActiveState(1).setActiveTime(LocalDateTime.now()));
-        } else {
-            throw new CommRuntimeException("此设备尚未在平台登记,请联系客服!");
-        }
-
-        return R.ok();
-    }
 }

+ 56 - 22
device-api-service/src/main/java/com/xy/service/factory/device/impl/open/OpenDeviceFactoryImpl.java

@@ -3,9 +3,12 @@ package com.xy.service.factory.device.impl.open;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.xy.annotate.Factory;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.map.JMap;
 import com.xy.consumer.device.push.msg.DevicePushMsgMqttConfiguration;
 import com.xy.consumer.device.push.msg.DevicePushMsgProducer;
 import com.xy.device.EnumDeviceActiveStatus;
@@ -26,6 +29,7 @@ import com.xy.utils.Enum.AlgorithmTypeEnum;
 import com.xy.utils.enums.DeviceTypeEnum;
 import lombok.AllArgsConstructor;
 
+import javax.validation.constraints.NotEmpty;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -143,37 +147,67 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
     }
 
     @Override
-    public R active(MercMiniDeviceDto.Active active) {
-        DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
+    public R<List<MercMiniDeviceDto.ActiveVo>> active(MercMiniDeviceDto.Active2 active) {
+        List<MercMiniDeviceDto.ActiveVo> result = new ArrayList<>();
+        List<Long> deviceIds = active.getDeviceId();
         //机器是否已激活
         Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
-        if (deviceInfo.getActiveState().equals(activeState)) {
+        long count = deviceInfoService.count(new LambdaQueryWrapper<DeviceInfo>()
+                .in(DeviceInfo::getDeviceId, deviceIds)
+                .eq(DeviceInfo::getActiveState, activeState)
+        );
+        if (count > 0) {
             return R.fail("机器已激活");
         }
         //检查费用
-        R deviceChargingCheck = deviceChargingService.check(new DeviceChargingDto.Check().setDeviceId(active.getDeviceId()));
-        R deviceAlgorithmChargingCheck = deviceAlgorithmChargingService.check(new DeviceAlgorithmChargingDto.Check().setDeviceId(active.getDeviceId()));
-        if (deviceChargingCheck.getCode() != R.Enum.SUCCESS.getCode() && deviceAlgorithmChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
-            return R.fail(R.Enum.CHARGING_ALGORITHM_CHARGING.getCode(), R.Enum.CHARGING_ALGORITHM_CHARGING.getMsg());
-        } else {
-            if (deviceChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
-                return deviceChargingCheck;
-            }
-            if (deviceAlgorithmChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
-                return deviceAlgorithmChargingCheck;
+        deviceIds.forEach(deviceId -> {
+            R deviceChargingCheck = deviceChargingService.check(new DeviceChargingDto.Check().setDeviceId(deviceId));
+            R deviceAlgorithmChargingCheck = deviceAlgorithmChargingService.check(new DeviceAlgorithmChargingDto.Check().setDeviceId(deviceId));
+            if (deviceChargingCheck.getCode() != R.Enum.SUCCESS.getCode() && deviceAlgorithmChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
+                MercMiniDeviceDto.ActiveVo activeVo = new MercMiniDeviceDto.ActiveVo()
+                        .setDeviceId(deviceId)
+                        .setCode(R.Enum.CHARGING_ALGORITHM_CHARGING.getCode())
+                        .setMsg(R.Enum.CHARGING_ALGORITHM_CHARGING.getMsg());
+                result.add(activeVo);
+            } else {
+                if (deviceChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
+                    MercMiniDeviceDto.ActiveVo activeVo = new MercMiniDeviceDto.ActiveVo()
+                            .setDeviceId(deviceId)
+                            .setCode(deviceChargingCheck.getCode())
+                            .setMsg(deviceChargingCheck.getMsg());
+                    result.add(activeVo);
+                }
+                if (deviceAlgorithmChargingCheck.getCode() != R.Enum.SUCCESS.getCode()) {
+                    MercMiniDeviceDto.ActiveVo activeVo = new MercMiniDeviceDto.ActiveVo()
+                            .setDeviceId(deviceId)
+                            .setCode(deviceAlgorithmChargingCheck.getCode())
+                            .setMsg(deviceAlgorithmChargingCheck.getMsg());
+                    result.add(activeVo);
+                }
             }
-        }
+        });
         //激活
         LocalDateTime now = LocalDateTime.now();
         Integer busyState = SysDictUtils.getValue(EnumDeviceBusyStatus.Code.CODE.getCode(), EnumDeviceBusyStatus.N_1.getCode(), Integer.class);
-        DeviceInfo updateDeviceInfo = new DeviceInfo()
-                .setDeviceId(active.getDeviceId())
-                .setActiveState(activeState)
-                .setBusyState(busyState)
-                .setActiveTime(now)
-                .setShowStatus(true);
-        deviceInfoService.updateById(updateDeviceInfo);
-        return R.ok();
+        List<DeviceInfo> activeList = new ArrayList<>();
+        JMap<Long, MercMiniDeviceDto.ActiveVo> cover = new JArrayList<>(result).toMap(MercMiniDeviceDto.ActiveVo::getDeviceId).cover();
+        deviceIds.forEach(deviceId -> {
+            //过滤需要付费的设备
+            if (cover.containsKey(deviceId)) {
+                return;
+            }
+            DeviceInfo updateDeviceInfo = new DeviceInfo()
+                    .setDeviceId(deviceId)
+                    .setActiveState(activeState)
+                    .setBusyState(busyState)
+                    .setActiveTime(now)
+                    .setShowStatus(true);
+            activeList.add(updateDeviceInfo);
+        });
+        if (Emptys.check(activeList)) {
+            deviceInfoService.updateBatchById(activeList);
+        }
+        return R.ok(result);
     }
 
     @Override

+ 2 - 2
device-api/src/main/java/com/xy/dto/DeviceChargingDto.java

@@ -123,9 +123,9 @@ public class DeviceChargingDto {
     @Accessors(chain = true)
     public static class PayCheck {
 
-        @NotNull(message = "deviceId不能为空")
+        @NotEmpty(message = "deviceId不能为空")
         @ApiModelProperty("设备id")
-        private Long deviceId;
+        private List<Long> deviceId;
     }
 
     @Data

+ 27 - 0
device-api/src/main/java/com/xy/dto/MercMiniDeviceDto.java

@@ -8,7 +8,9 @@ import lombok.Data;
 import lombok.experimental.Accessors;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 public class MercMiniDeviceDto {
 
@@ -63,6 +65,31 @@ public class MercMiniDeviceDto {
 
     }
 
+    @Data
+    @Accessors(chain = true)
+    public static class Active2 {
+
+        @NotEmpty(message = "deviceId不能为空")
+        @ApiModelProperty("设备id")
+        private List<Long> deviceId;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class ActiveVo {
+
+        @ApiModelProperty("设备id")
+        private Long deviceId;
+
+        @ApiModelProperty("状态码")
+        private Integer code;
+
+        @ApiModelProperty("状态说明")
+        private String msg;
+
+    }
+
     @Data
     @Accessors(chain = true)
     public static class BusySate {