Commit 7abfefba authored by shengnan hu's avatar shengnan hu
Browse files

init

parents
Pipeline #281 passed with stage
in 1 minute and 55 seconds
<?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.mall4j.cloud.order.mapper.OrderAddrMapper">
<resultMap id="orderAddrMap" type="com.mall4j.cloud.order.model.OrderAddr">
<id column="order_addr_id" property="orderAddrId" />
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="user_id" property="userId"/>
<result column="consignee" property="consignee"/>
<result column="province_id" property="provinceId"/>
<result column="province" property="province"/>
<result column="city_id" property="cityId"/>
<result column="city" property="city"/>
<result column="area_id" property="areaId"/>
<result column="area" property="area"/>
<result column="addr" property="addr"/>
<result column="post_code" property="postCode"/>
<result column="mobile" property="mobile"/>
</resultMap>
<sql id="Vo_Column_List">
`order_addr_id`,`create_time`,`update_time`,`user_id`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`addr`,`post_code`,`mobile`
</sql>
<select id="list" resultType="com.mall4j.cloud.order.model.OrderAddr">
select <include refid="Vo_Column_List"/> from order_addr order by order_addr_id desc
</select>
<select id="getByOrderAddrId" resultType="com.mall4j.cloud.order.model.OrderAddr">
select <include refid="Vo_Column_List"/> from order_addr where order_addr_id = #{orderAddrId}
</select>
<insert id="save" useGeneratedKeys="true" keyProperty="orderAddr.orderAddrId">
insert into order_addr (`user_id`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`addr`,`post_code`,`mobile`)
values (#{orderAddr.userId},#{orderAddr.consignee},#{orderAddr.provinceId},#{orderAddr.province},#{orderAddr.cityId},#{orderAddr.city},#{orderAddr.areaId},#{orderAddr.area},#{orderAddr.addr},#{orderAddr.postCode},#{orderAddr.mobile});
</insert>
<update id="update">
update order_addr
<set>
<if test="orderAddr.userId != null">
`user_id` = #{orderAddr.userId},
</if>
<if test="orderAddr.consignee != null">
`consignee` = #{orderAddr.consignee},
</if>
<if test="orderAddr.provinceId != null">
`province_id` = #{orderAddr.provinceId},
</if>
<if test="orderAddr.province != null">
`province` = #{orderAddr.province},
</if>
<if test="orderAddr.cityId != null">
`city_id` = #{orderAddr.cityId},
</if>
<if test="orderAddr.city != null">
`city` = #{orderAddr.city},
</if>
<if test="orderAddr.areaId != null">
`area_id` = #{orderAddr.areaId},
</if>
<if test="orderAddr.area != null">
`area` = #{orderAddr.area},
</if>
<if test="orderAddr.addr != null">
`addr` = #{orderAddr.addr},
</if>
<if test="orderAddr.postCode != null">
`post_code` = #{orderAddr.postCode},
</if>
<if test="orderAddr.mobile != null">
`mobile` = #{orderAddr.mobile},
</if>
</set>
where order_addr_id = #{orderAddr.orderAddrId}
</update>
<delete id="deleteById">
delete from order_addr where order_addr_id = #{orderAddrId}
</delete>
</mapper>
<?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.mall4j.cloud.order.mapper.OrderItemMapper">
<resultMap id="orderItemMap" type="com.mall4j.cloud.order.model.OrderItem">
<id column="order_item_id" property="orderItemId"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="shop_id" property="shopId"/>
<result column="order_id" property="orderId"/>
<result column="spu_id" property="spuId"/>
<result column="sku_id" property="skuId"/>
<result column="user_id" property="userId"/>
<result column="count" property="count"/>
<result column="spu_name" property="spuName"/>
<result column="sku_name" property="skuName"/>
<result column="pic" property="pic"/>
<result column="delivery_type" property="deliveryType"/>
<result column="shop_cart_time" property="shopCartTime"/>
<result column="price" property="price"/>
<result column="spu_total_amount" property="spuTotalAmount"/>
</resultMap>
<sql id="Vo_Column_List">
`order_item_id`
,
`create_time`,
`update_time`,
`shop_id`,
`order_id`,
`spu_id`,
`sku_id`,
`user_id`,
`count`,
`spu_name`,
`sku_name`,
`pic`,
`delivery_type`,
`shop_cart_time`,
`price`,
`spu_total_amount`
</sql>
<insert id="save">
insert into order_item (`shop_id`, `order_id`, `spu_id`, `sku_id`, `user_id`, `count`,
`spu_name`, `sku_name`, `pic`, `delivery_type`,
`shop_cart_time`, `price`, `spu_total_amount`)
values (#{orderItem.shopId}, #{orderItem.orderId}, #{orderItem.spuId}, #{orderItem.skuId}, #{orderItem.userId},
#{orderItem.count}, #{orderItem.spuName}, #{orderItem.skuName}, #{orderItem.pic},
#{orderItem.deliveryType}, #{orderItem.shopCartTime}, #{orderItem.price}, #{orderItem.spuTotalAmount});
</insert>
<update id="update">
update order_item
<set>
<if test="orderItem.shopId != null">
`shop_id` = #{orderItem.shopId},
</if>
<if test="orderItem.orderId != null">
`order_id` = #{orderItem.orderId},
</if>
<if test="orderItem.spuId != null">
`spu_id` = #{orderItem.spuId},
</if>
<if test="orderItem.skuId != null">
`sku_id` = #{orderItem.skuId},
</if>
<if test="orderItem.userId != null">
`user_id` = #{orderItem.userId},
</if>
<if test="orderItem.count != null">
`count` = #{orderItem.count},
</if>
<if test="orderItem.spuName != null">
`spu_name` = #{orderItem.spuName},
</if>
<if test="orderItem.skuName != null">
`sku_name` = #{orderItem.skuName},
</if>
<if test="orderItem.pic != null">
`pic` = #{orderItem.pic},
</if>
<if test="orderItem.deliveryType != null">
`delivery_type` = #{orderItem.deliveryType},
</if>
<if test="orderItem.shopCartTime != null">
`shop_cart_time` = #{orderItem.shopCartTime},
</if>
<if test="orderItem.price != null">
`price` = #{orderItem.price},
</if>
<if test="orderItem.spuTotalAmount != null">
`spu_total_amount` = #{orderItem.spuTotalAmount}
</if>
</set>
where order_item_id = #{orderItem.orderItemId}
</update>
<delete id="deleteById">
delete
from order_item
where order_item_id = #{orderItemId}
</delete>
<insert id="saveBatch">
insert into order_item (`shop_id`, `order_id`, `spu_id`, `sku_id`, `user_id`, `count`, `spu_name`,
`sku_name`, `pic`,`delivery_type`, `shop_cart_time`,
`price`,`spu_total_amount`)
values
<foreach collection="orderItems" item="orderItem" separator=",">
(#{orderItem.shopId}, #{orderItem.orderId}, #{orderItem.spuId}, #{orderItem.skuId}, #{orderItem.userId},
#{orderItem.count}, #{orderItem.spuName},#{orderItem.skuName}, #{orderItem.pic},
#{orderItem.deliveryType}, #{orderItem.shopCartTime}, #{orderItem.price},#{orderItem.spuTotalAmount})
</foreach>
</insert>
<select id="listOrderItemsByOrderId" resultMap="orderItemMap">
select toi.*
from order_item toi
where toi.order_id = #{orderId}
</select>
<select id="getSpuNameListByOrderIds" resultType="java.lang.String">
select spu_name from order_item where order_id in
<foreach collection="orderIdList" item="orderId" separator="," close=")" open="(">
#{orderId}
</foreach>
</select>
<select id="countByOrderId" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM order_item
WHERE order_id = #{orderId}
</select>
</mapper>
<?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.mall4j.cloud.order.mapper.OrderMapper">
<resultMap id="orderMap" type="com.mall4j.cloud.order.model.Order">
<id column="order_id" property="orderId"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="shop_id" property="shopId"/>
<result column="user_id" property="userId"/>
<result column="order_addr_id" property="orderAddrId"/>
<result column="shop_name" property="shopName"/>
<result column="total" property="total"/>
<result column="status" property="status"/>
<result column="delivery_type" property="deliveryType"/>
<result column="close_type" property="closeType"/>
<result column="all_count" property="allCount"/>
<result column="pay_time" property="payTime"/>
<result column="delivery_time" property="deliveryTime"/>
<result column="finally_time" property="finallyTime"/>
<result column="cancel_time" property="cancelTime"/>
<result column="is_payed" property="isPayed"/>
<result column="delete_status" property="deleteStatus"/>
</resultMap>
<resultMap type="com.mall4j.cloud.order.model.Order" id="orderAndOrderItem" extends="orderMap">
<collection property="orderItems" columnPrefix="oi_" ofType="com.mall4j.cloud.order.model.OrderItem">
<id column="order_item_id" jdbcType="BIGINT" property="orderItemId"/>
<result column="shop_id" property="shopId"/>
<result column="order_id" property="orderId"/>
<result column="spu_id" property="spuId"/>
<result column="sku_id" property="skuId"/>
<result column="user_id" property="userId"/>
<result column="count" property="count"/>
<result column="spu_name" property="spuName"/>
<result column="sku_name" property="skuName"/>
<result column="pic" property="pic"/>
<result column="delivery_type" property="deliveryType"/>
<result column="shop_cart_time" property="shopCartTime"/>
<result column="price" property="price"/>
<result column="spu_total_amount" property="spuTotalAmount"/>
</collection>
</resultMap>
<resultMap type="com.mall4j.cloud.api.order.bo.EsOrderBO" id="esOrderAndOrderItemAndUserAddrMap" extends="orderMap">
<result column="mobile" jdbcType="VARCHAR" property="mobile"/>
<result column="consignee" jdbcType="VARCHAR" property="consignee"/>
<collection property="orderItems" columnPrefix="oi_" ofType="com.mall4j.cloud.order.model.OrderItem">
<id column="order_item_id" jdbcType="BIGINT" property="orderItemId"/>
<result column="shop_id" property="shopId"/>
<result column="order_id" property="orderId"/>
<result column="spu_id" property="spuId"/>
<result column="sku_id" property="skuId"/>
<result column="user_id" property="userId"/>
<result column="count" property="count"/>
<result column="spu_name" property="spuName"/>
<result column="sku_name" property="skuName"/>
<result column="pic" property="pic"/>
<result column="delivery_type" property="deliveryType"/>
<result column="shop_cart_time" property="shopCartTime"/>
<result column="price" property="price"/>
<result column="spu_total_amount" property="spuTotalAmount"/>
</collection>
</resultMap>
<sql id="Vo_Column_List">
`order_id`,
`create_time`,
`update_time`,
`shop_id`,
`user_id`,
`order_addr_id`,
`shop_name`,
`total`,
`status`,
`delivery_type`,
`close_type`,
`all_count`,
`pay_time`,
`delivery_time`,
`finally_time`,
`cancel_time`,
`is_payed`,
`delete_status`
</sql>
<update id="update">
update `order`
<set>
<if test="order.shopId != null">
`shop_id` = #{order.shopId},
</if>
<if test="order.shopName != null">
`shop_name` = #{order.shopName},
</if>
<if test="order.userId != null">
`user_id` = #{order.userId},
</if>
<if test="order.orderAddrId != null">
`order_addr_id` = #{order.orderAddrId},
</if>
<if test="order.total != null">
`total` = #{order.total},
</if>
<if test="order.status != null">
`status` = #{order.status},
</if>
<if test="order.deliveryType != null">
`delivery_type` = #{order.deliveryType},
</if>
<if test="order.closeType != null">
`close_type` = #{order.closeType},
</if>
<if test="order.allCount != null">
`all_count` = #{order.allCount},
</if>
<if test="order.payTime != null">
`pay_time` = #{order.payTime},
</if>
<if test="order.deliveryTime != null">
`delivery_time` = #{order.deliveryTime},
</if>
<if test="order.finallyTime != null">
`finally_time` = #{order.finallyTime},
</if>
<if test="order.cancelTime != null">
`cancel_time` = #{order.cancelTime},
</if>
<if test="order.isPayed != null">
`is_payed` = #{order.isPayed},
</if>
<if test="order.deleteStatus != null">
`delete_status` = #{order.deleteStatus}
</if>
</set>
where order_id = #{order.orderId}
</update>
<delete id="deleteById">
delete from `order` where order_id = #{orderId}
</delete>
<insert id="saveBatch">
insert into `order` (`order_id`, `shop_id`, `shop_name`, `user_id`, `order_addr_id`, `total`, `status`, `delivery_type`,`close_type`,
`all_count`, `pay_time`, `delivery_time`, `finally_time`, `cancel_time`, `is_payed`, `delete_status`)
values
<foreach collection="orders" item="order" separator=",">
(#{order.orderId}, #{order.shopId}, #{order.shopName}, #{order.userId}, #{order.orderAddrId}, #{order.total}, #{order.status}, #{order.deliveryType},
#{order.closeType}, #{order.allCount}, #{order.payTime}, #{order.deliveryTime}, #{order.finallyTime},
#{order.cancelTime}, #{order.isPayed}, #{order.deleteStatus})
</foreach>
</insert>
<select id="getOrdersStatus" resultType="com.mall4j.cloud.api.order.bo.OrderStatusBO">
select `status`, `order_id` from `order` where order_id in
<foreach collection="orderIds" open="(" item="orderId" close=")" separator=",">
#{orderId}
</foreach>
</select>
<select id="getOrdersActualAmount" resultType="com.mall4j.cloud.api.order.vo.OrderAmountVO">
select SUM(total) as payAmount from `order` where order_id in
<foreach collection="orderIds" open="(" item="orderId" close=")" separator=",">
#{orderId}
</foreach>
</select>
<update id="updateByToPaySuccess">
update `order` set `status` = 2,is_payed =1,update_time=NOW(),pay_time=NOW()
where order_id in
<foreach collection="orderIds" item="orderId" separator="," open="(" close=")">
#{orderId}
</foreach>
</update>
<select id="getOrdersSimpleAmountInfo" resultType="com.mall4j.cloud.api.order.bo.OrderSimpleAmountInfoBO">
select `shop_id`, `order_id`, actual_total, platform_amount,`status`,close_type
from `order`
where order_id in
<foreach collection="orderIds" open="(" item="orderId" close=")" separator=",">
#{orderId}
</foreach>
</select>
<update id="cancelOrders">
update `order` set `status`=6,cancel_time = NOW(),update_time=NOW() where is_payed = 0 and order_id in
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
</update>
<select id="getOrderByOrderIdAndUserId" resultMap="orderMap">
select o.* from `order` o where o.order_id = #{orderId} and o.user_id = #{userId}
</select>
<update id="receiptOrder">
update `order`
set `status` = 5,
finally_time = NOW(),
update_time = NOW()
where order_id = #{orderId} and `status` = 3
</update>
<update id="deleteOrder">
UPDATE `order` SET `delete_status` = 2 where order_id = #{orderId}
</update>
<select id="getOrderByOrderIdAndShopId" resultMap="orderMap">
select o.* from `order` o where o.order_id = #{orderId} and o.shop_id = #{shopId}
</select>
<select id="getOrderAndOrderItemData" resultMap="orderAndOrderItem">
SELECT o.user_id,
o.*,
oi.`order_item_id` oi_order_item_id ,
oi.`shop_id` oi_shop_id,
oi.`order_id` oi_order_id,
oi.`spu_id` oi_spu_id,
oi.`sku_id` oi_sku_id,
oi.`user_id` oi_user_id,
oi.`count` oi_count,
oi.`spu_name` oi_spu_name,
oi.`sku_name` oi_sku_name,
oi.`pic` oi_pic,
oi.`delivery_type` oi_delivery_type,
oi.`shop_cart_time` oi_shop_cart_time,
oi.`price` oi_price,
oi.`spu_total_amount` oi_spu_total_amount
from `order` o
join order_item oi on o.order_id = oi.order_id
where o.order_id = #{orderId}
<if test="shopId != null">
and o.shop_id = #{shopId}
</if>
</select>
<select id="getSubmitOrderPayAmountInfo" resultType="com.mall4j.cloud.order.bo.SubmitOrderPayAmountInfoBO">
select sum(total) as totalFee, max(create_time) as createTime from `order` where order_id in
<foreach collection="orderIdList" item="orderId" separator="," close=")" open="(">
#{orderId}
</foreach>
</select>
<select id="getEsOrder" resultMap="esOrderAndOrderItemAndUserAddrMap">
SELECT o.user_id,
o.*,
oi.`order_item_id` oi_order_item_id,
oi.`shop_id` oi_shop_id,
oi.`order_id` oi_order_id,
oi.`spu_id` oi_spu_id,
oi.`sku_id` oi_sku_id,
oi.`user_id` oi_user_id,
oi.`count` oi_count,
oi.`spu_name` oi_spu_name,
oi.`sku_name` oi_sku_name,
oi.`pic` oi_pic,
oi.`delivery_type` oi_delivery_type,
oi.`shop_cart_time` oi_shop_cart_time,
oi.`price` oi_price,
oi.`spu_total_amount` oi_spu_total_amount,
oa.consignee,
oa.mobile
FROM `order` AS o
JOIN order_item oi ON o.order_id = oi.order_id
left JOIN order_addr oa on o.order_addr_id = oa.order_addr_id
where o.order_id = #{orderId}
</select>
<select id="countNumberOfStatus" resultType="com.mall4j.cloud.order.vo.OrderCountVO">
SELECT COUNT(o.order_id) as all_count,
COUNT(CASE WHEN o.status = 1 THEN o.order_id ELSE NULL END) AS unPay,
COUNT(CASE WHEN o.status = 2 THEN o.order_id ELSE NULL END) AS payed,
COUNT(CASE WHEN o.status = 3 THEN o.order_id ELSE NULL END) AS consignment,
COUNT(CASE WHEN o.status = 5 THEN o.order_id ELSE NULL END) AS success
FROM `order` o WHERE o.user_id = #{userId} AND o.delete_status = 0
</select>
</mapper>
<?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.mall4j.cloud.order.mapper.OrderPayInfoMapper">
<resultMap id="orderPayInfoMap" type="com.mall4j.cloud.order.model.OrderPayInfo">
<id column="pay_id" property="payId" />
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="user_id" property="userId"/>
<result column="biz_pay_no" property="bizPayNo"/>
<result column="sys_type" property="sysType"/>
<result column="pay_status" property="payStatus"/>
<result column="pay_amount" property="payAmount"/>
<result column="version" property="version"/>
<result column="callback_content" property="callbackContent"/>
<result column="callback_time" property="callbackTime"/>
<result column="confirm_time" property="confirmTime"/>
</resultMap>
<insert id="save">
insert into order_pay_info (`user_id`,`biz_pay_no`,`sys_type`,`pay_type`,`pay_status`,`pay_score`,`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`)
values (#{orderPayInfo.userId},#{orderPayInfo.bizPayNo},#{orderPayInfo.sysType},#{orderPayInfo.payType},#{orderPayInfo.payStatus},#{orderPayInfo.payScore},#{orderPayInfo.payAmount},#{orderPayInfo.version},#{orderPayInfo.callbackContent},#{orderPayInfo.callbackTime},#{orderPayInfo.confirmTime});
</insert>
<update id="update">
update order_pay_info
<set>
<if test="orderPayInfo.userId != null">
`user_id` = #{orderPayInfo.userId},
</if>
<if test="orderPayInfo.bizPayNo != null">
`biz_pay_no` = #{orderPayInfo.bizPayNo},
</if>
<if test="orderPayInfo.sysType != null">
`sys_type` = #{orderPayInfo.sysType},
</if>
<if test="orderPayInfo.payStatus != null">
`pay_status` = #{orderPayInfo.payStatus},
</if>
<if test="orderPayInfo.payAmount != null">
`pay_amount` = #{orderPayInfo.payAmount},
</if>
<if test="orderPayInfo.version != null">
`version` = #{orderPayInfo.version},
</if>
<if test="orderPayInfo.callbackContent != null">
`callback_content` = #{orderPayInfo.callbackContent},
</if>
<if test="orderPayInfo.callbackTime != null">
`callback_time` = #{orderPayInfo.callbackTime},
</if>
<if test="orderPayInfo.confirmTime != null">
`confirm_time` = #{orderPayInfo.confirmTime},
</if>
</set>
where pay_id = #{orderPayInfo.payId}
</update>
<delete id="deleteById">
delete from order_pay_info where pay_id = #{payId}
</delete>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mall4cloud</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall4cloud-payment</artifactId>
<description>mall4cloud 支付服务</description>
<packaging>jar</packaging>
<dependencies>
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-database</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-rocketmq</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-common-security</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-api-leaf</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-api-order</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>mall4cloud-api-platform</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.mall4j.cloud.payment;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author FrozenWatermelon
* @date 2020/09/22
*/
@SpringBootApplication(scanBasePackages = { "com.mall4j.cloud" })
@EnableFeignClients(basePackages = {"com.mall4j.cloud.api.**.feign"})
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}
package com.mall4j.cloud.payment.bo;
/**
* @author FrozenWatermelon
* @date 2020/12/25
*/
public class PayInfoBO {
/**
* 支付信息,如商品名称
*/
private String body;
/**
* 支付单号
*/
private Long payId;
/**
* 付款金额
*/
private Long payAmount;
/**
* api回调域名
*/
private String apiNoticeUrl;
/**
* 支付完成会跳地址
*/
private String returnUrl;
/**
* 第三方用户id
*/
private String bizUserId;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public Long getPayId() {
return payId;
}
public void setPayId(Long payId) {
this.payId = payId;
}
public Long getPayAmount() {
return payAmount;
}
public void setPayAmount(Long payAmount) {
this.payAmount = payAmount;
}
public String getApiNoticeUrl() {
return apiNoticeUrl;
}
public void setApiNoticeUrl(String apiNoticeUrl) {
this.apiNoticeUrl = apiNoticeUrl;
}
public String getReturnUrl() {
return returnUrl;
}
public void setReturnUrl(String returnUrl) {
this.returnUrl = returnUrl;
}
public String getBizUserId() {
return bizUserId;
}
public void setBizUserId(String bizUserId) {
this.bizUserId = bizUserId;
}
@Override
public String toString() {
return "PayInfoBO{" +
"body='" + body + '\'' +
", payId='" + payId + '\'' +
", payAmount=" + payAmount +
", apiNoticeUrl='" + apiNoticeUrl + '\'' +
", returnUrl='" + returnUrl + '\'' +
", bizUserId='" + bizUserId + '\'' +
'}';
}
}
package com.mall4j.cloud.payment.bo;
/**
* 支付后返回的一些基础数据
* @author FrozenWatermelon
* @date 2020/12/25
*/
public class PayInfoResultBO {
/**
* 商城支付单号
*/
private Long payId;
/**
* 第三方订单流水号
*/
private String bizPayNo;
/**
* 是否支付成功
*/
private Integer isPaySuccess;
/**
* 支付成功的标记
*/
private String successString;
/**
* 支付金额
*/
private Long payAmount;
/**
* 回调内容
*/
private String callbackContent;
public Long getPayId() {
return payId;
}
public void setPayId(Long payId) {
this.payId = payId;
}
public String getBizPayNo() {
return bizPayNo;
}
public void setBizPayNo(String bizPayNo) {
this.bizPayNo = bizPayNo;
}
public Integer getIsPaySuccess() {
return isPaySuccess;
}
public void setIsPaySuccess(Integer isPaySuccess) {
this.isPaySuccess = isPaySuccess;
}
public String getSuccessString() {
return successString;
}
public void setSuccessString(String successString) {
this.successString = successString;
}
public Long getPayAmount() {
return payAmount;
}
public void setPayAmount(Long payAmount) {
this.payAmount = payAmount;
}
public String getCallbackContent() {
return callbackContent;
}
public void setCallbackContent(String callbackContent) {
this.callbackContent = callbackContent;
}
@Override
public String toString() {
return "PayInfoResultBO{" +
"payId=" + payId +
", bizPayNo='" + bizPayNo + '\'' +
", isPaySuccess=" + isPaySuccess +
", successString='" + successString + '\'' +
", payAmount=" + payAmount +
", callbackContent='" + callbackContent + '\'' +
'}';
}
}
package com.mall4j.cloud.payment.config;
import com.mall4j.cloud.common.rocketmq.config.RocketMqAdapter;
import com.mall4j.cloud.common.rocketmq.config.RocketMqConstant;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
/**
* @author FrozenWatermelon
* @date 2021/3/30
*/
@RefreshScope
@Configuration
public class RocketMqConfig {
@Autowired
private RocketMqAdapter rocketMqAdapter;
@Lazy
@Bean(destroyMethod = "destroy")
public RocketMQTemplate orderNotifyTemplate() {
return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_NOTIFY_TOPIC);
}
}
package com.mall4j.cloud.payment.constant;
/**
* 支付回调类型
* @author FrozenWatermelon
*/
public enum BackType {
/**
* api
*/
API(0),
/**
* 商家端
*/
SHOP(1),
/**
* 平台端
*/
PLATFORM(2)
;
private Integer num;
public Integer value() {
return num;
}
BackType(Integer num) {
this.num = num;
}
public static BackType instance(Integer value) {
BackType[] enums = values();
for (BackType statusEnum : enums) {
if (statusEnum.value().equals(value)) {
return statusEnum;
}
}
return null;
}
}
package com.mall4j.cloud.payment.constant;
/**
* 支付状态
* @author FrozenWatermelon
*/
public enum PayStatus {
/**
* 未支付
*/
UNPAY(0),
/**
* 已支付
*/
PAYED(1)
;
private Integer num;
public Integer value() {
return num;
}
PayStatus(Integer num) {
this.num = num;
}
public static PayStatus instance(Integer value) {
PayStatus[] enums = values();
for (PayStatus statusEnum : enums) {
if (statusEnum.value().equals(value)) {
return statusEnum;
}
}
return null;
}
}
package com.mall4j.cloud.payment.controller;
import com.mall4j.cloud.api.auth.bo.UserInfoInTokenBO;
import com.mall4j.cloud.common.response.ServerResponseEntity;
import com.mall4j.cloud.common.security.AuthUserContext;
import com.mall4j.cloud.common.util.BooleanUtil;
import com.mall4j.cloud.payment.bo.PayInfoBO;
import com.mall4j.cloud.payment.dto.PayInfoDTO;
import com.mall4j.cloud.payment.service.PayInfoService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
/**
* @author FrozenWatermelon
*/
@RestController
@RequestMapping("/pay")
@Tag(name = "订单接口")
public class PayController {
@Autowired
private PayInfoService payInfoService;
@Autowired
private PayNoticeController payNoticeController;
/**
* 支付接口
*/
@PostMapping("/order")
@Operation(summary = "根据订单号进行支付" , description = "根据订单号进行支付")
public ServerResponseEntity<?> pay(HttpServletRequest request, @Valid @RequestBody PayInfoDTO payParam) {
// 这里的地址是网关通过转发过来的时候,获取到当前服务器的地址,测试环境要用测试环境的uri
String gatewayUri = "http://192.168.1.17:8126/mall4cloud_payment";
UserInfoInTokenBO userInfoInTokenBO = AuthUserContext.get();
Long userId = userInfoInTokenBO.getUserId();
PayInfoBO payInfo = payInfoService.pay(userId, payParam);
payInfo.setBizUserId(userInfoInTokenBO.getBizUserId());
// 回调地址
payInfo.setApiNoticeUrl(gatewayUri + "/notice/pay/order");
payInfo.setReturnUrl(payParam.getReturnUrl());
payNoticeController.submit(payInfo.getPayId());
return ServerResponseEntity.success(payInfo.getPayId());
}
@GetMapping("/isPay/{orderIds}")
@Operation(summary = "根据订单号查询该订单是否已经支付" , description = "根据订单号查询该订单是否已经支付")
public ResponseEntity<Boolean> isPay(@PathVariable String orderIds) {
Long userId = AuthUserContext.get().getUserId();
payInfoService.getPayStatusByOrderIds(orderIds);
Integer isPay = payInfoService.isPay(orderIds, userId);
return ResponseEntity.ok(BooleanUtil.isTrue(isPay));
}
}
package com.mall4j.cloud.payment.controller;
import cn.hutool.core.util.StrUtil;
import com.mall4j.cloud.payment.bo.PayInfoResultBO;
import com.mall4j.cloud.payment.model.PayInfo;
import com.mall4j.cloud.payment.service.PayInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Hidden;
import java.util.ArrayList;
import java.util.List;
/**
* @author FrozenWatermelon
*/
@Hidden
@RestController
@RequestMapping("/notice/pay")
public class PayNoticeController {
@Autowired
private PayInfoService payInfoService;
/**
* 支付异步回调
*/
@RequestMapping("/order")
public ResponseEntity<String> submit(Long payId) {
PayInfo payInfo = payInfoService.getByPayId(payId);
String[] orderIdStrArr = payInfo.getOrderIds().split(StrUtil.COMMA);
List<Long> orderIdList = new ArrayList<>();
for (String s : orderIdStrArr) {
orderIdList.add(Long.valueOf(s));
}
PayInfoResultBO payInfoResult = new PayInfoResultBO();
payInfoResult.setPayId(payId);
payInfoResult.setBizPayNo(payInfo.getBizPayNo());
payInfoResult.setCallbackContent(payInfo.getCallbackContent());
// 支付成功
payInfoService.paySuccess(payInfoResult,orderIdList);
return ResponseEntity.ok("");
}
}
package com.mall4j.cloud.payment.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
/**
* 订单支付记录DTO
*
* @author FrozenWatermelon
* @date 2020-12-25 09:50:59
*/
public class PayInfoDTO{
@NotEmpty(message = "订单号不能为空")
@Schema(description = "订单号" , requiredMode = Schema.RequiredMode.REQUIRED)
private List<Long> orderIds;
@Schema(description = "支付完成回跳地址" , requiredMode = Schema.RequiredMode.REQUIRED)
private String returnUrl;
public List<Long> getOrderIds() {
return orderIds;
}
public void setOrderIds(List<Long> orderIds) {
this.orderIds = orderIds;
}
public String getReturnUrl() {
return returnUrl;
}
public void setReturnUrl(String returnUrl) {
this.returnUrl = returnUrl;
}
@Override
public String toString() {
return "PayInfoDTO{" +
"orderIds=" + orderIds +
", returnUrl='" + returnUrl + '\'' +
'}';
}
}
package com.mall4j.cloud.payment.mapper;
import com.mall4j.cloud.payment.model.PayInfo;
import org.apache.ibatis.annotations.Param;
/**
* 订单支付记录
*
* @author FrozenWatermelon
* @date 2020-12-25 09:50:59
*/
public interface PayInfoMapper {
/**
* 根据订单支付记录id获取订单支付记录
*
* @param payId 订单支付记录id
* @return 订单支付记录
*/
PayInfo getByPayId(@Param("payId") Long payId);
/**
* 保存订单支付记录
*
* @param payInfo 订单支付记录
*/
void save(@Param("payInfo") PayInfo payInfo);
/**
* 更新订单支付记录
*
* @param payInfo 订单支付记录
*/
void update(@Param("payInfo") PayInfo payInfo);
/**
* 根据订单支付记录id删除订单支付记录
*
* @param payId
*/
void deleteById(@Param("payId") Long payId);
/**
* 根据支付订单号获取订单支付状态
*
* @param orderIds 订单号ids
* @return 支付状态
*/
Integer getPayStatusByOrderIds(@Param("orderIds") String orderIds);
/**
* 查询订单是否已经支付
* @param orderIds 订单id
* @param userId 用户id
* @return 是否已经支付
*/
Integer isPay(@Param("orderIds") String orderIds, @Param("userId") Long userId);
}
package com.mall4j.cloud.payment.model;
import java.io.Serializable;
import java.util.Date;
import com.mall4j.cloud.common.model.BaseModel;
/**
* 订单支付记录
*
* @author FrozenWatermelon
* @date 2020-12-25 09:50:59
*/
public class PayInfo extends BaseModel implements Serializable{
private static final long serialVersionUID = 1L;
public static final String DISTRIBUTED_ID_KEY = "mall4cloud-pay";
/**
* 支付单号
*/
private Long payId;
/**
* 用户id
*/
private Long userId;
/**
* 外部订单流水号
*/
private String bizPayNo;
/**
* 本次支付关联的多个订单号
*/
private String orderIds;
/**
* 系统类型 见SysTypeEnum
*/
private Integer sysType;
/**
* 支付状态
*/
private Integer payStatus;
/**
* 支付金额
*/
private Long payAmount;
/**
* 版本号
*/
private Integer version;
/**
* 回调内容
*/
private String callbackContent;
/**
* 回调时间
*/
private Date callbackTime;
/**
* 确认时间
*/
private Date confirmTime;
public Long getPayId() {
return payId;
}
public void setPayId(Long payId) {
this.payId = payId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getBizPayNo() {
return bizPayNo;
}
public void setBizPayNo(String bizPayNo) {
this.bizPayNo = bizPayNo;
}
public Integer getSysType() {
return sysType;
}
public void setSysType(Integer sysType) {
this.sysType = sysType;
}
public Integer getPayStatus() {
return payStatus;
}
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus;
}
public Long getPayAmount() {
return payAmount;
}
public void setPayAmount(Long payAmount) {
this.payAmount = payAmount;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getCallbackContent() {
return callbackContent;
}
public void setCallbackContent(String callbackContent) {
this.callbackContent = callbackContent;
}
public Date getCallbackTime() {
return callbackTime;
}
public void setCallbackTime(Date callbackTime) {
this.callbackTime = callbackTime;
}
public Date getConfirmTime() {
return confirmTime;
}
public void setConfirmTime(Date confirmTime) {
this.confirmTime = confirmTime;
}
public String getOrderIds() {
return orderIds;
}
public void setOrderIds(String orderIds) {
this.orderIds = orderIds;
}
@Override
public String toString() {
return "PayInfo{" +
"payId=" + payId +
", userId=" + userId +
", bizPayNo='" + bizPayNo + '\'' +
", orderIds='" + orderIds + '\'' +
", sysType=" + sysType +
", payStatus=" + payStatus +
", payAmount=" + payAmount +
", version=" + version +
", callbackContent='" + callbackContent + '\'' +
", callbackTime=" + callbackTime +
", confirmTime=" + confirmTime +
'}';
}
}
package com.mall4j.cloud.payment.service;
import com.mall4j.cloud.payment.bo.PayInfoBO;
import com.mall4j.cloud.payment.bo.PayInfoResultBO;
import com.mall4j.cloud.payment.dto.PayInfoDTO;
import com.mall4j.cloud.payment.model.PayInfo;
import java.util.List;
/**
* 订单支付记录
*
* @author FrozenWatermelon
* @date 2020-12-25 09:50:59
*/
public interface PayInfoService {
/**
* 创建支付订单,返回给前端,前端唤起应用进行支付
* @param userId 用户id
* @param payParam 支付参数
* @return 前端唤起支付需要的参数
*/
PayInfoBO pay(Long userId, PayInfoDTO payParam);
/**
* 根据订单支付记录id获取订单支付记录
*
* @param payId 订单支付记录id
* @return 订单支付记录
*/
PayInfo getByPayId(Long payId);
/**
* 标记为支付成功
* @param payInfoResult 支付信息
* @param orderIds 订单ids
*/
void paySuccess(PayInfoResultBO payInfoResult, List<Long> orderIds);
/**
* 根据支付订单号获取订单支付状态
* @param orderIds 订单号ids
* @return 支付状态
*/
Integer getPayStatusByOrderIds(String orderIds);
/**
* 查询订单是否已经支付
* @param orderIds 订单id
* @param userId 用户id
* @return 是否已经支付
*/
Integer isPay(String orderIds, Long userId);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment