李进 1 год назад
Родитель
Сommit
49316f0e5d

+ 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();
+    }
 }

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

@@ -4,6 +4,9 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 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;
@@ -16,28 +19,27 @@ import com.xy.dto.spi.DeviceAlarmNotifyDTO;
 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;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+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;
 
 /**
  * 支付宝开门柜设备 接口实现
  */
+@Slf4j
 @Factory(type = "2")
 @AllArgsConstructor
 @Api(tags = "支付宝开门柜设备")
@@ -76,7 +78,41 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
 
     @Override
     public R active(MercMiniDeviceDto.Active2 active) {
-        return openDeviceFactoryImpl.active(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()))
+            );
+            //调用支付宝激活
+            boolean activeOk = R.feignCheckData(alipayDeviceService.deviceActive(new BindActiveDTO()
+                    .setTerminalId(String.valueOf(deviceId))
+                    .setBoardSn(deviceSysinfo.getDeviceSn())
+                    .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceId)))
+            );
+            if (!activeOk) {
+                throw new CommRuntimeException("设备激活失败,请联系客服!");
+            }
+        }));
+        execute.end();
+        return result;
     }
 
     @Override
@@ -205,49 +241,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();
-    }
 }