|  |  |  | 
|---|
|  |  |  | package com.matrix.system.shopXcx.api.action; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.matrix.system.hive.bean.SysVipInfo; | 
|---|
|  |  |  | import com.matrix.component.rabbitmq.RabiitMqTemplate; | 
|---|
|  |  |  | 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.config.RabbitMqConfig; | 
|---|
|  |  |  | 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.MQTaskRouting; | 
|---|
|  |  |  | 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.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | WxShopCouponService wxShopCouponService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private ShopReceiveAddressDao shopReceiveAddressDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | ShoppingCartService shoppingCartService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private ShopCouponDao shopCouponDao; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WxShopCouponUtil wxShopCouponUtil; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RedisUserLoginUtils redisUserLoginUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @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 RabiitMqTemplate rabiitMqTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | ShoppingGoodsDao shoppingGoodsDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | MoneyCardUseFlowDao moneyCardUseFlowDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | MoneyCardUseDao moneyCardUseDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Value("${evn}") | 
|---|
|  |  |  | private String evn; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 计算购物车订单价格 | 
|---|
|  |  |  | 
|---|
|  |  |  | public | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | AjaxResult calculationCartOrder(@RequestBody ShopOrderDto shopOrderDto) throws Exception { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return shopOrderService.buildDiscountExplain(shopOrderDto); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | ShoppingGoodsDao shoppingGoodsDao; | 
|---|
|  |  |  | private ScoreVipDetailDao scoreVipDetailDao; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 新增订单 | 
|---|
|  |  |  | * 新增微信支付订单 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param shopOrderDto | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  | @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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 根据订单类型创建不同的处理任务 | 
|---|
|  |  |  | rabiitMqTemplate.sendTopicMsg(RabbitMqConfig.MQ_EXCHANGE_TOPIC + evn, MQTaskRouting.CREATE_ORDER + evn, 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|