From 7a7bf42d925f05758683ac053eb2a0f6f0c54834 Mon Sep 17 00:00:00 2001
From: yupeng <roc__yu@163.com>
Date: 星期六, 08 二月 2025 12:24:29 +0800
Subject: [PATCH] feat:新增订单/账单关联表、支付订单表、新增小程序创建订单接口
---
ruoyi-common/src/main/java/com/ruoyi/common/constant/WxConstant.java | 3
ruoyi-system/src/main/java/com/ruoyi/system/service/TPayOrderService.java | 19 +
ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderResp.java | 23 +
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java | 20 +
ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml | 25 +
ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java | 3
generator/src/main/resources/mapping/TOrderBillMapper.xml | 19 +
generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java | 16
generator/src/main/java/com/ruoyi/system/model/TPayOrder.java | 86 ++++
generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java | 20 +
ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java | 6
generator/src/test/java/com/xizang/CodeGeneratorTests.java | 6
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java | 5
generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java | 16
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java | 16
ruoyi-common/src/main/java/com/ruoyi/common/constant/AmountConstant.java | 15
generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java | 21 +
generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java | 16
ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderNos.java | 164 ++++++++
ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java | 76 +++
ruoyi-system/src/main/java/com/ruoyi/system/model/TOrderBill.java | 54 ++
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java | 12
ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java | 17
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java | 130 ++++++
generator/src/main/java/com/ruoyi/system/model/TOrderBill.java | 47 ++
ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderDto.java | 38 ++
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java | 16
generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java | 20 +
generator/src/main/resources/mapping/TPayOrderMapper.xml | 28 +
generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java | 16
ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderBillService.java | 16
ruoyi-system/src/main/java/com/ruoyi/system/model/TPayOrder.java | 88 ++++
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillMapper.java | 7
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java | 18
generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java | 21 +
35 files changed, 1,090 insertions(+), 13 deletions(-)
diff --git a/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java b/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java
new file mode 100644
index 0000000..4dab479
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@RestController
+@RequestMapping("/t-order-bill")
+public class TOrderBillController {
+
+}
+
diff --git a/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java b/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java
new file mode 100644
index 0000000..906d0c2
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 支付订单表 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@RestController
+@RequestMapping("/t-pay-order")
+public class TPayOrderController {
+
+}
+
diff --git a/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java b/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
new file mode 100644
index 0000000..b1ee709
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.system.model.TOrderBill;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TOrderBillMapper extends BaseMapper<TOrderBill> {
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java b/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
new file mode 100644
index 0000000..99f5e6a
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.system.model.TPayOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 支付订单表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TPayOrderMapper extends BaseMapper<TPayOrder> {
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java b/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java
new file mode 100644
index 0000000..9c1bb9c
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java
@@ -0,0 +1,47 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 订单表与账单的关联表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_order_bill")
+@ApiModel(value="TOrderBill对象", description="订单表与账单的关联表")
+public class TOrderBill implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId("id")
+ private String id;
+
+ @ApiModelProperty(value = "订单号")
+ @TableField("order_no")
+ private String orderNo;
+
+ @ApiModelProperty(value = "账单编号")
+ @TableField("bill_id")
+ private String billId;
+
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java b/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java
new file mode 100644
index 0000000..ea80bf8
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java
@@ -0,0 +1,86 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 支付订单表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_pay_order")
+@ApiModel(value="TPayOrder对象", description="支付订单表")
+public class TPayOrder implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "订单号")
+ @TableId("id")
+ private String id;
+
+ @ApiModelProperty(value = "发起支付的用户ID")
+ @TableField("user_id")
+ private String userId;
+
+ @ApiModelProperty(value = "用户名称")
+ @TableField("user_name")
+ private String userName;
+
+ @ApiModelProperty(value = "用户微信openid或支付宝userid")
+ @TableField("open_id")
+ private String openId;
+
+ @ApiModelProperty(value = "用户手机号码")
+ @TableField("phone")
+ private String phone;
+
+ @ApiModelProperty(value = "订单金额")
+ @TableField("amount")
+ private Long amount;
+
+ @ApiModelProperty(value = "实付金额")
+ @TableField("act_pay_amount")
+ private Long actPayAmount;
+
+ @ApiModelProperty(value = "支付时间")
+ @TableField("pay_time")
+ private LocalDateTime payTime;
+
+ @ApiModelProperty(value = "支付方式")
+ @TableField("pay_type")
+ private String payType;
+
+ @ApiModelProperty(value = "支付的回调信息")
+ @TableField("pay_info")
+ private String payInfo;
+
+ @ApiModelProperty(value = "银行的支付流水编号")
+ @TableField("pay_no")
+ private String payNo;
+
+ @ApiModelProperty(value = "支付的回调时间")
+ @TableField("callback_time")
+ private LocalDateTime callbackTime;
+
+ @ApiModelProperty(value = "订单创建时间")
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "订单更新时间")
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java b/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java
new file mode 100644
index 0000000..38df822
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.model.TOrderBill;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TOrderBillService extends IService<TOrderBill> {
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java b/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java
new file mode 100644
index 0000000..eed48ac
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.model.TPayOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 支付订单表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TPayOrderService extends IService<TPayOrder> {
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java b/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
new file mode 100644
index 0000000..5b67f76
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.system.model.TOrderBill;
+import com.ruoyi.system.mapper.TOrderBillMapper;
+import com.ruoyi.system.service.TOrderBillService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Service
+public class TOrderBillServiceImpl extends ServiceImpl<TOrderBillMapper, TOrderBill> implements TOrderBillService {
+
+}
diff --git a/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java b/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
new file mode 100644
index 0000000..e7941bb
--- /dev/null
+++ b/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.system.model.TPayOrder;
+import com.ruoyi.system.mapper.TPayOrderMapper;
+import com.ruoyi.system.service.TPayOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 支付订单表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Service
+public class TPayOrderServiceImpl extends ServiceImpl<TPayOrderMapper, TPayOrder> implements TPayOrderService {
+
+}
diff --git a/generator/src/main/resources/mapping/TOrderBillMapper.xml b/generator/src/main/resources/mapping/TOrderBillMapper.xml
new file mode 100644
index 0000000..a0338ce
--- /dev/null
+++ b/generator/src/main/resources/mapping/TOrderBillMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TOrderBillMapper">
+
+ <!-- 通用查询映射结果 -->
+ <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TOrderBill">
+ <id column="id" property="id" />
+ <result column="order_no" property="orderNo" />
+ <result column="bill_id" property="billId" />
+ <result column="create_time" property="createTime" />
+ <result column="update_time" property="updateTime" />
+ </resultMap>
+
+ <!-- 通用查询结果列 -->
+ <sql id="Base_Column_List">
+ id, order_no, bill_id, create_time, update_time
+ </sql>
+
+</mapper>
diff --git a/generator/src/main/resources/mapping/TPayOrderMapper.xml b/generator/src/main/resources/mapping/TPayOrderMapper.xml
new file mode 100644
index 0000000..4f6a2e7
--- /dev/null
+++ b/generator/src/main/resources/mapping/TPayOrderMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TPayOrderMapper">
+
+ <!-- 通用查询映射结果 -->
+ <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TPayOrder">
+ <id column="id" property="id" />
+ <result column="user_id" property="userId" />
+ <result column="user_name" property="userName" />
+ <result column="open_id" property="openId" />
+ <result column="phone" property="phone" />
+ <result column="amount" property="amount" />
+ <result column="act_pay_amount" property="actPayAmount" />
+ <result column="pay_time" property="payTime" />
+ <result column="pay_type" property="payType" />
+ <result column="pay_info" property="payInfo" />
+ <result column="pay_no" property="payNo" />
+ <result column="callback_time" property="callbackTime" />
+ <result column="create_time" property="createTime" />
+ <result column="update_time" property="updateTime" />
+ </resultMap>
+
+ <!-- 通用查询结果列 -->
+ <sql id="Base_Column_List">
+ id, user_id, user_name, open_id, phone, amount, act_pay_amount, pay_time, pay_type, pay_info, pay_no, callback_time, create_time, update_time
+ </sql>
+
+</mapper>
diff --git a/generator/src/test/java/com/xizang/CodeGeneratorTests.java b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
index 1a91271..8b01fd2 100644
--- a/generator/src/test/java/com/xizang/CodeGeneratorTests.java
+++ b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
@@ -5,11 +5,13 @@
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
+import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -35,7 +37,7 @@
// 全局配置
GlobalConfig gc = new GlobalConfig();
- String projectPath = "F:\\workSpace\\xizang\\generator";
+ String projectPath = "D:\\workspaces\\Project\\company\\changyun\\xizang\\xizang\\generator";
gc.setOutputDir(projectPath + "/src/main/java")
.setAuthor("xiaochen")
.setMapperName("%sMapper")
@@ -144,7 +146,7 @@
// strategy.setTablePrefix(pc.getModuleName() + "");
// strategy.setLikeTable(new LikeTable("room"));
//strategy.setLikeTable(new LikeTable("member"));
- strategy.setLikeTable(new LikeTable("t_"));// 生成表名
+ strategy.setLikeTable(new LikeTable("order"));// 生成表名
// strategy.setLikeTable(new LikeTable("t_hotel"));// 生成表名
// strategy.setLikeTable(new LikeTable("t_scan_message"));// 生成表名
// strategy.setNotLikeTable(new LikeTable("hotel_info"));// 不生成表名
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
index 5b6b535..a922d24 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.dto.TBillDto;
import com.ruoyi.system.model.TBill;
import com.ruoyi.system.query.TBillQuery;
import com.ruoyi.system.service.TBillService;
@@ -28,8 +29,8 @@
TBillService tBillService;
@PostMapping("list")
- public R<PageInfo<TBill>> list(@RequestBody TBillQuery query){
- PageInfo<TBill> pageInfo = tBillService.queryPage(query);
+ public R<PageInfo<TBillDto>> list(@RequestBody TBillQuery query){
+ PageInfo<TBillDto> pageInfo = tBillService.queryPage(query);
return R.ok(pageInfo);
}
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
index cfd55df..12cf9b6 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
@@ -1,7 +1,15 @@
package com.ruoyi.web.controller.api;
import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.dto.MakeOrderDto;
+import com.ruoyi.system.dto.MakeOrderResp;
+import com.ruoyi.system.service.TPayOrderService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
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;
@@ -11,12 +19,14 @@
+ @Autowired
+ TPayOrderService tPayOrderService;
-
+ @ApiOperation(value = "创建支付订单")
@PostMapping("makeOrder")
- public AjaxResult makeOrder(){
-
- return null;
+ public R<MakeOrderResp> makeOrder(@Validated @RequestBody MakeOrderDto dto){
+ MakeOrderResp resp = tPayOrderService.makeOrder(dto);
+ return R.ok(resp);
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/AmountConstant.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/AmountConstant.java
new file mode 100644
index 0000000..64c916f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/AmountConstant.java
@@ -0,0 +1,15 @@
+package com.ruoyi.common.constant;
+
+import java.math.BigDecimal;
+
+public class AmountConstant {
+
+ public static final BigDecimal b100 = new BigDecimal("100");
+
+ public static final BigDecimal b1000 = new BigDecimal("1000");
+
+ public static final BigDecimal b001 = new BigDecimal("0.01");
+
+
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/WxConstant.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/WxConstant.java
index b2e4e1a..3e54fb9 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/WxConstant.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/WxConstant.java
@@ -16,4 +16,7 @@
* 高德地图坐标转换
*/
public static final String ADDRESS_CONVERT_TO_COORDINATE = "https://restapi.amap.com/v3/geocode/geo?key=KEY&address=ADDRESS";
+
+
+
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderNos.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderNos.java
new file mode 100644
index 0000000..8a80490
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/OrderNos.java
@@ -0,0 +1,164 @@
+package com.ruoyi.common.utils;
+
+import com.ruoyi.common.utils.ip.IpUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class OrderNos {
+
+ public static final char PADCHAR = '0';
+
+
+
+ /**
+ * 长度24位全球唯一标识
+ */
+
+ /**
+ * 统一不重复内部订单号
+ *
+ * @param systemCode
+ * 4字节系统编码
+ * @return 24字节不重复编码
+ */
+ public static String oid(String systemCode) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(padding(systemCode, 4));
+ sb.append(Did.getInstance().getId(20));
+ return sb.toString();
+ }
+
+ public static String oid() {
+ return oid("O001");
+ }
+
+ /**
+ * 获取分布式Id
+ *
+ * @return 默认20字符长度的数字不重复编码
+ */
+ public static String getDid() {
+ return Did.getInstance().getId();
+ }
+
+ public static String getDid(int size) {
+ return Did.getInstance().getId(size);
+ }
+
+ public static String getDid(String prefix) {
+ return prefix + Did.getInstance().getId();
+ }
+
+ private static String padding(String text, int size) {
+ String txt = StringUtils.trimToEmpty(text);
+ if (StringUtils.length(txt) > size) {
+ txt = StringUtils.substring(txt, StringUtils.length(txt) - size);
+ }
+ return StringUtils.leftPad(txt, size, PADCHAR);
+ }
+
+ /**
+ * ID生成器
+ *
+ * 20字符长度 yyMMddHHmmss+3位本机IP末三位+5位随机数字
+ *
+ * @author zhangpu
+ *
+ */
+ public static class Did {
+ private static final Logger logger = LoggerFactory.getLogger(OrderNos.class);
+ private static final int MIN_LENGTH = 19;
+ private static final int SEQU_MAX = 99999;
+ private static final int SEQU_19_MAX = 9999;
+ private volatile static long BASE = 0;
+ private AtomicLong sequence = new AtomicLong(0);
+ private String nodeFlag;
+ private Object nodeFlagLock = new Object();
+ private static Did did = new Did();
+
+
+ public static Did getInstance() {
+ return did;
+ }
+
+ /**
+ * 生产新Id
+ *
+ * @return
+ */
+ public String getId() {
+ return getId(20);
+ }
+
+ public String getId(int size) {
+ if (size < MIN_LENGTH) {
+ throw new RuntimeException("did最小长度为" + MIN_LENGTH);
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(DateUtils.dateTimeNow("yyMMddHHmmss"));
+ sb.append(getNodeFlag());
+ sb.append(getSequ(size-15));
+ return sb.toString();
+ }
+
+ public synchronized String getSequ(int size) {
+ long timeCount = System.currentTimeMillis() / 1000;
+
+ while (true) {
+ long now = sequence.get();
+ if (timeCount > now) {
+ // 已经过了本秒,则设置新的值
+ if (sequence.compareAndSet(now, timeCount)) {
+ break;
+ }
+ } else {
+ if (sequence.compareAndSet(now, now + 1)) {
+ timeCount = now + 1;
+ break;
+ }
+ }
+ }
+ int sn = (int) (timeCount % (size>=5?SEQU_MAX:SEQU_19_MAX));
+ return StringUtils.leftPad(String.valueOf(sn), size, '0');
+ }
+
+ private String getNodeFlag(){
+ if (this.nodeFlag == null) {
+ synchronized (Did.class){
+ if (this.nodeFlag==null){
+ this.nodeFlag = generateNodeFlag();
+ }
+ }
+ }
+ return this.nodeFlag;
+ }
+
+ /**
+ * 简单节点编码
+ *
+ * 逻辑:Ip地址后三位,便于快速知道是哪个节点
+ *
+ * @return
+ */
+ private String generateNodeFlag() {
+ String ipPostfix = null;
+ try {
+ String ip = IpUtils.getFirstNoLoopbackIPV4Address();
+ ipPostfix = StringUtils.substringAfterLast(ip, ".");
+ } catch (Exception e) {
+ logger.warn("生产DID要素本机IP获取失败:" + e.getMessage());
+ }
+ return StringUtils.leftPad(ipPostfix, 3, "0");
+ }
+
+ private Did() {
+ super();
+ }
+ }
+
+
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
index 8e89e30..8874697 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
@@ -1,16 +1,20 @@
package com.ruoyi.common.utils.ip;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
/**
* 获取IP方法
*
* @author ruoyi
*/
+@Slf4j
public class IpUtils
{
public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
@@ -379,4 +383,72 @@
}
return false;
}
+
+
+ private static final String LOOP_BACK = "127.0.0.1";
+ private static String firstNoLoopbackIPV4Address = null;
+
+ private static Collection<InetAddress> allHostIPV4Address = null;
+ /**
+ * 获取ipv4地址,如果有多个网卡的情况,获取第一个非loopback ip地址
+ *
+ * @return
+ */
+ public static String getFirstNoLoopbackIPV4Address() {
+ if (firstNoLoopbackIPV4Address != null) {
+ return firstNoLoopbackIPV4Address;
+ }
+ Collection<String> allNoLoopbackAddresses = null;
+ try {
+ allNoLoopbackAddresses = getAllNoLoopbackIPV4Addresses();
+ } catch (Exception e) {
+ log.error("获取ip失败", e);
+ return LOOP_BACK;
+ }
+ if (allNoLoopbackAddresses.isEmpty()) {
+ return LOOP_BACK;
+ }
+
+ return firstNoLoopbackIPV4Address = allNoLoopbackAddresses.iterator().next();
+ }
+
+
+ public static Collection<String> getAllNoLoopbackIPV4Addresses() {
+ Collection<String> noLoopbackAddresses = new ArrayList<String>();
+ Collection<InetAddress> allInetAddresses = getAllHostIPV4Address();
+
+ for (InetAddress address : allInetAddresses) {
+ if (!address.isLoopbackAddress()) {
+ noLoopbackAddresses.add(address.getHostAddress());
+ }
+ }
+
+ return noLoopbackAddresses;
+ }
+
+ public static Collection<InetAddress> getAllHostIPV4Address() {
+ if (allHostIPV4Address == null) {
+ try {
+ Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
+ Collection<InetAddress> addresses = new ArrayList<InetAddress>();
+
+ while (networkInterfaces.hasMoreElements()) {
+ NetworkInterface networkInterface = networkInterfaces.nextElement();
+ Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
+ while (inetAddresses.hasMoreElements()) {
+ InetAddress inetAddress = inetAddresses.nextElement();
+ if (inetAddress instanceof Inet4Address) {
+ addresses.add(inetAddress);
+ }
+ }
+ }
+ allHostIPV4Address = addresses;
+ } catch (SocketException e) {
+ log.error("获取ip地址失败", e);
+ throw new RuntimeException(e.getMessage(), e);
+ }
+
+ }
+ return allHostIPV4Address;
+ }
}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderDto.java
new file mode 100644
index 0000000..f8a68e5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderDto.java
@@ -0,0 +1,38 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel(value = "使用账单创建订单请求")
+public class MakeOrderDto implements Serializable {
+ /**
+ * 用户ID
+ */
+ @ApiModelProperty(value = "用户ID")
+ @NotBlank(message = "用户ID不能为空")
+ private String userId;
+ /**
+ * 用户openid
+ */
+ @ApiModelProperty(value = "用户微信或支付宝openid")
+ private String openId;
+
+ @ApiModelProperty(value = "支付金额,单位:分")
+ @NotNull(message = "用户ID不能为空")
+ private Long amount;
+
+ @ApiModelProperty(value = "账单ID列表",notes = "如果只有1个账单ID,金额可以小于账单金额,进行部分缴费;如果是多个账单,将会核对金额,未交费金额需要与缴费金额一致")
+ @NotEmpty(message = "用户ID不能为空")
+ private List<String> billIds;
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderResp.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderResp.java
new file mode 100644
index 0000000..a772713
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/MakeOrderResp.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "使用账单创建订单请求")
+public class MakeOrderResp implements Serializable {
+ /**
+ * 订单编号
+ */
+ @ApiModelProperty("订单编号")
+ private String orderNo;
+ @ApiModelProperty("金额,分")
+ private Long amount;
+ @ApiModelProperty("微信小程序支付跳转链接,用于生成二维码")
+ private String appletUrl;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java
new file mode 100644
index 0000000..fa60266
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.dto;
+
+import com.ruoyi.system.model.TBill;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TBillDto extends TBill {
+
+ private String residentName;
+
+ private String phone;
+
+ private String account;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillMapper.java
index f89dd32..ab6c3dc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillMapper.java
@@ -1,7 +1,12 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.dto.TBillDto;
import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.query.TBillQuery;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
/**
* <p>
@@ -13,4 +18,6 @@
*/
public interface TBillMapper extends BaseMapper<TBill> {
+ PageInfo<TBillDto> page(@Param("pageInfo") PageInfo<TBill> pageInfo, @Param("query") TBillQuery query);
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
new file mode 100644
index 0000000..7f1f170
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TOrderBill;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TOrderBillMapper extends BaseMapper<TOrderBill> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
new file mode 100644
index 0000000..0bc6f9d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TPayOrder;
+
+/**
+ * <p>
+ * 支付订单表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TPayOrderMapper extends BaseMapper<TPayOrder> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TOrderBill.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TOrderBill.java
new file mode 100644
index 0000000..4390921
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TOrderBill.java
@@ -0,0 +1,54 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 订单表与账单的关联表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_order_bill")
+@ApiModel(value="TOrderBill对象", description="订单表与账单的关联表")
+public class TOrderBill implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private String id;
+
+ @ApiModelProperty(value = "订单号")
+ @TableField("order_no")
+ private String orderNo;
+
+ @ApiModelProperty(value = "账单编号")
+ @TableField("bill_id")
+ private String billId;
+
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+ public TOrderBill(String orderNo, String billId) {
+ this.orderNo = orderNo;
+ this.billId = billId;
+ }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TPayOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TPayOrder.java
new file mode 100644
index 0000000..a161f9f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TPayOrder.java
@@ -0,0 +1,88 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 支付订单表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_pay_order")
+@ApiModel(value="TPayOrder对象", description="支付订单表")
+public class TPayOrder implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "订单号")
+ @TableId("id")
+ private String id;
+
+ @ApiModelProperty(value = "发起支付的用户ID")
+ @TableField("user_id")
+ private String userId;
+
+ @ApiModelProperty(value = "用户名称")
+ @TableField("user_name")
+ private String userName;
+
+ @ApiModelProperty(value = "用户微信openid或支付宝userid")
+ @TableField("open_id")
+ private String openId;
+
+ @ApiModelProperty(value = "用户手机号码")
+ @TableField("phone")
+ private String phone;
+
+ @ApiModelProperty(value = "订单金额")
+ @TableField("amount")
+ private Long amount;
+
+ @ApiModelProperty(value = "实付金额")
+ @TableField("act_pay_amount")
+ private Long actPayAmount;
+
+ @ApiModelProperty(value = "支付时间")
+ @TableField("pay_time")
+ private LocalDateTime payTime;
+
+ @ApiModelProperty(value = "支付方式")
+ @TableField("pay_type")
+ private String payType;
+
+ @ApiModelProperty(value = "支付的回调信息")
+ @TableField("pay_info")
+ private String payInfo;
+
+ @ApiModelProperty(value = "银行的支付流水编号")
+ @TableField("pay_no")
+ private String payNo;
+
+ @ApiModelProperty(value = "支付的回调时间")
+ @TableField("callback_time")
+ private LocalDateTime callbackTime;
+
+ @ApiModelProperty(value = "订单创建时间")
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "订单更新时间")
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java
index 9cfb8cb..b43c565 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java
@@ -10,6 +10,12 @@
*/
private Integer payFeesStatus;
+ private String phone;
+
+ private String residentName;
+
+ private String contractNumber;
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
index 9dbe020..22feecc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.dto.TBillDto;
import com.ruoyi.system.model.TBill;
import com.ruoyi.system.query.TBillQuery;
@@ -15,6 +16,6 @@
*/
public interface TBillService extends IService<TBill> {
- PageInfo<TBill> queryPage(TBillQuery query);
+ PageInfo<TBillDto> queryPage(TBillQuery query);
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderBillService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderBillService.java
new file mode 100644
index 0000000..8c2e80d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderBillService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.TOrderBill;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TOrderBillService extends IService<TOrderBill> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TPayOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TPayOrderService.java
new file mode 100644
index 0000000..ccc9c4f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TPayOrderService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.dto.MakeOrderDto;
+import com.ruoyi.system.dto.MakeOrderResp;
+import com.ruoyi.system.model.TPayOrder;
+
+/**
+ * <p>
+ * 支付订单表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+public interface TPayOrderService extends IService<TPayOrder> {
+
+ MakeOrderResp makeOrder(MakeOrderDto dto);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
index e30ccf0..3a0bdc6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
@@ -1,16 +1,22 @@
package com.ruoyi.system.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.system.dto.TBillDto;
import com.ruoyi.system.mapper.TBillMapper;
import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.THouse;
import com.ruoyi.system.query.TBillQuery;
import com.ruoyi.system.service.TBillService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.jsonwebtoken.lang.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
/**
* <p>
@@ -29,8 +35,10 @@
@Autowired
TBillMapper tBillMapper;
- public PageInfo<TBill> queryPage(TBillQuery query){
- return null;
+ public PageInfo<TBillDto> queryPage(TBillQuery query){
+ PageInfo<TBill> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+ PageInfo<TBillDto> info = tBillMapper.page(pageInfo, query);
+ return info;
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
new file mode 100644
index 0000000..287417b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.TOrderBillMapper;
+import com.ruoyi.system.model.TOrderBill;
+import com.ruoyi.system.service.TOrderBillService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单表与账单的关联表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Service
+public class TOrderBillServiceImpl extends ServiceImpl<TOrderBillMapper, TOrderBill> implements TOrderBillService {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
new file mode 100644
index 0000000..9237241
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
@@ -0,0 +1,130 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.constant.AmountConstant;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.OrderNos;
+import com.ruoyi.system.dto.MakeOrderDto;
+import com.ruoyi.system.dto.MakeOrderResp;
+import com.ruoyi.system.mapper.TPayOrderMapper;
+import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TOrderBill;
+import com.ruoyi.system.model.TPayOrder;
+import com.ruoyi.system.model.TTenant;
+import com.ruoyi.system.service.TBillService;
+import com.ruoyi.system.service.TOrderBillService;
+import com.ruoyi.system.service.TPayOrderService;
+import com.ruoyi.system.service.TTenantService;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 支付订单表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-07
+ */
+@Service
+public class TPayOrderServiceImpl extends ServiceImpl<TPayOrderMapper, TPayOrder> implements TPayOrderService {
+
+ @Autowired
+ TBillService billService;
+
+ @Autowired
+ TTenantService tTenantService;
+
+ @Autowired
+ TOrderBillService tOrderBillService;
+
+
+ public long caculateRentFee(TBill bill){
+ return bill.getPayableFeesMoney().add(bill.getPayableFeesPenalty())
+ .subtract(bill.getActualMoney())
+ .multiply(AmountConstant.b100)
+ .setScale(0, RoundingMode.HALF_DOWN)
+ .longValue();
+ }
+
+
+ public String createAppletUrl(String orderNo){
+ return ""+orderNo;
+ }
+
+ @Override
+ public MakeOrderResp makeOrder(MakeOrderDto dto) {
+
+ TTenant user = tTenantService.getById(dto.getUserId());
+ if (user==null){
+ throw new ServiceException("租户不存在");
+ }
+ MakeOrderResp resp = new MakeOrderResp();
+ if (dto.getBillIds().size()==1){
+ TBill bill = billService.getById(dto.getBillIds().get(0));
+ if (bill == null) {
+ throw new ServiceException("账单不存在");
+ }
+ //计算欠费金额:租金+违约金-实收金额
+ long rent = caculateRentFee(bill);
+ if (rent==0){
+ throw new ServiceException("该订单已缴费");
+ }
+ if (rent>dto.getAmount()){
+ throw new ServiceException("支付金额超过了账单欠费金额");
+ }
+
+ TPayOrder order = new TPayOrder();
+ order.setId(OrderNos.getDid(32));
+ order.setAmount(dto.getAmount());
+ order.setUserId(user.getId());
+ order.setPhone(user.getPhone());
+ order.setUserName(user.getResidentName());
+ save(order);
+ TOrderBill tOrderBill = new TOrderBill();
+ tOrderBill.setBillId(bill.getId());
+ tOrderBill.setOrderNo(order.getId());
+ tOrderBillService.save(tOrderBill);
+ resp.setAmount(dto.getAmount());
+ resp.setOrderNo(order.getId());
+ resp.setAppletUrl(createAppletUrl(order.getId()));
+ return resp;
+ }
+ List<TOrderBill> orderBills = new ArrayList<>();
+ String orderNo = OrderNos.getDid(32);
+ List<TBill> bills = dto.getBillIds().stream().map(id -> {
+ TBill bill = billService.getById(id);
+ if (bill == null) {
+ throw new ServiceException("billId:" + id + "不存在");
+ }
+ orderBills.add(new TOrderBill(orderNo,bill.getId()));
+ return bill;
+ }).collect(Collectors.toList());
+ long sumRent = bills.stream().mapToLong((bill) -> caculateRentFee(bill)).sum();
+ if (sumRent==0){
+ throw new ServiceException("账单已缴费");
+ }
+ if (dto.getAmount()>sumRent){
+ throw new ServiceException("支付金额超过所选账单欠费金额");
+ }
+ TPayOrder order = new TPayOrder();
+ order.setId(orderNo);
+ order.setAmount(dto.getAmount());
+ order.setUserId(user.getId());
+ order.setPhone(user.getPhone());
+ order.setUserName(user.getResidentName());
+ save(order);
+ tOrderBillService.saveBatch(orderBills);
+ resp.setAmount(dto.getAmount());
+ resp.setOrderNo(orderNo);
+ resp.setAppletUrl(createAppletUrl(orderNo));
+ return resp;
+ }
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
index 82f6ac0..6e4cc4f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
@@ -32,4 +32,29 @@
id, contract_id, payable_fees_money, payable_fees_time, pay_fees_status, pay_fees_money, pay_fees_time, pay_fees_type, bill_type, over_days, payable_fees_penalty, start_time, end_time, bank_serial_number, actual_money, voucher, create_time, update_time, create_by, update_by, disabled
</sql>
+ <select id="page" resultType="com.ruoyi.system.dto.TBillDto">
+ SELECT
+ b.*,
+ t.resident_name as residentName,
+ t.phone,
+ t.account
+ FROM
+ t_bill b
+ LEFT JOIN t_contract c ON c.contract_number = b.contract_number
+ LEFT JOIN t_tenant t ON t.id = c.tenant_id
+ <where>
+ <if test="query.payFeesStatus != null">
+ and b.pay_fees_status = #{query.payFeesStatus}
+ </if>
+ <if test="query.phone != null and query.phone !=''">
+ and t.phone = #{query.phone}
+ </if>
+ <if test="query.residentName != null and query.residentName !=''">
+ and t.resident_name like concat('%',#{query.residentName},'%')
+ </if>
+ <if test="query.contractNumber != null and query.contractNumber !=''">
+ and b.contract_number = #{contractNumber}
+ </if>
+ </where>
+ </select>
</mapper>
--
Gitblit v1.7.1