zhibing.pu
2024-09-05 6ddfb0ce8f781457b59689d08218d2ea617c5925
完善功能
16个文件已添加
15个文件已修改
761 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.account.api.factory;
import com.ruoyi.account.api.feignClient.InviteUserClient;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
 *
 * @author ruoyi
 */
@Component
public class InviteUserFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<InviteUserClient>
{
    private static final Logger log = LoggerFactory.getLogger(InviteUserFallbackFactory.class);
    @Override
    public InviteUserClient create(Throwable throwable) {
        log.error("邀请用户调用失败:{}", throwable.getMessage());
        return new InviteUserClient() {
            @Override
            public R<TInviteUser> getInviteUser(GetInviteUser query) {
                return R.fail("获取用户邀请数据失败:" + throwable.getMessage());
            }
            @Override
            public void updateInviteUser(TInviteUser query) {
                R.fail("修改用户邀请数据失败:" + throwable.getMessage());
            }
            @Override
            public void saveInviteUser(TInviteUser query) {
                R.fail("添加用户邀请数据失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.account.api.feignClient;
import com.ruoyi.account.api.factory.InviteUserFallbackFactory;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 17:54
 */
@FeignClient(contextId = "InviteUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = InviteUserFallbackFactory.class)
public interface InviteUserClient {
    /**
     * 获取用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/getInviteUser")
    R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query);
    /**
     * 修改用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/updateInviteUser")
    void updateInviteUser(@RequestBody TInviteUser query);
    /**
     * 添加用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/t-invite-user/saveInviteUser")
    void saveInviteUser(@RequestBody TInviteUser query);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.account.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 17:58
 */
@Data
public class GetInviteUser {
    /**
     * 用户id
     */
    private Long appUserId;
    /**
     * 被邀请用户id
     */
    private Long beInvitedAppUserId;
}
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -4,3 +4,4 @@
com.ruoyi.account.api.factory.AppUserIntegralChangeFallbackFactory
com.ruoyi.account.api.factory.AppUserAddressFallbackFactory
com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory
com.ruoyi.account.api.factory.InviteUserFallbackFactory
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -9,6 +9,8 @@
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
@@ -24,11 +26,6 @@
        return new AccountingStrategyDetailClient(){
            
            @Override
            public R<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) {
                return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage());
            }
            @Override
            public R<TAccountingStrategyDetail> getDetailBySiteId(Integer siteId) {
                return R.fail("通过站点id查询当前时段使用的策略明细失败:" + throwable.getMessage());
            }
@@ -42,6 +39,11 @@
            public R<Boolean> checkChargingStrategy(CheckChargingStrategyDTO dto) {
                return R.fail("校验充电桩计费模版是否准确失败:" + throwable.getMessage());
            }
            @Override
            public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) {
                throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.chargingPile.api.factory;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
 */
@Component
public class AccountingStrategyFallbackFactory implements FallbackFactory<AccountingStrategyClient> {
    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyFallbackFactory.class);
    @Override
    public AccountingStrategyClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyClient(){
            @Override
            public R<TAccountingStrategy> getAccountingStrategyById(Integer id) {
                throw new RuntimeException("根据id查询计费策略失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.chargingPile.api.feignClient;
import com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:51
 */
@FeignClient(contextId = "AccountingStrategyClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = AccountingStrategyFallbackFactory.class)
public interface AccountingStrategyClient {
    /**
     * 根据id查询计费策略
     * @param id
     * @return
     */
    @PostMapping("/t-accounting-strategy/getAccountingStrategyById")
    R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
@@ -10,6 +10,8 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
@@ -18,13 +20,7 @@
public interface AccountingStrategyDetailClient {
    
    
    /**
     * 获取当前有效的计费策略明细
     * @param accountingStrategyId
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getNowData")
    R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId);
    /**
     * 通过站点id查询当前时段使用的策略明细
     * @param siteId
@@ -46,4 +42,13 @@
     */
    @PostMapping("/t-accounting-strategy-detail/checkChargingStrategy")
    R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto);
    /**
     * 根据计费策略主表id策略明细
     * @param id
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId")
    R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,3 +3,4 @@
com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory
com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java
New file
@@ -0,0 +1,37 @@
package com.ruoyi.order.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 充电订单服务降级处理
 *
 * @author ruoyi
 */
@Component
public class AccountingStrategyDetailOrderFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<AccountingStrategyDetailOrderClient>
{
    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyDetailOrderFallbackFactory.class);
    @Override
    public AccountingStrategyDetailOrderClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyDetailOrderClient() {
            @Override
            public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(Long orderId) {
                return R.fail("根据订单id获取当前有效的策略失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -73,6 +73,11 @@
            public R<TChargingOrder> getOrderByCode(String code) {
                return R.fail("通过流水号查询订单调用失败:" + throwable.getMessage());
            }
            @Override
            public void endCharge(String code) {
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.order.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 16:11
 */
@FeignClient(contextId = "AccountingStrategyDetailOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = AccountingStrategyDetailOrderFallbackFactory.class)
public interface AccountingStrategyDetailOrderClient {
    /**
     * 根据订单id获取当前有效的策略
     * @param orderId
     * @return
     */
    @PostMapping("/accountingStrategyDetailOrder/getNowAccountingStrategyDetailOrder")
    R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -75,4 +75,12 @@
     */
    @PostMapping(value = "/t-charging-order/getOrderByCode/{code}")
    R<TChargingOrder> getOrderByCode(@PathVariable("code") String code);
    /**
     * 充电解释后处理逻辑
     * @param code
     */
    @PostMapping("/t-charging-order/endCharge")
    void endCharge(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,3 +2,4 @@
com.ruoyi.order.api.factory.OrderFallbackFactory
com.ruoyi.order.api.factory.ExchangeOrderFallbackFactory
com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory
com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
@@ -1,8 +1,17 @@
package com.ruoyi.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.model.TInviteUser;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.account.service.TInviteUserService;
import com.ruoyi.common.core.domain.R;
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;
import javax.annotation.Resource;
/**
 * <p>
@@ -16,5 +25,42 @@
@RequestMapping("/t-invite-user")
public class TInviteUserController {
    @Resource
    private TInviteUserService inviteUserService;
    /**
     * 获取用户邀请数据
     * @param query
     * @return
     */
    @PostMapping("/getInviteUser")
    public R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query){
        TInviteUser one = inviteUserService.getOne(new LambdaQueryWrapper<TInviteUser>().eq(TInviteUser::getAppUserId, query.getBeInvitedAppUserId())
                .eq(TInviteUser::getBeInvitedAppUserId, query.getBeInvitedAppUserId()));
        return R.ok(one);
    }
    /**
     * 修改邀请数据
     * @param query
     */
    @PostMapping("/updateInviteUser")
    public void updateInviteUser(@RequestBody TInviteUser query){
        inviteUserService.updateById(query);
    }
    /**
     * 添加邀请数据
     * @param query
     */
    @PostMapping("/saveInviteUser")
    public void saveInviteUser(@RequestBody TInviteUser query){
        inviteUserService.save(query);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -405,5 +405,18 @@
        return R.ok(res);
    }
    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    @PostMapping(value = "/getAccountingStrategyById")
    public R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id) {
        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(id);
        return R.ok(accountingStrategy);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -84,18 +84,7 @@
    }
    
    
    /**
     * 获取当前有效的计费模板
     * @param accountingStrategyId
     * @return
     */
    @PostMapping("/getNowData")
    public R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId){
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(new LambdaQueryWrapper<TAccountingStrategyDetail>()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategyId)
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
    /**
     * 通过站点id查询当前时段使用的策略明细
@@ -153,5 +142,17 @@
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(dto.getStrategyDetailId().equals(one.getId()));
    }
    /**
     * 根据计费策略主表id策略明细
     * @param id
     * @return
     */
    @PostMapping("/getListByAccountingStrategyId")
    public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){
        List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id));
        return R.ok(list);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
@@ -11,12 +11,15 @@
import com.ruoyi.integration.rocket.model.EndChargeMessage;
import com.ruoyi.integration.rocket.model.PingMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
@@ -34,6 +37,12 @@
    private MessageUtil messageUtil;
    @Autowired
    private IotMessageProduce iotMessageProduce;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Override
    protected void handleMessage(EndChargeMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -43,6 +52,7 @@
        BeanUtils.copyProperties(message,endCharge);
        endChargeService.create(endCharge);
        // 业务处理
        chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
    }
    @Override
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.order.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 16:17
 */
@RestController
@RequestMapping("/accountingStrategyDetailOrder")
public class AccountingStrategyDetailOrderController {
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    /**
     * 根据订单id获取当前有效的策略
     * @param orderId
     * @return
     */
    @PostMapping("/getNowAccountingStrategyDetailOrder")
    public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId){
        AccountingStrategyDetailOrder one = accountingStrategyDetailOrderService.getOne(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
                .eq(AccountingStrategyDetailOrder::getChargingOrderId, orderId)
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -784,5 +784,16 @@
        return resultList;
    }
    /**
     * 硬件充电结束后的处理逻辑
     * @param code
     */
    @PostMapping("/endCharge")
    public void endCharge(@RequestParam("code") String code){
        chargingOrderService.endCharge(code);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:42
 */
public interface AccountingStrategyDetailOrderMapper extends BaseMapper<AccountingStrategyDetailOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:37
 */
public interface AccountingStrategyOrderMapper extends BaseMapper<AccountingStrategyOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:41
 */
public interface AccountingStrategyDetailOrderService extends IService<AccountingStrategyDetailOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:36
 */
public interface AccountingStrategyOrderService extends IService<AccountingStrategyOrder> {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -17,6 +17,7 @@
import com.ruoyi.order.dto.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -140,4 +141,11 @@
     * @param query
     */
    void chargeMonitoring(UploadRealTimeMonitoringDataQuery query);
    /**
     * 自动结束充电后的处理逻辑
     * @param code
     */
    void endCharge(String code);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
import com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper;
import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:42
 */
@Service
public class AccountingStrategyDetailOrderServiceImpl extends ServiceImpl<AccountingStrategyDetailOrderMapper, AccountingStrategyDetailOrder> implements AccountingStrategyDetailOrderService {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.order.api.model.AccountingStrategyOrder;
import com.ruoyi.order.mapper.AccountingStrategyOrderMapper;
import com.ruoyi.order.service.AccountingStrategyOrderService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2024/9/4 15:36
 */
@Service
public class AccountingStrategyOrderServiceImpl extends ServiceImpl<AccountingStrategyOrderMapper, AccountingStrategyOrder> implements AccountingStrategyOrderService {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1,27 +1,17 @@
package com.ruoyi.order.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppCouponClient;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.feignClient.AppUserVipDetailClient;
import com.ruoyi.account.api.model.TAppCoupon;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.account.api.model.TAppUserVipDetail;
import com.ruoyi.account.api.feignClient.*;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
@@ -42,6 +32,7 @@
import com.ruoyi.integration.api.feignClient.*;
import com.ruoyi.integration.api.model.*;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
@@ -52,13 +43,12 @@
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
@@ -71,6 +61,8 @@
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.ApiModelProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -100,6 +92,8 @@
 */
@Service
public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService {
    private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
    
    @Resource
    private ChargingGunClient chargingGunClient;
@@ -155,6 +149,12 @@
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    
    @Resource
    private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
    @Resource
    private AccountingStrategyClient accountingStrategyClient;
    @Resource
    private PlatformStartChargingReplyClient platformStartChargingReplyClient;
    
    @Resource
@@ -162,6 +162,21 @@
    
    @Resource
    private PlatformStopChargingReplyClient platformStopChargingReplyClient;
    @Resource
    private AccountingStrategyOrderService accountingStrategyOrderService;
    @Resource
    private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
    @Resource
    private InviteUserClient inviteUserClient;
    @Resource
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private IntegralRuleClient integralRuleClient;
    
    //计数器
    private Map<String, Integer> counter_map = new HashMap<>();
@@ -426,9 +441,25 @@
                    chargingOrder.setVipDiscountAmount(discountAmount);
                }
            }
        }
        this.save(chargingOrder);
        //添加订单的计费策略
        TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(tChargingGun.getAccountingStrategyId()).getData();
        List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(tChargingGun.getAccountingStrategyId()).getData();
        AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
        BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
        accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
        accountingStrategyOrderService.save(accountingStrategyOrder);
        List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
        for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
            AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
            BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
            accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
            list1.add(accountingStrategyDetailOrder);
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
        //会员优惠折扣将其计入增加充电时长(增加总充电金额)
        //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
        if(1 == addChargingOrder.getPaymentType()){
@@ -490,7 +521,7 @@
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        //计算充电金额,会员需要将折扣金额加入到充电总金额中
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData();
        AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        //总单价
        BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence());
        //计算能充电的度数
@@ -713,6 +744,7 @@
     * @return
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public AjaxResult stopCharging(String id) {
        TChargingOrder chargingOrder = this.getById(id);
        Integer status = chargingOrder.getStatus();
@@ -722,6 +754,10 @@
        chargingOrder.setStatus(4);
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        //异步线程处理停机
        ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
        cachedThreadPool.execute(()->{
        //调用硬件停止充电,停止成功后开始计算费用退款
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData();
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
@@ -760,6 +796,7 @@
                        failure_cause = "其他";
                        break;
                }
                    log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
                throw new RuntimeException(failure_cause);
            }
            
@@ -767,6 +804,48 @@
            endCharge(chargingOrder);
            break;
        }
        });
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
                .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
        if(null != appUser.getInviteUserId() && 1 == count){
            TIntegralRule integralRule = integralRuleClient.getSet().getData();
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
                inviteUserClient.saveInviteUser(inviteUser);
            }else{
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
        return AjaxResult.success();
    }
    
@@ -798,6 +877,14 @@
            chargingOrder.setOrderAmount(total);
        }
        
        if(chargingOrder.getEndMode() != 1){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
            TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
@@ -838,9 +925,6 @@
            chargingOrder.setVipDiscountAmount(subtract);
            payAmount = payAmount.subtract(subtract);
        }
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //开始构建退款费用
        if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
@@ -1307,8 +1391,7 @@
        if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){
            //获取当前的计费策略
            TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code()));
            TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
            TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData();
            AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
            TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1"));
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
@@ -1397,4 +1480,64 @@
            this.updateById(chargingOrder);
        }
    }
    /**
     * 自动结束充电后的处理逻辑
     * @param orderCode
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endCharge(String orderCode) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
        Integer status = chargingOrder.getStatus();
        if(status == 4 || status == 5){
            return;
        }
        chargingOrder.setStatus(5);
        chargingOrder.setEndMode(2);
        this.updateById(chargingOrder);
        //计算费用,处理退款
        endCharge(chargingOrder);
        //处理推荐奖励(被推荐首单奖励)
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
                .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
        if(null != appUser.getInviteUserId() && 1 == count){
            TIntegralRule integralRule = integralRuleClient.getSet().getData();
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
                inviteUserClient.saveInviteUser(inviteUser);
            }else{
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -16,19 +16,13 @@
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TOrderInvoice;
import com.ruoyi.order.api.model.TOrderInvoiceDetail;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.TOrderEvaluateVO;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TOrderInvoiceMapper;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderInvoiceDetailService;
import com.ruoyi.order.service.TOrderInvoiceService;
import com.ruoyi.order.service.TShoppingOrderService;
import com.ruoyi.order.service.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.other.api.domain.TInvoiceType;
@@ -87,6 +81,9 @@
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    
    
    
@@ -128,6 +125,11 @@
        //获取开票类型
        TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
        for (Long orderId : orderIds) {
            List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
            BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
            TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
            orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
            orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
@@ -136,6 +138,9 @@
            orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
            orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
            orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
            orderInvoiceDetail.setElectrovalence(electrovalence);
            orderInvoiceDetail.setServiceCharge(serviceCharge);
            orderInvoiceDetail.setAddedService(serviceCharge.multiply(invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
            orderInvoiceDetailService.save(orderInvoiceDetail);
        }
        return AjaxResult.success();
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml
New file
@@ -0,0 +1,17 @@
<?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.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyDetailOrder">
        <id column="id" property="id" />
        <result column="accounting_strategy_id" property="accountingStrategyId" />
        <result column="`type`" property="type" />
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="electrovalence" property="electrovalence" />
        <result column="service_charge" property="serviceCharge" />
        <result column="cost_service_charge" property="costServiceCharge" />
    </resultMap>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml
New file
@@ -0,0 +1,23 @@
<?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.ruoyi.order.mapper.AccountingStrategyOrderMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyOrder">
        <id column="id" property="id" />
        <result column="site_id" property="siteId" />
        <result column="`name`" property="name" />
        <result column="description" property="description" />
        <result column="discount" property="discount" />
        <result column="first_user_id" property="firstUserId" />
        <result column="two_user_id" property="twoUserId" />
        <result column="first_remark" property="firstRemark" />
        <result column="two_remark" property="twoRemark" />
        <result column="audit_status" property="auditStatus" />
        <result column="first_audit_time" property="firstAuditTime" />
        <result column="two_audit_time" property="twoAuditTime" />
        <result column="create_time" property="createTime" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
</mapper>