WashOrderServiceImpl.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.kym.service.miniapp.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import com.github.pagehelper.PageHelper;
  4. import com.github.yulichang.toolkit.JoinWrappers;
  5. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  6. import com.kym.common.exception.BusinessException;
  7. import com.kym.common.utils.CommUtil;
  8. import com.kym.common.utils.OrderUtils;
  9. import com.kym.entity.common.PageBean;
  10. import com.kym.entity.common.PageParams;
  11. import com.kym.entity.miniapp.Account;
  12. import com.kym.entity.miniapp.User;
  13. import com.kym.entity.miniapp.WashOrder;
  14. import com.kym.entity.miniapp.queryParams.DeviceQueryParams;
  15. import com.kym.entity.miniapp.queryParams.WashOrderQueryParams;
  16. import com.kym.entity.miniapp.vo.WashOrderVo;
  17. import com.kym.mapper.miniapp.WashOrderMapper;
  18. import com.kym.service.awoara.AwoaraService;
  19. import com.kym.service.cache.KymCache;
  20. import com.kym.service.miniapp.AccountService;
  21. import com.kym.service.miniapp.WashOrderService;
  22. import com.kym.service.mybatisplus.MyBaseServiceImpl;
  23. import org.springframework.beans.BeanUtils;
  24. import org.springframework.stereotype.Service;
  25. import java.time.LocalDateTime;
  26. import java.util.List;
  27. /**
  28. * <p>
  29. * 洗车订单表 服务实现类
  30. * </p>
  31. *
  32. * @author skyline
  33. * @since 2024-09-11
  34. */
  35. @Service
  36. public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, WashOrder> implements WashOrderService {
  37. private final AwoaraService awoaraService;
  38. private final AccountService accountService;
  39. public WashOrderServiceImpl(AwoaraService awoaraService, AccountService accountService) {
  40. this.awoaraService = awoaraService;
  41. this.accountService = accountService;
  42. }
  43. /**
  44. * 创建订单(启动洗车机)
  45. *
  46. * @param params
  47. * @return
  48. */
  49. @Override
  50. public String createOrder(DeviceQueryParams params) {
  51. // 校验余额
  52. var account = accountService.getAccountByUserId(StpUtil.getLoginIdAsLong());
  53. if (account.getBalance() < Account.MIN_BALANCE) {
  54. throw new BusinessException("余额不足,请保持余额不低于2元!");
  55. }
  56. // 校验用户是否有未完结的订单
  57. var unfinishedOrder = lambdaQuery()
  58. .eq(WashOrder::getUserId, StpUtil.getLoginIdAsLong())
  59. .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机)
  60. .or()
  61. .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付)
  62. .list();
  63. if (!unfinishedOrder.isEmpty()) {
  64. throw new BusinessException("您有未完结的订单!");
  65. }
  66. var memberName = StpUtil.getSession().getString(User.ST_SESSION_KEY_MOBILE);
  67. var orderId = OrderUtils.getOrderNo();
  68. // 请求阿里云lot
  69. var createOrder = awoaraService.createOrder(params.getProductKey(), params.getDeviceName(),
  70. orderId,
  71. memberName,
  72. account.getBalance(),
  73. Account.NO_DISCOUNT,
  74. // 本次开机最大消费金额,减去0.5元,防止延时导致超消费
  75. account.getBalance() - 50);
  76. var washOrder = new WashOrder()
  77. .setUserId(StpUtil.getLoginIdAsLong())
  78. .setStationId(params.getStationId())
  79. .setProductKey(params.getProductKey())
  80. .setDeviceName(params.getDeviceName())
  81. .setShortId(KymCache.INSTANCE.getShortIdByProductKeyAndDeviceName(params.getProductKey(), params.getDeviceName()))
  82. .setOpenType(WashOrder.START_CLOSE_TYPE_网络)
  83. .setOrderId(orderId)
  84. .setOrderIdLocal(createOrder.getOrder_id_local())
  85. .setMemberDiscount(Account.NO_DISCOUNT)
  86. .setPrepayMoney(account.getBalance() - 50)
  87. .setStartTime(LocalDateTime.now())
  88. .setOrderStatus(WashOrder.ORDER_STATUS_开机)
  89. .setPayStatus(WashOrder.PAY_STATUS_未支付);
  90. save(washOrder);
  91. return orderId;
  92. }
  93. @Override
  94. public void closeOrder(DeviceQueryParams params) {
  95. var order = lambdaQuery()
  96. .eq(WashOrder::getProductKey, params.getProductKey())
  97. .eq(WashOrder::getDeviceName, params.getDeviceName())
  98. .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机)
  99. .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付)
  100. .one();
  101. if (order != null) {
  102. if (order.getUserId() == StpUtil.getLoginIdAsLong()) {
  103. awoaraService.closeOrder(params.getProductKey(), params.getDeviceName(), order.getOrderId());
  104. } else {
  105. throw new BusinessException("您没有权限关闭该订单!");
  106. }
  107. }
  108. }
  109. /**
  110. * 查询订单详情
  111. *
  112. * @param params
  113. * @return
  114. */
  115. @Override
  116. public WashOrder queryOrder(WashOrderQueryParams params) {
  117. // 非实时数据
  118. WashOrder order = lambdaQuery()
  119. .eq(WashOrder::getOrderId, params.getOrderId())
  120. .one();
  121. if(null!=params.getUserId()){
  122. CommUtil.asserts(null!=order && order.getUserId().equals(StpUtil.getLoginIdAsLong()),
  123. "订单不存在或您没有权限查看该订单!");
  124. }
  125. return order;
  126. }
  127. /**
  128. * 当前用户订单列表
  129. *
  130. * @param params
  131. * @return
  132. */
  133. @Override
  134. public PageBean<WashOrderVo> listMyWashOrder(PageParams params) {
  135. PageHelper.startPage(params.getPageNum(), params.getPageSize());
  136. var res = lambdaQuery()
  137. .eq(WashOrder::getUserId, StpUtil.getLoginIdAsLong())
  138. .orderByDesc(WashOrder::getId)
  139. .list();
  140. var voList = res.stream().map(order -> {
  141. var vo = new WashOrderVo();
  142. BeanUtils.copyProperties(order, vo);
  143. return vo;
  144. }).toList();
  145. return new PageBean<>(voList);
  146. }
  147. //region 管理后台
  148. @Override
  149. public PageBean<WashOrderVo> list(WashOrderQueryParams params) {
  150. PageHelper.startPage(params.getPageNum(), params.getPageSize());
  151. MPJLambdaWrapper<WashOrder> wrapper = JoinWrappers.lambda(WashOrder.class)
  152. .selectAsClass(WashOrder.class, WashOrderVo.class)
  153. .selectAs(User::getMobilePhone, WashOrderVo::getMobilePhone)
  154. .leftJoin(User.class, User::getId,WashOrder::getUserId)
  155. .eq(CommUtil.isNotEmptyAndNull(params.getUserId()), WashOrder::getUserId, params.getUserId())
  156. .eq(CommUtil.isNotEmptyAndNull(params.getMobilePhone()), User::getMobilePhone, params.getMobilePhone())
  157. .eq(CommUtil.isNotEmptyAndNull(params.getOrderStatus()), WashOrder::getOrderStatus, params.getOrderStatus())
  158. .eq(CommUtil.isNotEmptyAndNull(params.getPayStatus()), WashOrder::getPayStatus, params.getPayStatus())
  159. .orderByDesc(WashOrder::getId);
  160. //连表查询 返回自定义ResultType
  161. List<WashOrderVo> list = selectJoinList(WashOrderVo.class, wrapper);
  162. list.forEach(item -> {
  163. item.setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId()));
  164. });
  165. return new PageBean<>(list);
  166. }
  167. @Override
  168. public WashOrder detail(long id) {
  169. return getById(id);
  170. }
  171. //endregion
  172. }