package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.*;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.AppContants;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.MallUtils;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.mall.conversion.MallGoodsCommentConversion;
|
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
|
import cc.mrbird.febs.mall.conversion.MallOrderRefundConversion;
|
import cc.mrbird.febs.mall.dto.*;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.*;
|
import cc.mrbird.febs.mall.vo.*;
|
import cc.mrbird.febs.pay.model.AgreementPayDto;
|
import cc.mrbird.febs.pay.model.AgreementSignDto;
|
import cc.mrbird.febs.pay.model.UnipayDto;
|
import cc.mrbird.febs.pay.service.IPayService;
|
import cc.mrbird.febs.pay.service.UnipayService;
|
import cc.mrbird.febs.rabbit.producter.AgentProducer;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.crypto.SecureUtil;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.math.BigInteger;
|
import java.text.DecimalFormat;
|
import java.util.*;
|
|
/**
|
* @author wzy
|
* @date 2021-09-18
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class ApiMallOrderInfoServiceImpl extends ServiceImpl<MallOrderInfoMapper, MallOrderInfo> implements IApiMallOrderInfoService {
|
|
private final MallGoodsMapper mallGoodsMapper;
|
private final MallGoodsSkuMapper mallGoodsSkuMapper;
|
private final MallAddressInfoMapper mallAddressInfoMapper;
|
private final MallOrderItemMapper mallOrderItemMapper;
|
private final MallMemberMapper memberMapper;
|
private final MallGoodsCommentMapper mallGoodsCommentMapper;
|
private final IApiMallMemberWalletService memberWalletService;
|
private final MallExpressInfoMapper expressInfoMapper;
|
private final MallOrderRefundMapper mallOrderRefundMapper;
|
private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper;
|
private final MallShoppingCartMapper mallShoppingCartMapper;
|
private final IApiMallMemberService memberService;
|
private final IMallMoneyFlowService mallMoneyFlowService;
|
private final RedisUtils redisUtils;
|
|
private final AgentProducer agentProducer;
|
private final IPayService payService;
|
private final IMallAchieveService mallAchieveService;
|
private final UnipayService unipayService;
|
|
private final MallMemberBankSignMapper mallMemberBankSignMapper;
|
private final MallMemberBankMapper mallMemberBankMapper;
|
private final MallShopApplyMapper mallShopApplyMapper;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final MallAchieveRecordMapper mallAchieveRecordMapper;
|
private final MallMemberWalletMapper mallMemberWalletMapper;
|
private final MallMqRecordMapper mallMqRecordMapper;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Long createOrder(AddOrderDto addOrderDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
|
MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId());
|
if (address == null) {
|
throw new FebsException("地址不存在");
|
}
|
|
String orderNo = MallUtils.getOrderNum();
|
MallOrderInfo orderInfo = new MallOrderInfo();
|
orderInfo.setOrderNo(orderNo);
|
orderInfo.setOrderTime(new Date());
|
orderInfo.setMemberId(member.getId());
|
orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
|
orderInfo.setName(address.getName());
|
orderInfo.setAddress(address.getArea() + address.getAddress());
|
orderInfo.setPhone(address.getPhone());
|
orderInfo.setLatitude(address.getLatitude());
|
orderInfo.setLongitude(address.getLongitude());
|
orderInfo.setRemark(addOrderDto.getRemark());
|
orderInfo.setOrderType(addOrderDto.getOrderType());
|
|
if (CollUtil.isEmpty(addOrderDto.getItems())) {
|
throw new FebsException("参数错误");
|
}
|
|
int deliverType = ObjectUtil.isEmpty(addOrderDto.getDeliverType()) ? 1 : addOrderDto.getDeliverType();
|
if(2 == deliverType){
|
if(ObjectUtil.isEmpty(addOrderDto.getShopId())){
|
throw new FebsException("请选择门店");
|
}
|
Long shopId = addOrderDto.getShopId();
|
MallShopApply mallShopApply = mallShopApplyMapper.selectById(shopId);
|
if(ObjectUtil.isEmpty(mallShopApply)){
|
throw new FebsException("请选择门店");
|
}
|
if(MallShopApply.APPLY_AGREE != mallShopApply.getStatus()){
|
throw new FebsException("请选择门店");
|
}
|
orderInfo.setShopId(shopId);
|
}
|
|
this.baseMapper.insert(orderInfo);
|
BigDecimal total = BigDecimal.ZERO;
|
BigDecimal carriage = BigDecimal.ZERO;
|
for (AddOrderItemDto item : addOrderDto.getItems()) {
|
MallOrderItem orderItem = new MallOrderItem();
|
|
// 积分商品提交订单
|
if (addOrderDto.getOrderType() == 2) {
|
MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId());
|
if (mallGoods.getStock() < item.getCnt()) {
|
throw new FebsException(mallGoods.getGoodsName() + "库存不足");
|
}
|
|
if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
|
throw new FebsException(mallGoods.getGoodsName() + "已下架");
|
}
|
|
BigDecimal amount = mallGoods.getScore().multiply(BigDecimal.valueOf(item.getCnt()));
|
orderItem.setAmount(amount);
|
orderItem.setCnt(item.getCnt());
|
orderItem.setOrderId(orderInfo.getId());
|
orderItem.setPrice(mallGoods.getScore());
|
orderItem.setGoodsId(mallGoods.getId());
|
orderItem.setGoodsName(mallGoods.getGoodsName());
|
orderItem.setStyleName(mallGoods.getGoodsName());
|
orderItem.setSkuName(mallGoods.getGoodsName());
|
orderItem.setSkuImage(mallGoods.getThumb());
|
|
total = total.add(amount);
|
} else {
|
MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
|
if (sku == null) {
|
throw new FebsException("购买商品或sku不存在");
|
}
|
|
if (sku.getStock() < item.getCnt()) {
|
throw new FebsException(sku.getSkuName() + "库存不足");
|
}
|
|
MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
|
|
// 零撸专区购买
|
if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) {
|
List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId());
|
if (CollUtil.isNotEmpty(items)) {
|
throw new FebsException("无法重复领取同一个商品");
|
}
|
}
|
|
if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
|
throw new FebsException(mallGoods.getGoodsName() + "已下架");
|
}
|
|
BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
|
orderItem.setAmount(amount);
|
orderItem.setCnt(item.getCnt());
|
orderItem.setOrderId(orderInfo.getId());
|
orderItem.setPrice(sku.getPresentPrice());
|
orderItem.setGoodsId(sku.getGoodsId());
|
orderItem.setGoodsName(sku.getGoodsName());
|
orderItem.setSkuId(sku.getId());
|
orderItem.setStyleName(sku.getStyleName());
|
orderItem.setSkuName(sku.getSkuName());
|
orderItem.setSkuImage(sku.getSkuImage());
|
orderItem.setIsNormal(mallGoods.getIsNormal());
|
orderItem.setCostPrice(sku.getCostPrice());
|
|
total = total.add(amount);
|
carriage = carriage.add(mallGoods.getCarriage());
|
|
sku.setStock(sku.getStock() - item.getCnt());
|
sku.setSkuVolume(sku.getSkuVolume() + item.getCnt());
|
mallGoodsSkuMapper.updateById(sku);
|
|
if (addOrderDto.getType() == 1) {
|
mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
|
}
|
}
|
mallOrderItemMapper.insert(orderItem);
|
}
|
/**
|
* 使用积分折扣现金
|
*/
|
DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.SCORE_CHANGE.getType(),
|
DataDictionaryEnum.SCORE_CHANGE.getCode()
|
);
|
BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore();
|
orderInfo.setScoreCnt(score);
|
BigDecimal scoreChange = BigDecimal.ONE;
|
if(ObjectUtil.isNotEmpty(scoreChangeDic)){
|
scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN);
|
}
|
//折扣现金
|
BigDecimal scorePercentAmount = score.divide(scoreChange,BigDecimal.ROUND_DOWN).setScale(2,BigDecimal.ROUND_DOWN);
|
orderInfo.setScoreAmount(scorePercentAmount);
|
orderInfo.setAmount(total);
|
if(2 == deliverType){
|
orderInfo.setDeliverType(2);
|
orderInfo.setCarriage(BigDecimal.ZERO);
|
}else{
|
orderInfo.setDeliverType(1);
|
orderInfo.setCarriage(carriage);
|
}
|
this.baseMapper.updateById(orderInfo);
|
|
agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L);
|
return orderInfo.getId();
|
}
|
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void cancelOrder(Long id) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
|
throw new FebsException("订单不是待付款, 无法取消");
|
}
|
|
orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
|
orderInfo.setCancelType(MallOrderInfo.CANCEL_BY_SELF);
|
this.baseMapper.updateById(orderInfo);
|
}
|
|
// public static void main(String[] args) {
|
// String unipayStr = "{\"r1_MerchantNo\":\"888118000001971\",\"rd_Pic\":\"\",\"r6_FrpCode\":\"ALIPAY_H5\",\"r7_TrxNo\":\"100222082332490699\",\"r0_Version\":\"1.0\",\"r3_Amount\":\"0.01\",\"r4_Cur\":\"1\",\"r2_OrderNo\":\"2022082212510288174\",\"rb_CodeMsg\":\"\",\"hmac\":\"1659BB77DEDDF9956EA4D6DF227C3B14\",\"ra_Code\":100,\"rc_Result\":\"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title></title></head><body><script type='text/javascript'>location.href='https://qr.alipay.com/bax019737vbdwoisxcdp00a2';</script></body></html>\"}";
|
// JSONObject jsonObject = JSONUtil.parseObj(unipayStr);
|
// String r7_trxNo = (String) jsonObject.get("r7_TrxNo");
|
// System.out.println(r7_trxNo);
|
// }
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Map<String, Object> payOrder(PayOrderDto payOrderDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(payOrderDto.getId());
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
|
throw new FebsException("订单状态不能支付");
|
}
|
|
String payResultStr = "";
|
String rcResult = "";
|
switch (payOrderDto.getType()) {
|
case "1":
|
UnipayDto unipayDtoWx = new UnipayDto();
|
// unipayDto.setAmount(new BigDecimal("0.01"));
|
unipayDtoWx.setAmount(orderInfo.getAmount());
|
unipayDtoWx.setFrpCode("WEIXIN_APP3");
|
unipayDtoWx.setTradeMerchantNo("777180800385820");
|
unipayDtoWx.setOrderNo(orderInfo.getOrderNo());
|
List<MallOrderItem> itemsWx = orderInfo.getItems();
|
if(CollUtil.isEmpty(itemsWx)){
|
unipayDtoWx.setProductName("商品");
|
}else{
|
unipayDtoWx.setProductName(itemsWx.get(0).getGoodsName());
|
}
|
String unipayStrWx = unipayService.unipay(unipayDtoWx);
|
if("fail" == unipayStrWx){
|
throw new FebsException("支付失败");
|
}else{
|
// JSONUtil.parseObj(unipayStr);
|
JSONObject jsonObject = JSONUtil.parseObj(unipayStrWx);
|
payResultStr = (String) jsonObject.get("r7_TrxNo");
|
rcResult = (String) jsonObject.get("rc_Result");
|
}
|
orderInfo.setPayOrderNo(payResultStr);
|
// orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo());
|
// orderInfo.setPayImage(payOrderDto.getPayImage());
|
orderInfo.setPayMethod("微信支付");
|
break;
|
case "2":
|
// if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) {
|
// payResultStr = orderInfo.getPayOrderNo();
|
// } else {
|
// payResultStr = payService.aliPay(orderInfo);
|
// }
|
UnipayDto unipayDto = new UnipayDto();
|
// unipayDto.setAmount(new BigDecimal("0.01"));
|
unipayDto.setAmount(orderInfo.getAmount());
|
unipayDto.setFrpCode("ALIPAY_H5");
|
unipayDto.setTradeMerchantNo("777184100385821");
|
unipayDto.setOrderNo(orderInfo.getOrderNo());
|
List<MallOrderItem> items = orderInfo.getItems();
|
if(CollUtil.isEmpty(items)){
|
unipayDto.setProductName("商品");
|
}else{
|
unipayDto.setProductName(items.get(0).getGoodsName());
|
}
|
String unipayStr = unipayService.unipay(unipayDto);
|
if("fail" == unipayStr){
|
throw new FebsException("支付失败");
|
}else{
|
// JSONUtil.parseObj(unipayStr);
|
JSONObject jsonObject = JSONUtil.parseObj(unipayStr);
|
payResultStr = (String) jsonObject.get("r7_TrxNo");
|
rcResult = (String) jsonObject.get("rc_Result");
|
}
|
orderInfo.setPayOrderNo(payResultStr);
|
orderInfo.setPayMethod("支付宝支付");
|
// agentProducer.sendOrderReturn(orderInfo.getId());
|
break;
|
case "3":
|
payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance");
|
|
orderInfo.setPayOrderNo(orderInfo.getOrderNo());
|
orderInfo.setPayMethod("余额支付");
|
orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
|
orderInfo.setPayTime(new Date());
|
orderInfo.setPayResult("1");
|
|
changeWallet(orderInfo.getId());
|
/**
|
* 插入一条待处理记录
|
* mq处理之后,更新状态
|
*/
|
MallMqRecord mallMqRecord = new MallMqRecord();
|
mallMqRecord.setOrderId(orderInfo.getId());
|
mallMqRecord.setState(2);
|
mallMqRecord.setRetryTimes(2);
|
mallMqRecordMapper.insert(mallMqRecord);
|
//发送补贴消息
|
agentProducer.sendPerkMoneyMsg(orderInfo.getId());
|
//发送代理自动升级消息
|
agentProducer.sendAutoLevelUpMsg(member.getId());
|
break;
|
case "4":
|
if (orderInfo.getOrderType() != 2) {
|
throw new FebsException("非积分订单,无法使用积分支付");
|
}
|
payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore");
|
|
orderInfo.setPayOrderNo(orderInfo.getOrderNo());
|
orderInfo.setPayMethod("积分支付");
|
orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
|
orderInfo.setPayTime(new Date());
|
orderInfo.setPayResult("1");
|
|
mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue());
|
break;
|
case "5":
|
AgreementPayDto agreementPayDto = new AgreementPayDto();
|
agreementPayDto.setOrderNo(orderInfo.getOrderNo());
|
|
BigDecimal value = orderInfo.getAmount().setScale(2, BigDecimal.ROUND_DOWN);
|
DecimalFormat decimalFormat = new DecimalFormat("0.00#");
|
String strVal = decimalFormat.format(value);
|
agreementPayDto.setOrderAmount(new BigDecimal(strVal));
|
agreementPayDto.setOrderTime(DateUtil.now());
|
List<MallOrderItem> itemsGoods = orderInfo.getItems();
|
if(CollUtil.isEmpty(itemsGoods)){
|
agreementPayDto.setOrderDesc("商品");
|
}else{
|
agreementPayDto.setOrderDesc(itemsGoods.get(0).getGoodsName());
|
}
|
Long bankId = payOrderDto.getBankId() == null ? 0L : payOrderDto.getBankId();
|
MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(bankId);
|
if(ObjectUtil.isEmpty(mallMemberBank)){
|
throw new FebsException("银行卡未添加");
|
}
|
String bankNo = mallMemberBank.getBankNo();
|
MallMemberBankSign mallMemberBankSign = mallMemberBankSignMapper.selectOneByMemberIdAndBankCardNo(member.getId(), bankNo);
|
if(ObjectUtil.isEmpty(mallMemberBankSign)){
|
throw new FebsException("银行卡未签约");
|
}
|
agreementPayDto.setBankNo(bankNo);
|
String agreementPayStr = unipayService.agreementPay(agreementPayDto);
|
|
if("fail".equals(agreementPayStr)){
|
throw new FebsException("支付失败");
|
}else{
|
JSONObject jsonObject = JSONUtil.parseObj(agreementPayStr);
|
payResultStr = (String) jsonObject.get("biz_code");
|
String payBizMsg = (String) jsonObject.get("biz_msg");
|
if(!"JS000000".equals(payResultStr)){
|
throw new FebsException(payBizMsg);
|
}
|
}
|
orderInfo.setPayMethod("快捷协议支付");
|
break;
|
default:
|
|
}
|
|
this.baseMapper.updateById(orderInfo);
|
Map<String, Object> map = new HashMap<>();
|
map.put("orderInfo", payResultStr);
|
map.put("orderNo", orderInfo.getOrderNo());
|
map.put("orderId", orderInfo.getId());
|
map.put("rcResult", rcResult);
|
|
return map;
|
}
|
|
/**
|
* 支付金额后的操作
|
* 减少积分,增加流水
|
* 购买套餐后,升级会员等级
|
* 增加支付金额流水
|
* 增加补贴额度
|
* 增加贡献值,增加流水
|
* 产生一条业绩记录
|
* @param orderId
|
*/
|
@Override
|
public void changeWallet(Long orderId){
|
MallOrderInfo orderInfo = this.baseMapper.selectById(orderId);
|
Long memberId = orderInfo.getMemberId();
|
boolean hasTc = false;
|
//总贡献值
|
BigDecimal starSum = BigDecimal.ZERO;
|
/**
|
* 总补贴额度
|
* 所有合伙人补贴至消费礼包的三倍额度需要复购一次。
|
*/
|
BigDecimal scoreSum = BigDecimal.ZERO;
|
List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId());
|
if (CollUtil.isNotEmpty(orderItems)) {
|
for (MallOrderItem orderItem : orderItems) {
|
MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId());
|
/**
|
* 购买套餐赠送贡献值
|
* 补贴3倍额度
|
*/
|
if (mallGoods.getIsNormal() == 2) {
|
hasTc = true;
|
BigDecimal star = (mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar())
|
.multiply(new BigDecimal(orderItem.getCnt()));
|
starSum = starSum.add(star);
|
scoreSum = scoreSum.add(
|
new BigDecimal(mallGoods.getPresentPrice())
|
.multiply(new BigDecimal(3))
|
.multiply(new BigDecimal(orderItem.getCnt()))
|
.abs()
|
.setScale(2,BigDecimal.ROUND_DOWN));
|
}
|
}
|
/**
|
* 增加贡献值,增加流水
|
*/
|
if (starSum.compareTo(BigDecimal.ZERO) > 0) {
|
//系统设置的个人贡献点最大值
|
DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.STAR_GET.getType(),
|
DataDictionaryEnum.STAR_GET.getCode());
|
if(ObjectUtil.isNotEmpty(starGetDic)){
|
String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue();
|
BigDecimal starGet = new BigDecimal(starGetStr);
|
|
MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
|
BigDecimal star = new BigDecimal(mallMemberWallet.getStar());
|
if(starGet.compareTo(star.add(starSum)) < 0){
|
if(starGet.compareTo(BigDecimal.ZERO) == 0){
|
mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId);
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
starSum,
|
MoneyFlowTypeEnum.STAR.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.STAR.getValue());
|
}
|
if(starGet.compareTo(star) > 0){
|
BigDecimal subtract = starGet.subtract(star);
|
if(subtract.compareTo(starSum) < 0){
|
starSum = subtract;
|
}
|
mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId);
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
starSum,
|
MoneyFlowTypeEnum.STAR.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.STAR.getValue());
|
}
|
}else{
|
mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId);
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
starSum,
|
MoneyFlowTypeEnum.STAR.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.STAR.getValue());
|
}
|
}
|
}
|
/**
|
* 增加补贴额度
|
*/
|
if (scoreSum.compareTo(BigDecimal.ZERO) > 0) {
|
memberWalletService.add(scoreSum, memberId, "totalScore");
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
scoreSum,
|
MoneyFlowTypeEnum.TOTAL_SCORE.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.TOTAL_SCORE.getValue());
|
}
|
}
|
|
/**
|
* 购买套餐后,升级会员等级
|
*/
|
if (hasTc) {
|
MallMember mallMember = memberMapper.selectById(memberId);
|
if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) {
|
mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name());
|
memberMapper.updateById(mallMember);
|
}
|
}
|
/**
|
* 增加支付金额流水
|
*/
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).negate(),
|
MoneyFlowTypeEnum.PAY.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.BALANCE.getValue());
|
/**
|
* 减少积分,增加流水
|
*/
|
int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), memberId, "prizeScore");
|
if (reduce == 2) {
|
throw new FebsException("积分不足");
|
}
|
mallMoneyFlowService.addMoneyFlow(
|
memberId,
|
orderInfo.getScoreCnt().negate(),
|
MoneyFlowTypeEnum.PAY.getValue(),
|
orderInfo.getOrderNo(),
|
FlowTypeEnum.PRIZE_SCORE.getValue());
|
/**
|
* 产生一条业绩记录
|
*/
|
MallAchieveRecord mallAchieveRecord = new MallAchieveRecord();
|
mallAchieveRecord.setMemberId(memberId);
|
mallAchieveRecord.setAchieveTime(new Date());
|
mallAchieveRecord.setAmount(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()));
|
mallAchieveRecord.setOrderId(orderId);
|
mallAchieveRecord.setPayTime(orderInfo.getPayTime());
|
mallAchieveRecordMapper.insert(mallAchieveRecord);
|
}
|
|
public static void main(String[] args) {
|
String str = "{\"biz_code\":\"JS000000\",\"biz_msg\":\"成功\",\"data\":\"{\\\"order_status\\\":\\\"P2000\\\",\\\"jp_order_no\\\":\\\"100120220826446740396081496064\\\",\\\"err_msg\\\":\\\"短信验证码不符\\\",\\\"err_code\\\":\\\"CP110026\\\",\\\"sign_no\\\":\\\"\\\",\\\"mch_order_no\\\":\\\"NO_2022082618263952399\\\"}\",\"mch_no\":\"888118000001971\",\"rand_str\":\"an2w7ulf5ru6upkk5bdg441kdi3gnpvu\",\"resp_code\":\"SUCCESS\",\"sec_key\":\"\",\"sign\":\"NiJXRTSIZ9xZMUOwEHiEHdZXmgL2cHUU5WUa1NbMRRzui0DIiuZSW4e31LjnBxwVwmy3uuPMP+tqhY8VLyC8uCFOdGdZI7e72VuRvyvaiW7/sqCrsfgPOBEjiGE/CmSMRoEXv9HmqCyNBF6iHSEhQJql5Yge30dQdyB6xFfqjk0=\",\"sign_type\":\"2\"}";
|
|
JSONObject jsonObject = JSONUtil.parseObj(str);
|
String payResultStr = (String) jsonObject.get("biz_code");
|
String signBizMsg = (String) jsonObject.get("biz_msg");
|
String signData = (String) jsonObject.get("data");
|
|
JSONObject signDatajsonObject = JSONUtil.parseObj(signData);
|
String err_msg = (String) signDatajsonObject.get("err_msg");
|
if(ObjectUtil.isNotNull(signDatajsonObject.get("err_code"))){
|
System.out.println(err_msg);
|
}
|
}
|
|
private String balancePay(MallOrderInfo orderInfo, String tradePwd, String field) {
|
if (StrUtil.isBlank(tradePwd)) {
|
throw new FebsException("支付密码错误");
|
}
|
|
MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId());
|
if (StrUtil.isBlank(mallMember.getTradePassword())) {
|
throw new FebsException("未设置支付密码");
|
}
|
|
if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) {
|
throw new FebsException("支付密码错误");
|
}
|
|
int reduce = memberWalletService.reduce(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).add(orderInfo.getCarriage()), mallMember.getId(), field);
|
if (reduce == 2) {
|
throw new FebsException("余额不足");
|
}
|
return orderInfo.getOrderNo();
|
}
|
|
|
@Override
|
public List<OrderListVo> findOrderList(OrderListDto orderListDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
IPage<MallOrderInfo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
|
|
orderListDto.setMemberId(member.getId());
|
IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectApiOrderListInPage(page, orderListDto);
|
return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords());
|
}
|
|
@Override
|
public OrderDetailVo findOrderDetailsById(Long id) {
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id);
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
OrderDetailVo orderDetailVo = MallOrderInfoConversion.INSTANCE.entityToDetailVo(orderInfo);
|
|
Integer deliverType = (ObjectUtil.isEmpty(orderInfo.getDeliverType()) ? new Integer(0):orderInfo.getDeliverType());
|
if (orderInfo.getStatus() == OrderStatusEnum.WAIT_FINISH.getValue() && 2 != deliverType) {
|
MallExpressInfo expressInfo = expressInfoMapper.selectByOrderId(orderInfo.getId());
|
orderDetailVo.setExpressNo(expressInfo.getExpressNo());
|
orderDetailVo.setExpressCom(expressInfo.getExpressCom());
|
}
|
|
if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue() || orderInfo.getStatus() == OrderStatusEnum.REFUNDED.getValue()) {
|
MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId());
|
OrderRefundVo orderRefundVo = MallOrderRefundConversion.INSTANCE.entityToVo(orderRefund);
|
orderDetailVo.setOrderRefund(orderRefundVo);
|
}
|
|
if (OrderStatusEnum.WAIT_PAY.getValue() == orderInfo.getStatus()) {
|
Date endTime = DateUtil.offsetMinute(orderInfo.getOrderTime(), 15);
|
|
long remainTime = DateUtil.between(new Date(), endTime, DateUnit.SECOND, false);
|
orderDetailVo.setRemainTime(remainTime);
|
}
|
if(2 == deliverType){
|
MallShopApply mallShopApply = mallShopApplyMapper.selectById(orderInfo.getShopId());
|
if(ObjectUtil.isNotEmpty(mallShopApply)){
|
ApiShopApplyVo apiShopApplyVo = new ApiShopApplyVo();
|
apiShopApplyVo.setName(mallShopApply.getName());
|
apiShopApplyVo.setPhone(mallShopApply.getPhone());
|
apiShopApplyVo.setSaleArea(mallShopApply.getSaleArea());
|
apiShopApplyVo.setLatitude(mallShopApply.getLatitude());
|
apiShopApplyVo.setLongitude(mallShopApply.getLongitude());
|
apiShopApplyVo.setShopName(mallShopApply.getShopName());
|
apiShopApplyVo.setAddress(mallShopApply.getAddress());
|
orderDetailVo.setApiShopApplyVo(apiShopApplyVo);
|
}
|
}
|
return orderDetailVo;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void confirmOrder(Long id) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
if (orderInfo.getStatus() != OrderStatusEnum.WAIT_FINISH.getValue()) {
|
throw new FebsException("该状态不能确认收货");
|
}
|
|
orderInfo.setStatus(OrderStatusEnum.FINISH.getValue());
|
orderInfo.setReceivingTime(new Date());
|
this.baseMapper.updateById(orderInfo);
|
}
|
|
@Override
|
public void delOrder(Long id) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
orderInfo.setDelFlag(AppContants.DEL_FLAG_Y);
|
this.baseMapper.updateById(orderInfo);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void applyRefund(AddRefundDto addRefundDto) {
|
MallOrderInfo orderInfo = this.baseMapper.selectById(addRefundDto.getId());
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
|
if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue()) {
|
throw new FebsException("已提交退款, 请勿重复提交");
|
}
|
|
if (orderInfo.getStatus() != OrderStatusEnum.WAIT_SHIPPING.getValue() && orderInfo.getStatus() != OrderStatusEnum.WAIT_FINISH.getValue()) {
|
throw new FebsException("该订单不能退款");
|
}
|
|
Integer beforeStatus = orderInfo.getStatus();
|
MallMember member = LoginUserUtil.getLoginUser();
|
orderInfo.setStatus(OrderStatusEnum.REFUNDING.getValue());
|
this.baseMapper.updateById(orderInfo);
|
|
MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId());
|
if (orderRefund == null) {
|
orderRefund = new MallOrderRefund();
|
orderRefund.setOrderId(orderInfo.getId());
|
orderRefund.setMemberId(member.getId());
|
orderRefund.setDesp(addRefundDto.getDesp());
|
orderRefund.setReason(addRefundDto.getReason());
|
orderRefund.setType(addRefundDto.getType());
|
orderRefund.setRefundTime(new Date());
|
orderRefund.setBeforeStatus(beforeStatus);
|
orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue());
|
|
// 未发货则退运费,发货了则不退
|
if (beforeStatus == 2) {
|
orderRefund.setAmount(orderInfo.getAmount().add(orderInfo.getCarriage()));
|
} else {
|
orderRefund.setAmount(orderInfo.getAmount());
|
}
|
mallOrderRefundMapper.insert(orderRefund);
|
} else {
|
orderRefund.setDesp(addRefundDto.getDesp());
|
orderRefund.setReason(addRefundDto.getReason());
|
orderRefund.setType(addRefundDto.getType());
|
orderRefund.setRefundTime(new Date());
|
orderRefund.setBeforeStatus(beforeStatus);
|
orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue());
|
// 未发货则退运费,发货了则不退
|
if (beforeStatus == 2) {
|
orderRefund.setAmount(orderInfo.getAmount().add(orderInfo.getCarriage()));
|
} else {
|
orderRefund.setAmount(orderInfo.getAmount());
|
}
|
mallOrderRefundMapper.updateById(orderRefund);
|
}
|
|
|
MallOrderRefundOperation operation = new MallOrderRefundOperation();
|
operation.setOrderId(orderInfo.getId());
|
operation.setRefundId(orderRefund.getId());
|
operation.setContent(StrUtil.format("用户:{}提交退款申请", member.getName()));
|
mallOrderRefundOperationMapper.insert(operation);
|
}
|
|
@Override
|
public void refundExpress(RefundExpressDto refundExpressDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
|
MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(refundExpressDto.getId());
|
if (!OrderRefundStatusEnum.AGREE.getValue().equals(orderRefund.getStatus())) {
|
throw new FebsException("暂不能提交物流信息");
|
}
|
|
orderRefund.setExpressNo(refundExpressDto.getExpressNo());
|
orderRefund.setExpressCom(refundExpressDto.getExpressCom());
|
orderRefund.setStatus(OrderRefundStatusEnum.EXPRESS_SUBMIT.getValue());
|
mallOrderRefundMapper.updateById(orderRefund);
|
|
MallOrderRefundOperation operation = new MallOrderRefundOperation();
|
operation.setOrderId(refundExpressDto.getId());
|
operation.setRefundId(orderRefund.getId());
|
operation.setContent(StrUtil.format("用户:{}提交物流信息,快递公司:{},单号:{}", member.getName(), refundExpressDto.getExpressCom(), refundExpressDto.getExpressNo()));
|
mallOrderRefundOperationMapper.insert(operation);
|
}
|
|
@Override
|
public void autoCancelOrder(Long id) {
|
MallOrderInfo orderInfo = this.baseMapper.selectById(id);
|
if (orderInfo == null) {
|
log.error("自动取消订单参数错误:{}", id);
|
return;
|
}
|
if (orderInfo.getStatus() == OrderStatusEnum.WAIT_PAY.getValue()) {
|
log.info("自动取消订单:{},{}", orderInfo.getMemberId(), id);
|
orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
|
orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
|
this.baseMapper.updateById(orderInfo);
|
}
|
}
|
|
@Override
|
@Transactional
|
public void goodsComment(ApiAddCommentDtos addCommentDtos) {
|
Long orderId = addCommentDtos.getOrderId();
|
MallMember member = LoginUserUtil.getLoginUser();
|
MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(orderId);
|
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
|
throw new FebsException("订单不存在");
|
}
|
if (OrderStatusEnum.FINISH.getValue() != orderInfo.getStatus()) {
|
throw new FebsException("该状态不能评价");
|
}
|
if (MallOrderInfo.COMMENT_STATE_YES == orderInfo.getCommentState()) {
|
throw new FebsException("该状态不能评价");
|
}
|
|
orderInfo.setCommentState(MallOrderInfo.COMMENT_STATE_YES);
|
this.baseMapper.updateById(orderInfo);
|
|
List<ApiAddCommentDto> apiAddCommentDtos = addCommentDtos.getApiAddCommentDtos();
|
if(CollUtil.isNotEmpty(apiAddCommentDtos)){
|
for(ApiAddCommentDto apiAddCommentDto : apiAddCommentDtos){
|
Long skuId = apiAddCommentDto.getSkuId();
|
MallGoodsSku mallGoodsSku = mallGoodsSkuMapper.selectById(skuId);
|
Long goodsId = apiAddCommentDto.getGoodsId();
|
MallGoods mallGoods = mallGoodsMapper.selectById(goodsId);
|
MallGoodsComment mallGoodsComment = MallGoodsCommentConversion.INSTANCE.dtoToEntity(apiAddCommentDto);
|
mallGoodsComment.setMemberId(member.getId());
|
mallGoodsComment.setOrderId(orderId);
|
mallGoodsComment.setGoodsName(mallGoods.getGoodsName());
|
mallGoodsComment.setSkuName(mallGoodsSku.getSkuName());
|
mallGoodsComment.setStyleId(mallGoodsSku.getStyleId());
|
mallGoodsComment.setStyleName(mallGoodsSku.getStyleName());
|
mallGoodsComment.setShowState(MallGoodsComment.SHOW_STATE_ENABLE);
|
mallGoodsCommentMapper.insert(mallGoodsComment);
|
}
|
}
|
}
|
|
@Override
|
public FebsResponse bangCardSign(BangCardSignDto bangCardSignDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
Long memberId = member.getId();
|
String bankCard = bangCardSignDto.getBankCard();
|
MallMemberBankSign mallMemberBankSign = mallMemberBankSignMapper.selectOneByMemberIdAndBankCardNo(memberId,bankCard);
|
if(ObjectUtil.isNotEmpty(mallMemberBankSign)){
|
return new FebsResponse().success().data(mallMemberBankSign);
|
}else{
|
return new FebsResponse().success();
|
}
|
}
|
|
@Override
|
public FebsResponse judgeCreateOrder(AddOrderDto addOrderDto) {
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
if (CollUtil.isEmpty(addOrderDto.getItems())) {
|
throw new FebsException("请选择购买商品");
|
}
|
|
boolean hasTc = false;
|
//总的折扣积分数量
|
BigDecimal total = BigDecimal.ZERO;
|
for (AddOrderItemDto item : addOrderDto.getItems()) {
|
MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
|
MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
|
/**
|
* 贡献点判断
|
*/
|
if (mallGoods.getIsNormal() == 2) {
|
hasTc = true;
|
}
|
/*
|
获取单个商品的折扣积分数量
|
= 现价 * 数量 * 折扣现金比例
|
*/
|
BigDecimal scorePercent = new BigDecimal(mallGoods.getScorePercent()).multiply(new BigDecimal(0.01));
|
BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())).multiply(scorePercent);
|
total = total.add(amount);
|
}
|
|
BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore();
|
if(hasTc){
|
//系统设置的个人贡献点最大值
|
DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.STAR_GET.getType(),
|
DataDictionaryEnum.STAR_GET.getCode());
|
if(ObjectUtil.isNotEmpty(starGetDic)){
|
String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue();
|
BigDecimal starGet = new BigDecimal(starGetStr);
|
|
MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
|
BigDecimal star = new BigDecimal(mallMemberWallet.getStar());
|
if(starGet.compareTo(BigDecimal.ZERO) != 0 && starGet.compareTo(star) <= 0){
|
throw new FebsException("无法购买套餐");
|
}
|
BigDecimal prizeScore = mallMemberWallet.getPrizeScore();
|
if(prizeScore.compareTo(score) < 0){
|
throw new FebsException("积分不足");
|
}
|
}
|
}
|
/**
|
* 使用积分折扣现金
|
*/
|
DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.SCORE_CHANGE.getType(),
|
DataDictionaryEnum.SCORE_CHANGE.getCode()
|
);
|
|
//最大折扣金额对应需要的总积分数目
|
BigDecimal scorePercentMaxAmount = total;
|
BigDecimal scoreChange = BigDecimal.ONE;
|
if(ObjectUtil.isNotEmpty(scoreChangeDic)){
|
scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN);
|
}
|
scorePercentMaxAmount = scorePercentMaxAmount.multiply(scoreChange).setScale(2,BigDecimal.ROUND_DOWN);
|
if(scorePercentMaxAmount.compareTo(score) < 0){
|
throw new FebsException("最多可使用"+scorePercentMaxAmount+"积分");
|
}
|
return new FebsResponse().success();
|
}
|
|
@Override
|
public ApiScoreSetVo myScoreSet() {
|
ApiScoreSetVo apiScoreSetVo = new ApiScoreSetVo();
|
DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.SCORE_PERCENT.getType(),
|
DataDictionaryEnum.SCORE_PERCENT.getCode()
|
);
|
DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.SCORE_CHANGE.getType(),
|
DataDictionaryEnum.SCORE_CHANGE.getCode()
|
);
|
apiScoreSetVo.setScorePercent(new BigDecimal(scorePercentDic.getValue()).multiply(BigDecimal.valueOf(0.01)).setScale(2,BigDecimal.ROUND_DOWN));
|
apiScoreSetVo.setScoreChange(new BigDecimal(scoreChangeDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN));
|
return apiScoreSetVo;
|
}
|
|
}
|