Răsfoiți Sursa

Merge remote-tracking branch 'origin/master' into prod

tanbin 11 luni în urmă
părinte
comite
52ced29c8a

+ 50 - 0
device-api-service/src/main/java/com/xy/open/DeviceOpenApiService.java

@@ -0,0 +1,50 @@
+package com.xy.open;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xy.annotate.RestMappingController;
+import com.xy.annotation.Open;
+import com.xy.entity.DeviceInfo;
+import com.xy.open.dto.DeviceOpenApiDTO;
+import com.xy.open.vo.DeviceOpenApiVO;
+import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+/**
+ * 开放api
+ */
+
+@Slf4j
+@Service
+@Api(tags = "设备API")
+@RequiredArgsConstructor
+@RestMappingController("/openApi")
+public class DeviceOpenApiService {
+
+    private final DeviceInfoServiceImpl deviceInfoService;
+
+    @ApiOperation(value = "获取商户设备列表", notes = "获取商户设备列表")
+    @Open(value = "device.page.get", version = "1.0", permission = true)
+    @RequestMapping("/device/page/get")
+    public PageBean<DeviceOpenApiVO.DeviceList> devicePageGet(DeviceOpenApiDTO.DeviceListGet dto, HttpServletRequest request) {
+        PageBean pageBean = dto.getPage();
+        LambdaQueryWrapper<DeviceInfo> lqw = Wrappers.<DeviceInfo>lambdaQuery()
+                .in(DeviceInfo::getMercCode, dto.getMercCodes()
+                );
+        IPage<DeviceInfo> iPage = deviceInfoService.page(toIPage(pageBean), lqw);
+        return toPageBean(DeviceOpenApiVO.DeviceList.class, iPage);
+    }
+
+}

+ 42 - 0
device-api-service/src/main/java/com/xy/open/config/OpenServiceConfig.java

@@ -0,0 +1,42 @@
+package com.xy.open.config;
+
+
+import com.xy.bean.ServiceConfig;
+import com.xy.configuration.AlipayServiceConfiguration;
+import com.xy.swagger.SwaggerSupport;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+/**
+ * 开放平台功能
+ *
+ * @author tanghc
+ */
+@Configuration
+public class OpenServiceConfig extends AlipayServiceConfiguration {
+
+    static {
+        ServiceConfig.getInstance().getI18nModules().add("i18n/isp/goods_error");
+    }
+
+
+    /**
+     * 开启文档,本地微服务文档地址:http://localhost:2222/doc.html
+     * http://ip:port/v2/api-docs
+     */
+    @Configuration
+    @EnableSwagger2WebMvc
+    public static class Swagger2 extends SwaggerSupport {
+        @Override
+        protected String getDocTitle() {
+            return "智能货柜-设备接口文档";
+        }
+
+        @Override
+        protected boolean swaggerAccessProtected() {
+            return false;
+        }
+    }
+
+}
+

+ 30 - 0
device-api-service/src/main/java/com/xy/open/dto/DeviceOpenApiDTO.java

@@ -0,0 +1,30 @@
+package com.xy.open.dto;
+
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 设备DTO
+ */
+public class DeviceOpenApiDTO {
+
+    @Data
+    @Accessors(chain = true)
+    public static class DeviceListGet {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+        @NotEmpty(message = "deviceId不能为空")
+        @ApiModelProperty(value = "商户编码不可为空", required = true)
+        private List<String> mercCodes;
+ 
+    }
+
+
+}

+ 50 - 0
device-api-service/src/main/java/com/xy/open/vo/DeviceOpenApiVO.java

@@ -0,0 +1,50 @@
+package com.xy.open.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * 设备VO
+ */
+public class DeviceOpenApiVO {
+
+    @Data
+    @Accessors(chain = true)
+    public static class DeviceList {
+
+        @ApiModelProperty(value = "商户编码")
+        private Long mercCode;
+
+        @ApiModelProperty(value = "设备编号")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "设备名称")
+        private Long deviceName;
+
+
+        @ApiModelProperty(value = "设备类型", notes = "1: 动态视觉柜(单门) 2: 动态视觉柜(双门) 3: 重力柜(单门) 4:重力柜(双门) 5:支付宝视动态觉柜")
+        private Integer deviceType;
+
+
+        @ApiModelProperty(value = "经度")
+        private String lon;
+
+        @ApiModelProperty(value = "纬度")
+        private String lat;
+
+        @ApiModelProperty(value = "激活状态", notes = "1: 已激活 2: 未激活")
+        private Integer activeState;
+
+        @ApiModelProperty("激活时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime activeTime;
+
+
+    }
+
+
+}

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

@@ -13,10 +13,7 @@ import com.xy.config.DeviceThreadPoolConfig;
 import com.xy.constants.SpiResponseConst;
 import com.xy.device.EnumDeviceOnlineStatus;
 import com.xy.dto.*;
-import com.xy.dto.spi.DeviceAlarmNotifyDTO;
-import com.xy.dto.spi.DeviceAttributesNotifyDTO;
-import com.xy.dto.spi.DeviceSetAttributesNotifyDTO;
-import com.xy.dto.spi.DeviceStatusChangeNotifyDTO;
+import com.xy.dto.spi.*;
 import com.xy.entity.DeviceInfo;
 import com.xy.entity.DeviceStatus;
 import com.xy.service.*;
@@ -32,6 +29,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.List;
 
@@ -226,6 +227,46 @@ public class AliPayOpenDeviceFatoryImpl implements DeviceFactory, SpiDeviceServi
         return SpiResponseConst.SUCCESS;
     }
 
+    @ApiOperation("设备异常通知SPI")
+    @Override
+    public String deviceExceptionNotify(DeviceExceptionNotifyDTO deviceExceptionNotifyDTO) {
+        String terminalId = deviceExceptionNotifyDTO.getTerminalId();
+        String action = deviceExceptionNotifyDTO.getAction();
+        String exceptionDesc = deviceExceptionNotifyDTO.getExceptionDesc();
+        //triggerTime 示例 1551156574510
+        Long triggerTime = deviceExceptionNotifyDTO.getTriggerTime();
+        LocalDateTime triggerDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(triggerTime), ZoneId.systemDefault());
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String formattedDateTime = triggerDateTime.format(formatter);
+        String devCode = "";
+        if ("恢复".equals(action)) {
+            if (exceptionDesc.contains("重力")) {
+                devCode = "DEV6004";
+            } else if (exceptionDesc.contains("摄像头")) {
+                devCode = "DEV6001";
+            }
+        } else if ("故障".equals(action)) {
+            if (exceptionDesc.contains("重力")) {
+                devCode = "DEV6003";
+            } else if (exceptionDesc.contains("摄像头")) {
+                devCode = "DEV6000";
+            }
+        }
+
+        if (StrUtil.isEmpty(devCode)) {
+            log.error("设备异常通知SPI->未知的异常类型:{}", JSONUtil.toJsonPrettyStr(deviceExceptionNotifyDTO));
+            return SpiResponseConst.FAIL;
+        }
+        //添加设备异常记录
+        DeviceEventMsgDto.Save save = new DeviceEventMsgDto.Save()
+                .setDeviceId(Long.valueOf(terminalId));
+        save.setCode(devCode);
+        save.setMsg(exceptionDesc + ";发生时间:" + formattedDateTime);
+        deviceEventMsgService.save(save);
+
+        return SpiResponseConst.SUCCESS;
+    }
+
     @Override
     @ApiOperation("设备状态变更通知SPI")
     public String deviceStatusChangeNotify(DeviceStatusChangeNotifyDTO deviceStatusChangeNotifyDTO) {

+ 12 - 4
device-api/src/main/java/com/xy/alipay/SpiDeviceService.java

@@ -1,10 +1,7 @@
 package com.xy.alipay;
 
 import com.xy.annotate.RestMappingController;
-import com.xy.dto.spi.DeviceAlarmNotifyDTO;
-import com.xy.dto.spi.DeviceAttributesNotifyDTO;
-import com.xy.dto.spi.DeviceSetAttributesNotifyDTO;
-import com.xy.dto.spi.DeviceStatusChangeNotifyDTO;
+import com.xy.dto.spi.*;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
@@ -30,6 +27,17 @@ public interface SpiDeviceService {
     @PostMapping(value = "/faultInform/notify")
     String deviceAlarmNotify(@RequestBody DeviceAlarmNotifyDTO deviceAlarmNotifyDTO);
 
+    /**
+     * 设备异常通知
+     * 触发条件:动态设备发生重力异常或者摄像头异常,影响到该设备交易的正常识别时,会通过该通知同步到商户
+     * 使用场景:接收设备恢复,进行相应业务处理和任务触发
+     *
+     * @param deviceExceptionNotifyDTO
+     * @return
+     */
+    @PostMapping(value = "/deviceException/notify")
+    String deviceExceptionNotify(@RequestBody DeviceExceptionNotifyDTO deviceExceptionNotifyDTO);
+
     /**
      * 设备状态变更通知
      * 触发条件:设备激活状态或运营状态发生变化时

+ 10 - 0
device-start/src/main/resources/i18n/isp/bizerror_en.properties

@@ -0,0 +1,10 @@
+# 错误配置
+
+# 系统配置
+isp.error_isv.common-error=The system is busy.
+isp.error_isv.invalid-parameter=Invalid parameter, {0}
+
+# ==== 参数配置 ====
+
+goods.remark.notNull=The goods_remark can not be null
+goods.comment.length=The goods_comment length must >= {0} and <= {1}

+ 14 - 0
device-start/src/main/resources/i18n/isp/bizerror_zh_CN.properties

@@ -0,0 +1,14 @@
+# 错误配置
+
+# 系统繁忙
+isp.error_isv.common-error=\u7cfb\u7edf\u7e41\u5fd9
+# 参数无效
+isp.error_isv.invalid-parameter=\u53c2\u6570\u65e0\u6548, {0}
+
+# ==== 参数配置 ====
+
+# 商品备注不能为空
+goods.remark.notNull=\u5546\u54c1\u5907\u6ce8\u4e0d\u80fd\u4e3a\u7a7a
+# 商品评论长度必须在{0}和{1}之间
+goods.comment.length=\u5546\u54c1\u8bc4\u8bba\u957f\u5ea6\u5fc5\u987b\u5728{0}\u548c{1}\u4e4b\u95f4
+

+ 2 - 0
device-start/src/main/resources/i18n/isp/goods_error_en.properties

@@ -0,0 +1,2 @@
+isp.goods_error_100=the goods_name can NOT be null
+isp.goods_error_101=the goods_name must bigger than {0}

+ 5 - 0
device-start/src/main/resources/i18n/isp/goods_error_zh_CN.properties

@@ -0,0 +1,5 @@
+# 商品名字不能为空
+isp.goods_error_100=\u5546\u54C1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+
+# 商品名称太短,不能小于{0}个字
+isp.goods_error_101=\u5546\u54C1\u540D\u79F0\u592A\u77ED\uFF0C\u4E0D\u80FD\u5C0F\u4E8E{0}\u4E2A\u5B57