refactor(order): 重构订单模块

- 新增 SaveOrderBO 和 SaveOrderSkuItemBO 类用于生成订单
- 修改订单接口和实现类,支持新的订单生成逻辑
- 优化订单详情和订单项的数据结构
- 更新相关包名和类名以适应新的模块结构
This commit is contained in:
huk 2025-08-30 18:10:08 +08:00
parent b9b7d66549
commit 81b8b959aa
48 changed files with 893 additions and 356 deletions

View File

@ -16,6 +16,7 @@ import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.entity.Order;
import com.wzj.soopin.order.domain.vo.OrderVO;
import com.wzj.soopin.order.service.OrderItemService;
import com.wzj.soopin.order.service.OrderService;
import com.wzj.soopin.order.service.impl.OrderServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -45,7 +46,7 @@ import static com.wzj.soopin.content.domain.base.BaseInfoProperties.*;
@RequiredArgsConstructor
public class AppOrderController {
private final OrderServiceImpl orderService;
private final OrderService orderService;
private final OrderItemService orderItemService;
@ -61,16 +62,16 @@ public class AppOrderController {
@Log(title = "订单表", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R add(@RequestBody Order order) {
R<Order> result = orderService.insert(order);
if (result != null) {
// 订单创建成功发送消息
// R<Order> result = orderService.insert(order);
//
// if (result != null) {
// // 订单创建成功发送消息
// orderService.sendMessage(order);
log.info("订单创建成功消息已发送订单ID: {}", order.getId());
} else {
log.warn("订单创建失败: {}", "返回结果为null");
}
return result;
// log.info("订单创建成功消息已发送订单ID: {}", order.getId());
// } else {
// log.warn("订单创建失败: {}", "返回结果为null");
// }
return R.fail("接口改造中");
}
}

View File

@ -195,6 +195,7 @@ public class Constants
public static final Integer NO_PAY = 0;
public static final Integer ALIPAY = 1;
public static final Integer WECHAT = 2;
public static final Integer UNION = 3;
}
/**

View File

@ -55,7 +55,7 @@ public class SecurityConfig implements WebMvcConfigurer {
HttpServletRequest request = ServletUtils.getRequest();
// 检查是否登录 是否有token
try {
// StpUtil.checkLogin();
StpUtil.checkLogin();
} catch (NotLoginException e) {
if (request.getRequestURI().contains("sse")) {
throw new SseException(e.getMessage(), e.getCode());

View File

@ -4,11 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.order.convert.OrderConvert;
import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.bo.SaveOrderBO;
import com.wzj.soopin.order.domain.entity.Order;
import com.wzj.soopin.order.domain.vo.*;
import com.wzj.soopin.order.service.OrderService;
import com.wzj.soopin.order.service.OrderItemService;
import com.wzj.soopin.order.service.impl.OrderServiceImpl;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -20,27 +20,31 @@ import org.dromara.common.redis.redis.RedisService;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.web.core.BaseController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 订单Controller
* 订单接口列
*
* @author zcc
* &#064;date 2022-12-01
*/
@Tag(name ="订单接口列表")
//@Tag(name ="订单接口列表")
@RestController
@RequestMapping("/oms/order")
@Slf4j
@RequiredArgsConstructor
@Validated
public class OrderController extends BaseController {
private final OrderServiceImpl service;
private final OrderConvert convert;
private final RedisService redisService;
private final OrderService orderService;
private final OrderItemService orderItemService;
@ -53,14 +57,14 @@ public class OrderController extends BaseController {
@Tag(name ="修改收件人信息")
@PostMapping("/receiver/update")
public R updateReceiver(@RequestBody Order order) {
return R.ok(service.updateById(order));
return R.ok(orderService.updateById(order));
}
@Tag(name ="导出订单表列表")
@Log(title = "订单售后", businessType = BusinessType.EXPORT)
@PostMapping("export")
public R<String> export(OrderBo query) {
List<Order> list = service.list(query.toWrapper());
List<Order> list = orderService.list(query.toWrapper());
ExcelUtil<OrderVO> util = new ExcelUtil<>(OrderVO.class);
return R.ok(util.writeExcel(convert.toVO(list), "订单列表数据"));
}
@ -68,57 +72,52 @@ public class OrderController extends BaseController {
@Tag(name ="获取订单表详细信息")
@GetMapping(value = "/{id}")
public R<ManagerOrderDetailVO> getInfo(@PathVariable("id") Long id) {
return R.ok(service.selectById(id));
return R.ok(orderService.selectById(id));
}
@Tag(name ="新增订单表")
@Log(title = "订单表", businessType = BusinessType.INSERT)
/**
* 生成订单
* @param saveOrderBO
* @return
*/
@Log(title = "生成订单", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R add(@RequestBody Order order) {
R<Order> result = service.insert(order);
if (result != null) {
// 订单创建成功发送消息
// service.sendMessage(order);
log.info("订单创建成功消息已发送订单ID: {}", order.getId());
} else {
log.warn("订单创建失败: {}", "返回结果为null");
}
return result;
public R<OrderVO> add(@RequestBody SaveOrderBO saveOrderBO) {
return R.ok(orderService.saveOrder(saveOrderBO));
}
@Tag(name ="修改订单表")
@Log(title = "订单表", businessType = BusinessType.UPDATE)
@PostMapping("/update")
public R edit(@RequestBody Order order) {
return R.ok(service.updateById(order));
return R.ok(orderService.updateById(order));
}
@Tag(name ="删除订单表")
@Log(title = "订单表", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public R remove(@PathVariable Long id) {
return R.ok(service.removeById(id));
return R.ok(orderService.removeById(id));
}
@Tag(name ="添加备注")
@Log(title = "订单表", businessType = BusinessType.UPDATE)
@PostMapping("/merchantNote/add")
public R saveMerchantNote(@RequestBody Order order){
return service.saveMerchantNote(order);
return orderService.saveMerchantNote(order);
}
@Tag(name ="订单日志")
@GetMapping("/log/{orderId}")
public R log(@PathVariable Long orderId){
return R.ok (service.log(orderId));
return R.ok (orderService.log(orderId));
}
@Tag(name ="订单解密")
@GetMapping("/decryptPhone/{orderId}")
public R decryptPhone(@PathVariable Long orderId){
return service.decryptPhone(orderId);
return orderService.decryptPhone(orderId);
}
@Tag(name = "手动触发缓存交易量最多商品")
@ -162,7 +161,7 @@ public class OrderController extends BaseController {
@GetMapping("/refund")
public R refund(@RequestParam Long orderId, @RequestParam(required = false) String reason) {
log.info("订单退款开始订单ID: {}", orderId);
return service.refund(orderId,reason);
return orderService.refund(orderId,reason);
}
}

View File

@ -0,0 +1,38 @@
package com.wzj.soopin.order.domain.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 生成订单请求对象
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SaveOrderBO {
@Schema(description = "订单类型1->团购2->拼团;3->秒杀;")
private Integer type;
@Schema(description = "配送方式 1->到店核销2->自提;3->配送;")
private Integer distribution;
/**
* 商品id
*/
@NotNull(message = "下单商品详情不能为空")
@Valid
private List<SaveOrderSkuItemBO> skuItemBOList;
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.order.domain.bo;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 下单商品详情
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SaveOrderSkuItemBO {
/**
* 商品id
*/
@NotNull(message = "商品id不能为空")
private Long skuId;
/**
* 下单数量
*/
@NotNull(message = "下单数量不能为空")
private Integer quantity;
}

View File

@ -5,7 +5,10 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.PrePersist;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.common.core.domain.model.BaseAudit;
import org.dromara.common.excel.annotation.Excel;
@ -23,7 +26,11 @@ import java.util.Random;
@Schema(description = "订单表对象")
@Data
@TableName("oms_order")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Order extends BaseAudit {
private static final long serialVersionUID = 1L;
@Schema(description = "订单id")

View File

@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.common.core.domain.model.BaseAudit;
import org.dromara.common.excel.annotation.Excel;
@ -18,6 +21,9 @@ import java.math.BigDecimal;
@Schema(description = "订单中所包含的商品对象")
@Data
@TableName("oms_order_item")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class OrderItem extends BaseAudit {
private static final long serialVersionUID = 1L;

View File

@ -1,10 +1,7 @@
package com.wzj.soopin.order.domain.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wzj.soopin.order.domain.entity.OrderItem;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.dromara.common.core.domain.model.BaseAudit;
@ -16,7 +13,7 @@ import java.util.List;
import java.util.Map;
/**
* 订单 数据视图对象
* 订单详情
*
* @author zcc
*/

View File

@ -4,13 +4,31 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.bo.SaveOrderBO;
import com.wzj.soopin.order.domain.entity.Order;
import com.wzj.soopin.order.domain.vo.ManagerOrderDetailVO;
import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO;
import com.wzj.soopin.order.domain.vo.OrderVO;
import org.dromara.common.core.domain.R;
import java.util.List;
public interface OrderService extends IService<Order> {
ManagerOrderDetailVO selectById(Long id);
R saveMerchantNote(Order order);
List<OrderOperateHistoryVO> log(Long orderId);
R decryptPhone(Long orderId);
IPage<OrderVO> getlist(Page<Order> page, OrderBo query);
Order getByNo(String orderNo);
OrderVO saveOrder(SaveOrderBO saveOrderBO);
R refund(Long orderId, String reason);
}

View File

@ -1,19 +1,30 @@
package com.wzj.soopin.order.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.goods.domain.entity.Product;
import com.wzj.soopin.goods.domain.entity.Sku;
import com.wzj.soopin.goods.mapper.ProductMapper;
import com.wzj.soopin.goods.mapper.SkuMapper;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.mapper.MemberMapper;
import com.wzj.soopin.member.mapper.MemberWechatMapper;
import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.bo.SaveOrderBO;
import com.wzj.soopin.order.domain.bo.SaveOrderSkuItemBO;
import com.wzj.soopin.order.domain.entity.*;
import com.wzj.soopin.order.domain.form.DeliverProductForm;
import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm;
@ -27,6 +38,9 @@ import com.wzj.soopin.order.wechat.WechatPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.event.Constants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SecurityUtils;
import org.dromara.common.redis.redis.RedisService;
import org.dromara.common.satoken.utils.LoginHelper;
@ -38,6 +52,7 @@ import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -65,15 +80,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private final RedisService redisService;
private final AftersaleMapper aftersaleMapper;
/**
* 订单前缀
*/
private final static String ORDER_SN_PREFIX = "WZJ";
@Autowired(required = false)
private WechatPayService wechatPayService;
@Autowired
private ProductMapper productMapper;
/**
* 查询订单表
*
* @param id 订单表主键
* @return 订单表
*/
@Override
public ManagerOrderDetailVO selectById(Long id) {
Order order = orderMapper.selectById(id);
@ -187,22 +211,65 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
/**
* 新增订单表
*
* @param order 订单表
* @param saveOrderBO 订单表
* @return 结果
*/
public R<Order> insert(Order order) {
Long tenantId = Long.valueOf(LoginHelper.getTenantId());
order.setTenantId(tenantId);
order.setCreateTime(LocalDateTime.now());
order.setWithdrawStatus(1);
order.setStatus(OrderStatusEnum.UNPAID.getValue());
int insert = orderMapper.insert(order);
if (insert>1){
return R.fail("订单创建失败");
}else {
verificationCodeService.generateVerificationCode(order.getId());
return R.ok(order);
@Override
public OrderVO saveOrder(SaveOrderBO saveOrderBO) {
LoginUser loginUser = LoginHelper.getLoginUser();
List<SaveOrderSkuItemBO> skuItemBOList = saveOrderBO.getSkuItemBOList();
Map<Long, Integer> map = skuItemBOList.stream().collect(Collectors.toMap(SaveOrderSkuItemBO::getSkuId, SaveOrderSkuItemBO::getQuantity));
BigDecimal totalAmount = new BigDecimal(0);
Long tenantId = 0L;
List<Sku> skus = skuMapper.selectByIds(map.keySet());
Assert.isTrue(skus.size() == skuItemBOList.size(), () -> new ServiceException("下单商品不存在"));
LinkedHashMap<Long, Product> productMap = productMapper.selectByIds(skus.stream().map(Sku::getProductId).collect(Collectors.toList()))
.stream().collect(Collectors.toMap(Product::getId, it -> it, (v1, v2) -> v2, LinkedHashMap::new));
for (Sku sku : skus) {
Integer quantity = map.get(sku.getId());
BigDecimal multiply = sku.getPrice().multiply(new BigDecimal(quantity));
totalAmount = totalAmount.add(multiply);
// todo 租户信息应该保存在订单详情中后续需改造
tenantId = Long.valueOf(StrUtil.isNotBlank(sku.getTenantId()) ? sku.getTenantId() : "0");
}
Order order = Order.builder()
.memberId(loginUser.getUserId())
.memberUsername(loginUser.getUsername())
.totalAmount(totalAmount)
.tenantId(tenantId)
.orderSn(generateOrderSn())
.type(saveOrderBO.getType())
.payType(Constants.PayType.NO_PAY)
.status(OrderStatusEnum.UNPAID.getValue())
.distribution(saveOrderBO.getDistribution())
.build();
orderMapper.insert(order);
List<OrderItem> orderItemList = skus.stream().map(sku -> {
Product product = productMap.get(sku.getProductId());
return OrderItem.builder()
.orderId(order.getId())
.productId(sku.getProductId())
.skuId(sku.getId())
.productName(product != null ? product.getName() : "")
.pic(sku.getPic())
.salePrice(product != null ? product.getPrice() : null)
.quantity(map.get(sku.getId()))
.build();
}).toList();
orderItemMapper.insert(orderItemList);
return BeanUtil.copyProperties(order, OrderVO.class);
}
/**
* 生成订单sn
* @return
*/
private String generateOrderSn() {
String dateFormat = DatePattern.PURE_DATETIME_MS_FORMAT.format(new Date());
return StrBuilder.create(ORDER_SN_PREFIX)
.append(dateFormat)
.append(RandomUtil.randomString(4))
.toString();
}
/**
@ -283,6 +350,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
}
@Override
public R saveMerchantNote(Order order) {
// 1. 查询现有订单
Order orderInDb = orderMapper.selectById(order.getId());
@ -392,6 +460,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* @param orderId 订单id
* @return 结果
*/
@Override
public List<OrderOperateHistoryVO> log(Long orderId) {
// 查询订单操作历史记录
LambdaQueryWrapper<OrderOperateHistory> historyWrapper = new LambdaQueryWrapper<>();
@ -419,6 +488,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return voList;
}
@Override
public R decryptPhone(Long orderId) {
Order order = orderMapper.selectById(orderId);
String receiverPhoneEncrypted = order.getReceiverPhoneEncrypted();
@ -521,6 +591,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* @param orderId 订单ID
* @return 操作结果
*/
@Override
public R refund(Long orderId, String reason) {
if (orderId == null) {
return R.fail("订单ID不能为空");

View File

@ -3,43 +3,44 @@ package com.wzj.soopin.transaction.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.wzj.soopin.transaction.domain.bo.PaymentBO;
import com.wzj.soopin.transaction.domain.bo.easypay.EasyPayRequest;
import com.wzj.soopin.transaction.domain.vo.EasypayPaymentResultVO;
import com.wzj.soopin.transaction.domain.vo.EasypayPrePayVO;
import com.wzj.soopin.transaction.service.IEasypayService;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
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 org.springframework.web.bind.annotation.*;
import java.rmi.ServerException;
import java.util.HashMap;
import java.util.Map;
/**
* 易生支付结果通知回调
* 易生支付
*/
@RestController
@Slf4j
@RequestMapping("/easypay")
@RequestMapping("/trans/easypay")
@RequiredArgsConstructor
public class EasypayCallbackController {
public class TransEasypayController {
private final IEasypayService easypayService;
/**
* 处理易生支付结果通知回调
* @param request
* 处理易生支付结果通知回调 处理
*
* @param easyPayRequest
* @return
*/
@SaIgnore
@Log(title = "易生支付结果通知回调", businessType = BusinessType.UPDATE)
@PostMapping("/trade/callback")
public Map tradeCallback(@RequestBody EasyPayRequest request) {
easypayService.handlerTradeCallback(request);
public Map tradeCallback(@RequestBody EasyPayRequest easyPayRequest) {
easypayService.handleTradeCallback(easyPayRequest);
HashMap<Object, Object> map = new HashMap<>();
map.put("code", "000000");
map.put("msg", "Success");
@ -47,15 +48,27 @@ public class EasypayCallbackController {
}
/**
* 测试发起支付
* @param request
* 发起支付
*
* @param paymentBO
* @return
*/
@SaIgnore
@Log(title = "测试发起支付", businessType = BusinessType.OTHER)
@PostMapping("/test/trade")
public R<EasypayPrePayVO> testTrade(@RequestBody PaymentBO paymentBO) throws ServerException {
@Log(title = "发起支付", businessType = BusinessType.OTHER)
@PostMapping("/trade")
public R<EasypayPrePayVO> trade(@RequestBody PaymentBO paymentBO) throws ServerException {
EasypayPrePayVO easypayPrePayVO = easypayService.payment(paymentBO);
return R.ok(easypayPrePayVO);
}
/**
* 查询支付结果
*
* @param orderId 订单id
* @return
*/
@GetMapping("/paymentQuery/{orderId}")
public R<EasypayPaymentResultVO> paymentQuery(@PathVariable("orderId") String orderId) throws ServerException {
EasypayPaymentResultVO easypayPaymentResultVO = easypayService.paymentQuery(orderId);
return R.ok(easypayPaymentResultVO);
}
}

View File

@ -1,6 +1,8 @@
package com.wzj.soopin.transaction.domain.bo;
import com.wzj.soopin.transaction.enums.easypay.PayType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -15,25 +17,27 @@ import lombok.NoArgsConstructor;
@Builder
public class PaymentBO {
private String memberId;
private String goodsId;
/**
* 订单Id
*/
@NotNull(message = "订单Id不能为空")
private Long orderId;
/**
* 订单标题对应支付宝订单里的 商品说明微信订单里的商品
*/
@NotBlank(message = "订单标题不能为空")
private String orderSub;
/**
* 订单描述
*/
@NotBlank(message = "订单描述不能为空")
private String orderDes;
/**
* 订单金额单位分最小1
*/
private long transAmount;
/**
* 支付方式
*/
@NotNull(message = "支付方式不能为空")
private PayType payType;
/**

View File

@ -1,6 +1,6 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.req;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.SeparateInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req.SeparateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import com.wzj.soopin.transaction.enums.easypay.PatnerSettleFlag;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.IDCheckIn;
import com.wzj.soopin.transaction.enums.easypay.LimitCreditPay;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import com.wzj.soopin.transaction.enums.easypay.PatnerSettleFlag;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.SpecialTag;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.WxLimitPay;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.resp;
import com.wzj.soopin.transaction.enums.easypay.AddCalcType;
import com.wzj.soopin.transaction.enums.easypay.BillingCycle;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
package com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.notice.req;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp.*;
import lombok.AllArgsConstructor;

View File

@ -45,7 +45,7 @@ public class TradeQueryReqBody {
/**
* 原订单outTraceoriOrgTrace与oriOutTrace二选一必填
*/
private String oriOutTrace;
// private String oriOutTrace;
/**
* 原商户交易日期yyyyMMdd
*/

View File

@ -1,6 +1,6 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -0,0 +1,94 @@
package com.wzj.soopin.transaction.domain.po;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Date;
import lombok.*;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 支付订单表
*/
@Schema(description = "支付订单表")
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "trans_pay_order")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PayOrder extends BaseAudit {
@TableId(value = "id")
@Schema(description = "主键")
private Long id;
/**
* 订单id
*/
@TableField(value = "order_id")
@Schema(description = "订单id")
private Long orderId;
/**
* 支付方式
*/
@TableField(value = "pay_type")
@Schema(description = "支付方式")
private String payType;
/**
* 支付金额单位
*/
@TableField(value = "trans_amount")
@Schema(description = "支付金额,单位:分")
private Long transAmount;
/**
* 发起支付日期
*/
@TableField(value = "start_trans_date")
@Schema(description = "发起支付日期")
private Date startTransDate;
/**
* 完成支付日期
*/
@TableField(value = "end_trans_date")
@Schema(description = "完成支付日期")
private Date endTransDate;
/**
* 易生生成后上送渠道的订单号
*/
@TableField(value = "easypay_trace")
@Schema(description = "易生生成后上送渠道的订单号")
private String easypayTrace;
/**
* 渠道生成返回给易生的订单号例如微信支付宝订单号
*/
@TableField(value = "pc_trace")
@Schema(description = "渠道生成返回给易生的订单号,例如微信、支付宝订单号")
private String pcTrace;
/**
* 银联生成并返回给易生的订单号
*/
@TableField(value = "un_trace")
@Schema(description = "银联生成并返回给易生的订单号")
private String unTrace;
/**
* 是否支付完成
*/
@TableField(value = "trans_over")
@Schema(description = "是否支付完成")
private Boolean transOver;
@TableField(value = "del_flag")
private String delFlag;
}

View File

@ -0,0 +1,39 @@
package com.wzj.soopin.transaction.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* 易生支付结果
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EasypayPaymentResultVO {
/**
* 订单id
*/
public Long orderId;
/**
* 支付单id
*/
public Long payId;
/**
* 支付是否完成
*/
public boolean paymentComplete;
/**
* 订单总金额
*/
private BigDecimal totalAmount;
}

View File

@ -6,18 +6,33 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 易生预支付信息
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EasypayPrePayVO {
/**
* 支付方式
*/
private PayType payType;
/**
* 拉起微信支付的参数
*/
private WxPrePayParamInfo wxPrePayParamInfo;
/**
* 拉起支付宝支付需要的参数
*/
private String tradeNo;
/**
* 拉起银联支付需要的参数
*/
private String QrRedirectUrl;
/**

View File

@ -4,12 +4,9 @@ import java.io.IOException;
/**
* 延时结算标识
* 0 非延时确认交易,按商户开通的结算周期结算D1或T1
* 1 延时确认交易,此笔交易需等待调用接口7.1延时交易确认接口才会结算
*
* 分账D0标识D0需提前开通
*
* 分账D0标识
*
* D0标识
*/
public enum DelaySettleFlag {

View File

@ -3,7 +3,8 @@ package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* D0标识0: 非D0交易即按进件商户开通功能结算周期结算
* D0标识
* 0: 非D0交易即按进件商户开通功能结算周期结算
* 1: D0交易商户需开通了D0且此字段送1时会d0到账
* 默认值0
*/

View File

@ -1,52 +1,61 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.domain.event.Constants;
import org.dromara.common.core.exception.ServiceException;
import java.util.Arrays;
/**
* 支付方式
*/
@Getter
@AllArgsConstructor
@Schema(description = "易生支持的支付方式")
public enum PayType {
ALI_PAY_JSAPI,
ALI_PAY_MINI_APP,
UNION_PAY_JSAPI,
UNION_PAY_Js_MINI,
WE_CHAT_MINI_APP,
WE_CHAT_JSAPI;
@Schema(description = "支付宝服务窗支付")
ALI_PAY_JSAPI("AliPayJsapi", Constants.PayType.ALIPAY, "支付宝服务窗支付 "),
public String toValue() {
switch (this) {
case ALI_PAY_JSAPI -> {
return "AliPayJsapi";
}
case ALI_PAY_MINI_APP -> {
return "AliPayMiniApp";
}
case UNION_PAY_JSAPI -> {
return "UnionPayJsapi";
}
case UNION_PAY_Js_MINI -> {
return "UnionPayJsMini";
}
case WE_CHAT_JSAPI -> {
return "WeChatJsapi";
}
case WE_CHAT_MINI_APP -> {
return "WeChatMiniApp";
}
}
return null;
}
@Schema(description = "支付宝小程序支付")
ALI_PAY_MINI_APP("AliPayMiniApp", Constants.PayType.ALIPAY, "支付宝小程序支付"),
@Schema(description = "微信公众号支付")
WE_CHAT_JSAPI("WeChatJsapi", Constants.PayType.WECHAT, "微信公众号支付"),
@Schema(description = "微信小程序支付")
WE_CHAT_MINI_APP("WeChatMiniApp", Constants.PayType.WECHAT, "微信小程序支付"),
@Schema(description = "云闪付JS")
UNION_PAY_JSAPI("UnionPayJsapi", Constants.PayType.UNION, "云闪付JS"),
@Schema(description = "云闪付JS云微")
UNION_PAY_Js_MINI("UnionPayJsMini", Constants.PayType.UNION, "云闪付JS云微");
/**
* 接口中实际使用的值
*/
private final String value;
/**
* 支付渠道
*/
private final Integer channel;
/**
* 支付方式描述
*/
private final String info;
public static PayType getByValue(String value) {
return Arrays.stream(PayType.values())
.filter(e -> StrUtil.equals(e.getValue(), value))
.findFirst()
.orElseThrow(() -> new ServiceException("支付方式不存在"));
public static PayType forValue(String value) throws IOException {
return switch (value) {
case "AliPayJsapi" -> ALI_PAY_JSAPI;
case "AliPayMiniApp" -> ALI_PAY_MINI_APP;
case "UnionPayJsapi" -> UNION_PAY_JSAPI;
case "UnionPayJsMini" -> UNION_PAY_Js_MINI;
case "WeChatJsapi" -> WE_CHAT_JSAPI;
case "WeChatMiniApp" -> WE_CHAT_MINI_APP;
default -> throw new IOException("Cannot deserialize PayType");
};
}
}

View File

@ -4,6 +4,9 @@ import java.io.IOException;
/**
* 分账标识与主单分账标识互斥不能同时上送1
* 0 非分账交易
* 1 交易后分账 支付成功后调5.1请求分账接口发起分账
* 2 交易中分账 必须交易中同步上送分账信息且一次分完
*
* 分账标识
*/

View File

@ -0,0 +1,12 @@
package com.wzj.soopin.transaction.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wzj.soopin.transaction.domain.po.PayOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface PayOrderMapper extends BaseMapper<PayOrder> {
}

View File

@ -4,6 +4,7 @@ package com.wzj.soopin.transaction.service;
import com.wzj.soopin.transaction.domain.bo.PaymentBO;
import com.wzj.soopin.transaction.domain.bo.easypay.EasyPayRequest;
import com.wzj.soopin.transaction.domain.vo.EasypayAccountVO;
import com.wzj.soopin.transaction.domain.vo.EasypayPaymentResultVO;
import com.wzj.soopin.transaction.domain.vo.EasypayPrePayVO;
import java.math.BigDecimal;
@ -13,11 +14,24 @@ public interface IEasypayService {
/**
* 发起支付
* @param jsApiReqBody
* @param paymentBO
* @return
*/
EasypayPrePayVO payment(PaymentBO paymentBO) throws ServerException;
/**
* 查询订单支付结果
* @param orderId
* @return
*/
EasypayPaymentResultVO paymentQuery(String orderId) throws ServerException;
/**
* 处理易生支付结果通知回调
* @param easyPayRequest
*/
void handleTradeCallback(EasyPayRequest easyPayRequest);
/**
* 获取易生账户
* @param memberId
@ -62,9 +76,5 @@ public interface IEasypayService {
boolean merchantAuditNotice(String request);
/**
* 处理易生支付结果通知回调
* @param request
*/
void handlerTradeCallback(EasyPayRequest request);
}

View File

@ -0,0 +1,8 @@
package com.wzj.soopin.transaction.service;
import com.wzj.soopin.transaction.domain.po.PayOrder;
import com.baomidou.mybatisplus.extension.service.IService;
public interface PayOrderService extends IService<PayOrder>{
}

View File

@ -0,0 +1,13 @@
package com.wzj.soopin.transaction.service.impl;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.transaction.domain.po.PayOrder;
import com.wzj.soopin.transaction.mapper.PayOrderMapper;
import com.wzj.soopin.transaction.service.PayOrderService;
@Service
public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements PayOrderService{
}