From a981c07d34edd0975b9d556d97c1f851ce79974c Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期三, 04 十二月 2024 13:40:00 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java | 840 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 793 insertions(+), 47 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java index 1f254ea..cac0a44 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java @@ -1,28 +1,45 @@ package com.ruoyi.order.service.impl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.account.api.feignClient.AppUserClient; +import com.ruoyi.account.api.feignClient.*; import com.ruoyi.account.api.model.AppUser; +import com.ruoyi.account.api.model.BalanceChangeRecord; +import com.ruoyi.account.api.model.UserAddress; +import com.ruoyi.account.api.model.UserPoint; +import com.ruoyi.account.api.vo.CouponInfoVo; +import com.ruoyi.account.api.vo.PaymentUserCoupon; +import com.ruoyi.account.api.vo.PaymentUserCouponVo; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.mapper.ShoppingCartMapper; +import com.ruoyi.order.service.OrderGoodService; +import com.ruoyi.order.service.OrderService; import com.ruoyi.order.service.ShoppingCartService; -import com.ruoyi.order.vo.MyShoppingCartVo; -import com.ruoyi.order.vo.SetGoodsNumber; +import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.other.api.vo.GetGoodsBargainPrice; +import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; import com.ruoyi.other.api.vo.GetSeckillActivityInfo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import model.Order; +import model.OrderGood; import model.ShoppingCart; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; import java.util.stream.Collectors; @Service @@ -52,6 +69,36 @@ @Resource private GoodsBargainPriceClient goodsBargainPriceClient; + @Resource + private OrderService orderService; + + @Resource + private OrderGoodService orderGoodService; + + @Resource + private ShopClient shopClient; + + @Resource + private OrderActivityInfoClient orderActivityInfoClient; + + @Resource + private BaseSettingClient baseSettingClient; + + @Resource + private UserAddressClient userAddressClient; + + @Resource + private UserCouponClient userCouponClient; + + @Resource + private SystemConfigClient systemConfigClient; + + @Resource + private UserPointClient userPointClient; + + @Resource + private BalanceChangeRecordClient balanceChangeRecordClient; + @@ -72,47 +119,11 @@ if(null == data){ throw new RuntimeException("根据类型(1=服务商品,2=单品商品)获取商品数据失败"); } - List<Long> goodsIds = data.stream().map(Goods::getId).collect(Collectors.toList()); + List<Integer> goodsIds = data.stream().map(Goods::getId).collect(Collectors.toList()); //查询符合商品类型的商品数据 List<ShoppingCart> list = this.list(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds)); - List<MyShoppingCartVo> page = new ArrayList<>(); //构建返回数据 - for (ShoppingCart shoppingCart : list) { - Goods goods = data.stream().filter(s -> s.getId().equals(shoppingCart.getGoodsId())).findFirst().get(); - MyShoppingCartVo vo = new MyShoppingCartVo(); - vo.setId(shoppingCart.getId()); - vo.setHomePicture(goods.getHomePagePicture()); - vo.setName(goods.getName()); - - //获取支付价格 - Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); - if(null == price){ - //使用商品的基础价格 - price.setCash(1 == goods.getCashPayment() ? goods.getSellingPrice() : null); - price.setPoint(1 == goods.getPointPayment() ? goods.getIntegral() : null); - } - //构建价格展示内容 - String sellingPrice = ""; - if(null != price.getCash() && null != price.getPoint()){ - sellingPrice = price.getCash() + "或" + price.getPoint() + "积分"; - } - if(null != price.getCash() && null == price.getPoint()){ - sellingPrice = price.getCash() + ""; - } - if(null == price.getCash() && null != price.getPoint()){ - sellingPrice = price.getPoint() + "积分"; - } - vo.setSellingPrice(sellingPrice); - vo.setEndTime(price.getEndTime()); - vo.setOriginalPrice(goods.getOriginalPrice().toString()); - vo.setNumber(shoppingCart.getNumber()); - GoodsShop goodsShop = new GoodsShop(); - goodsShop.setGoodsId(shoppingCart.getGoodsId()); - goodsShop.setShopId(shopId); - GoodsShop goodsShop1 = goodsShopClient.getGoodsShop(goodsShop).getData(); - vo.setVerifiable(null == goodsShop1 ? false : true); - page.add(vo); - } + List<MyShoppingCartVo> page = buildDetail(appUser, shopId, list, null); return page; } @@ -157,14 +168,60 @@ }else{ price.setCash(goodsVip.getSellingPrice()); price.setPoint(goodsVip.getIntegral()); + price.setCashPayment(goodsVip.getCashPayment() == 1 ? true : false); + price.setPointPayment(goodsVip.getPointPayment() == 1 ? true : false); + price.setEarnSpendingPoints(goodsVip.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsVip.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsVip.getSuperiorRebatePoints()); + price.setSuperiorType(goodsVip.getSuperiorType()); + price.setServuceShopCharges(goodsVip.getServuceShopCharges()); + price.setServuceShopPoints(goodsVip.getServuceShopPoints()); + price.setTechnicianPoints(goodsVip.getTechnicianPoints()); + price.setBoundShopCharges(goodsVip.getBoundShopCharges()); + price.setBoundShopPoints(goodsVip.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsVip.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsVip.getBoundShopSuperiorsPoints()); } }else{ price.setCash(goodsArea.getSellingPrice()); price.setPoint(goodsArea.getIntegral()); + price.setCashPayment(goodsArea.getCashPayment() == 1 ? true : false); + price.setPointPayment(goodsArea.getPointPayment() == 1 ? true : false); + price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); + price.setSuperiorType(goodsArea.getSuperiorType()); + price.setServuceShopCharges(goodsArea.getServuceShopCharges()); + price.setServuceShopPoints(goodsArea.getServuceShopPoints()); + price.setTechnicianPoints(goodsArea.getTechnicianPoints()); + price.setBoundShopCharges(goodsArea.getBoundShopCharges()); + price.setBoundShopPoints(goodsArea.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); } }else{ price.setCash(bargainPriceDetail.getSellingPrice()); price.setPoint(bargainPriceDetail.getIntegral()); + price.setCashPayment(bargainPriceDetail.getSellingPrice() != null ? true : false); + price.setPointPayment(bargainPriceDetail.getIntegral() != null ? true : false); + //门店特价,消费积分使用会员等级的消费积分 + GoodsArea area = new GoodsArea(); + area.setDistrictsCode(appUser.getDistrictCode()); + area.setCityCode(appUser.getCityCode()); + area.setProvinceCode(appUser.getProvinceCode()); + area.setVip(appUser.getVipId()); + GoodsArea goodsArea = goodsAreaClient.getGoodsArea(area).getData(); + price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); + price.setSuperiorType(goodsArea.getSuperiorType()); + price.setServuceShopCharges(goodsArea.getServuceShopCharges()); + price.setServuceShopPoints(goodsArea.getServuceShopPoints()); + price.setTechnicianPoints(goodsArea.getTechnicianPoints()); + price.setBoundShopCharges(goodsArea.getBoundShopCharges()); + price.setBoundShopPoints(goodsArea.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); } }else{ //构建价格数据 @@ -178,7 +235,20 @@ if(goodsSeckill.getCashPayment() == 0 && goodsSeckill.getPointPayment() == 1){ price.setPoint(goodsSeckill.getIntegral()); } + price.setCashPayment(goodsSeckill.getCashPayment() == 1 ? true : false); + price.setPointPayment(goodsSeckill.getPointPayment() == 1 ? true : false); price.setEndTime(goodsSeckill.getEndTime()); + price.setEarnSpendingPoints(goodsSeckill.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsSeckill.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsSeckill.getSuperiorRebatePoints()); + price.setSuperiorType(goodsSeckill.getSuperiorType()); + price.setServuceShopCharges(goodsSeckill.getServuceShopCharges()); + price.setServuceShopPoints(goodsSeckill.getServuceShopPoints()); + price.setTechnicianPoints(goodsSeckill.getTechnicianPoints()); + price.setBoundShopCharges(goodsSeckill.getBoundShopCharges()); + price.setBoundShopPoints(goodsSeckill.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsSeckill.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsSeckill.getBoundShopSuperiorsPoints()); } return price; } @@ -198,6 +268,58 @@ * 获取结束时间 */ private Long endTime; + /** + * 现金支付 + */ + private Boolean cashPayment; + /** + * 积分支付 + */ + private Boolean pointPayment; + /** + * 可获得消费积分 + */ + private Integer earnSpendingPoints; + /** + * 上级获得分佣金额 + */ + private BigDecimal superiorSubcommission; + /** + * 上级获得返佣积分 + */ + private Integer superiorRebatePoints; + /** + * 获取返佣积分上级类型(1=直推上级,2=直帮上级) + */ + private Integer superiorType; + /** + * 核销门店可获得服务费 + */ + private BigDecimal servuceShopCharges; + /** + * 核销门店可获得服务积分 + */ + private Integer servuceShopPoints; + /** + * 技师可获得服务积分 + */ + private Integer technicianPoints; + /** + * 绑定门店可获得分佣金额 + */ + private BigDecimal boundShopCharges; + /** + * 绑定门店可获得返佣积分 + */ + private Integer boundShopPoints; + /** + * 绑定门店上级门店可获得分佣金额 + */ + private BigDecimal boundShopSuperiorsCharges; + /** + * 绑定门店上级门店可获得返佣积分 + */ + private Integer boundShopSuperiorsPoints; } @@ -215,15 +337,639 @@ * @return */ @Override - public AjaxResult setGoodsNumber(SetGoodsNumber setGoodsNumber) { + public R setGoodsNumber(SetGoodsNumber setGoodsNumber) { if(0 >= setGoodsNumber.getNumber()){ - return AjaxResult.error("修改数量不能小于等于0"); + return R.fail("修改数量不能小于等于0"); } ShoppingCart shoppingCart = this.getById(setGoodsNumber.getId()); + Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); + if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && goods.getPurchaseLimit() < setGoodsNumber.getNumber()){ + return R.fail("修改数量不能大于限购数量"); + } if(null != shoppingCart){ shoppingCart.setNumber(setGoodsNumber.getNumber()); this.updateById(shoppingCart); } - return AjaxResult.success(); + return R.ok(); + } + + + /** + * 确认购物车订单 + * @param confirmOrder + * @return + */ + @Override + public ConfirmOrderVo confirmOrder(ConfirmOrder confirmOrder) { + Long userid = tokenService.getLoginUserApplet().getUserid(); + AppUser appUser = appUserClient.getAppUserById(userid); + Integer shopId = confirmOrder.getShopId(); + Shop shop = shopClient.getShopById(shopId).getData(); + String goodsJson = confirmOrder.getGoodsJson(); + List<Long> ids = new ArrayList<>(); + JSONArray objects = JSON.parseArray(goodsJson); + for (int i = 0; i < objects.size(); i++) { + Long id = objects.getJSONObject(i).getLong("id"); + ids.add(id); + } + List<ShoppingCart> list = this.listByIds(ids); + ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo(); + //构建商品明细列表 + List<MyShoppingCartVo> goodsList = buildDetail(appUser, shopId, list, objects); + confirmOrderVo.setGoodsList(goodsList); + confirmOrderVo.setShopId(confirmOrder.getShopId()); + confirmOrderVo.setShopName(shop.getName()); + //现金支付 + if(confirmOrder.getPaymentType() == 1){ + BigDecimal bigDecimal = goodsList.stream().map(MyShoppingCartVo::getCash).reduce(BigDecimal::add).get(); + confirmOrderVo.setOrderMoney(bigDecimal); + }else{ + int sum = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); + confirmOrderVo.setOrderPoint(sum); + } + //查询当前是否有订单活动 + OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + BigDecimal orderMoney = confirmOrderVo.getOrderMoney(); + BigDecimal paymentMoney = orderMoney; + //满XX才打折,只有现金才能优惠 + if(null != orderActivityInfo && confirmOrder.getPaymentType() == 1 && orderActivityInfo.getConditionAmount().compareTo(orderMoney) <= 0){ + confirmOrderVo.setActivityName(orderActivityInfo.getActivityName()); + paymentMoney = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(orderMoney); + confirmOrderVo.setDiscountAmount(orderMoney.subtract(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); + } + BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); + confirmOrderVo.setUseSimultaneously(baseSetting.getContent().equals("1") ? true : false); + int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); + confirmOrderVo.setEarnPoint(earnPoint); + //支付金额,订单金额-订单优惠 + confirmOrderVo.setPayMoney(paymentMoney); + confirmOrderVo.setResidualPoint(appUser.getLavePoint().intValue()); + //获取默认收货地址 + UserAddress userAddress = userAddressClient.getDefaultUserAddress(userid).getData(); + confirmOrderVo.setUserAddress(userAddress); + confirmOrderVo.setPaymentType(confirmOrder.getPaymentType()); + //获取用户优惠券,用户全部优惠券,不能使用的需要标识出来置灰展示 + PaymentUserCoupon paymentUserCoupon = new PaymentUserCoupon(); + paymentUserCoupon.setUserId(userid); + paymentUserCoupon.setOrderMoney(orderMoney); + paymentUserCoupon.setType(confirmOrder.getType()); + if(confirmOrder.getPaymentType() == 1){ + List<PaymentUserCouponVo> data = userCouponClient.getPaymentUserCoupon(paymentUserCoupon).getData(); + for (PaymentUserCouponVo couponInfo : data) { + List<Integer> forGoodIds = couponInfo.getForGoodIds(); + //全部商品适用 + if(null == forGoodIds){ + //满减券 + if(1 == couponInfo.getCouponType() && orderMoney.compareTo(couponInfo.getConditionAmount()) >= 0){ + couponInfo.setAvailable(true); + } + //代金券和折扣券 + if(2 == couponInfo.getCouponType() || 3 == couponInfo.getCouponType()){ + couponInfo.setAvailable(true); + } + }else{ + //部分商品适用 + BigDecimal goodsMoney = BigDecimal.ZERO; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + Integer goodsId = myShoppingCartVo.getGoodsId(); + BigDecimal cash = myShoppingCartVo.getCash(); + if(forGoodIds.contains(goodsId)){ + goodsMoney = goodsMoney.add(cash); + } + } + //满减 + if(1 == couponInfo.getCouponType() && couponInfo.getConditionAmount().compareTo(goodsMoney) <= 0){ + couponInfo.setAvailable(true); + } + //代金券 + if(2 == couponInfo.getCouponType() || 3 == couponInfo.getCouponType()){ + couponInfo.setAvailable(true); + } + } + } + confirmOrderVo.setCoupon(data); + } + //获取快递策略 + SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData(); + JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); + confirmOrderVo.setExpressFee(jsonObject.getBigDecimal("expressFee")); + List<Integer> vip = jsonObject.getJSONArray("vip").toList(Integer.class); + //包邮条件(所有会员或者满足条件的会员) + if(vip.get(0) == -1 || vip.contains(appUser.getVipId())){ + if(confirmOrder.getPaymentType() == 1){ + //现金支付,支付金额满足包邮条件 + BigDecimal cash = jsonObject.getBigDecimal("cash"); + if(confirmOrderVo.getPayMoney().compareTo(cash) >= 0){ + confirmOrderVo.setExpressFee(BigDecimal.ZERO); + } + }else{ + //积分支付,支付积分是否满足包邮条件 + Integer point = jsonObject.getInteger("point"); + if(confirmOrderVo.getOrderPoint().compareTo(point) >= 0){ + confirmOrderVo.setExpressFee(BigDecimal.ZERO); + } + } + } + return confirmOrderVo; + } + + + /** + * 构建购物车商品列表 + * @param appUser + * @param shopId + * @param list + * @param objects + * @return + */ + private List<MyShoppingCartVo> buildDetail(AppUser appUser, Integer shopId, List<ShoppingCart> list, JSONArray objects){ + List<MyShoppingCartVo> page = new ArrayList<>(); + for (ShoppingCart shoppingCart : list) { + Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); + MyShoppingCartVo vo = new MyShoppingCartVo(); + vo.setId(shoppingCart.getId()); + vo.setGoodsId(goods.getId()); + vo.setHomePicture(goods.getHomePagePicture()); + vo.setName(goods.getName()); + int num = shoppingCart.getNumber(); + if(null != objects){ + for (int i = 0; i < objects.size(); i++) { + Long id = objects.getJSONObject(i).getLong("id"); + if(id.equals(shoppingCart.getId())){ + num = objects.getJSONObject(i).getInteger("num"); + break; + } + } + } + //获取支付价格 + Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); + if(null == price){ + //使用商品的基础价格 + price.setCash(1 == goods.getCashPayment() ? goods.getSellingPrice() : null); + price.setPoint(1 == goods.getPointPayment() ? goods.getIntegral() : null); + price.setCashPayment(goods.getCashPayment() == 1 ? true : false); + price.setPointPayment(goods.getPointPayment() == 1 ? true : false); + } + vo.setCash(price.getCash()); + vo.setPoint(price.getPoint()); + vo.setCashPayment(price.getCashPayment()); + vo.setPointPayment(price.getPointPayment()); + vo.setEndTime(price.getEndTime()); + vo.setOriginalPrice(goods.getOriginalPrice().toString()); + vo.setNumber(num); + GoodsShop goodsShop = new GoodsShop(); + goodsShop.setGoodsId(shoppingCart.getGoodsId()); + goodsShop.setShopId(shopId); + GoodsShop goodsShop1 = goodsShopClient.getGoodsShop(goodsShop).getData(); + vo.setVerifiable(null == goodsShop1 ? false : true); + //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + if(null == goods.getPurchaseLimit() || -1 == goods.getPurchaseLimit()){ + vo.setPurchaseLimit(false); + }else{ + List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); + List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); + int sum = 0; + if(orderIds.size() > 0){ + List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) + .eq(OrderGood::getGoodsId, shoppingCart.getGoodsId()).eq(OrderGood::getDelFlag, 0)); + sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); + } + vo.setPurchaseLimit((num + sum) > goods.getPurchaseLimit() ? true : false); + } + vo.setDistributionMode(goods.getDistributionMode()); + vo.setEarnSpendingPoints(price.getEarnSpendingPoints()); + vo.setSuperiorSubcommission(price.getSuperiorSubcommission()); + vo.setSuperiorRebatePoints(price.getSuperiorRebatePoints()); + vo.setSuperiorType(price.getSuperiorType()); + vo.setServuceShopCharges(price.getServuceShopCharges()); + vo.setServuceShopPoints(price.getServuceShopPoints()); + vo.setTechnicianPoints(price.getTechnicianPoints()); + vo.setBoundShopCharges(price.getBoundShopCharges()); + vo.setBoundShopPoints(price.getBoundShopPoints()); + vo.setBoundShopSuperiorsCharges(price.getBoundShopSuperiorsCharges()); + vo.setBoundShopSuperiorsPoints(price.getBoundShopSuperiorsPoints()); + page.add(vo); + } + return page; + } + + + /** + * 购物车支付操作 + * @param shoppingCartPayment + * @return + */ + @Override + public R shoppingCartPayment(ShoppingCartPayment shoppingCartPayment) { + Long userid = tokenService.getLoginUserApplet().getUserid(); + AppUser appUser = appUserClient.getAppUserById(userid); + Integer shopId = shoppingCartPayment.getShopId(); + String goodsJson = shoppingCartPayment.getGoodsJson(); + List<Long> ids = new ArrayList<>(); + Integer num = 0; + JSONArray objects = JSON.parseArray(goodsJson); + for (int i = 0; i < objects.size(); i++) { + Long id = objects.getJSONObject(i).getLong("id"); + Integer num1 = objects.getJSONObject(i).getInteger("num"); + num += num1; + ShoppingCart shoppingCart = this.getById(id); + //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); + if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit()){ + List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); + List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); + int sum = 0; + if(orderIds.size() > 0){ + List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) + .eq(OrderGood::getGoodsId, shoppingCart.getGoodsId()).eq(OrderGood::getDelFlag, 0)); + sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); + } + if((num1 + sum) > goods.getPurchaseLimit()){ + return R.fail(goods.getName() + "已超出购买上限"); + } + } + ids.add(id); + } + + List<ShoppingCart> list = this.listByIds(ids); + //构建商品明细列表 + List<MyShoppingCartVo> goodsList = buildDetail(appUser, shopId, list, objects); + //判断支付当时是否正确 + if(1 == shoppingCartPayment.getPaymentType() || 2 == shoppingCartPayment.getPaymentType()){ + //现金支付 + long count = goodsList.stream().filter(s -> s.getCashPayment()).count(); + if(count != goodsList.size()){ + return R.fail("支付方式不正确"); + } + } else if(3 == shoppingCartPayment.getPaymentType()){ + //积分支付 + long count = goodsList.stream().filter(s -> s.getPointPayment()).count(); + if(count != goodsList.size()){ + return R.fail("支付方式不正确"); + } + }else{ + return R.fail("支付方式不正确"); + } + //判断门店是都可以核销所有的商品 + List<Integer> goodsIds = goodsList.stream().map(MyShoppingCartVo::getGoodsId).collect(Collectors.toList()); + GetGoodsShopByGoodsIds goodsShopByGoodsIds = new GetGoodsShopByGoodsIds(); + goodsShopByGoodsIds.setGoodsIds(goodsIds); + goodsShopByGoodsIds.setShopId(shopId); + List<GoodsShop> data = goodsShopClient.getGoodsShopByGoodsIds(goodsShopByGoodsIds).getData(); + List<Integer> collect = data.stream().map(GoodsShop::getGoodsId).collect(Collectors.toList()); + if(data.size() != goodsList.size()){ + String goodsName = ""; + for (Integer goodsId : goodsIds) { + if(!collect.contains(goodsId)){ + goodsName = goodsClient.getGoodsById(goodsId).getData().getName(); + break; + } + } + return R.fail(goodsName + "不能在该门店核销"); + } + //开始构建支付信息 + //现金支付的订单金额 + BigDecimal orderMoney = BigDecimal.ZERO; + //折扣(9折) + BigDecimal discount = null; + //积分支付的订单积分 + Integer orderPoint = 0; + if(3 != shoppingCartPayment.getPaymentType()){ + orderMoney = goodsList.stream().map(MyShoppingCartVo::getCash).reduce(BigDecimal::add).get(); + }else{ + orderPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); + if(appUser.getLavePoint().intValue() < orderPoint){ + return R.fail("账户剩余积分不足"); + } + } + //现金的支付金额 + BigDecimal paymentMoney = orderMoney; + //满减金额 + BigDecimal fullReductionAmount = BigDecimal.ZERO; + //代金券抵扣金额 + BigDecimal moneyAmount = BigDecimal.ZERO; + //折扣券抵扣金额 + BigDecimal discountAmount = BigDecimal.ZERO; + //活动优惠金额 + BigDecimal activityAmount = BigDecimal.ZERO; + + //减去优惠券优惠金额 + CouponInfoVo couponInfoVo = null; + if(null != shoppingCartPayment.getUserCouponId() && 3 != shoppingCartPayment.getPaymentType()){ + couponInfoVo = userCouponClient.getCouponInfo(shoppingCartPayment.getUserCouponId()).getData(); + String forGoodIds = couponInfoVo.getForGoodIds(); + List<Integer> parseArray = JSON.parseArray(forGoodIds, Integer.class); + //全部商品 + if(parseArray.contains(-1)){ + //满减 + if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(paymentMoney) <= 0){ + paymentMoney = paymentMoney.subtract(couponInfoVo.getDiscountAmount()); + fullReductionAmount = fullReductionAmount.add(couponInfoVo.getDiscountAmount()); + } + //代金券 + if(2 == couponInfoVo.getCouponType()){ + paymentMoney = paymentMoney.subtract(couponInfoVo.getMoneyAmount()); + moneyAmount = moneyAmount.add(couponInfoVo.getMoneyAmount()); + if(paymentMoney.compareTo(BigDecimal.ZERO) < 0){ + paymentMoney = BigDecimal.ZERO; + } + } + //折扣券 + if(3 == couponInfoVo.getCouponType()){ + BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + discount = couponInfoVo.getDiscount(); + paymentMoney = paymentMoney1; + discountAmount = discountAmount.add(bigDecimal); + } + }else{ + //部分商品,需要计算参与优惠商品的支付金额,然后再对商品进行优惠券处理 + paymentMoney = BigDecimal.ZERO; + BigDecimal goodsMoney = BigDecimal.ZERO; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + Integer goodsId = myShoppingCartVo.getGoodsId(); + BigDecimal cash = myShoppingCartVo.getCash(); + if(parseArray.contains(goodsId)){ + goodsMoney = goodsMoney.add(cash); + }else{ + paymentMoney = paymentMoney.add(cash); + } + } + + //满减 + if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(goodsMoney) <= 0){ + goodsMoney = goodsMoney.subtract(couponInfoVo.getDiscountAmount()); + fullReductionAmount = fullReductionAmount.add(couponInfoVo.getDiscountAmount()); + } + //代金券 + if(2 == couponInfoVo.getCouponType()){ + goodsMoney = goodsMoney.subtract(couponInfoVo.getMoneyAmount()); + moneyAmount = moneyAmount.add(couponInfoVo.getMoneyAmount()); + if(goodsMoney.compareTo(BigDecimal.ZERO) < 0){ + goodsMoney = BigDecimal.ZERO; + } + } + //折扣券 + if(3 == couponInfoVo.getCouponType()){ + BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(goodsMoney); + BigDecimal bigDecimal = goodsMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + discount = couponInfoVo.getDiscount(); + goodsMoney = paymentMoney1; + discountAmount = discountAmount.add(bigDecimal); + } + paymentMoney = paymentMoney.add(goodsMoney); + } + } + + //查询当前是否有订单活动 + OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); + //系统活动设置(优惠券和活动能否同时使用) + boolean useSimultaneously = baseSetting.getContent().equals("1") ? true : false; + //满XX才打折,只有现金才能优惠 + //如果使用优惠券,则需要判断是否可以和同时使用,且活动满足使用条件。 + //没有使用优惠券,只需要判断是都满足使用条件 + if(((useSimultaneously && null != shoppingCartPayment.getUserCouponId()) || null == shoppingCartPayment.getUserCouponId()) && + null != orderActivityInfo && shoppingCartPayment.getPaymentType() != 3 && orderActivityInfo.getConditionAmount().compareTo(paymentMoney) <= 0){ + BigDecimal paymentMoney1 = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + discount = orderActivityInfo.getDiscount(); + paymentMoney = paymentMoney1; + activityAmount = activityAmount.add(bigDecimal); + } + + //可获得的消费积分 + int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); + if(null != shoppingCartPayment.getUserAddressId()){ + userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); + } + + //获取快递策略,计算快递费 + BigDecimal expressFee = BigDecimal.ZERO; + if(null != shoppingCartPayment.getUserAddressId()){ + SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData(); + JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); + //快递费 + expressFee = jsonObject.getBigDecimal("expressFee"); + List<Integer> vip = jsonObject.getJSONArray("vip").toList(Integer.class); + //包邮条件(所有会员或者满足条件的会员) + if(vip.get(0) == -1 || vip.contains(appUser.getVipId())){ + if(shoppingCartPayment.getPaymentType() != 3){ + //现金支付,支付金额满足包邮条件 + BigDecimal cash = jsonObject.getBigDecimal("cash"); + if(paymentMoney.compareTo(cash) >= 0){ + expressFee = BigDecimal.ZERO; + } + }else{ + //积分支付,支付积分是否满足包邮条件 + Integer point = jsonObject.getInteger("point"); + if(orderPoint.compareTo(point) >= 0){ + expressFee = BigDecimal.ZERO; + } + } + } + } + //构建订单明细 + Order order = new Order(); + order.setAppUserId(userid); + order.setNum(num); + String goodPics = ""; + String goodName = ""; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + goodPics += myShoppingCartVo.getHomePicture() + ","; + goodName += myShoppingCartVo.getName() + ","; + } + order.setGoodPics(goodPics.substring(0, goodPics.length() - 1)); + order.setGoodName(goodName.substring(0, goodName.length() - 1)); + Goods goods = goodsClient.getGoodsById(goodsList.get(0).getGoodsId()).getData(); + order.setOrderType(goods.getType()); + order.setOrderStatus(1); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + order.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); + order.setTotalAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN)); + order.setFullReductionAmount(fullReductionAmount); + order.setMoneyAmount(moneyAmount); + order.setDiscountAmount(discountAmount); + order.setActivityAmount(activityAmount); + order.setDiscountTotalAmount(fullReductionAmount.add(moneyAmount).add(discountAmount).add(activityAmount)); + order.setPaymentAmount(paymentMoney); + order.setPoint(orderPoint); + order.setPayMethod(shoppingCartPayment.getPaymentType()); + if(3 != shoppingCartPayment.getPaymentType() && (fullReductionAmount.compareTo(BigDecimal.ZERO) > 0 ||moneyAmount.compareTo(BigDecimal.ZERO) > 0 || discountAmount.compareTo(BigDecimal.ZERO) > 0)){ + order.setCouponJson(JSON.toJSONString(couponInfoVo)); + } + if(activityAmount.compareTo(BigDecimal.ZERO) > 0){ + order.setActivityJson(JSON.toJSONString(orderActivityInfo)); + } + if(null != shoppingCartPayment.getUserAddressId()){ + UserAddress address = userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); + order.setExpressAmount(expressFee); + order.setAddressJson(JSON.toJSONString(address)); + } + order.setGetPoint(earnPoint); + order.setPayStatus(1); + order.setShopId(shoppingCartPayment.getShopId()); + order.setDelFlag(0); + order.setCreateTime(LocalDateTime.now()); + + if(2 == shoppingCartPayment.getPaymentType()){ + BigDecimal balance = appUser.getBalance(); + if(balance.compareTo(paymentMoney.add(expressFee)) < 0){ + return R.fail("账户余额不足"); + } + } + orderService.save(order); + //构建订单明细数据 + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + OrderGood orderGood = new OrderGood(); + orderGood.setGoodsId(myShoppingCartVo.getGoodsId()); + orderGood.setOrderId(order.getId()); + GetSeckillActivityInfo info = new GetSeckillActivityInfo(); + info.setGoodsId(myShoppingCartVo.getGoodsId()); + info.setVip(appUser.getVipId()); + GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); + if(null != goodsSeckill){ + orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); + } + for (int i = 0; i < objects.size(); i++) { + Long id = objects.getJSONObject(i).getLong("id"); + if(myShoppingCartVo.getId().equals(id)){ + Integer num1 = objects.getJSONObject(i).getInteger("num"); + orderGood.setNum(num1); + Goods goods1 = goodsClient.getGoodsById(myShoppingCartVo.getGoodsId()).getData(); + orderGood.setGoodJson(JSON.toJSONString(goods1)); + break; + } + } + orderGood.setDelFlag(0); + orderGood.setCreateTime(LocalDateTime.now()); + orderGood.setEarnSpendingPoints(myShoppingCartVo.getEarnSpendingPoints()); + orderGood.setSuperiorSubcommission(myShoppingCartVo.getSuperiorSubcommission()); + orderGood.setSuperiorRebatePoints(myShoppingCartVo.getSuperiorRebatePoints()); + orderGood.setSuperiorType(myShoppingCartVo.getSuperiorType()); + orderGood.setServuceShopCharges(myShoppingCartVo.getServuceShopCharges()); + orderGood.setServuceShopPoints(myShoppingCartVo.getServuceShopPoints()); + orderGood.setTechnicianPoints(myShoppingCartVo.getTechnicianPoints()); + orderGood.setBoundShopCharges(myShoppingCartVo.getBoundShopCharges()); + orderGood.setBoundShopPoints(myShoppingCartVo.getBoundShopPoints()); + orderGood.setBoundShopSuperiorsCharges(myShoppingCartVo.getBoundShopSuperiorsCharges()); + orderGood.setBoundShopSuperiorsPoints(myShoppingCartVo.getBoundShopSuperiorsPoints()); + orderGoodService.save(orderGood); + } + + //开始构建支付数据 + //现金支付 + paymentMoney = paymentMoney.add(expressFee).setScale(2, RoundingMode.HALF_EVEN); + if(1 == shoppingCartPayment.getPaymentType()){ + //调起微信支付 TODO 待完善 + + + + } + //账户余额 + if(2 == shoppingCartPayment.getPaymentType()){ + BigDecimal totalRedPacketAmount = appUser.getTotalRedPacketAmount(); + BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); + BigDecimal balance = appUser.getBalance(); + if(paymentMoney.compareTo(totalRedPacketAmount) <= 0){ + totalRedPacketAmount = totalRedPacketAmount.subtract(paymentMoney); + balance = balance.subtract(paymentMoney); + appUser.setTotalRedPacketAmount(totalRedPacketAmount); + appUser.setBalance(balance); + }else{ + paymentMoney = paymentMoney.subtract(totalRedPacketAmount); + totalRedPacketAmount = BigDecimal.ZERO; + if(paymentMoney.compareTo(totalDistributionAmount) <= 0){ + totalDistributionAmount = totalDistributionAmount.subtract(paymentMoney); + balance = balance.subtract(paymentMoney); + appUser.setTotalRedPacketAmount(totalRedPacketAmount); + appUser.setTotalDistributionAmount(totalDistributionAmount); + appUser.setBalance(balance); + }else{ + paymentMoney = paymentMoney.subtract(totalDistributionAmount); + totalDistributionAmount = BigDecimal.ZERO; + balance = balance.subtract(paymentMoney); + appUser.setTotalRedPacketAmount(totalRedPacketAmount); + appUser.setTotalDistributionAmount(totalDistributionAmount); + appUser.setBalance(balance); + } + } + //构建积分流水记录 + if(earnPoint > 0){ + appUser.setShopPoint(appUser.getShopPoint() + earnPoint); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); + + UserPoint userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } + appUserClient.editAppUserById(appUser); + //构建余额明细变动记录 + BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); + balanceChangeRecord.setAppUserId(appUser.getId()); + balanceChangeRecord.setOrderId(order.getId()); + balanceChangeRecord.setChangeType(5); + balanceChangeRecord.setBeforeAmount(balance.add(paymentMoney)); + balanceChangeRecord.setChangeAmount(paymentMoney); + balanceChangeRecord.setAfterAmount(balance); + balanceChangeRecord.setDelFlag(0); + balanceChangeRecord.setCreateTime(LocalDateTime.now()); + balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord); + //修改订支付状态 + order.setPayStatus(2); + orderService.updateById(order); + //删除购物车数据 + this.removeBatchByIds(ids); + } + //积分支付 + if(3 == shoppingCartPayment.getPaymentType()){ + Integer lavePoint = appUser.getLavePoint(); + appUser.setLavePoint(lavePoint - orderPoint); + appUser.setShopPoint(appUser.getShopPoint() + earnPoint); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); + appUserClient.editAppUserById(appUser); + //构建积分流水记录 + UserPoint userPoint = new UserPoint(); + userPoint.setType(4); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(orderPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + if(earnPoint > 0){ + userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } + //修改订支付状态 + order.setPayStatus(2); + orderService.updateById(order); + //删除购物车数据 + this.removeBatchByIds(ids); + } + return R.ok(); + } + + + public String getNumber(Integer size){ + String str = ""; + for (Integer i = 0; i < size; i++) { + str += Double.valueOf(Math.random() * 10).intValue(); + } + return str; } } -- Gitblit v1.7.1