Pārlūkot izejas kodu

Merge branch 'SIM卡' into test

hechunping 10 mēneši atpakaļ
vecāks
revīzija
4916c5c983

+ 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 {
+
+}

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

@@ -0,0 +1,77 @@
+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 = "创建人")
+    @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>

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

+ 22 - 1
device-api-service/src/main/java/com/xy/service/SimInfoServiceImpl.java

@@ -11,6 +11,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 
+import java.util.List;
+
 /**
  * <p>
  * 物联网卡服务
@@ -32,7 +34,26 @@ public class SimInfoServiceImpl implements SimInfoService {
 
     @Override
     @ApiOperation("刷新网络")
-    public R<String> refreshNet(SimInfoDto.RefreshNetDto dto) {
+    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);
+    }
+
 }

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

@@ -3,6 +3,8 @@ package com.xy.service.factory.sim;
 import com.xy.dto.SimInfoDto;
 import com.xy.utils.R;
 
+import java.util.List;
+
 /**
  * <p>
  * Sim物联网卡接口
@@ -12,7 +14,39 @@ import com.xy.utils.R;
  * @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();
 }

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

@@ -1,17 +1,27 @@
 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.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.CtWingUtils;
-import com.xy.utils.FunctionUtils;
-import com.xy.utils.R;
+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>
  * 电信
@@ -24,6 +34,10 @@ import lombok.extern.slf4j.Slf4j;
 @Factory(type = "电信")
 @AllArgsConstructor
 public class CtWingFactoryImpl implements SimInfoFactory {
+    private final DeviceSimPickRecordsServiceImpl simPickRecordsService;
+
+    private final DeviceInfoServiceImpl deviceInfoService;
+
     /**
      * 三码查询
      *
@@ -79,15 +93,93 @@ public class CtWingFactoryImpl implements SimInfoFactory {
         if (!"0".equals(telephonePlusVo.getResultCode())) {
             return R.fail("三码查询错误!");
         }
-        String action = dto.getAction() ? "ADD":"DEL";
+        String action = dto.getAction() ? "ADD" : "DEL";
         CtWingDto.SingleCutNetDto singleCutNetDto = new CtWingDto.SingleCutNetDto()
                 .setAccessNumber(telephonePlusVo.getAccessNumber())
                 .setAction(action);
         CtWingVo.BaseVo baseVo = CtWingUtils.singleCutNet(singleCutNetDto);
-        if("0".equals(baseVo.getResultCode())){
+
+        if ("0".equals(baseVo.getResultCode())) {
+            log.info("");
             return R.ok("处理成功!");
-        }else{
+        } else {
+            log.error("");
+            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);
+        if ("0".equals(baseVo.getResultCode())) {
+            log.info("");
+            return R.ok("处理成功!");
+        } else {
+            log.error("");
+            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);
+            log.info("");
+            return R.ok("订购成功!");
+        } else {
+            log.error("");
             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);
+    }
+
+
 }

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

@@ -0,0 +1,120 @@
+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;
+
+
+    }
+
+}

+ 41 - 2
device-api/src/main/java/com/xy/dto/SimInfoDto.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
 
@@ -12,7 +13,7 @@ public class SimInfoDto {
     @Data
     @Accessors(chain = true)
     public static class BaseDto {
-        @NotNull(message = "iccid 不能为空")
+        @NotBlank(message = "iccid 不能为空")
         @ApiModelProperty(value = "iccid", required = true)
         private String iccid;
 
@@ -52,11 +53,49 @@ public class SimInfoDto {
 
     @Data
     @Accessors(chain = true)
-    public static class RefreshNetDto extends BaseDto{
+    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 {
+
+}

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

@@ -7,6 +7,8 @@ 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>
  * 物联网卡服务接口
@@ -22,4 +24,13 @@ public interface SimInfoService {
 
     @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);
 }