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

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

Merge remote-tracking branch 'origin/master' into dev_user_refund

parents b3a71150 92bb4c12
......@@ -356,6 +356,20 @@ public class GoblinRedisConst {
public static final String GOBLIN_MIX_RESERVE_UID = PREFIX.concat("mix:reserve:uid:");//$mixId:$uid 混合售用户预约保存
// 迈之
// 充值配置的需要充值金额的列表
public static final String GOBLIN_RECHARGE_WRISTBAND = PREFIX.concat("recharge:wristband");
// 迈之的accessToken
public static final String GOBLIN_RECHARGE_MAIZHI_TOKEN = PREFIX.concat("recharge:maizhitoken");
// 获取设备编号定时任务最后一次的时间
public static final String GOBLIN_RECHARGE_DEVICE_NUMBER_ENDTIME = PREFIX.concat("recharge:deviceNumber:endtime:operationNo:");
// 通过分订单号获取订单 id
public static final String GOBLIN_RECHARGE_FOUT_TRADE_NO = PREFIX.concat("recharge:foutTradeNo:");
// 手环订单
public static final String GOBLIN_BRACELET_ORDERID = PREFIX.concat("bracelet:orderId:");
public static final String GOBLIN_BRACELET_RELATED_ORDER = PREFIX.concat("bracelet:reqSeqId:");
/* ----------------------------------------------------------------- */
public static final String GOBLIN_ORDER_LOG = PREFIX.concat("order:log:");//无用
......
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 手环-订单VO
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "手环订单vo")
public class GoblinBraceletOrderVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
/**
* 订单ID
*/
@ApiModelProperty(value = "订单ID")
private String orderId;
/**
* 用户ID
*/
@ApiModelProperty(value = "用户ID")
private String userId;
/**
* 绑定用户姓名
*/
@ApiModelProperty(value = "绑定用户姓名")
private String bindName;
/**
* 绑定用户手机号
*/
@ApiModelProperty(value = "绑定用户手机号")
private String bindMobile;
/**
* 绑定用户身份证号码
*/
@ApiModelProperty(value = "绑定用户身份证号码")
private String bindIdcard;
/**
* 请求日期
*/
@ApiModelProperty(value = "请求日期")
private String reqDate;
/**
* 商品描述
*/
@ApiModelProperty(value = "商品描述")
private String goodsDesc;
/**
* 手环ID
*/
@ApiModelProperty(value = "手环ID")
private String wristbandId;
/**
*手环金额
*/
@ApiModelProperty(value = "手环金额")
private BigDecimal wristbandPrice;
/**
*充值金额ID
*/
@ApiModelProperty(value = "充值金额ID")
private String amountId;
/**
*充值金额
*/
@ApiModelProperty(value = "充值金额")
private BigDecimal amountPrice;
/**
* 请求流水号
*/
@ApiModelProperty(value = "请求流水号")
private String reqSeqId;
/**
* 全局流水号
*/
@ApiModelProperty(value = "全局流水号")
private String hfSeqId;
/**
* 交易类型:
* T_JSAPI: 微信公众号支付
* T_MINIAPP: 微信小程序支付
* A_JSAPI: 支付宝JS
* A_NATIVE: 支付宝正扫
* U_NATIVE: 银联正扫
* U_JSAPI: 银联 JS
* D_NATIVE: 数字人民币正扫
* T_H5:微信直连H5支付
* T_APP:微信APP支付
* T_NATIVE:微信正扫
*/
@ApiModelProperty(value = "交易类型")
private String tradeType;
/**
* 用户账单上的交易订单号
*/
@ApiModelProperty(value = "用户账单上的交易订单号")
private String outTransId;
/**
* 用户账单上的商户订单号
*/
@ApiModelProperty(value = "用户账单上的商户订单号")
private String partyOrderId;
/**
* 支付完成时间 格式yyyyMMddHHmmss
*/
@ApiModelProperty(value = "支付完成时间 格式yyyyMMddHHmmss")
private String endTime;
/**
* 入账时间 格式为yyyyMMdd
*/
@ApiModelProperty(value = "入账时间 格式为yyyyMMdd")
private String acctDate;
/**
* 单价
*/
@ApiModelProperty(value = "单价")
private BigDecimal price;
/**
* 应付价格
*/
@ApiModelProperty(value = "应付价格")
private BigDecimal priceTotal;
/**
* 实付价格
*/
@ApiModelProperty(value = "实付价格")
private BigDecimal priceActual;
/**
* 退款价格
*/
@ApiModelProperty(value = "退款价格")
private BigDecimal priceRefund;
/**
* 退款扣除的手续费金额
*/
@ApiModelProperty(value = "退款扣除的手续费金额")
private BigDecimal refundPriceCharges;
/**
* 退款数
*/
@ApiModelProperty(value = "退款数")
private Integer refundNumber;
/**
* 支付时间
*/
@ApiModelProperty(value = "支付时间")
private String timePay;
/**
* 订单状态:
* 0 待付款
* 1 已付款
* 2 已关闭
* 3 正在退款
* 4 已退款
* 5 待关闭
* 6 部分退款
* 7 退款失败
*/
@ApiModelProperty(value = "订单状态")
private Integer status;
/**
* 支付状态:
* 0 未支付
* 1 已支付
* 2 支付失败
*/
@ApiModelProperty(value = "支付状态")
private Integer payStatus;
/**
* 迈之的分订单号
*/
@ApiModelProperty(value = "迈之的分订单号")
private String foutTradeNo;
/**
* 迈之的设备编号
*/
@ApiModelProperty(value = "迈之的设备编号")
private String cardno;
/**
* 迈之的分订单号
*/
@ApiModelProperty(value = "迈之的分订单号")
private Integer refundStatus;
/**
* 迈之的设备编号
*/
@ApiModelProperty(value = "迈之的设备编号")
private String refundStatusNote;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
private static final GoblinBraceletOrderVo obj = new GoblinBraceletOrderVo();
public static GoblinBraceletOrderVo getNew() {
try {
return (GoblinBraceletOrderVo) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new GoblinBraceletOrderVo();
}
public GoblinBraceletOrderVo copy(GoblinBraceletOrder goblinBraceletOrder){
if (goblinBraceletOrder == null) return this;
BeanUtils.copyProperties(goblinBraceletOrder, this);
return this;
}
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "手环下单结果vo")
public class GoblinBraceletPayResultVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(position = 1, value = "订单ID")
private String orderId;
@ApiModelProperty(position = 3, value = "价格")
private BigDecimal price;
@ApiModelProperty(position = 5, value = "三方支付信息")
private Object payInfo;
private static final GoblinBraceletPayResultVo obj = new GoblinBraceletPayResultVo();
public static GoblinBraceletPayResultVo getNew() {
try {
return (GoblinBraceletPayResultVo) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new GoblinBraceletPayResultVo();
}
}
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
/**
*
*/
@Data
public class GoblinBraceletRelatedOrderVo {
// 用户ID
private String uid;
// 手环订单ID
private String orderId;
// 调用斗拱请求ID
private String reqSeqId;
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeAmountVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = " 金额ID")
private String amountId;
@ApiModelProperty(value = "金额名称")
private String name;
@ApiModelProperty(value = "充值金额")
private BigDecimal price;
private final static GoblinRechargeAmountVo obj = new GoblinRechargeAmountVo();
public static GoblinRechargeAmountVo getNew() {
try {
return (GoblinRechargeAmountVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinRechargeAmountVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeWristbandVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = " 手环ID")
private String wristbandId;
@ApiModelProperty(value = "手环名称")
private String name;
@ApiModelProperty(value = "手环价格")
private BigDecimal price;
@ApiModelProperty(value = "充值金额")
private List<GoblinRechargeAmountVo> amonutList;
private final static GoblinRechargeWristbandVo obj = new GoblinRechargeWristbandVo();
public static GoblinRechargeWristbandVo getNew() {
try {
return (GoblinRechargeWristbandVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinRechargeWristbandVo();
}
}
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.List;
/**
* <p>
* xx 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2025-07-03 17:38
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class MaiZhiAllVo {
// 基础响应类
@Data
public static class BaseResponse<T> {
private String msg;
private Integer errcode;
private T data;
}
// 登录授权
@Data
public static class AuthParam {
private String appid;
private String appSecret;
}
@Data
public static class AuthResponse extends BaseResponse<AuthResponse.DataRes> {
@Data
public static class DataRes {
private String accessToken;
private Integer expire;
}
}
// 实名
@Data
public static class IdCardParam {
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "身份证")
private String idcard;
}
@Data
public static class CheckIdcardResponse {
private String message;
private String msg;
private Integer result;
private String resultDesc;
private Integer gender;
private Integer age;
private String area;
private Integer errcode;
}
// 新增订单
@Data
public static class OrderParam implements Cloneable {
private String operationNo;
private String out_trade_no;
private String dgoid;
private BigDecimal receipt_amount;
private Integer total;
private String payTime;
private List<User> userList;
@Data
public static class User implements Cloneable {
private String name;
private String phone;
private String idcard;
private BigDecimal money;
private static final User obj = new User();
public static User getNew() {
try {
return (User) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new User();
}
}
private static final OrderParam obj = new OrderParam();
public static OrderParam getNew() {
try {
return (OrderParam) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new OrderParam();
}
}
@Data
public static class OrderResponse extends BaseResponse<String> {
}
// 订单查询
@Data
public static class OrderInfoParam implements Cloneable {
private List<String> orderList;
private static final OrderInfoParam obj = new OrderInfoParam();
public static OrderInfoParam getNew() {
try {
return (OrderInfoParam) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new OrderInfoParam();
}
}
@Data
public static class OrderInfoResponse {
private Integer errcode;
private List<OrderList> outlist;
@Data
public static class OrderList {
private String out_trade_no;
private Integer status;
private BigDecimal receipt_amount;
private String time;
private List<UserOrder> user_order;
@Data
public static class UserOrder {
private String fout_trade_no;
private Integer status;
private String name;
private String phone;
private String idcard;
private BigDecimal money;
}
}
}
// 核销码
@Data
public static class GenerateDeviceCodeResponse {
private String qrcode_str;
private Integer errcode;
}
// 设备编号获取
@Data
public static class DeviceNumberResponse {
private List<NumberList> list;
private Integer errcode;
@Data
public static class NumberList {
private String fout_trade_no;
private String cardno;
}
}
// 设备余额
@Data
public static class DeviceBalanceResponse {
private String cardno;
private BigDecimal money;
private String time;
private String msg;
private Integer errcode;
}
// 设备记录查询
@Data
public static class DeviceRecordResponse {
private List<Record> list;
private String msg;
private Integer errcode;
private String cardno;
private Integer total;
private Integer page;
@Data
public static class Record {
private String note;
private BigDecimal amt;
private BigDecimal ftbal;
private String time;
}
}
// 变更设备状态
@Data
public static class ChangeDeviceStatusResponse implements Cloneable {
private String msg;
private Integer errcode;
private Integer status;
private String note;
private static final ChangeDeviceStatusResponse obj = new ChangeDeviceStatusResponse();
public static ChangeDeviceStatusResponse getNew() {
try {
return (ChangeDeviceStatusResponse) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new ChangeDeviceStatusResponse();
}
}
}
package com.liquidnet.service.goblin.enums;
/**
* 订单状态枚举
*/
public enum OrderStatus {
PENDING_PAYMENT(0, "待付款"),
PAID(1, "已付款"),
CLOSED(2, "已关闭"),
REFUNDING(3, "正在退款"),
REFUNDED(4, "已退款"),
PENDING_CLOSE(5, "待关闭"),
PARTIAL_REFUND(6, "部分退款");
private final int code;
private final String description;
OrderStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// 通过code获取对应的枚举值
public static OrderStatus fromCode(int code) {
for (OrderStatus status : values()) {
if (status.getCode() == code) {
return status;
}
}
throw new IllegalArgumentException("无效的状态码: " + code);
}
}
package com.liquidnet.service.goblin.enums;
/**
* 支付状态枚举
*/
public enum PayStatus {
NOT_PAID(0, "未支付"),
PAID(1, "已支付"),
PAYMENT_FAILED(2, "支付失败");
private final int code;
private final String description;
PayStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// 根据 code 获取枚举实例
public static PayStatus fromCode(int code) {
for (PayStatus status : values()) {
if (status.getCode() == code) {
return status;
}
}
throw new IllegalArgumentException("无效的支付状态码: " + code);
}
@Override
public String toString() {
return description;
}
}
package com.liquidnet.service.goblin.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel(value = "GoblinBraceletOrderPayParam", description = "手环下单请求参数")
@Data
public class GoblinBraceletOrderPayParam implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "手环ID")
@NotBlank(message = "wristbandId不能为空")
private String wristbandId;
@ApiModelProperty(value = "金额ID")
@NotBlank(message = "金额ID不能为空")
private String amountId;
@ApiModelProperty(value = "姓名")
@NotBlank(message = "绑定姓名不能为空")
private String name;
@ApiModelProperty(value = "手机号")
@NotBlank(message = "绑定手机号不能为空")
private String mobile;
@ApiModelProperty(value = "身份证号码")
@NotBlank(message = "绑定身份证号码不能为空")
private String idCard;
@ApiModelProperty(value = "子商户用户标识")
@NotBlank(message = "openId不能为空")
private String subOpenId;
}
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
import java.util.List;
/**
* 调用斗拱业务层参数
*/
@Data
public class DougongJsPayData {
// 请求日期
private String reqDate;
// 请求流水号
private String reqSeqId;
// 交易类型
private String tradeType;
// 商品描述
private String goodsDesc;
// 交易总金额
private String transAmt;
// 交易有效期
private String timeExpire;
// 商品列表
private List<DougongRequestParam.WxDataGoodsDetail> goodsDetailList;
// 子商户用户标识
private String subOpenid;
}
package com.liquidnet.service.goblin.param.dougong;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 斗拱-请求jspay-参数
*/
@Data
public class DougongRequestParam {
// 请求日期
@JsonProperty("req_date")
private String reqDate;
// 请求流水号
@JsonProperty("req_seq_id")
private String reqSeqId;
// 商户号
@JsonProperty("huifu_id")
private String huifuId;
// 商品描述
@JsonProperty("goods_desc")
private String goodsDesc;
//交易类型
//T_JSAPI: 微信公众号
//T_MINIAPP: 微信小程序
//A_JSAPI: 支付宝JS
//A_NATIVE: 支付宝正扫
//U_NATIVE: 银联正扫
//U_JSAPI: 银联JS
//D_NATIVE: 数字人民币正扫
//T_H5:微信直连H5支付
//T_APP:微信APP支付
//T_NATIVE:微信正扫
@JsonProperty("trade_type")
private String tradeType;
// 交易金额
@JsonProperty("trans_amt")
private String transAmt;
// 交易有效期
@JsonProperty("time_expire")
private String timeExpire;
// 微信参数集合 WxData
@JsonProperty("wx_data")
private String wxData;
// 是否延迟交易
@JsonProperty("delay_acct_flag")
private String delayAcctFlag = "N";
// 异步通知地址
@JsonProperty("notify_url")
private String notifyUrl;
@Data
public static class WxData {
//子商户应用ID
@JsonProperty("sub_appid")
private String subAppid;
// 子商户用户标识
@JsonProperty("sub_openid")
private String subOpenid;
//商品描述
@JsonProperty("body")
private String body;
// 商品详情
@JsonProperty("detail")
private WxDataDetail detail;
}
@Data
public static class WxDataDetail {
@JsonProperty("cost_price")
private String costPrice;
@JsonProperty("goods_detail")
private List<WxDataGoodsDetail> goodsDetail;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class WxDataGoodsDetail {
// 商品编码
@JsonProperty("goods_id")
private String goodsId;
// 商品名称
@JsonProperty("goods_name")
private String goodsName;
// 商品单价(元)
@JsonProperty("price")
private String price;
// 商品数量
@JsonProperty("quantity")
private Integer quantity;
}
}
package com.liquidnet.service.goblin.param.dougong;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class DougongSyncCallbackRespData {
// 业务响应码
@JsonProperty("resp_code")
private String respCode;
//业务响应信息
@JsonProperty("resp_code")
private String respDesc;
//商户号
@JsonProperty("huifu_id")
private String huifuId;
//请求流水号
@JsonProperty("req_seq_id")
private String reqSeqId;
//请求日期
@JsonProperty("req_date")
private String reqDate;
//交易类型
@JsonProperty("trans_type")
private String transType;
//全局流水号
@JsonProperty("hf_seq_id")
private String hfSeqId;
//交易金额
@JsonProperty("trans_amt")
private String transAmt;
//消费者实付金额
@JsonProperty("pay_amt")
private String payAmt;
// 支付完成时间 格式yyyyMMddHHmmss
@JsonProperty("end_time")
private String endTime;
//入账时间 格式为yyyyMMdd
@JsonProperty("acct_date")
private String acctDate;
// 交易状态 S:成功、F:失败,交易状态以此字段为准
@JsonProperty("trans_stat")
private String transStat;
//通知类型 1:通道通知,2:账务通知
@JsonProperty("notify_type")
private Integer notifyType;
@JsonProperty("out_trans_id")
private String outTransId;
}
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
/**
* 异步返回参数
* 公共返回
*/
@Data
public class DougongSyncCallbackparam {
private String respCode;
private String respDesc;
private String sign;
private String respData;
}
package com.liquidnet.service.goblin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import java.util.List;
import java.util.Map;
public interface IGoblinBraceletOrderService extends IService<GoblinBraceletOrder> {
/**
* 下单
* @param payParam
* @return
*/
ResponseDto<GoblinBraceletPayResultVo> checkOrder(GoblinBraceletOrderPayParam payParam);
/**
* 校验订单状态
*
* @param orderId
* @return
*/
ResponseDto<Map<String, Object>> checkOrderResult(String orderId);
/**
* 斗拱支付回调
* @return
*/
ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam);
/**
* 获取订单列表
* @return
*/
List<GoblinBraceletOrderVo> getOrderList();
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import java.util.Map;
public interface IGoblinDougongPayService {
/**
* @return
*/
Map<String, Object> jsPay(DougongJsPayData data);
boolean verifySign(String data, String sign);
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.entity.GoblinRechargeAmount;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 充值金额选项表 服务类
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
public interface IGoblinRechargeAmountService extends IService<GoblinRechargeAmount> {
}
package com.liquidnet.service.goblin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.goblin.dto.vo.GoblinRechargeWristbandVo;
import com.liquidnet.service.goblin.dto.vo.MaiZhiAllVo.*;
import com.liquidnet.service.goblin.entity.GoblinRechargeWristband;
/**
* <p>
* 手环信息表 服务类
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
public interface IGoblinRechargeWristbandService extends IService<GoblinRechargeWristband> {
GoblinRechargeWristbandVo getList();
CheckIdcardResponse auth(IdCardParam param);
OrderResponse createOrder(OrderParam param, String orderId);
OrderInfoResponse getOrder(OrderInfoParam param, String orderId);
GenerateDeviceCodeResponse getQrcode(String outno);
Boolean getDeviceNumber(Integer operationNo);
DeviceBalanceResponse getDeviceBalance(String cardno);
DeviceRecordResponse getDeviceRecord(String cardno, Integer page);
ChangeDeviceStatusResponse changeDeviceStatus(String orderId, int type);
Boolean refundRes();
}
......@@ -120,4 +120,12 @@ public class KylinRedisConst {
public static final String ORDER_AR_CODE = "kylin:ar:order:";//$key + $orderId
/**
* 福袋相关
*/
// 福袋活动
public static final String LUCKY_BAG_ACTIVITY = "kylin:luckybag:activity";
public static final String LUCKY_BAG = "kylin:luckybag";
public static final String LUCKY_BAG_CODE_LOCK = "kylin:luckybag:code:lock:";
}
package com.liquidnet.service.kylin.constant;
import lombok.Getter;
@Getter
public enum LuckyBagStatusEnum {
// 兑换码显示类型
CODE_SHOW_TYPE_CODE(1, "兑换码"),
CODE_SHOW_TYPE_QR_CODE(2, "二维码"),
// 解锁状态
UNLOCK_STATUS_NOT_UNLOCKED(0, "未解锁"),
UNLOCK_STATUS_UNLOCKED(1, "已解锁"),
// 可用状态
AVAILABLE_STATUS_UNAVAILABLE(0, "不可用"),
AVAILABLE_STATUS_AVAILABLE(1, "可用"),
AVAILABLE_STATUS_RECEIVED(2, "已领取");
private final Integer value;
private final String desc;
LuckyBagStatusEnum(Integer value, String desc) {
this.value = value;
this.desc = desc;
}
}
......@@ -75,6 +75,9 @@ public class BannersParam implements Serializable {
@ApiModelProperty(value = "推广省份 多选 数组", example = "[\"北京市\", \"天津市\", \"沈阳市\"]")
private List provincesNameList;
@ApiModelProperty(value = "演出ID")
private String performanceId;
@JsonIgnore
public KylinBanners getFields(String bannersId, String createdAt) {
KylinBanners fields = new KylinBanners();
......
......@@ -77,4 +77,10 @@ public class KylinBannersVo implements Serializable {
@ApiModelProperty(value = "修改时间")
private String updatedAt;
@ApiModelProperty(value = "演出ID")
private String performanceId;
@ApiModelProperty(value = "演出名称")
private String performanceName;
}
package com.liquidnet.service.kylin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "福袋兑换码详情VO")
public class KylinLuckyBagCodeDetailVo {
@ApiModelProperty(value = "福袋ID")
private String luckyBagId;
@ApiModelProperty(value = "福袋名称")
private String luckyBagName;
@ApiModelProperty(value = "兑换码")
private String code;
@ApiModelProperty(value = "状态 0:不可用 1:可用 2:已领取")
private int useStatus;
@ApiModelProperty(value = "发放时间")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createdAt;
@ApiModelProperty(value = "领取时间")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updatedAt;
@ApiModelProperty(value = "领取人信息")
private UserInfo userInfo;
@ApiModelProperty(value = "关联订单订单")
private OrderInfo orderInfo;
@ApiModelProperty(value = "核验人")
private Operator operator;
@ApiModel(value = "用户信息")
@Data
public static class UserInfo {
@ApiModelProperty(value = "用户ID")
private String uid;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "用户手机号")
private String userMobile;
}
@ApiModel(value = "订单信息")
@Data
public static class OrderInfo {
@ApiModelProperty(value = "订单ID")
private String orderId;
@ApiModelProperty(position = 15, value = "订单号")
private String orderCode;
@ApiModelProperty(value = "演出名称")
private String performanceTitle;
@ApiModelProperty(value = "票种名称")
private String ticketTitle;
@ApiModelProperty(value = "数量")
private Integer number;
@ApiModelProperty(value = "退款张数")
private Integer refundNumber;
@ApiModelProperty(value = "订单生成时间")
private String createdAt;
@ApiModelProperty(value = "适用时间")
private String useStart;
}
@ApiModel(value = "和燕人")
@Data
@AllArgsConstructor
public static class Operator{
@ApiModelProperty(value = "手机号")
private String mobile;
@ApiModelProperty(value = "昵称")
private String nickName;
}
}
package com.liquidnet.service.kylin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "福袋Scope VO")
public class KylinLuckyBagScopeVo {
@ApiModelProperty(value = "福袋ID")
private String luckyBagId;
@ApiModelProperty(value = "福袋名称")
private String name;
@ApiModelProperty(value = "福袋描述")
private String introduction;
@ApiModelProperty(value = "关联演出ID")
private String performanceId;
@ApiModelProperty(value = "关联演出名称")
private String performanceName;
}
package com.liquidnet.service.kylin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
@Data
@ApiModel(value = "福袋VO")
public class KylinLuckyBagVo implements Serializable {
@ApiModelProperty(value = "福袋列表")
private List<LuckyBagVo> luckyBagVoList;
@ApiModelProperty(value = "福袋活动列表")
private LuckyBagActivityVo luckyBagActivityVo;
@Data
@ApiModel(value = "福袋活动VO")
@AllArgsConstructor
public static class LuckyBagActivityVo {
@ApiModelProperty(value = "活动ID")
private String luckyBagActivityId;
@ApiModelProperty(value = "活动名称")
private String name;
@ApiModelProperty(value = "活动简介")
private String detail;
@ApiModelProperty(value = "跳转地址")
private String targetUrl;
}
@Data
@ApiModel(value = "福袋VO")
public static class LuckyBagVo {
@ApiModelProperty(value = "福袋ID")
private String luckyBagId;
@ApiModelProperty(value = "福袋名称")
private String name;
@ApiModelProperty(value = "福袋描述")
private String introduction;
@ApiModelProperty(value = "兑换码显示状态 1:兑换码 2:二维码")
private Integer codeShowType;
@ApiModelProperty(value = "状态 0:未解锁 1:已解锁")
private Integer status;
@ApiModelProperty(value = "兑换码")
private List<RewardCodeVo> rewardCodeVoList;
}
@Data
@ApiModel(value = "兑换码VO")
public static class RewardCodeVo {
@ApiModelProperty(value = "状态 0:不可用 1:可用 2:已领取")
private Integer useStatus;
@ApiModelProperty(value = "兑换码")
private String code;
}
public static KylinLuckyBagVo of(List<LuckyBagVo> luckyBagVoList,
LuckyBagActivityVo luckyBagActivityVo){
KylinLuckyBagVo kylinLuckyBagVo = new KylinLuckyBagVo();
kylinLuckyBagVo.setLuckyBagVoList(luckyBagVoList);
kylinLuckyBagVo.setLuckyBagActivityVo(luckyBagActivityVo);
return kylinLuckyBagVo;
}
public static KylinLuckyBagVo ofEmpty(){
KylinLuckyBagVo kylinLuckyBagVo = new KylinLuckyBagVo();
kylinLuckyBagVo.setLuckyBagVoList(Collections.emptyList());
return kylinLuckyBagVo;
}
}
package com.liquidnet.service.kylin.service;
public interface IFeishuBotService {
void sendTextMessage(String text);
}
package com.liquidnet.service.kylin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import java.util.List;
public interface IKylinLuckyBagService {
/**
* 根据订单ID获取福袋
*
* @param orderId
* @return
*/
ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(String orderId);
/**
* 获取福袋验码列表
*
* @param mobile
* @return
*/
ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(String mobile);
/**
* 获取福袋详情
*
* @param authMobile
* @param code
* @param luckyBagId
* @return
*/
ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(String authMobile, String code, String luckyBagId);
/**
* 验码
* @param authMobile
* @param code
* @param luckyBagId
* @return
*/
ResponseDto<Boolean> consumeCode(String authMobile, String code, String luckyBagId);
}
......@@ -9,6 +9,7 @@ import com.liquidnet.service.kylin.dto.param.PerformanceMemberAuditParam;
import com.liquidnet.service.kylin.dto.param.SysDamaiParam;
import com.liquidnet.service.kylin.dto.vo.admin.*;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformancesVo;
import com.liquidnet.service.kylin.entity.KylinOrderImport;
import com.liquidnet.service.kylin.entity.KylinPerformances;
......@@ -320,4 +321,6 @@ public interface IKylinPerformancesAdminService {
* @return: com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceAgentVo
**/
List<KylinPerformanceSubscribeTicketStatisticalDao> getPerformanceSubscribe(String performancesId);
List<KylinPerformancesVo> searchPerformanceByTitle(String title);
}
......@@ -60,6 +60,10 @@ public class SweetConstant {
public static final String REDIS_KEY_SWEET_SEND_COUPON = "sweet:integralActivity:coupon:send:";
// 答题活动
public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
// doudou
public final static String REDIS_KEY_SWEET_DOUDOU_USER = "sweet:doudou:uid:";
public final static String REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE = "sweet:doudou:scope:mobile:";
public static final String REDIS_KEY_SWEET_DOUDOU_ACTIVE = "sweet:doudou:active";
// 城市投票活动
public final static String REDIS_KEY_SWEET_CITY_VOTE_STAT_LIST = ":StatList";
public final static String REDIS_KEY_SWEET_CITY_VOTE_CITY_CODE = ":cityCode:";
......
package com.liquidnet.service.sweet.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel(value = "SweetDouDouCheckParam", description = "入参")
@Data
public class SweetDouDouCheckParam implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(position = 1, required = true, value = "核验人手机号", example = "10000000000")
@NotBlank(message = "authMobile不能为空")
private String authMobile;
@ApiModelProperty(position = 2, required = true, value = "doudouId", example = "5223713433667502081163230")
@NotBlank(message = "doudouId不能为空")
private String doudouId;
@ApiModelProperty(position = 4, required = true, value = "activeId", example = "3189092902231364195328061")
@NotBlank(message = "activeId不能为空")
private String activeId;
@ApiModelProperty(position = 3, required = true, value = "用户ID", example = "937724050260131847782985")
@NotBlank(message = "userId不能为空")
private String userId;
}
package com.liquidnet.service.sweet.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel(value = "SweetDouDouParam", description = "入参")
@Data
public class SweetDouDouParam implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(position = 10, required = true, value = "观演人姓名", example = "张三")
@NotBlank(message = "username不能为空")
private String username;
@ApiModelProperty(position = 11, required = true, value = "观演人手机号", example = "15811112222")
@NotBlank(message = "phone不能为空")
private String phone;
@ApiModelProperty(position = 12, required = true, value = "3442", example = "活动 ID")
@NotBlank(message = "activeId不能为空")
private String activeId;
@ApiModelProperty(position = 13, required = true, value = "img", example = "图片地址")
@NotBlank(message = "imgUrl不能为空")
private String imgUrl;
@ApiModelProperty(position = 14, required = true, value = "想给doudou说的话", example = "我爱你啦啦啦")
private String mark;
}
package com.liquidnet.service.sweet.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.param.SweetDouDouCheckParam;
import com.liquidnet.service.sweet.param.SweetDouDouParam;
import com.liquidnet.service.sweet.vo.SweetDouDouActiveVo;
import com.liquidnet.service.sweet.vo.SweetDouDouVo;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import java.util.List;
/**
* <p>
* doudou预约签名CD记录表 服务类
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
public interface ISweetDoudouService extends IService<SweetDoudou> {
ResponseDto<SweetDouDouVo> info(String activeId);
ResponseDto<SweetDouDouVo> create(@Valid SweetDouDouParam param);
ResponseDto check(SweetDouDouCheckParam param);
ResponseDto<SweetDouDouVo> detail(SweetDouDouCheckParam param);
boolean winningUpload(MultipartFile file);
ResponseDto<List<SweetDouDouActiveVo>> getActiveList();
ResponseDto<SweetDouDouActiveVo> getActiveDetail(String activeId);
}
package com.liquidnet.service.sweet.vo;
import com.liquidnet.service.sweet.entity.SweetDoudouActive;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("SweetDouDouActiveVo")
public class SweetDouDouActiveVo implements Serializable, Cloneable {
@ApiModelProperty("doudou_id")
private String doudouId;
@ApiModelProperty("user_id")
private String userId;
@ApiModelProperty("活动ID")
private String activeId;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("活动详情")
private String details;
@ApiModelProperty("卡片背景图")
private String cardImages;
@ApiModelProperty("活动详情背景图")
private String detailImages;
@ApiModelProperty("活动详情URL")
private String targetUrl;
@ApiModelProperty("活动状态:2:进行中 3:已结束")
private Integer activeStatus;
@ApiModelProperty("状态 0未登记 1已登记 2未中签 3已中签 4已核销")
private Integer status;
private static final SweetDouDouActiveVo obj = new SweetDouDouActiveVo();
public static SweetDouDouActiveVo getNew() {
try {
return (SweetDouDouActiveVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetDouDouActiveVo();
}
}
public SweetDouDouActiveVo copy(SweetDoudouActive source) {
if (null == source) return this;
this.activeId = source.getActiveId();
this.title = source.getTitle();
this.cardImages = source.getCardImages();
this.detailImages = source.getDetailImages();
this.targetUrl = source.getTargetUrl();
this.details = source.getDetails();
return this;
}
}
package com.liquidnet.service.sweet.vo;
import com.liquidnet.service.sweet.entity.SweetDoudouScope;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class SweetDouDouScopeVo implements Serializable, Cloneable{
@ApiModelProperty("mobile")
private String mobile;
@ApiModelProperty("nickName")
private String nickName;
@ApiModelProperty("realName")
private String realName;
@ApiModelProperty("idCard")
private String idCard;
@ApiModelProperty("status")
private Integer status;
@ApiModelProperty("createdAt")
private LocalDateTime createdAt;
@ApiModelProperty("updatedAt")
private LocalDateTime updatedAt;
private static final SweetDouDouScopeVo obj = new SweetDouDouScopeVo();
public static SweetDouDouScopeVo getNew() {
try {
return (SweetDouDouScopeVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetDouDouScopeVo();
}
}
public SweetDouDouScopeVo copy(SweetDoudouScope source) {
if (null == source) return this;
this.mobile = source.getMobile();
this.nickName = source.getNickName();
this.realName = source.getRealName();
this.idCard = source.getIdCard();
this.status = source.getStatus();
this.createdAt = source.getCreatedAt();
this.updatedAt = source.getUpdatedAt();
return this;
}
}
package com.liquidnet.service.sweet.vo;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class SweetDouDouVo implements Serializable, Cloneable {
@ApiModelProperty("doudou_id")
private String doudouId;
@ApiModelProperty("user_id")
private String userId;
@ApiModelProperty("观演人姓名")
private String username;
@ApiModelProperty("观演人手机号")
private String phone;
@ApiModelProperty("图片地址")
private String imgUrl;
@ApiModelProperty("活动 ID")
private String activeId;
@ApiModelProperty("想给doudou说的话")
private String mark;
@ApiModelProperty("状态 1已登记 2未中签 3已中签 4已核销")
private Integer status;
@ApiModelProperty("活动名称")
private String activeTitle;
private static final SweetDouDouVo obj = new SweetDouDouVo();
public static SweetDouDouVo getNew() {
try {
return (SweetDouDouVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetDouDouVo();
}
}
public SweetDouDouVo copy(SweetDoudou source) {
if (null == source) return this;
this.setPhone(source.getPhone());
return this;
}
}
......@@ -19,6 +19,7 @@ public enum BannersDisplayLocation {
DISPLAY_LOCATION6("YOUNG BLOOD", 6),
DISPLAY_LOCATION8("视频", 8),
DISPLAY_LOCATION9("正在下单", 9),
DISPLAY_LOCATION10("福袋", 10),
;
private String name;
private int index;
......
......@@ -69,7 +69,7 @@ public class KylinBannersAdminController extends BaseController {
return prefix + "/create";
}
@Log(title = "Banner列表", businessType = BusinessType.INSERT)
@Log(title = "创建Banner", businessType = BusinessType.INSERT)
@RequiresPermissions("kylin:banners:create")
@PostMapping("create")
@ResponseBody
......@@ -105,7 +105,7 @@ public class KylinBannersAdminController extends BaseController {
return prefix + "/update";
}
@Log(title = "Banner列表", businessType = BusinessType.UPDATE)
@Log(title = "修改Banner", businessType = BusinessType.UPDATE)
@RequiresPermissions("kylin:banners:update")
@PostMapping("update")
@ResponseBody
......@@ -142,7 +142,7 @@ public class KylinBannersAdminController extends BaseController {
return getDataTable(result.getList());
}
@Log(title = "Banner列表", businessType = BusinessType.DELETE)
@Log(title = "删除Banner", businessType = BusinessType.DELETE)
@RequiresPermissions("kylin:banners:delete")
@PostMapping("delete")
@ResponseBody
......
......@@ -8,12 +8,10 @@ import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.client.admin.common.utils.poi.ExcelUtil;
import com.liquidnet.client.admin.zhengzai.kylin.dto.KylinOrderImportDto;
import com.liquidnet.client.admin.zhengzai.kylin.dto.KylinPerformanceSubscribeTicketStatisticalExportDao;
import com.liquidnet.client.admin.zhengzai.kylin.dto.PerformanceOrderStatisCountResp;
import com.liquidnet.client.admin.zhengzai.stone.service.dto.StoneScoreListExportDto;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.param.GoblinFrontCubeParam;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dao.PerformanceAdminListDao;
import com.liquidnet.service.kylin.dao.PerformanceMemberAuditDao;
import com.liquidnet.service.kylin.dao.PerformanceOrderStatisticalDao;
......@@ -23,6 +21,7 @@ import com.liquidnet.service.kylin.dto.param.PerformanceMemberAuditParam;
import com.liquidnet.service.kylin.dto.param.SysDamaiParam;
import com.liquidnet.service.kylin.dto.vo.admin.*;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformancesVo;
import com.liquidnet.service.kylin.entity.KylinOrderImport;
import com.liquidnet.service.kylin.service.admin.IKylinPerformancesAdminService;
import com.liquidnet.service.kylin.service.other.DamaiService;
......@@ -365,4 +364,11 @@ public class KylinPerformancesController extends BaseController {
String result = kylinPerformancesService.changeTransferConfig(performancesId, isCanTransfer, transferStartTime, transferEndTime);
return this.success(result);
}
@GetMapping(value = "/search")
@ResponseBody
public ResponseDto<List<KylinPerformancesVo>> searchPerformanceByTitle(@RequestParam(value = "title") String title) {
List<KylinPerformancesVo> kylinPerformancesVoList = kylinPerformancesService.searchPerformanceByTitle(title);
return ResponseDto.success(kylinPerformancesVoList);
}
}
......@@ -124,6 +124,10 @@
field: 'createdAt',
title: '创建时间'
},
{
field: 'performanceName',
title: '关联演出名称'
},
{
title: '操作',
align: 'center',
......
......@@ -155,39 +155,72 @@
var url9 = "[[${url9}]]";
var url14 = "[[${url14}]]";
let count = 0;
function areaSelect (e) {
function areaSelect(e) {
console.log(e.value, 'kan')
if (e.value == 9) {
// 清空之前的输入和选择
$("#searchIpt").val('').attr('data-id', '');
$("#selectActivity label").text("选择活动"); // 默认文本
if (e.value == 9 || e.value == 10) {
count++;
if (count % 2) {
console.log(count, 'dsa')
// 根据不同类型设置参数
let url, keyField, idField, searchTip;
if (e.value == 9) {
url = '/goblin/marketing/zhengzai/list/get?pageSize=10&pageNum=1&orderByColumn=createdAt&isAsc=desc&status=-1&purchaseName=';
keyField = 'name';
idField = 'selfMarketId';
searchTip = '请输入活动名称';
$("#selectActivity label").text("选择活动");
} else if (e.value == 10) {
url = '/kylin/performances/search?title='; // 演出搜索接口
keyField = 'title';
idField = 'performanceId';
searchTip = '请输入演出名称';
$("#selectActivity label").text("选择演出");
}
$("#selectActivity").show();
// 销毁旧的实例并重新初始化
$("#searchIpt").bsSuggest('destroy').attr('placeholder', searchTip);
$("#searchIpt").bsSuggest({
idField: 'selfMarketId', // data.value 的第几个数据,作为input输入框的内容
keyField: 'name', // data.value 的第几个数据,作为input输入框的内容
allowNoKeyword: false, //是否允许无关键字时请求数据
showBtn:false,
multiWord: true, //以分隔符号分割的多关键字支持
idField: idField,
keyField: keyField,
allowNoKeyword: false,
showBtn: false,
multiWord: true,
hideOnSelect: true,
getDataMethod: "url", //获取数据的方式,总是从 URL 获取
effectiveFields: ['name'],
url: '/goblin/marketing/zhengzai/list/get?pageSize=10&pageNum=1&orderByColumn=createdAt&isAsc=desc&status=-1&purchaseName=',
/*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
//字符串转化为 js 对象
console.log(json, 'json')
let data = {};
data.value = json.data
return data
}
}).on('onDataRequestSuccess', function (e, result) {
}).on('onSetSelectValue', function (e, selectedData,selectedRawData ) { // 当前行的所有值都能拿到
}).on('onUnsetSelectValue', function (e) {
});;
getDataMethod: "url",
effectiveFields: [keyField],
url: url,
processData: function(json) {
// 统一处理接口返回数据
let data = { value: json.data || [] };
if (e.value == 10) {
// 假设演出接口返回格式为 { data: [{id:1, title:"演出名称"},...] }
data.value = json.data.map(item => ({
[idField]: item.performancesId,
[keyField]: item.title
}));
}
return data;
}
}).on('onSetSelectValue', function(e, selectedData, selectedRawData) {
// 选中时存储ID
const id = selectedRawData[idField];
$(this).attr('data-id', id);
}).on('onUnsetSelectValue', function() {
// 取消选择时清空ID
$(this).attr('data-id', '');
});
} else {
$("#selectActivity").hide();
$("#searchIpt").val('').attr('data-id', '');
}
} else {
$("#selectActivity").hide();
$("#searchIpt").val('').attr('data-id', '');
}
}
function submitHandler() {
......@@ -202,6 +235,11 @@
layer.msg("请选择展示位置");
return false;
}
// 新增校验:如果选择了位置10,必须选择演出
if (positionList.split(',').includes('10') && !$('#searchIpt').attr('data-id')) {
layer.msg('请选择演出!');
return false;
}
var targetType = $('#targetType').select2('val');
if (!targetType) {
layer.msg("请选择跳转方式");
......@@ -212,6 +250,13 @@
if (positionList.split(',').includes('9')) {
data.push({"name": "marketId", "value": $('#searchIpt').attr('data-id')});
}
// 添加演出ID到提交数据
if (positionList.split(',').includes('10')) {
data.push({
"name": "performanceId",
"value": $('#searchIpt').attr('data-id')
});
}
var targetObj = '';
var targetObjName = '';
if (12 == targetType || 100 == targetType) { // 请填写url
......@@ -519,7 +564,7 @@
'theme': 'explorer-fas',
// 'uploadUrl': "/kylin/banners/upload3",
// 'uploadUrl': "http://127.0.0.1:9003" + "/platform/basicServices/alOss/upload",
'uploadUrl': platformUrl + "/platform/basicServices/alOss/upload",
'uploadUrl': platformUrl + "/platform/basicServices/alOss/upload/unsm",
"uploadExtraData": {
"pathName" : "banner",
"buckType" : 1
......
......@@ -187,26 +187,92 @@
var bannersId = "[[${KylinBannersVo.bannersId}]]";
var marketName = "[[${KylinBannersVo.marketName}]]";
var marketId = "[[${KylinBannersVo.marketId}]]";
var performanceId = "[[${KylinBannersVo.performanceId}]]";
let count = 0;
console.log(marketId, marketName)
function areaSelect (e) {
function areaSelect(e) {
console.log(e.value, 'kan')
if (e.value == 9) {
// 清空之前的输入和选择
$("#searchIpt").val('').attr('data-id', '');
$("#selectActivity label").text("选择活动"); // 默认文本
if (e.value == 9 || e.value == 10) {
count++;
if (count % 2) {
console.log(count, 'dsa')
// 根据不同类型设置参数
let url, keyField, idField, searchTip;
if (e.value == 9) {
url = '/goblin/marketing/zhengzai/list/get?pageSize=10&pageNum=1&orderByColumn=createdAt&isAsc=desc&status=-1&purchaseName=';
keyField = 'name';
idField = 'selfMarketId';
searchTip = '请输入活动名称';
$("#selectActivity label").text("选择活动");
} else if (e.value == 10) {
url = '/kylin/performances/search?title='; // 演出搜索接口
keyField = 'title';
idField = 'performanceId';
searchTip = '请输入演出名称';
$("#selectActivity label").text("选择演出");
}
$("#selectActivity").show();
commomSe()
// 销毁旧的实例并重新初始化
$("#searchIpt").bsSuggest('destroy').attr('placeholder', searchTip);
$("#searchIpt").bsSuggest({
idField: idField,
keyField: keyField,
allowNoKeyword: false,
showBtn: false,
multiWord: true,
hideOnSelect: true,
getDataMethod: "url",
effectiveFields: [keyField],
url: url,
processData: function(json) {
// 统一处理接口返回数据
let data = { value: json.data || [] };
if (e.value == 10) {
// 假设演出接口返回格式为 { data: [{id:1, title:"演出名称"},...] }
data.value = json.data.map(item => ({
[idField]: item.performancesId,
[keyField]: item.title
}));
}
return data;
}
}).on('onSetSelectValue', function(e, selectedData, selectedRawData) {
// 选中时存储ID
const id = selectedRawData[idField];
$(this).attr('data-id', id);
}).on('onUnsetSelectValue', function() {
// 取消选择时清空ID
$(this).attr('data-id', '');
});
} else {
$("#selectActivity").hide();
$("#searchIpt").val('').attr('data-id', '');
}
} else {
$("#selectActivity").hide();
$("#searchIpt").val('').attr('data-id', '');
}
}
if (marketId) {
if (marketId || performanceId) {
count++;
$("#selectActivity").show()
commomSe()
$("#searchIpt").attr('data-id', marketId)
// 根据存储的位置类型初始化不同的搜索框
const positionList = "[[${KylinBannersVo.positionList}]]";
if (positionList && positionList.includes('10')) {
performanceCommomSe();
// 设置演出数据回显
$("#searchIpt").val("[[${KylinBannersVo.performanceName}]]") // 新增演出名称字段
.attr('data-id', "[[${KylinBannersVo.performanceId}]]"); // 新增演出ID字段
}else {
commomSe();
$("#searchIpt").attr('data-id', marketId);
}
}
function commomSe () {
$("#searchIpt").bsSuggest({
......@@ -233,6 +299,34 @@
}).on('onUnsetSelectValue', function (e) {
});;
}
// 搜索演出接口
function performanceCommomSe() {
// 初始化演出搜索框
$("#searchIpt").bsSuggest({
idField: 'performanceId', // 演出ID字段
keyField: 'title', // 演出名称字段
allowNoKeyword: false,
showBtn: false,
multiWord: true,
hideOnSelect: true,
getDataMethod: "url",
effectiveFields: ['title'],
url: '/kylin/performances/search?title=', // 演出搜索接口
processData: function(json) {
let data = {};
// 转换数据结构为bsSuggest需要的格式
data.value = json.data.map(item => ({
performanceId: item.performancesId,
title: item.title
}));
return data;
}
}).on('onSetSelectValue', function(e, selectedData, selectedRawData) {
$(this).attr('data-id', selectedRawData.performanceId);
}).on('onUnsetSelectValue', function() {
$(this).attr('data-id', '');
});
}
function submitHandler() {
var bannersName = $('#bannersName').val();
if (!bannersName) {
......@@ -245,6 +339,11 @@
layer.msg("请选择展示位置");
return false;
}
// 新增校验:如果选择了位置10,必须选择演出
if (positionList.split(',').includes('10') && !$('#searchIpt').attr('data-id')) {
layer.msg('请选择演出!');
return false;
}
var targetType = $('#targetType').select2('val');
if (!targetType) {
layer.msg("请选择跳转方式");
......@@ -254,6 +353,16 @@
var data = $('#form-post-add').serializeArray();
if (positionList.split(',').includes('9')) {
data.push({"name": "marketId", "value": $('#searchIpt').attr('data-id')});
data.push({"name": "performanceId", "value": ""})
data.push({"name": "performanceName", "value": ""})
}
// 添加演出ID到提交数据
if (positionList.split(',').includes('10')) {
data.push({
"name": "performanceId",
"value": $('#searchIpt').attr('data-id')
});
data.push({"name": "marketId", "value": ""})
}
var targetObj = '';
var targetObjName = '';
......@@ -585,7 +694,7 @@
// 'uploadUrl': "/kylin/banners/upload3",
// 'uploadUrl': ctx + "system/user/profile/updateAvatar",
// 'uploadUrl': "http://127.0.0.1:9003" + "/platform/basicServices/alOss/upload",
'uploadUrl': platformUrl + "/platform/basicServices/alOss/upload",
'uploadUrl': platformUrl + "/platform/basicServices/alOss/upload/unsm",
"uploadExtraData": {
"pathName": "banner",
"buckType": 1
......
package com.liquidnet.client.admin.zhengzai.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -10,6 +11,7 @@ import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.BeanUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.goblin.entity.GoblinSelfMarketing;
import com.liquidnet.service.goblin.mapper.GoblinSelfMarketingMapper;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
......@@ -19,8 +21,10 @@ import com.liquidnet.service.kylin.dto.param.BannersSearchParam;
import com.liquidnet.service.kylin.dto.vo.KylinBannersVo;
import com.liquidnet.service.kylin.entity.KylinBanners;
import com.liquidnet.service.kylin.entity.KylinBannersRelations;
import com.liquidnet.service.kylin.entity.KylinPerformances;
import com.liquidnet.service.kylin.mapper.KylinBannersMapper;
import com.liquidnet.service.kylin.mapper.KylinBannersRelationsMapper;
import com.liquidnet.service.kylin.mapper.KylinPerformancesMapper;
import com.liquidnet.service.kylin.service.admin.IKylinBannersService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -63,6 +67,9 @@ public class KylinBannersServiceImpl extends ServiceImpl<KylinBannersMapper, Kyl
@Autowired
private GoblinSelfMarketingMapper goblinSelfMarketingMapper;
@Autowired
private KylinPerformancesMapper kylinPerformancesMapper;
public boolean create(BannersParam bannersParam) {
try {
// 时间
......@@ -76,7 +83,15 @@ public class KylinBannersServiceImpl extends ServiceImpl<KylinBannersMapper, Kyl
bannersParam.setOnlineEndTime(null);
}
// 入数据库
bannersMapper.insert(bannersParam.getFields(bannersId, createdAtString));
KylinBanners kylinBanners = bannersParam.getFields(bannersId, createdAtString);
String performanceName = getPerformanceNameById(bannersParam.getPerformanceId());
if (StringUtil.isBlank(performanceName)) {
kylinBanners.setPerformanceId("");
kylinBanners.setPerformanceName("");
}else {
kylinBanners.setPerformanceName(performanceName);
}
bannersMapper.insert(kylinBanners);
List<String> positionList = bannersParam.getPositionList();
KylinBannersRelations kylinBannersRelations = new KylinBannersRelations();
......@@ -105,10 +120,24 @@ public class KylinBannersServiceImpl extends ServiceImpl<KylinBannersMapper, Kyl
return true;
} catch (Exception e) {
log.error("error.", e);
return false;
}
}
private String getPerformanceNameById(String performanceId) {
if (StringUtil.isBlank(performanceId)) {
return "";
}
List<KylinPerformances> kylinPerformances = kylinPerformancesMapper.selectList(new LambdaUpdateWrapper<KylinPerformances>()
.eq(KylinPerformances::getPerformancesId, performanceId));
if (kylinPerformances.isEmpty()) {
return "";
}
return kylinPerformances.get(0).getTitle();
}
private void setBannerListRedis() {
List<KylinBanners> bannerList = bannersMapper.selectList(
Wrappers.lambdaQuery(KylinBanners.class).eq(KylinBanners::getIsOnline, 1)
......@@ -141,6 +170,14 @@ public class KylinBannersServiceImpl extends ServiceImpl<KylinBannersMapper, Kyl
KylinBanners params = bannersParam.getFields(null, null);
params.setUpdatedAt(updatedAtString);
String performanceName = getPerformanceNameById(bannersParam.getPerformanceId());
if (StringUtil.isBlank(performanceName)) {
params.setPerformanceId("");
params.setPerformanceName("");
}else {
params.setPerformanceName(performanceName);
}
/*if (StringUtils.isEmpty(bannersParam.getOnlineStartTime())) {
params.setOnlineStartTime(null);
}
......
......@@ -25,10 +25,7 @@ import com.liquidnet.service.kylin.dto.vo.admin.*;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketPartnerVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketTimesPartnerVo;
import com.liquidnet.service.kylin.dto.vo.partner.TicketTimesTicketCreatePartnerVo;
import com.liquidnet.service.kylin.dto.vo.partner.*;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.*;
import com.liquidnet.service.kylin.service.admin.IKylinPerformancesAdminService;
......@@ -977,6 +974,20 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
return performancesMapper.getSubscribeTicketStatisticalByPerformancesId(performancesId);
}
@Override
public List<KylinPerformancesVo> searchPerformanceByTitle(String title) {
LambdaQueryWrapper<KylinPerformances> lambdaQueryWrapper = new QueryWrapper<KylinPerformances>()
.lambda()
.like(KylinPerformances::getTitle, title);
List<KylinPerformances> kylinPerformances = performancesMapper.selectList(lambdaQueryWrapper);
return kylinPerformances.stream().map(k -> {
KylinPerformancesVo vo = new KylinPerformancesVo();
vo.setPerformancesId(k.getPerformancesId());
vo.setTitle(k.getTitle());
return vo;
}).collect(Collectors.toList());
}
//删除演出下所有订单缓存(订单详情,订单列表)
public void delOrderTicketsRedis(KylinPerformanceMisVo vo) {
//找到所有ticketId
......
......@@ -37,4 +37,20 @@ public class RedisKeyExpireConst {
// sweet:user:service:openId 过期时间30天
public static final long SWEET_USER_SERVICE_OPENID_EXPIRE = 30 * 24 * 60 * 60;
// kylin:luckybag:activity 过期时间30天
public static final long KYLIN_LUCKY_BAG_ACTIVITY_EXPIRE = 30 * 24 * 60 * 60;
// kylin:luckybag 过期时间30天
public static final long KYLIN_LUCKY_BAG_EXPIRE = 30 * 24 * 60 * 60;
// sweet:douduo:active 过期时间30天
public static final long SWEET_DOUDOU_ACTIVE_EXPIRE = 30 * 24 * 60 * 60;
// sweet:doudou:scope:mobile 过期时间3天
public static final long SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE = 3 * 24 * 60 * 60;
// GOBLIN_BRACELET_USER 过期时间3天
public static final long GOBLIN_BRACELET_USER_EXPIRE = 30 * 24 * 60 * 60;
// GOBLIN_BRACELET_RELATED_ORDER 过期30天
public static final long GOBLIN_BRACELET_RELATED_ORDER_EXPIRE = 30 * 24 * 60 * 60;
}
......@@ -7,10 +7,12 @@ public class SmsEnum {
*/
public enum ADSignName {
M01("摩登天空"),
M02("正在现场"),
// M02("正在现场"),
M02("摩登天空"),
M03("新血计划"),
M04("摩登小家伙"),
M05("五百里Live");
M05("五百里Live"),
M06("正在映画");
private final String val;
ADSignName(String val) {
......
......@@ -16,3 +16,13 @@ liquidnet:
mongodb:
sslEnabled: false
database: dev_ln_scene
lxpay:
apps:
dougong:
huifu-id: '6666000171841162'
sys-id: '6666000162031620'
product-id: 'PAYUN'
sub-app-id: 'wx4732efeaa2b08086'
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArR8pqWsRMqiunn8uEZGF9AeizJK0vuWjlcNnTbw9Sb96dMVuYu3SRj+Dx4E4SgyEL4CYROou1xwY57kAKEqHdH7o1W41O9jYjXZG38BrtBR+D9Qh9OqGxCZ+e4Gi38XHGg6fn67iXefOqp1kWGd4qc8tIZO1lIDXS19R09D/mESNBMulQdVPyZF7gvd11A+7EEOfRlSOjrtqIoUWV0GIqhLPUtGJk8Uq/d9NLitJyvK3tgz8cvJ4RyK6UpGtRDrqiBiQxbvK9EqMd1sw3zkvM03szSWon4LHFNqvDr6RYfFyFUCvX9UPYmeritENnroEuTBlTFLLb68ed4HZEZDPTQIDAQAB"
private-key: "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDJAOaA1ikJzDL0vUuTyl3/vlHyuSod6/gFLLrSTD6EJkma5Ld34HHu82/5pEojEvbcU113L9j3fUJlpyjX6CFk6j2KjMIuyFxhgrVFi5WT5m74wYohoWNifkQrgwsO3oxI7cewWFu/w7/yCK9dzI4QxasGUKH9iPweI+26IR0DBbOfC9GVudOy2b2xLrGAevEEHdVTNqrQNdlrTzqAH7r3uk8s2vaBZX+O4gyf7eKdHdC4CVSWfYPLO1sA48MxNwI7OExxfGeV+0wmBMGRSoZ5FhWsqZs+f9jGcmfF+uEfAO71PqHjezXYxq7+oWDfDBPCTc5fo9w5v1HV0aZaYOe1AgMBAAECggEBAI4yR98fInse7XF8NOpBwIv6/QhEfAoc9CHdCfFaJOPiHjIo2a5BpvhPWYj288eqU998TmPSAqDbCUzWm6taOb2lhJHukDT+Y3RMPqcLX275Fsp+SJUQEjoMb3eExh7ny8CQDrOvXoDkH3c/M6ic3Gf7Hslh46dz8D/2VOhXIqoObPlSLzniwiMTDBEwB7IRc3Q+r4V6ZnKt8wjKQZpotBA3TlJlEBBj/h5SbWokwMQbTqFkjl7gVe0ase2WfV+cD4qhPZx6CWphPVyWelg+wpDqXOIQdnE8pgri5a9ZkzgPTOrKyCm+EOa9lZAp81tnb2iFhrlkKPSWUW8zLtZzxMECgYEA+sNyF0U9anyxeKxXtlGKKuMHJSnBpZeU6FSvZjTewFH2Sxh3QwZjg6h5BfvTLH1XfNerx3gdpAPJ+EyAZuEibDr47bp+j4CtT27dVolz5XQ5ugOadwzdNZkq6vhuq1aGATmS/mlNE1/pdMEP9F6hi2HYncER6BFOy0xSwMKCnRECgYEAzTNxhvZ0pb2hPKylxHUydkm3Uznq5Zkquv6II6W5aiKvceETHwdRZLoKc+I0kd0/4fBfJI2Jsjexy51ERiG+8y4wVrcrky6NLw6mnXSvnTSQCftbexheJTg9c5dpfKIj+rxtuBeZ3Sj1MJQ6OSBUYu3iTqstO0Rgp/1ofWQJ8GUCgYEAspxzr0+KJ0cZwbI/54S8vT9n33iWjbQiRDnNlScjYij/HQ4YJI1wZF6jlTeBerbskeesWy+bLS/ltA4Jhz3knuKCXBHyA5TL3UBCN1lAS7c1RuE6LIHlLkAi6ap6aV//ou+3W671T0+JobfB/XVJ61WOTQ8wCfQKA5QhfVsOXYECgYEAvzbm3Ysfm6qfazi+p9lGErASov1fhGA8T1AMcJtnsh1sO8Qu20UodaJfRylNL3dqphIltpwl6eq4RTLhgjDEDTvHU6cQdfB1I5qVbDhlxSpL5uFRl91XLXvA18wKQledC3M3Esr7V/loscIOl1knCaD+t6wPVCEdqK0dB2uHT3kCgYEA3p3rlmCmWzkZ/U8jE4087YEkJWV+r86YC63r4YZEqZtfHk4hNchAYke4jYPqkTtmRVZi2C6KuVr5M3ASHmGWorBY0VA9Abd3daniNocZCeMOt4Z7U6MIbqW7KYSrjx8V8HIsdH7HF97ofRuMH6oaz9bFMM6XwrEAMY+zTdH9A4Y="
notify-url: 'https://testgoblin.zhengzai.tv/goblin/bracelet/callback'
......@@ -16,3 +16,13 @@ liquidnet:
mongodb:
sslEnabled: false
database: test_ln_scene
lxpay:
apps:
dougong:
huifu-id: '6666000171841162'
sys-id: '6666000162031620'
product-id: 'PAYUN'
sub-app-id: 'wx4732efeaa2b08086'
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArR8pqWsRMqiunn8uEZGF9AeizJK0vuWjlcNnTbw9Sb96dMVuYu3SRj+Dx4E4SgyEL4CYROou1xwY57kAKEqHdH7o1W41O9jYjXZG38BrtBR+D9Qh9OqGxCZ+e4Gi38XHGg6fn67iXefOqp1kWGd4qc8tIZO1lIDXS19R09D/mESNBMulQdVPyZF7gvd11A+7EEOfRlSOjrtqIoUWV0GIqhLPUtGJk8Uq/d9NLitJyvK3tgz8cvJ4RyK6UpGtRDrqiBiQxbvK9EqMd1sw3zkvM03szSWon4LHFNqvDr6RYfFyFUCvX9UPYmeritENnroEuTBlTFLLb68ed4HZEZDPTQIDAQAB"
private-key: "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDJAOaA1ikJzDL0vUuTyl3/vlHyuSod6/gFLLrSTD6EJkma5Ld34HHu82/5pEojEvbcU113L9j3fUJlpyjX6CFk6j2KjMIuyFxhgrVFi5WT5m74wYohoWNifkQrgwsO3oxI7cewWFu/w7/yCK9dzI4QxasGUKH9iPweI+26IR0DBbOfC9GVudOy2b2xLrGAevEEHdVTNqrQNdlrTzqAH7r3uk8s2vaBZX+O4gyf7eKdHdC4CVSWfYPLO1sA48MxNwI7OExxfGeV+0wmBMGRSoZ5FhWsqZs+f9jGcmfF+uEfAO71PqHjezXYxq7+oWDfDBPCTc5fo9w5v1HV0aZaYOe1AgMBAAECggEBAI4yR98fInse7XF8NOpBwIv6/QhEfAoc9CHdCfFaJOPiHjIo2a5BpvhPWYj288eqU998TmPSAqDbCUzWm6taOb2lhJHukDT+Y3RMPqcLX275Fsp+SJUQEjoMb3eExh7ny8CQDrOvXoDkH3c/M6ic3Gf7Hslh46dz8D/2VOhXIqoObPlSLzniwiMTDBEwB7IRc3Q+r4V6ZnKt8wjKQZpotBA3TlJlEBBj/h5SbWokwMQbTqFkjl7gVe0ase2WfV+cD4qhPZx6CWphPVyWelg+wpDqXOIQdnE8pgri5a9ZkzgPTOrKyCm+EOa9lZAp81tnb2iFhrlkKPSWUW8zLtZzxMECgYEA+sNyF0U9anyxeKxXtlGKKuMHJSnBpZeU6FSvZjTewFH2Sxh3QwZjg6h5BfvTLH1XfNerx3gdpAPJ+EyAZuEibDr47bp+j4CtT27dVolz5XQ5ugOadwzdNZkq6vhuq1aGATmS/mlNE1/pdMEP9F6hi2HYncER6BFOy0xSwMKCnRECgYEAzTNxhvZ0pb2hPKylxHUydkm3Uznq5Zkquv6II6W5aiKvceETHwdRZLoKc+I0kd0/4fBfJI2Jsjexy51ERiG+8y4wVrcrky6NLw6mnXSvnTSQCftbexheJTg9c5dpfKIj+rxtuBeZ3Sj1MJQ6OSBUYu3iTqstO0Rgp/1ofWQJ8GUCgYEAspxzr0+KJ0cZwbI/54S8vT9n33iWjbQiRDnNlScjYij/HQ4YJI1wZF6jlTeBerbskeesWy+bLS/ltA4Jhz3knuKCXBHyA5TL3UBCN1lAS7c1RuE6LIHlLkAi6ap6aV//ou+3W671T0+JobfB/XVJ61WOTQ8wCfQKA5QhfVsOXYECgYEAvzbm3Ysfm6qfazi+p9lGErASov1fhGA8T1AMcJtnsh1sO8Qu20UodaJfRylNL3dqphIltpwl6eq4RTLhgjDEDTvHU6cQdfB1I5qVbDhlxSpL5uFRl91XLXvA18wKQledC3M3Esr7V/loscIOl1knCaD+t6wPVCEdqK0dB2uHT3kCgYEA3p3rlmCmWzkZ/U8jE4087YEkJWV+r86YC63r4YZEqZtfHk4hNchAYke4jYPqkTtmRVZi2C6KuVr5M3ASHmGWorBY0VA9Abd3daniNocZCeMOt4Z7U6MIbqW7KYSrjx8V8HIsdH7HF97ofRuMH6oaz9bFMM6XwrEAMY+zTdH9A4Y="
notify-url: 'https://testgoblin.zhengzai.tv/goblin/bracelet/callback'
\ No newline at end of file
......@@ -73,7 +73,7 @@ spring:
autoconfigure:
exclude:
- org.springframework.cloud.bus.BusAutoConfiguration
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
# - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
redis:
queue:
database: ${liquidnet.redis.queue.database}
......@@ -102,6 +102,17 @@ spring:
uri: mongodb://${liquidnet.mongodb.user}:${liquidnet.mongodb.pwd}@${liquidnet.mongodb.host}/?authSource=admin&maxPoolSize=200&waitQueueMultiple=100
sslEnabled: ${liquidnet.mongodb.sslEnabled}
database: ${liquidnet.mongodb.database}
datasource:
name: ${liquidnet.mysql.database-name}
url: jdbc:mysql://${liquidnet.mysql.urlHostAndPort}/${liquidnet.mysql.database-name}?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false
username: ${liquidnet.mysql.username}
password: ${liquidnet.mysql.password}
# type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 45
minimum-idle: 8
connection-test-query: SELECT 1
# -----------------------------------------------------------
......@@ -134,6 +145,7 @@ global-auth:
- ${liquidnet.info.context}/app/mix/list
- ${liquidnet.info.context}/app/mix/details
- ${liquidnet.info.context}/wdt/**
- ${liquidnet.info.context}/bracelet/callback
oncheck-url-pattern:
-
# -----------------------------------------------------------
......
......@@ -22,3 +22,5 @@ liquidnet:
localUrl: ${liquidnet.service.kylin.url-pay.localUrl}
adam:
url: ${liquidnet.service.adam.url}
feishu:
bWebhook: "https://open.feishu.cn/open-apis/bot/v2/hook/6315d096-5947-4bbb-9c34-90808dd91555"
......@@ -22,3 +22,5 @@ liquidnet:
localUrl: ${liquidnet.service.kylin.url-pay.localUrl}
adam:
url: ${liquidnet.service.adam.url}
feishu:
bWebhook: "https://open.feishu.cn/open-apis/bot/v2/hook/6315d096-5947-4bbb-9c34-90808dd91555"
\ No newline at end of file
......@@ -22,3 +22,5 @@ liquidnet:
localUrl: ${liquidnet.service.kylin.url-pay.localUrl}
adam:
url: ${liquidnet.service.adam.url}
feishu:
bWebhook: "https://open.feishu.cn/open-apis/bot/v2/hook/6315d096-5947-4bbb-9c34-90808dd91555"
\ No newline at end of file
......@@ -22,3 +22,5 @@ liquidnet:
localUrl: ${liquidnet.service.kylin.url-pay.localUrl}
adam:
url: ${liquidnet.service.adam.url}
feishu:
bWebhook: "https://open.feishu.cn/open-apis/bot/v2/hook/6315d096-5947-4bbb-9c34-90808dd91555"
......@@ -73,7 +73,7 @@ spring:
autoconfigure:
exclude:
- org.springframework.cloud.bus.BusAutoConfiguration
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
# - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
redis:
queue:
database: ${liquidnet.redis.queue.database}
......@@ -102,6 +102,17 @@ spring:
uri: mongodb://${liquidnet.mongodb.user}:${liquidnet.mongodb.pwd}@${liquidnet.mongodb.host}/?authSource=admin&maxPoolSize=200&waitQueueMultiple=100
sslEnabled: ${liquidnet.mongodb.sslEnabled}
database: ${liquidnet.mongodb.database}
datasource:
name: ${liquidnet.mysql.database-name}
url: jdbc:mysql://${liquidnet.mysql.urlHostAndPort}/${liquidnet.mysql.database-name}?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username: ${liquidnet.mysql.username}
password: ${liquidnet.mysql.password}
# type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 45
minimum-idle: 8
connection-test-query: SELECT 1
# -----------------------------------------------------------
# -----------------------------------------------------------
......@@ -143,6 +154,9 @@ global-auth:
# 场地摄像头列表
- ${liquidnet.info.context}/camera/list
- ${liquidnet.info.context}/inner/**
# 福袋
- ${liquidnet.info.context}/luckyBag/scope
- ${liquidnet.info.context}/luckyBag/code/**
oncheck-url-pattern:
- ${liquidnet.info.context}/order/details
- ${liquidnet.info.context}/order/transfer*
......
......@@ -128,6 +128,8 @@ global-auth:
- ${liquidnet.info.context}/wechatTemplate/followStatusPhone
# 做积分任务
- ${liquidnet.info.context}/wechatUsers/doTask
# doudou
- ${liquidnet.info.context}/doudou
oncheck-url-pattern:
# - ${liquidnet.info.context}/**
# -----------------------------------------------------------
......
package com.liquidnet.service.goblin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 手环订单表实体类
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinBraceletOrder implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 订单ID
*/
private String orderId;
/**
* 用户ID
*/
private String userId;
/**
* 绑定用户姓名
*/
private String bindName;
/**
* 绑定用户手机号
*/
private String bindMobile;
/**
* 绑定用户身份证号码
*/
private String bindIdcard;
/**
* 请求日期
*/
private String reqDate;
/**
* 商品描述
*/
private String goodsDesc;
/**
* 手环ID
*/
private String wristbandId;
/**
*手环金额
*/
private BigDecimal wristbandPrice;
/**
*充值金额ID
*/
private String amountId;
/**
*充值金额
*/
private BigDecimal amountPrice;
/**
* 请求流水号
*/
private String reqSeqId;
/**
* 全局流水号
*/
private String hfSeqId;
/**
* 交易类型:
* T_JSAPI: 微信公众号支付
* T_MINIAPP: 微信小程序支付
* A_JSAPI: 支付宝JS
* A_NATIVE: 支付宝正扫
* U_NATIVE: 银联正扫
* U_JSAPI: 银联 JS
* D_NATIVE: 数字人民币正扫
* T_H5:微信直连H5支付
* T_APP:微信APP支付
* T_NATIVE:微信正扫
*/
private String tradeType;
/**
* 用户账单上的交易订单号
*/
private String outTransId;
/**
* 用户账单上的商户订单号
*/
private String partyOrderId;
/**
* 支付完成时间 格式yyyyMMddHHmmss
*/
private String endTime;
/**
* 入账时间 格式为yyyyMMdd
*/
private String acctDate;
/**
* 单价
*/
private BigDecimal price;
/**
* 应付价格
*/
private BigDecimal priceTotal;
/**
* 实付价格
*/
private BigDecimal priceActual;
/**
* 退款价格
*/
private BigDecimal priceRefund;
/**
* 退款扣除的手续费金额
*/
private BigDecimal refundPriceCharges;
/**
* 退款数
*/
private Integer refundNumber;
/**
* 支付时间
*/
private String timePay;
/**
* 订单状态:
* 0 待付款
* 1 已付款
* 2 已关闭
* 3 正在退款
* 4 已退款
* 5 待关闭
* 6 部分退款
* 7 退款失败
*/
private Integer status;
/**
* 支付状态:
* 0 未支付
* 1 已支付
* 2 支付失败
*/
private Integer payStatus;
/**
* 迈之的分订单号
*/
private String foutTradeNo;
/**
* 迈之的设备编号
*/
private String cardno;
/**
* 迈之的分订单号
*/
private Integer refundStatus;
/**
* 迈之的设备编号
*/
private String refundStatusNote;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
/**
* 备注
*/
private String comment;
}
package com.liquidnet.service.goblin.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 充值金额选项表
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeAmount implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 金额ID
*/
private String amountId;
/**
* 金额名称
*/
private String name;
/**
* 充值金额
*/
private BigDecimal price;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 手环信息表
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeWristband implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 手环ID
*/
private String wristbandId;
/**
* 手环名称
*/
private String name;
/**
* 手环价格
*/
private BigDecimal price;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
/**
* <p>
* Mapper 接口
* </p>
*
* @author jxl
*/
public interface GoblinBraceletOrderMapper extends BaseMapper<GoblinBraceletOrder> {
}
package com.liquidnet.service.goblin.mapper;
import com.liquidnet.service.goblin.entity.GoblinRechargeAmount;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 充值金额选项表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
public interface GoblinRechargeAmountMapper extends BaseMapper<GoblinRechargeAmount> {
}
package com.liquidnet.service.goblin.mapper;
import com.liquidnet.service.goblin.entity.GoblinRechargeWristband;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 手环信息表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
public interface GoblinRechargeWristbandMapper extends BaseMapper<GoblinRechargeWristband> {
}
<?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.liquidnet.service.goblin.mapper.GoblinRechargeAmountMapper">
</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.liquidnet.service.goblin.mapper.GoblinRechargeWristbandMapper">
</mapper>
......@@ -41,6 +41,16 @@ public class BannerDetailsListDao implements Serializable {
private String updatedAt;
/**
* 演出ID
*/
private String performanceId;
/**
* 演出名称
*/
private String performanceName;
public void setIsOnlineName(Integer isOnline){
this.isOnline=isOnline;
switch (isOnline){
......
......@@ -110,6 +110,16 @@ public class KylinBanners implements Serializable, Cloneable {
*/
private String updatedAt;
/**
* 演出ID
*/
private String performanceId;
/**
* 演出名称
*/
private String performanceName;
private static final KylinBanners obj = new KylinBanners();
public static KylinBanners getNew() {
......
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 福袋品牌方表
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinBrands implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 品牌ID
*/
private String brandId;
/**
* 品牌名称
*/
private String name;
/**
* 品牌地址
*/
private String address;
/**
* 官网URL
*/
private String websiteUrl;
/**
* 简介
*/
private String introduction;
/**
* 联系人
*/
private String contactName;
/**
* 联系电话
*/
private String contactPhone;
/**
* 1-可用, 0-不可用
*/
private Integer state;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 福袋配置表
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinLuckyBag implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 福袋ID
*/
private String luckyBagId;
/**
* 福袋名称
*/
private String name;
/**
* 福袋简介
*/
private String introduction;
/**
* 所属品牌ID
*/
private String brandId;
/**
* 所属演出ID
*/
private String performanceId;
/**
* 所属演出名称
*/
private String performanceName;
/**
* 所属场次ID
*/
private String ticketTimesId;
/**
* 所属票种ID
*/
private String ticketsId;
/**
* 兑换码显示状态 1:兑换码 2:二维码
*/
private Integer codeShowType;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer state;
/**
* 福袋发放时间
*/
private String sendTime;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 福袋活动表
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinLuckyBagActivity implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 福袋活动ID
*/
private String luckyBagActivityId;
/**
* 活动名称
*/
private String name;
/**
* 活动简介
*/
private String detail;
/**
* 跳转地址
*/
private String targetUrl;
/**
* 所属演出ID
*/
private String performanceId;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer state;
/**
* 排序(越大越靠前)
*/
private Integer sort;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinLuckyBagScope implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 手机号
*/
private String mobile;
/**
* 福袋ID
*/
private String luckyBagId;
/**
* 昵称
*/
private String nickName;
/**
* 真实姓名
*/
private String realName;
/**
* 身份证号码
*/
private String idCard;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer state;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 兑换码表
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinRewardCode implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 兑换码
*/
private String code;
/**
* 所属福袋ID
*/
private String luckyBagId;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer state;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 用户领取兑换码表
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinRewardUser implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 用户ID
*/
private String uid;
/**
* 所属福袋ID
*/
private String luckyBagId;
/**
* 订单ID(kylin_order_tickets)
*/
private String orderId;
/**
* 订单详情ID(kylin_order_ticket_entities)
*/
private String orderTicketEntitiesId;
/**
* 兑换码
*/
private String code;
/**
* 状态 0不可用 1可用 2已使用
*/
private Integer state;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
/**
* 保留字段
*/
private String comment;
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinBrands;
public interface KylinBrandsMapper extends BaseMapper<KylinBrands> {
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinLuckyBagActivity;
public interface KylinLuckyBagActivityMapper extends BaseMapper<KylinLuckyBagActivity> {
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinLuckyBag;
public interface KylinLuckyBagMapper extends BaseMapper<KylinLuckyBag> {
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinLuckyBagScope;
public interface KylinLuckyBagScopeMapper extends BaseMapper<KylinLuckyBagScope> {
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinRewardCode;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
public interface KylinRewardCodeMapper extends BaseMapper<KylinRewardCode> {
@Select("SELECT * FROM kylin_reward_code WHERE mid = #{mid}")
KylinRewardCode selectByMid(@Param("mid") Long mid);
@Update("update kylin_reward_code set state=#{state} where mid=#{mid}")
int updateByMid(@Param("mid") Long mid, @Param("state") int state);
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinRewardUser;
public interface KylinRewardUserMapper extends BaseMapper<KylinRewardUser> {
}
package com.liquidnet.service.sweet.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* doudou预约签名CD记录表
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SweetDoudou implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* doudou_id
*/
private String doudouId;
/**
* user_id
*/
private String userId;
/**
* 观演人姓名
*/
private String username;
/**
* 观演人手机号
*/
private String phone;
/**
* 购买平台
*/
private String platform;
/**
* 购买订单号
*/
private String orderCode;
/**
* 想给doudou说的话
*/
private String mark;
/**
* 状态 1已登记 2未中签 3已中签 4已核销
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
private static final SweetDoudou obj = new SweetDoudou();
public static SweetDoudou getNew() {
try {
return (SweetDoudou) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetDoudou();
}
}
}
package com.liquidnet.service.sweet.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class SweetDoudouActive {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* active_id
*/
private String activeId;
/**
* 标题
*/
private String title;
/**
* 活动详情
*/
private String details;
/**
* 卡片背景图
*/
private String cardImages;
/**
* 活动详情背景图
*/
private String detailImages;
/**
* 活动详情URL
*/
private String targetUrl;
/**
* 开始时间
*/
private String beginAt;
/**
* 结束时间
*/
private String endAt;
/**
* 排序,越大越靠前
*/
private Integer sort;
/**
* 状态 1可用 0不可用
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.sweet.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class SweetDoudouScope implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 手机号
*/
private String mobile;
/**
* 昵称
*/
private String nickName;
/**
* 真实姓名
*/
private String realName;
/**
* 身份证号码
*/
private String idCard;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.sweet.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.entity.SweetDoudouActive;
/**
* <p>
* doudou预约签名CD记录表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
public interface SweetDoudouActiveMapper extends BaseMapper<SweetDoudouActive> {
}
package com.liquidnet.service.sweet.mapper;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* doudou预约签名CD记录表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
public interface SweetDoudouMapper extends BaseMapper<SweetDoudou> {
}
package com.liquidnet.service.sweet.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.entity.SweetDoudouScope;
/**
* <p>
* doudou预约签名CD记录表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
public interface SweetDoudouScopeMapper extends BaseMapper<SweetDoudouScope> {
}
<?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.liquidnet.service.sweet.mapper.SweetDoudouActiveMapper">
</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.liquidnet.service.sweet.mapper.SweetDoudouMapper">
</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.liquidnet.service.sweet.mapper.SweetDoudouScopeMapper">
</mapper>
......@@ -22,4 +22,10 @@ public interface FeignGoblinTaskClient {
@GetMapping("rsc/nft/job/mixList")
ResponseDto<Boolean> mixList();
@GetMapping("/rsc/maizhi/job/getDeviceNumber")
ResponseDto<Boolean> getDeviceNumber();
@GetMapping("/rsc/maizhi/job/refundRes")
ResponseDto<Boolean> refundRes();
}
......@@ -48,4 +48,24 @@ public class GoblinTaskHandler {
XxlJobHelper.handleFail();
}
}
@XxlJob(value = "sev-goblin:getDeviceNumber")
public void getDeviceNumber() {
try {
XxlJobHelper.handleSuccess("结果:" + feignGoblinTaskClient.getDeviceNumber().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
@XxlJob(value = "sev-goblin:refundRes")
public void refundRes() {
try {
XxlJobHelper.handleSuccess("结果:" + feignGoblinTaskClient.refundRes().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
-- 创建手环产品表
CREATE TABLE IF NOT EXISTS goblin_recharge_wristband
(
mid BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
wristband_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '手环ID',
name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '手环名称',
price DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '手环价格',
created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='手环信息表';
-- 创建充值金额表
CREATE TABLE IF NOT EXISTS goblin_recharge_amount
(
mid BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
amount_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '金额ID',
name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '金额名称',
price DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '充值金额',
created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='充值金额选项表';
-- 手环订单表
CREATE TABLE goblin_bracelet_order
(
`mid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'order_id',
`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户id',
`bind_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户姓名',
`bind_mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户手机号',
`bind_idcard` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户身份证号码',
`req_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求日期',
`goods_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品描述',
`wristband_id` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手环ID',
`wristband_price` DECIMAL(10, 2) NOT NULL DEFAULT '0.00' COMMENT '手环金额',
`amount_id` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '金额ID',
`amount_price` DECIMAL(10, 2) NOT NULL DEFAULT '0.00' COMMENT '充值金额',
`req_seq_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求流水号',
`hf_seq_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '全局流水号',
`trade_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '交易类型 T_JSAPI: 微信公众号支付 T_MINIAPP: 微信小程序支付 A_JSAPI: 支付宝JS A_NATIVE: 支付宝正扫 U_NATIVE: 银联正扫 U_JSAPI: 银联 JS D_NATIVE: 数字人民币正扫 T_H5:微信直连H5支付 T_APP:微信APP支付 T_NATIVE:微信正扫',
`out_trans_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账单上的交易订单号',
`party_order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账单上的商户订单号',
`end_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '支付完成时间 格式yyyyMMddHHmmss',
`acct_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '入账时间 格式为yyyyMMdd',
`price` decimal(8, 2) NOT NULL DEFAULT '0.00' COMMENT '单价',
`price_total` decimal(8, 2) NOT NULL DEFAULT '0.00' COMMENT '应付价格',
`price_actual` decimal(8, 2) NOT NULL DEFAULT '0.00' COMMENT '实付价格',
`price_refund` decimal(8, 2) NOT NULL DEFAULT '0.00' COMMENT '退款价格',
`refund_price_charges` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '退款扣除的手续费金额',
`refund_number` int(11) NOT NULL DEFAULT '0' COMMENT '退款数',
`time_pay` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '支付时间',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态:0待付款,1已付款,2已关闭,3正在退款,4已退款, 5待关闭 6部分退款',
`pay_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态:0未支付 1已支付 2支付失败',
`fout_trade_no` varchar(255) NOT NULL DEFAULT '' COMMENT '迈之的分订单号',
`cardno` varchar(255) NOT NULL DEFAULT '' COMMENT '迈之的设备编号',
`refund_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '迈之退款审核状态:0待审核 1 审核通过 2 审核驳回',
`refund_status_note` varchar(255) NOT NULL DEFAULT '' COMMENT '迈之退款驳回原因',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'comment',
PRIMARY KEY (`mid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci COMMENT ='手环订单表';
......@@ -97,6 +97,12 @@
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>com.huifu.bspay.sdk</groupId>
<artifactId>dg-java-sdk</artifactId>
<version>3.0.27</version>
</dependency>
</dependencies>
<build>
......
package com.liquidnet.service;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
......@@ -14,6 +15,7 @@ import java.util.Arrays;
@Slf4j
@EnableFeignClients
@SpringBootApplication(scanBasePackages = {"com.liquidnet"})
@MapperScan(basePackages = {"com.liquidnet.service.*.mapper"})
public class ServiceGoblinApplication implements CommandLineRunner {
@Autowired
private Environment environment;
......
package com.liquidnet.service.goblin.config.properties;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@ConfigurationProperties(prefix = "liquidnet.lxpay")
@Component
@Setter
@Getter
public class AppProperties {
private Map<String, AppInfo> apps;
@Data
public static class AppInfo {
private String productId;
private String sysId;
private String huifuId;
private String subAppId;
private String publicKey;
private String privateKey;
private String notifyUrl;
}
}
package com.liquidnet.service.goblin.controller;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.codec.annotation.DecryptAndVerify;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
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.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Map;
@Slf4j
@Api(tags = "商城-手环相关")
@RestController
@RequestMapping("/bracelet")
public class GoblinBraceletOrderController {
@Autowired
private IGoblinBraceletOrderService braceLetOrderService;
@PostMapping("/pre")
@ApiOperation("下单(加密)")
@DecryptAndVerify(decryptedClass = GoblinBraceletOrderPayParam.class)
public ResponseDto<GoblinBraceletPayResultVo> checkOrder(@RequestBody @Valid EncryptedReq<GoblinBraceletOrderPayParam> payParam) {
return braceLetOrderService.checkOrder(payParam.getData());
}
@PostMapping("/fc7bce6d6c2213b866f76493f92224b8")
@ApiOperation("下单(非加密)")
public ResponseDto<GoblinBraceletPayResultVo> checkOrder(@RequestBody @Valid GoblinBraceletOrderPayParam payParam) {
return braceLetOrderService.checkOrder(payParam);
}
@GetMapping("/checkPayment")
@ApiOperation("查询订单状态")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单ID", example = "1"),
})
public ResponseDto<Map<String, Object>> checkOrderResult(@RequestParam("orderId") @NotBlank(message = "订单ID不能为空") String orderId) {
return braceLetOrderService.checkOrderResult(orderId);
}
@GetMapping("/order/list")
@ApiOperation("查询订单列表")
public ResponseDto<List<GoblinBraceletOrderVo>> getOrderList() {
return ResponseDto.success(braceLetOrderService.getOrderList());
}
@PostMapping("/callback")
// @ApiOperation("斗拱支付回调")
public ResponseDto<Boolean> dougongCallBack(@RequestParam Map<String, Object> params) {
log.info("dougong-callback: {}.", JsonUtils.toJson(params));
DougongSyncCallbackparam dougongSyncCallbackparam = new DougongSyncCallbackparam();
dougongSyncCallbackparam.setRespCode((String) params.get("resp_code"));
dougongSyncCallbackparam.setRespDesc((String) params.get("resp_code"));
dougongSyncCallbackparam.setSign((String) params.get("sign"));
dougongSyncCallbackparam.setRespData((String) params.get("resp_data"));
return braceLetOrderService.dougongCallBack(dougongSyncCallbackparam);
}
}
package com.liquidnet.service.goblin.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinRechargeWristbandVo;
import com.liquidnet.service.goblin.dto.vo.MaiZhiAllVo.*;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@Slf4j
@Api(tags = "充值金额")
@RestController
@Validated
@RequestMapping("/recharge")
public class GoblinRechargeAmountController {
@Autowired
private IGoblinRechargeWristbandService iGoblinRechargeWristbandService;
@GetMapping("goods/list")
@ApiOperation("获得金额列表")
public ResponseDto<GoblinRechargeWristbandVo> getList() {
return ResponseDto.success(iGoblinRechargeWristbandService.getList());
}
@PostMapping("auth")
@ApiOperation("二要素认证")
public ResponseDto<String> auth(@RequestBody IdCardParam param) {
CheckIdcardResponse res = iGoblinRechargeWristbandService.auth(param);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res.getMessage());
} else {
return ResponseDto.failure(res.getMsg());
}
}
/*@PostMapping("order/create")
@ApiOperation("创建订单")
public ResponseDto<String> createOrder(@RequestBody OrderParam param) {
OrderResponse res = iGoblinRechargeWristbandService.createOrder(param);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res.getMsg());
} else {
return ResponseDto.failure(res.getMsg());
}
}*/
/*@PostMapping("order/info")
@ApiOperation("订单查询")
public ResponseDto<List<OrderInfoResponse.OrderList>> getOrder(@RequestBody OrderInfoParam param) {
OrderInfoResponse res = iGoblinRechargeWristbandService.getOrder(param);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res.getOutlist());
} else {
return ResponseDto.failure();
}
}*/
@GetMapping("order/qrcode")
@ApiOperation("获取二维码字符串")
@ApiImplicitParams({
@ApiImplicitParam(type = "param", required = true, name = "outno", value = "分订单号"),
})
public ResponseDto<String> getQrcode(@NotBlank(message = "参数无效:outno") @RequestParam("outno") String outno) {
GenerateDeviceCodeResponse res = iGoblinRechargeWristbandService.getQrcode(outno);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res.getQrcode_str());
} else {
return ResponseDto.failure();
}
}
/*@GetMapping("device/mumber")
@ApiOperation("获取设备编号列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "param", required = true, name = "operationNo", value = "活动号"),
})
public ResponseDto<Boolean> getDeviceNumber(
@NotNull(message = "参数无效") @RequestParam("operationNo") Integer operationNo
) {
Boolean res = iGoblinRechargeWristbandService.getDeviceNumber(operationNo);
if (res) {
return ResponseDto.success();
} else {
return ResponseDto.failure();
}
}*/
@GetMapping("device/balance")
@ApiOperation("获取余额")
@ApiImplicitParams({
@ApiImplicitParam(type = "param", required = true, name = "cardno", value = "设备编号"),
})
public ResponseDto<BigDecimal> getDeviceBalance(
@NotBlank(message = "参数无效:cardno") @RequestParam("cardno") String cardno
) {
DeviceBalanceResponse res = iGoblinRechargeWristbandService.getDeviceBalance(cardno);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res.getMoney());
} else {
return ResponseDto.failure(res.getMsg());
}
}
@GetMapping("device/record")
@ApiOperation("获取设备记录")
@ApiImplicitParams({
@ApiImplicitParam(type = "param", required = true, name = "cardno", value = "设备编号"),
@ApiImplicitParam(type = "param", required = true, name = "page", value = "分页"),
})
public ResponseDto<DeviceRecordResponse> getDeviceRecord(
@NotBlank(message = "参数无效:cardno") @RequestParam("cardno") String cardno,
@NotNull(message = "参数无效:page") @RequestParam("page") Integer page
) {
DeviceRecordResponse res = iGoblinRechargeWristbandService.getDeviceRecord(cardno, page);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res);
} else {
return ResponseDto.failure(res.getMsg());
}
}
@GetMapping("order/refund/apply")
@ApiOperation("退款申请")
@ApiImplicitParams({
@ApiImplicitParam(type = "param", required = true, name = "orderId", value = "订单编号"),
})
public ResponseDto<ChangeDeviceStatusResponse> refundApply(
@NotBlank(message = "参数无效:orderId") @RequestParam("orderId") String orderId
) {
ChangeDeviceStatusResponse res = iGoblinRechargeWristbandService.changeDeviceStatus(orderId, 1);
if (null != res && res.getErrcode() == 200) {
return ResponseDto.success(res);
} else {
return ResponseDto.failure(res.getMsg());
}
}
/*@GetMapping("order/refund/result")
@ApiOperation("退款结果查询")
public ResponseDto<Boolean> refundRes() {
Boolean res = iGoblinRechargeWristbandService.refundRes();
if (res) {
return ResponseDto.success();
} else {
return ResponseDto.failure();
}
}*/
}
package com.liquidnet.service.goblin.controller.Inner;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Api(tags = "@API:RSC")
@RestController
@Validated
@RequestMapping("/rsc/maizhi/job")
public class GoblinMaiZhiJobController {
@Autowired
private IGoblinRechargeWristbandService iGoblinRechargeWristbandService;
@GetMapping("getDeviceNumber")
@ApiOperation("获取设备编号JOB")
public ResponseDto<Boolean> getDeviceNumber() {
return ResponseDto.success(iGoblinRechargeWristbandService.getDeviceNumber(2));
}
@GetMapping("refundRes")
@ApiOperation("获取设备编号JOB")
public ResponseDto<Boolean> refundRes() {
return ResponseDto.success(iGoblinRechargeWristbandService.refundRes());
}
}
package com.liquidnet.service.goblin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
import com.liquidnet.service.goblin.enums.OrderStatus;
import com.liquidnet.service.goblin.enums.PayStatus;
import com.liquidnet.service.goblin.mapper.GoblinBraceletOrderMapper;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class GoblinBraceletOrderServiceImpl extends ServiceImpl<GoblinBraceletOrderMapper, GoblinBraceletOrder> implements IGoblinBraceletOrderService {
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
private QueueUtils queueUtils;
@Autowired
private IGoblinRechargeWristbandService rechargeWristbandService;
@Autowired
private IGoblinDougongPayService dougongPayService;
@Autowired
private IGoblinRechargeWristbandService iGoblinRechargeWristbandService;
@Autowired
private GoblinBraceletOrderMapper braceletOrderMapper;
@Override
public ResponseDto<GoblinBraceletPayResultVo> checkOrder(GoblinBraceletOrderPayParam payParam) {
log.info("request param: {}.", JsonUtils.toJson(payParam));
LambdaQueryWrapper<GoblinBraceletOrder> queryWrapper = new QueryWrapper<GoblinBraceletOrder>()
.lambda()
.eq(GoblinBraceletOrder::getBindIdcard, payParam.getIdCard())
.in(GoblinBraceletOrder::getStatus, OrderStatus.PAID.getCode(), OrderStatus.REFUNDING.getCode(),
OrderStatus.PARTIAL_REFUND.getCode());
List<GoblinBraceletOrder> goblinBraceletOrders = braceletOrderMapper.selectList(queryWrapper);
if (!goblinBraceletOrders.isEmpty()) {
log.info("不能重复购买");
return ResponseDto.failure("不能重复购买");
}
GoblinRechargeWristbandVo rechargeWristbandVo = rechargeWristbandService.getList();
if (rechargeWristbandVo == null) {
log.error("查询商品为空");
return ResponseDto.failure("下单失败");
}
if (!rechargeWristbandVo.getWristbandId().equals(payParam.getWristbandId())) {
log.error("下单商品不存在");
return ResponseDto.failure("下单商品不存在");
}
List<GoblinRechargeAmountVo> amonutList = rechargeWristbandVo.getAmonutList();
if (amonutList.isEmpty()) {
log.error("充值面额不存在");
return ResponseDto.failure("充值面额不存在");
}
List<GoblinRechargeAmountVo> payAmountList = amonutList.stream()
.filter(a -> a.getAmountId().equals(payParam.getAmountId()))
.collect(Collectors.toList());
if (payAmountList.isEmpty()) {
log.error("充值面额不存在");
return ResponseDto.failure("充值面额不存在");
}
// 要充值的面额
final GoblinRechargeAmountVo payAmountVo = payAmountList.get(0);
final String orderId = IDGenerator.nextSnowId();
final GoblinBraceletOrderVo orderVo = buildRechargeOrder(orderId, rechargeWristbandVo.getWristbandId(), rechargeWristbandVo.getPrice(),
payAmountVo.getAmountId(), payAmountVo.getPrice(), payParam);
if (orderVo == null) {
log.error("下单失败");
return ResponseDto.failure("下单失败");
}
// 4. 调用斗拱拉起支付
DougongJsPayData dougongJsPayData = new DougongJsPayData();
dougongJsPayData.setReqDate(orderVo.getReqDate());
dougongJsPayData.setReqSeqId(orderVo.getReqSeqId());
dougongJsPayData.setTradeType(orderVo.getTradeType());
dougongJsPayData.setGoodsDesc(orderVo.getGoodsDesc());
dougongJsPayData.setTransAmt(orderVo.getPriceTotal().setScale(2, RoundingMode.HALF_UP).toPlainString());
dougongJsPayData.setTimeExpire(DateUtil.format(DateUtil.addHour(new Date(), 2), DateUtil.Formatter.yyyyMMddHHmmssTrim));
dougongJsPayData.setSubOpenid(payParam.getSubOpenId());
dougongJsPayData.setGoodsDetailList(getGoodsDetailList(rechargeWristbandVo.getWristbandId(),
rechargeWristbandVo.getPrice(), rechargeWristbandVo.getName(), payAmountVo));
Map<String, Object> dougongResponseMap = dougongPayService.jsPay(dougongJsPayData);
if (null == dougongResponseMap || dougongResponseMap.isEmpty()) {
log.error("拉起下单失败");
return ResponseDto.failure("下单失败");
}
// 根据响应接口填充参数
orderVo.setHfSeqId((String) dougongResponseMap.get("hf_seq_id"));
orderVo.setPartyOrderId((String) dougongResponseMap.get("party_order_id"));
// 5. 根据响应结构写 redis、mysql
goblinRedisUtils.setBraceletOrderVo(orderVo);
goblinRedisUtils.setBraceletRelatedOrderVo(orderVo.getReqSeqId(), orderVo.getOrderId());
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_insert"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
sqlDataOrder.add(new Object[]{
orderVo.getOrderId(), orderVo.getUserId(), orderVo.getBindName(), orderVo.getBindMobile(), orderVo.getBindIdcard(),
orderVo.getReqDate(), orderVo.getGoodsDesc(), orderVo.getWristbandId(), orderVo.getWristbandPrice(), orderVo.getAmountId(),
orderVo.getAmountPrice(), orderVo.getReqSeqId(), orderVo.getHfSeqId(), orderVo.getTradeType(),
orderVo.getPartyOrderId(), orderVo.getPrice(), orderVo.getPriceTotal(), orderVo.getPriceRefund(),
orderVo.getRefundPriceCharges(), orderVo.getRefundNumber(), orderVo.getStatus(), orderVo.getPayStatus(),
orderVo.getCreatedAt(), orderVo.getUpdatedAt()
});
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)
);
// 6. 响应数据
GoblinBraceletPayResultVo resultVo = GoblinBraceletPayResultVo.getNew();
resultVo.setOrderId(orderVo.getOrderId());
resultVo.setPrice(orderVo.getPriceTotal());
resultVo.setPayInfo(dougongResponseMap.get("pay_info"));
return ResponseDto.success(resultVo);
}
private List<DougongRequestParam.WxDataGoodsDetail> getGoodsDetailList(String wristbandId,
BigDecimal wristbandPrice,
String wristbandName,
GoblinRechargeAmountVo payAmountVo) {
List<DougongRequestParam.WxDataGoodsDetail> goodsDetailList = new ArrayList<>();
goodsDetailList.add(new DougongRequestParam.WxDataGoodsDetail(wristbandId, wristbandName, wristbandPrice.toPlainString(), 1));
goodsDetailList.add(new DougongRequestParam.WxDataGoodsDetail(payAmountVo.getAmountId(), payAmountVo.getName(), payAmountVo.getPrice().toPlainString(), 1));
return goodsDetailList;
}
/**
* @param orderId 手环订单ID
* @param wristbandId 手环ID
* @param wristbandPrice 手环金额
* @param amountId 充值金额ID
* @param amountPrice 充值金额
* @param payParam
* @return
*/
private GoblinBraceletOrderVo buildRechargeOrder(String orderId,
String wristbandId,
BigDecimal wristbandPrice,
String amountId,
BigDecimal amountPrice,
GoblinBraceletOrderPayParam payParam) {
BigDecimal totalAmount = BigDecimal.ZERO.add(wristbandPrice).add(amountPrice);
final String uid = CurrentUtil.getCurrentUid();
log.info("用户{}需要付款金额: {}.", uid, totalAmount.toPlainString());
GoblinBraceletOrderVo braceletOrderVo = new GoblinBraceletOrderVo();
braceletOrderVo.setOrderId(orderId);
braceletOrderVo.setUserId(uid);
braceletOrderVo.setBindName(payParam.getName());
braceletOrderVo.setBindMobile(payParam.getMobile());
braceletOrderVo.setBindIdcard(payParam.getIdCard());
braceletOrderVo.setReqDate(DateUtil.getNowTime("yyyyMMdd"));
braceletOrderVo.setGoodsDesc(getGoodsDesc());
braceletOrderVo.setWristbandId(wristbandId);
braceletOrderVo.setWristbandPrice(wristbandPrice);
braceletOrderVo.setAmountId(amountId);
braceletOrderVo.setAmountPrice(amountPrice);
braceletOrderVo.setReqSeqId(IDGenerator.nextSnowId());
braceletOrderVo.setTradeType("T_MINIAPP");
braceletOrderVo.setPrice(totalAmount);
braceletOrderVo.setPriceTotal(totalAmount);
braceletOrderVo.setPriceRefund(BigDecimal.ZERO);
braceletOrderVo.setRefundPriceCharges(BigDecimal.ZERO);
braceletOrderVo.setRefundNumber(0);
braceletOrderVo.setStatus(OrderStatus.PENDING_PAYMENT.getCode());
braceletOrderVo.setPayStatus(PayStatus.NOT_PAID.getCode());
braceletOrderVo.setCreatedAt(LocalDateTime.now());
braceletOrderVo.setUpdatedAt(LocalDateTime.now());
return braceletOrderVo;
}
/**
* 获取商品描述
*
* @return
*/
private String getGoodsDesc() {
return "手环充值";
}
@Override
public ResponseDto<Map<String, Object>> checkOrderResult(String orderId) {
final String uid = CurrentUtil.getCurrentUid();
GoblinBraceletOrderVo braceletOrderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (braceletOrderVo == null) {
log.error("订单不存在");
return ResponseDto.failure("订单不存在");
}
if (!uid.equals(braceletOrderVo.getUserId())) {
log.error("暂无权限");
return ResponseDto.failure("暂无权限");
}
Map<String, Object> map = new HashMap<>();
map.put("status", braceletOrderVo.getPayStatus());
map.put("outno", braceletOrderVo.getFoutTradeNo());
return ResponseDto.success(map);
}
@Override
public ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam) {
log.info("斗拱回调参数: {}.", JsonUtils.toJson(callbackparam));
// 验签
boolean verifySign = dougongPayService.verifySign(callbackparam.getRespData(), callbackparam.getSign());
// 2. 判断验签结果
if (!verifySign) {
log.error("斗拱回调验签失败");
return ResponseDto.failure();
}
try {
Map<String, Object> callbackRespDataMap = JsonUtils.fromJson(callbackparam.getRespData(), Map.class);
if (callbackRespDataMap == null || !"00000000".equals(callbackRespDataMap.get("resp_code"))) {
log.error("斗拱回调数据为空");
return ResponseDto.failure();
}
final String reqSeqId = (String) callbackRespDataMap.get("req_seq_id");
final String orderId = goblinRedisUtils.getBraceletRelatedOrderVo(reqSeqId);
if (StringUtil.isBlank(orderId)) {
log.error("未找到对应的订单, reqSeqId: {}.", reqSeqId);
return ResponseDto.failure();
}
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (orderVo == null) {
log.error("未找到对应的订单, reqSeqId: {}.", reqSeqId);
return ResponseDto.failure();
}
orderVo.setOutTransId((String) callbackRespDataMap.get("out_trans_id"));
orderVo.setEndTime((String) callbackRespDataMap.get("end_time"));
orderVo.setAcctDate((String) callbackRespDataMap.getOrDefault("acct_date", callbackRespDataMap.get("end_time")));
orderVo.setPriceActual(new BigDecimal((String) callbackRespDataMap.get("pay_amt")));
orderVo.setTimePay((String) callbackRespDataMap.get("end_time"));
orderVo.setUpdatedAt(LocalDateTime.now());
if ("S".equalsIgnoreCase((String) callbackRespDataMap.get("trans_stat"))) {
// 斗拱返回成功
orderVo.setStatus(OrderStatus.PAID.getCode());
orderVo.setPayStatus(PayStatus.PAID.getCode());
// 去迈之下单
MaiZhiAllVo.OrderParam orderParam = MaiZhiAllVo.OrderParam.getNew();
orderParam.setOperationNo("2");
orderParam.setOut_trade_no(orderVo.getPartyOrderId());
orderParam.setDgoid(orderVo.getHfSeqId());
orderParam.setReceipt_amount(orderVo.getPriceTotal());
orderParam.setTotal(1);
orderParam.setPayTime(orderVo.getEndTime());
List<MaiZhiAllVo.OrderParam.User> userList = new ArrayList<>();
MaiZhiAllVo.OrderParam.User user = MaiZhiAllVo.OrderParam.User.getNew();
user.setIdcard(orderVo.getBindIdcard());
user.setName(orderVo.getBindName());
user.setPhone(orderVo.getBindMobile());
user.setMoney(orderVo.getAmountPrice());
userList.add(user);
orderParam.setUserList(userList);
iGoblinRechargeWristbandService.createOrder(orderParam, orderId);
} else {
// 斗拱返回失败
// orderVo.setStatus(OrderStatus.PAID.getCode());
orderVo.setPayStatus(PayStatus.PAYMENT_FAILED.getCode());
}
// 更新redis
GoblinBraceletOrderVo orderVo1 = goblinRedisUtils.getBraceletOrderVo(orderId);
orderVo.setFoutTradeNo(orderVo1.getFoutTradeNo());
goblinRedisUtils.setBraceletOrderVo(orderVo);
// 更新MySQL
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.get("gpblin_bracelet_order_update", orderVo.getOutTransId(), orderVo.getEndTime(),
orderVo.getAcctDate(), orderVo.getPriceActual(), orderVo.getTimePay(), orderVo.getStatus(),
orderVo.getPayStatus(), orderVo.getUpdatedAt(), orderVo.getOrderId())
);
return ResponseDto.success(Boolean.TRUE);
} catch (Exception e) {
log.error("error", e);
return ResponseDto.failure();
}
}
@Override
public List<GoblinBraceletOrderVo> getOrderList() {
final String uid = CurrentUtil.getCurrentUid();
LambdaQueryWrapper<GoblinBraceletOrder> queryWrapper = new QueryWrapper<GoblinBraceletOrder>()
.lambda()
.eq(GoblinBraceletOrder::getUserId, uid)
.in(GoblinBraceletOrder::getStatus, OrderStatus.PAID.getCode(), OrderStatus.REFUNDING.getCode(),
OrderStatus.REFUNDED.getCode())
.orderByDesc(GoblinBraceletOrder::getCreatedAt);
List<GoblinBraceletOrder> goblinBraceletOrders = braceletOrderMapper.selectList(queryWrapper);
if (goblinBraceletOrders.isEmpty()) {
return Collections.emptyList();
}
return goblinBraceletOrders.stream()
.map(m -> GoblinBraceletOrderVo.getNew().copy(m))
.collect(Collectors.toList());
}
}
package com.liquidnet.service.goblin.service.impl;
import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import com.huifu.bspay.sdk.opps.core.net.BasePayRequest;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.config.properties.AppProperties;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import com.liquidnet.service.goblin.util.DougongSignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j
@Service
public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService {
private final AppProperties.AppInfo appInfo;
public GoblinDougongPayServiceImpl(AppProperties appProperties) {
this.appInfo = appProperties.getApps().get("dougong");
if (this.appInfo == null) {
throw new IllegalArgumentException("找不到应用配置");
}
}
@PostConstruct
public void init() {
MerConfig merConfig = new MerConfig();
merConfig.setProcutId(appInfo.getProductId());
merConfig.setSysId(appInfo.getSysId());
merConfig.setRsaPrivateKey(appInfo.getPrivateKey());
merConfig.setRsaPublicKey(appInfo.getPublicKey());
try {
BasePay.initWithMerConfig(merConfig);
} catch (Exception e) {
log.error("初始化支付配置失败", e);
throw new RuntimeException("初始化支付配置失败", e);
}
}
@Override
public Map<String, Object> jsPay(DougongJsPayData data) {
DougongRequestParam requestParam = buildDougongRequestParam(data);
log.info("request param: {}.", JsonUtils.toJson(requestParam));
if (requestParam == null) {
log.error("构建下单参数失败");
return null;
}
try {
Map<String, Object> map = JsonUtils.fromJson(JsonUtils.toJson(requestParam), Map.class);
//3. 发起API调用
Map<String, Object> response = BasePayRequest.requestBasePay("v3/trade/payment/jspay", map, null, false);
log.info("response: {}.", JsonUtils.toJson(response));
if (response != null && "00000100".equals(response.get("resp_code"))
&& "P".equals(response.get("trans_stat"))){
return response;
}
} catch (Exception e) {
log.error("error", e);
}
return null;
}
@Override
public boolean verifySign(String data, String sign) {
boolean verify = DougongSignUtils.verify(data, appInfo.getPublicKey(), sign);
return verify;
}
private DougongRequestParam buildDougongRequestParam(DougongJsPayData data){
if (data == null) {
return null;
}
DougongRequestParam requestParam = new DougongRequestParam();
requestParam.setReqDate(data.getReqDate());
requestParam.setReqSeqId(data.getReqSeqId());
requestParam.setHuifuId(appInfo.getHuifuId());
requestParam.setGoodsDesc(data.getGoodsDesc());
requestParam.setTradeType(data.getTradeType());
requestParam.setTransAmt(data.getTransAmt());
requestParam.setTimeExpire(data.getTimeExpire());
requestParam.setWxData(buildWxData(data));
requestParam.setNotifyUrl(appInfo.getNotifyUrl());
return requestParam;
}
private String buildWxData(DougongJsPayData data) {
DougongRequestParam.WxData wxData = new DougongRequestParam.WxData();
wxData.setSubAppid(appInfo.getSubAppId());
wxData.setSubOpenid(data.getSubOpenid());
wxData.setBody(data.getGoodsDesc());
wxData.setDetail(buildWxDataDetail(data));
return JsonUtils.toJson(wxData);
}
private DougongRequestParam.WxDataDetail buildWxDataDetail(DougongJsPayData data) {
DougongRequestParam.WxDataDetail wxDataDetail = new DougongRequestParam.WxDataDetail();
wxDataDetail.setCostPrice(data.getTransAmt());
wxDataDetail.setGoodsDetail(data.getGoodsDetailList());
return wxDataDetail;
}
}
package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.service.goblin.entity.GoblinRechargeAmount;
import com.liquidnet.service.goblin.mapper.GoblinRechargeAmountMapper;
import com.liquidnet.service.goblin.service.IGoblinRechargeAmountService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 充值金额选项表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
@Service
public class GoblinRechargeAmountServiceImpl extends ServiceImpl<GoblinRechargeAmountMapper, GoblinRechargeAmount> implements IGoblinRechargeAmountService {
}
package com.liquidnet.service.goblin.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinRechargeAmountVo;
import com.liquidnet.service.goblin.dto.vo.GoblinRechargeWristbandVo;
import com.liquidnet.service.goblin.dto.vo.MaiZhiAllVo.*;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
import com.liquidnet.service.goblin.entity.GoblinRechargeAmount;
import com.liquidnet.service.goblin.entity.GoblinRechargeWristband;
import com.liquidnet.service.goblin.mapper.GoblinRechargeAmountMapper;
import com.liquidnet.service.goblin.mapper.GoblinRechargeWristbandMapper;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.QueueUtils;
import com.liquidnet.service.goblin.util.ThirdMaiZhiUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* <p>
* 手环信息表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2025-07-03
*/
@Slf4j
@Service
public class GoblinRechargeWristbandServiceImpl extends ServiceImpl<GoblinRechargeWristbandMapper, GoblinRechargeWristband> implements IGoblinRechargeWristbandService {
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
private QueueUtils queueUtils;
@Autowired
ThirdMaiZhiUtils thirdMaiZhiUtils;
@Autowired
private GoblinRechargeAmountMapper rechargeAmountMapper;
@Autowired
private GoblinRechargeWristbandMapper rechargeWristbandMapper;
@Autowired
private IGoblinBraceletOrderService iGoblinBraceletOrderService;
@Override
public GoblinRechargeWristbandVo getList() {
GoblinRechargeWristbandVo result = goblinRedisUtils.getRechargeWristbandVo();
if (result == null) {
// 从数据库中查询数据
List<GoblinRechargeWristband> rechargeWristbands = rechargeWristbandMapper.selectList(null);
List<GoblinRechargeAmount> rechargeAmounts = rechargeAmountMapper.selectList(null);
// 组合数据
if (!CollectionUtils.isEmpty(rechargeAmounts) && !CollectionUtils.isEmpty(rechargeWristbands)) {
GoblinRechargeWristbandVo wristbandVo = GoblinRechargeWristbandVo.getNew();
wristbandVo.setWristbandId(rechargeWristbands.get(0).getWristbandId());
wristbandVo.setName(rechargeWristbands.get(0).getName());
wristbandVo.setPrice(rechargeWristbands.get(0).getPrice());
List<GoblinRechargeAmountVo> list = new ArrayList<>();
for (GoblinRechargeAmount amount : rechargeAmounts) {
GoblinRechargeAmountVo amountVo = GoblinRechargeAmountVo.getNew();
amountVo.setAmountId(amount.getAmountId());
amountVo.setName(amount.getName());
amountVo.setPrice(amount.getPrice());
list.add(amountVo);
}
wristbandVo.setAmonutList(list);
goblinRedisUtils.setRechargeWristbandVo(wristbandVo);
return wristbandVo;
}
}
return result;
}
@Override
public CheckIdcardResponse auth(IdCardParam param) {
String accessToken = this.getAccessToken();
if (null != accessToken) {
return thirdMaiZhiUtils.checkIdcard(accessToken, param.getIdcard(), param.getName());
}
return null;
}
@Override
public OrderResponse createOrder(OrderParam param, String orderId) {
log.info("createOrder 参数:{}", param);
String accessToken = this.getAccessToken();
if (null != accessToken) {
OrderResponse addOrder = thirdMaiZhiUtils.addOrder(accessToken, param);
log.info("createOrder 迈之结果:{}", addOrder);
if (addOrder != null && addOrder.getErrcode() == 200) {
OrderInfoParam orderInfoParam = OrderInfoParam.getNew();
List<String> orderList = new ArrayList<>();
orderList.add(param.getOut_trade_no());
orderInfoParam.setOrderList(orderList);
OrderInfoResponse order = this.getOrder(orderInfoParam, orderId);
return addOrder;
} else {
log.info("createOrder 迈之结果400 msg:{}", addOrder.getMsg());
}
}
return null;
}
@Override
public OrderInfoResponse getOrder(OrderInfoParam param, String orderId) {
log.info("getOrder 参数:{}", param);
String accessToken = this.getAccessToken();
if (null != accessToken) {
OrderInfoResponse order = thirdMaiZhiUtils.getOrder(accessToken, param);
log.info("getOrder 结果:{}", order);
if (order != null && order.getErrcode() == 200) {
List<OrderInfoResponse.OrderList> outlist = order.getOutlist();
OrderInfoResponse.OrderList orderList = outlist.get(0);
List<OrderInfoResponse.OrderList.UserOrder> userOrder = orderList.getUser_order();
String foutTradeNo = userOrder.get(0).getFout_trade_no();
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
orderVo.setFoutTradeNo(foutTradeNo);
goblinRedisUtils.setBraceletOrderVo(orderVo);
goblinRedisUtils.setOrderIdByFoutTradeNo(foutTradeNo, orderId);
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_update_fout_trade_no"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
sqlDataOrder.add(new Object[]{
foutTradeNo, LocalDateTime.now(), orderId
});
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)
);
} else {
log.info("getOrder 结果400 msg:{}", order);
}
}
return null;
}
@Override
public GenerateDeviceCodeResponse getQrcode(String outno) {
String accessToken = this.getAccessToken();
if (null != accessToken) {
return thirdMaiZhiUtils.generateDeviceCode(accessToken, outno);
}
return null;
}
@Override
public Boolean getDeviceNumber(Integer operationNo) {
String accessToken = this.getAccessToken();
String endtime = goblinRedisUtils.getDeviceNumberEndTime(operationNo);
if (null != endtime) {
Instant instant = Instant.EPOCH;
long timestamp = instant.toEpochMilli();
endtime = String.valueOf(timestamp);
}
long timestamp = Instant.now().toEpochMilli();
if (null != accessToken) {
DeviceNumberResponse res = thirdMaiZhiUtils.getDeviceNumber(accessToken, operationNo, endtime, String.valueOf(timestamp));
if (null != res && res.getErrcode() == 200) {
for (DeviceNumberResponse.NumberList info : res.getList()) {
String orderId = goblinRedisUtils.getOrderIdByFoutTradeNo(info.getFout_trade_no());
if (null != orderId) {
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (null != orderVo) {
orderVo.setCardno(info.getCardno());
goblinRedisUtils.setBraceletOrderVo(orderVo);
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_update_cardno"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
sqlDataOrder.add(new Object[]{
info.getCardno(), LocalDateTime.now(), orderId
});
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)
);
}
}
}
goblinRedisUtils.setDeviceNumberEndTime(operationNo, String.valueOf(timestamp));
return true;
}
}
return false;
}
@Override
public DeviceBalanceResponse getDeviceBalance(String cardno) {
String accessToken = this.getAccessToken();
if (null != accessToken) {
return thirdMaiZhiUtils.getDeviceBalance(accessToken, cardno);
}
return null;
}
@Override
public DeviceRecordResponse getDeviceRecord(String cardno, Integer page) {
String accessToken = this.getAccessToken();
if (null != accessToken) {
return thirdMaiZhiUtils.getDeviceRecord(accessToken, cardno, page);
}
return null;
}
@Override
public ChangeDeviceStatusResponse changeDeviceStatus(String orderId, int type) {
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
String cardno = orderVo.getCardno();
String accessToken = this.getAccessToken();
if (null != accessToken) {
log.info("changeDeviceStatus 参数 cardno:{}, type:{}", cardno, type);
ChangeDeviceStatusResponse response = thirdMaiZhiUtils.changeDeviceStatus(accessToken, cardno, type);
log.info("changeDeviceStatus 结果:{}", response);
if (response.getErrcode() == 200) {
orderVo.setStatus(3);
orderVo.setRefundStatus(0);
goblinRedisUtils.setBraceletOrderVo(orderVo);
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_update_refund"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
sqlDataOrder.add(new Object[]{
orderVo.getStatus(), orderVo.getRefundStatus(), "", LocalDateTime.now(), orderId
});
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)
);
}
return response;
} else {
ChangeDeviceStatusResponse response = ChangeDeviceStatusResponse.getNew();
response.setErrcode(400);
response.setMsg("token获取错误");
return response;
}
}
@Override
public Boolean refundRes() {
String accessToken = this.getAccessToken();
if (null != accessToken) {
List<GoblinBraceletOrder> list = iGoblinBraceletOrderService.list(Wrappers.lambdaQuery(GoblinBraceletOrder.class).eq(GoblinBraceletOrder::getStatus, 3));
for (GoblinBraceletOrder order : list) {
String cardno = order.getCardno();
String orderId = order.getOrderId();
if (null != cardno && !cardno.isEmpty()) {
ChangeDeviceStatusResponse res = thirdMaiZhiUtils.refundRes(accessToken, cardno);
if (null != res && res.getErrcode() == 200) {
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (res.getStatus() == 1) {
orderVo.setStatus(4);
orderVo.setRefundStatus(1);
orderVo.setRefundStatusNote("");
} else if (res.getStatus() == 2) {
orderVo.setStatus(7);
orderVo.setRefundStatus(2);
orderVo.setRefundStatusNote(res.getNote());
}
goblinRedisUtils.setBraceletOrderVo(orderVo);
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_update_refund"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
sqlDataOrder.add(new Object[]{
orderVo.getStatus(), orderVo.getRefundStatus(), orderVo.getRefundStatusNote(), LocalDateTime.now()
});
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_NFT_ORDER.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)
);
}
}
}
return true;
} else {
return false;
}
}
private String getAccessToken() {
String token = goblinRedisUtils.getMaiZhiAccessToken();
if (null == token) {
AuthResponse response = thirdMaiZhiUtils.login("CM250001", "95b42275318c6df2d78c43525c2126e7", "380e8acd181abef8c6253721b05a54a1");
if (response.getErrcode() == 200) {
token = response.getData().getAccessToken();
goblinRedisUtils.setMaiZhiAccessToken(token, response.getData().getExpire() - 200);
}
}
return token;
}
}
\ No newline at end of file
package com.liquidnet.service.goblin.util;
import lombok.extern.slf4j.Slf4j;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
@Slf4j
public class DougongSignUtils {
/**
* RSA私钥签名:签名方式SHA256WithRSA
* @param data 待签名字符串
* @param privateKeyBase64 私钥(Base64编码)
* @return 签名byte[]
* @throws Exception
*/
public static String sign(String data, String privateKeyBase64) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// Sign
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(signature.sign());
} catch (Exception e) {
return null;
}
}
/**
* 使用汇付RSA公钥验签
* @param data 待签名字符串
* @param publicKeyBase64 公钥(Base64编码)
* @return 验签结果
* @throws Exception
*/
public static boolean verify(String data, String publicKeyBase64, String sign) {
// Base64 --> Key
try {
byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// verify
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes("UTF-8"));
return signature.verify(Base64.getDecoder().decode(sign));
} catch (Exception e) {
log.error("Exception", e);
return false;
}
}
}
package com.liquidnet.service.goblin.util;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.liquidnet.common.cache.redis.util.RedisUtil;
......@@ -8,6 +10,7 @@ import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.RandomUtil;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.galaxy.constant.GalaxyEnum;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
......@@ -17,9 +20,11 @@ import com.liquidnet.service.goblin.dto.GoblinUserSafeConfigDto;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinGoodsAnticipateValueVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinBraceletOrder;
import com.liquidnet.service.goblin.entity.GoblinFrontBanner;
import com.liquidnet.service.goblin.entity.GoblinFrontHotWord;
import com.liquidnet.service.goblin.entity.GoblinFrontNavigation;
import com.liquidnet.service.goblin.mapper.GoblinBraceletOrderMapper;
import com.liquidnet.service.goblin.service.impl.inner.GoblinNftJobServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -48,6 +53,8 @@ public class GoblinRedisUtils {
GoblinMongoUtils goblinMongoUtils;
@Autowired
GoblinNftJobServiceImpl goblinNftJobService;
@Autowired
private GoblinBraceletOrderMapper braceletOrderMapper;
@Value("${liquidnet.secret.passwd-salt}")
private String passwdSalt;
......@@ -2923,6 +2930,124 @@ public class GoblinRedisUtils {
return (int) redisUtil.rightPush(rdk, orderId);
}
public GoblinRechargeWristbandVo getRechargeWristbandVo() {
Object obj = redisUtil.get(GoblinRedisConst.GOBLIN_RECHARGE_WRISTBAND);
if (obj == null) {
return null;
} else {
return (GoblinRechargeWristbandVo) obj;
}
}
public void setRechargeWristbandVo(GoblinRechargeWristbandVo vo) {
String rdk = GoblinRedisConst.GOBLIN_RECHARGE_WRISTBAND;
redisUtil.set(rdk, vo);
}
public void setMaiZhiAccessToken(String token, int time) {
String rdk = GoblinRedisConst.GOBLIN_RECHARGE_MAIZHI_TOKEN;
redisUtil.set(rdk, token, time);
}
public String getMaiZhiAccessToken() {
Object obj = redisUtil.get(GoblinRedisConst.GOBLIN_RECHARGE_MAIZHI_TOKEN);
if (obj == null) {
return null;
} else {
return (String) obj;
}
}
public void setBraceletRelatedOrderVo(String reqSeqId, String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_RELATED_ORDER.concat(reqSeqId);
redisUtil.set(key, orderId, RedisKeyExpireConst.GOBLIN_BRACELET_RELATED_ORDER_EXPIRE);
}
/**
*
* @param reqSeqId 调用斗拱-请求流水号
* @return orderId 手环订单ID
*/
public String getBraceletRelatedOrderVo(String reqSeqId){
String key = GoblinRedisConst.GOBLIN_BRACELET_RELATED_ORDER.concat(reqSeqId);
Object obj = redisUtil.get(key);
if (obj == null) {
// 从数据库查询
LambdaQueryWrapper<GoblinBraceletOrder> lambdaed = new QueryWrapper<GoblinBraceletOrder>()
.lambda().eq(GoblinBraceletOrder::getReqSeqId, reqSeqId);
List<GoblinBraceletOrder> goblinBraceletOrders = braceletOrderMapper.selectList(lambdaed);
if (goblinBraceletOrders.isEmpty()) {
return "";
}
GoblinBraceletOrder goblinBraceletOrder = goblinBraceletOrders.get(0);
String orderId = goblinBraceletOrder.getOrderId();
setBraceletRelatedOrderVo(goblinBraceletOrder.getReqSeqId(), orderId);
return orderId;
}else {
return (String) obj;
}
}
public void setBraceletOrderVo(GoblinBraceletOrderVo orderVo) {
String key = GoblinRedisConst.GOBLIN_BRACELET_ORDERID.concat(orderVo.getOrderId());
redisUtil.set(key, orderVo, RedisKeyExpireConst.GOBLIN_BRACELET_USER_EXPIRE);
}
/**
* 获取手环订单信息
* @param orderId
* @return
*/
public GoblinBraceletOrderVo getBraceletOrderVo(String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_ORDERID.concat(orderId);
Object obj = redisUtil.get(key);
if (obj == null) {
// 从数据库查询
LambdaQueryWrapper<GoblinBraceletOrder> queryWrapper = new QueryWrapper<GoblinBraceletOrder>().lambda()
.eq(GoblinBraceletOrder::getOrderId, orderId);
List<GoblinBraceletOrder> goblinBraceletOrders = braceletOrderMapper.selectList(queryWrapper);
if (goblinBraceletOrders.isEmpty()) {
return null;
}
GoblinBraceletOrderVo orderVo = GoblinBraceletOrderVo.getNew().copy(goblinBraceletOrders.get(0));
setBraceletOrderVo(orderVo);
return orderVo;
} else {
return (GoblinBraceletOrderVo) obj;
}
}
public String getDeviceNumberEndTime(Integer operationNo) {
String key = GoblinRedisConst.GOBLIN_RECHARGE_DEVICE_NUMBER_ENDTIME.concat(String.valueOf(operationNo));
Object obj = redisUtil.get(key);
if (obj == null) {
return null;
} else {
return (String) obj;
}
}
public void setDeviceNumberEndTime(Integer operationNo, String endTime) {
String key = GoblinRedisConst.GOBLIN_RECHARGE_DEVICE_NUMBER_ENDTIME.concat(String.valueOf(operationNo));
redisUtil.set(key, endTime);
}
public String getOrderIdByFoutTradeNo(String foutTradeNo) {
String key = GoblinRedisConst.GOBLIN_RECHARGE_FOUT_TRADE_NO.concat(foutTradeNo);
Object obj = redisUtil.get(key);
if (obj == null) {
return null;
} else {
return (String) obj;
}
}
public void setOrderIdByFoutTradeNo(String foutTradeNo, String orderId) {
String key = GoblinRedisConst.GOBLIN_RECHARGE_FOUT_TRADE_NO.concat(foutTradeNo);
redisUtil.set(key, orderId);
}
/* ---------------------------------------- ---------------------------------------- */
/* ---------------------------------------- ---------------------------------------- */
/* ---------------------------------------- ---------------------------------------- */
......
package com.liquidnet.service.goblin.util;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.dto.vo.MaiZhiAllVo.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
@Slf4j
@Component
public class ThirdMaiZhiUtils {
private static final RestTemplate restTemplate = new RestTemplate();
public AuthResponse login(String appid, String appSecret, String auth) {
try {
String url = "https://www.mz-cx.com/home/openapi/auth";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", auth);
// 创建 AuthParam 参数
AuthParam param = new AuthParam();
param.setAppid(appid);
param.setAppSecret(appSecret);
// 创建 HttpEntity 封装请求体和请求头
HttpEntity<AuthParam> request = new HttpEntity<>(param, headers);
// 发起 POST 请求
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), AuthResponse.class);
} else {
throw new Exception("Login API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public CheckIdcardResponse checkIdcard(String accessToken, String idcard, String aname) {
try {
String url = "https://www.mz-cx.com/home/openapi/check_idcard";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
// 创建 AuthParam 参数
IdCardParam param = new IdCardParam();
param.setName(aname);
param.setIdcard(idcard);
// 创建 HttpEntity 封装请求体和请求头
HttpEntity<IdCardParam> request = new HttpEntity<>(param, headers);
// 发起 POST 请求
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), CheckIdcardResponse.class);
} else {
throw new Exception("checkIdcard API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public OrderResponse addOrder(String accessToken, OrderParam param) {
try {
String url = "https://www.mz-cx.com/home/openapi/ordercomplete";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
// 创建 HttpEntity 封装请求体和请求头
HttpEntity<OrderParam> request = new HttpEntity<>(param, headers);
// 发起 POST 请求
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), OrderResponse.class);
} else {
throw new Exception("addOrder API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public OrderInfoResponse getOrder(String accessToken, OrderInfoParam param) {
try {
String url = "https://www.mz-cx.com/home/openapi/orderinquiry";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
// 创建 HttpEntity 封装请求体和请求头
HttpEntity<OrderInfoParam> request = new HttpEntity<>(param, headers);
// 发起 POST 请求
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), OrderInfoResponse.class);
} else {
throw new Exception("getOrder API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public GenerateDeviceCodeResponse generateDeviceCode(String accessToken, String outno) {
try {
String url = String.format("https://www.mz-cx.com/home/openapi/get_ma?outno=%s", outno);
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), GenerateDeviceCodeResponse.class);
} else {
throw new Exception("generateDeviceCode API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public DeviceNumberResponse getDeviceNumber(String accessToken, Integer operationNo, String starttime, String endtime) {
try {
String url = "https://www.mz-cx.com/home/openapi/get_ordercardno";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("operationNo", operationNo)
.queryParam("starttime", starttime)
.queryParam("endtime", endtime);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), DeviceNumberResponse.class);
} else {
throw new Exception("getDeviceNumber API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public DeviceBalanceResponse getDeviceBalance(String accessToken, String cardno) {
try {
String url = String.format("https://www.mz-cx.com/home/openapi/get_cardmoney?cardno=%s", cardno);
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), DeviceBalanceResponse.class);
} else {
throw new Exception("getDeviceBalance API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public DeviceRecordResponse getDeviceRecord(String accessToken, String cardno, Integer page) {
try {
String url = String.format("https://www.mz-cx.com/home/openapi/get_cardlist?cardno=%s&page=%s", cardno, page);
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), DeviceRecordResponse.class);
} else {
throw new Exception("getDeviceRecord API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public ChangeDeviceStatusResponse changeDeviceStatus(String accessToken, String cardno, int type) {
try {
String url = "https://www.mz-cx.com/home/openapi/upd_cardtype";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("cardno", cardno)
.queryParam("type", type);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), ChangeDeviceStatusResponse.class);
} else {
throw new Exception("changeDeviceStatus API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public ChangeDeviceStatusResponse refundRes(String accessToken, String cardno) {
try {
String url = "https://www.mz-cx.com/home/openapi/get_cardtui";
// 创建请求头并设置 Authorization
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("access-token", accessToken);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("cardno", cardno);
HttpEntity<Void> request = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class);
// 处理响应
if (response.getStatusCode() == HttpStatus.OK) {
return JsonUtils.fromJson(response.getBody(), ChangeDeviceStatusResponse.class);
} else {
throw new Exception("refundRes API failed with status: " + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
......@@ -195,3 +195,9 @@ goblin_sku.stock=UPDATE goblin_goods_sku SET sku_stock = ? , stock = ?, updated_
candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,operator=?,updated_at=? WHERE ucoupon_id=?
#----
#----
# ---- \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=?
goblin_bracelet_order_update_cardno=UPDATE goblin_bracelet_order SET cardno=?,updated_at=? WHERE order_id=?
goblin_bracelet_order_update_fout_trade_no=UPDATE goblin_bracelet_order SET fout_trade_no=?,updated_at=? WHERE order_id=?
goblin_bracelet_order_update_refund=UPDATE goblin_bracelet_order SET status=?,refund_status=?,refund_status_note=?,updated_at=? WHERE order_id=?
\ No newline at end of file
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Map;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class GoblinBraceletOrderServiceTest {
@Autowired
private IGoblinBraceletOrderService goblinBraceletorderservice;
@Test
public void dougongCallBackTest(){
DougongSyncCallbackparam callbackparam = new DougongSyncCallbackparam();
callbackparam.setRespCode("00000000");
callbackparam.setSign("gsbW6XtkMbtpM9kI2sZ+aAMB2/QHH7YFN7ecBcfUmPe93LdC+BwKPxhT587zr7LlDzwfhmv+xVcbWTKrol5THa7dK8+RqYNbijKxZFba+oNi2dVWeRmSXVgL5yZ8+DsrXdTms9uv5WP19vuLMVh+UCh1n7zDBhJPMsW6w9LPEaCWXJcLJ8xgzBm/JtAQNZO7WWxFdHJShYmUssRfQvq8a/TXwBxlAB07hjQmI9rhTDL0UY39sfh1a9NVUrwmRPunDtq9WvV+/8I3VL4yZNWO9w4V56VrZj24SmmHBb2EDeHzx4qfky6DK9Djk/ZJBqFeOi/N0YKkzR6X2CsL7ab72A==");
callbackparam.setRespDesc("交易成功[000]");
callbackparam.setRespData("{\"acct_id\":\"F00300982\",\"acct_split_bunch\":{\"acct_infos\":[{\"acct_id\":\"F00300982\",\"div_amt\":\"0.02\",\"huifu_id\":\"6666000109133323\"}],\"fee_acct_id\":\"F00380563\",\"fee_amt\":\"0.01\",\"fee_huifu_id\":\"6666000109133323\"},\"acct_stat\":\"I\",\"atu_sub_mer_id\":\"460360228\",\"avoid_sms_flag\":\"\",\"bagent_id\":\"6666000108840829\",\"bank_code\":\"SUCCESS\",\"bank_desc\":\"交易成功\",\"bank_message\":\"交易成功\",\"bank_order_no\":\"4200002303202406139053495866\",\"bank_seq_id\":\"800448\",\"bank_type\":\"OTHERS\",\"base_acct_id\":\"F00300982\",\"batch_id\":\"240613\",\"channel_type\":\"U\",\"charge_flags\":\"758_0\",\"combinedpay_data\":[],\"combinedpay_fee_amt\":\"0.00\",\"debit_type\":\"0\",\"delay_acct_flag\":\"N\",\"div_flag\":\"0\",\"end_time\":\"20240613105518\",\"fee_amount\":\"0.01\",\"fee_amt\":\"0.01\",\"fee_flag\":1,\"fee_formula_infos\":[{\"fee_formula\":\"MAX(0.01,AMT*0.01)\",\"fee_type\":\"TRANS_FEE\"}],\"fee_rec_type\":\"1\",\"fee_type\":\"OUTSIDE\",\"gate_id\":\"VN\",\"hf_seq_id\":\"002900TOP2B240613105504P831ac139c2000000\",\"huifu_id\":\"6666000109133323\",\"is_delay_acct\":\"0\",\"is_div\":\"0\",\"maze_resp_code\":\"\",\"mer_name\":\"上海汇涵信息科技服务有限公司\",\"mer_ord_id\":\"20240613105441800448\",\"mypaytsf_discount\":\"0.00\",\"need_big_object\":true,\"notify_type\":1,\"org_auth_no\":\"\",\"org_huifu_seq_id\":\"\",\"org_trans_date\":\"\",\"out_ord_id\":\"4200002303202406139053495866\",\"out_trans_id\":\"4200002303202406139053495866\",\"party_order_id\":\"03242406133930500803797\",\"pay_amt\":\"0.02\",\"pay_scene\":\"02\",\"posp_seq_id\":\"03242406133930500803797\",\"product_id\":\"YYZY\",\"ref_no\":\"105504800448\",\"req_date\":\"20240613\",\"req_seq_id\":\"20240613105441800448\",\"resp_code\":\"00000000\",\"resp_desc\":\"交易成功\",\"risk_check_data\":{\"ip_addr\":\"192.1.1.1\"},\"risk_check_info\":{\"client_ip\":\"192.1.1.1\"},\"settlement_amt\":\"0.02\",\"sub_resp_code\":\"00000000\",\"sub_resp_desc\":\"交易成功\",\"subsidy_stat\":\"I\",\"sys_id\":\"6666000108840829\",\"trade_type\":\"T_JSAPI\",\"trans_amt\":\"0.02\",\"trans_date\":\"20240613\",\"trans_fee_allowance_info\":{\"actual_fee_amt\":\"0.01\",\"allowance_fee_amt\":\"0.00\",\"allowance_type\":\"0\",\"cur_allowance_config_infos\":{\"activity_id\":\"AYYZY202403281643407965739\",\"activity_name\":\"\",\"allowance_sys\":\"1\",\"allowance_sys_id\":\"1234567891011\",\"create_by\":\"yunlong.zhang\",\"create_time\":1711615421000,\"end_time\":\"20241201\",\"human_flag\":\"N\",\"is_delay_allowance\":\"2\",\"is_share\":\"Y\",\"merchant_group\":\"6666000109133323\",\"pos_credit_limit_amt\":\"1000.00\",\"pos_debit_limit_amt\":\"1000.00\",\"pos_limit_amt\":\"2000.00\",\"qr_limit_amt\":\"1.00\",\"start_time\":\"20240101\",\"status\":\"1\",\"total_limit_amt\":\"1900.00\",\"update_time\":1711615421000},\"no_allowance_desc\":\"8\",\"receivable_fee_amt\":\"0.01\"},\"trans_order_info\":{\"acct_id\":\"F00300982\",\"acct_stat\":\"I\",\"agent_id\":\"6666000108840829\",\"atu_sub_mer_id\":\"460360228\",\"bagent_id\":\"6666000108840829\",\"bank_mer_id\":\"W1035134718836156463\",\"bank_mer_name\":\"上海汇涵信息科技服务有限公司\",\"bank_resp_code\":\"SUCCESS\",\"bank_resp_desc\":\"交易成功\",\"bank_seq_id\":\"800448\",\"bank_type\":\"OTHERS\",\"batch_id\":\"240613\",\"card_channel_type\":\"\",\"card_sign\":\"\",\"cash_req_date\":\"20240613105504\",\"cash_resp_code\":\"000\",\"cash_resp_desc\":\"成功\",\"cash_trans_id\":\"20240613241pkafk\",\"cashier_version\":\"V2\",\"channel_code\":\"00\",\"channel_finish_time\":1718247318000,\"channel_message\":\"交易成功\",\"channel_stat\":\"S\",\"channel_type\":\"U\",\"check_cash_flag\":\"I\",\"close_trans_stat\":\"\",\"create_time\":1718247304000,\"creator\":\"\",\"credit_fee_amt\":0.00,\"credit_type\":\"\",\"db_unit\":\"2\",\"debit_fee_amt\":0.00,\"double_limit_amt\":0.00,\"fee_acct_id\":\"F00380563\",\"fee_allowance_flag\":0,\"fee_amt\":0.01,\"fee_flag\":1,\"fee_formula\":\"\",\"fee_huifu_id\":\"6666000109133323\",\"fee_real_acct_id\":\"F00380563\",\"fee_real_cust_id\":\"6666000109133323\",\"fee_rec_type\":1,\"fee_source\":\"'SERVER'\",\"fee_split_type\":\"\",\"gate_id\":\"SPIN002\",\"goods_desc\":\"微信测试商品-无线鼠标\",\"hf_seq_id\":\"002900TOP2B240613105504P831ac139c2000000\",\"huifu_id\":\"6666000109133323\",\"icc_data\":\"\",\"id\":4175314075,\"is_acct_div\":0,\"is_acct_div_param\":0,\"is_delay_acct\":0,\"is_deleted\":0,\"is_route\":\"\",\"iss_inst_id\":\"\",\"maze_bg_date\":\"\",\"maze_bg_seq_id\":\"\",\"maze_pnr_dev_id\":\"\",\"maze_resp_code\":\"\",\"maze_resp_desc\":\"\",\"mcc\":\"\",\"mer_name\":\"上海汇涵信息科技服务有限公司\",\"mer_ord_id\":\"20240613105441800448\",\"modifier\":\"\",\"modify_time\":1718247318000,\"mypaytsf_discount\":0.00,\"ord_amt\":0.02,\"ord_id\":\"202406131055040TOP2_BL2684095952\",\"org_acct_id\":\"F00300982\",\"org_auth_no\":\"\",\"org_huifu_seq_id\":\"\",\"org_trans_date\":\"\",\"out_trans_id\":\"4200002303202406139053495866\",\"pa_mer_id\":\"SSP001\",\"party_order_id\":\"03242406133930500803797\",\"pay_amt\":0.02,\"pay_channel\":\"T\",\"pay_channel_id\":\"10000001\",\"pay_scene\":\"02\",\"pay_type\":\"JSAPI\",\"product_id\":\"YYZY\",\"real_acct_id\":\"F00300982\",\"real_cust_id\":\"6666000109133323\",\"real_gate_id\":\"VN\",\"ref_amt\":0.02,\"ref_cnt\":0,\"ref_fee_amt\":0.01,\"ref_num\":\"105504800448\",\"region_id\":\"TOP2_B\",\"req_date\":\"20240613\",\"req_seq_id\":\"20240613105441800448\",\"route_region_id\":\"C24_A\",\"settle_amt\":0.02,\"settle_trans_stat\":\"\",\"sn_code\":\"\",\"source_region_id\":\"TOP2_B\",\"subsidy_amt\":0.00,\"subsidy_ref_amt\":0.00,\"subsidy_stat\":\"I\",\"sys_id\":\"6666000108840829\",\"sys_trace_audit_num\":\"\",\"term_div_coupon_type\":3,\"time_expire\":\"20240613110004\",\"trans_date\":\"20240613\",\"trans_finish_time\":1718247319000,\"trans_notify_url\":\"VIRGO://https://iotpush.cloudpnr.com/ws-mgnt-ser/callback/jspay\",\"trans_stat\":\"S\",\"trans_type\":\"1000\",\"un_scene_info\":\"\",\"unconfirm_amt\":0.02,\"unconfirm_fee_amt\":0.01,\"version\":3},\"trans_stat\":\"S\",\"trans_time\":\"105504\",\"trans_type\":\"T_JSAPI\",\"wx_response\":{\"bank_type\":\"OTHERS\",\"coupon_fee\":\"0.00\",\"openid\":\"o8jhot5QnK-AmVoARPMJjMT-SsX0\",\"sub_appid\":\"wxdfe9a5d141f96685\",\"sub_openid\":\"oozDJ52_y7RMnxObV04Q4bpuNZEM\"}}");
Map map = JsonUtils.fromJson(callbackparam.getRespData(), Map.class);
ResponseDto<Boolean> responseDto = goblinBraceletorderservice.dougongCallBack(callbackparam);
Assert.assertTrue(responseDto.isSuccess());
}
}
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class GoblinDougongPayServiceImplTest {
@Autowired
private IGoblinDougongPayService goblinDougongPayService;
private List<DougongRequestParam.WxDataGoodsDetail> getWxDataGoodsDetails() {
HashMap<String, Object> goods1 = new HashMap<>();
goods1.put("id", "1");
goods1.put("name", "手环");
goods1.put("price", "1");
goods1.put("number", 1);
HashMap<String, Object> goods2 = new HashMap<>();
goods2.put("id", "2");
goods2.put("name", "面额充值50元");
goods2.put("price", "50");
goods2.put("number", 1);
// 商品列表
ArrayList<Map<String, Object>> goodsList = new ArrayList<>();
goodsList.add(goods1);
goodsList.add(goods2);
ArrayList<DougongRequestParam.WxDataGoodsDetail> wxDataGoodsDetails = new ArrayList<>();
for (Map<String, Object> stringObjectMap : goodsList) {
DougongRequestParam.WxDataGoodsDetail wxDataGoodsDetail = new DougongRequestParam.WxDataGoodsDetail();
wxDataGoodsDetail.setGoodsId(String.valueOf(stringObjectMap.get("id")));
wxDataGoodsDetail.setGoodsName(String.valueOf(stringObjectMap.get("name")));
wxDataGoodsDetail.setPrice(String.valueOf(stringObjectMap.get("price")));
wxDataGoodsDetail.setQuantity((Integer) stringObjectMap.get("number"));
wxDataGoodsDetails.add(wxDataGoodsDetail);
}
return wxDataGoodsDetails;
}
@Test
public void jsPay() {
// 商品描述
String goodsDesc = "手环充值";
// 商品金额
BigDecimal totalAmt = new BigDecimal("51.00");
// 请求日期
String reqDate = "20250708";
// 交易类型
String tradeType = "T_MINIAPP";
DougongRequestParam requestParam = new DougongRequestParam();
requestParam.setHuifuId("6666000109133323");//TODO 配置
requestParam.setTimeExpire("20250718235959"); //TODO 在计算
requestParam.setNotifyUrl("http://www.baidu.com");//TODO 配置
DougongJsPayData dougongJsPayData = new DougongJsPayData();
dougongJsPayData.setReqDate(reqDate);
dougongJsPayData.setReqSeqId(IDGenerator.nextSnowId());
dougongJsPayData.setGoodsDesc(goodsDesc);
dougongJsPayData.setTradeType(tradeType);
dougongJsPayData.setTransAmt(totalAmt.toString());
dougongJsPayData.setTimeExpire("20250718235959"); //TODO 在计算
dougongJsPayData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来
dougongJsPayData.setGoodsDetailList(getWxDataGoodsDetails());
System.out.println(goblinDougongPayService.jsPay(dougongJsPayData));
}
}
package com.liquidnet.service;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
......@@ -16,6 +17,7 @@ import java.util.Arrays;
@Slf4j
@EnableFeignClients
@SpringBootApplication(scanBasePackages = {"com.liquidnet"})
@MapperScan(basePackages = {"com.liquidnet.service.*.mapper"})
public class ServiceKylinApplication implements CommandLineRunner {
@Autowired
private Environment environment;
......
......@@ -36,17 +36,19 @@ public class KylinBannersController {
@GetMapping("")
@ApiOperation("banner列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "position", value = "展示位置 1首页 3周边 5积分商城 6YB 8视频", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "position", value = "展示位置 1首页 3周边 5积分商城 6YB 8视频 10福袋", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "provinceName", value = "城市名称"),
@ApiImplicitParam(type = "query", dataType = "String", name = "marketId", value = "活动id"),
@ApiImplicitParam(type = "query", dataType = "String", name = "performanceId", value = "演出id"),
})
public ResponseDto<List<KylinBanners>> blist(
@RequestParam() String position,
@RequestParam(value = "marketId", required = false) String marketId,
@RequestParam(defaultValue = "") String provinceName
@RequestParam(defaultValue = "") String provinceName,
@RequestParam(value = "performanceId", required = false) String performanceId
) {
try {
List<KylinBanners> result = bannersServiceImpl.blist(position, provinceName, marketId);
List<KylinBanners> result = bannersServiceImpl.blist(position, provinceName, marketId, performanceId);
return ResponseDto.success(result);
} catch (Exception e) {
log.error("banner列表Error", e);
......
package com.liquidnet.service.kylin.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import com.liquidnet.service.kylin.service.IKylinLuckyBagService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "前端-获取福袋相关")
@RestController
@RequestMapping("/luckyBag")
@Slf4j
public class KylinLuckyBagController {
@Autowired
private IKylinLuckyBagService luckyBagService;
@GetMapping("")
@ApiOperation("获取福袋权益列表")
public ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(@RequestParam(value = "orderId") String orderId) {
return luckyBagService.getLuckyBagByOrderId(orderId);
}
@GetMapping("/scope")
@ApiOperation("获取验码福袋列表")
public ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(@RequestParam(value = "mobile") String mobile){
return luckyBagService.getLuckyBagListScope(mobile);
}
@ApiOperation("兑换码详情")
@GetMapping("/code/detail")
public ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(@RequestParam(value = "mobile") String mobile,
@RequestParam(value = "code") String code,
@RequestParam(value = "luckyBagId") String luckyBagId){
return luckyBagService.getCodeDetail(mobile, code, luckyBagId);
}
@GetMapping("/code/consume")
@ApiOperation("兑换码核销")
public ResponseDto<Boolean> consumeCode(@RequestParam(value = "mobile") String mobile,
@RequestParam(value = "code") String code,
@RequestParam(value = "luckyBagId") String luckyBagId){
return luckyBagService.consumeCode(mobile, code, luckyBagId);
}
}
......@@ -3,8 +3,8 @@ package com.liquidnet.service.kylin.service.impl;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.KylinBannersVo;
import com.liquidnet.service.kylin.entity.KylinBanners;
import com.liquidnet.service.kylin.service.admin.IKylinBannersService;
import com.liquidnet.service.kylin.utils.ObjectUtil;
......@@ -36,7 +36,7 @@ public class BannersServiceImpl implements IKylinBannersService {
@Autowired
RedisUtil redisUtil;
public List<KylinBanners> blist(String position, String provinceName, String marketId) {
public List<KylinBanners> blist(String position, String provinceName, String marketId, String performanceId) {
String nowTime = DateUtil.getNowTime();
Object ListObj = redisUtil.get(KylinRedisConst.ADMIN_BANNER_LIST);
List<KylinBanners> list = ObjectUtil.getKylinBannerListArrayList();
......@@ -61,6 +61,14 @@ public class BannersServiceImpl implements IKylinBannersService {
}
}
// 查询指定演出
if (StringUtil.isNotBlank(performanceId)) {
if (!performanceId.equals(bannerInfo.getPerformanceId())) {
itBannerList.remove();
continue;
}
}
// list
List<String> pList = bannerInfo.getPositionList();
Boolean pis = false;
......
package com.liquidnet.service.kylin.service.impl;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.kylin.service.IFeishuBotService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class FeishuBotServiceImpl implements IFeishuBotService {
@Value("${liquidnet.feishu.bWebhook}")
private String bWebhook;
@Override
public void sendTextMessage(String text) {
HashMap<String, Object> textMap = new HashMap<>();
textMap.put("text", text);
Map<String, Object> bodyMap = new HashMap<>();
bodyMap.put("msg_type", "text");
bodyMap.put("content", textMap);
try {
HttpUtil.postJson(bWebhook, JsonUtils.toJson(bodyMap));
}catch (Exception e){
log.error("error.", e);
}
}
}
package com.liquidnet.service.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.LuckyBagStatusEnum;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.KylinLuckyBagMapper;
import com.liquidnet.service.kylin.mapper.KylinLuckyBagScopeMapper;
import com.liquidnet.service.kylin.mapper.KylinRewardCodeMapper;
import com.liquidnet.service.kylin.mapper.KylinRewardUserMapper;
import com.liquidnet.service.kylin.service.IFeishuBotService;
import com.liquidnet.service.kylin.service.IKylinLuckyBagService;
import com.liquidnet.service.kylin.service.IKylinOrderTicketsService;
import com.liquidnet.service.kylin.utils.DataUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
private static final Logger log = LoggerFactory.getLogger(KylinLuckyBagServiceImpl.class);
@Autowired
private DataUtils dataUtils;
@Autowired
RedisUtil redisUtil;
@Autowired
IKylinOrderTicketsService orderTicketsService;
@Autowired
private IFeishuBotService iFeishuBotService;
@Autowired
private KylinRewardCodeMapper kylinRewardCodeMapper;
@Autowired
private KylinRewardUserMapper kylinRewardUserMapper;
@Autowired
private KylinLuckyBagScopeMapper kylinLuckyBagScopeMapper;
@Autowired
private KylinLuckyBagMapper kylinLuckyBagMapper;
@Override
public ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(String orderId) {
//1. 首先校验用户权限
// OrderDetailsVo vo = orderTicketsService.orderDetails(orderId);
final KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
final String uid = CurrentUtil.getCurrentUid();
if (orderTicketVo == null) {
log.error("[getLuckyBagByOrderId] 未查询到订单, orderId: {}, uid: {}.", orderId, uid);
return ResponseDto.failure(ErrorMapping.get("20024"));
}
if (!orderTicketVo.getUserId().equals(uid)) {
log.error("[getLuckyBagByOrderId] 无权查看该订单, orderId: {}, uid: {}.", orderId, uid);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
log.info("[getLuckyBagByOrderId] 获取福袋详情, orderId: {}, uid: {}.", orderId, uid);
// 判断订单状态
if (isEligibleForWelfare(orderTicketVo)) {
// 2. 订单关联的演出ID
List<KylinLuckyBagVo.LuckyBagActivityVo> activityVos = getLuckyBagActivityVos(orderTicketVo.getPerformanceId());
//3. 再查询满足的权益
List<KylinLuckyBagVo.LuckyBagVo> luckyBagVos = getLuckyBagVos(orderTicketVo);
if (activityVos.isEmpty()) {
return ResponseDto.success(KylinLuckyBagVo.of(luckyBagVos, null));
} else {
return ResponseDto.success(KylinLuckyBagVo.of(luckyBagVos, activityVos.get(0)));
}
}else {
log.info("[getLuckyBagByOrderId] 该订单状态不满足权益要求, orderId: {}, uid: {}, status: {}, payStatus: {}.", orderId,
uid, orderTicketVo.getStatus(), orderTicketVo.getPayStatus());
return ResponseDto.success(KylinLuckyBagVo.ofEmpty());
}
}
@Override
public ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(String mobile) {
if (StringUtil.isBlank(mobile)) {
log.info("[getLuckyBagListScope] 手机号为空");
return ResponseDto.failure(ErrorMapping.get("20004"));
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>()
.lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
List<KylinLuckyBagScope> kylinLuckyBagScopes = kylinLuckyBagScopeMapper.selectList(queryWrapper);
if (kylinLuckyBagScopes.isEmpty()) {
log.info("[getLuckyBagListScope] 暂无验码权限, mobile: {}.", mobile);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
// 查询福袋列表
List<KylinLuckyBag> luckyBagList = dataUtils.getKylinLuckyBagList();
if (luckyBagList.isEmpty()) {
log.info("[getLuckyBagListScope] 获取福袋列表为空.");
return ResponseDto.success();
}
// 该手机号可以核验的福袋ID列表
Set<String> collected = kylinLuckyBagScopes.stream()
.map(KylinLuckyBagScope::getLuckyBagId)
.collect(Collectors.toSet());
return ResponseDto.success(luckyBagList.stream()
.filter(l -> collected.contains(l.getLuckyBagId()))
.map(l -> {
KylinLuckyBagScopeVo vo = new KylinLuckyBagScopeVo();
vo.setLuckyBagId(l.getLuckyBagId());
vo.setName(l.getName());
vo.setIntroduction(l.getIntroduction());
vo.setPerformanceId(l.getPerformanceId());
vo.setPerformanceName(l.getPerformanceName());
return vo;
})
.collect(Collectors.toList()));
}
@Override
public ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(String authMobile, String code, String luckyBagId) {
if (!checkScopeByMobile(authMobile, luckyBagId)) {
log.info("暂无验码权限, mobile: {}, luckyBagId: {}.", authMobile, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
LambdaQueryWrapper<KylinRewardUser> queryWrapper = new QueryWrapper<KylinRewardUser>()
.lambda()
.eq(KylinRewardUser::getCode, code)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId);
KylinRewardUser rewardUser = kylinRewardUserMapper.selectOne(queryWrapper);
if (rewardUser == null) {
log.error("兑换码或福袋不存在, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20800"));
}
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(rewardUser.getOrderId());
if (orderTicketVo == null) {
log.error("订单详情为空, orderId: {}.", rewardUser.getOrderId());
iFeishuBotService.sendTextMessage("订单不存在, orderId: " + rewardUser.getOrderId());
return ResponseDto.failure(ErrorMapping.get("20801"));
}
return ResponseDto.success(buildCodeDetailVo(rewardUser, orderTicketVo));
}
@Override
public ResponseDto<Boolean> consumeCode(String authMobile, String code, String luckyBagId) {
if (!checkScopeByMobile(authMobile, luckyBagId)) {
log.info("暂无验码权限, mobile: {}, luckyBagId: {}.", authMobile, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
LambdaQueryWrapper<KylinRewardUser> queryWrapper = new QueryWrapper<KylinRewardUser>()
.lambda()
.eq(KylinRewardUser::getCode, code)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId);
KylinRewardUser rewardUser = kylinRewardUserMapper.selectOne(queryWrapper);
if (rewardUser == null) {
log.error("兑换码或福袋不存在, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20800"));
}
if (LuckyBagStatusEnum.AVAILABLE_STATUS_RECEIVED.getValue().equals(rewardUser.getState())) {
log.info("兑换码被使用, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20802"));
}
rewardUser.setState(LuckyBagStatusEnum.AVAILABLE_STATUS_RECEIVED.getValue());
rewardUser.setComment(authMobile);
rewardUser.setUpdatedAt(LocalDateTime.now());
int updateById = kylinRewardUserMapper.updateById(rewardUser);
log.info("核销兑换码: {}.", updateById > 0);
return ResponseDto.success(updateById > 0);
}
private KylinLuckyBagCodeDetailVo buildCodeDetailVo(KylinRewardUser rewardUser,
KylinOrderTicketVo orderTicketVo) {
KylinLuckyBagCodeDetailVo detailVo = new KylinLuckyBagCodeDetailVo();
detailVo.setLuckyBagId(rewardUser.getLuckyBagId());
KylinLuckyBag luckyBag = getLuckyBagById(rewardUser.getLuckyBagId());
if (luckyBag != null) {
detailVo.setLuckyBagName(luckyBag.getName());
}
detailVo.setCode(rewardUser.getCode());
detailVo.setUseStatus(rewardUser.getState());
detailVo.setCreatedAt(rewardUser.getCreatedAt());
detailVo.setUpdatedAt(rewardUser.getUpdatedAt());
detailVo.setUserInfo(getUserInfo(orderTicketVo));
detailVo.setOrderInfo(getOrderInfo(orderTicketVo));
detailVo.setOperator(getOperator(rewardUser.getComment(), rewardUser.getLuckyBagId()));
return detailVo;
}
/**
* 根据福袋ID获取福袋信息
*
* @param luckyBagId
* @return
*/
private KylinLuckyBag getLuckyBagById(String luckyBagId) {
LambdaQueryWrapper<KylinLuckyBag> wrapper = new QueryWrapper<KylinLuckyBag>().lambda()
.eq(KylinLuckyBag::getLuckyBagId, luckyBagId);
return kylinLuckyBagMapper.selectOne(wrapper);
}
/**
* 获取用户信息
*
* @param orderTicketVo
* @return
*/
private KylinLuckyBagCodeDetailVo.UserInfo getUserInfo(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
return null;
}
KylinLuckyBagCodeDetailVo.UserInfo userInfo = new KylinLuckyBagCodeDetailVo.UserInfo();
userInfo.setUid(orderTicketVo.getUserId());
userInfo.setUserName(orderTicketVo.getUserName());
userInfo.setUserMobile(orderTicketVo.getUserMobile());
return userInfo;
}
/**
* 获取订单信息
*
* @param orderTicketVo
* @return
*/
private KylinLuckyBagCodeDetailVo.OrderInfo getOrderInfo(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
return null;
}
KylinLuckyBagCodeDetailVo.OrderInfo orderInfo = new KylinLuckyBagCodeDetailVo.OrderInfo();
orderInfo.setOrderId(orderTicketVo.getOrderTicketsId());
orderInfo.setOrderCode(orderTicketVo.getOrderCode());
orderInfo.setPerformanceTitle(orderTicketVo.getPerformanceTitle());
orderInfo.setTicketTitle(orderTicketVo.getTicketTitle());
orderInfo.setNumber(orderTicketVo.getNumber());
orderInfo.setRefundNumber(orderTicketVo.getRefundNumber());
orderInfo.setCreatedAt(orderTicketVo.getCreatedAt());
orderInfo.setUseStart(orderTicketVo.getUseStart());
return orderInfo;
}
/**
* 获取核验人信息
*
* @return
*/
private KylinLuckyBagCodeDetailVo.Operator getOperator(String mobile, String luckyBagId) {
if (StringUtil.isBlank(mobile)) {
return null;
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>().lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getLuckyBagId, luckyBagId);
KylinLuckyBagScope luckyBagScope = kylinLuckyBagScopeMapper.selectOne(queryWrapper);
if (luckyBagScope == null) {
return null;
}
return new KylinLuckyBagCodeDetailVo.Operator(luckyBagScope.getMobile(), luckyBagScope.getNickName());
}
/**
* 获取福袋列表
*
* @param orderTicketVo
* @return
*/
private List<KylinLuckyBagVo.LuckyBagVo> getLuckyBagVos(KylinOrderTicketVo orderTicketVo) {
final String performanceId = orderTicketVo.getPerformanceId();
final String orderId = orderTicketVo.getOrderTicketsId();
final String uid = orderTicketVo.getUserId();
List<KylinLuckyBag> luckyBagList = dataUtils.getKylinLuckyBagList();
if (luckyBagList.isEmpty()) {
log.info("[getLuckyBagVos] 获取福袋列表为空.");
return Collections.emptyList();
}
// 筛选出 performanceId 为 "abc" 的 KylinLuckyBag 对象
List<KylinLuckyBag> filteredList = luckyBagList.stream()
.filter(luckyBag -> performanceId.equals(luckyBag.getPerformanceId()))
.collect(Collectors.toList());
List<KylinLuckyBagVo.LuckyBagVo> activityVos = new ArrayList<>(filteredList.size());
filteredList.forEach(l -> {
KylinLuckyBagVo.LuckyBagVo luckyBagVo = new KylinLuckyBagVo.LuckyBagVo();
luckyBagVo.setLuckyBagId(l.getLuckyBagId());
luckyBagVo.setName(l.getName());
luckyBagVo.setIntroduction(l.getIntroduction());
luckyBagVo.setCodeShowType(l.getCodeShowType());
final String sendTime = l.getSendTime();
final String nowTime = DateUtil.getNowTime();
// 判断发放时间
if (null != sendTime && !sendTime.isEmpty()) {
if (DateUtil.compareStrDay(nowTime, sendTime) >= 0) { // 当前时间小于发放时间 还未开始呢
// 查询数据库获取兑换码
List<KylinRewardUser> kylinRewardUserList = dataUtils.getKylinRewardUserList(orderId, uid, l.getLuckyBagId());
if (kylinRewardUserList.isEmpty()) {
// 根据购买数量来分配兑换码
log.info("[getLuckyBagVos] 福袋[{}]已到发放时间,但未给用户分配兑换码, uid: {}, orderId: {}.", l.getName(), uid, orderId);
kylinRewardUserList = getRandomRewardCode(orderTicketVo, l.getLuckyBagId());
}
List<KylinLuckyBagVo.RewardCodeVo> codeVoList = kylinRewardUserList.stream().map(k -> {
KylinLuckyBagVo.RewardCodeVo rewardCodeVo = new KylinLuckyBagVo.RewardCodeVo();
rewardCodeVo.setUseStatus(k.getState());
rewardCodeVo.setCode(k.getCode());
return rewardCodeVo;
}).collect(Collectors.toList());
luckyBagVo.setRewardCodeVoList(codeVoList);
luckyBagVo.setStatus(kylinRewardUserList.isEmpty() ?
LuckyBagStatusEnum.UNLOCK_STATUS_NOT_UNLOCKED.getValue() : LuckyBagStatusEnum.UNLOCK_STATUS_UNLOCKED.getValue());
} else {
log.info("[getLuckyBagVos] 福袋[{}]未到发放时间.", l.getName());
luckyBagVo.setStatus(LuckyBagStatusEnum.UNLOCK_STATUS_NOT_UNLOCKED.getValue());
luckyBagVo.setRewardCodeVoList(Collections.emptyList());
}
}
activityVos.add(luckyBagVo);
});
return activityVos;
}
/**
* 分配兑换码
*
* @param orderTicketVo
* @return
*/
private List<KylinRewardUser> getRandomRewardCode(KylinOrderTicketVo orderTicketVo, String luckyBagId) {
final int limitTotal = orderTicketVo.getNumber() - orderTicketVo.getRefundNumber();
if (limitTotal <= 0) {
log.error("[getRandomRewardCode] 用户订单购买数量错误, orderId: {}.", orderTicketVo.getOrderTicketsId());
return Collections.emptyList();
}
final String lockKey = KylinRedisConst.LUCKY_BAG_CODE_LOCK + luckyBagId;
boolean locked = redisUtil.lock(lockKey, 1, 30);
if (!locked) {
log.info("[getRandomRewardCode] 未获取到分布式锁.");
return Collections.emptyList();
}
LambdaQueryWrapper<KylinRewardCode> lambdaQueryWrapper = new QueryWrapper<KylinRewardCode>().lambda()
.eq(KylinRewardCode::getLuckyBagId, luckyBagId)
.eq(KylinRewardCode::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue())
.last(true, " limit " + limitTotal);
//2. 搜索未分配的兑换码
List<KylinRewardCode> rewardCodes = kylinRewardCodeMapper.selectList(lambdaQueryWrapper);
if (rewardCodes.size() < limitTotal) {
log.error("[getRandomRewardCode] 兑换码不足, luckyBagId: {}, need total: {}.", luckyBagId, limitTotal);
// 报警
String msg = String.format("福袋ID [%s] 兑换码不足,请及时补充.", luckyBagId);
iFeishuBotService.sendTextMessage(msg);
return Collections.emptyList();
}
//3. 写入
List<KylinRewardUser> rewardUsers = new ArrayList<>(limitTotal);
try {
for (int i = 0; i < rewardCodes.size(); i++) {
KylinRewardCode lockedRewardCode = rewardCodes.get(i);
KylinRewardUser rewardUser = buildRewardUser(orderTicketVo.getUserId(),
orderTicketVo.getOrderTicketsId(),
luckyBagId,
orderTicketVo.getEntitiesVoList().get(i).getOrderTicketEntitiesId(),
lockedRewardCode.getCode());
int inserted = kylinRewardUserMapper.insert(rewardUser);
if (inserted > 0) {
// 将兑换码状态更新为已领取
int updateResult = kylinRewardCodeMapper.updateByMid(lockedRewardCode.getMid(),
LuckyBagStatusEnum.AVAILABLE_STATUS_UNAVAILABLE.getValue());
if (updateResult <= 0) {
log.error("[getRandomRewardCode] 修改兑换码状态失败, luckyBagId: {}, orderId: {}, code: {}.",
luckyBagId, orderTicketVo.getOrderTicketsId(), lockedRewardCode.getCode());
// 报警
String msg = String.format("修改兑换码状态失败:福袋ID: [%s], 用户ID: [%s], 订单ID: [%s], code: [%s]。",
luckyBagId, orderTicketVo.getUserId(), orderTicketVo.getOrderTicketsId(), lockedRewardCode.getCode());
iFeishuBotService.sendTextMessage(msg);
} else {
log.info("[getRandomRewardCode] 兑换码分配成功, luckyBagId: {}, orderId: {}, code: {}.",
luckyBagId, orderTicketVo.getOrderTicketsId(), lockedRewardCode.getCode());
rewardUsers.add(rewardUser);
}
}
}
return rewardUsers;
} catch (Exception e) {
log.error("error", e);
// 报警
iFeishuBotService.sendTextMessage("error: " + e.getMessage());
return Collections.emptyList();
} finally {
redisUtil.uLock(lockKey);
}
}
private KylinRewardUser buildRewardUser(String uid, String orderId, String luckyBagId, String orderTicketEntitiesId, String code) {
KylinRewardUser user = new KylinRewardUser();
user.setUid(uid);
user.setLuckyBagId(luckyBagId);
user.setOrderId(orderId);
user.setOrderTicketEntitiesId(orderTicketEntitiesId);
user.setCode(code);
user.setState(LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
user.setCreatedAt(LocalDateTime.now());
// user.setUpdatedAt(LocalDateTime.now());
return user;
}
/**
* 获取福袋活动列表
*
* @param performanceId
* @return
*/
private List<KylinLuckyBagVo.LuckyBagActivityVo> getLuckyBagActivityVos(String performanceId) {
List<KylinLuckyBagVo.LuckyBagActivityVo> activityVos = new ArrayList<>();
//2. 先查询活动
List<KylinLuckyBagActivity> luckyBagActivityList = dataUtils.getKylinLuckyBagActivityList();
luckyBagActivityList.forEach(l -> {
if (l.getPerformanceId().equals(performanceId)) {
activityVos.add(new KylinLuckyBagVo.LuckyBagActivityVo(l.getLuckyBagActivityId(),
l.getName(),
l.getDetail(),
l.getTargetUrl()));
}
});
return activityVos;
}
/**
* 校验手机号是否有权限验码
*
* @param mobile
* @param luckyBagId
* @return
*/
private boolean checkScopeByMobile(String mobile, String luckyBagId) {
if (StringUtil.isBlank(mobile)) {
log.info("mobile is blank.");
return false;
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>().lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getLuckyBagId, luckyBagId)
.eq(KylinLuckyBagScope::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
KylinLuckyBagScope kylinLuckyBagScope = kylinLuckyBagScopeMapper.selectOne(queryWrapper);
return kylinLuckyBagScope != null;
}
/**
* 判断是否满足发放福利条件
*
* @param orderTicketVo 订单票务信息对象
* @return 是否满足条件
*/
private boolean isEligibleForWelfare(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
log.info("[isEligibleForWelfare] 订单信息为空.");
return false;
}
Integer status = orderTicketVo.getStatus();
Integer payStatus = orderTicketVo.getPayStatus();
Integer number = orderTicketVo.getNumber();
Integer refundNumber = orderTicketVo.getRefundNumber();
log.info("[isEligibleForWelfare] 订单信息, status: {}, payStatus: {}, number: {}, refundNumber: {}.",
status, payStatus, number, refundNumber);
return (status != null && (status.equals(1) || status.equals(6))) &&
(payStatus != null && payStatus.equals(1)) &&
(number != null && refundNumber != null && (number - refundNumber) > 0);
}
}
......@@ -213,7 +213,8 @@ public class KylinOrderTicketsRefundServiceImpl {
LocalDateTime refundOpenDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundOpenTime());
LocalDateTime refundCloseDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundCloseTime());
if (LocalDateTime.now().isAfter(refundOpenDate) && LocalDateTime.now().isBefore(refundCloseDate)
&& ticketVo.getCounts() == 1) {
//&& ticketVo.getCounts() == 1
) {
} else {
return ResponseDto.failure("暂不支持退款");
......
......@@ -311,7 +311,7 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsService {
LocalDateTime refundOpenDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundOpenTime());
LocalDateTime refundCloseDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundCloseTime());
if (LocalDateTime.now().isAfter(refundOpenDate) && LocalDateTime.now().isBefore(refundCloseDate)
&& ticketVo.getCounts() == 1 && lockPrice.compareTo(orderTicketVo.getPriceActual()) != 0
&& lockPrice.compareTo(orderTicketVo.getPriceActual()) != 0
&& (orderTicketVo.getStatus().equals(1) || orderTicketVo.getStatus().equals(3) || orderTicketVo.getStatus().equals(6))
&& (orderTicketVo.getTransferStatus().equals(0) || orderTicketVo.getTransferStatus().equals(5))) {
vo.setIsCanRefund(1);
......
package com.liquidnet.service.kylin.utils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
......@@ -12,6 +13,7 @@ import com.liquidnet.service.goblin.dto.manage.vo.GoblinGoodsAnticipateValueVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.constant.LuckyBagStatusEnum;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.dto.vo.KylinApiCameraDevicesVo;
import com.liquidnet.service.kylin.dto.vo.KylinPerformanceSubscribeUpushVo;
......@@ -26,9 +28,10 @@ import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketExpressModuleVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketPartnerVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderRefundsVo;
import com.liquidnet.service.kylin.dto.vo.returns.NoticeKylinPerformanceVo;
import com.liquidnet.service.kylin.entity.KylinOrderCoupons;
import com.liquidnet.service.kylin.entity.KylinRecommendActive;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.KylinLuckyBagActivityMapper;
import com.liquidnet.service.kylin.mapper.KylinLuckyBagMapper;
import com.liquidnet.service.kylin.mapper.KylinRewardUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
......@@ -56,6 +59,12 @@ public class DataUtils {
private RedisUtil redisUtil;
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
private KylinLuckyBagActivityMapper kylinLuckyBagActivityMapper;
@Autowired
private KylinLuckyBagMapper kylinLuckyBagMapper;
@Autowired
private KylinRewardUserMapper kylinRewardUserMapper;
/**
......@@ -1603,4 +1612,82 @@ public class DataUtils {
KylinTicketPartnerVo.class,
KylinTicketPartnerVo.class.getSimpleName());
}
/**
* 获取福袋活动列表
* @return
*/
public List<KylinLuckyBagActivity> getKylinLuckyBagActivityList(){
String redisKey = KylinRedisConst.LUCKY_BAG_ACTIVITY;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
// 从数据库查询 状态为可用的
LambdaQueryWrapper<KylinLuckyBagActivity> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBagActivity>()
.lambda()
.eq(KylinLuckyBagActivity::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue())
.orderByDesc(KylinLuckyBagActivity::getSort);
List<KylinLuckyBagActivity> bagActivities = kylinLuckyBagActivityMapper.selectList(lambdaQueryWrapper);
setKylinLuckyBagActivityList(bagActivities);
return bagActivities;
}else {
return (List<KylinLuckyBagActivity>)obj;
}
}
public void setKylinLuckyBagActivityList(List<KylinLuckyBagActivity> activities){
String redisKey = KylinRedisConst.LUCKY_BAG_ACTIVITY;
redisUtil.set(redisKey, activities, RedisKeyExpireConst.KYLIN_LUCKY_BAG_ACTIVITY_EXPIRE);
}
public void delKylinLuckyBagActivityList(){
String redisKey = KylinRedisConst.LUCKY_BAG_ACTIVITY;
redisUtil.del(redisKey);
}
/**
* 获取福袋列表
* @return
*/
public List<KylinLuckyBag> getKylinLuckyBagList(){
String redisKey = KylinRedisConst.LUCKY_BAG;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
// 从数据库查询 状态为可用的
LambdaQueryWrapper<KylinLuckyBag> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBag>()
.lambda()
.eq(KylinLuckyBag::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
List<KylinLuckyBag> bagActivities = kylinLuckyBagMapper.selectList(lambdaQueryWrapper);
setKylinLuckyBagList(bagActivities);
return bagActivities;
}else {
return (List<KylinLuckyBag>)obj;
}
}
public void setKylinLuckyBagList(List<KylinLuckyBag> activities){
String redisKey = KylinRedisConst.LUCKY_BAG;
redisUtil.set(redisKey, activities, RedisKeyExpireConst.KYLIN_LUCKY_BAG_EXPIRE);
}
public void delKylinLuckyBagList(){
String redisKey = KylinRedisConst.LUCKY_BAG;
redisUtil.del(redisKey);
}
/**
* 获取用户领取兑换码
*
* @param orderId
* @param uid
* @return
*/
public List<KylinRewardUser> getKylinRewardUserList(String orderId, String uid, String luckyBagId) {
LambdaQueryWrapper<KylinRewardUser> lambdaQueryWrapper = new QueryWrapper<KylinRewardUser>().lambda()
.eq(KylinRewardUser::getUid, uid)
.eq(KylinRewardUser::getOrderId, orderId)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId);
return kylinRewardUserMapper.selectList(lambdaQueryWrapper);
}
}
40001=登录信息有误
40002=账号已在另一台设备登录
40003=登录已过期
# ------------------------ 4开头错误码作系统保留
40001=\u767B\u5F55\u4FE1\u606F\u6709\u8BEF
40002=\u8D26\u53F7\u5DF2\u5728\u53E6\u4E00\u53F0\u8BBE\u5907\u767B\u5F55
40003=\u767B\u5F55\u5DF2\u8FC7\u671F
# ------------------------ 4\u5F00\u5934\u9519\u8BEF\u7801\u4F5C\u7CFB\u7EDF\u4FDD\u7559
#APP ERROR
20001=验证码发送失败
20002=验证码错误,请重新输入
20003=无权查看
20004=参数错误
20005=手机号获取失败,请更换登录方式
20006=第三方账号未注册
20007=数量错误
20008=无权购买
20009=非会员用户暂不可购买
20010=当前不可购买
20011=未开始售卖
20012=售卖已结束
20013=已超过快递票截止时间
20014=快递票未填写收货地址
20015=入场人数量错误
20016=库存不足
20017=年龄不符合
20018=下单失败
20019=申请失败
20020=当前状态不可撤回
20021=退款金额不能为0
20022=申请金额不得小于0
20023=请求频繁
20024=订单不存在
20025=订单已支付
20026=订单已关闭
20028=订单已失效
20027=您已支付请刷新再试
20029=未选择支付方式
20030=查看失败
20001=\u9A8C\u8BC1\u7801\u53D1\u9001\u5931\u8D25
20002=\u9A8C\u8BC1\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165
20003=\u65E0\u6743\u67E5\u770B
20004=\u53C2\u6570\u9519\u8BEF
20005=\u624B\u673A\u53F7\u83B7\u53D6\u5931\u8D25\uFF0C\u8BF7\u66F4\u6362\u767B\u5F55\u65B9\u5F0F
20006=\u7B2C\u4E09\u65B9\u8D26\u53F7\u672A\u6CE8\u518C
20007=\u6570\u91CF\u9519\u8BEF
20008=\u65E0\u6743\u8D2D\u4E70
20009=\u975E\u4F1A\u5458\u7528\u6237\u6682\u4E0D\u53EF\u8D2D\u4E70
20010=\u5F53\u524D\u4E0D\u53EF\u8D2D\u4E70
20011=\u672A\u5F00\u59CB\u552E\u5356
20012=\u552E\u5356\u5DF2\u7ED3\u675F
20013=\u5DF2\u8D85\u8FC7\u5FEB\u9012\u7968\u622A\u6B62\u65F6\u95F4
20014=\u5FEB\u9012\u7968\u672A\u586B\u5199\u6536\u8D27\u5730\u5740
20015=\u5165\u573A\u4EBA\u6570\u91CF\u9519\u8BEF
20016=\u5E93\u5B58\u4E0D\u8DB3
20017=\u5E74\u9F84\u4E0D\u7B26\u5408
20018=\u4E0B\u5355\u5931\u8D25
20019=\u7533\u8BF7\u5931\u8D25
20020=\u5F53\u524D\u72B6\u6001\u4E0D\u53EF\u64A4\u56DE
20021=\u9000\u6B3E\u91D1\u989D\u4E0D\u80FD\u4E3A0
20022=\u7533\u8BF7\u91D1\u989D\u4E0D\u5F97\u5C0F\u4E8E0
20023=\u8BF7\u6C42\u9891\u7E41
20024=\u8BA2\u5355\u4E0D\u5B58\u5728
20025=\u8BA2\u5355\u5DF2\u652F\u4ED8
20026=\u8BA2\u5355\u5DF2\u5173\u95ED
20028=\u8BA2\u5355\u5DF2\u5931\u6548
20027=\u60A8\u5DF2\u652F\u4ED8\u8BF7\u5237\u65B0\u518D\u8BD5
20029=\u672A\u9009\u62E9\u652F\u4ED8\u65B9\u5F0F
20030=\u67E5\u770B\u5931\u8D25
#APP JDM
20201=
# 专业版APP
20601=账号不存在
20602=密码错误
# \u4E13\u4E1A\u7248APP
20601=\u8D26\u53F7\u4E0D\u5B58\u5728
20602=\u5BC6\u7801\u9519\u8BEF
20603=
20604=
20605=
20606=当前账号无关联演出数据
20607=当前账号未关联当前演出
20608=当前演出还未开放下载
# 演出
20700=演出详情获取失败
20701=巡演获取失败
20702=获取演出场次票种失败
20703=获取支付前详情失败
20606=\u5F53\u524D\u8D26\u53F7\u65E0\u5173\u8054\u6F14\u51FA\u6570\u636E
20607=\u5F53\u524D\u8D26\u53F7\u672A\u5173\u8054\u5F53\u524D\u6F14\u51FA
20608=\u5F53\u524D\u6F14\u51FA\u8FD8\u672A\u5F00\u653E\u4E0B\u8F7D
# \u6F14\u51FA
20700=\u6F14\u51FA\u8BE6\u60C5\u83B7\u53D6\u5931\u8D25
20701=\u5DE1\u6F14\u83B7\u53D6\u5931\u8D25
20702=\u83B7\u53D6\u6F14\u51FA\u573A\u6B21\u7968\u79CD\u5931\u8D25
20703=\u83B7\u53D6\u652F\u4ED8\u524D\u8BE6\u60C5\u5931\u8D25
#\u798F\u888B
20800=\u5151\u6362\u7801\u65E0\u6548
20801=\u8BA2\u5355\u4E0D\u5B58\u5728
20802=\u5151\u6362\u7801\u5DF2\u88AB\u4F7F\u7528
......@@ -255,10 +255,18 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
}
// 获取限购 实名
int ticketLimit = ticketData.getLimitCount();//普通票种限购
int ticketLimit = 1;
int ticketMemberLimit = ticketData.getLimitCountMember();//会员票种限购
int ticketIdCount = ticketData.getIdCount();//实名票种限购
int performanceLimit = performanceData.getLimitCount();//普通演出限购
int performanceLimit = 1;
if (isPay) {
performanceLimit = performanceData.getLimitCount();//普通演出限购
ticketLimit = ticketData.getLimitCount();//普通票种限购
} else {
performanceLimit = 10000;//兑换不限制演出限购
ticketLimit = 10000;//兑换不限制票种限购
}
int performanceMemberLimit = 1;//会员演出限购
int performanceIdCount = performanceData.getIdCount();//实名演出限购
int isTrueName = ticketData.getIsTrueName();//是否演出实名
......
-- 20250604 doudou预约签名CD记录表
drop TABLE if exists `sweet_doudou`;
CREATE TABLE `sweet_doudou`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`doudou_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'doudou_id',
`user_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'user_id',
`username` varchar(255) NOT NULL DEFAULT '' COMMENT '观演人姓名',
`phone` varchar(11) NOT NULL DEFAULT '' COMMENT '观演人手机号',
`platform` varchar(100) NOT NULL DEFAULT '' COMMENT '购买平台',
`order_code` varchar(100) NOT NULL DEFAULT '' COMMENT '购买订单号',
`mark` varchar(512) DEFAULT '' COMMENT '想给doudou说的话',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态 1已登记 2未中签 3已中签 4已核销',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`),
KEY `sweet_doudou_id` (`doudou_id`)
) ENGINE = InnoDB
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT 'doudou预约签名CD记录表';
alter table sweet_doudou
add active_id varchar(100) default '' not null comment '活动id' after order_code;
alter table sweet_doudou
add img_url varchar(255) default '' not null comment '订单截图 url' after active_id;
-- 20250604 doudou预约签名核验权限表
drop TABLE if exists `sweet_doudou_scope`;
CREATE TABLE `sweet_doudou_scope`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`mobile` varchar(50) NOT NULL COMMENT '核验人手机号',
`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '昵称',
`real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '真实姓名',
`id_card` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '身份证号码',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态 0 不可用 1可用',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`)
) ENGINE = InnoDB
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT 'doudou预约签名核验权限表';
\ No newline at end of file
drop TABLE if exists `sweet_doudou_active`;
CREATE TABLE `sweet_doudou_active` (
`mid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`active_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'active_id',
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题',
`details` varchar(1000) COLLATE utf8mb4_unicode_ci default '' COMMENT '活动详情/兑换说明',
`card_images` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '卡片背景图',
`detail_images` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动详情背景图',
`target_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动详情URL',
`begin_at` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '开始时间',
`end_at` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '结束时间',
`sort` tinyint(4) NOT NULL DEFAULT '1' COMMENT '排序,越大越靠前',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态 1可用 0不可用',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `active_id_ind` (`active_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='doudou活动表';
\ No newline at end of file
package com.liquidnet.service.sweet.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.param.SweetDouDouCheckParam;
import com.liquidnet.service.sweet.param.SweetDouDouParam;
import com.liquidnet.service.sweet.service.ISweetDoudouService;
import com.liquidnet.service.sweet.vo.SweetDouDouActiveVo;
import com.liquidnet.service.sweet.vo.SweetDouDouVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import java.util.List;
/**
* <p>
* doudou预约签名CD记录表 前端控制器
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
@Api(tags = "活动-doudou")
@RestController
@RequestMapping("/doudou")
public class SweetDoudouController {
@Autowired
private ISweetDoudouService iSweetDoudouService;
@GetMapping("/active/list")
@ApiOperation("获取活动列表")
public ResponseDto<List<SweetDouDouActiveVo>> getActiveList() {
return iSweetDoudouService.getActiveList();
}
@GetMapping("/active/detail")
@ApiOperation("获取活动详情")
public ResponseDto<SweetDouDouActiveVo> getActiveDetail(@RequestParam(value = "activeId") String activeId){
return iSweetDoudouService.getActiveDetail(activeId);
}
@GetMapping("")
@ApiOperation("获取用户预约详情")
public ResponseDto<SweetDouDouVo> info(@RequestParam(value = "activeId") String activeId) {
return iSweetDoudouService.info(activeId);
}
@PostMapping("")
@ApiOperation("预约")
public ResponseDto<SweetDouDouVo> create(@Valid @RequestBody SweetDouDouParam param) {
return iSweetDoudouService.create(param);
}
// ################################## 二维码核销 ###############################################
@PostMapping("/detail")
@ApiOperation("核验-码详情")
public ResponseDto<SweetDouDouVo> detail(@Valid @RequestBody SweetDouDouCheckParam param) {
return iSweetDoudouService.detail(param);
}
@PostMapping("/check")
@ApiOperation("核销")
public ResponseDto check(@Valid @RequestBody SweetDouDouCheckParam param) {
return iSweetDoudouService.check(param);
}
@PostMapping("/winning/upload")
@ApiOperation("中签上传")
public ResponseDto<Boolean> winningUpload(@RequestPart(value = "file") MultipartFile file) {
return ResponseDto.success(iSweetDoudouService.winningUpload(file));
}
}
package com.liquidnet.service.sweet.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.entity.SweetDoudouActive;
import com.liquidnet.service.sweet.mapper.SweetDoudouMapper;
import com.liquidnet.service.sweet.param.SweetDouDouCheckParam;
import com.liquidnet.service.sweet.param.SweetDouDouParam;
import com.liquidnet.service.sweet.service.ISweetDoudouService;
import com.liquidnet.service.sweet.utils.QueueUtils;
import com.liquidnet.service.sweet.utils.RedisDataUtils;
import com.liquidnet.service.sweet.vo.SweetDouDouActiveVo;
import com.liquidnet.service.sweet.vo.SweetDouDouScopeVo;
import com.liquidnet.service.sweet.vo.SweetDouDouVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* doudou预约签名CD记录表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
@Slf4j
@Service
public class SweetDoudouServiceImpl extends ServiceImpl<SweetDoudouMapper, SweetDoudou> implements ISweetDoudouService {
@Autowired
private RedisDataUtils redisDataUtils;
@Autowired
QueueUtils queueUtils;
@Override
public ResponseDto<SweetDouDouVo> info(String activeId) {
String uid = CurrentUtil.getCurrentUid();
SweetDouDouVo vo = redisDataUtils.getSweetDouDou(uid, activeId);
return ResponseDto.success(vo);
}
@Override
public ResponseDto<SweetDouDouVo> create(SweetDouDouParam param) {
String uid = CurrentUtil.getCurrentUid();
SweetDouDouVo vo = redisDataUtils.getSweetDouDou(uid, param.getActiveId());
if (null != vo) {
return ResponseDto.failure("您已经预约过啦~");
}
String nextSnowId = IDGenerator.nextSnowId();
String username = param.getUsername();
String phone = param.getPhone();
String activeId = param.getActiveId();
String imgUrl = param.getImgUrl();
String mark = param.getMark();
SweetDouDouVo entityVo = SweetDouDouVo.getNew();
entityVo.setDoudouId(nextSnowId);
entityVo.setUsername(username);
entityVo.setPhone(phone);
entityVo.setActiveId(activeId);
entityVo.setImgUrl(imgUrl);
entityVo.setMark(mark);
entityVo.setUserId(uid);
entityVo.setStatus(1);
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_doudou.insert"));
sqlsDataA.add(new Object[]{
nextSnowId, uid, username, phone, activeId, imgUrl, mark
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_ANSWER_INSERT.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
redisDataUtils.setSweetDouDou(entityVo);
return ResponseDto.success(entityVo);
}
@Override
public ResponseDto check(SweetDouDouCheckParam param) {
if (!checkScope(param.getAuthMobile())) {
log.info("无权核验, authMoible: {}", param.getAuthMobile());
return ResponseDto.failure(ErrorMapping.get("20003"));
}
SweetDouDouVo vo = redisDataUtils.getSweetDouDou(param.getUserId(), param.getActiveId());
if (null == vo) {
return ResponseDto.failure(ErrorMapping.get("90091"));
}
if (!vo.getDoudouId().equals(param.getDoudouId())) {
return ResponseDto.failure(ErrorMapping.get("90095"));
}
// 判断状态
if (vo.getStatus().equals(1)) {
return ResponseDto.failure(ErrorMapping.get("90092"));
} else if (vo.getStatus().equals(2)) {
return ResponseDto.failure(ErrorMapping.get("90093"));
} else if (vo.getStatus().equals(4)) {
return ResponseDto.failure(ErrorMapping.get("90094"));
}
vo.setStatus(4);
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_doudou.update"));
sqlsDataA.add(new Object[]{
vo.getStatus(), LocalDateTime.now(), vo.getDoudouId()
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_ANSWER_INSERT.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
redisDataUtils.setSweetDouDou(vo);
return ResponseDto.success();
}
@Override
public ResponseDto<SweetDouDouVo> detail(SweetDouDouCheckParam param) {
if (!checkScope(param.getAuthMobile())) {
log.info("无权核验, authMoible: {}", param.getAuthMobile());
return ResponseDto.failure(ErrorMapping.get("20003"));
}
SweetDouDouVo vo = redisDataUtils.getSweetDouDou(param.getUserId(), param.getActiveId());
if (vo == null) {
return ResponseDto.failure(ErrorMapping.get("90091"));
}
if (!vo.getDoudouId().equals(param.getDoudouId())) {
return ResponseDto.failure(ErrorMapping.get("90095"));
}
List<SweetDoudouActive> sweetDoudouActiveList = redisDataUtils.getSweetDouDouActive();
if (sweetDoudouActiveList.isEmpty()){
log.info("暂无活动");
return ResponseDto.success(vo);
}
List<SweetDoudouActive> sweetDoudouActives = sweetDoudouActiveList.stream()
.filter(s -> s.getActiveId().equals(param.getActiveId()))
.collect(Collectors.toList());
if (!sweetDoudouActives.isEmpty()) {
vo.setActiveTitle(sweetDoudouActives.get(0).getTitle());
}
return ResponseDto.success(vo);
}
@Override
public boolean winningUpload(MultipartFile file) {
List<SweetDouDouVo> fileSweetDouDouVos = getSweetDouDouVoListByFile(file);
if (fileSweetDouDouVos.isEmpty()) {
log.error("文件是空的");
return false;
}
for (SweetDouDouVo fileDouDouVo : fileSweetDouDouVos) {
SweetDouDouVo vo = redisDataUtils.getSweetDouDou(fileDouDouVo.getUserId(), fileDouDouVo.getActiveId());
if (vo != null) {
vo.setStatus(fileDouDouVo.getStatus());
redisDataUtils.setSweetDouDou(vo);
log.info("更新Redis成功");
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_doudou.update"));
sqlsDataA.add(new Object[]{
fileDouDouVo.getStatus(), LocalDateTime.now(), vo.getDoudouId()
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_ANSWER_INSERT.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
log.info("更新MySQL消息发送成功");
}
}
return true;
}
@Override
public ResponseDto<List<SweetDouDouActiveVo>> getActiveList() {
final String uid = CurrentUtil.getCurrentUid();
if (StringUtil.isBlank(uid)){
log.error("用户未登录");
return ResponseDto.success();
}
// 1. 获取活动列表,并设置进行状态
List<SweetDoudouActive> sweetDoudouActiveList = redisDataUtils.getSweetDouDouActive();
if (sweetDoudouActiveList.isEmpty()){
log.info("暂无活动");
return ResponseDto.success();
}
List<SweetDouDouActiveVo> sweetDouDouActiveVos = new ArrayList<>(sweetDoudouActiveList.size());
for (SweetDoudouActive doudouActive : sweetDoudouActiveList) {
SweetDouDouActiveVo douDouActiveVo = getSweetDouDouActiveVo(doudouActive);
if (douDouActiveVo == null) continue;
sweetDouDouActiveVos.add(douDouActiveVo);
}
return ResponseDto.success(sweetDouDouActiveVos);
}
private SweetDouDouActiveVo getSweetDouDouActiveVo(SweetDoudouActive doudouActive) {
// 1. 判断活动是否已经开始或结束
Integer activeStatus = checkActiveStatus(doudouActive.getBeginAt(), doudouActive.getEndAt());
if (activeStatus.equals(1)){
log.info("活动未开始, activeId: {}, title: {}.", doudouActive.getActiveId(), doudouActive.getTitle());
return null;
}
SweetDouDouActiveVo douDouActiveVo = SweetDouDouActiveVo.getNew().copy(doudouActive);
douDouActiveVo.setActiveStatus(activeStatus);
final String uid = CurrentUtil.getCurrentUid();
if (StringUtil.isBlank(uid)){
douDouActiveVo.setStatus(0);
} else {
SweetDouDouVo sweetDouDou = redisDataUtils.getSweetDouDou(uid, doudouActive.getActiveId());
if (sweetDouDou == null) {
douDouActiveVo.setStatus(0);
}else {
douDouActiveVo.setStatus(sweetDouDou.getStatus());
douDouActiveVo.setUserId(sweetDouDou.getUserId());
douDouActiveVo.setDoudouId(sweetDouDou.getDoudouId());
}
}
return douDouActiveVo;
}
public Integer checkActiveStatus(String beginAt, String endAt) {
final String nowTime = com.liquidnet.commons.lang.util.DateUtil.getNowTime();
if (null != beginAt && null != endAt && !beginAt.isEmpty() && !endAt.isEmpty()) {
if (com.liquidnet.commons.lang.util.DateUtil.compareStrDay(nowTime, beginAt) < 0) { // 当前时间小雨开始时间 还未开始呢
// 未开始
return 1;
} else if (com.liquidnet.commons.lang.util.DateUtil.compareStrDay(endAt, nowTime) < 0) { // 解释时间大于当前时间 已过期
// 已结束
return 3;
}else {
// 进行中
return 2;
}
}
return 3;
}
@Override
public ResponseDto<SweetDouDouActiveVo> getActiveDetail(String activeId) {
List<SweetDoudouActive> sweetDoudouActiveList = redisDataUtils.getSweetDouDouActive();
if (sweetDoudouActiveList.isEmpty()){
log.info("暂无活动");
return ResponseDto.success();
}
List<SweetDoudouActive> sweetDoudouActives = sweetDoudouActiveList.stream()
.filter(s -> s.getActiveId().equals(activeId))
.collect(Collectors.toList());
if (sweetDoudouActives.isEmpty()) {
log.info("暂无活动");
return ResponseDto.failure(ErrorMapping.get("90096"));
}
return ResponseDto.success(getSweetDouDouActiveVo(sweetDoudouActives.get(0)));
}
private List<SweetDouDouVo> getSweetDouDouVoListByFile(MultipartFile file) {
// 1. 验证文件类型
if (!isExcelFile(file)) {
log.error("请上传excel文件");
return Collections.emptyList();
}
ArrayList<SweetDouDouVo> sweetDouDouVos = new ArrayList<>();
try (InputStream inputStream = file.getInputStream();
Workbook workbook = WorkbookFactory.create(inputStream)) {
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
Iterator<Row> rowIterator = sheet.iterator();
// 跳过列名行
if (rowIterator.hasNext()) rowIterator.next();
// 2. 处理数据行
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
if (isRowEmpty(row)) continue; // 跳过空行
SweetDouDouVo vo = SweetDouDouVo.getNew();
vo.setDoudouId(getStringValue(row.getCell(0)));
vo.setUserId(getStringValue(row.getCell(1)));
vo.setActiveId(getStringValue(row.getCell(2)));
vo.setUsername(getStringValue(row.getCell(3)));
vo.setPhone(getStringValue(row.getCell(4)));
vo.setImgUrl(getStringValue(row.getCell(5)));
String cell7 = getStringValue(row.getCell(6));
vo.setStatus(cell7.equals("1") ? 3 : 2);
sweetDouDouVos.add(vo);
}
return sweetDouDouVos;
} catch (Exception e) {
log.error("error", e);
return Collections.emptyList();
}
}
// 辅助方法实现
private boolean isExcelFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
return fileName != null &&
(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"));
}
private boolean isRowEmpty(Row row) {
for (int i = 0; i < 7; i++) {
Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
if (cell != null && cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private String getStringValue(Cell cell) {
if (cell == null) return "";
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
return String.valueOf((int) cell.getNumericCellValue());
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
default:
return "";
}
}
private boolean checkScope(String authMobile) {
SweetDouDouScopeVo sweetDouDouScopeVo = redisDataUtils.getSweetDouDouScopeVo(authMobile);
return sweetDouDouScopeVo != null;
}
}
......@@ -59,6 +59,11 @@ public class RedisDataUtils {
private SweetArtistsMapper sweetArtistsMapper;
@Autowired
private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper;
@Autowired
private SweetDoudouScopeMapper sweetDoudouScopeMapper;
@Autowired
private SweetDoudouActiveMapper sweetDoudouActiveMapper;
@Autowired
@Lazy
private FeignSlimeApiClient feignSlimeApiClient;
......@@ -458,6 +463,39 @@ public class RedisDataUtils {
redisUtil.set(redisKey, sweetAnswerVo);
}
// doudou
public void setSweetDouDou(SweetDouDouVo vo) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(vo.getUserId()).concat(":activeId:" + vo.getActiveId());
redisUtil.set(redisKey, vo);
}
public SweetDouDouVo getSweetDouDou(String uid, String activeId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(uid).concat(":activeId:" + activeId);
return (SweetDouDouVo) redisUtil.get(redisKey);
}
public SweetDouDouScopeVo getSweetDouDouScopeVo(String mobile){
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE.concat(mobile);
SweetDouDouScopeVo scopeVo = (SweetDouDouScopeVo) redisUtil.get(redisKey);
if (scopeVo == null) {
// 从MySQL查询
LambdaQueryWrapper<SweetDoudouScope> lambda = new QueryWrapper<SweetDoudouScope>()
.lambda().eq(SweetDoudouScope::getMobile, mobile)
.eq(SweetDoudouScope::getStatus, 1);
SweetDoudouScope scope = sweetDoudouScopeMapper.selectOne(lambda);
if (scope != null) {
scopeVo = new SweetDouDouScopeVo().copy(scope);
setSweetDouDouScopeVo(scopeVo);
}
}
return scopeVo;
}
public void setSweetDouDouScopeVo(SweetDouDouScopeVo sweetDouDouScopeVo){
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE.concat(sweetDouDouScopeVo.getMobile());
redisUtil.set(redisKey, sweetDouDouScopeVo, RedisKeyExpireConst.SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE);
}
//草莓音乐节活动海报相关
public void setSweetMusician(SweetStrawberryParam sweetStrawberry) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_STRAWBERRY_POSTER.concat(sweetStrawberry.getUnionId());
......@@ -931,4 +969,27 @@ public class RedisDataUtils {
}
}
public List<SweetDoudouActive> getSweetDouDouActive() {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_ACTIVE;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
LambdaQueryWrapper<SweetDoudouActive> queryWrapper = new QueryWrapper<SweetDoudouActive>()
.lambda()
.eq(SweetDoudouActive::getStatus, 1)
.orderByDesc(SweetDoudouActive::getSort);
List<SweetDoudouActive> doudouActives = sweetDoudouActiveMapper.selectList(queryWrapper);
if (doudouActives.isEmpty()) {
return Collections.emptyList();
}
setSweetDouDouActive(doudouActives);
return doudouActives;
}else {
return (List<SweetDoudouActive>) obj;
}
}
public void setSweetDouDouActive(List<SweetDoudouActive> activeList){
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_ACTIVE;
redisUtil.set(redisKey, activeList, RedisKeyExpireConst.SWEET_DOUDOU_ACTIVE_EXPIRE);
}
}
40001=登录信息有误
40002=账号已在另一台设备登录
40003=登录已过期
# 特殊状态码
90081=获取用户信息失败
90082=您的积分账户余额不足!
20003=\u65E0\u6743\u6838\u9A8C
40001=\u767B\u5F55\u4FE1\u606F\u6709\u8BEF
40002=\u8D26\u53F7\u5DF2\u5728\u53E6\u4E00\u53F0\u8BBE\u5907\u767B\u5F55
40003=\u767B\u5F55\u5DF2\u8FC7\u671F
# \u7279\u6B8A\u72B6\u6001\u7801
90081=\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u5931\u8D25
90082=\u60A8\u7684\u79EF\u5206\u8D26\u6237\u4F59\u989D\u4E0D\u8DB3\uFF01
90091=\u672A\u67E5\u8BE2\u5230\u9884\u7EA6\u8BB0\u5F55
90092=\u672A\u5230\u89E3\u9501\u65F6\u95F4
90093=\u60A8\u672A\u4E2D\u7B7E
90094=\u5DF2\u88AB\u6838\u9500
90095=\u4E8C\u7EF4\u7801\u65E0\u6548
90096=\u672A\u67E5\u8BE2\u5230\u8BE5\u6D3B\u52A8
kylin_order_ticket_entities.updateStatusByStation=UPDATE kylin_order_ticket_entities SET `status`=?,check_client=?,updated_at=? WHERE order_ticket_entities_id=? # ------------------------缺票登记(不用考虑并发)---------------------------- kylin_lack_register.insert=INSERT INTO `kylin_lack_registers`(`lack_registers_id` ,`performance_id` ,`ticket_id` ,`user_id` ,`user_name` ,`user_mobile` ,`send_status` ,`ip_address` ,`created_at`)VALUES(? ,? ,? ,? ,? ,? ,? ,? ,?); # ------------------------支付回调---------------------------- kylin_order_ticket.synPay=UPDATE kylin_order_tickets SET payment_type = ? ,pay_code = ? , time_pay = ?, qr_code = ? , updated_at = ? WHERE order_tickets_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_status.synPay=UPDATE kylin_order_ticket_status SET `status` = ?,pay_status = ?,updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_relation.synPay=UPDATE kylin_order_ticket_relations SET updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_entities.synPay=UPDATE kylin_order_ticket_entities SET is_payment = ?,updated_at = ?,sys_damai = 1 WHERE order_id = ? and (updated_at <= ? or created_at = ?) # ------------------------用户关系---------------------------- sweet_user_relation.insert=INSERT INTO sweet_user_relation (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation.delete=DELETE FROM sweet_user_relation WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? sweet_user_relation_mdsk.insert=INSERT INTO sweet_user_relation_mdsk (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation_mdsk.delete=DELETE FROM sweet_user_relation_mdsk WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? sweet_user_relation_five.insert=INSERT INTO sweet_user_relation_five (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation_five.delete=DELETE FROM sweet_user_relation_five WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? # ------------------------抽奖---------------------------- sweet_luck_draw.insert=INSERT INTO sweet_luck_draw (mobile,union_id,luck_draw_num,prize,prize_all,status,created_at) VALUES (?,?,?,?,?,1,?) # --------------------------答案-------------------------- sweet_answer.insert=INSERT INTO sweet_answer (answer_id,phone,answer_json,img_url) VALUES (?,?,?,?) # --------------------------提醒记录-------------------------- sweet_remind.insert=INSERT INTO sweet_remind (remind_id,openId,unionId,performancesId) VALUES (?,?,?,?) sweet_applet_sub_msg.insert=INSERT INTO sweet_applet_sub_msg (msg_id,open_id,union_id,user_id,template_id,target_id,applet_type,activity_type) VALUES (?,?,?,?,?,?,?,?) # --------------------------用户投票记录-------------------------- sweet_city_vote.insert=INSERT INTO sweet_city_vote (vote_id,phone,openId,unionId,type,city_code,city_name,day_time) VALUES (?,?,?,?,?,?,?,?) sweet_city_vote_stat.insert=INSERT INTO sweet_city_vote_stat (stat_id,city_code,city_name,vote_num,type) VALUES (?,?,?,?,?) sweet_city_vote_stat.update=UPDATE sweet_city_vote_stat SET vote_num = IFNULL(vote_num, 0) + 1, updated_at = ? WHERE city_code = ? AND type = ? # --------------------------防疫答题-------------------------- sweet_antigenic_question.insert=INSERT INTO sweet_antigenic_question (question_id,type,openId,unionId,nickname,address,phone,urgent_phone,keyword1,keyword11,keyword2,keyword3,keyword4,keyword5,keyword6,keyword7) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) # ------------------------积分抽奖---------------------------- sweet_integral_activity_draw.insert=INSERT INTO sweet_integral_activity_draw (draw_id,integral_activity_id,activity_num,prize_id,prize_title,prize_type,prize_type_num,user_id,nickname,receiving_status) VALUES (?,?,?,?,?,?,?,?,?,?) sweet_integral_activity_draw.update=UPDATE sweet_integral_activity_draw SET receiving_addresses_id = ?, receiving_name = ?, receiving_phone = ?, receiving_address = ?, receiving_province = ?, receiving_city = ?, receiving_county = ?, updated_at = ? WHERE draw_id = ? sweet_integral_activity_draw.updateStatus=UPDATE sweet_integral_activity_draw SET receiving_status = ?, relation_id = ?, updated_at = ? WHERE draw_id = ? sweet_integral_activity_draw.get_coupon=INSERT INTO candy_mgt_coupon (mcoupon_id, coupon_id, `state`, event_amt, event_type, event_limit, event_at, `operator`, created_at) VALUES (?, ?, 0, ?, 2, ?, ?, ?, ?) # --------------------------小程序登录记录用户解密后信息-------------------------- sweet_applet_users.insert=INSERT INTO sweet_applet_users (applet_user_id,user_id,open_id,union_id,phone_number,pure_phone_number,country_code,type) VALUES (?,?,?,?,?,?,?,?) # --------------------------微信用户信息表公众号-------------------------- sweet_wechat_users.insert=INSERT INTO sweet_wechat_users (wechat_user_id,type,open_id,union_id,nickname,sex_desc,sex,head_img_url,language,country,province,city,subscribe_time,subscribe_scene) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) sweet_wechat_users.delete=DELETE FROM sweet_wechat_users WHERE union_id = ? and type = ? sweet_wechat_users.update=UPDATE sweet_wechat_users SET is_cancel = ?, updated_at = ? WHERE union_id = ? AND type = ? AND is_cancel = 1 #---------------------------音乐节活动海报-------------------------------- sweet_strawberry_poster_user=INSERT INTO sweet_strawberry_poster(open_id,poster_id,union_id,nickname,city_name,city_code,custom_text,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?) sweet_strawberry_poster_Musician=INSERT INTO sweet_strawberry_poster_lineup(lineup_id,poster_id,lineup_num,musician_name,created_at,updated_at) VALUES (?,?,?,?,?,?) #---------------------------猫登天空-------------------------------- sweet_wechat_maodeng.insert=INSERT INTO sweet_wechat_maodeng(mao_id,user_id,text_msg,pic_url,img_url,created_at) VALUES (?,?,?,?,?,?) sweet_wechat_maodeng.text.update=UPDATE sweet_wechat_maodeng SET text_msg=? WHERE user_id=? AND mao_id=? sweet_wechat_maodeng.img.update=UPDATE sweet_wechat_maodeng SET img_url=? WHERE user_id=? AND mao_id=? # --------------------------数字藏品预约活动-------------------------- sweet_collection_reservation.insert=INSERT INTO sweet_collection_reservation (reservation_id,nickname,mobile,mailbox,enterprise_name,title,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?) # --------------------------YB??-------------------------- sweet_yb_enroll.insert=INSERT INTO sweet_yb_enroll (enroll_id,contact_tell,contact_wechat,nickname,style,img_url,audio_url,universities,city_name,activity_id,age) VALUES (?,?,?,?,?,?,?,?,?,?,?)
\ No newline at end of file
kylin_order_ticket_entities.updateStatusByStation=UPDATE kylin_order_ticket_entities SET `status`=?,check_client=?,updated_at=? WHERE order_ticket_entities_id=? # ------------------------\u7F3A\u7968\u767B\u8BB0(\u4E0D\u7528\u8003\u8651\u5E76\u53D1)---------------------------- kylin_lack_register.insert=INSERT INTO `kylin_lack_registers`(`lack_registers_id` ,`performance_id` ,`ticket_id` ,`user_id` ,`user_name` ,`user_mobile` ,`send_status` ,`ip_address` ,`created_at`)VALUES(? ,? ,? ,? ,? ,? ,? ,? ,?); # ------------------------\u652F\u4ED8\u56DE\u8C03---------------------------- kylin_order_ticket.synPay=UPDATE kylin_order_tickets SET payment_type = ? ,pay_code = ? , time_pay = ?, qr_code = ? , updated_at = ? WHERE order_tickets_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_status.synPay=UPDATE kylin_order_ticket_status SET `status` = ?,pay_status = ?,updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_relation.synPay=UPDATE kylin_order_ticket_relations SET updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?) kylin_order_ticket_entities.synPay=UPDATE kylin_order_ticket_entities SET is_payment = ?,updated_at = ?,sys_damai = 1 WHERE order_id = ? and (updated_at <= ? or created_at = ?) # ------------------------\u7528\u6237\u5173\u7CFB---------------------------- sweet_user_relation.insert=INSERT INTO sweet_user_relation (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation.delete=DELETE FROM sweet_user_relation WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? sweet_user_relation_mdsk.insert=INSERT INTO sweet_user_relation_mdsk (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation_mdsk.delete=DELETE FROM sweet_user_relation_mdsk WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? sweet_user_relation_five.insert=INSERT INTO sweet_user_relation_five (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?) sweet_user_relation_five.delete=DELETE FROM sweet_user_relation_five WHERE user_id = ? and target_id = ? and manual_id = ? and type = ? # ------------------------\u62BD\u5956---------------------------- sweet_luck_draw.insert=INSERT INTO sweet_luck_draw (mobile,union_id,luck_draw_num,prize,prize_all,status,created_at) VALUES (?,?,?,?,?,1,?) # --------------------------\u7B54\u6848-------------------------- sweet_answer.insert=INSERT INTO sweet_answer (answer_id,phone,answer_json,img_url) VALUES (?,?,?,?) sweet_doudou.insert=INSERT INTO sweet_doudou (doudou_id,user_id,username,phone,active_id,img_url,mark) VALUES (?,?,?,?,?,?,?) sweet_doudou.update=UPDATE sweet_doudou SET STATUS = ?, updated_at = ? WHERE doudou_id = ? # --------------------------\u63D0\u9192\u8BB0\u5F55-------------------------- sweet_remind.insert=INSERT INTO sweet_remind (remind_id,openId,unionId,performancesId) VALUES (?,?,?,?) sweet_applet_sub_msg.insert=INSERT INTO sweet_applet_sub_msg (msg_id,open_id,union_id,user_id,template_id,target_id,applet_type,activity_type) VALUES (?,?,?,?,?,?,?,?) # --------------------------\u7528\u6237\u6295\u7968\u8BB0\u5F55-------------------------- sweet_city_vote.insert=INSERT INTO sweet_city_vote (vote_id,phone,openId,unionId,type,city_code,city_name,day_time) VALUES (?,?,?,?,?,?,?,?) sweet_city_vote_stat.insert=INSERT INTO sweet_city_vote_stat (stat_id,city_code,city_name,vote_num,type) VALUES (?,?,?,?,?) sweet_city_vote_stat.update=UPDATE sweet_city_vote_stat SET vote_num = IFNULL(vote_num, 0) + 1, updated_at = ? WHERE city_code = ? AND type = ? # --------------------------\u9632\u75AB\u7B54\u9898-------------------------- sweet_antigenic_question.insert=INSERT INTO sweet_antigenic_question (question_id,type,openId,unionId,nickname,address,phone,urgent_phone,keyword1,keyword11,keyword2,keyword3,keyword4,keyword5,keyword6,keyword7) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) # ------------------------\u79EF\u5206\u62BD\u5956---------------------------- sweet_integral_activity_draw.insert=INSERT INTO sweet_integral_activity_draw (draw_id,integral_activity_id,activity_num,prize_id,prize_title,prize_type,prize_type_num,user_id,nickname,receiving_status) VALUES (?,?,?,?,?,?,?,?,?,?) sweet_integral_activity_draw.update=UPDATE sweet_integral_activity_draw SET receiving_addresses_id = ?, receiving_name = ?, receiving_phone = ?, receiving_address = ?, receiving_province = ?, receiving_city = ?, receiving_county = ?, updated_at = ? WHERE draw_id = ? sweet_integral_activity_draw.updateStatus=UPDATE sweet_integral_activity_draw SET receiving_status = ?, relation_id = ?, updated_at = ? WHERE draw_id = ? sweet_integral_activity_draw.get_coupon=INSERT INTO candy_mgt_coupon (mcoupon_id, coupon_id, `state`, event_amt, event_type, event_limit, event_at, `operator`, created_at) VALUES (?, ?, 0, ?, 2, ?, ?, ?, ?) # --------------------------\u5C0F\u7A0B\u5E8F\u767B\u5F55\u8BB0\u5F55\u7528\u6237\u89E3\u5BC6\u540E\u4FE1\u606F-------------------------- sweet_applet_users.insert=INSERT INTO sweet_applet_users (applet_user_id,user_id,open_id,union_id,phone_number,pure_phone_number,country_code,type) VALUES (?,?,?,?,?,?,?,?) # --------------------------\u5FAE\u4FE1\u7528\u6237\u4FE1\u606F\u8868\u516C\u4F17\u53F7-------------------------- sweet_wechat_users.insert=INSERT INTO sweet_wechat_users (wechat_user_id,type,open_id,union_id,nickname,sex_desc,sex,head_img_url,language,country,province,city,subscribe_time,subscribe_scene) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) sweet_wechat_users.delete=DELETE FROM sweet_wechat_users WHERE union_id = ? and type = ? sweet_wechat_users.update=UPDATE sweet_wechat_users SET is_cancel = ?, updated_at = ? WHERE union_id = ? AND type = ? AND is_cancel = 1 #---------------------------\u97F3\u4E50\u8282\u6D3B\u52A8\u6D77\u62A5-------------------------------- sweet_strawberry_poster_user=INSERT INTO sweet_strawberry_poster(open_id,poster_id,union_id,nickname,city_name,city_code,custom_text,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?) sweet_strawberry_poster_Musician=INSERT INTO sweet_strawberry_poster_lineup(lineup_id,poster_id,lineup_num,musician_name,created_at,updated_at) VALUES (?,?,?,?,?,?) #---------------------------\u732B\u767B\u5929\u7A7A-------------------------------- sweet_wechat_maodeng.insert=INSERT INTO sweet_wechat_maodeng(mao_id,user_id,text_msg,pic_url,img_url,created_at) VALUES (?,?,?,?,?,?) sweet_wechat_maodeng.text.update=UPDATE sweet_wechat_maodeng SET text_msg=? WHERE user_id=? AND mao_id=? sweet_wechat_maodeng.img.update=UPDATE sweet_wechat_maodeng SET img_url=? WHERE user_id=? AND mao_id=? # --------------------------\u6570\u5B57\u85CF\u54C1\u9884\u7EA6\u6D3B\u52A8-------------------------- sweet_collection_reservation.insert=INSERT INTO sweet_collection_reservation (reservation_id,nickname,mobile,mailbox,enterprise_name,title,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?) # --------------------------YB??-------------------------- sweet_yb_enroll.insert=INSERT INTO sweet_yb_enroll (enroll_id,contact_tell,contact_wechat,nickname,style,img_url,audio_url,universities,city_name,activity_id,age) VALUES (?,?,?,?,?,?,?,?,?,?,?)
\ No newline at end of file
......
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