提交 2095d152 authored 作者: hzh's avatar hzh

代码优化

上级 33ed5fd3
package org.dromara.order.api;
import org.dromara.order.api.domain.OrderPay;
import org.dromara.order.api.domain.RemoteOrder;
import org.dromara.order.api.domain.RemoteSaveOrder;
......@@ -18,7 +19,7 @@ public interface RemoteOrderService {
* @param order 订单信息
* @return 订单支付信息
*/
String createOrder(RemoteSaveOrder order) throws Exception;
OrderPay createOrder(RemoteSaveOrder order) throws Exception;
/**
* 查询订单列表
......
package org.dromara.order.api.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-05
**/
@Data
public class OrderPay {
@Accessors(chain = true)
public class OrderPay implements Serializable {
/**
* 订单号
*/
private String orderNo;
/**
* 支付订单号
*/
private String orderPayNo;
/**
* 支付信息
*/
private String payInfo;
}
......@@ -3,13 +3,15 @@ package org.dromara.order.api.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-09
**/
@Data
@Accessors(chain = true)
public class RemoteOrder {
public class RemoteOrder implements Serializable {
/**
* 订单类型
......
......@@ -10,7 +10,7 @@ import lombok.Getter;
@AllArgsConstructor
public enum Source {
YSH("ys", "云上");
YSH("YS", "云上");
private final String source;
private final String desc;
......
package org.dromara.order.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.http.ContentType;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.ImmutableMap;
import com.ijpay.core.kit.HttpKit;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.pay.domain.JsapiNotifyModel;
import org.dromara.common.web.core.BaseController;
import org.dromara.order.domain.bo.OrderBo;
import org.dromara.order.domain.vo.OrderVo;
import org.dromara.order.service.IOrderPayService;
import org.dromara.order.service.IOrderService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
......@@ -49,78 +37,10 @@ import java.util.Map;
@RequestMapping("/order")
public class OrderController extends BaseController {
private final IOrderService orderService;
private final IOrderPayService orderPayService;
/**
* 查询订单费用列表
*/
@SaCheckPermission("order:order:list")
@GetMapping("/list")
public TableDataInfo<OrderVo> list(OrderBo bo, PageQuery pageQuery) {
return orderService.queryPageList(bo, pageQuery);
}
/**
* 导出订单费用列表
*/
@SaCheckPermission("order:order:export")
@Log(title = "订单费用", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(OrderBo bo, HttpServletResponse response) {
List<OrderVo> list = orderService.queryList(bo);
ExcelUtil.exportExcel(list, "订单费用", OrderVo.class, response);
}
/**
* 获取订单费用详细信息
*
* @param id 主键
*/
@SaCheckPermission("order:order:query")
@GetMapping("/{id}")
public R<OrderVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(orderService.queryById(id));
}
/**
* 新增订单费用
*/
@SaCheckPermission("order:order:add")
@Log(title = "订单费用", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderBo bo) {
return toAjax(orderService.insertByBo(bo));
}
/**
* 修改订单费用
*/
@SaCheckPermission("order:order:edit")
@Log(title = "订单费用", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderBo bo) {
return toAjax(orderService.updateByBo(bo));
}
/**
* 删除订单费用
*
* @param ids 主键串
*/
@SaCheckPermission("order:order:remove")
@Log(title = "订单费用", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(orderService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 回调原函数
* 回调函数
*
* @param request request
* @param response response
......
......@@ -9,11 +9,13 @@ import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.pay.service.IWxPayService;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.order.api.RemoteOrderService;
import org.dromara.order.api.domain.OrderPay;
import org.dromara.order.api.domain.RemoteOrder;
import org.dromara.order.api.domain.RemoteSaveOrder;
import org.dromara.order.api.enums.OrderStatus;
......@@ -32,7 +34,6 @@ import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
......@@ -54,7 +55,7 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
@GlobalTransactional(rollbackFor = Exception.class)
@Override
public String createOrder(RemoteSaveOrder remoteOrder) throws Exception {
public OrderPay createOrder(RemoteSaveOrder remoteOrder) throws Exception {
ValidatorUtils.validate(remoteOrder);
//查询订单信息
Long userId = LoginHelper.getUserId();
......@@ -67,7 +68,7 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
).stream().findFirst().orElseGet(() -> {
//创建订单
OrderBo bo = new OrderBo()
.setUserId(LoginHelper.getUserId())
.setUserId(userId)
.setOrderNo(System.currentTimeMillis() + "")
.setSource(remoteOrder.getSource().getSource())
.setOrderType(remoteOrder.getOrderType().getType())
......@@ -81,30 +82,35 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
if (StringUtils.equals(order.getStatus(), OrderStatus.PAYED.getCode())) {
throw new ServiceException("订单已支付");
}
//获取订单支付信息
List<OrderFeeVo> feeList = Optional.ofNullable(orderFeeService.queryList(new OrderFeeBo()
.setOrderNo(order.getOrderNo())))
.orElseGet(() -> {
//创建订单费用信息
List<RemoteSaveOrder.Fee> list = remoteOrder.getFeeList();
//获取服务费信息
RemoteSaveOrder.Fee serviceFee = IOrderServiceFeeStrategy.calcServiceFee(remoteOrder.getSource(), remoteOrder.getOrderType(), list);
list.add(serviceFee);
List<OrderFeeBo> ofList = list.stream().map(fee -> {
return new OrderFeeBo()
.setOrderNo(order.getOrderNo())
.setFeeDesc(fee.getFeeDesc())
.setFeeAmount(fee.getFeeAmount())
.setFeeType(fee.getFeeType().getCode())
.setOtherInfo(fee.getOtherInfo())
.setRemark(fee.getRemark());
}).collect(Collectors.toList());
orderFeeService.batchInsertByList(ofList);
return BeanUtil.copyToList(ofList, OrderFeeVo.class);
});
//删除历史订单费用信息
List<OrderFeeVo> orderFeeVos = orderFeeService.queryList(new OrderFeeBo()
.setOrderNo(order.getOrderNo()));
if (CollectionUtils.isNotEmpty(orderFeeVos)) {
orderFeeService.deleteWithValidByIds(StreamUtils.toList(orderFeeVos, OrderFeeVo::getId), false);
}
//创建订单费用信息
List<RemoteSaveOrder.Fee> list = remoteOrder.getFeeList();
//获取服务费信息
RemoteSaveOrder.Fee serviceFee = IOrderServiceFeeStrategy.calcServiceFee(remoteOrder.getSource(), remoteOrder.getOrderType(), list);
list.add(serviceFee);
List<OrderFeeBo> ofList = list.stream().map(fee -> {
return new OrderFeeBo()
.setUserId(order.getUserId())
.setOrderNo(order.getOrderNo())
.setFeeDesc(fee.getFeeDesc())
.setFeeAmount(fee.getFeeAmount())
.setFeeType(fee.getFeeType().getCode())
.setOtherInfo(fee.getOtherInfo())
.setRemark(fee.getRemark());
}).collect(Collectors.toList());
orderFeeService.batchInsertByList(ofList);
List<OrderFeeVo> feeList = BeanUtil.copyToList(ofList, OrderFeeVo.class);
//获取总金额
assert feeList != null;
BigDecimal amount = feeList.stream().map(OrderFeeVo::getFeeAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
......@@ -120,6 +126,9 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
}
Date expireTime = DateUtil.offsetMinute(new Date(), expireMinute);
// String openId = LoginHelper.getOpenId();
String openId = "oEeGe7Z4-OynAi63oqFkmarPCkLY";
//创建支付订单
OrderTradeBo ot = new OrderTradeBo()
.setUserId(order.getUserId())
......@@ -133,7 +142,7 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
.setTradeType(remoteOrder.getTradeType().name())
.setExpireTime(expireTime)
.setTradeState(WechatTradeState.USERPAYING.getState())
.setPayOpenId(LoginHelper.getOpenId());
.setPayOpenId(openId);
orderTradeService.insertByBo(ot);
//跟新支付信息
......@@ -144,7 +153,11 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
orderService.updateByBo(BeanUtil.copyProperties(order, OrderBo.class));
//获取支付订单
return IPayStrategy.pay(JSON.toJSONString(ot), feeList, remoteOrder.getTradeType().name());
return new OrderPay()
.setOrderNo(order.getOriginOrderNo())
.setOrderPayNo(ot.getOrderPayNo())
.setPayInfo(IPayStrategy.pay(JSON.toJSONString(ot), feeList, remoteOrder.getTradeType().name()));
}
@Override
......
......@@ -12,6 +12,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.pay.domain.JsapiNotifyModel;
import org.dromara.common.pay.service.IWxPayService;
import org.dromara.order.api.enums.OrderStatus;
import org.dromara.order.constant.WechatTradeState;
import org.dromara.order.domain.bo.OrderBo;
import org.dromara.order.domain.bo.OrderTradeBo;
import org.dromara.order.domain.vo.OrderTradeVo;
......@@ -25,7 +26,9 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
* @author hzh
......@@ -80,10 +83,16 @@ public class WeChatOrderPayServiceImpl implements IOrderPayService {
String orderPayNo = model.getOut_trade_no();
String tradeState = model.getTrade_state();
List<String> notUpdateStateList = List.of(WechatTradeState.NOTPAY.getState(), WechatTradeState.USERPAYING.getState());
if (notUpdateStateList.contains(tradeState)) {
return;
}
OrderTradeVo orderTrade = orderTradeService.getOne(new OrderTradeBo().setOrderPayNo(orderPayNo));
if (Objects.isNull(orderTrade)) {
throw new RuntimeException("交易订单不存在");
}
if (!StringUtils.equals(tradeState, orderTrade.getTradeState())) {
//更新订单信息
String successTimeStr = model.getSuccess_time();
......@@ -93,27 +102,32 @@ public class WeChatOrderPayServiceImpl implements IOrderPayService {
String transactionId = model.getTransaction_id();
JsapiNotifyModel.Amount amount = model.getAmount();
//支付金额
int actualPayAmount = amount.getPayer_total();
Integer actualPayAmount = amount.getPayer_total();
//获取openId
String payOpenId = model.getPayer().getOpenid();
String payOpenId = Optional.ofNullable(model.getPayer()).map(JsapiNotifyModel.Payer::getOpenid).orElse(null);
orderTrade.setPayOpenId(payOpenId);
orderTrade.setPayTime(payTime);
orderTrade.setTransactionId(transactionId);
orderTrade.setActualPayAmount(new BigDecimal(actualPayAmount).divide(new BigDecimal(100), 2, RoundingMode.CEILING));
if (Objects.nonNull(actualPayAmount)) {
orderTrade.setActualPayAmount(new BigDecimal(actualPayAmount).divide(new BigDecimal(100), 2, RoundingMode.CEILING));
}
orderTrade.setTradeState(tradeState);
orderTrade.setTradeInfo(JSON.toJSONString(model));
orderTradeService.updateByBo(BeanUtil.copyProperties(orderTrade, OrderTradeBo.class));
//跟新主表信息
OrderVo order = orderService.getOne(new OrderBo().setOrderNo(orderTrade.getOrderNo()));
order.setOrderPayNo(orderPayNo);
order.setActualPayAmount(orderTrade.getActualPayAmount());
order.setPayTime(new Date());
order.setStatus(OrderStatus.PAYED.getCode());
orderService.updateByBo(BeanUtil.copyProperties(order, OrderBo.class));
if (StringUtils.equals(tradeState, WechatTradeState.SUCCESS.getState())) {
//跟新主表信息
OrderVo order = orderService.getOne(new OrderBo().setOrderNo(orderTrade.getOrderNo()));
order.setOrderPayNo(orderPayNo);
order.setActualPayAmount(orderTrade.getActualPayAmount());
order.setPayTime(new Date());
order.setStatus(OrderStatus.PAYED.getCode());
orderService.updateByBo(BeanUtil.copyProperties(order, OrderBo.class));
//跟新云上相关信息
ysOrderService.payed(order.getOrderType(), order.getOrderNo());
}
//跟新云上相关信息
ysOrderService.payed(order.getOrderType(), order.getOrderNo());
}
}
......
......@@ -2,6 +2,7 @@ package org.dromara.server.controller;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.order.api.domain.OrderPay;
import org.dromara.order.api.domain.RemoteOrder;
import org.dromara.order.api.enums.OrderType;
import org.dromara.server.domain.vo.OrderPayVo;
......@@ -32,7 +33,7 @@ public class OrderController {
* 下单支付接口
*/
@PostMapping("/pay")
public R<Object> pay(@Validated @RequestBody OrderPayVo vo) throws Exception {
public R<OrderPay> pay(@Validated @RequestBody OrderPayVo vo) throws Exception {
OrderType ot = OrderType.getEnum(vo.getOrderType());
return R.ok(service.createOrder(vo.getOrderNo(), ot));
}
......
package org.dromara.server.service;
import org.dromara.order.api.domain.OrderPay;
import org.dromara.order.api.domain.RemoteOrder;
import org.dromara.order.api.enums.OrderType;
......@@ -18,7 +19,7 @@ public interface IPayOrderService {
* @param orderType 订单类型
* @return 订单号
*/
String createOrder(String orderNo, OrderType orderType) throws Exception;
OrderPay createOrder(String orderNo, OrderType orderType) throws Exception;
/**
* 查询订单列表
......
......@@ -3,6 +3,7 @@ package org.dromara.server.service.impl;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.order.api.RemoteOrderService;
import org.dromara.order.api.domain.OrderPay;
import org.dromara.order.api.domain.RemoteOrder;
import org.dromara.order.api.domain.RemoteSaveOrder;
import org.dromara.order.api.enums.OrderType;
......@@ -12,6 +13,7 @@ import org.dromara.server.service.IOrderStrategy;
import org.dromara.server.service.IPayOrderService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -26,12 +28,16 @@ public class PayOrderServiceImpl implements IPayOrderService {
private RemoteOrderService remoteOrderService;
@Override
public String createOrder(String orderNo, OrderType orderType) throws Exception {
public OrderPay createOrder(String orderNo, OrderType orderType) throws Exception {
RemoteSaveOrder order = IOrderStrategy.createOrder(orderNo, orderType);
order.setSource(Source.YSH);
order.setOriginOrderNo(orderNo);
order.setTradeType(TradeType.JSAPI);
order.setOrderType(orderType);
BigDecimal amount = order.getFeeList().stream().map(RemoteSaveOrder.Fee::getFeeAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("订单金额不能小于等于0");
}
return remoteOrderService.createOrder(order);
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论