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

Commit c032b792 authored by 张禹's avatar 张禹

Merge branch 'pre' into 'master'

Pre

See merge request !272
parents 422271e1 bfea80d5
......@@ -342,4 +342,7 @@ public class GoblinRedisConst {
public static final String GOBLIN_ORDER_LOG = PREFIX.concat("order:log:");//无用
/* ----------------------------------------------------------------- */
public static final String GOBLIN_NUM_LIST = PREFIX.concat("nft:num:");//$key+":"+$skuId 根据skuId获取序号list
public static final String GOBLIN_NUM_DETAILS = PREFIX.concat("nft:num:details:");//$key+$num+$skuId 根据num+skuId获取DTO
}
......@@ -26,5 +26,6 @@ public interface IGoblinNftOrderService {
String refundSyncOrder(GoblinNftOrderRefundCallbackParam refundCallbackParam);
ResponseDto<Boolean> exchange(String code, String uid, String deviceFrom, int orderType);
ResponseDto<String> exchange(String code, String uid, String deviceFrom, int orderType);
}
......@@ -91,4 +91,8 @@ public class KylinRedisConst {
public static final String REDIS_WQ_ORDER_FIX = "kylin:wq:order:";//纪录万青 订单填写快递地址
public static final String REDIS_WQ_ORDER_EXPRESS = "kylin:wq:pxress:order:";//万青补偿快递vo 订单填写快递地址
public static final String ACTIVE_TICKET_AR_TICKET = "kylin:active:ar:ticket:";//互动券
public static final String ACTIVE_TICKET_AR_USER = "kylin:active:ar:user:";//互动券 绑定的用户
}
package com.liquidnet.service.kylin.dto.param;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.liquidnet.commons.lang.util.DateUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinAcitveParam implements Serializable {
private static final long serialVersionUID = 1L;
private Long mid;
/**
* 活动名称
*/
@ApiModelProperty(value = "活动名称")
private String activeName;
/**
* 券的数量
*/
@ApiModelProperty(value = "券的数量")
private Integer number;
/**
* activeId
*/
@ApiModelProperty(value = "activeId")
private String activeId;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern=DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
/**
* 0未删除1已删除
*/
@ApiModelProperty(value = "0未删除1已删除")
private Integer delTag;
/**
* 演出id
*/
@ApiModelProperty(value = "演出id")
private String performanceId;
}
package com.liquidnet.service.kylin.service;
import com.liquidnet.service.base.ResponseDto;
/**
* ar前端接口
*/
public interface IKylinArActiveService {
/**
* 兑换
* @param code
* @param uid
* @return
*/
ResponseDto exchange(String code, String uid);
}
package com.liquidnet.service.kylin.service.admin;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dao.KylinAcitve;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
public interface IKylinAcitveService extends IService<KylinAcitve> {
boolean addKylinAcitve(KylinAcitve kylinAcitve);
List<KylinAcitve> pageKylinAcitve(int pageSize, int pageNumber);
}
package com.liquidnet.service.kylin.service.admin;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import java.util.List;
/**
* <p>
* 跟活动绑定的券 服务类
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
public interface IKylinTicketActiveService extends IService<KylinTicketActive> {
List<KylinTicketActive> pageKylinAcitve(int pageSize, int pageNumber, String activeId);
}
......@@ -139,4 +139,9 @@ public enum BusinessType
* 修改
*/
PERFORMANCE_SAVE,
/**
* 内部操作
*/
INNER_OPERATION,
}
......@@ -19,6 +19,7 @@ public class LocalAdminController extends BaseController
private final String stonePrefix = "zhengzai/stone";
private final String storePrefix = "zhengzai/store";
private final String smilePrefix = "zhengzai/smile";
private final String activityPrefix = "zhengzai/sweet";
@Value("${liquidnet.client.admin.platformUrl}")
private String platformUrl;
......@@ -184,5 +185,20 @@ public class LocalAdminController extends BaseController
{
return storePrefix + "/homeSet/newRecommended";
}
@GetMapping("/performanceActivity") // 活动关联券部分
public String performanceActivity()
{
return activityPrefix + "/performanceActivity/activityList";
}
@GetMapping("/createActivityModal") // 创建活动
public String createActivityModal()
{
return activityPrefix + "/performanceActivity/createActivity";
}
@GetMapping("/activityTicketList") // 活动关联券部分
public String activityTicketList()
{
return activityPrefix + "/performanceActivity/ticketList";
}
}
package com.liquidnet.client.admin.web.controller.zhengzai.goblin;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.client.admin.common.annotation.Log;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.client.admin.zhengzai.goblin.utils.GoblinRedisUtils;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.candy.vo.CandyCouponVo;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyReqDto;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "商铺公共方法")
@Controller
@RequestMapping("goblin/gago")
public class GoblinGagoController extends BaseController {
@Autowired
RedisDataSourceUtil redisDataSourceUtil;
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Value("${liquidnet.service.order.url}")
private String orderUrl;
// private String orderUrl = "http://127.0.0.1:9004/order";
private final String prefix = "zhengzai/goblin/gago";
@GetMapping()
public String mainHtml() {
return prefix + "/gago";
}
@Log(title = "判断手机号是否开通数字账号", businessType = BusinessType.INNER_OPERATION)
@GetMapping("nftAccount")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, name = "userMobile", value = "手机号"),
})
@ResponseBody
public AjaxResult storeSearch(String userMobile) {
AjaxResult ajaxResult = AjaxResult.success();
Object obj1 = redisDataSourceUtil.getRedisAdamUtil().get(AdamRedisConst.IDENTITY_MOBILE.concat(userMobile));
if (obj1 == null) {
return AjaxResult.error("账号不存在");
}
String uid = (String) obj1;
Boolean obj2 = goblinRedisUtils.getIsOpenAccount(uid);
if (!obj2) {
return AjaxResult.error("账号未开通数字账号");
}
ajaxResult.put("uid", uid);
return ajaxResult;
}
@Log(title = "生成兑换订单", businessType = BusinessType.INNER_OPERATION)
@PostMapping(value = "/exchangeNumNftOrder")
@ResponseBody
public AjaxResult listByStatus(@RequestParam(value = "skuId") String skuId, @RequestParam(value = "nftNum") int nftNum, @RequestParam(value = "uid") String uid) {
//当前 nft序号
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
int cNufCount = goblinRedisUtils.getNftCountBySku(skuInfoVo.getRouteType(), skuId);
if (cNufCount >= nftNum) {
return AjaxResult.error("该序号已售卖");
}
if (skuInfoVo == null || skuInfoVo.getSkuStock() <= nftNum) {
return AjaxResult.error("该序号不存在");
}
if (skuInfoVo.getUnbox().equals("1")) {
return AjaxResult.error("不支持盲盒");
}
boolean addResult = goblinRedisUtils.addNftList(skuId, nftNum + "");
if (!addResult) {
return AjaxResult.error("该序号已被占用");
}
//
int count = goblinRedisUtils.decrSkuStock(null,skuId,1);
if(count<0){
goblinRedisUtils.incrSkuStock(null,skuId,1);
goblinRedisUtils.removeNftList(skuId, nftNum + "");
return AjaxResult.error("已售罄");
}
//下单
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("userId", uid);
params.add("skuId", skuId);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
System.out.println(orderUrl.concat("/goblin/nft/airdropInner"));
String returnData = HttpUtil.post(orderUrl.concat("/order/goblin/nft/airdropInner"), params, header);
ResponseDto<String> innerReturnVo = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<String>>() {
});
if (innerReturnVo.isSuccess()) {
GalaxyNftPublishAndBuyReqDto dto = GalaxyNftPublishAndBuyReqDto.getNew();
dto.setBuyTimestamp(DateUtil.getNowTime());
dto.setNftOrderPayId(innerReturnVo.getData());
dto.setSkuId(skuId);
dto.setUserId(uid);
goblinRedisUtils.setNftNumDetails(nftNum + "", skuId, dto);
return AjaxResult.success();
} else {
return AjaxResult.error();
}
}
/** ------------------------------------------------------------------------ **/
}
package com.liquidnet.client.admin.web.controller.zhengzai.kylin;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.utils.poi.ExcelUtil;
import com.liquidnet.client.admin.zhengzai.kylin.dto.ActiveTicketExportVo;
import com.liquidnet.client.admin.zhengzai.kylin.service.impl.KylinAcitveServiceImpl;
import com.liquidnet.client.admin.zhengzai.kylin.service.impl.KylinTicketActiveServiceImpl;
import com.liquidnet.service.kylin.dao.KylinAcitve;
import com.liquidnet.service.kylin.dto.param.KylinAcitveParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器 活动有关的
* </p>
* @author zhangfuxin
* @since 2022-07-12
*/
@Api(tags = "活动和券的接口")
@RestController
@RequestMapping("/kylin-acitve")
public class KylinAcitveController extends BaseController {
@Autowired
private KylinAcitveServiceImpl kylinAcitveService;
@Autowired
private KylinTicketActiveServiceImpl kylinTicketActiveService;
@PostMapping("add")
@ApiOperation(value = "增加活动")
@ResponseBody
public AjaxResult add(@RequestBody KylinAcitveParam kylinAcitveParam) {
KylinAcitve kylinAcitve=new KylinAcitve();
BeanUtils.copyProperties(kylinAcitveParam,kylinAcitve);
kylinAcitveService.addKylinAcitve(kylinAcitve);
return AjaxResult.success("操作成功", "");
}
@PostMapping("pageActive")
@ApiOperation(value = "分页活动")
@ResponseBody
public TableDataInfo pageActive( @RequestParam(name = "pageSize", required = true) int pageSize,@RequestParam(name = "pageNum", required = true)int pageNum) {
//return AjaxResult.success(kylinAcitveService.pageKylinAcitve(pageSize,pageNum));
return getDataTable( kylinAcitveService.pageKylinAcitve(pageSize,pageNum));
}
@PostMapping("pageActiveTicket")
@ApiOperation(value = "分页券")
@ResponseBody
public TableDataInfo pageActiveTicket(@RequestParam(name = "pageSize", required = true) int pageSize, @RequestParam(name = "pageNum", required = true)int pageNum, @RequestParam(name = "activeId", required = true)String activeId) {
//return AjaxResult.success(kylinTicketActiveService.pageKylinAcitve(pageSize,pageNum,activeId));
return getDataTable( kylinTicketActiveService.pageKylinAcitve(pageSize,pageNum,activeId));
}
@PostMapping("exportTicket")
@ApiOperation(value = "导出券")
@ResponseBody
public AjaxResult exportTicket( @RequestParam(name = "activeId", required = true)String activeId,@RequestParam(name = "activeName", required = true)String activeName) {
List<ActiveTicketExportVo> list= kylinTicketActiveService.exportTicket(activeId);
if(list.size()>0){
ExcelUtil<ActiveTicketExportVo> util = new ExcelUtil(ActiveTicketExportVo.class);
return util.exportExcel(list, activeName + "");
}
return error("查无信息!");
}
}
;(function ($) {
//这里放入插件代码
var RemoteSearchPerformance = function (element, options) {
this.$element = $(element);
this.options = $.extend(true, {}, $.fn.remoteSearchPerformance.defaults, options);
this.id = $(element).attr('id');
this.ulID = '#' + this.id + '_ul';
this.ulFoucus = false;
// Method overrides
this.render = this.options.render || this.render;
this.select = this.options.select || this.select;
this.ajax = $.extend({}, $.fn.remoteSearchPerformance.defaults.ajax, this.options.ajax);
this.listen();
}
RemoteSearchPerformance.prototype = {
listen: function () {
this.$element.on('blur', $.proxy(this.blur, this))
.on('keyup', $.proxy(this.keyup, this));
this.$element.parent('div.remote_wrapper').on('click',this.ulID, $.proxy(this.click, this));
},
blur: function (e) {
var that = this;
e.stopPropagation();
e.preventDefault();
setTimeout(function () {
if (!that.ulFoucus) {
that.$element.val(that.$element.attr('data-name'));
that.hide();
}
}, 150)
},
keyup: function (e) {
e.stopPropagation();
e.preventDefault();
switch (e.keyCode) {
case 40:
// down arrow
case 38:
// up arrow
break;
case 9:
// tab
case 13:
// enter
this.ajaxer();
case 27:
// escape
break;
default:
this.ajaxer();
}
},
hide: function () {
$(this.ulID).remove();
return this;
},
ajaxer: function () {
var that = this,
title = that.$element.val();
// Query changed
that.title = title;
// Cancel last timer if set
if (that.ajax.timerId) {
clearTimeout(that.ajax.timerId);
that.ajax.timerId = null;
}
// Query is good to send, set a timer
that.ajax.timerId = setTimeout(function() {
var params = { title : title };
var jAjax = (that.ajax.method === "post") ? $.post : $.get;
jAjax(that.ajax.url, params, function(data){
return that.render(data.data);
});
that.ajax.timerId = null;
}, that.ajax.timeout);
return that;
},
render: function (data) {
this.ulFoucus = false;
var liList = data || [];
var num = this._getNum();
//添加 ul
if($(this.ulID).length == 0) {
this.$element.after("<ul id='" + this.id + "_ul' class='remote_search remote_search_top'></ul>");
};
//添加li
var str = "";
if(num) {
if(liList.length) {
for(var i = 0; i < liList.length; i++) {
str += "<li data-id='"+liList[i].spuId+"' data-name='"+liList[i].spuName+"' title='"+liList[i].spuName+"' value='"+liList[i].spuId+"'>" + liList[i].spuName + "</li>";
}
} else {
str = "<li data-id='' data-name=''>搜索无数据</li>"
}
} else {
this.$element.attr('data-name',"");
this.$element.attr('data-id',"");
}
$(this.ulID).html(str);
var bodyHeight = $(document.body).height();
var offsetTop = this.$element.offset().top;
var height = $(this.ulID).outerHeight(true);
if(offsetTop + height > bodyHeight){
$(this.ulID).addClass('remote_search_bottom').removeClass('remote_search_top');
}else{
$(this.ulID).addClass('remote_search_top').removeClass('remote_search_bottom');
}
return this;
},
click: function (e) {
e.stopPropagation();
e.preventDefault();
var dataName = $(e.target).attr('data-name');
var dataID = $(e.target).attr('data-id');
this.$element.val(dataName);
this.$element.attr('data-name',dataName);
this.$element.attr('data-id',dataID);
this.options.chose(dataName,dataID);
this.ulFoucus = true;
return this.hide();
},
_getNum: function(){
return this.$element.val().length;
}
}
$.fn.remoteSearchPerformance = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('remoteSearchPerformance'),
options = typeof option === 'object' && option;
if (!data) {
$this.data('remoteSearchPerformance', (data = new RemoteSearchPerformance(this, options)));
}
if (typeof option === 'string') {
data[option]();
}
});
}
$.fn.remoteSearchPerformance.defaults = {
hiddenVal: '',
chose: function () { },
ajax: {
url: null,
timeout: 300,
method: 'get',
timerId: null
},
success: function(res){
}
}
$.fn.remoteSearchPerformance.Constructor = RemoteSearchPerformance;
})(jQuery);
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:include="include :: header('gago')"/>
</head>
<style>
td {
horiz-align: center;
text-align: left;
padding: 10px;
}
</style>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="userMobile-form">
<div class="form-group">
<label class="col-sm-3 control-label is-required">用户手机号码:</label>
<div class="col-sm-8">
<input type="number" id="userMobile" name="userMobile" class="form-control">
<input id="userId" name="userId" class="form-control" type="hidden" readonly>
</div>
<button type="button" class="btn btn-w-m btn-success" onclick="getMobileIsAudit()">
验证手机号
</button>
</div>
</form>
<form class="form-horizontal m" id="nft-form">
<div class="form-group">
<label class="col-sm-3 control-label is-required">数字藏品名称:</label>
<div class="col-sm-8">
<input id="skuId" name="skuId" th:value="*{skuId}" type="hidden">
<div class="remote_wrapper" style="position: relative;">
<input name="ids" type="hidden">
<input type="text" id="remoteSearch">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">生成序号:</label>
<div class="col-sm-8">
<input type="number" id="nftNum" name="nftNum" class="form-control">
</div>
</div>
</form>
<button type="button" class="btn btn-w-m btn-success" onclick="ce()">
生成订单
</button>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: bootstrap-suggest-js"/>
<script th:src="@{/js/remote-search-nft.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "goblin/gago";
function getMobileIsAudit() {
var mobile = $("#userMobile").val();
$("#userId").val('');
$.operate.get(prefix + "/nftAccount?userMobile=" + mobile, function (res) {
uid = res.uid;
$("#userId").val(uid);
});
}
$('#remoteSearch').remoteSearchPerformance({
ajax: {
url: "/goblin/common/sku?type=1",
type: "get"
},
chose: function (text, val) {
$("#skuId").val(val);
},
success: function () {
}
})
function ce() {
var skuId = $("#skuId").val();
var nftNum = $("#nftNum").val();
var uid = $("#userId").val();
if (uid == "" || nftNum == "" || uid == "") {
alert("请完整填写信息")
} else {
var param = {
skuId: skuId,
nftNum: nftNum,
uid: uid
};
$.operate.post(prefix + "/exchangeNumNftOrder", param, function (res) {
});
// alert("uid =" + uid + " skuId=" + skuId + " nftNum=" + nftNum)
}
}
</script>
</body>
</html>
......@@ -101,14 +101,14 @@
<table id="team-table_user" class="table table-condensed table-sm" th:border="1">
<tr>
<td>名称</td>
<td>介绍</td>
<!-- <td>介绍</td>-->
<tr/>
<div th:each="item : ${smileVolunteersDetailsVo.teamArray}">
<tr class="content-tr">
<td th:value="${item.name}" th:text="${item.name}">
</td>
<td th:text="${item.introduce}">
</td>
<!-- <td th:text="${item.introduce}">-->
<!-- </td>-->
</tr>
</div>
</table>
......@@ -118,15 +118,15 @@
<table id="team-table" class="table table-condensed table-sm" th:border="1">
<tr>
<td>名称</td>
<td>介绍</td>
<!-- <td>介绍</td>-->
<td>选中</td>
<tr/>
<div th:each="item : ${listData}">
<tr class="content-tr">
<td th:value="${item.name}" th:text="${item.name}">
</td>
<td th:text="${item.introduce}">
</td>
<!-- <td th:text="${item.introduce}">-->
<!-- </td>-->
<td>
<input name="teamCheck" type="radio" th:value="${item.teamId}"> 选中</label>
</td>
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('积分明细')" />
<style>
body .layui-layer-btn {
display: none !important;
}
</style>
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<!-- <div class="col-sm-12 search-collapse">
<form id="coupon-form">
<div class="select-list">
<ul>
<input type="hidden" name="couType" th:value="${couType}"/>
<li>
<input type="text" name="mobile" placeholder="请输入手机号码"/>
</li>
<li>
状态:
<select name="status" id="">
<option value="0">全部</option>
<option value="1">正常</option>
<option value="2">冻结</option>
</select>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div> -->
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-primary" onclick="exportSelected()" shiro:hasPermission="monitor:job:export">
创建活动
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer"/>
<script th:inline="javascript">
var prefix = ctx + "stone/logs";
var prefix2 = ctx + "local";
var couType = [[${couType}]];
$(function () {
var options = {
url: '/kylin-acitve/pageActive',
pagination: true,
modalName: "积分",
columns: [
{
field: 'activeName',
title: '活动名称'
},
{
field: 'number',
title: '券数量'
},
{
title: '操作',
// align: 'center',
formatter: function (value, row, index) {
let dataArr = [];
dataArr.push(`<span class="btn btn-warning btn-xs" href="javascript:void(0)" onclick="opendTicketList('${row.activeId}')"><i class="fa fa-search"></i>查看券列表</span>`)
return dataArr.join(' ')
}
}]
};
$.table.init(options);
});
function opendTicketList (id) {
console.log(id, '121212121212activityTicketList')
var url = prefix2+'/activityTicketList?id=' + id;
$.modal.openTab("活动券列表", url);
}
function openModal(uid, status, title) {
$.modal.confirm(title, function() {
let data = {
status,
uid
}
$.ajax({
type: 'put',
url: prefix + '/change/status',
data,
success:function(e) {
$("button[name=refresh]").click();
}
})
});
}
// 导出数据
function exportSelected() {
// console.log(userIds.toString(), 'dataParam')
$.modal.open('创建活动', prefix2 + "/createActivityModal", 500, 260, cancel)
}
function cancel () {
console.log('确定按钮?')
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('创建活动')" />
<th:block th:include="include :: bootstrap-fileinput-css" />
<style>
.create_activity_box {
padding: 20px;
}
.items {
/* border: 1px dashed #ccc; */
border-radius: 10px;
padding: 12px;
margin-bottom: 10px;
}
label {
width: 80px;
text-align: right;
}
input {
width: 200px;
height: 30px;
}
.footer_btn {
margin-top: 20px;
display: flex;
justify-content: center;
align-items: center;
}
select {
height: 30px;
width: 200px;
}
</style>
</head>
<body>
<div class="create_activity_box">
<div class="items">
<label><span style="color: red;">*</span> 活动名称:</label>
<input type="text" id="activityName" />
</div>
<!-- <div class="items">
关联演出:
<select name="tagType">
<option value="">全部</option>
<option>1</option>
<option>1</option>
<option>1</option>
<option>1</option>
</select>
</div> -->
<div class="items">
<label><span style="color: red;">*</span> 券数量:</label>
<input type="text" id="ticketNum" />
</div>
<div class="footer_btn">
<button type="button" class="btn btn-success" onclick="save()">保存</button>
</div>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: bootstrap-fileinput-js" />
<th:block th:include="include :: bootstrap-suggest-js" />
<script th:inline="javascript">
var prefix2 = ctx + "local";
var platformUrl = [[${platformUrl}]];
let count = 0;
let compilationsId = '';
let createTime = '';
let cubeId = '';
let mid = '';
let updateTime = '';
function save () {
let activityName = $("#activityName").val();
let ticketNum = $("#ticketNum").val();
if (!activityName || !ticketNum) {
layer.msg('请将表单填写完整!')
}
let data = {
"activeId": "",
"activeName": activityName,
"delTag": 0,
"mid": 0,
"number": ticketNum,
"performanceId": ""
}
promiseMethods('/kylin-acitve/add', 'post', JSON.stringify(data), 'application/json').then((res) => {
layer.msg("保存成功!")
$("#activityName").val('')
$("#ticketNum").val('')
$.operate.successCallback(res);
})
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('积分明细')" />
<style>
body .layui-layer-btn {
display: none !important;
}
</style>
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-warning" onclick="exportSelected()">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer"/>
<script th:inline="javascript">
var prefix = ctx + "stone/logs";
var prefix2 = ctx + "local";
var couType = [[${couType}]];
let id = ''
$(function () {
var options = {
url: '/kylin-acitve/pageActiveTicket',
pagination: true,
modalName: "积分",
queryParams: queryParams,
columns: [
{
field: 'code',
title: '券码'
},
{
field: 'state',
title: '券状态',
formatter: function (value, row) {
if (value == 1) {
return '未兑换'
} else if (value == 2) {
return '已兑换'
} else {
return '已失效'
}
}
},
{
field: 'redeemAt',
title: '使用时间'
}]
};
$.table.init(options);
});
function queryParams(params) {
let name = 'id';
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
id = unescape(r[2]);
var search = $.table.queryParams(params);
search.activeId = id;
return search;
}
function opendTicketList (id) {
var url = prefix2+'activityTicketList?id=' + id;
$.modal.openTab("活动券列表", url);
}
// 导出数据
function exportSelected() {
$.ajax({
type: 'post',
url: '/kylin-acitve/exportTicket',
data: {activeId: id, activeName: 'dasdas'},
success: function (res) {
console.log(res, '????')
window.location.href = ctx + "common/download?fileName=" + encodeURI(res.msg) + "&delete=" + true;
}
})
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -151,6 +151,11 @@
<artifactId>liquidnet-service-goblin-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-galaxy-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-smile-do</artifactId>
......
package com.liquidnet.client.admin.zhengzai.goblin.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.goblin.service.IGoblinFrontSelectGoodsService;
import com.liquidnet.service.goblin.entity.GoblinFrontSelectGoods;
import com.liquidnet.service.goblin.mapper.GoblinFrontSelectGoodsMapper;
public class GoblinGageServiceImpl extends ServiceImpl<GoblinFrontSelectGoodsMapper, GoblinFrontSelectGoods> implements IGoblinFrontSelectGoodsService {
}
package com.liquidnet.client.admin.zhengzai.goblin.utils;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.galaxy.constant.GalaxyConstant;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyReqDto;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinMarketingZhengzaiRelationVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSelfMarketingVo;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.constant.NftAccStatusEnum;
import com.liquidnet.service.goblin.dto.GoblinUserNftAccInfoVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinGoodsSku;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Component
......@@ -131,4 +139,99 @@ public class GoblinRedisUtils {
redisDataSourceUtil.getRedisGoblinUtil().set(redisKey, list);
}
//是否开通数字账号
public Boolean getIsOpenAccount(String userId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_NUM_ACCOUNT_INFO.concat(userId);
Object obj = redisDataSourceUtil.getRedisGoblinUtil().get(redisKey);
GoblinUserNftAccInfoVo openAccountInfo;
if (obj == null) {
openAccountInfo = null;
} else {
openAccountInfo = (GoblinUserNftAccInfoVo) obj;
}
// 认证验证
if (null == openAccountInfo || !NftAccStatusEnum.StatusAcc.SUCCESS.getCode().equals(openAccountInfo.getCode())) {
return false;
} else {
return true;
}
}
//获取 当前xx链上SkuId 发行的数量
public int getNftCountBySku(String routerType, String skuId) {
String redisKey = GalaxyConstant.REDIS_KEY_GALAXY_PUBLISH_NFT.concat(routerType).concat(":").concat(skuId);
Object obj = redisDataSourceUtil.getRedisGoblinUtil().get(redisKey);
if (obj == null) {
return -1;
} else {
return (int) obj;
}
}
//获取 nft序号站位list
public List<String> getNftList(String skuId) {
String redisKey = GoblinRedisConst.GOBLIN_NUM_LIST.concat(skuId);
Object obj = redisDataSourceUtil.getRedisGoblinUtil().get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
//添加 nft序号站位list
public boolean addNftList(String skuId, String num) {
String redisKey = GoblinRedisConst.GOBLIN_NUM_LIST.concat(skuId);
List<String> voList = getNftList(skuId);
if (voList.contains(num)) {
return false;
}
voList.add(num);
redisDataSourceUtil.getRedisGoblinUtil().set(redisKey, voList);
return true;
}
//删除 nft序号站位list
public boolean removeNftList(String skuId, String num) {
String redisKey = GoblinRedisConst.GOBLIN_NUM_LIST.concat(skuId);
List<String> voList = getNftList(skuId);
voList.remove(num);
redisDataSourceUtil.getRedisGoblinUtil().set(redisKey, voList);
return true;
}
public GoblinGoodsSkuInfoVo getGoodsSkuInfoVo(String skuId) {
String rk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId);
GoblinGoodsSkuInfoVo vo = (GoblinGoodsSkuInfoVo) redisDataSourceUtil.getRedisGoblinUtil().get(rk);
if (null == vo) {
return null;
}
return vo;
}
//覆盖 站位宾哥要dto
public void setNftNumDetails(String num, String skuId, GalaxyNftPublishAndBuyReqDto dto) {
String redisKey = GoblinRedisConst.GOBLIN_NUM_DETAILS.concat(num).concat(skuId);
redisDataSourceUtil.getRedisGoblinUtil().set(redisKey, dto);
}
//减少库存
public int decrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":");
}
rk = rk.concat(skuId);
return (int) redisDataSourceUtil.getRedisGoblinUtil().decr(rk, stock);
}
//增加库存
public int incrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":");
}
rk = rk.concat(skuId);
return (int) redisDataSourceUtil.getRedisGoblinUtil().incr(rk, stock);
}
}
package com.liquidnet.client.admin.zhengzai.kylin.dto;
import com.liquidnet.client.admin.common.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
@Data
public class ActiveTicketExportVo implements Serializable, Cloneable {
@Excel(name = "券码", cellType = Excel.ColumnType.STRING)
private String code;
/**
* 兑换码状态 1未兑换 2已兑换 3已失效
*/
@Excel(name = "兑换码状态", cellType = Excel.ColumnType.STRING)
private String state;
/**
* 兑换用户id
*/
@Excel(name = "兑换用户id", cellType = Excel.ColumnType.STRING)
private String redeemUid;
private static final ActiveTicketExportVo obj = new ActiveTicketExportVo();
public static ActiveTicketExportVo getNew() {
try {
return (ActiveTicketExportVo) obj.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new ActiveTicketExportVo();
}
}
package com.liquidnet.client.admin.zhengzai.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dao.KylinAcitve;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.mapper.KylinAcitveMapper;
import com.liquidnet.service.kylin.mapper.KylinTicketActiveMapper;
import com.liquidnet.service.kylin.service.admin.IKylinTicketActiveService;
import com.liquidnet.service.kylin.service.admin.IKylinAcitveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
@Service
public class KylinAcitveServiceImpl extends ServiceImpl<KylinAcitveMapper, KylinAcitve> implements IKylinAcitveService {
@Autowired
private KylinAcitveMapper kylinAcitveMapper;
@Autowired
private KylinTicketActiveMapper kylinTicketActiveMapper;
@Autowired
private IKylinTicketActiveService iKylinTicketActiveService;
@Autowired
RedisDataSourceUtil redisDataSourceUtil;
@Override
@Transactional
public boolean addKylinAcitve(KylinAcitve kylinAcitve) {
kylinAcitve.setActiveId(IDGenerator.nextSnowId());
kylinAcitve.setCreatedAt(LocalDateTime.now());
kylinAcitve.setUpdatedAt(LocalDateTime.now());
kylinAcitve.setDelTag(0);
//保存活动
kylinAcitveMapper.insert(kylinAcitve);
//创建券
iKylinTicketActiveService.saveBatch(getKylinTicketActive(kylinAcitve.getNumber(),kylinAcitve.getActiveId()));
return true;
}
@Override
public List<KylinAcitve> pageKylinAcitve(int pageSize, int pageNumber) {
PageHelper.startPage(pageNumber, pageSize);
LambdaQueryWrapper<KylinAcitve> queryWrapper = Wrappers.lambdaQuery(KylinAcitve.class);
List<KylinAcitve> list=kylinAcitveMapper.selectList(queryWrapper);
return list;
}
public List<KylinTicketActive> getKylinTicketActive(int number,String activeId){
List<KylinTicketActive> list = new ArrayList<>();
if(number>0){
for(int i=0;i<number;i++){
KylinTicketActive kylinTicketActive=new KylinTicketActive();
kylinTicketActive.setTicketId(IDGenerator.nextSnowId());
kylinTicketActive.setActivityId(activeId);
kylinTicketActive.setCode(IDGenerator.createCodeAz(3, 4, true));
kylinTicketActive.setState(1);
kylinTicketActive.setCreatedAt(LocalDateTime.now());
kylinTicketActive.setUpdatedAt(LocalDateTime.now());
kylinTicketActive.setDelTag(0);
list.add(kylinTicketActive);
//redis 存
redisDataSourceUtil.getRedisKylinUtil().set(KylinRedisConst.ACTIVE_TICKET_AR_TICKET+kylinTicketActive.getCode(),kylinTicketActive);
}
return list;
}
return null;
}
}
package com.liquidnet.client.admin.zhengzai.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.liquidnet.client.admin.zhengzai.kylin.dto.ActiveTicketExportVo;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.mapper.KylinTicketActiveMapper;
import com.liquidnet.service.kylin.service.admin.IKylinTicketActiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 跟活动绑定的券 服务实现类
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
@Service
public class KylinTicketActiveServiceImpl extends ServiceImpl<KylinTicketActiveMapper, KylinTicketActive> implements IKylinTicketActiveService {
@Autowired
private KylinTicketActiveMapper kylinTicketActiveMapper;
@Override
public List<KylinTicketActive> pageKylinAcitve(int pageSize, int pageNumber, String activeId) {
PageHelper.startPage(pageNumber, pageSize);
LambdaQueryWrapper<KylinTicketActive> queryWrapper = Wrappers.lambdaQuery(KylinTicketActive.class);
queryWrapper.eq(KylinTicketActive::getActivityId,activeId);
List<KylinTicketActive> list=kylinTicketActiveMapper.selectList(queryWrapper);
return list;
}
public List<ActiveTicketExportVo> exportTicket(String activeId) {
LambdaQueryWrapper<KylinTicketActive> queryWrapper = Wrappers.lambdaQuery(KylinTicketActive.class);
queryWrapper.eq(KylinTicketActive::getActivityId,activeId);
List<KylinTicketActive> list=kylinTicketActiveMapper.selectList(queryWrapper);
List<ActiveTicketExportVo> voList = new ArrayList();
for (KylinTicketActive item : list) {
ActiveTicketExportVo activeTicketExportVo=ActiveTicketExportVo.getNew();
activeTicketExportVo.setCode(item.getCode());
activeTicketExportVo.setRedeemUid(item.getRedeemUid()==null?"":item.getRedeemUid());
if(item.getState()==1){
activeTicketExportVo.setState("未兑换");
}else if(item.getState()==2){
activeTicketExportVo.setState("已兑换");
}else{
activeTicketExportVo.setState("已失效");
}
voList.add(activeTicketExportVo);
}
return voList;
}
}
......@@ -180,4 +180,30 @@ public class IDGenerator {
return str.toString()+"CH";
}
/**
*创建互动兑换券的code
*/
public static String createCodeAz(int num,int sec,boolean bol) {
StringBuffer str = new StringBuffer();
for (int k=0;k<num;k++) {
for(int i=0;i < sec;i++){
int intVal=(int)(Math.random()*58+65);
if(intVal >= 91 && intVal <= 122){
i--;
}
if(intVal < 91 || intVal > 122){
if(intVal%2==0){
str.append((char)intVal);
}else{
str.append((int)(Math.random()*10));
}
}
}
if(bol){
str.append("-");
}
}
return str.toString()+"AZ";
}
}
......@@ -108,6 +108,7 @@ global-auth:
- ${liquidnet.info.context}/goblin/nft/refundSyncOrder
- ${liquidnet.info.context}/goblin/nft/airdrop
- ${liquidnet.info.context}/mix/syncOrder
- ${liquidnet.info.context}/goblin/nft/airdropInner
# -----------------------------------------------------------
# -----------------------------------------------------------
......
package com.liquidnet.service.kylin.dao;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinAcitve implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 活动名称
*/
@TableField("activeName")
private String activeName;
/**
* 券的数量
*/
private Integer number;
/**
* activeId
*/
private String activeId;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
/**
* 0未删除1已删除
*/
private Integer delTag;
/**
* 演出id
*/
private String performanceId;
}
package com.liquidnet.service.kylin.dao;
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 liquidnet
* @since 2022-07-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinTicketActive implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 票id
*/
private String ticketId;
/**
* 兑换码
*/
private String code;
/**
* 兑换码状态 1未兑换 2已兑换 3已失效
*/
private Integer state;
/**
* 兑换用户id
*/
private String redeemUid;
/**
* 兑换时间
*/
private LocalDateTime redeemAt;
/**
* 活动id
*/
private String activityId;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
/**
* 0未删除1已删除
*/
private Integer delTag;
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.dao.KylinAcitve;
/**
* <p>
* Mapper 接口
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
public interface KylinAcitveMapper extends BaseMapper<KylinAcitve> {
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
/**
* <p>
* 跟活动绑定的券 Mapper 接口
* </p>
*
* @author liquidnet
* @since 2022-07-12
*/
public interface KylinTicketActiveMapper extends BaseMapper<KylinTicketActive> {
}
package com.liquidnet.service.galaxy.biz;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.galaxy.dto.bo.GalaxyNftOrderBindBo;
import com.liquidnet.service.galaxy.dto.bo.GalaxySeriesNftInfoBo;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyReqDto;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyRespDto;
import com.liquidnet.service.galaxy.router.zxin.biz.ZxinTradeCommonBiz;
import com.liquidnet.service.galaxy.utils.GalaxyDataUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: GalaxyTradeBiz
* @Package com.liquidnet.service.galaxy.biz
* @Copyright: LightNet @ Copyright (c) 2022
* @date 2022/7/11 15:47
*/
@Slf4j
@Component
public class GalaxyTradeBiz {
@Autowired
private GalaxyDataUtils dataUtils;
@Autowired
private ZxinTradeCommonBiz zxinTradeCommonBiz;
/**
* 根据skuid和nftIndex判断是否切换nft购买订单
* @param skuid
* @param nftIndex
*/
public boolean isNeedSwitch(String skuid,String nftIndex){
List numsList = dataUtils.getGoblinNumList(skuid);
if(StringUtil.isNotEmpty(numsList)){
if(numsList.contains(nftIndex)){
return true;
}
}
return false;
}
/**
* 根据skuid和nftIndex判断是否切换nft购买订单
* @param skuid
* @param nftIndex
*/
public void switchBuyRouterBySkuId(String skuid, String nftIndex, GalaxySeriesNftInfoBo seriesNftInfoBo){
GalaxyNftPublishAndBuyReqDto reqDto = dataUtils.getGoblinNumDetails(skuid,nftIndex);
//设置绑定信息
GalaxyNftOrderBindBo nftOrderBindBo = GalaxyNftOrderBindBo.getNew();
nftOrderBindBo.setNftOrderPayId(reqDto.getNftOrderPayId());
nftOrderBindBo.setSeriesId(seriesNftInfoBo.getSeriesId());
nftOrderBindBo.setSeriesCode(seriesNftInfoBo.getSeriesCode());
nftOrderBindBo.setNftIdIndex(Integer.valueOf(nftIndex));
nftOrderBindBo.setRouterType(reqDto.getRouterType());
String nowTimeStr = DateUtil.Formatter.yyyyMMddHHmmss.format(LocalDateTime.now());
nftOrderBindBo.setCreatedAt(nowTimeStr);
dataUtils.setGalaxyNftOrderBindBo(reqDto.getRouterType(),reqDto.getNftOrderPayId(),nftOrderBindBo);
//执行nft购买订单切换
log.info("开始执行nft购买订单切换===>>>>> reqParam:{}", JsonUtils.toJson(reqDto));
ResponseDto<GalaxyNftPublishAndBuyRespDto> responseDto = zxinTradeCommonBiz.nftPublishAndBuy(reqDto);
log.info("执行nft购买订单切换结果===>>>>> response:{}",JsonUtils.toJson(responseDto));
}
}
......@@ -9,6 +9,7 @@ import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.galaxy.biz.GalaxyBeanTransferBiz;
import com.liquidnet.service.galaxy.biz.GalaxyEnumBiz;
import com.liquidnet.service.galaxy.biz.GalaxyTradeBiz;
import com.liquidnet.service.galaxy.constant.GalaxyEnum;
import com.liquidnet.service.galaxy.constant.GalaxyErrorEnum;
import com.liquidnet.service.galaxy.dto.bo.GalaxyNftOrderBindBo;
......@@ -29,6 +30,8 @@ import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
......@@ -57,6 +60,11 @@ public class ZxinTradeCommonBiz {
@Autowired
private GalaxyBeanTransferBiz galaxyBeanTransferBiz;
@Autowired
private GalaxyTradeBiz galaxyTradeBiz;
private ExecutorService executorService = Executors.newFixedThreadPool(10);
public ResponseDto<GalaxyNftPublishAndBuyRespDto> nftPublishAndBuy(GalaxyNftPublishAndBuyReqDto reqDto) {
log.info("开始执行nftPublishAndBuy 请求参数:{}",reqDto.toString());
//获取用户信息
......@@ -141,6 +149,17 @@ public class ZxinTradeCommonBiz {
//发行失败
throw new GalaxyNftPublishException(GalaxyErrorEnum.NFT_PUBLISH_ERROR.getCode(),"该sku:"+reqDto.getSkuId()+" 总共"+seriesNftInfoBo.getNftTotalCount()+"个NFT已经发行完毕,没有剩余库存!");
}
//判断是否切换订单
while(galaxyTradeBiz.isNeedSwitch(reqDto.getSkuId(),String.valueOf(nftIdNo))){
long finalNftIdNo = nftIdNo;
//开启新线程去执行购买
executorService.submit(() -> {
galaxyTradeBiz.switchBuyRouterBySkuId(reqDto.getSkuId(),String.valueOf(finalNftIdNo),seriesNftInfoBo);
});
nftIdNo = dataUtils.incrNftIdNo(reqDto.getRouterType(),reqDto.getSkuId());
}
nftOrderBindBo = GalaxyNftOrderBindBo.getNew();
nftOrderBindBo.setNftOrderPayId(reqDto.getNftOrderPayId());
nftOrderBindBo.setSeriesId(seriesNftInfoBo.getSeriesId());
......
package com.liquidnet.service.galaxy.utils;
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.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
......@@ -8,13 +9,16 @@ import com.liquidnet.service.galaxy.biz.GalaxyBeanTransferBiz;
import com.liquidnet.service.galaxy.constant.GalaxyConstant;
import com.liquidnet.service.galaxy.constant.GalaxyEnum;
import com.liquidnet.service.galaxy.dto.bo.*;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyReqDto;
import com.liquidnet.service.galaxy.dto.vo.mongo.GalaxyNftOrderFailLogVo;
import com.liquidnet.service.galaxy.dto.vo.mongo.GalaxyNftTradeVo;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
* 该类为redis+mysql
......@@ -478,4 +482,26 @@ public abstract class AbstractDataUtils {
return null;
}
}
//获取sku对应预留号码list
public List<String> getGoblinNumList(String skuId){
String redisKey = GoblinRedisConst.GOBLIN_NUM_LIST.concat(skuId);
Object obj = this.getRedisUtil().get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) obj;
}
}
//$key+$num+$skuId 根据num+skuId获取DTO
public GalaxyNftPublishAndBuyReqDto getGoblinNumDetails(String skuId, String nftIndex){
String redisKey = GoblinRedisConst.GOBLIN_NUM_DETAILS.concat(nftIndex).concat(skuId);
Object obj = this.getRedisUtil().get(redisKey);
if(obj!=null){
return (GalaxyNftPublishAndBuyReqDto)obj;
}
return null;
}
}
......@@ -140,15 +140,30 @@ public class GoblinCouponController {
if (!CollectionUtils.isEmpty(userCouponVos)) {
List<GoblinUserCouponVo> userCouponVoList = userCouponVos.stream().filter(vo -> vo.getStoreCouponId().equals(storeCouponId)).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(userCouponVoList) && userCouponVoList.size() >= storeCouponVo.getReceiveLimit()) {
// 用户已领取该券且领取数量已达上限时,根据已领取券的状态判断返回(如果已使用提示用,未使用则正常返回)
Optional<GoblinUserCouponVo> userCouponVoOptional = userCouponVoList.stream().filter(vo -> vo.getState().equals(1)).findAny();
return userCouponVoOptional.map(ResponseDto::success).orElseGet(() -> ResponseDto.failure(ErrorMapping.get("140054")));
// return userCouponVoOptional.map(ResponseDto::success).orElseGet(() -> ResponseDto.failure(ErrorMapping.get("140054")));
if (userCouponVoOptional.isPresent()) {
GoblinUserCouponVo userCouponVo = userCouponVoOptional.get();
if (StringUtils.equals("1", userCouponVo.getUseScope())) {
userCouponVo.setSpuIds(goblinRedisUtils.getStoreCouponSpuIds(storeCouponId));
}
return ResponseDto.success(userCouponVo);
} else {
return ResponseDto.failure(ErrorMapping.get("140054"));
}
}
}
if (storeCouponVo.getStock().equals(0) || goblinRedisUtils.getStoreCouponStock(storeCouponId) > 0) {
if (goblinCouponService.receiveCoupon(uid, userCouponVos, storeCouponVo)) {
List<GoblinUserCouponVo> userCouponVoList = userCouponVos.stream()
.filter(vo -> vo.getStoreCouponId().equals(storeCouponId) && vo.getState().equals(1)).collect(Collectors.toList());
return ResponseDto.success(userCouponVoList.get(0));
// return ResponseDto.success(userCouponVoList.get(0));
GoblinUserCouponVo userCouponVo = userCouponVoList.get(0);
if (StringUtils.equals("1", userCouponVo.getUseScope())) {
userCouponVo.setSpuIds(goblinRedisUtils.getStoreCouponSpuIds(storeCouponId));
}
return ResponseDto.success(userCouponVo);
}
return ResponseDto.failure(ErrorMapping.get("140053"));
}
......
......@@ -469,7 +469,7 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
List<String> listStore = mongoUtils.getStoreInfoVoRegexName(name);
Pattern pattern = Pattern.compile("^.*" + name + ".*$", Pattern.CASE_INSENSITIVE);
Query query = new Query();
query.addCriteria(Criteria.where("spuAppear").is("0").and("delFlg").is("0").and("shelvesStatus").is("3").and("marketId").is(null).andOperator(
query.addCriteria(Criteria.where("spuAppear").is("0").and("delFlg").is("0").and("shelvesStatus").is("3").and("marketId").is(null).and("cateFid").nin("22196120924543","22196122839313").andOperator(
new Criteria().orOperator(
Criteria.where("name").regex(pattern),
Criteria.where("storeId").in(listStore),
......@@ -530,7 +530,7 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
}
//
Query query = new Query();
query.addCriteria(Criteria.where("storeId").is(storeId).and("spuAppear").is("0").and("delFlg").is("0").and("shelvesStatus").is("3").and("marketId").is(null));
query.addCriteria(Criteria.where("storeId").is(storeId).and("spuAppear").is("0").and("delFlg").is("0").and("shelvesStatus").is("3").and("marketId").is(null).and("cateFid").nin("22196120924543","22196122839313"));
if (StringUtil.isNotBlank(categoryId)) {
query.addCriteria(new Criteria().orOperator(
Criteria.where("storeCateFid").is(categoryId),
......@@ -857,6 +857,9 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
for (String id : spuids) {
GoblinGoodsInfoVo goblinGoodsInfoVo = goblinRedisUtils.getGoodsInfoVo(id);
if (null != goblinGoodsInfoVo) {
if(isHidden(goblinGoodsInfoVo.getCateFid())){
continue;
}
goblinGoodsInfoVoArrayList.add(goblinGoodsInfoVo);
}
}
......@@ -909,6 +912,9 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
for (int i = 0; i < end; i++) {
if (i >= start) {
GoblinGoodsInfoVo goblinGoodsInfoVo = goblinRedisUtils.getGoodsInfoVo(spuidss[i]);
if(isHidden(goblinGoodsInfoVo.getCateFid())){
continue;
}
goblinGoodsInfoVoArrayList.add(goblinGoodsInfoVo);
}
}
......@@ -1418,4 +1424,13 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
}
private boolean isHidden(String fcateId){
ArrayList<String> hiddenIds = CollectionUtil.arrayListString();
hiddenIds.add("22196120924543");
hiddenIds.add("22196122839313");
if(hiddenIds.contains(fcateId)){
return true;
}
return false;
}
}
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.galaxy.dto.param.GalaxyNftPublishAndBuyReqDto;
import com.liquidnet.service.galaxy.utils.GalaxyDataUtils;
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.util.List;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: TestRedisUtil
* @Package com.liquidnet.service.goblin.test
* @Copyright: LightNet @ Copyright (c) 2022
* @date 2022/7/12 12:02
*/
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TestRedisUtil {
@Autowired
private GalaxyDataUtils dataUtils;
@Test
public void test() {
String skuId = "2212517482527828303";
List rsList = dataUtils.getGoblinNumList(skuId);
log.info("rs:{}",JsonUtils.toJson(rsList));
GalaxyNftPublishAndBuyReqDto reqDto = dataUtils.getGoblinNumDetails(skuId,String.valueOf(4));
log.info("reqDto:{}", JsonUtils.toJson(reqDto));
}
}
......@@ -1000,3 +1000,48 @@ CREATE TABLE `admin_upush`
) ENGINE = InnoDB
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci COMMENT '友盟消息推送';
DROP TABLE IF EXISTS `kylin_acitve`;
CREATE TABLE `kylin_acitve` (
`mid` bigint NOT NULL AUTO_INCREMENT,
`activeName` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活动名称',
`number` int DEFAULT NULL COMMENT '券的数量',
`active_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活动id',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
`del_tag` int DEFAULT NULL COMMENT '0未删除1已删除',
`performance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '演出id',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动表';
SET FOREIGN_KEY_CHECKS = 1;
DROP TABLE IF EXISTS `kylin_ticket_active`;
CREATE TABLE `kylin_ticket_active` (
`mid` bigint NOT NULL AUTO_INCREMENT,
`ticket_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '票id',
`code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '兑换码',
`state` tinyint DEFAULT NULL COMMENT '兑换码状态 1未兑换 2已兑换 3已失效',
`redeem_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '兑换用户id',
`redeem_at` datetime DEFAULT NULL COMMENT '兑换时间',
`activity_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活动id',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`del_tag` int DEFAULT NULL COMMENT '0未删除1已删除',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=1104 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='跟活动绑定的券';
SET FOREIGN_KEY_CHECKS = 1;
DROP TABLE IF EXISTS `kylin_acitve`;
CREATE TABLE `kylin_acitve` (
`mid` bigint NOT NULL AUTO_INCREMENT,
`activeName` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活动名称',
`number` int DEFAULT NULL COMMENT '券的数量',
`active_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '活动id',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
`del_tag` int DEFAULT NULL COMMENT '0未删除1已删除',
`performance_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '演出id',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动表';
SET FOREIGN_KEY_CHECKS = 1;
package com.liquidnet.service.kylin.controller;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.service.impl.KylinArActiveServiceImpl;
import com.liquidnet.service.kylin.utils.DataUtils;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* ar活动
* </p>
*
*/
@Api(tags = "ar活动有关接口")
@RestController
@RequestMapping("arActive")
@Slf4j
public class KylinArActiveController {
@Autowired
private KylinArActiveServiceImpl kylinArActiveService;
@Autowired
private DataUtils dataUtils;
@PostMapping("getUserStatus")
@ApiOperation("查看用户是否绑定(0没有绑定、1绑定了、2失效[目前失效没有用]")
public ResponseDto<String> getUserStatus() {
String uid = CurrentUtil.getCurrentUid();
if(null==dataUtils.getUserStatus(uid)){
return ResponseDto.success("0");
}else{
return ResponseDto.success(dataUtils.getUserStatus(uid));
}
}
@PostMapping("exchangeCode")
@ApiOperation("兑换码兑换")
public ResponseDto<String> exchangeCode(@RequestParam(value = "code")String code) {
String uid = CurrentUtil.getCurrentUid();
return kylinArActiveService.exchange(code.trim(),uid);
}
}
package com.liquidnet.service.kylin.service.impl;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.service.IKylinArActiveService;
import com.liquidnet.service.kylin.utils.DataUtils;
import com.liquidnet.service.kylin.utils.QueueUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* <p>
* 人流量检测记录表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2022-01-10
*/
@Service
public class KylinArActiveServiceImpl implements IKylinArActiveService {
@Autowired
private DataUtils dataUtils;
@Autowired
private QueueUtils queueUtils;
@Override
public ResponseDto exchange(String code, String uid) {
//1 查看是否有兑换码
KylinTicketActive kylinTicketActive=dataUtils.getArTicket(code);
if(null==kylinTicketActive){
return ResponseDto.failure("请输入正确的激活码");
}
//2、查看该用户是否绑定
if(null!=dataUtils.getUserStatus(uid)){
return ResponseDto.failure("该用户已激活");
}
//判断是否用过卷了
if(kylinTicketActive.getState()==2){
return ResponseDto.failure("该激活码已经兑换");
}
//开始绑定
//修改redis缓存
dataUtils.setUser(uid,"1");
kylinTicketActive.setState(2);
dataUtils.setArTicket(kylinTicketActive);
//队列 修改券的状态。
queueUtils.sendMsgByRedis(
MQConst.KylinQueue.SQL_PERFORMANCE_LACK.getKey(),
SqlMapping.get(
"kylin_ar_ticket.update",
new Object[]{
2,uid, LocalDateTime.now(),code
}
));
return ResponseDto.success();
}
}
......@@ -5,6 +5,7 @@ import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.dto.vo.KylinApiCameraDevicesVo;
import com.liquidnet.service.kylin.dto.vo.WqTempVo;
import com.liquidnet.service.kylin.dto.vo.admin.OrderRefundAddress;
......@@ -946,4 +947,22 @@ public class DataUtils {
}
}
// 获取用户状态
public String getUserStatus(String userId) {
return (String) redisUtil.get(KylinRedisConst.ACTIVE_TICKET_AR_USER+ userId);
}
//获得 ar券
public KylinTicketActive getArTicket(String code){
return (KylinTicketActive) redisUtil.get(KylinRedisConst.ACTIVE_TICKET_AR_TICKET+code);
}
//设置 tikcet
public void setArTicket(KylinTicketActive kylinTicketActive){
redisUtil.set(KylinRedisConst.ACTIVE_TICKET_AR_TICKET+kylinTicketActive.getCode(),kylinTicketActive);
}
//设置用户状态。
public void setUser(String userId,String value){
redisUtil.set(KylinRedisConst.ACTIVE_TICKET_AR_USER+userId,value);
}
}
......@@ -35,4 +35,6 @@ kylin_order_refund_entities.supplementEnter=UPDATE kylin_order_ticket_entities S
kylin_perform_sub.insert=INSERT INTO kylin_perform_sub (perform_sub_id,performance_id,user_id,user_name,user_mobile,source_type) VALUES (?,?,?,?,?,?)
# ------------------------ 万青弥补订单 ----------------------------
kylin_order_express_ex.insert = INSERT INTO kylin_order_express_ex (`order_id`,`express_contacts`,`express_address`,`province`,`city`,`county`,`express_phone`,`created_at`) VALUES (?,?,?,?,?,?,?,?)
kylin_order_express_ex.sendMail = UPDATE kylin_order_express_ex SET mail_no = ? , updated_at = ? where order_id = ?
\ No newline at end of file
kylin_order_express_ex.sendMail = UPDATE kylin_order_express_ex SET mail_no = ? , updated_at = ? where order_id = ?
# ------------------------ ar演出队列 ----------------------------
kylin_ar_ticket.update =update kylin_ticket_active set state=?,redeem_uid= ?,redeem_at= ? where `code`= ?
\ No newline at end of file
......@@ -28,7 +28,11 @@ import java.util.List;
public class TestDataUtil {
@Autowired
private DataUtils dataUtils;
@Test
public void test(){
System.out.println(dataUtils.getUserStatus("312"));
}
@Test
public void myPerformancesList(){
......
......@@ -82,7 +82,12 @@ public class GoblinNftOrderController {
@RequestParam("code") @NotBlank(message = "兑换码不能为空") String code,
@RequestParam("deviceFrom") @NotBlank(message = "支付终端不能为空") @Pattern(regexp = LnsRegex.Valid.TRIPLE_PF_FOR_PAY_TERMINAL, message = "支付终端类型无效") String deviceFrom
) {
return iGoblinNftOrderService.exchange(code, null, deviceFrom, 2);
ResponseDto<String> dto = iGoblinNftOrderService.exchange(code, null, deviceFrom, 2);
if (dto.isSuccess()) {
return ResponseDto.success();
} else {
return ResponseDto.failure(dto.getMessage());
}
}
}
......@@ -35,7 +35,25 @@ public class GoblinInnerNftController {
@RequestParam("userId") @NotBlank(message = "用户ID不能为空") String userId
) {
return iGoblinNftOrderService.exchange(code, userId, "systemAdmin", 4);
ResponseDto<String> dto = iGoblinNftOrderService.exchange(code, userId, "systemAdmin", 4);
if (dto.isSuccess()) {
return ResponseDto.success();
} else {
return ResponseDto.failure(dto.getMessage());
}
}
@PostMapping("airdropInner")
@ApiOperation("空投内")
@ApiImplicitParams({
@ApiImplicitParam(type = "from", required = true, dataType = "String", name = "skuId", value = "skuId", example = "0"),
@ApiImplicitParam(type = "from", required = true, dataType = "String", name = "userId", value = "用户ID", example = "1"),
})
public ResponseDto<String> exchangeInner(
@RequestParam("skuId") @NotBlank(message = "skuId不能为空") String skuId,
@RequestParam("userId") @NotBlank(message = "用户ID不能为空") String userId
) {
return iGoblinNftOrderService.exchange(skuId, userId, "systemAdmin", 5);
}
}
......@@ -12,6 +12,7 @@ import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.constant.NftAccStatusEnum;
import com.liquidnet.service.goblin.dto.GoblinUserNftAccInfoVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinGoodsSku;
import com.liquidnet.service.goblin.entity.GoblinNftOrder;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayCallbackParam;
......@@ -504,7 +505,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
orderVo.setCreatedAt(nftOrder.getCreatedAt());
// 待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getOrderId(), nftOrder.getCreatedAt(), "NFT",5);
queueUtils.sendMsgByRedisGoblinStock(orderVo.getOrderId(), nftOrder.getCreatedAt(), "NFT", 5);
// redis 订单详情
nftOrderUtils.setNftOrder(orderVo);
......@@ -813,8 +814,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return "success";
}
@Override
public ResponseDto<Boolean> exchange(String code, String uid, String deviceFrom, int orderType) {
public ResponseDto<String> exchange(String code, String uid, String deviceFrom, int orderType) {
if (null == uid) {
uid = CurrentUtil.getCurrentUid();
}
......@@ -828,34 +831,48 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return ResponseDto.failure("处理未完成,请稍等~");
} else {
try {
// 验证 1code是否存在 2是否未兑换的状态 3是否在生效日期内 4兑换限购
GoblinNftExCodeVo goblinNftExCodeVo = nftOrderUtils.getGoblinNftExCodeVo(code);
if (null == goblinNftExCodeVo || goblinNftExCodeVo.getState() != 1) {
return ResponseDto.failure("兑换码不正确或已失效");
}
LocalDateTime nowTime = LocalDateTime.now();
if (nowTime.isBefore(goblinNftExCodeVo.getExStartTime()) || nowTime.isAfter(goblinNftExCodeVo.getExStopTime())) {
return ResponseDto.failure("不在允许兑换时间内");
}
int buyCount = nftOrderUtils.incrExCountByUid(uid, goblinNftExCodeVo.getSkuId(), goblinNftExCodeVo.getActivityId(), 1);
if (null != goblinNftExCodeVo.getExLimit() && goblinNftExCodeVo.getExLimit() > 0) {
if (buyCount > goblinNftExCodeVo.getExLimit()) {
nftOrderUtils.decrExCountByUid(uid, goblinNftExCodeVo.getSkuId(), goblinNftExCodeVo.getActivityId(), 1);
return ResponseDto.failure("您已超出兑换限制数量~");
}
}
// 使用
goblinNftExCodeVo.setState(2);
goblinNftExCodeVo.setRedeemUid(uid);
goblinNftExCodeVo.setRedeemAt(nowTime);
goblinNftExCodeVo.setUpdatedAt(nowTime);
nftOrderUtils.setGoblinNftExCodeVo(goblinNftExCodeVo);
GoblinNftExCodeVo goblinNftExCodeVo = GoblinNftExCodeVo.getNew();
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_nft_ex_code.update"));
LinkedList<Object[]> sqlDataCode = CollectionUtil.linkedListObjectArr();
sqlDataCode.add(new Object[]{
2, uid, nowTime, nowTime, goblinNftExCodeVo.getCodeId()
});
if (5 == orderType) {
orderType = 4;
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(code);
goblinNftExCodeVo.setState(2);
goblinNftExCodeVo.setRedeemUid(uid);
goblinNftExCodeVo.setRedeemAt(nowTime);
goblinNftExCodeVo.setUpdatedAt(nowTime);
goblinNftExCodeVo.setSkuId(code);
goblinNftExCodeVo.setBoxSkuId("");
goblinNftExCodeVo.setSpuId(skuInfoVo.getSpuId());
goblinNftExCodeVo.setStoreId(skuInfoVo.getStoreId());
} else {
// 验证 1code是否存在 2是否未兑换的状态 3是否在生效日期内 4兑换限购
goblinNftExCodeVo = nftOrderUtils.getGoblinNftExCodeVo(code);
if (null == goblinNftExCodeVo || goblinNftExCodeVo.getState() != 1) {
return ResponseDto.failure("兑换码不正确或已失效");
}
if (nowTime.isBefore(goblinNftExCodeVo.getExStartTime()) || nowTime.isAfter(goblinNftExCodeVo.getExStopTime())) {
return ResponseDto.failure("不在允许兑换时间内");
}
int buyCount = nftOrderUtils.incrExCountByUid(uid, goblinNftExCodeVo.getSkuId(), goblinNftExCodeVo.getActivityId(), 1);
if (null != goblinNftExCodeVo.getExLimit() && goblinNftExCodeVo.getExLimit() > 0) {
if (buyCount > goblinNftExCodeVo.getExLimit()) {
nftOrderUtils.decrExCountByUid(uid, goblinNftExCodeVo.getSkuId(), goblinNftExCodeVo.getActivityId(), 1);
return ResponseDto.failure("您已超出兑换限制数量~");
}
}
// 使用
goblinNftExCodeVo.setState(2);
goblinNftExCodeVo.setRedeemUid(uid);
goblinNftExCodeVo.setRedeemAt(nowTime);
goblinNftExCodeVo.setUpdatedAt(nowTime);
nftOrderUtils.setGoblinNftExCodeVo(goblinNftExCodeVo);
sqlDataCode.add(new Object[]{
2, uid, nowTime, nowTime, goblinNftExCodeVo.getCodeId()
});
}
// 下单
GoblinNftOrderPayParam payParam = GoblinNftOrderPayParam.getNew();
payParam.setPayType("");
......@@ -898,14 +915,18 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 加积分
goblinOrderUtils.integral(uid, orderVo.getPriceActual(), "购买数字藏品", 1);
// 生产藏品列表
this.generateUserArtwork(orderVo, orderType == 4 ? 31 : 2);
if (code.equals(orderVo.getSkuId())) {
this.generateUserArtwork(orderVo, 5);
} else {
this.generateUserArtwork(orderVo, orderType == 4 ? 31 : 2);
}
// 增加销量
goblinRedisUtils.incrSkuSaleCount(orderVo.getSpuId(), orderVo.getSkuId(), orderVo.getNum());
// 写入用户订单列表 因取消的订单不展示 所以放在这里
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// TODO: jxl 2022/4/24 判断技术部NFT记录Redis setBuyNftTec
return ResponseDto.success();
return ResponseDto.success(orderVo.getOrderId());
} catch (Exception e) {
log.error("NFT兑换异常", e);
return ResponseDto.failure("兑换失败,请稍后重试!");
......@@ -940,7 +961,11 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
digitalArtworkVo.setUid(uid);
digitalArtworkVo.setOrderId(orderId);
digitalArtworkVo.setSource(source);
digitalArtworkVo.setState(source == 31 ? 5 : 0);
if (source == 5) {
digitalArtworkVo.setState(0);
} else {
digitalArtworkVo.setState(source == 31 ? 5 : 0);
}
digitalArtworkVo.setDelFlg("0");
digitalArtworkVo.setCreatedAt(now);
digitalArtworkVo.setAuthor(goodsInfoVo.getAuthor());
......@@ -963,7 +988,9 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
if ("0".equals(goodsSkuInfoVo.getUnbox())) {// 非盲盒,NFT发行购买
ObjectNode bizNftBuyNode = JsonUtils.OM().createObjectNode().put("nftOrderPayId", orderId).put("routerType", goodsSkuInfoVo.getRouteType())
.put("skuId", skuId).put("userId", uid).put("buyTimestamp", DateUtil.Formatter.yyyyMMddHHmmss.format(now));
queueUtils.sendMsgByRedis(MQConst.GalaxyQueue.JSON_NFT_PUBLISH_AND_BUY.getKey(), bizNftBuyNode.toString());
if (source != 5) {
queueUtils.sendMsgByRedis(MQConst.GalaxyQueue.JSON_NFT_PUBLISH_AND_BUY.getKey(), bizNftBuyNode.toString());
}
}
}
......
......@@ -447,6 +447,7 @@ public class MixOrderServiceImpl implements IMixOrderService {
for (GoblinNftOrder nftItem : nftOrder) {
orderMixStr = orderMixStr.concat(nftItem.getOrderId()).concat(",");
nftItem.setPayCode(payCode);
nftItem.setPayType(payType);
sqlDataOrder.add(new Object[]{
nftItem.getOrderId(), nftItem.getSpuId(), nftItem.getSkuId(), nftItem.getBoxSkuId(),
nftItem.getNum(), nftItem.getStoreId(), nftItem.getStoreName(), nftItem.getOrderCode(), nftItem.getUserId(), nftItem.getUserName(), nftItem.getUserMobile(), nftItem.getPriceTotal(), nftItem.getPriceCoupon(),
......@@ -481,6 +482,7 @@ public class MixOrderServiceImpl implements IMixOrderService {
}
GoblinStoreOrder storeOrder = preParam.getStoreOrder();
storeOrder.setPayCode(payCode);
storeOrder.setPayType(payType);
sqlDataGoblin.add(new Object[]{
storeOrder.getMasterOrderCode(), storeOrder.getOrderId(), storeOrder.getStoreId(), storeOrder.getStoreName(), storeOrder.getOrderCode(), storeOrder.getUserId(), storeOrder.getUserName(), storeOrder.getUserMobile(), storeOrder.getPriceTotal(), storeOrder.getPayCode(),
storeOrder.getPriceActual(), storeOrder.getPriceRefund(), storeOrder.getPriceExpress(), storeOrder.getPriceCoupon(), storeOrder.getStorePriceCoupon(), storeOrder.getPriceVoucher(), storeOrder.getStatus(), storeOrder.getUcouponId(), storeOrder.getStoreCouponId(), storeOrder.getPayType(), storeOrder.getDeviceFrom(),
......
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