package com.yuu.ymall.web.api.service.impl;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.TradeStatus;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeQueryRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yuu.ymall.commons.consts.Consts;
import com.yuu.ymall.commons.dto.BaseResult;
import com.yuu.ymall.commons.redis.RedisCacheManager;
import com.yuu.ymall.commons.utils.IDUtil;
import com.yuu.ymall.commons.utils.MapperUtil;
import com.yuu.ymall.domain.*;
import com.yuu.ymall.web.api.common.config.AlipayConfig;
import com.yuu.ymall.web.api.common.utils.IPInfoUtil;
import com.yuu.ymall.web.api.dto.*;
import com.yuu.ymall.web.api.mapper.*;
import com.yuu.ymall.web.api.service.OrderService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author by Yuu
* @classname OrderServiceImpl
* @date 2019/7/6 2:14
*/
@Service
@Transactional(readOnly = false)
public class OrderServiceImpl implements OrderService {
@Value("${ADD_ORDER}")
private String ADD_ORDER;
@Value("${CART_PRE}")
private String CART_PRE;
@Value("${ORDER_PAY}")
private String ORDER_PAY;
@Autowired
private RedisCacheManager redisCacheManager;
@Autowired
private TbMemberMapper tbMemberMapper;
@Autowired
private TbOrderMapper tbOrderMapper;
@Autowired
private TbOrderItemMapper tbOrderItemMapper;
@Autowired
private TbOrderShippingMapper tbOrderShippingMapper;
@Autowired
private TbItemMapper tbItemMapper;
@Value("${PRODUCT_ITEM}")
private String PRODUCT_ITEM;
@Transactional
@Override
public BaseResult addOrder(OrderInfo orderInfo, HttpServletRequest request) {
// 用户 id
Long userId = orderInfo.getUserId();
// 地址收货人
String username = orderInfo.getUserName();
// 订单商品
List<CartProduct> goods = orderInfo.getGoodsList();
if (userId == null || StringUtils.isBlank(username) || goods == null || goods.size() == 0) {
return BaseResult.fail("请求信息异常");
}
// 请求 ip 地址
String ip = IPInfoUtil.getIpAddr(request);
if("0:0:0:0:0:0:0:1".equals(ip)){
ip="127.0.0.1";
}
// Redis key,防止恶意请求
String redisKey = ADD_ORDER + ":" + ip;
String temp = (String) redisCacheManager.get(redisKey);
if (StringUtils.isNotBlank(temp)) {
return BaseResult.fail("您提交的太频繁了,请您稍后再试");
}
TbMember tbMember = tbMemberMapper.selectByPrimaryKey(userId);
if (tbMember == null) {
return BaseResult.fail("获取下单用户失败");
}
// 生成订单
TbOrder tbOrder = new TbOrder();
tbOrder.setId(String.valueOf(IDUtil.getRandomId()));
tbOrder.setUserId(userId);
if (StringUtils.isBlank(tbMember.getUsername())) {
tbOrder.setBuyerNick(tbMember.getPhone());
} else {
tbOrder.setBuyerNick(tbMember.getUsername());
}
tbOrder.setPayment(orderInfo.getOrderTotal());
tbOrder.setCreated(new Date());
tbOrder.setUpdated(new Date());
// 0: 未付款 1: 已付款 2: 未发货 3: 已发货 4: 交易成功 5: 交易关闭
tbOrder.setStatus(0);
// 添加订单
tbOrderMapper.insert(tbOrder);
// 生成订单信息
List<CartProduct> goodsList = orderInfo.getGoodsList();
for (CartProduct cartProduct : goodsList) {
TbOrderItem tbOrderItem = new TbOrderItem();
Long orderItemId = IDUtil.getRandomId();
tbOrderItem.setId(orderItemId.toString());
tbOrderItem.setItemId(cartProduct.getProductId().toString());
tbOrderItem.setOrderId(tbOrder.getId());
tbOrderItem.setNum(cartProduct.getProductNum());
tbOrderItem.setTitle(cartProduct.getProductName());
tbOrderItem.setPrice(cartProduct.getSalePrice());
tbOrderItem.setTotalFee(cartProduct.getSalePrice().multiply(BigDecimal.valueOf(cartProduct.getProductNum())));
tbOrderItem.setPicPath(cartProduct.getProductImg());
tbOrderItemMapper.insert(tbOrderItem);
// 删除会员购物车中的该商品
// Redis key
String cartProductKey = CART_PRE + ":" + orderInfo.getUserId();
// Hash Key
String hashKey = cartProduct.getProductId().toString();
// 删除记录
redisCacheManager.deleteHash(cartProductKey, hashKey);
}
// 生成物流信息
TbOrderShipping tbOrderShipping = new TbOrderShipping();
tbOrderShipping.setOrderId(tbOrder.getId());
tbOrderShipping.setReceiverName(orderInfo.getUserName());
tbOrderShipping.setReceiverAddress(orderInfo.getStreetName());
tbOrderShipping.setReceiverPhone(orderInfo.getTel());
tbOrderShipping.setCreated(new Date());
tbOrderShipping.setUpdated(new Date());
tbOrderShippingMapper.insert(tbOrderShipping);
// 修改商品库存信息
for (CartProduct good : goods) {
Long productId = good.getProductId();
// 商品库存
tbItemMapper.reduceItemNum(productId, good.getProductNum());
// 删除 Redis 商品缓存信息
String redisItemKey = PRODUCT_ITEM + ":" + productId;
redisCacheManager.del(redisItemKey);
}
// 设置 Redis ip 缓存
redisCacheManager.set(redisKey, "ADD_ORDER");
redisCacheManager.expire(redisKey, 60);
return BaseResult.success((Object)tbOrder.getId());
}
@Override
public BaseResult getOrderDet(String orderId) {
Order order = new Order();
// 获取订单信息
TbOrder tbOrder = tbOrderMapper.selectByPrimaryKey(orderId);
if (tbOrder == null) {
return BaseResult.fail("通过id获取订单详情失败");
}
// 订单 id
order.setOrderId(tbOrder.getId());
// 会员 id
order.setUserId(tbOrder.getUserId().toString());
// 订单状态
order.setOrderStatus(tbOrder.getStatus());
// 未支付,最晚支付时间
if (order.getOrderStatus() == 0) {
Date createDate = tbOrder.getCreated();
Calendar calendar = Calendar.getInstance();
calendar.setTime(createDate);
calendar.add(Calendar.HOUR, 2);
String countTime = calendar.getTime().getTime() + "";
order.setCountTime(countTime);
}
// 订单创建时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String createDate = simpleDateFormat.format(tbOrder.getCreated());
order.setCreateDate(createDate);
// 订单支付时间
if (tbOrder.getPaymentTime() != null) {
String payDate = simpleDateFormat.format(tbOrder.getPaymentTime());
order.setPayDate(payDate);
}