Commit 4dd4c6ca authored by shiyu's avatar shiyu

团购商品列表

parent 41a6eace
......@@ -190,11 +190,13 @@ public class SysSupplierItemServiceImpl implements SysSupplierItemService {
}
} else if (supplierItem.getType() == DistributionEnum.DistributionTypeEnum.GROUP_PURCHASE.getCode()) {
GroupPurchaseConfig groupPurchaseConfig = groupPurchaseConfigDao.findByItemId(supplierItem.getId());
if (groupPurchaseConfig.getEndTime().before(now) && groupPurchaseConfig.getState() != GroupPurchaseEnum.ItemStateEnum.END.getCode()) {
groupPurchaseConfigDao.updateState(supplierItem.getId(), GroupPurchaseEnum.ItemStateEnum.END.getCode());
} else if (now.after(groupPurchaseConfig.getStartTime()) && groupPurchaseConfig.getEndTime().after(now)
&& groupPurchaseConfig.getState() == GroupPurchaseEnum.ItemStateEnum.NOT_START.getCode()) {
groupPurchaseConfigDao.updateState(groupPurchaseConfig.getItemId(), GroupPurchaseEnum.ItemStateEnum.PROCESSING.getCode());
if (groupPurchaseConfig.getStartTime() != null && groupPurchaseConfig.getEndTime() != null) {
if (groupPurchaseConfig.getEndTime().before(now) && groupPurchaseConfig.getState() != GroupPurchaseEnum.ItemStateEnum.END.getCode()) {
groupPurchaseConfigDao.updateState(supplierItem.getId(), GroupPurchaseEnum.ItemStateEnum.END.getCode());
} else if (now.after(groupPurchaseConfig.getStartTime()) && groupPurchaseConfig.getEndTime().after(now)
&& groupPurchaseConfig.getState() == GroupPurchaseEnum.ItemStateEnum.NOT_START.getCode()) {
groupPurchaseConfigDao.updateState(groupPurchaseConfig.getItemId(), GroupPurchaseEnum.ItemStateEnum.PROCESSING.getCode());
}
}
supplierItemVo.setSalePrice(PriceUtil.convertPriceFenToYuan(groupPurchaseConfig.getPrice()));
supplierItemVo.setGroupPurchaseStartTime(DateUtils.toString(groupPurchaseConfig.getStartTime()));
......
......@@ -7,7 +7,7 @@ public class DistributionEnum {
*/
public enum DistributionOrderStateEnum {
PRE_PAY(1, "待付款"),
PRE_SALE(5, "预售中"),
PRE_SALE(5, "众筹中"),
PRE_SEND(10, "待发货"),
PRE_SIGNED(20, "待收货"),
AFTER_SALE(30, "售后中"),
......
......@@ -15,6 +15,8 @@ public interface UserAccountDetailDao {
List<UserAccountDetail> findList(UserAccountDetailRequestDto dto);
List<UserAccountDetail> findByTransactionId(String transactionId);
/**
* 根据交易id和收支类型查询账单明细
* @param transactionId
......
......@@ -30,6 +30,11 @@ public class GroupPurchaseRecordRequestDto extends BaseRequestDto {
*/
private String transactionId;
/**
* 买方的微信openid
*/
private String buyerOpenid;
/**
* 商品id
*/
......@@ -45,11 +50,6 @@ public class GroupPurchaseRecordRequestDto extends BaseRequestDto {
*/
private Long userId;
/**
* 用户openid
*/
private String userOpenid;
/**
* 定金金额
*/
......
......@@ -66,6 +66,14 @@ public class UserAccountDetailDaoImpl implements UserAccountDetailDao {
}
@Override
public List<UserAccountDetail> findByTransactionId(String transactionId) {
UserAccountDetailExample example = new UserAccountDetailExample();
UserAccountDetailExample.Criteria criteria = example.createCriteria();
criteria.andTransactionIdEqualTo(transactionId);
return userAccountDetailMapper.selectByExample(example);
}
@Override
public UserAccountDetail find(String transactionId, int type) {
UserAccountDetailExample example = new UserAccountDetailExample();
......
......@@ -166,46 +166,38 @@ public class WxPayCallbackController {
Result<Transaction> queryResult = wxPayServiceApi.queryOrderBytOutTradeNo(distributionOrderRequestDto);
//支付成功,修改订单状态
if (queryResult.getSuccess()) {
//处理团购支付订单定金的逻辑,判断单号的前缀是否是定金交易订单号
if (distributionOrderId.startsWith(CommConsts.GROUPPURCHASE_DEPOSIT_PREFIX)) {
Result updateResult = handleOrderOfDeposit(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else {
//查询系统中订单现在的状态,避免重复更新
DistributionOrder distributionOrder = distributionOrderDao.findById(distributionOrderId);
if (distributionOrder.getState() == DistributionEnum.DistributionOrderStateEnum.PRE_PAY.getCode()) {
//一口价处理逻辑
if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.FIXED_PRICE.getCode()) {
Result updateResult = updateOrderStateAndInsertProfit(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.AUCTION.getCode()) {
//竞拍订单处理
Result updateResult = handleAuctionOrder(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.COLLECT.getCode()) {
//藏馆订单
Result updateResult = handleOrderOfCollector(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.DISCOUNT.getCode()) {
//折扣订单
Result updateResult = handleOrderOfDiscount(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.GROUP_PURCHASE.getCode()) {
//团购订单
Result updateResult = handleOrderOfGroupPurchase(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
//查询系统中订单现在的状态,避免重复更新
DistributionOrder distributionOrder = distributionOrderDao.findById(distributionOrderId);
if (distributionOrder.getState() == DistributionEnum.DistributionOrderStateEnum.PRE_PAY.getCode()) {
//一口价处理逻辑
if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.FIXED_PRICE.getCode()) {
Result updateResult = updateOrderStateAndInsertProfit(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.AUCTION.getCode()) {
//竞拍订单处理
Result updateResult = handleAuctionOrder(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.COLLECT.getCode()) {
//藏馆订单
Result updateResult = handleOrderOfCollector(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.DISCOUNT.getCode()) {
//折扣订单
Result updateResult = handleOrderOfDiscount(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
} else if (distributionOrder.getType() == DistributionEnum.DistributionTypeEnum.GROUP_PURCHASE.getCode()) {
//团购订单
Result updateResult = handleOrderOfGroupPurchase(transaction);
if (!updateResult.getSuccess()) {
return JsonUtils.from(returnMap);
}
}
}
......@@ -398,13 +390,11 @@ public class WxPayCallbackController {
}
return Result.failed();
}
/**
/*
*//**
* 处理团购订单定金支付回调
* @return
*/
*//*
public Result handleOrderOfDeposit(Transaction transaction) {
try {
//商户订单号,分销订单号
......@@ -435,8 +425,7 @@ public class WxPayCallbackController {
logger.error(">>>>>>>>>>>> 团购订单支付定金回调通知处理失败 error :{}", e);
}
return Result.failed();
}
}*/
/**
......@@ -471,7 +460,7 @@ public class WxPayCallbackController {
/**
* 处理团购订单的回调
* 处理众筹祝福成功的回调
* @param transaction
* @return
*/
......@@ -488,24 +477,23 @@ public class WxPayCallbackController {
distributionOrderDto.setDistributionOrderId(distributionOrderId);
distributionOrderDto.setTransactionId(transactionId);
distributionOrderDto.setPayTime(TimeUtil.wxTimeConvertToDate(payTime));
distributionOrderDto.setState(DistributionEnum.DistributionOrderStateEnum.PRE_SEND.getCode());
distributionOrderDto.setState(DistributionEnum.DistributionOrderStateEnum.PRE_SALE.getCode());
distributionOrderDao.update(distributionOrderDto);
//用户付款成功后,把分销商利润的记录更新为有效,因为未付款前只是创建了预计利润记录,但并未生效
distributorProfitDao.updateValidState(distributionOrderId, true);
DistributionOrder distributionOrder = distributionOrderDao.findById(distributionOrderId);
SupplierItem supplierItem = supplierItemDao.findById(distributionOrder.getItemId());
//更新库存
supplierItemService.reduceStock(distributionOrder.getItemId(), distributionOrder.getItemNum());
logger.info(">>>>>>>>>>>> 团购订单,微信支付回调通知处理成功,更新拍卖订单状态和商品库存 <<<<<<<<<<<<");
logger.info(">>>>>>>>>>>> 团购订单,微信支付回调通知处理成功,更新团购订单状态和商品库存 <<<<<<<<<<<<");
//新增用户账户的明细,调整月度账单
DistributorProfit distributorProfit = distributorProfitDao.findById(distributionOrderId);
userAccountDetailService.create(distributionOrder, distributorProfit);
return Result.success();
} catch (Exception e) {
logger.error(">>>>>>>>>>>> 竞拍订单,微信支付回调通知处理失败 error :{}", e);
logger.error(">>>>>>>>>>>> 团购订单,微信支付回调通知处理失败 error :{}", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return Result.failed();
......@@ -597,29 +585,10 @@ public class WxPayCallbackController {
String successTime = refundNotification.getSuccessTime();
//查询系统中订单现在的状态,避免重复更新
DistributionOrder distributionOrder = distributionOrderDao.findById(distributionOrderId);
if (distributionOrderId.startsWith(CommConsts.DISTRIBUTION_ORDER_PREFIX)) {
//只有在订单状态为退款处理中,才进行退款成功的状态修改
if (distributionOrder.getState() == DistributionEnum.DistributionOrderStateEnum.REFUNDING.getCode()) {
//订单改为已取消的状态
distributionOrderDao.updateState(distributionOrderId, DistributionEnum.DistributionOrderStateEnum.CANCEL.getCode());
//退款单状态改为成功
RefundOrder refundOrder = new RefundOrder();
refundOrder.setRefundId(refundId);
refundOrder.setWxRefundId(refundNotification.getRefundId());
refundOrder.setUpdateTime(new Date());
refundOrder.setSuccessTime(TimeUtil.wxTimeConvertToDate(successTime));
refundOrder.setUserReceivedAccount(refundNotification.getUserReceivedAccount());
refundOrder.setState(RefundOrderEnum.StateEnum.SUCCESS.getCode());
refundOrderDao.update(refundOrder);
//分销商利润记录改为无效
distributorProfitDao.updateValidState(distributionOrderId, false);
logger.info(">>>>>>>> 分销单号:{}, 退款单号:{},退款处理成功, 退款时间为: {}<<<<<<<<<", distributionOrderId, refundId, TimeUtil.wxTimeConvertToDate(successTime));
returnMap.put("code", "SUCCESS");
returnMap.put("message", "成功");
return JsonUtils.from(returnMap);
}
} else if (distributionOrderId.startsWith(CommConsts.GROUPPURCHASE_DEPOSIT_PREFIX)) {
//团购定金交易单的退款处理
//只有在订单状态为退款处理中,才进行退款成功的状态修改
if (distributionOrder.getState() == DistributionEnum.DistributionOrderStateEnum.REFUNDING.getCode()) {
//订单改为已取消的状态
distributionOrderDao.updateState(distributionOrderId, DistributionEnum.DistributionOrderStateEnum.CANCEL.getCode());
//退款单状态改为成功
RefundOrder refundOrder = new RefundOrder();
refundOrder.setRefundId(refundId);
......@@ -629,6 +598,14 @@ public class WxPayCallbackController {
refundOrder.setUserReceivedAccount(refundNotification.getUserReceivedAccount());
refundOrder.setState(RefundOrderEnum.StateEnum.SUCCESS.getCode());
refundOrderDao.update(refundOrder);
//分销商利润记录改为无效
distributorProfitDao.updateValidState(distributionOrderId, false);
//账单记录设置无效
userAccountDetailService.cancel(distributionOrder);
logger.info(">>>>>>>> 分销单号:{}, 退款单号:{},退款处理成功, 退款时间为: {} <<<<<<<<<", distributionOrderId, refundId, TimeUtil.wxTimeConvertToDate(successTime));
returnMap.put("code", "SUCCESS");
returnMap.put("message", "成功");
return JsonUtils.from(returnMap);
}
} else {
//退款单状态改为失败
......
......@@ -12,7 +12,7 @@ public class GroupPurchaseInfo implements Entity {
/**
* 团购优惠要求件数
*/
private Integer requireNum;
private Integer targetNum;
/**
* 已达到的件数
......@@ -40,9 +40,9 @@ public class GroupPurchaseInfo implements Entity {
private List<String> userAvatarList;
/**
* 优惠比例
* 进度比例
*/
private String rebate;
private String rate;
/**
* 团购结束时间
......
......@@ -53,8 +53,8 @@ public class GroupPurchaseItemVo implements Entity {
private Boolean isSubscribedOfPay;
/**
* 折扣相关信息、进度
* 团购进度
*/
private GroupPurchaseInfo discountInfo;
private GroupPurchaseInfo rateInfo;
}
......@@ -491,15 +491,12 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
@Override
public Result createGroupPurchaseOrder(GroupPurchaseRecordRequestDto dto) {
try {
//查询团购定金
GroupPurchaseRecord groupPurchaseRecord = groupPurchaseRecordDao.findByPayId(dto.getDepositPayId());
long itemId = groupPurchaseRecord.getItemId();
long itemId = dto.getItemId();
SupplierItem supplierItem = supplierItemDao.findById(itemId);
//查询该用户和藏家的介绍人
FollowFansRecordRequestDto followFansRecordRequestDto = new FollowFansRecordRequestDto();
followFansRecordRequestDto.setFollowerId(supplierItem.getCreatorId());
followFansRecordRequestDto.setFansId(groupPurchaseRecord.getUserId());
followFansRecordRequestDto.setFansId(dto.getUserId());
FollowFansRecord followFansRecord = followFansRecordDao.findOne(followFansRecordRequestDto);
long introducerId;
//没有关注记录,则介绍费算作平台的
......@@ -509,25 +506,76 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
//把介绍人作为该订单的分享链接字段的值
introducerId = followFansRecord.getIntroducerId();
}
//查询团购商品配置
GroupPurchaseConfig groupPurchaseConfig = groupPurchaseConfigDao.findByItemId(itemId);
String distributionOrderId = IdUtils.getOrderNumber(DISTRIBUTION_ORDER_PREFIX);
DistributionOrderRequestDto prePayDto = new DistributionOrderRequestDto();
prePayDto.setDistributionOrderId(distributionOrderId);
prePayDto.setAmount(dto.getAmount());
prePayDto.setBuyerOpenid(dto.getBuyerOpenid());
prePayDto.setItemName(supplierItem.getName());
Result prePayResult = wxPayServiceApi.createPrepareOrder(prePayDto);
if (!prePayResult.getSuccess()) {
return Result.failed("众筹预下单失败");
}
String prepayId = (String) prePayResult.getData();
DistributionOrder distributionOrder = new DistributionOrder();
distributionOrder.setItemId(itemId);
distributionOrder.setItemNum(groupPurchaseRecord.getItemNum());
distributionOrder.setItemNum(dto.getItemNum());
distributionOrder.setShareRecordId(String.valueOf(introducerId));
distributionOrder.setDistributionOrderId(distributionOrderId);
distributionOrder.setBuyerId(groupPurchaseRecord.getUserId());
distributionOrder.setBuyerOpenid(groupPurchaseRecord.getUserOpenid());
distributionOrder.setBuyerId(dto.getUserId());
distributionOrder.setBuyerOpenid(dto.getBuyerOpenid());
distributionOrder.setShopId(supplierItem.getCreatorId());
distributionOrder.setSellerId(supplierItem.getCreatorId());
distributionOrder.setAmount(groupPurchaseConfig.getPrice());
distributionOrder.setAmount(PriceUtil.convertPriceFromStr(dto.getAmount()));
distributionOrder.setCreateTime(new Date());
distributionOrder.setUpdateTime(new Date());
distributionOrder.setState(DistributionEnum.DistributionOrderStateEnum.PRE_SALE.getCode());
distributionOrder.setState(DistributionEnum.DistributionOrderStateEnum.PRE_PAY.getCode());
distributionOrder.setType(DistributionEnum.DistributionTypeEnum.GROUP_PURCHASE.getCode());
distributionOrderDao.insert(distributionOrder);
//保存众筹记录
String depositPayId = IdUtils.getOrderNumber(CommConsts.GROUPPURCHASE_DEPOSIT_PREFIX);
GroupPurchaseRecord groupPurchaseRecord = new GroupPurchaseRecord();
groupPurchaseRecord.setDepositPayId(depositPayId);
groupPurchaseRecord.setPrepayId(prepayId);
groupPurchaseRecord.setItemId(distributionOrder.getItemId());
groupPurchaseRecord.setItemNum(distributionOrder.getItemNum());
groupPurchaseRecord.setUserId(distributionOrder.getBuyerId());
groupPurchaseRecord.setUserOpenid(distributionOrder.getBuyerOpenid());
groupPurchaseRecord.setAmount(distributionOrder.getAmount());
groupPurchaseRecord.setState(GroupPurchaseEnum.StateEnum.INVALID.getCode());
groupPurchaseRecordDao.insert(groupPurchaseRecord);
//计算利润
//查询该用户和藏家的介绍人
double rebate = distributorProfitService.getIntroduceRebate(followFansRecordRequestDto);
double introduceCost = distributionOrder.getAmount().doubleValue() * rebate;
//实际订单到账金额
double realAmount = distributionOrder.getAmount().doubleValue() * (1 - CommConsts.WX_COMMISSION_REBATE);
DistributorProfit distributorProfit = new DistributorProfit();
//团购的平台佣金 = 订单金额 - 藏家供货价 - 介绍佣金
double channelServiceCost = distributionOrder.getAmount().doubleValue() - supplierItem.getSupplyPrice() - introduceCost;
distributorProfit.setChannelCost(PriceUtil.convertPriceFromStr(PriceUtil.convertDoubleToString(channelServiceCost)));
distributorProfit.setIntroduceCost(PriceUtil.convertPriceFromStr(PriceUtil.convertDoubleToString(introduceCost)));
distributorProfit.setDistributionOrderId(distributionOrderId);
distributorProfit.setDistributorId(distributionOrder.getSellerId());
distributorProfit.setItemId(distributionOrder.getItemId());
distributorProfit.setItemNum(distributionOrder.getItemNum());
distributorProfit.setAmount(distributionOrder.getAmount());
distributorProfit.setRealAmount(PriceUtil.convertPriceFromStr(PriceUtil.convertDoubleToString(realAmount)));
distributorProfit.setItemCost(supplierItem.getSupplyPrice());
distributorProfit.setChannelCost(PriceUtil.convertPriceFromStr(PriceUtil.convertDoubleToString(channelServiceCost)));
distributorProfit.setIntroduceCost(PriceUtil.convertPriceFromStr(PriceUtil.convertDoubleToString(introduceCost)));
//团购订单,藏家的利润就是商品设置的供货价
distributorProfit.setProfit(supplierItem.getSupplyPrice());
distributorProfit.setCreateTime(new Date());
distributorProfit.setType(DistributionEnum.DistributionTypeEnum.GROUP_PURCHASE.getCode());
distributorProfit.setIsValid(false);
distributorProfitDao.insert(distributorProfit);
return Result.success(distributionOrderId);
} catch (Exception e) {
logger.error("团购订单创建失败 error : {}", e);
......@@ -1007,8 +1055,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
Result<GroupPurchaseInfo> result = groupPurchaseService.checkGroupPurchase(groupPurchaseRecordRequestDto);
GroupPurchaseConfig groupPurchaseConfig = groupPurchaseConfigDao.findByItemId(distributionOrder.getItemId());
distributionOrderDetailVo.setDeposit(PriceUtil.convertPriceFenToYuan(groupPurchaseConfig.getDeposit()));
distributionOrderDetailVo.setSurplusAmount(PriceUtil.convertPriceFenToYuan(distributionOrder.getAmount() - groupPurchaseConfig.getDeposit()));
distributionOrderDetailVo.setGroupPurchaseEndTime(groupPurchaseConfig.getEndTime());
Date endTime = groupPurchaseConfig.getEndTime();
Instant instant = endTime.toInstant().plus(Duration.ofHours(24));
......
......@@ -15,12 +15,11 @@ import com.wwdz.ch.db.dto.request.FollowFansRecordRequestDto;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import com.wwdz.ch.db.dto.request.distribution.GroupPurchaseConfigRequestDto;
import com.wwdz.ch.db.dto.request.distribution.GroupPurchaseRecordRequestDto;
import com.wwdz.ch.db.dto.request.distribution.SpecialPerformanceRequestDto;
import com.wwdz.ch.wx.entity.GroupPurchaseInfo;
import com.wwdz.ch.wx.entity.vo.distribution.GroupPurchaseItemVo;
import com.wwdz.ch.wx.service.distribution.DistributorProfitService;
import com.wwdz.ch.wx.service.distribution.GroupPurchaseService;
import jdk.internal.org.objectweb.asm.Handle;
import com.wwdz.ch.wx.service.distribution.UserAccountDetailService;
import org.redisson.api.RLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -28,12 +27,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
public class GroupPurchaseServiceImpl implements GroupPurchaseService {
......@@ -46,9 +43,6 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
@Autowired
GroupPurchaseConfigDao groupPurchaseConfigDao;
@Autowired
GroupPurchaseDiscountDao groupPurchaseDiscountDao;
@Autowired
GroupPurchaseRecordDao groupPurchaseRecordDao;
......@@ -73,6 +67,8 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
@Autowired
DisposableSubscribeRecordDao disposableSubscribeRecordDao;
@Autowired
UserAccountDetailService userAccountDetailService;
@Override
public Result findList(GroupPurchaseConfigRequestDto dto) {
......@@ -108,7 +104,7 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
if (!result.getSuccess()) {
continue;
}
groupPurchaseItemVo.setDiscountInfo(result.getData());
groupPurchaseItemVo.setRateInfo(result.getData());
groupPurchaseItemVos.add(groupPurchaseItemVo);
}
return Result.success(groupPurchaseItemVos);
......@@ -138,7 +134,7 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
if (!result.getSuccess()) {
return Result.failed("查询团购信息错误");
}
groupPurchaseItemVo.setDiscountInfo(result.getData());
groupPurchaseItemVo.setRateInfo(result.getData());
groupPurchaseItemVo.setIsSubscribedOfCloseToSuccess(disposableSubscribeRecordDao.isSubscribed(dto.getUserId(), itemId, DisposableSubscribeRecordEnum.TypeEnum.GROUPPURASE_CLOSER_TO_SUCCESS.getType()));
groupPurchaseItemVo.setIsSubscribedOfPay(disposableSubscribeRecordDao.isSubscribed(dto.getUserId(), itemId, DisposableSubscribeRecordEnum.TypeEnum.GROUPPURASE_SURPLUS_AMOUNT_PAY.getType()));
return Result.success(groupPurchaseItemVo);
......@@ -148,42 +144,11 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
return Result.failed("查询团购商品详情失败");
}
@Override
public Result payDeposit(GroupPurchaseRecordRequestDto dto) {
try {
GroupPurchaseRecord groupPurchaseRecord = new GroupPurchaseRecord();
//支付团购定金的交易单号
String depositPayId = IdUtils.getOrderNumber(CommConsts.GROUPPURCHASE_DEPOSIT_PREFIX);
groupPurchaseRecord.setDepositPayId(depositPayId);
SupplierItem supplierItem = supplierItemDao.findById(dto.getItemId());
DistributionOrderRequestDto prePayDto = new DistributionOrderRequestDto();
prePayDto.setDistributionOrderId(depositPayId);
prePayDto.setAmount(PriceUtil.convertPriceFromStr(dto.getAmount()).toString());
String openid = cacheUtil.appletUserInfoCache.get(dto.getUserId()).get().getWeixinOpenid();
prePayDto.setBuyerOpenid(openid);
prePayDto.setItemName(supplierItem.getName());
Result prePayResult = wxPayServiceApi.createPrepareOrder(prePayDto);
if (!prePayResult.getSuccess()) {
logger.error(">>>>>>>> 团购定金交易号: {}, 预下单失败 <<<<<<<<", depositPayId);
return Result.failed(ResultCode.PAY_FAILED);
}
String prepayId = (String) prePayResult.getData();
groupPurchaseRecord.setPrepayId(prepayId);
groupPurchaseRecord.setState(GroupPurchaseEnum.StateEnum.INVALID.getCode());
groupPurchaseRecordDao.insert(groupPurchaseRecord);
Result result = wxPayServiceApi.wxAppPayTuneUp(prepayId);
return result;
} catch (Exception e) {
logger.error("团购定金预支付失败 error : {}", e);
}
return Result.failed("团购定金支付失败");
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result cancelDeposit(GroupPurchaseRecordRequestDto dto) {
public Result cancelOrder(GroupPurchaseRecordRequestDto dto) {
RLock lock = null;
try {
String refundId = IdUtils.getOrderNumber(CommConsts.REFUND_ORDER_PREFIX);
......@@ -191,15 +156,14 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
String distributionOrderId = dto.getDistributionOrderId();
DistributionOrder distributionOrder = distributionOrderDao.findById(distributionOrderId);
if (distributionOrder.getState() != DistributionEnum.DistributionOrderStateEnum.PRE_SALE.getCode()) {
return Result.failed("订单不是预售状态,不能取消定金");
return Result.failed("订单不是众筹中的状态,不能取消");
}
//查询定金支付记录
//查询团购记录
GroupPurchaseRecord groupPurchaseRecord = groupPurchaseRecordDao.findByOrderId(distributionOrderId);
DistributionOrderRefundRequestDto refundRequestDto = new DistributionOrderRefundRequestDto();
String depositPayId = groupPurchaseRecord.getDepositPayId();
refundRequestDto.setDistributionOrderId(depositPayId);
refundRequestDto.setRefundPrice(groupPurchaseRecord.getAmount());
refundRequestDto.setAmount(groupPurchaseRecord.getAmount());
refundRequestDto.setDistributionOrderId(distributionOrderId);
refundRequestDto.setRefundPrice(distributionOrder.getAmount());
refundRequestDto.setAmount(distributionOrder.getAmount());
refundRequestDto.setRefundId(refundId);
Result result = wxPayServiceApi.orderRefund(refundRequestDto);
if (!result.getSuccess()) {
......@@ -211,27 +175,28 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
//创建退款单
RefundOrder refundOrder = new RefundOrder();
refundOrder.setRefundId(refundId);
refundOrder.setRefundAmount(groupPurchaseRecord.getAmount());
refundOrder.setAmount(groupPurchaseRecord.getAmount());
refundOrder.setDistributionOrderId(depositPayId);
refundOrder.setRefundAmount(distributionOrder.getAmount());
refundOrder.setAmount(distributionOrder.getAmount());
refundOrder.setDistributionOrderId(distributionOrderId);
refundOrder.setDistributorId(distributionOrder.getSellerId());
refundOrder.setCreateTime(now);
refundOrder.setUpdateTime(now);
refundOrder.setState(RefundOrderEnum.StateEnum.PROCESSING.getCode());
refundOrderDao.insert(refundOrder);
//退款受理成功,订单的状态改为取消
distributionOrderDao.updateState(distributionOrderId, DistributionEnum.DistributionOrderStateEnum.CANCEL.getCode());
//退款受理成功,订单的状态改为退款中
distributionOrderDao.updateState(distributionOrderId, DistributionEnum.DistributionOrderStateEnum.REFUNDING.getCode());
//团购的记录改为无效
GroupPurchaseRecord updateRecord = new GroupPurchaseRecord();
updateRecord.setId(groupPurchaseRecord.getId());
updateRecord.setState(GroupPurchaseEnum.StateEnum.INVALID.getCode());
groupPurchaseRecordDao.updateByPrimaryKey(updateRecord);
logger.info(">>>>>>>> 分销单号:{}, 退款单号:{}, 定金退款申请成功,创建退款单 <<<<<<<<<", distributionOrderId, refundId);
//利润记录无效
distributorProfitDao.updateValidState(dto.getDistributionOrderId(), false);
logger.info(">>>>>>>> 订单号:{}, 退款单号:{}, 退款申请成功,创建退款单 <<<<<<<<<", distributionOrderId, refundId);
return Result.success(refundId);
}
} catch (Exception e) {
logger.error("定金退款申请失败 error : {}", e);
logger.error("团购退款申请失败 error : {}", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} finally {
if (lock != null && lock.isHeldByCurrentThread()) {
......@@ -262,30 +227,21 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
userAvatarList.add(StringUtils.isEmpty(avatarUrl) ? CommConsts.DEFAULT_AVATAR_URL : avatarUrl);
}
//查询团购的优惠信息
//查询团购配置信息
GroupPurchaseConfig groupPurchaseConfig = groupPurchaseConfigDao.findByItemId(dto.getItemId());
List<GroupPurchaseDiscount> groupPurchaseDiscounts = groupPurchaseDiscountDao.findByItemId(dto.getItemId());
//目前只有一个优惠,取第一个
if (CollectionUtils.isEmpty(groupPurchaseDiscounts)) {
return Result.failed("没有团购配置信息");
}
GroupPurchaseDiscount groupPurchaseDiscount = groupPurchaseDiscounts.get(0);
int requireNum = groupPurchaseDiscount.getRequireNum();
if (itemNum >= requireNum) {
rebate = groupPurchaseDiscount.getRebate();
}
int targetNum = groupPurchaseConfig.getTargetNum();
GroupPurchaseInfo groupPurchaseInfo = new GroupPurchaseInfo();
Map<String, Object> map = new HashMap<>();
if (itemNum >= requireNum) {
if (itemNum >= targetNum) {
groupPurchaseInfo.setGroupPurchaseSuccess(true);
} else {
groupPurchaseInfo.setGroupPurchaseSuccess(false);
}
groupPurchaseInfo.setRequireNum(requireNum);
double num = (double) itemNum / (double)targetNum * 100;
String rate = String.format("%.0f", num);
groupPurchaseInfo.setRate(String.valueOf(rate));
groupPurchaseInfo.setTargetNum(targetNum);
groupPurchaseInfo.setItemNum((int) itemNum);
groupPurchaseInfo.setPeopleNum((int) peopleNum);
groupPurchaseInfo.setDeposit(PriceUtil.convertPriceFenToYuan(groupPurchaseConfig.getDeposit()));
groupPurchaseInfo.setRebate(rebate.toPlainString());
groupPurchaseInfo.setEndTime(groupPurchaseConfig.getEndTime());
groupPurchaseInfo.setSalePrice(PriceUtil.convertPriceFenToYuan(groupPurchaseConfig.getPrice()));
groupPurchaseInfo.setUserAvatarList(userAvatarList);
......@@ -304,7 +260,7 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
return Result.failed("查询团购进度失败");
}
/*
@Override
public Result payBalance(GroupPurchaseRecordRequestDto dto) {
try {
......@@ -313,9 +269,8 @@ public class GroupPurchaseServiceImpl implements GroupPurchaseService {
logger.error("支付尾款失败 error : {}", e);
}
return Result.failed("支付尾款失败");
}
}*/
@Override
@Transactional
public Result calculateProfit(GroupPurchaseRecordRequestDto dto) {
try {
......
......@@ -8,6 +8,7 @@ import com.wwdz.ch.db.dao.distribution.UserBillDao;
import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.domain.distribution.DistributorProfit;
import com.wwdz.ch.db.domain.distribution.UserAccountDetail;
import com.wwdz.ch.db.domain.distribution.UserBill;
import com.wwdz.ch.wx.service.distribution.UserAccountDetailService;
import com.wwdz.ch.wx.service.distribution.UserBillService;
import com.xxdxxs.utils.StringUtils;
......@@ -19,6 +20,9 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.text.SimpleDateFormat;
import java.util.List;
@Service
public class UserAccountDetailServiceImpl implements UserAccountDetailService {
......@@ -103,6 +107,40 @@ public class UserAccountDetailServiceImpl implements UserAccountDetailService {
}
}
@Override
public Result cancel(DistributionOrder distributionOrder) {
try {
String distributionOrderId = distributionOrder.getDistributionOrderId();
userAccountDetailDao.updateState(distributionOrderId, BillEnum.AccountDetailStateEnum.INVALID.getCode());
logger.info("========= 订单号:{},相关账户明细已失效 =========", distributionOrder);
//用户账户待入账金额需要减去当前退款的订单收入
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
String accountPeriod = formatter.format(distributionOrder.getCreateTime());
List<UserAccountDetail> userAccountDetailList = userAccountDetailDao.findByTransactionId(distributionOrderId);
for (UserAccountDetail userAccountDetail : userAccountDetailList) {
long userId = userAccountDetail.getUserId();
UserBill userBill = userBillDao.findOne(accountPeriod, userId, null);
if (userBill != null) {
if (userAccountDetail.getType() == BillEnum.AccountDetailTypeEnum.ORDER.getCode()) {
//卖家订单收入无效
userBill.setOrderWaitEntryAmount(userBill.getOrderWaitEntryAmount() - userAccountDetail.getAmount());
userBill.setTotalWaitEntryAmount(userBill.getTotalWaitEntryAmount() - userAccountDetail.getAmount());
userBillDao.updateByPrimaryKey(userBill);
logger.info("========= 订单号:{},用户账单中的订单收入已失效 =========", distributionOrder);
} else if (userAccountDetail.getType() == BillEnum.AccountDetailTypeEnum.INTRODUCE.getCode()) {
//用户的介绍佣金无效
userBill.setIntroduceWaitEntryAmount(userBill.getIntroduceWaitEntryAmount() - userAccountDetail.getAmount());
userBill.setTotalWaitEntryAmount(userBill.getTotalWaitEntryAmount() - userAccountDetail.getAmount());
userBillDao.updateByPrimaryKey(userBill);
logger.info("========= 订单号:{},用户账单中的介绍佣金已失效 =========", distributionOrder);
}
}
}
return Result.success();
} catch (Exception e) {
logger.error("账单设置失效 error:{}", e);
}
return Result.failed();
}
}
......@@ -24,19 +24,13 @@ public interface GroupPurchaseService {
*/
Result findItemDetail(GroupPurchaseConfigRequestDto dto);
/**
* 支付团购定金
* @param dto
* @return
*/
Result payDeposit(GroupPurchaseRecordRequestDto dto);
/**
* 取消订单退定金
* 取消团购订单
* @param dto
* @return
*/
Result cancelDeposit(GroupPurchaseRecordRequestDto dto);
Result cancelOrder(GroupPurchaseRecordRequestDto dto);
/**
* 查询团购当前进度
......@@ -45,15 +39,15 @@ public interface GroupPurchaseService {
*/
Result<GroupPurchaseInfo> checkGroupPurchase(GroupPurchaseRecordRequestDto dto);
/**
/* *//**
* 支付团购订单尾款
* @param dto
* @return
*/
Result payBalance(GroupPurchaseRecordRequestDto dto);
*//*
Result payBalance(GroupPurchaseRecordRequestDto dto);*/
Result calculateProfit(GroupPurchaseRecordRequestDto dto);
// Result calculateProfit(GroupPurchaseRecordRequestDto dto);
}
......@@ -13,4 +13,11 @@ public interface UserAccountDetailService {
* @return
*/
Result create(DistributionOrder distributionOrder, DistributorProfit distributorProfit) throws Exception;
/**
* 订单取消后,账单记录设置失效
* @param distributionOrder
* @return
*/
Result cancel(DistributionOrder distributionOrder) throws Exception;
}
......@@ -2,10 +2,13 @@ package com.wwdz.ch.wx.web.distribution;
import com.alibaba.fastjson.JSON;
import com.wwdz.ch.core.api.wxpay.WxPayServiceApi;
import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import com.wwdz.ch.db.dto.request.distribution.GroupPurchaseRecordRequestDto;
import com.wwdz.ch.wx.service.distribution.DistributionOrderService;
import com.xxdxxs.service.FormHandler;
import com.xxdxxs.utils.StringUtils;
import com.xxdxxs.validation.Validator;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
......@@ -103,6 +106,16 @@ public class DistributionOrderController {
}
@ApiOperation(value = "创建团购订单")
@PostMapping("/createGroupPurchaseOrder")
public Result createGroupPurchaseOrder(@RequestBody GroupPurchaseRecordRequestDto dto) {
logger.info("创建团购订单,请求参数:{}", JSON.toJSONString(dto));
if (!StringUtils.isAllNotEmpty(dto.getItemId(), dto.getItemNum(), dto.getUserId(), dto.getBuyerOpenid(), dto.getAmount())) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return distributionOrderService.createGroupPurchaseOrder(dto);
}
@ApiOperation(value = "前端获取支付所需参数")
@PostMapping("/getPayParam")
public Result getPayParam(@RequestBody DistributionOrderRequestDto dto) {
......
......@@ -5,7 +5,6 @@ import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.distribution.GroupPurchaseConfigRequestDto;
import com.wwdz.ch.db.dto.request.distribution.GroupPurchaseRecordRequestDto;
import com.wwdz.ch.db.dto.request.distribution.SpecialPerformanceRequestDto;
import com.wwdz.ch.wx.service.distribution.GroupPurchaseService;
import com.xxdxxs.utils.StringUtils;
import io.swagger.annotations.ApiOperation;
......@@ -45,24 +44,14 @@ public class GroupPurchaseController {
}
@ApiOperation(value = "支付团购定金")
@PostMapping("/payDeposit")
public Result payDeposit(@RequestBody GroupPurchaseRecordRequestDto dto) {
logger.info("支付团购定金,请求参数:{}", JSON.toJSONString(dto));
if (!StringUtils.isAllNotEmpty(dto.getItemId(), dto.getUserId(), dto.getAmount())) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return groupPurchaseService.payDeposit(dto);
}
@ApiOperation(value = "取消订单退定金")
@ApiOperation(value = "取消团购订单")
@PostMapping("/cancelDeposit")
public Result cancelDeposit(@RequestBody GroupPurchaseRecordRequestDto dto) {
logger.info("取消订单退定金,请求参数:{}", JSON.toJSONString(dto));
logger.info("取消团购订单,请求参数:{}", JSON.toJSONString(dto));
if (!StringUtils.isAllNotEmpty(dto.getDistributionOrderId())) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return groupPurchaseService.cancelDeposit(dto);
return groupPurchaseService.cancelOrder(dto);
}
}
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