package com.kym.service.miniapp.impl; import cn.dev33.satoken.stp.StpUtil; import com.github.pagehelper.PageHelper; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.kym.common.exception.BusinessException; import com.kym.common.utils.CommUtil; import com.kym.common.utils.OrderUtils; import com.kym.entity.common.PageBean; import com.kym.entity.common.PageParams; import com.kym.entity.miniapp.Account; import com.kym.entity.miniapp.User; import com.kym.entity.miniapp.WashOrder; import com.kym.entity.miniapp.queryParams.DeviceQueryParams; import com.kym.entity.miniapp.queryParams.WashOrderQueryParams; import com.kym.entity.miniapp.vo.WashOrderVo; import com.kym.mapper.miniapp.WashOrderMapper; import com.kym.service.awoara.AwoaraService; import com.kym.service.cache.KymCache; import com.kym.service.miniapp.AccountService; import com.kym.service.miniapp.WashOrderService; import com.kym.service.mybatisplus.MyBaseServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; /** *

* 洗车订单表 服务实现类 *

* * @author skyline * @since 2024-09-11 */ @Service public class WashOrderServiceImpl extends MyBaseServiceImpl implements WashOrderService { private final AwoaraService awoaraService; private final AccountService accountService; public WashOrderServiceImpl(AwoaraService awoaraService, AccountService accountService) { this.awoaraService = awoaraService; this.accountService = accountService; } /** * 创建订单(启动洗车机) * * @param params * @return */ @Override public String createOrder(DeviceQueryParams params) { // 校验余额 var account = accountService.getAccountByUserId(StpUtil.getLoginIdAsLong()); if (account.getBalance() < Account.MIN_BALANCE) { throw new BusinessException("余额不足,请保持余额不低于2元!"); } // 校验用户是否有未完结的订单 var unfinishedOrder = lambdaQuery() .eq(WashOrder::getUserId, StpUtil.getLoginIdAsLong()) .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机) .or() .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付) .list(); if (!unfinishedOrder.isEmpty()) { throw new BusinessException("您有未完结的订单!"); } var memberName = StpUtil.getSession().getString(User.ST_SESSION_KEY_MOBILE); var orderId = OrderUtils.getOrderNo(); // 请求阿里云lot var createOrder = awoaraService.createOrder(params.getProductKey(), params.getDeviceName(), orderId, memberName, account.getBalance(), Account.NO_DISCOUNT, // 本次开机最大消费金额,减去0.5元,防止延时导致超消费 account.getBalance() - 50); var washOrder = new WashOrder() .setUserId(StpUtil.getLoginIdAsLong()) .setStationId(params.getStationId()) .setProductKey(params.getProductKey()) .setDeviceName(params.getDeviceName()) .setShortId(KymCache.INSTANCE.getShortIdByProductKeyAndDeviceName(params.getProductKey(), params.getDeviceName())) .setOpenType(WashOrder.START_CLOSE_TYPE_网络) .setOrderId(orderId) .setOrderIdLocal(createOrder.getOrder_id_local()) .setMemberDiscount(Account.NO_DISCOUNT) .setPrepayMoney(account.getBalance() - 50) .setStartTime(LocalDateTime.now()) .setOrderStatus(WashOrder.ORDER_STATUS_开机) .setPayStatus(WashOrder.PAY_STATUS_未支付); save(washOrder); return orderId; } @Override public void closeOrder(DeviceQueryParams params) { var order = lambdaQuery() .eq(WashOrder::getProductKey, params.getProductKey()) .eq(WashOrder::getDeviceName, params.getDeviceName()) .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机) .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付) .one(); if (order != null) { if (order.getUserId() == StpUtil.getLoginIdAsLong()) { awoaraService.closeOrder(params.getProductKey(), params.getDeviceName(), order.getOrderId()); } else { throw new BusinessException("您没有权限关闭该订单!"); } } } /** * 查询订单详情 * * @param params * @return */ @Override public WashOrder queryOrder(WashOrderQueryParams params) { // 非实时数据 WashOrder order = lambdaQuery() .eq(WashOrder::getOrderId, params.getOrderId()) .one(); if(null!=params.getUserId()){ CommUtil.asserts(null!=order && order.getUserId().equals(StpUtil.getLoginIdAsLong()), "订单不存在或您没有权限查看该订单!"); } return order; } /** * 当前用户订单列表 * * @param params * @return */ @Override public PageBean listMyWashOrder(PageParams params) { PageHelper.startPage(params.getPageNum(), params.getPageSize()); var res = lambdaQuery() .eq(WashOrder::getUserId, StpUtil.getLoginIdAsLong()) .orderByDesc(WashOrder::getId) .list(); var voList = res.stream().map(order -> { var vo = new WashOrderVo(); BeanUtils.copyProperties(order, vo); return vo; }).toList(); return new PageBean<>(voList); } //region 管理后台 @Override public PageBean list(WashOrderQueryParams params) { PageHelper.startPage(params.getPageNum(), params.getPageSize()); MPJLambdaWrapper wrapper = JoinWrappers.lambda(WashOrder.class) .selectAsClass(WashOrder.class, WashOrderVo.class) .selectAs(User::getMobilePhone, WashOrderVo::getMobilePhone) .leftJoin(User.class, User::getId,WashOrder::getUserId) .eq(CommUtil.isNotEmptyAndNull(params.getUserId()), WashOrder::getUserId, params.getUserId()) .eq(CommUtil.isNotEmptyAndNull(params.getMobilePhone()), User::getMobilePhone, params.getMobilePhone()) .eq(CommUtil.isNotEmptyAndNull(params.getOrderStatus()), WashOrder::getOrderStatus, params.getOrderStatus()) .eq(CommUtil.isNotEmptyAndNull(params.getPayStatus()), WashOrder::getPayStatus, params.getPayStatus()) .orderByDesc(WashOrder::getId); //连表查询 返回自定义ResultType List list = selectJoinList(WashOrderVo.class, wrapper); list.forEach(item -> { item.setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId())); }); return new PageBean<>(list); } @Override public WashOrder detail(long id) { return getById(id); } //endregion }