Browse Source

删除多余代码

skyline 1 year ago
parent
commit
6d7e34a962
82 changed files with 15 additions and 6646 deletions
  1. 0 92
      car-wash-admin/src/main/java/com/kym/admin/controller/TestController.java
  2. 0 21
      car-wash-common/src/main/java/com/kym/common/config/EnPlusConfig.java
  3. 0 28
      car-wash-common/src/main/java/com/kym/common/config/WxFapiaoConfig.java
  4. 0 45
      car-wash-common/src/main/java/com/kym/common/enums/EnPlusApi.java
  5. 1 2
      car-wash-common/src/main/java/com/kym/common/handler/ResponseResultHandler.java
  6. 0 133
      car-wash-common/src/main/java/com/kym/common/utils/AESUtil.java
  7. 0 113
      car-wash-entity/src/main/java/com/kym/entity/admin/InvoiceDetail.java
  8. 0 172
      car-wash-entity/src/main/java/com/kym/entity/admin/vo/LocalStationVo.java
  9. 0 200
      car-wash-entity/src/main/java/com/kym/entity/admin/vo/StationVo.java
  10. 0 38
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnChargeDetails.java
  11. 0 26
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnChargeOrder.java
  12. 0 33
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnCheckOrderSeq.java
  13. 0 73
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorInfo.java
  14. 0 28
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorStatsInfo.java
  15. 0 45
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorStatusInfo.java
  16. 0 97
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnEquipmentInfo.java
  17. 0 30
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnEquipmentStatsInfo.java
  18. 0 53
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationChargeOrderInfo.java
  19. 0 74
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationEquipChargeStatus.java
  20. 0 41
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationStartChargeResult.java
  21. 0 48
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationStopChargeResult.java
  22. 0 43
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnPolicyInfo.java
  23. 0 39
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnRespQueryToken.java
  24. 0 151
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationInfo.java
  25. 0 43
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationStatsInfo.java
  26. 0 33
      car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationStatusInfo.java
  27. 0 67
      car-wash-entity/src/main/java/com/kym/entity/enplus/response/EnBusinessPolicy.java
  28. 0 32
      car-wash-entity/src/main/java/com/kym/entity/enplus/response/EnResponse.java
  29. 0 135
      car-wash-entity/src/main/java/com/kym/entity/miniapp/Invoice.java
  30. 0 77
      car-wash-entity/src/main/java/com/kym/entity/miniapp/InvoiceTitle.java
  31. 0 142
      car-wash-entity/src/main/java/com/kym/entity/miniapp/vo/InvoiceVo.java
  32. 0 28
      car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailBuyerInformationTypeHandle.java
  33. 0 30
      car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailItemsTypeHandle.java
  34. 0 28
      car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailSellerInformationTypeHandle.java
  35. 0 30
      car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceOrderDetailListTypeHandle.java
  36. 0 1
      car-wash-entity/src/main/java/com/kym/entity/typehandle/WashOrderDetailTypeHandle.java
  37. 0 162
      car-wash-entity/src/main/java/com/kym/entity/wechat/FaPiao.java
  38. 0 169
      car-wash-entity/src/main/java/com/kym/entity/wechat/FapiaoApplications.java
  39. 0 24
      car-wash-entity/src/main/java/com/kym/entity/wechat/FapiaoDownload.java
  40. 0 74
      car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceBaseInfo.java
  41. 0 77
      car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceNotification.java
  42. 0 20
      car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceOrderDetail.java
  43. 0 77
      car-wash-entity/src/main/java/com/kym/entity/wechat/TaxCodes.java
  44. 0 33
      car-wash-entity/src/main/java/com/kym/entity/wechat/TitleUrl.java
  45. 0 34
      car-wash-entity/src/main/java/com/kym/entity/wechat/TitleWriteNotification.java
  46. 0 17
      car-wash-mapper/src/main/java/com/kym/mapper/admin/InvoiceDetailMapper.java
  47. 0 16
      car-wash-mapper/src/main/java/com/kym/mapper/miniapp/InvoiceMapper.java
  48. 0 16
      car-wash-mapper/src/main/java/com/kym/mapper/miniapp/InvoiceTitleMapper.java
  49. 0 32
      car-wash-mapper/src/main/resources/mappers/admin/InvoiceDetailMapper.xml
  50. 0 39
      car-wash-mapper/src/main/resources/mappers/miniapp/InvoiceMapper.xml
  51. 0 26
      car-wash-mapper/src/main/resources/mappers/miniapp/InvoiceTitleMapper.xml
  52. 0 279
      car-wash-miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java
  53. 0 88
      car-wash-miniapp/src/main/java/com/kym/miniapp/controller/InvoiceController.java
  54. 0 166
      car-wash-miniapp/src/main/java/com/kym/miniapp/jobs/StartChargeDelayJob.java
  55. 0 144
      car-wash-miniapp/src/main/java/com/kym/miniapp/jobs/StopChargeDelayJob.java
  56. 0 16
      car-wash-service/src/main/java/com/kym/service/admin/EquipmentInfoService.java
  57. 0 18
      car-wash-service/src/main/java/com/kym/service/admin/EquipmentRelationService.java
  58. 0 26
      car-wash-service/src/main/java/com/kym/service/admin/InvoiceDetailService.java
  59. 0 51
      car-wash-service/src/main/java/com/kym/service/admin/StationService.java
  60. 6 15
      car-wash-service/src/main/java/com/kym/service/admin/impl/ActivityServiceImpl.java
  61. 0 104
      car-wash-service/src/main/java/com/kym/service/admin/impl/ConnectorInfoServiceImpl.java
  62. 0 20
      car-wash-service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java
  63. 0 30
      car-wash-service/src/main/java/com/kym/service/admin/impl/EquipmentRelationServiceImpl.java
  64. 0 144
      car-wash-service/src/main/java/com/kym/service/admin/impl/InvoiceDetailServiceImpl.java
  65. 0 321
      car-wash-service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java
  66. 2 32
      car-wash-service/src/main/java/com/kym/service/cache/KymCache.java
  67. 0 22
      car-wash-service/src/main/java/com/kym/service/enplus/EnNotifyService.java
  68. 0 32
      car-wash-service/src/main/java/com/kym/service/enplus/EnPlusService.java
  69. 0 350
      car-wash-service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java
  70. 0 338
      car-wash-service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java
  71. 0 39
      car-wash-service/src/main/java/com/kym/service/jobs/DelayService.java
  72. 0 54
      car-wash-service/src/main/java/com/kym/service/jobs/DelayedItem.java
  73. 0 35
      car-wash-service/src/main/java/com/kym/service/miniapp/ChargeService.java
  74. 0 3
      car-wash-service/src/main/java/com/kym/service/miniapp/CollectService.java
  75. 0 32
      car-wash-service/src/main/java/com/kym/service/miniapp/InvoiceService.java
  76. 0 16
      car-wash-service/src/main/java/com/kym/service/miniapp/InvoiceTitleService.java
  77. 0 558
      car-wash-service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java
  78. 0 26
      car-wash-service/src/main/java/com/kym/service/miniapp/impl/CollectServiceImpl.java
  79. 0 172
      car-wash-service/src/main/java/com/kym/service/miniapp/impl/InvoiceServiceImpl.java
  80. 0 20
      car-wash-service/src/main/java/com/kym/service/miniapp/impl/InvoiceTitleServiceImpl.java
  81. 0 25
      car-wash-service/src/main/java/com/kym/service/wechat/WxPayService.java
  82. 6 383
      car-wash-service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

+ 0 - 92
car-wash-admin/src/main/java/com/kym/admin/controller/TestController.java

@@ -1,92 +0,0 @@
-package com.kym.admin.controller;
-
-import com.kym.common.R;
-import com.kym.common.utils.wx.WxPbUtil;
-import com.kym.entity.miniapp.UserCoupon;
-import com.kym.service.mq.producer.UserCouponSender;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.bean.result.WxMpUser;
-import me.chanjar.weixin.mp.bean.result.WxMpUserList;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-@RestController
-@RequestMapping("/test")
-public class TestController {
-
-
-    private final UserCouponSender userCouponSender;
-
-    private final WxMpService wxMpService;
-
-    public TestController(UserCouponSender userCouponSender, WxMpService wxMpService) {
-
-        this.userCouponSender = userCouponSender;
-        this.wxMpService = wxMpService;
-    }
-
-    /**
-     * 测试rabbitmq
-     *
-     * @return
-     */
-    @GetMapping(value = "/test")
-    R<?> test() {
-        for (int i = 0; i < 10; i++) {
-            var userCoupon = new UserCoupon().setUserId(i + 1L);
-            userCouponSender.sendMessage(userCoupon);
-        }
-        return R.success();
-    }
-
-    /**
-     * 测试公众号消息
-     *
-     * @return
-     */
-    @GetMapping(value = "/test2")
-    R<?> test2() {
-        // 通过unionid获取公众号openid
-
-        var params = Map.of(
-                "character_string2.DATA", "order111222333",
-                "thing9.DATA", "测试站点",
-                "character_string3.DATA", "SN0001",
-                "time4.DATA", "2024-07-29 12:00:00"
-        );
-        WxPbUtil.sendPublicTemplateMessage("", "SjszYYiHcN-GaEeZTKJsCcB6ACxYJWfTddkSywf1q1g", params, "", "");
-        return R.success();
-    }
-
-    /**
-     * 测试拉取公众号关注者列表
-     * @return
-     */
-    @GetMapping(value = "/test3")
-    R<?> test3() throws WxErrorException {
-        // 获取公众号所有关注者列表
-        WxMpUserList wxUserList = wxMpService.getUserService().userList();
-        // 通过unionid获取公众号openid
-        String lang = "zh_CN";
-        var unionid2openid = new HashMap<>();
-        wxUserList.getOpenids().forEach(openid -> {
-            try {
-                WxMpUser mpUser = wxMpService.getUserService().userInfo(openid,lang);
-                unionid2openid.put(mpUser.getUnionId(),openid);
-            } catch (WxErrorException e) {
-                throw new RuntimeException(e);
-            }
-        });
-
-
-        return R.success(wxUserList);
-    }
-
-
-}

+ 0 - 21
car-wash-common/src/main/java/com/kym/common/config/EnPlusConfig.java

@@ -1,21 +0,0 @@
-package com.kym.common.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-
-@Data
-@Configuration("EnPlusConfig")
-@ConfigurationProperties(prefix = "en-plus")
-public class EnPlusConfig {
-    private String operatorId;
-    private String operatorSecret;
-    private String dataSecret;
-    private String dataSecretIv;
-    private String sigSecret;
-    private int chargeMinAmount;
-    private String apiDomain;
-    private String sass;
-    private String sassClose;
-}

+ 0 - 28
car-wash-common/src/main/java/com/kym/common/config/WxFapiaoConfig.java

@@ -1,28 +0,0 @@
-package com.kym.common.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author skyline
- * @description 微信发票
- * @date 2023-07-22 23:09
- */
-@Data
-@Configuration
-@ConfigurationProperties(prefix = "wechat.fapiao")
-public class WxFapiaoConfig {
-
-    private String baseInformation;
-    private String taxCodes;
-    private String fapiaoApplications;
-    private String notifyUrl;
-    private String devConfig;
-    private String fapiaoFiles;
-    private String queryFapiao;
-    private String titleUrl;
-    private String userTitle;
-    private String cardTemplate;
-
-}

+ 0 - 45
car-wash-common/src/main/java/com/kym/common/enums/EnPlusApi.java

@@ -1,45 +0,0 @@
-package com.kym.common.enums;
-
-import cn.hutool.extra.spring.SpringUtil;
-import com.kym.common.config.EnPlusConfig;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-
-/**
- * @author skyline
- * @description EN+接口
- * @date 2023-07-29 12:33
- */
-@AllArgsConstructor
-@Getter
-public enum EnPlusApi implements Api {
-
-    // 认证-获取token
-    EN_PLUS_QUERY_TOKEN(Constants.DOMAIN + "query_token", RequestMethod.POST), //获取AccessToken
-
-    // 站点
-    EN_PLUS_QUERY_STATION_INFO(Constants.DOMAIN + "query_stations_info", RequestMethod.POST), // 站点信息
-    EN_PLUS_QUERY_STATION_STATUS(Constants.DOMAIN + "query_station_status", RequestMethod.POST), // 站点状态
-    EN_PLUS_QUERY_STATION_STATS(Constants.DOMAIN + "query_station_stats", RequestMethod.POST), // 站点统计
-    //充电
-    EN_PLUS_QUERY_EQUIP_AUTH(Constants.DOMAIN + "query_equip_auth", RequestMethod.POST), // 请求设备认证
-    EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY(Constants.DOMAIN + "query_equip_business_policy", RequestMethod.POST), // 查询业务策略信息
-    EN_PLUS_QUERY_START_CHARGE(Constants.DOMAIN + "query_start_charge", RequestMethod.POST), // 查询启动充电
-    EN_PLUS_QUERY_STOP_CHARGE(Constants.DOMAIN + "query_stop_charge", RequestMethod.POST), // 请求停止充电
-    EN_PLUS_QUERY_EQUIP_CHARGE_STATUS(Constants.DOMAIN + "query_equip_charge_status", RequestMethod.POST), // 查询设备充电状态
-
-    //微信
-    WX_MP_GET_PHONE("", RequestMethod.POST), // 获取手机号
-    WX_GET_ACCESS_TOKEN("", RequestMethod.POST); // 获取AccessToken
-
-    private final String api;
-    private final RequestMethod requestMethod;
-
-
-    private static class Constants {
-        static EnPlusConfig config = SpringUtil.getBean("EnPlusConfig");
-        private static final String DOMAIN = config.getApiDomain();
-    }
-}

+ 1 - 2
car-wash-common/src/main/java/com/kym/common/handler/ResponseResultHandler.java

@@ -1,7 +1,6 @@
 package com.kym.common.handler;
 
 import com.kym.common.R;
-import com.kym.entity.enplus.response.EnResponse;
 import org.springframework.core.MethodParameter;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
@@ -36,7 +35,7 @@ public class ResponseResultHandler implements ResponseBodyAdvice {
                                   Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
 
         // 响应给en+,微信的信息不做处理
-        if (body instanceof R<?> || body instanceof EnResponse || body instanceof ResponseEntity) {
+        if (body instanceof R<?> || body instanceof ResponseEntity) {
             return body;
         } else if (body == null) {
             return R.success();

+ 0 - 133
car-wash-common/src/main/java/com/kym/common/utils/AESUtil.java

@@ -1,133 +0,0 @@
-package com.kym.common.utils;
-
-
-import com.kym.common.config.EnPlusConfig;
-import org.apache.tomcat.util.codec.binary.Base64;
-import org.springframework.stereotype.Component;
-
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import java.security.SecureRandom;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * @author skyline
- * @description AES加解密工具
- * @date 2023-07-30 01:41
- */
-@Component
-public class AESUtil {
-
-    //编码方式
-    public static final String CODE_TYPE = "UTF-8";
-    //AES:加密方式   CBC:工作模式   PKCS5Padding:填充模式
-    private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";
-    private static final String AES = "AES";
-
-
-    static EnPlusConfig config;
-
-    public AESUtil(EnPlusConfig config) {
-        AESUtil.config = config;
-    }
-
-    /**
-     * AES 加密操作
-     *
-     * @param content 待加密内容
-     * @return 返回Base64转码后的加密数据
-     */
-    public static String encrypt(String content) {
-
-        if (content == null || "".equals(content)) {
-            return content;
-        }
-
-        try {
-            /*
-             * 新建一个密码编译器的实例,由三部分构成,用"/"分隔,分别代表如下
-             * 1. 加密的类型(如AES,DES,RC2等)
-             * 2. 模式(AES中包含ECB,CBC,CFB,CTR,CTS等)
-             * 3. 补码方式(包含nopadding/PKCS5Padding等等)
-             * 依据这三个参数可以创建很多种加密方式
-             */
-            Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
-
-            //偏移量
-            IvParameterSpec zeroIv = new IvParameterSpec(config.getDataSecretIv().getBytes(CODE_TYPE));
-
-            byte[] byteContent = content.getBytes(CODE_TYPE);
-
-            //使用加密秘钥
-            SecretKeySpec skeySpec = new SecretKeySpec(config.getDataSecret().getBytes(CODE_TYPE), AES);
-            //SecretKeySpec skeySpec = getSecretKey(key);
-
-            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, zeroIv);// 初始化为加密模式的密码器
-
-            byte[] result = cipher.doFinal(byteContent);// 加密
-
-            return Base64.encodeBase64String(result);//通过Base64转码返回
-        } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
-        }
-
-        return null;
-
-    }
-
-    /**
-     * AES 解密操作
-     *
-     * @param content
-     * @return
-     */
-    public static String decrypt(String content) {
-        if (content == null || "".equals(content)) {
-            return content;
-        }
-
-        try {
-            //实例化
-            Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
-            IvParameterSpec zeroIv = new IvParameterSpec(config.getDataSecretIv().getBytes(CODE_TYPE));
-
-            SecretKeySpec skeySpec = new SecretKeySpec(config.getDataSecret().getBytes(CODE_TYPE), AES);
-            //SecretKeySpec skeySpec = getSecretKey(key);
-            cipher.init(Cipher.DECRYPT_MODE, skeySpec, zeroIv);
-
-            byte[] result = cipher.doFinal(Base64.decodeBase64(content));
-
-            return new String(result, CODE_TYPE);
-        } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
-        }
-
-        return null;
-    }
-
-    /**
-     * 生成加密秘钥
-     *
-     * @return
-     */
-    private static SecretKeySpec getSecretKey(final String key) {
-        //返回生成指定算法密钥生成器的 KeyGenerator 对象
-        KeyGenerator kg;
-        try {
-            kg = KeyGenerator.getInstance(AES);
-            //AES 要求密钥长度为 128
-            kg.init(128, new SecureRandom(key.getBytes()));
-            //生成一个密钥
-            SecretKey secretKey = kg.generateKey();
-            // 转换为AES专用密钥
-            return new SecretKeySpec(secretKey.getEncoded(), AES);
-        } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        return null;
-    }
-}

+ 0 - 113
car-wash-entity/src/main/java/com/kym/entity/admin/InvoiceDetail.java

@@ -1,113 +0,0 @@
-package com.kym.entity.admin;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.kym.entity.BaseEntity;
-import com.kym.entity.typehandle.InvoiceDetailBuyerInformationTypeHandle;
-import com.kym.entity.typehandle.InvoiceDetailSellerInformationTypeHandle;
-import com.kym.entity.wechat.FaPiao;
-import com.kym.entity.wechat.FapiaoApplications;
-import com.kym.entity.wechat.InvoiceBaseInfo;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-/**
- * <p>
- * 发票详情表
- * </p>
- *
- * @author skyline
- * @since 2024-03-19
- */
-@Getter
-@Setter
-@TableName(schema = "charge_admin",value = "t_invoice_detail",autoResultMap = true)
-@Accessors(chain = true)
-public class InvoiceDetail extends BaseEntity {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 微信发票申请id
-     */
-    private String applyId;
-
-    /**
-     * 开票时间
-     */
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime fapiaoTime;
-
-    /**
-     * 发票状态:ISSUE_ACCEPTED-开票申请已受理,ISSUED-发票已开具,REVERSE_ACCEPTED-冲红申请已受理,REVERSED-发票已冲红
-     */
-    private String status;
-
-    /**
-     * 蓝票
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private FapiaoApplications.FapiaoInfo blueFapiao;
-
-    /**
-     * 红票
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Object redFapiao;
-
-    /**
-     * 卡包信息
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Object cardInformation;
-
-    /**
-     * 总开票金额(分)
-     */
-    private Integer totalAmount;
-
-    /**
-     * 税额(分)
-     */
-    private Integer taxAmount;
-
-    /**
-     * 不含税金额(分)
-     */
-    private Integer amount;
-
-    /**
-     * 售卖方信息
-     */
-    @TableField(typeHandler = InvoiceDetailSellerInformationTypeHandle.class)
-    private InvoiceBaseInfo.SellerInfo sellerInformation;
-
-    /**
-     * 购买方信息
-     */
-    @TableField(typeHandler = InvoiceDetailBuyerInformationTypeHandle.class)
-    private FaPiao.BuyerInformation buyerInformation;
-
-    /**
-     * 扩展信息
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Object extraInformation;
-
-    /**
-     * 发票明细
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private List<FapiaoApplications.FapiaoItem> items;
-
-    /**
-     * 备注
-     */
-    private String remark;
-}

+ 0 - 172
car-wash-entity/src/main/java/com/kym/entity/admin/vo/LocalStationVo.java

@@ -1,172 +0,0 @@
-package com.kym.entity.admin.vo;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.kym.entity.BaseEntity;
-import com.kym.entity.admin.Activity;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.enplus.EnEquipmentInfo;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * <p>
- * 本地充电站信息
- * </p>
- *
- * @author skyline
- * @since 2023-08-12
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class LocalStationVo extends BaseEntity implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-
-    /**
-     * 电站组id
-     */
-    private Long groupId;
-
-    /**
-     * en+充电站id
-     */
-    private String stationId;
-
-    /**
-     * en+运营商id
-     */
-    private String operatorId;
-
-    /**
-     * 设备所属运营平台组织机构代码
-     */
-    private String equipmentOwnerId;
-
-    /**
-     * 站点名称
-     */
-    private String stationName;
-
-    /**
-     * 充电中国家代码:CN
-     */
-    private String countryCode;
-
-    /**
-     * 充电站省市辖区编码
-     */
-    private String areaCode;
-
-    /**
-     * 地址
-     */
-    private String address;
-
-    /**
-     * 站点电话
-     */
-    private String stationTel;
-
-    /**
-     * 服务电话
-     */
-    private String serviceTel;
-
-    /**
-     * 站点类型:1:公共 50:个人 100:公交(专业)101:环卫(专用)102:物流(专用)103:出租车(专用)255:其他
-     */
-    private Integer stationType;
-
-    /**
-     * 站点状态:0:未知 1:建设中 5:关闭下线 6:维护中 50:正常使用
-     */
-    private Integer stationStatus;
-
-    /**
-     * 充电车位数量
-     */
-    private Integer parkingNum;
-
-    /**
-     * 充电桩位置坐标
-     * <p>
-     * FastjsonTypeHandler
-     * 支持 MVC JSON 解析
-     * 不支持 MySQL JSON 解析
-     * <p>
-     * JacksonTypeHandler
-     * 支持 MVC JSON 解析
-     * 支持 MySQL JSON 解析
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private JSONObject location;
-    /**
-     * 站点引导
-     */
-    private String siteGuide;
-    /**
-     * 建设场所:1:居民区 2:公共机构 3:企事业单位 4:写字楼 5:工业园区 6:交通枢纽 7:大型文体设施 8:城市绿地 9:大型建筑配建停车场 10:路边停车位 11:城际高速服务区 255:其他
-     */
-    private Integer construction;
-    /**
-     * 站点照片
-     */
-    private String pictures;
-    /**
-     * 使用车型描述
-     */
-    private String matchCars;
-    /**
-     * 车位楼层及数量描述
-     */
-    private String parkInfo;
-    /**
-     * 营业时间描述
-     */
-    private String businessHours;
-    /**
-     * 充电费描述
-     */
-    private String electricityFee;
-    /**
-     * 服务费率描述
-     */
-    private String serviceFee;
-    /**
-     * 停车费
-     */
-    private String parkFee;
-    /**
-     * 支付方式:刷卡、线上、现金(电子钱包类卡为刷卡、身份鉴权卡、微信/支付宝、APP为线上)
-     */
-    private String payment;
-    /**
-     * 是否支持预约:0:不支持 1:支持
-     */
-    private Integer supportOrder;
-    /**
-     * 备注
-     */
-    private String remark;
-
-    /**
-     * 充电设备信息列表
-     */
-    private List<EquipmentInfo> equipmentInfos;
-    /**
-     * 站点活动
-     */
-    private List<Activity> activityList;
-
-}

+ 0 - 200
car-wash-entity/src/main/java/com/kym/entity/admin/vo/StationVo.java

@@ -1,200 +0,0 @@
-package com.kym.entity.admin.vo;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.kym.entity.BaseEntity;
-import com.kym.entity.admin.Activity;
-import com.kym.entity.enplus.EnEquipmentInfo;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * <p>
- * 充电站信息
- * </p>
- *
- * @author skyline
- * @since 2023-08-12
- */
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-public class StationVo extends BaseEntity implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 电站组id
-     */
-    private Long groupId;
-
-    /**
-     * en+充电站id
-     */
-    @JSONField(name = "StationID")
-    private String stationId;
-
-    /**
-     * en+运营商id
-     */
-    @JSONField(name = "OperatorID")
-    private String operatorId;
-
-    /**
-     * 设备所属运营平台组织机构代码
-     */
-    @JSONField(name = "EquipmentOwnerID")
-    private String equipmentOwnerId;
-
-    /**
-     * 站点名称
-     */
-    @JSONField(name = "StationName")
-    private String stationName;
-
-    /**
-     * 充电中国家代码:CN
-     */
-    @JSONField(name = "CountryCode")
-    private String countryCode;
-
-    /**
-     * 充电站省市辖区编码
-     */
-    @JSONField(name = "AreaCode")
-    private String areaCode;
-
-    /**
-     * 地址
-     */
-    @JSONField(name = "Address")
-    private String address;
-
-    /**
-     * 站点电话
-     */
-    @JSONField(name = "StationTel")
-    private String stationTel;
-
-    /**
-     * 服务电话
-     */
-    @JSONField(name = "ServiceTel")
-    private String serviceTel;
-
-    /**
-     * 站点类型:1:公共 50:个人 100:公交(专业)101:环卫(专用)102:物流(专用)103:出租车(专用)255:其他
-     */
-    @JSONField(name = "StationType")
-    private Integer stationType;
-
-    /**
-     * 站点状态:0:未知 1:建设中 5:关闭下线 6:维护中 50:正常使用
-     */
-    @JSONField(name = "StationStatus")
-    private Integer stationStatus;
-
-    /**
-     * 充电车位数量
-     */
-    @JSONField(name = "ParkNums")
-    private Integer parkingNum;
-
-    /**
-     * 充电桩位置坐标
-     * <p>
-     * FastjsonTypeHandler
-     * 支持 MVC JSON 解析
-     * 不支持 MySQL JSON 解析
-     * <p>
-     * JacksonTypeHandler
-     * 支持 MVC JSON 解析
-     * 支持 MySQL JSON 解析
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private JSONObject location;
-    /**
-     * 站点引导
-     */
-    @JSONField(name = "SiteGuide")
-    private String siteGuide;
-    /**
-     * 建设场所:1:居民区 2:公共机构 3:企事业单位 4:写字楼 5:工业园区 6:交通枢纽 7:大型文体设施 8:城市绿地 9:大型建筑配建停车场 10:路边停车位 11:城际高速服务区 255:其他
-     */
-    @JSONField(name = "Construction")
-    private Integer construction;
-    /**
-     * 站点照片
-     */
-    private String pictures;
-    /**
-     * 使用车型描述
-     */
-    @JSONField(name = "MatchCars")
-    private String matchCars;
-    /**
-     * 车位楼层及数量描述
-     */
-    @JSONField(name = "ParkInfo")
-    private String parkInfo;
-    /**
-     * 营业时间描述
-     */
-    @JSONField(name = "BusineHours")
-    private String businessHours;
-    /**
-     * 充电费描述
-     */
-    @JSONField(name = "ElectricityFee")
-    private String electricityFee;
-    /**
-     * 服务费率描述
-     */
-    @JSONField(name = "ServiceFee")
-    private String serviceFee;
-    /**
-     * 停车费
-     */
-    @JSONField(name = "ParkFee")
-    private String parkFee;
-    /**
-     * 支付方式:刷卡、线上、现金(电子钱包类卡为刷卡、身份鉴权卡、微信/支付宝、APP为线上)
-     */
-    @JSONField(name = "Payment")
-    private String payment;
-    /**
-     * 是否支持预约:0:不支持 1:支持
-     */
-    @JSONField(name = "SupportOrder")
-    private Integer supportOrder;
-    /**
-     * 备注
-     */
-    @JSONField(name = "Remark")
-    private String remark;
-
-    /**
-     * 充电设备信息列表
-     */
-    @TableField(exist = false)
-    private List<EnEquipmentInfo> equipmentInfos;
-    /**
-     * 站点活动
-     */
-    @TableField(exist = false)
-    private List<Activity> activityList;
-
-    @JSONCreator
-    public StationVo(@JSONField(name = "StationLng") Double lng, @JSONField(name = "StationLat") Double lat, @JSONField(name = "EquipmentInfos") JSONArray array) {
-        this.location = JSONObject.of("stationLng", lng, "stationLat", lat);
-        this.equipmentInfos = array.toJavaList(EnEquipmentInfo.class);
-    }
-}

+ 0 - 38
car-wash-entity/src/main/java/com/kym/entity/enplus/EnChargeDetails.java

@@ -1,38 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * @author skyline
- * @description 充电明细信息体
- * @date 2023-08-03 16:32
- */
-@Data
-public class EnChargeDetails {
-    private String DetailStartTime;
-    private String DetailEndTime;
-    /**
-     * 时段电价
-     */
-    private BigDecimal ElecPrice;
-    /**
-     * 时段服务费价格
-     */
-    private BigDecimal ServicePrice;
-
-    /**
-     * 时段充电量(度)
-     */
-    private BigDecimal DetailPower;
-
-    /**
-     * 时段电费
-     */
-    private BigDecimal DetailElecMoney;
-    /**
-     * 时段服务费
-     */
-    private BigDecimal DetailServiceMoney;
-}

+ 0 - 26
car-wash-entity/src/main/java/com/kym/entity/enplus/EnChargeOrder.java

@@ -1,26 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * @author skyline
- * @description 单项订单对账信息体
- * @date 2023-08-04 10:29
- */
-@Data
-public class EnChargeOrder {
-    /**
-     * 充电订单号
-     */
-    private String StartChargeSeq;
-    /**
-     * 累积充电量
-     */
-    private BigDecimal TotalPower;
-    /**
-     * 累积总金额
-     */
-    private BigDecimal TotalMoney;
-}

+ 0 - 33
car-wash-entity/src/main/java/com/kym/entity/enplus/EnCheckOrderSeq.java

@@ -1,33 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 推送订单对账信息
- * @date 2023-08-04 10:25
- */
-@Data
-public class EnCheckOrderSeq {
-
-    private String CheckOrderSeq;
-    private String StartTime;
-    private String EndTime;
-    /**
-     * 订单数量N
-     */
-    private int OrderCount;
-    /**
-     * 总电量
-     */
-    private BigDecimal TotalOrderPower;
-    /**
-     * 总金额
-     */
-    private BigDecimal TotalOrderMoney;
-    private List<EnChargeOrder> ChargeOrders;
-
-}

+ 0 - 73
car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorInfo.java

@@ -1,73 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.baomidou.mybatisplus.annotation.TableField;
-import lombok.Data;
-
-/**
- * @author skyline
- * @description 充电设备接口信息
- * @date 2023-07-31 15:30
- */
-@Data
-public class EnConnectorInfo {
-    /**
-     * 充电设备接口编码
-     */
-    @JSONField(name = "ConnectorID")
-    private String connectorId;
-
-    /**
-     * 充电设备接口名称
-     */
-    @JSONField(name = "ConnectorName")
-    private String connectorName;
-    /**
-     * 充电设备接口类型
-     * 1:家用插座(模式2)
-     * 2:交流接口插座(模式3,连接方式B)
-     * 3:交流接口插头(带枪线,模式3,连接方式C)
-     * 4:直流接口枪头(带枪线,模式4)
-     * 5:无线充电桩
-     * 6:其他
-     */
-    @JSONField(name = "ConnectorType")
-    private int connectorType;
-
-    /**
-     * 额定电压上限(V)
-     */
-    @JSONField(name = "VoltageUpperLimits")
-    private int voltageUpperLimits;
-
-    /**
-     * 额定电压下限(V)
-     */
-    @JSONField(name = "voltageLowerLimits")
-    private int voltageLowerLimits;
-    /**
-     * 额定电流(A)
-     */
-    @JSONField(name = "Current")
-    private int current;
-
-    /**
-     * 额定功率(KW)
-     */
-    @JSONField(name = "Power")
-    private double power;
-
-    /**
-     * 停车场车位编号
-     */
-    @JSONField(name = "ParkNo")
-    private String parkNo;
-    /**
-     * 国家标准
-     * 1:2011
-     * 2:2015
-     */
-    @JSONField(name = "NationalStandard")
-    private int nationalStandard;
-
-}

+ 0 - 28
car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorStatsInfo.java

@@ -1,28 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-/**
- * @author skyline
- * @description 充电设备接口统计信息
- * @date 2023-07-31 16:15
- */
-@Data
-public class EnConnectorStatsInfo {
-
-    /**
-     * 充电设备接口编码
-     * 充电设备接口编码,同一运营商内唯一
-     */
-    @JSONField(name = "ConnectorID")
-    private String connectorId;
-    /**
-     * 充电设备接口累计电量(kWh,精度0.1)
-     */
-    @JSONField(name = "ConnectorElectricity")
-    private BigDecimal connectorElectricity;
-
-}

+ 0 - 45
car-wash-entity/src/main/java/com/kym/entity/enplus/EnConnectorStatusInfo.java

@@ -1,45 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-
-/**
- * @author skyline
- * @description
- * @date 2023-07-31 15:40
- */
-@Data
-public class EnConnectorStatusInfo {
-    /**
-     * 充电设备接口编码
-     */
-    @JSONField(name = "ConnectorID")
-    private String connectorId;
-    /**
-     * 充电设备接口状态
-     * 0:离网
-     * 1:空闲
-     * 2:占用(未充电)
-     * 3:占用(充电中)
-     * 4:占用(预约锁定)
-     * 255:故障
-     */
-    @JSONField(name = "Status")
-    private Integer status;
-    /**
-     * 车位状态
-     * 0:未知
-     * 10:空闲
-     * 50:占用
-     */
-    @JSONField(name = "ParkStatus")
-    private Integer parkStatus;
-    /**
-     * 地锁状态
-     * 0:未知
-     * 10:已解锁
-     * 50:已上锁
-     */
-    @JSONField(name = "LockStatus")
-    private Integer lockStatus;
-}

+ 0 - 97
car-wash-entity/src/main/java/com/kym/entity/enplus/EnEquipmentInfo.java

@@ -1,97 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 充电设备信息
- * @date 2023-07-31 15:21
- */
-@Data
-@Accessors(chain = true)
-public class EnEquipmentInfo {
-
-    /**
-     * 设备编码
-     */
-    @JSONField(name = "EquipmentID")
-    private String equipmentId;
-
-    /**
-     * 充电桩短ID
-     */
-    private String shortId;
-
-    /**
-     * 车位编号
-     */
-    private String parkingNo;
-
-    /**
-     * 设备生产商组织机构代码
-     */
-    @JSONField(name = "ManufacturerID")
-    private String manufacturerId;
-
-    /**
-     * 设备生产商名称
-     */
-    @JSONField(name = "ManufacturerName")
-    private String manufacturerName;
-
-    /**
-     * 设备型号
-     */
-    @JSONField(name = "EquipmentModel")
-    private String equipmentModel;
-
-    /**
-     * 设备生产日期(YYYY-MM-DD)
-     */
-    @JSONField(name = "ProductionDate")
-    private String productionDate;
-
-    /**
-     * 设备类型
-     * 1:直流设备
-     * 2:交流设备
-     * 3:交直流一体设备
-     * 4:无线设备
-     * 5:其他
-     */
-    @JSONField(name = "EquipmentType")
-    private Integer equipmentType;
-
-    /**
-     * 充电设备接口信息列表
-     */
-    private List<EnConnectorInfo> connectorInfos;
-
-    /**
-     * 充电桩坐标
-     */
-    private JSONObject location;
-
-    /**
-     * 充电设备总功率
-     */
-    @JSONField(name = "Power")
-    private Double power;
-
-    @JSONCreator
-    public EnEquipmentInfo(@JSONField(name = "ConnectorInfos") JSONArray array,
-                           @JSONField(name = "EquipmentLng") float equipmentLng,
-                           @JSONField(name = "EquipmentLat") float equipmentLat) {
-        this.connectorInfos = array.toJavaList(EnConnectorInfo.class);
-        this.location = JSONObject.of("equipmentLng", equipmentLng, "equipmentLat", equipmentLat);
-    }
-
-
-}

+ 0 - 30
car-wash-entity/src/main/java/com/kym/entity/enplus/EnEquipmentStatsInfo.java

@@ -1,30 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 充电设备统计信息
- * @date 2023-07-31 16:10
- */
-@Data
-public class EnEquipmentStatsInfo {
-    /**
-     * 设备编码
-     * 设备唯一编码,对同一运营商,保证唯一
-     */
-    @JSONField(name = "EquipmentID")
-    private String equipmentId;
-    /**
-     * 充电设别接口累计电量
-     */
-    @JSONField(name = "equipmentElectricity")
-    private Double EquipmentElectricity;
-    @JSONField(name = "ConnectorStatsInfos")
-    private List<EnConnectorStatsInfo> connectorStatsInfos;
-
-}

+ 0 - 53
car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationChargeOrderInfo.java

@@ -1,53 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 推送充电订单信息
- * @date 2023-08-04 10:12
- */
-@Data
-public class EnNotificationChargeOrderInfo {
-    private String StartChargeSeq;
-    private String ConnectorID;
-    private String StartTime;
-    private String EndTime;
-    /**
-     * 累积充电量
-     */
-    private BigDecimal TotalPower;
-
-    /**
-     * 总电费
-     */
-    private BigDecimal TotalElecMoney;
-    /**
-     * 总服务费
-     */
-    private BigDecimal TotalServiceMoney;
-    /**
-     * 累积总金额
-     */
-    private BigDecimal TotalMoney;
-    /**
-     * 充电结束原因
-     * 0:用户手动停止充电
-     * 1:客户归属地运营商平台停止充电
-     * 2:BMS停止充电
-     * 3:充电机设备故障
-     * 4:连接器断开
-     * 5~99:自定义
-     */
-    private int StopReason;
-    /**
-     * 时段数N 范围0~32
-     */
-    private int SumPeriod;
-    private List<EnChargeDetails> ChargeDetails;
-
-
-}

+ 0 - 74
car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationEquipChargeStatus.java

@@ -1,74 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 推送充电状态
- * @date 2023-08-03 16:22
- */
-@Data
-public class EnNotificationEquipChargeStatus {
-
-    private String StartChargeSeq;
-
-    /**
-     * 充电订单状态
-     * 1:启动中
-     * 2:充电中
-     * 3:停止中
-     * 4:已结束
-     * 5:未知
-     */
-    private int StartChargeSeqStat;
-
-    /**
-     * 充电设备接口状态
-     * 1:空闲
-     * 2:占用(未充电)
-     * 3:占用(充电中)
-     * 4:占用(预约锁定)
-     * 255:故障
-     */
-    private String ConnectorStatus;
-
-    private BigDecimal CurrentA;
-    private BigDecimal CurrentB;
-    private BigDecimal CurrentC;
-
-    private BigDecimal VoltageA;
-    private BigDecimal VoltageB;
-    private BigDecimal VoltageC;
-
-    private BigDecimal Soc;
-    private String StartTime;
-    private String EndTime;
-
-    /**
-     * 累积充电量
-     */
-    private BigDecimal TotalPower;
-    /**
-     * 累积电费
-     */
-    private BigDecimal ElecMoney;
-    /**
-     * 累积服务费
-     */
-    private BigDecimal ServiceMoney;
-    /**
-     * 累积总金额
-     */
-    private BigDecimal TotalMoney;
-    /**
-     * 时段数N 范围0~32
-     */
-    private int SumPeriod;
-
-    private List<EnChargeDetails> ChargeDetails;
-
-
-}

+ 0 - 41
car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationStartChargeResult.java

@@ -1,41 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-/**
- * @author skyline
- * @description 推送停止充电结果
- * @date 2023-08-04 10:05
- */
-@Data
-public class EnNotificationStartChargeResult {
-
-    /**
-     * 充电订单号
-     */
-    private String StartChargeSeq;
-    /**
-     * 充电订单状态
-     * 1:启动中
-     * 2:充电中
-     * 3:停止中
-     * 4:已结束
-     * 5:未知
-     */
-    private int StartChargeSeqStat;
-
-    /**
-     * 充电设备接口编码
-     */
-    private String ConnectorID;
-
-    /**
-     * 充电启动时间
-     */
-    private String StartTime;
-
-    /**
-     * 启动充电时收到的验证码,用于充电桩手动停止充电
-     */
-    private String IdentCode;
-}

+ 0 - 48
car-wash-entity/src/main/java/com/kym/entity/enplus/EnNotificationStopChargeResult.java

@@ -1,48 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-/**
- * @author skyline
- * @description 推送停止充电结果
- * @date 2023-08-04 10:05
- */
-@Data
-public class EnNotificationStopChargeResult {
-
-    /**
-     * 充电订单号
-     */
-    private String StartChargeSeq;
-    /**
-     * 充电订单状态
-     * 1:启动中
-     * 2:充电中
-     * 3:停止中
-     * 4:已结束
-     * 5:未知
-     */
-    private int StartChargeSeqStat;
-
-    /**
-     * 充电设备接口编码
-     */
-    private String ConnectorID;
-
-    /**
-     * 成功标识
-     * 0:成功
-     * 1:失败
-     */
-    private int SuccStat;
-
-    /**
-     * 停止失败原因
-     * 0:无
-     * 1:此设备不存在
-     * 2:此设备离线
-     * 3:设备已停止充电
-     * 4~99:自定义
-     */
-    private int FailReason;
-}

+ 0 - 43
car-wash-entity/src/main/java/com/kym/entity/enplus/EnPolicyInfo.java

@@ -1,43 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-
-/**
- * @author skyline
- * @description 分时费率
- * @date 2023-08-15 16:11
- */
-@Data
-public class EnPolicyInfo {
-    public final static String[] PRICE_PERIOD = {"谷", "平", "峰", "尖"};
-    /**
-     * 价格时段(尖峰平谷)
-     */
-    public String pricePeriod;
-    /**
-     * 时段开始时间点
-     */
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
-    private LocalTime startTime;
-    /**
-     * 时段电费 小数点后4位
-     */
-    @JSONField(name = "ElecPrice")
-    private Double elecPrice;
-    /**
-     * 时段服务费 小数点后4位
-     */
-    @JSONField(name = "SevicePrice")
-    private Double servicePrice;
-
-    @JSONCreator
-    EnPolicyInfo(@JSONField(name = "StartTime") String startTime) {
-        this.startTime = LocalTime.parse(startTime, DateTimeFormatter.ofPattern("HHmmss"));
-    }
-}

+ 0 - 39
car-wash-entity/src/main/java/com/kym/entity/enplus/EnRespQueryToken.java

@@ -1,39 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-/**
- * @author skyline
- * @description query_token 返回值
- * @date 2023-07-31 11:32
- */
-@Data
-public class EnRespQueryToken {
-    /**
-     * 运营商ID
-     */
-    private String OperatorID;
-    /**
-     * 成功状态
-     * 0:成功
-     * 1:失败
-     */
-    private int SuccStat;
-    /**
-     * 全局唯一凭证
-     */
-    private String AccessToken;
-    /**
-     * 凭证有效期(秒)
-     */
-    private int TokenAvailableTime;
-    /**
-     * 失败原因:
-     * 0:无
-     * 1:无此运营商
-     * 2:密钥错误
-     * 3~99:自定义
-     */
-    private String FailReason;
-
-}

+ 0 - 151
car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationInfo.java

@@ -1,151 +0,0 @@
-package com.kym.entity.enplus;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 充电站信息
- * @date 2023-07-31 14:55
- */
-@Data
-public class EnStationInfo {
-
-
-    /**
-     * 充电站ID
-     */
-    private String StationID;
-    /**
-     * 运营商ID
-     */
-    private String OperatorID;
-    /**
-     * 设备所属方ID
-     */
-    private String EquipmentOwnerID;
-    /**
-     * 充电站名称
-     */
-    private String StationName;
-    /**
-     * 充电站国家代码
-     */
-    private String CountryCode;
-    /**
-     * 充电站省市辖区码
-     */
-    private String AreaCode;
-    /**
-     * 详细地址(50字符)
-     */
-    private String Address;
-    /**
-     * 站点电话
-     */
-    private String StationTel;
-    /**
-     * 服务电话
-     */
-    private String ServiceTel;
-    /**
-     * 站点类型
-     * 1:公共
-     * 50:个人
-     * 100:公交(专用)
-     * 101:环卫(专用)
-     * 102:物流(专用)
-     * 103:出租车(专用)
-     * 255:其他
-     */
-    private int StationType;
-    /**
-     * 站点状态
-     * 0:未知
-     * 1:建设中
-     * 5:关闭下线
-     * 6:维护中
-     * 50:正常使用
-     */
-    private int StationStatus;
-    /**
-     * 车位数量
-     */
-    private int ParkNums;
-    /**
-     * 经度
-     */
-    private BigDecimal StationLng;
-    /**
-     * 纬度
-     */
-    private BigDecimal StationLat;
-    /**
-     * 站点引导(100字符)
-     */
-    private String SiteGuide;
-    /**
-     * 建设场所
-     * 1:居民区
-     * 2:公共机构
-     * 3:企事业单位
-     * 4:写字楼
-     * 5:工业园区
-     * 6:交通枢纽
-     * 7:大型问题设施
-     * 8:城市绿地
-     * 9:大型建筑配建停车场
-     * 10:路边停车位
-     * 11:城际高速服务区
-     * 255:其他
-     */
-    private int Construction;
-    /**
-     * 站点照片
-     */
-    private String[] Pictures;
-    /**
-     * 使用车型描述
-     */
-    private String MatchCars;
-    /**
-     * 车位楼层及数量描述
-     */
-    private String ParkInfo;
-    /**
-     * 营业时间描述
-     */
-    private String BusineHours;
-    /**
-     * 充电电费率
-     */
-    private String ElectricityFee;
-    /**
-     * 服务费率
-     */
-    private String ServiceFee;
-    /**
-     * 停车费
-     */
-    private String ParkFee;
-    /**
-     * 支付方式
-     */
-    private String Payment;
-    /**
-     * 是否支持预约
-     * 0:不支持
-     * 1:支持
-     */
-    private int SupportOrder;
-    /**
-     * 备注
-     */
-    private String Remark;
-    /**
-     * 充电设备信息列表
-     */
-    private List<EnEquipmentInfo> EquipmentInfos;
-}

+ 0 - 43
car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationStatsInfo.java

@@ -1,43 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 充电桩统计信息
- * @date 2023-07-31 16:02
- */
-@Data
-public class EnStationStatsInfo {
-    /**
-     * 充电站ID
-     */
-    @JSONField(name = "StationID")
-    private String stationId;
-    /**
-     * 统计开始时间(yyyy-MM-dd)
-     */
-    @JSONField(name = "StartTime")
-    private String startTime;
-    /**
-     * 统计结束时间(yyyy-MM-dd)
-     */
-    @JSONField(name = "EndTime")
-    private String endTime;
-    /**
-     * 充电站累积电量(kWh,精度0.1)
-     */
-    @JSONField(name = "StationElectricity")
-    private BigDecimal StationElectricity;
-
-    /**
-     * 充电设备统计信息列表
-     */
-    @JSONField(name = "EquipmentStatsInfos")
-    private List<EnEquipmentStatsInfo> equipmentStatsInfos;
-
-}

+ 0 - 33
car-wash-entity/src/main/java/com/kym/entity/enplus/EnStationStatusInfo.java

@@ -1,33 +0,0 @@
-package com.kym.entity.enplus;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description
- * @date 2023-07-31 16:00
- */
-@Data
-public class EnStationStatusInfo {
-    /**
-     * 充电站ID(20字符,运营商自定义的唯一编码,不足长度在前方补0)
-     */
-    @JSONField(name = "StationID")
-    private String stationId;
-
-    /**
-     * 充电设备接口状态列表
-     */
-    private List<EnConnectorStatusInfo> connectorStatusInfos;
-
-    @JSONCreator
-    public EnStationStatusInfo(@JSONField(name = "connectorStatusInfos") JSONArray infos) {
-        this.connectorStatusInfos = infos.toJavaList(EnConnectorStatusInfo.class);
-    }
-
-}

+ 0 - 67
car-wash-entity/src/main/java/com/kym/entity/enplus/response/EnBusinessPolicy.java

@@ -1,67 +0,0 @@
-package com.kym.entity.enplus.response;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.annotation.JSONCreator;
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.kym.entity.enplus.EnPolicyInfo;
-import lombok.Data;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author skyline
- * @description 设备策略信息
- * @date 2023-08-15 15:58
- */
-@Data
-public class EnBusinessPolicy {
-    /**
-     * 业务策略查询流水号
-     */
-    @JSONField(name = "EquipBizSeq")
-    private String equipBizSeq;
-    /**
-     * 充电设备接口编码
-     */
-    @JSONField(name = "ConnectorID")
-    private String connectorId;
-    /**
-     * 操作结果
-     * 0:失败
-     * 1:成功
-     */
-    @JSONField(name = "SuccStat")
-    private Integer succStat;
-    /**
-     * 失败原因
-     * 0:无
-     * 1:此充电桩业务策略不存在
-     */
-    @JSONField(name = "FailReason")
-    private Integer failReason;
-    /**
-     * 时段数N 0~32
-     */
-    @JSONField(name = "SumPeriod")
-    private Integer sumPeriod;
-    /**
-     * 单项业务策略信息
-     */
-    private List<EnPolicyInfo> policyInfos;
-
-    @JSONCreator
-    EnBusinessPolicy(@JSONField(name = "PolicyInfos") JSONArray array) {
-        this.policyInfos = array.toJavaList(EnPolicyInfo.class);
-        // 将尖峰平谷信息填入EnPolicyInfo中
-        var elecPriceSet = policyInfos.stream().map(EnPolicyInfo::getElecPrice).collect(Collectors.toSet()).stream().sorted().toList();
-        if (elecPriceSet.size() > 1) {
-            policyInfos = policyInfos.stream().peek(price -> price.setPricePeriod(EnPolicyInfo.PRICE_PERIOD[elecPriceSet.indexOf(price.getElecPrice())])).toList();
-        } else {
-            // 统一电价
-            policyInfos = policyInfos.stream().peek(price -> price.setPricePeriod("统")).toList();
-        }
-    }
-
-
-}

+ 0 - 32
car-wash-entity/src/main/java/com/kym/entity/enplus/response/EnResponse.java

@@ -1,32 +0,0 @@
-package com.kym.entity.enplus.response;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @author skyline
- * @description en+接口返回数据
- * @date 2023-07-31 11:59
- */
-@Data
-@NoArgsConstructor
-public class EnResponse {
-    @JsonProperty("Ret")
-    private int Ret;
-    @JsonProperty("Msg")
-    private String Msg;
-    @JsonProperty("Data")
-    private String Data;
-    @JsonProperty("Sig")
-    private String Sig;
-
-
-    public EnResponse(String data) {
-        this.Ret = 0;
-        this.Msg = "";
-        this.Data = data;
-        this.Sig = "";
-    }
-
-}

+ 0 - 135
car-wash-entity/src/main/java/com/kym/entity/miniapp/Invoice.java

@@ -1,135 +0,0 @@
-package com.kym.entity.miniapp;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.kym.entity.BaseEntity;
-import com.kym.entity.typehandle.InvoiceOrderDetailListTypeHandle;
-import com.kym.entity.wechat.InvoiceOrderDetail;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-
-import java.util.List;
-
-/**
- * <p>
- * 发票记录表
- * </p>
- *
- * @author skyline
- * @since 2023-09-15
- */
-@Setter
-@Getter
-@NoArgsConstructor
-@TableName(schema = "car_wash", value = "t_invoice", autoResultMap = true)
-@Accessors(chain = true)
-public class Invoice extends BaseEntity {
-    public static final String TYPE_个人 = "INDIVIDUAL";
-    public static final String TYPE_企业 = "ORGANIZATION";
-
-    public static final int STATUS_待开票 = 0;
-    public static final int STATUS_已开票 = 1;
-    public static final int STATUS_已作废 = 2;
-    public static final int STATUS_开票中 = 3;
-
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 微信发票申请id
-     */
-    private String applyId;
-
-    private Long userId;
-
-    /**
-     * 发票抬头填写人的openid
-     */
-    private String openid;
-
-    /**
-     * 发票关联订单详情
-     */
-    @TableField(typeHandler = InvoiceOrderDetailListTypeHandle.class)
-    private List<InvoiceOrderDetail> orderDetails;
-
-    /**
-     * 累积充电量(度)
-     */
-    private Double totalPower;
-    /**
-     * 累积总金额(分)
-     */
-    private Integer totalMoney;
-    /**
-     * 累积电费(分)
-     */
-    private Integer elecMoney;
-    /**
-     * 累积服务费(分)
-     */
-    private Integer serviceMoney;
-    /**
-     * 服务费优惠金额(分)
-     */
-    private Integer serviceMoneyDiscount;
-    /**
-     * 接收发票邮箱
-     */
-    private String email;
-    /**
-     * 电话
-     */
-    private String phone;
-    /**
-     * 发票类型:INDIVIDUAL-个人 ORGANIZATION-企业
-     */
-    private String invoiceType;
-    /**
-     * 发票抬头
-     */
-    private String invoiceTitle;
-    /**
-     * 公司税号
-     */
-    private String taxId;
-    /**
-     * 公司地址
-     */
-    private String address;
-    /**
-     * 购买方电话
-     */
-    private String telephone;
-    /**
-     * 开户银行
-     */
-    private String bankName;
-    /**
-     * 银行账户
-     */
-    private String bankAccount;
-    /**
-     * 发票金额(单位:分)
-     */
-    private Integer invoiceAmount;
-    /**
-     * 税额详情信息
-     */
-    private String taxInfo;
-    /**
-     * 开票人
-     */
-    private String biller;
-    /**
-     * 发票状态
-     */
-    private Integer status;
-    /**
-     * 备注
-     */
-    private String remark;
-
-}

+ 0 - 77
car-wash-entity/src/main/java/com/kym/entity/miniapp/InvoiceTitle.java

@@ -1,77 +0,0 @@
-package com.kym.entity.miniapp;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.kym.entity.BaseEntity;
-import java.io.Serializable;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-
-/**
- * <p>
- * 发票记录表
- * </p>
- *
- * @author skyline
- * @since 2023-10-13
- */
-@Getter
-@Setter
-@TableName("t_invoice_title")
-@Accessors(chain = true)
-public class InvoiceTitle extends BaseEntity {
-
-    private static final long serialVersionUID = 1L;
-
-    private Long userId;
-
-    /**
-     * 接收发票邮箱
-     */
-    private String email;
-
-    /**
-     * 电话
-     */
-    private String phone;
-
-    /**
-     * 发票类型:INDIVIDUAL-个人 ORGANIZATION-企业
-     */
-    private String invoiceType;
-
-    /**
-     * 发票抬头名称
-     */
-    private String invoiceTitle;
-
-    /**
-     * 公司税号
-     */
-    private String taxId;
-
-    /**
-     * 公司地址
-     */
-    private String address;
-
-    /**
-     * 购买方电话
-     */
-    private String telephone;
-
-    /**
-     * 开户银行
-     */
-    private String bankName;
-
-    /**
-     * 银行账户
-     */
-    private String bankAccount;
-
-    /**
-     * 备注
-     */
-    private String remark;
-}

+ 0 - 142
car-wash-entity/src/main/java/com/kym/entity/miniapp/vo/InvoiceVo.java

@@ -1,142 +0,0 @@
-package com.kym.entity.miniapp.vo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.kym.entity.BaseEntity;
-import com.kym.entity.wechat.InvoiceOrderDetail;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-/**
- * 发票
- *
- * @author skyline
- * @since 2023-09-15
- */
-@Setter
-@Getter
-@NoArgsConstructor
-@Accessors(chain = true)
-public class InvoiceVo extends BaseEntity {
-    public static final String TYPE_个人 = "INDIVIDUAL";
-    public static final String TYPE_企业 = "ORGANIZATION";
-
-    public static final int STATUS_待开票 = 0;
-    public static final int STATUS_已开票 = 1;
-    public static final int STATUS_已作废 = 2;
-    public static final int STATUS_开票中 = 3;
-
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 微信发票申请id
-     */
-    private String applyId;
-
-    private Long userId;
-
-    /**
-     * 用户手机号
-     */
-    private String mobilePhone;
-
-    /**
-     * 发票抬头填写人的openid
-     */
-    private String openid;
-
-    /**
-     * 发票关联订单详情
-     */
-    private List<InvoiceOrderDetail> orderDetails;
-
-    /**
-     * 累积充电量(度)
-     */
-    private Double totalPower;
-    /**
-     * 累积总金额(分)
-     */
-    private Integer totalMoney;
-    /**
-     * 累积电费(分)
-     */
-    private Integer elecMoney;
-    /**
-     * 累积服务费(分)
-     */
-    private Integer serviceMoney;
-    /**
-     * 服务费优惠金额(分)
-     */
-    private Integer serviceMoneyDiscount;
-    /**
-     * 接收发票邮箱
-     */
-    private String email;
-    /**
-     * 电话
-     */
-    private String phone;
-    /**
-     * 发票类型:INDIVIDUAL-个人 ORGANIZATION-企业
-     */
-    private String invoiceType;
-    /**
-     * 发票抬头
-     */
-    private String invoiceTitle;
-    /**
-     * 公司税号
-     */
-    private String taxId;
-    /**
-     * 公司地址
-     */
-    private String address;
-
-    /**
-     * 购买方电话
-     */
-    private String telephone;
-    /**
-     * 开户银行
-     */
-    private String bankName;
-    /**
-     * 银行账户
-     */
-    private String bankAccount;
-    /**
-     * 发票金额(单位:分)
-     */
-    private Integer invoiceAmount;
-    /**
-     * 税额详情信息
-     */
-    private String taxInfo;
-    /**
-     * 开票人
-     */
-    private String biller;
-
-    /**
-     * 开票时间
-     */
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime fapiaoTime;
-    /**
-     * 发票状态
-     */
-    private Integer status;
-    /**
-     * 备注
-     */
-    private String remark;
-
-}

+ 0 - 28
car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailBuyerInformationTypeHandle.java

@@ -1,28 +0,0 @@
-package com.kym.entity.typehandle;
-
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.kym.entity.wechat.FaPiao;
-
-import java.io.IOException;
-
-/**
- * @author skyline
- * @description 发票中购买方信息序列化处理
- * https://github.com/baomidou/mybatis-plus-samples/blob/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler/WalletListTypeHandler.java
- */
-public class InvoiceDetailBuyerInformationTypeHandle extends JacksonTypeHandler {
-    public InvoiceDetailBuyerInformationTypeHandle(Class<?> type) {
-        super(type);
-    }
-
-    @Override
-    public Object parse(String json) {
-        try {
-            return getObjectMapper().readValue(json, new TypeReference<FaPiao.BuyerInformation>() {
-            });
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 0 - 30
car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailItemsTypeHandle.java

@@ -1,30 +0,0 @@
-package com.kym.entity.typehandle;
-
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.kym.entity.wechat.FaPiao;
-import com.kym.entity.wechat.FapiaoApplications;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 发票中发票行
- * https://github.com/baomidou/mybatis-plus-samples/blob/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler/WalletListTypeHandler.java
- */
-public class InvoiceDetailItemsTypeHandle extends JacksonTypeHandler {
-    public InvoiceDetailItemsTypeHandle(Class<?> type) {
-        super(type);
-    }
-
-    @Override
-    public Object parse(String json) {
-        try {
-            return getObjectMapper().readValue(json, new TypeReference<List<FapiaoApplications.FapiaoItem>>() {
-            });
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 0 - 28
car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceDetailSellerInformationTypeHandle.java

@@ -1,28 +0,0 @@
-package com.kym.entity.typehandle;
-
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.kym.entity.wechat.InvoiceBaseInfo;
-
-import java.io.IOException;
-
-/**
- * @author skyline
- * @description 发票中购买方信息序列化处理
- * https://github.com/baomidou/mybatis-plus-samples/blob/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler/WalletListTypeHandler.java
- */
-public class InvoiceDetailSellerInformationTypeHandle extends JacksonTypeHandler {
-    public InvoiceDetailSellerInformationTypeHandle(Class<?> type) {
-        super(type);
-    }
-
-    @Override
-    public Object parse(String json) {
-        try {
-            return getObjectMapper().readValue(json, new TypeReference<InvoiceBaseInfo.SellerInfo>() {
-            });
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 0 - 30
car-wash-entity/src/main/java/com/kym/entity/typehandle/InvoiceOrderDetailListTypeHandle.java

@@ -1,30 +0,0 @@
-package com.kym.entity.typehandle;
-
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.kym.entity.wechat.InvoiceOrderDetail;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author skyline
- * @description 发票中订单详情序列化处理
- * https://github.com/baomidou/mybatis-plus-samples/blob/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler/WalletListTypeHandler.java
- * @date 2023-10-31 16:34
- */
-public class InvoiceOrderDetailListTypeHandle extends JacksonTypeHandler {
-    public InvoiceOrderDetailListTypeHandle(Class<?> type) {
-        super(type);
-    }
-
-    @Override
-    public Object parse(String json) {
-        try {
-            return getObjectMapper().readValue(json, new TypeReference<List<InvoiceOrderDetail>>() {
-            });
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}

+ 0 - 1
car-wash-entity/src/main/java/com/kym/entity/typehandle/WashOrderDetailTypeHandle.java

@@ -3,7 +3,6 @@ package com.kym.entity.typehandle;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.kym.entity.awoara.Detail;
-import com.kym.entity.wechat.FaPiao;
 
 import java.io.IOException;
 import java.util.List;

+ 0 - 162
car-wash-entity/src/main/java/com/kym/entity/wechat/FaPiao.java

@@ -1,162 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 微信区块链电子发票
- * @date 2023-09-16 14:14
- */
-@Data
-@Accessors(chain = true)
-public class FaPiao {
-
-    /**
-     * 微信支付分配的子商户号,服务商模式下必传
-     * 选填
-     */
-    private String sub_mchid;
-
-    /**
-     * 开票场景
-     * 可选取值:
-     * WITH_WECHATPAY: 微信支付场景
-     * WITHOUT_WECHATPAY: 非微信支付场景
-     */
-    private String scene;
-
-    /**
-     * 发票申请单号,唯一标识一次开票行为。当开票场景为WITHOUT_WECHATPAY时,
-     * 为调用【获取抬头填写链接】接口时指定的发票申请单号;当开票场景为WITH_WECHATPAY时,
-     * 为与本次开票关联的微信支付订单号,且必须是属于相应商户的订单(服务商模式下该订单必须属于子商户;
-     * 直连模式下该订单必须属于直连商户)
-     */
-    private String fapiao_apply_id;
-
-    /**
-     * 购买方信息,即发票抬头。若商户使用微信官方抬头,可从【获取用户填写的抬头】接口获取用户填写的抬头;也可自行收集发票抬头
-     */
-    private BuyerInformation buyer_information;
-
-    /**
-     * 需要开具的发票信息。注意:同一个开票申请单最多申请5张发票
-     */
-    private List<FaPiaoInfomation> fapiao_information;
-
-
-    /**
-     * 购买方信息,即发票抬头。若商户使用微信官方抬头,可从【获取用户填写的抬头】接口获取用户填写的抬头;也可自行收集发票抬头
-     */
-    @Data
-    @Accessors(chain = true)
-    public static class BuyerInformation {
-        /**
-         * INDIVIDUAL: 个人
-         * ORGANIZATION: 单位
-         * 必填
-         */
-        private String type;
-
-        /**
-         * 购买方名称(256)
-         * 必填
-         */
-        private String name;
-
-        /**
-         * 购买方纳税人识别号,购买方类型为ORGANIZATION时必须存在(32)
-         */
-        private String taxpayer_id;
-
-        /**
-         * 购买方地址(128)
-         */
-        private String address;
-
-        /**
-         * 购买方电话(32)
-         */
-        private String telephone;
-
-        /**
-         * 购买方开户银行(32)
-         */
-        private String bank_name;
-
-        /**
-         * 购买方银行账号(32)
-         */
-        private String bank_account;
-
-        /**
-         * 用户手机号。注意:该字段为密文字段,加解密算法请参见《微信支付V3版规范》
-         */
-        private String phone;
-
-        /**
-         * 用户邮箱地址。注意:该字段为密文字段,加解密算法请参见《微信支付V3版规范》
-         */
-        private String email;
-    }
-
-
-    @Data
-    @Accessors(chain = true)
-    public static class FaPiaoInfomation {
-
-        /**
-         * 商户发票单号,唯一标识一张要开具的发票。只能是字母、数字、中划线-、下划线_、竖线|、星号*
-         * 这些英文半角字符,且该单号在每个商户下必须唯一
-         */
-        private String fapiao_id;
-
-        /**
-         * 总价税合计,所有发票行单行金额合计的累加,展示在发票的价税合计处,单位:分
-         * 注意:若是微信支付后开票,所有发票的总价税合计之和不能超过对应的微信支付单总金额;
-         * 若是非微信支付开票,所有发票的总价税合计之和不能超过【获取抬头填写链接】接口中指定的总金额
-         */
-        private int total_amount;
-
-        /**
-         * 发票行信息,单张发票的发票行不能超过8行
-         */
-        private List<IssueItem> items;
-
-        @Data
-        @Accessors(chain = true)
-        public static class IssueItem {
-
-            /**
-             * 【税局侧规定的货物或应税劳务、服务税收分类编码】
-             * 税局侧规定的货物或应税劳务、服务税收分类编码。
-             * 可自行指定符合税务部门规定的货物或应税劳务、服务编码;
-             * 若使用在电子发票商户平台配置的商品类型,需要从接口【获取商户可开具的商品和服务税收分类编码对照表】获得商户已配置的编码;
-             * 若该行为折扣行,必须与被折扣行的编码相同。
-             */
-            private String tax_code;
-
-            /**
-             * 数量,展示在发票中间的数量列,单位为10^-8^,100000000表示数量为1。
-             * 若是折扣行或者没有数量概念,则默认为100000000
-             */
-            private int quantity = 100000000;
-
-            /**
-             * 单行金额和税费的和,折扣行的金额为负数,非折扣行的金额为正数,单位:分
-             */
-            private int total_amount;
-
-            /**
-             * 指定该发票行是否折扣行,折扣行必须是被折扣行的下一行
-             */
-            private boolean discount = false;
-
-        }
-
-    }
-
-
-}

+ 0 - 169
car-wash-entity/src/main/java/com/kym/entity/wechat/FapiaoApplications.java

@@ -1,169 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 查询电子发票
- * @date 2023-10-07 16:02
- */
-@Data
-public class FapiaoApplications {
-    private int total_count;
-    private List<FapiaoEntity> fapiao_information;
-
-    @Data
-    public static class FapiaoEntity {
-        private String fapiao_id;
-        /**
-         * ISSUE_ACCEPTED: 开票申请已受理
-         * ISSUED: 发票已开具
-         * REVERSE_ACCEPTED: 冲红申请已受理
-         * REVERSED: 发票已冲红
-         */
-        private String status;
-
-        /**
-         * 蓝字发票信息,当发票状态不为ISSUE_ACCEPTED时存在
-         */
-        private FapiaoInfo blue_fapiao;
-        /**
-         * 红字发票信息,当发票状态为REVERSED时存在
-         */
-        private FapiaoInfo red_fapiao;
-
-        /**
-         * 电子发票卡券信息
-         */
-        private CardInfo card_information;
-
-        /**
-         * 总价税合计,所有发票行单行金额合计的累加,单位:分
-         */
-        private int total_amount;
-        /**
-         * 总税额,所有发票行单行税额的累加,单位:分
-         */
-        private int tax_amount;
-        /**
-         * 总金额,所有发票行单行金额的累加,单位:分
-         */
-        private int amount;
-        /**
-         * 销售方信息
-         */
-        private InvoiceBaseInfo.SellerInfo seller_information;
-        /**
-         * 购买方信息
-         */
-        private FaPiao.BuyerInformation buyer_information;
-        /**
-         * 附加信息
-         */
-        private InvoiceBaseInfo.ExtraInfo extra_information;
-
-        /**
-         * 发票行信息
-         */
-        private List<FapiaoItem> items;
-        /**
-         * 备注
-         */
-        private String remark;
-    }
-
-    @Data
-    public static class FapiaoInfo {
-        /**
-         * 发票代码
-         */
-        private String fapiao_code;
-        /**
-         * 发票号码
-         */
-        private String fapiao_number;
-        /**
-         * 校验码
-         */
-        private String check_code;
-        /**
-         * 发票票面密码区内容
-         */
-        private String password;
-        /**
-         * 开票时间,遵循RFC3339标准格式
-         * 2020-07-01T12:00:00+08:00
-         */
-        private String fapiao_time;
-    }
-
-    @Data
-    public static class CardInfo {
-        private String card_appid;
-        private String card_openid;
-        private String card_id;
-        private String card_code;
-        /**
-         * INSERT_ACCEPTED: 插卡申请已受理
-         * INSERTED: 已插入用户卡包
-         * DISCARD_ACCEPTED: 作废申请已受理
-         * DISCARDED: 发票卡券已作废
-         */
-        private String card_status;
-    }
-
-    @Data
-    public static class FapiaoItem {
-        /**
-         * 税局侧规定的货物或应税劳务、服务税收分类编码
-         */
-        private String tax_code;
-        /**
-         * 由商户自定义的货物或应税劳务、服务名称
-         */
-        private String goods_name;
-        /**
-         * 规格型号
-         */
-        private String specification;
-        /**
-         * 单位
-         */
-        private String unit;
-        /**
-         * 数量,单位为10^-8^,100000000表示数量为1
-         */
-        private int quantity;
-        /**
-         * 单价,单位为10^-6^分,100000000表示1元
-         */
-        private long unit_price;
-        /**
-         * 单行金额,单位:分
-         */
-        private int amount;
-        /**
-         * 单行金额和税费的和,单位:分
-         */
-        private int tax_amount;
-        /**
-         * 税率,单位为万分之一,如1300代表13%
-         */
-        private int tax_rate;
-        /**
-         * 税收优惠政策标识可选取值:
-         * NO_FAVORABLE: 无优惠
-         * OUTSIDE_VAT: 不征税
-         * VAT_EXEMPT: 免税
-         * NORMAL_ZERO_RATED: 普通零税率
-         * EXPORT_ZERO_RATED: 出口零税率
-         */
-        private String tax_prefer_mark;
-        /**
-         * 指定该发票行是否折扣行,折扣行一定是被折扣行的下一行
-         */
-        private boolean discount = false;
-    }
-}

+ 0 - 24
car-wash-entity/src/main/java/com/kym/entity/wechat/FapiaoDownload.java

@@ -1,24 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 发票下载
- * @date 2023-10-07 15:42
- */
-@Data
-public class FapiaoDownload {
-
-    private List<FapiaoDownloadInfo> fapiao_download_info_list;
-
-    @Data
-    public class FapiaoDownloadInfo {
-        private String fapiao_id;
-        private String download_url;
-        private String status;
-    }
-
-}

+ 0 - 74
car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceBaseInfo.java

@@ -1,74 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * @author skyline
- * @description
- * @date 2023-09-17 01:38
- */
-@Data
-@Accessors(chain = true)
-public class InvoiceBaseInfo {
-
-    /**
-     *  商户配置的销售方信息,展示在电子发票的销售方中
-     */
-    private SellerInfo seller_information;
-
-    @Data
-    @Accessors(chain = true)
-    public static class SellerInfo{
-
-        /**
-         * 销售方名称
-         */
-        private String name;
-
-        /**
-         * 销售方纳税人识别号
-         */
-        private String taxpayer_id;
-
-        /**
-         * 销售方地址
-         */
-        private String address;
-
-        /**
-         * 销售方电话
-         */
-        private String telephone;
-
-        /**
-         * 销售方开户银行
-         */
-        private String bank_name;
-
-    }
-
-    /**
-     * 商户配置的开票附加信息,展示在电子发票下方
-     */
-    private ExtraInfo extra_information;
-
-    @Data
-    @Accessors(chain = true)
-    public static class ExtraInfo{
-
-        /**
-         * 收款人
-         */
-        private String payee;
-        /**
-         * 复核人
-         */
-        private String reviewer;
-        /**
-         * 开票人
-         */
-        private String drawer;
-    }
-
-}

+ 0 - 77
car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceNotification.java

@@ -1,77 +0,0 @@
-package com.kym.entity.wechat;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 微信发票回调通知
- * @date 2023-09-17 11:30
- */
-@Data
-public class InvoiceNotification {
-
-    /**
-     * 微信支付分配的商户号
-     */
-    @SerializedName("mchid")
-    private String mchid;
-
-    /**
-     * 开票时指定的发票申请单号
-     */
-    @SerializedName("fapiao_apply_id")
-    private String fapiaoApplyId;
-
-    @SerializedName("fapiao_information")
-    private List<FapiaoInformation> fapiaoInformation;
-
-
-    /**
-     * 发票状态
-     */
-    public enum FapiaoStatus {
-        ISSUE_ACCEPTED, ISSUED, REVERSE_ACCEPTED, REVERSED
-    }
-
-
-    /**
-     * 发票状态-卡包状态
-     */
-    public enum CardStatus {
-        INSERT_ACCEPTED, INSERTED, DISCARD_ACCEPTED, DISCARDED
-    }
-
-    @Data
-    public class FapiaoInformation {
-
-        /**
-         * 商户发票单号,唯一标识一张发票
-         */
-        @SerializedName("fapiao_id")
-        private String fapiaoId;
-
-        /**
-         * 发票状态,枚举值:
-         * ISSUE_ACCEPTED:开票请求已受理
-         * ISSUED:发票已开具
-         * REVERSE_ACCEPTED:冲红申请已受理
-         * REVERSED:发票已冲红
-         */
-        @SerializedName("fapiao_status")
-        private String fapiaoStatus;
-
-        /**
-         * 发票状态,枚举值:
-         * INSERT_ACCEPTED:已插入用户卡包
-         * INSERTED:插卡已受理
-         * DISCARD_ACCEPTED:作废申请已受理
-         * DISCARDED:发票卡券已作废
-         */
-        @SerializedName("card_status")
-        private String cardStatus;
-
-    }
-}

+ 0 - 20
car-wash-entity/src/main/java/com/kym/entity/wechat/InvoiceOrderDetail.java

@@ -1,20 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * @author skyline
- * @description 用于发票的订单详情
- * @date 2023-09-23 21:27
- */
-@Data
-@Accessors(chain = true)
-public class InvoiceOrderDetail {
-    private String startChargeSeq;
-    private double totalPower;
-    private int totalMoney;
-    private int elecMoney;
-    private int serviceMoney;
-    private int serviceMoneyDiscount;
-}

+ 0 - 77
car-wash-entity/src/main/java/com/kym/entity/wechat/TaxCodes.java

@@ -1,77 +0,0 @@
-package com.kym.entity.wechat;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-import java.util.List;
-
-/**
- * @author skyline
- * @description 商品及税收分类编码
- * @date 2023-09-16 23:22
- */
-@Data
-@Accessors(chain = true)
-public class TaxCodes {
-
-    /**
-     * 本次查询的起始位置
-     */
-    private int offset;
-
-    /**
-     * 本次查询的最大数量
-     */
-    private int limit;
-
-    /**
-     * 本次查询到的商品及税收分类编码对照表
-     */
-    private List<TaxCodeItem> data;
-
-    /**
-     * 总记录数
-     */
-    private int total_count;
-
-
-    public class TaxCodeItem {
-        /**
-         * 由商户自定义的货物或应税劳务、服务名称
-         */
-        private String goods_name;
-
-        /**
-         * 企业侧维护的货物或应税劳务、服务编码。
-         * 若使用在电子发票商户平台配置的商品类型进行开票时,需要传该编号
-         */
-        private int goods_id;
-
-        /**
-         * 税局侧规定的货物或应税劳务、服务分类名称
-         */
-        private String goods_category;
-
-        /**
-         * 税局侧规定的货物或应税劳务、服务税收分类编码
-         */
-        private String tax_code;
-
-        /**
-         * 税率,单位为万分之一,如1300代表13%
-         */
-        private int tax_rate;
-
-        /**
-         * 税收优惠政策标识
-         * 可选取值:
-         * NO_FAVORABLE: 无优惠
-         * OUTSIDE_VAT: 不征税
-         * VAT_EXEMPT: 免税
-         * NORMAL_ZERO_RATED: 普通零税率
-         * EXPORT_ZERO_RATED: 出口零税率
-         */
-        private String tax_prefer_mark;
-
-    }
-}

+ 0 - 33
car-wash-entity/src/main/java/com/kym/entity/wechat/TitleUrl.java

@@ -1,33 +0,0 @@
-package com.kym.entity.wechat;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * @author skyline
- * @description 发票抬头填写链接
- * @date 2023-10-12 20:19
- */
-@Data
-@Accessors(chain = true)
-public class TitleUrl {
-    /**
-     * 小程序appid
-     */
-    @SerializedName("miniprogram_appid")
-    private String miniprogramAppid;
-
-    /**
-     * 小程序appid
-     */
-    @SerializedName("miniprogram_path")
-    private String miniprogramPath;
-
-    /**
-     * 抬头填写小程序的用户名,即小程序的原始id,当开票来源为WEB时存在
-     */
-    @SerializedName("miniprogram_user_name")
-    private String miniprogramUsername;
-
-}

+ 0 - 34
car-wash-entity/src/main/java/com/kym/entity/wechat/TitleWriteNotification.java

@@ -1,34 +0,0 @@
-package com.kym.entity.wechat;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-/**
- * @author skyline
- * @description 发票抬头填写完成回调通知
- * @date 2023-09-17 11:30
- */
-@Data
-public class TitleWriteNotification {
-
-    /**
-     * 微信支付分配的商户号
-     */
-    @SerializedName("mchid")
-    private String mchid;
-
-    /**
-     * 开票时指定的发票申请单号
-     */
-    @SerializedName("fapiao_apply_id")
-    private String fapiaoApplyId;
-
-    /**
-     * 用户完成发票抬头填写的时间
-     */
-    @SerializedName("apply_time")
-    private String applyTime;
-
-}

+ 0 - 17
car-wash-mapper/src/main/java/com/kym/mapper/admin/InvoiceDetailMapper.java

@@ -1,17 +0,0 @@
-package com.kym.mapper.admin;
-
-import com.github.yulichang.base.MPJBaseMapper;
-import com.kym.entity.admin.InvoiceDetail;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- * 发票详情表 Mapper 接口
- * </p>
- *
- * @author skyline
- * @since 2024-03-19
- */
-public interface InvoiceDetailMapper extends MPJBaseMapper<InvoiceDetail> {
-
-}

+ 0 - 16
car-wash-mapper/src/main/java/com/kym/mapper/miniapp/InvoiceMapper.java

@@ -1,16 +0,0 @@
-package com.kym.mapper.miniapp;
-
-import com.github.yulichang.base.MPJBaseMapper;
-import com.kym.entity.miniapp.Invoice;
-
-/**
- * <p>
- * 发票记录表 Mapper 接口
- * </p>
- *
- * @author skyline
- * @since 2023-09-15
- */
-public interface InvoiceMapper extends MPJBaseMapper<Invoice> {
-
-}

+ 0 - 16
car-wash-mapper/src/main/java/com/kym/mapper/miniapp/InvoiceTitleMapper.java

@@ -1,16 +0,0 @@
-package com.kym.mapper.miniapp;
-
-import com.github.yulichang.base.MPJBaseMapper;
-import com.kym.entity.miniapp.InvoiceTitle;
-
-/**
- * <p>
- * 发票记录表 Mapper 接口
- * </p>
- *
- * @author skyline
- * @since 2023-09-21
- */
-public interface InvoiceTitleMapper extends MPJBaseMapper<InvoiceTitle> {
-
-}

+ 0 - 32
car-wash-mapper/src/main/resources/mappers/admin/InvoiceDetailMapper.xml

@@ -1,32 +0,0 @@
-<?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.InvoiceDetailMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.kym.entity.admin.InvoiceDetail">
-        <result column="id" property="id" />
-        <result column="company_id" property="companyId" />
-        <result column="apply_id" property="applyId" />
-        <result column="fapiao_time" property="fapiaoTime" />
-        <result column="status" property="status" />
-        <result column="blue_fapiao" property="blueFapiao" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
-        <result column="red_fapiao" property="redFapiao" />
-        <result column="card_information" property="cardInformation" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
-        <result column="total_amount" property="totalAmount" />
-        <result column="tax_amount" property="taxAmount" />
-        <result column="amount" property="amount" />
-        <result column="seller_information" property="sellerInformation" typeHandler="com.kym.entity.typehandle.InvoiceDetailSellerInformationTypeHandle" />
-        <result column="buyer_information" property="buyerInformation" typeHandler="com.kym.entity.typehandle.InvoiceDetailBuyerInformationTypeHandle" />
-        <result column="extra_information" property="extraInformation" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
-        <result column="items" property="items" typeHandler="com.kym.entity.typehandle.InvoiceDetailItemsTypeHandle" />
-        <result column="remark" property="remark" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id,company_id,apply_id, fapiao_time, status, blue_fapiao, red_fapiao, card_information, total_amount, tax_amount, amount, seller_information, buyer_information, extra_information, items, remark,create_time,update_time
-    </sql>
-
-</mapper>

+ 0 - 39
car-wash-mapper/src/main/resources/mappers/miniapp/InvoiceMapper.xml

@@ -1,39 +0,0 @@
-<?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.InvoiceMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.Invoice">
-        <result column="id" property="id" />
-        <result column="company_id" property="companyId" />
-        <result column="applyId" property="applyId" />
-        <result column="user_id" property="userId" />
-        <result column="openid" property="openid" />
-        <result column="order_details" property="orderDetails" typeHandler="com.kym.entity.typehandle.InvoiceOrderDetailListTypeHandle" />
-        <result column="total_power" property="totalPower" />
-        <result column="total_money" property="totalMoney" />
-        <result column="elec_money" property="elecMoney" />
-        <result column="service_money" property="serviceMoney" />
-        <result column="email" property="email" />
-        <result column="phone" property="phone" />
-        <result column="invoice_type" property="invoiceType" />
-        <result column="invoice_title" property="invoiceTitle" />
-        <result column="tax_id" property="taxId" />
-        <result column="address" property="address" />
-        <result column="bank_name" property="bankName" />
-        <result column="bank_account" property="bankAccount" />
-        <result column="invoice_amount" property="invoiceAmount" />
-        <result column="tax_info" property="taxInfo" />
-        <result column="biller" property="biller" />
-        <result column="status" property="status" />
-        <result column="remark" property="remark" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id,company_id,apply_id,user_id, openid,order_details, total_power, total_money, elec_money, service_money, email,phone, invoice_type, invoice_title, tax_id, address, bank_name, bank_account, invoice_amount, tax_info, biller, status,remark,create_time,update_time
-    </sql>
-
-</mapper>

+ 0 - 26
car-wash-mapper/src/main/resources/mappers/miniapp/InvoiceTitleMapper.xml

@@ -1,26 +0,0 @@
-<?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.InvoiceTitleMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.InvoiceTitle">
-        <result column="id" property="id" />
-        <result column="company_id" property="companyId" />
-        <result column="user_id" property="userId" />
-        <result column="email" property="email" />
-        <result column="phone" property="phone" />
-        <result column="invoice_type" property="invoiceType" />
-        <result column="invoice_title" property="invoiceTitle" />
-        <result column="tax_id" property="taxId" />
-        <result column="address" property="address" />
-        <result column="bank_name" property="bankName" />
-        <result column="bank_account" property="bankAccount" />
-        <result column="remark" property="remark" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id,company_id,user_id, email, phone, invoice_type, invoice_title, tax_id, address, bank_name, bank_account, remark,create_time,update_time
-    </sql>
-
-</mapper>

+ 0 - 279
car-wash-miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -1,279 +0,0 @@
-package com.kym.miniapp.controller;
-
-import cn.dev33.satoken.stp.StpUtil;
-import com.alibaba.fastjson2.JSONObject;
-import com.kym.common.R;
-import com.kym.common.annotation.ApiLog;
-import com.kym.common.config.WxConfig;
-import com.kym.common.enums.WxApi;
-import com.kym.common.utils.HttpUtil;
-import com.kym.entity.enplus.response.EnResponse;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.entity.miniapp.queryParams.OrderQueryParams;
-import com.kym.service.admin.StationService;
-import com.kym.service.enplus.EnNotifyService;
-import com.kym.service.enplus.EnPlusService;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.miniapp.ChargeService;
-import lombok.SneakyThrows;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.web.bind.annotation.*;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-
-/**
- * 充电
- *
- * @author skyline
- * @since 2023-06-27
- */
-@RestController
-@RequestMapping("/charge")
-public class ChargerController {
-
-    private final StationService stationService;
-
-    private final EnPlusService enPlusService;
-
-    private final ChargeService chargeService;
-
-    private final ChargeOrderService chargeOrderService;
-
-    private final EnNotifyService enNotifyService;
-
-    private final WxConfig wxConfig;
-
-
-    public ChargerController(StationService stationService, EnPlusService enPlusService, ChargeService chargeService, ChargeOrderService chargeOrderService, EnNotifyService enNotifyService, WxConfig wxConfig) {
-        this.stationService = stationService;
-        this.enPlusService = enPlusService;
-        this.chargeService = chargeService;
-        this.chargeOrderService = chargeOrderService;
-        this.enNotifyService = enNotifyService;
-        this.wxConfig = wxConfig;
-    }
-
-    /**
-     * 充电站列表
-     *
-     * @param pageNum
-     * @param pageSize
-     * @return
-     */
-    @SneakyThrows
-    @GetMapping("/listStation")
-    R<?> listChargeStation(
-            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
-            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        return R.success(stationService.queryLocalStationInfo(pageNum, pageSize));
-    }
-
-    /**
-     * 充电站状态
-     *
-     * @param ids
-     * @return
-     */
-    @GetMapping("/stationStatus")
-    R<?> stationStatus(@RequestParam("stationIds") String ids) {
-        // 请求en+接口
-        var response = stationService.stationStatus(ids.split(","));
-        return R.success(response);
-    }
-
-    @GetMapping("/token")
-    R<String> queryToken() {
-        return R.success(enPlusService.queryToken());
-    }
-
-    @ApiLog("启动充电")
-    @GetMapping("/startCharge/{connectorId}")
-    R<?> startCharge(@PathVariable("connectorId") String connectorId,
-                     @RequestParam(value = "userRechargeRightsId", required = false) Long userRechargeRightsId,
-                     @RequestParam(value = "userCouponId", required = false) Long userCouponId,
-                     @RequestParam(value = "isBooking", defaultValue = "false") Boolean isBooking,
-                     @RequestParam(value = "startTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
-                     @RequestParam(value = "endTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
-        var userId = StpUtil.getLoginIdAsLong();
-        return R.success(chargeService.queryStartCharge(userId, connectorId, userRechargeRightsId, userCouponId, isBooking, startTime, endTime));
-    }
-
-    @ApiLog("取消预约充电")
-    @GetMapping("/cancelBooking")
-    R<?> cancelBooking() {
-        chargeService.cancelBooking();
-        return R.success();
-    }
-
-    @ApiLog("修改预约充电时间")
-    @GetMapping("/modifyBookingTime")
-    R<?> modifyBookingTime(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime) {
-        chargeService.modifyBookingTime(startChargeSeq, startTime);
-        return R.success();
-    }
-
-    @ApiLog("预约改立即充电")
-    @GetMapping("immediatelyCharge/{connectorId}")
-    R<?> immediatelyCharge(@PathVariable("connectorId") String connectorId) {
-        return R.success(chargeService.immediatelyCharge(connectorId));
-    }
-
-    @ApiLog("停止充电")
-    @GetMapping("/stopCharge/{connectorId}")
-    R<?> stopCharge(@PathVariable("connectorId") String connectorId) {
-        chargeService.queryStopCharge(StpUtil.getLoginIdAsLong(), connectorId);
-        return R.success();
-    }
-
-    /**
-     * 查询当前用户充电状态
-     *
-     * @return
-     */
-    @GetMapping("/chargeStatus")
-    R<ChargeOrder> chargeStatus() {
-        return R.success(chargeService.queryEquipChargeStatus());
-    }
-
-    /**
-     * 查询充电策略
-     *
-     * @param connectorId
-     * @return
-     */
-    @GetMapping("/businessPolicy/{connectorId}")
-    R<?> businessPolicy(@PathVariable("connectorId") String connectorId) {
-        return R.success(chargeService.queryEquipBusinessPolicy(connectorId));
-    }
-
-    /**
-     * 用户订单列表
-     *
-     * @return
-     */
-    @GetMapping("/listUserChargeOrders")
-    R<?> listUserChargeOrders(@ModelAttribute OrderQueryParams params) {
-        return R.success(chargeOrderService.listUserChargeOrders(params));
-    }
-
-    /**
-     * 充电订单详情
-     *
-     * @param startChargeSeq
-     * @return
-     */
-    @GetMapping("/orderDetail/{startChargeSeq}")
-    R<?> orderDetail(@PathVariable("startChargeSeq") String startChargeSeq) {
-        return R.success(chargeOrderService.orderDetailForApp(startChargeSeq));
-    }
-
-    /**
-     * 订单优惠详情
-     *
-     * @param startChargeSeq
-     * @param discountType
-     * @return
-     */
-    @GetMapping("/orderDiscountDetail")
-    R<?> orderDiscountDetail(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("discountType") String discountType) {
-        return R.success(chargeOrderService.orderDiscountDetail(startChargeSeq, discountType));
-    }
-
-    /**
-     * 图片二维码识别
-     *
-     * @param imgUrl
-     * @return
-     */
-    @GetMapping("/qrCode")
-    R<?> qrCode(String imgUrl) {
-        var accessTokenJson = HttpUtil.getJson(WxApi.WX_GET_ACCESS_TOKEN.getApi(), Map.of("appid", wxConfig.getAppid(), "secret", wxConfig.getSecret()));
-        var accessToken = accessTokenJson.getString("access_token");
-        // https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/img-ocr/img/scanQRCode.html
-        // 问候微信API文档撰写祖宗十八代,这里img_url也是url传参!!!
-        var res = HttpUtil.post(WxApi.WX_QR_CODE.getApi().replace("ACCESS_TOKEN", accessToken).concat("&img_url=%s".formatted(imgUrl)), Map.of(), JSONObject.class);
-        return R.success(res);
-    }
-
-    //====================================================以上是请求EN+接口==============================================================
-
-    // 【我们请求en+时,数据都要加密验签;en+推送给我们的数据,需要验签解密,响应不需要加密。】
-
-    //====================================================以下是EN+推送接口==============================================================
-
-    /**
-     * EN+场站设备状态变化推送
-     *
-     * @param json
-     * @return 0:接收 1:丢弃/忽略,不需要重试
-     */
-    @PostMapping("/notification_stationStatus")
-    EnResponse notificationStationStatus(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStationStatus(json));
-    }
-
-    /**
-     * EN+推送启动充电结果
-     *
-     * @param json
-     * @return StartChargeSeq SuccStat 0:成功 1:失败  FailReason 0:无 1:接收失败
-     */
-    @ApiLog("EN+推送启动充电结果")
-    @PostMapping("/notification_start_charge_result")
-    EnResponse notificationStartChargeResult(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStartChargeResult(json));
-    }
-
-    /**
-     * EN+推送充电状态
-     *
-     * @param json
-     * @return
-     */
-    @PostMapping("/notification_equip_charge_status")
-    EnResponse notificationEquipChargeStatus(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationEquipChargeStatus(json));
-    }
-
-    /**
-     * EN+推送停止充电结果
-     *
-     * @param json
-     * @return
-     */
-    @ApiLog("推送停止充电结果")
-    @PostMapping("/notification_stop_charge_result")
-    EnResponse notificationStopChargeResult(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStopChargeResult(json));
-    }
-
-    /**
-     * EN+推送充电订单信息
-     *
-     * @param json
-     * @return
-     */
-    @ApiLog("推送充电订单信息")
-    @PostMapping("/notification_charge_order_info")
-    EnResponse notificationChargeOrderInfo(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationChargeOrderInfo(json));
-    }
-
-
-    //====================================================以下是手动同步数据接口==============================================================
-
-    /**
-     * 拉取EN+充电站信息数据并更新本地服务器数据
-     *
-     * @return
-     */
-    @GetMapping("/pullEnStations/{stationId}")
-    R<?> pullEnStationInfos(@PathVariable String stationId) {
-        stationService.pullEnStationInfos(stationId);
-        return R.success();
-    }
-
-
-}

+ 0 - 88
car-wash-miniapp/src/main/java/com/kym/miniapp/controller/InvoiceController.java

@@ -1,88 +0,0 @@
-package com.kym.miniapp.controller;
-
-import com.kym.common.R;
-import com.kym.entity.miniapp.queryParams.ApplyInvoiceParams;
-import com.kym.service.miniapp.InvoiceService;
-import com.kym.service.wechat.WxPayService;
-import jakarta.servlet.http.HttpServletRequest;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * <p>
- * 发票记录表 前端控制器
- * </p>
- *
- * @author skyline
- * @since 2023-09-15
- */
-@RestController
-@RequestMapping("/invoice")
-public class InvoiceController {
-
-    private final InvoiceService invoiceService;
-
-    private final WxPayService wxPayService;
-
-    public InvoiceController(InvoiceService invoiceService, WxPayService wxPayService) {
-        this.invoiceService = invoiceService;
-        this.wxPayService = wxPayService;
-    }
-
-    /**
-     * 用户发票抬头填写完成通知
-     *
-     * @param request
-     * @return
-     */
-    @PostMapping("/titleWriteNotice")
-    R<?> titleWriteNotice(HttpServletRequest request) {
-        return R.success();
-    }
-
-    /**
-     * 申请发票
-     *
-     * @param params
-     * @return 用户抬头填写URL
-     */
-    @PostMapping("/applyInvoice")
-    R<?> applyInvoice(@RequestBody ApplyInvoiceParams params) {
-        return R.success(invoiceService.applyInvoice(params));
-    }
-
-    /**
-     * 发票列表
-     *
-     * @param status
-     * @return 发票列表
-     */
-    @GetMapping("/list")
-    R<?> listInvoiceForApp(@RequestParam(value = "status", required = false) Integer status) {
-        return R.success(invoiceService.listInvoiceForApp(status));
-    }
-
-
-    /**
-     * 接收发票相关通知
-     *
-     * @param request
-     * @return
-     */
-    @PostMapping("/notify")
-    R<?> invoiceNotify(HttpServletRequest request) {
-        wxPayService.invoiceNotify(request);
-        return R.success();
-    }
-
-    /**
-     * 下载发票
-     *
-     * @param invoiceId
-     * @return
-     */
-    @GetMapping("/downloadInvoice/{invoiceId}")
-    R<?> downloadInvoice(@PathVariable("invoiceId") String invoiceId) {
-        return R.success(wxPayService.downloadInvoice(invoiceId));
-    }
-
-}

+ 0 - 166
car-wash-miniapp/src/main/java/com/kym/miniapp/jobs/StartChargeDelayJob.java

@@ -1,166 +0,0 @@
-package com.kym.miniapp.jobs;
-
-
-import com.kym.common.constant.ResponseEnum;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.entity.miniapp.delay.DelayChargeOrder;
-import com.kym.service.jobs.DelayService;
-import com.kym.service.jobs.DelayedItem;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.miniapp.ChargeService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.concurrent.DelayQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @author skyline
- * @description 启动充电延迟任务(预约充电)
- * @date 2023-10-08 22:11
- */
-@Component("StartChargeDelayJob")
-@Slf4j
-@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // 设置成单例
-public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
-
-    /**
-     * 预约订单队列
-     */
-    private final static DelayQueue<DelayedItem<DelayChargeOrder>> START_DELAY_QUEUE = new DelayQueue<>();
-    private final ChargeOrderService chargeOrderService;
-    private final ChargeService chargeService;
-    /**
-     * 线程池
-     */
-    private final ExecutorService executor = Executors.newFixedThreadPool(1);
-
-    /**
-     * 重试列表
-     */
-    private ArrayList<String> retryList = new ArrayList<>();
-
-    public StartChargeDelayJob(ChargeOrderService chargeOrderService, ChargeService chargeService) {
-        this.chargeOrderService = chargeOrderService;
-        this.chargeService = chargeService;
-    }
-
-    // 这里不能使用@PostConstruct,在初始化完成后, bean 进入增强阶段, 所以这个阶段的任何AOP都是无效的,https://www.cnblogs.com/eternityz/p/15330069.html
-    @EventListener
-    @Async
-    @Override
-    public void init(ContextRefreshedEvent event) {
-        // 队列加载所有充电状态为预约中的订单,按照开始时间排序
-//        var orderList = chargeOrderService.lambdaQuery()
-//                .eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中)
-//                .eq(ChargeOrder::getIsBooking, ChargeOrder.IS_BOOKING_是)
-//                .orderByAsc(ChargeOrder::getStartTime)
-//                .list();
-//        var delayChargeOrderList = orderList.stream().map(o -> new DelayChargeOrder()
-//                        .setStartChargeSeq(o.getStartChargeSeq())
-//                        .setUserId(o.getUserId())
-//                        .setConnectorId(o.getConnectorId())
-//                        .setStartTime(o.getStartTime())
-//                        .setEndTime(o.getEndTime())
-//                        .setChargeStatus(o.getChargeStatus()))
-//                .toList();
-//        var delayList = delayChargeOrderList.stream().map(delay -> new DelayedItem<>(delay, delay.getStartTime())).toList();
-//        START_DELAY_QUEUE.addAll(delayList);
-//        // 开启线程处理队列消息
-//        processDelayedOrders();
-    }
-
-    private void processDelayedOrders() {
-        while (true) {
-            executor.execute(() -> {
-                ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> null); // 初始化为空值,避免使用new ThreadLocal()
-                log.info("预约启动充电处理线程:{}", Thread.currentThread().getName());
-                DelayedItem<DelayChargeOrder> delayedItem = null;
-                try {
-                    delayedItem = START_DELAY_QUEUE.take();
-                    log.info("出队预约充电订单:{},队列剩余:{}", delayedItem.data.getStartChargeSeq(), START_DELAY_QUEUE.size());
-                    // 启动充电
-                    var order = delayedItem.data;
-                    chargeService.queryStartCharge(order.getUserId(), order.getConnectorId(), null, null,false, null, null);
-                    log.info("预约充电启动成功:用户:{},订单号:{},预约启动时间:{}", order.getUserId(), order.getStartChargeSeq(), order.getStartTime());
-                    // 线程休眠250ms
-                    Thread.sleep(250);
-                } catch (Exception e) {
-                    if (e instanceof InterruptedException) {
-                        log.error("预约充电队列take异常", e);
-                    } else {
-                        log.info("预约启动充电失败,订单号:{}", threadLocal.get());
-                        if (e instanceof BusinessException && (ResponseEnum.EN_PLUS_TOKEN_EXCEPTION.getCode().equals(((BusinessException) e).getCode()))) {
-                            if (retryList.contains(threadLocal.get())) {
-                                log.info("EN+ token异常,预约订单:{}已重试忽略", threadLocal.get());
-                                log.error(e.getMessage());
-                                // 启动失败将订单状态修改为充电状态已结束,订单状态已确认,结束原因:预约启动失败
-                                updateOrderStatus(threadLocal.get(), ChargeOrder.CHARGE_STATUS_已结束, ChargeOrder.ORDER_STATUS_失败, ChargeOrder.STOP_REASON_预约启动充电失败);
-                                retryList.remove(threadLocal.get());
-                                return;
-                            }
-                            log.info("EN+ token异常,预约订单:{},重试", threadLocal.get());
-                            // token异常就重新放入队列重试
-                            var success = addToDelayQueue(delayedItem);
-                            if (success) {
-                                retryList.add(threadLocal.get());
-                            }
-                            // 跳出本次循环
-                            return;
-                        }
-                        log.error(e.getMessage());
-                        // 启动失败将订单状态修改为充电状态已结束,订单状态已确认,结束原因:预约启动失败
-                        updateOrderStatus(threadLocal.get(), ChargeOrder.CHARGE_STATUS_已结束, ChargeOrder.ORDER_STATUS_失败, ChargeOrder.STOP_REASON_预约启动充电失败);
-                    }
-                } finally {
-                    threadLocal.remove();
-                }
-            });
-            if (!executor.isTerminated()) {
-                try {
-                    Thread.sleep(100);
-                } catch (InterruptedException e) {
-                    log.error("Delay queue processing interrupted.", e);
-                    return;
-                }
-            }
-        }
-    }
-
-    private void updateOrderStatus(String startChargeSeq, int chargeStatus, int orderStatus, int stopReason) {
-        chargeOrderService.lambdaUpdate()
-                .eq(ChargeOrder::getStartChargeSeq, startChargeSeq)
-                .set(ChargeOrder::getChargeStatus, chargeStatus)
-                .set(ChargeOrder::getOrderStatus, orderStatus)
-                .set(ChargeOrder::getStopReason, stopReason)
-                .update();
-    }
-
-    @Override
-    public boolean addToDelayQueue(DelayedItem<DelayChargeOrder> delayedItem) {
-        return START_DELAY_QUEUE.add(delayedItem);
-    }
-
-    @Override
-    public boolean addToDelayQueue(DelayChargeOrder delayChargeOrder) {
-        DelayedItem<DelayChargeOrder> orderDelayed = new DelayedItem<>(delayChargeOrder, delayChargeOrder.getStartTime());
-        return START_DELAY_QUEUE.add(orderDelayed);
-    }
-
-    @Override
-    public boolean removeFromDelayQueue(Object startChargeSeq) {
-        if (CommUtil.isEmptyOrNull(startChargeSeq)) {
-            return false;
-        }
-        return START_DELAY_QUEUE.removeIf(queue -> queue.data.getStartChargeSeq().equals(startChargeSeq));
-    }
-}

+ 0 - 144
car-wash-miniapp/src/main/java/com/kym/miniapp/jobs/StopChargeDelayJob.java

@@ -1,144 +0,0 @@
-package com.kym.miniapp.jobs;
-
-
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.entity.miniapp.delay.DelayChargeOrder;
-import com.kym.service.jobs.DelayService;
-import com.kym.service.jobs.DelayedItem;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.miniapp.ChargeService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.DelayQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @author skyline
- * @description 停止充电延迟任务(预约充电)
- * @date 2023-10-08 22:11
- */
-@Component("StopChargeDelayJob")
-@Slf4j
-@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // 设置成单例
-public class StopChargeDelayJob implements DelayService<DelayChargeOrder> {
-
-
-    /**
-     * 预约订单队列
-     */
-    private final static DelayQueue<DelayedItem<DelayChargeOrder>> STOP_DELAY_QUEUE = new DelayQueue<>();
-    private final ChargeOrderService chargeOrderService;
-    private final ChargeService chargeService;
-    /**
-     * 线程池
-     */
-    private final ExecutorService executor = Executors.newFixedThreadPool(1);
-
-    public StopChargeDelayJob(ChargeOrderService chargeOrderService, ChargeService chargeService) {
-        this.chargeOrderService = chargeOrderService;
-        this.chargeService = chargeService;
-    }
-
-    // 这里不能使用@PostConstruct,在初始化完成后, bean 进入增强阶段, 所以这个阶段的任何AOP都是无效的,https://www.cnblogs.com/eternityz/p/15330069.html
-    @EventListener
-    @Async
-    @Override
-    public void init(ContextRefreshedEvent event) {
-
-        // 队列加载所有充电状态为预约中且有结束时间的订单,按照结束时间排序
-//        var orderList = chargeOrderService.lambdaQuery()
-//                .eq(ChargeOrder::getOrderStatus, ChargeOrder.ORDER_STATUS_未知)
-//                .in(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中, ChargeOrder.CHARGE_STATUS_启动中, ChargeOrder.CHARGE_STATUS_充电中)
-//                .isNotNull(ChargeOrder::getEndTime)
-//                .orderByAsc(ChargeOrder::getEndTime)
-//                .list();
-//
-//        var delayChargeOrderList = orderList.stream().map(o -> new DelayChargeOrder()
-//                        .setStartChargeSeq(o.getStartChargeSeq())
-//                        .setUserId(o.getUserId())
-//                        .setConnectorId(o.getConnectorId())
-//                        .setStartTime(o.getStartTime())
-//                        .setEndTime(o.getEndTime())
-//                        .setChargeStatus(o.getChargeStatus()))
-//                .toList();
-//        var delayList = delayChargeOrderList.stream().map(delay -> new DelayedItem<>(delay, delay.getEndTime())).toList();
-//        STOP_DELAY_QUEUE.addAll(delayList);
-//
-//        processDelayedOrders();
-    }
-
-    private void processDelayedOrders() {
-        while (true) {
-            executor.execute(() -> {
-                ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> null); // 初始化为空值,避免使用new ThreadLocal()
-                log.info("预约停止充电处理线程:{}", Thread.currentThread().getName());
-                DelayedItem<DelayChargeOrder> delayedItem;
-
-                try {
-                    Thread.sleep(100);
-                    delayedItem = STOP_DELAY_QUEUE.take();
-                    // 停止充电
-                    var order = delayedItem.data;
-                    threadLocal.set(order.getStartChargeSeq());
-                    // 查询该设备最新订单是否是当前预约订单,是则按计划停止
-                    var currentChargeOrder = chargeOrderService.lambdaQuery().eq(ChargeOrder::getConnectorId, order.getConnectorId()).orderByDesc(ChargeOrder::getCreateTime).list().get(0);
-                    if (currentChargeOrder.getStartChargeSeq().equals(order.getStartChargeSeq())) {
-                        chargeService.queryStopCharge(order.getUserId(), order.getConnectorId());
-                        log.info("预约充电停止成功:用户:{},订单号:{},预约停止时间:{}", order.getUserId(), order.getStartChargeSeq(), order.getEndTime());
-                        // 线程休眠100ms
-                        Thread.sleep(200);
-                    } else {
-                        log.error("预约充电停止异常:订单不匹配:原订单:{},当前设备最新订单:{}", order.getStartChargeSeq(), currentChargeOrder.getStartChargeSeq());
-                        throw new BusinessException("预约充电停止异常");
-                    }
-
-
-                } catch (Exception e) {
-                    if (e instanceof InterruptedException) {
-                        log.error("预约停止充电队列take异常", e);
-                    } else {
-                        log.info("预约停止充电失败,订单号:{}", threadLocal.get(), e);
-                    }
-                } finally {
-                    threadLocal.remove();
-                }
-            });
-            if (!executor.isTerminated()) {
-                try {
-                    Thread.sleep(100);
-                } catch (InterruptedException e) {
-                    log.error("Delay queue processing interrupted.", e);
-                    return;
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean addToDelayQueue(DelayedItem<DelayChargeOrder> delayedItem) {
-        return STOP_DELAY_QUEUE.add(delayedItem);
-    }
-
-    @Override
-    public boolean addToDelayQueue(DelayChargeOrder delayChargeOrder) {
-        DelayedItem<DelayChargeOrder> orderDelayed = new DelayedItem<>(delayChargeOrder, delayChargeOrder.getEndTime());
-        return STOP_DELAY_QUEUE.add(orderDelayed);
-    }
-
-    @Override
-    public boolean removeFromDelayQueue(Object startChargeSeq) {
-        if (CommUtil.isEmptyOrNull(startChargeSeq)) {
-            return false;
-        }
-        return STOP_DELAY_QUEUE.removeIf(queue -> queue.data.getStartChargeSeq().equals(startChargeSeq));
-    }
-}

+ 0 - 16
car-wash-service/src/main/java/com/kym/service/admin/EquipmentInfoService.java

@@ -1,16 +0,0 @@
-package com.kym.service.admin;
-
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.service.mybatisplus.MyBaseService;
-
-/**
- * <p>
- * 充电桩桩体设备 服务类
- * </p>
- *
- * @author skyline
- * @since 2023-09-01
- */
-public interface EquipmentInfoService extends MyBaseService<EquipmentInfo> {
-
-}

+ 0 - 18
car-wash-service/src/main/java/com/kym/service/admin/EquipmentRelationService.java

@@ -1,18 +0,0 @@
-package com.kym.service.admin;
-
-import com.github.yulichang.base.MPJBaseService;
-import com.kym.entity.admin.EquipmentRelation;
-
-/**
- * <p>
- * 服务类
- * </p>
- *
- * @author skyline
- * @since 2023-08-07
- */
-public interface EquipmentRelationService extends MPJBaseService<EquipmentRelation> {
-    EquipmentRelation getByShortId(String shortId);
-
-    EquipmentRelation getByEquipmentId(String equipmentId);
-}

+ 0 - 26
car-wash-service/src/main/java/com/kym/service/admin/InvoiceDetailService.java

@@ -1,26 +0,0 @@
-package com.kym.service.admin;
-
-import cn.hutool.poi.excel.ExcelWriter;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.kym.entity.admin.InvoiceDetail;
-import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.wechat.FapiaoApplications;
-
-/**
- * <p>
- * 发票详情表 服务类
- * </p>
- *
- * @author skyline
- * @since 2024-03-19
- */
-public interface InvoiceDetailService extends IService<InvoiceDetail> {
-
-    PageBean<InvoiceDetail> listInvoiceDetail(InvoiceDetailQueryParam params);
-
-
-    ExcelWriter exportInvoiceDetail(InvoiceDetailQueryParam params);
-
-    void updateInvoiceDetail(String applyId, FapiaoApplications fapiaoApplications);
-}

+ 0 - 51
car-wash-service/src/main/java/com/kym/service/admin/StationService.java

@@ -1,51 +0,0 @@
-package com.kym.service.admin;
-
-import com.alibaba.fastjson2.JSONObject;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.github.yulichang.base.MPJBaseService;
-import com.kym.common.annotation.DynamicCache;
-import com.kym.entity.admin.ConnectorInfo;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.admin.Station;
-import com.kym.entity.admin.queryParams.StationQueryParam;
-import com.kym.entity.admin.vo.LocalStationVo;
-import com.kym.entity.admin.vo.StationVo;
-import com.kym.entity.enplus.EnStationStatsInfo;
-import com.kym.entity.enplus.EnStationStatusInfo;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 充电站信息 服务类
- * </p>
- *
- * @author skyline
- * @since 2023-08-12
- */
-public interface StationService extends MPJBaseService<Station> {
-
-    List<StationVo> queryEnStationInfo(int pageNum, int pageSize) throws JsonProcessingException;
-
-    @DynamicCache
-    Map<String,List<EquipmentInfo>> getCachedEquipmentMap();
-
-    @DynamicCache
-    Map<String,List<ConnectorInfo>> getCachedConnectorMap();
-
-    //    @DynamicCache // 方法的返回结果加一层方法缓存,5分钟内不变
-    List<LocalStationVo> queryLocalStationInfo(int pageNum, int pageSize);
-
-    List<EnStationStatusInfo> stationStatus(String[] ids);
-
-    EnStationStatsInfo stationStats(String stationId, String startTime, String endTime);
-
-    void pullEnStationInfos(String stationId);
-
-    void modifyStation(Station station);
-
-    void importStation(JSONObject data);
-
-    List<Station> listStation(StationQueryParam params);
-}

+ 6 - 15
car-wash-service/src/main/java/com/kym/service/admin/impl/ActivityServiceImpl.java

@@ -5,7 +5,6 @@ import com.github.pagehelper.PageHelper;
 import com.kym.common.utils.CommUtil;
 import com.kym.common.utils.IDGenerator;
 import com.kym.entity.admin.*;
-import com.kym.entity.admin.delay.DelayActivity;
 import com.kym.entity.admin.queryParams.ActivityQueryParam;
 import com.kym.entity.admin.vo.ActivityVo;
 import com.kym.entity.common.PageBean;
@@ -13,12 +12,10 @@ import com.kym.entity.common.RedisKeys;
 import com.kym.entity.miniapp.UserRechargeRights;
 import com.kym.mapper.admin.ActivityMapper;
 import com.kym.service.admin.*;
-import com.kym.service.jobs.DelayService;
 import com.kym.service.miniapp.UserRechargeRightsService;
 import com.kym.service.mybatisplus.MyBaseServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -47,8 +44,6 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
     private final ActivityStationService activityStationService;
     private final RechargeRightsService rechargeRightsService;
     private final UserRechargeRightsService userRechargeRightsService;
-    private final StationService stationService;
-    private final DelayService<DelayActivity> activityDelayService;
     private final BannerService bannerService;
     private final CouponService couponService;
 
@@ -56,13 +51,11 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
 
 
     public ActivityServiceImpl(ActivityStationService activityStationService, RechargeRightsService rechargeRightsService,
-                               UserRechargeRightsService userRechargeRightsService, StationService stationService, @Lazy DelayService<DelayActivity> activityDelayService,
+                               UserRechargeRightsService userRechargeRightsService,
                                BannerService bannerService, CouponService couponService, RedisTemplate<String, String> redisTemplate) {
         this.activityStationService = activityStationService;
         this.rechargeRightsService = rechargeRightsService;
         this.userRechargeRightsService = userRechargeRightsService;
-        this.stationService = stationService;
-        this.activityDelayService = activityDelayService;
         this.bannerService = bannerService;
         this.couponService = couponService;
         this.redisTemplate = redisTemplate;
@@ -108,9 +101,7 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
             couponService.saveBatch(couponList);
         }
 
-        // 加入活动延迟启停队列
-        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getStartTime(), DelayActivity.TYPE_启动, activity.getDiscountType()));
-        activityDelayService.addToDelayQueue(new DelayActivity(activity.getId(), activity.getName(), activity.getEndTime(), DelayActivity.TYPE_结束, activity.getDiscountType()));
+        // TODO 加入活动延迟启停队列
     }
 
 
@@ -151,8 +142,8 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
             var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
             if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
                 activityVo.setStationIds(activityStationIds);
-                var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
-                activityVo.setStationList(stationList);
+                //var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
+                //activityVo.setStationList(stationList);
             }
         } else if (activity.getDiscountType().equals(DISCOUNT_TYPE_优惠券)) {
             List<Coupon> couponList = couponService.lambdaQuery().eq(Coupon::getActivityId, activityId).list();
@@ -160,8 +151,8 @@ public class ActivityServiceImpl extends MyBaseServiceImpl<ActivityMapper, Activ
             var activityStationIds = activityStationService.lambdaQuery().eq(ActivityStation::getActivityId, activityId).list().stream().map(ActivityStation::getStationId).toList();
             if (CommUtil.isNotEmptyAndNull(activityStationIds)) {
                 activityVo.setStationIds(activityStationIds);
-                var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
-                activityVo.setStationList(stationList);
+//                var stationList = stationService.lambdaQuery().in(Station::getStationId, activityStationIds).list();
+//                activityVo.setStationList(stationList);
             }
         }
         return activityVo;

+ 0 - 104
car-wash-service/src/main/java/com/kym/service/admin/impl/ConnectorInfoServiceImpl.java

@@ -1,104 +0,0 @@
-package com.kym.service.admin.impl;
-
-import cn.dev33.satoken.stp.StpUtil;
-
-import com.github.pagehelper.PageHelper;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.admin.ConnectorInfo;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.admin.queryParams.EquipmentQueryParam;
-import com.kym.entity.admin.vo.ConnectorInfoVo;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.mapper.admin.ConnectorInfoMapper;
-import com.kym.service.admin.ConnectorInfoService;
-import com.kym.service.cache.KymCache;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.mybatisplus.MyBaseServiceImpl;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotNull;
-
-/**
- * <p>
- * 充电桩接口(枪)信息 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-08-05
- */
-@Service
-public class ConnectorInfoServiceImpl extends MyBaseServiceImpl<ConnectorInfoMapper, ConnectorInfo> implements ConnectorInfoService {
-
-    private final ChargeOrderService chargeOrderService;
-
-    public ConnectorInfoServiceImpl(ChargeOrderService chargeOrderService) {
-        this.chargeOrderService = chargeOrderService;
-    }
-
-    @Override
-    public PageBean<ConnectorInfoVo> listConnectors(EquipmentQueryParam params) {
-        // 判断数据权限
-        var adminStationIds = KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong());
-        if (params.getStationId() == null && KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong()) != null) {
-            params.setStationId(adminStationIds.get(0));
-        }
-        PageHelper.startPage(params.getPageNum(), params.getPageSize());
-        var connectorInfos = lambdaQuery()
-                .eq(CommUtil.isNotEmptyAndNull(params.getEquipmentId()), ConnectorInfo::getConnectorId,
-                        CommUtil.isNotEmptyAndNull(params.getEquipmentId()) ? KymCache.INSTANCE.getConnectorId(params.getEquipmentId()) : null)
-                .eq(CommUtil.isNotEmptyAndNull(params.getStationId()), ConnectorInfo::getStationId, params.getStationId())
-                .eq(CommUtil.isNotEmptyAndNull(params.getStatus()), ConnectorInfo::getStatus, params.getStatus())
-                .list();
-        var pageBean = new PageBean<>(connectorInfos);
-        // 转换成vo
-        var connectorInfoVos = new ArrayList<>(connectorInfos.parallelStream()
-                .map(item -> {
-                            var vo = new ConnectorInfoVo();
-                            BeanUtils.copyProperties(item, vo);
-                            return vo;
-                        }
-                ).toList());
-        var page = new PageBean<>(connectorInfoVos);
-        BeanUtils.copyProperties(pageBean, page);
-        // parallelStream 这里可能有坑,注意检查
-        var res = connectorInfoVos.parallelStream().map(item ->
-                item.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(item.getConnectorId()))
-                        .setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId()))
-                        .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(item.getConnectorId()))
-        ).sorted(Comparator.comparing(ConnectorInfoVo::getShortId)).toList();
-        page.setList(res);
-        return page;
-    }
-
-    @Override
-    public Map<Integer, Long> statConnectorStatus(String stationId) {
-        if (CommUtil.null2Long(stationId) <= 0) {
-            // 判断数据权限
-            stationId = CommUtil.isEmptyOrNull(KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong())) ? null : KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong()).get(0);
-        }
-        // 获取指定站点下的充电桩
-        var connectorInfos = lambdaQuery().eq(isNotNull(stationId), ConnectorInfo::getStationId, stationId).list();
-        // 根据状态进行分组
-
-        // 预约中的设备
-        // 查询预约中的订单,按照站点id分组并对connectorId去重计数
-        var orderInfos = chargeOrderService.lambdaQuery()
-                .select(ChargeOrder::getConnectorId)
-                .eq(ChargeOrder::getStationId, stationId)
-                .eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中)
-                .list().stream().filter(CommUtil.distinctByKey(ChargeOrder::getConnectorId)).count();
-
-        var res = connectorInfos.stream().collect(Collectors.groupingBy(ConnectorInfo::getStatus, Collectors.counting()));
-        res.put(EquipmentInfo.SERVICE_STATUS_已连接, res.getOrDefault(EquipmentInfo.SERVICE_STATUS_已连接, 0L) - orderInfos);
-        res.put(EquipmentInfo.SERVICE_STATUS_预约中, orderInfos);
-        return res;
-    }
-
-}

+ 0 - 20
car-wash-service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java

@@ -1,20 +0,0 @@
-package com.kym.service.admin.impl;
-
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.mapper.admin.EquipmentInfoMapper;
-import com.kym.service.admin.EquipmentInfoService;
-import com.kym.service.mybatisplus.MyBaseServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 充电桩桩体设备 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-08-05
- */
-@Service
-public class EquipmentInfoServiceImpl extends MyBaseServiceImpl<EquipmentInfoMapper, EquipmentInfo> implements EquipmentInfoService {
-
-}

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

@@ -1,30 +0,0 @@
-package com.kym.service.admin.impl;
-
-
-import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.kym.entity.admin.EquipmentRelation;
-import com.kym.mapper.admin.EquipmentRelationMapper;
-import com.kym.service.admin.EquipmentRelationService;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-08-07
- */
-@Service
-public class EquipmentRelationServiceImpl extends MPJBaseServiceImpl<EquipmentRelationMapper, EquipmentRelation> implements EquipmentRelationService {
-
-    @Override
-    public EquipmentRelation getByShortId(String shortId) {
-        return lambdaQuery().eq(EquipmentRelation::getShortId, shortId).one();
-    }
-
-    @Override
-    public EquipmentRelation getByEquipmentId(String equipmentId) {
-        return lambdaQuery().eq(EquipmentRelation::getEquipmentId, equipmentId).one();
-    }
-}

+ 0 - 144
car-wash-service/src/main/java/com/kym/service/admin/impl/InvoiceDetailServiceImpl.java

@@ -1,144 +0,0 @@
-package com.kym.service.admin.impl;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.NumberUtil;
-import cn.hutool.poi.excel.ExcelUtil;
-import cn.hutool.poi.excel.ExcelWriter;
-import com.alibaba.fastjson2.JSON;
-import com.github.pagehelper.PageHelper;
-import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.admin.InvoiceDetail;
-import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.Invoice;
-import com.kym.entity.wechat.FapiaoApplications;
-import com.kym.entity.wechat.InvoiceNotification;
-import com.kym.mapper.admin.InvoiceDetailMapper;
-import com.kym.service.admin.InvoiceDetailService;
-import com.kym.service.miniapp.DataDictService;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 发票详情表 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2024-03-19
- */
-@Service
-public class InvoiceDetailServiceImpl extends MPJBaseServiceImpl<InvoiceDetailMapper, InvoiceDetail> implements InvoiceDetailService {
-
-    private final DataDictService dataDictService;
-
-    public InvoiceDetailServiceImpl(DataDictService dataDictService) {
-        this.dataDictService = dataDictService;
-    }
-
-
-    @Override
-    public PageBean<InvoiceDetail> listInvoiceDetail(InvoiceDetailQueryParam params) {
-        PageHelper.startPage(params.getPageNum(), params.getPageSize());
-        var res = lambdaQuery()
-                .eq(CommUtil.isNotEmptyAndNull(params.getApplyId()), InvoiceDetail::getApplyId, params.getApplyId())
-                .orderByDesc(InvoiceDetail::getFapiaoTime)
-                .list();
-        return new PageBean<>(res);
-    }
-
-    @Override
-    public ExcelWriter exportInvoiceDetail(InvoiceDetailQueryParam params) {
-        var invoiceDetailList = lambdaQuery()
-                .eq(CommUtil.isNotEmptyAndNull(params.getApplyId()), InvoiceDetail::getApplyId, params.getApplyId())
-                .orderByDesc(InvoiceDetail::getFapiaoTime)
-                .list();
-        ExcelWriter writer = ExcelUtil.getWriter();
-
-        // excel 行信息
-        List<Map<String, Object>> rows = new ArrayList<>();
-
-        // 单张发票若发票行有多行,则每项单独一行
-        invoiceDetailList.forEach(invoiceDetail -> {
-            var items = JSON.parseArray(JSON.toJSONString(invoiceDetail.getItems()), FapiaoApplications.FapiaoItem.class);
-            items.forEach(item -> {
-                var row = new HashMap<String, Object>();
-                // 发票基本信息
-                row.put("blue_fapiao.fapiao_time", invoiceDetail.getFapiaoTime());
-                row.put("blue_fapiao.fapiao_code", invoiceDetail.getBlueFapiao().getFapiao_code());
-                row.put("blue_fapiao.fapiao_number", invoiceDetail.getBlueFapiao().getFapiao_number());
-                row.put("buyer_information.type", Invoice.TYPE_企业.equals(invoiceDetail.getBuyerInformation().getType()) ? "企业" : "个人");
-                row.put("buyer_information.name", invoiceDetail.getBuyerInformation().getName());
-                row.put("buyer_information.taxpayer_id", invoiceDetail.getBuyerInformation().getTaxpayer_id());
-                row.put("fapiao_information.status", "否"); // invoiceDetail.getStatus()
-
-                row.putAll(Map.of(
-                        "goods_name", item.getGoods_name(),
-//             "specification",item.getSpecification(),
-//             "unit",item.getUnit(),
-                        "quantity", item.getQuantity() / 100000000,
-                        "amount", NumberUtil.decimalFormat("#.##", item.getAmount() / 100f),
-                        "tax_amount", NumberUtil.decimalFormat("#.##", item.getTax_amount() / 100f),
-                        "tax_rate", NumberUtil.decimalFormat("#.##", item.getTax_rate() / 10000f)
-                ));
-
-                rows.add(row);
-            });
-        });
-
-        writer.addHeaderAlias("blue_fapiao.fapiao_code", "发票代码");
-        writer.addHeaderAlias("blue_fapiao.fapiao_number", "发票号码");
-        writer.addHeaderAlias("blue_fapiao.fapiao_time", "开票日期");
-        writer.addHeaderAlias("goods_name", "货物、应税劳务及服务");
-        writer.addHeaderAlias("specification", "规格型号");
-        writer.addHeaderAlias("quantity", "数量");
-        writer.addHeaderAlias("unit", "单位");
-        writer.addHeaderAlias("amount", "金额");
-        writer.addHeaderAlias("tax_rate", "税率");
-        writer.addHeaderAlias("tax_amount", "税额");
-        writer.addHeaderAlias("fapiao_information.status", "是否作废");
-        writer.addHeaderAlias("buyer_information.type", "购买方类型");
-        writer.addHeaderAlias("buyer_information.name", "购方单位名称");
-        writer.addHeaderAlias("buyer_information.taxpayer_id", "购方识别号");
-
-        writer.write(rows, true);
-
-        return writer;
-
-    }
-
-    /**
-     * 更新发票详情(只处理已开票情景)
-     *
-     * @param applyId
-     * @param fapiaoApplications
-     */
-    @Override
-    @Transactional
-    public void updateInvoiceDetail(String applyId, FapiaoApplications fapiaoApplications) {
-        if (InvoiceNotification.FapiaoStatus.ISSUED.name().equals(fapiaoApplications.getFapiao_information().get(0).getStatus())) {
-            var invoiceDetail = new InvoiceDetail()
-                    .setApplyId(applyId)
-                    .setStatus(InvoiceNotification.FapiaoStatus.ISSUED.name())
-                    .setFapiaoTime(DateUtil.parse(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao().getFapiao_time(), "yyyy-MM-dd'T'HH:mm:ssXXX").toLocalDateTime())
-                    .setBlueFapiao(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao())
-                    .setRedFapiao(fapiaoApplications.getFapiao_information().get(0).getRed_fapiao())
-                    .setCardInformation(fapiaoApplications.getFapiao_information().get(0).getCard_information())
-                    .setTotalAmount(fapiaoApplications.getFapiao_information().get(0).getTotal_amount())
-                    .setTaxAmount(fapiaoApplications.getFapiao_information().get(0).getTax_amount())
-                    .setAmount(fapiaoApplications.getFapiao_information().get(0).getAmount())
-                    .setSellerInformation(fapiaoApplications.getFapiao_information().get(0).getSeller_information())
-                    .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
-                    .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
-                    .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
-            removeByMap(Map.of("apply_id", applyId));
-            save(invoiceDetail);
-        }
-    }
-}

+ 0 - 321
car-wash-service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -1,321 +0,0 @@
-package com.kym.service.admin.impl;
-
-import cn.dev33.satoken.stp.StpUtil;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.github.pagehelper.PageHelper;
-import com.kym.common.annotation.DynamicCache;
-import com.kym.common.enums.EnPlusApi;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.AESUtil;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.admin.*;
-import com.kym.entity.admin.queryParams.StationQueryParam;
-import com.kym.entity.admin.vo.LocalStationVo;
-import com.kym.entity.admin.vo.StationVo;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.enplus.EnStationStatsInfo;
-import com.kym.entity.enplus.EnStationStatusInfo;
-import com.kym.entity.miniapp.WashStation;
-import com.kym.entity.miniapp.queryParams.StationQueryParams;
-import com.kym.mapper.admin.StationMapper;
-import com.kym.service.admin.*;
-import com.kym.service.cache.KymCache;
-import com.kym.service.enplus.EnPlusService;
-import com.kym.service.mybatisplus.MyBaseServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.aop.framework.AopContext;
-import org.springframework.beans.BeanUtils;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 充电站信息 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-08-12
- */
-@Service
-@Slf4j
-public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station> implements StationService {
-
-    private final EnPlusService enPlusService;
-    private final EquipmentInfoService equipmentInfoService;
-    private final ConnectorInfoService connectorInfoService;
-    private final EquipmentRelationService equipmentRelationService;
-    private final ActivityStationService activityStationService;
-    private final ActivityService activityService;
-
-    public StationServiceImpl(EnPlusService enPlusService, EquipmentInfoService equipmentInfoService,
-                              ConnectorInfoService connectorInfoService, EquipmentRelationService equipmentRelationService,
-                              ActivityStationService activityStationService, @Lazy ActivityService activityService) {
-        this.enPlusService = enPlusService;
-        this.equipmentInfoService = equipmentInfoService;
-        this.connectorInfoService = connectorInfoService;
-        this.equipmentRelationService = equipmentRelationService;
-        this.activityStationService = activityStationService;
-        this.activityService = activityService;
-    }
-
-
-    @Override
-    public List<Station> listStation(StationQueryParam params) {
-        // 判断数据权限
-        var adminStationIds = KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong());
-        QueryWrapper<Station> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("station_status", Station.STATION_STATUS_正常使用);
-        if (CommUtil.isNotEmptyAndNull(params.getStationId())) {
-            Set<String> stationIdSets = new java.util.HashSet<>(Set.of(params.getStationId()));
-            stationIdSets.addAll(adminStationIds);
-            queryWrapper.in("station_id", stationIdSets);
-        }
-        if (CommUtil.isNotEmptyAndNull(adminStationIds)) {
-            queryWrapper.in("station_id", adminStationIds);
-        }
-        queryWrapper.orderByAsc("station_id");
-        return list(queryWrapper);
-    }
-
-    @Override
-    public List<StationVo> queryEnStationInfo(int pageNum, int pageSize) {
-        var param = """
-                {
-                    "PageNo":%d,
-                    "PageSize":%d,
-                    "LastQueryTime":""
-                }
-                """.formatted(pageNum, pageSize);
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_INFO.getApi(), enPlusService.buildParams(param));
-        var enStations = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-        var stationList = enStations.getJSONArray("StationInfos").toJavaList(StationVo.class);
-        // 我方station表数据
-        var stations = list();
-        stationList.forEach(station -> {
-            station.getEquipmentInfos().forEach(enEquipmentInfo ->
-                    enEquipmentInfo.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId()))
-                            .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId())));
-            var res = stations.stream().filter(item -> item.getStationId().equals(station.getStationId())).toList();
-            if (!res.isEmpty()) {
-                station.setPictures(res.get(0).getPictures());
-            } else {
-                station.setPictures(null);
-            }
-        });
-        return stationList;
-    }
-
-    @DynamicCache(timeout = 15 * 60 * 1000L)
-    @Override
-    public Map<String, List<EquipmentInfo>> getCachedEquipmentMap() {
-        return equipmentInfoService.list().stream().collect(Collectors.groupingBy(EquipmentInfo::getStationId));
-    }
-
-    @DynamicCache(timeout = 15 * 60 * 1000L)
-    @Override
-    public Map<String, List<ConnectorInfo>> getCachedConnectorMap() {
-        return connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getEquipmentId));
-    }
-
-
-    @Override
-    @DynamicCache
-    public List<LocalStationVo> queryLocalStationInfo(int pageNum, int pageSize) {
-        StationService proxy = (StationService) AopContext.currentProxy();
-        var stationList = list();
-        var equipmentInfoMap = proxy.getCachedEquipmentMap();
-        var connectorInfoMap = proxy.getCachedConnectorMap();
-
-        var stationVoList = new ArrayList<LocalStationVo>();
-        for (var station : stationList) {
-            var stationVo = new LocalStationVo();
-            BeanUtils.copyProperties(station, stationVo);
-            var equipmentInfos = equipmentInfoMap.get(station.getStationId());
-            if (CommUtil.isNotEmptyAndNull(equipmentInfos)) {
-                equipmentInfos.parallelStream().forEach(equipmentInfo -> {
-                    // 填充短编号和车位号
-                    equipmentInfo.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(equipmentInfo.getEquipmentId()))
-                            .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(equipmentInfo.getEquipmentId()))
-                            .setConnectorInfos(connectorInfoMap.get(equipmentInfo.getEquipmentId()));
-
-                });
-                stationVo.setEquipmentInfos(equipmentInfos);
-                var res = stationList.stream().filter(item -> item.getStationId().equals(station.getStationId())).toList();
-                // 填充站点图片
-                if (!res.isEmpty()) {
-                    station.setPictures(res.get(0).getPictures());
-                } else {
-                    station.setPictures(null);
-                }
-                stationVoList.add(stationVo);
-            }
-        }
-
-        // 查询正在进行中的活动和各站点正在进行中的活动
-        var activityList = activityService.lambdaQuery().eq(Activity::getStatus, Activity.STATUS_进行中).list();
-        if (CommUtil.isNotEmptyAndNull(activityList)) {
-            var station2ActivityListMap = activityStationService.lambdaQuery().eq(ActivityStation::getStatus, Activity.STATUS_进行中).list()
-                    .stream().collect(Collectors.groupingBy(ActivityStation::getStationId));
-            var station2ActivityList = new HashMap<String, List<Activity>>();
-            station2ActivityListMap.forEach((k, v) -> station2ActivityList.put(k,
-                    v.stream().map(item -> activityList.stream().filter(activity -> activity.getId().equals(item.getActivityId())).findFirst().orElse(null)).toList()));
-            stationVoList.forEach(vo -> vo.setActivityList(station2ActivityList.get(vo.getStationId()))
-                    .setEquipmentInfos(vo.getEquipmentInfos().stream().sorted(Comparator.comparing(EquipmentInfo::getShortId)).toList()));
-        }
-
-        return stationVoList;
-    }
-
-
-    @Override
-    public List<EnStationStatusInfo> stationStatus(String[] ids) {
-        var param = """
-                {
-                    "StationIDs":["%s"]
-                }
-                """.formatted(String.join("\",\"", ids));
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATUS.getApi(), enPlusService.buildParams(param));
-        var enStationStatus = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-        return enStationStatus.getJSONArray("StationStatusInfos").toJavaList(EnStationStatusInfo.class);
-    }
-
-
-    /**
-     * 充电桩统计
-     *
-     * @param stationId
-     * @param startTime
-     * @param endTime
-     * @return
-     */
-    @Override
-    public EnStationStatsInfo stationStats(String stationId, String startTime, String endTime) {
-        var param = """
-                {
-                    "StationID":"%s",
-                    "StartTime":"%s",
-                    "EndTime":"%s"
-                }
-                """.formatted(stationId, startTime, endTime);
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), enPlusService.buildParams(param));
-        // TODO: 2023-08-12 包装成自己的数据格式
-        var enStationStats = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-        return enStationStats.getJSONObject("StationStats").toJavaObject(EnStationStatsInfo.class);
-    }
-
-
-    /**
-     * 拉取EN+充电站信息数据并更新本地服务器数据
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void pullEnStationInfos(String stationId) {
-        // 指定的站点信息
-        var stationVo = queryEnStationInfo(1, 1000).stream().filter(vo -> stationId.equals(vo.getStationId())).findFirst().orElse(null);
-
-        var station = new Station();
-        var equipmentList = new ArrayList<EquipmentInfo>();
-        var connectorList = new ArrayList<ConnectorInfo>();
-
-        // 组装数据
-        assert stationVo != null;
-        if (!stationVo.getEquipmentInfos().isEmpty()) {
-            stationVo.getEquipmentInfos().forEach(item -> {
-                // 桩体
-                var equipment = new EquipmentInfo()
-                        .setStationId(stationVo.getStationId())
-                        .setShortId(item.getShortId())
-                        .setPower(item.getConnectorInfos().get(0).getPower());
-                BeanUtils.copyProperties(item, equipment);
-                equipmentList.add(equipment);
-                // 枪
-                var connectorInfos = item.getConnectorInfos();
-                if (!CommUtil.isEmptyOrNull(connectorInfos)) {
-                    connectorInfos.forEach(connector -> {
-                        // 默认状态设置为空闲
-                        var connectorInfo = new ConnectorInfo().setStatus(EquipmentInfo.SERVICE_STATUS_空闲);
-                        BeanUtils.copyProperties(connector, connectorInfo);
-                        connectorList.add(connectorInfo);
-                    });
-                }
-            });
-            equipmentList.sort(Comparator.comparing(EquipmentInfo::getShortId));
-        }
-        BeanUtils.copyProperties(stationVo, station);
-
-        // 更新站点信息
-        updateByQueryWrapper(station, s -> new QueryWrapper<Station>().eq("station_id", station.getStationId()));
-
-        // 更新设备信息
-        equipmentInfoService.updateBatchByQueryWrapper(equipmentList, equipmentInfo ->
-                new QueryWrapper<EquipmentInfo>().eq("equipment_id", equipmentInfo.getEquipmentId()));
-
-        // 更新枪信息
-        connectorInfoService.updateBatchByQueryWrapper(connectorList, connectorInfo ->
-                new QueryWrapper<ConnectorInfo>().eq("connector_id", connectorInfo.getConnectorId()));
-
-        // 缓存更新,其他数据在站点导入时更新 com.kym.service.admin.impl.StationServiceImpl.importStation
-        KymCache.INSTANCE.putStationId2Name(Map.of(stationVo.getStationId(), stationVo.getStationName()));
-        KymCache.INSTANCE.putConnectorId2Status(connectorList.stream().collect(Collectors.toMap(ConnectorInfo::getConnectorId, ConnectorInfo::getStatus)));
-
-    }
-
-
-    @Override
-    @Transactional
-    public void modifyStation(Station station) {
-        lambdaUpdate().set(!CommUtil.isEmptyOrNull(station.getPictures()), Station::getPictures, station.getPictures())
-                .eq(Station::getStationId, station.getStationId()).update();
-    }
-
-
-    @Override
-    @Transactional
-    public void importStation(JSONObject data) {
-        var fieldIndexes = data.getJSONArray("fieldIndexes");
-        if (fieldIndexes.size() != 7) {
-            throw new BusinessException("导入数据格式错误,请正确匹配对应数据列");
-        }
-
-        String dataList = data.getString("dataList");
-        var equipmentRelations = JSON.parseArray(dataList, EquipmentRelation.class).stream().filter(item -> !CommUtil.isEmptyOrNull(item.getId())).toList();
-
-        // t_station
-        var stations = equipmentRelations.stream().filter(CommUtil.distinctByKey(EquipmentRelation::getStationId))
-                .map(item -> Map.of("stationId", item.getStationId(), "stationName", item.getStationName())).toList();
-        var stationList = stations.stream().map(map -> new Station().setStationId(map.get("stationId")).setStationName(map.get("stationName"))).toList();
-        saveBatch(stationList);
-
-        // t_equipment_info
-        var equipmentInfoList = equipmentRelations.stream().map(item -> {
-            var equipmentInfo = new EquipmentInfo();
-            BeanUtils.copyProperties(item, equipmentInfo, "id");
-            return equipmentInfo;
-        }).toList();
-        equipmentInfoService.saveBatch(equipmentInfoList);
-
-        // t_connector_info
-        var connectorInfoList = equipmentRelations.stream().map(item -> {
-            var connectorInfo = new ConnectorInfo();
-            BeanUtils.copyProperties(item, connectorInfo, "id");
-            return connectorInfo;
-        }).toList();
-        connectorInfoService.saveBatch(connectorInfoList);
-
-        // t_equipment_relation
-        equipmentRelationService.saveBatch(equipmentRelations);
-
-        // 缓存更新
-        KymCache.INSTANCE.putStationId2Name(stations.stream().collect(Collectors.toMap(map -> map.get("stationId"), map -> map.get("stationName"))));
-        KymCache.INSTANCE.putConnectorId2ShortId(equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getShortId)));
-        KymCache.INSTANCE.putConnectorId2StationId(equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getStationId)));
-        KymCache.INSTANCE.putConnectorId2ParkingNo(equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getParkingNo)));
-    }
-
-}

+ 2 - 32
car-wash-service/src/main/java/com/kym/service/cache/KymCache.java

@@ -3,13 +3,7 @@ package com.kym.service.cache;
 import cn.hutool.extra.spring.SpringUtil;
 import com.kym.common.exception.BusinessException;
 import com.kym.common.utils.CommUtil;
-import com.kym.entity.admin.ConnectorInfo;
-import com.kym.entity.admin.EquipmentRelation;
-import com.kym.entity.admin.Station;
 import com.kym.entity.common.RedisKeys;
-import com.kym.service.admin.ConnectorInfoService;
-import com.kym.service.admin.EquipmentRelationService;
-import com.kym.service.admin.StationService;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
 import org.springframework.context.ApplicationListener;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -19,7 +13,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 
 /**
  * @author skyline
@@ -202,7 +195,7 @@ public enum KymCache {
      * 通过productKey和deviceName获取设备短编号
      */
     public String getShortIdByProductKeyAndDeviceName(String productKey, String deviceName) {
-        return SHORT_ID_TO_PRODUCT_KEY_AND_DEVICE_NAME_MAPPING.entrySet().stream().filter(entry -> (productKey+","+deviceName).equals(entry.getValue())).map(Map.Entry::getKey).findFirst().get();
+        return SHORT_ID_TO_PRODUCT_KEY_AND_DEVICE_NAME_MAPPING.entrySet().stream().filter(entry -> (productKey + "," + deviceName).equals(entry.getValue())).map(Map.Entry::getKey).findFirst().get();
     }
 
 
@@ -211,37 +204,14 @@ public enum KymCache {
 
         private static final StringRedisTemplate redisTemplate = SpringUtil.getBean(StringRedisTemplate.class);
 
-        private final EquipmentRelationService equipmentRelationService;
-        private final StationService stationService;
 
-        private final ConnectorInfoService connectorInfoService;
-
-
-        private KymCacheInjector(EquipmentRelationService equipmentRelationService, StationService stationService, ConnectorInfoService connectorInfoService) {
-            this.equipmentRelationService = equipmentRelationService;
-            this.stationService = stationService;
-            this.connectorInfoService = connectorInfoService;
+        private KymCacheInjector() {
         }
 
         @Override
         public void onApplicationEvent(ApplicationStartedEvent event) {
             // 将数据库数据缓存到redis
-            var equipmentRelations = equipmentRelationService.list();
-
-            var connectorId2ShortId = equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getShortId));
-            KymCache.INSTANCE.putConnectorId2ShortId(connectorId2ShortId);
-
-            var connector2Station = equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getStationId));
-            KymCache.INSTANCE.putConnectorId2StationId(connector2Station);
-
-            var stationId2Name = stationService.list().stream().collect(Collectors.toMap(Station::getStationId, Station::getStationName));
-            KymCache.INSTANCE.putStationId2Name(stationId2Name);
-
-            var connectorId2ParkingNo = equipmentRelations.stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getParkingNo));
-            KymCache.INSTANCE.putConnectorId2ParkingNo(connectorId2ParkingNo);
 
-            var connectorId2Status = connectorInfoService.list().stream().collect(Collectors.toMap(ConnectorInfo::getConnectorId, ConnectorInfo::getStatus));
-            KymCache.INSTANCE.putConnectorId2Status(connectorId2Status);
         }
     }
 }

+ 0 - 22
car-wash-service/src/main/java/com/kym/service/enplus/EnNotifyService.java

@@ -1,22 +0,0 @@
-package com.kym.service.enplus;
-
-import com.alibaba.fastjson2.JSONObject;
-
-/**
- * @author skyline
- * @description
- * @date 2023-08-04 14:24
- */
-public interface EnNotifyService {
-
-
-    String handleNotificationStartChargeResult(JSONObject json);
-
-    String handleNotificationEquipChargeStatus(JSONObject json);
-
-    String handleNotificationStopChargeResult(JSONObject json);
-
-    String handleNotificationChargeOrderInfo(JSONObject json);
-
-    String handleNotificationStationStatus(JSONObject json);
-}

+ 0 - 32
car-wash-service/src/main/java/com/kym/service/enplus/EnPlusService.java

@@ -1,32 +0,0 @@
-package com.kym.service.enplus;
-
-import com.alibaba.fastjson2.JSONObject;
-import com.kym.entity.enplus.response.EnResponse;
-
-/**
- * @author skyline
- * @description
- * @date 2023-07-31 14:13
- */
-public interface EnPlusService {
-    EnResponse enPlusPost(String url, String params);
-
-    String queryToken();
-
-    String buildParams(String params);
-
-
-    String signValidation(JSONObject json);
-
-    JSONObject queryEquipAuth(String connectorId, String equipAuthSeq);
-
-    JSONObject queryEquipBusinessPolicy(String equipBizSeq, String connectorId);
-
-    JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, Integer amount);
-
-    JSONObject queryEquipChargeStatus(String startChargeSeq);
-
-    JSONObject updateBalanceByQueryEquipChargeStatus(String startChargeSeq, int amount);
-
-    JSONObject queryStopCharge(String startChargeSeq, String connectorId);
-}

+ 0 - 350
car-wash-service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java

@@ -1,350 +0,0 @@
-package com.kym.service.enplus.impl;
-
-import cn.hutool.extra.mail.MailUtil;
-import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.kym.entity.admin.ConnectorInfo;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.admin.MonitorLog;
-import com.kym.entity.common.RedisKeys;
-import com.kym.entity.enplus.EnConnectorStatusInfo;
-import com.kym.entity.miniapp.Account;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.entity.miniapp.WalletDetail;
-import com.kym.service.admin.ConnectorInfoService;
-import com.kym.service.admin.EquipmentInfoService;
-import com.kym.service.admin.MonitorLogService;
-import com.kym.service.cache.KymCache;
-import com.kym.service.enplus.EnNotifyService;
-import com.kym.service.enplus.EnPlusService;
-import com.kym.service.factory.DiscountStrategyFactory;
-import com.kym.service.miniapp.*;
-import jakarta.annotation.PostConstruct;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author skyline
- * @description
- * @date 2023-08-04 14:26
- */
-
-@Service
-public class EnNotifyServiceImpl implements EnNotifyService {
-    private static final Logger LOGGER = LoggerFactory.getLogger(EnNotifyServiceImpl.class);
-    public final StringRedisTemplate redisTemplate;
-    private final EnPlusService enPlusService;
-    private final ChargeOrderService chargeOrderService;
-    private final ChargeService chargeService;
-    private final AccountService accountService;
-    private final WalletDetailService walletDetailService;
-    private final MonitorLogService monitorLogService;
-    private final EquipmentInfoService equipmentInfoService;
-    private final ConnectorInfoService connectorInfoService;
-
-    private final UserStationService userStationService;
-
-    @Value("${kym.notify-email}")
-    private String notifyEmail;
-
-    public EnNotifyServiceImpl(EnPlusService enPlusService, ChargeOrderService chargeOrderService,
-                               ChargeService chargeService, AccountService accountService, WalletDetailService walletDetailService,
-                               MonitorLogService monitorLogService, EquipmentInfoService equipmentInfoService,
-                               ConnectorInfoService connectorInfoService, StringRedisTemplate redisTemplate, UserStationService userStationService) {
-        this.enPlusService = enPlusService;
-        this.chargeOrderService = chargeOrderService;
-        this.chargeService = chargeService;
-        this.accountService = accountService;
-        this.walletDetailService = walletDetailService;
-        this.monitorLogService = monitorLogService;
-        this.equipmentInfoService = equipmentInfoService;
-        this.connectorInfoService = connectorInfoService;
-        this.redisTemplate = redisTemplate;
-        this.userStationService = userStationService;
-    }
-
-//    @PostConstruct
-//    void init() {
-//        KymCache.INSTANCE.putConnectorId2Status(connectorInfoService.list().stream().collect(Collectors.toMap(item -> item.getConnectorId().concat("1"), ConnectorInfo::getStatus)));
-//    }
-
-    /**
-     * EN+ 充电站设备状态变化推送
-     *
-     * @param json
-     * @return
-     */
-    @Override
-    public String handleNotificationStationStatus(JSONObject json) {
-        var data = enPlusService.signValidation(json);
-        LOGGER.info("【EN+推送】收到充电桩设备状态变化推送:{},解密数据:{}", json, data);
-        // 更新数据库,存入redis,发送邮件通知
-        var connectorStatusInfo = JSONObject.parseObject(data).getJSONObject("ConnectorStatusInfo").toJavaObject(EnConnectorStatusInfo.class);
-        var connectorId = connectorStatusInfo.getConnectorId();
-        var equipmentId = connectorId.substring(0, 16);
-
-        equipmentInfoService.lambdaUpdate()
-                .eq(EquipmentInfo::getEquipmentId, equipmentId)
-                .set(EquipmentInfo::getServiceStatus, connectorStatusInfo.getStatus())
-                .update();
-
-        connectorInfoService.lambdaUpdate()
-                .eq(ConnectorInfo::getConnectorId, connectorId)
-                .set(ConnectorInfo::getStatus, connectorStatusInfo.getStatus())
-                .update();
-
-
-        var connectorStatus = connectorStatusInfo.getStatus();
-
-        if (connectorStatus == 0) {
-            LOGGER.info("充电桩设备离线:{}", connectorStatusInfo.getConnectorId());
-            // 如果设备离线,则存入redis
-            var monitorLog = new MonitorLog()
-                    .setStationId(KymCache.INSTANCE.getStationIdByEquipmentIdOrConnectorId(connectorStatusInfo.getConnectorId()))
-                    .setSn(connectorStatusInfo.getConnectorId())
-                    .setOfflineTime(LocalDateTime.now())
-                    .setType(2)
-                    .setOfflineStatus(connectorStatusInfo.getStatus());
-            monitorLogService.save(monitorLog);
-
-            // 离线设备放入队列,60分钟之后如果还未恢复则放入长时间离线设备集合中并发送提醒,上线后发送提醒
-            redisTemplate.opsForZSet().add(RedisKeys.OFFLINE, connectorStatusInfo.getConnectorId(), System.currentTimeMillis() + 60 * 60 * 1000);
-        } else {
-            // 先删除离线设备队列的记录,再删除离线超时队列中的记录
-            var isDelete = redisTemplate.opsForZSet().remove(RedisKeys.OFFLINE, connectorStatusInfo.getConnectorId());
-            var exist = redisTemplate.opsForSet().remove(RedisKeys.OFFLINE_EXPIRED, connectorStatusInfo.getConnectorId());
-            if ((isDelete != null && isDelete > 0) || (exist != null && exist > 0)) {
-                // 更新设备监控表
-                monitorLogService.lambdaUpdate()
-                        .eq(MonitorLog::getSn, connectorStatusInfo.getConnectorId())
-                        .eq(MonitorLog::getIsRecover, MonitorLog.IS_RECOVER_未恢复) // 未恢复的记录
-                        .set(MonitorLog::getRecoverTime, LocalDateTime.now())
-                        .set(MonitorLog::getIsRecover, MonitorLog.IS_RECOVER_已恢复) // 设置为已恢复
-                        .update();
-            }
-            if (exist != null && exist > 0) {
-                MailUtil.send(notifyEmail, "【设备上线通知】", "站点:%s,设备%s恢复上线"
-                        .formatted(KymCache.INSTANCE.getStationNameByConnectorId(connectorStatusInfo.getConnectorId()), KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(connectorStatusInfo.getConnectorId())), false);
-            }
-        }
-
-        // 设备状态变为空闲,校验是否有预约订单,有则清除预约订单数据。
-        if (connectorStatus == EquipmentInfo.SERVICE_STATUS_空闲 && KymCache.INSTANCE.getConnectorStatus(connectorId) != EquipmentInfo.SERVICE_STATUS_空闲) {
-            LOGGER.info("设备:{}状态转为空闲,清除设备预约数据...", connectorId);
-            chargeService.cancelBookingByConnector(connectorId);
-        }
-        KymCache.INSTANCE.putConnectorId2Status(Map.of(connectorId, connectorStatus));
-
-        return """
-                {
-                    "Status":%d
-                }
-                """.formatted(0);
-    }
-
-    /**
-     * EN+ 推送启动充电结果
-     *
-     * @param json
-     * @return
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationStartChargeResult(JSONObject json) {
-        var data = enPlusService.signValidation(json);
-        LOGGER.info("【EN+推送】收到启动充电结果推送:{},解密数据:{}", json, data);
-        var obj = JSONObject.parseObject(data);
-        var startChargeSeq = obj.getString("StartChargeSeq");
-        var startChargeSeqStat = obj.getIntValue("StartChargeSeqStat");
-        var connectorId = obj.getString("ConnectorID");
-        var startTime = LocalDateTime.parse(obj.getString("StartTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-
-        // 更新订单状态
-        UpdateWrapper<ChargeOrder> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.eq("connector_id", connectorId);
-        updateWrapper.eq("start_charge_seq", startChargeSeq);
-        updateWrapper.set("order_status", ChargeOrder.ORDER_STATUS_未知);
-        updateWrapper.set("charge_status", startChargeSeqStat);
-        updateWrapper.set("start_time", startTime);
-        chargeOrderService.update(updateWrapper);
-        return """
-                {
-                    "StartChargeSeq":"%s",
-                    "SuccStat":%d,
-                    "FailReason":%d
-                }
-                """.formatted(startChargeSeq, 0, 0);
-    }
-
-    /**
-     * 推送充电状态,1分钟推送一次
-     *
-     * @param json
-     * @return
-     * @see com.kym.miniapp.jobs.EquipmentChargeStatusJob#executeMpUserRelationJob()
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationEquipChargeStatus(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
-        var data = JSONObject.parseObject(dataStr);
-        LOGGER.info("【EN+推送】 :{},解密数据:{}", json, data);
-        var startChargeSeq = data.getString("StartChargeSeq");
-        var chargeOrder = chargeOrderService.getChargingOrderByStartChargeSeq(startChargeSeq);
-        // 更新订单信息
-        chargeOrder.setSoc(data.getDoubleValue("Soc"));
-        chargeOrder.setTotalPower(data.getDoubleValue("TotalPower"));
-        chargeOrder.setTotalMoney((data.getBigDecimal("TotalMoney").multiply(BigDecimal.valueOf(100))).intValue());
-        chargeOrder.setElecMoney((data.getBigDecimal("ElecMoney").multiply(BigDecimal.valueOf(100))).intValue());
-        chargeOrder.setServiceMoney((data.getBigDecimal("SeviceMoney").multiply(BigDecimal.valueOf(100))).intValue()); // 这里文档service单词错误,按文档填写
-        chargeOrder.setSumPeriod(data.getIntValue("SumPeriod"));
-        chargeOrder.setChargeDetail(data.getString("ChargeDetails"));
-        chargeOrder.setChargeStatus(data.getIntValue("StartChargeSeqStat"));
-        // 优化点 EN+一分钟推送一次,同时充电人数多的时候写入数据库过于频繁
-        // redis保存(更新)订单信息
-        redisTemplate.opsForHash().put(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, startChargeSeq, JSONObject.toJSONString(chargeOrder));
-        // 将数据库写入操作放到定时任务中
-        // chargeOrderService.updateById(chargeOrder);
-        return """
-                {
-                    "StartChargeSeq":"%s",
-                    "SuccStat":%d
-                }
-                """.formatted(startChargeSeq, 0);
-    }
-
-    /**
-     * 推送停止充电结果
-     *
-     * @param json
-     * @return
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationStopChargeResult(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
-        var data = JSONObject.parseObject(dataStr);
-        LOGGER.info("【EN+推送】收到停止充电结果推送:{},解密数据:{}", json, data);
-        var startChargeSeq = data.getString("StartChargeSeq");
-        var chargeOrder = chargeOrderService.getChargingOrderByStartChargeSeq(startChargeSeq);
-        if (data.containsKey("SuccStat") && data.getIntValue("SuccStat") == 0) {
-            chargeOrder.setChargeStatus(data.getIntValue("StartChargeSeqStat"));
-            chargeOrderService.updateById(chargeOrder);
-        }
-        return """
-                {
-                    "StartChargeSeq":"%s",
-                    "SuccStat":%d,
-                    "FailReason":%d
-                }
-                """.formatted(startChargeSeq, 0, 0);
-    }
-
-    /**
-     * 推送充电订单信息(订单结算)
-     *
-     * @param json
-     * @return
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationChargeOrderInfo(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
-        var data = JSONObject.parseObject(dataStr);
-        LOGGER.info("【EN+推送】收到充电订单信息推送:{},解密数据:{}", json, data);
-        var startChargeSeq = data.getString("StartChargeSeq");
-        var chargeOrder = chargeOrderService.getChargingOrderByStartChargeSeq(startChargeSeq);
-
-        // 账户
-        var account = accountService.getAccountByUserId(chargeOrder.getUserId());
-
-        // EN+平台推送重试策略是当天失败第二天再推送一次,仅此一次。EN+订单页面可以多次手动推送,所以这里要先判断订单状态,避免重复处理。
-        if (chargeOrder.getChargeStatus() != ChargeOrder.CHARGE_STATUS_已结束 || chargeOrder.getOrderStatus() != ChargeOrder.ORDER_STATUS_成功) {
-            // 更新订单信息
-            chargeOrder
-                    .setStartTime(LocalDateTime.parse(data.getString("StartTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
-                    .setEndTime(LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
-                    .setTotalPower(data.getDoubleValue("TotalPower"))
-                    .setElecMoney((int) Math.round(data.getDouble("TotalElecMoney") * 100))
-                    .setServiceMoney((int) Math.round(data.getDoubleValue("TotalSeviceMoney") * 100)) // 这里文档service单词错误,按文档填写
-                    .setTotalMoney((int) Math.round(data.getDoubleValue("TotalMoney") * 100))
-                    .setStopReason(data.getIntValue("StopReason"))
-                    .setSumPeriod(data.getIntValue("SumPeriod"))
-                    .setChargeDetail(data.getString("ChargeDetails"))
-                    // 实付金额初始化为订单总金额
-                    .setPayAmount(chargeOrder.getTotalMoney());
-
-            // 结束时间
-            var endTime = LocalDateTime.parse(data.getString("EndTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-
-            // 处理充值权益优惠逻辑/优惠券优惠逻辑
-            // 优惠金额
-            DiscountStrategyFactory.getDiscountStrategy(chargeOrder.getDiscountType()).computeDiscount(chargeOrder, account);
-
-            // 更新订单优惠金额
-            chargeOrderService.updateById(chargeOrder);
-
-            // 扣费等资金操作
-            deductions(chargeOrder, account, endTime);
-            // redis删除缓存订单信息(订单结算完调用)
-            redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, startChargeSeq);
-
-            // 更新用户站点数据
-            userStationService.updateUserStation(chargeOrder);
-        }
-
-        return """
-                {
-                    "StartChargeSeq":"%s",
-                    "ConnectorID":"%s",
-                    "ConfirmResult":%d
-                }
-                """.formatted(startChargeSeq, chargeOrder.getConnectorId(), 0);
-    }
-
-
-    /**
-     * 扣费等资金操作
-     *
-     * @param chargeOrder
-     * @param account
-     * @param endTime
-     */
-    private void deductions(ChargeOrder chargeOrder, Account account, LocalDateTime endTime) {
-        // 订单成功
-        chargeOrder.setOrderStatus(ChargeOrder.ORDER_STATUS_成功);
-        // 充电结束
-        chargeOrder.setChargeStatus(ChargeOrder.CHARGE_STATUS_已结束);
-        chargeOrderService.updateById(chargeOrder);
-
-        // 账户扣费
-        var beforeBalance = account.getBalance();
-        account.setBalance(beforeBalance - chargeOrder.getPayAmount());
-        accountService.updateById(account);
-
-        // 记录资金流水
-        var walletDetail = new WalletDetail();
-        walletDetail.setUserId(chargeOrder.getUserId());
-        walletDetail.setOrderNo(chargeOrder.getStartChargeSeq());
-        // 消费
-        walletDetail.setType(WalletDetail.TYPE_消费);
-        walletDetail.setAmount(chargeOrder.getPayAmount());
-        walletDetail.setBeforeBalance(beforeBalance);
-        walletDetail.setAfterBalance(account.getBalance());
-        walletDetail.setTransactionTime(endTime);
-        // 已确认
-        walletDetail.setStatus(WalletDetail.STATUS_已确认);
-        walletDetailService.save(walletDetail);
-
-    }
-}

+ 0 - 338
car-wash-service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java

@@ -1,338 +0,0 @@
-package com.kym.service.enplus.impl;
-
-import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.crypto.digest.HMac;
-import cn.hutool.crypto.digest.HmacAlgorithm;
-import com.alibaba.fastjson2.JSONObject;
-import com.kym.common.annotation.DynamicCache;
-import com.kym.common.constant.ResponseEnum;
-import com.kym.common.enums.EnPlusApi;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.exception.EnPushException;
-import com.kym.common.utils.AESUtil;
-import com.kym.common.utils.CommUtil;
-import com.kym.entity.common.RedisKeys;
-import com.kym.entity.enplus.EnRespQueryToken;
-import com.kym.entity.enplus.response.EnResponse;
-import com.kym.service.enplus.EnPlusService;
-import okhttp3.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author skyline
- * @description EN+平台接口服务
- * @date 2023-07-29 14:43
- */
-@Service
-public class EnPlusServiceImpl implements EnPlusService {
-
-    public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
-    private static final Logger LOGGER = LoggerFactory.getLogger(EnPlusServiceImpl.class);
-    static OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder().build();
-    private final RedisTemplate<String, String> redisTemplate;
-
-    @Value("${en-plus.operatorId}")
-    private String OperatorId;
-    @Value("${en-plus.operatorSecret}")
-    private String OperatorSecret;
-    @Value("${en-plus.sigSecret}")
-    private String SigSecret;
-
-    public EnPlusServiceImpl(RedisTemplate<String, String> redisTemplate) {
-        this.redisTemplate = redisTemplate;
-    }
-
-    public static <T> T parse(String json, Class<T> clz) {
-        return JSONObject.parseObject(json, clz);
-    }
-
-    private static String synchronizedCall(Request request) {
-        try (Response response = HTTP_CLIENT.newCall(request).execute()) {
-            return response.body().string();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * EN+ POST请求专属方法
-     *
-     * @param url
-     * @param params
-     * @return
-     */
-    @Override
-    public EnResponse enPlusPost(String url, String params) {
-        // token获取
-        var token = queryToken();
-        Headers headers = Headers.of("Authorization", "Bearer ".concat(token));
-        RequestBody requestBody = RequestBody.create(params, JSON);
-        Request request = new Request.Builder()
-                .headers(headers)
-                .post(requestBody)
-                .url(url)
-                .build();
-        var response = parse(synchronizedCall(request), EnResponse.class);
-
-        if (0 == response.getRet()) {
-            return response;
-        } else {
-            LOGGER.error(":url:{}\n params:{}\ntoken:{}\n返回信息:{}", url, params, token, response);
-            if(4002 == response.getRet() ){
-                // 如果返回Ret=4002,token错误的情况下,删除redis中的token,如果是预约订单则将此订单设置为延迟启动
-                redisTemplate.delete(RedisKeys.EN_PLUS_TOKEN);
-                throw new BusinessException(ResponseEnum.EN_PLUS_TOKEN_EXCEPTION);
-            }
-            throw new BusinessException(ResponseEnum.EN_PLUS_API_EXCEPTION);
-        }
-    }
-
-    /**
-     * 获取en+ AccessToken
-     * HMAC-MD5
-     * 签名密钥对整个消息体加密,MD5摘要,参数签名要求大写
-     * 签名消息体拼接顺序:OperatorID、Data、TimeStamp、Seq
-     */
-    @Override
-    public String queryToken() {
-        LOGGER.debug("查询token");
-        var token = redisTemplate.opsForValue().get(RedisKeys.EN_PLUS_TOKEN);
-        if (CommUtil.isNotEmptyAndNull(token)) {
-            LOGGER.debug("从缓存中查询到token:{},ttl:{}", token, redisTemplate.getExpire(RedisKeys.EN_PLUS_TOKEN));
-            return token;
-        }
-        var data = """
-                {
-                    "OperatorID":"%s",
-                    "OperatorSecret":"%s"
-                }
-                """.formatted(OperatorId, OperatorSecret);
-
-        var requestParams = buildParams(data);
-
-        var enResponse = enGetToken(EnPlusApi.EN_PLUS_QUERY_TOKEN.getApi(), requestParams);
-
-        if (enResponse != null && 0 == enResponse.getRet()) {
-            // 解密Data获取token
-            var enRespQueryToken = JSONObject.parseObject(AESUtil.decrypt(enResponse.getData()), EnRespQueryToken.class);
-            LOGGER.debug("EN+接口AccessToken:{}", enRespQueryToken.toString());
-            // 缓存token,有效期7天(我们这里每次请求en+获取token的有效期并不是从7天开始,有效期是在en+的剩余有效时间)
-            redisTemplate.opsForValue().set(RedisKeys.EN_PLUS_TOKEN, enRespQueryToken.getAccessToken(), enRespQueryToken.getTokenAvailableTime(), TimeUnit.SECONDS);
-            return enRespQueryToken.getAccessToken();
-        } else {
-            // 记录错误码,返回错误信息
-            LOGGER.error("EN+接口错误:接口名{}:返回信息:{}", "query_token", enResponse);
-            throw new BusinessException(ResponseEnum.EN_PLUS_QUERY_TOKEN_ERROR);
-        }
-    }
-
-    public EnResponse enGetToken(String url, String params) {
-        // token获取
-        RequestBody requestBody = RequestBody.create(params, JSON);
-        Request request = new Request.Builder()
-                .post(requestBody)
-                .url(url)
-                .build();
-        var response = parse(synchronizedCall(request), EnResponse.class);
-
-        if (response != null && 0 == response.getRet()) {
-            return response;
-        } else {
-            LOGGER.error("EN+接口数据异常:url:{}\n params:{}\n返回信息:{}", url, params, response);
-            throw new BusinessException(ResponseEnum.EN_PLUS_API_EXCEPTION);
-        }
-    }
-
-
-    /**
-     * 加密数据、签名、组装请求消息体
-     *
-     * @param params
-     * @return
-     */
-    @Override
-    public String buildParams(String params) {
-        // 使用DataSecret对data加密
-        var dataStr = AESUtil.encrypt(params);
-        // 时间戳
-        var timeStamp = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
-        // 自增序列
-        var seq = timeStamp.substring(timeStamp.length() - 4);
-        // 使用SigSecret以HMAC-MD5算法对消息体签名(签名顺序:OperatorId、Data、TimeStamp、Seq)
-        var signString = OperatorId + dataStr + timeStamp + seq;
-        HMac mac = new HMac(HmacAlgorithm.HmacMD5, SigSecret.getBytes());
-        // 签名(转为大写)
-        var sign = mac.digestHex(signString).toUpperCase();
-        return """
-                {
-                    "OperatorID":"%s",
-                    "Data":"%s",
-                    "TimeStamp":"%s",
-                    "Seq":"%s",
-                    "Sig":"%s"
-                }
-                """.formatted(OperatorId, dataStr, timeStamp, seq, sign);
-    }
-
-    /**
-     * 验签、解密推送消息
-     *
-     * @param json
-     * @return
-     */
-    @Override
-    public String signValidation(JSONObject json) {
-        // 验签 解密数据
-        var OperatorID = json.getString("OperatorID");
-        var Data = json.getString("Data");
-        var TimeStamp = json.getString("TimeStamp");
-        var Seq = json.getString("Seq");
-        var Sig = json.getString("Sig");
-        var signString = OperatorID + Data + TimeStamp + Seq;
-        HMac mac = new HMac(HmacAlgorithm.HmacMD5, SigSecret.getBytes());
-        // 签名(转为大写)
-        var sign = mac.digestHex(signString).toUpperCase();
-        if (sign.equals(Sig)) {
-            // 解密数据
-            return AESUtil.decrypt(Data);
-        } else {
-            // 验签失败
-            EnResponse enResponse = new EnResponse();
-            enResponse.setRet(4001);
-            enResponse.setMsg(ResponseEnum.EN_PLUS_PUSH_SIGN_FAIL.getMessage());
-            LOGGER.error("EN+推送数据验签失败,数据:{}", json);
-            throw new EnPushException(ResponseEnum.EN_PLUS_PUSH_SIGN_FAIL, enResponse);
-        }
-
-    }
-
-
-    /**
-     * 请求设备认证
-     *
-     * @param connectorId  充电设备接口编码
-     * @param equipAuthSeq 格式:运营商ID+唯一编码 27字符
-     * @return
-     */
-    @Override
-    public JSONObject queryEquipAuth(String connectorId, String equipAuthSeq) {
-        var param = """
-                {
-                    "EquipAuthSeq":"%s",
-                    "ConnectorID":"%s"
-                }
-                """.formatted(equipAuthSeq, connectorId);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), buildParams(param));
-
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-
-    /**
-     * 查询业务策略信息
-     *
-     * @param equipBizSeq 业务策略查询流水号 格式:运营商ID+唯一编码 27字符
-     * @param connectorId 充电设备接口编码
-     * @return
-     */
-    @Override
-    @DynamicCache(spel = "#connectorId")
-    public JSONObject queryEquipBusinessPolicy(String equipBizSeq, String connectorId) {
-        var param = """
-                {
-                    "EquipBizSeq":"%s",
-                    "ConnectorID":"%s"
-                }
-                """.formatted(equipBizSeq, connectorId);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-    /**
-     * 请求EN+启动充电
-     *
-     * @param startChargeSeq
-     * @param connectorId
-     * @param qrCode
-     * @param amount
-     * @return
-     */
-    @Override
-    public JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, Integer amount) {
-        var param = """
-                {
-                    "StartChargeSeq":"%s",
-                    "ConnectorID":"%s",
-                    "QRCode":"%s",
-                    "amount":"%d"
-                }
-                """.formatted(startChargeSeq, connectorId, qrCode, amount);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-    /**
-     * 查询充电状态
-     *
-     * @param startChargeSeq
-     * @return
-     */
-    @Override
-    public JSONObject queryEquipChargeStatus(String startChargeSeq) {
-        var param = """
-                {
-                    "StartChargeSeq":"%s"
-                }
-                """.formatted(startChargeSeq);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-    /**
-     * 与en+开发约定使用该接口更新正在充电中的订单的金额信息,解决充电过程中用户充值续充场景
-     *
-     * @param startChargeSeq
-     * @param amount
-     * @return
-     */
-    @Override
-    public JSONObject updateBalanceByQueryEquipChargeStatus(String startChargeSeq, int amount) {
-        var param = """
-                {
-                    "StartChargeSeq":"%s",
-                    "amount":%d
-                }
-                """.formatted(startChargeSeq, amount);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-    /**
-     * 请求停止充电
-     *
-     * @param startChargeSeq
-     * @param connectorId
-     * @return
-     */
-    @Override
-    public JSONObject queryStopCharge(String startChargeSeq, String connectorId) {
-        var param = """
-                {
-                    "StartChargeSeq":"%s",
-                    "ConnectorID":"%s"
-                }
-                """.formatted(startChargeSeq, connectorId);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_STOP_CHARGE.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-    }
-
-}

+ 0 - 39
car-wash-service/src/main/java/com/kym/service/jobs/DelayService.java

@@ -1,39 +0,0 @@
-package com.kym.service.jobs;
-
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.context.event.EventListener;
-
-/**
- * @author skyline
- * @description
- * @date 2023-10-08 21:41
- */
-public interface DelayService<T> {
-    // 这里不能使用@PostConstruct,在初始化完成后, bean 进入增强阶段, 所以这个阶段的任何AOP都是无效的,https://www.cnblogs.com/eternityz/p/15330069.html
-    @EventListener
-    void init(ContextRefreshedEvent event);
-
-    /**
-     * 添加延迟对象到延时队列
-     *
-     * @param delayedItem 延迟对象
-     * @return boolean
-     */
-    boolean addToDelayQueue(DelayedItem<T> delayedItem);
-
-    /**
-     * 根据对象添加到指定延时队列
-     *
-     * @param data 数据对象
-     * @return boolean
-     */
-    boolean addToDelayQueue(T data);
-
-    /**
-     * 移除指定的延迟对象从延时队列中
-     *
-     * @param id
-     */
-    boolean removeFromDelayQueue(Object id);
-
-}

+ 0 - 54
car-wash-service/src/main/java/com/kym/service/jobs/DelayedItem.java

@@ -1,54 +0,0 @@
-package com.kym.service.jobs;
-
-import jakarta.validation.constraints.NotNull;
-
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.concurrent.Delayed;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author skyline
- * @description 延迟执行
- * @date 2023-10-08 21:43
- */
-public class DelayedItem<T> implements Delayed {
-    /**
-     * 业务对象
-     */
-    public final T data;
-
-    /**
-     * 定时时间
-     */
-    public LocalDateTime delayTime = LocalDateTime.MIN;
-
-    public DelayedItem(T data, LocalDateTime delayTime) {
-        this.data = data;
-        this.delayTime = delayTime;
-    }
-
-
-    /**
-     * 获取过期时间
-     *
-     * @param unit the time unit
-     * @return
-     */
-    @Override
-    public long getDelay(@NotNull TimeUnit unit) {
-        return unit.convert(delayTime.toInstant(ZoneOffset.ofHours(+8)).toEpochMilli() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
-    }
-
-    /**
-     * 比较排序
-     *
-     * @param o the object to be compared.
-     * @return
-     */
-    @Override
-    public int compareTo(@NotNull Delayed o) {
-        var flag = getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
-        return flag > 0 ? 1 : flag < 0 ? -1 : 0;
-    }
-}

+ 0 - 35
car-wash-service/src/main/java/com/kym/service/miniapp/ChargeService.java

@@ -1,35 +0,0 @@
-package com.kym.service.miniapp;
-
-
-import com.kym.entity.enplus.response.EnBusinessPolicy;
-import com.kym.entity.miniapp.ChargeOrder;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-/**
- * @author skyline
- * @description
- * @date 2023-08-07 17:06
- */
-public interface ChargeService {
-
-    void cancelBookingByConnector(String connectorId);
-
-
-    Map<String, String> queryStartCharge(Long userId, String connectorId, Long userRechargeRightsId, Long userCouponId,Boolean isBooking, LocalDateTime startTime, LocalDateTime endTime);
-
-    void updateEquipmentAndConnectorStatus(String connectorId);
-
-    ChargeOrder queryEquipChargeStatus();
-
-    void queryStopCharge(long userId, String connectorId);
-
-    EnBusinessPolicy queryEquipBusinessPolicy(String connectorId);
-
-    Map<String, String> immediatelyCharge(String connectorId);
-
-    void modifyBookingTime(String startChargeSeq, LocalDateTime startTime);
-
-    void cancelBooking();
-}

+ 0 - 3
car-wash-service/src/main/java/com/kym/service/miniapp/CollectService.java

@@ -1,7 +1,6 @@
 package com.kym.service.miniapp;
 
 import com.github.yulichang.base.MPJBaseService;
-import com.kym.entity.enplus.EnStationStatusInfo;
 import com.kym.entity.miniapp.Collect;
 
 import java.util.List;
@@ -18,7 +17,5 @@ public interface CollectService extends MPJBaseService<Collect> {
 
     void updateCollect(String stationId, Integer status);
 
-    List<EnStationStatusInfo> getCollectList();
-
     List<Collect> listCollect();
 }

+ 0 - 32
car-wash-service/src/main/java/com/kym/service/miniapp/InvoiceService.java

@@ -1,32 +0,0 @@
-package com.kym.service.miniapp;
-
-import cn.hutool.poi.excel.ExcelWriter;
-import com.github.yulichang.base.MPJBaseService;
-import com.kym.entity.admin.queryParams.InvoiceQueryParam;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.Invoice;
-import com.kym.entity.miniapp.queryParams.ApplyInvoiceParams;
-import com.kym.entity.miniapp.vo.InvoiceVo;
-import com.kym.entity.wechat.TitleUrl;
-
-import java.util.List;
-
-/**
- * <p>
- * 发票记录表 服务类
- * </p>
- *
- * @author skyline
- * @since 2023-09-15
- */
-public interface InvoiceService extends MPJBaseService<Invoice> {
-
-    TitleUrl applyInvoice(ApplyInvoiceParams params);
-
-    PageBean<InvoiceVo> listInvoice(InvoiceQueryParam params);
-
-    List<Invoice> listInvoiceForApp(Integer status);
-
-    void cancelApplyInvoice(String invoiceId);
-
-}

+ 0 - 16
car-wash-service/src/main/java/com/kym/service/miniapp/InvoiceTitleService.java

@@ -1,16 +0,0 @@
-package com.kym.service.miniapp;
-
-import com.github.yulichang.base.MPJBaseService;
-import com.kym.entity.miniapp.InvoiceTitle;
-
-/**
- * <p>
- * 发票记录表 服务类
- * </p>
- *
- * @author skyline
- * @since 2023-09-21
- */
-public interface InvoiceTitleService extends MPJBaseService<InvoiceTitle> {
-
-}

+ 0 - 558
car-wash-service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java

@@ -1,558 +0,0 @@
-package com.kym.service.miniapp.impl;
-
-import cn.dev33.satoken.stp.StpUtil;
-import com.alibaba.fastjson2.JSONObject;
-import com.kym.common.config.EnPlusConfig;
-import com.kym.common.constant.ResponseEnum;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.CommUtil;
-import com.kym.common.utils.OrderUtils;
-import com.kym.entity.admin.Activity;
-import com.kym.entity.admin.ConnectorInfo;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.common.RedisKeys;
-import com.kym.entity.enplus.response.EnBusinessPolicy;
-import com.kym.entity.miniapp.*;
-import com.kym.entity.miniapp.delay.DelayChargeOrder;
-import com.kym.service.admin.ConnectorInfoService;
-import com.kym.service.admin.EquipmentInfoService;
-import com.kym.service.admin.EquipmentRelationService;
-import com.kym.service.cache.KymCache;
-import com.kym.service.enplus.EnPlusService;
-import com.kym.service.jobs.DelayService;
-import com.kym.service.miniapp.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.Duration;
-import java.time.LocalDateTime;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author skyline
- * @description 充电
- * @date 2023-07-29 14:24
- */
-@Service
-public class ChargeServiceImpl implements ChargeService {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ChargeServiceImpl.class);
-    public final StringRedisTemplate redisTemplate;
-    private final EquipmentRelationService equipmentRelationService;
-    private final EquipmentInfoService equipmentInfoService;
-    private final ConnectorInfoService connectorInfoService;
-    private final ChargeOrderService chargeOrderService;
-    private final OrderRechargeRightsService orderRechargeRightsService;
-    private final UserRechargeRightsService userRechargeRightsService;
-    private final UserCouponService userCouponService;
-    private final OrderCouponService orderCouponService;
-    private final AccountService accountService;
-    private final EnPlusService enPlusService;
-    private final EnPlusConfig enPlusConfig;
-    private final DelayService<DelayChargeOrder> startDelayService;
-    private final DelayService<DelayChargeOrder> stopDelayService;
-
-    public ChargeServiceImpl(EquipmentRelationService equipmentRelationService, EquipmentInfoService equipmentInfoService,
-                             ConnectorInfoService connectorInfoService, ChargeOrderService chargeOrderService,
-                             OrderRechargeRightsService orderRechargeRightsService, UserRechargeRightsService userRechargeRightsService, UserCouponService userCouponService, OrderCouponService orderCouponService,
-                             AccountService accountService, EnPlusService enPlusService, EnPlusConfig enPlusConfig,
-                             @Qualifier("StartChargeDelayJob") @Lazy DelayService<DelayChargeOrder> startDelayService,
-                             @Qualifier("StopChargeDelayJob") @Lazy DelayService<DelayChargeOrder> stopDelayService, StringRedisTemplate redisTemplate) {
-        this.equipmentRelationService = equipmentRelationService;
-        this.equipmentInfoService = equipmentInfoService;
-        this.connectorInfoService = connectorInfoService;
-        this.chargeOrderService = chargeOrderService;
-        this.orderRechargeRightsService = orderRechargeRightsService;
-        this.userRechargeRightsService = userRechargeRightsService;
-        this.userCouponService = userCouponService;
-        this.orderCouponService = orderCouponService;
-        this.accountService = accountService;
-        this.enPlusService = enPlusService;
-        this.enPlusConfig = enPlusConfig;
-        this.startDelayService = startDelayService;
-        this.stopDelayService = stopDelayService;
-        this.redisTemplate = redisTemplate;
-    }
-
-
-    /**
-     * 预约充电改立即充电
-     *
-     * @param connectorId
-     * @return
-     */
-    @Override
-    public Map<String, String> immediatelyCharge(String connectorId) {
-        var userId = StpUtil.getLoginIdAsLong();
-        cancelBooking();
-        return queryStartCharge(userId, connectorId, null, null, false, null, null);
-    }
-
-    /**
-     * 修改预约充电时间
-     *
-     * @param startChargeSeq
-     * @param startTime
-     * @return
-     */
-    @Override
-    public void modifyBookingTime(String startChargeSeq, LocalDateTime startTime) {
-        // 预约充电队列更新
-        var chargeOrder = chargeOrderService.lambdaQuery().eq(ChargeOrder::getStartChargeSeq, startChargeSeq).eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中).one();
-        if (chargeOrder == null) {
-            throw new BusinessException("预约订单不存在");
-        }
-        chargeOrder.setStartTime(startTime);
-        chargeOrder.setEndTime(null);
-        chargeOrderService.lambdaUpdate().eq(ChargeOrder::getStartChargeSeq, startChargeSeq).set(ChargeOrder::getStartTime, startTime).set(ChargeOrder::getEndTime, null).update();
-        // 删除队列中原来的数据
-        startDelayService.removeFromDelayQueue(startChargeSeq);
-        stopDelayService.removeFromDelayQueue(startChargeSeq);
-        // 向队列中添加新的数据
-        var delayChargeOrder = new DelayChargeOrder();
-        BeanUtils.copyProperties(chargeOrder, delayChargeOrder);
-        var success = startDelayService.addToDelayQueue(delayChargeOrder);
-        if (!success) {
-            throw new BusinessException("修改预约时间失败");
-        }
-    }
-
-
-    /**
-     * 取消预约
-     */
-    @Override
-    public void cancelBooking() {
-        var userId = StpUtil.getLoginIdAsLong();
-        var chargeOrder = chargeOrderService.lambdaQuery()
-                .eq(ChargeOrder::getUserId, userId)
-                .eq(ChargeOrder::getIsBooking, ChargeOrder.IS_BOOKING_是)
-                .eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中)
-                .one();
-        cancelBookByChargeOrder(chargeOrder);
-    }
-
-    /**
-     * 取消预约
-     */
-    @Override
-    @Async
-    public void cancelBookingByConnector(String connectorId) {
-        var chargeOrder = chargeOrderService.lambdaQuery()
-                .eq(ChargeOrder::getConnectorId, connectorId)
-                .eq(ChargeOrder::getIsBooking, ChargeOrder.IS_BOOKING_是)
-                .eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中)
-                .one();
-        cancelBookByChargeOrder(chargeOrder);
-    }
-
-    /**
-     * 取消预约订单
-     *
-     * @param chargeOrder 预约订单
-     */
-    public void cancelBookByChargeOrder(ChargeOrder chargeOrder) {
-        if (chargeOrder != null) {
-            // 清除启动/停止队列信息
-            startDelayService.removeFromDelayQueue(chargeOrder.getStartChargeSeq());
-            stopDelayService.removeFromDelayQueue(chargeOrder.getStartChargeSeq());
-            // 修改订单状态为取消
-            chargeOrderService.lambdaUpdate()
-                    .set(ChargeOrder::getOrderStatus, ChargeOrder.ORDER_STATUS_取消)
-                    .set(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_已取消)
-                    .eq(ChargeOrder::getStartChargeSeq, chargeOrder.getStartChargeSeq())
-                    .update();
-            LOGGER.info("取消/清除预约订单:{}", chargeOrder.getStartChargeSeq());
-        } else {
-            LOGGER.info("用户没有预约中的订单");
-        }
-    }
-
-
-    /**
-     * 启动充电
-     *
-     * @param connectorId
-     * @param userRechargeRightsId
-     * @param isBooking
-     * @param startTime
-     * @param endTime
-     * @return
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, String> queryStartCharge(Long userId, String connectorId, Long userRechargeRightsId, Long userCouponId, Boolean isBooking, LocalDateTime startTime, LocalDateTime endTime) {
-        var connectorId2StationId = getConnectorIdAndStationId(connectorId);
-        connectorId = connectorId2StationId.get("connectorId");
-        var stationId = connectorId2StationId.get("stationId");
-        LOGGER.info("用户:{},站点:{},设备:{}请求充电", userId, stationId, connectorId);
-        var account = checkCharge(userId, connectorId, isBooking, startTime);
-
-        // 是否有之前预约充电创建的订单记录,有则直接用,没有则创建
-        ChargeOrder order = chargeOrderService.lambdaQuery()
-                .eq(ChargeOrder::getUserId, userId)
-                .eq(ChargeOrder::getConnectorId, connectorId)
-                .in(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_已取消, ChargeOrder.CHARGE_STATUS_预约中)
-                .one();
-
-        if (order == null) {
-            // 充电订单号/设备认证号
-            String startChargeSeq = OrderUtils.getOrderNo(enPlusConfig.getOperatorId());
-
-            // 组装订单数据
-            order = new ChargeOrder();
-            order.setIsBooking(isBooking ? ChargeOrder.IS_BOOKING_是 : ChargeOrder.IS_BOOKING_否);
-            order.setUserId(userId);
-            order.setStationId(stationId);
-            order.setStartChargeSeq(startChargeSeq);
-            order.setConnectorId(connectorId);
-            order.setOrderStatus(ChargeOrder.ORDER_STATUS_未知);
-            order.setChargeStatus(ChargeOrder.CHARGE_STATUS_启动中);
-
-            // 订单充值权益
-            if (!CommUtil.isEmptyOrNull(userRechargeRightsId)) {
-                var userRechargeRights = userRechargeRightsService.lambdaQuery().eq(UserRechargeRights::getUserId, userId).eq(UserRechargeRights::getId, userRechargeRightsId).one();
-                if (userRechargeRights != null) {
-                    // 设置订单优惠类型
-                    order.setDiscountType(Activity.DISCOUNT_TYPE_服务费折扣权益);
-
-                    var orderRechargeRights = new OrderRechargeRights()
-                            .setUserId(userId).setStartChargeSeq(startChargeSeq)
-                            .setActivityId(userRechargeRights.getActivityId())
-                            .setRightsId(userRechargeRights.getRightsId())
-                            .setUserRightsId(userRechargeRights.getId())
-                            .setDiscount(userRechargeRights.getDiscount());
-                    orderRechargeRightsService.save(orderRechargeRights);
-                }
-            }
-
-            // 优惠券
-            if (!CommUtil.isEmptyOrNull(userCouponId)) {
-                var userCoupon = userCouponService.lambdaQuery().eq(UserCoupon::getUserId, userId).eq(UserCoupon::getId, userCouponId).one();
-                if (userCoupon != null) {
-                    // 设置订单优惠类型
-                    order.setDiscountType(Activity.DISCOUNT_TYPE_优惠券);
-
-                    var orderCoupon = new OrderCoupon()
-                            .setUserId(userId)
-                            .setStartChargeSeq(startChargeSeq)
-                            .setCouponType(userCoupon.getCouponType())
-                            .setActivityId(userCoupon.getActivityId())
-                            .setCouponId(userCoupon.getCouponId())
-                            .setUserCouponId(userCoupon.getId())
-                            .setDiscount(userCoupon.getDiscount());
-                    orderCouponService.save(orderCoupon);
-                }
-            }
-
-            // 保存订单信息
-            chargeOrderService.save(order);
-        }
-
-        // 如果是预约订单,则将订单放入预约充电延迟队列
-        if (isBooking) {
-            order = order.setStartTime(startTime).setChargeStatus(ChargeOrder.CHARGE_STATUS_预约中).setIsBooking(ChargeOrder.IS_BOOKING_是);
-
-            // 如果有设置结束时间,取消时记得删
-            if (!CommUtil.isEmptyOrNull(endTime)) {
-                order.setEndTime(endTime);
-            }
-            chargeOrderService.lambdaUpdate()
-                    .set(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中)
-                    .set(ChargeOrder::getIsBooking, order.getIsBooking())
-                    .set(ChargeOrder::getStartTime, startTime)
-                    .set(!CommUtil.isEmptyOrNull(endTime), ChargeOrder::getEndTime, endTime)
-                    .eq(ChargeOrder::getUserId, userId)
-                    .eq(ChargeOrder::getStartChargeSeq, order.getStartChargeSeq())
-                    .update();
-
-            var delayChargeOrder = new DelayChargeOrder();
-            BeanUtils.copyProperties(order, delayChargeOrder);
-
-            var flag = startDelayService.addToDelayQueue(delayChargeOrder.setStartTime(startTime));
-            if (flag) {
-                // 如果有结束时间,将订单放入结束充电延迟队列中
-                if (endTime != null) {
-                    stopDelayService.addToDelayQueue(delayChargeOrder.setEndTime(endTime));
-                }
-                // 切换数据源,修改设备状态为预约中
-                updateEquipmentAndConnectorStatus(connectorId);
-                LOGGER.info("预约充电成功,用户:{},订单号:{}", userId, order.getStartChargeSeq());
-                return Map.of("startChargeSeq", order.getStartChargeSeq());
-            } else {
-                LOGGER.error("预约充电失败,用户:{},订单号:{}", userId, order.getStartChargeSeq());
-                throw new BusinessException("充电预约失败");
-            }
-        }
-
-        // 传递给EN+的余额要小于实际余额,防止订单超扣的情况,这里少传0.5元
-        // TODO: 2023-11-30 快充这里考虑过充的金额要提高
-        var amount = account.getBalance() - 50;
-        return startCharge(order, connectorId, amount);
-
-    }
-
-
-    /**
-     * 启动充电校验流程
-     *
-     * @param userId
-     * @param connectorId
-     * @param isBooking
-     * @param startTime
-     * @return
-     */
-    private Account checkCharge(Long userId, String connectorId, Boolean isBooking, LocalDateTime startTime) {
-        if (CommUtil.isEmptyOrNull(connectorId)) {
-            throw new BusinessException("请输入正确的设备编号");
-        }
-
-        // 设备是否插枪
-        if (KymCache.INSTANCE.getConnectorStatus(connectorId) == EquipmentInfo.SERVICE_STATUS_空闲) {
-            throw new BusinessException("请插入充电枪");
-        }
-
-        if (isBooking) {
-            // 预约时间不能超过未来24H
-            if (TimeUnit.SECONDS.convert(Duration.between(LocalDateTime.now(), startTime)) > 3600 * 24) {
-                throw new BusinessException("预约充电启动时间不能超过未来24小时");
-            }
-            // 预约充电通过connectorId查询预约中的订单
-            var bookingOrder = chargeOrderService.lambdaQuery().eq(ChargeOrder::getUserId, userId).eq(ChargeOrder::getConnectorId, connectorId).eq(ChargeOrder::getIsBooking, ChargeOrder.IS_BOOKING_是).eq(ChargeOrder::getOrderStatus, ChargeOrder.ORDER_STATUS_未知).eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_预约中).one();
-            if (bookingOrder != null) {
-                LOGGER.error("用户:{}存在进行中的订单:{}", userId, bookingOrder.getStartChargeSeq());
-                throw new BusinessException(ResponseEnum.ORDER_IN_BOOKING);
-            }
-        }
-
-        // 当前用户是否有正在进行中、预约中、启动中的订单
-        var chargeOrder = chargeOrderService.getChargingOrderByUserId(userId);
-        if (chargeOrder != null) {
-            // 预约中的订单到了启动时间则直接启动,忽略校验
-            if (!(chargeOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_预约中) && chargeOrder.getStartTime().isBefore(LocalDateTime.now()))) {
-                LOGGER.error("用户:{}存在进行中的订单:{}", userId, chargeOrder.getStartChargeSeq());
-                throw new BusinessException(ResponseEnum.ORDER_IN_PROGRESS);
-            }
-        }
-
-        // 查询用户余额
-        var account = accountService.getAccountByUserId(userId);
-        if (account.getBalance() <= 200) {
-            LOGGER.error("用户:{}余额不足2元,余额:{}", userId, account.getBalance());
-            throw new BusinessException(ResponseEnum.INSUFFICIENT_USER_BALANCE);
-        }
-
-        return account;
-    }
-
-    /**
-     * 启动充电
-     *
-     * @param order
-     * @param connectorId
-     * @param amount
-     * @return
-     */
-    private Map<String, String> startCharge(ChargeOrder order, String connectorId, int amount) {
-
-        // 请求设备认证
-        var equipAuth = enPlusService.queryEquipAuth(connectorId, order.getStartChargeSeq());
-
-        if (equipAuth.containsKey("SuccStat") && equipAuth.getIntValue("SuccStat") == 0) {
-            // 启动充电
-            JSONObject startCharge;
-
-            try {
-                // 二维码文本
-                var qrCode = "";
-                startCharge = enPlusService.queryStartCharge(order.getStartChargeSeq(), connectorId, qrCode, amount);
-            } catch (Exception e) {
-                // 这里可能超时,忽略
-                LOGGER.error("EN+启动充电超时,订单:{}", order.getStartChargeSeq());
-                // 启动充电超时,更新订单状态为取消
-                chargeOrderService.lambdaUpdate()
-                        .set(ChargeOrder::getOrderStatus, ChargeOrder.CHARGE_STATUS_已取消)
-                        .set(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_已取消)
-                        .set(ChargeOrder::getStopReason, "EN+启动充电超时")
-                        .eq(ChargeOrder::getStartChargeSeq, order.getStartChargeSeq()).update();
-                return Map.of("startChargeSeq", order.getStartChargeSeq());
-            }
-
-            if (startCharge != null && startCharge.containsKey("SuccStat") && startCharge.getIntValue("SuccStat") == 0) {
-                // 启动成功,更新充电订单状态
-                chargeOrderService.lambdaUpdate().set(ChargeOrder::getIsBooking, ChargeOrder.IS_BOOKING_否).set(ChargeOrder::getChargeStatus, startCharge.getIntValue("StartChargeSeqStat")).eq(ChargeOrder::getStartChargeSeq, order.getStartChargeSeq()).update();
-                return Map.of("startChargeSeq", order.getStartChargeSeq());
-            } else {
-                // 启动充电失败
-                LOGGER.error("设备启动充电失败:{}", startCharge);
-                switch (equipAuth.getIntValue("FailReason")) {
-                    case 1 -> // 设备不存在
-                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_NOT_EXIST);
-                    case 2 -> // 设备离线
-                        // todo 设备离线,加入重试机制
-                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_OFFLINE);
-                    case 3 -> // 存在未完成的订单
-                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_EXIST_ORDER_UNFINISHED);
-                    case 4 -> // 此订单为停车中
-                            throw new BusinessException(ResponseEnum.EN_PLUS_ORDER_IS_PARKING);
-                    case 5 -> // 此订单已关闭
-                            throw new BusinessException(ResponseEnum.EN_PLUS_ORDER_CLOSED);
-                    case 6 -> // 设备未插枪
-                            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_NOT_CONNECTED);
-                    case 7 -> // 预充金额存在且小于1元
-                            throw new BusinessException(ResponseEnum.INSUFFICIENT_USER_BALANCE);
-                }
-                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_CHECK_FAIL);
-            }
-            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_AUTH_FAIL);
-        }
-    }
-
-
-    /**
-     * 修改充电桩状态
-     *
-     * @param connectorId
-     */
-    @Override
-    public void updateEquipmentAndConnectorStatus(String connectorId) {
-        equipmentInfoService.lambdaUpdate().set(EquipmentInfo::getServiceStatus, EquipmentInfo.SERVICE_STATUS_预约中).eq(EquipmentInfo::getEquipmentId, connectorId.substring(0, 16)).update();
-        connectorInfoService.lambdaUpdate().set(ConnectorInfo::getStatus, EquipmentInfo.SERVICE_STATUS_预约中).eq(ConnectorInfo::getConnectorId, connectorId).update();
-    }
-
-
-    /**
-     * 请求EN+设备充电状态
-     *
-     * @return
-     */
-    @Override
-    public ChargeOrder queryEquipChargeStatus() {
-        var userId = StpUtil.getLoginIdAsLong();
-        var chargeOrder = chargeOrderService.getChargingOrderByUserId(userId);
-        if (chargeOrder != null) {
-            // 查询redis缓存,有数据则更新chargeOrder再返回
-            var orderDataStr = redisTemplate.opsForHash().get(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, chargeOrder.getStartChargeSeq());
-            if (CommUtil.isNotEmptyAndNull(orderDataStr)) {
-                var data = JSONObject.parseObject(orderDataStr.toString(), ChargeOrder.class);
-                // 更新订单信息
-                chargeOrder.setSoc(data.getSoc());
-                chargeOrder.setTotalPower(data.getTotalPower());
-                chargeOrder.setTotalMoney((data.getTotalMoney()));
-                chargeOrder.setElecMoney((data.getElecMoney()));
-                chargeOrder.setServiceMoney((data.getServiceMoney()));
-                chargeOrder.setSumPeriod(data.getSumPeriod());
-                chargeOrder.setChargeDetail(data.getChargeDetail());
-                chargeOrder.setChargeStatus(data.getChargeStatus());
-            }
-            return chargeOrder;
-        } else {
-            LOGGER.debug("用户:{}无进行中的订单", userId);
-            return null;
-        }
-    }
-
-    /**
-     * 获取设备接口编号和站点编号
-     *
-     * @param connectorId 充电桩id,短编号等
-     * @return
-     */
-    public Map<String, String> getConnectorIdAndStationId(String connectorId) {
-        var stationId = "";
-        if (connectorId.length() == 17) {
-            var equipmentRelation = equipmentRelationService.getByEquipmentId(connectorId.substring(0, 16));
-            stationId = equipmentRelation.getStationId();
-        } else if (connectorId.length() == 6) {
-            // 查询EN+设备SN
-            var equipmentRelation = equipmentRelationService.getByShortId(connectorId);
-            connectorId = equipmentRelation.getConnectorId();
-            stationId = equipmentRelation.getStationId();
-            if (connectorId.length() == 16) {
-                // 如果是16位,末尾补1作为单枪枪号
-                connectorId = connectorId.concat("1");
-            }
-        } else {
-            // 充电桩编号错误
-            LOGGER.error("设备编码错误:{}", connectorId);
-            throw new BusinessException(ResponseEnum.EQUIP_CONNECTOR_ID_ERROR);
-        }
-        return Map.of("connectorId", connectorId, "stationId", stationId);
-    }
-
-    public String getConnectorId(String connectorId) {
-        if (connectorId.length() == 17) {
-            return connectorId;
-        } else if (connectorId.length() == 6) {
-            // 查询EN+设备SN
-            var equipmentRelation = equipmentRelationService.getByShortId(connectorId);
-            connectorId = equipmentRelation.getConnectorId();
-            if (connectorId.length() == 16) {
-                // 如果是16位,末尾补1作为单枪枪号
-                connectorId = connectorId.concat("1");
-            }
-        } else {
-            // 充电桩编号错误
-            LOGGER.error("设备编码错误:{}", connectorId);
-            throw new BusinessException(ResponseEnum.EQUIP_CONNECTOR_ID_ERROR);
-        }
-        return connectorId;
-    }
-
-    /**
-     * 请求停止充电
-     *
-     * @param connectorId
-     */
-    @Override
-    public void queryStopCharge(long userId, String connectorId) {
-        connectorId = getConnectorId(connectorId);
-        LOGGER.info("用户:{},设备:{}请求停止充电", userId, connectorId);
-        // 查询充电订单
-        var chargeOrder = chargeOrderService.lambdaQuery().eq(ChargeOrder::getUserId, userId).eq(ChargeOrder::getConnectorId, connectorId).eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_充电中).one();
-        if (chargeOrder == null) {
-            // 记录失败原因
-            LOGGER.error("用户:{}请求停止充电异常,设备:{}无进行中的订单", userId, connectorId);
-            throw new BusinessException(ResponseEnum.NO_ORDER_IN_PROGRESS);
-        }
-        var data = enPlusService.queryStopCharge(chargeOrder.getStartChargeSeq(), connectorId);
-        if (data.containsKey("SuccStat") && data.getIntValue("SuccStat") != 0) {
-            // 记录失败原因
-            LOGGER.error("订单:{}停止充电失败,返回结果:{}", chargeOrder.getStartChargeSeq(), data);
-            throw new BusinessException(ResponseEnum.EN_PLUS_EQUIP_STOP_FAIL);
-        }
-        // 这里不更新订单状态,等待EN+推送停止充电结果信息再处理
-
-    }
-
-    /**
-     * 请求设备计费策略
-     *
-     * @param connectorId
-     * @return
-     */
-    @Override
-    public EnBusinessPolicy queryEquipBusinessPolicy(String connectorId) {
-        var equipBizSeq = OrderUtils.getOrderNo(enPlusConfig.getOperatorId());
-        var data = enPlusService.queryEquipBusinessPolicy(equipBizSeq, connectorId);
-        return data.toJavaObject(EnBusinessPolicy.class);
-    }
-
-}

+ 0 - 26
car-wash-service/src/main/java/com/kym/service/miniapp/impl/CollectServiceImpl.java

@@ -1,12 +1,9 @@
 package com.kym.service.miniapp.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
-
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.kym.entity.enplus.EnStationStatusInfo;
 import com.kym.entity.miniapp.Collect;
 import com.kym.mapper.miniapp.CollectMapper;
-import com.kym.service.admin.StationService;
 import com.kym.service.miniapp.CollectService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -24,11 +21,6 @@ import java.util.List;
 @Service
 public class CollectServiceImpl extends MPJBaseServiceImpl<CollectMapper, Collect> implements CollectService {
 
-    private final StationService stationService;
-
-    public CollectServiceImpl(StationService stationService) {
-        this.stationService = stationService;
-    }
 
     /**
      * 添加/取消收藏
@@ -61,24 +53,6 @@ public class CollectServiceImpl extends MPJBaseServiceImpl<CollectMapper, Collec
 
     }
 
-    /**
-     * 收藏列表
-     * 获取EN+对应站点数据
-     *
-     * @return
-     */
-    @Override
-    public List<EnStationStatusInfo> getCollectList() {
-        var userid = StpUtil.getLoginIdAsLong();
-        var collectList = lambdaQuery().eq(Collect::getUserId, userid).list().stream().map(c -> String.valueOf(c.getStationId())).toArray(String[]::new);
-        if (collectList.length == 0) {
-            return stationService.stationStatus(collectList);
-        } else {
-            return null;
-        }
-
-    }
-
     /**
      * 获取收藏列表,前端匹配站点详情数据
      *

+ 0 - 172
car-wash-service/src/main/java/com/kym/service/miniapp/impl/InvoiceServiceImpl.java

@@ -1,172 +0,0 @@
-package com.kym.service.miniapp.impl;
-
-import cn.dev33.satoken.stp.StpUtil;
-
-import com.github.pagehelper.PageHelper;
-import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.CommUtil;
-import com.kym.common.utils.OrderUtils;
-import com.kym.entity.admin.InvoiceDetail;
-import com.kym.entity.admin.queryParams.InvoiceQueryParam;
-import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.ChargeOrder;
-import com.kym.entity.miniapp.Invoice;
-import com.kym.entity.miniapp.User;
-import com.kym.entity.miniapp.queryParams.ApplyInvoiceParams;
-import com.kym.entity.miniapp.vo.InvoiceVo;
-import com.kym.entity.wechat.InvoiceOrderDetail;
-import com.kym.entity.wechat.TitleUrl;
-import com.kym.mapper.miniapp.InvoiceMapper;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.miniapp.DataDictService;
-import com.kym.service.miniapp.InvoiceService;
-import com.kym.service.wechat.WxPayService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * <p>
- * 发票记录表 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-09-15
- */
-@Service
-@Slf4j
-public class InvoiceServiceImpl extends MPJBaseServiceImpl<InvoiceMapper, Invoice> implements InvoiceService {
-
-    private final ChargeOrderService chargeOrderService;
-    private final WxPayService wxPayService;
-    private final DataDictService dataDictService;
-
-    public InvoiceServiceImpl(ChargeOrderService chargeOrderService, @Lazy WxPayService wxPayService, @Lazy DataDictService dataDictService) {
-        this.dataDictService = dataDictService;
-        this.chargeOrderService = chargeOrderService;
-        this.wxPayService = wxPayService;
-    }
-
-
-    /**
-     * 申请发票
-     * 业务流程:
-     * 1.校验订单
-     * 2.数据库写入invoice对象
-     * 3.api获取填写抬头的链接给前端
-     * 4.前端打开上一步返回的填写链接,客户填写抬头信息
-     * 5.接收抬头填写完成的通知,将抬头信息更新至第2步写入的invoice数据中
-     * 6.运营系统财务人员审核之后确认开票,请求api进行电子发票开票操作
-     *
-     * @param params
-     * @return
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public TitleUrl applyInvoice(ApplyInvoiceParams params) {
-        if (CommUtil.isEmptyOrNull(params.getStartChargeSeqs())) {
-            throw new BusinessException("请选择需要开票的订单");
-        }
-        // orderDetails 获取申请开票的订单
-        var userId = StpUtil.getLoginIdAsLong();
-        var orders = chargeOrderService.getChargeOrdersBySeqs(params.getStartChargeSeqs());
-
-        // 校验未完结的订单 orderStatus = 0
-        if (orders.stream().anyMatch(o -> o.getOrderStatus().equals(ChargeOrder.ORDER_STATUS_未知))) {
-            log.error("存在未知状态的订单:{}", orders.stream().filter(o -> o.getOrderStatus().equals(ChargeOrder.ORDER_STATUS_未知)).map(ChargeOrder::getStartChargeSeq).toArray());
-            throw new BusinessException("请勿勾选未完结的订单");
-        }
-
-        // 校验订单是已开票或者开票中
-        var invoiced = orders.stream().filter(o -> o.getInvoiceStatus().equals(ChargeOrder.INVOICE_STATUS_开票中) || o.getInvoiceStatus().equals(ChargeOrder.INVOICE_STATUS_已开票)).toList();
-        if (!invoiced.isEmpty()) {
-            log.error("存在已开票或者开票中的订单:{}", invoiced.stream().map(ChargeOrder::getStartChargeSeq).toArray());
-            throw new BusinessException("存在已开票或开票中的订单");
-        }
-
-        var orderDetails = orders.stream().map(item -> new InvoiceOrderDetail()
-                        .setStartChargeSeq(item.getStartChargeSeq())
-                        .setTotalPower(item.getTotalPower()).setTotalMoney(item.getTotalMoney())
-                        .setElecMoney(item.getElecMoney()).setServiceMoney(item.getServiceMoney())
-                        .setServiceMoneyDiscount(item.getServiceMoneyDiscount()))
-                .toList();
-
-        // 校验开票金额大于0
-        var totalPayAmount = orders.stream().mapToInt(ChargeOrder::getPayAmount).sum();
-        var elecMoney = orders.stream().mapToInt(ChargeOrder::getElecMoney).sum();
-        var serviceMoney = orders.stream().mapToInt(ChargeOrder::getServiceMoney).sum();
-        if (!(totalPayAmount > 0 && elecMoney > 0 && serviceMoney > 0)) {
-            throw new BusinessException("订单总金额或总电费或总服务费金额异常");
-        }
-        // 组装invoice
-
-        // todo 先放入缓存,等待抬头填写完成之后再写入数据库,设置超期时间,过期主动查询抬头填写情况
-        var invoice = new Invoice()
-                .setUserId(userId)
-                .setOpenid(StpUtil.getSession().getString("openid"))
-                .setApplyId(OrderUtils.getOrderNo())
-                .setOrderDetails(orderDetails) // 订单信息
-                .setInvoiceAmount(totalPayAmount)   // 发票金额
-                .setTotalMoney(elecMoney + serviceMoney) // 订单总金额
-                .setElecMoney(elecMoney)    // 电费
-                .setServiceMoney(serviceMoney)    // 服务费
-                .setTotalPower(orders.stream().mapToDouble(ChargeOrder::getTotalPower).sum())   // 总电量
-                .setServiceMoneyDiscount(orders.stream().mapToInt(ChargeOrder::getServiceMoneyDiscount).sum()); //总优惠服务费
-        baseMapper.insert(invoice);
-
-        // 更新订单开票状态为开票中
-        chargeOrderService.lambdaUpdate().set(ChargeOrder::getInvoiceStatus, ChargeOrder.INVOICE_STATUS_开票中)
-                .in(ChargeOrder::getStartChargeSeq, Arrays.stream(params.getStartChargeSeqs()).toList()).update();
-
-        return wxPayService.titleUrl(invoice);
-
-    }
-
-    @Override
-    public PageBean<InvoiceVo> listInvoice(InvoiceQueryParam params) {
-        PageHelper.startPage(params.getPageNum(), params.getPageSize());
-        MPJLambdaWrapper<Invoice> wrapper = JoinWrappers.lambda(Invoice.class)
-                .selectAsClass(Invoice.class, InvoiceVo.class)
-                .selectAll(Invoice.class)
-                .select(User::getMobilePhone)
-                .select(InvoiceDetail::getFapiaoTime)
-                .leftJoin(User.class, User::getId, Invoice::getUserId)
-                .leftJoin(InvoiceDetail.class, InvoiceDetail::getApplyId,Invoice::getApplyId)
-                .like(CommUtil.isNotEmptyAndNull(params.getPhone()), User::getMobilePhone, params.getPhone())
-                .like(CommUtil.isNotEmptyAndNull(params.getInvoiceTitle()), Invoice::getInvoiceTitle, params.getInvoiceTitle())
-                .like(CommUtil.isNotEmptyAndNull(params.getBiller()), Invoice::getBiller, params.getBiller())
-                .like(CommUtil.isNotEmptyAndNull(params.getTaxId()), Invoice::getTaxId, params.getTaxId())
-                .like(CommUtil.isNotEmptyAndNull(params.getInvoiceType()), Invoice::getInvoiceType, params.getInvoiceType())
-                .like(CommUtil.isNotEmptyAndNull(params.getEmail()), Invoice::getEmail, params.getEmail())
-                .eq(params.getStatus() != null, Invoice::getStatus, params.getStatus())
-                .orderByDesc(Invoice::getId);
-        var list = selectJoinList(InvoiceVo.class, wrapper);
-        return new PageBean<>(list);
-    }
-
-    @Override
-    public List<Invoice> listInvoiceForApp(Integer status) {
-        return lambdaQuery().eq(Invoice::getUserId, StpUtil.getLoginIdAsLong()).eq(status != null, Invoice::getStatus, status).list();
-    }
-
-    @Override
-    @Transactional
-    public void cancelApplyInvoice(String invoiceId) {
-        var invoice = lambdaQuery().eq(Invoice::getId, invoiceId).eq(Invoice::getStatus, Invoice.STATUS_待开票).orderByDesc(Invoice::getId).one();
-        if (!CommUtil.isEmptyOrNull(invoice)) {
-            // 订单发票状态修改为待开票
-            var startChargeSeqs = invoice.getOrderDetails().stream().map(InvoiceOrderDetail::getStartChargeSeq).toList();
-            chargeOrderService.lambdaUpdate().set(ChargeOrder::getInvoiceStatus, ChargeOrder.INVOICE_STATUS_待开票).in(ChargeOrder::getStartChargeSeq, startChargeSeqs).update();
-            // 发票状态已作废
-            lambdaUpdate().set(Invoice::getStatus, Invoice.STATUS_已作废).eq(Invoice::getId, invoice.getId()).update();
-        }
-    }
-
-}

+ 0 - 20
car-wash-service/src/main/java/com/kym/service/miniapp/impl/InvoiceTitleServiceImpl.java

@@ -1,20 +0,0 @@
-package com.kym.service.miniapp.impl;
-
-import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.kym.entity.miniapp.InvoiceTitle;
-import com.kym.mapper.miniapp.InvoiceTitleMapper;
-import com.kym.service.miniapp.InvoiceTitleService;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 发票记录表 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-09-21
- */
-@Service
-public class InvoiceTitleServiceImpl extends MPJBaseServiceImpl<InvoiceTitleMapper, InvoiceTitle> implements InvoiceTitleService {
-
-}

+ 0 - 25
car-wash-service/src/main/java/com/kym/service/wechat/WxPayService.java

@@ -1,7 +1,5 @@
 package com.kym.service.wechat;
 
-import com.kym.entity.miniapp.Invoice;
-import com.kym.entity.wechat.*;
 import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
 import com.wechat.pay.java.service.refund.model.Refund;
 import jakarta.servlet.http.HttpServletRequest;
@@ -31,30 +29,7 @@ public interface WxPayService {
     ResponseEntity<Object> wxNotify(HttpServletRequest request) throws IOException;
 
 
-    Object devConfig();
-
-    void cardTemplate();
-
-    Object getDevConfig();
-
     //================================================================发票=====================================================================
-    TitleUrl titleUrl(Invoice invoice);
-
-    void titleWriteNotice(Object[] notifyRes);
-
-    FaPiao.BuyerInformation userTitle(String applyId);
-
-    InvoiceBaseInfo baseInformation();
-
-    void fapiaoApplication(String invoiceId);
-
-    void wxInvoiceNotify(Object[] notifyRes);
-
-    void invoiceNotify(HttpServletRequest request);
-
-    Map<String, String> downloadInvoice(String invoiceId);
 
-    FapiaoDownload getFapiaoDownloadInfo(String applyId);
 
-    FapiaoApplications queryFapiao(String applyId);
 }

+ 6 - 383
car-wash-service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -6,9 +6,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.URLUtil;
 import com.alibaba.fastjson2.JSONObject;
-import com.kym.common.config.WxFapiaoConfig;
 import com.kym.common.config.WxPayConfig;
 import com.kym.common.constant.ResponseEnum;
 import com.kym.common.exception.BusinessException;
@@ -17,20 +15,14 @@ import com.kym.common.utils.LambadaTools;
 import com.kym.common.utils.OrderUtils;
 import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.*;
-import com.kym.entity.wechat.*;
 import com.kym.service.admin.ActivityService;
-import com.kym.service.admin.InvoiceDetailService;
-import com.kym.service.enplus.EnPlusService;
 import com.kym.service.miniapp.*;
 import com.kym.service.wechat.WxPayService;
 import com.wechat.pay.java.core.Config;
 import com.wechat.pay.java.core.RSAAutoCertificateConfig;
 import com.wechat.pay.java.core.exception.ValidationException;
 import com.wechat.pay.java.core.http.DefaultHttpClientBuilder;
-import com.wechat.pay.java.core.http.HttpHeaders;
-import com.wechat.pay.java.core.http.JsonRequestBody;
 import com.wechat.pay.java.core.http.okhttp.OkHttpClientAdapter;
-import com.wechat.pay.java.core.notification.Notification;
 import com.wechat.pay.java.core.notification.NotificationConfig;
 import com.wechat.pay.java.core.notification.NotificationParser;
 import com.wechat.pay.java.core.notification.RequestParam;
@@ -62,7 +54,6 @@ import java.math.RoundingMode;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -84,8 +75,6 @@ public class WxPayServiceImpl implements WxPayService {
     public static Config config;
     private final WxPayConfig conf;
 
-    private final WxFapiaoConfig fapiaoConfig;
-
     private final WalletDetailService walletDetailService;
 
     private final PayLogService payLogService;
@@ -96,17 +85,10 @@ public class WxPayServiceImpl implements WxPayService {
 
     private final RefundLogService refundLogService;
 
-    private final InvoiceService invoiceService;
-
-    private final InvoiceTitleService invoiceTitleService;
-
-    private final EnPlusService enPlusService;
-
     private final ActivityService activityService;
 
     private final UserRechargeRightsService userRechargeRightsService;
 
-    private final InvoiceDetailService invoiceDetailService;
     private final RechargeConfigService rechargeConfigService;
 
 
@@ -116,24 +98,19 @@ public class WxPayServiceImpl implements WxPayService {
     private OkHttpClientAdapter wxHttpClient;
 
 
-    public WxPayServiceImpl(WxPayConfig conf, WxFapiaoConfig fapiaoConfig, WalletDetailService walletDetailService,
+    public WxPayServiceImpl(WxPayConfig conf, WalletDetailService walletDetailService,
                             PayLogService payLogService, AccountService accountService, ChargeOrderService chargeOrderService,
-                            RefundLogService refundLogService, InvoiceService invoiceService, InvoiceTitleService invoiceTitleService,
-                            EnPlusService enPlusService, ActivityService activityService, UserRechargeRightsService userRechargeRightsService,
-                            InvoiceDetailService invoiceDetailService, RechargeConfigService rechargeConfigService) {
+                            RefundLogService refundLogService,
+                            ActivityService activityService, UserRechargeRightsService userRechargeRightsService,
+                            RechargeConfigService rechargeConfigService) {
         this.conf = conf;
-        this.fapiaoConfig = fapiaoConfig;
         this.walletDetailService = walletDetailService;
         this.payLogService = payLogService;
         this.accountService = accountService;
         this.chargeOrderService = chargeOrderService;
         this.refundLogService = refundLogService;
-        this.invoiceService = invoiceService;
-        this.invoiceTitleService = invoiceTitleService;
-        this.enPlusService = enPlusService;
         this.activityService = activityService;
         this.userRechargeRightsService = userRechargeRightsService;
-        this.invoiceDetailService = invoiceDetailService;
         this.rechargeConfigService = rechargeConfigService;
     }
 
@@ -365,8 +342,8 @@ public class WxPayServiceImpl implements WxPayService {
                 // 如果存在进行中的订单,则向en+更新用户余额
                 var chargingOrder = chargeOrderService.getChargingOrderByUserId(walletDetail.getUserId());
                 if (chargingOrder != null) {
-                    var res = enPlusService.updateBalanceByQueryEquipChargeStatus(chargingOrder.getStartChargeSeq(), account.getBalance() - 50);
-                    LOGGER.info("用户:{}充电过程中充值,已更新en+充电金额,en+返回数据:{}", account.getUserId(), res);
+//                    var res = enPlusService.updateBalanceByQueryEquipChargeStatus(chargingOrder.getStartChargeSeq(), account.getBalance() - 50);
+//                    LOGGER.info("用户:{}充电过程中充值,已更新en+充电金额,en+返回数据:{}", account.getUserId(), res);
                 }
                 return ResponseEntity.status(HttpStatus.OK).build();
 
@@ -629,359 +606,5 @@ public class WxPayServiceImpl implements WxPayService {
 
     //================================================================发票=====================================================================
 
-    /**
-     * 微信电子发票配置开发选项,例如回调地址、全部账单展示开发票入口开关
-     */
-    @Override
-    public Object devConfig() {
-        // 创建卡券模版
-        cardTemplate();
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        headers.addHeader("Content-Type", "application/json");
-        var params = JSONObject.of("callback_url", "https://wash.kuaiyuman.cn/api/invoice/notify", "show_fapiao_cell", false);
-        var requestBody = new JsonRequestBody.Builder().body(params.toJSONString()).build();
-        var res = wxHttpClient.patch(headers, fapiaoConfig.getDevConfig(), requestBody, JSONObject.class);
-        LOGGER.info("微信电子发票开发设置:{}", res.toString());
-        return res.getServiceResponse();
-    }
-
-    /**
-     * 创建电子发票卡券模版
-     */
-    @Override
-    public void cardTemplate() {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        headers.addHeader("Content-Type", "application/json");
-        var params = JSONObject.of(
-                "card_appid", "wx93b0ef1be901bd19", // 公众号appid,不是小程序appid
-                "card_template_information", JSONObject.of(
-                        "logo_url", "https://kym-static.oss-cn-shenzhen.aliyuncs.com/logo/K7.png"
-                )
-        );
-        var requestBody = new JsonRequestBody.Builder().body(params.toJSONString()).build();
-        var res = wxHttpClient.post(headers, fapiaoConfig.getCardTemplate(), requestBody, JSONObject.class);
-        LOGGER.info("创建电子发票卡券模版:{}", res);
-    }
-
-    /**
-     * 查询商户配置的开发选项
-     */
-    @Override
-    public Object getDevConfig() {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        headers.addHeader("Content-Type", "application/json");
-        var res = wxHttpClient.get(headers, fapiaoConfig.getDevConfig(), JSONObject.class);
-        LOGGER.info("查询微信电子发票开发设置:{}", res.toString());
-        return res;
-    }
-
-    /**
-     * 获取用户抬头信息填写URL
-     *
-     * @param invoice
-     * @return
-     */
-    @Override
-    public TitleUrl titleUrl(Invoice invoice) {
-        var headers = new HttpHeaders();
-        var params = Map.of(
-                "fapiao_apply_id", invoice.getApplyId(),
-                "appid", conf.getAppid(),
-                "openid", invoice.getOpenid(),
-                "total_amount", invoice.getInvoiceAmount(),
-                "source", "MINIPROGRAM"
-        );
-        headers.addHeader("Accept", "application/json");
-        var res = wxHttpClient.get(headers, fapiaoConfig.getTitleUrl().concat("?").concat(URLUtil.buildQuery(params, StandardCharsets.UTF_8)), TitleUrl.class);
-        return res.getServiceResponse();
-    }
-
-
-    /**
-     * 处理发票抬头填写完成通知
-     * event_type为FAPIAO.USER_APPLIED
-     *
-     * @param notifyRes
-     */
-    @Override
-    public void titleWriteNotice(Object[] notifyRes) {
-        try {
-            TitleWriteNotification titleWriteNotification = ((NotificationParser) notifyRes[1]).parse((RequestParam) notifyRes[0], TitleWriteNotification.class);
-
-            // 查询用户填写的抬头信息
-            var applyId = titleWriteNotification.getFapiaoApplyId();
-            LOGGER.info("回调成功,applyId:{}", applyId);
-            var buyerInformation = userTitle(applyId);
-
-            // 更新invoice表数据
-            var invoice = invoiceService.lambdaQuery().eq(Invoice::getApplyId, applyId).one();
-            invoice.setInvoiceType(buyerInformation.getType())
-                    .setInvoiceTitle(buyerInformation.getName())
-                    .setTaxId(buyerInformation.getTaxpayer_id())
-                    .setAddress(buyerInformation.getAddress())
-                    .setTelephone(buyerInformation.getTelephone())
-                    .setBankName(buyerInformation.getBank_name())
-                    .setBankAccount(buyerInformation.getBank_account())
-                    .setEmail(buyerInformation.getEmail())
-                    .setPhone(buyerInformation.getPhone());
-            invoiceService.updateById(invoice);
-
-            // 将发票抬头写入用户抬头表
-            var invoiceTitle = new InvoiceTitle()
-                    .setUserId(invoice.getUserId())
-                    .setInvoiceType(buyerInformation.getType())
-                    .setInvoiceTitle(buyerInformation.getName())
-                    .setTaxId(buyerInformation.getTaxpayer_id())
-                    .setTelephone(buyerInformation.getTelephone())
-                    .setAddress(buyerInformation.getAddress())
-                    .setBankName(buyerInformation.getBank_name())
-                    .setBankAccount(buyerInformation.getBank_account())
-                    .setEmail(buyerInformation.getEmail())
-                    .setPhone(buyerInformation.getPhone());
-            boolean exist = invoiceTitleService.lambdaQuery()
-                    .eq(InvoiceTitle::getUserId, invoiceTitle.getUserId())
-                    .eq(InvoiceTitle::getTaxId, invoiceTitle.getTaxId())
-                    .exists();
-            if (!exist) {
-                invoiceTitleService.save(invoiceTitle);
-            }
-            // 运营后台财务操作开具发票
-        } catch (ValidationException e) {
-            // 签名验证失败,返回 401 UNAUTHORIZED 状态码
-            LOGGER.error("微信处理发票抬头填写完成通知验签失败", e);
-            throw new BusinessException("验签失败");
-        }
-    }
-
-    /**
-     * 获取用户填写的抬头信息
-     *
-     * @param applyId
-     * @return
-     */
-    @Override
-    public FaPiao.BuyerInformation userTitle(String applyId) {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        var res = wxHttpClient.get(headers, fapiaoConfig.getUserTitle().formatted(applyId), FaPiao.BuyerInformation.class);
-        LOGGER.info("用户发票申请applyId:{},抬头信息:{}", applyId, res);
-        return res.getServiceResponse();
-    }
-
-    /**
-     * 获取商户开票基础信息
-     */
-    @Override
-    public InvoiceBaseInfo baseInformation() {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        var res = wxHttpClient.get(headers, fapiaoConfig.getBaseInformation(), InvoiceBaseInfo.class);
-        return res.getServiceResponse();
-    }
-
-
-    /**
-     * 获取商户可开具的商品和服务税收分类编码对照表
-     */
-    private TaxCodes getTaxCodes() {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        var url = fapiaoConfig.getTaxCodes().concat("?offset=%d&limit=%d").formatted(0, 5);
-        var res = wxHttpClient.get(headers, url, TaxCodes.class);
-        return res.getServiceResponse();
-    }
-
-
-    /**
-     * 开具电子发票
-     */
-    @Override
-    public void fapiaoApplication(String invoiceId) {
-        var invoice = invoiceService.lambdaQuery().eq(Invoice::getId, invoiceId).one();
-        // 开票状态校验
-        if (!invoice.getStatus().equals(Invoice.STATUS_待开票)) {
-            throw new BusinessException("发票状态为开票中或已开票");
-        }
-        // 记录开票人
-        invoiceService.lambdaUpdate().set(Invoice::getBiller, StpUtil.getSession().getString("username")).eq(Invoice::getId, invoice.getId()).update();
-
-        // 订单金额+ ,服务费优惠金额- 服务费优惠金额单独一个item,金额为负数
-        var itemList = new ArrayList<FaPiao.FaPiaoInfomation.IssueItem>();
-        // 电费 税务商品编码:1100101020000000000
-        var elecMoney = invoice.getOrderDetails().stream().mapToInt(InvoiceOrderDetail::getElecMoney).sum();
-        // 必须为正数
-        if (elecMoney > 0) {
-            var elecMoneyItem = new FaPiao.FaPiaoInfomation.IssueItem().setTotal_amount(elecMoney).setTax_code("1100101020000000000");
-            itemList.add(elecMoneyItem);
-        }
-        // 服务费 税务商品编码:3040100000000000000
-        var serviceMoney = invoice.getOrderDetails().stream().mapToInt(InvoiceOrderDetail::getServiceMoney).sum();
-        // 必须为正数
-        if (serviceMoney > 0) {
-            var serviceMoneyItem = new FaPiao.FaPiaoInfomation.IssueItem().setTotal_amount(serviceMoney).setTax_code("3040100000000000000");
-            itemList.add(serviceMoneyItem);
-        }
-
-        // 服务费优惠 税务商品编码:3040100000000000000  注意:折扣行必须是被折扣行的下一行
-        var serviceMoneyDiscount = -invoice.getOrderDetails().stream().mapToInt(InvoiceOrderDetail::getServiceMoneyDiscount).sum();
-        // 必须为负数
-        if (serviceMoneyDiscount < 0) {
-            var serviceMoneyDiscountItem = new FaPiao.FaPiaoInfomation.IssueItem().setTotal_amount(serviceMoneyDiscount).setTax_code("3040100000000000000").setDiscount(true);
-            itemList.add(serviceMoneyDiscountItem);
-        }
-
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        headers.addHeader("Content-Type", "application/json");
-        headers.addHeader("Wechatpay-Serial", conf.getMchsn());
-
-        // 客户开票信息
-        var buyerInformation = new FaPiao.BuyerInformation()
-                .setType(invoice.getInvoiceType())
-                .setName(invoice.getInvoiceTitle())
-                .setTaxpayer_id(invoice.getTaxId())
-                .setTelephone(invoice.getTelephone())
-                .setAddress(invoice.getAddress())
-                .setBank_name(invoice.getBankName())
-                .setBank_account(invoice.getBankAccount());
-
-        // 发票信息
-        var fapiaoInformation = new FaPiao.FaPiaoInfomation();
-        // fapiao_id为invoice.id
-        fapiaoInformation.setFapiao_id(String.valueOf(invoice.getId()))
-                .setTotal_amount(invoice.getInvoiceAmount())
-                .setItems(itemList);
-
-        // 请求参数
-        var fapiao = new FaPiao()
-                .setScene("WITHOUT_WECHATPAY")
-                .setFapiao_apply_id(invoice.getApplyId())
-                .setBuyer_information(buyerInformation)
-                .setFapiao_information(List.of(fapiaoInformation));
-
-        var requestBody = new JsonRequestBody.Builder().body(JSONObject.toJSONString(fapiao)).build();
-        wxHttpClient.post(headers, fapiaoConfig.getFapiaoApplications(), requestBody, null);
-        // 修改发票状态为开票中
-        invoiceService.lambdaUpdate().set(Invoice::getStatus, Invoice.STATUS_开票中).eq(Invoice::getId, invoiceId).update();
-    }
-
-    /**
-     * 微信开票结果通知
-     * event_type为FAPIAO.ISSUED
-     *
-     * @param notifyRes
-     * @return
-     */
-    @Override
-    @Transactional
-    public void wxInvoiceNotify(Object[] notifyRes) {
-        try {
-            InvoiceNotification invoiceNotification = ((NotificationParser) notifyRes[1]).parse((RequestParam) notifyRes[0], InvoiceNotification.class);
-            LOGGER.info("微信开具发票结果通知回调{}:验签解密完毕,数据:\n{}", notifyRes[2], invoiceNotification);
-            // 业务逻辑
-            if (invoiceNotification.getFapiaoInformation().get(0).getFapiaoStatus().equals(InvoiceNotification.FapiaoStatus.ISSUED.name())) {
-                // 更新发票状态
-                invoiceService.lambdaUpdate().set(Invoice::getStatus, Invoice.STATUS_已开票).eq(Invoice::getApplyId, invoiceNotification.getFapiaoApplyId()).update();
-                var invoice = invoiceService.lambdaQuery().eq(Invoice::getApplyId, invoiceNotification.getFapiaoApplyId()).one();
-                // 更新订单开票状态为已开票
-                var chargeOrderSeqs = invoice.getOrderDetails().stream().map(InvoiceOrderDetail::getStartChargeSeq).toList();
-                if (!CommUtil.isEmptyOrNull(chargeOrderSeqs)) {
-                    chargeOrderService.lambdaUpdate().set(ChargeOrder::getInvoiceStatus, ChargeOrder.INVOICE_STATUS_已开票).in(ChargeOrder::getStartChargeSeq, chargeOrderSeqs).update();
-                }
-                /*
-                 * 销项发票excel数据中需包含:
-                 * 1.开票日期
-                 * 2.购买方名称及税号
-                 * 3.开票明细、金额、税额
-                 * 4.开票优惠明细、金额、税额
-                 * 5.发票状态是否作废或者红冲
-                 */
-                var fapiaoApplications = queryFapiao(invoice.getApplyId());
-                invoiceDetailService.updateInvoiceDetail(invoice.getApplyId(), fapiaoApplications);
-            } else {
-                LOGGER.error("微信开具发票失败:{}", invoiceNotification);
-            }
-        } catch (ValidationException e) {
-            // 签名验证失败,返回 401 UNAUTHORIZED 状态码
-            LOGGER.error("微信开具发票结果通知验签失败", e);
-            throw new BusinessException("验签失败");
-        }
-    }
-
-
-    /**
-     * 接收电子发票相关回调通知
-     *
-     * @param request
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void invoiceNotify(HttpServletRequest request) {
-        var notifyRes = handleWxNotify(request);
-        var requestParam = (RequestParam) notifyRes[0];
-        Notification notification = JSONObject.parseObject(requestParam.getBody(), Notification.class);
-        switch (notification.getEventType()) {
-            // 发票抬头填写完成
-            case "FAPIAO.USER_APPLIED" -> titleWriteNotice(notifyRes);
-            // 发票开具结果
-            case "FAPIAO.ISSUED" -> wxInvoiceNotify(notifyRes);
-        }
-    }
-
-
-    /**
-     * 下载发票,下载链接30s有效
-     *
-     * @param invoiceId
-     * @return
-     */
-    @Override
-    public Map<String, String> downloadInvoice(String invoiceId) {
-        var invoice = invoiceService.getById(invoiceId);
-        var download = getFapiaoDownloadInfo(invoice.getApplyId());
-        var downloadInfo = download.getFapiao_download_info_list().get(0);
-        // 查询电子发票
-        var fapiaoApplications = queryFapiao(invoice.getApplyId());
-
-        var params = "&mchid=%s&openid=%s&invoice_code=%s&invoice_no=%s&fapiao_id=%s";
-        // openid 通过查询电子发票接口获取的card_openid
-        var fapiao = fapiaoApplications.getFapiao_information().get(0);
-        var downloadUrl = downloadInfo.getDownload_url().concat(params.formatted(conf.getMchid(),
-                fapiao.getCard_information().getCard_openid(), fapiao.getBlue_fapiao().getFapiao_code(),
-                fapiao.getBlue_fapiao().getFapiao_number(), invoice.getId()));
-        return Map.of("downloadUrl", downloadUrl);
-    }
-
-    /**
-     * 获取发票下载信息
-     *
-     * @param applyId
-     * @return
-     */
-    @Override
-    public FapiaoDownload getFapiaoDownloadInfo(String applyId) {
-        var downloadUrl = fapiaoConfig.getFapiaoFiles().formatted(applyId);
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        var res = wxHttpClient.get(headers, downloadUrl, FapiaoDownload.class);
-        return res.getServiceResponse();
-    }
-
-    /**
-     * 查询电子发票
-     *
-     * @param applyId
-     */
-    @Override
-    public FapiaoApplications queryFapiao(String applyId) {
-        var headers = new HttpHeaders();
-        headers.addHeader("Accept", "application/json");
-        headers.addHeader("Content-Type", "application/json");
-        var res = wxHttpClient.get(headers, fapiaoConfig.getQueryFapiao().formatted(applyId), FapiaoApplications.class);
-        return res.getServiceResponse();
-    }
 
 }