| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.kuaidi100.sdk.request.samecity.OrderGoods; |
| | | import com.ruoyi.account.api.feignClient.*; |
| | | import com.ruoyi.account.api.model.*; |
| | | |
| | |
| | | |
| | | import com.ruoyi.order.mapper.OrderGoodMapper; |
| | | import com.ruoyi.order.mapper.OrderMapper; |
| | | import com.ruoyi.order.model.ChargeOrder; |
| | | import com.ruoyi.order.model.Order; |
| | | import com.ruoyi.order.model.OrderGood; |
| | | import com.ruoyi.order.service.OrderGoodService; |
| | |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | |
| | | import io.swagger.models.auth.In; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import org.apache.poi.ss.formula.functions.T; |
| | | import org.apache.poi.ss.usermodel.*; |
| | | import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
| | | import org.springframework.context.ApplicationEventPublisher; |
| | | 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.multipart.MultipartFile; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | |
| | |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | @Resource |
| | | private ShopBalanceStatementClient shopBalanceStatementClient; |
| | | private ShopBalanceStatementClient shopBalanceStatementClient; |
| | | |
| | | @Resource |
| | | private GoodsEvaluateClient goodsEvaluateClient; |
| | |
| | | orderGoodsVO.setGoodsName(goods.getName()); |
| | | orderGoodsVO.setGoodsPic(goods.getHomePagePicture()); |
| | | orderGoodsVO.setNum(order.getNum()); |
| | | if (null!=goodsSeckill){ |
| | | if (null != goodsSeckill) { |
| | | orderGoodsVO.setSellingPrice(goodsSeckill.getSellingPrice()); |
| | | orderGoodsVO.setIntegral(goodsSeckill.getIntegral()); |
| | | }else { |
| | | } else { |
| | | orderGoodsVO.setSellingPrice(goods.getSellingPrice()); |
| | | orderGoodsVO.setIntegral(goods.getIntegral()); |
| | | } |
| | |
| | | e.printStackTrace(); |
| | | throw new ServiceException("生成核销码失败"); |
| | | } |
| | | if(3!=order.getOrderStatus()){ |
| | | if (3 != order.getOrderStatus()) { |
| | | //不属于未使用的,应该有个核销\取消时间 |
| | | orderDetailVO.setEndTime(order.getEndTime()); |
| | | } |
| | |
| | | if (!order.getShopId().equals(shopId)) { |
| | | throw new ServiceException("该订单与当前扫码门店不一致"); |
| | | } |
| | | if (order.getOrderStatus()!=3){ |
| | | if (order.getOrderStatus() != 3) { |
| | | throw new ServiceException("订单已被核销过"); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | //搜索条件 店铺名称 |
| | | if (StringUtils.isNotEmpty(orderPageList.getShopName())){ |
| | | if (StringUtils.isNotEmpty(orderPageList.getShopName())) { |
| | | List<Integer> shopSet = new ArrayList<>(shopClient.getShopIdByName(orderPageList.getShopName()).getData()); |
| | | if (CollectionUtils.isEmpty(shopSet)) { |
| | | return new PageInfo<>(); |
| | |
| | | orderPageListVo.setUserName(appUser.getName()); |
| | | orderPageListVo.setPhone(appUser.getPhone()); |
| | | } |
| | | //店铺名称 |
| | | //店铺名称 |
| | | Shop shop = shopClient.getShopById(orderPageListVo.getShopId()).getData(); |
| | | if (null != shop) { |
| | | orderPageListVo.setShopName(shop.getName()); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 取消订单操作 |
| | | * |
| | |
| | | @Override |
| | | public R cancelOrder(Long orderId) { |
| | | Order order = this.getById(orderId); |
| | | if (Arrays.asList(4,5,8).contains(order.getOrderStatus())) { |
| | | if (Arrays.asList(4, 5, 8).contains(order.getOrderStatus())) { |
| | | return R.fail("无效的操作"); |
| | | } |
| | | |
| | |
| | | BigDecimal paymentAmount = order.getPaymentAmount(); |
| | | if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0 |
| | | //微信退款 |
| | | Map<String,String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "退款", "/order/order/refundPayMoneyCallback"); |
| | | Map<String, String> map = wechatPayService.refund(order.getOrderNumber(), order.getOrderNumber(), order.getPaymentAmount().toString(), order.getPaymentAmount().toString(), "退款", "/order/order/refundPayMoneyCallback"); |
| | | |
| | | // RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback"); |
| | | if (!"SUCCESS".equals(map.get("return_code"))) { |
| | |
| | | } |
| | | //退款成功再回退积分 |
| | | AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); |
| | | if (order.getPoint()>0) { |
| | | if(null==appUser.getCancelPoint()){ |
| | | if (order.getPoint() > 0) { |
| | | if (null == appUser.getCancelPoint()) { |
| | | appUser.setCancelPoint(0); |
| | | } |
| | | //返回订单抵扣积分 |
| | |
| | | //门店减少冻结资金 即减少余额, 冻结资金=余额-可用资金 |
| | | Shop shop = shopClient.getShopById(order.getShopId()).getData(); |
| | | |
| | | BigDecimal historicalBalance=shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount=BigDecimal.ZERO;//变动金额 |
| | | BigDecimal historicalBalance = shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount = BigDecimal.ZERO;//变动金额 |
| | | if (null != goodsSeckill) { |
| | | variableAmount=goodsSeckill.getSellingPrice(); |
| | | }else { |
| | | variableAmount=good.getSellingPrice(); |
| | | variableAmount = goodsSeckill.getSellingPrice(); |
| | | } else { |
| | | variableAmount = good.getSellingPrice(); |
| | | } |
| | | |
| | | BigDecimal balance=shop.getBalance().subtract(variableAmount);//变动后余额 |
| | | BigDecimal balance = shop.getBalance().subtract(variableAmount);//变动后余额 |
| | | |
| | | shop.setBalance(balance); |
| | | shopClient.updateShop(shop); |
| | |
| | | public R refundPayMoneyCallback(String xmlData) { |
| | | |
| | | RefundCallbackResult result = wechatPayService.processRefundCallback(xmlData); |
| | | if (!result.isSuccess()) { |
| | | return R.fail(result.getMsg()); |
| | | } |
| | | if (!result.isSuccess()) { |
| | | return R.fail(result.getMsg()); |
| | | } |
| | | |
| | | Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, result.getOrderNo())); |
| | | if (null == order || order.getPayStatus() == 1 || order.getRefundStatus() == 2) { |
| | |
| | | |
| | | //退款成功再回退积分 |
| | | AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); |
| | | if (order.getPoint()>0) { |
| | | if(null==appUser.getCancelPoint()){ |
| | | if (order.getPoint() > 0) { |
| | | if (null == appUser.getCancelPoint()) { |
| | | appUser.setCancelPoint(0); |
| | | } |
| | | //返回订单抵扣积分 |
| | |
| | | //门店减少冻结资金 即减少余额, 冻结资金=余额-可用资金 |
| | | Shop shop = shopClient.getShopById(order.getShopId()).getData(); |
| | | |
| | | BigDecimal historicalBalance=shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount=BigDecimal.ZERO;//变动金额 |
| | | BigDecimal historicalBalance = shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount = BigDecimal.ZERO;//变动金额 |
| | | if (null != goodsSeckill) { |
| | | variableAmount=goodsSeckill.getSellingPrice(); |
| | | }else { |
| | | variableAmount=good.getSellingPrice(); |
| | | variableAmount = goodsSeckill.getSellingPrice(); |
| | | } else { |
| | | variableAmount = good.getSellingPrice(); |
| | | } |
| | | |
| | | BigDecimal balance=shop.getBalance().subtract(variableAmount);//变动后余额 |
| | | BigDecimal balance = shop.getBalance().subtract(variableAmount);//变动后余额 |
| | | |
| | | shop.setBalance(balance); |
| | | shopClient.updateShop(shop); |
| | |
| | | shopBalanceStatementClient.saveShopBalanceStatement(shopBalanceStatement); |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | OrderGood orderGood = orderGoodMapper.selectOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0)); |
| | | orderInfo.setGoodsNum(1); |
| | | orderInfo.setGoodsJson(orderGood.getGoodJson()); |
| | | if (null != orderGood.getSeckillJson()&& !"".equals(orderGood.getSeckillJson())) { |
| | | if (null != orderGood.getSeckillJson() && !"".equals(orderGood.getSeckillJson())) { |
| | | orderInfo.setSeckillJson(orderGood.getSeckillJson()); |
| | | orderInfo.setActivityName("秒杀活动"); |
| | | } |
| | | |
| | | |
| | | |
| | | orderInfo.setPoint(order.getPoint()); |
| | |
| | | public Integer getShopSaleNum(Integer shopId, Integer type) { |
| | | return this.baseMapper.getShopSaleNum(shopId, type); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public Integer getShopSaleNumByShopIds(List<Integer> shopIds, Integer type) { |
| | |
| | | * 确认订单 |
| | | */ |
| | | @Override |
| | | public ConfirmOrderVo confirmOrder(Integer goodId,Integer type) { |
| | | ConfirmOrderVo confirmOrderVo=new ConfirmOrderVo(); |
| | | public ConfirmOrderVo confirmOrder(Integer goodId, Integer type) { |
| | | ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo(); |
| | | //用户信息 |
| | | Long userid = tokenService.getLoginUserApplet().getUserid(); |
| | | AppUser appUser = appUserClient.getAppUserById(userid); |
| | | //获取商品信息 |
| | | Goods good = goodsClient.getGoodsById(goodId).getData(); |
| | | if (null == good||good.getDelFlag()==1||good.getStatus()==0) { |
| | | if (null == good || good.getDelFlag() == 1 || good.getStatus() == 0) { |
| | | //商品不存在 |
| | | throw new ServiceException("商品不存在"); |
| | | } |
| | |
| | | |
| | | GoodsShop shop = goodsShopClient.getGoodsShop(goodId).getData(); |
| | | System.out.println(shop); |
| | | if (null == shop){ |
| | | if (null == shop) { |
| | | //门店不存在 |
| | | throw new ServiceException("该商品门店不存在"); |
| | | } |
| | |
| | | info.setGoodsId(goodId); |
| | | GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); |
| | | |
| | | if (null != goodsSeckill){ |
| | | if (null != goodsSeckill) { |
| | | SeckillActivityInfo activityInfo = seckillActivityInfoClient.getSeckillActivityInfoById(goodsSeckill.getSeckillActivityInfoId()).getData(); |
| | | //价格 |
| | | confirmOrderVo.setCash(goodsSeckill.getSellingPrice());//秒杀活动价格 |
| | |
| | | |
| | | //计算积分抵扣的金额 将积分转为金额,去掉小数 |
| | | //实际抵扣金额 |
| | | BigDecimal deduction= maxPointDeductionAmount.min(confirmOrderVo.getCash()); |
| | | BigDecimal deduction = maxPointDeductionAmount.min(confirmOrderVo.getCash()); |
| | | confirmOrderVo.setDeduction(deduction); |
| | | }else {//积分 |
| | | } else {//积分 |
| | | confirmOrderVo.setOrderPoint(confirmOrderVo.getPoint()); |
| | | } |
| | | //限购检查 |
| | | //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) |
| | | if(null == confirmOrderVo.getPurchaseLimitNum() || -1 == confirmOrderVo.getPurchaseLimitNum()){ |
| | | if (null == confirmOrderVo.getPurchaseLimitNum() || -1 == confirmOrderVo.getPurchaseLimitNum()) { |
| | | confirmOrderVo.setIsPurchaseLimit(false); |
| | | confirmOrderVo.setPurchaseLimitNum(-1); |
| | | }else{ |
| | | } else { |
| | | // 查当前用户的订单 |
| | | List<Order> orders = this.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.isEmpty()){ |
| | | if (!orderIds.isEmpty()) { |
| | | //关于该商品的订单 |
| | | List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) |
| | | .eq(OrderGood::getGoodsId, good.getId()).eq(OrderGood::getDelFlag, 0)); |
| | |
| | | public R orderPayment(OrderPayment orderPayment) { |
| | | Long userid = tokenService.getLoginUserApplet().getUserid(); |
| | | AppUser appUser = appUserClient.getAppUserById(userid); |
| | | int type=1;//商品类型 1=普通商品,2=秒杀商品 |
| | | int type = 1;//商品类型 1=普通商品,2=秒杀商品 |
| | | //商品信息 |
| | | Goods goods = goodsClient.getGoodsById(orderPayment.getGoodId()).getData(); |
| | | String goodsJson= JSON.toJSONString(goods); |
| | | if (null == goods || 1==goods.getDelFlag()){ |
| | | return R.fail( "商品不存在"); |
| | | String goodsJson = JSON.toJSONString(goods); |
| | | if (null == goods || 1 == goods.getDelFlag()) { |
| | | return R.fail("商品不存在"); |
| | | } |
| | | if(goods.getStatus() == 1){ |
| | | if (goods.getStatus() == 1) { |
| | | return R.fail(goods.getName() + "商品已被下架"); |
| | | } |
| | | |
| | |
| | | info.setGoodsId(orderPayment.getGoodId()); |
| | | GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); |
| | | |
| | | if (null != goodsSeckill){ |
| | | if (null != goodsSeckill) { |
| | | //秒杀商品 |
| | | type=2; |
| | | type = 2; |
| | | //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) |
| | | Integer goodsSaleNum = orderMapper.getGoodsSaleNum(orderPayment.getGoodId(), 2, userid);//已购买数量 |
| | | SeckillActivityInfo activityInfo = seckillActivityInfoClient.getSeckillActivityInfoById(goodsSeckill.getSeckillActivityInfoId()).getData(); |
| | | if(null != activityInfo.getMaxNum() && -1 != activityInfo.getMaxNum() && (goodsSaleNum + 1) > activityInfo.getMaxNum()){ |
| | | if (null != activityInfo.getMaxNum() && -1 != activityInfo.getMaxNum() && (goodsSaleNum + 1) > activityInfo.getMaxNum()) { |
| | | return R.fail(goods.getName() + "已超出秒杀活动购买上限"); |
| | | } |
| | | //价格 |
| | | goods.setSellingPrice(goodsSeckill.getSellingPrice());//秒杀活动价格 |
| | | goods.setIntegral(goodsSeckill.getIntegral());//秒杀活动积分价格 |
| | | }else { |
| | | } else { |
| | | //普通商品 |
| | | //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) |
| | | Integer goodsSaleNum = orderMapper.getGoodsSaleNum(orderPayment.getGoodId(), 1, userid);//已购买数量 |
| | | //普通商品 |
| | | if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && (goodsSaleNum + 1) > goods.getPurchaseLimit()){ |
| | | if (null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && (goodsSaleNum + 1) > goods.getPurchaseLimit()) { |
| | | return R.fail(goods.getName() + "已超出购买上限"); |
| | | } |
| | | } |
| | | |
| | | //判断支付方式是否正确 |
| | | if(1 != orderPayment.getPaymentType() && 3 != orderPayment.getPaymentType()){ |
| | | if (1 != orderPayment.getPaymentType() && 3 != orderPayment.getPaymentType()) { |
| | | return R.fail("支付方式不正确"); |
| | | } |
| | | |
| | |
| | | //积分抵扣金额 |
| | | BigDecimal pointDeductionAmount = BigDecimal.ZERO; |
| | | |
| | | if(3 != orderPayment.getPaymentType()){ |
| | | if (3 != orderPayment.getPaymentType()) { |
| | | //现金支付 |
| | | orderMoney = goods.getSellingPrice(); |
| | | paymentMoney=orderMoney.setScale(2, RoundingMode.HALF_EVEN);; |
| | | paymentMoney = orderMoney.setScale(2, RoundingMode.HALF_EVEN); |
| | | ; |
| | | |
| | | //是否使用积分抵扣 |
| | | if (orderPayment.getIsPointDeduction() == 1) { |
| | | //积分抵扣金额 |
| | | Integer availablePoint = appUser.getAvailablePoint();//用户可用积分 |
| | | BigDecimal maxPointDeductionAmount = getCashByPoint(availablePoint);//最大可抵扣金额 |
| | | pointDeductionAmount=maxPointDeductionAmount.min(orderMoney);//实际抵扣金额 |
| | | pointDeductionAmount = maxPointDeductionAmount.min(orderMoney);//实际抵扣金额 |
| | | // 计算实际支付金额 |
| | | paymentMoney = orderMoney.subtract(pointDeductionAmount).setScale(2, RoundingMode.HALF_EVEN); |
| | | //计算消耗积分 |
| | | orderPoint=getPoint(pointDeductionAmount); |
| | | orderPoint = getPoint(pointDeductionAmount); |
| | | } |
| | | }else{ |
| | | } else { |
| | | //积分支付 |
| | | orderPoint=goods.getIntegral(); |
| | | orderPoint = goods.getIntegral(); |
| | | orderMoney = goods.getSellingPrice(); |
| | | Integer availablePoint = appUser.getAvailablePoint();//用户可用积分 |
| | | if(availablePoint.compareTo(orderPoint) < 0){ |
| | | if (availablePoint.compareTo(orderPoint) < 0) { |
| | | return R.fail("账户可用积分不足"); |
| | | } |
| | | } |
| | |
| | | order.setNum(1); |
| | | order.setGoodPics(goods.getHomePagePicture()); |
| | | order.setGoodName(goods.getName()); |
| | | order.setOrderStatus( 3 );//待使用 |
| | | order.setOrderStatus(3);//待使用 |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); |
| | | order.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); |
| | | order.setTotalAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN));//订单总金额 |
| | | order.setPointDeductionAmount(pointDeductionAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | order.setPaymentAmount(paymentMoney);//实际支付价格 |
| | | order.setPoint(orderPoint);//使用积分 |
| | | if (orderPayment.getPaymentType()==1 && orderPoint>0){//微信支付 但支付的积分也大于0 |
| | | if (orderPayment.getPaymentType() == 1 && orderPoint > 0) {//微信支付 但支付的积分也大于0 |
| | | order.setPayMethod(4);//组合支付 |
| | | }else { |
| | | } else { |
| | | order.setPayMethod(orderPayment.getPaymentType());//积分或者微信 |
| | | } |
| | | order.setPayStatus(1); |
| | |
| | | orderGood.setOrderId(order.getId()); |
| | | orderGood.setNum(1); |
| | | orderGood.setType(type); |
| | | if (2==type){ |
| | | if (2 == type) { |
| | | orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); |
| | | } |
| | | orderGood.setGoodJson(goodsJson); |
| | | orderGood.setDelFlag(0); |
| | | orderGood.setCreateTime(LocalDateTime.now()); |
| | | orderGood.setCashPayment(orderPayment.getPaymentType()==1 ? 1 : 0); |
| | | orderGood.setPointPayment(orderPayment.getPaymentType()==3 ? 1 : 0); |
| | | orderGood.setCashPayment(orderPayment.getPaymentType() == 1 ? 1 : 0); |
| | | orderGood.setPointPayment(orderPayment.getPaymentType() == 3 ? 1 : 0); |
| | | orderGood.setSellingPrice(goods.getSellingPrice()); |
| | | orderGood.setIntegral(goods.getIntegral()); |
| | | orderGoodService.save(orderGood); |
| | | |
| | | //开始构建支付信息 |
| | | if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ |
| | | if (BigDecimal.ZERO.compareTo(paymentMoney) > 0) { |
| | | paymentMoney = BigDecimal.ZERO; |
| | | } |
| | | //判断积分是否为零,积分支付 |
| | | if (0 != order.getPoint()){ |
| | | if (null==appUser.getAvailablePoint()){ |
| | | if (0 != order.getPoint()) { |
| | | if (null == appUser.getAvailablePoint()) { |
| | | appUser.setAvailablePoint(0); |
| | | } |
| | | if (null==appUser.getExchangePoint()){ |
| | | if (null == appUser.getExchangePoint()) { |
| | | appUser.setExchangePoint(0); |
| | | } |
| | | |
| | |
| | | Integer exchangePoint = appUser.getExchangePoint() + orderPoint;//兑换商品消费积分 |
| | | //扣减订单支付积分 |
| | | appUser.setAvailablePoint(availablePoint); |
| | | appUser.setExchangePoint(exchangePoint ); |
| | | appUser.setExchangePoint(exchangePoint); |
| | | appUser.setTotalPoint(appUser.getTotalPoint() + order.getPoint());//总积分 |
| | | //构建积分流水记录 |
| | | UserPoint userPoint = new UserPoint(); |
| | |
| | | |
| | | } |
| | | //判断需要支付的金额是否大于0 |
| | | if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){ |
| | | if (BigDecimal.ZERO.compareTo(paymentMoney) < 0) { |
| | | //调起微信支付 |
| | | String goodsNames = goods.getName(); |
| | | try { |
| | | R r = wechatPayService.unifiedOrder(order.getId().toString(), order.getOrderNumber(), paymentMoney.toString(), "购买单品商品",appUser.getWxOpenid(),"/order/order/orderPaymentCallback"); |
| | | if (null == r || 200 != r.getCode()){ |
| | | R r = wechatPayService.unifiedOrder(order.getId().toString(), order.getOrderNumber(), paymentMoney.toString(), "购买单品商品", appUser.getWxOpenid(), "/order/order/orderPaymentCallback"); |
| | | if (null == r || 200 != r.getCode()) { |
| | | //支付失败,积分回退 ,删除订单 |
| | | //检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除 |
| | | if (order.getPoint()>0) { |
| | | if (order.getPoint() > 0) { |
| | | //返回订单抵扣积分 |
| | | AppUser appUser2 = appUserClient.getAppUserById(order.getAppUserId()); |
| | | Integer availablePoint = appUser2.getAvailablePoint();//可用积分 |
| | |
| | | long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); |
| | | redisTemplate.opsForZSet().add("OrderPayment", order.getId(), second); |
| | | return r; |
| | | }catch (Exception e){ |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | |
| | | |
| | | //门店增加冻结资金 即增加余额, 冻结资金=余额-可用资金 |
| | | Shop shop = shopClient.getShopById(order.getShopId()).getData(); |
| | | if (null==shop.getBalance()){ |
| | | if (null == shop.getBalance()) { |
| | | shop.setBalance(BigDecimal.ZERO); |
| | | } |
| | | |
| | | BigDecimal historicalBalance=shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount=goods.getSellingPrice();//变动金额 |
| | | BigDecimal balance=shop.getBalance().add(goods.getSellingPrice());//变动后余额 |
| | | BigDecimal historicalBalance = shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount = goods.getSellingPrice();//变动金额 |
| | | BigDecimal balance = shop.getBalance().add(goods.getSellingPrice());//变动后余额 |
| | | |
| | | shop.setBalance(balance); |
| | | shop.setOrderNumber(shop.getOrderNumber()+1); |
| | | shop.setOrderNumber(shop.getOrderNumber() + 1); |
| | | shopClient.updateShop(shop); |
| | | |
| | | //门店余额流水记录 |
| | |
| | | shopBalanceStatement.setObjectId(order.getId()); |
| | | shopBalanceStatementClient.saveShopBalanceStatement(shopBalanceStatement); |
| | | Map<String, String> payParams = new HashMap<>(); |
| | | payParams.put("payMethod","3");//给前端标识 3-不需要调微信支付 |
| | | payParams.put("orderId",order.getId().toString()); |
| | | return R.ok(JSON.toJSONString(payParams)); |
| | | // payParams.put("payMethod","3");//给前端标识 3-不需要调微信支付 |
| | | // payParams.put("orderId",order.getId().toString()); |
| | | return R.ok(order.getId().toString()); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public R orderPaymentCallback(PayResult payResult) { |
| | | Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, payResult.getOrderNumber())); |
| | | if(null == order || order.getPayStatus() == 2){ |
| | | if (null == order || order.getPayStatus() == 2) { |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | GoodsSeckill goodsSeckill = JSON.parseObject(orderGood.getSeckillJson(), GoodsSeckill.class); |
| | | //门店增加冻结资金 即增加金额, 冻结资金=余额-可用资金 |
| | | Shop shop = shopClient.getShopById(order.getShopId()).getData(); |
| | | BigDecimal historicalBalance=shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount=BigDecimal.ZERO;//变动金额 |
| | | BigDecimal historicalBalance = shop.getBalance();//历史余额 |
| | | BigDecimal variableAmount = BigDecimal.ZERO;//变动金额 |
| | | if (null != goodsSeckill) { |
| | | variableAmount=goodsSeckill.getSellingPrice(); |
| | | }else { |
| | | variableAmount=goods.getSellingPrice(); |
| | | variableAmount = goodsSeckill.getSellingPrice(); |
| | | } else { |
| | | variableAmount = goods.getSellingPrice(); |
| | | } |
| | | BigDecimal balance=shop.getBalance().add(variableAmount);//变动后余额 |
| | | BigDecimal balance = shop.getBalance().add(variableAmount);//变动后余额 |
| | | |
| | | shop.setBalance(balance); |
| | | shop.setOrderNumber(shop.getOrderNumber()+1); |
| | | shop.setOrderNumber(shop.getOrderNumber() + 1); |
| | | shopClient.updateShop(shop); |
| | | |
| | | //门店金额变动记录 |
| | |
| | | //订单支付数据 |
| | | long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); |
| | | Set<String> orderPayment = redisTemplate.opsForZSet().rangeByScore("OrderPayment", 0, second); |
| | | if(orderPayment.size() > 0){ |
| | | if (orderPayment.size() > 0) { |
| | | List<Order> list = orderMapper.selectList(new LambdaQueryWrapper<Order>().in(Order::getId, orderPayment)); |
| | | for (Order order : list) { |
| | | if(null == order || order.getPayStatus() != 1){ |
| | | if (null == order || order.getPayStatus() != 1) { |
| | | redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); |
| | | continue; |
| | | } |
| | | //开始执行关闭订单操作 |
| | | Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber()); |
| | | if((null == map || !map.get("return_code").equals("SUCCESS"))){ |
| | | if ((null == map || !map.get("return_code").equals("SUCCESS"))) { |
| | | redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), 0); |
| | | log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg")); |
| | | } |
| | | redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); |
| | | //关闭订单后,检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除, 删除订单 |
| | | if (order.getPoint()>0) { |
| | | if (order.getPoint() > 0) { |
| | | //返回订单抵扣积分 |
| | | AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); |
| | | Integer availablePoint = appUser.getAvailablePoint();//可用积分 |
| | |
| | | queryWrapper.eq("shop_id", shopId); |
| | | } |
| | | // 添加订单状态条件 |
| | | if (status != null&&status==4) { //4-已完成 8-已评价 |
| | | queryWrapper.in("order_status",Arrays.asList(4,8)); |
| | | if (status != null && status == 4) { //4-已完成 8-已评价 |
| | | queryWrapper.in("order_status", Arrays.asList(4, 8)); |
| | | } |
| | | if (status != null&&status!=4) {//3-待核销 5-已取消 |
| | | queryWrapper.eq("order_status",status); |
| | | if (status != null && status != 4) {//3-待核销 5-已取消 |
| | | queryWrapper.eq("order_status", status); |
| | | } |
| | | // 模糊查询条件 |
| | | if (StringUtils.isNotBlank(content)) { |
| | | //根据手机号查询用户id |
| | | List<Long> ids= new ArrayList<>(); |
| | | List<Long> ids = new ArrayList<>(); |
| | | List<AppUser> data = appUserClient.getAppUserByPhone(content).getData(); |
| | | if (data != null && !data.isEmpty()) { |
| | | ids=data.stream().map(AppUser::getId).collect(Collectors.toList()); |
| | | ids = data.stream().map(AppUser::getId).collect(Collectors.toList()); |
| | | } |
| | | // 构建OR条件组:订单编号/商品名/手机号 |
| | | if (null != ids && !ids.isEmpty()) { |
| | | queryWrapper.in("app_user_id",ids); |
| | | queryWrapper.in("app_user_id", ids); |
| | | } |
| | | |
| | | queryWrapper.and(wrapper -> wrapper |
| | |
| | | |
| | | /** |
| | | * 后台-工作台-折线图 |
| | | * |
| | | * @param startTime |
| | | * @param endTime |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<OrderStatisticsDetail> getOrderListGroupByDate(LocalDate startTime, LocalDate endTime,Integer shopId) { |
| | | public List<OrderStatisticsDetail> getOrderListGroupByDate(LocalDate startTime, LocalDate endTime, Integer shopId) { |
| | | // 查询数据库获取原始数据 |
| | | List<OrderStatisticsDetail> rawData = orderMapper.getOrderListGroupByDate( |
| | | startTime.atTime(0,0, 0), |
| | | endTime.atTime(23,59,59), |
| | | startTime.atTime(0, 0, 0), |
| | | endTime.atTime(23, 59, 59), |
| | | shopId |
| | | ); |
| | | |
| | |
| | | return completeList; |
| | | } |
| | | |
| | | @Override |
| | | public R importExpress(MultipartFile file) { |
| | | List<Shop> shops = shopClient.getAllShop().getData(); |
| | | List<Goods> goods = goodsClient.getAllGoods().getData(); |
| | | List<Order> orderList = new ArrayList<>(); |
| | | List<String> orderNumberList = new ArrayList<>(); |
| | | List<OrderGood> orderGoodsList = new ArrayList<>(); |
| | | cn.hutool.json.JSONObject result = new cn.hutool.json.JSONObject(); |
| | | try (InputStream inputStream = file.getInputStream(); |
| | | Workbook workbook = new XSSFWorkbook(inputStream)) { |
| | | // Workbook workbook = new XSSFWorkbook(fileInputStream); |
| | | Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet |
| | | int lastRowNum = sheet.getLastRowNum(); |
| | | for (int i = 1; i <= lastRowNum; i++) {//第二行开始 |
| | | Row row = sheet.getRow(i); |
| | | // 订单状态 |
| | | if (row.getCell(0) == null) { |
| | | throw new ServiceException("第" + i + "行订单状态为空", 500); |
| | | } |
| | | row.getCell(0).setCellType(CellType.STRING); |
| | | String orderStatus = row.getCell(0).getStringCellValue(); |
| | | |
| | | // 订单编号 |
| | | if (row.getCell(1) == null) { |
| | | throw new ServiceException("第" + i + "行订单编号为空", 500); |
| | | } |
| | | row.getCell(1).setCellType(CellType.STRING); |
| | | String orderNum = row.getCell(1).getStringCellValue(); |
| | | |
| | | // 订单类型 |
| | | if (row.getCell(2) == null) { |
| | | throw new ServiceException("第" + i + "行订单类型为空", 500); |
| | | } |
| | | row.getCell(2).setCellType(CellType.STRING); |
| | | String orderType = row.getCell(2).getStringCellValue(); |
| | | |
| | | // 下单时间 |
| | | Cell beginTimeCell = row.getCell(3); |
| | | if (beginTimeCell == null) { |
| | | throw new ServiceException("第" + (i + 1) + "行下单时间为空", 500); |
| | | } |
| | | LocalDateTime beginTime; |
| | | if (beginTimeCell.getCellType() == CellType.NUMERIC || DateUtil.isCellDateFormatted(beginTimeCell)) { |
| | | // 处理数值型日期(包括Excel内置日期格式) |
| | | beginTime = beginTimeCell.getDateCellValue().toInstant() |
| | | .atZone(ZoneId.systemDefault()) |
| | | .toLocalDateTime(); |
| | | } else { |
| | | // 处理文本型日期(如 "2025/4/3 23:25:38") |
| | | String dateStr = beginTimeCell.getStringCellValue().trim(); |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/M/d H:mm:ss"); |
| | | beginTime = LocalDateTime.parse(dateStr, formatter); |
| | | } |
| | | |
| | | |
| | | // 下单用户 |
| | | if (row.getCell(4) == null) { |
| | | throw new ServiceException("第" + i + "行下单用户为空", 500); |
| | | } |
| | | row.getCell(4).setCellType(CellType.STRING); |
| | | String userName = row.getCell(4).getStringCellValue(); |
| | | |
| | | // 联系电话 |
| | | if (row.getCell(5) == null) { |
| | | throw new ServiceException("第" + i + "行联系方式为空", 500); |
| | | } |
| | | row.getCell(5).setCellType(CellType.STRING); |
| | | String phone = row.getCell(5).getStringCellValue(); |
| | | |
| | | // 商品名称 |
| | | if (row.getCell(6) == null) { |
| | | throw new ServiceException("第" + i + "行商品名称为空", 500); |
| | | } |
| | | row.getCell(6).setCellType(CellType.STRING); |
| | | String goodsName = row.getCell(6).getStringCellValue(); |
| | | |
| | | // 店铺名称 |
| | | if (row.getCell(7) == null) { |
| | | throw new ServiceException("第" + i + "行店铺名称为空", 500); |
| | | } |
| | | row.getCell(7).setCellType(CellType.STRING); |
| | | String shopName = row.getCell(7).getStringCellValue(); |
| | | |
| | | // 商品售价 |
| | | if (row.getCell(8) == null) { |
| | | throw new ServiceException("第" + i + "行商品售价为空", 500); |
| | | } |
| | | row.getCell(8).setCellType(CellType.STRING); |
| | | String sellingPrice = row.getCell(8).getStringCellValue(); |
| | | |
| | | // 支付方式 |
| | | if (row.getCell(9) == null) { |
| | | throw new ServiceException("第" + i + "行支付方式为空", 500); |
| | | } |
| | | row.getCell(9).setCellType(CellType.STRING); |
| | | String payType = row.getCell(9).getStringCellValue(); |
| | | // 支付积分 |
| | | String pointPayment; |
| | | if (row.getCell(10) == null) { |
| | | pointPayment="0"; |
| | | }else{ |
| | | row.getCell(10).setCellType(CellType.STRING); |
| | | pointPayment = row.getCell(10).getStringCellValue(); |
| | | } |
| | | |
| | | // 支付金额 |
| | | String cashPayment; |
| | | if (row.getCell(11) == null) { |
| | | cashPayment = "0"; |
| | | }else{ |
| | | row.getCell(11).setCellType(CellType.STRING); |
| | | cashPayment = row.getCell(11).getStringCellValue(); |
| | | } |
| | | |
| | | |
| | | //数据库中是否存在 |
| | | Order order = this.getOne(new LambdaQueryWrapper<Order>() |
| | | .eq(Order::getOrderNumber, orderNum) |
| | | ); |
| | | if (order != null) { |
| | | // throw new ServiceException("数据库中订单已存在:" + orderNum, 500); |
| | | result.append("订单号:[", orderNum + "]数据库中订单已存在"); |
| | | continue; |
| | | } |
| | | AppUser appuser = appUserClient.getAppUserByPhone1(phone).getData(); |
| | | if (null == appuser) { |
| | | //创建用户 |
| | | appuser = new AppUser(); |
| | | appuser.setPhone(phone); |
| | | appuser.setStatus(1); |
| | | appuser.setAvatar(DEFAULT_AVATAR_URL); |
| | | appuser.setCreateTime(LocalDateTime.now()); |
| | | appuser.setDelFlag(false); |
| | | appuser.setName(appuser.getPhone().substring(0, 3) + "****" + appuser.getPhone().substring(7)); |
| | | appuser.setRechargePoint(0); |
| | | appuser.setAvailablePoint(0); |
| | | appuser.setTotalPoint(0); |
| | | Long userId = appUserClient.saveOrUpdateAppUser(appuser); |
| | | appuser.setId(userId); |
| | | } |
| | | if (!orderNumberList.contains(orderNum)){ |
| | | orderNumberList.add(orderNum); |
| | | Order order1 = new Order(); |
| | | order1.setAppUserId(appuser.getId()); |
| | | switch (orderStatus){ |
| | | case "待使用": |
| | | order1.setOrderStatus(3); |
| | | order1.setOldOrderStatus(3); |
| | | break; |
| | | case "已完成": |
| | | order1.setOrderStatus(4); |
| | | order1.setOldOrderStatus(4); |
| | | break; |
| | | case "已取消": |
| | | order1.setOrderStatus(5); |
| | | order1.setOldOrderStatus(5); |
| | | break; |
| | | case "已评价": |
| | | order1.setOrderStatus(8); |
| | | order1.setOldOrderStatus(8); |
| | | break; |
| | | } |
| | | order1.setOrderNumber(orderNum); |
| | | |
| | | order1.setPayStatus(2); |
| | | Shop shop = shops.stream().filter(e -> e.getName().equals(shopName)).findFirst().orElse(null); |
| | | if (shop!=null){ |
| | | order1.setShopId(shop.getId()); |
| | | } |
| | | order1.setDelFlag(0); |
| | | order1.setCreateTime(LocalDateTime.now()); |
| | | orderList.add(order1);//添加到订单集合中 |
| | | } |
| | | |
| | | OrderGood orderGood = new OrderGood(); |
| | | Shop shop = shops.stream().filter(e -> e.getName().equals(shopName)).findFirst().orElse(null); |
| | | if (shop!=null){ |
| | | Goods goods1 = goods.stream().filter(e -> e.getName().equals(goodsName) |
| | | && e.getShopId().equals(shop.getId())).findFirst().orElse(null); |
| | | if(goods1!=null){ |
| | | orderGood.setGoodsId(goods1.getId()); |
| | | orderGood.setSellingPrice(goods1.getSellingPrice()); |
| | | orderGood.setIntegral(goods1.getIntegral()); |
| | | } |
| | | } |
| | | orderGood.setDelFlag(0); |
| | | orderGood.setCreateTime(LocalDateTime.now()); |
| | | orderGood.setCashPayment(cashPayment.equals("0")?0:1); |
| | | orderGood.setPointPayment(pointPayment.equals("0")?0:1); |
| | | orderGood.setCashPaymentValue(new BigDecimal(cashPayment)); |
| | | orderGood.setPointPaymentValue(Integer.parseInt(pointPayment)); |
| | | orderGood.setOrderNumber(orderNum); |
| | | orderGoodsList.add(orderGood); |
| | | |
| | | } |
| | | |
| | | |
| | | // 新增数据 |
| | | for (Order order : orderList) { |
| | | List<OrderGood> orderGoods = orderGoodsList.stream().filter(e -> e.getOrderNumber().equals(order.getOrderNumber())).collect(Collectors.toList()); |
| | | BigDecimal totalAmount = orderGoods.stream().map(OrderGood::getCashPaymentValue).reduce(BigDecimal::add).get(); |
| | | Integer totalIntegral = orderGoods.stream().map(OrderGood::getIntegral).reduce(Integer::sum).get(); |
| | | order.setNum(orderGoods.size()); |
| | | order.setTotalAmount(totalAmount); |
| | | order.setPaymentAmount(totalAmount); |
| | | order.setPoint(totalIntegral); |
| | | if (totalAmount.compareTo(BigDecimal.ZERO)!=0&&totalIntegral!=0){ |
| | | order.setPayMethod(4); |
| | | }else if (totalAmount.compareTo(BigDecimal.ZERO)!=0){ |
| | | order.setPayMethod(1); |
| | | }else if (totalIntegral!=0){ |
| | | order.setPayMethod(3); |
| | | } |
| | | this.save(order); |
| | | for (OrderGood orderGood : orderGoods) { |
| | | orderGood.setOrderId(order.getId()); |
| | | } |
| | | orderGoodService.saveBatch(orderGoods); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | if (!result.isEmpty()) { |
| | | return R.ok(result); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | private static final String DEFAULT_AVATAR_URL = "http://qijishenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/admin/58084a0ce8c34dc79f9d8b4c0bc3774a.png"; |
| | | |
| | | |
| | | private OrderPageListVo convertToOrderListVo(Order order) { |
| | | OrderPageListVo vo = new OrderPageListVo(); |
| | |
| | | } |
| | | |
| | | |
| | | public String getNumber(Integer size){ |
| | | public String getNumber(Integer size) { |
| | | StringBuilder str = new StringBuilder(); |
| | | for (int i = 0; i < size; i++) { |
| | | str.append(Double.valueOf(Math.random() * 10).intValue()); |
| | |
| | | /** |
| | | * 获取现金对应积分 |
| | | */ |
| | | public Integer getPoint(BigDecimal cash){ |
| | | public Integer getPoint(BigDecimal cash) { |
| | | if (cash == null || cash.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new IllegalArgumentException("金额不能为null或负数"); |
| | | } |
| | |
| | | /** |
| | | * 获取积分对应金额 |
| | | */ |
| | | public BigDecimal getCashByPoint(Integer point){ |
| | | public BigDecimal getCashByPoint(Integer point) { |
| | | // 参数校验 |
| | | if (point == null || point < 0) { |
| | | throw new IllegalArgumentException("积分值不能为null或负数"); |