Browse Source

nfc配置

tanbin 9 tháng trước cách đây
mục cha
commit
d9ca1e111f

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

@@ -365,7 +365,12 @@ public class MercMiniDeviceController {
     @PostMapping("restActive")
     @ApiOperation("重置设备激活")
     public R restActive(@RequestBody @Validated MercMiniDeviceDto.RestActive restActive) {
-        DeviceInfo deviceInfo = deviceInfoService.getById(restActive.getDeviceId());
+        DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(restActive.getDeviceId()).setIsSysinfo(true)).getData();
+        DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
+        if (deviceSysinfo != null) {
+            restActive.setNfcSn(deviceSysinfo.getNfcSn());
+        }
+
         return FactoryUtils.getServiceRoute(DeviceFactory.class, deviceInfo.getDeviceType()).restActive(restActive);
     }
 

+ 8 - 0
device-api-service/src/main/java/com/xy/entity/DeviceSysinfo.java

@@ -110,6 +110,14 @@ public class DeviceSysinfo {
      * 是否可调主灯
      */
     private Boolean isHaveLightMain;
+    /**
+     * 是否有支付宝NPAD
+     */
+    private Boolean isHaveAlipayNpad;
+    /**
+     * nfc设备sn
+     */
+    private String nfcSn;
 
     /**
      * 是否可调副灯

+ 18 - 1
device-api-service/src/main/java/com/xy/service/DevicePartServiceImpl.java

@@ -1,10 +1,14 @@
 package com.xy.service;
 
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yitter.idgen.YitIdHelper;
 import com.xy.dto.DevicePartDto;
 import com.xy.entity.DevicePart;
+import com.xy.entity.DeviceSysinfo;
 import com.xy.mapper.DevicePartMapper;
 import com.xy.utils.Emptys;
 import com.xy.utils.MybatisPlusQuery;
@@ -35,6 +39,8 @@ import static com.xy.utils.Beans.copy;
 @Api(tags = "设备配件表")
 public class DevicePartServiceImpl extends ServiceImpl<DevicePartMapper, DevicePart> implements DevicePartService {
 
+    private final DeviceSysinfoServiceImpl deviceSysinfoService;
+
     @ApiOperation("集合查询")
     @PostMapping("list")
     public R<List<DevicePartDto.Vo>> list(@RequestBody DevicePartDto.SelectList selectList) {
@@ -49,8 +55,9 @@ public class DevicePartServiceImpl extends ServiceImpl<DevicePartMapper, DeviceP
         LocalDateTime now = LocalDateTime.now();
         //循环处理
         saveOrUpdates.forEach(saveOrUpdate -> {
+            Long deviceId = saveOrUpdate.getDeviceId();
             DevicePart devicePart = getOne(new LambdaQueryWrapper<DevicePart>()
-                    .eq(DevicePart::getDeviceId, saveOrUpdate.getDeviceId())
+                    .eq(DevicePart::getDeviceId, deviceId)
                     .eq(DevicePart::getCode, saveOrUpdate.getCode())
             );
             //删除
@@ -58,6 +65,15 @@ public class DevicePartServiceImpl extends ServiceImpl<DevicePartMapper, DeviceP
                 removeById(devicePart.getId());
                 return;
             }
+
+            String code = saveOrUpdate.getCode();
+            //nfc 系统信息表更新
+            if (Emptys.check(code) && "zfbNfc".equals(code)) {
+                String value = saveOrUpdate.getValue();
+                JSONObject jsonObject = JSONUtil.parseObj(value);
+                boolean haveNfc = BooleanUtil.isTrue(jsonObject.getBool("is"));
+                deviceSysinfoService.updateById(new DeviceSysinfo().setDeviceId(deviceId).setIsHaveAlipayNpad(haveNfc));
+            }
             //新增
             if (devicePart == null) {
                 DevicePart info = copy(DevicePart.class, saveOrUpdate)
@@ -71,6 +87,7 @@ public class DevicePartServiceImpl extends ServiceImpl<DevicePartMapper, DeviceP
             if (Emptys.check(saveOrUpdate.getValue())) {
                 updateById(devicePart.setValue(saveOrUpdate.getValue()));
             }
+
         });
         return R.ok();
     }

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

@@ -232,6 +232,27 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         return SpiResponseConst.SUCCESS;
     }
 
+    /**
+     * 设备故障恢复通知
+     * 触发条件:设备故障会恢复时,货柜云平台也会展示
+     * 使用场景:接收设备恢复,进行相应业务处理和任务触发
+     * <p>
+     * 1	NFC1001	NFC和上位机断连	请检查NFC设备硬件连接情况,无法恢复请报修
+     * 2	NFC1002	NFC模块初始化失败	请重启设备,若故障未恢复,请报修;
+     * 3	NFC1003	NFC写入失败 	请重启设备,若故障未恢复,请报修;
+     * 4	DST1001	设备停止营业	后台设置为停业
+     * 5	NFC1004  	Nx设备无网络或与服务器失联	请检查网络连接
+     *
+     * @param deviceAlarmRecoverNotifyDTO
+     * @return
+     */
+    @Override
+    public String recoveryInform(DeviceAlarmRecoverNotifyDTO deviceAlarmRecoverNotifyDTO) {
+        //TODO 设备故障恢复通知
+        log.info("设备故障恢复通知:{}", JSONUtil.toJsonPrettyStr(deviceAlarmRecoverNotifyDTO));
+        return SpiResponseConst.SUCCESS;
+    }
+
     @ApiOperation("设备异常通知SPI")
     @Override
     public String deviceExceptionNotify(DeviceExceptionNotifyDTO deviceExceptionNotifyDTO) {
@@ -319,18 +340,18 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         String value = dto.getValue();
 
         //查询设备信息
-        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(terminalId));
+        DeviceInfoDto.Vo deviceInfo = R.feignCheckData(deviceInfoService.obj(new DeviceInfoDto.Obj().setIsSysinfo(true).setDeviceId(Long.valueOf(terminalId))));
         if (deviceInfo == null) {
             log.warn("温度、音量查询SPI通知,无设备信息");
             return SpiResponseConst.SUCCESS;
         }
+        DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
+        boolean isHaveNfc = false;
+        if (deviceSysinfo != null && StrUtil.isNotEmpty(deviceSysinfo.getNfcSn())) {
+            isHaveNfc = true;
+        }
         //温度更新
         FunctionUtils.NoParamsNoResult updateTmp = () -> {
-//            deviceStatus.setTempValue(Integer.valueOf(value));
-//            deviceStatusService.updateById(deviceStatus);
-//            DeviceSysinfoDto.Up sysUp = new DeviceSysinfoDto.Up();
-//            sysUp.setDeviceId(deviceInfo.getDeviceId()).setIsHaveTemp(true);
-//            deviceSysinfoService.up(sysUp);
             DeviceStatusDto.Up up = new DeviceStatusDto.Up();
             up.setDeviceId(deviceInfo.getDeviceId())
                     .setTempState(0)
@@ -339,21 +360,19 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         };
 
         DeviceStatus deviceStatus = deviceStatusService.getById(deviceInfo.getDeviceId());
-        if (deviceStatus == null) {
+        if (deviceStatus == null && !isHaveNfc) {
             log.warn("温度、音量查询SPI通知,无设备状态记录");
             return SpiResponseConst.SUCCESS;
         }
         //音量更新
         FunctionUtils.NoParamsNoResult updateVoice = () -> {
-//            deviceStatus.setVoiceVolume(Integer.valueOf(value));
-//            deviceStatusService.updateById(deviceStatus);
             DeviceStatusDto.Up up = new DeviceStatusDto.Up();
             up.setDeviceId(deviceInfo.getDeviceId())
                     .setVoiceVolume(Integer.valueOf(value));
             deviceStatusService.up(up);
         };
 
-        if (BooleanUtil.isTrue(success)) {
+        if (BooleanUtil.isTrue(success) && !isHaveNfc) {
             //温度:TEMP 音量:VOL
             if ("VOL".equals(type)) {
                 updateVoice.run();
@@ -373,13 +392,19 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         String value = dto.getValue();
 
         //查询设备信息
-        DeviceInfo deviceInfo = deviceInfoService.getById(Long.valueOf(terminalId));
+        DeviceInfoDto.Vo deviceInfo = R.feignCheckData(deviceInfoService.obj(new DeviceInfoDto.Obj().setIsSysinfo(true).setDeviceId(Long.valueOf(terminalId))));
         if (deviceInfo == null) {
-            log.warn("温度、音量设置SPI通知,无设备信息");
+            log.warn("温度、音量查询SPI通知,无设备信息");
             return SpiResponseConst.SUCCESS;
         }
+        DeviceSysinfoDto.Vo deviceSysinfo = deviceInfo.getDeviceSysinfo();
+        boolean isHaveNfc = false;
+        if (deviceSysinfo != null && StrUtil.isNotEmpty(deviceSysinfo.getNfcSn())) {
+            isHaveNfc = true;
+        }
+
         DeviceStatus deviceStatus = deviceStatusService.getById(deviceInfo.getDeviceId());
-        if (deviceStatus == null) {
+        if (deviceStatus == null && !isHaveNfc) {
             log.warn("温度、音量设置SPI通知,无设备状态记录");
             return SpiResponseConst.SUCCESS;
         }
@@ -394,7 +419,7 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
             deviceStatusService.updateById(deviceStatus);
         };
 
-        if (BooleanUtil.isTrue(success)) {
+        if (BooleanUtil.isTrue(success) && !isHaveNfc) {
             //温度:TEMP 音量:VOL
             if ("VOL".equals(type)) {
                 updateVoice.run();

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

@@ -15,6 +15,8 @@ import com.xy.device.EnumDeviceActiveStatus;
 import com.xy.device.EnumDeviceBusyStatus;
 import com.xy.dto.*;
 import com.xy.dto.be.MercDto;
+import com.xy.dto.nfc.ActiveDeviceDTO;
+import com.xy.dto.nfc.ResetDeviceDTO;
 import com.xy.entity.*;
 import com.xy.enums.SysCodeConfigureEnum;
 import com.xy.mapper.DeviceCreateIdsMapper;
@@ -74,6 +76,7 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
     private DeviceFaultMonitorConfigServiceImpl deviceFaultMonitorConfigService;
 
     private MercService mercService;
+    private AlipayDeviceService alipayDeviceService;
 
     @Override
     public R save(DeviceRegisterDto.Save save) {
@@ -193,6 +196,26 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
         List<DeviceInfo> activeList = new ArrayList<>();
         JMap<Long, MercMiniDeviceDto.ActiveVo> cover = new JArrayList<>(result).toMap(MercMiniDeviceDto.ActiveVo::getDeviceId).cover();
         deviceIds.forEach(deviceId -> {
+            DeviceInfoDto.Vo dv = R.feignCheckData(deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(deviceId).setIsSysinfo(Boolean.TRUE)));
+            DeviceSysinfoDto.Vo deviceSysinfo = dv.getDeviceSysinfo();
+            if (deviceSysinfo != null && deviceSysinfo.getIsHaveAlipayNpad()) {
+                String nfcSn = deviceSysinfo.getNfcSn();
+                if (StrUtil.isEmpty(nfcSn)) {
+                    throw new RuntimeException("nfc sn 不存在!");
+                }
+                String deviceName = dv.getDeviceName();
+                if (StrUtil.isEmpty(deviceName)) {
+                    deviceName = "" + deviceId;
+                }
+                //  NFC 支付宝碰一下激活
+                ActiveDeviceDTO activeDeviceDTO = new ActiveDeviceDTO().setTerminalId(String.valueOf(deviceId))
+                        .setDeviceName(deviceName)
+                        .setBoardSn(deviceSysinfo.getDeviceSn()).setNfcSn(deviceSysinfo.getNfcSn()).setAddress(dv.getPlaceName());
+                Boolean b = R.feignCheckData(alipayDeviceService.nfcDeviceActive(activeDeviceDTO));
+                if (b) {
+                    throw new RuntimeException("NFC设备激活失败!");
+                }
+            }
             //过滤需要付费的设备
             if (cover.containsKey(deviceId)) {
                 return;
@@ -213,7 +236,17 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
 
     @Override
     public R restActive(MercMiniDeviceDto.RestActive restActive) {
-        deviceChargingService.removeById(restActive.getDeviceId());
+        Long deviceId = restActive.getDeviceId();
+        String nfcSn = restActive.getNfcSn();
+        //nfc解绑重置
+        if (StrUtil.isNotEmpty(nfcSn)) {
+            String loginId = AuthorizeUtils.getLoginId(String.class);
+            ResetDeviceDTO resetParams = new ResetDeviceDTO().setOperatorId(loginId).setOperatorName(loginId).setRemark("设备激活重置").setTerminalId(String.valueOf(deviceId));
+            alipayDeviceService.nfcDeviceReset(resetParams);
+            R.feignCheckData(alipayDeviceService.nfcDeviceReset(resetParams));
+            deviceSysinfoMapper.updateById(new DeviceSysinfo().setDeviceId(deviceId).setNfcSn(StrUtil.EMPTY));
+        }
+        deviceChargingService.removeById(deviceId);
         deviceAlgorithmChargingService.remove(new LambdaQueryWrapper<DeviceAlgorithmCharging>()
                 .eq(DeviceAlgorithmCharging::getDeviceId, restActive.getDeviceId())
         );

+ 9 - 1
device-api-service/src/main/resources/mapper/DeviceInfoMapper.xml

@@ -53,6 +53,8 @@
             <result column="is_have_heat" property="isHaveHeat"/>
             <result column="device_model" property="deviceModel"/>
             <result column="screen_type" property="screenType"/>
+            <result column="is_have_alipay_npad" property="isHaveAlipayNpad"/>
+            <result column="nfc_sn" property="nfcSn"/>
         </association>
         <association property="deviceStatus" javaType="com.xy.dto.DeviceStatusDto$Vo">
             <result column="sys_start_time" property="sysStartTime"/>
@@ -188,6 +190,8 @@
         sysinfo.is_have_heat,
         sysinfo.device_model,
         sysinfo.screen_type,
+        sysinfo.is_have_alipay_npad,
+        sysinfo.nfc_sn,
         status.sys_start_time,
         status.sys_cur_time,
         status.sys_power,
@@ -269,6 +273,9 @@
                 </otherwise>
             </choose>
         </if>
+        <if test="queryPage.isHaveNfc != null">
+            and sysinfo.is_have_alipay_npad= #{queryPage.isHaveNfc}
+        </if>
         <if test="queryPage.keyword != null and queryPage.keyword != ''">
             and CONCAT(IFNULL(info.device_name, ''), IFNULL(info.device_id, '')) LIKE
             CONCAT('%',#{queryPage.keyword},'%')
@@ -332,7 +339,8 @@
         </if>
         <if test="queryPage.merc != null and queryPage.merc != ''">
             and (
-            info.merc_id = #{queryPage.merc} or info.merc_code like concat(#{queryPage.merc}, '%') or LOCATE(#{queryPage.merc}, mr.name) > 0
+            info.merc_id = #{queryPage.merc} or info.merc_code like concat(#{queryPage.merc}, '%') or
+            LOCATE(#{queryPage.merc}, mr.name) > 0
             )
         </if>
         <if test="queryPage.placeId != null">

+ 11 - 0
device-api/src/main/java/com/xy/alipay/SpiDeviceService.java

@@ -27,6 +27,17 @@ public interface SpiDeviceService {
     @PostMapping(value = "/faultInform/notify")
     String deviceAlarmNotify(@RequestBody DeviceAlarmNotifyDTO deviceAlarmNotifyDTO);
 
+    /**
+     * 设备恢复通知
+     * 触发条件:设备故障会恢复时,货柜云平台也会展示
+     * 使用场景:接收设备恢复,进行相应业务处理和任务触发
+     *
+     * @param deviceAlarmRecoverNotifyDTO
+     * @return
+     */
+    @PostMapping(value = "/recoveryInform/notify")
+    String recoveryInform(@RequestBody DeviceAlarmRecoverNotifyDTO deviceAlarmRecoverNotifyDTO);
+
     /**
      * 设备异常通知
      * 触发条件:动态设备发生重力异常或者摄像头异常,影响到该设备交易的正常识别时,会通过该通知同步到商户

+ 22 - 1
device-api/src/main/java/com/xy/dto/DeviceInfoDto.java

@@ -39,6 +39,27 @@ public class DeviceInfoDto {
      */
     public final static String CLEAR = "clear";
 
+    @Data
+    @Accessors(chain = true)
+    public static class NfcVol {
+        @NotBlank(message = "设备编号不可为空")
+        @ApiModelProperty(value = "设备编号", required = true)
+        private String deviceId;
+
+        @NotBlank(message = "值不可为空")
+        @ApiModelProperty(value = " 音量:0~15 (最小颗粒为1)", required = true)
+        private String value;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class NfcVolQuery {
+        @NotBlank(message = "设备编号不可为空")
+        @ApiModelProperty(value = "设备编号", required = true)
+        private String deviceId;
+
+    }
+
 
     @Data
     @Accessors(chain = true)
@@ -236,7 +257,7 @@ public class DeviceInfoDto {
 
         @ApiModelProperty("算法ID")
         private Long algorithmId;
-        
+
         @ApiModelProperty("货道数量")
         private Integer aisleNum;
 

+ 13 - 1
device-api/src/main/java/com/xy/dto/DeviceSysinfoDto.java

@@ -42,7 +42,7 @@ public class DeviceSysinfoDto {
     @Data
     @Accessors(chain = true)
     public static class DeviceSysInfo {
-    
+
         @ApiModelProperty("设备SN")
         private String deviceSN;
     }
@@ -127,6 +127,18 @@ public class DeviceSysinfoDto {
 
         @ApiModelProperty("屏幕类型")
         private Integer screenType;
+
+        /**
+         * 是否有支付宝NPAD
+         */
+        @ApiModelProperty("是否有支付宝NPAD")
+        private Boolean isHaveAlipayNpad;
+        /**
+         * nfc设备sn
+         */
+        @ApiModelProperty("nfc设备sn")
+        private String nfcSn;
+
     }
 
 

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

@@ -87,6 +87,8 @@ public class MercMiniDeviceDto {
         @NotNull(message = "deviceId不能为空")
         @ApiModelProperty("设备id")
         private Long deviceId;
+        @ApiModelProperty("nfcSN")
+        private String nfcSn;
 
     }