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

Commit 49050729 authored by 胡佳晨's avatar 胡佳晨

提交 app 退款接口

parent cca0fb73
......@@ -22,6 +22,8 @@ public class KylinRedisConst {
public static final String TIMES = "kylin:times:id:";
public static final String AGENT = "kylin:agent:info";
public static final String ORDER_LIST = "kylin:order:list:userId:";
public static final String ORDER_REFUND_BY_ORDER_ID = "kylin:order:refund:orderId:";
public static final String ORDER_REFUND = "kylin:order:refund:orderRefundsId:";
public static final String USERID_BUY_INFO = "kylin:buy:userId:";
public static final String IDCARD_BUY_INFO = "kylin:buy:idCard:";
......
package com.liquidnet.service.kylin.dto.vo.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel
@Data
public class PerformanceRefundConfigVo {
private String performancesId;
private String title;
private Integer isCanRefund;
private String refundOpenTime;
private String refundCloseTime;
}
......@@ -13,7 +13,7 @@ public class KylinOrderRefundsVoBase {
private String orderRefundsId;
private String orderTicketsId;
private String orderRefundCode;
private String orderRefund_batchesId;
private String orderRefundBatchesId;
private String refundCode;
private String refundAt;
private String refundId;
......
......@@ -43,6 +43,9 @@ public class KylinOrderTicketEntitiesVo implements Serializable, Cloneable {
private String checkedAt;
private String checkUserId;
private BigDecimal priceActual;
private BigDecimal priceCanRefund;
private LocalDateTime changeDate;
private static final KylinOrderTicketEntitiesVo obj = new KylinOrderTicketEntitiesVo();
......
......@@ -99,6 +99,9 @@ public class KylinOrderTicketVo implements Serializable {
private String createdAt;
private String updatedAt;
// private Integer isCanRefund;
private Integer isHaveRefundDetails;
private LocalDateTime changeDate;
private Integer isTrueName;
......
......@@ -107,6 +107,11 @@ public class KylinPerformanceVo {
@ApiModelProperty(value = "分销人名称")
private String agentName;
private Integer isCanRefund;
private Integer isOpenRefundPresent;
private String refundOpenTime;
private String refundCloseTime;
public void setPerformance(KylinPerformances performance) {
this.mid = performance.getMid();
this.performancesId = performance.getPerformancesId();
......@@ -152,6 +157,10 @@ public class KylinPerformanceVo {
this.limitCountMember = performanceStatus.getLimitCountMember();
this.sysDamai = performanceStatus.getSyncDamai();
this.isShow=performanceStatus.getIsShow();
this.isCanRefund = performanceStatus.getIsCanRefund();
this.isOpenRefundPresent = performanceStatus.getIsOpenRefundPresent();
this.refundOpenTime = DateUtil.Formatter.yyyyMMddHHmmss.format(performanceStatus.getRefundOpenTime());
this.refundCloseTime = DateUtil.Formatter.yyyyMMddHHmmss.format(performanceStatus.getRefundCloseTime());
}
public void setPerformanceRelations(KylinPerformanceRelations performanceRelations) {
......
package com.liquidnet.service.kylin.dto.vo.returns;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderRefundEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderRefundPicVo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class KylinOrderRefundsOrderCodeVo {
private Integer mid;
private String orderRefundsId;
private String orderRefundCode;
private Integer status;
}
package com.liquidnet.service.kylin.dto.vo.returns;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderRefundsVoBase;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
......@@ -16,4 +17,6 @@ public class OrderDetailsVo {
private String express_company;
private Integer kuaidi_status;
private Long restTime;
private Integer isCanRefund;
private List<KylinOrderRefundsOrderCodeVo> orderRefundsVoList;
}
package com.liquidnet.service.kylin.dto.vo.returns;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderRefundsVoBase;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import lombok.Data;
import java.util.List;
@Data
public class OrderRefundVo {
private KylinOrderTicketVo orderTicketVo;
private KylinOrderRefundsVoBase kylinOrderRefundsVoBaseList;
}
package com.liquidnet.service.kylin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.kylin.entity.KylinOrderRefundPic;
/**
* <p>
* 订单退款图片 服务类
* </p>
*
* @author liquidnet
* @since 2021-05-06
*/
public interface IKylinOrderRefundPicService extends IService<KylinOrderRefundPic> {
}
......@@ -8,9 +8,11 @@ import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderRefundVo;
import com.liquidnet.service.kylin.dto.vo.returns.PayResultVo;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -43,12 +45,34 @@ public interface IKylinOrderTicketsService extends IService<KylinOrderTickets> {
//TASK 倒计时
boolean checkOrderTime(String userId);
//TASK 订单状态
//去 PHP pay检查 订单状态
ResponseDto<Integer> checkOrderResult(String orderId);
//TASK 订单状态
//订单未支付数量
ResponseDto<Integer> orderUnPayCount();
//想要退款详情
OrderDetailsVo toOrderRefundDetails(String orderId);
//退款详情
OrderRefundVo orderRefundDetails(String orderId,String orderRefundId);
/**
* 发起退款
* @param orderId 订单id
* @param orderTicketEntitiesId 票单id
* @param reason 退款原因
* @param picList 证据截图
* @return 是否成功
*/
ResponseDto<Boolean> sendOrderRefund(String orderId, String orderTicketEntitiesId, String reason, String picList);
//退款撤回
Boolean orderRefundWithdraw(String orderRefundsId);
//退款再次申请
Boolean orderRefundAgain(String orderRefundsId);
// 下单接口(无订单->待支付->可支付)
// 删除订单
......
......@@ -8,6 +8,7 @@ import com.liquidnet.service.kylin.dto.param.PerformanceMemberAuditParam;
import com.liquidnet.service.kylin.dto.param.SysDamaiParam;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceAgentVo;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceDamaiVo;
import com.liquidnet.service.kylin.dto.vo.admin.PerformanceRefundConfigVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.entity.KylinPerformances;
......@@ -170,6 +171,22 @@ public interface IKylinPerformancesAdminService extends IService<KylinPerformanc
*/
boolean changeSysDamai(List<SysDamaiParam> params);
/**
* 获取 演出退款配置
* @param performanceId
* @return
*/
PerformanceRefundConfigVo getRefundConfig(String performanceId);
/**
* 修改 演出退款配置
* @return
*/
boolean changeRefundConfig(String performancesId,
Integer isCanRefund,
String refundOpenTime,
String refundCloseTime);
KylinPerformanceAgentVo getPerformanceAgent(String performancesId);
KylinPerformanceDamaiVo getPerformanceDamai(String performancesId);
......
......@@ -17,6 +17,7 @@ import com.liquidnet.service.kylin.dto.param.PerformanceMemberAuditParam;
import com.liquidnet.service.kylin.dto.param.SysDamaiParam;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceAgentVo;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceDamaiVo;
import com.liquidnet.service.kylin.dto.vo.admin.PerformanceRefundConfigVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.service.admin.IKylinPerformancesAdminService;
import com.liquidnet.service.kylin.service.other.DamaiService;
......@@ -176,4 +177,23 @@ public class KylinPerformancesController extends BaseController {
boolean result = damaiService.sycPerformance(performancesId);
return toAjax(result);
}
@RequiresPermissions("kylin:performances:refundConfig")
@GetMapping(value = "/refundConfig/{performancesId}")
public String getRefundConfig(@PathVariable("performancesId") String performancesId, ModelMap mmap) {
PerformanceRefundConfigVo result = kylinPerformancesService.getRefundConfig(performancesId);
mmap.put("performanceRefundConfigVo", result);
return prefix + "/refundConfig";
}
@RequiresPermissions("kylin:performances:refundConfig")
@PostMapping(value = "/refundConfig/change")
@ResponseBody
public AjaxResult changeRefundConfig(@RequestParam("performancesId") String performancesId,
@RequestParam("isCanRefund") Integer isCanRefund,
@RequestParam("refundOpenTime") String refundOpenTime,
@RequestParam("refundCloseTime") String refundCloseTime) {
boolean result = kylinPerformancesService.changeRefundConfig(performancesId,isCanRefund,refundOpenTime,refundCloseTime);
return toAjax(result);
}
}
......@@ -20,7 +20,7 @@
<input type="text" class="form-control" id="datetimepicker-demo-1" placeholder="yyyy-MM-dd HH:mm">
</div>
</div>
<div class="form-group">
<label class="font-noraml">显示年月日</label>
<div class="input-group date">
......@@ -28,7 +28,7 @@
<input type="text" class="form-control" id="datetimepicker-demo-2" placeholder="yyyy-MM-dd">
</div>
</div>
<div class="form-group">
<label class="font-noraml">显示年月日时分秒</label>
<div class="input-group date">
......@@ -36,7 +36,7 @@
<input type="text" class="form-control" id="datetimepicker-demo-3" placeholder="yyyy-MM-dd HH:mm:ss">
</div>
</div>
<div class="form-group">
<label class="font-noraml">带清空的按钮</label>
<div class="input-group date form_date">
......@@ -45,7 +45,7 @@
<span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
</div>
</div>
<div class="form-group">
<label class="font-noraml">日期范围选择</label>
<div class="input-daterange input-group">
......@@ -75,7 +75,7 @@
<input type="text" class="form-control" id="laydate-demo-1" placeholder="yyyy-MM-dd">
</div>
</div>
<div class="form-group">
<label class="font-noraml">显示年月日</label>
<div class="input-group date">
......@@ -83,7 +83,7 @@
<input type="text" class="form-control" id="laydate-demo-2" placeholder="yyyy-MM-dd">
</div>
</div>
<div class="form-group">
<label class="font-noraml">显示年月日时分秒</label>
<div class="input-group date">
......@@ -91,7 +91,7 @@
<input type="text" class="form-control" id="laydate-demo-3" placeholder="yyyy-MM-dd HH:mm:ss">
</div>
</div>
<div class="form-group">
<label class="font-noraml">单框范围选择</label>
<div class="input-group date">
......@@ -99,7 +99,7 @@
<input type="text" class="form-control" id="laydate-demo-4" placeholder="yyyy-MM-dd - yyyy-MM-dd">
</div>
</div>
<div class="form-group">
<label class="font-noraml">日期范围选择</label>
<div class="input-daterange input-group">
......@@ -124,24 +124,24 @@
$(function(){
<!-- datetimepicker示例 -->
$("#datetimepicker-demo-1").datetimepicker();
$("#datetimepicker-demo-2").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("#datetimepicker-demo-3").datetimepicker({
format: "yyyy-mm-dd hh:ii:ss",
autoclose: true
});
$('.form_date').datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("#datetimepicker-startTime").datetimepicker({
format: 'yyyy-mm-dd',
minView: "month",
......@@ -154,7 +154,7 @@
var startTime = event.date;
$('#datetimepicker-endTime').datetimepicker('setStartDate', startTime);
});
$("#datetimepicker-endTime").datetimepicker({
format: 'yyyy-mm-dd',
minView: "month",
......@@ -167,31 +167,31 @@
var endTime = event.date;
$("#datetimepicker-startTime").datetimepicker('setEndDate', endTime);
});
<!-- laydate示例 -->
layui.use('laydate', function(){
var laydate = layui.laydate;
laydate.render({
elem: '#laydate-demo-1'
});
laydate.render({
laydate.render({
elem: '#laydate-demo-2',
type: 'date'
});
laydate.render({
laydate.render({
elem: '#laydate-demo-3',
type: 'datetime',
trigger: 'click'
});
laydate.render({
elem: '#laydate-demo-4',
range: true
});
var startDate = laydate.render({
elem: '#laydate-startTime',
max: $('#laydate-endTime').val(),
......@@ -210,7 +210,7 @@
}
}
});
var endDate = laydate.render({
elem: '#laydate-endTime',
min: $('#laydate-startTime').val(),
......
......@@ -19,10 +19,9 @@
</li>
<li class=""><a data-toggle="tab" href="#tab-2" aria-expanded="false">状态管理</a>
</li>
<li class=""><a data-toggle="tab" href="#tab-2" aria-expanded="false">库存预警</a>
<li class=""><a data-toggle="tab" href="#tab-6" aria-expanded="false" onclick="refundConfigInfo()">退款管理</a>
</li>
<li class=""><a data-toggle="tab" href="#tab-3" aria-expanded="false"
onclick="memberInfo()">会员信息配置</a>
<li class=""><a data-toggle="tab" href="#tab-3" aria-expanded="false" onclick="memberInfo()">会员信息配置</a>
</li>
<li class=""><a data-toggle="tab" href="#tab-4" aria-expanded="false" onclick="agentInfo()">代理配置</a>
</li>
......@@ -236,6 +235,12 @@
height=800px frameborder=0></iframe>
</div>
</div>
<div id="tab-6" class="tab-pane">
<div class="panel-body">
<iframe id="refundConfig_iframe" name="refundConfig_iframe" marginwidth=0 marginheight=0 width=100%
height=800px frameborder=0></iframe>
</div>
</div>
</div>
......@@ -312,6 +317,11 @@
document.getElementById("damai_iframe").src = "../damai/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", "");
}
//退款管理
function refundConfigInfo() {
document.getElementById("refundConfig_iframe").src = "../refundConfig/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", "");
}
$("#tab-nav-1").bind("click", function () {
$("#tab_iframe_1").attr("src", prefix + "/performanceStatic/" + '[[${kylinPerformanceMisVo.performancesId}]]'.replaceAll("\"", ""));
});
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:include="include :: header('退款管理')"/>
<th:block th:include="include :: datetimepicker-css"/>
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-refund-edit" th:object="${performanceRefundConfigVo}">
<div class="form-group">
<label class="col-sm-3 control-label is-required">performances_id:</label>
<div class="col-sm-8">
<input name="performancesId" th:field="*{performancesId}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">演出名称:</label>
<div class="col-sm-8">
<input name="title" th:field="*{title}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">开启退款:</label>
<div class="col-sm-8" th:if="*{isCanRefund==1}">
<div class="radio check-box">
<input type="radio" value="1" name="performance_isCanRefund" checked>开启</label>
</div>
<div class="radio check-box">
<input type="radio" value="0" name="performance_isCanRefund">关闭</label>
</div>
</div>
<div class="col-sm-8" th:if="*{isCanRefund==0}">
<div class="radio check-box">
<input type="radio" value="1" name="performance_isCanRefund">开启</label>
</div>
<div class="radio check-box">
<input type="radio" value="0" name="performance_isCanRefund" checked> 关闭</label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">定时: </label>
<input th:field="${performanceRefundConfigVo.refundOpenTime}" type="text" style="width: 200px;float: left"
class="form-control" id="startTime" placeholder="开始时间选择" name="refundOpenTime"
required/>
<span class="control-label" style="float: left;margin-left: 10px;margin-right: 10px"></span>
<input th:field="${performanceRefundConfigVo.refundCloseTime}" type="text" style="width: 200px;float: left"
class="form-control" id="endTime" placeholder="结束时间选择" name="refundCloseTime"
required/>
</div>
<button type="button" class="btn btn-w-m btn-success" onclick="submitHandler()">
修改
</button>
</form>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: datetimepicker-js"/>
<script th:inline="javascript">
var prefix = ctx + "kylin/performances";
$("#form-refund-edit").validate({
focusCleanup: true
});
$("#startTime").datetimepicker({
format: "yyyy-mm-dd hh:ii:ss",
autoclose: true
});
$("#endTime").datetimepicker({
format: "yyyy-mm-dd hh:ii:ss",
autoclose: true
});
function submitHandler() {
var param = {
performancesId: '[[${performanceRefundConfigVo.performancesId}]]'.replaceAll("\"", ""),
isCanRefund: parseInt($("input[name^='performance_isCanRefund']:checked").val()),
refundOpenTime: $("input[name^='refundOpenTime']").val(),
refundCloseTime: $("input[name^='refundCloseTime']").val()
}
$.operate.post(prefix + "/refundConfig/change",
param,
function (res) {
location.reload();
});
}
</script>
</body>
</html>
......@@ -23,15 +23,20 @@ import com.liquidnet.service.kylin.dto.vo.returns.RefundOrderDetailsVo;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.*;
import com.liquidnet.service.kylin.service.IKylinOrderRefundsService;
import com.mongodb.BasicDBObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
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 java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
......@@ -72,6 +77,8 @@ public class KylinOrderRefundsServiceImpl extends ServiceImpl<KylinOrderRefundsM
@Autowired
MongoTemplate mongoTemplate;
@Autowired
private MongoConverter mongoConverter;
public ResponseDto refundApply(RefundApplyParam refundApplyParam) {
String orderTicketsId = refundApplyParam.getOrderTicketsId();
......@@ -141,7 +148,7 @@ public class KylinOrderRefundsServiceImpl extends ServiceImpl<KylinOrderRefundsM
double onePrice = (priceActual - priceExpress) / allEntitiesCount;//单价
List<Double> realRefundPriceList = new ArrayList<>();
if (null == refundApplyParam.getOrderRefundBatchesId() || refundApplyParam.getOrderRefundBatchesId().isEmpty()) { // 不是批量退款
for (int i = 0; i <= ticketEntityIds.size() -1; i++) {
for (int i = 0; i <= ticketEntityIds.size() - 1; i++) {
Double price = entitiesPrice.get(i);
if (price < 0) {
return ResponseDto.failure("退款金额不能为0");
......@@ -186,6 +193,15 @@ public class KylinOrderRefundsServiceImpl extends ServiceImpl<KylinOrderRefundsM
RefundPriceExpress,
ticketEntityIds, realRefundPriceList
);
// KylinOrderTicketVo vo = new KylinOrderTicketVo();
HashMap<String,Object> map = new HashMap<>();
map.put("isHaveRefundDetails",1);
BasicDBObject obj = new BasicDBObject("$set", mongoConverter.convertToMongoType(map));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderTicketsId)).getQueryObject(),
obj);
if (res) {
return ResponseDto.success();
} else {
......@@ -387,7 +403,7 @@ public class KylinOrderRefundsServiceImpl extends ServiceImpl<KylinOrderRefundsM
List<KylinOrderTicketEntitiesDao> entitiesListTemp = kylinOrderTicketEntitiesMapper.getRefundEntitiesList(kylinOrderTickets.getOrderTicketsId());
List<KylinOrderTicketEntitiesDao> entitiesList = new ArrayList<>();
if(entitiesListTemp.size() > 0) {
if (entitiesListTemp.size() > 0) {
double priceActual = kylinOrderTickets.getPriceActual().doubleValue();
double priceExpress = kylinOrderTickets.getPriceExpress().doubleValue();
int allEntitiesCount = kylinOrderTicketEntitiesMapper.selectCount(// 总入场人数量 排出未付款的 用来计算单入场人的价格
......
......@@ -13,6 +13,7 @@ import com.liquidnet.service.kylin.dto.param.*;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceAgentVo;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceDamaiVo;
import com.liquidnet.service.kylin.dto.vo.admin.KylinPerformanceMemberHistoryVo;
import com.liquidnet.service.kylin.dto.vo.admin.PerformanceRefundConfigVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinPerformanceMisVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketPartnerVo;
import com.liquidnet.service.kylin.dto.vo.partner.KylinTicketTimesPartnerVo;
......@@ -209,12 +210,12 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
List<PerformanceAdminListDao> voList = performancesMapper.misPerformanceList(map);
for (PerformanceAdminListDao item : voList) {
item.setStatus(item.getStatus());
if(item.getStatus() >=6 && item.getStatus()!=7){
if (item.getStatus() >= 6 && item.getStatus() != 7) {
if (DateUtil.compareStrDay(item.getTimeSell(), DateUtil.getNowTime()) > 0) {//未开始
item.setStatus(9);
} else if (DateUtil.compareStrDay(item.getTimeStop(), DateUtil.getNowTime()) < 0) {//已结束
item.setStatus(10);
}else{
} else {
item.setStatus(6);
}
}
......@@ -346,7 +347,7 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
}
boolean isExists = mongoTemplate.exists(Query.query(Criteria.where("status").is(1).and("performancesId").is(performanceId)), PerformanceMemberAuditParam.class, PerformanceMemberAuditParam.class.getSimpleName());
if (isExists) {
performanceMemberAuditDao.setIsSubmit(1);
performanceMemberAuditDao.setIsSubmit(1);
} else {
performanceMemberAuditDao.setIsSubmit(0);
}
......@@ -565,6 +566,37 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
}
}
@Override
public PerformanceRefundConfigVo getRefundConfig(String performanceId) {
KylinPerformances kylinPerformances = performancesMapper.selectOne(new UpdateWrapper<KylinPerformances>().eq("performances_id", performanceId));
KylinPerformanceStatus kylinPerformanceStatus = performanceStatusMapper.selectOne(new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performanceId));
PerformanceRefundConfigVo vo = new PerformanceRefundConfigVo();
vo.setPerformancesId(kylinPerformances.getPerformancesId());
vo.setTitle(kylinPerformances.getTitle());
vo.setIsCanRefund(kylinPerformanceStatus.getIsCanRefund());
vo.setRefundCloseTime(kylinPerformanceStatus.getRefundCloseTime()==null?"":DateUtil.Formatter.yyyyMMddHHmmss.format(kylinPerformanceStatus.getRefundCloseTime()));
vo.setRefundOpenTime(kylinPerformanceStatus.getRefundOpenTime()==null?"":DateUtil.Formatter.yyyyMMddHHmmss.format(kylinPerformanceStatus.getRefundOpenTime()));
return vo;
}
@Override
public boolean changeRefundConfig(String performancesId,
Integer isCanRefund,
String refundOpenTime,
String refundCloseTime) {
KylinPerformanceStatus kylinPerformanceStatus = new KylinPerformanceStatus();
kylinPerformanceStatus.setIsCanRefund(isCanRefund);
kylinPerformanceStatus.setRefundOpenTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(refundOpenTime));
kylinPerformanceStatus.setRefundCloseTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(refundCloseTime));
try {
performanceStatusMapper.update(kylinPerformanceStatus, new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performancesId));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public KylinPerformanceAgentVo getPerformanceAgent(String performancesId) {
KylinPerformances performanceData = performancesMapper.selectOne(new UpdateWrapper<KylinPerformances>().eq("performances_id", performancesId));
......
......@@ -227,7 +227,6 @@ public class DataUtils {
KylinPerformanceVo vo = getPerformanceVo(performanceId);
int isTrueName = vo.getIsTrueName();
int ticketType = 0;
String useTime = "";
HashMap<String, ArrayList<String>> allTicketId = new HashMap<>();
for (int x = 0; x < vo.getTicketTimeList().size(); x++) {
......@@ -240,7 +239,6 @@ public class DataUtils {
}
if (ticketItem.getTicketsId().equals(ticketId)) {
useTime = ticketItem.getUseStart();
ticketType = ticketItem.getType();
}
}
allTicketId.put(timeItem.getUseStart(), ticketList);
......
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 退款图片
* </p>
*
* @author liquidnet
* @since 2021-05-11
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinOrderRefundPic implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Integer mid;
/**
* refund_pic_id
*/
private String refundPicId;
/**
* 订单退款表id
*/
private String orderRefundsId;
/**
* 图片地址
*/
private String picUrl;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
......@@ -89,6 +89,26 @@ public class KylinPerformanceStatus implements Serializable {
*/
private Integer isRecommend;
/**
* 是否支持退款 0否 1是
*/
private Integer isCanRefund;
/**
* 是否开启退款比例 0否 1是
*/
private Integer isOpenRefundPresent;
/**
* 退款开始时间
*/
private LocalDateTime refundOpenTime;
/**
* 退款结束时间
*/
private LocalDateTime refundCloseTime;
/**
* 创建时间
*/
......
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinOrderRefundPic;
import com.liquidnet.service.kylin.entity.KylinTicketTimes;
/**
* <p>
* 场次 Mapper 接口
* </p>
*
* @author liquidnet
* @since 2021-05-06
*/
public interface KylinOrderRefundPicMapper extends BaseMapper<KylinOrderRefundPic> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.kylin.mapper.KylinOrderRefundPicMapper">
</mapper>
......@@ -88,7 +88,6 @@ public class KylinUtils {
String redisKey;
KylinPerformanceVo vo = (KylinPerformanceVo) redisUtil.get(KylinRedisConst.PERFORMANCES + performanceId);
int isTrueName = vo.getIsTrueName();
int ticketType = 0;
String useTime = "";
HashMap<String, ArrayList<String>> allTicketId = new HashMap<>();
for (int x = 0; x < vo.getTicketTimeList().size(); x++) {
......@@ -101,7 +100,6 @@ public class KylinUtils {
}
if (ticketItem.getTicketsId().equals(ticketId)) {
useTime = ticketItem.getUseStart();
ticketType = ticketItem.getType();
}
}
allTicketId.put(timeItem.getUseStart(), ticketList);
......
......@@ -765,8 +765,8 @@ CREATE TABLE `kylin_order_express`
PRIMARY KEY (`mid`)
) ENGINE = InnoDB COMMENT '订单快递表';
drop TABLE if exists `kylin_order_express`;
CREATE TABLE `kylin_refund_pic`
drop TABLE if exists `kylin_order_refund_pic`;
CREATE TABLE `kylin_order_refund_pic`
(
`mid` int unsigned NOT NULL AUTO_INCREMENT,
`refund_pic_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'refund_pic_id',
......@@ -774,6 +774,7 @@ CREATE TABLE `kylin_refund_pic`
`pic_url` tinyint NOT NULL DEFAULT '0' COMMENT '图片地址',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
KEY `kylin_order_express_order_express_id_index` (`refund_pic_id`),
KEY `kylin_refund_pic_refund_pic_id_index` (`refund_pic_id`),
KEY `kylin_refund_pic_order_refunds_id_index` (`order_refunds_id`),
PRIMARY KEY (`mid`)
) ENGINE = InnoDB COMMENT '订单快递表';
) ENGINE = InnoDB COMMENT '订单退款图片表';
......@@ -9,6 +9,7 @@ import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderRefundVo;
import com.liquidnet.service.kylin.dto.vo.returns.PayResultVo;
import com.liquidnet.service.kylin.service.IKylinOrderTicketsService;
import com.liquidnet.service.kylin.service.impl.KylinOrderTicketsServiceImpl;
......@@ -87,6 +88,37 @@ public class KylinOrderTicketsController {
}
}
@GetMapping("toOrderRefundDetails")
@ApiOperation("想要退款订单详情")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<OrderDetailsVo> toOrderRefundDetails(@RequestParam(value = "orderId", required = false) @NotNull(message = "订单id不能为空") String orderId) {
OrderDetailsVo vo = orderTicketsService.toOrderRefundDetails(orderId);
if (null == vo) {
return ResponseDto.failure(ErrorMapping.get("20003"));
} else {
return ResponseDto.success(vo);
}
}
@PostMapping("sendOrderRefund")
@ApiOperation("发起退款申请")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<Boolean> sendOrderRefund(@RequestParam(value = "orderId", required = true) @NotNull(message = "订单id不能为空") String orderId,
@RequestParam(value = "orderTicketEntitiesId", required = true) @NotNull(message = "票单id不能为空") String orderTicketEntitiesId,
@RequestParam(value = "reason", required = true) @NotNull(message = "退款原因不能为空") String reason,
@RequestParam(value = "picList", required = false) String picList) {
return orderTicketsService.sendOrderRefund(orderId, orderTicketEntitiesId, reason, picList);
}
@GetMapping("orderRefundDetails")
@ApiOperation("发起退款申请")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<OrderRefundVo> orderRefundDetails(@RequestParam(value = "orderId", required = true) @NotNull(message = "订单id不能为空") String orderId,
@RequestParam(value = "orderRefundId", required = true) @NotNull(message = "退款订单id不能为空") String orderRefundId) {
return ResponseDto.success(orderTicketsService.orderRefundDetails(orderId,orderRefundId));
}
@GetMapping("checkPayment")
@ApiOperation("订单状态")
@ApiResponse(code = 200, message = "接口返回对象参数")
......
package com.liquidnet.service.kylin.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.kylin.entity.KylinOrderRefundPic;
import com.liquidnet.service.kylin.mapper.KylinOrderRefundPicMapper;
import com.liquidnet.service.kylin.service.IKylinOrderRefundPicService;
import org.springframework.stereotype.Service;
@Service
public class KylinOrderRefundPicServiceImpl extends ServiceImpl<KylinOrderRefundPicMapper, KylinOrderRefundPic> implements IKylinOrderRefundPicService {
}
......@@ -2,11 +2,8 @@ package com.liquidnet.service.kylin.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.kylin.entity.KylinOrderTicketStatus;
import com.liquidnet.service.kylin.entity.KylinTickets;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketStatusMapper;
import com.liquidnet.service.kylin.mapper.KylinTicketsMapper;
import com.liquidnet.service.kylin.service.IKylinOrderTicketStatusService;
import com.liquidnet.service.kylin.service.IKylinTicketsService;
import org.springframework.stereotype.Service;
/**
......
package com.liquidnet.service.kylin.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageInfo;
import com.liquidnet.common.cache.redis.util.RedisUtil;
......@@ -20,9 +22,7 @@ import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.middle.message.MessageConfigVo;
import com.liquidnet.service.kylin.dto.vo.middle.message.MessageDataVo;
import com.liquidnet.service.kylin.dto.vo.mongo.*;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo;
import com.liquidnet.service.kylin.dto.vo.returns.PayResultVo;
import com.liquidnet.service.kylin.dto.vo.returns.*;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketRelationsMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketStatusMapper;
......@@ -56,6 +56,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -107,6 +108,8 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
private KylinOrderTicketRelationsMapper orderTicketRelationsMapper;
@Autowired
private OrderRefundsCallbackServiceImpl orderRefundsCallbackService;
@Autowired
private KylinRefundsStatusServiceImpl refundsStatusService;
ArrayList<Integer> canBuyStatus = new ArrayList() {{
......@@ -365,7 +368,7 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
/*if (Arrays.asList("dev", "test").contains(environment.getProperty("spring.profiles.active"))) {
orderTickets.setPriceActual(new BigDecimal("0.01"));
} else {*/
orderTickets.setPriceActual(orderTickets.getPriceTotal());
orderTickets.setPriceActual(orderTickets.getPriceTotal());
/*}*/
orderTickets.setPriceVoucher(new BigDecimal("0.0"));
......@@ -534,7 +537,7 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
/*if (Arrays.asList("dev", "test").contains(environment.getProperty("spring.profiles.active"))) {
httpData.add("price", "0.01");
} else {*/
httpData.add("price", orderTickets.getPriceActual().toString());
httpData.add("price", orderTickets.getPriceActual().toString());
// }
httpData.add("name", useTime + ticketData.getTitle() + "-" + performanceData.getTitle());
httpData.add("detail", performanceData.getTitle() + "-" + ticketData.getTitle() + "-" + useTime);
......@@ -791,6 +794,7 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
if (orderTicketData.getStatus() == 2) {
orderRefundsCallbackService.refundApply(orderTicketData.getOrderTicketsId());
mongoVoUtils.resetOrderListVo(orderTicketData.getUserId(), 2, orderTicketData.getOrderTicketsId(), null);
} else if (orderTicketData.getStatus() == 3 || orderTicketData.getStatus() == 4) {
log.error("订单号位 {} 的订单正在退款 或者已退款", syncOrderParam.getOrder_code());
} else {
......@@ -951,21 +955,17 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
@Override
public OrderDetailsVo orderDetails(String orderId) {
log.error("调用订单详情");
OrderDetailsVo vo = new OrderDetailsVo();
try {
String uid = CurrentUtil.getCurrentUid();
// checkOrderTime(uid);
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
if (!orderTicketVo.getUserId().equals(uid)) {
log.error("ORDER_TICKET_USER_ID : {}", orderTicketVo.getUserId());
log.error("TOKEN UID : {}", uid);
return null;
}
if (null != orderTicketVo) {
//TODO 顺丰快递
Object expresses = null;
// Expresses expresses = expressesMapper.selectOne(new UpdateWrapper<Expresses>().eq("order_id", orderId).eq("order_type", "order_ticket"));
KylinPerformanceVo performanceVo = dataUtils.getPerformanceVo(orderTicketVo.getPerformanceId());
List<KylinOrderTicketEntitiesVo> kylinOrderTicketEntitiesVoList = orderTicketVo.getEntitiesVoList();
KylinTicketVo ticketVo = null;
......@@ -988,8 +988,8 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
orderTicketVo.setTicketType(ticketVo.getType());
orderTicketVo.setFieldName(performanceVo.getFieldName());
if (ticketVo.getIsShowCode() == 1) {
Date date = DateUtil.parse(ticketVo.getQrCodeShowTime(), DateUtil.Formatter.yyyyMMddHHmm.toString());
if (DateUtil.compareDay(DateUtil.now(), date) >= 0) {
Date date = DateUtil.parse(ticketVo.getQrCodeShowTime(), DateUtil.Formatter.yyyyMMddHHmmss.toString());
if (DateUtil.compareDay(DateUtil.now(), date) <= 0) {
orderTicketVo.setQrCode(orderTicketVo.getQrCode());
} else {
orderTicketVo.setQrCode("");
......@@ -998,7 +998,6 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
orderTicketVo.setQrCode("");
}
// 数据脱敏
for (KylinOrderTicketEntitiesVo item : kylinOrderTicketEntitiesVoList) {
if (item.getEnterIdCode().length() == 18) {
......@@ -1009,10 +1008,11 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
}
}
//计算 倒计时
Date nowDate = DateUtil.parse(DateUtil.getNowTime(), "yyyy-MM-dd HH:mm:ss");
if (orderTicketVo.getStatus().equals(KylinTableStatusConst.ORDER_STATUS0)) {
vo.setRestTime(DateUtil.intervalSeconds(
DateUtil.parse(orderTicketVo.getOverdueAt(), "yyyy-MM-dd HH:mm:ss"),
DateUtil.parse(DateUtil.getNowTime(), "yyyy-MM-dd HH:mm:ss")
nowDate
));
if (vo.getRestTime() <= 0L) {
vo.setRestTime(0L);
......@@ -1030,6 +1030,30 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
vo.setExpress_company("");
vo.setKuaidi_status(-2);
}
if (performanceVo.getIsCanRefund() == 1) {
Date refundOpenDate = DateUtil.parse(performanceVo.getRefundOpenTime(), "yyyy-MM-dd HH:mm:ss");
Date refundCloseDate = DateUtil.parse(performanceVo.getRefundCloseTime(), "yyyy-MM-dd HH:mm:ss");
if (DateUtil.compareDay(nowDate, refundCloseDate) < 0 && DateUtil.compareDay(nowDate, refundOpenDate) > 0) {
vo.setIsCanRefund(1);
} else {
vo.setIsCanRefund(0);
orderTicketVo.setIsHaveRefundDetails(0);
}
} else {
vo.setIsCanRefund(0);
orderTicketVo.setIsHaveRefundDetails(0);
}
List<KylinOrderRefundsOrderCodeVo> orderRefundsVoBaseList = new ArrayList<>();
for (KylinOrderRefundsVoBase item : dataUtils.getOrderRefundVoByOrderId(orderId)) {
KylinOrderRefundsOrderCodeVo data = new KylinOrderRefundsOrderCodeVo();
data.setOrderRefundsId(item.getOrderRefundsId());
data.setOrderRefundCode(item.getOrderRefundCode());
data.setStatus(item.getStatus());
}
vo.setOrderRefundsVoList(orderRefundsVoBaseList);
vo.setOrderTicketVo(orderTicketVo);
vo.setEnterDescribe(dataUtils.getEnterInfo("1"));
}
......@@ -1044,125 +1068,93 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
@Override
public boolean checkOrderTime(String userId) {
String lock = "order_lock:checkOrderTime:" + userId;
if (redisLockUtil.tryLock(lock, 1, 3600)) {
List<OrderScriptDto> dtoData = orderTicketsMapper.orderScriptDto(userId);
LocalDateTime now = LocalDateTime.now();
Long currentTime = System.currentTimeMillis();
HashMap<String, Integer> mapSurplusGeneral = new HashMap<>();
ArrayList<String> orderDataList = new ArrayList<>();
ArrayList<String> orderIdList = new ArrayList<>();
HashMap<String, Object> mapMongo = new HashMap<>();
for (OrderScriptDto item : dtoData) {
if (item.getStatus().equals(KylinTableStatusConst.ORDER_STATUS0)) {
try {
//vo
mapMongo.put("status", KylinTableStatusConst.ORDER_STATUS2);
mapMongo.put("updatedAt", DateUtil.Formatter.yyyyMMddHHmmssSSS.format(now));
mapMongo.put("changeDate", now);
orderDataList.add(item.getOrderTicketsId() + "," + item.getUserId());
orderIdList.add(item.getOrderTicketsId());
mapSurplusGeneral.put(item.getTicketId(), mapSurplusGeneral.get(item.getTicketId()) == null ? item.getNumber() : mapSurplusGeneral.get(item.getTicketId()) + item.getNumber());
} catch (Exception e) {
log.debug("CHECK TIME SYNC = " + e.getMessage());
e.printStackTrace();
return false;
}
} else {
List<OrderScriptDto> dtoData = orderTicketsMapper.orderScriptDto(userId);
LocalDateTime now = LocalDateTime.now();
Long currentTime = System.currentTimeMillis();
HashMap<String, Integer> mapSurplusGeneral = new HashMap<>();
ArrayList<String> orderDataList = new ArrayList<>();
ArrayList<String> orderIdList = new ArrayList<>();
HashMap<String, Object> mapMongo = new HashMap<>();
for (OrderScriptDto item : dtoData) {
if (item.getStatus().equals(KylinTableStatusConst.ORDER_STATUS0)) {
try {
//vo
mapMongo.put("status", KylinTableStatusConst.ORDER_STATUS2);
mapMongo.put("updatedAt", DateUtil.Formatter.yyyyMMddHHmmssSSS.format(now));
mapMongo.put("changeDate", now);
orderDataList.add(item.getOrderTicketsId() + "," + item.getUserId());
orderIdList.add(item.getOrderTicketsId());
mapSurplusGeneral.put(item.getTicketId(), mapSurplusGeneral.get(item.getTicketId()) == null ? item.getNumber() : mapSurplusGeneral.get(item.getTicketId()) + item.getNumber());
} catch (Exception e) {
log.debug("CHECK TIME SYNC = " + e.getMessage());
e.printStackTrace();
return false;
}
} else {
}
}
currentTime = System.currentTimeMillis() - currentTime;
log.debug("FOR 循环 -> time:" + (currentTime) + "毫秒");
if (orderDataList.size() > 0) {
//mysql
String orderStr = "";
for (int i = 0; i < orderIdList.size(); i++) {
String orderTicketId = orderIdList.get(i);
orderStr += "'" + orderTicketId + "',";
}
orderStr = orderStr.substring(0, orderStr.length() - 1);
KylinOrderTickets orderTickets = new KylinOrderTickets();
orderTickets.setUpdatedAt(now);
orderTicketsMapper.update(orderTickets, new UpdateWrapper<KylinOrderTickets>().in("order_tickets_id", orderIdList));
KylinOrderTicketStatus orderTicketStatus = new KylinOrderTicketStatus();
orderTicketStatus.setStatus(2);
orderTicketStatus.setUpdatedAt(now);
orderTicketStatusMapper.update(orderTicketStatus, new UpdateWrapper<KylinOrderTicketStatus>().in("order_id", orderIdList));
KylinOrderTicketRelations orderTicketRelations = new KylinOrderTicketRelations();
orderTicketRelations.setUpdatedAt(now);
orderTicketRelationsMapper.update(orderTicketRelations, new UpdateWrapper<KylinOrderTicketRelations>().in("order_id", orderIdList));
currentTime = System.currentTimeMillis() - currentTime;
log.debug("FOR 循环 -> time:" + (currentTime) + "毫秒");
if (orderDataList.size() > 0) {
//mysql
String orderStr = "";
for (int i = 0; i < orderIdList.size(); i++) {
String orderTicketId = orderIdList.get(i);
orderStr += "'" + orderTicketId + "',";
}
orderStr = orderStr.substring(0, orderStr.length() - 1);
log.debug("mysql -> time:" + (currentTime) + "毫秒");
KylinOrderTickets orderTickets = new KylinOrderTickets();
orderTickets.setUpdatedAt(now);
orderTicketsMapper.update(orderTickets, new UpdateWrapper<KylinOrderTickets>().in("order_tickets_id", orderIdList));
KylinOrderTicketStatus orderTicketStatus = new KylinOrderTicketStatus();
orderTicketStatus.setStatus(2);
orderTicketStatus.setUpdatedAt(now);
orderTicketStatusMapper.update(orderTicketStatus, new UpdateWrapper<KylinOrderTicketStatus>().in("order_id", orderIdList));
KylinOrderTicketRelations orderTicketRelations = new KylinOrderTicketRelations();
orderTicketRelations.setUpdatedAt(now);
orderTicketRelationsMapper.update(orderTicketRelations, new UpdateWrapper<KylinOrderTicketRelations>().in("order_id", orderIdList));
// LinkedList<String> sqls = new LinkedList();
// sqls.add("UPDATE kylin_order_tickets SET updated_at = '" + now + "' WHERE order_tickets_id in (" + orderStr + ") ");
// sqls.add("UPDATE kylin_order_ticket_status SET `status` = 2,updated_at = '" + now + "' WHERE order_id in (" + orderStr + ") ");
// sqls.add("UPDATE kylin_order_ticket_relations SET updated_at = '" + now + "' WHERE order_id in (" + orderStr + ")");
// String redisKey = "kylin:ORDER_CLOSE:" + IDGenerator.nextMilliId();
// redisUtil.set(redisKey, sqls);
// rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL_ORDER_CLOSE, MQConst.ROUTING_KEY_SQL_ORDER_CLOSE, redisKey);
currentTime = System.currentTimeMillis() - currentTime;
log.debug("mysql -> time:" + (currentTime) + "毫秒");
//库存
for (Map.Entry<String, Integer> entry : mapSurplusGeneral.entrySet()) {
dataUtils.changeSurplusGeneral(entry.getKey(), entry.getValue());
}
currentTime = System.currentTimeMillis() - currentTime;
log.debug("redis 库存 -> time:" + (currentTime) + "毫秒");
//库存
for (Map.Entry<String, Integer> entry : mapSurplusGeneral.entrySet()) {
dataUtils.changeSurplusGeneral(entry.getKey(), entry.getValue());
}
try {
//mongo
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("orderTicketsId").in(orderIdList)).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(mapMongo))
);
currentTime = System.currentTimeMillis() - currentTime;
log.debug("redis 库存 -> time:" + (currentTime) + "毫秒");
log.debug("mongo -> time:" + (currentTime) + "毫秒");
} catch (Exception e) {
try {
//mongo
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("orderTicketsId").in(orderIdList)).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(mapMongo))
);
currentTime = System.currentTimeMillis() - currentTime;
log.debug("mongo -> time:" + (currentTime) + "毫秒");
} catch (Exception e) {
}
}
int forSize = 500;
int forCount = orderDataList.size() % forSize == 0 ? orderDataList.size() / forSize : (orderDataList.size() / forSize) + 1;
for (int i = 0; i < forCount; i++) {
LinkedList<String> mqList = new LinkedList<>();
for (int y = 0; y < forSize; y++) {
try {
String t = orderDataList.get(i * 500 + y);
mqList.add(t);
} catch (Exception e) {
break;
}
int forSize = 500;
int forCount = orderDataList.size() % forSize == 0 ? orderDataList.size() / forSize : (orderDataList.size() / forSize) + 1;
for (int i = 0; i < forCount; i++) {
LinkedList<String> mqList = new LinkedList<>();
for (int y = 0; y < forSize; y++) {
try {
String t = orderDataList.get(i * 500 + y);
mqList.add(t);
} catch (Exception e) {
break;
}
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL_ORDER_CLOSE, MQConst.ROUTING_KEY_SQL_ORDER_CLOSE, OrderCloseMapping.get(mqList));
}
// 线程循环更改限购
// kylinThreadService.checkOrderTimeThread(orderDataList);
// Thread thread = new Thread(() -> {
// //redis 列表
// orderDataList.forEach(t -> {
// String orderTicketId = t.split(",")[0];
// String uid = t.split(",")[1];
// KylinOrderTicketVo vo = dataUtils.getOrderTicketVo(orderTicketId);
// vo.setStatus(2);
// redisUtil.set(KylinRedisConst.ORDER + orderTicketId, vo);
// mongoVoUtils.resetOrderListVo(uid, 2, orderTicketId, vo);
// // redis 限购
// for (int i = 0; i < vo.getEntitiesVoList().size(); i++) {
// KylinOrderTicketEntitiesVo items = vo.getEntitiesVoList().get(i);
// dataUtils.changeBuyInfo(items.getUserId(), items.getEnterIdCode(), items.getPerformanceId(), items.getTicketId(), -1);
// }
// });
// });
// thread.start();
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL_ORDER_CLOSE, MQConst.ROUTING_KEY_SQL_ORDER_CLOSE, OrderCloseMapping.get(mqList));
}
redisLockUtil.unlock(lock);
} else {
log.debug("WARNING LOCKING");
}
return true;
}
......@@ -1211,6 +1203,244 @@ public class KylinOrderTicketsServiceImpl extends ServiceImpl<KylinOrderTicketsM
return ResponseDto.success(unPayCount);
}
@Override
public OrderDetailsVo toOrderRefundDetails(String orderId) {
OrderDetailsVo vo = new OrderDetailsVo();
String uid = CurrentUtil.getCurrentUid();
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
List<KylinOrderRefundsVoBase> kylinOrderRefundsVoBaseList = dataUtils.getOrderRefundVoByOrderId(orderTicketVo.getOrderTicketsId());
if (!orderTicketVo.getUserId().equals(uid)) {
return null;
}
List<KylinOrderTicketEntitiesVo> kylinOrderTicketEntitiesVoList = orderTicketVo.getEntitiesVoList();
// 数据脱敏
for (KylinOrderTicketEntitiesVo item : kylinOrderTicketEntitiesVoList) {
if (item.getEnterIdCode().length() == 18) {
item.setEnterIdCode(item.getEnterIdCode().substring(0, 3) + "*************" + item.getEnterIdCode().substring(16));
}
if (item.getEnterMobile().length() == 11) {
item.setEnterMobile(item.getEnterMobile().substring(0, 3) + "****" + item.getEnterMobile().substring(7));
}
item.setPriceActual(orderTicketVo.getPriceActual().subtract(orderTicketVo.getPriceExpress()).divide(new BigDecimal(orderTicketVo.getNumber())));
item.setPriceCanRefund(dataUtils.getCanRefundOrderEntitiesPrice(orderTicketVo, kylinOrderRefundsVoBaseList, item.getOrderTicketEntitiesId()));
}
return vo;
}
@Override
public OrderRefundVo orderRefundDetails(String orderId, String orderRefundId) {
OrderRefundVo vo = new OrderRefundVo();
String uid = CurrentUtil.getCurrentUid();
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
if (!orderTicketVo.getUserId().equals(uid)) {
return null;
}
KylinOrderRefundsVoBase kylinOrderRefundsVoBase = dataUtils.getOrderRefundVo(orderRefundId);
vo.setKylinOrderRefundsVoBaseList(kylinOrderRefundsVoBase);
vo.setOrderTicketVo(orderTicketVo);
return vo;
}
@Override
public ResponseDto<Boolean> sendOrderRefund(String orderId, String orderTicketEntitiesId, String reason, String picList) {
KylinOrderTicketEntitiesVo orderTicketEntitiesVo = null;
try {
String uid = CurrentUtil.getCurrentUid();
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
List<KylinOrderRefundsVoBase> kylinOrderRefundsVoBaseList = dataUtils.getOrderRefundVoByOrderId(orderTicketVo.getOrderTicketsId());
if (!orderTicketVo.getUserId().equals(uid)) {
return ResponseDto.failure(ErrorMapping.get("20003"));
}
List<KylinOrderTicketEntitiesVo> entitiesVos = orderTicketVo.getEntitiesVoList();
for (KylinOrderTicketEntitiesVo item : entitiesVos) {
if (item.getOrderTicketEntitiesId().equals(orderTicketEntitiesId)) {
orderTicketEntitiesVo = item;
}
}
if (null == orderTicketEntitiesVo) {
return ResponseDto.failure(ErrorMapping.get("20004"));
}
BigDecimal refundSinglePrice = dataUtils.getCanRefundOrderEntitiesPrice(orderTicketVo, kylinOrderRefundsVoBaseList, orderTicketEntitiesId);
Map token = CurrentUtil.getTokenClaims();
String username = StringUtils.defaultString(((String) token.get("nickname")), "");
boolean result = refundsStatusService.userOrderTicketRefunding(orderTicketVo, refundSinglePrice.doubleValue(), orderTicketEntitiesId, reason, picList, uid, username, kylinOrderRefundsVoBaseList.size());
if (result) {
return ResponseDto.success();
} else {
return ResponseDto.failure(ErrorMapping.get("20019"));
}
} catch (Exception e) {
e.printStackTrace();
return ResponseDto.failure(ErrorMapping.get("20019"));
}
}
@Override
public Boolean orderRefundWithdraw(String orderRefundsId) {
KylinOrderRefundsVoBase orderRefundsVo = dataUtils.getOrderRefundVo(orderRefundsId);
List<KylinOrderRefundEntitiesVo> refundEntities = orderRefundsVo.getOrderRefundEntitiesVoList();
String orderTicketsId = orderRefundsVo.getOrderTicketsId();
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderTicketsId);
// 更新数据
// 订单状态表 判断是退到正在退款 已付款 部分退款?(取消,完成,失败)
int newStatus;
int refundingCount = 0;
List<KylinOrderRefundsVoBase> orderRefundsVoList = dataUtils.getOrderRefundVoByOrderId(orderTicketsId);
for (KylinOrderRefundsVoBase item : orderRefundsVoList) {
int status = item.getStatus();
if (status != 2 && status != 4 && status != 6) {
refundingCount += 1;
}
}
if (refundingCount > 0) { // 存在其他正在退款的订单
newStatus = KylinTableStatusConst.ORDER_STATUS3;
} else {
if (orderTicketVo.getPriceRefund().doubleValue() > 0) { // 已经有退完的 那就是部分退款了
newStatus = KylinTableStatusConst.ORDER_STATUS6;
} else if (orderTicketVo.getStatus() != 2) {
newStatus = KylinTableStatusConst.ORDER_STATUS1;
} else {
newStatus = KylinTableStatusConst.ORDER_STATUS2;
}
}
KylinOrderTicketStatus orderStatusTable = new KylinOrderTicketStatus();
orderStatusTable.setStatus(newStatus);
// kylinOrderTicketStatusMapper.update(orderStatusTable, new UpdateWrapper<KylinOrderTicketStatus>()
// .eq("order_id", orderTicketsId));
KylinOrderTicketVo kylinOrderTicketVo = new KylinOrderTicketVo();
kylinOrderTicketVo.setStatus(newStatus);
BasicDBObject orderObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketVo)));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderTicketsId)).getQueryObject(),
orderObject
);
dataUtils.delOrderTicketRedis(orderTicketsId);
mongoVoUtils.resetOrderListVo(orderTicketVo.getUserId(), 2, orderTicketsId, null);
// 入场人
for (KylinOrderRefundEntitiesVo item : refundEntities) {
// 订单状态表 判断是退到正在退款 已付款 部分退款?(取消,完成,失败)
int newIsPayment = 0;
int refundingEntitiesCount = 0;
for (KylinOrderRefundsVoBase item2 :orderRefundsVoList) {
int status = item2.getStatus();
if(!item2.getOrderRefundsId().equals(orderRefundsId) && (status != 2 && status != 4 && status != 6)){
for(KylinOrderRefundEntitiesVo item3: item2.getOrderRefundEntitiesVoList()){
if(item3.getOrderTicketEntitiesId().equals(item.getOrderTicketEntitiesId())){
refundingEntitiesCount+=1;
}
}
}
}
if (refundingEntitiesCount > 0) { // 存在其他正在退款的该入场人订单
newIsPayment = KylinTableStatusConst.ENTITIES_IS_PAYMENT2;
} else {
KylinOrderTicketEntitiesVo entitiesVo = null;
for (KylinOrderTicketEntitiesVo entitiesVo1 : orderTicketVo.getEntitiesVoList()) {
if (entitiesVo1.getOrderTicketEntitiesId().equals(item.getOrderTicketEntitiesId())) {
entitiesVo = entitiesVo1;
break;
}
}
if (entitiesVo.getRefundPrice().doubleValue() > 0) { // 已经有退完的 那就是部分退款了
newIsPayment = KylinTableStatusConst.ENTITIES_IS_PAYMENT4;
} else {
newIsPayment = KylinTableStatusConst.ENTITIES_IS_PAYMENT1;
}
}
KylinOrderTicketEntities entitiesTable = new KylinOrderTicketEntities();
entitiesTable.setIsPayment(newIsPayment);
// kylinOrderTicketEntitiesMapper.update(entitiesTable, new UpdateWrapper<KylinOrderTicketEntities>()
// .eq("order_ticket_entities_id", entitiesId)
// .eq("is_payment", KylinTableStatusConst.ENTITIES_IS_PAYMENT2)
// );
KylinOrderTicketEntitiesVo kylinOrderTicketEntitiesVo = new KylinOrderTicketEntitiesVo();
kylinOrderTicketEntitiesVo.setIsPayment(newIsPayment);
BasicDBObject entitiesObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketEntitiesVo)));
mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketEntitiesId").is(item.getOrderTicketEntitiesId())).getQueryObject(),
entitiesObject
);
dataUtils.delOrderTicketEntitiesRedis(item.getOrderTicketEntitiesId());
}
// 退款细节取消
KylinOrderRefunds kylinOrderRefunds = new KylinOrderRefunds();
kylinOrderRefunds.setStatus(KylinTableStatusConst.ORDER_REFUND_STATUS_CANCEL);
kylinOrderRefunds.setUpdatedAt(LocalDateTime.now());
// kylinOrderRefundsMapper.update(kylinOrderRefunds, new UpdateWrapper<KylinOrderRefunds>()
// .eq("order_refunds_id", orderRefundsId));
return null;
}
@Override
public Boolean orderRefundAgain(String orderRefundsId) {
LocalDateTime time = LocalDateTime.now();
String strTime = DateUtil.Formatter.yyyyMMddHHmmss.format(time);
String uid = CurrentUtil.getCurrentUid();
KylinOrderRefundsVoBase orderRefundVo = dataUtils.getOrderRefundVo(orderRefundsId);
// 订单状态表 MQ
KylinOrderTicketStatus orderStatusTable = new KylinOrderTicketStatus();
orderStatusTable.setStatus(KylinTableStatusConst.ORDER_STATUS3);
orderStatusTable.setUpdatedAt(time);
// 订单入场人表 MQ
KylinOrderTicketEntities entitiesTable = new KylinOrderTicketEntities();
entitiesTable.setIsPayment(KylinTableStatusConst.ENTITIES_IS_PAYMENT2);
entitiesTable.setUpdatedAt(time);
// 订单退款表
KylinOrderRefunds orderRefunds = new KylinOrderRefunds();
orderRefunds.setUpdatedAt(time);
orderRefunds.setApplicantAt(time);
orderRefunds.setStatus(KylinTableStatusConst.ORDER_REFUND_STATUS_APPLY);
//订单状态表 MONGO
KylinOrderTicketVo kylinOrderTicketVo = new KylinOrderTicketVo();
kylinOrderTicketVo.setStatus(KylinTableStatusConst.ORDER_STATUS3);
kylinOrderTicketVo.setUpdatedAt(DateUtil.Formatter.yyyyMMddHHmmss.format(time));
BasicDBObject orderObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketVo)));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderRefundVo.getOrderTicketsId())).getQueryObject(),
orderObject
);
dataUtils.delOrderTicketRedis(orderRefundVo.getOrderTicketsId());
mongoVoUtils.resetOrderListVo(uid, 2, orderRefundVo.getOrderTicketsId(), null);
// 订单入场人表 MONGO
KylinOrderTicketEntitiesVo kylinOrderTicketEntitiesVo = new KylinOrderTicketEntitiesVo();
kylinOrderTicketEntitiesVo.setIsPayment(KylinTableStatusConst.ENTITIES_IS_PAYMENT2);
kylinOrderTicketEntitiesVo.setUpdatedAt(strTime);
BasicDBObject entitiesObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketEntitiesVo)));
mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketEntitiesId").is(orderRefundVo.getOrderRefundEntitiesVoList().get(0).getOrderTicketEntitiesId())).getQueryObject(),
entitiesObject
);
dataUtils.delOrderTicketEntitiesRedis(orderRefundVo.getOrderRefundEntitiesVoList().get(0).getOrderTicketEntitiesId());
// 订单退款表 MONGO
KylinOrderRefundsVoBase orderRefundsVo = new KylinOrderRefundsVoBase();
orderRefundsVo.setStatus(KylinTableStatusConst.ORDER_REFUND_STATUS_APPLY);
orderRefundsVo.setUpdatedAt(strTime);
orderRefundsVo.setApplicantAt(strTime);
BasicDBObject refundObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(orderRefundsVo)));
mongoTemplate.getCollection(KylinOrderRefundsVoBase.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderRefundsId").is(orderRefundVo.getOrderRefundsId())).getQueryObject(),
refundObject
);
return null;
}
public boolean checkAgent(String agentId, KylinTicketVo ticketData) {
boolean isAgent = ticketData.getIsAgent() == 1;
if (isAgent) {
......
......@@ -3,15 +3,12 @@ package com.liquidnet.service.kylin.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.common.mq.constant.MQConst;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dto.param.RefundApplyParam;
import com.liquidnet.service.kylin.dto.param.RefundCallbackParam;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.*;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.*;
import com.liquidnet.service.kylin.utils.DataUtils;
......@@ -23,6 +20,8 @@ import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.bson.Document;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
......@@ -33,6 +32,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -77,6 +77,8 @@ public class KylinRefundsStatusServiceImpl {
@Autowired
private MongoVoUtils mongoVoUtils;
@Autowired
private RabbitTemplate rabbitTemplate;
public boolean orderTicketRefunded(RefundCallbackParam refundCallbackParam, KylinOrderRefunds refundInfo) {
List<KylinOrderRefundEntities> refundEntities = kylinOrderRefundsEntitiesMapper.selectList(
......@@ -155,7 +157,7 @@ public class KylinRefundsStatusServiceImpl {
EntitiesVo.put("isPayment", isPayment);
BasicDBObject EntitiesVov = new BasicDBObject("$set", mongoConverter.convertToMongoType(EntitiesVo));
UpdateResult updateResult = mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketEntitiesId").is(entitiesId)).getQueryObject(),
Query.query(Criteria.where("orderTicketEntitiesId").is(entitiesId)).getQueryObject(),
EntitiesVov
);
......@@ -185,7 +187,7 @@ public class KylinRefundsStatusServiceImpl {
orderVov
);
dataUtils.delOrderTicketRedis(orderTicketsId);
mongoVoUtils.resetOrderListVo(orderInfo.getUserId(), 2, orderTicketsId,null);
mongoVoUtils.resetOrderListVo(orderInfo.getUserId(), 2, orderTicketsId, null);
// 退款单完成
KylinOrderRefunds kylinOrderRefunds = new KylinOrderRefunds();
......@@ -248,7 +250,7 @@ public class KylinRefundsStatusServiceImpl {
new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
);
dataUtils.delOrderTicketRedis(orderTicketsId);
mongoVoUtils.resetOrderListVo(orderInfo.getUserId(), 2, orderTicketsId,null);
mongoVoUtils.resetOrderListVo(orderInfo.getUserId(), 2, orderTicketsId, null);
// 订单入场人表 和 缓存
......@@ -318,4 +320,155 @@ public class KylinRefundsStatusServiceImpl {
return true;
}
public Boolean userOrderTicketRefunding(
KylinOrderTicketVo orderInfo,
double refundPrice,
String orderEntitiesId,
String reason,
String picList,
String uid,
String username,
int refundCount
) {
try {
LocalDateTime time = LocalDateTime.now();
String strTime = DateUtil.Formatter.yyyyMMddHHmmss.format(time);
// 订单状态表 和 缓存
KylinOrderTicketStatus orderStatusTable = new KylinOrderTicketStatus();
orderStatusTable.setStatus(KylinTableStatusConst.ORDER_STATUS3);
orderStatusTable.setUpdatedAt(time);
KylinOrderTicketVo kylinOrderTicketVo = new KylinOrderTicketVo();
kylinOrderTicketVo.setStatus(KylinTableStatusConst.ORDER_STATUS3);
kylinOrderTicketVo.setUpdatedAt(DateUtil.Formatter.yyyyMMddHHmmss.format(time));
BasicDBObject orderObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketVo)));
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketsId").is(orderInfo.getOrderTicketsId())).getQueryObject(),
orderObject
);
dataUtils.delOrderTicketRedis(orderInfo.getOrderTicketsId());
mongoVoUtils.resetOrderListVo(orderInfo.getUserId(), 2, orderInfo.getOrderTicketsId(), null);
// 订单入场人表 和 缓存
KylinOrderTicketEntities entitiesTable = new KylinOrderTicketEntities();
entitiesTable.setIsPayment(KylinTableStatusConst.ENTITIES_IS_PAYMENT2);
entitiesTable.setUpdatedAt(time);
KylinOrderTicketEntitiesVo kylinOrderTicketEntitiesVo = new KylinOrderTicketEntitiesVo();
kylinOrderTicketEntitiesVo.setIsPayment(KylinTableStatusConst.ENTITIES_IS_PAYMENT2);
kylinOrderTicketEntitiesVo.setUpdatedAt(strTime);
BasicDBObject entitiesObject = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(kylinOrderTicketEntitiesVo)));
mongoTemplate.getCollection(KylinOrderTicketEntitiesVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderTicketEntitiesId").is(orderEntitiesId)).getQueryObject(),
entitiesObject
);
dataUtils.delOrderTicketEntitiesRedis(orderEntitiesId);
// 退款明细
KylinOrderRefunds kylinOrderRefunds = new KylinOrderRefunds();
String orderRefundsId = IDGenerator.nextSnowId();
kylinOrderRefunds.setOrderRefundsId(orderRefundsId);
kylinOrderRefunds.setOrderTicketsId(orderInfo.getOrderTicketsId());
String orderRefundCode = orderInfo.getOrderCode();
String codeNum = StringUtils.leftPad(String.valueOf(refundCount), 3, "0");
kylinOrderRefunds.setOrderRefundCode(orderRefundCode.concat(codeNum));
kylinOrderRefunds.setPrice(BigDecimal.valueOf(refundPrice));
kylinOrderRefunds.setPriceExpress(orderInfo.getPriceExpress());
kylinOrderRefunds.setStatus(KylinTableStatusConst.ORDER_REFUND_STATUS_APPLY);
kylinOrderRefunds.setType(KylinTableStatusConst.ORDER_REFUND_TYPE_APPLY);
kylinOrderRefunds.setApplicantId(uid);
kylinOrderRefunds.setApplicantName(username);
kylinOrderRefunds.setApplicantAt(time);
kylinOrderRefunds.setReason(reason);
if (orderInfo.getPriceExpress().doubleValue() > 0 && refundPrice > 0) {
kylinOrderRefunds.setRefundCate(KylinTableStatusConst.ORDER_REFUND_CATE3);
} else if (orderInfo.getPriceExpress().doubleValue() > 0) {
kylinOrderRefunds.setRefundCate(KylinTableStatusConst.ORDER_REFUND_CATE2);
} else if (refundPrice > 0) {
kylinOrderRefunds.setRefundCate(KylinTableStatusConst.ORDER_REFUND_CATE1);
}
kylinOrderRefunds.setCreatedAt(time);
KylinOrderRefundsVoBase orderRefundsVo = new KylinOrderRefundsVoBase();
BeanUtils.copyProperties(kylinOrderRefunds,orderRefundsVo);
orderRefundsVo.setCreatedAt(strTime);
orderRefundsVo.setApplicantAt(strTime);
mongoTemplate.insert(orderRefundsVo, KylinOrderRefundsVoBase.class.getSimpleName());
// 退款入场人表
KylinOrderRefundEntities kylinOrderRefundEntities = new KylinOrderRefundEntities();
String orderRefundsEntitiesId = IDGenerator.nextSnowId();
kylinOrderRefundEntities.setOrderRefundsEntitiesId(orderRefundsEntitiesId);
kylinOrderRefundEntities.setOrderRefundsId(orderRefundsId);
kylinOrderRefundEntities.setRefundPrice(BigDecimal.valueOf(refundPrice));
kylinOrderRefundEntities.setOrderTicketEntitiesId(orderEntitiesId);
kylinOrderRefundEntities.setCreatedAt(time);
KylinOrderRefundEntitiesVo orderRefundEntitiesVo = new KylinOrderRefundEntitiesVo();
BeanUtils.copyProperties(orderRefundEntitiesVo,kylinOrderRefundEntities);
orderRefundEntitiesVo.setCreatedAt(strTime);
mongoTemplate.insert(orderRefundEntitiesVo,KylinOrderRefundEntitiesVo.class.getSimpleName());
//退款图片
KylinOrderRefundPic orderRefundPic = new KylinOrderRefundPic();
orderRefundPic.setOrderRefundsId(IDGenerator.nextSnowId());
orderRefundPic.setOrderRefundsId(kylinOrderRefunds.getOrderRefundsId());
orderRefundPic.setPicUrl(picList);
orderRefundPic.setCreatedAt(time);
KylinOrderRefundPicVo orderRefundPicVo = new KylinOrderRefundPicVo();
BeanUtils.copyProperties(orderRefundPicVo,orderRefundPic);
orderRefundPicVo.setCreatedAt(strTime);
mongoTemplate.insert(orderRefundPicVo,KylinOrderRefundPicVo.class.getSimpleName());
//MQ
LinkedList<String> sqls = new LinkedList<>();
LinkedList<Object[]> sqlsDataA = new LinkedList<>();
LinkedList<Object[]> sqlsDataB = new LinkedList<>();
LinkedList<Object[]> sqlsDataC = new LinkedList<>();
LinkedList<Object[]> sqlsDataD = new LinkedList<>();
LinkedList<Object[]> sqlsDataE = new LinkedList<>();
sqls.add(SqlMapping.get("kylin_order_ticket_status.refund"));
sqls.add(SqlMapping.get("kylin_order_ticket_entities.refund"));
sqls.add(SqlMapping.get("kylin_order_refund.refund"));
sqls.add(SqlMapping.get("kylin_order_refund_entities.refund"));
sqls.add(SqlMapping.get("kylin_order_refund_pic.refund"));
sqlsDataA.add(new Object[]{
orderStatusTable.getStatus(), orderStatusTable.getUpdatedAt(), orderInfo.getOrderTicketsId(), orderInfo.getChangeDate(), orderInfo.getChangeDate()
});
sqlsDataB.add(new Object[]{
entitiesTable.getIsPayment(), entitiesTable.getUpdatedAt(), orderEntitiesId, orderInfo.getChangeDate(), orderInfo.getChangeDate()
});
sqlsDataC.add(new Object[]{
kylinOrderRefunds.getOrderRefundsId(), kylinOrderRefunds.getOrderTicketsId(), kylinOrderRefunds.getOrderRefundCode(),
kylinOrderRefunds.getPrice(), kylinOrderRefunds.getPriceExpress(), kylinOrderRefunds.getStatus(),
kylinOrderRefunds.getType(), kylinOrderRefunds.getApplicantId(), kylinOrderRefunds.getApplicantName(),
kylinOrderRefunds.getApplicantAt(), kylinOrderRefunds.getReason(),
kylinOrderRefunds.getRefundCate(), kylinOrderRefunds.getCreatedAt()
});
sqlsDataD.add(new Object[]{
kylinOrderRefundEntities.getOrderRefundsEntitiesId(), kylinOrderRefundEntities.getOrderRefundsId(), kylinOrderRefundEntities.getRefundPrice(),
kylinOrderRefundEntities.getOrderTicketEntitiesId(), kylinOrderRefundEntities.getCreatedAt()
});
sqlsDataE.add(new Object[]{
orderRefundPic.getOrderRefundsId(), orderRefundPic.getOrderRefundsId(), orderRefundPic.getPicUrl(), orderRefundPic.getCreatedAt()
});
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL_ORDER_PAY, MQConst.ROUTING_KEY_SQL_ORDER_PAY,
SqlMapping.gets(sqls, sqlsDataA, sqlsDataB, sqlsDataC, sqlsDataD, sqlsDataE));
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}
......@@ -404,6 +404,7 @@ public class KylinPerformancesPartnerServiceImpl extends ServiceImpl<KylinPerfor
inventory.setIsElectronic(ticketItem.getIsElectronic());
inventory.setCounts(ticketItem.getCounts());
inventory.setIsShowCode(ticketItem.getIsShowCode());
inventory.setQrCodeShowTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(ticketItem.getQrCodeShowTime()));
//修改 mysql 售卖时间
KylinTickets ticketSellTime = new KylinTickets();
......
......@@ -379,6 +379,7 @@ public class PerformanceVoTask {
}
// 判断是否需要审核
public boolean judgeIsAudit(String performanceId) {
KylinPerformanceMisVo misVo = getPerformanceMisVo(performanceId);
KylinPerformanceVo mongoVo = mongoVoUtils.combinePerformanceVoData(performanceId);
......@@ -432,10 +433,12 @@ public class PerformanceVoTask {
if (!ticketVo.getTitle().equals(ticketPartnerVo.getTitle())) {
log.debug("NEED CHANGE TICKET TITLE");
return true;
} else if (!ticketVo.getQrCodeShowTime().equals(ticketPartnerVo.getQrCodeShowTime())) {
log.debug("NEED CHANGE TICKET QRCODESHOWTIME");
return true;
} else if (!ticketVo.getDescribeElectronic().equals(ticketPartnerVo.getDescribeElectronic())) {
}
// else if (!ticketVo.getQrCodeShowTime().equals(ticketPartnerVo.getQrCodeShowTime())) {
// log.debug("NEED CHANGE TICKET QRCODESHOWTIME");
// return true;
// }
else if (!ticketVo.getDescribeElectronic().equals(ticketPartnerVo.getDescribeElectronic())) {
log.debug("NEED CHANGE TICKET DESCRIBEELECTRONIC");
return true;
} else if (!ticketVo.getDescribeExpress().equals(ticketPartnerVo.getDescribeExpress())) {
......
......@@ -21,6 +21,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
......@@ -38,8 +39,6 @@ public class DataUtils {
@Autowired
private MongoVoUtils mongoVoUtils;
@Autowired
private DataUtils dataUtils;
@Autowired
private RedisTemplate redisTemplate;
/**
......@@ -290,7 +289,6 @@ public class DataUtils {
KylinPerformanceVo vo = getPerformanceVo(performanceId);
int isTrueName = vo.getIsTrueName();
int ticketType = 0;
String useTime = "";
HashMap<String, ArrayList<String>> allTicketId = new HashMap<>();
for (int x = 0; x < vo.getTicketTimeList().size(); x++) {
......@@ -303,7 +301,6 @@ public class DataUtils {
}
if (ticketItem.getTicketsId().equals(ticketId)) {
useTime = ticketItem.getUseStart();
ticketType = ticketItem.getType();
}
}
allTicketId.put(timeItem.getUseStart(), ticketList);
......@@ -339,61 +336,6 @@ public class DataUtils {
} catch (Exception e) {
return 0;
}
// if (buyCount > 0) {
// redisUtil.incr(ticketIdKey, buyCount);
// if (1 == ticketType) {
// int count = 0;
// for (int i = 0; i < allTicketId.get(useTime).size(); i++) {
// String item = allTicketId.get(useTime).get(i);
// if (allTicketId.get(useTime).size() == 1) {
// redisUtil.incr(performanceIdKey, buyCount);
// break;
// }
// if (null == redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item)) {
// redisUtil.set(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item, 0);
// }
// if (i == 0) {
// count = (int) redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item);
// } else {
// if (count != (int) redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item)) {
// redisUtil.incr(performanceIdKey, buyCount);
// break;
// }
// }
// }
// } else {
// System.out.println("BUY_COUNT = "+buyCount);
// redisUtil.incr(performanceIdKey, buyCount);
// for (int i = 0; i < allTicketId.get(useTime).size(); i++) {
// String item = allTicketId.get(useTime).get(i);
// redisUtil.set(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item, 0);
// }
// }
// } else {
// redisUtil.decr(ticketIdKey, Math.abs(buyCount));
// if (1 == ticketType) {
// int count = 0;
// for (int i = 0; i < allTicketId.get(useTime).size(); i++) {
// String item = allTicketId.get(useTime).get(i);
// if (allTicketId.get(useTime).size() == 1) {
// redisUtil.decr(performanceIdKey, Math.abs(buyCount));
// break;
// }
// if (null == redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item)) {
// redisUtil.set(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item, 0);
// }
// if (i == 0) {
// count = (int) redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item);
// } else {
// if (count != (int) redisUtil.get(redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + item)) {
// redisUtil.decr(performanceIdKey, Math.abs(buyCount));
// break;
// }
// }
// }
// } else {
// redisUtil.decr(performanceIdKey, Math.abs(buyCount));
// }
}
// 获取 用户维度 票种购买数量
......@@ -423,15 +365,6 @@ public class DataUtils {
}
}
// 获取 证件维度 票种适用时间
public String getIdCardTUseTime(String idCard, String ticketId) {
try {
return (String) redisUtil.get(KylinRedisConst.USERID_BUY_INFO + idCard + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId + ":" + KylinRedisConst.USE_TIME);
} catch (Exception e) {
return "";
}
}
/**
* 删除订单redis
*
......@@ -653,4 +586,74 @@ public class DataUtils {
return query;
}
public KylinOrderRefundsVoBase getOrderRefundVo(String orderRefundsId){
if (redisUtil.hasKey(KylinRedisConst.ORDER_REFUND + orderRefundsId)) {
} else {
KylinOrderRefundsVoBase orderRefundsVo = mongoTemplate.findOne(Query.query(Criteria.where("orderRefundsId").is(orderRefundsId)), KylinOrderRefundsVoBase.class, KylinOrderRefundsVoBase.class.getSimpleName());
List<KylinOrderRefundEntitiesVo> kylinOrderTicketEntitiesVoList = mongoTemplate.find(Query.query(Criteria.where("orderRefundsId").is(orderRefundsId)), KylinOrderRefundEntitiesVo.class, KylinOrderRefundEntitiesVo.class.getSimpleName());
List<KylinOrderRefundPicVo> picVos = mongoTemplate.find(Query.query(Criteria.where("orderRefundsId").is(orderRefundsId)),KylinOrderRefundPicVo.class,KylinOrderRefundPicVo.class.getSimpleName());
orderRefundsVo.setOrderRefundEntitiesVoList(kylinOrderTicketEntitiesVoList);
orderRefundsVo.setOrderRefundPicVos(picVos);
redisUtil.set(KylinRedisConst.ORDER_REFUND + orderRefundsId, orderRefundsVo);
}
return (KylinOrderRefundsVoBase) redisUtil.get(KylinRedisConst.ORDER_REFUND + orderRefundsId);
}
public List<KylinOrderRefundsVoBase> getOrderRefundVoByOrderId(String orderId){
if (redisUtil.hasKey(KylinRedisConst.ORDER_REFUND_BY_ORDER_ID + orderId)) {
} else {
List<KylinOrderRefundsVoBase> orderRefundsVoList = new ArrayList<>();
List<KylinOrderRefundsVoBase> data = mongoTemplate.find(Query.query(Criteria.where("orderTicketsId").is(orderId)), KylinOrderRefundsVoBase.class, KylinOrderRefundsVoBase.class.getSimpleName());
for (KylinOrderRefundsVoBase item : data) {
List<KylinOrderRefundEntitiesVo> kylinOrderTicketEntitiesVoList = mongoTemplate.find(Query.query(Criteria.where("orderRefundsId").is(item.getOrderRefundsId())), KylinOrderRefundEntitiesVo.class, KylinOrderRefundEntitiesVo.class.getSimpleName());
if(kylinOrderTicketEntitiesVoList.size()>1){
continue;
}
item.setOrderRefundEntitiesVoList(kylinOrderTicketEntitiesVoList);
List<KylinOrderRefundPicVo> picVos = mongoTemplate.find(Query.query(Criteria.where("orderRefundsId").is(item.getOrderRefundsId())),KylinOrderRefundPicVo.class,KylinOrderRefundPicVo.class.getSimpleName());
item.setOrderRefundPicVos(picVos);
orderRefundsVoList.add(item);
}
redisUtil.set(KylinRedisConst.ORDER_REFUND_BY_ORDER_ID + orderId, orderRefundsVoList);
}
return (List<KylinOrderRefundsVoBase>) redisUtil.get(KylinRedisConst.ORDER_REFUND_BY_ORDER_ID + orderId);
}
/**
* 获取可退款票单价格
* @param orderTicketVo 订单vo数据
* @param orderTicketEntitiesId 票单id
* @return
*/
public BigDecimal getCanRefundOrderEntitiesPrice(KylinOrderTicketVo orderTicketVo, List<KylinOrderRefundsVoBase> kylinOrderRefundsVoBaseList, String orderTicketEntitiesId){
//单票实付价格
BigDecimal singlePrice = orderTicketVo.getPriceActual().subtract(orderTicketVo.getPriceExpress()).divide(BigDecimal.valueOf(orderTicketVo.getNumber()));
//单票剩余未退款金额
BigDecimal canRefundSinglePrice = new BigDecimal("0.00");
for (KylinOrderTicketEntitiesVo item : orderTicketVo.getEntitiesVoList()) {
if (item.getOrderTicketEntitiesId().equals(orderTicketEntitiesId)) {
canRefundSinglePrice = singlePrice.subtract(item.getRefundPrice());
}
}
//订单锁定金额
BigDecimal orderLockPrice = new BigDecimal("0.00");
for (KylinOrderRefundsVoBase refundVo : kylinOrderRefundsVoBaseList) {
int status = refundVo.getStatus();
if (status == 0 || status == 3 || status == 5 || status == 7) { //退款流程未完成 金额锁定
List<KylinOrderRefundEntitiesVo> refundEntitiesVos = refundVo.getOrderRefundEntitiesVoList();
for (KylinOrderRefundEntitiesVo refundEntitiesVo : refundEntitiesVos) {
if (refundEntitiesVo.getOrderTicketEntitiesId().equals(orderTicketEntitiesId)) {
orderLockPrice = orderLockPrice.add(refundEntitiesVo.getRefundPrice());
}
}
}
}
//订单可退金额
BigDecimal refundSinglePrice = canRefundSinglePrice.subtract(orderLockPrice);
//是否包含快递费
if (orderTicketVo.getPriceActual().subtract(orderTicketVo.getPriceExpress()).subtract(orderTicketVo.getPriceRefund()).compareTo(canRefundSinglePrice) == 0) {
refundSinglePrice = refundSinglePrice.add(orderTicketVo.getPriceExpress());
}
return refundSinglePrice;
}
}
......@@ -22,6 +22,7 @@
20016=库存不足
20017=年龄不符合
20018=下单失败
20019=申请失败
#APP PARTNER
20101=添加失败
......
......@@ -31,3 +31,11 @@ kylin_order_ticket_status.close=UPDATE kylin_order_ticket_status SET `status` =
kylin_order_ticket_relation.close=UPDATE kylin_order_ticket_relations SET updated_at = ? WHERE order_id = ?
# ------------------------用户发起订单退款----------------------------
kylin_order_ticket_status.refund=UPDATE kylin_order_ticket_status SET status = ? ,updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?)
kylin_order_ticket_entities.refund=UPDATE kylin_order_ticket_entities SET is_payment = ? ,updated_at = ? WHERE order_ticket_entities_id = ? and (updated_at <= ? or created_at = ?)
kylin_order_refund.refund=INSERT INTO kylin_order_refunds (order_refunds_id,order_tickets_id,order_refund_code,price,price_express,status,type,applicant_id,applicant_name,applicant_at,reason,refund_cate,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)
kylin_order_refund_entities.refund=INSERT INTO kylin_order_refund_entities (order_refunds_entities_id,order_refunds_id,refund_price,order_ticket_entities_id,created_at) VALUES(?,?,?,?,?)
kylin_order_refund_pic.refund=INSERT INTO kylin_order_refund_pic (refund_pic_id,order_refunds_id,pic_url,created_at) VALUES (?,?,?,?)
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