Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

lijin 6 miesięcy temu
rodzic
commit
6906f58dfa
22 zmienionych plików z 917 dodań i 11 usunięć
  1. 1 0
      .gitignore
  2. 19 0
      device-api-cloud/src/main/java/com/xy/feign/DeviceSimPickRecordsFeign.java
  3. 6 0
      device-api-service/pom.xml
  4. 5 0
      device-api-service/src/main/java/com/xy/entity/DeviceInfo.java
  5. 80 0
      device-api-service/src/main/java/com/xy/entity/DeviceSimPickRecords.java
  6. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceSimPickRecordsMapper.java
  7. 22 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceSimPickRecordsMapper.xml
  8. 13 5
      device-api-service/src/main/java/com/xy/service/DeviceRegisterServiceImpl.java
  9. 84 0
      device-api-service/src/main/java/com/xy/service/DeviceSimPickRecordsServiceImpl.java
  10. 59 0
      device-api-service/src/main/java/com/xy/service/SimInfoServiceImpl.java
  11. 52 0
      device-api-service/src/main/java/com/xy/service/factory/sim/SimInfoFactory.java
  12. 204 0
      device-api-service/src/main/java/com/xy/service/factory/sim/impl/CtWingFactoryImpl.java
  13. 35 0
      device-api-service/src/main/java/com/xy/service/factory/sim/impl/SimInfoFactoryRoute.java
  14. 1 0
      device-api-service/src/main/resources/mapper/DeviceInfoMapper.xml
  15. 10 0
      device-api/src/main/java/com/xy/dto/DeviceInfoDto.java
  16. 3 0
      device-api/src/main/java/com/xy/dto/DeviceRegisterDto.java
  17. 122 0
      device-api/src/main/java/com/xy/dto/DeviceSimPickRecordsDto.java
  18. 125 0
      device-api/src/main/java/com/xy/dto/SimInfoDto.java
  19. 16 0
      device-api/src/main/java/com/xy/service/DeviceSimPickRecordsService.java
  20. 36 0
      device-api/src/main/java/com/xy/service/SimInfoService.java
  21. 7 5
      device-api/src/main/java/com/xy/utils/enums/DeviceTypeEnum.java
  22. 1 1
      device-start/src/main/resources/bootstrap.yml

+ 1 - 0
.gitignore

@@ -20,6 +20,7 @@ log/
 *.iws
 *.iml
 *.ipr
+*.log
 
 ### NetBeans ###
 /nbproject/private/

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/DeviceSimPickRecordsFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.DeviceSimPickRecordsService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 物联网卡加油包记录 feign
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024-08-22
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface DeviceSimPickRecordsFeign extends DeviceSimPickRecordsService {
+
+}

+ 6 - 0
device-api-service/pom.xml

@@ -132,6 +132,12 @@
             <version>1.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>xy-sim</artifactId>
+            <version>1.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 5 - 0
device-api-service/src/main/java/com/xy/entity/DeviceInfo.java

@@ -1,6 +1,7 @@
 package com.xy.entity;
 
 import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
@@ -135,4 +136,8 @@ public class DeviceInfo {
      */
     private String thirdResult;
 
+
+    @ApiModelProperty("货道数量")
+    private Integer aisleNum;
+
 }

+ 80 - 0
device-api-service/src/main/java/com/xy/entity/DeviceSimPickRecords.java

@@ -0,0 +1,80 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 物联网卡加油包记录
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024-08-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="DeviceSimPickRecords对象", description="物联网卡加油包记录")
+public class DeviceSimPickRecords implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "设备ID")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "商户ID")
+    private Long mercId;
+
+    @ApiModelProperty(value = "iccid")
+    private String iccid;
+
+    @ApiModelProperty(value = "运营商")
+    private String icp;
+
+    @ApiModelProperty(value = "加油包名称")
+    private String name;
+
+    @ApiModelProperty(value = "金额")
+    private Integer amount;
+
+    @ApiModelProperty(value = "加油包编号")
+    private String packCode;
+
+    @ApiModelProperty(value = "支付状态")
+    private String payStatus;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long updateUser;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceSimPickRecordsMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceSimPickRecords;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 物联网卡加油包记录 Mapper 接口
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024-08-22
+ */
+public interface DeviceSimPickRecordsMapper extends BaseMapper<DeviceSimPickRecords> {
+
+}

+ 22 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceSimPickRecordsMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.DeviceSimPickRecordsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceSimPickRecords">
+        <result column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="merc_id" property="mercId" />
+        <result column="iccid" property="iccid" />
+        <result column="icp" property="icp" />
+        <result column="name" property="name" />
+        <result column="amount" property="amount" />
+        <result column="pack_code" property="packCode" />
+        <result column="status" property="status" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

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

@@ -18,10 +18,7 @@ import com.xy.dto.DeviceCreateIdsDto;
 import com.xy.dto.DeviceQualityDto;
 import com.xy.dto.DeviceRegisterDto;
 import com.xy.dto.be.MercDto;
-import com.xy.entity.DeviceCreateIds;
-import com.xy.entity.DeviceRegister;
-import com.xy.entity.DeviceSysinfo;
-import com.xy.entity.MqttUser;
+import com.xy.entity.*;
 import com.xy.mapper.DeviceCreateIdsMapper;
 import com.xy.mapper.DeviceRegisterMapper;
 import com.xy.service.be.MercService;
@@ -34,6 +31,7 @@ import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -60,7 +58,7 @@ import static com.xy.utils.PlusBeans.*;
  */
 @Service
 @Api(tags = "设备-注册登记")
-@AllArgsConstructor
+@AllArgsConstructor(onConstructor_ = @Lazy)
 public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper, DeviceRegister> implements DeviceRegisterService {
 
     private DeviceCreateIdsMapper deviceCreateIdsMapper;
@@ -75,6 +73,8 @@ public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper,
 
     private MercService mercService;
 
+    private DeviceInfoServiceImpl deviceInfoService;
+
     @PostMapping("save")
     @ApiOperation("添加")
     @Transactional(rollbackFor = Exception.class)
@@ -126,6 +126,9 @@ public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper,
                     .setShowStatus(true)
             ).getData();
             JMap<Long, DeviceQualityDto.Vo> map = new JArrayList<>(vos).toMap(DeviceQualityDto.Vo::getDeviceId).cover();
+            List<DeviceInfo> deviceInfos = deviceInfoService.listByIds(deviceIds);
+            JMap<Long, DeviceInfo> deviceInfoJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
+
             //查询机器ID号
             List<DeviceCreateIds> deviceCreateIds = deviceCreateIdsService.list(new LambdaQueryWrapper<DeviceCreateIds>()
                     .in(DeviceCreateIds::getDeviceId, deviceIds)
@@ -150,6 +153,11 @@ public class DeviceRegisterServiceImpl extends ServiceImpl<DeviceRegisterMapper,
                 if (Emptys.check(vo)) {
                     deviceRegister.setFactoryState(vo.getFactoryState()).setQualityState(vo.getQualityState());
                 }
+                DeviceInfo deviceInfo = deviceInfoJMaps.get(deviceRegister.getDeviceId());
+                if (Emptys.check(deviceInfo)) {
+                    //货道数反显
+                    deviceRegister.setAisleNum(deviceInfo.getAisleNum());
+                }
                 //机器ID号商户信息
                 DeviceCreateIds deviceCreateIdsInfo = deviceCreateIdsJMaps.get(deviceRegister.getDeviceId());
                 if (Emptys.check(deviceCreateIdsInfo)) {

+ 84 - 0
device-api-service/src/main/java/com/xy/service/DeviceSimPickRecordsServiceImpl.java

@@ -0,0 +1,84 @@
+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.dto.DeviceSimPickRecordsDto;
+import com.xy.entity.DeviceSimPickRecords;
+import com.xy.mapper.DeviceSimPickRecordsMapper;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+import static com.xy.utils.Beans.copy;
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+
+/**
+* <p>
+* 物联网卡加油包记录 服务实现类
+* </p>
+*
+* @author hechunping
+* @since 2024-08-22
+*/
+@Service
+@AllArgsConstructor
+@Api(tags = "物联网卡加油包记录")
+public class DeviceSimPickRecordsServiceImpl extends ServiceImpl<DeviceSimPickRecordsMapper, DeviceSimPickRecords> implements DeviceSimPickRecordsService {
+
+    @PostMapping("obj")
+    @ApiOperation("对象查询")
+    public R<DeviceSimPickRecordsDto.Vo> obj(@RequestBody DeviceSimPickRecordsDto.Vo vo) {
+        DeviceSimPickRecordsDto.SelectList selectList = copy(DeviceSimPickRecordsDto.SelectList.class, vo);
+        List<DeviceSimPickRecordsDto.Vo> list = list(selectList).getData();
+        if(Emptys.check(list)) {
+            return R.ok(list.get(0));
+        }
+        return R.ok();
+    }
+
+    @PostMapping("list")
+    @ApiOperation("集合查询")
+    public R<List<DeviceSimPickRecordsDto.Vo>> list(@RequestBody DeviceSimPickRecordsDto.SelectList selectList) {
+        LambdaQueryWrapper<DeviceSimPickRecords> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceSimPickRecords.class).build();
+        List<DeviceSimPickRecords> list = list(lambdaQueryWrapper);
+        return R.ok(copy(DeviceSimPickRecordsDto.Vo.class, list));
+    }
+
+    @PostMapping("page")
+    @ApiOperation("分页查询")
+    public R<PageBean<DeviceSimPickRecordsDto.Vo>> page(@RequestBody DeviceSimPickRecordsDto.Page page) {
+        PageBean pageBean = page.getPage();
+        LambdaQueryWrapper<DeviceSimPickRecords> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceSimPickRecords.class).build();
+        IPage<DeviceSimPickRecords> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
+        return R.ok(toPageBean(DeviceSimPickRecordsDto.Vo.class, iPage));
+    }
+
+    @PostMapping("save")
+    @ApiOperation("添加")
+    public R save(@RequestBody @Validated DeviceSimPickRecordsDto.Save save) {
+        DeviceSimPickRecords saveInfo = copy(DeviceSimPickRecords.class, save);
+        save(saveInfo);
+        return R.ok();
+    }
+
+    @PostMapping("update")
+    @ApiOperation("修改")
+    public R update(@RequestBody @Validated DeviceSimPickRecordsDto.Update update) {
+        DeviceSimPickRecords updateInfo = copy(DeviceSimPickRecords.class, update);
+        updateById(updateInfo);
+        return R.ok();
+    }
+}

+ 59 - 0
device-api-service/src/main/java/com/xy/service/SimInfoServiceImpl.java

@@ -0,0 +1,59 @@
+package com.xy.service;
+
+import com.xy.dto.SimInfoDto;
+import com.xy.service.factory.sim.SimInfoFactory;
+import com.xy.utils.FactoryUtils;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 物联网卡服务
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024/8/20
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "物联网卡服务")
+public class SimInfoServiceImpl implements SimInfoService {
+
+    @Override
+    @ApiOperation("物联网卡信息")
+    public R<SimInfoDto.InfoVo> info(@RequestBody @Validated SimInfoDto.BaseDto dto) {
+        return FactoryUtils.getServiceRoute(SimInfoFactory.class, dto.getIsp()).info(dto);
+    }
+
+    @Override
+    @ApiOperation("刷新网络")
+    public R<String> refreshNet(@RequestBody @Validated SimInfoDto.RefreshNetDto dto) {
+        return FactoryUtils.getServiceRoute(SimInfoFactory.class,dto.getIsp()).refreshNet(dto);
+    }
+
+    @Override
+    @ApiOperation("机卡重绑")
+    public R<String> bindAgain(@RequestBody @Validated SimInfoDto.BindAgainDto dto) {
+        return FactoryUtils.getServiceRoute(SimInfoFactory.class,dto.getIsp()).bindAgain(dto);
+    }
+
+    @Override
+    @ApiOperation("加油包列表")
+    public R<List<SimInfoDto.PackListVo>> packList(@RequestBody @Validated SimInfoDto.BaseDto dto) {
+        return FactoryUtils.getServiceRoute(SimInfoFactory.class,dto.getIsp()).packList();
+    }
+
+    @Override
+    @ApiOperation("购买加油包")
+    public R<String> buyPack(@RequestBody @Validated SimInfoDto.BuyPackDto dto)  {
+        return FactoryUtils.getServiceRoute(SimInfoFactory.class,dto.getIsp()).buyPack(dto);
+    }
+
+}

+ 52 - 0
device-api-service/src/main/java/com/xy/service/factory/sim/SimInfoFactory.java

@@ -0,0 +1,52 @@
+package com.xy.service.factory.sim;
+
+import com.xy.dto.SimInfoDto;
+import com.xy.utils.R;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Sim物联网卡接口
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024/8/20
+ */
+public interface SimInfoFactory {
+    /**
+     * 卡状态查询
+     * @param dto
+     * @return
+     */
+    R<SimInfoDto.InfoVo> info(SimInfoDto.BaseDto dto);
+
+
+    /**
+     * 刷新网络 断开、恢复
+     * @param dto
+     * @return
+     */
+    R<String> refreshNet(SimInfoDto.RefreshNetDto dto);
+
+    /**
+     * 机卡重绑
+     * @param dto
+     * @return
+     */
+    R<String> bindAgain(SimInfoDto.BindAgainDto dto);
+
+
+    /**
+     * 购买加油包
+     * @param dto
+     * @return
+     */
+    R<String> buyPack(SimInfoDto.BuyPackDto dto);
+
+    /**
+     * 加油包列表
+     * @return
+     */
+    R<List<SimInfoDto.PackListVo>> packList();
+}

+ 204 - 0
device-api-service/src/main/java/com/xy/service/factory/sim/impl/CtWingFactoryImpl.java

@@ -0,0 +1,204 @@
+package com.xy.service.factory.sim.impl;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.xy.Enum.ctwing.BindTypeEnum;
+import com.xy.annotate.Factory;
+import com.xy.config.DeviceThreadPoolConfig;
+import com.xy.dto.CtWingDto;
+import com.xy.dto.CtWingVo;
+import com.xy.dto.DeviceSimPickRecordsDto;
+import com.xy.dto.SimInfoDto;
+import com.xy.entity.DeviceInfo;
+import com.xy.entity.SysDictRedis;
+import com.xy.service.DeviceInfoServiceImpl;
+import com.xy.service.DeviceSimPickRecordsServiceImpl;
+import com.xy.service.factory.sim.SimInfoFactory;
+import com.xy.utils.*;
+import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 电信
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024/8/20
+ */
+@Slf4j
+@Factory(type = "电信")
+@AllArgsConstructor
+public class CtWingFactoryImpl implements SimInfoFactory {
+    private final DeviceSimPickRecordsServiceImpl simPickRecordsService;
+
+    private final DeviceInfoServiceImpl deviceInfoService;
+
+    /**
+     * 三码查询
+     *
+     * @param iccid
+     * @return
+     */
+    @SneakyThrows
+    private CtWingVo.TelephonePlusVo telephonePlus(String iccid) {
+        CtWingDto.TelephonePlusDto telephonePlusDto = new CtWingDto.TelephonePlusDto();
+        telephonePlusDto.setIccid(iccid);
+        CtWingVo.TelephonePlusVo vo = CtWingUtils.getTelephonePlus(telephonePlusDto);
+        return vo;
+    }
+
+
+    @Override
+    @SneakyThrows
+    public R<SimInfoDto.InfoVo> info(SimInfoDto.BaseDto dto) {
+        //三码查询
+        CtWingVo.TelephonePlusVo telephonePlusVo = telephonePlus(dto.getIccid());
+        if (!"0".equals(telephonePlusVo.getResultCode())) {
+            return R.fail("三码查询错误!");
+        }
+        SimInfoDto.InfoVo vo = new SimInfoDto.InfoVo();
+        vo.setIccid(telephonePlusVo.getIccid())
+                .setImsi(telephonePlusVo.getImsi())
+                .setAccessNumber(telephonePlusVo.getAccessNumber());
+        //卡主状态查询
+        FunctionUtils.NoParamsNoResult queryCardMainStatus = () -> {
+            CtWingDto.CardMainStatusDto cardMainStatusDto = new CtWingDto.CardMainStatusDto();
+            cardMainStatusDto.setAccessNumber(telephonePlusVo.getAccessNumber());
+            CtWingVo.CardMainStatusVo cardMainStatusVo = CtWingUtils.queryCardMainStatus(cardMainStatusDto);
+            vo.setCreateDate(cardMainStatusVo.getServCreateDate())
+                    .setActiveDate(cardMainStatusVo.getServActiveDate())
+                    .setNetBlockStatus(cardMainStatusVo.getNetBlockStatusName())
+                    .setSimStatus(cardMainStatusVo.getOperatorDefinitionStatusName());
+        };
+        //在线状态
+        FunctionUtils.NoParamsNoResult qryOnlineStatus = () -> {
+            CtWingDto.AccessNumberOrIccid accessNumberOrIccid = new CtWingDto.AccessNumberOrIccid().setIccid(telephonePlusVo.getIccid());
+            CtWingVo.OnlineStatusVo onlineStatusVo = CtWingUtils.qryOnlineStatus(accessNumberOrIccid);
+            vo.setImei(onlineStatusVo.getImei())
+                    .setProvince(onlineStatusVo.getProvince())
+                    .setOnlineStatus(onlineStatusVo.getOnlineStatusDesc())
+                    .setOnlineStartTime(onlineStatusVo.getStartTime())
+                    .setOnlineEndTime(onlineStatusVo.getEndTime())
+            ;
+        };
+        //当月流量使用总量
+        FunctionUtils.NoParamsNoResult queryTraffic = () -> {
+            CtWingDto.AccessNumberOrIccid accessNumberOrIccid = new CtWingDto.AccessNumberOrIccid().setIccid(telephonePlusVo.getIccid());
+            CtWingVo.TrafficVo trafficVo = CtWingUtils.queryTraffic(accessNumberOrIccid);
+            vo.setCurrMonthUseFlow(trafficVo.getTotalBytesCnt());
+        };
+        ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 3)
+                .execute(() -> {
+                    queryCardMainStatus.run();
+                })
+                .execute(() -> {
+                    qryOnlineStatus.run();
+                })
+                .execute(() -> {
+                    queryTraffic.run();
+                }).end();
+        return R.ok(vo);
+    }
+
+    @Override
+    @SneakyThrows
+    public R<String> refreshNet(SimInfoDto.RefreshNetDto dto) {
+        //三码查询
+        CtWingVo.TelephonePlusVo telephonePlusVo = telephonePlus(dto.getIccid());
+        if (!"0".equals(telephonePlusVo.getResultCode())) {
+            return R.fail("三码查询错误!");
+        }
+        String action = dto.getAction() ? "ADD" : "DEL";
+        CtWingDto.SingleCutNetDto singleCutNetDto = new CtWingDto.SingleCutNetDto()
+                .setAccessNumber(telephonePlusVo.getAccessNumber())
+                .setAction(action);
+        CtWingVo.BaseVo baseVo = CtWingUtils.singleCutNet(singleCutNetDto);
+        log.info("刷新网络,参数 {},操作人:{}",JSONUtil.toJsonStr(singleCutNetDto),AuthorizeUtils.getLoginId(Long.class));
+        if ("0".equals(baseVo.getResultCode())) {
+            log.info("刷新网络成功 {}",dto.getIccid());
+            return R.ok("处理成功!");
+        } else {
+            log.info("刷新网络失败 {},错误描述 {}",dto.getIccid(),baseVo.getResultMsg());
+            return R.fail(baseVo.getResultMsg());
+        }
+    }
+
+    @Override
+    @SneakyThrows
+    public R<String> bindAgain(SimInfoDto.BindAgainDto dto) {
+        CtWingDto.ImeiReRecordDto imeiReRecordDto = new CtWingDto.ImeiReRecordDto();
+        imeiReRecordDto.setBindType(BindTypeEnum.T_1.getCode()).setImei(dto.getImei()).setIccid(dto.getIccid());
+        CtWingVo.BaseVo baseVo = CtWingUtils.imeiReRecord(imeiReRecordDto);
+        log.info("机卡绑定,参数 {},操作人:{}",JSONUtil.toJsonStr(imeiReRecordDto),AuthorizeUtils.getLoginId(Long.class));
+        if ("0".equals(baseVo.getResultCode())) {
+            log.info("机卡绑定成功 {}",dto.getIccid());
+            return R.ok("处理成功!");
+        } else {
+            log.info("机卡绑定失败 {},错误描述 {}",dto.getIccid(),baseVo.getResultMsg());
+            return R.fail(baseVo.getResultMsg());
+        }
+    }
+
+    @Override
+    @SneakyThrows
+    public R<String> buyPack(SimInfoDto.BuyPackDto dto) {
+        //查询设备
+        DeviceInfo deviceInfo = deviceInfoService.getById(dto.getDeviceId());
+        //查询字典
+        SysDictRedis sysDictRedis = SysDictUtils.get("sim-packs-ctwing", dto.getPackCode());
+        JSONObject jsonObject = JSONUtil.parseObj(sysDictRedis.getValue());
+        String name = jsonObject.getStr("name");
+        String icp = jsonObject.getStr("icp");
+        Integer money = jsonObject.getInt("money");
+
+        CtWingDto.OrderRFPFlowDto orderRFPFlowDto = new CtWingDto.OrderRFPFlowDto();
+        orderRFPFlowDto.setFlowValue(dto.getPackCode()).setIccid(dto.getIccid());
+        CtWingVo.BaseVo baseVo = CtWingUtils.orderRFPFlow(orderRFPFlowDto);
+        if ("0".equals(baseVo.getResultCode())) {
+            //保存记录
+            DeviceSimPickRecordsDto.Save recordsDto = new DeviceSimPickRecordsDto.Save()
+                    .setPackCode(dto.getPackCode())
+                    .setIcp(dto.getIsp())
+                    .setIccid(dto.getIccid())
+                    .setName(name)
+                    .setAmount(money)
+                    .setDeviceId(dto.getDeviceId())
+                    .setMercId(deviceInfo.getMercId());
+            simPickRecordsService.save(recordsDto);
+            return R.ok("订购成功!");
+        } else {
+            return R.fail(baseVo.getResultMsg());
+        }
+    }
+
+    @Override
+    public R<List<SimInfoDto.PackListVo>> packList() {
+        Map<String, SysDictRedis> dict = SysDictUtils.get("sim-packs-ctwing");
+        List<SimInfoDto.PackListVo> voList = new ArrayList<>();
+        if (Emptys.check(dict)) {
+            dict.forEach((k, v) -> {
+                JSONObject jsonObject = JSONUtil.parseObj(v.getValue());
+                String name = jsonObject.get("name").toString();
+                String icp = jsonObject.get("icp").toString();
+                Integer money = Integer.valueOf(jsonObject.get("money").toString());
+                SimInfoDto.PackListVo vo = new SimInfoDto.PackListVo()
+                        .setPackCode(v.getCode())
+                        .setDesc(v.getMsg())
+                        .setName(name)
+                        .setIcp(icp)
+                        .setMoney(money);
+                voList.add(vo);
+            });
+        }
+
+        return R.ok(voList);
+    }
+
+
+}

+ 35 - 0
device-api-service/src/main/java/com/xy/service/factory/sim/impl/SimInfoFactoryRoute.java

@@ -0,0 +1,35 @@
+package com.xy.service.factory.sim.impl;
+
+import com.xy.annotate.FactoryRoute;
+import com.xy.error.CommRuntimeException;
+import com.xy.service.factory.sim.SimInfoFactory;
+import com.xy.utils.FactoryUtils;
+import lombok.AllArgsConstructor;
+
+/**
+ * <p>
+ * Sim物联网卡工厂路由
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024/8/20
+ */
+@AllArgsConstructor
+@FactoryRoute(interfaceClass = SimInfoFactory.class)
+public class SimInfoFactoryRoute implements FactoryUtils.RouteService {
+
+    @Override
+    public String route(Object object) {
+        String isp = String.valueOf(object).trim();
+        String route = "";
+        switch (isp) {
+            case "电信":
+            case "中国电信":
+                route = "电信";
+                break;
+            default:
+                throw new CommRuntimeException("接口不支持!");
+        }
+        return route;
+    }
+}

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

@@ -27,6 +27,7 @@
         <result column="place_name" property="placeName"/>
         <result column="place_line_name" property="placeLineName"/>
         <result column="district_name" property="districtName"/>
+        <result column="aisle_num" property="aisleNum"/>
 
         <association property="deviceSysinfo" javaType="com.xy.dto.DeviceSysinfoDto$Vo">
             <result column="sysinfo_device_sn" property="deviceSn"/>

+ 10 - 0
device-api/src/main/java/com/xy/dto/DeviceInfoDto.java

@@ -218,6 +218,10 @@ public class DeviceInfoDto {
 
         @ApiModelProperty("算法ID")
         private Long algorithmId;
+        
+        @ApiModelProperty("货道数量")
+        private Integer aisleNum;
+
     }
 
 
@@ -567,6 +571,9 @@ public class DeviceInfoDto {
     @Accessors(chain = true)
     public static class Vo {
 
+        @ApiModelProperty("货道数量")
+        private Integer aisleNum;
+
         @ApiModelProperty("通电状态")
         private Integer sysPower;
 
@@ -1159,6 +1166,9 @@ public class DeviceInfoDto {
         @ApiModelProperty("通电状态")
         private Integer sysPower;
 
+        @ApiModelProperty("货道数量")
+        private Integer aisleNum;
+
     }
 
 

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

@@ -108,6 +108,9 @@ public class DeviceRegisterDto {
         @ApiModelProperty("设备ID")
         private Long deviceId;
 
+        @ApiModelProperty("货道数量")
+        private Integer aisleNum;
+
         @ApiModelProperty("注册序号")
         private Integer registerNum;
 

+ 122 - 0
device-api/src/main/java/com/xy/dto/DeviceSimPickRecordsDto.java

@@ -0,0 +1,122 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 物联网卡加油包记录
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024-08-22
+ */
+public class DeviceSimPickRecordsDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save {
+        @ApiModelProperty(value = "设备ID")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "iccid")
+        private String iccid;
+
+        @ApiModelProperty(value = "运营商")
+        private String icp;
+
+        @ApiModelProperty(value = "加油包名称")
+        private String name;
+
+        @ApiModelProperty(value = "金额")
+        private Integer amount;
+
+        @ApiModelProperty(value = "加油包编号")
+        private String packCode;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update {
+        @ApiModelProperty(value = "支付状态")
+        private String payStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remark;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "ID")
+        private Long id;
+
+        @ApiModelProperty(value = "设备ID")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "iccid")
+        private String iccid;
+
+        @ApiModelProperty(value = "运营商")
+        private String icp;
+
+        @ApiModelProperty(value = "加油包名称")
+        private String name;
+
+        @ApiModelProperty(value = "金额")
+        private Integer amount;
+
+        @ApiModelProperty(value = "加油包编号")
+        private String packCode;
+
+        @ApiModelProperty(value = "支付状态")
+        private String payStatus;
+
+        @ApiModelProperty(value = "创建人")
+        private Long createUser;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新人")
+        private Long updateUser;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+        @ApiModelProperty(value = "备注")
+        private String remark;
+
+    }
+
+}

+ 125 - 0
device-api/src/main/java/com/xy/dto/SimInfoDto.java

@@ -0,0 +1,125 @@
+package com.xy.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+
+public class SimInfoDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class BaseDto {
+        @NotBlank(message = "iccid 不能为空")
+        @ApiModelProperty(value = "iccid", required = true)
+        private String iccid;
+
+        @ApiModelProperty(value = "运营商")
+        private String isp;
+
+        public String getIccid() {
+            if (iccid.length() > 20) {
+                iccid = iccid.substring(0, 20);
+            }
+            return iccid;
+        }
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class InfoVo {
+        @ApiModelProperty("iccid")
+        private String iccid;
+
+        @ApiModelProperty("imsi")
+        private String imsi;
+
+        @ApiModelProperty("号码")
+        private String accessNumber;
+
+        @ApiModelProperty("激活时间")
+        private String activeDate;
+
+        @ApiModelProperty("开卡时间")
+        private String createDate;
+
+        @ApiModelProperty("断网状态")
+        private String netBlockStatus;
+
+        @ApiModelProperty("卡状态")
+        private String simStatus;
+
+        @ApiModelProperty("在线状态")
+        private String onlineStatus;
+
+        @ApiModelProperty("省份名称")
+        private String province;
+
+        @ApiModelProperty("imei")
+        private String imei;
+
+
+        @ApiModelProperty("最近一次上线时间")
+        private String onlineStartTime;
+
+        @ApiModelProperty("最近一次下线时间")
+        private String onlineEndTime;
+        //流量套餐,使用情况
+
+        @ApiModelProperty("当月流量使用总量")
+        private String currMonthUseFlow;
+
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class RefreshNetDto extends BaseDto {
+
+        @NotNull(message = "操作 不能为空")
+        @ApiModelProperty(value = "操作 true为联网,false为断网", required = true)
+        private Boolean action;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class BindAgainDto extends BaseDto {
+        @ApiModelProperty("设备码")
+        private String imei;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class BuyPackDto extends BaseDto {
+        @NotBlank(message = "订购包CODE 不能为空")
+        @ApiModelProperty(value = "订购包CODE", required = true)
+        private String packCode;
+
+        @NotBlank(message = "订购包CODE 不能为空")
+        @ApiModelProperty(value = "设备ID", required = true)
+        private Long deviceId;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class PackListVo {
+        @ApiModelProperty(value = "订购包CODE")
+        private String packCode;
+
+        @ApiModelProperty(value = "描述")
+        private String desc;
+
+        @ApiModelProperty(value = "名称")
+        private String name;
+
+        @ApiModelProperty(value = "运营商")
+        private String icp;
+
+        @ApiModelProperty(value = "金额")
+        private Integer money;
+    }
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceSimPickRecordsService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 物联网卡加油包记录 服务类
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024-08-22
+ */
+@RestMappingController("/device-sim-pick-records")
+public interface DeviceSimPickRecordsService {
+
+}

+ 36 - 0
device-api/src/main/java/com/xy/service/SimInfoService.java

@@ -0,0 +1,36 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+import com.xy.dto.SimInfoDto;
+import com.xy.utils.R;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 物联网卡服务接口
+ * </p>
+ *
+ * @author hechunping
+ * @since 2024/8/20
+ */
+@RestMappingController("sim-info")
+public interface SimInfoService {
+    @PostMapping("info")
+    R<SimInfoDto.InfoVo> info(@RequestBody @Validated SimInfoDto.BaseDto dto);
+
+    @PostMapping("refreshNet")
+    R<String> refreshNet(@RequestBody @Validated SimInfoDto.RefreshNetDto dto);
+
+    @PostMapping("bindAgain")
+    R<String> bindAgain(@RequestBody @Validated SimInfoDto.BindAgainDto dto);
+
+    @PostMapping("packList")
+    R<List<SimInfoDto.PackListVo>> packList(@RequestBody @Validated SimInfoDto.BaseDto dto);
+
+    @PostMapping("buyPack")
+    R<String> buyPack(@RequestBody @Validated SimInfoDto.BuyPackDto dto);
+}

+ 7 - 5
device-api/src/main/java/com/xy/utils/enums/DeviceTypeEnum.java

@@ -14,11 +14,13 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum DeviceTypeEnum {
-    TYPE1(1,"动态视觉柜(单门)"),
-    TYPE2(2,"动态视觉柜(双门)"),
-    TYPE3(3,"重力柜(单门)"),
-    TYPE4(4,"重力柜(双门)"),
-    TYPE5(5,"支付宝视动态觉柜")
+    TYPE1(1, "动态视觉柜(单门)"),
+    TYPE2(2, "动态视觉柜(双门)"),
+    TYPE3(3, "重力柜(单门)"),
+    TYPE4(4, "重力柜(双门)"),
+    TYPE5(5, "支付宝视动态觉柜"),
+    TYPE6(6, "重力动态视觉柜(单门)"),
+    TYPE7(7, "重力动态视觉柜(双门)"),
     ;
     private Integer code;
     private String msg;

+ 1 - 1
device-start/src/main/resources/bootstrap.yml

@@ -10,7 +10,7 @@ cloud:
   center:
     url: 119.96.213.127:9007
     config:
-      shared-configs: redis.yaml,mysql.yaml,xxl-job.yaml,algorithm.yaml,xy-oss.yaml,alipay.yaml,cloudwalk.yaml,magic-api.yaml,knife4j.yaml,tyai.yaml
+      shared-configs: redis.yaml,mysql.yaml,xxl-job.yaml,algorithm.yaml,xy-oss.yaml,alipay.yaml,cloudwalk.yaml,magic-api.yaml,knife4j.yaml,tyai.yaml,sim-api.yaml
       name: device
   service:
     name: dev-device