huanghongfa
2021-04-20 ac0a5107a0cfa9e2198176d6cdf33f6516edda12
springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java
@@ -20,11 +20,13 @@
import com.panzhihua.service_community.service.ComShopOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -54,7 +56,18 @@
    private ComShopOrderGoodsDAO comShopOrderGoodsDAO;
    @Resource
    private ComShopOrderDAO comShopOrderDAO;
    @Resource
    private ComShopOrderPayDAO comShopOrderPayDAO;
    @Value("${min.app.isTest}")
    private Boolean isTest;
    @Value("${min.app.appid}")
    private String appid;
    @Value("${min.app.payKey}")
    private String payKey;
    @Value("${min.app.mchId}")
    private String mchId;
    @Value("${min.app.notifyUrl}")
    private String notifyUrl;
    /**
     * 订单预览
@@ -181,7 +194,6 @@
    public R orderCreate(ComShopOrderCreateDTO orderCreateDTO){
        //创建返回参数
        ComShopOrderVO shopOrderVO = new ComShopOrderVO();
        //查询用户收货地址
        ComShopUserAddressDO userAddressDO = comShopUserAddressDAO.selectById(orderCreateDTO.getReceiverId());
        if(userAddressDO == null){
@@ -195,10 +207,8 @@
        String orderNo = OrderNoUtils.NextOrderNo(userId);
        //配送方式
        Integer deliveryType = 0;
        //订单总金额
        BigDecimal orderTotal = BigDecimal.ZERO;
        //创建订单商品信息
        List<ComShopOrderGoodsDO> orderGoodsDOList = new ArrayList<>();
        if(!orderCreateDTO.getOrderGoodsList().isEmpty()){
@@ -234,12 +244,10 @@
                orderTotal = orderTotal.add(orderGoodsDO.getGoodsAttrPrice().multiply(BigDecimal.valueOf(orderGoodsDO.getAmount())));
            }
        }
        //如果是购物车提交,需要将购物车内商品移除
        if(orderCreateDTO.getSubmitType().equals(ComShopOrderCreateDTO.submitType.cart)){
            comShopCartDAO.deleteBatchIds(orderCreateDTO.getCartIds());
        }
        //创建订单信息
        ComShopOrderDO shopOrderDO = new ComShopOrderDO();
        shopOrderDO.setOrderNo(orderNo);
@@ -256,14 +264,12 @@
            shopOrderDO.setRemark(orderCreateDTO.getRemark());
        }
        this.baseMapper.insert(shopOrderDO);
        if(!orderGoodsDOList.isEmpty()){
            orderGoodsDOList.forEach(orderGoods ->{
                orderGoods.setOrderId(shopOrderDO.getId());
                comShopOrderGoodsDAO.insert(orderGoods);
            });
        }
        //创建订单操作记录
        ComShopOrderOperateDO orderOperateDO = new ComShopOrderOperateDO();
        orderOperateDO.setOrderNo(orderNo);
@@ -277,14 +283,18 @@
            orderOperateDO.setOperationBy("用户");
        }
        comShopOrderOperateDAO.insert(orderOperateDO);
        shopOrderVO.setOrderNo(orderNo);
        shopOrderVO.setOrderTotal(orderTotal);
        try {
            BigDecimal money = orderTotal;
            if(isTest){
                money = BigDecimal.valueOf(0.01);
            }
            //调用wx支付
            String xml = WxPayUtils.getUnifiedorder("",orderCreateDTO.getOpenId(),orderNo,orderTotal);
            String xml = WxPayUtils.getUnifiedorder(appid,mchId,payKey,notifyUrl,"商品购买",orderCreateDTO.getOpenId(),orderNo,money);
            log.info("微信支付返回参数:" + xml);
            shopOrderVO.setPayResult(xml);
        }catch (Exception e){
            log.error("调用微信支付异常,异常原因:" + e.getMessage());
        }
@@ -635,9 +645,6 @@
        return R.ok(ipage);
    }
    @Override
    public R capitalDetailByStore(Long id) {
        if(id==null){
@@ -646,4 +653,109 @@
        CapitalDetailVO vo = this.baseMapper.capitalDetailByStore(id);
        return R.ok(vo);
    }
    /**
     * 微信支付订单回调
     * @param wxPayNotifyOrderDTO   订单支付回调参数
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void wxOrderPayNotify(WxPayNotifyOrderDTO wxPayNotifyOrderDTO){
        if(StringUtils.isEmpty(wxPayNotifyOrderDTO.getOrderTradeNo())){
            log.error("微信支付回调失败,订单号为空");
            return;
        }
        //查询订单
        ComShopOrderDO shopOrderDO = this.baseMapper.selectOne(new QueryWrapper<ComShopOrderDO>().lambda().eq(ComShopOrderDO::getOrderNo,wxPayNotifyOrderDTO.getOrderTradeNo()));
        if(shopOrderDO == null){
            log.error("未查询到支付订单,订单回调失败,订单号:" + wxPayNotifyOrderDTO.getOrderTradeNo());
            return;
        }
        shopOrderDO.setStatus(ComShopOrderDO.status.dfh);
        shopOrderDO.setPayType(ComShopOrderDO.payType.wx);
        shopOrderDO.setPayStatus(ComShopOrderDO.payStatus.yes);
        shopOrderDO.setPayAmount(BigDecimal.valueOf(Integer.parseInt(wxPayNotifyOrderDTO.getCashFee()) * 100));
        shopOrderDO.setWxTardeNo(wxPayNotifyOrderDTO.getWxTradeNo());
        shopOrderDO.setPayTime(new Date(Long.parseLong(wxPayNotifyOrderDTO.getPayTime())));
        this.baseMapper.updateById(shopOrderDO);
        //查询订单商品
        List<ComShopOrderGoodsDO> orderGoodsList = comShopOrderGoodsDAO.selectList(new QueryWrapper<ComShopOrderGoodsDO>().lambda().eq(ComShopOrderGoodsDO ::getOrderNo,shopOrderDO.getOrderNo()));
        if(!orderGoodsList.isEmpty()){
            int goodsNub = 0;
            for (ComShopOrderGoodsDO orderGood:orderGoodsList) {
                goodsNub += orderGood.getAmount();
                //更新商品信息
                ComShopGoodsDO goodsDO = comShopGoodsDAO.selectById(orderGood.getGoodsId());
                if(goodsDO != null){
                    goodsDO.setSale(goodsDO.getSale() + orderGood.getAmount());
                    comShopGoodsDAO.updateById(goodsDO);
                }
                //更新商品规格
                ComShopGoodsAttrDO goodsAttrDO = comShopGoodsAttrDAO.selectById(orderGood.getGoodsAttrId());
                if(goodsAttrDO != null){
                    goodsAttrDO.setSale(goodsAttrDO.getSale() + orderGood.getAmount());
                    comShopGoodsAttrDAO.updateById(goodsAttrDO);
                }
            }
            //更新店铺销量以及销售额
            ComShopStoreDO storeDO = comShopStoreDAO.selectById(shopOrderDO.getStoreId());
            if(storeDO != null){
                storeDO.setSale(storeDO.getSale() + goodsNub);
                storeDO.setSaleVolume(storeDO.getSaleVolume().add(shopOrderDO.getTotalAmount()));
                comShopStoreDAO.updateById(storeDO);
            }
        }
        //添加订单操作记录
        ComShopOrderOperateDO orderOperateDO = new ComShopOrderOperateDO();
        orderOperateDO.setOrderNo(shopOrderDO.getOrderNo());
        orderOperateDO.setOperationType(ComShopOrderOperateDO.operationType.pay);
        orderOperateDO.setOperationTime(new Date());
        orderOperateDO.setOperationContent("用户支付订单");
        orderOperateDO.setOperationBy("用户");
        comShopOrderOperateDAO.insert(orderOperateDO);
        //添加订单支付记录表
        ComShopOrderPayDO orderPayDO = new ComShopOrderPayDO();
        orderPayDO.setOrderNo(shopOrderDO.getOrderNo());
        orderPayDO.setOrderAmount(shopOrderDO.getTotalAmount());
        orderPayDO.setWxTradeNo(wxPayNotifyOrderDTO.getWxTradeNo());
        orderPayDO.setPayStatus(ComShopOrderPayDO.payStatus.yes);
        orderPayDO.setPayAmount(shopOrderDO.getPayAmount());
        orderPayDO.setPayTime(shopOrderDO.getPayTime());
        comShopOrderPayDAO.insert(orderPayDO);
    }
    /**
     * 订单去支付
     * @param orderPayDTO   请求参数
     * @return  支付对象
     */
    public R wxPay(OrderPayDTO orderPayDTO){
        //创建返回参数
        ComShopOrderVO shopOrderVO = new ComShopOrderVO();
        //查询订单
        ComShopOrderDO orderDO = comShopOrderDAO.selectOne(new QueryWrapper<ComShopOrderDO>().lambda().eq(ComShopOrderDO::getOrderNo,orderPayDTO.getOrderNo()));
        if(orderDO == null){
            return R.fail("订单不存在");
        }
        try {
            BigDecimal money = orderDO.getTotalAmount();
            if(isTest){
                money = BigDecimal.valueOf(0.01);
            }
            //调用wx支付
            String xml = WxPayUtils.getUnifiedorder(appid,mchId,payKey,notifyUrl,"商品购买",orderPayDTO.getOpenId(),orderDO.getOrderNo(),money);
            log.info("微信支付返回参数:" + xml);
            shopOrderVO.setPayResult(xml);
        }catch (Exception e){
            log.error("调用微信支付异常,异常原因:" + e.getMessage());
        }
        return R.ok(shopOrderVO);
    }
}