Sfoglia il codice sorgente

feat(charging): 实现小程序充电启动与停止功能

- 新增启动充电接口/invokeCharge,支持订单创建与设备认证
- 新增结束充电接口/stopCharge,用于停止充电操作
- 重命名AppletChargingCostVO为AppChargingCostVO
- 重命名AppletGainCouponForm为AppGainCouponForm
- 重命名AppletStationSearchVO为AppStationSearchVO
- 重命名AppletUserInfoVO为AppUserInfoVO
- 新增充电订单号与设备流水号生成逻辑
- 新增充电状态回调处理,更新订单状态
- 优化充电金额计算逻辑,支持跨时段计费
- 调整订单类型字段含义,0表示个人订单,1表示企业订单
wzq 2 giorni fa
parent
commit
07a0568938
34 ha cambiato i file con 841 aggiunte e 112 eliminazioni
  1. 81 0
      src/main/java/com/zsElectric/boot/business/controller/DiscountsActivityController.java
  2. 32 1
      src/main/java/com/zsElectric/boot/business/controller/applet/AppletChargeController.java
  3. 4 2
      src/main/java/com/zsElectric/boot/business/controller/applet/AppletStationController.java
  4. 5 5
      src/main/java/com/zsElectric/boot/business/controller/applet/AppletUserController.java
  5. 20 0
      src/main/java/com/zsElectric/boot/business/converter/DiscountsActivityConverter.java
  6. 15 3
      src/main/java/com/zsElectric/boot/business/mapper/DiscountsActivityMapper.java
  7. 4 4
      src/main/java/com/zsElectric/boot/business/mapper/ThirdPartyStationInfoMapper.java
  8. 2 2
      src/main/java/com/zsElectric/boot/business/mapper/UserInfoMapper.java
  9. 10 2
      src/main/java/com/zsElectric/boot/business/model/entity/ChargeOrderInfo.java
  10. 2 11
      src/main/java/com/zsElectric/boot/business/model/entity/DiscountsActivity.java
  11. 3 0
      src/main/java/com/zsElectric/boot/business/model/form/ChargeOrderInfoForm.java
  12. 70 0
      src/main/java/com/zsElectric/boot/business/model/form/DiscountsActivityForm.java
  13. 1 2
      src/main/java/com/zsElectric/boot/business/model/form/applet/AppGainCouponForm.java
  14. 40 0
      src/main/java/com/zsElectric/boot/business/model/form/applet/AppInvokeChargeForm.java
  15. 23 0
      src/main/java/com/zsElectric/boot/business/model/query/DiscountsActivityQuery.java
  16. 50 0
      src/main/java/com/zsElectric/boot/business/model/vo/DiscountsActivityVO.java
  17. 1 1
      src/main/java/com/zsElectric/boot/business/model/vo/applet/AppChargingCostVO.java
  18. 20 0
      src/main/java/com/zsElectric/boot/business/model/vo/applet/AppInvokeChargeVO.java
  19. 1 1
      src/main/java/com/zsElectric/boot/business/model/vo/applet/AppStationSearchVO.java
  20. 1 1
      src/main/java/com/zsElectric/boot/business/model/vo/applet/AppUserInfoVO.java
  21. 5 3
      src/main/java/com/zsElectric/boot/business/service/AppletHomeService.java
  22. 5 0
      src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java
  23. 2 3
      src/main/java/com/zsElectric/boot/business/service/CouponService.java
  24. 58 0
      src/main/java/com/zsElectric/boot/business/service/DiscountsActivityService.java
  25. 2 2
      src/main/java/com/zsElectric/boot/business/service/UserInfoService.java
  26. 46 44
      src/main/java/com/zsElectric/boot/business/service/impl/AppletHomeServiceImpl.java
  27. 144 2
      src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java
  28. 2 3
      src/main/java/com/zsElectric/boot/business/service/impl/CouponServiceImpl.java
  29. 103 0
      src/main/java/com/zsElectric/boot/business/service/impl/DiscountsActivityServiceImpl.java
  30. 2 2
      src/main/java/com/zsElectric/boot/business/service/impl/UserInfoServiceImpl.java
  31. 63 15
      src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java
  32. 21 0
      src/main/resources/mapper/business/DiscountsActivityMapper.xml
  33. 2 2
      src/main/resources/mapper/business/ThirdPartyStationInfoMapper.xml
  34. 1 1
      src/main/resources/mapper/business/UserInfoMapper.xml

+ 81 - 0
src/main/java/com/zsElectric/boot/business/controller/DiscountsActivityController.java

@@ -0,0 +1,81 @@
+package com.zsElectric.boot.business.controller;
+
+import com.zsElectric.boot.business.service.DiscountsActivityService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zsElectric.boot.business.model.form.DiscountsActivityForm;
+import com.zsElectric.boot.business.model.query.DiscountsActivityQuery;
+import com.zsElectric.boot.business.model.vo.DiscountsActivityVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zsElectric.boot.core.web.PageResult;
+import com.zsElectric.boot.core.web.Result;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import jakarta.validation.Valid;
+
+/**
+ * 优惠活动前端控制层
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Tag(name = "优惠活动接口")
+@RestController
+@RequestMapping("/api/v1/discounts-activity")
+@RequiredArgsConstructor
+public class DiscountsActivityController {
+
+    private final DiscountsActivityService discountsActivityService;
+
+    @Operation(summary = "优惠活动分页列表")
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPerm('business:discounts-activity:query')")
+    public PageResult<DiscountsActivityVO> getDiscountsActivityPage(DiscountsActivityQuery queryParams) {
+        IPage<DiscountsActivityVO> result = discountsActivityService.getDiscountsActivityPage(queryParams);
+        return PageResult.success(result);
+    }
+
+    @Operation(summary = "新增优惠活动")
+    @PostMapping
+    @PreAuthorize("@ss.hasPerm('business:discounts-activity:add')")
+    public Result<Void> saveDiscountsActivity(@RequestBody @Valid DiscountsActivityForm formData) {
+        boolean result = discountsActivityService.saveDiscountsActivity(formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "获取优惠活动表单数据")
+    @GetMapping("/{id}/form")
+    @PreAuthorize("@ss.hasPerm('business:discounts-activity:edit')")
+    public Result<DiscountsActivityForm> getDiscountsActivityForm(
+            @Parameter(description = "优惠活动ID") @PathVariable Long id
+    ) {
+        DiscountsActivityForm formData = discountsActivityService.getDiscountsActivityFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改优惠活动")
+    @PutMapping(value = "/{id}")
+    @PreAuthorize("@ss.hasPerm('business:discounts-activity:edit')")
+    public Result<Void> updateDiscountsActivity(
+            @Parameter(description = "优惠活动ID") @PathVariable Long id,
+            @RequestBody @Validated DiscountsActivityForm formData
+    ) {
+        boolean result = discountsActivityService.updateDiscountsActivity(id, formData);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除优惠活动")
+    @DeleteMapping("/{ids}")
+    @PreAuthorize("@ss.hasPerm('business:discounts-activity:delete')")
+    public Result<Void> deleteDiscountsActivitys(
+            @Parameter(description = "优惠活动ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+        boolean result = discountsActivityService.deleteDiscountsActivitys(ids);
+        return Result.judge(result);
+    }
+}

+ 32 - 1
src/main/java/com/zsElectric/boot/business/controller/applet/AppletChargeController.java

@@ -1,20 +1,25 @@
 package com.zsElectric.boot.business.controller.applet;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
 import com.zsElectric.boot.business.service.ChargeOrderInfoService;
 import com.zsElectric.boot.core.web.Result;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-@Tag(name = "充电相关接口")
+@Tag(name = "充电订单相关接口")
 @Slf4j
 @RestController
 @RequestMapping("/applet/v1/charge")
@@ -35,4 +40,30 @@ public class AppletChargeController {
         IPage<ChargeOrderInfoVO> page = chargeOrderInfoService.getPage(queryParams);
         return Result.success(page);
     }
+
+    /**
+     * 启用充电
+     *
+     * @param formData
+     * @return
+     */
+    @Operation(summary = "启用充电")
+    @PostMapping("/invokeCharge")
+    public Result<AppInvokeChargeVO> invokeCharge(@Valid @RequestBody AppInvokeChargeForm formData) {
+        AppInvokeChargeVO appInvokeChargeVO = chargeOrderInfoService.invokeCharge(formData);
+        return Result.success(appInvokeChargeVO);
+    }
+
+    /**
+     * 结束充电
+     *
+     * @param formData
+     * @return
+     */
+    @Operation(summary = "结束充电")
+    @PostMapping("/stopCharge")
+    public Result<T> stopCharge(@RequestBody AppInvokeChargeForm formData) {
+//        chargeOrderInfoService.invokeCharge(formData);
+        return Result.success();
+    }
 }

+ 4 - 2
src/main/java/com/zsElectric/boot/business/controller/applet/AppletStationController.java

@@ -3,6 +3,8 @@ package com.zsElectric.boot.business.controller.applet;
 import com.zsElectric.boot.business.model.vo.AppletConnectorListVO;
 import com.zsElectric.boot.business.model.vo.AppletStationDetailVO;
 import com.zsElectric.boot.business.model.vo.AppletStationPriceListVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
+import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletChargingCostVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletConnectorDetailVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletStationSearchVO;
@@ -78,7 +80,7 @@ public class AppletStationController {
     @Operation(summary = "获取当前充电订单实时费用")
     @GetMapping("/charging-cost")
     @ApiRateLimit(prefix = "applet:charging_cost", limitType = ApiRateLimit.LimitType.IP, count = 2000, time = 60, message = "获取充电费用请求过于频繁,请稍后再试")
-    public Result<AppletChargingCostVO> getCurrentChargingCost() {
+    public Result<AppChargingCostVO> getCurrentChargingCost() {
         return Result.success(appletHomeService.getCurrentChargingCost());
     }
 
@@ -92,7 +94,7 @@ public class AppletStationController {
      */
     @Operation(summary = "搜索充电站")
     @GetMapping("/search")
-    public Result<List<AppletStationSearchVO>> searchStations(
+    public Result<List<AppStationSearchVO>> searchStations(
             @RequestParam String keyword,
             @RequestParam(required = false) BigDecimal longitude,
             @RequestParam(required = false) BigDecimal latitude) {

+ 5 - 5
src/main/java/com/zsElectric/boot/business/controller/applet/AppletUserController.java

@@ -5,13 +5,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zsElectric.boot.business.model.entity.UserFeedback;
 import com.zsElectric.boot.business.model.form.UserFeedbackForm;
 import com.zsElectric.boot.business.model.form.applet.AppFeedbackForm;
-import com.zsElectric.boot.business.model.form.applet.AppletGainCouponForm;
+import com.zsElectric.boot.business.model.form.applet.AppGainCouponForm;
 import com.zsElectric.boot.business.model.query.CouponTemplateQuery;
 import com.zsElectric.boot.business.model.query.applet.AppCouponQuery;
 import com.zsElectric.boot.business.model.vo.CouponTemplateVO;
 import com.zsElectric.boot.business.model.vo.CouponVO;
 import com.zsElectric.boot.business.model.vo.applet.AppCouponStatusNumVO;
-import com.zsElectric.boot.business.model.vo.applet.AppletUserInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 import com.zsElectric.boot.business.service.CouponService;
 import com.zsElectric.boot.business.service.CouponTemplateService;
 import com.zsElectric.boot.business.service.UserFeedbackService;
@@ -43,8 +43,8 @@ public class AppletUserController {
 
     @Operation(summary = "微信小程序获取当前登录信息")
     @GetMapping("/getUserInfo")
-    public Result<AppletUserInfoVO> getUserInfo() {
-        AppletUserInfoVO userInfoVO = userInfoService.getAppletUserInfo();
+    public Result<AppUserInfoVO> getUserInfo() {
+        AppUserInfoVO userInfoVO = userInfoService.getAppletUserInfo();
         return Result.success(userInfoVO);
     }
 
@@ -100,7 +100,7 @@ public class AppletUserController {
 
     @Operation(summary = "领取优惠券")
     @PostMapping("/gainCoupon")
-    public Result<Boolean> gainCoupon(@RequestBody AppletGainCouponForm formData) {
+    public Result<Boolean> gainCoupon(@RequestBody AppGainCouponForm formData) {
         Boolean result = couponService.gainCoupon(formData);
         return Result.judge(result);
     }

+ 20 - 0
src/main/java/com/zsElectric/boot/business/converter/DiscountsActivityConverter.java

@@ -0,0 +1,20 @@
+package com.zsElectric.boot.business.converter;
+
+import org.mapstruct.Mapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zsElectric.boot.business.model.entity.DiscountsActivity;
+import com.zsElectric.boot.business.model.form.DiscountsActivityForm;
+
+/**
+ * 优惠活动对象转换器
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Mapper(componentModel = "spring")
+public interface DiscountsActivityConverter {
+
+    DiscountsActivityForm toForm(DiscountsActivity entity);
+
+    DiscountsActivity toEntity(DiscountsActivityForm formData);
+}

+ 15 - 3
src/main/java/com/zsElectric/boot/business/mapper/DiscountsActivityMapper.java

@@ -2,15 +2,27 @@ package com.zsElectric.boot.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zsElectric.boot.business.model.entity.DiscountsActivity;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zsElectric.boot.business.model.query.DiscountsActivityQuery;
+import com.zsElectric.boot.business.model.vo.DiscountsActivityVO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
- * 优惠活动 Mapper 接口
+ * 优惠活动Mapper接口
  *
- * @author system
- * @since 2025-12-22
+ * @author zsElectric
+ * @since 2025-12-20 16:16
  */
 @Mapper
 public interface DiscountsActivityMapper extends BaseMapper<DiscountsActivity> {
 
+    /**
+     * 获取优惠活动分页数据
+     *
+     * @param page        分页对象
+     * @param queryParams 查询参数
+     * @return {@link Page<DiscountsActivityVO>} 优惠活动分页列表
+     */
+    Page<DiscountsActivityVO> getDiscountsActivityPage(Page<DiscountsActivityVO> page, DiscountsActivityQuery queryParams);
+
 }

+ 4 - 4
src/main/java/com/zsElectric/boot/business/mapper/ThirdPartyStationInfoMapper.java

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zsElectric.boot.business.model.vo.AppletStationDetailVO;
 import com.zsElectric.boot.business.model.vo.StationInfoMapVO;
-import com.zsElectric.boot.business.model.vo.applet.AppletChargingCostVO;
-import com.zsElectric.boot.business.model.vo.applet.AppletStationSearchVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
+import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
 import com.zsElectric.boot.charging.entity.ThirdPartyStationInfo;
 import com.zsElectric.boot.business.model.query.StationInfoQuery;
 import com.zsElectric.boot.business.model.vo.StationInfoVO;
@@ -98,7 +98,7 @@ public interface ThirdPartyStationInfoMapper extends BaseMapper<ThirdPartyStatio
      * @param userId 用户ID
      * @return 实时充电费用信息
      */
-    AppletChargingCostVO selectCurrentChargingCost(@Param("userId") Long userId);
+    AppChargingCostVO selectCurrentChargingCost(@Param("userId") Long userId);
 
     /**
      * 搜索充电站(根据站点名称和地址模糊查询)
@@ -108,7 +108,7 @@ public interface ThirdPartyStationInfoMapper extends BaseMapper<ThirdPartyStatio
      * @param latitude 纬度(用于计算距离,可为null)
      * @return 充电站搜索结果列表
      */
-    java.util.List<AppletStationSearchVO> searchStations(
+    java.util.List<AppStationSearchVO> searchStations(
             @Param("keyword") String keyword,
             @Param("longitude") java.math.BigDecimal longitude,
             @Param("latitude") java.math.BigDecimal latitude

+ 2 - 2
src/main/java/com/zsElectric/boot/business/mapper/UserInfoMapper.java

@@ -5,7 +5,7 @@ import com.zsElectric.boot.business.model.entity.UserInfo;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zsElectric.boot.business.model.query.UserInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserInfoVO;
-import com.zsElectric.boot.business.model.vo.applet.AppletUserInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -27,5 +27,5 @@ public interface UserInfoMapper extends BaseMapper<UserInfo> {
      */
     Page<UserInfoVO> getUserInfoPage(Page<UserInfoVO> page, UserInfoQuery queryParams);
 
-    AppletUserInfoVO getAppletUserInfo(@Param("userId") Long userId);
+    AppUserInfoVO getAppletUserInfo(@Param("userId") Long userId);
 }

+ 10 - 2
src/main/java/com/zsElectric/boot/business/model/entity/ChargeOrderInfo.java

@@ -25,7 +25,7 @@ public class ChargeOrderInfo extends BaseEntity {
      */
     private Long userId;
     /**
-     * 订单类型 1 个人订单 2 集团订单
+     * 订单类型 0 个人订单 1 企业订单
      */
     private Integer orderType;
     /**
@@ -37,9 +37,17 @@ public class ChargeOrderInfo extends BaseEntity {
      */
     private String equipmentId;
     /**
-     * 第三方充电订单号
+     * 设备流水号
+     */
+    private String equipAuthSeq;
+    /**
+     * 充电订单号
      */
     private String chargeOrderNo;
+    /**
+     * 第三方充电订单号
+     */
+    private String startChargeSeq;
     /**
      * 充电开始时间
      */

+ 2 - 11
src/main/java/com/zsElectric/boot/business/model/entity/DiscountsActivity.java

@@ -1,6 +1,5 @@
 package com.zsElectric.boot.business.model.entity;
 
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.zsElectric.boot.common.base.BaseEntity;
 import lombok.Getter;
 import lombok.Setter;
@@ -11,8 +10,8 @@ import java.math.BigDecimal;
 /**
  * 优惠活动实体对象
  *
- * @author system
- * @since 2025-12-22
+ * @author zsElectric
+ * @since 2025-12-20 16:16
  */
 @Getter
 @Setter
@@ -25,40 +24,32 @@ public class DiscountsActivity extends BaseEntity {
      * 活动名称
      */
     private String name;
-    
     /**
      * 优惠类型 1-新用户首单立减 2-活动折扣
      */
     private Integer type;
-    
     /**
      * 优惠金额/折扣
      */
     private BigDecimal discount;
-    
     /**
      * 活动描述
      */
     private String activityDesc;
-    
     /**
      * 状态 0-未启用 1-启用
      */
     private Integer status;
-    
     /**
      * 创建人
      */
     private Long createBy;
-    
     /**
      * 更新人
      */
     private Long updateBy;
-    
     /**
      * 逻辑删除(0-未删除 1-已删除)
      */
-    @TableLogic
     private Integer isDeleted;
 }

+ 3 - 0
src/main/java/com/zsElectric/boot/business/model/form/ChargeOrderInfoForm.java

@@ -41,6 +41,9 @@ public class ChargeOrderInfoForm implements Serializable {
     @Size(max=255, message="充电桩编号长度不能超过255个字符")
     private String equipmentId;
 
+    @Schema(description = "设备流水号")
+    private String equipAuthSeq;
+
     @Schema(description = "第三方充电订单号")
     @Size(max=100, message="第三方充电订单号长度不能超过100个字符")
     private String chargeOrderNo;

+ 70 - 0
src/main/java/com/zsElectric/boot/business/model/form/DiscountsActivityForm.java

@@ -0,0 +1,70 @@
+package com.zsElectric.boot.business.model.form;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
+
+import jakarta.validation.constraints.*;
+
+/**
+ * 优惠活动表单对象
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Getter
+@Setter
+@Schema(description = "优惠活动表单对象")
+public class DiscountsActivityForm implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "活动名称")
+    @Size(max = 64, message = "活动名称长度不能超过64个字符")
+    private String name;
+
+    @Schema(description = "优惠类型 1-新用户首单立减 2-活动折扣")
+    private Integer type;
+
+    @Schema(description = "优惠金额/折扣")
+    private BigDecimal discount;
+
+    @Schema(description = "活动描述")
+    @Size(max = 255, message = "活动描述长度不能超过255个字符")
+    private String activityDesc;
+
+    @Schema(description = "状态 0-未启用 1-启用")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @Schema(description = "创建人")
+    private Long createBy;
+
+    @Schema(description = "更新时间")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "更新人")
+    private Long updateBy;
+
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+
+
+}

+ 1 - 2
src/main/java/com/zsElectric/boot/business/model/form/applet/AppletGainCouponForm.java → src/main/java/com/zsElectric/boot/business/model/form/applet/AppGainCouponForm.java

@@ -1,7 +1,6 @@
 package com.zsElectric.boot.business.model.form.applet;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.Size;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -11,7 +10,7 @@ import java.io.Serializable;
 @Getter
 @Setter
 @Schema(description = "获取优惠券表单对象")
-public class AppletGainCouponForm implements Serializable {
+public class AppGainCouponForm implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 40 - 0
src/main/java/com/zsElectric/boot/business/model/form/applet/AppInvokeChargeForm.java

@@ -0,0 +1,40 @@
+package com.zsElectric.boot.business.model.form.applet;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Getter
+@Setter
+@Schema(description = "用户启用充电表单对象")
+public class AppInvokeChargeForm implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "订单类型 0-平台 1-企业")
+    private Integer orderType;
+
+    @Schema(description = "充电桩编号")
+    @NotBlank(message = "充电桩编号不能为空")
+    private String equipmentId;
+
+    @Schema(description = "第三方充电站ID")
+    @NotBlank(message = "第三方充电站ID不能为空")
+    private String stationId;
+
+    @Schema(description = "优惠券ID")
+    private Long couponId;
+
+    @Schema(description = "设备认证流水号")
+    @NotBlank(message = "设备认证流水号不能为空")
+    private String EquipAuthSeq;
+
+    @Schema(description = "充电设备接口编码")
+    @NotBlank(message = "充电设备接口编码不能为空")
+    private String ConnectorID;
+}

+ 23 - 0
src/main/java/com/zsElectric/boot/business/model/query/DiscountsActivityQuery.java

@@ -0,0 +1,23 @@
+package com.zsElectric.boot.business.model.query;
+
+import com.zsElectric.boot.common.base.BasePageQuery;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.math.BigDecimal;
+
+/**
+ * 优惠活动分页查询对象
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Schema(description = "优惠活动查询对象")
+@Getter
+@Setter
+public class DiscountsActivityQuery extends BasePageQuery {
+
+}

+ 50 - 0
src/main/java/com/zsElectric/boot/business/model/vo/DiscountsActivityVO.java

@@ -0,0 +1,50 @@
+package com.zsElectric.boot.business.model.vo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+
+/**
+ * 优惠活动视图对象
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Getter
+@Setter
+@Schema(description = "优惠活动视图对象")
+public class DiscountsActivityVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "主键ID")
+    private Long id;
+    @Schema(description = "活动名称")
+    private String name;
+    @Schema(description = "优惠类型 1-新用户首单立减 2-活动折扣")
+    private Integer type;
+    @Schema(description = "优惠金额/折扣")
+    private BigDecimal discount;
+    @Schema(description = "活动描述")
+    private String activityDesc;
+    @Schema(description = "状态 0-未启用 1-启用")
+    private Integer status;
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+    @Schema(description = "创建人")
+    private Long createBy;
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+    @Schema(description = "更新人")
+    private Long updateBy;
+    @Schema(description = "逻辑删除(0-未删除 1-已删除)")
+    private Integer isDeleted;
+}

+ 1 - 1
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppletChargingCostVO.java → src/main/java/com/zsElectric/boot/business/model/vo/applet/AppChargingCostVO.java

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
 @Getter
 @Setter
 @Schema(description = "小程序实时充电费用VO")
-public class AppletChargingCostVO implements Serializable {
+public class AppChargingCostVO implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 20 - 0
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppInvokeChargeVO.java

@@ -0,0 +1,20 @@
+package com.zsElectric.boot.business.model.vo.applet;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Getter
+@Setter
+@Schema(description = "启用充电响应对象")
+public class AppInvokeChargeVO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "订单号")
+    private String chargeOrderNo;
+}

+ 1 - 1
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppletStationSearchVO.java → src/main/java/com/zsElectric/boot/business/model/vo/applet/AppStationSearchVO.java

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
 @Getter
 @Setter
 @Schema(description = "小程序充电站搜索结果VO")
-public class AppletStationSearchVO implements Serializable {
+public class AppStationSearchVO implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 1 - 1
src/main/java/com/zsElectric/boot/business/model/vo/applet/AppletUserInfoVO.java → src/main/java/com/zsElectric/boot/business/model/vo/applet/AppUserInfoVO.java

@@ -11,7 +11,7 @@ import java.math.BigDecimal;
 @Getter
 @Setter
 @Schema( description = "小程序用户信息对象")
-public class AppletUserInfoVO implements Serializable {
+public class AppUserInfoVO implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 5 - 3
src/main/java/com/zsElectric/boot/business/service/AppletHomeService.java

@@ -8,6 +8,8 @@ import com.zsElectric.boot.business.model.vo.AppletStationPriceListVO;
 import com.zsElectric.boot.business.model.vo.BannerInfoVO;
 import com.zsElectric.boot.business.model.vo.StationInfoMapVO;
 import com.zsElectric.boot.business.model.vo.StationInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
+import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletChargingCostVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletConnectorDetailVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletStationSearchVO;
@@ -61,7 +63,7 @@ public interface AppletHomeService {
      * 根据当前登录用户ID查询正在充电中的订单
      * @return 实时充电费用信息,如果没有正在充电的订单则返回null
      * */
-    AppletChargingCostVO getCurrentChargingCost();
+    AppChargingCostVO getCurrentChargingCost();
 
     /**
      * 搜索充电站
@@ -72,7 +74,7 @@ public interface AppletHomeService {
      * @param latitude 纬度(用于计算距离,可为null)
      * @return 搜索结果列表
      */
-    List<AppletStationSearchVO> searchStations(String keyword, BigDecimal longitude, BigDecimal latitude);
+    List<AppStationSearchVO> searchStations(String keyword, BigDecimal longitude, BigDecimal latitude);
 
     /**
      * 获取充电设备接口详情
@@ -90,7 +92,7 @@ public interface AppletHomeService {
      * 3. 根据度数计算增值费用总额 = 度数 × 增值费用
      * 4. 可用余额 = 余额 - 安全价 - 运营费总额 - 增值费用总额
      * 注意:需要处理跨时段情况,不同时段价格不同,需要分段计算
-     * 
+     *
      * @param connectorId 充电设备接口ID
      * @return 可用充电金额(元)
      */

+ 5 - 0
src/main/java/com/zsElectric/boot/business/service/ChargeOrderInfoService.java

@@ -1,12 +1,15 @@
 package com.zsElectric.boot.business.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
 import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
+import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
 import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
 
 /**
  * 充电订单信息服务类
@@ -57,4 +60,6 @@ public interface ChargeOrderInfoService extends IService<ChargeOrderInfo> {
     boolean deleteChargeOrderInfos(String ids);
 
     IPage<ChargeOrderInfoVO> getPage(AppChargeOrderInfoQuery queryParams);
+
+    AppInvokeChargeVO invokeCharge(AppInvokeChargeForm formData);
 }

+ 2 - 3
src/main/java/com/zsElectric/boot/business/service/CouponService.java

@@ -2,7 +2,7 @@ package com.zsElectric.boot.business.service;
 
 import com.zsElectric.boot.business.model.entity.Coupon;
 import com.zsElectric.boot.business.model.form.CouponForm;
-import com.zsElectric.boot.business.model.form.applet.AppletGainCouponForm;
+import com.zsElectric.boot.business.model.form.applet.AppGainCouponForm;
 import com.zsElectric.boot.business.model.query.CouponQuery;
 import com.zsElectric.boot.business.model.query.applet.AppCouponQuery;
 import com.zsElectric.boot.business.model.vo.CouponVO;
@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zsElectric.boot.business.model.vo.applet.AppCouponStatusNumVO;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 
 /**
  * 优惠劵服务类
@@ -118,5 +117,5 @@ public interface CouponService extends IService<Coupon> {
 
     AppCouponStatusNumVO getCouponStatusNum(Long userId);
 
-    Boolean gainCoupon(AppletGainCouponForm formData);
+    Boolean gainCoupon(AppGainCouponForm formData);
 }

+ 58 - 0
src/main/java/com/zsElectric/boot/business/service/DiscountsActivityService.java

@@ -0,0 +1,58 @@
+package com.zsElectric.boot.business.service;
+
+import com.zsElectric.boot.business.model.entity.DiscountsActivity;
+import com.zsElectric.boot.business.model.form.DiscountsActivityForm;
+import com.zsElectric.boot.business.model.query.DiscountsActivityQuery;
+import com.zsElectric.boot.business.model.vo.DiscountsActivityVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 优惠活动服务类
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+public interface DiscountsActivityService extends IService<DiscountsActivity> {
+
+    /**
+     * 优惠活动分页列表
+     *
+     * @return {@link IPage<DiscountsActivityVO>} 优惠活动分页列表
+     */
+    IPage<DiscountsActivityVO> getDiscountsActivityPage(DiscountsActivityQuery queryParams);
+
+    /**
+     * 获取优惠活动表单数据
+     *
+     * @param id 优惠活动ID
+     * @return 优惠活动表单数据
+     */
+    DiscountsActivityForm getDiscountsActivityFormData(Long id);
+
+    /**
+     * 新增优惠活动
+     *
+     * @param formData 优惠活动表单对象
+     * @return 是否新增成功
+     */
+    boolean saveDiscountsActivity(DiscountsActivityForm formData);
+
+    /**
+     * 修改优惠活动
+     *
+     * @param id       优惠活动ID
+     * @param formData 优惠活动表单对象
+     * @return 是否修改成功
+     */
+    boolean updateDiscountsActivity(Long id, DiscountsActivityForm formData);
+
+    /**
+     * 删除优惠活动
+     *
+     * @param ids 优惠活动ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    boolean deleteDiscountsActivitys(String ids);
+
+}

+ 2 - 2
src/main/java/com/zsElectric/boot/business/service/UserInfoService.java

@@ -6,7 +6,7 @@ import com.zsElectric.boot.business.model.query.UserInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserInfoVO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zsElectric.boot.business.model.vo.applet.AppletUserInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 
 /**
  * 个人用户信息服务类
@@ -75,7 +75,7 @@ public interface UserInfoService extends IService<UserInfo> {
      */
     UserInfo registerOrUpdateUserByPhone(String phone, String openId);
 
-    AppletUserInfoVO getAppletUserInfo();
+    AppUserInfoVO getAppletUserInfo();
 
     Boolean userBinding(Long userId, Long firmId);
 }

+ 46 - 44
src/main/java/com/zsElectric/boot/business/service/impl/AppletHomeServiceImpl.java

@@ -36,6 +36,8 @@ import com.zsElectric.boot.business.model.vo.AppletStationPriceListVO;
 import com.zsElectric.boot.business.model.vo.BannerInfoVO;
 import com.zsElectric.boot.business.model.vo.StationInfoMapVO;
 import com.zsElectric.boot.business.model.vo.StationInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO;
+import com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletChargingCostVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletConnectorDetailVO;
 import com.zsElectric.boot.business.model.vo.applet.AppletStationSearchVO;
@@ -668,7 +670,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
     }
 
     @Override
-    public AppletChargingCostVO getCurrentChargingCost() {
+    public AppChargingCostVO getCurrentChargingCost() {
         // 获取当前登录用户ID
         Long userId = SecurityUtils.getUserId();
         if (userId == null) {
@@ -679,7 +681,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
     }
 
     @Override
-    public List<AppletStationSearchVO> searchStations(String keyword, BigDecimal longitude, BigDecimal latitude) {
+    public List<AppStationSearchVO> searchStations(String keyword, BigDecimal longitude, BigDecimal latitude) {
         // 关键词为空或空字符串,返回空列表
         if (keyword == null || keyword.trim().isEmpty()) {
             return new ArrayList<>();
@@ -693,10 +695,10 @@ public class AppletHomeServiceImpl implements AppletHomeService {
     public AppletConnectorDetailVO getConnectorDetail(Long connectorId) {
         // 获取当前登录用户ID
         Long userId = SecurityUtils.getUserId();
-        
+
         // 获取当前时间(HHmmss格式)
         String currentTime = LocalTime.now().format(TIME_FORMATTER);
-        
+
         // 查询用户余额
         BigDecimal userBalance = null;
         if (userId != null) {
@@ -709,7 +711,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                 userBalance = userAccount.getBalance();
             }
         }
-        
+
         // 查询新用户优惠金额(仅当用户为新用户时)
         BigDecimal newUserDiscount = null;
         if (userId != null) {
@@ -719,7 +721,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                             .eq(ChargeOrderInfo::getUserId, userId)
                             .eq(ChargeOrderInfo::getIsDeleted, 0)
             );
-            
+
             // 如果是新用户(没有订单),查询新用户首单优惠金额
             if (orderCount == 0) {
                 // 查询c_discounts_activity表,type=1(新用户首单立减)且status=1(启用)的数据
@@ -729,28 +731,28 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                                 .eq(DiscountsActivity::getStatus, 1) // 1-启用
                                 .eq(DiscountsActivity::getIsDeleted, 0)
                 );
-                
+
                 // 计算所有启用的新用户优惠金额总和
                 if (!discountActivities.isEmpty()) {
                     newUserDiscount = discountActivities.stream()
                             .map(DiscountsActivity::getDiscount)
                             .filter(discount -> discount != null)
                             .reduce(BigDecimal.ZERO, BigDecimal::add);
-                    
+
                     log.info("新用户首单优惠金额 - userId: {}, discount: {}", userId, newUserDiscount);
                 }
             }
         }
-        
+
         // 调用Mapper方法,一次SQL查询获取所有信息
         AppletConnectorDetailVO result = thirdPartyConnectorInfoMapper.selectConnectorDetailById(
                 connectorId, userId, currentTime, userBalance, newUserDiscount
         );
-        
+
         if (result == null) {
             log.warn("充电接口不存在,connectorId: {}", connectorId);
         }
-        
+
         return result;
     }
 
@@ -762,7 +764,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             log.warn("未登录用户,无法计算可用充电金额");
             return BigDecimal.ZERO;
         }
-        
+
         // 1. 查询当前用户余额
         UserAccount userAccount = userAccountMapper.selectOne(
                 new LambdaQueryWrapper<UserAccount>()
@@ -774,7 +776,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             return BigDecimal.ZERO;
         }
         BigDecimal userBalance = userAccount.getBalance();
-        
+
         // 2. 从字典表查询安全价(safety_fee)
         DictItem safetyFeeItem = dictItemMapper.selectOne(
                 new LambdaQueryWrapper<DictItem>()
@@ -782,24 +784,24 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                         .eq(DictItem::getStatus, 1)
                         .last("LIMIT 1")
         );
-        BigDecimal safetyFee = safetyFeeItem != null && safetyFeeItem.getValue() != null 
-                ? new BigDecimal(safetyFeeItem.getValue()) 
+        BigDecimal safetyFee = safetyFeeItem != null && safetyFeeItem.getValue() != null
+                ? new BigDecimal(safetyFeeItem.getValue())
                 : BigDecimal.ZERO;
-        
+
         // 计算扣除安全价后的余额
         BigDecimal balanceAfterSafety = userBalance.subtract(safetyFee);
         if (balanceAfterSafety.compareTo(BigDecimal.ZERO) <= 0) {
             log.info("用户余额不足 - userId: {}, balance: {}, safetyFee: {}", userId, userBalance, safetyFee);
             return BigDecimal.ZERO;
         }
-        
+
         // 3. 查询充电接口、设备、站点信息
         ThirdPartyConnectorInfo connectorInfo = thirdPartyConnectorInfoMapper.selectById(connectorId);
         if (connectorInfo == null) {
             log.warn("充电接口不存在 - connectorId: {}", connectorId);
             return BigDecimal.ZERO;
         }
-        
+
         ThirdPartyEquipmentInfo equipmentInfo = thirdPartyEquipmentInfoMapper.selectOne(
                 new LambdaQueryWrapper<ThirdPartyEquipmentInfo>()
                         .eq(ThirdPartyEquipmentInfo::getEquipmentId, connectorInfo.getEquipmentId())
@@ -810,7 +812,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             log.warn("设备信息不存在 - equipmentId: {}", connectorInfo.getEquipmentId());
             return BigDecimal.ZERO;
         }
-        
+
         ThirdPartyStationInfo stationInfo = thirdPartyStationInfoMapper.selectOne(
                 new LambdaQueryWrapper<ThirdPartyStationInfo>()
                         .eq(ThirdPartyStationInfo::getStationId, equipmentInfo.getStationId())
@@ -821,7 +823,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             log.warn("站点信息不存在 - stationId: {}", equipmentInfo.getStationId());
             return BigDecimal.ZERO;
         }
-        
+
         // 4. 查询价格策略
         ThirdPartyEquipmentPricePolicy pricePolicy = thirdPartyEquipmentPricePolicyMapper.selectOne(
                 new LambdaQueryWrapper<ThirdPartyEquipmentPricePolicy>()
@@ -833,7 +835,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             log.warn("价格策略不存在 - connectorId: {}", connectorInfo.getConnectorId());
             return BigDecimal.ZERO;
         }
-        
+
         // 5. 查询所有时段的价格信息(按开始时间排序)
         List<ThirdPartyPolicyInfo> policyInfoList = thirdPartyPolicyInfoMapper.selectList(
                 new LambdaQueryWrapper<ThirdPartyPolicyInfo>()
@@ -845,7 +847,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
             log.warn("价格策略明细不存在 - pricePolicyId: {}", pricePolicy.getId());
             return BigDecimal.ZERO;
         }
-        
+
         // 6. 查询用户是否为企业用户
         UserFirm userFirm = userFirmMapper.selectOne(
                 new LambdaQueryWrapper<UserFirm>()
@@ -853,26 +855,26 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                         .eq(UserFirm::getIsDeleted, 0)
                         .last("LIMIT 1")
         );
-        
+
         // 7. 跨时段计算可用充电金额
         // 公式:可用余额 = 当前用户余额 - 安全价 - [(度数 × 运营费) + (度数 × 增值费用)]
         // 其中:度数 = (余额 - 安全价) / (电费 + 服务费)
-        
+
         BigDecimal remainingBalance = balanceAfterSafety; // 剩余可用余额(用于计算度数)
         BigDecimal totalOpFeeCost = BigDecimal.ZERO; // 总运营费
         BigDecimal totalValueAddedCost = BigDecimal.ZERO; // 总增值费用
-        
+
         // 遍历每个时段,计算在该时段能充多少度电及对应的费用
         for (ThirdPartyPolicyInfo policyInfo : policyInfoList) {
             // 获取电费、服务费
             BigDecimal elecPrice = policyInfo.getElecPrice() != null ? policyInfo.getElecPrice() : BigDecimal.ZERO;
             BigDecimal servicePrice = policyInfo.getServicePrice() != null ? policyInfo.getServicePrice() : BigDecimal.ZERO;
             BigDecimal basePrice = elecPrice.add(servicePrice); // 基础价格 = 电费 + 服务费
-            
+
             if (basePrice.compareTo(BigDecimal.ZERO) == 0) {
                 continue; // 跳过基础价格为0的时段
             }
-            
+
             // 查询该时段的运营费
             PolicyFee policyFee;
             if (userFirm != null) {
@@ -895,11 +897,11 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                                 .last("LIMIT 1")
                 );
             }
-            
-            BigDecimal opFee = (policyFee != null && policyFee.getOpFee() != null) 
-                    ? policyFee.getOpFee() 
+
+            BigDecimal opFee = (policyFee != null && policyFee.getOpFee() != null)
+                    ? policyFee.getOpFee()
                     : BigDecimal.ZERO;
-            
+
             // 查询增值费用
             BigDecimal valueAddedFee = BigDecimal.ZERO;
             if (policyInfo.getPeriodFlag() != null) {
@@ -910,7 +912,7 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                     case 3: periodLabel = "平"; break;
                     case 4: periodLabel = "谷"; break;
                 }
-                
+
                 if (!periodLabel.isEmpty()) {
                     DictItem valueAddedItem = dictItemMapper.selectOne(
                             new LambdaQueryWrapper<DictItem>()
@@ -924,53 +926,53 @@ public class AppletHomeServiceImpl implements AppletHomeService {
                     }
                 }
             }
-            
+
             // 计算在当前时段能充多少度电(使用剩余余额)
             // 度数 = 剩余余额 / (电费 + 服务费)
             BigDecimal kwh = remainingBalance.divide(basePrice, 4, RoundingMode.HALF_UP);
-            
+
             // 如果剩余余额不足以充电,结束计算
             if (kwh.compareTo(BigDecimal.ZERO) <= 0) {
                 break;
             }
-            
+
             // 计算该时段的运营费和增值费用
             BigDecimal periodOpFeeCost = kwh.multiply(opFee);
             BigDecimal periodValueAddedCost = kwh.multiply(valueAddedFee);
-            
+
             totalOpFeeCost = totalOpFeeCost.add(periodOpFeeCost);
             totalValueAddedCost = totalValueAddedCost.add(periodValueAddedCost);
-            
+
             // 更新剩余余额(减去当前时段的所有费用)
             // 当前时段总费用 = (电费 + 服务费) * 度数 + 运营费 + 增值费用
             BigDecimal periodBaseCost = kwh.multiply(basePrice);
             BigDecimal periodTotalCost = periodBaseCost.add(periodOpFeeCost).add(periodValueAddedCost);
             remainingBalance = remainingBalance.subtract(periodTotalCost);
-            
+
             log.debug("时段计算 - startTime: {}, 电费: {}, 服务费: {}, 运营费: {}, 增值费: {}, 度数: {}, 该时段费用: {}, 剩余余额: {}",
                     policyInfo.getStartTime(), elecPrice, servicePrice, opFee, valueAddedFee, kwh, periodTotalCost, remainingBalance);
-            
+
             // 如果剩余余额小于等于0,结束计算
             if (remainingBalance.compareTo(BigDecimal.ZERO) <= 0) {
                 break;
             }
         }
-        
+
         // 8. 计算最终可用余额
         BigDecimal availableAmount = userBalance.subtract(safetyFee).subtract(totalOpFeeCost).subtract(totalValueAddedCost);
-        
+
         // 确保不为负数
         if (availableAmount.compareTo(BigDecimal.ZERO) < 0) {
             availableAmount = BigDecimal.ZERO;
         }
-        
+
         // 保留 2 位小数
         availableAmount = availableAmount.setScale(2, RoundingMode.HALF_UP);
-        
+
         log.info("可用充电金额计算完成 - userId: {}, connectorId: {}, userBalance: {}, safetyFee: {}, " +
                         "totalOpFeeCost: {}, totalValueAddedCost: {}, availableAmount: {}",
                 userId, connectorId, userBalance, safetyFee, totalOpFeeCost, totalValueAddedCost, availableAmount);
-        
+
         return availableAmount;
     }
 

+ 144 - 2
src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java

@@ -1,24 +1,43 @@
 package com.zsElectric.boot.business.service.impl;
 
+import cn.binarywang.wx.miniapp.bean.shop.WxMaShopCouponInfo;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.zsElectric.boot.business.mapper.*;
+import com.zsElectric.boot.business.model.entity.*;
+import com.zsElectric.boot.business.model.form.applet.AppInvokeChargeForm;
 import com.zsElectric.boot.business.model.query.UserOrderInfoQuery;
 import com.zsElectric.boot.business.model.query.applet.AppChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.UserOrderInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppInvokeChargeVO;
+import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
+import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
+import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
+import com.zsElectric.boot.charging.service.ChargingBusinessService;
+import com.zsElectric.boot.charging.vo.EquipmentAuthResponseVO;
+import com.zsElectric.boot.common.constant.ConnectivityConstants;
+import com.zsElectric.boot.common.constant.SystemConstants;
+import com.zsElectric.boot.common.util.electric.ApiToken;
+import com.zsElectric.boot.core.exception.BusinessException;
 import com.zsElectric.boot.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zsElectric.boot.business.mapper.ChargeOrderInfoMapper;
 import com.zsElectric.boot.business.service.ChargeOrderInfoService;
-import com.zsElectric.boot.business.model.entity.ChargeOrderInfo;
 import com.zsElectric.boot.business.model.form.ChargeOrderInfoForm;
 import com.zsElectric.boot.business.model.query.ChargeOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.ChargeOrderInfoVO;
 import com.zsElectric.boot.business.converter.ChargeOrderInfoConverter;
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
@@ -35,6 +54,21 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
 
     private final ChargeOrderInfoConverter chargeOrderInfoConverter;
 
+    private final ChargingBusinessService chargingBusinessService;
+
+    private final UserInfoMapper userInfoMapper;
+
+    private final FirmInfoMapper firmInfoMapper;
+
+    private final CouponMapper couponMapper;
+
+    private final CouponTemplateMapper couponTemplateMapper;
+
+    //充电订单号前缀
+    private final String ORDER_NO_PREFIX = "CD";
+    //设备流水号前缀
+    private final String EQUIPMENT_NO_PREFIX = "SB";
+
     /**
     * 获取充电订单信息分页列表
     *
@@ -114,4 +148,112 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
         return pageVO;
     }
 
+    @Override
+    public AppInvokeChargeVO invokeCharge(AppInvokeChargeForm formData) {
+
+        try {
+            AppInvokeChargeVO appInvokeChargeVO = new AppInvokeChargeVO();
+
+            //必要校验
+            Long userId = SecurityUtils.getUserId();
+            Assert.isTrue(userId != null, "用户ID不能为空");
+
+            AppUserInfoVO userInfo = userInfoMapper.getAppletUserInfo(userId);
+            Assert.isTrue(userInfo != null, "用户信息不存在");
+
+            //判断有没有正在进行中的订单
+            Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(ChargeOrderInfo.class).eq(ChargeOrderInfo::getUserId, userId).in(ChargeOrderInfo::getStatus, SystemConstants.STATUS_ZERO, SystemConstants.STATUS_ONE, SystemConstants.STATUS_TWO));
+            Assert.isTrue(count == 0, "您有正在进行中的订单,请等待完成!");
+
+
+            //请求设备认证
+            EquipmentAuthResponseVO equipmentAuthResponseVO = chargingBusinessService.queryEquipAuth(formData.getEquipAuthSeq(), formData.getConnectorID());
+
+            if (!Objects.equals(equipmentAuthResponseVO.getSuccStat(), SystemConstants.STATUS_ONE)) {
+                throw new BusinessException("设备认证失败");
+            }
+
+            //生成系统充电订单号及互联互通充电订单号
+            assert userId != null;
+            String chargeOrderNo = generateNo(ORDER_NO_PREFIX, userId);
+            String startChargeSeq = ConnectivityConstants.OPERATOR_ID + chargeOrderNo;
+            //生成设备流水号(格式"运营商ID+唯一编号")
+            String equipAuthSeq = ConnectivityConstants.OPERATOR_ID + generateNo(EQUIPMENT_NO_PREFIX, userId);
+
+            //创建订单
+            ChargeOrderInfo chargeOrderInfo = new ChargeOrderInfo();
+
+            chargeOrderInfo.setUserId(userId);
+            chargeOrderInfo.setEquipmentId(formData.getEquipmentId());
+            chargeOrderInfo.setEquipAuthSeq(equipAuthSeq);
+            chargeOrderInfo.setChargeOrderNo(chargeOrderNo);
+            chargeOrderInfo.setStartChargeSeq(startChargeSeq);
+            chargeOrderInfo.setPhoneNum(userInfo.getPhone());
+            chargeOrderInfo.setThirdPartyStationId(formData.getStationId());
+            chargeOrderInfo.setOrderType(formData.getOrderType());
+            //todo 预支付金额
+            //chargeOrderInfo.setPreAmt();
+
+            //判断用户是否绑定企业
+            if (ObjectUtil.isNotEmpty(userInfo.getFirmId())) {
+                FirmInfo firmInfo = firmInfoMapper.selectById(userInfo.getFirmId());
+                if(firmInfo != null && Objects.equals(firmInfo.getStatus(), SystemConstants.STATUS_ONE)) {
+                    chargeOrderInfo.setFirmId(firmInfo.getId());
+                    chargeOrderInfo.setOrderType(SystemConstants.STATUS_ONE);
+                }
+            }
+            //优惠券
+            if(ObjectUtil.isNotEmpty(formData.getCouponId())) {
+                Coupon coupon = couponMapper.selectById(formData.getCouponId());
+                if(coupon != null && Objects.equals(coupon.getStatus(), SystemConstants.STATUS_ONE)) {
+                    CouponTemplate couponTemplate = couponTemplateMapper.selectById(coupon.getTemplateId());
+                    chargeOrderInfo.setCouponId(coupon.getId());
+                    chargeOrderInfo.setCouponPrice(couponTemplate.getDiscountPrice());
+                }
+            }
+
+            //启动充电
+            StartChargingRequestDTO requestDTO = new StartChargingRequestDTO();
+            requestDTO
+                    .setStartChargeSeq(startChargeSeq)
+                    .setConnectorID(formData.getConnectorID())
+                    .setPhoneNum(userInfo.getPhone())
+            //预支付金额
+            //.setChargingAmt()
+            ;
+            StartChargingResponseVO startChargingResponseVO = chargingBusinessService.startCharging(requestDTO);
+            if (!Objects.equals(startChargingResponseVO.getSuccStat(), SystemConstants.STATUS_ZERO)) {
+                throw new BusinessException("启动充电失败");
+            }
+
+            //保存订单
+            this.save(chargeOrderInfo);
+
+            appInvokeChargeVO.setChargeOrderNo(chargeOrderNo);
+            return appInvokeChargeVO;
+        } catch (Exception e) {
+            throw new BusinessException("启动充电失败,系统错误,请联系客服处理!");
+        }
+    }
+
+    /**
+     * 创建商户订单号
+     * 要求 32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一
+     * 组成 两位前缀 + 17位时间戳 + 9位id补零 + 4位随机数 合计32位
+     *
+     * @param head 例如 商品-SP 退款-TK 等等
+     * @param id   用户id
+     * @return
+     */
+    public String generateNo(String head, Long id) {
+        StringBuilder uid = new StringBuilder(id.toString());
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        int length = uid.length();
+        for (int i = 0; i < 9 - length; i++) {
+            uid.insert(0, "0");
+        }
+        return head + sdf.format(date) + uid + (int) ((Math.random() * 9 + 1) * 1000);
+    }
+
 }

+ 2 - 3
src/main/java/com/zsElectric/boot/business/service/impl/CouponServiceImpl.java

@@ -2,13 +2,12 @@ package com.zsElectric.boot.business.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.zsElectric.boot.business.model.form.applet.AppletGainCouponForm;
+import com.zsElectric.boot.business.model.form.applet.AppGainCouponForm;
 import com.zsElectric.boot.business.model.query.applet.AppCouponQuery;
 import com.zsElectric.boot.business.model.vo.applet.AppCouponStatusNumVO;
 import com.zsElectric.boot.business.service.CouponTemplateService;
 import com.zsElectric.boot.core.exception.BusinessException;
 import com.zsElectric.boot.core.exception.CouponException;
-import com.zsElectric.boot.business.mapper.CouponTemplateMapper;
 import com.zsElectric.boot.business.model.entity.CouponTemplate;
 import com.zsElectric.boot.security.util.SecurityUtils;
 import jakarta.annotation.Resource;
@@ -457,7 +456,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
     
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public Boolean gainCoupon(AppletGainCouponForm formData) {
+    public Boolean gainCoupon(AppGainCouponForm formData) {
         RLock lock = getLock(formData.getCouponCode());
         try {
             // 尝试获取锁(等待3秒,自动续期10秒)

+ 103 - 0
src/main/java/com/zsElectric/boot/business/service/impl/DiscountsActivityServiceImpl.java

@@ -0,0 +1,103 @@
+package com.zsElectric.boot.business.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zsElectric.boot.business.mapper.DiscountsActivityMapper;
+import com.zsElectric.boot.business.service.DiscountsActivityService;
+import com.zsElectric.boot.business.model.entity.DiscountsActivity;
+import com.zsElectric.boot.business.model.form.DiscountsActivityForm;
+import com.zsElectric.boot.business.model.query.DiscountsActivityQuery;
+import com.zsElectric.boot.business.model.vo.DiscountsActivityVO;
+import com.zsElectric.boot.business.converter.DiscountsActivityConverter;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 优惠活动服务实现类
+ *
+ * @author zsElectric
+ * @since 2025-12-20 16:16
+ */
+@Service
+@RequiredArgsConstructor
+public class DiscountsActivityServiceImpl extends ServiceImpl<DiscountsActivityMapper, DiscountsActivity> implements DiscountsActivityService {
+
+    private final DiscountsActivityConverter discountsActivityConverter;
+
+    /**
+     * 获取优惠活动分页列表
+     *
+     * @param queryParams 查询参数
+     * @return {@link IPage<DiscountsActivityVO>} 优惠活动分页列表
+     */
+    @Override
+    public IPage<DiscountsActivityVO> getDiscountsActivityPage(DiscountsActivityQuery queryParams) {
+        Page<DiscountsActivityVO> pageVO = this.baseMapper.getDiscountsActivityPage(
+                new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
+                queryParams
+        );
+        return pageVO;
+    }
+
+    /**
+     * 获取优惠活动表单数据
+     *
+     * @param id 优惠活动ID
+     * @return 优惠活动表单数据
+     */
+    @Override
+    public DiscountsActivityForm getDiscountsActivityFormData(Long id) {
+        DiscountsActivity entity = this.getById(id);
+        return discountsActivityConverter.toForm(entity);
+    }
+
+    /**
+     * 新增优惠活动
+     *
+     * @param formData 优惠活动表单对象
+     * @return 是否新增成功
+     */
+    @Override
+    public boolean saveDiscountsActivity(DiscountsActivityForm formData) {
+        DiscountsActivity entity = discountsActivityConverter.toEntity(formData);
+        return this.save(entity);
+    }
+
+    /**
+     * 更新优惠活动
+     *
+     * @param id       优惠活动ID
+     * @param formData 优惠活动表单对象
+     * @return 是否修改成功
+     */
+    @Override
+    public boolean updateDiscountsActivity(Long id, DiscountsActivityForm formData) {
+        DiscountsActivity entity = discountsActivityConverter.toEntity(formData);
+        return this.updateById(entity);
+    }
+
+    /**
+     * 删除优惠活动
+     *
+     * @param ids 优惠活动ID,多个以英文逗号(,)分割
+     * @return 是否删除成功
+     */
+    @Override
+    public boolean deleteDiscountsActivitys(String ids) {
+        Assert.isTrue(StrUtil.isNotBlank(ids), "删除的优惠活动数据为空");
+        // 逻辑删除
+        List<Long> idList = Arrays.stream(ids.split(","))
+                .map(Long::parseLong)
+                .toList();
+        return this.removeByIds(idList);
+    }
+
+}

+ 2 - 2
src/main/java/com/zsElectric/boot/business/service/impl/UserInfoServiceImpl.java

@@ -8,7 +8,7 @@ import com.zsElectric.boot.business.mapper.UserFirmMapper;
 import com.zsElectric.boot.business.model.entity.FirmInfo;
 import com.zsElectric.boot.business.model.entity.UserAccount;
 import com.zsElectric.boot.business.model.entity.UserFirm;
-import com.zsElectric.boot.business.model.vo.applet.AppletUserInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 import com.zsElectric.boot.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -128,7 +128,7 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
      * @return 当前用户信息
      */
     @Override
-    public AppletUserInfoVO getAppletUserInfo() {
+    public AppUserInfoVO getAppletUserInfo() {
         // 从 Spring Security 上下文获取当前登录用户的ID 注意:小程序用户token中的userId就是c_user_info表的ID
         Long userId = SecurityUtils.getUserId();
         if(ObjectUtil.isNotNull(userId)) {

+ 63 - 15
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zsElectric.boot.charging.service.impl;
 
+import cn.hutool.core.util.ObjUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -16,6 +17,7 @@ import com.zsElectric.boot.charging.service.ChargingReceptionService;
 import com.zsElectric.boot.charging.vo.ChargeResponseVO;
 import com.zsElectric.boot.charging.vo.QueryStationStatusVO;
 import com.zsElectric.boot.common.constant.ConnectivityConstants;
+import com.zsElectric.boot.common.constant.SystemConstants;
 import com.zsElectric.boot.common.util.electric.ChargingUtil;
 import com.zsElectric.boot.common.util.electric.RequestParmsEntity;
 import com.zsElectric.boot.common.util.electric.ResponseParmsEntity;
@@ -24,10 +26,10 @@ import com.zsElectric.boot.system.mapper.DictItemMapper;
 import com.zsElectric.boot.system.model.entity.DictItem;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -35,6 +37,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
@@ -66,11 +69,17 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private final DictItemMapper dictItemMapper;
     private final ThirdPartyEquipmentInfoMapper thirdPartyEquipmentInfoMapper;
 
-    /** 熔断检查锁前缀 */
+    /**
+     * 熔断检查锁前缀
+     */
     private static final String BREAK_CHECK_LOCK_KEY = "charging:break:check:";
-    /** 锁等待时间(秒) */
+    /**
+     * 锁等待时间(秒)
+     */
     private static final long LOCK_WAIT_TIME = 3;
-    /** 锁持有时间(秒) */
+    /**
+     * 锁持有时间(秒)
+     */
     private static final long LOCK_LEASE_TIME = 10;
 
     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -81,7 +90,34 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     public ResponseParmsEntity chargeResponse(RequestParmsEntity requestDTO) {
         log.info("接收推送启动充电结果请求参数:{}", requestDTO);
         return processChargeRequest(requestDTO, jsonNode -> {
-            // TODO: 启动充电结果业务处理
+            // 启动充电结果业务处理
+            String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
+            int startChargeSeqStat = jsonNode.get("StartChargeSeqStat").asInt();
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+                    .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("LIMIT 1"));
+            if (startChargeSeqStat == 1) {
+                // 启动中
+                log.info("启动中 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 2) {
+                // 充电中
+                log.info("充电中 - StartChargeSeq: {}", startChargeSeq);
+                chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
+                chargeOrderInfoMapper.updateById(chargeOrderInfo);
+            }
+            if (startChargeSeqStat == 3) {
+                // 停止中
+                log.info("停止中 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 4) {
+                // 已结束
+                log.info("已结束 - StartChargeSeq: {}", startChargeSeq);
+            }
+            if (startChargeSeqStat == 5) {
+                // 未知
+                log.info("未知 - StartChargeSeq: {}", startChargeSeq);
+            }
+
             log.debug("启动充电结果 - StartChargeSeq: {}", getTextValue(jsonNode, "StartChargeSeq"));
         });
     }
@@ -124,10 +160,10 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private ResponseParmsEntity processChargeRequest(RequestParmsEntity requestDTO, Consumer<JsonNode> businessHandler) {
         try {
             JsonNode jsonNode = verifyAndDecrypt(requestDTO);
-            
+
             // 执行业务处理
             businessHandler.accept(jsonNode);
-            
+
             // 构建响应
             return buildChargeResponse(getTextValue(jsonNode, "StartChargeSeq"));
         } catch (BusinessException e) {
@@ -144,11 +180,11 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private ResponseParmsEntity processStationStatusRequest(RequestParmsEntity requestDTO) {
         try {
             String decryptData = verifyAndDecryptRaw(requestDTO);
-            
+
             // 解析并更新设备状态
             QueryStationStatusVO stationStatusVO = objectMapper.readValue(decryptData, QueryStationStatusVO.class);
             updateConnectorStatus(stationStatusVO);
-            
+
             // 构建响应
             return buildStatusResponse();
         } catch (BusinessException e) {
@@ -194,10 +230,10 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
         chargeResponseVO.setStartChargeSeq(startChargeSeq);
         chargeResponseVO.setSuccStat(STATUS_OK);
         chargeResponseVO.setFailReason(FAIL_REASON_NONE);
-        
+
         String encryptData = chargingUtil.encryptData(objectMapper.writeValueAsString(chargeResponseVO));
         String sign = genSign(STATUS_OK, "请求成功", encryptData, ConnectivityConstants.SIG_SECRET);
-        
+
         ResponseParmsEntity response = new ResponseParmsEntity();
         response.setRet(STATUS_OK);
         response.setMsg("请求成功");
@@ -212,10 +248,10 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private ResponseParmsEntity buildStatusResponse() throws Exception {
         Map<String, Integer> statusMap = new HashMap<>();
         statusMap.put("Status", 0);
-        
+
         String encryptData = chargingUtil.encryptData(objectMapper.writeValueAsString(statusMap));
         String sign = genSign(STATUS_OK, "", encryptData, ConnectivityConstants.SIG_SECRET);
-        
+
         ResponseParmsEntity response = new ResponseParmsEntity();
         response.setRet(STATUS_OK);
         response.setMsg("");
@@ -254,6 +290,18 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
     private void saveOrUpdateChargeStatus(JsonNode jsonNode) {
         try {
             String startChargeSeq = jsonNode.get("StartChargeSeq").asText();
+            //修改订单状态
+            ChargeOrderInfo chargeOrderInfo = chargeOrderInfoMapper.selectOne(new LambdaQueryWrapper<ChargeOrderInfo>()
+                    .eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("limit 1"));
+            if(ObjUtil.isNotEmpty(chargeOrderInfo)){
+                Integer connectorStatus = getIntValue(jsonNode, "ConnectorStatus");
+                if (Objects.equals(connectorStatus, SystemConstants.STATUS_THREE) && Objects.equals(chargeOrderInfo.getStatus(), SystemConstants.STATUS_ZERO)) {
+                    // 充电中
+                    log.info("充电中 - StartChargeSeq: {}", startChargeSeq);
+                    chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
+                    chargeOrderInfoMapper.updateById(chargeOrderInfo);
+                }
+            }
 
             // 查询是否已存在该订单
             ThirdPartyChargeStatus existing = chargeStatusMapper.selectOne(
@@ -368,7 +416,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                         UserFirm userFirm = userFirmMapper.selectOne(Wrappers.<UserFirm>lambdaQuery()
                                 .eq(UserFirm::getUserId, chargeOrderInfo.getUserId())
                                 .eq(UserFirm::getIsDeleted, 0));
-                        if(null != userFirm){
+                        if (null != userFirm) {
                             ThirdPartyEquipmentInfo thirdPartyEquipmentInfo = thirdPartyEquipmentInfoMapper.selectOne(Wrappers.<ThirdPartyEquipmentInfo>lambdaQuery()
                                     .eq(ThirdPartyEquipmentInfo::getEquipmentId, chargeOrderInfo.getEquipmentId())
                                     .eq(ThirdPartyEquipmentInfo::getIsDeleted, 0));

+ 21 - 0
src/main/resources/mapper/business/DiscountsActivityMapper.xml

@@ -2,4 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zsElectric.boot.business.mapper.DiscountsActivityMapper">
 
+    <!-- 获取优惠活动分页列表 -->
+    <select id="getDiscountsActivityPage" resultType="com.zsElectric.boot.business.model.vo.DiscountsActivityVO">
+        SELECT
+        id,
+        name,
+        type,
+        discount,
+        activity_desc,
+        status,
+        create_time,
+        create_by,
+        update_time,
+        update_by,
+        is_deleted
+        FROM
+        c_discounts_activity
+        <where>
+            is_deleted = 0
+        </where>
+    </select>
+
 </mapper>

+ 2 - 2
src/main/resources/mapper/business/ThirdPartyStationInfoMapper.xml

@@ -570,7 +570,7 @@
     </select>
 
     <!-- 查询用户当前正在充电中的订单实时费用 -->
-    <resultMap id="AppletChargingCostResultMap" type="com.zsElectric.boot.business.model.vo.applet.AppletChargingCostVO">
+    <resultMap id="AppletChargingCostResultMap" type="com.zsElectric.boot.business.model.vo.applet.AppChargingCostVO">
         <result property="chargeOrderNo" column="charge_order_no"/>
         <result property="stationName" column="station_name"/>
         <result property="connectorName" column="connector_name"/>
@@ -641,7 +641,7 @@
     </select>
 
     <!-- 搜索充电站结果映射 -->
-    <resultMap id="AppletStationSearchResultMap" type="com.zsElectric.boot.business.model.vo.applet.AppletStationSearchVO">
+    <resultMap id="AppletStationSearchResultMap" type="com.zsElectric.boot.business.model.vo.applet.AppStationSearchVO">
         <result property="stationId" column="station_id"/>
         <result property="stationName" column="station_name"/>
         <result property="address" column="address"/>

+ 1 - 1
src/main/resources/mapper/business/UserInfoMapper.xml

@@ -26,7 +26,7 @@
             ui.is_deleted = 0
         </where>
     </select>
-    <select id="getAppletUserInfo" resultType="com.zsElectric.boot.business.model.vo.applet.AppletUserInfoVO">
+    <select id="getAppletUserInfo" resultType="com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO">
         SELECT
                 ui.id AS appletUserId,
                 ui.ec_id,