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