skyline преди 2 години
родител
ревизия
4d20f16625
променени са 40 файла, в които са добавени 430 реда и са изтрити 106 реда
  1. 18 0
      admin/src/main/java/com/kym/admin/controller/EquipmentRelationController.java
  2. 2 1
      admin/src/main/java/com/kym/admin/utils/MybatisPlusGeneratorForAdmin.java
  3. 1 1
      admin/src/main/resources/application.yml
  4. 13 2
      common/src/main/java/com/kym/common/constant/ResponseEnum.java
  5. 1 1
      common/src/main/java/com/kym/common/exception/BusinessException.java
  6. 1 1
      entity/src/main/java/com/kym/entity/admin/AdminUser.java
  7. 0 59
      entity/src/main/java/com/kym/entity/admin/ChargeOrder.java
  8. 1 1
      entity/src/main/java/com/kym/entity/admin/Company.java
  9. 2 2
      entity/src/main/java/com/kym/entity/admin/ConnectorInfo.java
  10. 3 3
      entity/src/main/java/com/kym/entity/admin/EquipmentInfo.java
  11. 52 0
      entity/src/main/java/com/kym/entity/admin/EquipmentRelation.java
  12. 4 3
      entity/src/main/java/com/kym/entity/miniapp/Account.java
  13. 5 5
      entity/src/main/java/com/kym/entity/miniapp/ChargeOrder.java
  14. 1 1
      entity/src/main/java/com/kym/entity/miniapp/Collect.java
  15. 2 2
      entity/src/main/java/com/kym/entity/miniapp/User.java
  16. 2 2
      entity/src/main/java/com/kym/entity/miniapp/WalletDetail.java
  17. 1 1
      entity/src/main/java/com/kym/entity/miniapp/vo/UserVo.java
  18. 7 0
      mapper/pom.xml
  19. 16 0
      mapper/src/main/java/com/kym/mapper/admin/EquipmentRelationMapper.java
  20. 1 1
      mapper/src/main/java/com/kym/mapper/miniapp/AccountMapper.java
  21. 2 2
      mapper/src/main/java/com/kym/mapper/miniapp/ChargeOrderMapper.java
  22. 21 0
      mapper/src/main/resources/mappers/admin/EquipmentRelationMapper.xml
  23. 2 2
      miniapp/src/main/java/com/kym/miniapp/controller/AccountController.java
  24. 6 2
      miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java
  25. 1 1
      miniapp/src/main/java/com/kym/miniapp/controller/UserController.java
  26. 11 0
      miniapp/src/main/java/com/kym/miniapp/enums/EnPlusApi.java
  27. 2 2
      miniapp/src/main/java/com/kym/miniapp/utils/MybatisPlusGeneratorForMiniApp.java
  28. 1 1
      miniapp/src/main/resources/application.yml
  29. 21 0
      miniapp/src/main/resources/mappers/AccountMapper.xml
  30. 6 1
      service/src/main/java/com/kym/service/admin/EquipmentInfoService.java
  31. 17 0
      service/src/main/java/com/kym/service/admin/EquipmentRelationService.java
  32. 21 1
      service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java
  33. 30 0
      service/src/main/java/com/kym/service/admin/impl/EquipmentRelationServiceImpl.java
  34. 2 1
      service/src/main/java/com/kym/service/miniapp/AccountService.java
  35. 2 1
      service/src/main/java/com/kym/service/miniapp/ChargeOrderService.java
  36. 1 1
      service/src/main/java/com/kym/service/miniapp/UserService.java
  37. 5 3
      service/src/main/java/com/kym/service/miniapp/impl/AccountServiceImpl.java
  38. 5 1
      service/src/main/java/com/kym/service/miniapp/impl/ChargeOrderServiceImpl.java
  39. 140 0
      service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java
  40. 1 1
      service/src/main/java/com/kym/service/miniapp/impl/UserServiceImpl.java

+ 18 - 0
admin/src/main/java/com/kym/admin/controller/EquipmentRelationController.java

@@ -0,0 +1,18 @@
+package com.kym.admin.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-07
+ */
+@RestController
+@RequestMapping("/equipment-relation")
+public class EquipmentRelationController {
+
+}

+ 2 - 1
admin/src/main/java/com/kym/admin/utils/MybatisPlusGeneratorForAdmin.java

@@ -48,7 +48,8 @@ public class MybatisPlusGeneratorForAdmin {
                     // 设置需要生成的表名
                     builder.addInclude(
 //                            "t_equipment_info",
-                            "t_connector_info"
+//                            "t_connector_info"
+                            "t_equipment_relation"
 
                             )
                             // 设置过滤表前缀

+ 1 - 1
admin/src/main/resources/application.yml

@@ -27,7 +27,7 @@ spring:
       strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
       datasource:
         db-admin:
-          url: jdbc:mysql://121.40.98.15:3307/charge_admin
+          url: jdbc:mysql://121.40.98.15:3307/charge_admin?tinyInt1isBit=false
           username: root
           password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver

+ 13 - 2
common/src/main/java/com/kym/common/constant/ResponseEnum.java

@@ -27,11 +27,22 @@ public enum ResponseEnum implements BusinessExceptionAssert {
     // 登录
     LOGIN_FAILED(10001, "用户名或密码错误"),
 
+    // 订单
+    EQUIP_CONNECTOR_ID_ERROR(20000, "设备编码错误"),
+    ORDER_IN_PROGRESS(20001, "用户有进行中的订单"),
+    INSUFFICIENT_USER_BALANCE(20002, "用户余额不足"),
+    EN_PLUS_EQUIP_AUTH_FAIL(20003, "设备认证失败"),
+    EN_PLUS_EQUIP_NOT_CONNECTED(20004, "设备未连接"),
+    EN_PLUS_EQUIP_CHECK_FAIL(20005, "设备检测失败"),
+    EN_PLUS_EQUIP_START_FAIL(20006, "设备启动充电失败"),
+    EN_PLUS_EQUIP_NOT_EXIST(20007, "设备不存在"),
+    EN_PLUS_EQUIP_OFFLINE(20008, "设备离线"),
+
 
     // EN+
-    EN_PLUS_API_EXCEPTION(90000,"接口数据异常"),
+    EN_PLUS_API_EXCEPTION(90000, "接口数据异常"),
     EN_PLUS_QUERY_TOKEN_ERROR(90001, "TOKEN获取异常"),
-    EN_PLUS_PUSH_SIGN_FAIL(90002,"EN+推送数据验签失败");
+    EN_PLUS_PUSH_SIGN_FAIL(90002, "EN+推送数据验签失败");
 
     private final Integer code;
     private final String message;

+ 1 - 1
common/src/main/java/com/kym/common/exception/BusinessException.java

@@ -7,7 +7,7 @@ import com.kym.common.constant.IResponseCode;
  * @description 业务异常
  * @date 2023-07-04 15:44
  */
-public class BusinessException extends com.kym.common.exception.BaseException {
+public class BusinessException extends BaseException {
 
     private static final long serialVersionUID = 1L;
 

+ 1 - 1
entity/src/main/java/com/kym/entity/admin/AdminUser.java

@@ -57,7 +57,7 @@ public class AdminUser implements Serializable {
     /**
      * 0:禁用 1:启用
      */
-    private Byte status;
+    private Integer status;
 
     private LocalDateTime createTime;
 

+ 0 - 59
entity/src/main/java/com/kym/entity/admin/ChargeOrder.java

@@ -1,59 +0,0 @@
-package com.kym.entity.admin;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-/**
- * <p>
- * 
- * </p>
- *
- * @author skyline
- * @since 2023-06-27
- */
-@Getter
-@Setter
-@TableName("t_charge_order")
-public class ChargeOrder implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private Integer id;
-
-    private Integer userId;
-
-    private Integer stationId;
-
-    private String startChargeSeq;
-
-    private String connectorId;
-
-    private LocalDateTime startTime;
-
-    private LocalDateTime endTime;
-
-    private BigDecimal totalPower;
-
-    private BigDecimal totalCost;
-
-    private BigDecimal elecBill;
-
-    private BigDecimal serviceFee;
-
-    private Byte stopReason;
-
-    private Byte sumPeriod;
-
-    private String chargeDetail;
-
-    private Byte chargeStatus;
-
-    private LocalDateTime createTime;
-
-    private LocalDateTime updateTime;
-}

+ 1 - 1
entity/src/main/java/com/kym/entity/admin/Company.java

@@ -42,7 +42,7 @@ public class Company implements Serializable {
     /**
      * 0:禁用 1:启用
      */
-    private Byte status;
+    private Integer status;
 
     private LocalDateTime createTime;
 

+ 2 - 2
entity/src/main/java/com/kym/entity/admin/ConnectorInfo.java

@@ -42,7 +42,7 @@ public class ConnectorInfo implements Serializable {
     /**
      * 充电设备接口类型:1家用插座(模式2)2:交流接口插座(模式3,连接方式B)3:交流接口插头(带枪线,模式3,连接方式C)4:直流接口枪头(带枪线,模式4)5:无线充电座6:其他
      */
-    private Byte connectorType;
+    private Integer connectorType;
 
     /**
      * 额定电压上限(V)
@@ -72,7 +72,7 @@ public class ConnectorInfo implements Serializable {
     /**
      * 国家标准:1:2011 2:2015
      */
-    private Byte nationalStandard;
+    private Integer nationalStandard;
 
     private LocalDateTime createTime;
 

+ 3 - 3
entity/src/main/java/com/kym/entity/admin/EquipmentInfo.java

@@ -62,7 +62,7 @@ public class EquipmentInfo implements Serializable {
     /**
      * 设备类型:1:直流设备 2:交流设备 3:交直流一体设备 4:无线设备 5:其他
      */
-    private Byte equipmentType;
+    private Integer equipmentType;
 
     /**
      * 位置坐标
@@ -77,12 +77,12 @@ public class EquipmentInfo implements Serializable {
     /**
      * 网络状态:0-离线 1-在线
      */
-    private Byte netStatus;
+    private Integer netStatus;
 
     /**
      * 服务状态:0-空闲 1-已连接 2-充电 3-结束
      */
-    private Byte serviceStatus;
+    private Integer serviceStatus;
 
     private LocalDateTime createTime;
 

+ 52 - 0
entity/src/main/java/com/kym/entity/admin/EquipmentRelation.java

@@ -0,0 +1,52 @@
+package com.kym.entity.admin;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-07
+ */
+@Getter
+@Setter
+@TableName("t_equipment_relation")
+public class EquipmentRelation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * EN+站点id
+     */
+    private Integer stationId;
+
+    /**
+     * 二维码sn号
+     */
+    private String shortId;
+
+    /**
+     * EN+充电的sn号
+     */
+    private String equipmentId;
+
+    /**
+     * 状态 0:启用,1:未启用
+     */
+    private Integer status;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}

+ 4 - 3
entity/src/main/java/com/kym/entity/miniapp/Account.java

@@ -2,6 +2,7 @@ package com.kym.entity.miniapp;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import lombok.Getter;
 import lombok.Setter;
@@ -12,7 +13,7 @@ import lombok.Setter;
  * </p>
  *
  * @author skyline
- * @since 2023-07-26
+ * @since 2023-08-07
  */
 @Getter
 @Setter
@@ -31,12 +32,12 @@ public class Account implements Serializable {
     /**
      * 余额
      */
-    private Long balance;
+    private BigDecimal balance;
 
     /**
      * 冻结金额
      */
-    private Long frozenAmount;
+    private BigDecimal frozenAmount;
 
     /**
      * 状态: 0禁用 1启用

+ 5 - 5
entity/src/main/java/com/kym/entity/miniapp/ChargeOrder.java

@@ -23,9 +23,9 @@ public class ChargeOrder implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    private Integer id;
+    private Long id;
 
-    private Integer userId;
+    private Long userId;
 
     private Integer stationId;
 
@@ -45,13 +45,13 @@ public class ChargeOrder implements Serializable {
 
     private BigDecimal serviceFee;
 
-    private Byte stopReason;
+    private Integer stopReason;
 
-    private Byte sumPeriod;
+    private Integer sumPeriod;
 
     private String chargeDetail;
 
-    private Byte chargeStatus;
+    private Integer chargeStatus;
 
     private LocalDateTime createTime;
 

+ 1 - 1
entity/src/main/java/com/kym/entity/miniapp/Collect.java

@@ -36,7 +36,7 @@ public class Collect implements Serializable {
     /**
      * 状态: 0-不显示 1-显示
      */
-    private Byte status;
+    private Integer status;
 
     /**
      * 创建时间

+ 2 - 2
entity/src/main/java/com/kym/entity/miniapp/User.java

@@ -46,7 +46,7 @@ public class User implements Serializable {
     /**
      * 性别:0-女 1-男
      */
-    private Byte gender;
+    private Integer gender;
 
     /**
      * 昵称
@@ -66,7 +66,7 @@ public class User implements Serializable {
     /**
      * 0:禁用 1:启用
      */
-    private Byte status;
+    private Integer status;
 
     private LocalDateTime createTime;
 

+ 2 - 2
entity/src/main/java/com/kym/entity/miniapp/WalletDetail.java

@@ -32,7 +32,7 @@ public class WalletDetail implements Serializable {
     /**
      * 交易类型:1-充值2-提现3-消费
      */
-    private Byte type;
+    private Integer type;
 
     /**
      * 币种
@@ -67,7 +67,7 @@ public class WalletDetail implements Serializable {
     /**
      * 明细状态:0-待确认1-已确认2-已取消
      */
-    private Byte status;
+    private Integer status;
 
     /**
      * 备注

+ 1 - 1
entity/src/main/java/com/kym/entity/miniapp/vo/vo/UserVo.java → entity/src/main/java/com/kym/entity/miniapp/vo/UserVo.java

@@ -1,4 +1,4 @@
-package com.kym.entity.miniapp.vo.vo;
+package com.kym.entity.miniapp.vo;
 
 import lombok.Data;
 

+ 7 - 0
mapper/pom.xml

@@ -30,6 +30,13 @@
             <version>3.5.3.1</version>
         </dependency>
 
+        <!-- 代码生成使用 -->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.32</version>
+        </dependency>
+
 
 
         <!-- 多数据源配置 -->

+ 16 - 0
mapper/src/main/java/com/kym/mapper/admin/EquipmentRelationMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper.admin;
+
+import com.kym.entity.admin.EquipmentRelation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-07
+ */
+public interface EquipmentRelationMapper extends BaseMapper<EquipmentRelation> {
+
+}

+ 1 - 1
mapper/src/main/java/com/kym/mapper/miniapp/AccountMapper.java

@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * </p>
  *
  * @author skyline
- * @since 2023-07-26
+ * @since 2023-08-07
  */
 public interface AccountMapper extends BaseMapper<Account> {
 

+ 2 - 2
mapper/src/main/java/com/kym/mapper/miniapp/ChargeOrderMapper.java

@@ -1,11 +1,11 @@
 package com.kym.mapper.miniapp;
 
-import com.kym.entity.admin.ChargeOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kym.entity.miniapp.ChargeOrder;
 
 /**
  * <p>
- *  Mapper 接口
+ * Mapper 接口
  * </p>
  *
  * @author skyline

+ 21 - 0
mapper/src/main/resources/mappers/admin/EquipmentRelationMapper.xml

@@ -0,0 +1,21 @@
+<?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.kym.mapper.admin.EquipmentRelationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.admin.EquipmentRelation">
+        <id column="id" property="id" />
+        <result column="station_id" property="stationId" />
+        <result column="short_id" property="shortId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="status" property="status" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, station_id, short_id, equipment_id, status, create_time, update_time
+    </sql>
+
+</mapper>

+ 2 - 2
miniapp/src/main/java/com/kym/miniapp/controller/AccountController.java

@@ -9,10 +9,10 @@ import org.springframework.web.bind.annotation.RestController;
  * </p>
  *
  * @author skyline
- * @since 2023-07-26
+ * @since 2023-08-07
  */
 @RestController
-@RequestMapping("/api/account")
+@RequestMapping("/account")
 public class AccountController {
 
 }

+ 6 - 2
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -49,8 +49,8 @@ public class ChargerController {
     @SysLog("充电详情")
     @GetMapping("stationStatusDetail")
     R stationStatusDetail(@RequestParam("stationId") String stationId,
-                    @RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String startTime,
-                    @RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String endTime) {
+                          @RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String startTime,
+                          @RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String endTime) {
         // 请求en+接口
         var response = stationService.stationStats(stationId, startTime, endTime);
         return R.success(response);
@@ -65,6 +65,8 @@ public class ChargerController {
     @SysLog("启动充电")
     @PostMapping("/startCharge")
     R startCharge() {
+
+
         return R.success();
     }
 
@@ -96,6 +98,8 @@ public class ChargerController {
     @PostMapping("/notification_stationStatus")
     JSONObject notificationStationStatus(@RequestBody JSONObject json) {
         // TODO: 2023-08-05 验签 业务逻辑
+
+
         return null;
     }
 

+ 1 - 1
miniapp/src/main/java/com/kym/miniapp/controller/UserController.java

@@ -6,7 +6,7 @@ import com.kym.common.R;
 import com.kym.common.annotation.SysLog;
 import com.kym.common.utils.IDGenerator;
 import com.kym.entity.miniapp.User;
-import com.kym.entity.miniapp.vo.vo.UserVo;
+import com.kym.entity.miniapp.vo.UserVo;
 import com.kym.service.miniapp.CollectService;
 import com.kym.service.miniapp.UserService;
 import org.springframework.beans.factory.annotation.Autowired;

+ 11 - 0
miniapp/src/main/java/com/kym/miniapp/enums/EnPlusApi.java

@@ -20,6 +20,17 @@ public enum EnPlusApi implements Api {
 
     // 站点
     EN_PLUS_STATION_INFO(Constants.DOMAIN + "query_stations_info", RequestMethod.POST),
+
+    // 充电
+    // 请求设备认证
+    EM_PLUS_QUERY_EQUIP_AUTH(Constants.DOMAIN + "query_equip_auth", RequestMethod.POST),
+    // 查询业务策略信息
+    EM_PLUS_QUERY_EQUIP_BUSINESS_POLICY(Constants.DOMAIN + "query_equip_business_policy", RequestMethod.POST),
+    // 请求启动充电
+    EM_PLUS_QUERY_START_CHARGE(Constants.DOMAIN + "query_start_charge", RequestMethod.POST),
+
+
+    // 微信
     WX_MP_GET_PHONE("", RequestMethod.POST),
     WX_GET_ACCESS_TOKEN("", RequestMethod.POST);
 

+ 2 - 2
miniapp/src/main/java/com/kym/miniapp/utils/MybatisPlusGeneratorForMiniApp.java

@@ -48,11 +48,11 @@ public class MybatisPlusGeneratorForMiniApp {
                     // 设置需要生成的表名
                     builder.addInclude(
 //                                    "t_user",
-//                                    "t_account",
+                                    "t_account"
 //                                    "t_charge_order",
 //                                    "t_wallet_detail",
 //                                    "t_cars",
-                            "t_collect"
+//                            "t_collect"
                             )
                             // 设置过滤表前缀
                             .addTablePrefix("t_");

+ 1 - 1
miniapp/src/main/resources/application.yml

@@ -27,7 +27,7 @@ spring:
       strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
       datasource:
         db-admin:
-          url: jdbc:mysql://121.40.98.15:3307/charge_admin
+          url: jdbc:mysql://121.40.98.15:3307/charge_admin?tinyInt1isBit=false
           username: root
           password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver

+ 21 - 0
miniapp/src/main/resources/mappers/AccountMapper.xml

@@ -0,0 +1,21 @@
+<?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.kym.mapper.miniapp.AccountMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.Account">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="balance" property="balance" />
+        <result column="frozen_amount" property="frozenAmount" />
+        <result column="status" property="status" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, balance, frozen_amount, status, create_time, update_time
+    </sql>
+
+</mapper>

+ 6 - 1
service/src/main/java/com/kym/service/admin/EquipmentInfoService.java

@@ -1,7 +1,12 @@
 package com.kym.service.admin;
 
+import com.alibaba.fastjson2.JSONObject;
+import com.kym.common.enums.EnPlusApi;
+import com.kym.common.utils.AESUtil;
+import com.kym.common.utils.IDGenerator;
 import com.kym.entity.admin.EquipmentInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * <p>
@@ -12,5 +17,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2023-08-05
  */
 public interface EquipmentInfoService extends IService<EquipmentInfo> {
-
+    JSONObject queryEquipAuth(String connectorId, String equipAuthSeq);
 }

+ 17 - 0
service/src/main/java/com/kym/service/admin/EquipmentRelationService.java

@@ -0,0 +1,17 @@
+package com.kym.service.admin;
+
+import com.kym.entity.admin.EquipmentRelation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-07
+ */
+public interface EquipmentRelationService extends IService<EquipmentRelation> {
+    EquipmentRelation getByShortId(String shortId);
+
+}

+ 21 - 1
service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java

@@ -1,9 +1,14 @@
 package com.kym.service.admin.impl;
 
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kym.common.enums.EnPlusApi;
+import com.kym.common.utils.AESUtil;
 import com.kym.entity.admin.EquipmentInfo;
 import com.kym.mapper.admin.EquipmentInfoMapper;
 import com.kym.service.admin.EquipmentInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kym.service.enplus.EnPlusService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -16,5 +21,20 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class EquipmentInfoServiceImpl extends ServiceImpl<EquipmentInfoMapper, EquipmentInfo> implements EquipmentInfoService {
+    @Autowired
+    private EnPlusService enPlusService;
+
+    @Override
+    public JSONObject queryEquipAuth(String connectorId, String equipAuthSeq) {
+        var param = """
+                {
+                    "EquipAuthSeq":%s,
+                    "ConnectorID":%s
+                }
+                """.formatted(equipAuthSeq, connectorId);
+        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), enPlusService.buildParams(param));
+
+        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+    }
 
 }

+ 30 - 0
service/src/main/java/com/kym/service/admin/impl/EquipmentRelationServiceImpl.java

@@ -0,0 +1,30 @@
+package com.kym.service.admin.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kym.entity.admin.EquipmentRelation;
+import com.kym.mapper.admin.EquipmentRelationMapper;
+import com.kym.service.admin.EquipmentRelationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-07
+ */
+@Service
+@DS("db-admin")
+public class EquipmentRelationServiceImpl extends ServiceImpl<EquipmentRelationMapper, EquipmentRelation> implements EquipmentRelationService {
+
+    @Override
+    public EquipmentRelation getByShortId(String shortId) {
+        return getOne(lambdaQuery().eq(EquipmentRelation::getShortId,shortId));
+    }
+}

+ 2 - 1
service/src/main/java/com/kym/service/miniapp/AccountService.java

@@ -9,8 +9,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * </p>
  *
  * @author skyline
- * @since 2023-07-26
+ * @since 2023-08-07
  */
 public interface AccountService extends IService<Account> {
 
+    Account getAccountByUserId(Long userId);
 }

+ 2 - 1
service/src/main/java/com/kym/service/miniapp/ChargeOrderService.java

@@ -1,7 +1,7 @@
 package com.kym.service.miniapp;
 
-import com.kym.entity.admin.ChargeOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.kym.entity.miniapp.ChargeOrder;
 
 /**
  * <p>
@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ChargeOrderService extends IService<ChargeOrder> {
 
+    ChargeOrder getChargingOrderByUserId(Long userId);
 }

+ 1 - 1
service/src/main/java/com/kym/service/miniapp/UserService.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.pagehelper.PageInfo;
 import com.kym.common.R;
 import com.kym.entity.miniapp.User;
-import com.kym.entity.miniapp.vo.vo.UserVo;
+import com.kym.entity.miniapp.vo.UserVo;
 
 /**
  * <p>

+ 5 - 3
service/src/main/java/com/kym/service/miniapp/impl/AccountServiceImpl.java

@@ -1,6 +1,5 @@
 package com.kym.service.miniapp.impl;
 
-import com.baomidou.dynamic.datasource.annotation.DS;
 import com.kym.entity.miniapp.Account;
 import com.kym.mapper.miniapp.AccountMapper;
 import com.kym.service.miniapp.AccountService;
@@ -13,10 +12,13 @@ import org.springframework.stereotype.Service;
  * </p>
  *
  * @author skyline
- * @since 2023-07-26
+ * @since 2023-08-07
  */
 @Service
-@DS("miniapp")
 public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements AccountService {
+    @Override
+    public Account getAccountByUserId(Long userId){
+        return getOne(lambdaQuery().eq(Account::getUserId, userId));
+    }
 
 }

+ 5 - 1
service/src/main/java/com/kym/service/miniapp/impl/ChargeOrderServiceImpl.java

@@ -1,7 +1,7 @@
 package com.kym.service.miniapp.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.kym.entity.admin.ChargeOrder;
+import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.mapper.miniapp.ChargeOrderMapper;
 import com.kym.service.miniapp.ChargeOrderService;
 import org.springframework.stereotype.Service;
@@ -17,4 +17,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, ChargeOrder> implements ChargeOrderService {
 
+    @Override
+    public ChargeOrder getChargingOrderByUserId(Long userId) {
+        return getOne(lambdaQuery().eq(ChargeOrder::getUserId,userId).eq(ChargeOrder::getChargeStatus,2));
+    }
 }

+ 140 - 0
service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java

@@ -1,7 +1,26 @@
 package com.kym.service.miniapp.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.kym.common.constant.ResponseEnum;
+import com.kym.common.enums.EnPlusApi;
+import com.kym.common.exception.BusinessException;
+import com.kym.common.utils.AESUtil;
+import com.kym.common.utils.IDGenerator;
+import com.kym.entity.miniapp.ChargeOrder;
+import com.kym.service.admin.EquipmentInfoService;
+import com.kym.service.admin.EquipmentRelationService;
+import com.kym.service.enplus.EnPlusService;
+import com.kym.service.miniapp.AccountService;
+import com.kym.service.miniapp.ChargeOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+
 /**
  * @author skyline
  * @description 充电
@@ -9,7 +28,128 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ChargeServiceImpl {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ChargeServiceImpl.class);
+
+
+    @Autowired
+    private IDGenerator idGenerator;
+
+    @Autowired
+    private EquipmentRelationService equipmentRelationService;
+
+    @Autowired
+    private ChargeOrderService chargeOrderService;
+
+    @Autowired
+    private AccountService accountService;
+
+    @Autowired
+    private EquipmentInfoService equipmentInfoService;
+
+    @Autowired
+    private EnPlusService enPlusService;
+
+    @Value("${en-plus.operator-id}")
+    private String operatorId;
+
+    String startCharge(String connectorId) {
+        var userId = StpUtil.getSession().getLong("userId");
+        if (connectorId.length() == 6) {
+            // 查询EN+设备SN
+            var equipmentRelation = equipmentRelationService.getByShortId(connectorId);
+            var equipmentId = equipmentRelation.getEquipmentId();
+            if (equipmentId.length() == 16) {
+                // 如果是16位,末尾补1作为单枪枪号
+                equipmentId = equipmentId.concat("1");
+            }
+            // 二维码文本
+            var qrCode = "";
+            // 当前设备是是否有正在进行中的订单
+            var chargeOrder = chargeOrderService.getChargingOrderByUserId(userId);
+            if (chargeOrder == null) {
+                LOGGER.error("用户:{}存在进行中的订单:{}", userId, chargeOrder.getId());
+                throw new BusinessException(ResponseEnum.ORDER_IN_PROGRESS);
+            }
+            // 查询用户余额
+            var account = accountService.getAccountByUserId(userId);
+            if (account.getBalance().compareTo(BigDecimal.valueOf(2L)) != 1) {
+                LOGGER.error("用户:{}余额不足2元,余额:{}", userId, account.getBalance());
+                throw new BusinessException(ResponseEnum.INSUFFICIENT_USER_BALANCE);
+            }
+            // 传递给EN+的余额要小于实际余额,防止订单超扣的情况,这里少传0.5元
+            var amount = account.getBalance().subtract(BigDecimal.valueOf(0.5));
+
+            // 充电订单号/设备认证号
+            String startChargeSeq = operatorId.substring(0, 8).concat(String.valueOf(idGenerator.nextId()));
+
+            // 请求设备认证
+            var equipAuth = equipmentInfoService.queryEquipAuth(connectorId, startChargeSeq);
+
+            if (equipAuth.containsKey("SuccStat") && equipAuth.getIntValue("SuccStat") == 0) {
+                // TODO 查询业务策略信息(计费信息),目前计费在EN+完成,后续自主计费需要开发
+                // 启动充电
+                var startCharge = queryStartCharge(startChargeSeq, connectorId, qrCode, amount);
+                if (startCharge.containsKey("SuccStat") && startCharge.getIntValue("SuccStat") == 0) {
+                    // 启动成功,生成充电订单
+                    var order = new ChargeOrder();
+                    order.setUserId(userId);
+                    order.setStationId(equipmentRelation.getStationId());
+                    order.setStartChargeSeq(startChargeSeq);
+                    order.setConnectorId(connectorId);
+                    order.setChargeStatus(startCharge.getIntValue("StartChargeSeqStat"));
+                    chargeOrderService.save(order);
+                    // TODO: 2023-08-07 包装成自己的数据
+                    return startChargeSeq;
+                } else {
+                    // 启动充电失败
+                    LOGGER.error("设备启动充电失败:{}", startCharge);
+                    switch (equipAuth.getIntValue("FailReason")) {
+                        case 1 -> // 设备不存在
+                                throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_NOT_EXIST);
+                        case 2 -> // 设备离线
+                                throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_OFFLINE);
+                    }
+                    throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_START_FAIL);
+                }
+            } else {
+                // 设备认证失败
+                LOGGER.error("设备认证失败:{}", equipAuth);
+                switch (equipAuth.getIntValue("FailReason")) {
+                    case 1 -> // 设备未插枪
+                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_NOT_CONNECTED);
+                    case 2 -> // 设备检测失败
+                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_AUTH_FAIL);
+                }
+                throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_AUTH_FAIL);
+            }
+        } else {
+            // 充电桩编号错误
+            LOGGER.error("用户:{}请求充电,设备编码错误:{}", userId, connectorId);
+            throw new BusinessException(ResponseEnum.EQUIP_CONNECTOR_ID_ERROR);
+        }
+    }
 
 
+    /**
+     * 请求EN+启动充电
+     *
+     * @param startChargeSeq
+     * @param connectorId
+     * @param qrCode
+     * @param amount
+     * @return
+     */
+    public JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, BigDecimal amount) {
+        var param = """
+                {
+                    "StartChargeSeq":%s,
+                    "ConnectorID":%s,
+                    "QRCode":%s,
+                    "amount",%d
+                }
+                """.formatted(startChargeSeq, connectorId, qrCode, amount);
+        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), enPlusService.buildParams(param));
+        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+    }
 
 }

+ 1 - 1
service/src/main/java/com/kym/service/miniapp/impl/UserServiceImpl.java

@@ -16,7 +16,7 @@ import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.Cars;
 import com.kym.entity.miniapp.User;
 import com.kym.entity.miniapp.WxPhoneNum;
-import com.kym.entity.miniapp.vo.vo.UserVo;
+import com.kym.entity.miniapp.vo.UserVo;
 import com.kym.mapper.miniapp.UserMapper;
 import com.kym.service.miniapp.AccountService;
 import com.kym.service.miniapp.CarsService;