Răsfoiți Sursa

重构设备

李进 2 ani în urmă
părinte
comite
edaa67ccbd
18 a modificat fișierele cu 614 adăugiri și 646 ștergeri
  1. 23 44
      device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java
  2. 0 39
      device-api-service/src/main/java/com/xy/alipay/AliPay.java
  3. 0 138
      device-api-service/src/main/java/com/xy/alipay/AliPayAspet.java
  4. 0 67
      device-api-service/src/main/java/com/xy/alipay/ApiDeviceServiceImpl.java
  5. 0 126
      device-api-service/src/main/java/com/xy/alipay/SpiDeviceServiceImpl.java
  6. 5 21
      device-api-service/src/main/java/com/xy/service/DeviceEventMsgServiceImpl.java
  7. 13 78
      device-api-service/src/main/java/com/xy/service/DeviceRegisterServiceImpl.java
  8. 44 115
      device-api-service/src/main/java/com/xy/service/MqttServiceImpl.java
  9. 5 4
      device-api-service/src/main/java/com/xy/service/factory/cmd/QualityCmdServiceImpl.java
  10. 4 4
      device-api-service/src/main/java/com/xy/service/factory/cmd/SetsCmdServiceImpl.java
  11. 7 6
      device-api-service/src/main/java/com/xy/service/factory/cmd/TaskCmdServiceImpl.java
  12. 1 1
      device-api-service/src/main/java/com/xy/service/factory/cmd/service/CmdService.java
  13. 201 0
      device-api-service/src/main/java/com/xy/service/factory/device/AliPayDeviceFatoryImpl.java
  14. 239 0
      device-api-service/src/main/java/com/xy/service/factory/device/OpenDeviceFactoryImpl.java
  15. 61 0
      device-api-service/src/main/java/com/xy/service/factory/device/service/DeviceFactory.java
  16. 1 3
      device-api/src/main/java/com/xy/alipay/SpiDeviceService.java
  17. 4 0
      device-api/src/main/java/com/xy/dto/DeviceRegisterDto.java
  18. 6 0
      device-api/src/main/java/com/xy/dto/MercMiniDeviceDto.java

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

@@ -3,12 +3,10 @@ package com.xy.controller;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.xy.alipay.AliPay;
 import com.xy.annotate.RestMappingController;
 import com.xy.device.EnumDeviceActiveStatus;
-import com.xy.device.EnumDeviceBusyStatus;
-import com.xy.device.EnumDeviceCharging;
 import com.xy.device.EnumDeviceFreezeStatus;
+import com.xy.device.EnumDeviceType;
 import com.xy.dto.DeviceBluetoothAuthDto;
 import com.xy.dto.DeviceInfoDto;
 import com.xy.dto.DeviceStatusDto;
@@ -17,12 +15,19 @@ import com.xy.dto.be.MercDto;
 import com.xy.dto.common.MercLineDto;
 import com.xy.dto.common.MercPlaceDto;
 import com.xy.dto.mini.MiniMercRegionDto;
-import com.xy.entity.*;
+import com.xy.entity.DeviceBluetoothAuth;
+import com.xy.entity.DeviceInfo;
+import com.xy.entity.DeviceSysinfo;
+import com.xy.entity.DeviceTempRecords;
 import com.xy.enums.MercStatus;
-import com.xy.service.*;
+import com.xy.service.DeviceBluetoothAuthServiceImpl;
+import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.service.DeviceSysinfoServiceImpl;
+import com.xy.service.DeviceTempRecordsServiceImpl;
 import com.xy.service.be.MercFeignService;
 import com.xy.service.common.MercLineService;
 import com.xy.service.common.MercPlaceService;
+import com.xy.service.factory.device.service.DeviceFactory;
 import com.xy.utils.*;
 import com.xy.utils.enums.DeviceActiveStateEnum;
 import com.xy.utils.enums.DeviceAuthCodeUseStatus;
@@ -70,8 +75,6 @@ public class MercMiniDeviceController {
 
     private final DeviceBluetoothAuthServiceImpl deviceBluetoothAuthService;
 
-    private final DeviceChargingServiceImpl deviceChargingService;
-
     private final DeviceTempRecordsServiceImpl deviceTempRecordsService;
 
     @ApiOperation("商户设备首页统计")
@@ -117,15 +120,15 @@ public class MercMiniDeviceController {
             vo.setNetStateName(deviceStatus == null ? StrUtil.EMPTY : DeviceNetSateType.getEnumByCode(deviceStatus.getNetState()).getDescription());
             if (deviceStatus != null) {
                 Integer tempValue = deviceStatus.getTempValue();
-                if(tempValue==null){
+                if (tempValue == null) {
                     List<DeviceTempRecords> deviceTempRecords = deviceTempRecordsService
                             .list(Wrappers.<DeviceTempRecords>lambdaQuery()
                                     .eq(DeviceTempRecords::getDeviceId, vo.getDeviceId()).orderByDesc(DeviceTempRecords::getCreateTime).last("limit 1")
                             );
-                    if(CollUtil.isNotEmpty(deviceTempRecords)){
+                    if (CollUtil.isNotEmpty(deviceTempRecords)) {
                         deviceStatus.setTempValue(deviceTempRecords.get(0).getTempValue());
                         vo.setDeviceStatus(deviceStatus);
-                    }else {
+                    } else {
                         deviceStatus.setTempValue(0);
                         vo.setDeviceStatus(deviceStatus);
                     }
@@ -209,48 +212,24 @@ public class MercMiniDeviceController {
     @ApiOperation("激活设备")
     @Transactional(rollbackFor = Exception.class)
     public R active(@RequestBody MercMiniDeviceDto.Active active) {
-        R activeInfo = this.getActiveInfo(active);
-        //激活设备
-        if (activeInfo.getCode() == R.Enum.SUCCESS.getCode()) {
-            LocalDateTime now = LocalDateTime.now();
-            Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
-            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);
-            //首次激活可试用x天
-            DeviceCharging deviceCharging = deviceChargingService.getById(active.getDeviceId());
-            if (deviceCharging == null) {
-                SysDictRedis sysDictRedis = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_X.getCode());
-                deviceChargingService.save(new DeviceCharging()
-                        .setDeviceId(active.getDeviceId())
-                        .setChargingX(Integer.valueOf(sysDictRedis.getValue()))
-                        .setTimeout(now)
-                        .setCreateTime(now)
-                );
+        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;
             }
-            return R.ok();
-        } else {
-            return activeInfo;
         }
+        return FactoryUtils.getService(factory, DeviceFactory.class).active(active);
     }
 
     @ApiOperation("运营状态修改")
     @PostMapping("modifyBusyStage")
-    @AliPay(AliPay.Type.BUSY_STATE)
     public R modifyBusyStage(@RequestBody @Validated MercMiniDeviceDto.BusySate busySate) {
         Long mercId = MercAuthUtils.getMercId();
-        Long deviceId = busySate.getDeviceId();
-        DeviceInfo updateDeviceInfo = new DeviceInfo()
-                .setDeviceId(deviceId)
-                .setMercId(mercId)
-                .setBusyState(busySate.getBusyState());
-        deviceInfoService.updateById(updateDeviceInfo);
-        return R.ok();
+        DeviceInfo deviceInfo = deviceInfoService.getById(busySate.getDeviceId());
+        return FactoryUtils.getService(() -> deviceInfo.getDeviceType() == EnumDeviceType.N_5.getIntCode() ? 2 : 1, DeviceFactory.class)
+                .busyStatus(busySate.setMercId(mercId));
     }
 
     @ApiOperation("修改设备信息、上传坐标等")

+ 0 - 39
device-api-service/src/main/java/com/xy/alipay/AliPay.java

@@ -1,39 +0,0 @@
-package com.xy.alipay;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.lang.annotation.*;
-
-/**
- * 支付宝注解
- *
- * @author lijin
- */
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface AliPay {
-
-    /**
-     * 类型
-     *
-     * @return
-     */
-    Type value();
-
-
-    @Getter
-    @AllArgsConstructor
-    enum Type {
-
-        RESTART("重启设备"),
-
-        BUSY_STATE("修改运营状态")
-
-        ;
-
-        private String type;
-    }
-
-}

+ 0 - 138
device-api-service/src/main/java/com/xy/alipay/AliPayAspet.java

@@ -1,138 +0,0 @@
-package com.xy.alipay;
-
-import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.xy.collections.list.JArrayList;
-import com.xy.collections.map.JMap;
-import com.xy.device.EnumDeviceType;
-import com.xy.dto.CommandMqtt;
-import com.xy.dto.DeviceChangeStatusDTO;
-import com.xy.dto.MercMiniDeviceDto;
-import com.xy.entity.DeviceInfo;
-import com.xy.service.AlipayDeviceService;
-import com.xy.service.DeviceInfoServiceImpl;
-import com.xy.utils.AuthorizeUtils;
-import com.xy.utils.R;
-import com.xy.utils.SysDictUtils;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Slf4j
-@Aspect
-@Component
-@AllArgsConstructor
-public class AliPayAspet {
-
-    private DeviceInfoServiceImpl deviceInfoService;
-
-    private AlipayDeviceService alipayDeviceService;
-
-    /**
-     * 支付宝设备
-     *
-     * @param joinPoint
-     * @param aliPay
-     * @return
-     * @throws Throwable
-     */
-    @Around("@annotation(aliPay)")
-    public Object timer(ProceedingJoinPoint joinPoint, AliPay aliPay) throws Throwable {
-        String type = aliPay.value().getType();
-        Object[] args = joinPoint.getArgs();
-        Object result = R.ok();
-        try {
-            boolean fal = before(type, args);
-            if (fal) {
-                result = joinPoint.proceed(args);
-            }
-        } catch (Exception e) {
-            throw e;
-        }
-        return result;
-    }
-
-    public boolean before(String type, Object[] args) {
-        boolean fal = true;
-        //重启设备
-        if (type.equals(AliPay.Type.RESTART.getType())) {
-            List<CommandMqtt> restart = restart(args);
-            if (restart.size() > 0) {
-                args[0] = restart;
-            } else {
-                fal = false;
-            }
-        }
-        //修改运营状态
-        if (type.equals(AliPay.Type.BUSY_STATE.getType())) {
-            fal = busyState(args);
-        }
-        return fal;
-    }
-
-    /**
-     * 重启设备
-     *
-     * @param args
-     */
-    private List<CommandMqtt> restart(Object[] args) {
-        List<CommandMqtt> result = new ArrayList<>();
-        List<CommandMqtt> commandMqtts = (List<CommandMqtt>) args[0];
-        //查询支付宝设备信息
-        Integer deviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
-        List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
-                .in(DeviceInfo::getDeviceId, new JArrayList<>(commandMqtts).comparing(CommandMqtt::getDeviceId).getProperty(CommandMqtt::getDeviceId))
-                .eq(DeviceInfo::getDeviceType, deviceType)
-        );
-        if (deviceInfos.size() == 0) {
-            return commandMqtts;
-        }
-        JMap<Long, DeviceInfo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
-        commandMqtts.forEach(commandMqtt -> {
-            JSONObject templet = commandMqtt.getTemplet();
-            JSONObject data = templet.getJSONObject("data");
-            DeviceInfo deviceInfo = deviceInfosJMaps.get(commandMqtt.getDeviceId());
-            if (deviceInfo == null) {
-                result.add(commandMqtt);
-                return;
-            }
-            //发送支付宝设备重启请求
-            if (data.getStr("type").equals("app") && data.getStr("task").equals("restart")) {
-                alipayDeviceService.deviceReboot(deviceInfo.getDeviceId().toString());
-            }
-        });
-        return result;
-    }
-
-    /**
-     * 修改运营状态
-     *
-     * @param args
-     * @return
-     */
-    private boolean busyState(Object[] args) {
-        MercMiniDeviceDto.BusySate busySate = (MercMiniDeviceDto.BusySate) args[0];
-        //查询支付宝设备信息
-        Integer deviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
-        DeviceInfo deviceInfo = deviceInfoService.getOne(new LambdaQueryWrapper<DeviceInfo>()
-                .eq(DeviceInfo::getDeviceId, busySate.getDeviceId())
-                .eq(DeviceInfo::getDeviceType, deviceType)
-        );
-        if (deviceInfo == null) {
-            return true;
-        }
-        //发送支付宝设备修改运营状态请求
-        DeviceChangeStatusDTO deviceChangeStatusDTO = new DeviceChangeStatusDTO()
-                .setTerminalId(String.valueOf(busySate.getDeviceId()))
-                .setOperatorId(AuthorizeUtils.getLoginId(String.class))
-                .setStatus(busySate.getBusyState());
-        alipayDeviceService.changeStatus(deviceChangeStatusDTO);
-        return false;
-    }
-}

+ 0 - 67
device-api-service/src/main/java/com/xy/alipay/ApiDeviceServiceImpl.java

@@ -1,67 +0,0 @@
-package com.xy.alipay;
-
-import cn.hutool.json.JSONObject;
-import com.xy.annotate.RestMappingController;
-import com.xy.config.DeviceThreadPoolConfig;
-import com.xy.consumer.connected.ConnectedMqttConfiguration;
-import com.xy.consumer.connected.ConnectedProducer;
-import com.xy.consumer.disconnect.DisconnectedMqttConfiguration;
-import com.xy.consumer.disconnect.DisconnectedProducer;
-import com.xy.dto.DeviceDetailDTO;
-import com.xy.service.AlipayDeviceService;
-import com.xy.utils.R;
-import com.xy.utils.ThreadPoolUtils;
-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.stereotype.Component;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-import java.util.List;
-
-/**
- * <p>
- * 支付宝设备服务
- * </p>
- *
- * @author lijin
- * @since 2023-04-20
- */
-@Slf4j
-@Component
-@AllArgsConstructor
-@Api(tags = "支付宝设备API")
-@RestMappingController("/api/device")
-public class ApiDeviceServiceImpl {
-
-    private AlipayDeviceService alipayDeviceService;
-
-    private ConnectedProducer connectedProducer;
-
-    private DisconnectedProducer disconnectedProducer;
-
-    @ApiOperation("刷新设备联网状态")
-    @PostMapping("refurbishDeviceNetWork")
-    public R refurbishDeviceNetWork(@RequestBody List<Long> deviceIds) {
-        ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALIPAY_DEVICE_DETAIL, deviceIds.size());
-        deviceIds.forEach(deviceId -> execute.execute(() -> {
-            DeviceDetailVO deviceDetailVO = alipayDeviceService.queryDetail(new DeviceDetailDTO().setTerminalId(String.valueOf(deviceId)));
-            if (deviceDetailVO == null) {
-                return;
-            }
-            JSONObject jsonObject = new JSONObject().set("clientid", deviceId);
-            if (deviceDetailVO.getOnline()) {
-                connectedProducer.sendToMqtt(jsonObject.toString(), ConnectedMqttConfiguration.TOPIC, 1);
-            } else {
-                disconnectedProducer.sendToMqtt(jsonObject.toString(), DisconnectedMqttConfiguration.TOPIC, 1);
-            }
-        }));
-        execute.end();
-        return R.ok();
-    }
-
-
-}

+ 0 - 126
device-api-service/src/main/java/com/xy/alipay/SpiDeviceServiceImpl.java

@@ -1,126 +0,0 @@
-package com.xy.alipay;
-
-import cn.hutool.json.JSONObject;
-import com.xy.constants.SpiResponseConst;
-import com.xy.consumer.connected.ConnectedMqttConfiguration;
-import com.xy.consumer.connected.ConnectedProducer;
-import com.xy.consumer.disconnect.DisconnectedMqttConfiguration;
-import com.xy.consumer.disconnect.DisconnectedProducer;
-import com.xy.device.EnumDeviceCharging;
-import com.xy.dto.DeviceEventMsgDto;
-import com.xy.dto.spi.DeviceAlarmNotifyDTO;
-import com.xy.dto.spi.DeviceStatusChangeNotifyDTO;
-import com.xy.entity.DeviceCharging;
-import com.xy.entity.DeviceInfo;
-import com.xy.entity.DeviceStatus;
-import com.xy.entity.SysDictRedis;
-import com.xy.service.DeviceChargingServiceImpl;
-import com.xy.service.DeviceEventMsgServiceImpl;
-import com.xy.service.DeviceInfoServiceImpl;
-import com.xy.service.DeviceStatusServiceImpl;
-import com.xy.utils.SysDictUtils;
-import com.xy.utils.enums.DeviceErrorRecordTypesEnum;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-
-
-/**
- * spi 设备相关
- *
- * @author 谭斌
- * @date 2023/04/16
- */
-@Service
-@AllArgsConstructor
-@Slf4j
-@Api(tags = "支付宝设备相关SPI")
-public class SpiDeviceServiceImpl implements SpiDeviceService {
-
-    private DeviceInfoServiceImpl deviceInfoService;
-
-    private DeviceStatusServiceImpl deviceStatusService;
-
-    private DeviceEventMsgServiceImpl deviceEventMsgService;
-
-    private DeviceChargingServiceImpl deviceChargingService;
-
-    private DisconnectedProducer disconnectedProducer;
-
-    private ConnectedProducer connectedProducer;
-
-    @Override
-    @ApiOperation("设备告警通知")
-    public String deviceAlarmNotify(DeviceAlarmNotifyDTO deviceAlarmNotifyDTO) {
-        //查询设备信息
-        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceAlarmNotifyDTO.getTerminalId()));
-        String faultCode = deviceAlarmNotifyDTO.getFaultCode();
-        DeviceErrorRecordTypesEnum deviceErrorRecordTypesEnum = faultCode.equals("DeviceOffline") ? DeviceErrorRecordTypesEnum.NET
-                : faultCode.equals("DoorOpenedOnNoTrade") ? DeviceErrorRecordTypesEnum.DOOR_LOCK
-                : null;
-        if (deviceErrorRecordTypesEnum == null) {
-            return SpiResponseConst.FAIL;
-        }
-        //添加设备异常记录
-        DeviceEventMsgDto.Save save = new DeviceEventMsgDto.Save()
-                .setDeviceId(deviceInfo.getDeviceId());
-        save.setCode(deviceErrorRecordTypesEnum.getCode());
-        save.setMsg(deviceAlarmNotifyDTO.getFaultMsg());
-        deviceEventMsgService.save(save);
-        return SpiResponseConst.SUCCESS;
-    }
-
-    @Override
-    @ApiOperation("设备状态变更通知")
-    public String deviceStatusChangeNotify(DeviceStatusChangeNotifyDTO deviceStatusChangeNotifyDTO) {
-        //查询设备信息
-        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceStatusChangeNotifyDTO.getTerminalId()));
-        Integer status = deviceStatusChangeNotifyDTO.getStatus();
-        //修改冻结状态、运营状态
-        DeviceInfo updateDeviceInfo = new DeviceInfo()
-                .setDeviceId(deviceInfo.getDeviceId())
-                .setBusyState(status)
-                .setFreezeStatus(status);
-        //修改激活状态
-        if (deviceStatusChangeNotifyDTO.getActiveStatus() != null && deviceStatusChangeNotifyDTO.getActiveStatus() == 1) {
-            if (deviceInfo.getActiveState() != 1) {
-                LocalDateTime now = LocalDateTime.now();
-                updateDeviceInfo.setActiveState(deviceStatusChangeNotifyDTO.getActiveStatus());
-                updateDeviceInfo.setActiveTime(now);
-                //首次激活可试用x天
-                DeviceCharging deviceCharging = deviceChargingService.getById(deviceInfo.getDeviceId());
-                if (deviceCharging == null) {
-                    SysDictRedis sysDictRedis = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_X.getCode());
-                    deviceChargingService.save(new DeviceCharging()
-                            .setDeviceId(deviceInfo.getDeviceId())
-                            .setChargingX(Integer.valueOf(sysDictRedis.getValue()))
-                            .setTimeout(now)
-                            .setCreateTime(now)
-                    );
-                }
-            }
-        }
-        deviceInfoService.updateById(updateDeviceInfo);
-        //修改在线状态
-        Boolean online = deviceStatusChangeNotifyDTO.getOnline();
-        if (online != null) {
-            DeviceStatus deviceStatus = deviceStatusService.getById(deviceInfo.getDeviceId());
-            int netState = online ? 1 : 2;
-            if (netState != deviceStatus.getNetState()) {
-                JSONObject jsonObject = new JSONObject().set("clientid", deviceInfo.getDeviceId());
-                if (online) {
-                    //在线
-                    connectedProducer.sendToMqtt(jsonObject.toString(), ConnectedMqttConfiguration.TOPIC, 1);
-                } else {
-                    //离线
-                    disconnectedProducer.sendToMqtt(jsonObject.toString(), DisconnectedMqttConfiguration.TOPIC, 1);
-                }
-            }
-        }
-        return SpiResponseConst.SUCCESS;
-    }
-}

+ 5 - 21
device-api-service/src/main/java/com/xy/service/DeviceEventMsgServiceImpl.java

@@ -3,13 +3,14 @@ package com.xy.service;
 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.device.EnumDeviceType;
 import com.xy.dto.DeviceEventMsgDto;
 import com.xy.dto.DeviceInfoDto;
 import com.xy.entity.DeviceEventMsg;
-import com.xy.entity.DeviceInfo;
 import com.xy.entity.SysCodeConfigureRedis;
 import com.xy.enums.SysCodeConfigureEnum;
 import com.xy.mapper.DeviceEventMsgMapper;
+import com.xy.service.factory.device.service.DeviceFactory;
 import com.xy.utils.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -19,7 +20,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
-import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -47,28 +47,12 @@ public class DeviceEventMsgServiceImpl extends ServiceImpl<DeviceEventMsgMapper,
     @Override
     @ApiOperation("添加")
     public R save(DeviceEventMsgDto.Save save) {
-        DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(save.getDeviceId()).setIsSysinfo(true)).getData();
+        DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(save.getDeviceId())).getData();
         if (deviceInfo == null) {
             return R.fail("设备不存在");
         }
-        //查询消息编码信息
-        String paterCode = save.getCode().substring(0, save.getCode().length() - 1);
-        SysCodeConfigureRedis sysCodeConfigureRedis = SysCodeConfigureUtils.get(paterCode, save.getCode());
-        //添加消息记录
-        save.setMercId(deviceInfo.getMercId());
-        DeviceEventMsg deviceEventMsg = copy(DeviceEventMsg.class, save)
-                .setCreateTime(LocalDateTime.now());
-        save(deviceEventMsg);
-        //异常消息,修改设备当前故障等级
-        if (paterCode.equals(SysCodeConfigureEnum.D01.getCode())) {
-            if (Emptys.check(sysCodeConfigureRedis.getExpand())) {
-                DeviceInfo updateDeviceInfo = new DeviceInfo()
-                        .setDeviceId(deviceInfo.getDeviceId())
-                        .setFaultLevel(Integer.valueOf(sysCodeConfigureRedis.getExpand()));
-                deviceInfoService.updateById(updateDeviceInfo);
-            }
-        }
-        return R.ok();
+        return FactoryUtils.getService(() -> deviceInfo.getDeviceType() == EnumDeviceType.N_5.getIntCode() ? 2 : 1, DeviceFactory.class)
+                .eventMsg(save);
     }
 
     @Override

+ 13 - 78
device-api-service/src/main/java/com/xy/service/DeviceRegisterServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.read.listener.ReadListener;
 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.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -14,9 +13,17 @@ 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.dto.*;
-import com.xy.entity.*;
-import com.xy.mapper.*;
+import com.xy.device.EnumDeviceType;
+import com.xy.dto.DeviceCreateIdsDto;
+import com.xy.dto.DeviceQualityDto;
+import com.xy.dto.DeviceRegisterDto;
+import com.xy.entity.DeviceCreateIds;
+import com.xy.entity.DeviceRegister;
+import com.xy.entity.DeviceSysinfo;
+import com.xy.entity.MqttUser;
+import com.xy.mapper.DeviceCreateIdsMapper;
+import com.xy.mapper.DeviceRegisterMapper;
+import com.xy.service.factory.device.service.DeviceFactory;
 import com.xy.utils.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,7 +44,6 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.time.LocalDateTime;
 import java.util.List;
 
 import static com.xy.utils.PlusBeans.*;
@@ -57,12 +63,6 @@ public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper,
 
     private DeviceCreateIdsMapper deviceCreateIdsMapper;
 
-    private DeviceInfoMapper deviceInfoMapper;
-
-    private DeviceSysinfoMapper deviceSysinfoMapper;
-
-    private DeviceStatusMapper deviceStatusMapper;
-
     private DeviceQualityServiceImpl deviceQualityService;
 
     private MqttUserServiceImpl mqttUserService;
@@ -91,73 +91,8 @@ public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper,
         if (count > 0) {
             return R.fail("设备SN已被绑定");
         }
-        deviceRegister.setDeviceType(deviceCreateIds.getDeviceType())
-                .setCreateUser(AuthorizeUtils.getLoginId(Long.class))
-                .setCreateTime(LocalDateTime.now());
-        //操作注册序号
-        String property = LambdaUtils.getProperty(DeviceRegister::getRegisterNum);
-        QueryWrapper<DeviceRegister> queryWrapper = new QueryWrapper<DeviceRegister>()
-                .select(String.format("max(%s) as %s", StringTools.humpToLine(property), property))
-                .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceRegister::getCreateUser)), AuthorizeUtils.getLoginId(Long.class));
-        DeviceRegister one = getOne(queryWrapper);
-        Integer registerNum = one == null || one.getRegisterNum() == null ? 0 : one.getRegisterNum();
-        deviceRegister.setRegisterNum(registerNum + 1);
-        //修改设备-机器ID号生成为已绑定
-        deviceCreateIdsMapper.updateById(new DeviceCreateIds()
-                .setDeviceId(deviceRegister.getDeviceId())
-                .setBindState(true)
-                .setBindTime(deviceRegister.getCreateTime())
-        );
-        DeviceInfo deviceInfo = new DeviceInfo()
-                .setDeviceId(deviceRegister.getDeviceId())
-                .setDeviceType(deviceRegister.getDeviceType())
-                .setMercDeviceCode(deviceRegister.getAssetNo())
-                .setCreateTime(deviceRegister.getCreateTime());
-        DeviceSysinfo deviceSysinfo = new DeviceSysinfo()
-                .setDeviceId(deviceRegister.getDeviceId())
-                .setDeviceSn(deviceRegister.getDeviceSn())
-                .setCreateTime(deviceRegister.getCreateTime());
-        DeviceStatus deviceStatus = new DeviceStatus().setDeviceId(deviceRegister.getDeviceId());
-        DeviceRegister deviceRegisterById = getById(deviceRegister.getDeviceId());
-        Integer deviceType = deviceInfo.getDeviceType();
-        //新增
-        if (deviceRegisterById == null) {
-            //设备-注册登记
-            save(deviceRegister);
-            if (deviceType == 5) {
-                //支付宝设备注册
-                alipayDeviceService.deviceAssign(new DeviceAssignDTO()
-                        .setTerminalId(String.valueOf(deviceRegister.getDeviceId()))
-                        .setDeviceIdentifyType("DYNAMIC")
-                        .setDeviceSn(deviceRegister.getDeviceSn())
-                        .setDeviceName(String.valueOf(deviceRegister.getDeviceId()))
-                );
-            }
-            //设备信息
-            deviceInfoMapper.insert(deviceInfo);
-            //设备-系统信息
-            deviceSysinfoMapper.insert(deviceSysinfo);
-            //设备-状态
-            deviceStatusMapper.insert(deviceStatus);
-            //mqtt认证信息
-            String deviceId = deviceRegister.getDeviceId().toString();
-            MqttUserDto.Save mqttUserInfo = new MqttUserDto.Save();
-            mqttUserInfo.setUsername(deviceId);
-            mqttUserInfo.setPasswordHash(deviceId);
-            mqttUserInfo.setCreated(LocalDateTime.now());
-            mqttUserInfo.setTopic(deviceId + CommConsts.DEVICE_MQTT_TOPIC_SUFFIX);
-            mqttUserInfo.setSn(deviceRegister.getDeviceSn());
-            mqttUserInfo.setDeviceId(deviceRegister.getDeviceId());
-            mqttUserService.save(mqttUserInfo);
-        } else {
-            updateById(deviceRegister);
-            deviceSysinfoMapper.updateById(deviceSysinfo);
-            mqttUserService.update(new LambdaUpdateWrapper<MqttUser>()
-                    .set(MqttUser::getSn, deviceRegister.getDeviceSn())
-                    .eq(MqttUser::getDeviceId, deviceRegister.getDeviceId())
-            );
-        }
-        return R.ok();
+        return FactoryUtils.getService(() -> deviceCreateIds.getDeviceType() == EnumDeviceType.N_5.getIntCode() ? 2 : 1, DeviceFactory.class)
+                .save(save.setDeviceType(deviceCreateIds.getDeviceType()));
     }
 
     @PostMapping("page")

+ 44 - 115
device-api-service/src/main/java/com/xy/service/MqttServiceImpl.java

@@ -6,30 +6,28 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.xy.alipay.AliPay;
 import com.xy.annotate.Runners;
 import com.xy.annotate.Timer;
+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.consumer.cmd.CmdProducer;
+import com.xy.device.EnumDeviceType;
 import com.xy.dto.AckMqttDto;
 import com.xy.dto.CommandMqtt;
 import com.xy.dto.MqttDto;
 import com.xy.dto.PaterDto;
+import com.xy.entity.DeviceInfo;
 import com.xy.entity.MqttCommand;
 import com.xy.error.CommRuntimeException;
 import com.xy.mapper.MqttCommandMapper;
-import com.xy.service.factory.CmdService;
-import com.xy.service.factory.QualityCmdServiceImpl;
-import com.xy.service.factory.SetsCmdServiceImpl;
-import com.xy.service.factory.TaskCmdServiceImpl;
+import com.xy.service.factory.cmd.service.CmdService;
+import com.xy.service.factory.device.service.DeviceFactory;
 import com.xy.utils.*;
-import com.xy.utils.CommConsts;
 import com.xy.utils.enums.MqttCommandStatusEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -39,7 +37,6 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -55,25 +52,27 @@ public class MqttServiceImpl extends ServiceImpl<MqttCommandMapper, MqttCommand>
 
     private final RedisService<String> redisService;
 
+    private final DeviceInfoServiceImpl deviceInfoService;
+
     private String keyStr = "mqtt:cmd:result:%d";
 
     private boolean snInit;
 
-    private long getSn() {
+    public long getSn() {
         if (!snInit) {
             throw new CommRuntimeException("sn号未初始化");
         }
         return redisService.atomicIncrease(CommConsts.CMD_ATOM_SN);
     }
 
-    private long getWkSn() {
+    public long getWkSn() {
         if (!snInit) {
             throw new CommRuntimeException("sn号未初始化");
         }
         return redisService.atomicIncrease(CommConsts.CMD_ATOM_WK_SN);
     }
 
-    private List<Tuple.Tuple3<Long, Long, Boolean>> sendMqtt(List<MqttDto> mqttDtos) {
+    public List<Tuple.Tuple3<Long, Long, Boolean>> sendMqtt(List<MqttDto> mqttDtos) {
         String time = DataTime.getSring();
         List<Tuple.Tuple3<Long, Long, Boolean>> list = new ArrayList<>(mqttDtos.size());
         mqttDtos.forEach(mqttDto -> {
@@ -111,72 +110,30 @@ public class MqttServiceImpl extends ServiceImpl<MqttCommandMapper, MqttCommand>
         return list;
     }
 
-    @Timer
-    @Runners
-    @PostMapping("sysnAtoms")
-    @ApiOperation("同步sn号redis原子变量")
-    public void sysnAtoms() {
-        //todo 集群有问题,暂不处理
-        String sn = LambdaUtils.getProperty(MqttCommand::getSn);
-        QueryWrapper<MqttCommand> wrapper = new QueryWrapper<MqttCommand>()
-                .select(String.format("max(%s) as %s", sn, sn));
-        MqttCommand mqttCommand = getOne(wrapper);
-        if (mqttCommand != null) {
-            redisService.setAtomic(CommConsts.CMD_ATOM_SN, mqttCommand.getSn() + 1);
-            MqttCommand byId = getById(mqttCommand.getSn());
-            redisService.setAtomic(CommConsts.CMD_ATOM_WK_SN, byId.getWkSn() + 1);
-        }
-        snInit = true;
-    }
-
     @Override
     @ApiOperation("指令发送")
-    @AliPay(AliPay.Type.RESTART)
     public R<List<Tuple.Tuple3<Long, Long, Boolean>>> senCommand(List<CommandMqtt> commandMqtts) {
-        //发送指令
-        List<MqttDto> mqttDtos = new ArrayList<>();
+        JList<CommandMqtt> commandMqttsList = new JArrayList<>(commandMqtts);
+        List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, commandMqttsList.getProperty(CommandMqtt::getDeviceId).comparing()));
+        JMap<Long, DeviceInfo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
+        JMap<Integer, JList<CommandMqtt>> jMap = new JHashMap<>();
         commandMqtts.forEach(commandMqtt -> {
-            JSONObject templetObj = commandMqtt.getTemplet();
-            String debug = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getDebug));
-            String level = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getLevel));
-            String delayTime = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getDelayTime));
-            String timeout = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getTimeout));
-            String wkSn = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getWkSn));
-            String actionType = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getActionType));
-            String cmdType = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getCmdType));
-            String ack = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getAck));
-            JSONObject data = templetObj.getJSONObject(LambdaUtils.getProperty(PaterDto::getData));
-            PaterDto paterDto = new PaterDto()
-                    .setActionType(actionType)
-                    .setCmdType(cmdType)
-                    .setAck(Emptys.check(ack) && !ack.equals("$ack$") ? Boolean.valueOf(ack) : Emptys.check(ack) && ack.equals("$ack$") ? true : true)
-                    .setWkSn(!Emptys.check(wkSn) ? getWkSn() : "$wkSn$".equals(wkSn) ? getWkSn() : Long.valueOf(wkSn))
-                    .setData(data);
-            MqttDto mqttDto = new MqttDto()
-                    .setDeviceId(commandMqtt.getDeviceId())
-                    .setDebug(Emptys.check(debug) && !debug.equals("$debug$") ? Boolean.valueOf(debug) : Emptys.check(debug) && debug.equals("$debug$") ? false : false)
-                    .setLevel(Emptys.check(level) && !level.equals("$level$") ? Integer.valueOf(level) : Emptys.check(level) && level.equals("$level$") ? 1 : 1)
-                    .setDelayTime(Emptys.check(delayTime) && !delayTime.equals("$delayTime$") ? delayTime : Emptys.check(delayTime) && delayTime.equals("$delayTime$") ? null : null)
-                    .setTimeout(Emptys.check(timeout) && !timeout.equals("$timeout$") ? Integer.valueOf(timeout) : Emptys.check(timeout) && timeout.equals("$timeout$") ? 60 : 60)
-                    .setPater(paterDto);
-            mqttDtos.add(mqttDto);
-        });
-        List<Tuple.Tuple3<Long, Long, Boolean>> list = sendMqtt(mqttDtos);
-        //执行业务
-        Map<String, List<MqttDto>> map = new HashMap<>();
-        mqttDtos.forEach(mqttDto -> {
-            String cmdType = mqttDto.getPater().getCmdType();
-            if (!map.containsKey(cmdType)) {
-                map.put(cmdType, new ArrayList<>());
+            DeviceInfo deviceInfo = deviceInfosJMaps.get(commandMqtt.getDeviceId());
+            if (deviceInfo == null) {
+                return;
+            }
+            if (!jMap.containsKey(deviceInfo.getDeviceType())) {
+                jMap.put(deviceInfo.getDeviceType(), new JArrayList<>());
             }
-            map.get(cmdType).add(mqttDto);
+            jMap.get(deviceInfo.getDeviceType()).set(commandMqtt);
         });
-        map.forEach((k, v) -> {
-            CmdTypeEnum anEnum = CmdTypeEnum.getEnum(k);
-            if (anEnum == null) {
-                return;
+        List<Tuple.Tuple3<Long, Long, Boolean>> list = new ArrayList<>();
+        jMap.forEach((deviceType, commandMqttss) -> {
+            List<Tuple.Tuple3<Long, Long, Boolean>> data = FactoryUtils.getService(() -> deviceType == EnumDeviceType.N_5.getIntCode() ? 2 : 1, DeviceFactory.class)
+                    .senCommand(commandMqttss).getData();
+            if (data != null) {
+                list.addAll(data);
             }
-            SpringBeanUtils.getBean(anEnum.getCmdServiceClass()).senCommand(v);
         });
         return R.ok(list);
     }
@@ -215,7 +172,7 @@ public class MqttServiceImpl extends ServiceImpl<MqttCommandMapper, MqttCommand>
     @ApiOperation("指令结果通知")
     @PostMapping("commandResultBack")
     public R commandResultBack(@RequestBody @Validated MqttDto.ResultBack resultBack) {
-        return SpringBeanUtils.getBean(CmdTypeEnum.getEnum(resultBack.getCmdType()).getCmdServiceClass()).resultBack(resultBack);
+        return FactoryUtils.getService(resultBack.getCmdType(), CmdService.class).resultBack(resultBack);
     }
 
     @PostMapping("snByCmdAndResult")
@@ -275,49 +232,21 @@ public class MqttServiceImpl extends ServiceImpl<MqttCommandMapper, MqttCommand>
     }
 
 
-    /**
-     * 工厂枚举
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum CmdTypeEnum {
-
-        /**
-         * 质检指令
-         */
-        QUALITY("quality", QualityCmdServiceImpl.class),
-
-        /**
-         * 任务指令
-         */
-        TASK("task", TaskCmdServiceImpl.class),
-
-        /**
-         * 设置指令
-         */
-        SETS("sets", SetsCmdServiceImpl.class),
-
-        ;
-
-        /**
-         * 指令业务类型
-         */
-        private String cmdType;
-
-        /**
-         * 接口实现
-         */
-        private Class<? extends CmdService> cmdServiceClass;
-
-
-        public static CmdTypeEnum getEnum(String cmdType) {
-            CmdTypeEnum[] values = CmdTypeEnum.values();
-            for (CmdTypeEnum qualityEnum : values) {
-                if (qualityEnum.cmdType.equals(cmdType)) {
-                    return qualityEnum;
-                }
-            }
-            return null;
+    @Timer
+    @Runners
+    @PostMapping("sysnAtoms")
+    @ApiOperation("同步sn号redis原子变量")
+    public void sysnAtoms() {
+        //todo 集群有问题,暂不处理
+        String sn = LambdaUtils.getProperty(MqttCommand::getSn);
+        QueryWrapper<MqttCommand> wrapper = new QueryWrapper<MqttCommand>()
+                .select(String.format("max(%s) as %s", sn, sn));
+        MqttCommand mqttCommand = getOne(wrapper);
+        if (mqttCommand != null) {
+            redisService.setAtomic(CommConsts.CMD_ATOM_SN, mqttCommand.getSn() + 1);
+            MqttCommand byId = getById(mqttCommand.getSn());
+            redisService.setAtomic(CommConsts.CMD_ATOM_WK_SN, byId.getWkSn() + 1);
         }
+        snInit = true;
     }
 }

+ 5 - 4
device-api-service/src/main/java/com/xy/service/factory/QualityCmdServiceImpl.java → device-api-service/src/main/java/com/xy/service/factory/cmd/QualityCmdServiceImpl.java

@@ -1,17 +1,18 @@
-package com.xy.service.factory;
+package com.xy.service.factory.cmd;
 
 import cn.hutool.json.JSONObject;
+import com.xy.annotate.Factory;
 import com.xy.dto.DeviceQualityDto;
 import com.xy.dto.MqttDto;
 import com.xy.dto.PaterDto;
 import com.xy.entity.DeviceQuality;
 import com.xy.error.CommRuntimeException;
 import com.xy.service.DeviceQualityServiceImpl;
+import com.xy.service.factory.cmd.service.CmdService;
 import com.xy.utils.Emptys;
 import com.xy.utils.LambdaUtils;
 import com.xy.utils.R;
 import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -21,7 +22,7 @@ import java.util.Map;
 /**
  * 质检指令 接口实现
  */
-@Service
+@Factory("quality")
 @AllArgsConstructor
 public class QualityCmdServiceImpl implements CmdService {
 
@@ -58,7 +59,7 @@ public class QualityCmdServiceImpl implements CmdService {
     @Override
     public R resultBack(MqttDto.ResultBack resultBack) {
         DeviceQualityDto.QualityResultBack qualityResultBack = resultBack.getQualityResultBack();
-        if(!Emptys.check(qualityResultBack)){
+        if (!Emptys.check(qualityResultBack)) {
             return R.fail(LambdaUtils.getProperty(MqttDto.ResultBack::getQualityResultBack) + "不能为空");
         }
         return deviceQualityService.qualityResultBack(qualityResultBack);

+ 4 - 4
device-api-service/src/main/java/com/xy/service/factory/SetsCmdServiceImpl.java → device-api-service/src/main/java/com/xy/service/factory/cmd/SetsCmdServiceImpl.java

@@ -1,23 +1,23 @@
-package com.xy.service.factory;
+package com.xy.service.factory.cmd;
 
 import cn.hutool.json.JSONObject;
+import com.xy.annotate.Factory;
 import com.xy.device.EnumMqttCmdTempletSets;
 import com.xy.dto.DeviceTempSetDto;
 import com.xy.dto.MqttDto;
 import com.xy.dto.PaterDto;
 import com.xy.entity.DeviceTempSet;
 import com.xy.service.DeviceTempSetServiceImpl;
-import com.xy.utils.LambdaUtils;
+import com.xy.service.factory.cmd.service.CmdService;
 import com.xy.utils.R;
 import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Service;
 
 import java.util.List;
 
 /**
  * 设置指令 接口实现
  */
-@Service
+@Factory("sets")
 @AllArgsConstructor
 public class SetsCmdServiceImpl implements CmdService {
 

+ 7 - 6
device-api-service/src/main/java/com/xy/service/factory/TaskCmdServiceImpl.java → device-api-service/src/main/java/com/xy/service/factory/cmd/TaskCmdServiceImpl.java

@@ -1,24 +1,25 @@
-package com.xy.service.factory;
+package com.xy.service.factory.cmd;
 
 import cn.hutool.json.JSONObject;
+import com.xy.annotate.Factory;
 import com.xy.device.EnumMqttCmdTempletTask;
 import com.xy.dto.ActivityInfoDto;
 import com.xy.dto.MqttDto;
 import com.xy.service.ActivityInfoService;
+import com.xy.service.factory.cmd.service.CmdService;
 import com.xy.utils.R;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import lombok.AllArgsConstructor;
 
 import java.util.List;
 
 /**
  * 任务指令 接口实现
  */
-@Service
-@RequiredArgsConstructor
+@Factory("task")
+@AllArgsConstructor
 public class TaskCmdServiceImpl implements CmdService {
 
-    private final ActivityInfoService activityInfoService;
+    private ActivityInfoService activityInfoService;
 
     @Override
     public R senCommand(List<MqttDto> mqttDtos) {

+ 1 - 1
device-api-service/src/main/java/com/xy/service/factory/CmdService.java → device-api-service/src/main/java/com/xy/service/factory/cmd/service/CmdService.java

@@ -1,4 +1,4 @@
-package com.xy.service.factory;
+package com.xy.service.factory.cmd.service;
 
 import com.xy.dto.MqttDto;
 import com.xy.utils.R;

+ 201 - 0
device-api-service/src/main/java/com/xy/service/factory/device/AliPayDeviceFatoryImpl.java

@@ -0,0 +1,201 @@
+package com.xy.service.factory.device;
+
+import cn.hutool.json.JSONObject;
+import com.xy.alipay.SpiDeviceService;
+import com.xy.annotate.Factory;
+import com.xy.config.DeviceThreadPoolConfig;
+import com.xy.constants.SpiResponseConst;
+import com.xy.consumer.connected.ConnectedMqttConfiguration;
+import com.xy.consumer.connected.ConnectedProducer;
+import com.xy.consumer.disconnect.DisconnectedMqttConfiguration;
+import com.xy.consumer.disconnect.DisconnectedProducer;
+import com.xy.device.EnumDeviceOnlineStatus;
+import com.xy.dto.*;
+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.service.AlipayDeviceService;
+import com.xy.service.DeviceEventMsgServiceImpl;
+import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.service.DeviceStatusServiceImpl;
+import com.xy.service.factory.device.service.DeviceFactory;
+import com.xy.utils.*;
+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 org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * 支付宝开门柜设备 接口实现
+ */
+@Factory("2")
+@AllArgsConstructor
+@Api(tags = "支付宝开门柜设备")
+public class AliPayDeviceFatoryImpl implements DeviceFactory, SpiDeviceService {
+
+    private OpenDeviceFactoryImpl openDeviceFactoryImpl;
+
+    private AlipayDeviceService alipayDeviceService;
+
+    private ConnectedProducer connectedProducer;
+
+    private DisconnectedProducer disconnectedProducer;
+
+    private DeviceStatusServiceImpl deviceStatusService;
+
+    private DeviceInfoServiceImpl deviceInfoService;
+
+    private DeviceEventMsgServiceImpl deviceEventMsgService;
+
+    @Override
+    public R save(DeviceRegisterDto.Save save) {
+        R r = openDeviceFactoryImpl.save(save);
+        //支付宝设备注册
+        if (r.getCode() == R.Enum.SUCCESS.getCode()) {
+            alipayDeviceService.deviceAssign(new DeviceAssignDTO()
+                    .setTerminalId(String.valueOf(save.getDeviceId()))
+                    .setDeviceIdentifyType("DYNAMIC")
+                    .setDeviceSn(save.getDeviceSn())
+                    .setDeviceName(String.valueOf(save.getDeviceId()))
+            );
+        }
+        return r;
+    }
+
+    @Override
+    public R active(MercMiniDeviceDto.Active active) {
+        return openDeviceFactoryImpl.active(active);
+    }
+
+    @Override
+    public R<List<Tuple.Tuple3<Long, Long, Boolean>>> senCommand(List<CommandMqtt> commandMqtts) {
+        commandMqtts.forEach(commandMqtt -> {
+            JSONObject templet = commandMqtt.getTemplet();
+            //重启设备
+            if (templet.getStr("cmdType").equals("task")) {
+                JSONObject data = templet.getJSONObject("data");
+                if (data.getStr("type").equals("app") && data.getStr("task").equals("restart")) {
+                    alipayDeviceService.deviceReboot(commandMqtt.getDeviceId().toString());
+                }
+            }
+        });
+        return R.ok();
+    }
+
+    @Override
+    public R netRecord(DeviceNetRecordDto.Save save) {
+        DeviceStatus deviceStatus = deviceStatusService.getById(save.getDeviceId());
+        if (save.getNetStatus().equals(deviceStatus.getNetState())) {
+            return R.ok();
+        }
+        Integer value = SysDictUtils.getValue(EnumDeviceOnlineStatus.Code.CODE.getCode(), EnumDeviceOnlineStatus.CONNECTED.getCode(), Integer.class);
+        JSONObject jsonObject = new JSONObject().set("clientid", save.getDeviceId());
+        if (save.getNetStatus().equals(value)) {
+            connectedProducer.sendToMqtt(jsonObject.toString(), ConnectedMqttConfiguration.TOPIC, 1);
+        } else {
+            disconnectedProducer.sendToMqtt(jsonObject.toString(), DisconnectedMqttConfiguration.TOPIC, 1);
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R eventMsg(DeviceEventMsgDto.Save save) {
+        return openDeviceFactoryImpl.eventMsg(save);
+    }
+
+    @Override
+    public R busyStatus(MercMiniDeviceDto.BusySate busySate) {
+        //支付宝设备运营状态修改为异步,业务方仅仅发送了修改通知,结果由支付宝异步通知
+        DeviceChangeStatusDTO deviceChangeStatusDTO = new DeviceChangeStatusDTO()
+                .setTerminalId(String.valueOf(busySate.getDeviceId()))
+                .setOperatorId(AuthorizeUtils.getLoginId(String.class))
+                .setStatus(busySate.getBusyState());
+        alipayDeviceService.changeStatus(deviceChangeStatusDTO);
+        return R.ok();
+    }
+
+
+    @Override
+    @ApiOperation("设备告警通知SPI")
+    public String deviceAlarmNotify(DeviceAlarmNotifyDTO deviceAlarmNotifyDTO) {
+        //查询设备信息
+        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceAlarmNotifyDTO.getTerminalId()));
+        String faultCode = deviceAlarmNotifyDTO.getFaultCode();
+        DeviceErrorRecordTypesEnum deviceErrorRecordTypesEnum = faultCode.equals("DeviceOffline") ? DeviceErrorRecordTypesEnum.NET
+                : faultCode.equals("DoorOpenedOnNoTrade") ? DeviceErrorRecordTypesEnum.DOOR_LOCK
+                : null;
+        if (deviceErrorRecordTypesEnum == null) {
+            return SpiResponseConst.SUCCESS;
+        }
+        //添加设备异常记录
+        DeviceEventMsgDto.Save save = new DeviceEventMsgDto.Save()
+                .setDeviceId(deviceInfo.getDeviceId());
+        save.setCode(deviceErrorRecordTypesEnum.getCode());
+        save.setMsg(deviceAlarmNotifyDTO.getFaultMsg());
+        deviceEventMsgService.save(save);
+        return SpiResponseConst.SUCCESS;
+    }
+
+    @Override
+    @ApiOperation("设备状态变更通知SPI")
+    public String deviceStatusChangeNotify(DeviceStatusChangeNotifyDTO deviceStatusChangeNotifyDTO) {
+        //查询设备信息
+        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(deviceStatusChangeNotifyDTO.getTerminalId()));
+        //冻结状态、运营状态
+        FunctionUtils.NoParamsNoResult busyStatus = () -> {
+            Integer status = deviceStatusChangeNotifyDTO.getStatus();
+            DeviceInfo updateDeviceInfo = new DeviceInfo()
+                    .setDeviceId(deviceInfo.getDeviceId())
+                    .setBusyState(status)
+                    .setFreezeStatus(status);
+            deviceInfoService.updateById(updateDeviceInfo);
+        };
+        //联网状态
+        FunctionUtils.NoParamsNoResult netRecord = () -> {
+            Boolean online = deviceStatusChangeNotifyDTO.getOnline();
+            if (online != null) {
+                int netState = online ? SysDictUtils.getValue(EnumDeviceOnlineStatus.Code.CODE.getCode(), EnumDeviceOnlineStatus.CONNECTED.getCode(), Integer.class)
+                        : SysDictUtils.getValue(EnumDeviceOnlineStatus.Code.CODE.getCode(), EnumDeviceOnlineStatus.DISCONNECT.getCode(), Integer.class);
+                DeviceNetRecordDto.Save save = new DeviceNetRecordDto.Save()
+                        .setDeviceId(deviceInfo.getDeviceId());
+                save.setNetStatus(netState);
+                netRecord(save);
+            }
+        };
+        //激活状态
+        FunctionUtils.NoParamsNoResult active = () -> {
+            if (deviceStatusChangeNotifyDTO.getActiveStatus() != null && deviceStatusChangeNotifyDTO.getActiveStatus() == 1) {
+                active(new MercMiniDeviceDto.Active().setDeviceId(deviceInfo.getDeviceId()));
+            }
+        };
+        busyStatus.run();
+        netRecord.run();
+        active.run();
+        return SpiResponseConst.SUCCESS;
+    }
+
+    @ApiOperation("刷新设备联网状态API")
+    @PostMapping("refurbishDeviceNetWork")
+    public R refurbishDeviceNetWork(@RequestBody List<Long> deviceIds) {
+        ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALIPAY_DEVICE_DETAIL, deviceIds.size());
+        deviceIds.forEach(deviceId -> execute.execute(() -> {
+            DeviceDetailVO deviceDetailVO = alipayDeviceService.queryDetail(new DeviceDetailDTO().setTerminalId(String.valueOf(deviceId)));
+            if (deviceDetailVO == null) {
+                return;
+            }
+            DeviceNetRecordDto.Save save = new DeviceNetRecordDto.Save().setDeviceId(deviceId);
+            save.setNetStatus(deviceDetailVO.getOnline()
+                    ? SysDictUtils.getValue(EnumDeviceOnlineStatus.Code.CODE.getCode(), EnumDeviceOnlineStatus.CONNECTED.getCode(), Integer.class)
+                    : SysDictUtils.getValue(EnumDeviceOnlineStatus.Code.CODE.getCode(), EnumDeviceOnlineStatus.DISCONNECT.getCode(), Integer.class));
+            netRecord(save);
+        }));
+        execute.end();
+        return R.ok();
+    }
+}

+ 239 - 0
device-api-service/src/main/java/com/xy/service/factory/device/OpenDeviceFactoryImpl.java

@@ -0,0 +1,239 @@
+package com.xy.service.factory.device;
+
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.xy.annotate.Factory;
+import com.xy.device.EnumDeviceActiveStatus;
+import com.xy.device.EnumDeviceBusyStatus;
+import com.xy.device.EnumDeviceCharging;
+import com.xy.dto.*;
+import com.xy.entity.*;
+import com.xy.enums.SysCodeConfigureEnum;
+import com.xy.mapper.DeviceCreateIdsMapper;
+import com.xy.mapper.DeviceInfoMapper;
+import com.xy.mapper.DeviceStatusMapper;
+import com.xy.mapper.DeviceSysinfoMapper;
+import com.xy.service.*;
+import com.xy.service.factory.cmd.service.CmdService;
+import com.xy.service.factory.device.service.DeviceFactory;
+import com.xy.utils.*;
+import lombok.AllArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.xy.utils.Beans.copy;
+
+/**
+ * 开门柜设备 接口实现
+ */
+@Factory("1")
+@AllArgsConstructor
+public class OpenDeviceFactoryImpl implements DeviceFactory {
+
+    private DeviceCreateIdsMapper deviceCreateIdsMapper;
+
+    private DeviceInfoMapper deviceInfoMapper;
+
+    private DeviceSysinfoMapper deviceSysinfoMapper;
+
+    private DeviceStatusMapper deviceStatusMapper;
+
+    private MqttUserServiceImpl mqttUserService;
+
+    private DeviceRegisterServiceImpl deviceRegisterService;
+
+    private DeviceInfoServiceImpl deviceInfoService;
+
+    private DeviceChargingServiceImpl deviceChargingService;
+
+    private MqttServiceImpl mqttService;
+
+    private DeviceEventMsgServiceImpl deviceEventMsgService;
+
+    @Override
+    public R save(DeviceRegisterDto.Save save) {
+        DeviceRegister deviceRegister = copy(DeviceRegister.class, save.setDeviceSn(save.getDeviceSn().toUpperCase()));
+        deviceRegister.setDeviceType(save.getDeviceType())
+                .setCreateUser(AuthorizeUtils.getLoginId(Long.class))
+                .setCreateTime(LocalDateTime.now());
+        //操作注册序号
+        String property = LambdaUtils.getProperty(DeviceRegister::getRegisterNum);
+        QueryWrapper<DeviceRegister> queryWrapper = new QueryWrapper<DeviceRegister>()
+                .select(String.format("max(%s) as %s", StringTools.humpToLine(property), property))
+                .eq(StringTools.humpToLine(LambdaUtils.getProperty(DeviceRegister::getCreateUser)), AuthorizeUtils.getLoginId(Long.class));
+        DeviceRegister one = deviceRegisterService.getOne(queryWrapper);
+        Integer registerNum = one == null || one.getRegisterNum() == null ? 0 : one.getRegisterNum();
+        deviceRegister.setRegisterNum(registerNum + 1);
+        //修改设备-机器ID号生成为已绑定
+        deviceCreateIdsMapper.updateById(new DeviceCreateIds()
+                .setDeviceId(deviceRegister.getDeviceId())
+                .setBindState(true)
+                .setBindTime(deviceRegister.getCreateTime())
+        );
+        DeviceInfo deviceInfo = new DeviceInfo()
+                .setDeviceId(deviceRegister.getDeviceId())
+                .setDeviceType(deviceRegister.getDeviceType())
+                .setMercDeviceCode(deviceRegister.getAssetNo())
+                .setCreateTime(deviceRegister.getCreateTime());
+        DeviceSysinfo deviceSysinfo = new DeviceSysinfo()
+                .setDeviceId(deviceRegister.getDeviceId())
+                .setDeviceSn(deviceRegister.getDeviceSn())
+                .setCreateTime(deviceRegister.getCreateTime());
+        DeviceStatus deviceStatus = new DeviceStatus().setDeviceId(deviceRegister.getDeviceId());
+        DeviceRegister deviceRegisterById = deviceRegisterService.getById(deviceRegister.getDeviceId());
+        //新增
+        if (deviceRegisterById == null) {
+            //设备-注册登记
+            deviceRegisterService.save(deviceRegister);
+            //设备信息
+            deviceInfoMapper.insert(deviceInfo);
+            //设备-系统信息
+            deviceSysinfoMapper.insert(deviceSysinfo);
+            //设备-状态
+            deviceStatusMapper.insert(deviceStatus);
+            //mqtt认证信息
+            String deviceId = deviceRegister.getDeviceId().toString();
+            MqttUserDto.Save mqttUserInfo = new MqttUserDto.Save();
+            mqttUserInfo.setUsername(deviceId);
+            mqttUserInfo.setPasswordHash(deviceId);
+            mqttUserInfo.setCreated(LocalDateTime.now());
+            mqttUserInfo.setTopic(deviceId + CommConsts.DEVICE_MQTT_TOPIC_SUFFIX);
+            mqttUserInfo.setSn(deviceRegister.getDeviceSn());
+            mqttUserInfo.setDeviceId(deviceRegister.getDeviceId());
+            mqttUserService.save(mqttUserInfo);
+        } else {
+            deviceRegisterService.updateById(deviceRegister);
+            deviceSysinfoMapper.updateById(deviceSysinfo);
+            mqttUserService.update(new LambdaUpdateWrapper<MqttUser>()
+                    .set(MqttUser::getSn, deviceRegister.getDeviceSn())
+                    .eq(MqttUser::getDeviceId, deviceRegister.getDeviceId())
+            );
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R active(MercMiniDeviceDto.Active active) {
+        DeviceInfo deviceInfo = deviceInfoService.getById(active.getDeviceId());
+        //机器是否已激活
+        Integer activeState = SysDictUtils.getValue(EnumDeviceActiveStatus.Code.CODE.getCode(), EnumDeviceActiveStatus.N_1.getCode(), Integer.class);
+        if (deviceInfo.getActiveState().equals(activeState)) {
+            return R.fail("机器已激活");
+        }
+        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);
+        //首次激活可试用x天
+        DeviceCharging deviceCharging = deviceChargingService.getById(active.getDeviceId());
+        if (deviceCharging == null) {
+            SysDictRedis sysDictRedis = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_X.getCode());
+            deviceChargingService.save(new DeviceCharging()
+                    .setDeviceId(active.getDeviceId())
+                    .setChargingX(Integer.valueOf(sysDictRedis.getValue()))
+                    .setTimeout(now)
+                    .setCreateTime(now)
+            );
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R<List<Tuple.Tuple3<Long, Long, Boolean>>> senCommand(List<CommandMqtt> commandMqtts) {
+        //发送指令
+        List<MqttDto> mqttDtos = new ArrayList<>();
+        commandMqtts.forEach(commandMqtt -> {
+            JSONObject templetObj = commandMqtt.getTemplet();
+            String debug = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getDebug));
+            String level = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getLevel));
+            String delayTime = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getDelayTime));
+            String timeout = templetObj.getStr(LambdaUtils.getProperty(MqttDto::getTimeout));
+            String wkSn = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getWkSn));
+            String actionType = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getActionType));
+            String cmdType = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getCmdType));
+            String ack = templetObj.getStr(LambdaUtils.getProperty(PaterDto::getAck));
+            JSONObject data = templetObj.getJSONObject(LambdaUtils.getProperty(PaterDto::getData));
+            PaterDto paterDto = new PaterDto()
+                    .setActionType(actionType)
+                    .setCmdType(cmdType)
+                    .setAck(Emptys.check(ack) && !ack.equals("$ack$") ? Boolean.valueOf(ack) : Emptys.check(ack) && ack.equals("$ack$") ? true : true)
+                    .setWkSn(!Emptys.check(wkSn) ? mqttService.getWkSn() : "$wkSn$".equals(wkSn) ? mqttService.getWkSn() : Long.valueOf(wkSn))
+                    .setData(data);
+            MqttDto mqttDto = new MqttDto()
+                    .setDeviceId(commandMqtt.getDeviceId())
+                    .setDebug(Emptys.check(debug) && !debug.equals("$debug$") ? Boolean.valueOf(debug) : Emptys.check(debug) && debug.equals("$debug$") ? false : false)
+                    .setLevel(Emptys.check(level) && !level.equals("$level$") ? Integer.valueOf(level) : Emptys.check(level) && level.equals("$level$") ? 1 : 1)
+                    .setDelayTime(Emptys.check(delayTime) && !delayTime.equals("$delayTime$") ? delayTime : Emptys.check(delayTime) && delayTime.equals("$delayTime$") ? null : null)
+                    .setTimeout(Emptys.check(timeout) && !timeout.equals("$timeout$") ? Integer.valueOf(timeout) : Emptys.check(timeout) && timeout.equals("$timeout$") ? 60 : 60)
+                    .setPater(paterDto);
+            mqttDtos.add(mqttDto);
+        });
+        List<Tuple.Tuple3<Long, Long, Boolean>> list = mqttService.sendMqtt(mqttDtos);
+        //执行业务
+        Map<String, List<MqttDto>> map = new HashMap<>();
+        mqttDtos.forEach(mqttDto -> {
+            String cmdType = mqttDto.getPater().getCmdType();
+            if (!map.containsKey(cmdType)) {
+                map.put(cmdType, new ArrayList<>());
+            }
+            map.get(cmdType).add(mqttDto);
+        });
+        map.forEach((k, v) -> {
+            CmdService service = FactoryUtils.getService(k, CmdService.class);
+            if (service == null) {
+                return;
+            }
+            service.senCommand(v);
+        });
+        return R.ok(list);
+    }
+
+    @Override
+    public R netRecord(DeviceNetRecordDto.Save save) {
+        return R.ok();
+    }
+
+    @Override
+    public R eventMsg(DeviceEventMsgDto.Save save) {
+        DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(save.getDeviceId()).setIsSysinfo(true)).getData();
+        //查询消息编码信息
+        String paterCode = save.getCode().substring(0, save.getCode().length() - 1);
+        SysCodeConfigureRedis sysCodeConfigureRedis = SysCodeConfigureUtils.get(paterCode, save.getCode());
+        //添加消息记录
+        save.setMercId(deviceInfo.getMercId());
+        DeviceEventMsg deviceEventMsg = copy(DeviceEventMsg.class, save)
+                .setCreateTime(LocalDateTime.now());
+        deviceEventMsgService.save(deviceEventMsg);
+        //异常消息,修改设备当前故障等级
+        if (paterCode.equals(SysCodeConfigureEnum.D01.getCode())) {
+            if (Emptys.check(sysCodeConfigureRedis.getExpand())) {
+                DeviceInfo updateDeviceInfo = new DeviceInfo()
+                        .setDeviceId(deviceInfo.getDeviceId())
+                        .setFaultLevel(Integer.valueOf(sysCodeConfigureRedis.getExpand()));
+                deviceInfoService.updateById(updateDeviceInfo);
+            }
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R busyStatus(MercMiniDeviceDto.BusySate busySate) {
+        DeviceInfo updateDeviceInfo = new DeviceInfo()
+                .setDeviceId(busySate.getDeviceId())
+                .setMercId(busySate.getMercId())
+                .setBusyState(busySate.getBusyState());
+        deviceInfoService.updateById(updateDeviceInfo);
+        return R.ok();
+    }
+
+}

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

@@ -0,0 +1,61 @@
+package com.xy.service.factory.device.service;
+
+import com.xy.dto.*;
+import com.xy.utils.R;
+import com.xy.utils.Tuple;
+
+import java.util.List;
+
+/**
+ * 设备 接口
+ */
+public interface DeviceFactory {
+
+    /**
+     * 注册
+     *
+     * @param save
+     * @return
+     */
+    R save(DeviceRegisterDto.Save save);
+
+    /**
+     * 激活
+     *
+     * @param active
+     * @return
+     */
+    R active(MercMiniDeviceDto.Active active);
+
+    /**
+     * 发送指令
+     *
+     * @param commandMqtts
+     * @return
+     */
+    R<List<Tuple.Tuple3<Long, Long, Boolean>>> senCommand(List<CommandMqtt> commandMqtts);
+
+    /**
+     * 联网状态
+     *
+     * @param save
+     * @return
+     */
+    R netRecord(DeviceNetRecordDto.Save save);
+
+    /**
+     * 添加设备事件
+     *
+     * @param save
+     * @return
+     */
+    R eventMsg(DeviceEventMsgDto.Save save);
+
+    /**
+     * 运营状态修改
+     *
+     * @param busySate
+     * @return
+     */
+    R busyStatus(MercMiniDeviceDto.BusySate busySate);
+}

+ 1 - 3
device-api/src/main/java/com/xy/alipay/SpiDeviceService.java

@@ -13,11 +13,9 @@ import org.springframework.web.bind.annotation.RequestBody;
  * @author 谭斌
  * @date 2023/04/16
  */
-
-@RestMappingController("/spi/device")
+@RestMappingController({"/spi/device", "/api/device"})
 public interface SpiDeviceService {
 
-
     /**
      * 设备告警通知
      * 触发条件:设备发生异常时,货柜云平台也会展示

+ 4 - 0
device-api/src/main/java/com/xy/dto/DeviceRegisterDto.java

@@ -35,6 +35,10 @@ public class DeviceRegisterDto {
         @NotBlank(message = "assetNo不能为空")
         @ApiModelProperty(value = "资产编号", required = true)
         private String assetNo;
+
+
+        @ApiModelProperty(value = "设备类型", hidden = true)
+        private Integer deviceType;
     }
 
     @Data

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

@@ -45,6 +45,7 @@ public class MercMiniDeviceDto {
         @NotNull(message = "deviceId不能为空")
         @ApiModelProperty("设备id")
         private Long deviceId;
+
     }
 
     @Data
@@ -54,9 +55,14 @@ public class MercMiniDeviceDto {
         @NotNull(message = "设备运营状态不能为空")
         @ApiModelProperty("设备运营状态 1 运营中 2 已停运")
         private Integer busyState;
+
         @NotNull(message = "deviceId不能为空")
         @ApiModelProperty("设备id")
         private Long deviceId;
+
+
+        @ApiModelProperty(value = "商户id", hidden = true)
+        private Long mercId;
     }
 
     @Data