package com.matrix.system.shopXcx.api.service.impl; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.matrix.system.hive.bean.SysVipInfo; import com.matrix.system.common.init.UserCacheManager; import com.matrix.component.tools.WxUtils; import com.matrix.component.wechat.externalInterface.protocol.paramProtocol.BrandWCPayRequestData; 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.constance.Dictionary; import com.matrix.system.hive.bean.ShoppingGoods; import com.matrix.system.hive.dao.ShoppingGoodsDao; import com.matrix.system.shopXcx.api.service.WXShopOrderService; import com.matrix.system.shopXcx.api.service.WxShopActivitiesSecKillService; import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil; import com.matrix.system.shopXcx.bean.*; import com.matrix.system.shopXcx.dao.*; import com.matrix.system.shopXcx.dto.CreateSecKillDTO; import com.matrix.system.shopXcx.dto.DiscountExplain; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author wzy * @date 2020-04-09 16:18 **/ @Service public class WxShopActivitiesSecKillServiceImpl implements WxShopActivitiesSecKillService { @Autowired private ShopActivitiesDao shopActivitiesDao; @Autowired private ShopActivitiesSeckillInfoDao shopActivitiesSeckillInfoDao; @Autowired private ShopOrderDao shopOrderDao; @Autowired private ShopReceiveAddressDao shopReceiveAddressDao; @Autowired private ShopSkuDao shopSkuDao; @Autowired private WxShopOrderUtil wxShopOrderUtil; @Autowired private ShoppingGoodsDao shoppingGoodsDao; @Autowired private WXShopOrderService wxShopOrderService; @Autowired private ShopOrderDetailsDao shopOrderDetailsDao; @Autowired private UserCacheManager userCacheManager; @Autowired private ShopActivitiesSeckillRecordDao shopActivitiesSeckillRecordDao; @Override @Transactional(rollbackFor = Exception.class) public AjaxResult createSecKillOrder(CreateSecKillDTO secKillDTO) throws Exception { SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); ShopActivitiesSeckillInfo seckillInfo = shopActivitiesSeckillInfoDao.selectById(secKillDTO.getId()); if (seckillInfo == null) { return AjaxResult.buildFailInstance("秒杀不存在"); } ShopActivities shopActivities = shopActivitiesDao.selectById(seckillInfo.getActId()); if (shopActivities.getActBeginTime().getTime() > System.currentTimeMillis()) { return AjaxResult.buildFailInstance("秒杀未开始,请耐心等待"); } if (shopActivities.getActEndTime().getTime() < System.currentTimeMillis()) { return AjaxResult.buildFailInstance("秒杀已结束"); } if (seckillInfo.getSiRemainCnt() != null && seckillInfo.getSiRemainCnt() != 0) { if (secKillDTO.getCount() > seckillInfo.getSiRemainCnt()) { return AjaxResult.buildFailInstance("商品不足"); } } if (seckillInfo.getSiLimitCnt() != null && seckillInfo.getSiLimitCnt() != 0) { if (secKillDTO.getCount() > seckillInfo.getSiLimitCnt()) { return AjaxResult.buildFailInstance("购买数量超过最大限购数量"); } int count = shopActivitiesSeckillRecordDao.selectCountSecKill(seckillInfo.getId(), sysVipInfo.getOpenId()); if (secKillDTO.getCount() + count > seckillInfo.getSiLimitCnt()) { return AjaxResult.buildFailInstance("购买数量超过最大限购数量"); } } secKillDTO.setPrice(seckillInfo.getSiPrice()); secKillDTO.setGoodsId(seckillInfo.getGoodsId().intValue()); secKillDTO.setOpenId(sysVipInfo.getOpenId()); ShopOrder shopOrder = createOrder(secKillDTO); ShopActivitiesSeckillRecord seckillRecord = new ShopActivitiesSeckillRecord(); seckillRecord.setOrderId(shopOrder.getId().longValue()); seckillRecord.setSiId(seckillInfo.getId()); seckillRecord.setUserId(sysVipInfo.getId()); seckillRecord.setCreateBy(sysVipInfo.getNickName() == null ? "游客" : sysVipInfo.getNickName()); seckillRecord.setUpdateBy(sysVipInfo.getNickName() == null ? "游客" : sysVipInfo.getNickName()); seckillRecord.setCompanyId(seckillInfo.getCompanyId()); // 同步锁 synchronized (this) { ShopActivitiesSeckillInfo remain = shopActivitiesSeckillInfoDao.selectById(secKillDTO.getId()); if (secKillDTO.getCount() > remain.getSiRemainCnt()) { return AjaxResult.buildFailInstance("商品不足"); } shopActivitiesSeckillRecordDao.insert(seckillRecord); // 更新数据剩余数量 seckillInfo.setSiRemainCnt(seckillInfo.getSiRemainCnt() - secKillDTO.getCount()); shopActivitiesSeckillInfoDao.updateByModel(seckillInfo); } BrandWCPayRequestData payData = wxShopOrderService.startPayment(shopOrder); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, Arrays.asList(payData)); // AjaxResult result = AjaxResult.buildSuccessInstance("sucess"); result.putInMap("orderId", shopOrder.getId()); return result; } private ShopOrder createOrder(CreateSecKillDTO secKillDTO) { SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); ShopReceiveAddress shopReceiveAddress = shopReceiveAddressDao.selectById(secKillDTO.getAddressId()); if (shopReceiveAddress == null) { throw new GlobleException("请选择正确的收获地址"); } ShopOrder shopOrder = new ShopOrder(); shopOrder.setStoreId(Integer.parseInt(secKillDTO.getShopId().toString())); shopOrder.setOrderType(ShopOrder.ORDER_TYPE_SERVICE); List shopSkus = shopSkuDao.selectByPid(secKillDTO.getGoodsId()); List details = new ArrayList<>(); ShopOrderDetails shopOrderDetails = new ShopOrderDetails(); shopOrderDetails.setCreateBy(AppConstance.SYSTEM_USER); shopOrderDetails.setUpdateBy(AppConstance.SYSTEM_USER); shopOrderDetails.setpId(secKillDTO.getGoodsId()); shopOrderDetails.setsId(shopSkus.get(0).getId()); shopOrderDetails.setPrice(secKillDTO.getPrice()); shopOrderDetails.setCount(secKillDTO.getCount()); shopOrderDetails.setsTitle(shopSkus.get(0).getName()); shopOrderDetails.setDiscountAmount(BigDecimal.ZERO); shopOrderDetails.setTotalPrice(shopOrderDetails.getPrice().multiply(BigDecimal.valueOf(shopOrderDetails.getCount()))); details.add(shopOrderDetails); //查询绑定的产品是否为家居产品,如果已经含家具产品则不再比较 if (ShopOrder.ORDER_TYPE_GOODS != shopOrder.getOrderType()) { ShopSku shopSku = shopSkuDao.selectById(shopSkus.get(0).getId().intValue()); String stokCode = shopSku.getStockCode(); 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 { } } else { shopOrder.setOrderType(ShopOrder.ORDER_TYPE_GOODS); } } } //TODO 更新库存和销量 更新库存和销量[考虑和erp库存联动] wxShopOrderUtil.updateProductAndSkuInfo(details); shopOrder.setUserId(sysVipInfo.getId()); shopOrder.setCreateBy("微信小程序生成"); shopOrder.setUpdateBy("微信小程序生成"); shopOrder.setCommodityPrice(secKillDTO.getPrice()); shopOrder.setPurchaseQuantity(1); shopOrder.setCompanyId(sysVipInfo.getCompanyId()); //购买方式 shopOrder.setShippingMethod(secKillDTO.getShippingMethod()); //生成订单号 shopOrder.setOrderNo(WxUtils.getOrderNum()); //设置支付状态 shopOrder.setPayStatus(ShopOrder.ORDER_STATUS_WAIT_PAY); //设置订单状态 shopOrder.setOrderStatus(ShopOrder.ORDER_PAY_STATUS_WAIT); //设置退款费用(注:下次优化从数据字典表获取) shopOrder.setRefundCharge(BigDecimal.ZERO); //客户电话 shopOrder.setUserTel(shopReceiveAddress.getAddrTelephone()); //客户姓名 shopOrder.setUserName(shopReceiveAddress.getAddrLiaisonman()); //删除标识 shopOrder.setDelFlag(AppConstance.DATA_USEABLE); shopOrder.setActivityType(ShopOrder.ACTIVITY_TYPE_SECKILL); //微信订单号 shopOrder.setWxOrderNo(""); //微信支付结果 shopOrder.setPayResult(ShopOrder.ORDER_WX_STATUS_WAIT_PAY); //如果没有提交购买方式或配送方式不是物流 //获取邮费 BigDecimal postPrice = wxShopOrderService.calculationPostage(secKillDTO.getPrice(),sysVipInfo.getCompanyId()); shopOrder.setPostage(postPrice); BigDecimal payPrice = secKillDTO.getPrice().multiply(BigDecimal.valueOf(secKillDTO.getCount())).add(shopOrder.getPostage()); shopOrder.setOrderMoney(payPrice); DiscountExplain discountExplain = new DiscountExplain(); discountExplain.setPayPrice(payPrice); discountExplain.setPostage(postPrice); discountExplain.setActivityPrice(BigDecimal.ZERO); discountExplain.setCouponPrice(BigDecimal.ZERO); discountExplain.setBillPrice(payPrice); Gson g = new GsonBuilder().create(); shopOrder.setDiscountExplain(g.toJson(discountExplain)); shopOrderDao.insert(shopOrder); wxShopOrderUtil.insertSendPackageInfo(shopOrder, secKillDTO.getShippingMethod(), shopReceiveAddress); //给订单详情表添加订单ID for (ShopOrderDetails detail : details) { detail.setOrderId(shopOrder.getId()); } if (CollectionUtils.isNotEmpty(details)) { shopOrderDetailsDao.batchInsert(details); } return shopOrder; } }