package com.fdkankan.ucenter.service.impl;
import com.amazonaws.services.simpleworkflow.flow.annotations.NoWait;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.common.constant.ErrorCode;
import com.fdkankan.common.constant.SceneConstant;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.ucenter.common.PageInfo;
import com.fdkankan.common.util.NumberUtils;
import com.fdkankan.ucenter.common.SkuEnum;
import com.fdkankan.ucenter.constant.LoginConstant;
import com.fdkankan.ucenter.constant.OrderConstant;
import com.fdkankan.ucenter.entity.*;
import com.fdkankan.ucenter.httpClient.client.PayClient;
import com.fdkankan.ucenter.httpClient.param.PayGoods;
import com.fdkankan.ucenter.httpClient.service.PayService;
import com.fdkankan.ucenter.httpClient.vo.PayOrderVo;
import com.fdkankan.ucenter.mapper.IIncrementOrderMapper;
import com.fdkankan.ucenter.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.ucenter.util.DateUserUtil;
import com.fdkankan.ucenter.vo.request.DownNumParam;
import com.fdkankan.ucenter.vo.request.IncrementOrderParam;
import com.fdkankan.ucenter.vo.request.OrderParam;
import com.fdkankan.ucenter.vo.response.GoodsSkuVo;
import com.fdkankan.ucenter.vo.response.IncrementOrderVo;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static com.fdkankan.ucenter.util.DateUserUtil.getDateTime;
/**
*
* 增值权益订单表 服务实现类
*
*
* @author
* @since 2022-07-13
*/
@Service
public class IncrementOrderServiceImpl extends ServiceImpl implements IIncrementOrderService {
@Autowired
IUserService userService;
@Autowired
IInvoiceService invoiceService;
@Autowired
IUserIncrementService userIncrementService;
@Autowired
IGoodsSkuService goodsSkuService;
@Autowired
IIncrementTypeService incrementTypeService;
@Override
public PageInfo pageList(IncrementOrderParam param) {
User user = userService.getByUserName(param.getUserName());
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(IncrementOrder::getUserId,user.getId());
wrapper.eq(IncrementOrder::getPayStatus,1);
wrapper.orderByDesc(IncrementOrder::getTradeTime);
Page page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
List listVo =new ArrayList<>();
for (IncrementOrder record : page.getRecords()) {
if(StringUtils.isNotBlank(record.getTradeTime())){
record.setTradeTime(DateUserUtil.AddMinute(record.getTradeTime(),record.getTimeZoneOff()));
}
Invoice invoice = invoiceService.getByIncrementOrderId(record.getId());
IncrementOrderVo vo = new IncrementOrderVo();
BeanUtils.copyProperties(record,vo);
vo.setInvoice(invoice);
listVo.add(vo);
}
Page pageVo = new Page<>(param.getPageNum(),param.getPageSize());
pageVo.setRecords(listVo);
pageVo.setTotal(page.getTotal());
return PageInfo.PageInfo(pageVo);
}
@Override
public GoodsSkuVo getDownloadPrice(OrderParam param) {
if(param.getDateType() == null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
}
// 5 专业会员,6 下载 , 7 高级会员
if(param.getDateType() != 6 && param.getIncrementTypeId() == null && param.getUserIncrementId() == null){
throw new BusinessException(SceneConstant.FAILURE_CODE_5012, SceneConstant.FAILURE_MSG_5012);
}
return getGoodsSkuVo(param.getDateType(), param.getUserIncrementId(),param.getMonthQy(),param.getIncrementTypeId());
}
private GoodsSkuVo getGoodsSkuVo (Integer dateType,Integer userIncrementId,Integer monthDy,Integer incrementTypeId){
GoodsSkuVo goodsSkuVo = new GoodsSkuVo();
if(userIncrementId != null){
UserIncrement userIncrement = userIncrementService.getById(userIncrementId);
incrementTypeId = userIncrement.getIncrementTypeId();
}
IncrementType incrementType = null;
if(incrementTypeId != null){ //购买会员
incrementType = incrementTypeService.getById(incrementTypeId);
if(incrementType == null){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
goodsSkuVo.setPrice(incrementType.getPrice());
goodsSkuVo.setSkuSn(incrementType.getId().toString());
goodsSkuVo.setDeadLine(getDateTime(incrementType,userIncrementId,monthDy).toDate().getTime());
return goodsSkuVo;
}
if(dateType == 6){ //下载场景
incrementType = incrementTypeService.list().get(0);
goodsSkuVo.setPrice(incrementType.getDownloadPrice());
goodsSkuVo.setSkuSn(incrementType.getId().toString());
goodsSkuVo.setDeadLine(getDateTime(incrementType,userIncrementId,monthDy).toDate().getTime());
return goodsSkuVo;
}
return goodsSkuVo;
}
@Override
public DateTime getDateTime(IncrementType incrementType, Integer userIncrementId,Integer count) {
Date userTime = new Date();
if(userIncrementId != null){
UserIncrement userIncrement = userIncrementService.getById(userIncrementId);
userTime = DateUserUtil.getDate(userIncrement.getIncrementEndTime());
}
return DateUserUtil.getDateTime(userTime, incrementType,count);
}
public GoodsSkuVo getIncrementOrDownloadPrice(Integer dateType) {
String skuStr = SkuEnum.skusMap.get(String.valueOf(dateType));
if (StringUtils.isEmpty(skuStr)){
skuStr = SkuEnum.skusMap.get("5");
}
GoodsSkuVo responseGoodsSku = new GoodsSkuVo();
GoodsSku goodsSkuEntity = goodsSkuService.getBySku(skuStr);
BeanUtils.copyProperties(goodsSkuEntity, responseGoodsSku);
return responseGoodsSku;
}
@Autowired
PayService payService;
@Override
public IncrementOrder insertIncrementOrder(User user, DownNumParam param,IncrementType incrementType) {
BigDecimal total = incrementType.getPrice().multiply(new BigDecimal(param.getCount()));
if(param.getMonthQy() != null){
total = total.multiply(new BigDecimal(param.getMonthQy())); //高级会员月份
}
IncrementOrder incrementOrderEntity = new IncrementOrder();
PayGoods payGoods = new PayGoods(incrementType.getName(),param.getCount(),incrementType.getValidTimeType(),param.getMonthQy());
PayOrderVo payOrderVo = payService.downOrder(total, "incrementOrder",user.getUserName(),user.getNickName(), Arrays.asList(payGoods));
if(payOrderVo == null){
throw new BusinessException(OrderConstant.FAILURE_CODE_8005,OrderConstant.FAILURE_MSG_8005);
}
incrementOrderEntity.setOrderSn(payOrderVo.getOrderSn());
incrementOrderEntity.setAmount(total);
incrementOrderEntity.setPayType(param.getPayType());
incrementOrderEntity.setPayStatus(-1);
incrementOrderEntity.setUserId(user.getId());
incrementOrderEntity.setCount(param.getCount());
incrementOrderEntity.setAbroad(param.getAbroad());
incrementOrderEntity.setStatus(param.getIncrementId() == null ? 1 : 2);
incrementOrderEntity.setIncrementId(param.getIncrementId());
incrementOrderEntity.setRecStatus("A");
incrementOrderEntity.setCreateTime(DateUserUtil.getDate(new Date()));
incrementOrderEntity.setUpdateTime(DateUserUtil.getDate(new Date()));
incrementOrderEntity.setIncrementType(incrementType.getId());
incrementOrderEntity.setMonthQy(param.getMonthQy());
incrementOrderEntity.setTimeZoneOff(param.getTimeZoneOff());
if(incrementType.getValidTimeType() == 0){
incrementOrderEntity.setMemberLevels("PR");
}
if(incrementType.getValidTimeType() == 1){
incrementOrderEntity.setMemberLevels("SE");
}
this.save(incrementOrderEntity);
return incrementOrderEntity;
}
@Override
public IncrementOrder getByOrderSn(String orderSn) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(IncrementOrder::getOrderSn,orderSn);
List list = this.list(queryWrapper);
if(list == null || list.size()<=0){
return null;
}
return list.get(0);
}
@Override
public IncrementOrder getByOrderSnNoPay(String orderSn) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(IncrementOrder::getOrderSn,orderSn);
queryWrapper.lambda().ne(IncrementOrder::getPayStatus,1);
List list = this.list(queryWrapper);
if(list == null || list.size()<=0){
return null;
}
return list.get(0); }
@Override
public boolean paySuccessIncrementOrder(String orderSn, String tradeNo, int paymentTypeName) {
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(IncrementOrder::getPayType,paymentTypeName)
.set(IncrementOrder::getNumber,tradeNo)
.set(IncrementOrder::getPayStatus, 1)
.set(IncrementOrder::getTradeTime, new Date())
.eq(IncrementOrder::getOrderSn,orderSn);
return this.update(updateWrapper);
}
}