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
}