TOrderServiceImpl.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. package com.ylx.massage.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  9. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  10. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.ylx.common.constant.MassageConstants;
  13. import com.ylx.common.core.domain.R;
  14. import com.ylx.common.exception.ServiceException;
  15. import com.ylx.massage.domain.*;
  16. import com.ylx.massage.domain.vo.CouponReceiveVo;
  17. import com.ylx.massage.enums.BillTypeEnum;
  18. import com.ylx.massage.enums.DiscountTypeEnum;
  19. import com.ylx.massage.enums.JsStatusEnum;
  20. import com.ylx.massage.enums.OrderStatusEnum;
  21. import com.ylx.massage.mapper.TOrderMapper;
  22. import com.ylx.massage.service.*;
  23. import com.ylx.massage.utils.DateTimeUtils;
  24. import com.ylx.massage.utils.MassageUtil;
  25. import com.ylx.massage.utils.OrderNumberGenerator;
  26. import com.ylx.massage.utils.WeChatUtil;
  27. import lombok.extern.slf4j.Slf4j;
  28. import org.apache.commons.compress.utils.Lists;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import javax.annotation.Resource;
  32. import java.math.BigDecimal;
  33. import java.math.RoundingMode;
  34. import java.time.LocalDateTime;
  35. import java.util.*;
  36. import java.util.stream.Collectors;
  37. /**
  38. * 订单表 服务实现类
  39. */
  40. @Service
  41. @Slf4j
  42. public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
  43. @Resource
  44. private TOrderMapper orderMapper;
  45. @Resource
  46. private TWxUserService wxUserService;
  47. @Resource
  48. private TRechargeService rechargeService;
  49. @Resource
  50. private TXiangmuService xiangmuService;
  51. @Resource
  52. private OrderNumberGenerator generator;
  53. @Resource
  54. private TJsService jsService;
  55. @Resource
  56. private TAddressService addressService;
  57. @Resource
  58. private TConsumptionLogService consumptionLogService;
  59. @Resource
  60. private MassageUtil massageUtil;
  61. @Resource
  62. private CouponReceiveService couponReceiveService;
  63. @Resource
  64. private CouponService couponService;
  65. @Resource
  66. private WeChatUtil weChatUtil;
  67. @Resource
  68. private RefundVoucherService refundVoucherService;
  69. public Boolean isFree(String jsId, BigDecimal distance) {
  70. TJs js = jsService.getById(jsId);
  71. Date date = new Date();
  72. //白天免车费(07.30-20.00)
  73. long current = Long.parseLong(DateTimeUtils.numTime(date));
  74. if (current >= MassageConstants.START_FREE && current <= MassageConstants.END_FREE) {
  75. if (js.getDaytimeMileage().compareTo(distance) >= 0) {
  76. //免车费
  77. return Boolean.TRUE;
  78. } else {
  79. return Boolean.FALSE;
  80. }
  81. } else {
  82. //夜间免车费(20.00-07.30)
  83. if (js.getNigthMileage().compareTo(distance) >= 0) {
  84. //免车费
  85. return Boolean.TRUE;
  86. } else {
  87. return Boolean.FALSE;
  88. }
  89. }
  90. }
  91. /**
  92. * 添加订单
  93. *
  94. * @param order
  95. */
  96. @Override
  97. @Transactional(rollbackFor = Exception.class)
  98. public TOrder addOrder(TOrder order) {
  99. if (StringUtils.isBlank(order.getcJsId())) {
  100. throw new ServiceException("请选择技师");
  101. }
  102. if (order.getcGoods().isEmpty()) {
  103. throw new ServiceException("请选择项目");
  104. }
  105. //计算车费
  106. if (order.getDistance() != null) {
  107. //判断是否可以免车费
  108. if (!this.isFree(order.getcJsId(), order.getDistance())) {
  109. BigDecimal bigDecimal = massageUtil.calculateTaxiFare(order.getDistance());
  110. order.setFare(bigDecimal.setScale(MassageConstants.INTEGER_TWO, RoundingMode.HALF_UP));
  111. }
  112. }
  113. //优惠卷减免
  114. // List<CouponReceiveVo> coupons = couponReceiveService.getByOpenId(order.getcOpenId());
  115. // BigDecimal preferential = this.setCoupon(coupons);
  116. // order.setPreferential(preferential);
  117. //订单价格
  118. List<TXiangmu> list = JSONObject.parseArray(order.getcGoods().toJSONString(), TXiangmu.class);
  119. BigDecimal sum = list.stream().map(TXiangmu::getSum).reduce(BigDecimal.ZERO, BigDecimal::add);
  120. order.setdTotalMoney(sum);
  121. //总价 = 订单 + 车费 - 优惠
  122. order.setTotalPrice(sum.add(Optional.ofNullable(order.getFare()).orElse(BigDecimal.ZERO)));
  123. if (order.getParentNo() != null && order.getOrderType() == 2) {
  124. //升级订单 补差价
  125. TOrder partOrder = this.getByNo(order.getParentNo());
  126. order.setPriceDifference(order.getTotalPrice().subtract(partOrder.getTotalPrice()));
  127. }
  128. //获取用户默认地址
  129. TAddress address = addressService.getByOpenId(order.getcOpenId());
  130. if (address == null) {
  131. throw new ServiceException("请先添加地址");
  132. }
  133. order.setAddress(address.getAddress());
  134. order.setName(address.getName());
  135. order.setLatitude(address.getLatitude());
  136. order.setLongitude(address.getLongitude());
  137. order.setcPhone(address.getPhone());
  138. order.setcName(address.getUserName());
  139. order.setAtlasAdd(address.getAtlasAdd());
  140. order.setOrderNo(generator.generateNextOrderNumber(OrderNumberGenerator.KEY_PREFIX_ORDER));
  141. order.setnStatus(OrderStatusEnum.WAIT_PAY.getCode());
  142. order.setDtCreateTime(LocalDateTime.now());
  143. Date date = DateTimeUtils.addMinute(new Date(), 10);
  144. order.setcTime(DateTimeUtils.formatDate(date, "yyyy-MM-dd HH:mm:ss"));
  145. save(order);
  146. return order;
  147. }
  148. private BigDecimal setCoupon(List<CouponReceiveVo> coupons) {
  149. //过滤过期的优惠券
  150. coupons = coupons.stream().filter(coupon -> coupon.getExpirationTime().after(new Date())).collect(Collectors.toList());
  151. //无门槛优惠券
  152. List<CouponReceiveVo> collect = coupons.stream().filter(coupon -> coupon.getDiscountType().equals(DiscountTypeEnum.NO_THRESHOLD.getCode())).collect(Collectors.toList());
  153. //支付成功 后 删除优惠卷
  154. // couponReceiveService.removeCoupons(collect);
  155. //计算优惠金额
  156. return collect.stream().map(CouponReceiveVo::getDiscountValue).reduce(BigDecimal.ZERO, BigDecimal::add);
  157. }
  158. @Override
  159. public void payNotifyOrder(String outTradeNo) {
  160. //查询未支付的订单
  161. LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
  162. queryWrapper.eq(TOrder::getOrderNo, outTradeNo).eq(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY.getCode());
  163. TOrder orderNew = this.getOne(queryWrapper);
  164. if (orderNew == null) {
  165. log.error("订单 {} 未支付状态不存在", outTradeNo);
  166. return;
  167. }
  168. orderNew.setPayType(1);
  169. TWxUser user = wxUserService.getByOpenId(orderNew.getcOpenId());
  170. orderPayManage(user, orderNew);
  171. }
  172. /**
  173. * 支付订单
  174. *
  175. * @param order
  176. */
  177. @Override
  178. public R payOrder(TOrder order) throws Exception {
  179. // 根据orderid查询订单信息
  180. TOrder orderNew = getById(order.getcId());
  181. if (!orderNew.getnStatus().equals(OrderStatusEnum.WAIT_PAY.getCode())) {
  182. throw new ServiceException("该订单已经支付或者超时被取消");
  183. }
  184. if (StringUtils.isBlank(orderNew.getParentNo())) {
  185. TJs js = jsService.getById(orderNew.getcJsId());
  186. if (null == js || js.getnStatus().equals(JsStatusEnum.JS_SERVICE.getCode())) {
  187. throw new ServiceException("该技师已在服务中请重新下单");
  188. }
  189. }
  190. orderNew.setPayType(order.getPayType());
  191. if (StringUtils.isNotBlank(order.getCouponReceiveId())) {
  192. orderNew.setCouponReceiveId(order.getCouponReceiveId());
  193. CouponReceive couponReceive = couponReceiveService.getById(order.getCouponReceiveId());
  194. Coupon coupon = couponService.getById(couponReceive.getCouponId());
  195. //无门槛优惠券
  196. orderNew.setPreferential(coupon.getDiscountValue());
  197. //todo 其他优惠卷....
  198. orderNew.setTotalPrice(orderNew.getTotalPrice().subtract(coupon.getDiscountValue()));
  199. }
  200. //判断支付方式
  201. if (order.getPayType().equals(MassageConstants.INTEGER_ONE)) {
  202. //微信支付
  203. R resp = rechargeService.getPay(orderNew.getOrderNo(), orderNew.getTotalPrice(), orderNew.getcOpenId(), BillTypeEnum.WX_PAY.getInfo(), BillTypeEnum.WX_PAY.getCode().toString());
  204. return resp;
  205. }
  206. // 从对应账户扣款
  207. TWxUser user = wxUserService.getByOpenId(orderNew.getcOpenId());
  208. if (null == user) {
  209. throw new ServiceException("用户不存在");
  210. }
  211. if (user.getdBalance().compareTo(orderNew.getTotalPrice()) < MassageConstants.INTEGER_ZERO) {
  212. throw new ServiceException("账户金额不够请充值");
  213. } else {
  214. orderPayManage(user, orderNew);
  215. return R.ok();
  216. }
  217. }
  218. public void newOrderNotification(TOrder order) {
  219. cn.hutool.json.JSONObject param = JSONUtil.createObj();
  220. //订单号
  221. param.set("character_string9", JSONUtil.createObj().set("value", order.getOrderNo()));
  222. //电话
  223. param.set("phone_number14", JSONUtil.createObj().set("value", order.getcPhone()));
  224. param.set("thing18", JSONUtil.createObj().set("value", order.getcName()));
  225. param.set("time6", JSONUtil.createObj().set("value", DateTimeUtils.formatDate(new Date(), DateTimeUtils.DATE_NUMBER_YEAR_MONTH_FORMAT)));
  226. param.set("thing27", JSONUtil.createObj().set("value", order.getName() + " " + order.getAddress()));
  227. TJs js = jsService.getById(order.getcJsId());
  228. weChatUtil.notification(js.getcOpenId(), param);
  229. }
  230. @Transactional(rollbackFor = Exception.class)
  231. public void orderPayManage(TWxUser user, TOrder orderNew) {
  232. //删除优惠卷
  233. // 更新用户金额 及下单此时
  234. TWxUser paramUser = new TWxUser();
  235. paramUser.setcOpenid(user.getcOpenid());
  236. if (!orderNew.getPayType().equals(MassageConstants.INTEGER_ONE)) {
  237. paramUser.setdBalance(user.getdBalance().subtract(orderNew.getTotalPrice()));
  238. }
  239. paramUser.setdMoney(user.getdMoney().add(orderNew.getTotalPrice()));
  240. paramUser.setnNum(user.getnNum() + MassageConstants.INTEGER_ZERO);
  241. paramUser.setId(user.getId());
  242. wxUserService.updateById(paramUser);
  243. //增加消费记录
  244. TConsumptionLog tConsumptionLog = new TConsumptionLog();
  245. tConsumptionLog.setAmount(orderNew.getTotalPrice().negate());
  246. tConsumptionLog.setBillNo(orderNew.getOrderNo());
  247. tConsumptionLog.setOpenId(orderNew.getcOpenId());
  248. if (!orderNew.getPayType().equals(MassageConstants.INTEGER_ONE)) {
  249. tConsumptionLog.setBillType(BillTypeEnum.BALANCE_PAYMENT.getCode());
  250. tConsumptionLog.setNote("余额支付");
  251. } else {
  252. tConsumptionLog.setBillType(BillTypeEnum.WX_PAY.getCode());
  253. tConsumptionLog.setNote("微信支付");
  254. }
  255. consumptionLogService.save(tConsumptionLog);
  256. // 更新项目数据
  257. JSONArray objects = orderNew.getcGoods();
  258. objects.forEach(item -> {
  259. UpdateWrapper<TXiangmu> wrapper = new UpdateWrapper<>();
  260. // 获取参数
  261. wrapper.lambda().eq(TXiangmu::getcId, ((JSONObject) item).getString("cId"));
  262. // 设置数量
  263. wrapper.setSql(" n_sale_number = n_sale_number + " + ((JSONObject) item).getInteger("number"));
  264. xiangmuService.update(wrapper);
  265. });
  266. TOrder orderParam = new TOrder();
  267. orderParam.setPayType(orderNew.getPayType());
  268. orderParam.setcId(orderNew.getcId());
  269. orderParam.setnStatus(OrderStatusEnum.WAIT_JD.getCode());
  270. //加钟的订单支付完直接服务中
  271. if (StringUtils.isNotBlank(orderNew.getParentNo())) {
  272. orderParam.setnStatus(OrderStatusEnum.SERVICE.getCode());
  273. }
  274. // orderParam.setnStatus(OrderStatusEnum.SERVICE.getCode());
  275. //更新及技师状态
  276. updateJs(orderNew);
  277. updateById(orderParam);
  278. this.newOrderNotification(orderNew);
  279. }
  280. /**
  281. * 拒绝订单
  282. *
  283. * @param order
  284. */
  285. @Override
  286. public Boolean jujue(TOrder order) {
  287. TOrder orderNew = getById(order.getcId());
  288. TWxUser user = wxUserService.getByOpenId(orderNew.getcOpenId());
  289. // 更新用户金额 及下单此时
  290. TWxUser paramUser = new TWxUser();
  291. paramUser.setcOpenid(user.getcOpenid());
  292. paramUser.setId(user.getId());
  293. if (orderNew.getPayType() == 2) {
  294. // 金额归还对应账户
  295. paramUser.setdBalance(user.getdBalance().add(orderNew.getTotalPrice()));
  296. } else {
  297. // 微信支付
  298. // 生成退款单退款
  299. RefundVoucher refundVoucher = new RefundVoucher();
  300. refundVoucher.setRefundNo(generator.generateNextOrderNumber(OrderNumberGenerator.KEY_PREFIX_REFUND));
  301. refundVoucher.setOrderNo(orderNew.getOrderNo());
  302. refundVoucher.setMoney(orderNew.getTotalPrice());
  303. refundVoucher.setOpenId(orderNew.getcOpenId());
  304. refundVoucher.setReStatus(MassageConstants.INTEGER_ZERO);
  305. refundVoucher.setReason("技师拒绝接单");
  306. refundVoucherService.save(refundVoucher);
  307. // 微信退款原路返回
  308. rechargeService.refund(refundVoucher.getRefundNo(), null, orderNew.getOrderNo(), orderNew.getTotalPrice());
  309. }
  310. log.info("余额支付退款user:{}",user);
  311. // 消费金额对应减少
  312. paramUser.setdMoney(user.getdMoney().subtract(orderNew.getTotalPrice()));
  313. // 下单次数减一
  314. paramUser.setnNum(user.getnNum() - MassageConstants.INTEGER_ONE);
  315. wxUserService.updateById(paramUser);
  316. // 更新项目数据
  317. JSONArray objects = orderNew.getcGoods();
  318. objects.forEach(item -> {
  319. UpdateWrapper<TXiangmu> wrapper = new UpdateWrapper<>();
  320. // 获取参数
  321. wrapper.lambda().eq(TXiangmu::getcId, ((JSONObject) item).getString("cId"));
  322. // 设置数量
  323. wrapper.setSql(" n_sale_number = n_sale_number - " + ((JSONObject) item).getInteger("number"));
  324. xiangmuService.update(wrapper);
  325. });
  326. TOrder orderParam = new TOrder();
  327. orderParam.setcId(orderNew.getcId());
  328. orderParam.setnStatus(OrderStatusEnum.REFUSE.getCode());
  329. updateJs(orderNew);
  330. return updateById(orderParam);
  331. }
  332. /**
  333. * 确认服务完成
  334. *
  335. * @param order
  336. * @return
  337. */
  338. @Override
  339. @Transactional(rollbackFor = Exception.class)
  340. public Boolean confirm(TOrder order) {
  341. // 获取订单信息
  342. TOrder orderNew = getById(order);
  343. if (!orderNew.getnStatus().equals(OrderStatusEnum.SERVICE.getCode())) {
  344. throw new ServiceException("订单状态不是服务中");
  345. }
  346. // 更新技师信息
  347. TJs jsParam = new TJs();
  348. jsParam.setId(orderNew.getcJsId());
  349. jsParam.setnStatus(JsStatusEnum.JS_SERVICEABLE.getCode());
  350. // 更新技师状态
  351. jsService.updateById(jsParam);
  352. // 更新技师钱包金额
  353. TJs jsById = jsService.getById(orderNew.getcJsId());
  354. // 获取技师抽成
  355. BigDecimal multiply = orderNew.getTotalPrice().multiply(new BigDecimal(jsById.getnBili()));
  356. multiply = multiply.divide(new BigDecimal(100), MassageConstants.INTEGER_TWO, RoundingMode.HALF_UP);
  357. // 获取技师所对应的用户
  358. TWxUser jsUser = wxUserService.getByOpenId(jsById.getcOpenId());
  359. // 更新余额
  360. jsUser.setdBalance(jsUser.getdBalance().add(multiply));
  361. // 更新总钱数
  362. jsUser.setdAllMoney(jsUser.getdAllMoney().add(multiply));
  363. wxUserService.updateById(jsUser);
  364. //增加消费记录
  365. TConsumptionLog tConsumptionLog = new TConsumptionLog();
  366. tConsumptionLog.setAmount(multiply);
  367. tConsumptionLog.setBillNo(orderNew.getOrderNo());
  368. tConsumptionLog.setOpenId(jsUser.getcOpenid());
  369. tConsumptionLog.setBillType(BillTypeEnum.INCOME.getCode());
  370. tConsumptionLog.setNote("技师收益");
  371. consumptionLogService.save(tConsumptionLog);
  372. // 如果该技师有推荐人员 一级
  373. if (StringUtils.isNotBlank(jsUser.getcUpUser())) {
  374. // 获取技师上级对应的用户
  375. TWxUser jsUp = wxUserService.getById(jsUser.getcUpUser());
  376. extracted(orderNew, jsUp);
  377. //二级
  378. if (jsUp.getcUpUser() != null) {
  379. TWxUser jsUpTwo = wxUserService.getById(jsUp.getcUpUser());
  380. extracted(orderNew, jsUpTwo);
  381. //三级
  382. if (jsUpTwo.getcUpUser() != null) {
  383. TWxUser jsUpThree = wxUserService.getById(jsUpTwo.getcUpUser());
  384. extracted(orderNew, jsUpThree);
  385. }
  386. }
  387. }
  388. // 更新订单
  389. orderNew.setnStatus(OrderStatusEnum.WAIT_EVALUATE.getCode());
  390. return updateById(orderNew);
  391. }
  392. private void extracted(TOrder orderNew, TWxUser jsUp) {
  393. BigDecimal up = orderNew.getdTotalMoney().multiply(new BigDecimal("10"));
  394. up = up.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
  395. // 更新余额
  396. jsUp.setdBalance(jsUp.getdBalance().add(up));
  397. // 更新总钱数
  398. jsUp.setdAllMoney(jsUp.getdAllMoney().add(up));
  399. wxUserService.updateById(jsUp);
  400. //记录分销收益
  401. TConsumptionLog tConsumptionLog = new TConsumptionLog();
  402. tConsumptionLog.setAmount(up);
  403. tConsumptionLog.setBillNo(orderNew.getOrderNo());
  404. tConsumptionLog.setOpenId(jsUp.getcOpenid());
  405. tConsumptionLog.setBillType(BillTypeEnum.DISTRIBUTION.getCode());
  406. tConsumptionLog.setNote("分销收益");
  407. consumptionLogService.save(tConsumptionLog);
  408. }
  409. /**
  410. * 取消订单
  411. *
  412. * @param order
  413. * @return
  414. */
  415. @Override
  416. public Boolean cancle(TOrder order) {
  417. // 获取订单信息
  418. // 根据orderid查询订单信息
  419. TOrder orderNew = getById(order.getcId());
  420. //待接单
  421. // if (Objects.equals(orderNew.getnStatus(), OrderStatusEnum.WAIT_JD.getCode())) {
  422. // TWxUser user = wxUserService.getById(orderNew.getcOpenId());
  423. // // 更新用户金额 及下单此时
  424. // TWxUser paramUser = new TWxUser();
  425. // paramUser.setcOpenid(user.getcOpenid());
  426. // // 金额归还对应账户
  427. // paramUser.setdBalance(user.getdBalance().add(orderNew.getdTotalMoney()));
  428. // // 消费金额对应减少
  429. // paramUser.setdMoney(user.getdMoney().subtract(orderNew.getdTotalMoney()));
  430. // // 下单次数减一
  431. // paramUser.setnNum(user.getnNum() - MassageConstants.INTEGER_ONE);
  432. // wxUserService.updateById(paramUser);
  433. //
  434. // // 更新项目数据
  435. // JSONArray objects = orderNew.getcGoods();
  436. // objects.forEach(item -> {
  437. // UpdateWrapper<TXiangmu> wrapper = new UpdateWrapper<>();
  438. // // 获取参数
  439. // wrapper.lambda().eq(TXiangmu::getcId, ((JSONObject) item).getString("cId"));
  440. // // 设置数量
  441. // wrapper.setSql(" n_sale_number = n_sale_number - " + ((JSONObject) item).getInteger("number"));
  442. // xiangmuService.update(wrapper);
  443. // });
  444. // TOrder orderParam = new TOrder();
  445. // orderParam.setcId(orderNew.getcId());
  446. // orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
  447. // return updateById(orderParam);
  448. //
  449. // } else
  450. if (Objects.equals(orderNew.getnStatus(), OrderStatusEnum.WAIT_PAY.getCode())) {
  451. //待付款
  452. TOrder orderParam = new TOrder();
  453. orderParam.setcId(orderNew.getcId());
  454. orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
  455. return updateById(orderParam);
  456. } else {
  457. return false;
  458. }
  459. }
  460. @Override
  461. public TOrder getByNo(String orderNo) {
  462. LambdaQueryWrapper<TOrder> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  463. return this.getOne(objectLambdaQueryWrapper.eq(TOrder::getOrderNo, orderNo));
  464. }
  465. private TOrder gettOrder(TOrder order) {
  466. LambdaUpdateWrapper<TOrder> objectLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  467. objectLambdaUpdateWrapper.eq(TOrder::getOrderNo, order.getOrderNo());
  468. return this.getOne(objectLambdaUpdateWrapper);
  469. }
  470. @Override
  471. public Page<TOrder> getAll(Page<TOrder> page, TOrder param) {
  472. Page<TOrder> orderPage = orderMapper.getAll(page, param);
  473. if (orderPage != null && CollectionUtil.isNotEmpty(orderPage.getRecords())) {
  474. ArrayList<TOrder> orders = Lists.newArrayList();
  475. orderPage.getRecords().forEach(order -> {
  476. order.setStatusName(OrderStatusEnum.getDescByCode(order.getnStatus()));
  477. if (StringUtils.isEmpty(order.getcTime())) {
  478. order.setRemainingTime(0L);
  479. }
  480. if (StringUtils.isNotBlank(order.getcTime()) && DateTimeUtils.dateStringToStamp(order.getcTime()) > DateTimeUtils.dateToStamp(new Date())) {
  481. order.setRemainingTime((DateTimeUtils.dateStringToStamp(order.getcTime()) - DateTimeUtils.dateToStamp(new Date())) / 1000);
  482. }
  483. if (StringUtils.isNotBlank(order.getcTime()) && DateTimeUtils.dateStringToStamp(order.getcTime()) < DateTimeUtils.dateToStamp(new Date())) {
  484. order.setRemainingTime(0L);
  485. }
  486. orders.add(order);
  487. });
  488. orderPage.setRecords(orders);
  489. }
  490. return orderPage;
  491. }
  492. @Override
  493. @Transactional(rollbackFor = Exception.class)
  494. public void takingOrders(TOrder order) {
  495. if (order == null || StringUtils.isBlank(order.getcId())) {
  496. throw new IllegalArgumentException("订单对象不能为空");
  497. }
  498. TOrder orderNew = this.getById(order);
  499. // 检查订单对应的技师是否存在
  500. // updateJs (orderNew);
  501. // 更新订单状态
  502. TOrder orderParam = new TOrder();
  503. orderParam.setcId(order.getcId());
  504. orderParam.setnStatus(OrderStatusEnum.RECEIVED_ORDER.getCode());
  505. this.updateById(orderParam);
  506. }
  507. private void updateJs(TOrder orderNew) {
  508. TJs js = jsService.getById(orderNew.getcJsId());
  509. if (js == null) {
  510. throw new IllegalStateException("无法找到对应的技师");
  511. }
  512. if (Objects.equals(js.getnStatus(), JsStatusEnum.JS_SERVICEABLE.getCode())) {
  513. // 更新技师状态
  514. js.setnStatus(JsStatusEnum.JS_SERVICE.getCode());
  515. // 确保js.getnNum()不为null,避免 NullPointerException
  516. int num = js.getnNum() == null ? 0 : js.getnNum();
  517. js.setnNum(num + MassageConstants.INTEGER_ONE);
  518. } else {
  519. // 更新技师状态
  520. js.setnStatus(JsStatusEnum.JS_SERVICEABLE.getCode());
  521. // 确保js.getnNum()不为null,避免 NullPointerException
  522. int num = js.getnNum() == null ? 0 : js.getnNum();
  523. js.setnNum(num - MassageConstants.INTEGER_ONE);
  524. }
  525. jsService.updateById(js);
  526. }
  527. }