Kaynağa Gözat

feat(business): 添加支付订单相关功能

- 新增支付订单Service接口和实现类
- 添加支付订单实体类、BO、VO等数据结构
- 实现支付订单的查询、分页查询、新增、修改、删除等功能
- 添加支付订单相关的Mapper接口和XML文件
fugui001 4 ay önce
ebeveyn
işleme
a0d81e8749

+ 104 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/PayOrderController.java

@@ -0,0 +1,104 @@
+package org.dromara.business.controller;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.business.domain.bo.PayOrderBo;
+import org.dromara.business.domain.vo.PayOrderVo;
+import org.dromara.business.service.IPayOrderService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+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.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 支付订单
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/order")
+public class PayOrderController extends BaseController {
+
+    private final IPayOrderService payOrderService;
+
+    /**
+     * 查询支付订单列表
+     */
+    @SaCheckPermission("business:order:list")
+    @GetMapping("/list")
+    public TableDataInfo<PayOrderVo> list(PayOrderBo bo, PageQuery pageQuery) {
+        return payOrderService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出支付订单列表
+     */
+    @SaCheckPermission("business:order:export")
+    @Log(title = "支付订单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PayOrderBo bo, HttpServletResponse response) {
+        List<PayOrderVo> list = payOrderService.queryList(bo);
+        ExcelUtil.exportExcel(list, "支付订单", PayOrderVo.class, response);
+    }
+
+    /**
+     * 获取支付订单详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("business:order:query")
+    @GetMapping("/{id}")
+    public R<PayOrderVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(payOrderService.queryById(id));
+    }
+
+    /**
+     * 新增支付订单
+     */
+    @SaCheckPermission("business:order:add")
+    @Log(title = "支付订单", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PayOrderBo bo) {
+        return toAjax(payOrderService.insertByBo(bo));
+    }
+
+    /**
+     * 修改支付订单
+     */
+    @SaCheckPermission("business:order:edit")
+    @Log(title = "支付订单", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PayOrderBo bo) {
+        return toAjax(payOrderService.updateByBo(bo));
+    }
+
+    /**
+     * 删除支付订单
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("business:order:remove")
+    @Log(title = "支付订单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(payOrderService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+}

+ 123 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PayOrder.java

@@ -0,0 +1,123 @@
+package org.dromara.business.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+import java.io.Serial;
+
+/**
+ * 支付订单对象 pay_order
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pay_order")
+public class PayOrder extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 商户订单号
+     */
+    private String outTradeNo;
+
+    /**
+     * 商品标题
+     */
+    private String subject;
+
+    /**
+     * 商品描述
+     */
+    private String body;
+
+    /**
+     * 订单金额(元)
+     */
+    private Long totalAmount;
+
+    /**
+     * 币种
+     */
+    private String currency;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 业务类型(如 recharge, purchase)
+     */
+    private String bizType;
+
+    /**
+     * 业务ID(如订单ID)
+     */
+    private String bizId;
+
+    /**
+     * 支付宝交易号
+     */
+    private String tradeNo;
+
+    /**
+     * 支付宝APPID
+     */
+    private String appId;
+
+    /**
+     * 卖家支付宝用户ID
+     */
+    private String sellerId;
+
+    /**
+     * 订单状态  success  close
+     */
+    private String status;
+
+    /**
+     * 支付成功时间
+     */
+    private String payTime;
+
+    /**
+     * 支付宝通知时间
+     */
+    private String notifyTime;
+
+    /**
+     * 通知类型
+     */
+    private String notifyType;
+
+    /**
+     * 支付宝交易状态
+     */
+    private String tradeStatus;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * 道具ID
+     */
+    private Long relatedItemId;
+
+    private String payUrl;
+
+}

+ 132 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PayOrderBo.java

@@ -0,0 +1,132 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.PayOrder;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+/**
+ * 支付订单业务对象 pay_order
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PayOrder.class, reverseConvertGenerate = false)
+public class PayOrderBo extends BaseEntity {
+
+
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 商户订单号
+     */
+    @NotBlank(message = "商户订单号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String outTradeNo;
+
+    /**
+     * 商品标题
+     */
+    @NotBlank(message = "商品标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subject;
+
+    /**
+     * 商品描述
+     */
+    private String body;
+
+    /**
+     * 订单金额(元)
+     */
+    @NotNull(message = "订单金额(元)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long totalAmount;
+
+    /**
+     * 币种
+     */
+    private String currency;
+
+    /**
+     * 用户ID
+     */
+    @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 业务类型(如 recharge, purchase)
+     */
+    @NotBlank(message = "业务类型(如 recharge, purchase)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bizType;
+
+    /**
+     * 业务ID(如订单ID)
+     */
+    private String bizId;
+
+    /**
+     * 支付宝交易号
+     */
+    private String tradeNo;
+
+    /**
+     * 支付宝APPID
+     */
+    private String appId;
+
+    /**
+     * 卖家支付宝用户ID
+     */
+    private String sellerId;
+
+    /**
+     * 订单状态  success  close
+     */
+    private String status;
+
+    /**
+     * 支付成功时间
+     */
+    private String payTime;
+
+    /**
+     * 支付宝通知时间
+     */
+    private String notifyTime;
+
+    /**
+     * 通知类型
+     */
+    private String notifyType;
+
+    /**
+     * 支付宝交易状态
+     */
+    private String tradeStatus;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * 道具ID
+     */
+    private Long relatedItemId;
+
+    private String payUrl;
+
+    /**
+     * 用户名 或者 手机号
+     */
+    private String userIds;
+
+}

+ 153 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PayOrderVo.java

@@ -0,0 +1,153 @@
+package org.dromara.business.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.business.domain.PayOrder;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 支付订单视图对象 pay_order
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PayOrder.class)
+public class PayOrderVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 商户订单号
+     */
+    @ExcelProperty(value = "商户订单号")
+    private String outTradeNo;
+
+    /**
+     * 商品标题
+     */
+    @ExcelProperty(value = "商品标题")
+    private String subject;
+
+    /**
+     * 商品描述
+     */
+    @ExcelProperty(value = "商品描述")
+    private String body;
+
+    /**
+     * 订单金额(元)
+     */
+    @ExcelProperty(value = "订单金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long totalAmount;
+
+    /**
+     * 币种
+     */
+    @ExcelProperty(value = "币种")
+    private String currency;
+
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "用户ID")
+    private Long userId;
+
+    /**
+     * 业务类型(如 recharge, purchase)
+     */
+    @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=,r=echarge,,p=urchase")
+    private String bizType;
+
+    /**
+     * 业务ID(如订单ID)
+     */
+    @ExcelProperty(value = "业务ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=订单ID")
+    private String bizId;
+
+    /**
+     * 支付宝交易号
+     */
+    @ExcelProperty(value = "支付宝交易号")
+    private String tradeNo;
+
+    /**
+     * 支付宝APPID
+     */
+    @ExcelProperty(value = "支付宝APPID")
+    private String appId;
+
+    /**
+     * 卖家支付宝用户ID
+     */
+    @ExcelProperty(value = "卖家支付宝用户ID")
+    private String sellerId;
+
+    /**
+     * 订单状态  success  close
+     */
+    @ExcelProperty(value = "订单状态  success  close")
+    private String status;
+
+    /**
+     * 支付成功时间
+     */
+    @ExcelProperty(value = "支付成功时间")
+    private String payTime;
+
+    /**
+     * 支付宝通知时间
+     */
+    @ExcelProperty(value = "支付宝通知时间")
+    private String notifyTime;
+
+    /**
+     * 通知类型
+     */
+    @ExcelProperty(value = "通知类型")
+    private String notifyType;
+
+    /**
+     * 支付宝交易状态
+     */
+    @ExcelProperty(value = "支付宝交易状态")
+    private String tradeStatus;
+
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
+    /**
+     * 道具ID
+     */
+    @ExcelProperty(value = "道具ID")
+    private Long relatedItemId;
+
+
+    private String payUrl;
+
+    private String userName;
+
+    private String phone;
+
+    private String nickName;
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PayOrderMapper.java

@@ -0,0 +1,42 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.PayOrder;
+import org.dromara.business.domain.vo.PayOrderVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 支付订单Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@DS("mysql2")
+public interface PayOrderMapper extends BaseMapperPlus<PayOrder, PayOrderVo> {
+
+    @InterceptorIgnore(tenantLine = "true")
+    Page<PayOrderVo> selectPayOrderAll(@Param("page") Page<PayOrder> page, @Param("ew") Wrapper<PayOrder> wrapper);
+
+    @InterceptorIgnore(tenantLine = "true")
+    PayOrderVo selectPayOrderById(Long id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updatePayOrder(PayOrder update);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int insertPayOrder(PayOrder insert);
+
+    @InterceptorIgnore(tenantLine = "true")
+    int deletePayOrderById(@Param("ids") Collection<Long> ids);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<PayOrderVo> selectPayOrderList(@Param("ew") Wrapper<PayOrder> wrapper);
+
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPayOrderService.java

@@ -0,0 +1,68 @@
+package org.dromara.business.service;
+
+import org.dromara.business.domain.bo.PayOrderBo;
+import org.dromara.business.domain.vo.PayOrderVo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 支付订单Service接口
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+public interface IPayOrderService {
+
+    /**
+     * 查询支付订单
+     *
+     * @param id 主键
+     * @return 支付订单
+     */
+    PayOrderVo queryById(Long id);
+
+    /**
+     * 分页查询支付订单列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 支付订单分页列表
+     */
+    TableDataInfo<PayOrderVo> queryPageList(PayOrderBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的支付订单列表
+     *
+     * @param bo 查询条件
+     * @return 支付订单列表
+     */
+    List<PayOrderVo> queryList(PayOrderBo bo);
+
+    /**
+     * 新增支付订单
+     *
+     * @param bo 支付订单
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(PayOrderBo bo);
+
+    /**
+     * 修改支付订单
+     *
+     * @param bo 支付订单
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(PayOrderBo bo);
+
+    /**
+     * 校验并批量删除支付订单信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 240 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PayOrderServiceImpl.java

@@ -0,0 +1,240 @@
+package org.dromara.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.dromara.business.domain.PayOrder;
+import org.dromara.business.domain.bo.PayOrderBo;
+import org.dromara.business.domain.vo.PayOrderVo;
+import org.dromara.business.domain.vo.UserVo;
+import org.dromara.business.mapper.PayOrderMapper;
+import org.dromara.business.mapper.UserMapper;
+import org.dromara.business.service.IPayOrderService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * 支付订单Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-08-14
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PayOrderServiceImpl implements IPayOrderService {
+
+    private final PayOrderMapper baseMapper;
+
+    private final UserMapper userMapper;
+    /**
+     * 查询支付订单
+     *
+     * @param id 主键
+     * @return 支付订单
+     */
+    @Override
+    public PayOrderVo queryById(Long id){
+        return baseMapper.selectPayOrderById(id);
+    }
+
+    /**
+     * 分页查询支付订单列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 支付订单分页列表
+     */
+    @Override
+    public TableDataInfo<PayOrderVo> queryPageList(PayOrderBo bo, PageQuery pageQuery) {
+        Wrapper<PayOrder> lqw = buildQueryWrapper(bo);
+        Page<PayOrderVo> result = baseMapper.selectPayOrderAll(pageQuery.build(), lqw);
+        List<PayOrderVo> resultRecords = result.getRecords();
+        for (PayOrderVo resultRecord : resultRecords) {
+            UserVo userVo = userMapper.selectVoByIdInfo(resultRecord.getUserId());
+            if(userVo!=null){
+                resultRecord.setUserName(userVo.getNickName());
+                resultRecord.setPhone(userVo.getPhone());
+             }
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的支付订单列表
+     *
+     * @param bo 查询条件
+     * @return 支付订单列表
+     */
+    @Override
+    public List<PayOrderVo> queryList(PayOrderBo bo) {
+        Wrapper<PayOrder> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectPayOrderList(lqw);
+    }
+
+    private Wrapper<PayOrder> buildQueryWrapper(PayOrderBo bo) {
+        QueryWrapper<PayOrder> wrapper = new QueryWrapper<>();
+
+        // 排序:id ASC
+        wrapper.orderByAsc("a.id");
+
+         // a.out_trade_no
+        if (StringUtils.isNotBlank(bo.getUserIds())) {
+            wrapper.and(wrapper1 ->
+                wrapper1.like("b.phone", bo.getUserIds())
+                    .or()
+                    .like("b.nick_name", bo.getUserIds())
+            );
+        }
+        // a.out_trade_no
+        if (StringUtils.isNotBlank(bo.getOutTradeNo())) {
+            wrapper.like("a.out_trade_no", bo.getOutTradeNo());
+        }
+
+        // a.subject
+        if (StringUtils.isNotBlank(bo.getSubject())) {
+            wrapper.like("a.subject", bo.getSubject());
+        }
+
+        // a.body
+        if (StringUtils.isNotBlank(bo.getBody())) {
+            wrapper.eq("a.body", bo.getBody());
+        }
+
+        // a.total_amount
+        if (bo.getTotalAmount() != null) {
+            wrapper.eq("a.total_amount", bo.getTotalAmount());
+        }
+
+        // a.currency
+        if (StringUtils.isNotBlank(bo.getCurrency())) {
+            wrapper.eq("a.currency", bo.getCurrency());
+        }
+
+        // a.user_id
+        if (bo.getUserId() != null) {
+            wrapper.eq("a.user_id", bo.getUserId());
+        }
+
+        // a.biz_type
+        if (StringUtils.isNotBlank(bo.getBizType())) {
+            wrapper.eq("a.biz_type", bo.getBizType());
+        }
+
+        // a.biz_id
+        if (StringUtils.isNotBlank(bo.getBizId())) {
+            wrapper.eq("a.biz_id", bo.getBizId());
+        }
+
+        // a.trade_no
+        if (StringUtils.isNotBlank(bo.getTradeNo())) {
+            wrapper.eq("a.trade_no", bo.getTradeNo());
+        }
+
+        // a.app_id
+        if (StringUtils.isNotBlank(bo.getAppId())) {
+            wrapper.eq("a.app_id", bo.getAppId());
+        }
+
+        // a.seller_id
+        if (StringUtils.isNotBlank(bo.getSellerId())) {
+            wrapper.eq("a.seller_id", bo.getSellerId());
+        }
+
+        // a.status
+        if (StringUtils.isNotBlank(bo.getStatus())) {
+            wrapper.eq("a.status", bo.getStatus());
+        }
+
+        // a.pay_time
+        if (bo.getPayTime() != null) {
+            wrapper.like("a.pay_time", bo.getPayTime());
+        }
+
+        // a.notify_time
+        if (bo.getNotifyTime() != null) {
+            wrapper.eq("a.notify_time", bo.getNotifyTime());
+        }
+
+        // a.notify_type
+        if (StringUtils.isNotBlank(bo.getNotifyType())) {
+            wrapper.eq("a.notify_type", bo.getNotifyType());
+        }
+
+        // a.trade_status
+        if (StringUtils.isNotBlank(bo.getTradeStatus())) {
+            wrapper.eq("a.trade_status", bo.getTradeStatus());
+        }
+
+        // a.product_id
+        if (bo.getProductId() != null) {
+            wrapper.eq("a.product_id", bo.getProductId());
+        }
+
+        // a.related_item_id
+        if (bo.getRelatedItemId() != null) {
+            wrapper.eq("a.related_item_id", bo.getRelatedItemId());
+        }
+        return wrapper;
+    }
+
+    /**
+     * 新增支付订单
+     *
+     * @param bo 支付订单
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(PayOrderBo bo) {
+        PayOrder add = MapstructUtils.convert(bo, PayOrder.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insertPayOrder(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改支付订单
+     *
+     * @param bo 支付订单
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(PayOrderBo bo) {
+        PayOrder update = MapstructUtils.convert(bo, PayOrder.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updatePayOrder(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(PayOrder entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除支付订单信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deletePayOrderById(ids) > 0;
+    }
+}

+ 170 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PayOrderMapper.xml

@@ -0,0 +1,170 @@
+<?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="org.dromara.business.mapper.PayOrderMapper">
+
+    <!-- 动态插入(非空字段) -->
+    <insert id="insertPayOrder"  useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO pay_order
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="outTradeNo != null">out_trade_no,</if>
+            <if test="subject != null">subject,</if>
+            <if test="body != null">body,</if>
+            <if test="totalAmount != null">total_amount,</if>
+            <if test="currency != null">currency,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="bizType != null">biz_type,</if>
+            <if test="bizId != null">biz_id,</if>
+            <if test="tradeNo != null">trade_no,</if>
+            <if test="appId != null">app_id,</if>
+            <if test="sellerId != null">seller_id,</if>
+            <if test="status != null">status,</if>
+            <if test="payTime != null">pay_time,</if>
+            <if test="notifyTime != null">notify_time,</if>
+            <if test="notifyType != null">notify_type,</if>
+            <if test="tradeStatus != null">trade_status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="productId != null">product_id,</if>
+            <if test="relatedItemId != null">related_item_id,</if>
+            <if test="payUrl != null">pay_url,</if>
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="outTradeNo != null">#{outTradeNo},</if>
+            <if test="subject != null">#{subject},</if>
+            <if test="body != null">#{body},</if>
+            <if test="totalAmount != null">#{totalAmount},</if>
+            <if test="currency != null">#{currency},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="bizType != null">#{bizType},</if>
+            <if test="bizId != null">#{bizId},</if>
+            <if test="tradeNo != null">#{tradeNo},</if>
+            <if test="appId != null">#{appId},</if>
+            <if test="sellerId != null">#{sellerId},</if>
+            <if test="status != null">#{status},</if>
+            <if test="payTime != null">#{payTime},</if>
+            <if test="notifyTime != null">#{notifyTime},</if>
+            <if test="notifyType != null">#{notifyType},</if>
+            <if test="tradeStatus != null">#{tradeStatus},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="productId != null">#{productId},</if>
+            <if test="relatedItemId != null">#{relatedItemId},</if>
+            <if test="payUrl != null">#{payUrl},</if>
+        </trim>
+    </insert>
+
+    <!-- 根据主键更新(仅非空字段) -->
+    <update id="updatePayOrder">
+        UPDATE pay_order
+        <set>
+            <if test="outTradeNo != null">out_trade_no = #{outTradeNo},</if>
+            <if test="subject != null">subject = #{subject},</if>
+            <if test="body != null">body = #{body},</if>
+            <if test="totalAmount != null">total_amount = #{totalAmount},</if>
+            <if test="currency != null">currency = #{currency},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="bizType != null">biz_type = #{bizType},</if>
+            <if test="bizId != null">biz_id = #{bizId},</if>
+            <if test="tradeNo != null">trade_no = #{tradeNo},</if>
+            <if test="appId != null">app_id = #{appId},</if>
+            <if test="sellerId != null">seller_id = #{sellerId},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="payTime != null">pay_time = #{payTime},</if>
+            <if test="notifyTime != null">notify_time = #{notifyTime},</if>
+            <if test="notifyType != null">notify_type = #{notifyType},</if>
+            <if test="tradeStatus != null">trade_status = #{tradeStatus},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="productId != null">product_id = #{productId},</if>
+            <if test="relatedItemId != null">related_item_id = #{relatedItemId},</if>
+            <if test="payUrl != null">pay_url = #{payUrl},</if>
+        </set>
+        WHERE id = #{id}
+    </update>
+
+    <!-- 根据 out_trade_no 更新 -->
+    <update id="updatePayOrderByOutTradeNo">
+        UPDATE pay_order
+        <set>
+            <if test="subject != null">subject = #{subject},</if>
+            <if test="body != null">body = #{body},</if>
+            <if test="totalAmount != null">total_amount = #{totalAmount},</if>
+            <if test="currency != null">currency = #{currency},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="bizType != null">biz_type = #{bizType},</if>
+            <if test="bizId != null">biz_id = #{bizId},</if>
+            <if test="tradeNo != null">trade_no = #{tradeNo},</if>
+            <if test="appId != null">app_id = #{appId},</if>
+            <if test="sellerId != null">seller_id = #{sellerId},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="payTime != null">pay_time = #{payTime},</if>
+            <if test="notifyTime != null">notify_time = #{notifyTime},</if>
+            <if test="notifyType != null">notify_type = #{notifyType},</if>
+            <if test="tradeStatus != null">trade_status = #{tradeStatus},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="productId != null">product_id = #{productId},</if>
+            <if test="relatedItemId != null">related_item_id = #{relatedItemId},</if>
+            <if test="payUrl != null">pay_url = #{payUrl},</if>
+        </set>
+        WHERE out_trade_no = #{outTradeNo}
+    </update>
+
+    <!-- 根据主键查询 -->
+    <select id="selectPayOrderById" parameterType="java.lang.Long" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            id, out_trade_no, subject, body, total_amount, currency,
+            user_id, biz_type, biz_id, trade_no, app_id, seller_id,
+            status, pay_time, notify_time, notify_type, trade_status,
+            create_time, update_time, product_id, related_item_id, pay_url
+        FROM pay_order
+        WHERE id = #{id}
+    </select>
+
+    <!-- 根据商户订单号查询 -->
+    <select id="selectPayOrderByOutTradeNo" parameterType="java.lang.String" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            id, out_trade_no, subject, body, total_amount, currency,
+            user_id, biz_type, biz_id, trade_no, app_id, seller_id,
+            status, pay_time, notify_time, notify_type, trade_status,
+            create_time, update_time, product_id, related_item_id, pay_url
+        FROM pay_order
+        WHERE out_trade_no = #{outTradeNo}
+    </select>
+
+    <!-- 查询所有(支持条件扩展) -->
+    <select id="selectPayOrderAll" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            a.id, a.out_trade_no, a.subject, a.body, a.total_amount, a.currency,
+            a.user_id, a.biz_type, a.biz_id, a.trade_no, a.app_id, a.seller_id,
+            a.status, a.pay_time, a.notify_time, a.notify_type, a.trade_status,
+            a.create_time, a.update_time, a.product_id, a.related_item_id, a.pay_url,b.phone,b.nick_name
+        FROM pay_order a left join  user b  on a.user_id=b.id
+        ${ew.customSqlSegment}
+    </select>
+
+
+    <delete id="deletePayOrderById">
+        DELETE FROM pay_order
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+    <select id="selectPayOrderList" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            id, out_trade_no, subject, body, total_amount, currency,
+            user_id, biz_type, biz_id, trade_no, app_id, seller_id,
+            status, pay_time, notify_time, notify_type, trade_status,
+            create_time, update_time, product_id, related_item_id, pay_url
+        FROM pay_order
+    </select>
+
+
+</mapper>

+ 0 - 3
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/UserMapper.xml

@@ -264,7 +264,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
         and a.del_flag=0 limit 1
     </select>
-
-
-
 </mapper>