记得上下班打卡 | git大法好,push需谨慎

Commit fd0e404d authored by 姜秀龙's avatar 姜秀龙

Merge remote-tracking branch 'origin/dev-1.6-shouqianba' into dev-1.6-shouqianba

parents 9d6fdcc2 ca0f6dcc
......@@ -54,6 +54,7 @@ CREATE TABLE `goblin_sqb_order` (
`sqb_order_sn` VARCHAR(64) COMMENT '收钱吧订单号',
`sqb_order_signature` VARCHAR(256) COMMENT '收钱吧订单签名',
`sqb_acquiring_sn` VARCHAR(64) COMMENT '收钱吧收单号',
`sqb_acquiring_sign` VARCHAR(255) DEFAULT '' COMMENT '收钱吧收单密钥',
`sqb_checkout_items_id` VARCHAR(64) COMMENT '结算明细ID',
`coupon_sn` VARCHAR(64) COMMENT '券码编号',
`coupon_qr_code` VARCHAR(512) COMMENT '核销二维码',
......
......@@ -27,6 +27,12 @@
<artifactId>liquidnet-service-dragon-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-third-sqb</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -446,4 +446,10 @@ public class GoblinRedisConst {
*/
public static final String SQB_ORDER_LOCK = PREFIX.concat("sqb:order:lock:");
/**
* 收钱吧 用户订单列表
*/
public static final String SQB_GOBLIN_ORDER_LIST = PREFIX.concat("sqb:order:id:list:");//用户订单id列表 key:$uid
}
package com.liquidnet.service.goblin.dto.manage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ApiModel(value = "GoblinSqbOrderParam")
@Data
public class GoblinSqbOrderParam {
@ApiModelProperty(required = true, value = "apuId")
@NotBlank(message = "商品不能为空")
private String spuId;
@ApiModelProperty(required = true, value = "skuId")
@NotBlank(message = "商品规格不能为空")
private String skuId;
@ApiModelProperty(required = true, value = "购买数量")
@NotNull(message = "购买数量不能为空")
private Integer quantity;
@ApiModelProperty(required = true, value = "关联演出ID")
@NotBlank(message = "关联演出ID不能为空")
private String performancesId;
}
package com.liquidnet.service.goblin.dto.manage;
import com.liquidnet.common.third.sqb.param.response.data.MallProductsQueryData;
import com.liquidnet.commons.lang.constant.LnsRegex;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.goblin.dto.GoblinGoodsSpecDto;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallProductsQueryData;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -152,7 +151,6 @@ public class GoblinStoreMgtGoodsSqbAddParam implements Serializable {
}
/**
* 编辑SPU参数整理
*
......
......@@ -78,7 +78,7 @@ public class GoblinOrderSkuVo implements Serializable, Cloneable {
* ---------------------------- 以下为券类商品-代金券属性 ----------------------------
*/
@ApiModelProperty(value = "商品类型[0-常规|1-数字藏品|2-券类商品]")
@ApiModelProperty(value = "商品类型[0-常规|1-数字藏品|2-券类商品] 33-收钱吧商品")
private Integer skuType;
@ApiModelProperty(value = "是否实名[0-否|1-是,表示该商品需要实名关联],这里默认0")
private Integer isTrueName;
......
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "用户端-查询券码-VO")
public class GoblinSqbCouponVo implements Serializable {
private static final long serialVersionUID = 1L;
private String couponSn;
......
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.io.Serializable;
@Data
......@@ -16,13 +17,17 @@ public class GoblinSqbOrderVo implements Serializable {
private String sqbOrderSn;
private String sqbOrderSignature;
private String sqbAcquiringSn;
private String sqbAcquiringSign;
private String sqbCheckoutItemsId;
private String couponSn;
private String couponQrCode;
private String couponExpireTime;
private Integer status; // 0-待支付 1-已支付 2-已核销 3-已退款 4-退款中 9-失败
private Integer couponUsedStatus; // 0-未核销 1-已核销
private String refundReason;
private String createdAt;
private String updatedAt;
// 扩展属性
private Integer couponUsedStatus; // 0-未核销 1-已核销
}
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallProductsQueryData;
import com.liquidnet.common.third.sqb.param.response.data.MallProductsQueryData;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
package com.liquidnet.service.goblin.param.shouqianba.callback;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "CallbackParams", description = "收钱吧微信小店订单推送请求体")
public class CallbackParams {
@ApiModelProperty(value = "推送事件ID,全局唯一", example = "2024013000594610646")
private Long eventId;
@ApiModelProperty(value = "推送时间戳,当前时间毫秒值", example = "1706679507593")
private Long timestamp;
@ApiModelProperty(value = "随机字串,用于签名", example = "j9xd5kc7ixcryy7at5rrrv24xty783th")
private String nonce;
@ApiModelProperty(value = "订单数据 JSON字符串 (详见 SqbOrderContentDTO)")
private String content;
@ApiModelProperty(value = "报文签名", example = "bryyeKJ6opUothNTz1s3+F98LOl2Teji6T4XcEAejxdt...")
private String signature;
}
package com.liquidnet.service.goblin.param.shouqianba.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "券码状态同步")
public class CouponStatusSyncRequest {
@ApiModelProperty(required = true, value = "应用ID(聚合收单唯一ID,需申请)")
private String appid;
@ApiModelProperty(required = true, value = "券号")
private List<String> voucherNos;
@ApiModelProperty(required = true, value = "用户ID(自定义,核销用户id)")
private String redeemMerchantId;
@ApiModelProperty(required = true, value = "外部单号(${AppCode}+id,AppCode需要分配)")
private String redeemExternalOrderSn;
@ApiModelProperty(required = true, value = "来源(固定值:EXTERN)")
private String redeemSource;
@ApiModelProperty(required = true, value = "核销终端号(自定义)")
private String clientSn;
@ApiModelProperty(required = true, value = "券使用状态(0未核销,1已核销)")
private Byte status;
}
package com.liquidnet.service.goblin.param.shouqianba.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 收钱吧商品同步单项参数
*/
@Data
public class GoblinSqbGoodsSyncParam implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank(message = "收钱吧商品 ID 不能为空")
@ApiModelProperty(value = "收钱吧商品 ID (对应 spuId)", required = true)
private String sqbProductId;
@ApiModelProperty(value = "收钱吧商品编码 (非必填)")
private String sqbProductSn;
@NotBlank(message = "商城编号不能为空")
@ApiModelProperty(value = "收钱吧商城编号", required = true)
private String mallSn;
@NotBlank(message = "商城签名不能为空")
@ApiModelProperty(value = "收钱吧商城签名", required = true)
private String mallSignature;
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.param.shouqianba.callback.CallbackParams;
import com.liquidnet.service.goblin.param.shouqianba.request.*;
import com.liquidnet.service.goblin.param.shouqianba.response.data.*;
import java.util.List;
import java.util.Map;
/**
* 收钱吧对接接口定义
*
* @author liquidnet
* @since 2026-03-16
*/
public interface IGoblinShouQianBaService {
/**
* 创建结算明细
* <p>
* 对接收钱吧「创建结算明细」接口,向收钱吧上传订单结算数据。
* </p>
*
* @param request 创建结算明细请求参数
* @return 收钱吧响应结果;调用失败时返回 null
*/
SettlementCreateData createSettlement(SettlementCreateRequest request);
/**
*
* @param mallSn 商城ID
* @param signature 商城密钥
* @param userId 正在用户ID
* @param checkoutItems 商品
* @return
*/
SettlementCreateData createSettlement(String mallSn, String signature, String userId, List<SettlementCreateRequest.CheckoutItem> checkoutItems);
/**
* 创建订单
*
* @param request
* @return
*/
OrderCreateData createOrder(OrderCreateRequest request);
/**
*
* @param mallSn 商城ID
* @param signature 商城密钥
* @param checkoutItemsId 创建结算明细 返回的 结算项ID
* @param userId 正在用户ID
* @param requestId 请求ID
* @param subject 标题
* @return
*/
OrderCreateData createOrder(String mallSn, String signature, String checkoutItemsId, String userId, String requestId, String subject);
/**
* 创建收单
* 如果上一步创建收单失败 可以使用这个接口重新创建收单
*
* @return
*/
AcquiringCreateData createAcquiring(AcquiringCreateRequest request);
/**
* 查询收银台
*
* @param request
* @return
*/
CashierQueryData queryCashier(CashierQueryRequest request);
/**
* 查询收银台
* @param acquiringSn 收单号
* @param acquiringSignature 收单密钥
* @param userId 正在用户ID
* @return
*/
CashierQueryData queryCashier(String acquiringSn, String acquiringSignature, String userId);
/**
* 创建微信预支付订单
*
* @param request
* @return
*/
CreateWechatPrepayOrderData createWechatPrepayOrder(CreateWechatPrepayOrderRequest request);
/**
* 创建微信预支付订单
*
* @param acquiringSn 收单号
* @param signature 收单签名
* @param userId 正在用户ID
* @param amount 支付金额
* @param requestSn 支付请求号
* @param payTool 支付工具代码
* @param channelExt 通道扩展参数
* @param selectedSignature 支付工具签名
* @param seq 序列号 上一步seq(查询收银台)
* @return
*/
CreateWechatPrepayOrderData createWechatPrepayOrder(String acquiringSn,
String signature,
String userId,
String amount,
String requestSn,
CashierQueryData.PayTool payTool,
Map<String, Object> channelExt,
String selectedSignature,
String seq);
/**
* 查询券码
*
* @param request
* @return
*/
CouponQueryData queryCoupon(CouponQueryRequest request);
/**
* 查询券码
* @param sn 订单ID
* @param signature 订单密码
* @return
*/
CouponQueryData queryCoupon(String sn, String signature);
/**
* 券码状态同步
*
* @param request
* @return
*/
boolean syncCouponStatus(CouponStatusSyncRequest request);
/**
* 券码状态同步
* @param redeemMerchantId 用户ID(自定义,核销用户id)
* @param voucherNos 券号
* @param redeemExternalOrderSn 外部单号(${AppCode}+id,AppCode需要分配)
* @param clientSn 核销终端号(自定义)
* @param status 券使用状态(0未核销,1已核销)
* @return
*/
boolean syncCouponStatus(String redeemMerchantId,
List<String> voucherNos,
String redeemExternalOrderSn,
String clientSn,
Byte status);
/**
* 券退款
*
* @param request
* @return
*/
CouponRefundData refundCoupon(CouponRefundRequest request);
/**
* @param sn 单号(前置操作后拿到)
* @param signature 密码(前置操作后拿到)
* @param applyAmount 金额
* @param type 退款类型(1商品 2金额)
* @param item
* @param refundReason 退款原因
* @param requestId 退款请求id(${AppCode}+id)
* @return
*/
CouponRefundData refundCoupon(String sn,
String signature,
Long applyAmount,
Byte type,
List<CouponRefundRequest.RefundItem> item,
String refundReason,
String requestId);
/**
* 商城列表接口
*
* @param request
* @return
*/
List<MallListQueryData> queryMallList(MallListQueryRequest request);
/**
*
* @param endCursor 结束游标 上一页的结束游标(首次查询传 null)
* @param count 查询数量 每页返回的最大订单数
* @return
*/
List<MallListQueryData> queryMallList(String endCursor, Integer count);
/**
* 商城商品接口
*
* @param request
* @return
*/
List<MallProductsQueryData> queryMallProducts(MallProductsQueryRequest request);
/**
* 商城商品接口
* @param mallSn 商城ID
* @param signature 商城密码
* @return
*/
List<MallProductsQueryData> queryMallProducts(String mallSn, String signature);
/**
* 验签
* @param callbackParams
* @return
*/
boolean verifySignature(CallbackParams callbackParams);
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.common.third.sqb.param.callback.CouponCallbackContent;
import com.liquidnet.common.third.sqb.param.callback.OrderCallbackContent;
import com.liquidnet.common.third.sqb.param.callback.RefundCallbackContent;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbCouponVo;
import com.liquidnet.service.goblin.dto.manage.GoblinSqbOrderParam;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderCreateVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderDetailVo;
import com.liquidnet.service.goblin.param.shouqianba.callback.CouponCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.OrderCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.RefundCallbackContent;
import java.util.List;
/**
* 收钱吧订单服务接口
......@@ -18,51 +15,32 @@ public interface IGoblinSqbOrderService {
/**
* 创建收钱吧订单
*
* @param userId 用户ID(从 token 获取)
* @param spuId 商品 SPU ID
* @param skuId 商品 SKU ID
* @param quantity 购买数量
* @param performancesId 关联演出 ID
* @param userId 用户ID(从 token 获取)
* @param orderParam
* @return 订单创建结果(orderId、acquiringSn、paymentVoucher)
*/
ResponseDto<GoblinSqbOrderCreateVo> createOrder(String userId, String spuId, String skuId,
Integer quantity, String performancesId);
ResponseDto<GoblinSqbOrderCreateVo> createOrder(String userId, GoblinSqbOrderParam orderParam);
/**
* 查询支付状态
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 支付状态(0-待支付 1-已支付 9-失败)
*/
ResponseDto<Integer> queryPayStatus(String userId, String orderId);
/**
* 获取核销二维码(券码
* 再次付款(待支付状态下重新拉起微信支付
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 券码信息(couponSn、couponQrCode、couponExpireTime
* @return 新的 paymentVoucher(复用原 orderId
*/
ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId);
ResponseDto<GoblinSqbOrderCreateVo> repay(String userId, String orderId);
/**
* 申请退款
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 退款结果
*/
ResponseDto<Boolean> refund(String userId, String orderId);
/**
* 主动同步核销状态
* 查询支付状态
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 同步结果
* @return 支付状态(0-待支付 1-已支付 9-失败)
*/
ResponseDto<Boolean> syncCouponStatus(String userId, String orderId);
ResponseDto<Integer> queryPayStatus(String userId, String orderId);
/**
* 支付成功回调(收钱吧主动推送)
......@@ -85,37 +63,4 @@ public interface IGoblinSqbOrderService {
*/
ResponseDto<String> handleCouponCallback(CouponCallbackContent callbackContent);
/**
* 演出结束自动退款(定时任务调用)
*
* @param performancesId 演出ID
* @return 处理结果摘要(成功/失败笔数)
*/
ResponseDto<String> autoRefundByPerformance(String performancesId);
/**
* 查询用户收钱吧订单列表
*
* @param userId 用户ID
* @return 收钱吧订单列表(仅 skuType=33 的订单,按下单时间倒序)
*/
ResponseDto<List<GoblinSqbOrderDetailVo>> getOrderList(String userId);
/**
* 查询收钱吧订单详情
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 订单详情(基础信息 + 收钱吧扩展信息)
*/
ResponseDto<GoblinSqbOrderDetailVo> getOrderDetail(String userId, String orderId);
/**
* 再次付款(待支付状态下重新拉起微信支付)
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 新的 paymentVoucher(复用原 orderId)
*/
ResponseDto<GoblinSqbOrderCreateVo> repay(String userId, String orderId);
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbCouponVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderDetailVo;
import java.util.List;
public interface IGoblinSqbService {
/**
* 获取核销二维码(券码)
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 券码信息(couponSn、couponQrCode、couponExpireTime)
*/
ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId);
/**
* 申请退款
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 退款结果
*/
ResponseDto<Boolean> refund(String userId, String orderId);
/**
* 主动同步核销状态
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 同步结果
*/
ResponseDto<Boolean> syncCouponStatus(String userId, String orderId);
/**
* 演出结束自动退款(定时任务调用)
* TODO
* @param performancesId 演出ID
* @return 处理结果摘要(成功/失败笔数)
*/
ResponseDto<String> autoRefundByPerformance(String performancesId);
/**
* 查询用户收钱吧订单列表
*
* @param userId 用户ID
* @return 收钱吧订单列表(仅 skuType=33 的订单,按下单时间倒序)
*/
ResponseDto<List<GoblinSqbOrderDetailVo>> getOrderList(String userId);
/**
* 查询收钱吧订单详情
*
* @param userId 用户ID
* @param orderId 本地订单ID
* @return 订单详情(基础信息 + 收钱吧扩展信息)
*/
ResponseDto<GoblinSqbOrderDetailVo> getOrderDetail(String userId, String orderId);
}
<?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>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-third</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>liquidnet-common-third-sqb</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.liquidnet.service.goblin.config.properties;
package com.liquidnet.common.third.sqb.config;
import lombok.Getter;
import lombok.Setter;
......@@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
@Component
@Setter
@Getter
public class ShouqianbaProperties {
public class SqbConfig {
private String appId;
......
package com.liquidnet.common.third.sqb.param.callback;
import lombok.Data;
@Data
/**
* CallbackParams
*/
public class CallbackParams {
/** 推送事件ID,全局唯一 */
private Long eventId;
/** 推送时间戳,当前时间毫秒值 */
private Long timestamp;
/** 随机字串,用于签名 */
private String nonce;
/** 订单数据 JSON字符串 (详见 SqbOrderContentDTO) */
private String content;
/** 报文签名 */
private String signature;
}
package com.liquidnet.service.goblin.param.shouqianba.callback;
package com.liquidnet.common.third.sqb.param.callback;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "SqbVoucherStatusDTO", description = "收钱吧券状态推送内容详情")
/**
* SqbVoucherStatusDTO
*/
public class CouponCallbackContent {
@ApiModelProperty(value = "订单Sn")
/** 订单Sn */
private String orderSn;
@ApiModelProperty(value = "商城Sn")
/** 商城Sn */
private String mallSn;
@ApiModelProperty(value = "商户Sn")
/** 商户Sn */
private String merchantSn;
@ApiModelProperty(value = "门店id")
/** 门店id */
private String storeId;
@ApiModelProperty(value = "券列表信息")
/** 券列表信息 */
private List<VoucherItem> voucherList;
@Data
@ApiModel("VoucherItem")
/**
* VoucherItem
*/
public static class VoucherItem {
@ApiModelProperty(value = "券号")
/** 券号 */
private String voucherNo;
@ApiModelProperty(value = "类型")
/** 类型 */
private String type;
@ApiModelProperty(value = "券状态 (0未核销, 1已核销, 2未核销退款, 3已核销退款中, 4未核销退款完成, 5已核销退款完成, 6已失效)")
/** 券状态 (0未核销, 1已核销, 2未核销退款, 3已核销退款中, 4未核销退款完成, 5已核销退款完成, 6已失效) */
private Byte targetState;
@ApiModelProperty(value = "券原状态")
/** 券原状态 */
private Byte sourceState;
@ApiModelProperty(value = "券名称")
/** 券名称 */
private String voucherName;
@ApiModelProperty(value = "操作时间 (yyyy-MM-dd HH:mm:ss)")
/** 操作时间 (yyyy-MM-dd HH:mm:ss) */
private String operationTime;
@ApiModelProperty(value = "券对应的商品信息")
/** 券对应的商品信息 */
private VoucherProductInfo item;
@ApiModelProperty(value = "券二维码地址")
/** 券二维码地址 */
private String qrCodeUrl;
@ApiModelProperty(value = "券二维码内容")
/** 券二维码内容 */
private String qrCodeContent;
@ApiModelProperty(value = "原金额 (单位:分)")
/** 原金额 (单位:分) */
private Long oriAmount;
@ApiModelProperty(value = "实收金额 (单位:分)")
/** 实收金额 (单位:分) */
private Long receivedAmount;
@ApiModelProperty(value = "核销信息 (已核销会有这部分)")
/** 核销信息 (已核销会有这部分) */
private RedeemInfo redeemInfo;
}
@Data
@ApiModel("VoucherProductInfo")
/**
* VoucherProductInfo
*/
public static class VoucherProductInfo {
@ApiModelProperty(value = "spuId")
/** spuId */
private Long spuId;
@ApiModelProperty(value = "skuId")
/** skuId */
private Long skuId;
@ApiModelProperty(value = "商品标题")
/** 商品标题 */
private String title;
@ApiModelProperty(value = "商品图片地址")
/** 商品图片地址 */
private String img;
}
@Data
@ApiModel("RedeemInfo")
/**
* RedeemInfo
*/
public static class RedeemInfo {
@ApiModelProperty(value = "操作来源 (如: EXTERN)")
/** 操作来源 (如: EXTERN) */
private String redeemSource;
@ApiModelProperty(value = "操作appId")
/** 操作appId */
private String redeemAppId;
@ApiModelProperty(value = "客户端编码")
/** 客户端编码 */
private String redeemClientSn;
@ApiModelProperty(value = "外部编码 (appId + 请求号)")
/** 外部编码 (appId + 请求号) */
private String redeemExternalOrderSn;
@ApiModelProperty(value = "操作商户 (userId)")
/** 操作商户 (userId) */
private String operatorMerchantId;
}
......
package com.liquidnet.service.goblin.param.shouqianba.callback;
package com.liquidnet.common.third.sqb.param.callback;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "OrderCallbackContent", description = "收钱吧订单推送 Content 具体数据")
/**
* OrderCallbackContent
*/
public class OrderCallbackContent {
@ApiModelProperty(value = "订单号", example = "71655367906162")
/** 订单号 */
private String orderSn;
@ApiModelProperty(value = "支付流水号列表", example = "[\"7894259297368060\"]")
/** 支付流水号列表 */
private List<String> payTsnList;
@ApiModelProperty(value = "终端号", example = "2101056320290541156")
/** 终端号 */
private String terminalSn;
@ApiModelProperty(value = "门店号", example = "21590000000630325")
/** 门店号 */
private String storeSn;
@ApiModelProperty(value = "商城名称", example = "智能商城0206-17:35")
/** 商城名称 */
private String mallName;
@ApiModelProperty(value = "订单金额", example = "2")
/** 订单金额 */
private BigDecimal orderAmount;
@ApiModelProperty(value = "创建时间", example = "2024-02-20 10:46:32")
/** 创建时间 */
private String createdAt;
@ApiModelProperty(value = "订单状态码 0:已创建 10:已支付 35:已完成 40:已取消", example = "35")
/** 订单状态码 0:已创建 10:已支付 35:已完成 40:已取消 */
private Integer orderStateCode;
@ApiModelProperty(value = "商品明细列表")
/** 商品明细列表 */
private List<Item> items;
@ApiModelProperty(value = "收集的信息 JSON字符串", example = "[{\"type\":\"text\",\"form\":\"basic\",\"fieldName\":\"姓名\",\"content\":\"\"}]")
/** 收集的信息 JSON字符串 */
private String collectedInfo;
@ApiModelProperty(value = "预订单编码")
/** 预订单编码 */
private List<String> preOrderSns;
@ApiModelProperty(value = "订单签名")
/** 订单签名 */
private String orderSignature;
@ApiModelProperty(value = "支付的代客下单数据")
/** 支付的代客下单数据 */
private List<PreOrder> preOrderList;
@Data
@ApiModel(value = "商品明细")
/**
* 商品明细
*/
public static class Item {
@ApiModelProperty(value = "商品标题")
/** 商品标题 */
private String title;
@ApiModelProperty(value = "规格描述")
/** 规格描述 */
private String skuDesc;
@ApiModelProperty(value = "数量")
/** 数量 */
private String quantity;
@ApiModelProperty(value = "单位")
/** 单位 */
private String unit;
}
@Data
@ApiModel(value = "采集数据")
/**
* 采集数据
*/
public static class CollectedInfo {
@ApiModelProperty(value = "控件类型")
/** 控件类型 */
private String type;
@ApiModelProperty(value = "控件格式")
/** 控件格式 */
private String form;
@ApiModelProperty(value = "字段名")
/** 字段名 */
private String fieldName;
@ApiModelProperty(value = "采集数据内容")
/** 采集数据内容 */
private String content;
}
@Data
@ApiModel(value = "支付的代客下单数据")
/**
* 支付的代客下单数据
*/
public static class PreOrder {
@ApiModelProperty(value = "预订单id")
/** 预订单id */
private String preOrderId;
@ApiModelProperty(value = "预订单编号")
/** 预订单编号 */
private String preOrderSn;
@ApiModelProperty(value = "请求号")
/** 请求号 */
private String requestId;
}
......
package com.liquidnet.service.goblin.param.shouqianba.callback;
package com.liquidnet.common.third.sqb.param.callback;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "SqbRefundContentDTO", description = "收钱吧退款推送内容详情")
/**
* SqbRefundContentDTO
*/
public class RefundCallbackContent {
@ApiModelProperty(value = "售后单号 (全局唯一)", example = "71582143744560")
/** 售后单号 (全局唯一) */
private String ticketSn;
@ApiModelProperty(value = "订单号", example = "2101056320290513285")
/** 订单号 */
private String orderSn;
@ApiModelProperty(value = "原状态")
/** 原状态 */
private Integer sourceState;
@ApiModelProperty(value = "目标状态 (20:完成, 15:退款完成, 0:创建, 10:退款中, 30:取消退款)", example = "15")
/** 目标状态 (20:完成, 15:退款完成, 0:创建, 10:退款中, 30:取消退款) */
private Integer targetState;
@ApiModelProperty(value = "下单金额 (单位:分)", example = "100")
/** 下单金额 (单位:分) */
private Long amount;
@ApiModelProperty(value = "申请金额 (单位:分)", example = "100")
/** 申请金额 (单位:分) */
private Long applyAmount;
@ApiModelProperty(value = "请求号")
/** 请求号 */
private String requestId;
@ApiModelProperty(value = "来源 (如: EXTERN)")
/** 来源 (如: EXTERN) */
private String requestSource;
@ApiModelProperty(value = "退款的商品信息")
/** 退款的商品信息 */
private SqbRefundItemContainer item;
@Data
@ApiModel("SqbRefundItemContainer")
/**
* SqbRefundItemContainer
*/
public static class SqbRefundItemContainer {
@ApiModelProperty(value = "退款类型 (1:商品, 2:金额)")
/** 退款类型 (1:商品, 2:金额) */
private Byte type;
@ApiModelProperty(value = "商品明细列表")
/** 商品明细列表 */
private List<SqbRefundItemDetail> items;
}
@Data
@ApiModel("SqbRefundItemDetail")
/**
* SqbRefundItemDetail
*/
public static class SqbRefundItemDetail {
@ApiModelProperty(value = "spu id")
/** spu id */
private String spuId;
@ApiModelProperty(value = "sku id")
/** sku id */
private String skuId;
@ApiModelProperty(value = "标题")
/** 标题 */
private String title;
@ApiModelProperty(value = "数量")
/** 数量 */
private String quantity;
@ApiModelProperty(value = "退款类型 (0:正常商品, 1:自定义商品)")
/** 退款类型 (0:正常商品, 1:自定义商品) */
private Byte type;
}
}
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 创建收单请求
*/
@Data
@ApiModel(value = "创建收单请求")
public class AcquiringCreateRequest {
@ApiModelProperty(required = true, value = "应用id", example = "202507xxxxxxx")
/**
* 应用id
*/
private String appid;
@ApiModelProperty(required = true, value = "卖家信息")
/**
* 卖家信息
*/
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "卖家信息")
/**
* 卖家信息
*/
private Order orderID;
/**
* 订单信息
*/
@Data
@ApiModel(value = "订单信息")
public static class Order {
@ApiModelProperty(required = true, value = "订单ID")
/**
* 订单ID
*/
private String sn;
@ApiModelProperty(required = true, value = "订单密码")
/**
* 订单密码
*/
private String signature;
}
......
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 收银台查询请求
*/
@Data
@ApiModel(value = "收银台查询请求")
public class CashierQueryRequest {
@ApiModelProperty(required = true, value = "应用id", example = "202507xxxxxxx")
/** 应用id */
private String appid;
@ApiModelProperty(required = true, value = "商户信息")
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "支付模式代码", example = "4")
/** 支付模式代码 */
private Integer paymentMode;
@ApiModelProperty(required = true, value = "支付环境")
/** 支付环境 */
private PaymentEnv paymentEnv;
@ApiModelProperty(required = false, value = "付款人信息")
/** 付款人信息 */
private CommonRequest.Payer payer;
@ApiModelProperty(required = true, value = "收单信息")
/** 收单信息 */
private CommonRequest.Acquiring acquiringInfo;
@Data
@ApiModel(value = "支付环境信息")
/**
* 支付环境信息
*/
public static class PaymentEnv {
@ApiModelProperty(required = false, value = "ip地址 最大40位")
/** ip地址 最大40位 */
private String ip;
@ApiModelProperty(required = true, value = "支付客户端 最大32位", example = "wechat")
/** 支付客户端 最大32位 */
private String client;
@ApiModelProperty(required = false, value = "设备号 最大64位")
/** 设备号 最大64位 */
private String device;
@ApiModelProperty(required = false, value = "版本号", example = "1.4")
/** 版本号 */
private String version;
}
......
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -12,97 +10,141 @@ import java.util.List;
@Data
public class CommonRequest {
/**
* 商城信息
*/
@Data
@ApiModel(value = "商城信息")
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor
@NoArgsConstructor
public static class Mall{
public static class Mall {
@ApiModelProperty(required = true, value = "商城ID")
/**
* 商城ID
*/
private String mallSn;
@ApiModelProperty(required = true, value = "商城密码")
/**
* 商城密码
*/
private String signature;
}
/**
* 卖家信息/商户信息
*/
@Data
@ApiModel(value = "卖家信息/商户信息")
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor
@NoArgsConstructor
public static class Seller {
@ApiModelProperty(required = true, value = "商户ID")
/**
* 商户ID
*/
private String merchantId;
@ApiModelProperty(required = true, value = "商户userID")
/**
* 商户userID
*/
private String merchantUserId;
@ApiModelProperty(required = true, value = "角色 固定值(super_admin)")
/**
* 角色 固定值(super_admin)
*/
private String role;
}
/**
* 买家信息
*/
@Data
@ApiModel("买家信息")
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Buyer{
@ApiModelProperty(required = true, value = "买家ID(用户唯一标识)")
public static class Buyer {
/**
* 买家ID(用户唯一标识)
*/
private String buyerId;
}
/**
* 付款人信息
*/
@Data
@ApiModel("付款人信息")
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Payer{
@ApiModelProperty(required = true, value = "付款人ID")
public static class Payer {
/**
* 付款人ID
*/
private String userId;
}
@ApiModel(value = "收单信息")
/**
* 收单信息
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@AllArgsConstructor
@NoArgsConstructor
public static class Acquiring{
@ApiModelProperty(value = "收单号")
public static class Acquiring {
/**
* 收单号
*/
private String acquiringSn;
@ApiModelProperty(value = "收单密钥")
/**
* 收单密钥
*/
private String signature;
}
/**
* 金额构成信息
*/
@Data
@ApiModel(value = "金额构成信息")
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AmountComposition {
@ApiModelProperty(required = true, value = "金额构成项列表")
/**
* 金额构成项列表
*/
private List<CompositionItem> compositionItems;
}
/**
* 金额构成项详情
*/
@Data
@ApiModel(value = "金额构成项详情")
@JsonIgnoreProperties(ignoreUnknown = true)
public static class CompositionItem {
@ApiModelProperty(required = true, value = "构成项类目")
/**
* 构成项类目
*/
private String category;
@ApiModelProperty(required = true, value = "构成项金额")
/**
* 构成项金额
*/
private Long amount;
}
/**
* 订单信息
*/
@Data
@ApiModel(value = "订单信息")
@AllArgsConstructor
@NoArgsConstructor
public static class OrderInfo {
@ApiModelProperty(required = true, value = "订单ID")
/**
* 订单ID
*/
private String sn;
@ApiModelProperty(required = true, value = "订单密码")
/**
* 订单密码
*/
private String signature;
}
......
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 查询券码请求
*/
@Data
@ApiModel(value = "查询券码请求")
public class CouponQueryRequest {
@ApiModelProperty(required = true, value = "应用id", example = "202507xxxxxxx")
/** 应用id */
private String appid;
@ApiModelProperty(required = true, value = "订单信息")
/** 订单信息 */
private CommonRequest.OrderInfo orderID;
@ApiModelProperty(required = true, value = "卖家信息", example = "4")
/** 卖家信息 */
private CommonRequest.Seller seller;
......
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 券退款请求参数
*/
@Data
@ApiModel(value = "券退款请求参数")
public class CouponRefundRequest {
@ApiModelProperty(required = true, value = "应用ID(收钱吧分配的应用id)")
/** 应用ID(收钱吧分配的应用id) */
private String appid;
@ApiModelProperty(required = true, value = "卖家信息")
/** 卖家信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "订单信息")
/** 订单信息 */
private CommonRequest.OrderInfo orderID;
@ApiModelProperty(required = true, value = "申请退款信息不能为空")
/** 申请退款信息不能为空 */
private RefundInfo refundInfo;
@ApiModelProperty(required = false, value = "退款请求id(${AppCode}+id)")
/** 退款请求id(${AppCode}+id) */
private String requestId;
@ApiModelProperty(required = true, value = "退款来源(固定值:EXTERN)")
/** 退款来源(固定值:EXTERN) */
private String requestSource;
@Data
@ApiModel(value = "退款信息")
/**
* 退款信息
*/
@AllArgsConstructor
@NoArgsConstructor
public static class RefundInfo {
@ApiModelProperty(required = true, value = "金额")
/** 金额 */
private Long applyAmount;
@ApiModelProperty(required = true, value = "退款类型(1商品 2金额)")
/** 退款类型(1商品 2金额) */
private Byte type;
@ApiModelProperty(required = false, value = "退款明细(商品必填)")
/** 退款明细(商品必填) */
private List<RefundItem> items;
@ApiModelProperty(required = true, value = "退款原因")
/** 退款原因 */
private String refundReason;
}
@Data
@ApiModel(value = "退款明细商品")
/**
* 退款明细商品
*/
public static class RefundItem {
@ApiModelProperty(required = true, value = "spu")
/** spu */
private String spuId;
@ApiModelProperty(required = true, value = "sku")
/** sku */
private String skuId;
@ApiModelProperty(required = true, value = "标题")
/** 标题 */
private String title;
@ApiModelProperty(required = true, value = "商品图片")
/** 商品图片 */
private String img;
@ApiModelProperty(required = true, value = "数量")
/** 数量 */
private String quantity;
@ApiModelProperty(required = false, value = "退款类型(0正常商品 1自定义商品)")
/** 退款类型(0正常商品 1自定义商品) */
private Byte type;
}
......
package com.liquidnet.common.third.sqb.param.request;
import lombok.Data;
import java.util.List;
/**
* 券码状态同步
*/
@Data
public class CouponStatusSyncRequest {
/** 应用ID(聚合收单唯一ID,需申请) */
private String appid;
/** 券号 */
private List<String> voucherNos;
/** 用户ID(自定义,核销用户id) */
private String redeemMerchantId;
/** 外部单号(${AppCode}+id,AppCode需要分配) */
private String redeemExternalOrderSn;
/** 来源(固定值:EXTERN) */
private String redeemSource;
/** 核销终端号(自定义) */
private String clientSn;
/** 券使用状态(0未核销,1已核销) */
private Byte status;
}
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 创建微信预支付订单请求
*/
@Data
@ApiModel(value = "创建微信预支付订单请求")
public class CreateWechatPrepayOrderRequest {
@ApiModelProperty(required = true, value = "应用id", example = "202507xxxxxxx")
/** 应用id */
private String appid;
@ApiModelProperty(required = true, value = "商户信息")
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "收单号")
/** 收单号 */
private String acquiringSn;
@ApiModelProperty(required = true, value = "收单签名")
/** 收单签名 */
private String signature;
@ApiModelProperty(required = true, value = "支付工具")
/** 支付工具 */
private List<UsingPayTool> usingPayTools;
@ApiModelProperty(required = false, value = "支付环境")
/** 支付环境 */
private PaymentEnv paymentEnv;
@ApiModelProperty(required = true, value = "支付工具签名", notes = "上一步签名")
/** 支付工具签名 */
private String selectedSignature;
@ApiModelProperty(required = true, value = "序列号", notes = "上一步seq")
/** 序列号 */
private String seq;
@Data
@ApiModel(value = "支付工具使用详情")
/**
* 支付工具使用详情
*/
public static class UsingPayTool {
@ApiModelProperty(required = true, value = "支付工具ID")
/** 支付工具ID */
private Long id;
@ApiModelProperty(required = true, value = "支付工具代码")
/** 支付工具代码 */
private Integer payTool;
@ApiModelProperty(required = true, value = "支付模式", example = "4")
/** 支付模式 */
private Integer payMode;
@ApiModelProperty(required = true, value = "支付金额")
/** 支付金额 */
private String amount;
@ApiModelProperty(required = true, value = "金额构成")
/** 金额构成 */
private CommonRequest.AmountComposition amountComposition;
@ApiModelProperty(required = true, value = "用户身份信息", example = "wzwl")
/** 用户身份信息 */
private String identity;
@ApiModelProperty(required = true, value = "支付请求号", notes = "不超过40位")
/** 支付请求号 */
private String requestSn;
@ApiModelProperty(required = true, value = "通道扩展参数", example = "{\"sub_appid\":\"wx36e68952a6\"}")
/** 通道扩展参数 */
private Map<String, Object> channelExt;
}
@Data
@ApiModel(value = "支付环境信息")
/**
* 支付环境信息
*/
public static class PaymentEnv {
@ApiModelProperty(required = false, value = "付款终端ip")
/** 付款终端ip */
private String clientIp;
@ApiModelProperty(required = false, value = "付款经纬度")
/** 付款经纬度 */
private ClientPoi clientPoi;
@ApiModelProperty(required = false, value = "支付入口")
/** 支付入口 */
private String paymentEntry;
}
@Data
@ApiModel(value = "地理位置信息")
/**
* 地理位置信息
*/
public static class ClientPoi {
@ApiModelProperty(required = false, value = "经度信息")
/** 经度信息 */
private String longitude;
@ApiModelProperty(required = false, value = "纬度信息")
/** 纬度信息 */
private String latitude;
}
......
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@ApiModel(value = "商城列表接口")
/**
* 商城列表接口
*/
@Data
public class MallListQueryRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "应用ID", example = "2025912312")
/** 应用ID */
private String appid;
@ApiModelProperty(value = "过滤条件")
/** 过滤条件 */
private Filter filter;
@ApiModelProperty(value = "分页游标")
/** 分页游标 */
private Cursor cursor;
@ApiModelProperty(value = "排序条件")
/** 排序条件 */
private Sort sort;
@Data
@ApiModel("查询过滤条件")
/**
* 查询过滤条件
*/
public static class Filter {
@ApiModelProperty(value = "商户信息")
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(value = "商城行业筛选")
/** 商城行业筛选 */
private List<String> industryCodes;
@ApiModelProperty(value = "商城状态筛选")
/** 商城状态筛选 */
private List<Byte> states;
@ApiModelProperty(value = "商城状态筛选")
/** 商城状态筛选 */
private Byte state;
@ApiModelProperty(value = "创建时间起始")
/** 创建时间起始 */
private String beginDateTime;
@ApiModelProperty(value = "创建时间截止")
/** 创建时间截止 */
private String endDateTime;
}
@Data
@ApiModel("排序规则")
/**
* 排序规则
*/
public static class Sort {
@ApiModelProperty(value = "排序方式: DESC/ASC")
/** 排序方式: DESC/ASC */
private String sort;
@ApiModelProperty(value = "排序字段")
/** 排序字段 */
private String sortField;
}
@Data
@ApiModel("分页游标")
/**
* 分页游标
*/
public static class Cursor {
@ApiModelProperty(value = "游标字段 分页依据的字段(固定为id)")
/** 游标字段 分页依据的字段(固定为id) */
private String cursorField;
@ApiModelProperty(value = "结束游标 上一页的结束游标(首次查询传 null)")
/** 结束游标 上一页的结束游标(首次查询传 null) */
private String endCursor;
@ApiModelProperty(value = "查询数量 每页返回的最大订单数")
/** 查询数量 每页返回的最大订单数 */
private Integer count;
}
}
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 商城列表查询响应数据
*/
@Data
@ApiModel(value = "商城商品查询请求参数")
public class MallProductsQueryRequest {
@ApiModelProperty(value = "应用ID", required = true)
/** 应用ID */
private String appid;
@ApiModelProperty(value = "商户信息", required = true)
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(value = "商城标识", required = true)
/** 商城标识 */
private CommonRequest.Mall mallID;
}
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -14,31 +12,30 @@ import java.util.List;
* @author liquidnet
* @since 2026-03-16
*/
@ApiModel(value = "创建订单")
@Data
public class OrderCreateRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "应用ID(聚合收单唯一ID,需申请)")
/** 应用ID(聚合收单唯一ID,需申请) */
private String appid;
@ApiModelProperty(required = true, value = "商城信息")
/** 商城信息 */
private CommonRequest.Mall mallID;
@ApiModelProperty(required = true, value = "商户信息")
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "结算项ID")
/** 结算项ID */
private String checkoutItemsId;
@ApiModelProperty(required = true, value = "买家信息")
/** 买家信息 */
private CommonRequest.Buyer buyer;
@ApiModelProperty(required = true, value = "请求ID 不超过40位")
/** 请求ID 不超过40位 */
private String requestId;
@ApiModelProperty(required = true, value = "标题 不超过32")
/** 标题 不超过32 */
private String subject;
}
package com.liquidnet.service.goblin.param.shouqianba.request;
package com.liquidnet.common.third.sqb.param.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
......@@ -13,54 +11,55 @@ import java.util.List;
* @author liquidnet
* @since 2026-03-16
*/
@ApiModel(value = "创建结算明细请求参数")
@Data
public class SettlementCreateRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(required = true, value = "应用ID(聚合收单唯一ID,需申请)")
/** 应用ID(聚合收单唯一ID,需申请) */
private String appid;
@ApiModelProperty(required = true, value = "商城信息")
/** 商城信息 */
private CommonRequest.Mall mallID;
@ApiModelProperty(required = true, value = "商户信息")
/** 商户信息 */
private CommonRequest.Seller seller;
@ApiModelProperty(required = true, value = "买家信息")
/** 买家信息 */
private CommonRequest.Buyer buyer;
@ApiModelProperty(required = false, value = "结算明细组(结算条目列表)")
/** 结算明细组(结算条目列表) */
private List<CheckoutItem> checkoutItems;
@ApiModelProperty(required = false, value = "结算总金额(单位:分)")
/** 结算总金额(单位:分) */
private Long amount;
@Data
@ApiModel(value = "结算明细条目")
/**
* 结算明细条目
*/
public static class CheckoutItem{
@ApiModelProperty(required = true, value = "商品识别号(商品唯一标识,如 spuId)")
/** 商品识别号(商品唯一标识,如 spuId) */
private String spuId;
@ApiModelProperty(required = true, value = "规格识别号(SKU唯一标识,如 skuId)")
/** 规格识别号(SKU唯一标识,如 skuId) */
private String skuId;
@ApiModelProperty(required = true, value = "单价(单位:分)")
/** 单价(单位:分) */
private Long price;
@ApiModelProperty(required = true, value = "购买数量")
/** 购买数量 */
private String quantity;
@ApiModelProperty(required = true, value = "商品类型(0 正常商品 1 自定义商品)")
/** 商品类型(0 正常商品 1 自定义商品) */
private Byte type;
@ApiModelProperty(required = true, value = "商品标题")
/** 商品标题 */
private String title;
@ApiModelProperty(required = true, value = "商品图片链接")
/** 商品图片链接 */
private String image;
}
}
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.AcquiringCreateData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.AcquiringCreateData;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 创建收单响应参数
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "创建收单响应参数")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class AcquiringCreateResponse extends BaseResponse<AcquiringCreateData> {
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 收钱吧基础响应参数
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "收钱吧基础响应参数")
public class BaseResponse<T> {
@ApiModelProperty(value = "是否成功(true-成功,false-失败)")
/** 是否成功(true-成功,false-失败) */
private Boolean success;
@ApiModelProperty(value = "业务码(200-成功,4001等-失败码)")
/** 业务码(200-成功,4001等-失败码) */
private String code;
@ApiModelProperty(value = "失败信息(success为false时返回失败原因描述)")
/** 失败信息(success为false时返回失败原因描述) */
private String msg;
@ApiModelProperty(value = "data")
/** data */
private T data;
}
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.CashierQueryData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.CashierQueryData;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 自助收银查询响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "自助收银查询响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CashierQueryResponse extends BaseResponse<CashierQueryData>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.CouponQueryData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 券详情查询响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "券详情查询响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CouponQueryResponse extends BaseResponse<CouponQueryData>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.CouponRefundData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.CouponRefundData;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 券退款响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "券退款响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CouponRefundResponse extends BaseResponse<CouponRefundData>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 券状态变更响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "券状态变更响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CouponStatusSyncResponse extends BaseResponse<String>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.CreateWechatPrepayOrderData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.CreateWechatPrepayOrderData;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 创建微信预支付订单响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "创建微信预支付订单响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreateWechatPrepayOrderResponse extends BaseResponse<CreateWechatPrepayOrderData>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallListQueryData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.MallListQueryData;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 商城列表查询响应参数
*/
@EqualsAndHashCode(callSuper = true)
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "商城列表查询响应参数")
public class MallListQueryResponse extends BaseResponse<List<MallListQueryData>> {
}
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallProductsQueryData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.MallProductsQueryData;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 商城商品接口响应
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "商城商品接口响应")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class MallProductsQueryResponse extends BaseResponse<List<MallProductsQueryData>>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.OrderCreateData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.OrderCreateData;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -13,7 +13,6 @@ import lombok.EqualsAndHashCode;
* @since 2026-03-16
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "创建订单响应参数")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderCreateResponse extends BaseResponse<OrderCreateData>{
......
package com.liquidnet.service.goblin.param.shouqianba.response;
package com.liquidnet.common.third.sqb.param.response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.response.data.SettlementCreateData;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.response.data.SettlementCreateData;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -13,7 +13,6 @@ import lombok.EqualsAndHashCode;
* @since 2026-03-16
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "创建结算明细响应参数")
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SettlementCreateResponse extends BaseResponse<SettlementCreateData> {
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.request.CommonRequest;
import io.swagger.annotations.ApiModel;
import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 创建收单Data
*/
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "创建收单Data")
@JsonIgnoreProperties(ignoreUnknown = true)
public class AcquiringCreateData extends CommonRequest.Acquiring {
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.request.CommonRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import lombok.Data;
import java.util.List;
/**
* 收银台查询Data
*/
@Data
@ApiModel(value = "收银台查询Data")
@JsonIgnoreProperties(ignoreUnknown = true)
public class CashierQueryData {
@ApiModelProperty(value = "支付工具列表")
/** 支付工具列表 */
private List<PayTool> payTools;
@ApiModelProperty(value = "已选中的支付工具签名")
/** 已选中的支付工具签名 */
private String selectedSignature;
@ApiModelProperty(value = "全局提示")
/** 全局提示 */
private List<String> globalTips;
@ApiModelProperty(value = "响应唯一序列号")
/** 响应唯一序列号 */
private String seq;
@ApiModelProperty(value = "收单金额")
/** 收单金额 */
private Long amount;
@ApiModelProperty(value = "收款方信息")
/** 收款方信息 */
private Payee payee;
@ApiModelProperty(value = "业务信息")
/** 业务信息 */
private BizInfo bizInfo;
@ApiModelProperty(value = "金额模型")
/** 金额模型 */
private CashierAmount cashierAmount;
@Data
@ApiModel(value = "支付工具详情")
/**
* 支付工具详情
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class PayTool {
@ApiModelProperty(value = "支付工具id")
/** 支付工具id */
private Long id;
@ApiModelProperty(value = "支付工具代码")
/** 支付工具代码 */
private String code;
@ApiModelProperty(value = "支付工具名称")
/** 支付工具名称 */
private String name;
@ApiModelProperty(value = "支付工具类型 (0表示微信)")
/** 支付工具类型 (0表示微信) */
private Integer type;
@ApiModelProperty(value = "是否可选")
/** 是否可选 */
private Boolean selectable;
@ApiModelProperty(value = "是否选中")
/** 是否选中 */
private Boolean selected;
@ApiModelProperty(value = "展示金额")
/** 展示金额 */
private Long showAmount;
@ApiModelProperty(value = "提示列表")
/** 提示列表 */
private List<String> tips;
@ApiModelProperty(value = "金额构成")
/** 金额构成 */
private CommonRequest.AmountComposition amountComposition;
}
@Data
@ApiModel(value = "收款方信息")
/**
* 收款方信息
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Payee {
@ApiModelProperty(value = "商户id")
/** 商户id */
private String merchantId;
@ApiModelProperty(value = "商户名称")
/** 商户名称 */
private String merchantName;
@ApiModelProperty(value = "门店id")
/** 门店id */
private String storeId;
@ApiModelProperty(value = "门店名称")
/** 门店名称 */
private String storeName;
@ApiModelProperty(value = "终端号")
/** 终端号 */
private String terminalSn;
}
@Data
@ApiModel(value = "业务信息")
/**
* 业务信息
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class BizInfo {
@ApiModelProperty(value = "业务方")
/** 业务方 */
private String bizParty;
@ApiModelProperty(value = "交易应用")
/** 交易应用 */
private String tradeApp;
}
@Data
@ApiModel(value = "金额明细模型")
/**
* 金额明细模型
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class CashierAmount {
@ApiModelProperty(value = "原始支付金额")
/** 原始支付金额 */
private Long oriPaymentAmount;
@ApiModelProperty(value = "实际支付金额")
/** 实际支付金额 */
private Long discPaymentAmount;
@ApiModelProperty(value = "优惠金额")
/** 优惠金额 */
private Long discAmount;
}
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "查询券码响应Data")
/**
* 查询券码响应Data
*/
public class CouponQueryData {
@ApiModelProperty(value = "券名称")
/** 券名称 */
private String voucherName;
@ApiModelProperty(value = "商品SPU")
/** 商品SPU */
private String spuId;
@ApiModelProperty(value = "商品SKU")
/** 商品SKU */
private String skuId;
@ApiModelProperty(value = "商品地址")
/** 商品地址 */
private String itemImageUrl;
@ApiModelProperty(value = "券二维码")
/** 券二维码 */
private String url;
@ApiModelProperty(value = "券号")
/** 券号 */
private String voucherNo;
@ApiModelProperty(value = "券类型 0金额券 1商品券")
/** 券类型 0金额券 1商品券 */
private Byte type;
@ApiModelProperty(value = "券状态 0未核销 1已核销 2未核销退款 3已核销退款中 4未核销退款完成 5已核销退款完成 6已失效")
/** 券状态 0未核销 1已核销 2未核销退款 3已核销退款中 4未核销退款完成 5已核销退款完成 6已失效 */
private Byte status;
@ApiModelProperty(value = "操作时间")
/** 操作时间 */
private String operationTime;
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 券退款响应结果
*/
@Data
@ApiModel(value = "券退款响应结果")
@JsonIgnoreProperties(ignoreUnknown = true)
public class CouponRefundData {
@ApiModelProperty(value = "退款单号")
/** 退款单号 */
private String ticketsSn;
@ApiModelProperty(value = "单号密码")
/** 单号密码 */
private String ticketSignature;
}
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 创建微信预支付订单响应
*/
@Data
@ApiModel(value = "创建微信预支付订单响应")
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreateWechatPrepayOrderData {
@ApiModelProperty(value = "收单号")
/** 收单号 */
private String acquiringSn;
@ApiModelProperty(value = "收单签名")
/** 收单签名 */
private String signature;
@ApiModelProperty(value = "收单状态", notes = "0:已创建, 1:待支付, 2:部分支付成功, 3:全部支付成功, 4:已部分退款, 5:已全额退款, 6:已关闭")
/** 收单状态 */
private Byte acquiringState;
@ApiModelProperty(value = "金额明细")
/** 金额明细 */
private AmountDetails amount;
@ApiModelProperty(value = "支付凭证", notes = "用于唤起微信支付")
/** 支付凭证 */
private PaymentVoucher paymentVoucher;
@ApiModelProperty(value = "通道信息")
/** 通道信息 */
private ChannelInfo channelInfo;
@Data
@ApiModel(value = "订单金额明细")
/**
* 订单金额明细
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AmountDetails {
@ApiModelProperty(value = "收单总金额")
/** 收单总金额 */
private Long totalAmount;
@ApiModelProperty(value = "已付总金额")
/** 已付总金额 */
private Long paidAmount;
@ApiModelProperty(value = "已退总金额")
/** 已退总金额 */
private Long refundedAmount;
}
@Data
@ApiModel(value = "支付凭证详情")
/**
* 支付凭证详情
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class PaymentVoucher {
@ApiModelProperty(value = "时间戳")
/** 时间戳 */
private String timeStamp;
@ApiModelProperty(value = "订单详情扩展字符串")
/** 订单详情扩展字符串 */
private String packageStr;
@ApiModelProperty(value = "签名")
/** 签名 */
private String paySign;
@ApiModelProperty(value = "Appid")
/** Appid */
private String appId;
@ApiModelProperty(value = "签名方式")
/** 签名方式 */
private String signType;
@ApiModelProperty(value = "随机字符串")
/** 随机字符串 */
private String nonceStr;
}
@Data
@ApiModel(value = "通道信息详情")
/**
* 通道信息详情
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ChannelInfo {
@ApiModelProperty(value = "收钱吧通道流水号")
/** 收钱吧通道流水号 */
private String payTsn;
}
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 商城列表查询响应数据
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "商城列表查询响应数据")
public class MallListQueryData {
@ApiModelProperty("商城编号")
/** 商城编号 */
private String mallSn;
@ApiModelProperty("商城签名")
/** 商城签名 */
private String signature;
@ApiModelProperty("商城名称")
/** 商城名称 */
private String mallName;
@ApiModelProperty("商城状态 0:待上线 1:已上线 2:已下线")
/** 商城状态 0:待上线 1:已上线 2:已下线 */
private Byte state;
@ApiModelProperty("商城状态描述")
/** 商城状态描述 */
private String stateDesc;
@ApiModelProperty("内部状态 1启用 0禁用")
/** 内部状态 1启用 0禁用 */
private Byte internalState;
@ApiModelProperty("内部状态描述")
/** 内部状态描述 */
private String internalStateDesc;
@ApiModelProperty("删除状态 0未删除 1已删除")
/** 删除状态 0未删除 1已删除 */
private Byte isDelete;
@ApiModelProperty("删除时间")
/** 删除时间 */
private String deleteTime;
@ApiModelProperty("大额开通状态")
/** 大额开通状态 */
private Byte crossCityPaymentStatus;
@ApiModelProperty("大额开通状态描述")
/** 大额开通状态描述 */
private String crossCityPaymentStatusDesc;
@ApiModelProperty("应用类型 0拼塔商城 目前都是0,无需关注")
/** 应用类型 0拼塔商城 目前都是0,无需关注 */
private Integer appType;
@ApiModelProperty("行业code")
/** 行业code */
private String industryCode;
@ApiModelProperty("商户信息")
/** 商户信息 */
private Seller seller;
@ApiModelProperty("订单统计")
/** 订单统计 */
private OrderStatistics orderStatistics;
@ApiModelProperty("商户统计")
/** 商户统计 */
private SellerStatisticsModel sellerStatisticsModel;
@ApiModelProperty("创建时间")
/** 创建时间 */
private String ctime;
@ApiModelProperty("跨城状态明细")
/** 跨城状态明细 */
private List<CrossCityPayment> crossCityPayments;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel("商户信息")
/**
* 商户信息
*/
public static class Seller {
@ApiModelProperty("商户号")
/** 商户号 */
private String merchantSn;
@ApiModelProperty("商户id")
/** 商户id */
private String merchantId;
@ApiModelProperty("商户名称")
/** 商户名称 */
private String merchantName;
@ApiModelProperty("门店号")
/** 门店号 */
private String storeSn;
@ApiModelProperty("门店id")
/** 门店id */
private String storeId;
@ApiModelProperty("门店名称")
/** 门店名称 */
private String storeName;
@ApiModelProperty("终端号")
/** 终端号 */
private String terminalSn;
@ApiModelProperty("大额终端编号")
/** 大额终端编号 */
private String crossCityTerminalSn;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel("订单统计")
/**
* 订单统计
*/
public static class OrderStatistics {
@ApiModelProperty("订单数量")
/** 订单数量 */
private Long totalNum;
@ApiModelProperty("商品数量")
/** 商品数量 */
private String totalQuantity;
@ApiModelProperty("订单总额(分)")
/** 订单总额(分) */
private Long totalAmount;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel("商户统计")
/**
* 商户统计
*/
public static class SellerStatisticsModel {
@ApiModelProperty("异地交易失败订单数量")
/** 异地交易失败订单数量 */
private Long orderFailNum;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel("跨城支付明细")
/**
* 跨城支付明细
*/
public static class CrossCityPayment {
@ApiModelProperty("支付工具code 2:支付宝 3:微信")
/** 支付工具code 2:支付宝 3:微信 */
private Byte payToolCode;
@ApiModelProperty("支付工具描述")
/** 支付工具描述 */
private String payToolCodeDesc;
@ApiModelProperty("大额开通状态")
/** 大额开通状态 */
private Integer status;
@ApiModelProperty("大额开通状态描述")
/** 大额开通状态描述 */
private String statusDesc;
}
}
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 商城商品接口响应数据
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "商城商品接口响应数据")
public class MallProductsQueryData {
@ApiModelProperty(value = "商品spuId")
/** 商品spuId */
private String spuId;
@ApiModelProperty(value = "商品图片")
/** 商品图片 */
private List<String> converImages;
@ApiModelProperty(value = "商品描述")
/** 商品描述 */
private String productIntroduction;
@ApiModelProperty(value = "商品标题")
/** 商品标题 */
private String title;
@ApiModelProperty(value = "商品规格")
/** 商品规格 */
private List<Sku> skuResults;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "商品规格")
/**
* 商品规格
*/
public static class Sku {
@ApiModelProperty(value = "库存类型")
/** 库存类型 */
private Integer stockType;
@ApiModelProperty(value = "商品skuId")
/** 商品skuId */
private String skuId;
@ApiModelProperty(value = "库存值")
/** 库存值 */
private BigDecimal quantity;
@ApiModelProperty(value = "规格标题")
/** 规格标题 */
private String skuTitle;
@ApiModelProperty(value = "规格名称")
/** 规格名称 */
private String skuName;
@ApiModelProperty(value = "价格")
/** 价格 */
private Long price;
}
}
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.liquidnet.service.goblin.param.shouqianba.request.CommonRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import lombok.Data;
/**
* 收钱吧创建订单响应参数Data
*/
@Data
@ApiModel(value = "收钱吧创建订单响应参数Data")
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderCreateData {
@ApiModelProperty(value = "订单编号)")
/** 订单编号) */
private String orderSn;
@ApiModelProperty(value = "订单密钥)")
/** 订单密钥) */
private String orderSignature;
@ApiModelProperty(value = "收单信息)")
/** 收单信息) */
private CommonRequest.Acquiring acquiring;
......
package com.liquidnet.service.goblin.param.shouqianba.response.data;
package com.liquidnet.common.third.sqb.param.response.data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Data;
/**
* 收钱吧创建结算明细响应参数Data
*/
@Data
@ApiModel(value = "收钱吧创建结算明细响应参数Data")
@JsonIgnoreProperties(ignoreUnknown = true)
public class SettlementCreateData {
@ApiModelProperty(value = "结算项ID)")
/** 结算项ID) */
private String checkoutItemsId;
}
......@@ -16,5 +16,6 @@
<module>liquidnet-common-third-zxlnft</module>
<module>liquidnet-common-third-antchain</module>
<module>liquidnet-common-third-xuper</module>
<module>liquidnet-common-third-sqb</module>
</modules>
</project>
......@@ -109,6 +109,12 @@
<artifactId>dg-java-sdk</artifactId>
<version>3.0.27</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-third-sqb</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
......
......@@ -3,20 +3,17 @@ package com.liquidnet.service.goblin.controller;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbCouponVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderCreateVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderDetailVo;
import com.liquidnet.service.goblin.service.IGoblinSqbOrderService;
import com.liquidnet.service.goblin.service.IGoblinSqbService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 收钱吧订单 Controller
......@@ -24,51 +21,12 @@ import javax.validation.constraints.NotNull;
@Slf4j
@Api(tags = "收钱吧订单")
@RestController
@RequestMapping("/goblin/sqb/order")
public class GoblinSqbOrderController {
@RequestMapping("/goblin/sqb")
public class GoblinSqbController {
@Autowired
private IGoblinSqbOrderService goblinSqbOrderService;
private IGoblinSqbService goblinSqbService;
/**
* 创建收钱吧订单
*/
@PostMapping("/create")
@ApiOperation("创建收钱吧订单")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "spuId", value = "商品 SPU ID"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "skuId", value = "商品 SKU ID"),
@ApiImplicitParam(type = "form", required = true, dataType = "Integer", name = "quantity", value = "购买数量", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "performancesId", value = "关联演出 ID"),
})
public ResponseDto<GoblinSqbOrderCreateVo> createOrder(
@NotBlank(message = "spuId 不能为空") @RequestParam("spuId") String spuId,
@NotBlank(message = "skuId 不能为空") @RequestParam("skuId") String skuId,
@NotNull(message = "quantity 不能为空")
@Min(value = 1, message = "购买数量至少为 1") @RequestParam("quantity") Integer quantity,
@NotBlank(message = "performancesId 不能为空") @RequestParam("performancesId") String performancesId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧下单] 接收请求 userId={}, spuId={}, skuId={}, quantity={}, performancesId={}",
userId, spuId, skuId, quantity, performancesId);
return goblinSqbOrderService.createOrder(userId, spuId, skuId, quantity, performancesId);
}
/**
* 查询支付状态
*/
@GetMapping("/pay/status")
@ApiOperation("查询支付状态")
@ApiImplicitParam(type = "query", required = true, dataType = "String", name = "orderId", value = "本地订单ID")
public ResponseDto<Integer> queryPayStatus(
@NotBlank(message = "orderId 不能为空") @RequestParam("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧支付状态] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.queryPayStatus(userId, orderId);
}
/**
* 获取核销二维码(券码)
......@@ -82,7 +40,7 @@ public class GoblinSqbOrderController {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧券码] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.queryCoupon(userId, orderId);
return goblinSqbService.queryCoupon(userId, orderId);
}
/**
......@@ -97,9 +55,10 @@ public class GoblinSqbOrderController {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧退款] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.refund(userId, orderId);
return goblinSqbService.refund(userId, orderId);
}
/**
* 主动同步核销状态
*/
......@@ -110,7 +69,7 @@ public class GoblinSqbOrderController {
@NotBlank(message = "orderId 不能为空") @RequestParam("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧核销同步] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.syncCouponStatus(userId, orderId);
return goblinSqbService.syncCouponStatus(userId, orderId);
}
/**
......@@ -118,10 +77,10 @@ public class GoblinSqbOrderController {
*/
@GetMapping("/list")
@ApiOperation("用户收钱吧订单列表")
public ResponseDto<java.util.List<GoblinSqbOrderDetailVo>> getOrderList() {
public ResponseDto<List<GoblinSqbOrderDetailVo>> getOrderList() {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧订单列表] 接收请求 userId={}", userId);
return goblinSqbOrderService.getOrderList(userId);
return goblinSqbService.getOrderList(userId);
}
/**
......@@ -134,19 +93,8 @@ public class GoblinSqbOrderController {
@NotBlank(message = "orderId 不能为空") @PathVariable("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧订单详情] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.getOrderDetail(userId, orderId);
return goblinSqbService.getOrderDetail(userId, orderId);
}
/**
* 再次付款(待支付状态下重新拉起微信支付)
*/
@PostMapping("/repay")
@ApiOperation("再次付款")
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "本地订单ID")
public ResponseDto<GoblinSqbOrderCreateVo> repay(
@NotBlank(message = "orderId 不能为空") @RequestParam("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧再次付款] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.repay(userId, orderId);
}
}
package com.liquidnet.service.goblin.controller.Inner;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.service.IGoblinSqbOrderService;
import com.liquidnet.service.goblin.service.IGoblinSqbService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -29,12 +29,12 @@ import org.springframework.web.bind.annotation.RestController;
public class GoblinSqbJobController {
@Autowired
private IGoblinSqbOrderService goblinSqbOrderService;
private IGoblinSqbService goblinSqbService;
@PostMapping("/autoRefund")
@ApiOperation("演出结束自动退款")
public ResponseDto<String> autoRefund(@RequestParam("performancesId") String performancesId) {
log.info("[收钱吧自动退款] 收到任务,performancesId={}", performancesId);
return goblinSqbOrderService.autoRefundByPerformance(performancesId);
return goblinSqbService.autoRefundByPerformance(performancesId);
}
}
......@@ -2,6 +2,8 @@ package com.liquidnet.service.goblin.controller.manage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.liquidnet.common.third.sqb.biz.SqbBiz;
import com.liquidnet.common.third.sqb.param.response.data.MallProductsQueryData;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ErrorMapping;
......@@ -13,8 +15,6 @@ import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSpecVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo;
import com.liquidnet.service.goblin.entity.GoblinSqbGoodsExt;
import com.liquidnet.service.goblin.mapper.GoblinSqbGoodsExtMapper;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallProductsQueryData;
import com.liquidnet.service.goblin.service.IGoblinShouQianBaService;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtSqbGoodsService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.ObjectUtil;
......@@ -51,7 +51,7 @@ public class GoblinStoreMgtSqbGoodsController {
@Autowired
private GoblinSqbGoodsExtMapper goblinSqbGoodsExtMapper;
@Autowired
private IGoblinShouQianBaService goblinShouQianBaService;
private SqbBiz goblinShouQianBaService;
/**
* 查询所有商城及商品列表
......
package com.liquidnet.service.goblin.service.impl.manage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.liquidnet.common.third.sqb.biz.SqbBiz;
import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import com.liquidnet.common.third.sqb.param.request.MallListQueryRequest;
import com.liquidnet.common.third.sqb.param.request.MallProductsQueryRequest;
import com.liquidnet.common.third.sqb.param.response.data.MallListQueryData;
import com.liquidnet.common.third.sqb.param.response.data.MallProductsQueryData;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.config.properties.ShouqianbaProperties;
import com.liquidnet.service.goblin.dto.GoblinGoodsSpecDto;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsSqbAddParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinSqbGoodsExt;
import com.liquidnet.service.goblin.mapper.GoblinSqbGoodsExtMapper;
import com.liquidnet.service.goblin.param.shouqianba.request.CommonRequest;
import com.liquidnet.service.goblin.param.shouqianba.request.MallListQueryRequest;
import com.liquidnet.service.goblin.param.shouqianba.request.MallProductsQueryRequest;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallListQueryData;
import com.liquidnet.service.goblin.param.shouqianba.response.data.MallProductsQueryData;
import com.liquidnet.service.goblin.service.IGoblinShouQianBaService;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtSqbGoodsService;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.ObjectUtil;
import com.liquidnet.service.goblin.util.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -51,9 +49,8 @@ public class GoblinStoreMgtSqbGoodsServiceImpl implements IGoblinStoreMgtSqbGood
@Autowired
GoblinSqbGoodsExtMapper goblinSqbGoodsExtMapper;
@Autowired
private IGoblinShouQianBaService goblinShouQianBaService;
@Autowired
private ShouqianbaProperties shouqianbaProperties;
private SqbBiz goblinShouQianBaService;
@Override
public ResponseDto<List<GoblinSqbPerfGoodsVo>> getProductList() {
......@@ -114,7 +111,7 @@ public class GoblinStoreMgtSqbGoodsServiceImpl implements IGoblinStoreMgtSqbGood
String lastMallSn = null;
while (true) {
MallListQueryRequest mallRequest = new MallListQueryRequest();
mallRequest.setAppid(shouqianbaProperties.getAppId());
mallRequest.setAppid(goblinShouQianBaService.getSqbConfig().getAppId());
MallListQueryRequest.Filter filter = new MallListQueryRequest.Filter();
filter.setSeller(buildSeller());
mallRequest.setFilter(filter);
......@@ -148,7 +145,7 @@ public class GoblinStoreMgtSqbGoodsServiceImpl implements IGoblinStoreMgtSqbGood
*/
private List<MallProductsQueryData> fetchAllProducts(MallListQueryData mall) {
MallProductsQueryRequest productRequest = new MallProductsQueryRequest();
productRequest.setAppid(shouqianbaProperties.getAppId());
productRequest.setAppid(goblinShouQianBaService.getSqbConfig().getAppId());
productRequest.setSeller(buildSeller());
CommonRequest.Mall mallId = new CommonRequest.Mall();
mallId.setMallSn(mall.getMallSn());
......@@ -159,9 +156,9 @@ public class GoblinStoreMgtSqbGoodsServiceImpl implements IGoblinStoreMgtSqbGood
}
private CommonRequest.Seller buildSeller() {
CommonRequest.Seller seller = new CommonRequest.Seller();
seller.setMerchantId(shouqianbaProperties.getMerchantId());
seller.setMerchantUserId(shouqianbaProperties.getMerchantUserId());
seller.setRole(shouqianbaProperties.getRole());
seller.setMerchantId(goblinShouQianBaService.getSqbConfig().getMerchantId());
seller.setMerchantUserId(goblinShouQianBaService.getSqbConfig().getMerchantUserId());
seller.setRole(goblinShouQianBaService.getSqbConfig().getRole());
return seller;
}
......
package com.liquidnet.service.goblin.util;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo;
import lombok.extern.slf4j.Slf4j;
......@@ -73,4 +74,18 @@ public class GoblinSqbRedisUtils {
String key = GoblinRedisConst.SQB_ORDER_LOCK.concat(userId).concat(":").concat(skuId);
redisUtil.uLock(key);
}
// 获取 收钱吧订单id列表
public List<String> getSqbOrderList(String uid) {
String redisKey = GoblinRedisConst.SQB_GOBLIN_ORDER_LIST.concat(uid);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
}
......@@ -193,8 +193,9 @@ goblin_nft_order.update_artwork=UPDATE goblin_nft_order SET artwork_id=? WHERE o
goblin_sku.stock=UPDATE goblin_goods_sku SET sku_stock = ? , stock = ?, updated_at = ? WHERE sku_erp_code = ? and erp_warehouse_no = ?
#----
candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,operator=?,updated_at=? WHERE ucoupon_id=?
#----
#----
# ----- \u6536\u94B1\u5427 ----
goblin_sqb_order.insert=INSERT INTO goblin_sqb_order (order_id,user_id,performances_id,spu_id,sku_id,quantity,amount,sqb_order_sn,sqb_order_signature,sqb_acquiring_sn, sqb_acquiring_sign,sqb_checkout_items_id,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
# ---- \u624B\u73AF\u8BA2\u5355 ----
goblin_bracelet_order_insert = INSERT INTO `goblin_bracelet_order`(`order_id`, `user_id`, `bind_name`, `bind_mobile`, `bind_idcard`, `req_date`, `goods_desc`, `wristband_id`, `wristband_price`, `amount_id`, `amount_price`, `req_seq_id`, `hf_seq_id`, `trade_type`, `party_order_id`, `price`, `price_total`, `price_refund`, `refund_price_charges`, `refund_number`, `status`, `pay_status`, `created_at`, `updated_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
gpblin_bracelet_order_update= update goblin_bracelet_order set out_trans_id=?, end_time=?, acct_date=?, price_actual=?, time_pay=?, status=?, pay_status=?, updated_at=? where order_id=?
......
......@@ -76,6 +76,12 @@
<scope>system</scope>
<systemPath>${basedir}/lib/taobao-sdk-java-auto_1600401599540-20210607-impl.jar</systemPath>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-third-sqb</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
......
package com.liquidnet.service.goblin.controller;
package com.liquidnet.service.order.controller;
import com.liquidnet.common.third.sqb.biz.SqbBiz;
import com.liquidnet.common.third.sqb.param.callback.CallbackParams;
import com.liquidnet.common.third.sqb.param.callback.CouponCallbackContent;
import com.liquidnet.common.third.sqb.param.callback.OrderCallbackContent;
import com.liquidnet.common.third.sqb.param.callback.RefundCallbackContent;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.param.shouqianba.callback.CallbackParams;
import com.liquidnet.service.goblin.param.shouqianba.callback.CouponCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.OrderCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.RefundCallbackContent;
import com.liquidnet.service.goblin.service.IGoblinShouQianBaService;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.manage.GoblinSqbOrderParam;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderCreateVo;
import com.liquidnet.service.goblin.service.IGoblinSqbOrderService;
import com.liquidnet.service.goblin.service.IGoblinSqbService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
@Slf4j
@Api(tags = "收钱吧相关")
@Api(tags = "商城-收钱吧支付相关")
@RestController
@RequestMapping("/sqb")
public class GoblinShouqianbaController {
@RequestMapping("/goblin/sqb")
public class GoblinSqbOrderController {
@Autowired
private IGoblinShouQianBaService shouQianBaService;
private IGoblinSqbOrderService goblinSqbOrderService;
@Autowired
private IGoblinSqbOrderService sqbOrderService;
private SqbBiz sqbBiz;
/**
* 创建收钱吧订单
*/
@PostMapping("/pre")
@ApiOperation("创建收钱吧下单")
public ResponseDto<GoblinSqbOrderCreateVo> preOrder(EncryptedReq<GoblinSqbOrderParam> param) {
String userId = CurrentUtil.getCurrentUid();
GoblinSqbOrderParam orderParam = param.getData();
return goblinSqbOrderService.createOrder(userId, orderParam);
}
/**
* 查询支付状态
*/
@GetMapping("/pay/status")
@ApiOperation("查询支付状态")
@ApiImplicitParam(type = "query", required = true, dataType = "String", name = "orderId", value = "本地订单ID")
public ResponseDto<Integer> queryPayStatus(
@NotBlank(message = "orderId 不能为空") @RequestParam("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧支付状态] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.queryPayStatus(userId, orderId);
}
/**
* 再次付款(待支付状态下重新拉起微信支付)
*/
@PostMapping("/repay")
@ApiOperation("再次付款")
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "本地订单ID")
public ResponseDto<GoblinSqbOrderCreateVo> repay(
@NotBlank(message = "orderId 不能为空") @RequestParam("orderId") String orderId) {
String userId = CurrentUtil.getCurrentUid();
log.info("[收钱吧再次付款] 接收请求 userId={}, orderId={}", userId, orderId);
return goblinSqbOrderService.repay(userId, orderId);
}
//******************************** 回调相关 *******************************
@ApiOperation("下单回调")
@PostMapping("/order/callback")
public ResponseDto<String> orderCallback(@RequestBody CallbackParams callbackParams) {
......@@ -36,7 +82,7 @@ public class GoblinShouqianbaController {
log.error("下单回调参数为空");
return ResponseDto.failure("下单回调参数为空");
}
boolean verified = shouQianBaService.verifySignature(callbackParams);
boolean verified = sqbBiz.verifySignature(callbackParams);
if (!verified) {
log.error("下单回调验签失败");
return ResponseDto.failure("验签失败");
......@@ -45,7 +91,7 @@ public class GoblinShouqianbaController {
OrderCallbackContent orderCallbackContent = JsonUtils.fromJson(callbackParams.getContent(), OrderCallbackContent.class);
log.info("下单回调content: {}", callbackParams.getContent());
// 业务
return sqbOrderService.handlePayCallback(orderCallbackContent);
return goblinSqbOrderService.handlePayCallback(orderCallbackContent);
}
@ApiOperation("退款回调")
......@@ -55,7 +101,7 @@ public class GoblinShouqianbaController {
log.error("退款回调参数为空");
return ResponseDto.failure("退款回调参数为空");
}
boolean verified = shouQianBaService.verifySignature(callbackParams);
boolean verified = sqbBiz.verifySignature(callbackParams);
if (!verified) {
log.error("退款回调验签失败");
return ResponseDto.failure("验签失败");
......@@ -64,7 +110,7 @@ public class GoblinShouqianbaController {
RefundCallbackContent refundCallbackContent = JsonUtils.fromJson(callbackParams.getContent(), RefundCallbackContent.class);
log.info("退款回调content: {}", callbackParams.getContent());
// 业务
return sqbOrderService.handleRefundCallback(refundCallbackContent);
return goblinSqbOrderService.handleRefundCallback(refundCallbackContent);
}
@ApiOperation("券状态回调")
......@@ -74,7 +120,7 @@ public class GoblinShouqianbaController {
log.error("券状态回调参数为空");
return ResponseDto.failure("券状态回调参数为空");
}
boolean verified = shouQianBaService.verifySignature(callbackParams);
boolean verified = sqbBiz.verifySignature(callbackParams);
if (!verified) {
log.error("券状态回调验签失败");
return ResponseDto.failure("验签失败");
......@@ -84,7 +130,6 @@ public class GoblinShouqianbaController {
log.info("券状态回调content: {}", callbackParams.getContent());
// 业务
return sqbOrderService.handleCouponCallback(callbackContent);
return goblinSqbOrderService.handleCouponCallback(callbackContent);
}
}
package com.liquidnet.service.order.utils;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 收钱吧相关 Redis 操作封装
*/
@Slf4j
@Component
public class GoblinSqbRedisUtils {
@Autowired
private RedisUtil redisUtil;
/* ---------------------------------------- 订单操作(TTL 2h) ---------------------------------------- */
public void setSqbOrder(String orderId, GoblinSqbOrderVo vo) {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo, RedisKeyExpireConst.SQB_ORDER_EXPIRE);
}
public GoblinSqbOrderVo getSqbOrder(String orderId) {
return (GoblinSqbOrderVo) redisUtil.get(GoblinRedisConst.SQB_ORDER.concat(orderId));
}
public void delSqbOrder(String orderId) {
redisUtil.del(GoblinRedisConst.SQB_ORDER.concat(orderId));
}
/* ---------------------------------------- 演出关联商品缓存(TTL 5min) ---------------------------------------- */
public void setPerfGoods(String performancesId, List<GoblinSqbPerfGoodsVo> list) {
redisUtil.set(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId), list, RedisKeyExpireConst.SQB_PERFORMANCE_GOODS_EXPIRE);
}
public List<GoblinSqbPerfGoodsVo> getPerfGoods(String performancesId) {
return (List<GoblinSqbPerfGoodsVo>) redisUtil.get(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId));
}
public void delPerfGoods(String performancesId) {
redisUtil.del(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId));
}
/* ---------------------------------------- 下单防重锁(TTL 10s) ---------------------------------------- */
/**
* 尝试获取下单防重锁
*
* @param userId 用户ID
* @param skuId SKU ID
* @return true 获取成功,false 已被锁定
*/
public boolean tryOrderLock(String userId, String skuId) {
String key = GoblinRedisConst.SQB_ORDER_LOCK.concat(userId).concat(":").concat(skuId);
return redisUtil.lock(key, 1, RedisKeyExpireConst.SQB_ORDER_LOCK_EXPIRE);
}
/**
* 释放下单防重锁
*
* @param userId 用户ID
* @param skuId SKU ID
*/
public void releaseOrderLock(String userId, String skuId) {
String key = GoblinRedisConst.SQB_ORDER_LOCK.concat(userId).concat(":").concat(skuId);
redisUtil.uLock(key);
}
/**
* 添加用户 收钱吧订单列表
* @param userId
* @param orderId
*/
public void addSqbOrderList(String userId, String orderId) {
String redisKey = GoblinRedisConst.SQB_GOBLIN_ORDER_LIST.concat(userId);
List<String> list = getSqbOrderList(userId);
if (list.size() >= 40) {
list.remove(0);
list.add(orderId);
} else {
list.add(orderId);
}
redisUtil.set(redisKey, list);
}
/**
* 获取 收钱吧订单id列表
* @param uid
* @return
*/
public List<String> getSqbOrderList(String uid) {
String redisKey = GoblinRedisConst.SQB_GOBLIN_ORDER_LIST.concat(uid);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
}
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