| | |
| | | import com.doumee.core.model.LoginUserInfo; |
| | | import com.doumee.core.model.PageData; |
| | | import com.doumee.core.model.PageWrap; |
| | | import com.doumee.core.utils.Constants; |
| | | import com.doumee.core.utils.DateUtil; |
| | | import com.doumee.core.utils.RedisUtil; |
| | | import com.doumee.core.utils.Utils; |
| | | import com.doumee.core.utils.*; |
| | | import com.doumee.core.utils.kuaidi100.DeliveryDTO; |
| | | import com.doumee.core.utils.kuaidi100.ExpressUtils; |
| | | import com.doumee.core.wx.SendWxMessage; |
| | |
| | | import com.doumee.dao.business.join.GoodsorderJoinMapper; |
| | | import com.doumee.dao.business.join.PlanorderDetailJoinMapper; |
| | | import com.doumee.dao.business.model.*; |
| | | import com.doumee.dao.web.dto.CouponDTO; |
| | | import com.doumee.dao.web.request.DealIntegralRequest; |
| | | import com.doumee.dao.web.request.OrderPayRequest; |
| | | import com.doumee.dao.web.request.PayDetailRequest; |
| | | import com.doumee.dao.web.request.ShopOrderPayRequest; |
| | | import com.doumee.dao.web.request.goods.MemberOrderRequest; |
| | | import com.doumee.dao.web.request.goods.DealOrderRequest; |
| | | import com.doumee.dao.web.request.goods.OrderCommentRequest; |
| | | import com.doumee.dao.web.request.goods.OrderGoodsCommentRequest; |
| | | import com.doumee.dao.web.response.MyPageResponse; |
| | | import com.doumee.dao.web.response.goods.MemberOrderDetailResponse; |
| | | import com.doumee.dao.web.response.goods.MemberOrderResponse; |
| | | import com.doumee.dao.web.response.goods.PayResponse; |
| | | import com.doumee.dao.web.response.goods.*; |
| | | import com.doumee.service.business.AreasService; |
| | | import com.doumee.service.business.GoodsorderService; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | |
| | | import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; |
| | | import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; |
| | | import com.github.binarywang.wxpay.exception.WxPayException; |
| | | import com.github.xiaoymin.knife4j.core.util.CollectionUtils; |
| | | import com.github.yulichang.wrapper.MPJLambdaWrapper; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.checkerframework.checker.units.qual.C; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | |
| | |
| | | import java.net.InetAddress; |
| | | import java.net.UnknownHostException; |
| | | import java.util.*; |
| | | import java.util.Date; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * 商品订单信息表Service实现 |
| | |
| | | |
| | | @Autowired |
| | | private AddrMapper addrMapper; |
| | | |
| | | @Autowired |
| | | private ShopMapper shopMapper; |
| | | |
| | | @Autowired |
| | | private MemberCouponMapper memberCouponMapper; |
| | |
| | | |
| | | @Autowired |
| | | private GoodsorderDetailJoinMapper goodsorderDetailJoinMapper; |
| | | |
| | | @Autowired |
| | | private IntegralMapper integralMapper; |
| | | |
| | | @Override |
| | | public Integer create(Goodsorder goodsorder) { |
| | |
| | | goodsorder.setEditor(user.getId()); |
| | | goodsorderMapper.updateById(goodsorder); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<Shop> getShopPage(PageWrap<Shop> pageWrap) { |
| | | IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | Shop model = pageWrap.getModel(); |
| | | if(Objects.isNull(model.getLatitude())||Objects.isNull(model.getLongitude())){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | return shopMapper.selectPage(page,new MPJLambdaWrapper<Shop>() |
| | | .selectAll(Shop.class) |
| | | .select(" case when LONGITUDE IS NULL OR LATITUDE IS NULL THEN 0 " + |
| | | " when t.TYPE = 0 then CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2)) " + |
| | | " when t.TYPE = 1 then CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2)) " + |
| | | " else CONVERT( ST_Distance_Sphere ( POINT ( LONGITUDE, LATITUDE ), POINT ( "+model.getLongitude()+", "+model.getLatitude()+" )) /1000,DECIMAL(15,2)) end " , Shop::getDistance) |
| | | .eq(Shop::getIsdeleted,Constants.ZERO) |
| | | .eq(Shop::getStatus,Constants.ZERO) |
| | | .like(StringUtils.isNotBlank(model.getAddr()),Shop::getAddr,model.getAddr()) |
| | | .like(StringUtils.isNotBlank(model.getName()),Shop::getName,model.getName()) |
| | | .orderByAsc(" distance ") |
| | | ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 咖豆 商城订单发货 |
| | | * @param goodsorder |
| | |
| | | if(goods.getStatus().equals(Constants.ONE)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单"); |
| | | } |
| | | if(goodsSku.getStock().compareTo(payDetailRequest.getGoodsNum())<Constants.ZERO){ |
| | | if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!"); |
| | | } |
| | | //商品库存扣除 |
| | | goodsSku.setStock(goodsSku.getStock()-payDetailRequest.getGoodsNum()); |
| | | goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))); |
| | | goodsSkuMapper.updateById(goodsSku); |
| | | GoodsorderDetail goodsOrderDetail = new GoodsorderDetail(); |
| | | goodsOrderDetail.setCreator(member.getId()); |
| | |
| | | goodsorderMapper.insert(goodsorder); |
| | | //数据存储 |
| | | BigDecimal total = Constants.formatBigdecimal(goodsorder.getPrice()).add(Constants.formatBigdecimal(goodsorder.getIntegral())).add(Constants.formatBigdecimal(goodsorder.getCouponPrice())); |
| | | BigDecimal rate =Constants.formatBigdecimal(goodsorder.getCouponPrice()) .divide(total,4,BigDecimal.ROUND_HALF_UP); |
| | | BigDecimal rate =Constants.formatBigdecimal(goodsorder.getCouponPrice()).divide(total,4,BigDecimal.ROUND_HALF_UP); |
| | | BigDecimal totalWxMoney = new BigDecimal(0); |
| | | BigDecimal totalIntegral = new BigDecimal(0); |
| | | for (int i =0;i< goodsOrderDetailList.size();i++) { |
| | |
| | | //当前明细实际价格 |
| | | BigDecimal detialTotal = Constants.formatBigdecimal(goodsOrderDetail.getPrice()).multiply(new BigDecimal(Constants.formatIntegerNum(goodsOrderDetail.getGoodsNum()))); |
| | | //折算优惠券后支付价格(包含现金和余额部分) |
| | | BigDecimal actDetialTotal = detialTotal .subtract(detialTotal.multiply(rate)); |
| | | BigDecimal actDetialTotal = detialTotal.subtract(detialTotal.multiply(rate)); |
| | | //按现金和积分支付比例,折算每个明细现金和积分支付的数量 |
| | | BigDecimal rate1 = detialTotal .divide(total,4,BigDecimal.ROUND_HALF_UP); |
| | | //可退现金金额 |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | @Transactional(rollbackFor = {Exception.class,BusinessException.class}) |
| | | public PayResponse orderPay(ShopOrderPayRequest orderPayRequest,MemberCouponServiceImpl memberCouponService){ |
| | | Member member = memberMapper.selectById(orderPayRequest.getMemberId()); |
| | | |
| | | Goodsorder goodsorder = new Goodsorder(); |
| | | goodsorder.setCreator(orderPayRequest.getMemberId()); |
| | | goodsorder.setIntegral(BigDecimal.ZERO); |
| | | goodsorder.setCreateDate(new Date()); |
| | | goodsorder.setIsdeleted(Constants.ZERO); |
| | | goodsorder.setMemberInfo(orderPayRequest.getRemark()); |
| | | goodsorder.setMemberId(member.getId()); |
| | | goodsorder.setType(Constants.ZERO); |
| | | goodsorder.setStatus(Constants.ZERO); |
| | | |
| | | if(Constants.equalsInteger(orderPayRequest.getReceiveType(),Constants.ZERO)){ |
| | | //查询收货地址 |
| | | Addr addr = addrMapper.selectById(orderPayRequest.getAddressId()); |
| | | if(Objects.isNull(addr)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到收货地址信息!"); |
| | | } |
| | | Areas area = areasService.findById(addr.getAreaId(), Constants.TWO); |
| | | if(Objects.isNull(area)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"收货地址区划信息发生变化,请更新后下单!"); |
| | | } |
| | | |
| | | goodsorder.setAddrId(addr.getId()); |
| | | goodsorder.setLinkaddr(area.getProvinceName()+area.getCityName() + area.getName() + addr.getAddr()); |
| | | goodsorder.setLinkphone(addr.getPhone()); |
| | | goodsorder.setLinkname(addr.getName()); |
| | | if(Objects.nonNull(member.getBindShopId())){ |
| | | goodsorder.setDistributionShopId(member.getBindShopId()); |
| | | } |
| | | }else{ |
| | | if(Objects.isNull(orderPayRequest.getShopId())){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!"); |
| | | } |
| | | Shop shop = shopMapper.selectById(orderPayRequest.getShopId()); |
| | | if(Objects.isNull(shop)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"请选择正确的自提门店!"); |
| | | } |
| | | //判断门店是否设置商品的价格信息 |
| | | |
| | | |
| | | //根据选择商户进行会员与商户信息绑定 |
| | | if(Objects.isNull(member.getBindShopId())){ |
| | | memberMapper.update(new UpdateWrapper<Member>().lambda() |
| | | .set(Member::getBindShopId,shop.getId()) |
| | | .eq(Member::getId,member.getId()) |
| | | ); |
| | | } |
| | | |
| | | goodsorder.setPickUpShopId(shop.getId()); |
| | | goodsorder.setDistributionShopId(shop.getId()); |
| | | if(Objects.isNull(member.getBindShopId())){ |
| | | member.setBindShopId(shop.getId()); |
| | | } |
| | | } |
| | | //单据编号 自增 |
| | | goodsorder.setCode(getNextInCode()); |
| | | //计算订单总金额 |
| | | BigDecimal sumPrice = BigDecimal.ZERO; |
| | | |
| | | //存储记录明细 |
| | | OrderPayConfirmResponse orderPayConfirmResponse = this.orderPayConfirm(orderPayRequest.getReceiveType(),orderPayRequest.getPayDetailRequestList(),orderPayRequest.getAddressId(),memberCouponService,member.getId()); |
| | | if(Objects.isNull(orderPayConfirmResponse)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"系统支付错误,请联系管理员"); |
| | | } |
| | | goodsorder.setPrice(orderPayConfirmResponse.getPayAmount()); |
| | | goodsorder.setTotalPrice(orderPayConfirmResponse.getAmount()); |
| | | goodsorder.setUseIntegral(orderPayConfirmResponse.getDeductIntegral()); |
| | | goodsorder.setIntegralPrice(orderPayConfirmResponse.getIntegralAmount()); |
| | | |
| | | if(Objects.nonNull(orderPayConfirmResponse.getMemberCoupon())){ |
| | | MemberCoupon memberCoupon = memberCouponMapper.selectById(orderPayConfirmResponse.getMemberCoupon().getId()); |
| | | if(Objects.isNull(memberCoupon)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到优惠券信息!"); |
| | | } |
| | | if(memberCoupon.getStatus().equals(Constants.ONE)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"优惠券已使用!"); |
| | | } |
| | | sumPrice = sumPrice.subtract(memberCoupon.getPrice()); |
| | | goodsorder.setCouponId(memberCoupon.getId()); |
| | | goodsorder.setCouponPrice(orderPayConfirmResponse.getMemberCoupon().getValidAmount()); |
| | | |
| | | memberCouponMapper.update(null,new UpdateWrapper<MemberCoupon>().lambda() |
| | | .set(MemberCoupon::getStatus,Constants.ONE) |
| | | .set(MemberCoupon::getUseDate,DateUtil.getCurrDateTime()) |
| | | .eq(MemberCoupon::getId,memberCoupon.getId()) |
| | | ); |
| | | } |
| | | |
| | | goodsorderMapper.insert(goodsorder); |
| | | List<OrderGoodsCalculateResponse> goodsCalculateList = orderPayConfirmResponse.getGoodsCalculateList(); |
| | | if(CollectionUtils.isEmpty(goodsCalculateList)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"无明细数据,请检查选择数据!"); |
| | | } |
| | | List<GoodsorderDetail> goodsOrderDetailList = new ArrayList<>(); |
| | | for (OrderGoodsCalculateResponse payDetailRequest:goodsCalculateList) { |
| | | //查询商品 |
| | | GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getSkuId()); |
| | | if(Objects.isNull(goodsSku)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品SKU信息!"); |
| | | } |
| | | Goods goods = goodsMapper.selectById(goodsSku.getGoodsId()); |
| | | if(Objects.isNull(goods)){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品信息!"); |
| | | } |
| | | if(goods.getStatus().equals(Constants.ONE)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单"); |
| | | } |
| | | if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!"); |
| | | } |
| | | //商品库存扣除 |
| | | goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))); |
| | | goodsSkuMapper.updateById(goodsSku); |
| | | GoodsorderDetail goodsOrderDetail = new GoodsorderDetail(); |
| | | goodsOrderDetail.setCreator(member.getId()); |
| | | goodsOrderDetail.setCreateDate(new Date()); |
| | | goodsOrderDetail.setImgurl(StringUtils.isBlank(goodsSku.getImgurl())?goods.getImgurl():goodsSku.getImgurl()); |
| | | goodsOrderDetail.setName(goods.getName()); |
| | | goodsOrderDetail.setGoodsSkuId(goodsSku.getId().toString()); |
| | | goodsOrderDetail.setSkuName(goodsSku.getName()); |
| | | goodsOrderDetail.setPrice(goodsSku.getPrice()); |
| | | goodsOrderDetail.setGoodsNum(payDetailRequest.getGoodsNum()); |
| | | goodsOrderDetail.setGoodsWeight(payDetailRequest.getWeight()); |
| | | goodsOrderDetail.setCouponDeduct(payDetailRequest.getCouponDeductCash()); |
| | | goodsOrderDetail.setIntegralDeduct(payDetailRequest.getIntegralDeductCash()); |
| | | goodsOrderDetail.setOrderId(goodsorder.getId()); |
| | | goodsOrderDetailList.add(goodsOrderDetail); |
| | | //删除购物车商品 |
| | | shopcartMapper.delete(new QueryWrapper<Shopcart>().lambda() |
| | | .eq(Shopcart::getMemberId,member.getId()) |
| | | .eq(Shopcart::getGoodsSkuId,goodsOrderDetail.getGoodsSkuId()) |
| | | ); |
| | | } |
| | | //积分变动记录 |
| | | Integral integral =Integral.createIntegral(member.getId(),Constants.INTEGRAL_TYPE.ORDER_PAY,goodsorder.getId()); |
| | | integral.setNum(goodsorder.getUseIntegral()); |
| | | integral.setTotalNum(member.getIntegral().subtract(goodsorder.getUseIntegral())); |
| | | integralMapper.insert(integral); |
| | | //更新用户积分 |
| | | memberMapper.subtractIntegral(member.getId(),goodsorder.getUseIntegral()); |
| | | if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!"); |
| | | } |
| | | |
| | | return this.wxPay(goodsorder,member); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 重新支付 |
| | | * @param orderId |
| | |
| | | Object response = null; |
| | | WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); |
| | | request.setBody("平台商城"); |
| | | request.setAttach("terraceMall"); |
| | | request.setAttach("shopGoods"); |
| | | request.setOutTradeNo(goodsorder.getCode().toString()); |
| | | request.setTotalFee(BaseWxPayRequest.yuanToFen(goodsorder.getPrice().toString())); |
| | | // request.setTotalFee(2); |
| | |
| | | goodsName = goods.getName(); |
| | | } |
| | | if(!Objects.isNull(goodsSku)){ |
| | | goodsSku.setStock(goodsSku.getStock()+goodsorderDetail.getGoodsNum()); |
| | | goodsSku.setStock(goodsSku.getStock().add(new BigDecimal(Constants.formatIntegerNum(goodsorderDetail.getGoodsNum())))); |
| | | goodsSkuMapper.updateById(goodsSku); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public BigDecimal getDeductAmount(List<PayDetailRequest> requestList){ |
| | | List<MemberCoupon> memberCouponList = new ArrayList<>(); |
| | | |
| | | List<GoodsSku> goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>() |
| | | .lambda() |
| | | .eq(GoodsSku::getIsdeleted,Constants.ZERO) |
| | | .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())) |
| | | ); |
| | | if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品SKU信息错误,请刷新重试"); |
| | | } |
| | | |
| | | //查询商品列表 |
| | | List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | | new MPJLambdaWrapper<Goods>() |
| | | .selectAs(GoodsSku::getPrice,Goods::getSkuPrice) |
| | | .selectAs(GoodsSku::getId,Goods::getSkuId) |
| | | .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId) |
| | | .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))); |
| | | if(Objects.isNull(goodsList)){ |
| | | return BigDecimal.ZERO; |
| | | } |
| | | //获取选择的商品总金额 与 单个商品金额 |
| | | BigDecimal deductAmount = BigDecimal.ZERO; |
| | | for (Goods goods:goodsList) { |
| | | List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList()); |
| | | if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(request)){ |
| | | goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+""))); |
| | | deductAmount = deductAmount.add(goods.getSkuAmount().multiply(goods.getDeductRata())); |
| | | } |
| | | } |
| | | return deductAmount; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 订单确认接口 |
| | | * @param receiveType 0=快递配送 1=自提 |
| | | * @param requestList |
| | | * @param addressId |
| | | * @param memberCouponService |
| | | * @param memberId |
| | | */ |
| | | public OrderPayConfirmResponse orderPayConfirm(Integer receiveType,List<PayDetailRequest> requestList,Integer addressId, |
| | | MemberCouponServiceImpl memberCouponService,Integer memberId){ |
| | | OrderPayConfirmResponse orderPayConfirmResponse = new OrderPayConfirmResponse(); |
| | | List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class, |
| | | new MPJLambdaWrapper<Goods>() |
| | | .selectAs(GoodsSku::getPrice,Goods::getSkuPrice) |
| | | .selectAs(GoodsSku::getId,Goods::getSkuId) |
| | | .selectAs(GoodsSku::getIntegralRate,Goods::getDeductRata) |
| | | .selectAs(GoodsSku::getWeight,Goods::getWeight) |
| | | .selectAs(GoodsSku::getImgurl,Goods::getSkuImg) |
| | | .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId) |
| | | .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))); |
| | | if(CollectionUtils.isEmpty(goodsList)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未匹配到商品信息"); |
| | | } |
| | | |
| | | List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new); |
| | | |
| | | //订单总金额 |
| | | BigDecimal amount = BigDecimal.ZERO; |
| | | //优惠券抵扣金额 |
| | | BigDecimal couponAmount = BigDecimal.ZERO; |
| | | //积分抵扣金额 |
| | | BigDecimal integralAmount = BigDecimal.ZERO; |
| | | //抵扣积分值 |
| | | BigDecimal deductIntegral = BigDecimal.ZERO; |
| | | //邮费金额 |
| | | BigDecimal mailAmount = BigDecimal.ZERO; |
| | | for (OrderGoodsCalculateResponse response:goodsCalculateList) { |
| | | List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), response.getSkuId())).collect(Collectors.toList()); |
| | | if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(request)){ |
| | | PayDetailRequest payDetailRequest = request.get(Constants.ZERO); |
| | | response.setSkuAmount(response.getSkuPrice().multiply(new BigDecimal(payDetailRequest.getGoodsNum()+""))); |
| | | response.setGoodsNum(payDetailRequest.getGoodsNum()); |
| | | amount = amount.add(response.getSkuAmount()); |
| | | } |
| | | } |
| | | //获取优惠券优惠金额 |
| | | List<MemberCoupon> memberCouponList = memberCouponService.getApplyCoupon(requestList,memberId); |
| | | MemberCoupon memberCoupon = new MemberCoupon(); |
| | | if(CollectionUtils.isNotEmpty(memberCouponList)){ |
| | | memberCoupon = memberCouponList.get(Constants.ZERO); |
| | | couponAmount = memberCoupon.getValidAmount(); |
| | | memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount); |
| | | orderPayConfirmResponse.setMemberCoupon(memberCoupon); |
| | | } |
| | | //积分抵扣金额 |
| | | //查询用户总积分 |
| | | Member member = memberMapper.selectById(memberId); |
| | | //积分大于0 且大于可用积分配置项 才可以使用 |
| | | if(member.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){ |
| | | //最低可用启用积分 |
| | | BigDecimal minimumIntegral = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.MINIMUM_AVAILABLE_INTEGRAL).getCode()); |
| | | if(member.getIntegral().compareTo(minimumIntegral)>=Constants.ZERO){ |
| | | this.calculateIntegralRata(goodsCalculateList,member.getIntegral()); |
| | | } |
| | | } |
| | | //邮费金额 |
| | | if(Constants.equalsInteger(receiveType,Constants.ZERO)){ |
| | | //TODO 根据收货地址 查询运费配置 |
| | | |
| | | //计算商品信息总重量 |
| | | BigDecimal totalWeight = goodsCalculateList.stream().map(i-> |
| | | i.getWeight().multiply(new BigDecimal(i.getGoodsNum().toString())) |
| | | ).reduce(BigDecimal.ZERO,BigDecimal::add); |
| | | |
| | | } |
| | | |
| | | orderPayConfirmResponse.setAmount(amount); |
| | | orderPayConfirmResponse.setCouponAmount(couponAmount); |
| | | orderPayConfirmResponse.setDeductIntegral(deductIntegral); |
| | | orderPayConfirmResponse.setMailAmount(mailAmount); |
| | | orderPayConfirmResponse.setIntegralAmount(integralAmount); |
| | | orderPayConfirmResponse.setPayAmount(amount.subtract(couponAmount).subtract(mailAmount).subtract(integralAmount)); |
| | | orderPayConfirmResponse.setGoodsCalculateList(goodsCalculateList); |
| | | BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.CASH_EXCHANGE_INTEGRAL_RATA).getCode()); |
| | | orderPayConfirmResponse.setIntegralBack( |
| | | orderPayConfirmResponse.getPayAmount().multiply(cashToIntegralRata) |
| | | ); |
| | | |
| | | return orderPayConfirmResponse; |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param goodsCalculateList 商品集合 |
| | | * @param totalIntegral 用户总积分 |
| | | */ |
| | | public void calculateIntegralRata(List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){ |
| | | //当前选择商品最大可用积分抵扣的金额 |
| | | BigDecimal maxDeductionCash = goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash()) |
| | | .multiply(i.getDeductRata())).reduce(BigDecimal.ZERO,BigDecimal::add); |
| | | //积分 - 现金 比例 |
| | | BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.INTEGRAL_EXCHANGE_CASH_RATA).getCode()); |
| | | //当前选择商品抵扣需要使用的积分 |
| | | BigDecimal maxDeductionIntegral = maxDeductionCash.multiply(cashToIntegralRata).multiply(new BigDecimal("100")); |
| | | BigDecimal deductionRata = BigDecimal.ONE; |
| | | //如果实际积分少于最大需要积分 需要计算比例占比 去对应添加至对应的商品里 |
| | | if(totalIntegral.compareTo(maxDeductionIntegral)<=Constants.ZERO) { |
| | | deductionRata = totalIntegral.divide(maxDeductionIntegral, 2, BigDecimal.ROUND_HALF_UP); |
| | | } |
| | | //获取总的抵扣金额 与 每个商品可抵扣金额 |
| | | //已用占比比例值 |
| | | BigDecimal rata = BigDecimal.ZERO; |
| | | //剩余可分配金额 |
| | | BigDecimal surplusValidAmount = maxDeductionCash; |
| | | for (int j = 0; j < goodsCalculateList.size(); j++) { |
| | | if(Constants.equalsInteger(j+1,goodsCalculateList.size())){ |
| | | goodsCalculateList.get(j).setIntegralMaxDeductCash(surplusValidAmount); |
| | | goodsCalculateList.get(j).setOrderIntegralRata(new BigDecimal("1").subtract(rata)); |
| | | }else{ |
| | | //积分最大可抵扣金额 |
| | | goodsCalculateList.get(j).setIntegralMaxDeductCash( |
| | | goodsCalculateList.get(j).getSkuAmount() |
| | | .subtract(goodsCalculateList.get(j).getCouponDeductCash()) |
| | | .multiply(goodsCalculateList.get(j).getDeductRata())); |
| | | //订单中积分金额实际占比 |
| | | goodsCalculateList.get(j).setOrderIntegralRata( |
| | | goodsCalculateList.get(j) |
| | | .getIntegralMaxDeductCash().divide(maxDeductionCash,2,BigDecimal.ROUND_DOWN) |
| | | ); |
| | | rata = rata.add(goodsCalculateList.get(j).getOrderIntegralRata()); |
| | | surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(j).getIntegralMaxDeductCash()); |
| | | } |
| | | //如果用户积分大于本次需要使用的最大积分 则直接使用否则需要重新计算 |
| | | goodsCalculateList.get(j).setIntegralDeductCash(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(deductionRata)); |
| | | goodsCalculateList.get(j).setIntegralDeduct(goodsCalculateList.get(j).getIntegralMaxDeductCash().multiply(cashToIntegralRata).multiply(deductionRata)); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | @Override |
| | | public void refreshOrderCodes(){ |
| | | int countOrder = 0,countSign=0,countSale=0; |
| | | long countOrder = 0,countSign=0,countSale=0; |
| | | |
| | | QueryWrapper<Goodsorder> order = new QueryWrapper<>(); |
| | | order.apply(true, "TO_DAYS(NOW())=TO_DAYS(create_date)"); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | } |