935090232@qq.com
2021-10-20 240b9fb99d759c0a40d9a8f4098ccea8a945db67
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java
@@ -1,30 +1,42 @@
package com.matrix.system.shopXcx.api.action;
import com.matrix.system.hive.bean.SysVipInfo;
import com.matrix.component.asyncmessage.AsyncMessageManager;
import com.matrix.component.redis.RedisUserLoginUtils;
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.LogUtil;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.hive.bean.MoneyCardUse;
import com.matrix.system.hive.bean.MoneyCardUseFlow;
import com.matrix.system.hive.bean.SysVipInfo;
import com.matrix.system.hive.dao.MoneyCardUseDao;
import com.matrix.system.hive.dao.MoneyCardUseFlowDao;
import com.matrix.system.hive.dao.ShoppingGoodsDao;
import com.matrix.system.hive.dao.SysVipInfoDao;
import com.matrix.system.score.dao.ScoreVipDetailDao;
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.bean.ShopActivitiesGroupJoin;
import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoinUser;
import com.matrix.system.shopXcx.bean.ShopOrder;
import com.matrix.system.shopXcx.bean.ShopPayLog;
import com.matrix.system.shopXcx.dao.*;
import com.matrix.system.shopXcx.mqTask.AsyncMessageRouting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.*;
/**
@@ -42,16 +54,10 @@
    @Autowired
    WxShopCouponService wxShopCouponService;
    @Autowired
    private ShopReceiveAddressDao shopReceiveAddressDao;
    @Autowired
    ShoppingCartService shoppingCartService;
    @Autowired
    private ShopCouponDao shopCouponDao;
    @Autowired
    private WxShopCouponUtil wxShopCouponUtil;
    @Autowired
    private RedisUserLoginUtils redisUserLoginUtils;
@@ -64,20 +70,39 @@
    @Autowired
    ShopProductDao shopProductDao;
    @Autowired
    private WxShopOrderUtil wxShopOrderUtil;
    @Autowired
    private ShopOrderDetailsDao shopOrderDetailsDao;
    @Autowired
    OrderCouponGroupService orderCouponGroupService;
    @Autowired
    private ShopPayLogDao shopPayLogDao;
    @Autowired
    ShopOrderDao shopOrderDao;
    @Autowired
    SysVipInfoDao sysVipInfoDao;
    @Autowired
    private ShopActivitiesGroupJoinUserDao shopActivitiesGroupJoinUserDao;
    @Autowired
    private ShopActivitiesGroupJoinDao shopActivitiesGroupJoinDao;
    @Autowired
    private AsyncMessageManager asyncMessageManager;
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    MoneyCardUseFlowDao moneyCardUseFlowDao;
    @Autowired
    MoneyCardUseDao moneyCardUseDao;
    @Value("${evn}")
    private String evn;
    /**
     * 计算购物车订单价格
@@ -90,17 +115,15 @@
    public
    @ResponseBody
    AjaxResult calculationCartOrder(@RequestBody ShopOrderDto shopOrderDto) throws Exception {
        return shopOrderService.buildDiscountExplain(shopOrderDto);
    }
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    private ScoreVipDetailDao scoreVipDetailDao;
    /**
     * 新增订单
     * 新增微信支付订单
     *
     * @param shopOrderDto
     * @return
@@ -108,43 +131,129 @@
    @PostMapping(value = "/addShopOrder")
    public
    @ResponseBody
    AjaxResult addShopOrder(@RequestBody ShopOrderDto shopOrderDto) throws Exception {
        return shopOrderService.createShopOrder(shopOrderDto);
    AjaxResult addShopOrder(@RequestBody @Validated ShopOrderDto shopOrderDto) throws Exception {
        ShopOrder shopOrder = shopOrderService.createShopOrder(shopOrderDto);
        AjaxResult result = AjaxResult.buildSuccessInstance("订单创建成功");
        result.putInMap("orderId", shopOrder.getId());
        if (shopOrderDto.getPayMethod().equals(ShopOrder.SHOP_ORDER_PAY_METHOD_WX)) {
            BrandWCPayRequestData payData = shopOrderService.startPayment(shopOrder);
            result.setRows(Arrays.asList(payData));
        }
        return result;
    }
    @Value("${wx_pay_debug_onoff}")
    private boolean isDebug;
    @Autowired
    private WeixinServiceUtil weixinServiceUtil;
    /**
     * 开始付款
     * 余额支付确认
     *
     * @param shopOrder
     * @param orderId
     * @return
     * @throws Exception
     */
    public BrandWCPayRequestData startPayment(ShopOrder shopOrder) throws Exception {
        BigDecimal unit = new BigDecimal("100");
        BigDecimal money = new BigDecimal(shopOrder.getOrderMoney().toString());
        BrandWCPayRequestData payData;
        String productNames = wxShopOrderUtil.getProductNames(shopOrder.getUserId(), shopOrder.getId());
        SysVipInfo vipInfo = sysVipInfoDao.selectById(shopOrder.getUserId());
    @GetMapping(value = "/moneyCardPay/{orderId}")
    @ResponseBody
    @Transactional
    public   AjaxResult moneyCardPay(@PathVariable Integer orderId) throws Exception {
        if (isDebug) {
            payData = weixinServiceUtil.createOrder("[测试]" + productNames, shopOrder.getOrderNo(),
                    1, vipInfo.getOpenId(), String.valueOf(shopOrder.getId()));
        ShopOrder order = shopOrderDao.selectById(orderId);
        if (order != null
                && ShopOrder.SHOP_ORDER_PAY_METHOD_VIPCARD == order.getPayMethod()
                && ShopOrder.ORDER_PAY_STATUS_WAIT == order.getPayStatus()) {
            MoneyCardUse moneyCardUse = moneyCardUseDao.selectVipCard(order.getUserId());
            Double balance=moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney();
            if(balance>=order.getOrderMoney().doubleValue()){
                //扣减会员卡余额
                if(moneyCardUse.getRealMoney()>=order.getOrderMoney().doubleValue()){
                    moneyCardUse.setRealMoney(moneyCardUse.getRealMoney()-order.getOrderMoney().doubleValue());
                }else{
                    moneyCardUse.setGiftMoney(moneyCardUse.getGiftMoney()-(order.getOrderMoney().doubleValue()- moneyCardUse.getRealMoney() ));
                    moneyCardUse.setRealMoney(0D);
                }
                moneyCardUseDao.update(moneyCardUse);
                //插入扣减记录
                MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow();
                moneyCardUseFlow.setTotal(order.getOrderMoney().doubleValue());
                moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
                moneyCardUseFlow.setVipId(order.getUserId());
                moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER);
                moneyCardUseFlow.setOrderNo(order.getOrderNo());
                moneyCardUseFlow.setCreateTime(new Date());
                moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney()+moneyCardUse.getRealMoney());
                moneyCardUseFlow.setCardName(moneyCardUse.getCardName());
                moneyCardUseFlowDao.insert(moneyCardUseFlow);
                //构建需要修改订单信息Map
                Map<String, Object> modifyMap = new HashMap<>();
                modifyMap.put("id", order.getId());
                //设置微信支付状态为已支付
                modifyMap.put("payResult", ShopOrder.ORDER_WX_STATUS_PAY_SUCCESS);
                //设置支付状态为支付成功
                modifyMap.put("payStatus", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
                //如果是商品订单则进入待发货
                modifyMap.put("orderStatus", ShopOrder.ORDER_STATUS_WAIT_SEND);
                shopOrderDao.updateByMap(modifyMap);
                // 判断该订单是否为拼团产生的订单
                ShopActivitiesGroupJoinUser joinUser = shopActivitiesGroupJoinUserDao.selectGroupJoinUserByOrderId(order.getId().longValue());
                if (joinUser != null) {
                    joinUser.setIsHasPay(ShopActivitiesGroupJoinUser.IS_HAS_PAY_Y);
                    shopActivitiesGroupJoinUserDao.updateByModel(joinUser);
                    ShopActivitiesGroupJoin groupJoin = shopActivitiesGroupJoinDao.selectGroupAndPriceById(joinUser.getGjId());
                    List<ShopActivitiesGroupJoinUser> joinUserList = shopActivitiesGroupJoinUserDao.selectGroupJoinUserListByGjId(joinUser.getGjId());
                    LogUtil.info("#当前已支付完成:{}#", joinUserList.size());
                    // 若拼团中已支付的数量等于几人团预设值,则更新拼团状态为拼团成功
                    if (groupJoin.getGroupPrice().getGpCount() == joinUserList.size()) {
                        groupJoin.setGjStatus(ShopActivitiesGroupJoin.ACTIVITIES_JOIN_SUCCESS);
                    } else {
                        if (joinUser.getUserId().equals(groupJoin.getGjHeadId())) {
                            groupJoin.setGjStatus(ShopActivitiesGroupJoin.ACTIVITIES_JOIN_ING);
                        }
                    }
                    shopActivitiesGroupJoinDao.updateByModel(groupJoin);
                    SysVipInfo sysVipInfo = sysVipInfoDao.selectByPhone(order.getUserTel(),order.getCompanyId());
                    if (sysVipInfo != null) {
                        sysVipInfo.setIsDeal(SysVipInfo.DEAL_VIP);
                        sysVipInfoDao.update(sysVipInfo);
                    }
                }
                // 根据订单类型创建不同的处理任务
               asyncMessageManager.sendMsg(AsyncMessageRouting.CREATE_ORDER ,"orderId=%s",orderId);
                //支付记录
                recordPayLog(Integer.valueOf(orderId), 1, order.getOrderNo(), order.getOrderMoney(), "会员卡余额支付成功", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
                return AjaxResult.buildSuccessInstance("支付成功");
            }else{
                return AjaxResult.buildFailInstance("会员卡余额不足");
            }
        } else {
            payData = weixinServiceUtil.createOrder(productNames, shopOrder.getOrderNo(),
                    unit.multiply(money).intValue(), vipInfo.getOpenId(), String.valueOf(shopOrder.getId()));
            LogUtil.info("订单状态不为待付款,order status=", order.getOrderStatus());
            return AjaxResult.buildFailInstance("订单不支持本次结算");
        }
        ShopOrder updateParam = new ShopOrder();
        updateParam.setId(shopOrder.getId());
        updateParam.setWxOrderNo(payData.getPrepay_id());
        shopOrderDao.updateByModel(updateParam);
        return payData;
    }
    private void recordPayLog(Integer orderId, Integer type, String orderNo, BigDecimal payMoney, String payRemark, int payStatus) {
        //设置支付类型为收款
        ShopPayLog payLog = new ShopPayLog();
        payLog.setPayType(type);
        payLog.setJoinId(orderId);
        payLog.setPayMoney(payMoney);
        payLog.setPayOrderNo(orderNo);
        payLog.setPayRemark(payRemark);
        payLog.setPayStatus(payStatus);
        payLog.setCreateBy(AppConstance.SYSTEM_USER);
        payLog.setUpdateBy(AppConstance.SYSTEM_USER);
        shopPayLogDao.insert(payLog);
    }
@@ -249,7 +358,7 @@
    public AjaxResult getOrderStatusCount() {
        SysVipInfo sysVipInfo = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
        AjaxResult result = AjaxResult.buildSuccessInstance(
                shopOrderDao.selectOrderStatusCount(sysVipInfo.getOpenId()));
                shopOrderDao.selectOrderStatusCount(sysVipInfo.getId()));
        return result;
    }