package com.matrix.system.shopXcx.api.service.impl; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.matrix.biz.bean.BizUser; import com.matrix.component.redis.RedisUserLoginUtils; 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.bean.SysVipInfo; import com.matrix.system.hive.dao.ShoppingGoodsDao; import com.matrix.system.hive.dao.SysVipInfoDao; import com.matrix.system.shopXcx.api.service.WXShopOrderService; import com.matrix.system.shopXcx.api.service.WxShopActivitiesGroupService; 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.CreateGroupBuyDTO; 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.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; /** * @author wzy */ @Service public class WxShopActivitiesGroupServiceImpl implements WxShopActivitiesGroupService { @Autowired private WxShopOrderUtil wxShopOrderUtil; @Autowired private ShopActivitiesGroupInfoDao shopActivitiesGroupInfoDao; @Autowired private RedisUserLoginUtils redisUserLoginUtils; @Autowired private ShopActivitiesGroupPriceDao shopActivitiesGroupPriceDao; @Autowired private ShopActivitiesGroupJoinDao shopActivitiesGroupJoinDao; @Autowired private ShopActivitiesGroupJoinUserDao shopActivitiesGroupJoinUserDao; @Autowired private ShopReceiveAddressDao shopReceiveAddressDao; @Autowired private ShopProductDao shopProductDao; @Autowired private ShopSkuDao shopSkuDao; @Autowired private ShoppingGoodsDao shoppingGoodsDao; @Autowired private ShopOrderDao shopOrderDao; @Autowired private ShopOrderDetailsDao shopOrderDetailsDao; @Autowired private WXShopOrderService wxShopOrderService; @Autowired private ShopActivitiesDao shopActivitiesDao; @Autowired private SysVipInfoDao sysVipInfoDao; @Value("${activities.groupBuy.limit}") private String groupBuyLimit; @Value("${groupBuy.pay.timeLimit}") private String payTimeLimit; @Override @Transactional(rollbackFor = Exception.class) public AjaxResult createGroupBuy(CreateGroupBuyDTO createGroupBuyDTO) throws Exception { BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class); ShopActivitiesGroupPrice groupPrice = shopActivitiesGroupPriceDao.selectById(createGroupBuyDTO.getGpId()); ShopActivitiesGroupInfo groupInfo = shopActivitiesGroupInfoDao.selectGroupInfoByActId(groupPrice.getActId()); ShopActivities shopActivities = shopActivitiesDao.selectById(groupPrice.getActId()); // 判断拼团是否已经结束 if (shopActivities.getActEndTime().getTime() < new Date().getTime() || shopActivities.getActStatus() == ShopActivities.ACTIVITIES_STATUS_CLOSE) { return new AjaxResult(AjaxResult.STATUS_FAIL, "该拼团已结束"); } // 判断最大开团数量 if (groupInfo.getGiHeadDiscount() != null && groupInfo.getGiHeadDiscount() != 0) { int createCnt = shopActivitiesGroupJoinDao.selectCreateGroupBuyCount(shopActivities.getId(), bizUser.getOpenId()); if (createCnt > groupInfo.getGiHeadDiscount()) { return AjaxResult.buildFailInstance("达到最大开团数量"); } } // 限制购买数量 if (groupInfo.getGiLimitBuy() != null && groupInfo.getGiLimitBuy() != 0) { if (createGroupBuyDTO.getCount() > groupInfo.getGiLimitBuy()) { return AjaxResult.buildFailInstance("达到最大限购数量"); } int count = shopActivitiesGroupJoinUserDao.selectCountHasBuy(groupInfo.getId(), bizUser.getOpenId()); if (count + createGroupBuyDTO.getCount() > groupInfo.getGiLimitBuy()) { return AjaxResult.buildFailInstance("达到最大限购数量"); } } // 判断该用户在这个活动中是否存在拼团,并判断该拼团订单是否已付款 ShopActivitiesGroupJoin existGroupJoin = shopActivitiesGroupJoinDao.selectExistGroupingJoinByUser(groupPrice.getActId(), bizUser.getOpenId()); if (existGroupJoin != null) { if (existGroupJoin.getGjStatus() == ShopActivitiesGroupJoin.ACTIVITIES_JOIN_WAIT_PAY) { return new AjaxResult(AjaxResult.STATUS_FAIL, "您该活动有个订单未付款"); } return new AjaxResult(AjaxResult.STATUS_FAIL, "该活动已存在拼团"); } boolean isOld = isOldUser(bizUser.getPhoneNumber()); // 老用户和老带新的开团都必须是老用户 if (ShopActivitiesGroupInfo.GROUP_TYPE_ALL_OLD == groupInfo.getGiType() || ShopActivitiesGroupInfo.GROUP_TYPE_OLD_AND_NEW == groupInfo.getGiType()) { if (!isOld) { return AjaxResult.buildFailInstance("该活动需由老用户开团"); } } // 新用户 -- 开团必须是新用户 if (ShopActivitiesGroupInfo.GROUP_TYPE_ALL_NEW == groupInfo.getGiType()) { if (isOld) { return AjaxResult.buildFailInstance("该活动仅新用户参与"); } } createGroupBuyDTO.setPrice(groupPrice.getGpPrice()); createGroupBuyDTO.setGoodsId(groupInfo.getGoodsId().intValue()); createGroupBuyDTO.setOpenId(bizUser.getOpenId()); ShopOrder shopOrder = createOrderByGroupBuy(createGroupBuyDTO); ShopActivitiesGroupJoin groupJoin = new ShopActivitiesGroupJoin(); groupJoin.setGpId(createGroupBuyDTO.getGpId()); groupJoin.setActId(groupPrice.getActId()); groupJoin.setGjBeginTime(new Date()); Calendar gjEndTime = Calendar.getInstance(); gjEndTime.add(Calendar.HOUR_OF_DAY, Integer.parseInt(groupBuyLimit)); groupJoin.setGjEndTime(gjEndTime.getTime()); groupJoin.setGiId(groupInfo.getId()); groupJoin.setGjStatus(ShopActivitiesGroupJoin.ACTIVITIES_JOIN_WAIT_PAY); groupJoin.setCreateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); groupJoin.setUpdateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); groupJoin.setGjHeadId(bizUser.getOpenId()); groupJoin.setCompanyId(shopActivities.getCompanyId()); shopActivitiesGroupJoinDao.insert(groupJoin); ShopActivitiesGroupJoinUser joinUser = new ShopActivitiesGroupJoinUser(); joinUser.setGjId(groupJoin.getId()); joinUser.setGiId(groupInfo.getId()); joinUser.setUserId(bizUser.getOpenId()); joinUser.setIsHead(ShopActivitiesGroupJoinUser.USER_IS_HEAD_Y); joinUser.setCreateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); joinUser.setUpdateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); joinUser.setIsHasPay(ShopActivitiesGroupJoinUser.IS_HAS_PAY_N); joinUser.setIsHasCancel(ShopActivitiesGroupJoinUser.IS_HAS_CANCEL_N); Calendar payEndTime = Calendar.getInstance(); payEndTime.add(Calendar.MINUTE, Integer.parseInt(payTimeLimit)); joinUser.setPayEndTime(payEndTime.getTime()); joinUser.setOrderId(shopOrder.getId().longValue()); joinUser.setIsNewUser(isOld ? 2 : 1); joinUser.setCompanyId(shopActivities.getCompanyId()); int i = shopActivitiesGroupJoinUserDao.insert(joinUser); BrandWCPayRequestData payData = wxShopOrderService.startPayment(shopOrder); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, Arrays.asList(payData)); result.putInMap("orderId", shopOrder.getId()); return result; // return new AjaxResult(AjaxResult.STATUS_SUCCESS, "拼团成功"); } @Transactional(rollbackFor = Exception.class) @Override public AjaxResult joinGroupBuy(CreateGroupBuyDTO createGroupBuyDTO) throws Exception { BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class); // TODO 需判断拼团结束时间以及当前拼团是否已满员 ShopActivitiesGroupJoin groupJoin = shopActivitiesGroupJoinDao.selectById(createGroupBuyDTO.getGjId()); if (groupJoin == null) { return AjaxResult.buildFailInstance("该拼团不存在"); } if (groupJoin.getGjHeadId().equals(bizUser.getOpenId())) { return AjaxResult.buildFailInstance("您是拼团团长,无法加入拼团"); } if (groupJoin.getGjEndTime().getTime() < new Date().getTime()) { return AjaxResult.buildFailInstance("该拼团时间已结束"); } ShopActivitiesGroupJoinUser groupJoinUser = shopActivitiesGroupJoinUserDao.selectGroupJoinUserByUserIdAndGjId(bizUser.getOpenId(), groupJoin.getId()); if (groupJoinUser != null) { return AjaxResult.buildFailInstance("您已加入了该拼团"); } List isExsitNoPay = shopActivitiesGroupJoinUserDao.selectGroupJoinUserByPayingAndUnCancel(groupJoin.getId()); if (CollectionUtils.isNotEmpty(isExsitNoPay)) { return AjaxResult.buildFailInstance("该拼团有未支付的用户,暂不能参加"); } ShopActivitiesGroupInfo groupInfo = shopActivitiesGroupInfoDao.selectById(groupJoin.getGiId()); // 限制购买数量 if (groupInfo.getGiLimitBuy() != null && groupInfo.getGiLimitBuy() != 0) { if (createGroupBuyDTO.getCount() > groupInfo.getGiLimitBuy()) { return AjaxResult.buildFailInstance("达到最大限购数量"); } int count = shopActivitiesGroupJoinUserDao.selectCountHasBuy(groupInfo.getId(), bizUser.getOpenId()); if (count + createGroupBuyDTO.getCount() > groupInfo.getGiLimitBuy()) { return AjaxResult.buildFailInstance("达到最大限购数量"); } } ShopActivitiesGroupPrice groupPrice = shopActivitiesGroupPriceDao.selectById(groupJoin.getGpId()); groupJoinUser = new ShopActivitiesGroupJoinUser(); groupJoinUser.setGjId(groupJoin.getId()); groupJoinUser.setIsHasCancel(ShopActivitiesGroupJoinUser.IS_HAS_CANCEL_N); List groupJoinUsers = shopActivitiesGroupJoinUserDao.selectByModel(groupJoinUser); if (groupPrice.getGpCount() <= groupJoinUsers.size()) { return AjaxResult.buildFailInstance("该拼团已满员"); } boolean isOld = isOldUser(bizUser.getPhoneNumber()); // 老用户 -- 加入拼团的都必须是老用户 if (ShopActivitiesGroupInfo.GROUP_TYPE_ALL_OLD == groupInfo.getGiType()) { if (!isOld) { return AjaxResult.buildFailInstance("该活动仅老用户参与"); } } // 新用户 -- 加入拼团的都必须是新用户 if (ShopActivitiesGroupInfo.GROUP_TYPE_ALL_NEW == groupInfo.getGiType()) { if (isOld) { return AjaxResult.buildFailInstance("该活动仅新用户参与"); } } // 老带新 -- 成团的时候必须有一名新用户 if (ShopActivitiesGroupInfo.GROUP_TYPE_OLD_AND_NEW == groupInfo.getGiType()) { if (isOld) { List hasNewUsers = shopActivitiesGroupJoinUserDao.selectNewUserRecordByGjId(groupJoin.getId()); if (CollectionUtils.isEmpty(hasNewUsers)) { if (groupPrice.getGpCount() == (groupJoinUsers.size() + 1)) { return AjaxResult.buildFailInstance("该活动必须有一位新用户"); } } } } createGroupBuyDTO.setPrice(groupPrice.getGpPrice()); createGroupBuyDTO.setGoodsId(groupInfo.getGoodsId().intValue()); createGroupBuyDTO.setOpenId(bizUser.getOpenId()); ShopOrder shopOrder = createOrderByGroupBuy(createGroupBuyDTO); ShopActivitiesGroupJoinUser joinUser = new ShopActivitiesGroupJoinUser(); joinUser.setOrderId(shopOrder.getId().longValue()); joinUser.setIsHasPay(ShopActivitiesGroupJoinUser.IS_HAS_PAY_N); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MINUTE, Integer.parseInt(payTimeLimit)); joinUser.setPayEndTime(calendar.getTime()); joinUser.setUserId(bizUser.getOpenId()); joinUser.setGiId(groupInfo.getId()); joinUser.setGjId(groupJoin.getId()); joinUser.setIsHead(ShopActivitiesGroupJoinUser.USER_IS_HEAD_N); joinUser.setCreateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); joinUser.setUpdateBy(bizUser.getNickName() == null ? "游客" : bizUser.getNickName()); joinUser.setIsNewUser(isOld ? 2 : 1); joinUser.setIsHasCancel(ShopActivitiesGroupJoinUser.IS_HAS_CANCEL_N); joinUser.setCompanyId(groupJoin.getCompanyId()); // 同步锁,处理拼团中最后一个位置同时多个人加入的情况 synchronized (this) { List users = shopActivitiesGroupJoinUserDao.selectByModel(groupJoinUser); if (groupPrice.getGpCount() <= users.size()) { return AjaxResult.buildFailInstance("该拼团已满员或正等待其他用户支付"); } shopActivitiesGroupJoinUserDao.insert(joinUser); } BrandWCPayRequestData payData = wxShopOrderService.startPayment(shopOrder); AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, Arrays.asList(payData)); result.putInMap("orderId", shopOrder.getId()); return result; // return new AjaxResult(AjaxResult.STATUS_SUCCESS, "参团成功"); } /** * 创建拼团订单 * * @param createGroupBuyDTO * @return */ private ShopOrder createOrderByGroupBuy(CreateGroupBuyDTO createGroupBuyDTO) { ShopReceiveAddress shopReceiveAddress = shopReceiveAddressDao.selectById(createGroupBuyDTO.getAddressId()); if (shopReceiveAddress == null) { throw new GlobleException("请选择正确的收获地址"); } BizUser user=redisUserLoginUtils.getLoginUser(BizUser.class); ShopOrder shopOrder = new ShopOrder(); shopOrder.setCompanyId(user.getCompanyId()); shopOrder.setStoreId(Integer.parseInt(createGroupBuyDTO.getShopId().toString())); shopOrder.setOrderType(ShopOrder.ORDER_TYPE_SERVICE); List shopSkus = shopSkuDao.selectByPid(createGroupBuyDTO.getGoodsId()); List details = new ArrayList<>(); ShopOrderDetails shopOrderDetails = new ShopOrderDetails(); shopOrderDetails.setCreateBy(AppConstance.SYSTEM_USER); shopOrderDetails.setUpdateBy(AppConstance.SYSTEM_USER); shopOrderDetails.setpId(createGroupBuyDTO.getGoodsId()); shopOrderDetails.setsId(shopSkus.get(0).getId()); shopOrderDetails.setPrice(createGroupBuyDTO.getPrice()); shopOrderDetails.setCount(createGroupBuyDTO.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(createGroupBuyDTO.getOpenId()); shopOrder.setCreateBy("微信小程序生成"); shopOrder.setUpdateBy("微信小程序生成"); shopOrder.setCommodityPrice(createGroupBuyDTO.getPrice()); shopOrder.setPurchaseQuantity(1); //购买方式 shopOrder.setShippingMethod(createGroupBuyDTO.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_GROUP); //微信订单号 shopOrder.setWxOrderNo(""); //微信支付结果 shopOrder.setPayResult(ShopOrder.ORDER_WX_STATUS_WAIT_PAY); //如果没有提交购买方式或配送方式不是物流 //获取邮费 BigDecimal postPrice = wxShopOrderService.calculationPostage(createGroupBuyDTO.getPrice(),user.getCompanyId()); shopOrder.setPostage(postPrice); BigDecimal payPrice = createGroupBuyDTO.getPrice().multiply(BigDecimal.valueOf(createGroupBuyDTO.getCount())).add(shopOrder.getPostage()); shopOrder.setOrderMoney(payPrice); DiscountExplain discountExplain = new DiscountExplain(); discountExplain.setPayPrice(payPrice); discountExplain.setPostage(postPrice); discountExplain.setActivity(BigDecimal.ZERO); discountExplain.setCoupon(BigDecimal.ZERO); discountExplain.setBillPrice(payPrice); Gson g = new GsonBuilder().create(); shopOrder.setDiscountExplain(g.toJson(discountExplain)); shopOrderDao.insert(shopOrder); wxShopOrderUtil.insertSendPackageInfo(shopOrder, createGroupBuyDTO.getShippingMethod(), shopReceiveAddress); //给订单详情表添加订单ID for (ShopOrderDetails detail : details) { detail.setOrderId(shopOrder.getId()); } if (CollectionUtils.isNotEmpty(details)) { shopOrderDetailsDao.batchInsert(details); } return shopOrder; } /** * 根据手机号判断用户是否为老用户 true--老用户 false--新用户 * * @param telphone * @return */ private boolean isOldUser(String telphone) { SysVipInfo sysVipInfo = sysVipInfoDao.selectOldUserByTelphone(telphone); if (sysVipInfo != null) { return true; } return false; } }