From ac525609f6a5ae1b755ab200c3c4e1edf06d05dc Mon Sep 17 00:00:00 2001 From: tzy Date: Fri, 20 Jun 2025 16:38:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor(order):=20=E5=90=88=E5=B9=B6=20OrderSe?= =?UTF-8?q?rvice=20=E5=92=8C=20OrderSwapBatteryService=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 OrderSwapBatteryService 接口中的方法合并到 OrderService 接口 - 更新 OrderServiceImpl 实现类,添加新合并的方法实现 - 修改相关的控制器和 Feign 客户端接口,以适应新的 OrderService 接口 - 删除了未使用的 OrderSwapBatteryService 接口文件 --- .../order/OrderSwapBatteryController.java | 31 +- .../hd/cloud/service/OrderService.java | 29 + .../service/OrderSwapBatteryService.java | 2 +- .../cloud/service/impl/OrderServiceImpl.java | 509 +++++++++++++----- .../hd/cloud/service/rpc/WechatService.java | 28 +- 5 files changed, 441 insertions(+), 158 deletions(-) diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java index f149707..b369287 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/order/OrderSwapBatteryController.java @@ -1,8 +1,10 @@ package com.evotech.hd.cloud.controller.order; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.evotech.hd.cloud.entity.order.Order; import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.service.OrderService; +import com.evotech.hd.cloud.service.OrderSwapBatteryService; import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep; @@ -14,6 +16,7 @@ import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import org.springdoc.core.annotations.ParameterObject; import org.springframework.web.bind.annotation.*; @@ -25,10 +28,12 @@ import java.util.List; @RestController @RequestMapping("/order/swap") public class OrderSwapBatteryController { - + @Resource private OrderService orderService; + private OrderSwapBatteryService orderSwapBatteryService; + @Operation(summary = "查询") @GetMapping("/list") @@ -36,28 +41,28 @@ public class OrderSwapBatteryController { public Result> list(@ParameterObject PageListSwapOrderRequest plsor) { return orderService.pageList(plsor); } - + @Operation(summary = "查询公司订单") @GetMapping("/listcompanyorder") @ApiOperationSupport(order = 8) @Hidden @Deprecated - public Result> listByCompany(@ParameterObject PageListSwapOrderRequest plsor) { - return orderSwapBatteryService.listByCompany(plsor); + public Result> listByCompany(@ParameterObject PageListSwapOrderRequest plsor) { + return orderService.listByCompany(plsor); } @Operation(summary = "查询换电步骤") @GetMapping("/step/list") @ApiOperationSupport(order = 9) public Result> listStep(@NotBlank String orderNo) { - return orderSwapBatteryService.listStep(orderNo); + return orderService.listStep(orderNo); } @Operation(summary = "费用计算") @PostMapping({"/cost"}) @ApiOperationSupport(order = 9) - public Result calculateCost(@NotBlank @RequestParam OrderSwapBattery osb) { - return orderSwapBatteryService.calculateCost(osb); + public Result calculateCost(@NotBlank @RequestParam Order osb) { + return orderService.calculateCost(osb); } @@ -65,7 +70,7 @@ public class OrderSwapBatteryController { @PostMapping({"/wallet/pay"}) @ApiOperationSupport(order = 11) public Result walletPay(@RequestParam String orderNo, String wuid, String uname) { - return orderSwapBatteryService.walletPay(orderNo, wuid, uname); + return orderService.walletPay(orderNo, wuid, uname); } @@ -82,21 +87,21 @@ public class OrderSwapBatteryController { @PostMapping({"/wechat/nativepay"}) @ApiOperationSupport(order = 13) public Result companyNativePay(@RequestBody NativePayVO prePay) { - return orderSwapBatteryService.companyNativePay(prePay); + return orderService.companyNativePay(prePay); } @Operation(summary = "扫码支付订单查询状态") @GetMapping("/paystatus/query") @ApiOperationSupport(order = 14) public Result orderQuery(String outTradeNo) { - return orderSwapBatteryService.orderQuery(outTradeNo); + return orderService.orderQuery(outTradeNo); } @Operation(summary = "站端取消订单") @PostMapping("/pre/cancelOrder") @ApiOperationSupport(order = 15) public Result cancelOrder(@NotNull String orderNo) { - return orderSwapBatteryService.cancelOrder(orderNo, null); + return orderService.cancelOrder(orderNo, null); } @Operation(summary = "开始换电") @PostMapping("/startSwap") @@ -108,14 +113,14 @@ public class OrderSwapBatteryController { @PostMapping("/getStartSwap") @ApiOperationSupport(order = 17) public Result getStartSwap(@RequestParam String wuid, String orderId) { - return orderSwapBatteryService.getStartSwap(wuid,orderId); + return orderService.getStartSwap(wuid,orderId); } @Operation(summary = "未完成订单查询:plateNum") @GetMapping("/checkList") @ApiOperationSupport(order = 18) public Result checkList(@ParameterObject PageListSwapOrderRequest plsor) { - return orderSwapBatteryService.checkList(plsor); + return orderService.checkList(plsor); } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java index 756c4d0..01e4024 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderService.java @@ -3,10 +3,17 @@ package com.evotech.hd.cloud.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.evotech.hd.cloud.entity.order.Order; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; +import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryStep; +import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.util.List; /** * 订单接口 @@ -42,4 +49,26 @@ public interface OrderService extends IService { * 开始换电 */ public Result startSwap(String wuid, String orderId); + /*** + * 查询公司订单 + */ + Result> listByCompany(PageListSwapOrderRequest plsor); + /*** + * 查询换电步骤 + */ + Result> listStep(@NotBlank String orderNo); + /* + 个人账户余额支付 + */ + Result walletPay(String orderNo, String wuid, String uname); + + Result companyNativePay(NativePayVO prePay); + + Result orderQuery(String outTradeNo); + + Result cancelOrder(@NotNull String orderNo,Integer status); + + Result checkList(PageListSwapOrderRequest plsor); + + Result getStartSwap(String wuid, String orderId); } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java index ff13c7f..08903ed 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/OrderSwapBatteryService.java @@ -28,7 +28,7 @@ public interface OrderSwapBatteryService { // public Result> list(PageListSwapOrderRequest plsor); -// public Result> listByCompany(PageListSwapOrderRequest plsor); + public Result> listByCompany(PageListSwapOrderRequest plsor); public Result> listStep(String orderNo); diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java index 7e489e6..1404d0f 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/OrderServiceImpl.java @@ -2,39 +2,52 @@ package com.evotech.hd.cloud.service.impl; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONConfig; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.evotech.hd.cloud.dao.OrderDao; -import com.evotech.hd.cloud.dao.OrderDetailDao; +import com.evotech.hd.cloud.dao.*; import com.evotech.hd.cloud.entity.order.Order; import com.evotech.hd.cloud.entity.order.OrderDetail; +import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq; import com.evotech.hd.cloud.service.OrderService; +import com.evotech.hd.cloud.service.TaxPointService; +import com.evotech.hd.cloud.service.TradeService; +import com.evotech.hd.cloud.service.WalletAccountService; +import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.utils.CommonUtil; import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent; import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.order.OrderListVo; import com.evotech.hd.common.core.constant.HDConstant; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; +import com.evotech.hd.common.core.entity.cloud.*; +import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest; +import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.OrderStatusEnums; +import com.evotech.hd.common.core.enums.PayTypeEnums; +import com.evotech.hd.common.core.enums.TradeTypeEnums; import com.evotech.hd.common.web.util.EnumUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.channel.DirectChannel; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Date; +import java.util.*; import java.util.function.Function; /** @@ -50,154 +63,388 @@ import java.util.function.Function; @Service @Slf4j public class OrderServiceImpl extends BaseServiceImpl implements OrderService { - @Resource - private OrderDetailDao orderDetailDao; - @Resource - private SwapOrderBasicFeeComponent orderBasicFeeComponent; - + @Resource + private OrderDetailDao orderDetailDao; + @Resource + private SwapOrderBasicFeeComponent orderBasicFeeComponent; + @Autowired + private DirectChannel errorChannel; + @Resource + private VehicleInfoDao vehicleInfoDao; + @Resource + private OrderDao orderDao; + @Resource + private OrderSwapBatteryStepDao orderSwapBatteryStepDao; + @Resource + private WalletAccountDao walletAccountDao; + @Resource + private TradeService tradeService; + @Resource + private WalletAccountService walletAccountService; + @Resource + TaxPointService taxPointService; + @Resource + private WechatService wechatService; + @Resource + private OrderSwapBatteryPreDao orderSwapBatteryPreDao; @Override public Result> pageList(PageListSwapOrderRequest plsor) { - return new Result>().success(selectPage(new Page(plsor.getPageNo(), plsor.getPageSize()), new LambdaQueryWrapper() - .eq(StringUtils.isNotEmpty(plsor.getOrderNo()), Order::getOrderNo, plsor.getOrderNo()) - .eq(StringUtils.isNotEmpty(plsor.getPlateNum()), Order::getPlateNum, plsor.getPlateNum()) - .ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin()) - .le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd()) - .eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode()) - .eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::getNotifyOrderNo, plsor.getTradeNo()) - .ne(Order::getDelFlag, 1) - .orderByDesc(Order::getOrderTime), new Function() { - @Override - public OrderListVo apply(Order order) { - OrderListVo vo = new OrderListVo(); - BeanUtils.copyProperties(order, vo); - return vo; - } - })); + return new Result>().success(selectPage(new Page(plsor.getPageNo(), plsor.getPageSize()), new LambdaQueryWrapper() + .eq(StringUtils.isNotEmpty(plsor.getOrderNo()), Order::getOrderNo, plsor.getOrderNo()) + .eq(StringUtils.isNotEmpty(plsor.getPlateNum()), Order::getPlateNum, plsor.getPlateNum()) + .ge(ObjectUtils.isNotEmpty(plsor.getOrderTimeBegin()), Order::getOrderTime, plsor.getOrderTimeBegin()) + .le(ObjectUtils.isNotEmpty(plsor.getOrderTimeEnd()), Order::getOrderTime, plsor.getOrderTimeEnd()) + .eq(StringUtils.isNotEmpty(plsor.getStationCode()), Order::getStationCode, plsor.getStationCode()) + .eq(StringUtils.isNotEmpty(plsor.getTradeNo()), Order::getNotifyOrderNo, plsor.getTradeNo()) + .ne(Order::getDelFlag, 1) + .orderByDesc(Order::getOrderTime), new Function() { + @Override + public OrderListVo apply(Order order) { + OrderListVo vo = new OrderListVo(); + BeanUtils.copyProperties(order, vo); + return vo; + } + })); } - @Override - public Result calculateCost(Order order) { - //查询详情数据, 检查详情相关数据是否存在 - OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getPkId()), false); - if(ObjectUtils.isEmpty(orderDetail)){ - return new Result().error("当前订单没有订单详情,无法处理"); - } - // 2. 检查数据 - if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) { - orderDetail = orderBasicFeeComponent.orderBasicFee(order, orderDetail); - if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) { - return new Result().error("订单费用标准异常!"); - } - } - // 2. 检查消耗量 - if (orderDetail.getElectricityQuantity() == null) { - orderDetail = orderBasicFeeComponent.calculateElectricityQuantity(order, orderDetail); - if (orderDetail.getElectricityQuantity() == null) { - return new Result().error("订单消费统计信息异常!"); - } - } - // 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分 - BigDecimal orderFee = new BigDecimal(orderDetail.getUnitPrice()).multiply(new BigDecimal(orderDetail.getElectricityQuantity())).setScale(0, RoundingMode.HALF_UP); - //订单价格 - orderDetail.setOrderFee(orderFee.intValue()); - // 4. 跟新订单 - order.setOrderAmount(orderFee.add(new BigDecimal(orderDetail.getServiceFee())).intValue()); - order.setStatus(OrderStatusEnums.TOPAY.getCode()); - getBaseMapper().updateById(order); - //更新订单详情 - orderDetailDao.updateById(orderDetail); - return new Result().success(""); - } + @Override + public Result calculateCost(Order order) { + //查询详情数据, 检查详情相关数据是否存在 + OrderDetail orderDetail = orderDetailDao.selectOne(new LambdaQueryWrapper().eq(OrderDetail::getOrderId, order.getPkId()), false); + if (ObjectUtils.isEmpty(orderDetail)) { + return new Result().error("当前订单没有订单详情,无法处理"); + } + // 2. 检查数据 + if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) { + orderDetail = orderBasicFeeComponent.orderBasicFee(order, orderDetail); + if (orderDetail.getServiceFee() == null || orderDetail.getUnitPrice() == null) { + return new Result().error("订单费用标准异常!"); + } + } + // 2. 检查消耗量 + if (orderDetail.getElectricityQuantity() == null) { + orderDetail = orderBasicFeeComponent.calculateElectricityQuantity(order, orderDetail); + if (orderDetail.getElectricityQuantity() == null) { + return new Result().error("订单消费统计信息异常!"); + } + } + // 3. 选择费用计算方式 计算费用, 这里计算出来直接就是分 + BigDecimal orderFee = new BigDecimal(orderDetail.getUnitPrice()).multiply(new BigDecimal(orderDetail.getElectricityQuantity())).setScale(0, RoundingMode.HALF_UP); + //订单价格 + orderDetail.setOrderFee(orderFee.intValue()); + // 4. 跟新订单 + order.setOrderAmount(orderFee.add(new BigDecimal(orderDetail.getServiceFee())).intValue()); + order.setStatus(OrderStatusEnums.TOPAY.getCode()); + getBaseMapper().updateById(order); + //更新订单详情 + orderDetailDao.updateById(orderDetail); + return new Result().success(""); + } + @Override + public Result updateStatus(String orderNo, Integer status) { + //根据订单编码查询此订单 + Order order = getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderNo)); + if (order == null) { + return new Result().error("订单不存在", false); + } + // 2.如果当前是关闭状态, 检查当前订单是否只是创建状态, 如果不是创建状态, 返回无法关闭 + if (OrderStatusEnums.CANCLE.getCode().equals(status) && !OrderStatusEnums.CREATE.getCode().equals(order.getStatus())) { + return new Result().error("当前状态不允许关闭,订单状态:" + EnumUtils.getEnumPropertyValue(OrderStatusEnums.class, order.getStatus()), false); + } + order.setStatus(status); + order.setUpdateTime(new Date()); + // 3.更新订单状态 + if (getBaseMapper().updateById(order) > 0) { + return new Result().success(true); + } else { + return new Result().error((OrderStatusEnums.CANCLE.getCode().equals(status) ? "取消订单失败" : "订单状态调整失败"), false); + } - @Override - public Result updateStatus(String orderNo, Integer status) { - //根据订单编码查询此订单 - Order order = getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Order::getOrderNo, orderNo)); - if (order == null) { - return new Result().error("订单不存在", false); - } - // 2.如果当前是关闭状态, 检查当前订单是否只是创建状态, 如果不是创建状态, 返回无法关闭 - if (OrderStatusEnums.CANCLE.getCode().equals(status) && !OrderStatusEnums.CREATE.getCode().equals(order.getStatus())) { - return new Result().error("当前状态不允许关闭,订单状态:" + EnumUtils.getEnumPropertyValue(OrderStatusEnums.class, order.getStatus()), false); - } - order.setStatus(status); - order.setUpdateTime(new Date()); - // 3.更新订单状态 - if (getBaseMapper().updateById(order) > 0){ - return new Result().success(true); - }else{ - return new Result().error((OrderStatusEnums.CANCLE.getCode().equals(status) ? "取消订单失败" : "订单状态调整失败"), false); - } + } - } - - @Override - public Result addOrderByPre(OrderSwapBatteryPre orderSwapBatteryPre) { - // 生成订单 - Order order = new Order(); - order.setOrderNo(CommonUtil.swapBatteryOrderNo(orderSwapBatteryPre.getStationCode())); - order.setOrderPreId(orderSwapBatteryPre.getPkId()); + @Override + public Result addOrderByPre(OrderSwapBatteryPre orderSwapBatteryPre) { + // 生成订单 + Order order = new Order(); + order.setOrderNo(CommonUtil.swapBatteryOrderNo(orderSwapBatteryPre.getStationCode())); + order.setOrderPreId(orderSwapBatteryPre.getPkId()); // order.setP(osbp.getPhone()); - order.setPreWechatId(orderSwapBatteryPre.getUcode()); - order.setPreName(orderSwapBatteryPre.getUname()); - order.setPlateNum(orderSwapBatteryPre.getPlateNum()); - order.setOrderTime(new Date()); - order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP); - order.setStatus(OrderStatusEnums.CREATE.getCode()); - order.setStationCode(orderSwapBatteryPre.getStationCode()); - order.setStationName(orderSwapBatteryPre.getStationName()); - // TODO 查询换电站信息,拿到计费方式,计费信息在充电结束时, 计算 + order.setPreWechatId(orderSwapBatteryPre.getUcode()); + order.setPreName(orderSwapBatteryPre.getUname()); + order.setPlateNum(orderSwapBatteryPre.getPlateNum()); + order.setOrderTime(new Date()); + order.setOrderType(HDConstant.OrderConstant.ORDER_TYPE_SWAP); + order.setStatus(OrderStatusEnums.CREATE.getCode()); + order.setStationCode(orderSwapBatteryPre.getStationCode()); + order.setStationName(orderSwapBatteryPre.getStationName()); + // TODO 查询换电站信息,拿到计费方式,计费信息在充电结束时, 计算 // osb = orderBasicFeeComponent.orderBasicFee(osb); - return (save(order) ? new Result().success(order) : new Result().error("订单生成异常",null)); - } + return (save(order) ? new Result().success(order) : new Result().error("订单生成异常", null)); + } - @Override - public Result startSwap(String wuid, String orderId) { - if (StringUtils.isBlank(wuid) || StringUtils.isBlank(orderId)) { - log.warn("换电请求参数无效, wuid: {}, orderId: {}", wuid, orderId); - return new Result().error("换电请求参数无效"); - } + @Override + public Result startSwap(String wuid, String orderId) { + if (StringUtils.isBlank(wuid) || StringUtils.isBlank(orderId)) { + log.warn("换电请求参数无效, wuid: {}, orderId: {}", wuid, orderId); + return new Result().error("换电请求参数无效"); + } - // 获取用户订单 - Order order= getBaseMapper().selectById(orderId); - if (ObjectUtils.isEmpty(order)) { - log.warn("未找到符合条件的订单, 用户ID: {}, 订单id: {}", wuid, orderId); - return new Result().error("未找到符合条件的订单"); - } + // 获取用户订单 + Order order = getBaseMapper().selectById(orderId); + if (ObjectUtils.isEmpty(order)) { + log.warn("未找到符合条件的订单, 用户ID: {}, 订单id: {}", wuid, orderId); + return new Result().error("未找到符合条件的订单"); + } - try { - log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid); - // 构建换电请求消息 - BatterySwapReq batterySwapReq = new BatterySwapReq(); - batterySwapReq.setOrderNo(order.getOrderNo()); - batterySwapReq.setMsg("换电开始"); + try { + log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid); + // 构建换电请求消息 + BatterySwapReq batterySwapReq = new BatterySwapReq(); + batterySwapReq.setOrderNo(order.getOrderNo()); + batterySwapReq.setMsg("换电开始"); - // 设置消息主题和头部信息 - MessageTopic topic = new MessageTopic(); - topic.setDataDirection("M2S"); - topic.setMessageType(MqttMessageTypeEnum.REQUEST.getType()); + // 设置消息主题和头部信息 + MessageTopic topic = new MessageTopic(); + topic.setDataDirection("M2S"); + topic.setMessageType(MqttMessageTypeEnum.REQUEST.getType()); - MqttMessageHeader header = new MqttMessageHeader(); - header.setFunction(RequestFunctionTypesEnum.FUN_STARTSWAP.getFunction()); - header.setTimeStamp(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER)); + MqttMessageHeader header = new MqttMessageHeader(); + header.setFunction(RequestFunctionTypesEnum.FUN_STARTSWAP.getFunction()); + header.setTimeStamp(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_FORMATTER)); - // 发送消息给站端 - messageUtilService.publishAESMessage(topic, header, JSONUtil.parseObj(batterySwapReq, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN))); + // 发送消息给站端 + messageUtilService.publishAESMessage(topic, header, JSONUtil.parseObj(batterySwapReq, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN))); - log.info("换电开始消息发送成功, 订单编号: {}", order.getOrderNo()); - return new Result().success(true); + log.info("换电开始消息发送成功, 订单编号: {}", order.getOrderNo()); + return new Result().success(true); - } catch (Exception e) { - log.error("处理换电请求时发生异常, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid, e); - return new Result().error("系统处理换电请求时发生异常"); - } + } catch (Exception e) { + log.error("处理换电请求时发生异常, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid, e); + return new Result().error("系统处理换电请求时发生异常"); + } - return Result().success(true); - } + return Result < Boolean > ().success(true); + } + + @Override + public Result> listByCompany(PageListSwapOrderRequest orderRequest) { + if (!StringUtils.isBlank(orderRequest.getCcode())) { + return null; + } + if (orderRequest.getOrderTimeBegin() == null || orderRequest.getOrderTimeEnd() == null) { + return null; + } + Page page = new Page<>(orderRequest.getPageNo(), orderRequest.getPageSize()); + List vehicleList = vehicleInfoDao.selectList(new QueryWrapper().eq("ccode", orderRequest.getCcode())); + if (vehicleList.isEmpty()) { + return new Result>().error("未发现该公司车辆"); + } + //查询车辆信息 + List plateNumList = vehicleList.stream().map(VehicleInfo::getPlateNum).toList(); + page = orderDao.selectPage(page, new QueryWrapper() + .in("plate_num", plateNumList) + .in(StringUtils.isBlank(orderRequest.getStatus()), "status", orderRequest.getStatus()) + .ge("order_time", orderRequest.getOrderTimeBegin()) + //疑问 换电开始时间和结束时间 跟谁比较 + .le("order_time", orderRequest.getOrderTimeEnd()) + .ne("del_flag", 1) + .orderByDesc("pk_id") + ); + if (page.getRecords().isEmpty()) { + return new Result>().error(CodeMsg.DATABASE_RESULT_NULL); + } + return new Result>().success(page); + } + + @Override + public Result> listStep(String orderNo) { + List orderList = orderSwapBatteryStepDao.selectList(new QueryWrapper() + .eq("order_no", orderNo)); + if (orderList.isEmpty()) { + return new Result>().error(CodeMsg.DATABASE_RESULT_NULL); + } + return new Result>().success(orderList); + } + + @Override + public Result walletPay(String orderNo, String wuid, String uname) { + Order order = orderDao.selectOne(new QueryWrapper().eq("order_no", orderNo)); + if (!Objects.equals(order.getStatus(), OrderStatusEnums.TOPAY.getCode())) { + return new Result().error("订单异常!"); + } + if (order.getOrderAmount() < 1) { + return new Result().error("订单金额异常!"); + } + WalletAccount wallet = walletAccountDao.selectOne(new QueryWrapper().eq("owner_id", wuid)); + if (wallet == null) { + return new Result().error("钱包账户异常!"); + } + if (wallet.getTotalAmount() < order.getOrderAmount()) { + return new Result().error("钱包余额不足!"); + } + //添加交易 + TradeDetail trade = new TradeDetail(); + //trade.setOutTradeNo(CommonUtil.payTradeNo(2)); + trade.setTrader(uname); + trade.setTraderCode(wuid); + trade.setTradeType(TradeTypeEnums.PAYORDER.getCode()); + trade.setOrderCount(1); + trade.setOrderNo(orderNo); + trade.setTradeAmount(order.getOrderAmount()); + trade.setPayType(PayTypeEnums.WALLET.getCode()); + trade.setPayResult("SUCCESS"); + trade.setPayer(wuid); + trade.setWallet(wallet.getCode()); + trade.setPayTime(new Date()); + tradeService.add(trade); + //添加钱包账户明细 + WalletAccountDetail wad = new WalletAccountDetail(); + wad.setPreTotalAmount(wallet.getTotalAmount()); + wad.setPreRechargeAmount(wallet.getRechargeAmount()); + wad.setPreGiftAmount(0); + wad.setTradeRechargeAmount(-order.getOrderAmount()); + wad.setTradeGiftAmount(0); + wad.setTradeTotalAmount(wad.getTradeRechargeAmount() + wad.getTradeGiftAmount()); + wad.setCode(wallet.getCode()); + wad.setTradeType(trade.getTradeType()); + wad.setTradeNo(trade.getOutTradeNo()); + + wad.setAfterTotalAmount(wad.getPreTotalAmount() - Math.abs(wad.getTradeTotalAmount())); + wad.setAfterRechargeAmount(wad.getPreRechargeAmount() - Math.abs(wad.getTradeRechargeAmount())); + wallet.setGiftAmount(wad.getPreGiftAmount() - Math.abs(wad.getTradeGiftAmount())); + walletAccountService.addDetail(wad); + + wallet.setTotalAmount(wad.getAfterTotalAmount()); + wallet.setRechargeAmount(wad.getAfterRechargeAmount()); + wallet.setUptime(new Date()); + walletAccountDao.updateById(wallet); + // 修改订单状态 + order.setStatus(OrderStatusEnums.FINISH.getCode()); + //交易编码 + //order.setTradeNo(trade.getOutTradeNo()); + order.setUpdateTime(new Date()); + orderDao.updateById(order); + log.info("订单支付成功, 订单编号: {}", order.getOrderNo()); + //税点信息记录 + try { + taxPointService.addTaxPoint(order.getPkId(), order.getOrderNo(), Double.valueOf(order.getOrderAmount()), order.getStationCode()); + } catch (Exception e) { + log.error("生成税点信息异常,订单信息{}; 异常信息{}", JSON.toJSONString(order), e.getMessage()); + } + return new Result().success("OK"); + } + + @Override + public Result companyNativePay(NativePayVO prePay) { + return wechatService.wechatNativePay(prePay); + } + + @Override + public Result orderQuery(String outTradeNo) { + return wechatService.orderQuery(2, outTradeNo); + } + + @Override + public Result cancelOrder(String orderNo, Integer status) { + Order order = orderDao.selectOne(new QueryWrapper().eq("order_no", orderNo)); + + // 1. 查看订单是否存在 + if (order == null) { + return new Result().error("订单不存在"); + } + if (!Arrays.asList(3, 4, 5, 6, 7).contains(order.getStatus())) { + return new Result().error("当前状态不允许取消,订单状态:" + order.getStatus()); + } + order.setPkId(order.getPkId()); + order.setStatus(9); + order.setUpdateTime(new Date()); + int i = orderDao.updateById(order); + if (i == 1) { + return new Result().success(i); + } else { + return new Result().error("取消换电订单失败"); + } + } + + @Override + public Result checkList(PageListSwapOrderRequest plsor) { + Page page = new Page(plsor.getPageNo(), plsor.getPageSize()); + List statusList = new ArrayList<>(); + String strs = "1,2,3,4,5,6"; + if (StringUtils.isBlank(strs)) {//订单状态"已完成"之前的状态 + statusList = Arrays.asList(strs.split(",")).stream().map(Integer::valueOf).toList(); + } + page = orderDao.selectPage(page, new QueryWrapper() + .eq(StringUtils.isBlank(plsor.getOrderNo()), "order_no", plsor.getOrderNo()) + .eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum()) + .in(!statusList.isEmpty(), "status", statusList) + .ge(plsor.getOrderTimeBegin() != null, "order_time", plsor.getOrderTimeBegin()) + .le(plsor.getOrderTimeEnd() != null, "order_time", plsor.getOrderTimeEnd()) + .eq(StringUtils.isBlank(plsor.getStationCode()), "station_code", plsor.getStationCode()) + .like(StringUtils.isBlank(plsor.getStationName()), "station_name", plsor.getStationName()) + .eq(StringUtils.isBlank(plsor.getUserId()), "order_pre_uid", plsor.getUserId()) + .eq(StringUtils.isBlank(plsor.getTradeNo()), "trade_no", plsor.getTradeNo()) + .ne("del_flag", 1) + .orderByDesc("pk_id")); + if (!page.getRecords().isEmpty()) { + return new Result().error("该车辆有未结算的订单,请确认后重试!"); + } + Page page1 = new Page(plsor.getPageNo(), plsor.getPageSize()); + page1 = orderSwapBatteryPreDao.selectPage(page1, new QueryWrapper() + .eq(StringUtils.isBlank("1"), "status", "1") + .eq(StringUtils.isBlank(plsor.getPlateNum()), "plate_num", plsor.getPlateNum()) + .orderByDesc("pk_id")); + if (!page1.getRecords().isEmpty()) { + return new Result().error("该车辆有预约成功的订单,请处理后重试!"); + } + + return new Result().success(0); + } + + @Override + public Result getStartSwap(String wuid, String orderId) { + // 参数校验 + if (StrUtil.isBlank(wuid) || StrUtil.isBlank(orderId)) { + log.warn("获取换电状态参数无效, wuid: {}, orderId: {}", wuid, orderId); + return new Result().error("参数无效"); + } + return new Result().error("参数无效"); +// 获取用户订单 + Order orderSwap = orderDao.selectById(orderId); + if (orderSwap == null) { + log.warn("未找到符合条件的订单, 用户ID: {}, 订单id: {}", wuid, orderId); + return new Result().error("未找到符合条件的订单"); + } + try { + // 从 Redis 中获取换电信息 + String redisKey = "battery:" + orderSwap.getOrderNo(); + /* Object o = redisUtil.get(redisKey); + if (ObjectUtil.isEmpty(o)) { + log.info("未收到换电成功信息, 订单编号: {}", orderSwap.getOrderNo()); + return new Result().error("未收到换电成功信息"); + }*/ + // 将获取到的 JSON 字符串转换为 BatterySwapResponse 对象 + BatterySwapResponse response = JSONUtil.toBean(o.toString(), BatterySwapResponse.class); + if (response == null) { + log.error("换电响应数据解析失败, 订单编号: {}", orderSwap.getOrderNo()); + return new Result().error("换电响应数据解析失败"); + } + if (response.getCode() == 1) { + log.info("换电成功, 订单编号: {}", orderSwap.getOrderNo()); + return new Result().success(response); + } else { + log.warn("换电失败, 订单编号: {}, 错误信息: {}", orderSwap.getOrderNo(), response.getMsg()); + return new Result().error(response.getMsg()); + } + } catch (Exception e) { + log.error("获取换电状态时发生异常, 订单编号: {}", orderSwap.getOrderNo(), e); + return new Result().error("系统获取换电状态时发生异常"); + } + } } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java index c1c95c3..a745068 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/rpc/WechatService.java @@ -1,10 +1,12 @@ package com.evotech.hd.cloud.service.rpc; +import com.evotech.hd.cloud.entity.order.Order; import com.evotech.hd.cloud.entity.vo.NativePayVO; +import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.request.template.AlarmTemplateDto; import com.evotech.hd.common.core.Dto.request.template.StopServerTemplateDto; -import com.evotech.hd.common.core.entity.Result; -import com.evotech.hd.common.core.entity.cloud.OrderSwapBattery; + + import com.evotech.hd.common.core.entity.cloud.OrderSwapBatteryPre; import com.evotech.hd.common.core.entity.cloud.TradeDetail; import org.springdoc.core.annotations.ParameterObject; @@ -17,36 +19,36 @@ import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "${WECHAT-SERVER-API-NAME}", path = "${WECHAT-SERVER-API-PATH}") public interface WechatService { - + @GetMapping(value = "/xcx/qrcode/get2", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public String getQRCode2(@RequestParam String path, @RequestParam String width, @RequestParam String env_version); - - + + @GetMapping(value = "/xcx/qrcode/create2", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public String createQRCode2(@RequestParam String path, @RequestParam String width); - + @PostMapping(value = "/gzh/msg/send/preorder2", consumes = {MediaType.APPLICATION_JSON_VALUE}) public Result preOrderMessage(@RequestBody OrderSwapBatteryPre osbp); - + @PostMapping(value = "/gzh/msg/send/order", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) - public Result orderMessage(@ParameterObject OrderSwapBattery osb, @RequestParam Integer templateType); - + public Result orderMessage(@ParameterObject Order osb, @RequestParam Integer templateType); + @PostMapping(value = "/gzh/msg/send/order2", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public Result orderMessage2(@RequestParam Integer id, @RequestParam Integer templateType); - + @PostMapping(value = "/gzh/msg/send/recharge", consumes = {MediaType.APPLICATION_JSON_VALUE}) public Result rechargeMessage(@RequestBody TradeDetail trade, @RequestParam Integer money); - + @PostMapping(value = "/wechatpay/native/prepay", consumes = {MediaType.APPLICATION_JSON_VALUE}) - public Result wechatNativePay(@RequestBody NativePayVO prePay); - + public com.evotech.hd.common.core.Dto.Result wechatNativePay(@RequestBody NativePayVO prePay); + @GetMapping(value = "/wechatpay/native/order/query", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public Result orderQuery(@RequestParam Integer type, @RequestParam String outTradeNo);