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

Commit 6b1f9daa authored by 胡佳晨's avatar 胡佳晨

提交代码

parent c0d225f4
...@@ -2,6 +2,7 @@ package com.liquidnet.commons.lang.util; ...@@ -2,6 +2,7 @@ package com.liquidnet.commons.lang.util;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.util.Arrays;
import java.util.Enumeration; import java.util.Enumeration;
public class IDGenerator { public class IDGenerator {
...@@ -65,18 +66,35 @@ public class IDGenerator { ...@@ -65,18 +66,35 @@ public class IDGenerator {
return ((timestamp - twepoch) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | sequence; return ((timestamp - twepoch) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | sequence;
} }
/**
* 根据订单id生成订单号
*
* @param orderTicketId
* @return
*/
public static String ticketOrderCode(String orderTicketId) { public static String ticketOrderCode(String orderTicketId) {
String number = orderTicketId; String number = orderTicketId;
int len = orderTicketId.length(); int len = orderTicketId.length();
String time = System.currentTimeMillis() / 1000 + ""; String time = System.currentTimeMillis() / 1000 + "";
String orderCode = "T" + number.substring(0, len - 4); String orderCode = "T" + number.substring(0, len - 4);
orderCode+=time.substring(7, 8); orderCode += time.substring(7, 8);
orderCode+=number.substring(len - 2); orderCode += number.substring(len - 2);
orderCode+=time.substring(8, 9); orderCode += time.substring(8, 9);
orderCode+=number.substring(len - 4, len-2); orderCode += number.substring(len - 4, len - 2);
return orderCode; return orderCode;
} }
/**
* 根据 订单号生成qrCode
*
* @param orderTicketId
* @return String
*/
public static String ticketQrCode(String orderTicketId) {
String qrCode = MD5Utils.md5(orderTicketId).toLowerCase();
return "QR" + qrCode.substring(5) + "" + qrCode.substring(0, 4);
}
private static long genTime() { private static long genTime() {
return useSystemClock ? SystemClock.now() : System.currentTimeMillis(); return useSystemClock ? SystemClock.now() : System.currentTimeMillis();
} }
......
...@@ -17,6 +17,9 @@ liquidnet: ...@@ -17,6 +17,9 @@ liquidnet:
level-root: info level-root: info
mysql: mysql:
database-name: dev_ln_scene database-name: dev_ln_scene
url-pay:
pay: "http://testpay.zhengzai.tv/"
check: "http://testpay.zhengzai.tv/order/verify"
#以下为spring各环境个性配置 #以下为spring各环境个性配置
spring: spring:
......
...@@ -8,8 +8,11 @@ public class KylinRedisConst { ...@@ -8,8 +8,11 @@ public class KylinRedisConst {
public static final String SURPLUS_GENERAL = "surplusGeneral"; public static final String SURPLUS_GENERAL = "surplusGeneral";
public static final String SURPLUS_EXCHANGE = "surplusExchange"; public static final String SURPLUS_EXCHANGE = "surplusExchange";
public static final String TICKET = "kylin:ticket:info"; public static final String TICKET = "kylin:ticket:info";
public static final String ORDER = "kylin:order:info";
public static final String ORDER_ENTITIES = "kylin:order_entities:info";
public static final String TIMES = "kylin:times:id"; public static final String TIMES = "kylin:times:id";
public static final String BANNERS = "kylin:banners"; public static final String BANNERS = "kylin:banners";
public static final String AGENT = "kylin:agent:info";
public static final String CHECK_USER = "kylin:checkUser"; public static final String CHECK_USER = "kylin:checkUser";
public static final String CHECK_USER_RELATION = "kylin:checkUser:relation"; public static final String CHECK_USER_RELATION = "kylin:checkUser:relation";
......
package com.liquidnet.service.kylin.dto.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class PayAgainParam {
@ApiModelProperty(value = "订单id")
@NotNull(message = "必传")
private String orderId;
@ApiModelProperty(value = "支付类型")
@NotNull(message = "必传")
private String payType;
@ApiModelProperty(value = "支付来源")
@NotNull(message = "必传")
private String deviceFrom;
@ApiModelProperty(value = "openId")
private String openId;
}
package com.liquidnet.service.kylin.dto.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
public class SyncOrderParam {
@ApiModelProperty(value = "status")
private Integer status;
@ApiModelProperty(value = "type")
private String type;
@ApiModelProperty(value = "code")
private String code;
@ApiModelProperty(value = "payment_id")
private String payment_id;
@ApiModelProperty(value = "order_code")
private String order_code;
@ApiModelProperty(value = "price")
private BigDecimal price;
@ApiModelProperty(value = "payment_type")
private String payment_type;
}
package com.liquidnet.service.kylin.dto.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class KylinOrderListVo implements Serializable {
private static final long serialVersionUID = 6554829077875538374L;
private String orderTicketsId;
private String performanceTitle;
private String performanceImg;
private String timeStart;
private String ticketTitle;
private String useStart;
private String overdueAt;
private int canBuyTime;
private BigDecimal priceActual;
private Integer number;
private Integer status;
private String createdAt;
}
...@@ -22,4 +22,9 @@ public class KylinOrderTicketEntitiesVo implements Serializable { ...@@ -22,4 +22,9 @@ public class KylinOrderTicketEntitiesVo implements Serializable {
private Integer sysDamai; private Integer sysDamai;
private String checkClient; private String checkClient;
private Integer isPayment; private Integer isPayment;
private String performanceTitle;
private String ticketTitle;
private String useStart;
private String useEnd;
} }
...@@ -25,6 +25,10 @@ public class KylinOrderTicketVo implements Serializable { ...@@ -25,6 +25,10 @@ public class KylinOrderTicketVo implements Serializable {
private String userMobile; private String userMobile;
@ApiModelProperty(position = 14, value = "演出名称") @ApiModelProperty(position = 14, value = "演出名称")
private String performanceTitle; private String performanceTitle;
private String ticketTitle;
private String timeStart;
private String useStart;
private String performanceImg;
@ApiModelProperty(position = 15, value = "订单号") @ApiModelProperty(position = 15, value = "订单号")
private String orderCode; private String orderCode;
@ApiModelProperty(position = 16, value = "支付单号") @ApiModelProperty(position = 16, value = "支付单号")
...@@ -88,6 +92,10 @@ public class KylinOrderTicketVo implements Serializable { ...@@ -88,6 +92,10 @@ public class KylinOrderTicketVo implements Serializable {
private String agentId; private String agentId;
private Integer isMember; private Integer isMember;
private String overdueAt;
private String createdAt;
private String updatedAt;
public void setOrderTicket(KylinOrderTickets orderTicket) { public void setOrderTicket(KylinOrderTickets orderTicket) {
BeanUtils.copyProperties(orderTicket,this); BeanUtils.copyProperties(orderTicket,this);
} }
......
...@@ -14,6 +14,8 @@ public class PayResultVo implements Serializable { ...@@ -14,6 +14,8 @@ public class PayResultVo implements Serializable {
private String order_code; private String order_code;
private Integer status;
private String order_id; private String order_id;
private BigDecimal price; private BigDecimal price;
......
package com.liquidnet.service.kylin.service; package com.liquidnet.service.kylin.service;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.PayAgainParam;
import com.liquidnet.service.kylin.dto.param.PayOrderParam; import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.KylinPerformanceVo; import com.liquidnet.service.kylin.dto.vo.KylinPerformanceVo;
import com.liquidnet.service.kylin.dto.vo.KylinTicketVo; import com.liquidnet.service.kylin.dto.vo.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.PayResultVo; import com.liquidnet.service.kylin.dto.vo.PayResultVo;
...@@ -21,24 +25,28 @@ import java.util.List; ...@@ -21,24 +25,28 @@ import java.util.List;
public interface IKylinOrderTicketsService extends IService<KylinOrderTickets> { public interface IKylinOrderTicketsService extends IService<KylinOrderTickets> {
// 下单前判断接口(判断是否可锁定库存)(无订单->待支付->可支付) // 下单前判断接口(判断是否可锁定库存)(无订单->待支付->可支付)
ResponseDto<PayResultVo>checkCanOrder(PayOrderParam payOrderParam); ResponseDto<PayResultVo> checkCanOrder(PayOrderParam payOrderParam);
// 下单接口(无订单->待支付->可支付) // 再次支付(待支付->可支付->倒计时结束释放库存)
ResponseDto<PayResultVo> order(PayOrderParam payOrderParam, String uid, boolean isMember, int isTrueName, KylinPerformanceVo performanceData, KylinTicketVo ticketData); ResponseDto<PayResultVo> payAgain(PayAgainParam payAgainParam);
// 再次支付(待支付->可支付->倒计时结束释放库存)
// 取消支付(待支付->订单失效->释放库存->中断倒计时)
// 支付回调(待支付->已支付->中断倒计时) // 支付回调(待支付->已支付->中断倒计时)
String syncOrder(SyncOrderParam syncOrderParam);
// 同步大麦数据接口 // 同步大麦数据接口
// 代理票务 可买状态判断
//订单列表(状态 待支付 已支付 倒计时 已失效) //订单列表(状态 待支付 已支付 倒计时 已失效)
PageInfo<List<KylinOrderListVo>> orderList(int page,int size);
//订单详情 //订单详情
//TASK 倒计时 //TASK 倒计时
boolean checkOrderTime(String userId);
// 下单接口(无订单->待支付->可支付)
// 删除订单
// 代理票务 可买状态判断
// 取消支付(待支付->订单失效->释放库存->中断倒计时)
// ResponseDto<PayResultVo> order(PayOrderParam payOrderParam, String uid, boolean isMember, int isTrueName, KylinPerformanceVo performanceData, KylinTicketVo ticketData,Object adamEntersList);
} }
...@@ -123,4 +123,14 @@ public class KylinOrderTicketEntities implements Serializable { ...@@ -123,4 +123,14 @@ public class KylinOrderTicketEntities implements Serializable {
createdAt, updatedAt createdAt, updatedAt
}; };
} }
/**
* 获取 支付回调 数据库参数
* @return
*/
public Object[] getSynOrderObject() {
return new Object[]{
orderId, isPayment, updatedAt
};
}
} }
...@@ -79,4 +79,14 @@ public class KylinOrderTicketStatus implements Serializable { ...@@ -79,4 +79,14 @@ public class KylinOrderTicketStatus implements Serializable {
}; };
} }
/**
* 获取 支付回调 数据库参数
* @return
*/
public Object[] getSynOrderObject() {
return new Object[]{
orderId, status,payStatus, updatedAt
};
}
} }
...@@ -190,6 +190,7 @@ public class KylinOrderTickets implements Serializable { ...@@ -190,6 +190,7 @@ public class KylinOrderTickets implements Serializable {
/** /**
* 获取 添加 数据库参数 * 获取 添加 数据库参数
*
* @return * @return
*/ */
public Object[] getAddObject() { public Object[] getAddObject() {
...@@ -201,4 +202,26 @@ public class KylinOrderTickets implements Serializable { ...@@ -201,4 +202,26 @@ public class KylinOrderTickets implements Serializable {
}; };
} }
/**
* 获取 再次支付 数据库参数
*
* @return
*/
public Object[] getPayAgainObject() {
return new Object[]{
orderTicketsId, orderType, updatedAt, orderCode
};
}
/**
* 获取 支付回调 数据库参数
*
* @return
*/
public Object[] getSynOrderObject() {
return new Object[]{
orderTicketsId, paymentType, payCode, timePay, qrCode, updatedAt
};
}
} }
...@@ -511,9 +511,6 @@ CREATE TABLE `kylin_order_ticket_entities` ...@@ -511,9 +511,6 @@ CREATE TABLE `kylin_order_ticket_entities`
) ENGINE = InnoDB ) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT '订单详情'; DEFAULT CHARSET = utf8mb4 COMMENT '订单详情';
-- 大麦同步记录 TODO 待定
-- 验票相关 TODO 待定
-- 会员权益修改表 TODO 待定
-- 订单退款 <初步> -- 订单退款 <初步>
drop TABLE if exists `kylin_order_tickets_refund`; drop TABLE if exists `kylin_order_tickets_refund`;
CREATE TABLE `kylin_order_tickets_refund` CREATE TABLE `kylin_order_tickets_refund`
...@@ -589,6 +586,85 @@ CREATE TABLE `kylin_check_user_performances` ...@@ -589,6 +586,85 @@ CREATE TABLE `kylin_check_user_performances`
) ENGINE = InnoDB ) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT '验票用户可看演出表'; DEFAULT CHARSET = utf8mb4 COMMENT '验票用户可看演出表';
-- 快递相关临时
CREATE TABLE `express_batches` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`admin_id` int NOT NULL DEFAULT '0' COMMENT '管理员',
`order_id` int NOT NULL DEFAULT '0' COMMENT '订单Id,订阅前查询',
`order_type` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单类型 order_product 商品订单 , order_ticket 票务订单, order_integration 积分订单',
`order_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '订单编号',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司名称',
`company` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司编号',
`number` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递单号',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态 0新导入 1订阅成功 2订阅失败',
`import_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '导入时间',
`batch` int NOT NULL DEFAULT '0' COMMENT '导入批次',
`reason` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '失败原因',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `express_batches_batch_index` (`batch`),
KEY `express_batches_company_index` (`company`),
KEY `express_batches_number_index` (`number`),
KEY `express_batches_order_code_index` (`order_code`),
KEY `express_batches_order_type_index` (`order_type`)
) ENGINE=InnoDB AUTO_INCREMENT=34781 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC;
CREATE TABLE `express_logs` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_id` int NOT NULL COMMENT '订单id',
`order_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '订单类型 order_product 商品订单 , order_ticket 票务订单',
`admin_id` int NOT NULL DEFAULT '0' COMMENT '修改人id',
`admin_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '修改人名称',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递联系人',
`mobile` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递联系电话',
`address` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递收货地址',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=487 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC;
CREATE TABLE `express_batches` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`admin_id` int NOT NULL DEFAULT '0' COMMENT '管理员',
`order_id` int NOT NULL DEFAULT '0' COMMENT '订单Id,订阅前查询',
`order_type` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单类型 order_product 商品订单 , order_ticket 票务订单, order_integration 积分订单',
`order_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '订单编号',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司名称',
`company` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司编号',
`number` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递单号',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态 0新导入 1订阅成功 2订阅失败',
`import_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '导入时间',
`batch` int NOT NULL DEFAULT '0' COMMENT '导入批次',
`reason` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '失败原因',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `express_batches_batch_index` (`batch`),
KEY `express_batches_company_index` (`company`),
KEY `express_batches_number_index` (`number`),
KEY `express_batches_order_code_index` (`order_code`),
KEY `express_batches_order_type_index` (`order_type`)
) ENGINE=InnoDB AUTO_INCREMENT=34781 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC;
CREATE TABLE `expresses` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`admin_id` int NOT NULL DEFAULT '0' COMMENT '管理员',
`order_id` int NOT NULL DEFAULT '0' COMMENT '订单Id',
`order_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '订单编号',
`order_type` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单类型 order_product 商品订单 , order_ticket 票务订单, order_integration 积分订单',
`status` tinyint NOT NULL DEFAULT '-1' COMMENT '状态 -1待揽收、0在途中、1已揽收、2疑难、3已签收',
`number` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT '' COMMENT '快递单号',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司名称',
`company` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '快递公司编号',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `expresses_number_index` (`number`),
KEY `expresses_order_code_index` (`order_code`),
KEY `expresses_order_id_index` (`order_id`),
KEY `expresses_order_type_index` (`order_type`)
) ENGINE=InnoDB AUTO_INCREMENT=56762 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='快递表';
insert into `kylin_buy_notice` (`buy_notice_id`, `img_url`, `message`, `status`, `sort`, `created_at`, insert into `kylin_buy_notice` (`buy_notice_id`, `img_url`, `message`, `status`, `sort`, `created_at`,
`updated_at`, `title`) `updated_at`, `title`)
values ('1', 'http://img-zhengzai-tv.oss-cn-hangzhou.aliyuncs.com/partner/2019/01/21/5c45722882a13.png', values ('1', 'http://img-zhengzai-tv.oss-cn-hangzhou.aliyuncs.com/partner/2019/01/21/5c45722882a13.png',
......
package com.liquidnet.service.kylin.controller; package com.liquidnet.service.kylin.controller;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.PayAgainParam;
import com.liquidnet.service.kylin.dto.param.PayOrderParam; import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.PayResultVo; import com.liquidnet.service.kylin.dto.vo.PayResultVo;
import com.liquidnet.service.kylin.service.impl.KylinOrderTicketsServiceImpl; import com.liquidnet.service.kylin.service.impl.KylinOrderTicketsServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -11,6 +15,8 @@ import io.swagger.annotations.ApiResponse; ...@@ -11,6 +15,8 @@ import io.swagger.annotations.ApiResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
/** /**
* <p> * <p>
* 订单 前端控制器 * 订单 前端控制器
...@@ -34,4 +40,32 @@ public class KylinOrderTicketsController { ...@@ -34,4 +40,32 @@ public class KylinOrderTicketsController {
return orderTicketsService.checkCanOrder(payOrderParam); return orderTicketsService.checkCanOrder(payOrderParam);
} }
@PostMapping("payAgain")
@ApiOperation("再次支付")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<PayResultVo> payAgain(@RequestBody PayAgainParam payAgainParam) {
return orderTicketsService.payAgain(payAgainParam);
}
@PostMapping("syncOrder")
@ApiOperation("支付回调")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String payAgain(@RequestBody SyncOrderParam syncOrderParam) {
return orderTicketsService.syncOrder(syncOrderParam);
}
@GetMapping("list")
@ApiOperation("订单列表")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<PageInfo<List<KylinOrderListVo>>> payAgain(@RequestParam("page") int page,
@RequestParam("size") int size) {
return ResponseDto.success(orderTicketsService.orderList(page,size));
}
@GetMapping("checkOrderTime")
@ApiOperation("订单过期脚本")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<Boolean> checkOrderTime() {
return ResponseDto.success(orderTicketsService.checkOrderTime(null));
}
} }
package com.liquidnet.service.kylin.service.impl; package com.liquidnet.service.kylin.service.impl;
import com.github.pagehelper.PageInfo;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.common.mq.constant.MQConst;
import com.liquidnet.commons.lang.util.*; import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.dto.vo.AdamAddressesVo; import com.liquidnet.service.adam.dto.vo.AdamAddressesVo;
import com.liquidnet.service.adam.dto.vo.AdamEntersVo; import com.liquidnet.service.adam.dto.vo.AdamEntersVo;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.feign.adam.api.FeignAdamBaseClient; import com.liquidnet.service.feign.adam.api.FeignAdamBaseClient;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.param.PayAgainParam;
import com.liquidnet.service.kylin.dto.param.PayOrderParam; import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.*; import com.liquidnet.service.kylin.dto.vo.*;
import com.liquidnet.service.kylin.entity.*; import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketsMapper; import com.liquidnet.service.kylin.mapper.KylinOrderTicketsMapper;
import com.liquidnet.service.kylin.service.IKylinOrderTicketsService; import com.liquidnet.service.kylin.service.IKylinOrderTicketsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.kylin.utils.DataUtils; import com.liquidnet.service.kylin.utils.DataUtils;
import com.mongodb.BasicDBObject;
import org.redisson.api.RLock;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
...@@ -38,11 +52,21 @@ import java.util.Map; ...@@ -38,11 +52,21 @@ import java.util.Map;
@Service @Service
public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsMapper, KylinOrderTickets> implements IKylinOrderTicketsService { public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsMapper, KylinOrderTickets> implements IKylinOrderTicketsService {
@Value("${liquidnet.url-pay.pay}")
private String payUrl;
@Value("${liquidnet.url-pay.check}")
private String checkUrl;
@Autowired @Autowired
private DataUtils dataUtils; private DataUtils dataUtils;
@Autowired @Autowired
private RedisUtil redisUtil;
@Autowired
private RedisLockUtil redisLockUtil;
@Autowired
private MongoTemplate mongoTemplate; private MongoTemplate mongoTemplate;
@Autowired @Autowired
private MongoConverter mongoConverter;
@Autowired
private RabbitTemplate rabbitTemplate; private RabbitTemplate rabbitTemplate;
@Autowired @Autowired
private FeignAdamBaseClient feignAdamBaseClient; private FeignAdamBaseClient feignAdamBaseClient;
...@@ -50,29 +74,40 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -50,29 +74,40 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
@Override @Override
public ResponseDto<PayResultVo> checkCanOrder(PayOrderParam payOrderParam) { public ResponseDto<PayResultVo> checkCanOrder(PayOrderParam payOrderParam) {
boolean isDownGeneral = false; boolean isDownGeneral = false;
String uid = CurrentUtil.getCurrentUid();
RLock lock = RedisLockUtil.lock("userId:" + uid, 2);
try { try {
String uid = CurrentUtil.getCurrentUid(); if (lock.isLocked()) {
return ResponseDto.failure("请求频繁");//参数错误
}
KylinPerformanceVo performanceData = dataUtils.getPerformanceVo(payOrderParam.getPerformanceId()); KylinPerformanceVo performanceData = dataUtils.getPerformanceVo(payOrderParam.getPerformanceId());
KylinTicketTimesVo ticketTimesData = dataUtils.getTicketTimesVo(payOrderParam.getTimeId()); KylinTicketTimesVo ticketTimesData = dataUtils.getTicketTimesVo(payOrderParam.getTimeId());
KylinTicketVo ticketData = dataUtils.getTicketVo(payOrderParam.getTicketId()); KylinTicketVo ticketData = dataUtils.getTicketVo(payOrderParam.getTicketId());
if (performanceData == null || ticketTimesData == null || ticketData == null) { if (performanceData == null || ticketTimesData == null || ticketData == null) {
lock.unlock();
return ResponseDto.failure("参数错误");//参数错误 return ResponseDto.failure("参数错误");//参数错误
} }
if (!ticketData.getTimeId().equals(payOrderParam.getTimeId()) || !ticketTimesData.getPerformanceId().equals(payOrderParam.getPerformanceId())) { if (!ticketData.getTimeId().equals(payOrderParam.getTimeId()) || !ticketTimesData.getPerformanceId().equals(payOrderParam.getPerformanceId())) {
lock.unlock();
return ResponseDto.failure("参数错误");//参数错误List<AdamEntersVo> entersVoList return ResponseDto.failure("参数错误");//参数错误List<AdamEntersVo> entersVoList
} }
//判断代理
if(!checkAgent(payOrderParam.getAgentId(),ticketData)){
lock.unlock();
return ResponseDto.failure("无权购买");
}
//会员时间获取 //会员时间获取
String memberTimeStart = ticketData.getMemberTimeStart(); // 会员开售时间 String memberTimeStart = ticketData.getMemberTimeStart(); // 会员开售时间
String timeStart = ticketData.getTimeStart(); // 普通开售时间 String timeStart = ticketData.getTimeStart(); // 普通开售时间
String timeEnd = ticketData.getTimeEnd(); // 购票停售时间 String timeEnd = ticketData.getTimeEnd(); // 购票停售时间
String timeExpressEnd = ticketData.getTimeEndExpress(); // 快递停售时间 String timeExpressEnd = ticketData.getTimeEndExpress(); // 快递停售时间
int performanceBuyCount; //演出下所有票种购买数量
int ticketBuyCount;// 单一票种购买数量
boolean isMember = feignAdamBaseClient.isMember(uid).getData();//获取是否是会员 boolean isMember = feignAdamBaseClient.isMember(uid).getData();//获取是否是会员
int memberType; //会员状态 不需要判断会员 1判断会员逻辑 2会员专属 int memberType; //会员状态 不需要判断会员 1判断会员逻辑 2会员专属
if (ticketData.getIsExclusive() == 1) { if (ticketData.getIsExclusive() == 1) {
memberType = 2; memberType = 2;
if (!isMember) { if (!isMember) {
lock.unlock();
return ResponseDto.failure("非会员用户暂不可购买");//没有会员权限 return ResponseDto.failure("非会员用户暂不可购买");//没有会员权限
} }
} else { } else {
...@@ -80,6 +115,7 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -80,6 +115,7 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
// 会员购买逻辑 // 会员购买逻辑
memberType = 1; memberType = 1;
if (!isMember) { if (!isMember) {
lock.unlock();
return ResponseDto.failure("非会员用户暂不可购买");//没有会员权限 return ResponseDto.failure("非会员用户暂不可购买");//没有会员权限
} }
} else { } else {
...@@ -98,29 +134,36 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -98,29 +134,36 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
//通用判断时间 //通用判断时间
if (isMember) { if (isMember) {
if (DateUtil.compareStrDay(DateUtil.getNowTime(), memberTimeStart) == -1) { if (DateUtil.compareStrDay(DateUtil.getNowTime(), memberTimeStart) == -1) {
lock.unlock();
return ResponseDto.failure("未开始售卖");//未开始 return ResponseDto.failure("未开始售卖");//未开始
} }
} else { } else {
if (DateUtil.compareStrDay(DateUtil.getNowTime(), timeStart) == -1) { if (DateUtil.compareStrDay(DateUtil.getNowTime(), timeStart) == -1) {
lock.unlock();
return ResponseDto.failure("未开始售卖");//未开始 return ResponseDto.failure("未开始售卖");//未开始
} }
} }
if (DateUtil.compareStrDay(DateUtil.getNowTime(), timeEnd) == 1) { if (DateUtil.compareStrDay(DateUtil.getNowTime(), timeEnd) == 1) {
lock.unlock();
return ResponseDto.failure("售卖已结束");//已结束 return ResponseDto.failure("售卖已结束");//已结束
} }
//快递票判断 //快递票判断
if (payOrderParam.getIsExpress() == 1 && DateUtil.compareStrDay(DateUtil.getNowTime(), timeExpressEnd) == 1) { if (payOrderParam.getIsExpress() == 1 && DateUtil.compareStrDay(DateUtil.getNowTime(), timeExpressEnd) == 1) {
lock.unlock();
return ResponseDto.failure("已超过快递票截止时间");//快递票不卖 return ResponseDto.failure("已超过快递票截止时间");//快递票不卖
} }
if (payOrderParam.getIsExpress() == 1 && payOrderParam.getAddressId().isEmpty()) { if (payOrderParam.getIsExpress() == 1 && payOrderParam.getAddressId().isEmpty()) {
lock.unlock();
return ResponseDto.failure("快递票未填写收货地址");//快递票未填写收货地址 return ResponseDto.failure("快递票未填写收货地址");//快递票未填写收货地址
} }
//实名判断 //实名判断
if (isTrueName == 1 && payOrderParam.getEnterIdList().size() <= 0) { if (isTrueName == 1 && payOrderParam.getEnterIdList().size() <= 0) {
lock.unlock();
return ResponseDto.failure("入场人数量错误");//需要实名 未实名 return ResponseDto.failure("入场人数量错误");//需要实名 未实名
} }
if (isTrueName == 1 && payOrderParam.getEnterIdList().size() != payOrderParam.getNumber()) { if (isTrueName == 1 && payOrderParam.getEnterIdList().size() != payOrderParam.getNumber()) {
lock.unlock();
return ResponseDto.failure("入场人数量错误");//入场人数量错误 return ResponseDto.failure("入场人数量错误");//入场人数量错误
} }
...@@ -128,65 +171,120 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -128,65 +171,120 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
int surplusGeneral = dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), -payOrderParam.getNumber()); int surplusGeneral = dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), -payOrderParam.getNumber());
if (surplusGeneral < 0) {//库存回滚 if (surplusGeneral < 0) {//库存回滚
dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), payOrderParam.getNumber()); dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), payOrderParam.getNumber());
lock.unlock();
return ResponseDto.failure("该票种已售罄");//没抢到 return ResponseDto.failure("该票种已售罄");//没抢到
} else { } else {
isDownGeneral = true; isDownGeneral = true;
//学生票 判断
List<AdamEntersVo> entersVoList = new ArrayList<>();
if (null != payOrderParam.getIsStudent() && payOrderParam.getIsStudent() == 1) {
for (String enterId : payOrderParam.getEnterIdList()) {
AdamEntersVo adamEnters = feignAdamBaseClient.queryEnters(enterId, uid).getData();
entersVoList.add(adamEnters);
int age = IDCard.getAgeByIdCard(adamEnters.getIdCard());
if (age > 25) {
lock.unlock();
return ResponseDto.failure("年龄不符合");//年龄超了
}
}
}
//限购判断 如果实名 则身份证维度限购 如果不实名则数量限购 //限购判断 如果实名 则身份证维度限购 如果不实名则数量限购
Query queryPerformance = new Query();
Query queryTicket = new Query();
queryPerformance.addCriteria(Criteria.where("performanceId").is(payOrderParam.getPerformanceId()).and("status").in(0, 1));
queryTicket.addCriteria(Criteria.where("ticketId").is(payOrderParam.getTicketId()).and("status").in(0, 1));
int performanceBuyCount = 0; //演出下所有票种购买数量
int ticketBuyCount = 0;// 单一票种购买数量
if (isTrueName == 1) { if (isTrueName == 1) {
//已购买数量 身份证 //已购买数量 身份证
performanceBuyCount = 0 + payOrderParam.getNumber(); //演出下所有票种购买数量 TODO queryPerformance.fields().include("orderTicketsId");
ticketBuyCount = 0 + payOrderParam.getNumber(); // 单一票种购买数量 TODO queryTicket.fields().include("orderTicketsId");
KylinOrderTicketVo performanceOrderId = mongoTemplate.findOne(queryPerformance, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
KylinOrderTicketVo ticketOrderId = mongoTemplate.findOne(queryTicket, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (performanceOrderId != null && ticketOrderId != null) {
for (AdamEntersVo item : entersVoList) {
performanceBuyCount += mongoTemplate.count(Query.query(Criteria.where("enterIdCode").is(item.getIdCard()).and("performanceId").is(payOrderParam.getPerformanceId()).and("orderTicketsId").is(performanceOrderId.getOrderTicketsId())), KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName())
+ payOrderParam.getNumber();
ticketBuyCount += mongoTemplate.count(Query.query(Criteria.where("enterIdCode").is(item.getIdCard()).and("ticketId").is(payOrderParam.getPerformanceId()).and("orderTicketsId").is(ticketOrderId.getOrderTicketsId())), KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName())
+ payOrderParam.getNumber();
//会员区间
if (memberType == 1 || memberType == 2) {
if (performanceBuyCount >= performanceMemberLimit && performanceMemberLimit != 0) {
lock.unlock();
return ResponseDto.failure("该演出只能购买" + performanceMemberLimit + "张");//超过演出维度购买量
}
if (ticketBuyCount >= ticketMemberLimit && ticketMemberLimit != 0) {
lock.unlock();
return ResponseDto.failure("该票种只能购买" + ticketMemberLimit + "张");//超过票维度购买量
}
} else {//非会员区间
if (performanceBuyCount >= performanceLimit && performanceLimit != 0) {
lock.unlock();
return ResponseDto.failure("该演出只能购买" + performanceLimit + "张");//超过演出维度购买量
}
if (ticketBuyCount >= ticketLimit && ticketLimit != 0) {
lock.unlock();
return ResponseDto.failure("该票种只能购买" + ticketLimit + "张");//超过票维度购买量
}
}
}
}
} else { } else {
//已购买数量 数量 //已购买数量 数量
performanceBuyCount = 0 + payOrderParam.getNumber(); //演出下所有票种购买数量 TODO queryPerformance.fields().include("number");
ticketBuyCount = 0 + payOrderParam.getNumber(); // 单一票种购买数量 TODO queryTicket.fields().include("number");
} List<KylinOrderTicketVo> performanceList = mongoTemplate.find(queryPerformance, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
//会员区间 List<KylinOrderTicketVo> ticketList = mongoTemplate.find(queryTicket, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (memberType == 1 || memberType == 2) {
if (performanceBuyCount >= performanceMemberLimit && performanceMemberLimit != 0) { for (KylinOrderTicketVo number : performanceList) {
return ResponseDto.failure("该演出只能购买" + performanceMemberLimit + "张");//超过演出维度购买量 performanceBuyCount += number.getNumber();
}
if (ticketBuyCount >= ticketMemberLimit && ticketMemberLimit != 0) {
return ResponseDto.failure("该票种只能购买" + ticketMemberLimit + "张");//超过票维度购买量
} }
} else {//非会员区间 for (KylinOrderTicketVo number : ticketList) {
if (performanceBuyCount >= performanceLimit && performanceLimit != 0) { ticketBuyCount += number.getNumber();
return ResponseDto.failure("该演出只能购买" + performanceLimit + "张");//超过演出维度购买量
} }
if (ticketBuyCount >= ticketLimit && ticketLimit != 0) { performanceBuyCount += payOrderParam.getNumber(); //演出下所有票种购买数量
return ResponseDto.failure("该票种只能购买" + ticketLimit + "张");//超过票维度购买量 ticketBuyCount += payOrderParam.getNumber(); // 单一票种购买数量
//会员区间
if (memberType == 1 || memberType == 2) {
if (performanceBuyCount >= performanceMemberLimit && performanceMemberLimit != 0) {
lock.unlock();
return ResponseDto.failure("该演出只能购买" + performanceMemberLimit + "张");//超过演出维度购买量
}
if (ticketBuyCount >= ticketMemberLimit && ticketMemberLimit != 0) {
lock.unlock();
return ResponseDto.failure("该票种只能购买" + ticketMemberLimit + "张");//超过票维度购买量
}
} else {//非会员区间
if (performanceBuyCount >= performanceLimit && performanceLimit != 0) {
lock.unlock();
return ResponseDto.failure("该演出只能购买" + performanceLimit + "张");//超过演出维度购买量
}
if (ticketBuyCount >= ticketLimit && ticketLimit != 0) {
lock.unlock();
return ResponseDto.failure("该票种只能购买" + ticketLimit + "张");//超过票维度购买量
}
} }
} }
return order(payOrderParam, uid, isMember, isTrueName, performanceData, ticketData); lock.unlock();
return order(payOrderParam, uid, isMember, isTrueName, performanceData, ticketData, entersVoList);
} }
} catch (Exception e) { } catch (Exception e) {
if (isDownGeneral) { if (isDownGeneral) {
dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), payOrderParam.getNumber()); dataUtils.changeSurplusGeneral(payOrderParam.getTicketId(), payOrderParam.getNumber());
} }
e.printStackTrace(); e.printStackTrace();
lock.unlock();
return ResponseDto.failure("下单失败");//乱七八糟异常 return ResponseDto.failure("下单失败");//乱七八糟异常
} }
} }
@Override private ResponseDto<PayResultVo> order(PayOrderParam payOrderParam, String uid, boolean isMember, int isTrueName, KylinPerformanceVo performanceData, KylinTicketVo ticketData, List<AdamEntersVo> entersVoList) {
public ResponseDto<PayResultVo> order(PayOrderParam payOrderParam, String uid, boolean isMember, int isTrueName, KylinPerformanceVo performanceData, KylinTicketVo ticketData) {
LinkedList<String> sqls = new LinkedList<>(); LinkedList<String> sqls = new LinkedList<>();
LinkedList<Object[]> paramsList = new LinkedList<>(); LinkedList<Object[]> paramsList = new LinkedList<>();
String source = CurrentUtil.getCliSource(); String source = CurrentUtil.getCliSource();
String version = CurrentUtil.getCliVersion(); String version = CurrentUtil.getCliVersion();
List<AdamEntersVo> entersVoList = new ArrayList();
//学生票 判断
if (null != payOrderParam.getIsStudent() && payOrderParam.getIsStudent() == 1) {
for (String enterId : payOrderParam.getEnterIdList()) {
AdamEntersVo adamEnters = feignAdamBaseClient.queryEnters(enterId, uid).getData();
entersVoList.add(adamEnters);
int age = IDCard.getAgeByIdCard(adamEnters.getIdCard());
if (age > 25) {
return ResponseDto.failure("年龄不符合");//年龄超了
}
}
}
//生成订单 order_ticket //生成订单 order_ticket
KylinOrderTickets orderTickets = new KylinOrderTickets(); KylinOrderTickets orderTickets = new KylinOrderTickets();
String orderTicketId = IDGenerator.nextSnowId().toString(); String orderTicketId = IDGenerator.nextSnowId().toString();
...@@ -299,6 +397,10 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -299,6 +397,10 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
// 生成vo // 生成vo
KylinOrderTicketEntitiesVo orderTicketEntitiesVo = new KylinOrderTicketEntitiesVo(); KylinOrderTicketEntitiesVo orderTicketEntitiesVo = new KylinOrderTicketEntitiesVo();
BeanUtils.copyProperties(orderTicketEntities, orderTicketEntitiesVo); BeanUtils.copyProperties(orderTicketEntities, orderTicketEntitiesVo);
orderTicketEntitiesVo.setPerformanceTitle(performanceData.getTitle());
orderTicketEntitiesVo.setTicketTitle(ticketData.getTitle());
orderTicketEntitiesVo.setUseStart(ticketData.getUseStart());
orderTicketEntitiesVo.setUseEnd(ticketData.getUseEnd());
mongoTemplate.insert(orderTicketEntitiesVo, KylinOrderTicketEntitiesVo.class.getSimpleName()); mongoTemplate.insert(orderTicketEntitiesVo, KylinOrderTicketEntitiesVo.class.getSimpleName());
} }
} else { } else {
...@@ -325,45 +427,324 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM ...@@ -325,45 +427,324 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
// 生成vo // 生成vo
KylinOrderTicketEntitiesVo orderTicketEntitiesVo = new KylinOrderTicketEntitiesVo(); KylinOrderTicketEntitiesVo orderTicketEntitiesVo = new KylinOrderTicketEntitiesVo();
BeanUtils.copyProperties(orderTicketEntities, orderTicketEntitiesVo); BeanUtils.copyProperties(orderTicketEntities, orderTicketEntitiesVo);
orderTicketEntitiesVo.setPerformanceTitle(performanceData.getTitle());
orderTicketEntitiesVo.setTicketTitle(ticketData.getTitle());
orderTicketEntitiesVo.setUseStart(ticketData.getUseStart());
orderTicketEntitiesVo.setUseEnd(ticketData.getUseEnd());
mongoTemplate.insert(orderTicketEntitiesVo, KylinOrderTicketEntitiesVo.class.getSimpleName()); mongoTemplate.insert(orderTicketEntitiesVo, KylinOrderTicketEntitiesVo.class.getSimpleName());
} }
} }
// 调用支付 别忘记生成支付单号 // 调用支付
// $pay_result = zhengzai::getPayParam($pay_params, $device_from, $pay_type);
LinkedMultiValueMap<String, String> httpData = new LinkedMultiValueMap<String, String>(); LinkedMultiValueMap<String, String> httpData = new LinkedMultiValueMap<String, String>();
httpData.add("type","TICKET"); httpData.add("type", "TICKET");
httpData.add("price","0.01"); httpData.add("price", "0.01");
httpData.add("name",ticketData.getUseStart()+""+ticketData.getTitle()); httpData.add("name", ticketData.getUseStart() + "" + ticketData.getTitle());
httpData.add("detail",performanceData.getTitle()+"-"+ticketData.getTitle()+"-"+ticketData.getUseStart()); httpData.add("detail", performanceData.getTitle() + "-" + ticketData.getTitle() + "-" + ticketData.getUseStart());
httpData.add("order_code",orderTickets.getOrderCode()); httpData.add("order_code", orderTickets.getOrderCode());
httpData.add("client_ip","127.0.0.1"); httpData.add("client_ip", "127.0.0.1");
httpData.add("notify_url","http://www.baidu.com"); httpData.add("notify_url", "http://www.baidu.com");
httpData.add("create_date",orderTickets.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); httpData.add("create_date", orderTickets.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expire_time",orderTickets.getPayCountdownMinute().toString()); httpData.add("expire_time", orderTickets.getPayCountdownMinute().toString());
if (payOrderParam.getDeviceFrom().equals("js") || payOrderParam.getDeviceFrom().equals("applet")) { if (payOrderParam.getDeviceFrom().equals("js") || payOrderParam.getDeviceFrom().equals("applet")) {
httpData.add("open_id",payOrderParam.getOpenId()); httpData.add("open_id", payOrderParam.getOpenId());
} }
if (payOrderParam.getPayType().equals("alipay") && payOrderParam.getDeviceFrom().equals("wap")) { if (payOrderParam.getPayType().equals("alipay") && payOrderParam.getDeviceFrom().equals("wap")) {
httpData.add("show_url",payOrderParam.getOpenId()); httpData.add("show_url", payOrderParam.getShowUrl());
httpData.add("return_url",payOrderParam.getOpenId()); httpData.add("return_url", payOrderParam.getReturnUrl());
} }
String returnData = HttpUtil.post("http://testpay.zhengzai.tv/"+payOrderParam.getDeviceFrom()+"/"+payOrderParam.getPayType(), httpData); String returnData = HttpUtil.post(payUrl + payOrderParam.getDeviceFrom() + "/" + payOrderParam.getPayType(), httpData);
PayResultVo payResultVo = JsonUtils.fromJson(returnData,PayResultVo.class); PayResultVo payResultVo = JsonUtils.fromJson(returnData, PayResultVo.class);
payResultVo.setOrder_id(orderTicketId); payResultVo.setOrder_id(orderTicketId);
payResultVo.setPrice(orderTickets.getPriceActual()); payResultVo.setPrice(orderTickets.getPriceActual());
orderTickets.setPayCode(payResultVo.getOrder_code()); orderTickets.setPayCode(payResultVo.getCode());
// 生成vo // 生成vo
KylinOrderTicketVo orderTicketVo = new KylinOrderTicketVo(); KylinOrderTicketVo orderTicketVo = new KylinOrderTicketVo();
orderTicketVo.setOrderTicket(orderTickets); orderTicketVo.setOrderTicket(orderTickets);
orderTicketVo.setOrderTicketStatus(orderTicketStatus); orderTicketVo.setOrderTicketStatus(orderTicketStatus);
orderTicketVo.setOrderTicketRelation(orderTicketRelations); orderTicketVo.setOrderTicketRelation(orderTicketRelations);
orderTicketVo.setPerformanceImg(performanceData.getImgPoster());
orderTicketVo.setTicketTitle(ticketData.getTitle());
orderTicketVo.setUseStart(ticketData.getUseStart());
orderTicketVo.setTimeStart(performanceData.getTimeStart());
orderTicketVo.setOverdueAt(orderTickets.getCreatedAt().plusMinutes(performanceData.getPayCountdownMinute()).plusSeconds(15).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
orderTicketVo.setCreatedAt(orderTickets.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mongoTemplate.insert(orderTicketVo, KylinOrderTicketVo.class.getSimpleName()); mongoTemplate.insert(orderTicketVo, KylinOrderTicketVo.class.getSimpleName());
// 执行sql // 执行sql
// rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL, // rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
// SqlMapping.get(sqls, paramsList)); // SqlMapping.get(sqls, paramsList));
return ResponseDto.success(payResultVo); return ResponseDto.success(payResultVo);
} }
@Override
public ResponseDto<PayResultVo> payAgain(PayAgainParam payAgainParam) {
try {
String uid = CurrentUtil.getCurrentUid();
checkOrderTime(uid);
//检查订单时间 是否关闭
KylinOrderTicketVo orderTicketData = dataUtils.getOrderTicketVo(payAgainParam.getOrderId());
if (orderTicketData == null) {
return ResponseDto.failure("订单不存在");
}
if (orderTicketData.getStatus() == 1) {
return ResponseDto.failure("订单已支付");
} else {
if (orderTicketData.getStatus() != 0) {
return ResponseDto.failure("订单已关闭");
}
}
String returnCheckData = HttpUtil.get(checkUrl + "?code=" + orderTicketData.getPayCode(), null);
PayResultVo checkVo = JsonUtils.fromJson(returnCheckData, PayResultVo.class);
if (checkVo.getStatus() == 1) {
return ResponseDto.failure("'您已支付请刷新再试'");
}
if (!orderTicketData.getPayType().equals("no")) {
KylinOrderTicketEntitiesVo entitiesDataOne = mongoTemplate.findOne(Query.query(Criteria.where("orderId").is(payAgainParam.getOrderId())), KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
if (entitiesDataOne == null) {
return ResponseDto.failure("参数错误");
}
KylinOrderTicketEntitiesVo entitiesData = dataUtils.getOrderTicketEntitiesVo(entitiesDataOne.getOrderTicketEntitiesId());
LinkedMultiValueMap<String, String> httpData = new LinkedMultiValueMap<String, String>();
httpData.add("type", "TICKET");
httpData.add("price", "0.01");
httpData.add("name", entitiesData.getUseStart() + "" + entitiesData.getPerformanceTitle());
httpData.add("detail", entitiesData.getPerformanceTitle() + "-" + entitiesData.getTicketTitle() + "-" + entitiesData.getUseStart());
httpData.add("order_code", orderTicketData.getOrderCode());
httpData.add("client_ip", "127.0.0.1");
httpData.add("notify_url", "http://www.baidu.com");
httpData.add("create_date", orderTicketData.getCreatedAt());
httpData.add("expire_time", orderTicketData.getPayCountdownMinute().toString());
httpData.add("open_id", payAgainParam.getOpenId());
httpData.add("show_url", payAgainParam.getOpenId());
httpData.add("return_url", payAgainParam.getOpenId());
String returnData = HttpUtil.post(payUrl + payAgainParam.getDeviceFrom() + "/" + payAgainParam.getPayType(), httpData);
PayResultVo payResultVo = JsonUtils.fromJson(returnData, PayResultVo.class);
payResultVo.setOrder_id(orderTicketData.getOrderTicketsId());
payResultVo.setPrice(orderTicketData.getPriceActual());
KylinOrderTickets orderTickets = new KylinOrderTickets();
orderTickets.setOrderTicketsId(payAgainParam.getOrderId());
orderTickets.setUpdatedAt(LocalDateTime.now());
orderTickets.setPayCode(payResultVo.getCode());
orderTickets.setPayType(payAgainParam.getPayType());
//改vo
HashMap<String, String> map = new HashMap<>();
map.put("payType", payAgainParam.getPayType());
map.put("payCode", payResultVo.getCode());
map.put("updatedAt", orderTickets.getUpdatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(payAgainParam.getOrderId())).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(map))
);
redisUtil.hdel(KylinRedisConst.ORDER, orderTickets.getOrderTicketsId());
// rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
// SqlMapping.get("kylin_order_ticket.payAgain", orderTickets.getPayAgainObject()));
return ResponseDto.success(payResultVo);
}
return ResponseDto.failure("未选择支付方式");
} catch (Exception e) {
e.printStackTrace();
return ResponseDto.failure("订单已失效");
}
}
@Override
public String syncOrder(SyncOrderParam syncOrderParam) {
//支付时间
LocalDateTime now = LocalDateTime.now();
RLock lock = RedisLockUtil.lock("order_lock:" + syncOrderParam.getOrder_code(), 240);
if (lock.isLocked()) {
return "fail";
}
String timePay = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
KylinOrderTicketVo orderTicketData = mongoTemplate.findOne(Query.query(Criteria.where("orderCode").is(syncOrderParam.getOrder_code())), KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (orderTicketData == null) {
lock.unlock();
return "fail";//订单不存在
}
if (orderTicketData.getStatus() != 0) {
if (orderTicketData.getPayCode().equals(syncOrderParam.getCode()) && orderTicketData.getStatus() == 1) {
lock.unlock();
return "success";//已经支付
}
if (!orderTicketData.getPayCode().equals(syncOrderParam.getCode())) {
lock.unlock();
return "fail";//重复支付
}
}
if (orderTicketData.getPriceActual().compareTo(syncOrderParam.getPrice()) != 0) {
lock.unlock();
return "fail";//价格不符
}
LinkedList<String> sqls = new LinkedList<>();
LinkedList<Object[]> paramsList = new LinkedList<>();
//sql
KylinOrderTickets orderTickets = new KylinOrderTickets();
orderTickets.setOrderTicketsId(orderTicketData.getOrderTicketsId());
orderTickets.setPaymentType(syncOrderParam.getPayment_type());
orderTickets.setPayCode(syncOrderParam.getCode());
orderTickets.setTimePay(timePay);
orderTickets.setQrCode(IDGenerator.ticketQrCode(orderTicketData.getOrderTicketsId()));
orderTickets.setUpdatedAt(now);
sqls.add("kylin_order_ticket.synPay");
paramsList.add(orderTickets.getSynOrderObject());
KylinOrderTicketStatus orderTicketStatus = new KylinOrderTicketStatus();
orderTicketStatus.setOrderId(orderTicketData.getOrderTicketsId());
orderTicketStatus.setStatus(1);
orderTicketStatus.setPayStatus(syncOrderParam.getStatus());
orderTicketStatus.setUpdatedAt(orderTickets.getUpdatedAt());
sqls.add("kylin_order_ticket_status.synPay");
paramsList.add(orderTicketStatus.getSynOrderObject());
KylinOrderTicketEntities orderTicketEntities = new KylinOrderTicketEntities();
orderTicketEntities.setOrderId(orderTicketData.getOrderTicketsId());
orderTicketEntities.setIsPayment(1);
orderTicketEntities.setUpdatedAt(orderTickets.getUpdatedAt());
sqls.add("kylin_order_ticket_entities.synPay");
paramsList.add(orderTicketEntities.getSynOrderObject());
//vo
HashMap<String, Object> orderTicketVo = new HashMap<>();
orderTicketVo.put("paymentType", orderTickets.getPaymentType());
orderTicketVo.put("payCode", orderTickets.getPayCode());
orderTicketVo.put("timePay", orderTickets.getTimePay());
orderTicketVo.put("qrCode", orderTickets.getQrCode());
orderTicketVo.put("status", 1);
orderTicketVo.put("payStatus", orderTicketStatus.getStatus());
orderTicketVo.put("updatedAt", timePay);
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderTickets.getOrderTicketsId())).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(orderTicketVo))
);
redisUtil.hdel(KylinRedisConst.ORDER, orderTickets.getOrderTicketsId());
HashMap<String, Object> orderTicketEntitiesVo = new HashMap<>();
orderTicketEntitiesVo.put("isPayment", 1);
orderTicketEntitiesVo.put("updatedAt", timePay);
mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("orderId").is(orderTickets.getOrderTicketsId())).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(orderTicketEntitiesVo))
);
List<KylinOrderTicketEntitiesVo> delList = mongoTemplate.find(Query.query(Criteria.where("orderId").is(orderTickets.getOrderTicketsId())), KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
for (KylinOrderTicketEntitiesVo item : delList) {
redisUtil.hdel(KylinRedisConst.ORDER_ENTITIES, item.getOrderTicketEntitiesId());
}
// rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
// SqlMapping.get(sqls, paramsList));
// 发短信
return "success";
}
@Override
public PageInfo<List<KylinOrderListVo>> orderList(int page, int size) {
//TODO 缺快递
PageInfo<List<KylinOrderListVo>> mPageInfo = null;
String uid = CurrentUtil.getCurrentUid();
try {
// 排序 分页
Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
//条件
Query query = new Query();
query.addCriteria(
Criteria.where("userId").is(uid).and("status").ne(-1)
);
// 查询总数
long count = mongoTemplate.count(query, KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
query.with(pageable);
List<KylinOrderListVo> voList = mongoTemplate.find(query, KylinOrderListVo.class, KylinOrderTicketVo.class.getSimpleName());
mPageInfo = new PageInfo(voList);
mPageInfo.setTotal(count);
return mPageInfo;
} catch (Exception e) {
return mPageInfo;
}
}
@Override
public boolean checkOrderTime(String userId) {
Query query = new Query();
query.addCriteria(Criteria.where("status").is(0).and("overdueAt").lte(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
if (null != userId) {
query.addCriteria(Criteria.where("userId").is(userId));
}
List<KylinOrderTicketVo> orderTicketVo = mongoTemplate.find(query,
KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
for (KylinOrderTicketVo item : orderTicketVo) {
RLock lock = redisLockUtil.lock("order_lock:" + item.getOrderCode());
if (lock.isLocked()) {
continue;
}
KylinOrderTicketVo itemData = dataUtils.getOrderTicketVo(item.getOrderTicketsId());
if (itemData.getStatus() == 0) {
LocalDateTime now = LocalDateTime.now();
try {
//mysql
KylinOrderTickets orderTickets = new KylinOrderTickets();
orderTickets.setOrderTicketsId(item.getOrderTicketsId());
orderTickets.setUpdatedAt(now);
KylinOrderTicketStatus orderTicketStatus = new KylinOrderTicketStatus();
orderTicketStatus.setOrderId(item.getOrderTicketsId());
orderTicketStatus.setStatus(2);
orderTicketStatus.setUpdatedAt(now);
//vo
HashMap<String, Object> map = new HashMap<>();
map.put("status", 2);
map.put("updatedAt", now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderTickets.getOrderTicketsId())).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(map))
);
redisUtil.hdel(KylinRedisConst.ORDER, orderTickets.getOrderTicketsId());
dataUtils.changeSurplusGeneral(itemData.getTicketId(), itemData.getNumber());
// rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
// SqlMapping.get("kylin_order_ticket.close", itemData.getPayAgainObject()));
} catch (Exception e) {
lock.unlock();
e.printStackTrace();
return false;
}
} else {
lock.unlock();
}
}
return true;
}
public boolean checkAgent(String agentId, KylinTicketVo ticketData) {
boolean isAgent = ticketData.getIsAgent() == 1;
if (isAgent) {
return redisUtil.sHasKey(KylinRedisConst.AGENT, agentId);
} else {
return true;
}
}
} }
...@@ -239,11 +239,6 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma ...@@ -239,11 +239,6 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
performanceRelations.setRoadShowId(roadShowId); performanceRelations.setRoadShowId(roadShowId);
performanceRelationsMapper.update(performanceRelations, new UpdateWrapper<KylinPerformanceRelations>().eq("performance_id", performancesId)); performanceRelationsMapper.update(performanceRelations, new UpdateWrapper<KylinPerformanceRelations>().eq("performance_id", performancesId));
//redis TODO 演出缓存
// if(redisUtil.hHasKey(KylinRedisConst.PERFORMANCES,performancesId)){
// redisUtil.hset()
// }
//mongodb //mongodb
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();
map.put("roadShowId", roadShowId); map.put("roadShowId", roadShowId);
......
...@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; ...@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.JsonUtils; import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.kylin.constant.KylinRedisConst; import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.KylinPerformanceVo; import com.liquidnet.service.kylin.dto.vo.*;
import com.liquidnet.service.kylin.dto.vo.KylinTicketTimesVo;
import com.liquidnet.service.kylin.dto.vo.KylinTicketVo;
import com.liquidnet.service.kylin.entity.KylinBuyNotice; import com.liquidnet.service.kylin.entity.KylinBuyNotice;
import com.liquidnet.service.kylin.entity.KylinTicketTimes; import com.liquidnet.service.kylin.entity.KylinTicketTimes;
import com.liquidnet.service.kylin.mapper.KylinBuyNoticeMapper; import com.liquidnet.service.kylin.mapper.KylinBuyNoticeMapper;
...@@ -143,4 +141,32 @@ public class DataUtils { ...@@ -143,4 +141,32 @@ public class DataUtils {
} }
return (KylinTicketVo) redisUtil.hget(KylinRedisConst.TICKET,ticketId); return (KylinTicketVo) redisUtil.hget(KylinRedisConst.TICKET,ticketId);
} }
/**
* 根据订单id 获取 订单vo 详情
* @param orderId
* @return
*/
public KylinOrderTicketVo getOrderTicketVo(String orderId){
if(redisUtil.hHasKey(KylinRedisConst.ORDER,orderId)){
}else{
KylinOrderTicketVo ticketData = mongoTemplate.findOne(Query.query(Criteria.where("orderTicketsId").is(orderId)), KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
redisUtil.hset(KylinRedisConst.ORDER,orderId,ticketData);
}
return (KylinOrderTicketVo) redisUtil.hget(KylinRedisConst.ORDER,orderId);
}
/**
* 根据订单入场人id 获取 订单入场人vo 详情
* @param orderEntitiesId
* @return list
*/
public KylinOrderTicketEntitiesVo getOrderTicketEntitiesVo(String orderEntitiesId){
if(redisUtil.hHasKey(KylinRedisConst.ORDER_ENTITIES,orderEntitiesId)){
}else{
KylinOrderTicketEntitiesVo ticketData = mongoTemplate.findOne(Query.query(Criteria.where("orderTicketEntitiesId").is(orderEntitiesId)), KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
redisUtil.hset(KylinRedisConst.ORDER_ENTITIES,orderEntitiesId,ticketData);
}
return (KylinOrderTicketEntitiesVo) redisUtil.hget(KylinRedisConst.ORDER_ENTITIES,orderEntitiesId);
}
} }
kylin_order_ticket_entities.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=? kylin_order_ticket_entities.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ No newline at end of file kylin_order_ticket_entities.synPay=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ No newline at end of file
kylin_order_ticket_status.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=? kylin_order_ticket_status.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ No newline at end of file kylin_order_ticket_status.synPay=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
kylin_order_ticket_status.close=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ No newline at end of file
kylin_order_ticket.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=? kylin_order_ticket.add=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ No newline at end of file kylin_order_ticket.payAgain=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
kylin_order_ticket.synPay=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
kylin_order_ticket.close=UPDATE adam_enters SET `state`=2, updated_at=?, deleted_at=? where enters_id=?
\ 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