| | |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.*; |
| | | import cc.mrbird.febs.mall.service.*; |
| | | import cc.mrbird.febs.mall.vo.ApiShopApplyVo; |
| | | import cc.mrbird.febs.mall.vo.OrderDetailVo; |
| | | import cc.mrbird.febs.mall.vo.OrderListVo; |
| | | import cc.mrbird.febs.mall.vo.OrderRefundVo; |
| | |
| | | import cc.mrbird.febs.pay.service.UnipayService; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.text.DecimalFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | /** |
| | |
| | | private final MallShoppingCartMapper mallShoppingCartMapper; |
| | | private final IApiMallMemberService memberService; |
| | | private final IMallMoneyFlowService mallMoneyFlowService; |
| | | private final MallMoneyFlowMapper mallMoneyFlowMapper; |
| | | private final RedisUtils redisUtils; |
| | | |
| | | private final AgentProducer agentProducer; |
| | |
| | | |
| | | private final MallMemberBankSignMapper mallMemberBankSignMapper; |
| | | private final MallMemberBankMapper mallMemberBankMapper; |
| | | private final MallShopApplyMapper mallShopApplyMapper; |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createOrder(AddOrderDto addOrderDto) { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | /** |
| | | * 根据会员星级判断是否可以购买该商品 |
| | | */ |
| | | MallMember mallMember = memberMapper.selectById(member.getId()); |
| | | String accountLevel = mallMember.getAccountLevel(); |
| | | Integer memberLevelCode = MemberAccountLevelEnum.NORMAL.getMemberLevelCode(accountLevel); |
| | | //获取商品星级 |
| | | MallGoods goods = mallGoodsMapper.selectById(addOrderDto.getGoodsId()); |
| | | String starRating = goods.getStarRating(); |
| | | Integer goodsStarCode = StarRatingEnum.NORMAL.getGoodsStarCode(starRating); |
| | | if(memberLevelCode < goodsStarCode){ |
| | | throw new FebsException("会员等级不够"); |
| | | } |
| | | if (MallGoods.ISSALE_STATUS_DISABLED.equals(goods.getIsSale())) { |
| | | throw new FebsException(goods.getGoodsName() + "已下架"); |
| | | } |
| | | /** |
| | | * 会员一天最多下单次数 |
| | | */ |
| | | DataDictionaryCustom buyTimesDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.BUY_TIMES.getType(), DataDictionaryEnum.BUY_TIMES.getCode()); |
| | | Integer buyTimes = Integer.parseInt(buyTimesDic.getValue()); |
| | | |
| | | MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId()); |
| | | if (address == null) { |
| | | throw new FebsException("地址不存在"); |
| | | DateTime date = DateUtil.date(); |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | String yyyyMMdd = sdf.format(date); |
| | | Integer times = this.baseMapper.selectCountByCreateTimeAndMemberId(yyyyMMdd,member.getId()); |
| | | if(buyTimes <= times){ |
| | | throw new FebsException("会员今日已无法购买"); |
| | | } |
| | | |
| | | String orderNo = MallUtils.getOrderNum(); |
| | |
| | | orderInfo.setOrderTime(new Date()); |
| | | orderInfo.setMemberId(member.getId()); |
| | | orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue()); |
| | | orderInfo.setName(address.getName()); |
| | | orderInfo.setAddress(address.getArea() + address.getAddress()); |
| | | orderInfo.setPhone(address.getPhone()); |
| | | orderInfo.setLatitude(address.getLatitude()); |
| | | orderInfo.setLongitude(address.getLongitude()); |
| | | orderInfo.setRemark(addOrderDto.getRemark()); |
| | | orderInfo.setOrderType(addOrderDto.getOrderType()); |
| | | |
| | | if (CollUtil.isEmpty(addOrderDto.getItems())) { |
| | | throw new FebsException("参数错误"); |
| | | } |
| | | //补贴金额 |
| | | orderInfo.setSubsidyAmount(goods.getSubsidyAmount()); |
| | | |
| | | this.baseMapper.insert(orderInfo); |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | BigDecimal carriage = BigDecimal.ZERO; |
| | | for (AddOrderItemDto item : addOrderDto.getItems()) { |
| | | MallOrderItem orderItem = new MallOrderItem(); |
| | | |
| | | // 积分商品提交订单 |
| | | if (addOrderDto.getOrderType() == 2) { |
| | | MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId()); |
| | | if (mallGoods.getStock() < item.getCnt()) { |
| | | throw new FebsException(mallGoods.getGoodsName() + "库存不足"); |
| | | } |
| | | |
| | | if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { |
| | | throw new FebsException(mallGoods.getGoodsName() + "已下架"); |
| | | } |
| | | |
| | | BigDecimal amount = mallGoods.getScore().multiply(BigDecimal.valueOf(item.getCnt())); |
| | | orderItem.setAmount(amount); |
| | | orderItem.setCnt(item.getCnt()); |
| | | orderItem.setOrderId(orderInfo.getId()); |
| | | orderItem.setPrice(mallGoods.getScore()); |
| | | orderItem.setGoodsId(mallGoods.getId()); |
| | | orderItem.setGoodsName(mallGoods.getGoodsName()); |
| | | orderItem.setStyleName(mallGoods.getGoodsName()); |
| | | orderItem.setSkuName(mallGoods.getGoodsName()); |
| | | orderItem.setSkuImage(mallGoods.getThumb()); |
| | | |
| | | total = total.add(amount); |
| | | } else { |
| | | MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); |
| | | List<MallGoodsSku> mallGoodsSkus = mallGoodsSkuMapper.selectSkuByGoodsId(goods.getId()); |
| | | for (MallGoodsSku sku : mallGoodsSkus) { |
| | | MallOrderItem orderItem = new MallOrderItem(); |
| | | if (sku == null) { |
| | | throw new FebsException("购买商品或sku不存在"); |
| | | } |
| | | |
| | | if (sku.getStock() < item.getCnt()) { |
| | | if (sku.getStock() < 1) { |
| | | throw new FebsException(sku.getSkuName() + "库存不足"); |
| | | } |
| | | |
| | | MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId()); |
| | | |
| | | // 零撸专区购买 |
| | | if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) { |
| | | List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId()); |
| | | if (CollUtil.isNotEmpty(items)) { |
| | | throw new FebsException("无法重复领取同一个商品"); |
| | | } |
| | | } |
| | | |
| | | if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { |
| | | throw new FebsException(mallGoods.getGoodsName() + "已下架"); |
| | | } |
| | | |
| | | BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); |
| | | BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(1)); |
| | | orderItem.setAmount(amount); |
| | | orderItem.setCnt(item.getCnt()); |
| | | orderItem.setCnt(1); |
| | | orderItem.setOrderId(orderInfo.getId()); |
| | | orderItem.setPrice(sku.getPresentPrice()); |
| | | orderItem.setGoodsId(sku.getGoodsId()); |
| | | orderItem.setGoodsName(sku.getGoodsName()); |
| | | orderItem.setGoodsName(goods.getGoodsName()); |
| | | orderItem.setSkuId(sku.getId()); |
| | | orderItem.setStyleName(sku.getStyleName()); |
| | | orderItem.setSkuName(sku.getSkuName()); |
| | | orderItem.setSkuImage(sku.getSkuImage()); |
| | | orderItem.setIsNormal(mallGoods.getIsNormal()); |
| | | orderItem.setIsNormal(goods.getIsNormal()); |
| | | orderItem.setCostPrice(sku.getCostPrice()); |
| | | |
| | | total = total.add(amount); |
| | | carriage = carriage.add(mallGoods.getCarriage()); |
| | | |
| | | sku.setStock(sku.getStock() - item.getCnt()); |
| | | sku.setSkuVolume(sku.getSkuVolume() + item.getCnt()); |
| | | sku.setStock(sku.getStock() - 1); |
| | | sku.setSkuVolume(sku.getSkuVolume() + 1); |
| | | mallGoodsSkuMapper.updateById(sku); |
| | | |
| | | if (addOrderDto.getType() == 1) { |
| | | if (1 == addOrderDto.getType() ) { |
| | | mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId()); |
| | | } |
| | | } |
| | | mallOrderItemMapper.insert(orderItem); |
| | | mallOrderItemMapper.insert(orderItem); |
| | | } |
| | | |
| | | orderInfo.setAmount(total); |
| | | orderInfo.setCarriage(carriage); |
| | | BigDecimal presentPrice = new BigDecimal(goods.getPresentPrice()).setScale(2,BigDecimal.ROUND_DOWN); |
| | | orderInfo.setAmount(presentPrice); |
| | | this.baseMapper.updateById(orderInfo); |
| | | |
| | | agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L); |
| | |
| | | if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) { |
| | | throw new FebsException("订单状态不能支付"); |
| | | } |
| | | |
| | | String type = payOrderDto.getType(); |
| | | type = type == "3" ? type : "3"; |
| | | String payResultStr = ""; |
| | | String rcResult = ""; |
| | | switch (payOrderDto.getType()) { |
| | | switch (type) { |
| | | case "1": |
| | | UnipayDto unipayDtoWx = new UnipayDto(); |
| | | // unipayDto.setAmount(new BigDecimal("0.01")); |
| | |
| | | |
| | | orderInfo.setPayOrderNo(orderInfo.getOrderNo()); |
| | | orderInfo.setPayMethod("余额支付"); |
| | | orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); |
| | | // orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); |
| | | //订单支付成功后,订单直接变成待收货 |
| | | orderInfo.setStatus(OrderStatusEnum.WAIT_FINISH.getValue()); |
| | | //生成物流编号 |
| | | String logisticsNo = MallUtils.getLogisticsNum(StrUtil.subSuf(payResultStr, payResultStr.length() - 2)); |
| | | orderInfo.setPayTradeNo(logisticsNo); |
| | | orderInfo.setPayTime(new Date()); |
| | | orderInfo.setPayResult("1"); |
| | | |
| | | boolean hasTc = false; |
| | | // 静态倍数 |
| | | List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); |
| | | if (CollUtil.isNotEmpty(orderItems)) { |
| | | for (MallOrderItem orderItem : orderItems) { |
| | | MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); |
| | | BigDecimal score = BigDecimal.ZERO; |
| | | MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId()); |
| | | if (mallGoods.getIsNormal() == 2) { |
| | | hasTc = true; |
| | | score = sku.getPresentPrice().multiply(mallGoods.getStaticMulti()).multiply(new BigDecimal(orderItem.getCnt())); |
| | | // BigDecimal staticMulti = mallGoods.getStaticMulti() == null ? BigDecimal.ZERO : mallGoods.getStaticMulti(); |
| | | // score = sku.getPresentPrice().multiply(staticMulti); |
| | | // 普通商品也及时结算,不再10天结算 |
| | | } else { |
| | | score = sku.getPresentPrice(); |
| | | } |
| | | // mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); |
| | | /** |
| | | * 生成下单的流水记录 |
| | | */ |
| | | Long payFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | member.getId(), |
| | | orderInfo.getOrderNo(), |
| | | orderInfo.getAmount().negate().setScale(2, BigDecimal.ROUND_DOWN), |
| | | MallMoneyFlowTypeEnum.PAY.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_N, |
| | | member.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.PAY.getName() |
| | | ); |
| | | |
| | | if (score.compareTo(BigDecimal.ZERO) > 0) { |
| | | memberWalletService.add(score, member.getId(), "score"); |
| | | mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); |
| | | |
| | | // 添加业绩 |
| | | mallAchieveService.add(orderItem.getId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 购买套餐后,升级为普通会员 |
| | | if (hasTc) { |
| | | MallMember mallMember = memberMapper.selectById(member.getId()); |
| | | if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { |
| | | mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); |
| | | memberMapper.updateById(mallMember); |
| | | } |
| | | } |
| | | |
| | | mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); |
| | | agentProducer.sendAutoLevelUpMsg(member.getId()); |
| | | agentProducer.sendOrderReturn(orderInfo.getId()); |
| | | break; |
| | | case "4": |
| | | if (orderInfo.getOrderType() != 2) { |
| | |
| | | |
| | | OrderDetailVo orderDetailVo = MallOrderInfoConversion.INSTANCE.entityToDetailVo(orderInfo); |
| | | |
| | | if (orderInfo.getStatus() == OrderStatusEnum.WAIT_FINISH.getValue()) { |
| | | Integer deliverType = (ObjectUtil.isEmpty(orderInfo.getDeliverType()) ? new Integer(0):orderInfo.getDeliverType()); |
| | | if (orderInfo.getStatus() == OrderStatusEnum.WAIT_FINISH.getValue() && 2 != deliverType) { |
| | | MallExpressInfo expressInfo = expressInfoMapper.selectByOrderId(orderInfo.getId()); |
| | | orderDetailVo.setExpressNo(expressInfo.getExpressNo()); |
| | | orderDetailVo.setExpressCom(expressInfo.getExpressCom()); |
| | |
| | | |
| | | long remainTime = DateUtil.between(new Date(), endTime, DateUnit.SECOND, false); |
| | | orderDetailVo.setRemainTime(remainTime); |
| | | } |
| | | if(2 == deliverType){ |
| | | MallShopApply mallShopApply = mallShopApplyMapper.selectById(orderInfo.getShopId()); |
| | | if(ObjectUtil.isNotEmpty(mallShopApply)){ |
| | | ApiShopApplyVo apiShopApplyVo = new ApiShopApplyVo(); |
| | | apiShopApplyVo.setName(mallShopApply.getName()); |
| | | apiShopApplyVo.setPhone(mallShopApply.getPhone()); |
| | | apiShopApplyVo.setSaleArea(mallShopApply.getSaleArea()); |
| | | apiShopApplyVo.setLatitude(mallShopApply.getLatitude()); |
| | | apiShopApplyVo.setLongitude(mallShopApply.getLongitude()); |
| | | apiShopApplyVo.setShopName(mallShopApply.getShopName()); |
| | | apiShopApplyVo.setAddress(mallShopApply.getAddress()); |
| | | orderDetailVo.setApiShopApplyVo(apiShopApplyVo); |
| | | } |
| | | } |
| | | return orderDetailVo; |
| | | } |
| | |
| | | orderInfo.setStatus(OrderStatusEnum.FINISH.getValue()); |
| | | orderInfo.setReceivingTime(new Date()); |
| | | this.baseMapper.updateById(orderInfo); |
| | | /** |
| | | * 通过支付流水记录,返回下单金额 |
| | | */ |
| | | MallMoneyFlow payFlow = mallMoneyFlowMapper.selectOneByMemberIdAndOrderNoAndTypeAndStatusAndIsReturn( |
| | | member.getId(), |
| | | orderInfo.getOrderNo(), |
| | | MallMoneyFlowTypeEnum.PAY.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_N); |
| | | if(ObjectUtil.isNotEmpty(payFlow)){ |
| | | memberWalletService.addBalance(payFlow.getAmount().negate(),payFlow.getRtMemberId()); |
| | | payFlow.setIsReturn(MallMoneyFlow.IS_RETURN_Y); |
| | | mallMoneyFlowMapper.updateById(payFlow); |
| | | } |
| | | //产生补贴流水记录 |
| | | agentProducer.sendDirectRewardMsg(orderInfo.getId()); |
| | | |
| | | } |
| | | |
| | | @Override |