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

Commit 7c02bbe6 authored by jiangxiulong's avatar jiangxiulong

copy first

parent c0a15062
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "GoblinNtfPayResultVo", description = "下单唤起支付参数信息")
@Data
public class GoblinNtfPayResultVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(position = 14, value = "状态")
private Integer status;
@ApiModelProperty(position = 15, value = "订单ID")
private String orderId;
@ApiModelProperty(position = 11, value = "code")
private String code;
@ApiModelProperty(position = 12, value = "orderCode")
private String orderCode;
@ApiModelProperty(position = 13, value = "orderMasterCode")
private String orderMasterCode;
@ApiModelProperty(position = 19, value = "金额")
private BigDecimal price;
@ApiModelProperty(position = 16, value = "支付类型")
private String payType;
@ApiModelProperty(position = 17, value = "showUrl")
private String showUrl;
@ApiModelProperty(position = 18, value = "returnUrl")
private String returnUrl;
@ApiModelProperty(position = 20, value = "payData")
private Object payData;
private static final GoblinNtfPayResultVo obj = new GoblinNtfPayResultVo();
public static GoblinNtfPayResultVo getNew() {
try {
return (GoblinNtfPayResultVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNtfPayResultVo();
}
}
}
package com.liquidnet.service.goblin.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@ApiModel(value = "GoblinNtfOrderPayAgainParam", description = "再次支付所需参数")
@Data
public class GoblinNtfOrderPayAgainParam {
@ApiModelProperty(value = "openId")
private String openId;
@ApiModelProperty(value = "订单id")
@NotNull(message = "订单ID不能为空")
private String orderId;
@ApiModelProperty(value = "支付类型")
@NotNull(message = "支付类型不能为空")
private String payType;
@ApiModelProperty(value = "支付来源")
@NotNull(message = "支付来源不能为空")
private String deviceFrom;
@ApiModelProperty(value = "showUrl")
private String showUrl;
@ApiModelProperty(value = "returnUrl")
private String returnUrl;
}
package com.liquidnet.service.goblin.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@ApiModel(value = "GoblinNtfOrderPayCallbackParam", description = "支付成功回调所需参数")
@Data
public class GoblinNtfOrderPayCallbackParam implements Cloneable {
@ApiModelProperty(value = "支付状态[1-成功|0-失败]")
private Integer status;
@ApiModelProperty(value = "订单ID")
private String orderId;
@ApiModelProperty(value = "masterOrderCode")
private String orderCode;
@ApiModelProperty(value = "不用管")
private String orderCodeId;
@ApiModelProperty(value = "[写死]HUIFU_PAY_CODE")
private String code;
@ApiModelProperty(value = "不用管")
private BigDecimal price;
@ApiModelProperty(value = "不用管")
private String type;
@ApiModelProperty(value = "汇付相关id")
private String paymentId;
@ApiModelProperty(value = "[写死]huifu")
private String paymentType;
@ApiModelProperty(value = "支付时间")
private String paymentAt;
private static final GoblinNtfOrderPayCallbackParam obj = new GoblinNtfOrderPayCallbackParam();
public static GoblinNtfOrderPayCallbackParam getNew() {
try {
return (GoblinNtfOrderPayCallbackParam) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinNtfOrderPayCallbackParam();
}
}
}
package com.liquidnet.service.goblin.param;
import com.liquidnet.service.goblin.dto.manage.AddressVo;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderStoreParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@ApiModel(value = "GoblinNtfOrderPayParam", description = "下单所需参数")
@Data
public class GoblinNtfOrderPayParam {
@ApiModelProperty(value = "openId")
private String openId;
@ApiModelProperty(value = "用户id")
private String uid;
@ApiModelProperty(value = "扫码枪code")
private String authCode;
@ApiModelProperty(value = "支付类型")
@NotNull(message = "支付类型不能为空")
private String payType;
@ApiModelProperty(value = "支付来源 [新增micropay-微信扫码支付]")
@NotNull(message = "支付来源不能为空")
private String deviceFrom;
@ApiModelProperty(value = "代理id")
private String agentId;
@ApiModelProperty(value = "收货地址id[虚拟物品不需要]")
private ArrayList<String> addressIds;
@ApiModelProperty(value = "入场人地址vo")
private AddressVo addressesVo;
@ApiModelProperty(value = "showUrl")
private String showUrl;
@ApiModelProperty(value = "returnUrl")
private String returnUrl;
@ApiModelProperty(value = "商品相关参数集合")
private List<GoblinOrderStoreParam> goblinOrderStoreParamList;
}
package com.liquidnet.service.goblin.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* <p>
* 退款回掉参数
* </p>
*
* @author jiangxiulong
* @since 2021-05-31 11:19 上午
*/
@ApiModel(value = "GoblinNtfOrderRefundCallbackParam", description = "退款回调所需参数")
@Data
public class GoblinNtfOrderRefundCallbackParam implements Serializable {
@ApiModelProperty(value = "状态 1成功 0失败")
private Integer status;
@ApiModelProperty(value = "退款金额")
private BigDecimal refundPrice;
@ApiModelProperty(value = "PAY")
private String refundCode;
@ApiModelProperty(value = "业务方自己生成的退款标识 比如订单ID加000")
private String orderRefundCode;
@ApiModelProperty(value = "refundId")
private String refundId;
@ApiModelProperty(value = "refundType")
private String refundType;
@ApiModelProperty(value = "退款时间")
private String refundAt;
@ApiModelProperty(value = "退款失败错误信息")
private String refundError;
}
package com.liquidnet.service.goblin.service; package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinNtfPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderRefundCallbackParam;
/** /**
* <p> * <p>
* NFT订单表 服务类 * NFT订单表 服务类
...@@ -9,5 +16,13 @@ package com.liquidnet.service.goblin.service; ...@@ -9,5 +16,13 @@ package com.liquidnet.service.goblin.service;
* @since 2022-03-23 * @since 2022-03-23
*/ */
public interface IGoblinNftOrderService { public interface IGoblinNftOrderService {
ResponseDto<GoblinNtfPayResultVo> checkOrder(GoblinNtfOrderPayParam param, String uid);
ResponseDto<GoblinNtfPayResultVo> payAgain(GoblinNtfOrderPayAgainParam param);
ResponseDto<Integer> checkOrderResult(String orderId);
String syncOrder(GoblinNtfOrderPayCallbackParam syncOrderParam);
String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam);
} }
package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.service.goblin.service.IGoblinNftOrderRefundService;
import org.springframework.stereotype.Service;
/**
* <p>
* NFT订单退款表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2022-03-23
*/
@Service
public class GoblinNftOrderRefundServiceImpl implements IGoblinNftOrderRefundService {
}
package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import org.springframework.stereotype.Service;
/**
* <p>
* NFT订单表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2022-03-23
*/
@Service
public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
package com.liquidnet.service.order.controller;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.vo.GoblinNtfPayResultVo;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNtfOrderRefundCallbackParam;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Api(tags = "NFT-支付相关")
@RestController
@RequestMapping("/goblin/nft")
public class GoblinNftOrderController {
@Autowired
IGoblinNftOrderService iGoblinNftOrderService;
@PostMapping("pre")
@ApiOperation("下单(加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> checkOrder(@RequestBody EncryptedReq<GoblinNtfOrderPayParam> param) {
GoblinNtfOrderPayParam payOrderParam = param.getData();
String uid = CurrentUtil.getCurrentUid();
return iGoblinNftOrderService.checkOrder(payOrderParam, uid);
}
@PostMapping("fc7bce6d6c2213b866f76493f92224b8")
@ApiOperation("下单(非加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> checkOrder(@RequestBody GoblinNtfOrderPayParam param) {
String uid = CurrentUtil.getCurrentUid();
return iGoblinNftOrderService.checkOrder(param, uid);
}
@PostMapping("payAgain")
@ApiOperation("再次支付")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNtfPayResultVo> payAgain(@RequestBody @Valid GoblinNtfOrderPayAgainParam param) {
return iGoblinNftOrderService.payAgain(param);
}
@PostMapping("checkPayment")
@ApiOperation("订单状态")
@ApiResponse(code = 200, message = "接口返回对象参数")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单id", example = "1"),
})
public ResponseDto<Integer> checkOrderResult(@RequestParam("orderId") @Valid String orderId) {
return iGoblinNftOrderService.checkOrderResult(orderId);
}
@PostMapping("syncOrder")
@ApiOperation("支付回调")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String syncOrder(@ModelAttribute @Valid GoblinNtfOrderPayCallbackParam syncOrderParam) {
return iGoblinNftOrderService.syncOrder(syncOrderParam);
}
@ApiOperation(value = "退款回调")
@PostMapping(value = "refundSyncOrder")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam) {
return iGoblinNftOrderService.refundSyncOrder(refundCallbackParam);
}
}
package com.liquidnet.service.order.service.impl;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.UserPathDto;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.AddressVo;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderSkuParam;
import com.liquidnet.service.goblin.dto.manage.GoblinOrderStoreParam;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinOrderAttr;
import com.liquidnet.service.goblin.entity.GoblinOrderSku;
import com.liquidnet.service.goblin.entity.GoblinStoreOrder;
import com.liquidnet.service.goblin.param.*;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import com.liquidnet.service.order.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS;
import static com.liquidnet.commons.lang.util.DateUtil.getNowTime;
@Service
@Slf4j
public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
@Autowired
GoblinRedisUtils redisUtils;
@Autowired
GoblinMongoUtils mongoUtils;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinOrderUtils orderUtils;
@Autowired
GoblinNtfOrderUtils ntfOrderUtils;
@Value("${liquidnet.service.order.url-pay.pay}")
private String payUrl;
@Value("${liquidnet.service.order.url-pay.check}")
private String checkUrl;
@Value("${liquidnet.service.order.url-pay.goblinUrl}")
private String synUrl;
@Override
public ResponseDto<GoblinNtfPayResultVo> checkOrder(GoblinNtfOrderPayParam param, String uid) {
List<String> skuAndPreListAndNumber = CollectionUtil.arrayListString();
List<String> platformCodeList = CollectionUtil.arrayListString();
List<String> storeCodeList = CollectionUtil.arrayListString();
List<GoblinOrderSqlParam> orderSqlParams = ObjectUtil.getGoblinOrderSqlParamArrayListList();
String orderMasterCode = IDGenerator.storeMasterCode();//总订单id
GoblinOrderPreParam preParam = GoblinOrderPreParam.getNew();
preParam.setAuthCode(param.getAuthCode());
preParam.setPayType(param.getPayType());
preParam.setDeviceFrom(param.getDeviceFrom());
preParam.setOpenId(param.getOpenId());
preParam.setReturnUrl(param.getReturnUrl());
preParam.setShowUrl(param.getShowUrl());
preParam.setOrderMasterCode(orderMasterCode);
preParam.setExpireTime(5);
preParam.setPriceActual(BigDecimal.ZERO);
preParam.setStoreName("");
preParam.setSkuName("");
preParam.setOrderIdList("");
try {
List<GoblinOrderStoreParam> goblinOrderStoreParamList = param.getGoblinOrderStoreParamList();//分订单
boolean isMember;
AddressVo addressesVo = null;
if (orderUtils.noZhengzaiOrder(uid)) {
addressesVo = param.getAddressesVo();
if (orderUtils.getMember(uid) != null) {
isMember = true;
} else {
isMember = false;
}
} else {
isMember = false;
}
for (GoblinOrderStoreParam storeParam : goblinOrderStoreParamList) {//商铺维度循环
String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId);
for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {//商品维度循环
String skuId = skuParam.getSkuId();
int number = skuParam.getNumber();
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
int surplusGeneral = redisUtils.decrSkuStock(pre, skuId, number);
skuAndPreListAndNumber.add(skuId + "," + pre + "," + number);
//库存回滚
if (surplusGeneral < 0) {
return ntfOrderUtils.orderException(skuAndPreListAndNumber, platformCodeList, storeCodeList, uid, "库存不足");
// throw new Exception("库存不足");
}
}//GoblinOrderSkuParam
//下单
GoblinOrderPreParam pre = order(param, storeParam, uid, isMember, addressesVo, orderMasterCode, orderId, orderCode, platformCodeList, storeCodeList);
preParam.setPriceActual(preParam.getPriceActual().add(pre.getPriceActual()));
preParam.setStoreName(pre.getStoreName() + "," + preParam.getStoreName());
preParam.setSkuName(preParam.getSkuName() + "," + pre.getSkuName());
preParam.setOrderIdList(preParam.getOrderIdList() + "," + pre.getOrderIdList());
preParam.setPlatformSpuIds(pre.getPlatformSpuIds());
preParam.setStoreSpuIds(pre.getStoreSpuIds());
GoblinOrderSqlParam sqlParam = GoblinOrderSqlParam.getNew();
sqlParam.setStoreOrder(pre.getStoreOrder());
sqlParam.setOrderAttr(pre.getOrderAttr());
sqlParam.setOrderSkuList(pre.getOrderSkuList());
orderSqlParams.add(sqlParam);
}//GoblinOrderStoreParam
if (preParam.getOrderIdList().equals("")) {
return ntfOrderUtils.orderException(skuAndPreListAndNumber, platformCodeList, storeCodeList, uid, "参数异常");
// throw new Exception("参数异常");
}
return payOrder(preParam, orderSqlParams, uid);
} catch (Exception e) {
log.error("Kylin Order Pay Error = {}", e);
Long time3 = System.currentTimeMillis();
//回顾限购 回滚库存
for (String item : skuAndPreListAndNumber) {
String[] array = item.split(",");
String skuId = array[0];
String pre = array[1];
int number = Integer.parseInt(array[2]);
redisUtils.incrSkuStock(pre, skuId, number);
if (orderUtils.noZhengzaiOrder(uid)) {
redisUtils.decrSkuCountByUid(uid, skuId, number);
}
}
//回退平台券
for (String platformCode : platformCodeList) {
orderUtils.backCoupon(platformCode, uid);
}
//回退店铺券
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
for (String storeCode : storeCodeList) {
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(storeCode);
backCouponParam.setUid(uid);
params.add(backCouponParam);
}
if (params.size() > 0) {
orderUtils.backStoreCoupon(params);
}
if (e.getMessage() == null) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else if (e.getMessage().equals("平台券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("无权购买")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("平台券店铺券不可一起使用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("平台券店铺券不可一起使用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("跨店铺购物平台券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("店铺券不可用")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("不可购买")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("参数异常")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("库存不足")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("已超出限购数量")) {
return ResponseDto.failure(e.getMessage());
} else if (e.getMessage().equals("非法参数")) {
return ResponseDto.failure(e.getMessage());
} else {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
}
}
}
private GoblinOrderPreParam order(GoblinNtfOrderPayParam param, GoblinOrderStoreParam storeParam, String uid, boolean isMember, AddressVo addressesVo, String orderMasterCode, String orderId, String orderCode, List<String> platformCodeList, List<String> storeCodeList) throws Exception {
String platVoucherCode = storeParam.getPlatVoucherCode();
String storeVoucherCode = storeParam.getStoreVoucherCode();
String storeId = storeParam.getStoreId();
Map token = CurrentUtil.getTokenClaims();
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String source = headerCliSource == null ? "" : headerCliSource;
String version = headerCliVersion == null ? "" : headerCliVersion;
LocalDateTime now = LocalDateTime.now();
String skuName = "";
BigDecimal price;//sku应付价格
BigDecimal priceBase;//sku原价
BigDecimal storeTotalPrice = BigDecimal.ZERO;//订单总金额
String writeOffCode = ""; //取货码
List<GoblinOrderSku> goblinOrderSkuList = ObjectUtil.getGoblinOrderSkuArrayList();
List<String> storeSpuIds = CollectionUtil.linkedListString();
List<String> platformSpuIds = CollectionUtil.linkedListString();
String marketId = "";
String marketType = "";
for (GoblinOrderSkuParam skuParam : storeParam.getGoblinOrderSkuParamArrayList()) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuParam.getSkuId());
GoblinGoodsSkuInfoVo skuVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId());
GoblinGoodsInfoVo spuVo = redisUtils.getGoodsInfoVo(skuParam.getSpuId());
if (!spuVo.getStoreId().equals(storeParam.getStoreId()) || !skuVo.getStoreId().equals(storeParam.getStoreId())) {
throw new Exception("非法参数");
}
if (!(skuVo.getStatus().equals("3") && skuVo.getShelvesStatus().equals("3")) || skuVo.getDelFlg().equals("1")) {
throw new Exception("不可购买");
}
// 判断库存
int limitCount = skuVo.getBuyLimit() == 0 ? Integer.MAX_VALUE : skuVo.getBuyLimit();
//判断限购
if (orderUtils.noZhengzaiOrder(uid)) {
String res1 = orderUtils.judgeOrderLimit(uid, skuParam.getSkuId(), skuParam.getNumber(), limitCount);
if (!res1.equals("")) {
throw new Exception("已超出限购数量");
}
//权限限购
Boolean res2 = orderUtils.judgeOrderRose(isMember, skuParam.getSkuId(), StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get("mobile")), ""), Integer.parseInt(skuVo.getBuyFactor()));
if (!res2) {
throw new Exception("无权购买");
}
}
marketId = spuVo.getMarketId();
marketType = pre;
skuName = skuName.concat(skuVo.getName()).concat(",");
if (pre != null && pre.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
writeOffCode = "EMPTY";
}
//获得 活动原价
price = skuVo.getPrice();
if (isMember) {
price = skuVo.getPriceMember();
}
//活动价格
// if (pre != null) {
// GoblinGoodsSkuInfoVo skuMarketVo = redisUtils.getGoodsSkuInfoVo(skuParam.getSkuId().split(pre)[0]);
// priceBase = skuMarketVo.getPrice();
// if (isMember) {
// priceBase = skuMarketVo.getPriceMember();
// }
// } else {
priceBase = skuVo.getPrice();
if (isMember) {
priceBase = skuVo.getPriceMember();
}
// }
//todo
//获得活动优惠价格
// priceBase = priceBase.multiply(BigDecimal.valueOf(skuParam.getNumber()));
price = price.multiply(BigDecimal.valueOf(skuParam.getNumber()));
storeTotalPrice = storeTotalPrice.add(price);
//订单sku
GoblinOrderSku orderSku = GoblinOrderSku.getNew();
orderSku.setOrderSkuId(IDGenerator.nextTimeId2());
orderSku.setOrderId(orderId);
orderSku.setStatus(GoblinStatusConst.Status.ORDER_STATUS_0.getValue());
orderSku.setSpuId(skuParam.getSpuId());
orderSku.setSpuName(spuVo.getName());
orderSku.setSkuId(skuParam.getSkuId());
orderSku.setNum(skuParam.getNumber());
orderSku.setSkuPrice(priceBase);
orderSku.setSkuPriceActual(price);
orderSku.setSkuName(skuVo.getName());
orderSku.setSkuNo(skuVo.getSkuNo());
orderSku.setSkuImage(skuVo.getSkuPic());
orderSku.setSkuSpecs(JSON.toJSONString(skuVo.getSkuSpecList()));
orderSku.setPriceVoucher(BigDecimal.ZERO);
// orderSku.setPriceVoucher(priceBase.subtract(price));
orderSku.setCreatedAt(now);
orderSku.setSpuName(spuVo.getName());
orderSku.setSpuPic(spuVo.getCoverPic());
goblinOrderSkuList.add(orderSku);
}
if ((platVoucherCode != null && !platVoucherCode.equals("")) && (storeVoucherCode != null && !storeVoucherCode.equals(""))) {
throw new Exception("平台券店铺券不可一起使用");
}
if (param.getGoblinOrderStoreParamList().size() > 1 && (platVoucherCode != null && !platVoucherCode.equals(""))) {
throw new Exception("跨店铺购物平台券不可用");
}
//优惠券
BigDecimal voucherPrice = BigDecimal.ZERO;
if (platVoucherCode != null && !platVoucherCode.equals("")) {
String spuIds = "";
for (GoblinOrderSkuParam item : storeParam.getGoblinOrderSkuParamArrayList()) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(item.getSpuId());
if (pre != null) {
spuIds = spuIds.concat(item.getSpuId().split(pre)[0] + ",");
} else {
spuIds = spuIds.concat(item.getSpuId() + ",");
}
}
HashMap<String, Object> hashMap = orderUtils.useCoupon(platVoucherCode, "购买商品[" + orderCode + "]", storeTotalPrice, spuIds, uid, goblinOrderSkuList);
if (hashMap != null) {
voucherPrice = (BigDecimal) hashMap.get("voucher");
Integer typeVoucher = (Integer) hashMap.get("type");
if (typeVoucher.equals(-1)) {
throw new Exception("平台券不可用");
} else {
platformCodeList.add(platVoucherCode);
platformSpuIds = (List<String>) hashMap.get("spuIds");
}
}
}
//商铺券
BigDecimal storeVoucherPrice = BigDecimal.ZERO;
if (storeVoucherCode != null && !storeVoucherCode.equals("")) {
GoblinUseResultVo storeCouponVo = orderUtils.useStoreCoupon(storeVoucherCode, "购买商品[" + orderCode + "]", storeTotalPrice, goblinOrderSkuList, uid);
String typeVoucher;
if (storeCouponVo != null) {
storeVoucherPrice = storeCouponVo.getValue();
typeVoucher = storeCouponVo.getCouType();
if (typeVoucher.equals("-1")) {
throw new Exception("店铺券不可用");
} else {
storeCodeList.add(storeVoucherCode);
storeSpuIds = storeCouponVo.getSpuIds();
}
}
}
GoblinStoreInfoVo storeInfoVo = redisUtils.getStoreInfoVo(storeId);
//生成订单
GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew();
storeOrder.setMasterOrderCode(orderMasterCode);
storeOrder.setOrderId(orderId);
storeOrder.setStoreId(storeId);
storeOrder.setStoreName(storeInfoVo.getStoreName());
storeOrder.setOrderCode(orderCode);
storeOrder.setUserId(uid);
storeOrder.setUserName(StringUtils.defaultString(((String) token.get("nickname")), ""));
storeOrder.setUserMobile(StringUtils.defaultString(((String) token.get("mobile")), ""));
if (addressesVo == null) {
storeOrder.setPriceExpress(BigDecimal.ZERO);
} else {
storeOrder.setPriceExpress(BigDecimal.TEN);
}
storeOrder.setPriceTotal(storeTotalPrice.add(storeOrder.getPriceExpress()));
BigDecimal priceActual = storeOrder.getPriceTotal().subtract(voucherPrice).subtract(storeVoucherPrice);
if (priceActual.compareTo(storeOrder.getPriceExpress()) < 0) {
priceActual = storeOrder.getPriceExpress();
}
storeOrder.setPriceActual(priceActual.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : priceActual);
storeOrder.setPriceRefund(BigDecimal.ZERO);
storeOrder.setPriceCoupon(voucherPrice);
storeOrder.setStorePriceCoupon(storeVoucherPrice);
storeOrder.setPriceVoucher(voucherPrice.add(storeVoucherPrice));
storeOrder.setStatus(0);
storeOrder.setUcouponId(platVoucherCode);
storeOrder.setStoreCouponId(storeVoucherCode);
storeOrder.setPayType(param.getPayType());
storeOrder.setDeviceFrom(param.getDeviceFrom());
storeOrder.setSource(source);
storeOrder.setVersion(version);
storeOrder.setIsMember(isMember ? 1 : 0);
storeOrder.setOrderType(0);
storeOrder.setWriteOffCode(writeOffCode);
if (marketType != null && marketType.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
storeOrder.setPayCountdownMinute(1);
} else {
storeOrder.setPayCountdownMinute(5);
}
storeOrder.setIpAddress(CurrentUtil.getCliIpAddr());
storeOrder.setCreatedAt(now);
storeOrder.setMarketId(marketId);
storeOrder.setMarketType(marketType);
//订单attr
GoblinOrderAttr orderAttr = GoblinOrderAttr.getNew();
orderAttr.setOrderAttrId(IDGenerator.nextTimeId2());
orderAttr.setOrderId(orderId);
if (!writeOffCode.equals("EMPTY")) {
orderAttr.setExpressContacts(addressesVo.getName());
orderAttr.setExpressAddress(addressesVo.getProvince() + "," + addressesVo.getCounty() + "," + addressesVo.getCity());
orderAttr.setExpressAddressDetail(addressesVo.getAddress());
orderAttr.setExpressPhone(addressesVo.getPhone());
orderAttr.setExpressType(1);
orderAttr.setCreatedAt(now);
}
//返回值
GoblinOrderPreParam preParam = GoblinOrderPreParam.getNew();
preParam.setPriceActual(storeOrder.getPriceActual());
preParam.setStoreName(storeInfoVo.getStoreName());
preParam.setSkuName(skuName);
preParam.setOrderIdList(storeOrder.getOrderId());
preParam.setStoreOrder(storeOrder);
preParam.setOrderAttr(orderAttr);
preParam.setOrderSkuList(goblinOrderSkuList);
preParam.setStoreSpuIds(storeSpuIds);
preParam.setPlatformSpuIds(platformSpuIds);
return preParam;
}
private ResponseDto<GoblinNtfPayResultVo> payOrder(GoblinOrderPreParam preParam, List<GoblinOrderSqlParam> sqlParams, String uid) {
//是否免费
boolean isFree = false;
GoblinNtfPayResultVo ntfPayResultVo;
String payCode;
if (preParam.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0 && !preParam.getPayType().equals("huifu")) {
// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "PRODUCT");
httpData.add("price", preParam.getPriceActual().toString());
// httpData.add("price","0.01");
httpData.add("name", preParam.getStoreName());
httpData.add("detail", preParam.getSkuName());
httpData.add("orderCode", preParam.getOrderMasterCode());
httpData.add("orderId", preParam.getOrderIdList().substring(1));
httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("expireTime", preParam.getExpireTime() + "");
httpData.add("payType", preParam.getPayType());
httpData.add("deviceFrom", preParam.getDeviceFrom());
if (preParam.getDeviceFrom().equals("micropay")) {
httpData.add("authCode", preParam.getAuthCode());
}
if (preParam.getDeviceFrom().equals("js") || preParam.getDeviceFrom().equals("applet")) {
httpData.add("openId", preParam.getOpenId());
}
// if (preParam.getPayType().equals("alipay") && preParam.getDeviceFrom().equals("wap")) {
// httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
// if (preParam.getPayType().equals("douyinpay")) {
// httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
// if (preParam.getPayType().equals("unionpay")) {
// httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
// }
httpData.add("showUrl", preParam.getShowUrl() + preParam.getOrderMasterCode());
httpData.add("returnUrl", preParam.getReturnUrl() + preParam.getOrderMasterCode());
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setCode(dto.getData().getCode());
ntfPayResultVo.setOrderCode(dto.getData().getOrderCode());
ntfPayResultVo.setPayData(dto.getData().getPayData());
ntfPayResultVo.setPayType(preParam.getPayType());
ntfPayResultVo.setPrice(preParam.getPriceActual());
payCode = ntfPayResultVo.getCode();
ntfPayResultVo.setShowUrl(preParam.getShowUrl());
ntfPayResultVo.setReturnUrl(preParam.getReturnUrl());
} else if (preParam.getPayType() == null) {
isFree = true;
preParam.setPayType("FREE");
payCode = "FREE_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(BigDecimal.valueOf(0));
ntfPayResultVo.setPayType(preParam.getPayType());
} else if (preParam.getPayType().equals("huifu")) {
isFree = true;
preParam.setPayType("huifu");
payCode = "HUIFU_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(preParam.getPriceActual());
ntfPayResultVo.setPayType(preParam.getPayType());
} else {
isFree = true;
preParam.setPayType("FREE");
payCode = "FREE_PAY_CODE";
ntfPayResultVo = GoblinNtfPayResultVo.getNew();
ntfPayResultVo.setPrice(BigDecimal.valueOf(0));
ntfPayResultVo.setPayType(preParam.getPayType());
}
ntfPayResultVo.setOrderMasterCode(preParam.getOrderMasterCode());
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin.order.create.sku_insert"));
sqls.add(SqlMapping.get("goblin.order.create.order_insert"));
sqls.add(SqlMapping.get("goblin.order.create.attr_insert"));
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataAttr = CollectionUtil.linkedListObjectArr();
List<GoblinStoreOrderVo> orderVoList = ObjectUtil.getGoblinStoreOrderVoArrayList();
List<GoblinOrderSkuVo> skuVoList = ObjectUtil.getGoblinOrderSkuVoArrayList();
for (GoblinOrderSqlParam item : sqlParams) {
List<String> goblinOrderSkuIdList = CollectionUtil.linkedListString();
BigDecimal restVoucherPrice = item.getStoreOrder().getPriceVoucher();
for (int i = 0; i < item.getOrderSkuList().size(); i++) {
GoblinOrderSku orderSku = item.getOrderSkuList().get(i);
if (item.getStoreOrder().getPriceVoucher().compareTo(BigDecimal.ZERO) > 0) {
if (preParam.getStoreSpuIds().size() > 0 || preParam.getPlatformSpuIds().size() > 0) {//指定范围商品券
String spuId = orderSku.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(spuId);
if (pre != null) {
spuId = spuId.split(pre)[0];
}
if (preParam.getStoreSpuIds().contains(spuId) || preParam.getPlatformSpuIds().contains(spuId)) {
if (restVoucherPrice.compareTo(BigDecimal.ZERO) <= 0) {
restVoucherPrice = BigDecimal.ZERO;
}
if (restVoucherPrice.compareTo(BigDecimal.ZERO) > 0) {
restVoucherPrice = restVoucherPrice.subtract(orderSku.getSkuPrice());
if (restVoucherPrice.compareTo(BigDecimal.ZERO) >= 0) {
orderSku.setPriceVoucher(orderSku.getSkuPrice());
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
}
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else if (restVoucherPrice.compareTo(BigDecimal.ZERO) == 0) {
orderSku.setPriceVoucher(BigDecimal.ZERO);
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
}
}
} else {//全部商品券
if (restVoucherPrice.compareTo(BigDecimal.ZERO) <= 0) {
restVoucherPrice = BigDecimal.ZERO;
}
if (restVoucherPrice.compareTo(BigDecimal.ZERO) > 0) {
restVoucherPrice = restVoucherPrice.subtract(orderSku.getSkuPrice());
if (restVoucherPrice.compareTo(BigDecimal.ZERO) >= 0) {
orderSku.setPriceVoucher(orderSku.getSkuPrice());
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
}
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else if (restVoucherPrice.compareTo(BigDecimal.ZERO) == 0) {
orderSku.setPriceVoucher(BigDecimal.ZERO);
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
} else {
orderSku.setPriceVoucher(restVoucherPrice.add(orderSku.getSkuPrice()));
BigDecimal skuPriceActual = orderSku.getSkuPrice().subtract(orderSku.getPriceVoucher());
orderSku.setSkuPriceActual(skuPriceActual.compareTo(BigDecimal.ZERO) > 0 ? skuPriceActual : BigDecimal.ZERO);
}
}
}
sqlDataSku.add(new Object[]{
orderSku.getOrderSkuId(), orderSku.getOrderId(), orderSku.getSpuId(), orderSku.getSpuName(), orderSku.getSpuPic(), orderSku.getSkuId(), orderSku.getNum(), orderSku.getSkuPrice(), orderSku.getSkuPriceActual(), orderSku.getSkuName(),
orderSku.getSkuNo(), orderSku.getSkuImage(), orderSku.getSkuSpecs(), orderSku.getPriceVoucher(), orderSku.getCreatedAt()
});
//订单 orderSku Vo
GoblinOrderSkuVo orderSkuVo = GoblinOrderSkuVo.getNew().copy(orderSku);
redisUtils.setGoblinOrderSku(orderSkuVo.getOrderSkuId(), orderSkuVo);
goblinOrderSkuIdList.add(orderSkuVo.getOrderSkuId());
skuVoList.add(orderSkuVo);
}
GoblinStoreOrder storeOrder = item.getStoreOrder();
storeOrder.setPayCode(payCode);
sqlDataOrder.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(),
storeOrder.getSource(), storeOrder.getVersion(), storeOrder.getIsMember(), storeOrder.getOrderType(), storeOrder.getWriteOffCode(), storeOrder.getPayCountdownMinute(), storeOrder.getIpAddress(), storeOrder.getMarketId(), storeOrder.getMarketType(), storeOrder.getCreatedAt()
});
GoblinOrderAttr orderAttr = item.getOrderAttr();
sqlDataAttr.add(new Object[]{
orderAttr.getOrderAttrId(), orderAttr.getOrderId(), orderAttr.getExpressContacts(), orderAttr.getExpressAddress(), orderAttr.getExpressAddressDetail(), orderAttr.getExpressPhone(), orderAttr.getExpressType(), orderAttr.getCreatedAt()
});
//订单vo
GoblinStoreOrderVo orderVo = GoblinStoreOrderVo.getNew().copy(storeOrder);
//订单attr vo
GoblinOrderAttrVo orderAttrVo = GoblinOrderAttrVo.getNew().copy(orderAttr);
//待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getMasterOrderCode(), storeOrder.getCreatedAt());
//redis 赋值
orderVo.setOrderAttrVo(orderAttrVo);
orderVo.setOrderSkuVoIds(goblinOrderSkuIdList);
orderVo.setCreatedAt(getNowTime());
redisUtils.setGoblinOrder(orderVo.getOrderId(), orderVo);
redisUtils.setMasterCode(orderVo.getMasterOrderCode(), preParam.getOrderIdList().substring(1));
orderVoList.add(orderVo);
//redis 订单列表
if (orderUtils.noZhengzaiOrder(uid)) {
if (orderVo.getMarketType() == null) {
redisUtils.addOrderList(uid, orderVo.getOrderId());
} else if (orderVo.getMarketType().equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
redisUtils.addZhengzaiOrderList(uid, orderVo.getOrderId());
}
}
}
mongoUtils.insertGoblinOrderSkuVoList(skuVoList);
mongoUtils.insertGoblinStoreOrderVos(orderVoList);
//mysql 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataSku, sqlDataOrder, sqlDataAttr);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(), sqlData);
log.info(UserPathDto.setData("下单(唤起支付)", preParam, ntfPayResultVo));
if (isFree && preParam.getPayType().equals("huifu")) {
// SyncOrderParam syncOrderParam = SyncOrderParam.getNew();
// syncOrderParam.setOrderCode(preParam.getOrderMasterCode());
// syncOrderParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
// syncOrderParam.setCode(payCode);
// syncOrderParam.setPrice(preParam.getPriceActual());
// syncOrderParam.setPaymentId("FREE_PAYMENT_ID");
// syncOrderParam.setPaymentType(null);
// syncOrderParam.setStatus(1);
// syncOrder(syncOrderParam);
return ResponseDto.success(ntfPayResultVo);
} else if (isFree) {
GoblinNtfOrderPayCallbackParam ntfOrderPayCallbackParam = GoblinNtfOrderPayCallbackParam.getNew();
ntfOrderPayCallbackParam.setOrderCode(preParam.getOrderMasterCode());
ntfOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
ntfOrderPayCallbackParam.setCode(payCode);
ntfOrderPayCallbackParam.setPrice(preParam.getPriceActual());
ntfOrderPayCallbackParam.setPaymentId("FREE_PAYMENT_ID");
ntfOrderPayCallbackParam.setPaymentType(null);
ntfOrderPayCallbackParam.setStatus(1);
syncOrder(ntfOrderPayCallbackParam);
return ResponseDto.success(ntfPayResultVo);
} else {
return ResponseDto.success(ntfPayResultVo);
}
}
@Override
public ResponseDto<GoblinNtfPayResultVo> payAgain(GoblinNtfOrderPayAgainParam param) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime now = LocalDateTime.now();
//检查订单时间 是否关闭
GoblinStoreOrderVo storeOrderVo = redisUtils.getGoblinOrder(param.getOrderId());
if (storeOrderVo == null) {
return ResponseDto.failure("订单不存在");
}
if (!storeOrderVo.getUserId().equals(uid)) {
return ResponseDto.failure(ErrorMapping.get("20003"));
}
if (storeOrderVo.getStatus() != GoblinStatusConst.Status.ORDER_STATUS_0.getValue()) {
return ResponseDto.failure("订单无法支付");//订单
}
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnCheckData = HttpUtil.get(checkUrl + "?code=" + storeOrderVo.getPayCode(), null, header);
ResponseDto<GoblinPayInnerResultVo> checkVo = JsonUtils.fromJson(returnCheckData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
if (checkVo.getData().getStatus() == 1) {
return ResponseDto.failure("订单已支付");
}
BigDecimal price = BigDecimal.ZERO;
String[] orderIds = redisUtils.getMasterCode(storeOrderVo.getMasterOrderCode());
for (String orderId : orderIds) {
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
price = price.add(orderVo.getPriceActual());
}
GoblinNtfPayResultVo ntfPayResultVo = GoblinNtfPayResultVo.getNew();
// if (!storeOrderVo.getPayType().equals("FREE") && storeOrderVo.getPayType().equals(param.getPayType()) && storeOrderVo.getDeviceFrom().equals(param.getDeviceFrom())) {
// payInnerResultVo.setCode(checkVo.getData().getCode());
// payInnerResultVo.setOrderCode(checkVo.getData().getOrderCode());
// payInnerResultVo.setPayData(checkVo.getData().getPayData());
// payInnerResultVo.setOrderId(param.getOrderId());
// payInnerResultVo.setPayType(param.getPayType());
// payInnerResultVo.setPrice(storeOrderVo.getPriceActual());
// storeOrderVo.setPayCode(payInnerResultVo.getCode());
// payInnerResultVo.setShowUrl(param.getShowUrl() + storeOrderVo.getOrderId());
// payInnerResultVo.setReturnUrl(param.getReturnUrl() + storeOrderVo.getOrderId());
// log.info(UserPathDto.setData("再次支付[原支付方式]", param, payInnerResultVo));
// } else
if (!storeOrderVo.getPayType().equals("FREE")) {
// 调用支付
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("type", "PRODUCT");
httpData.add("price", price.toString());
httpData.add("name", redisUtils.getStoreInfoVo(storeOrderVo.getStoreId()).getStoreName());
httpData.add("detail", "查找最初订单");
httpData.add("orderCode", storeOrderVo.getMasterOrderCode());
// httpData.add("orderId", storeOrderVo.getOrderId());
httpData.add("clientIp", storeOrderVo.getIpAddress());
httpData.add("notifyUrl", synUrl);
httpData.add("createDate", storeOrderVo.getCreatedAt());
httpData.add("expireTime", storeOrderVo.getPayCountdownMinute().toString());
httpData.add("payType", param.getPayType());
httpData.add("deviceFrom", param.getDeviceFrom());
if (param.getDeviceFrom().equals("js") || param.getDeviceFrom().equals("applet")) {
httpData.add("openId", param.getOpenId());
}
// if (param.getPayType().equals("alipay") && param.getDeviceFrom().equals("wap")) {
// httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
// if (param.getPayType().equals("douyinpay")) {
// httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
// if (param.getPayType().equals("unionpay")) {
// httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
// }
httpData.add("showUrl", param.getShowUrl() + storeOrderVo.getMasterOrderCode());
httpData.add("returnUrl", param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
String returnData = HttpUtil.post(payUrl, httpData);
log.debug("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
ntfPayResultVo.setCode(dto.getData().getCode());
ntfPayResultVo.setOrderCode(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setOrderMasterCode(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setPayData(dto.getData().getPayData());
ntfPayResultVo.setOrderId(storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setPayType(param.getPayType());
ntfPayResultVo.setPrice(price);
ntfPayResultVo.setShowUrl(param.getShowUrl() + storeOrderVo.getMasterOrderCode());
ntfPayResultVo.setReturnUrl(param.getReturnUrl() + storeOrderVo.getMasterOrderCode());
//redis
storeOrderVo.setPayType(param.getPayType());
storeOrderVo.setDeviceFrom(param.getDeviceFrom());
storeOrderVo.setPayCode(ntfPayResultVo.getCode());
redisUtils.setGoblinOrder(storeOrderVo.getOrderId(), storeOrderVo);
//mongo
mongoUtils.updateGoblinStoreOrderVo(storeOrderVo.getOrderId(), storeOrderVo);
//mysql
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_AGAIN.getKey(),
SqlMapping.get("goblin_order.pay.again", param.getPayType(), param.getDeviceFrom(), ntfPayResultVo.getCode(), param.getOrderId(), now, now));
log.info(UserPathDto.setData("再次支付[新支付方式]", param, ntfPayResultVo));
}
return ResponseDto.success(ntfPayResultVo);
}
@Override
public ResponseDto<Integer> checkOrderResult(String orderId) {
String uid = CurrentUtil.getCurrentUid();
GoblinStoreOrderVo storeOrderVo = redisUtils.getGoblinOrder(orderId);
if (storeOrderVo == null) {
return ResponseDto.failure("订单不存在");
} else {
if (!storeOrderVo.getUserId().equals(uid)) {
return null;
}
String returnCheckData = HttpUtil.get(checkUrl + "?code=" + storeOrderVo.getPayCode(), null);
ResponseDto<GoblinNtfOrderPayCallbackParam> syncOrderDtoParam = JsonUtils.fromJson(returnCheckData, new TypeReference<ResponseDto<GoblinNtfOrderPayCallbackParam>>() {
});
if (syncOrderDtoParam.getData().getStatus() == 1) {
//处理订单
syncOrder(syncOrderDtoParam.getData());
return ResponseDto.success(1);
} else {
return ResponseDto.success(0);
}
}
}
@Override
public String syncOrder(GoblinNtfOrderPayCallbackParam syncOrderParam) {
log.debug("SYNC PARAM = " + syncOrderParam.toString());
//支付时间
LocalDateTime now = LocalDateTime.now();
String[] array = redisUtils.getMasterCode(syncOrderParam.getOrderCode());
String uid;
BigDecimal priceActual = BigDecimal.ZERO;
for (String orderId : array) {
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
if (orderVo == null) {
log.error("订单号:" + syncOrderParam.getOrderCode() + " 订单不存在");
return "fail";//订单不存在
}
if (orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_2.getValue()) {
if (orderVo.getPayCode().equals(syncOrderParam.getCode())) {
log.error("订单号:" + syncOrderParam.getOrderCode() + " 重复支付");
return "fail";//重复支付
}
}
// if (orderVo.getPriceActual().compareTo(syncOrderParam.getPrice()) != 0) {
// log.error("订单号:" + syncOrderParam.getOrderCode() + " 价格不符");
// return "fail";//价格不符
// }
priceActual = priceActual.add(orderVo.getPriceActual());
uid = orderVo.getUserId();
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
GoblinStoreOrder storeOrder = GoblinStoreOrder.getNew();
if (orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_5.getValue() && syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单超时支付", syncOrderParam.getOrderCode());
// 商铺退款逻辑
orderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
// orderVo.setStatus(GoblinStatusConst.OrderStatus.ORDER_STATUS_61.getValue());
// redisUtils.setGoblinOrder(orderVo.getOrderId(),orderVo);
} else if ((orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_6.getValue() || orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_7.getValue()) && syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单正在退款 或者已退款", syncOrderParam.getOrderCode());
} else if (syncOrderParam.getStatus().equals(1)) {
log.error("订单号为 {} 的订单正常流程", syncOrderParam.getOrderCode());
storeOrder.setPaymentType(syncOrderParam.getPaymentType());
storeOrder.setPaymentId(syncOrderParam.getPaymentId());
storeOrder.setPayCode(syncOrderParam.getCode());
LocalDateTime payTime = LocalDateTime.parse(syncOrderParam.getPaymentAt(), DTF_YMD_HMS);
storeOrder.setPayTime(payTime);
if (orderVo.getWriteOffCode().equals("EMPTY")) {
storeOrder.setWriteOffCode(IDGenerator.getWriteOffCode());
} else {
storeOrder.setWriteOffCode("");
}
storeOrder.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue());
storeOrder.setUpdatedAt(now);
sqls.add(SqlMapping.get("goblin_order.pay.order"));
sqlDataOrder.add(new Object[]{
storeOrder.getPaymentType(), storeOrder.getPaymentId(), storeOrder.getPayCode(), storeOrder.getPayTime(), storeOrder.getWriteOffCode(), storeOrder.getStatus(), storeOrder.getUpdatedAt(),
orderId, now, now
});
sqls.add(SqlMapping.get("goblin_order.pay.sku"));
List<String> skuList = orderVo.getOrderSkuVoIds();
for (String orderSkuVoIds : skuList) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderSkuVoIds);
//增加销量
log.debug("增加销量 spuId=" + orderSkuVo.getSpuId() + ",skuId=" + orderSkuVo.getSkuId());
redisUtils.incrSkuSaleCount(orderSkuVo.getSpuId(), orderSkuVo.getSkuId(), orderSkuVo.getNum());
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue());
//redis
redisUtils.setGoblinOrderSku(orderSkuVo.getOrderSkuId(), orderSkuVo);
//mongo
mongoUtils.updateGoblinOrderSkuVo(orderSkuVo.getOrderSkuId(), orderSkuVo);
//mongo 添加操作日志
GoblinOrderLogVo logVo = GoblinOrderLogVo.getNew();
logVo.setOrderId(orderVo.getOrderId());
logVo.setOrderCode(orderVo.getOrderCode());
logVo.setPayCode(orderVo.getPayCode());
logVo.setStoreId(orderVo.getStoreId());
if (orderSkuVo.getSkuId().indexOf(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue()) > 0) {
logVo.setOrderType("zhengzai");
} else {
logVo.setOrderType("order");
}
logVo.setSpuId(orderSkuVo.getSpuId());
logVo.setSkuId(orderSkuVo.getSkuId());
logVo.setSkuPriceActual(orderSkuVo.getSkuPriceActual().multiply(new BigDecimal(100)).longValue());
logVo.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_11.getValue());
logVo.setRemark(GoblinStatusConst.Status.ORDER_LOG_STATUS_11.getDesc());
logVo.setOperationId(uid);
logVo.setOperationName(orderVo.getUserName());
logVo.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_1.getValue());
logVo.setCreatedAt(LocalDateTime.now());
mongoUtils.insertGoblinOrderLogVo(logVo);
//mysql
sqlDataSku.add(new Object[]{
GoblinStatusConst.Status.ORDER_STATUS_2.getValue(), now,
orderSkuVo.getOrderSkuId(), now, now
});
}
//redis
orderVo.setPayCode(storeOrder.getPayCode());
orderVo.setPayTime(syncOrderParam.getPaymentAt());
orderVo.setWriteOffCode(storeOrder.getWriteOffCode());
orderVo.setStatus(storeOrder.getStatus());
orderVo.setPaymentId(syncOrderParam.getPaymentId());
orderVo.setPaymentType(syncOrderParam.getPaymentType());
orderVo.setOrderSkuVoIds(skuList);
redisUtils.setGoblinOrder(orderId, orderVo);
redisUtils.setOffCode(orderVo.getWriteOffCode(), orderVo.getMasterOrderCode());
//mongo
mongoUtils.updateGoblinStoreOrderVo(orderId, orderVo);
//mysql
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku));
}
//发短信
// SmsEnum.ADTemplate adTemplate = null;
// if (orderTicketData.getGetTicketType().equals("express")) {
// adTemplate = SmsEnum.ADTemplate.SMS_225995308;
// } else if (orderTicketData.getGetTicketType().equals("electronic")) {
// adTemplate = ticketData.getIsShowCode() == 1 ? SmsEnum.ADTemplate.SMS_225995308 : SmsEnum.ADTemplate.SMS_225995308;
// }
//
// if (null != adTemplate) {
// queueUtils.sendMsgByRedis(MQConst.KylinQueue.SMS_NOTICE.getKey(),
// SmsMessage.builder().setPhone(orderTicketData.getUserMobile())
// .setSignName(SmsEnum.ADSignName.M02.getVal())
// .setTemplateCode(adTemplate.name())
// .setTemplateParam("name", orderTicketData.getPerformanceTitle())
// .setTemplateParam("time", time1 + " " + time2).toJson()
// );
// }
//加分
if (orderUtils.noZhengzaiOrder(uid)) {
orderUtils.doTask(uid, priceActual);
}
}
return "success";
}
@Override
public String refundSyncOrder(GoblinNtfOrderRefundCallbackParam refundCallbackParam) {
LocalDateTime now = LocalDateTime.now();
String nowStr = DateUtil.getNowTime();
log.info("refundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
GoblinBackOrderVo backOrderVo = mongoUtils.getGoblinBackOrderVoByBackCode(refundCallbackParam.getOrderRefundCode());
if (backOrderVo == null) {
log.info("refundCallback: 退款订单查询失败,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_20.getValue() || backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_201.getValue()) {
log.info("refundCallback: 退款订单已取消,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue()) {
log.info("refundCallback: 退款订单已完成,编号{}", refundCallbackParam.getOrderRefundCode());
return "success";
}
Integer status = refundCallbackParam.getStatus();
if (1 == status && (backOrderVo.getStatus() == 0 || backOrderVo.getStatus() == 10)) { // 退款成功
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsOrderSku = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsBackOrder = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_order.store.refundPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundSkuPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundBackOrder"));
String orderId = backOrderVo.getOrderId();
List<GoblinBackOrderSkuVo> backOrderSkuVos = backOrderVo.getBackOrderSkuVos();
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
orderVo.setPriceRefund(orderVo.getPriceRefund() == null ? BigDecimal.ZERO : orderVo.getPriceRefund().add(refundCallbackParam.getRefundPrice()));
if (orderVo.getPriceRefund().compareTo(orderVo.getPriceActual()) >= 0) {
//整单退款 退券
orderVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
if (!(orderVo.getUcouponId() == null || orderVo.getUcouponId().equals(""))) {
orderUtils.backCoupon(orderVo.getUcouponId(), orderVo.getUserId());
}
if (!(orderVo.getStoreCouponId() == null || orderVo.getStoreCouponId().equals(""))) {
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(orderVo.getStoreCouponId());
backCouponParam.setUid(orderVo.getUserId());
params.add(backCouponParam);
orderUtils.backStoreCoupon(params);
}
}
backOrderVo.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_2.getValue());
backOrderVo.setRefundAt(nowStr);
for (GoblinBackOrderSkuVo backOrderSkuVo : backOrderSkuVos) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId());
BigDecimal refundSkuPrice = backOrderSkuVo.getRefundPrice();
orderSkuVo.setPriceRefund(orderSkuVo.getPriceRefund() == null ? refundSkuPrice : orderSkuVo.getPriceRefund().add(refundSkuPrice));
if (orderSkuVo.getPriceRefund().compareTo(orderSkuVo.getSkuPriceActual()) >= 0) {
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderSkuVo.getSkuId());
String skuId = orderSkuVo.getSkuId();
redisUtils.incrSkuStock(pre, skuId, orderSkuVo.getNum());
redisUtils.decrSkuCountByUid(orderVo.getUserId(), skuId, orderSkuVo.getNum());
}
redisUtils.setGoblinOrderSku(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
mongoUtils.updateGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
sqlsOrderSku.add(new Object[]{
orderSkuVo.getPriceRefund(), orderSkuVo.getStatus(), now,
backOrderSkuVo.getOrderSkuId(), now, now
});
GoblinOrderLogVo logVo = GoblinOrderLogVo.getNew();
logVo.setOrderId(orderVo.getOrderId());
logVo.setOrderCode(orderVo.getOrderCode());
logVo.setPayCode(orderVo.getPayCode());
if (orderSkuVo.getSkuId().indexOf(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue()) > 0) {
logVo.setOrderType("zhengzai");
} else {
logVo.setOrderType("order");
}
logVo.setStoreId(orderVo.getStoreId());
logVo.setSpuId(orderSkuVo.getSpuId());
logVo.setSpuName(backOrderSkuVo.getSpuName());
logVo.setSkuId(backOrderSkuVo.getSkuId());
// if (orderVo.getStatus().equals(GoblinStatusConst.Status.ORDER_STATUS_6.getValue())) {
// refundSkuPrice = refundSkuPrice.add(orderVo.getPriceExpress());
// }
logVo.setSkuPriceActual(refundSkuPrice.multiply(BigDecimal.valueOf(100)).negate().longValue());
logVo.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue());
logVo.setRemark("订单退款");
logVo.setOperationId(backOrderVo.getUserId());
logVo.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_2.getValue());
logVo.setCreatedAt(now);
mongoUtils.insertGoblinOrderLogVo(logVo);
}
//redis
redisUtils.setGoblinOrder(orderId, orderVo);
redisUtils.setBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
//mongo
mongoUtils.updateGoblinStoreOrderVo(orderId, orderVo);
mongoUtils.updateGoblinBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
//mysql
sqlsOrder.add(new Object[]{
orderVo.getPriceRefund(), orderVo.getStatus(), now,
orderId, now, now
});
sqlsBackOrder.add(new Object[]{
backOrderVo.getStatus(), now, now, backOrderVo.getBackOrderId(), now, now
});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.gets(sqls, sqlsOrder, sqlsOrderSku, sqlsBackOrder));
//减积分
orderUtils.desTask(orderVo.getUserId(), backOrderVo.getRealBackPrice());
} else if (0 == status) {
return "fail";
}
return "success";
}
}
package com.liquidnet.service.order.utils;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.param.BackCouponParam;
import com.liquidnet.service.candy.vo.CandyUseResultVo;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinBackOrder;
import com.liquidnet.service.goblin.entity.GoblinBackOrderLog;
import com.liquidnet.service.goblin.entity.GoblinOrderSku;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Component
@Slf4j
public class GoblinNtfOrderUtils {
@Value("${liquidnet.service.adam.url}")
private String adamUrl;
@Value("${liquidnet.service.candy.url}")
private String candyUrl;
@Value("${liquidnet.service.stone.url}")
private String stoneUrl;
@Value("${liquidnet.service.order.url-pay.goblinRefundUrl}")
private String synUrl;
@Value("${liquidnet.service.dragon.urls.refundApply}")
private String refundApply;
@Autowired
QueueUtils queueUtils;
@Autowired
GoblinRedisUtils redisUtils;
@Autowired
GoblinMongoUtils goblinMongoUtils;
//判断 数量限购
public String judgeOrderLimit(String uid, String skuId, int number, int limitCount) {
int buyCount = redisUtils.incrSkuCountByUid(uid, skuId, number);
if (buyCount > limitCount) {
// redisUtils.decrSkuCountByUid(uid, skuId, number);
return "已超出限购数量";
} else {
return "";
}
}
//判断指定人群购买
public Boolean judgeOrderRose(Boolean isMember, String skuId, String mobile, int buyFactor) {
Boolean result = false;
switch (buyFactor) {
case 0:
result = true;
break;
case 1:
result = isMember;
break;
case 2:
result = redisUtils.getSkuCanBuyByUid(mobile, skuId);
break;
}
return result;
}
/**
* 使用优惠券
*
* @param uCouponId 券id
* @param content 消费内容
* @param totalPrice 订单总价
* @return
*/
public HashMap<String, Object> useCoupon(String uCouponId, String content, BigDecimal totalPrice, String spuId, String uid, List<GoblinOrderSku> goblinOrderSkuList) {
HashMap<String, Object> hashMap = CollectionUtil.mapStringObject();
try {
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("uCouponId", uCouponId);
params.add("content", content);
params.add("totalPrice", totalPrice.toString());
params.add("goodId", spuId);
params.add("performanceId", "null");
params.add("timeId", "null");
params.add("ticketId", "null");
params.add("uid", uid);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Authorization", "Bearer " + CurrentUtil.getToken());
header.add("Accept", "application/json;charset=UTF-8");
log.debug("url=" + candyUrl + "/candy-coupon/use");
String returnData = HttpUtil.post(candyUrl + "/candy-coupon/use", params, header);
ResponseDto<CandyUseResultVo> innerReturnVo = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<CandyUseResultVo>>() {
});
CandyUseResultVo candyUseResultVo = innerReturnVo.getData();
Integer type = candyUseResultVo.getCouType();
List<String> targetList = candyUseResultVo.getTargetIds();
BigDecimal fullValue = candyUseResultVo.getFullValue();
BigDecimal value = candyUseResultVo.getValue();
BigDecimal voucher = BigDecimal.ZERO;
BigDecimal targetPrice = BigDecimal.ZERO;
switch (type) {
case -1:
voucher = BigDecimal.valueOf(-1);
break;
case 1:
if (targetList.size() == 0) {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
String orderVoSpuId = skuOrderVo.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderVoSpuId);
if (pre != null) {
orderVoSpuId = orderVoSpuId.split(pre)[0];
}
if (targetId.equals(orderVoSpuId)) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
}
}
}
if (targetPrice.compareTo(value) >= 0) {
voucher = voucher.add(value);
} else {
voucher = voucher.add(targetPrice);
}
break;
case 2://满减
if (targetList.size() == 0) {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
String orderVoSpuId = skuOrderVo.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderVoSpuId);
if (pre != null) {
orderVoSpuId = orderVoSpuId.split(pre)[0];
}
if (targetId.equals(orderVoSpuId)) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
}
}
}
if (fullValue.compareTo(targetPrice) <= 0) {
voucher = voucher.add(value);
} else {
backCoupon(uCouponId, uid);
hashMap.put("type", -1);
hashMap.put("voucher", BigDecimal.ZERO);
return hashMap;
}
break;
case 3:
voucher = voucher.add(totalPrice);
break;
case 4://折扣
if (targetList.size() == 0) {
targetPrice = totalPrice;
} else {
for (String targetId : targetList) {
for (GoblinOrderSku skuOrderVo : goblinOrderSkuList) {
if (targetId.equals(skuOrderVo.getSpuId())) {
targetPrice = targetPrice.add(skuOrderVo.getSkuPriceActual());
}
}
}
}
voucher = targetPrice.subtract(targetPrice.multiply(value));
break;
default:
voucher = BigDecimal.ZERO;
break;
}
hashMap.put("spuIds", targetList);
hashMap.put("type", type);
hashMap.put("voucher", voucher.setScale(2, BigDecimal.ROUND_HALF_UP));
return hashMap;
} catch (Exception e) {
log.error("用券ERROR:{}", e);
return null;
}
}
public void backCoupon(String uCouponId, String uid) {
try {
BackCouponParam param = BackCouponParam.getNew();
param.setuCouponIds(uCouponId);
param.setUid(uid);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Authorization", "Bearer " + CurrentUtil.getToken());
header.add("Accept", "application/json;charset=UTF-8");
ArrayList<BackCouponParam> params = new ArrayList();
params.add(param);
String jsonString = JSON.toJSONString(params);
String returnData = HttpUtil.postRaw(candyUrl + "/candy-coupon/useBack", jsonString, header);
} catch (Exception e) {
log.error("回退券ERROR:{}", e);
}
}
public void doTask(String uid, BigDecimal price) {
try {
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("score", price.intValue() + "");
params.add("content", "购买商品:");
params.add("uid", uid);
String resultData = HttpUtil.post(stoneUrl + "/user/logs/in2111", params, header);
} catch (Exception e) {
log.error("添加积分失败,e:{}", e);
e.printStackTrace();
}
}
public void desTask(String uid, BigDecimal price) {
try {
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("score", price.intValue() + "");
params.add("content", "购买商品:");
params.add("uid", uid);
String resultData = HttpUtil.post(stoneUrl + "/user/logs/de2111", params, header);
} catch (Exception e) {
log.error("添加积分失败,e:{}", e);
e.printStackTrace();
}
}
public GoblinUseResultVo useStoreCoupon(String ucouponId, String content, BigDecimal totalPrice, List<GoblinOrderSku> goblinOrderSkuList, String uid) {
try {
List<GoblinUserCouponVo> voList = redisUtils.getUserCouponVos(uid);
GoblinUseResultVo returnVo = GoblinUseResultVo.getNew();
returnVo.setValue(BigDecimal.ZERO);
returnVo.setCouType("-1");
LocalDateTime now = LocalDateTime.now();
List<String> spuIds = CollectionUtil.linkedListString();
for (GoblinUserCouponVo vo : voList) {
if (vo.getUcouponId().equals(ucouponId) && vo.getDuedAt().isAfter(now)) {
//判断券状态 和 触发金额
if ((vo.getState().equals(1))) {
if (vo.getUseScope().equals("0") && vo.getTriggers().compareTo(totalPrice) <= 0) {
if (vo.getType().equals("1")) {//代金券
returnVo.setValue(vo.getValFace());
returnVo.setCouType(vo.getType());
} else if (vo.getType().equals("2")) {//折扣
BigDecimal tempPrice = totalPrice.subtract(totalPrice.multiply(vo.getDiscount()).setScale(2, BigDecimal.ROUND_HALF_UP));
if (tempPrice.compareTo(vo.getDeduction()) > 0) {
tempPrice = vo.getDeduction();
}
returnVo.setValue(tempPrice);
returnVo.setCouType(vo.getType());
} else if (vo.getType().equals("3") && vo.getTriggers().compareTo(totalPrice) <= 0) {//满减
returnVo.setValue(vo.getValMinus());
returnVo.setCouType(vo.getType());
}
vo.setState(5);
vo.setUsedFor(content);
goblinMongoUtils.changeCouponVos(vo.getUcouponId(), vo);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_COUPON.getKey(),
SqlMapping.get("goblin_user_coupon.updateState", vo.getState(), vo.getUsedFor(), LocalDateTime.now(), vo.getUcouponId()));
break;
} else {
spuIds = redisUtils.getStoreCouponSpuIds(vo.getStoreCouponId());
if (spuIds == null || spuIds.size() == 0) {
continue;
}
//判断是否在可用商品内
BigDecimal contentPrice = BigDecimal.ZERO;
for (String item : spuIds) {
for (GoblinOrderSku param : goblinOrderSkuList) {
String spuId = param.getSpuId();
String pre = GoblinStatusConst.MarketPreStatus.getPre(spuId);
if (pre != null) {
spuId = spuId.split(pre)[0];
}
if (spuId.equals(item)) {
contentPrice = contentPrice.add(param.getSkuPriceActual());
}
}
}
if (vo.getTriggers().compareTo(contentPrice) <= 0) {
if (vo.getType().equals("1")) {//代金券
if (vo.getValFace().compareTo(contentPrice) > 0) {
returnVo.setValue(contentPrice);
} else {
returnVo.setValue(vo.getValFace());
}
returnVo.setCouType(vo.getType());
} else if (vo.getType().equals("2")) {//折扣
BigDecimal tempPrice = contentPrice.subtract(contentPrice.multiply(vo.getDiscount()).setScale(2, BigDecimal.ROUND_HALF_UP));
if (tempPrice.compareTo(vo.getDeduction()) > 0) {
tempPrice = vo.getDeduction();
}
returnVo.setValue(tempPrice);
returnVo.setCouType(vo.getType());
} else if (vo.getType().equals("3")) {//满减
if (vo.getValMinus().compareTo(contentPrice) > 0) {
returnVo.setValue(contentPrice);
} else {
returnVo.setValue(vo.getValMinus());
}
returnVo.setCouType(vo.getType());
}
vo.setState(5);
vo.setUsedFor(content);
goblinMongoUtils.changeCouponVos(vo.getUcouponId(), vo);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_COUPON.getKey(),
SqlMapping.get("goblin_user_coupon.updateState", vo.getState(), vo.getUsedFor(), LocalDateTime.now(), vo.getUcouponId()));
}
}
}
break;
}
}
if (!returnVo.getCouType().equals("-1")) {
redisUtils.setUserCouponVos(uid, voList);
}
returnVo.setSpuIds(spuIds);
return returnVo;
} catch (Exception e) {
log.error("店铺券错误:{}", e);
return null;
}
}
public Boolean backStoreCoupon(List<com.liquidnet.service.goblin.param.BackCouponParam> params) {
try {
for (com.liquidnet.service.goblin.param.BackCouponParam item : params) {
List<GoblinUserCouponVo> voList = redisUtils.getUserCouponVos(item.getUid());
for (GoblinUserCouponVo vo : voList) {
if (vo.getUcouponId().equals(item.getuCouponIds())) {
if (LocalDateTime.now().isBefore(vo.getDuedAt())) {
vo.setState(1);
vo.setUsedFor("");
redisUtils.setUserCouponVos(item.getUid(), voList);
goblinMongoUtils.changeCouponVos(vo.getUcouponId(), vo);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_COUPON.getKey(),
SqlMapping.get("goblin_user_coupon.updateState", vo.getState(), vo.getUsedFor(), LocalDateTime.now(), vo.getUcouponId()));
}
break;
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public Integer getMember(String uid) {
return redisUtils.getMember(uid);
}
//超时支付自动退款
public Boolean refundOrderSku(String orderId, String paymentId, String paymentType) {
int autoSize = redisUtils.getBackOrderByOrderId(orderId).size();
if (autoSize > 0) {
return true;
}
String uid = CurrentUtil.getCurrentUid();
LocalDateTime now = LocalDateTime.now();
String nowStr = DateUtil.getNowTime();
List<GoblinBackOrderSkuVo> orderSkuVoList = ObjectUtil.goblinBackOrderSkuVoArrayList();
GoblinStoreOrderVo orderVo = redisUtils.getGoblinOrder(orderId);
BigDecimal refundPrice = BigDecimal.ZERO;
for (String orderSkuIdItem : orderVo.getOrderSkuVoIds()) {
GoblinOrderSkuVo orderSkuVo = redisUtils.getGoblinOrderSkuVo(orderSkuIdItem);
GoblinBackOrderSkuVo backOrderSkuVo = GoblinBackOrderSkuVo.getNew();
backOrderSkuVo.setOrderSkuId(orderSkuIdItem);
backOrderSkuVo.setSpuId(orderSkuVo.getSpuId());
backOrderSkuVo.setSpuName(orderSkuVo.getSpuName());
backOrderSkuVo.setSkuId(orderSkuVo.getSkuId());
backOrderSkuVo.setSkuName(orderSkuVo.getSkuName());
backOrderSkuVo.setRefundPrice(orderSkuVo.getSkuPriceActual());
backOrderSkuVo.setSkuSpecs(orderSkuVo.getSkuSpecs());
backOrderSkuVo.setCreatedAt(nowStr);
backOrderSkuVo.setSkuPic(orderSkuVo.getSkuImage());
orderSkuVoList.add(backOrderSkuVo);
refundPrice = refundPrice.add(orderSkuVo.getSkuPriceActual().subtract(orderSkuVo.getPriceRefund()));
}
//记录退款单
String refundCode = IDGenerator.storeRefundCode(orderVo.getMasterOrderCode());
GoblinBackOrder goblinBackOrder = GoblinBackOrder.getNew();
goblinBackOrder.setBackOrderId(IDGenerator.nextTimeId2());
goblinBackOrder.setBackCode(refundCode);
goblinBackOrder.setOrderId(orderVo.getOrderId());
goblinBackOrder.setOrderCode(orderVo.getOrderCode());
goblinBackOrder.setStoreId(orderVo.getStoreId());
goblinBackOrder.setUserId(orderVo.getUserId());
// goblinBackOrder.setSkuIdNums(orderSkuId);
goblinBackOrder.setType(GoblinStatusConst.Type.BACK_TYPE_1.getValue());
goblinBackOrder.setReason(GoblinStatusConst.Type.BACK_REASON_TYPE_10.getDesc());
goblinBackOrder.setDescribes("超时支付自动退款");
refundPrice = refundPrice.add(orderVo.getPriceExpress());
goblinBackOrder.setRealBackPrice(refundPrice);
goblinBackOrder.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_0.getValue());
goblinBackOrder.setAuditAt(now);
goblinBackOrder.setCreatedAt(now);
GoblinBackOrderVo backOrderVo = GoblinBackOrderVo.getNew().copy(goblinBackOrder);
backOrderVo.setCreatedAt(nowStr);
backOrderVo.setBackOrderSkuVos(orderSkuVoList);
//添加日志
GoblinBackOrderLog backOrderLog = initBackLog(goblinBackOrder.getBackOrderId(), uid, now);
backOrderLog.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue());
backOrderLog.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_2.getValue());
backOrderLog.setMessage("商户发起[自动退款]:orderId=[" + orderId + "],refundPrice=[" + refundPrice + "],[refundCode=" + refundCode + "]");
//调用退款
orderVo.setPaymentId(paymentId);
orderVo.setPaymentType(paymentType);
String returnString = initRefund(orderVo, refundPrice, refundCode);
HashMap hashMapResult = JsonUtils.fromJson(returnString, HashMap.class);
Boolean success = (Boolean) hashMapResult.get("success");
String message = (String) hashMapResult.get("message");
if (!success) {
if (!(backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_BACK_STATUS_8.getValue() || backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_BACK_STATUS_2.getValue())) {
backOrderVo.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_10.getValue());
backOrderVo.setErrorReason(backOrderVo.getErrorReason() + ",失败原因:" + message);
log.error("REFUND DATA = " + returnString);
}
}
//redis
redisUtils.setBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
redisUtils.addBackOrderByOrderId(orderVo.getOrderId(), backOrderVo.getBackOrderId());
//mongo
goblinMongoUtils.insertGoblinBackOrderVo(backOrderVo);
//添加退款
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.get("goblin_order.store.backOrder",
goblinBackOrder.getBackOrderId(), goblinBackOrder.getBackCode(), goblinBackOrder.getOrderId(),
goblinBackOrder.getOrderCode(), goblinBackOrder.getStoreId(), goblinBackOrder.getUserId(),
goblinBackOrder.getSkuIdNums(), goblinBackOrder.getType(), goblinBackOrder.getReason(),
goblinBackOrder.getDescribes(), goblinBackOrder.getRealBackPrice(), goblinBackOrder.getStatus(),
goblinBackOrder.getCreatedAt(), goblinBackOrder.getAuditAt(), goblinBackOrder.getErrorReason()
)
);
//添加日志
queueUtils.sendMsgByRedis(
MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.get("goblin_order.store.refundLog",
backOrderLog.getBackOrderLogId(), backOrderLog.getBackOrderId(), backOrderLog.getOperationType(),
backOrderLog.getMessage(), backOrderLog.getOperationName(), backOrderLog.getStatus(), now
)
);
if (success) {
return true;
} else {
log.error("退款失败:" + message);
return false;
}
}
private GoblinBackOrderLog initBackLog(String orderId, String uid, LocalDateTime now) {
GoblinBackOrderLog log = GoblinBackOrderLog.getNew();
log.setBackOrderId(orderId);
log.setOperationName(uid);
log.setBackOrderLogId(IDGenerator.nextTimeId2());
log.setCreatedAt(now);
return log;
}
private String initRefund(GoblinStoreOrderVo orderVo, BigDecimal price, String refundCode) {
MultiValueMap<String, String> params = CollectionUtil.linkedMultiValueMapStringString();
params.add("code", orderVo.getPayCode());
params.add("notifyUrl", synUrl);
params.add("orderCode", orderVo.getMasterOrderCode());
params.add("orderRefundCode", refundCode);
params.add("paymentId", orderVo.getPaymentId());
params.add("paymentType", orderVo.getPaymentType());
params.add("price", String.valueOf(price));
BigDecimal totalPrice = BigDecimal.ZERO;
totalPrice = totalPrice.add(price);
params.add("priceTotal", String.valueOf(totalPrice));
params.add("reason", "超时支付");
MultiValueMap<String, String> headers = CollectionUtil.linkedMultiValueMapStringString();
headers.add("Accept", "application/json;charset=UTF-8");
String returnString = HttpUtil.post(refundApply, params, headers);
log.debug("REFUND DATA = " + returnString);
return returnString;
}
//订单异常处理
public ResponseDto<GoblinNtfPayResultVo> orderException(List<String> skuAndPreListAndNumber, List<String> platformCodeList, List<String> storeCodeList, String uid, String message) {
long time3 = System.currentTimeMillis();
//回顾限购 回滚库存
for (String item : skuAndPreListAndNumber) {
String[] array = item.split(",");
String skuId = array[0];
String pre = array[1];
int number = Integer.parseInt(array[2]);
redisUtils.incrSkuStock(pre, skuId, number);
if (noZhengzaiOrder(uid)) {
redisUtils.decrSkuCountByUid(uid, skuId, number);
}
}
//回退平台券
for (String platformCode : platformCodeList) {
backCoupon(platformCode, uid);
}
//回退店铺券
List<com.liquidnet.service.goblin.param.BackCouponParam> params = ObjectUtil.getBackCouponParam();
for (String storeCode : storeCodeList) {
com.liquidnet.service.goblin.param.BackCouponParam backCouponParam = com.liquidnet.service.goblin.param.BackCouponParam.getNew();
backCouponParam.setuCouponIds(storeCode);
backCouponParam.setUid(uid);
params.add(backCouponParam);
}
if (params.size() > 0) {
backStoreCoupon(params);
}
log.info("回滚逻辑 " + (System.currentTimeMillis() - time3) + "ms");
if (message == null && !message.equals("")) {
return ResponseDto.failure(ErrorMapping.get("20018"));//乱七八糟异常
} else {
return ResponseDto.failure(message);//乱七八糟异常
}
}
public boolean noZhengzaiOrder(String uid) {
return !uid.equals("zhengzai");
}
}
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