xiaoyong931011
2021-04-12 a13a93a493e7e94e28b2225c26e7e13b52d3288c
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java
@@ -1,42 +1,30 @@
package com.matrix.system.shopXcx.api.action;
import com.matrix.biz.bean.BizUser;
import com.matrix.system.hive.bean.SysVipInfo;
import com.matrix.component.redis.RedisUserLoginUtils;
import com.matrix.component.tools.WxUtils;
import com.matrix.component.wechat.externalInterface.protocol.paramProtocol.BrandWCPayRequestData;
import com.matrix.component.wechat.externalInterface.weixinUtil.WeixinServiceUtil;
import com.matrix.core.constance.SystemErrorCode;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.tools.StringUtils;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.interceptor.HostInterceptor;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.bean.ShoppingGoods;
import com.matrix.system.hive.dao.ShoppingGoodsDao;
import com.matrix.system.shopXcx.api.pojo.AddShopOrderPOJO;
import com.matrix.system.shopXcx.api.pojo.CreateOrderDto;
import com.matrix.system.hive.dao.SysVipInfoDao;
import com.matrix.system.shopXcx.api.pojo.OrderInfoQueryPOJO;
import com.matrix.system.shopXcx.api.pojo.ShopOrderDto;
import com.matrix.system.shopXcx.api.service.OrderCouponGroupService;
import com.matrix.system.shopXcx.api.service.ShoppingCartService;
import com.matrix.system.shopXcx.api.service.WXShopOrderService;
import com.matrix.system.shopXcx.api.service.WxShopCouponService;
import com.matrix.system.shopXcx.api.tools.WxShopCouponUtil;
import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil;
import com.matrix.system.shopXcx.api.vo.CouponReceiveInfoVO;
import com.matrix.system.shopXcx.api.vo.ShopCartVo;
import com.matrix.system.shopXcx.bean.*;
import com.matrix.system.shopXcx.bean.ShopOrder;
import com.matrix.system.shopXcx.dao.*;
import com.matrix.system.shopXcx.dto.DiscountExplain;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -83,109 +71,28 @@
    private ShopOrderDetailsDao shopOrderDetailsDao;
    @Autowired
    OrderCouponGroupService orderCouponGroupService;
    @Autowired
    ShopOrderDao shopOrderDao;
    @Autowired
    SysVipInfoDao sysVipInfoDao;
    /**
     * 计算购物车订单价格
     *
     * @param addShopOrderPOJO
     * @param shopOrderDto
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/calculationCartOrder")
    public
    @ResponseBody
    AjaxResult calculationCartOrder(@RequestBody AddShopOrderPOJO addShopOrderPOJO) throws Exception {
        BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class); //计算购物车中物品的优惠信息
        List<ShopCartVo> cartList = shoppingCartService.findUserCartList(addShopOrderPOJO.getShopId());
    AjaxResult calculationCartOrder(@RequestBody ShopOrderDto shopOrderDto) throws Exception {
        //取出购物车中选中的产品
        List<ShopShoppingCart> buyCart = new ArrayList<>();
        //取出购物车中没有参加店铺活动的产品,和参加了店铺活动但是活动没有达到标准的产品,用来计算是否可以使用优惠券
        List<ShopShoppingCart> notCouponuyCart = new ArrayList<>();
        for (ShopCartVo shopCartVo : cartList) {
            for (ShopShoppingCart shopShoppingCart : shopCartVo.getCartList()) {
                if (shopShoppingCart.getIsSelected() == 1) {
                    buyCart.add(shopShoppingCart);
                    if (shopCartVo.getCoupon() == null || !shopCartVo.isSatisfactionCoupon()) {
                        notCouponuyCart.add(shopShoppingCart);
                    }
                }
            }
        }
        //获取当前购物车产品可用的优惠券
        List<CouponReceiveInfoVO> usefulCoupon = wxShopCouponService.getCartVoCouponList(addShopOrderPOJO.getShopId(),notCouponuyCart);
        //获取用户使用的优惠券
        CouponReceiveInfoVO shopCoupon = new CouponReceiveInfoVO();
        if (addShopOrderPOJO.getCouponReceiveId() == null) {
            //如果用户没有选择优惠券则默认选优惠金额最高的
            //计算使用优惠券后的价格
            if (CollectionUtils.isNotEmpty(usefulCoupon)) {
                //根据优惠券ID用户ID查询优惠券信息
                shopCoupon = usefulCoupon.get(0);
            }
        } else if (addShopOrderPOJO.getCouponReceiveId() != 1) {
            //用户选择了优惠券
            shopCoupon = shopCouponRecordDao.selectMyCouponByReceiveId(addShopOrderPOJO.getCouponReceiveId());
        } else {
            //用户不使用优惠券
        }
        //计算收货地址:
        ShopReceiveAddress shopReceiveAddress = null;
        if (addShopOrderPOJO.getReceiveAddrId() == null) {
            //如果没有传收货地址则默认收货地址
            shopReceiveAddress = shopReceiveAddressDao.selectDefaultAddress(bizUser.getOpenId());
            if (shopReceiveAddress != null) {
                addShopOrderPOJO.setReceiveAddrId(shopReceiveAddress.getAddrId());
            }
        } else {
            shopReceiveAddress = shopReceiveAddressDao.selectById(addShopOrderPOJO.getReceiveAddrId());
            addShopOrderPOJO.setReceiveAddrId(shopReceiveAddress.getAddrId());
        }
        Integer addrId = null;
        if (shopReceiveAddress != null) {
            addrId = shopReceiveAddress.getAddrId();
        }
        //得到订单计价说明
        DiscountExplain discountExplain = shopOrderService.buildDiscountExplain(cartList, shopCoupon.getReceiveId(), addrId);
        AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, buyCart, buyCart.size());
        //结算金额信息
        result.putInMap("discountExplain", discountExplain);
        //用户优惠券
        result.putInMap("usefulCoupon", usefulCoupon);
        //用户选中的优惠券
        result.putInMap("shopCoupon", shopCoupon);
        //默认地址
        String deliverySelect = "立即配送";
        if (shopReceiveAddress != null) {
            if (StringUtils.isNotBlank(shopReceiveAddress.getSchool())) {
                deliverySelect = "立即配送";
            } else {
                deliverySelect = "物流配送";
            }
        }
        result.putInMap("defaultAddress", shopReceiveAddress);
        //配送方式
        result.putInMap("deliverySelect", deliverySelect);
        result.setRows(buyCart);
        return result;
        return shopOrderService.buildDiscountExplain(shopOrderDto);
    }
@@ -195,129 +102,17 @@
    /**
     * 新增订单
     *
     * @param addShopOrderPOJO
     * @param shopOrderDto
     * @return
     */
    @PostMapping(value = "/addShopOrder")
    public
    @ResponseBody
    AjaxResult addShopOrder(@RequestBody AddShopOrderPOJO addShopOrderPOJO) throws Exception {
        return shopOrderService.createShopOrder(addShopOrderPOJO);
    AjaxResult addShopOrder(@RequestBody ShopOrderDto shopOrderDto) throws Exception {
        return shopOrderService.createShopOrder(shopOrderDto);
    }
    /**
     * 新增订单
     * 本方法抛弃,不再使用,本方法是单单个产品购买
     * 在多产品的时候不适合
     * @return
     */
    @Deprecated
    @PostMapping(value = "/addShopOrder2")
    public
    @ResponseBody
    AjaxResult addShopOrder2(@RequestBody CreateOrderDto createOrderDto) throws Exception {
        //校验收货地址
        ShopReceiveAddress shopReceiveAddress = shopReceiveAddressDao.selectById(createOrderDto.getReceiveAddrId());
        if (shopReceiveAddress == null) {
            return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择正确的收获地址");
        }
        BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
        ShopSku shopSku = shopSkuDao.selectById(createOrderDto.getSkuId());
        ShopProduct shopProduct = shopProductDao.selectById(createOrderDto.getProductId());
        String stokCode = shopSku.getStockCode();
        ShopOrder shopOrder = new ShopOrder();
        //查询绑定的产品是否为家居产品
        if (StringUtils.isNotBlank(stokCode)) {
            ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(Long.parseLong(stokCode));
            if (shoppingGoods != null) {
                //根据购买的产品设置订单类型
                if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(shoppingGoods.getGoodType())) {
                    shopOrder.setOrderType(ShopOrder.ORDER_TYPE_GOODS);
                } else {
                    shopOrder.setOrderType(ShopOrder.ORDER_TYPE_SERVICE);
                }
            } else {
                shopOrder.setOrderType(ShopOrder.ORDER_TYPE_GOODS);
            }
        }
        List<ShopOrderDetails> details = new ArrayList<>();
        Integer cartCount = 0;
        ShopOrderDetails shopOrderDetails = new ShopOrderDetails();
        shopOrderDetails.setCreateBy(AppConstance.SYSTEM_USER);
        shopOrderDetails.setUpdateBy(AppConstance.SYSTEM_USER);
        shopOrderDetails.setpId(createOrderDto.getProductId());
        shopOrderDetails.setsId(createOrderDto.getSkuId());
        shopOrderDetails.setPrice(shopSku.getPrice());
        shopOrderDetails.setCount(createOrderDto.getNumber());
        shopOrderDetails.setsTitle(shopProduct.getTitle() + shopSku.getName());
        shopOrderDetails.setDiscountAmount(BigDecimal.ZERO);
        shopOrderDetails.setTotalPrice(shopOrderDetails.getPrice().multiply(BigDecimal.valueOf(shopOrderDetails.getCount())));
        details.add(shopOrderDetails);
        cartCount += shopOrderDetails.getCount();
        //TODO 更新库存和销量[考虑和erp库存联动]
        wxShopOrderUtil.updateProductAndSkuInfo(details);
        //用户openId
        shopOrder.setUserId(bizUser.getOpenId());
        shopOrder.setCreateBy("微信小程序生成");
        shopOrder.setUpdateBy("微信小程序生成");
        shopOrder.setCommodityPrice(shopOrderDetails.getTotalPrice());
        shopOrder.setPurchaseQuantity(cartCount);
        //购买方式
        shopOrder.setShippingMethod("物流配送");
        //生成订单号
        shopOrder.setOrderNo(WxUtils.getOrderNum());
        //设置支付状态
        shopOrder.setPayStatus(ShopOrder.ORDER_STATUS_WAIT_PAY);
        //设置订单状态
        shopOrder.setOrderStatus(ShopOrder.ORDER_STATUS_WAIT_SEND);
        //设置退款费用(注:下次优化从数据字典表获取)
        shopOrder.setRefundCharge(BigDecimal.ZERO);
        //客户电话
        shopOrder.setUserTel(shopReceiveAddress.getAddrTelephone());
        //客户姓名
        shopOrder.setUserName(shopReceiveAddress.getAddrLiaisonman());
        //备注
        shopOrder.setRemarks(createOrderDto.getRemarks());
        //删除标识
        shopOrder.setDelFlag(AppConstance.DATA_USEABLE);
        //微信订单号
        shopOrder.setWxOrderNo("");
        //微信支付结果
        shopOrder.setPayResult(ShopOrder.ORDER_WX_STATUS_WAIT_PAY);
        //如果没有提交购买方式或配送方式不是物流
        //获取邮费
        shopOrder.setOrderMoney(shopOrderDetails.getTotalPrice());
        shopOrder.setStoreId(createOrderDto.getShopId());
        shopOrderDao.insert(shopOrder);
        wxShopOrderUtil.insertSendPackageInfo(shopOrder, "物流配送", shopReceiveAddress);
        //给订单详情表添加订单ID
        shopOrderDetails.setOrderId(shopOrder.getId());
        shopOrderDetailsDao.insert(shopOrderDetails);
        BrandWCPayRequestData payData = startPayment(shopOrder);
        AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, Arrays.asList(payData));
        result.putInMap("orderId", shopOrder.getId());
        return result;
    }
    @Value("${wx_pay_debug_onoff}")
    private boolean isDebug;
@@ -336,12 +131,14 @@
        BigDecimal money = new BigDecimal(shopOrder.getOrderMoney().toString());
        BrandWCPayRequestData payData;
        String productNames = wxShopOrderUtil.getProductNames(shopOrder.getUserId(), shopOrder.getId());
        SysVipInfo vipInfo = sysVipInfoDao.selectById(shopOrder.getUserId());
        if (isDebug) {
            payData = weixinServiceUtil.createOrder("[测试]" + productNames, shopOrder.getOrderNo(),
                    1, shopOrder.getUserId(), String.valueOf(shopOrder.getId()));
                    1, vipInfo.getOpenId(), String.valueOf(shopOrder.getId()));
        } else {
            payData = weixinServiceUtil.createOrder(productNames, shopOrder.getOrderNo(),
                    unit.multiply(money).intValue(), shopOrder.getUserId(), String.valueOf(shopOrder.getId()));
                    unit.multiply(money).intValue(), vipInfo.getOpenId(), String.valueOf(shopOrder.getId()));
        }
        ShopOrder updateParam = new ShopOrder();
        updateParam.setId(shopOrder.getId());
@@ -450,9 +247,9 @@
    @GetMapping(value = "/getOrderStatusCount")
    @ResponseBody
    public AjaxResult getOrderStatusCount() {
        BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
        SysVipInfo sysVipInfo = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
        AjaxResult result = AjaxResult.buildSuccessInstance(
                shopOrderDao.selectOrderStatusCount(bizUser.getOpenId()));
                shopOrderDao.selectOrderStatusCount(sysVipInfo.getId()));
        return result;
    }