TOrderController.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. package com.ylx.web.controller.massage;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.ylx.common.annotation.Log;
  6. import com.ylx.common.core.controller.BaseController;
  7. import com.ylx.common.core.domain.R;
  8. import com.ylx.common.core.domain.model.LoginUser;
  9. import com.ylx.common.enums.BusinessType;
  10. import com.ylx.common.exception.ServiceException;
  11. import com.ylx.common.utils.StringUtils;
  12. import com.ylx.common.utils.poi.ExcelUtil;
  13. import com.ylx.massage.domain.TJs;
  14. import com.ylx.massage.domain.TOrder;
  15. import com.ylx.massage.domain.vo.OrderAllocationResultVo;
  16. import com.ylx.massage.domain.vo.OrderVerificationVo;
  17. import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
  18. import com.ylx.massage.enums.Enumproject;
  19. import com.ylx.massage.enums.OrderStatusEnum;
  20. import com.ylx.massage.enums.OrderStatusEnumVo;
  21. import com.ylx.massage.domain.OrderAllocationLog;
  22. import com.ylx.massage.service.TJsService;
  23. import com.ylx.massage.service.TOrderService;
  24. import com.ylx.massage.service.OrderAllocationLogService;
  25. import io.swagger.annotations.Api;
  26. import io.swagger.annotations.ApiOperation;
  27. import io.swagger.annotations.ApiParam;
  28. import lombok.extern.slf4j.Slf4j;
  29. import org.springframework.beans.BeanUtils;
  30. import org.springframework.web.bind.annotation.*;
  31. import javax.annotation.Resource;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.math.BigDecimal;
  34. import java.time.LocalDateTime;
  35. import java.util.List;
  36. import java.util.Optional;
  37. import java.util.stream.Collectors;
  38. /**
  39. * 订单表 前端控制器
  40. */
  41. @RestController
  42. @Slf4j
  43. @Api(tags = {"订单管理"})
  44. @RequestMapping("api/order/v1")
  45. public class TOrderController extends BaseController {
  46. @Resource
  47. private TOrderService orderService;
  48. @Resource
  49. private OrderAllocationLogService allocationLogService;
  50. @Resource
  51. private TJsService jsService;
  52. /**
  53. * 下单
  54. *
  55. * @param order
  56. * @return R<TOrder>
  57. */
  58. //@Log(title = "新增订单", businessType = BusinessType.INSERT)
  59. @ApiOperation("下单")
  60. @RequestMapping(value = "wx/add", method = RequestMethod.POST)
  61. public R<TOrder> add(@RequestBody TOrder order) {
  62. try {
  63. return R.ok(orderService.addOrder(order));
  64. } catch (ServiceException s) {
  65. log.error(s.toString());
  66. return R.fail(s.getMessage());
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. return R.fail("系统异常");
  70. }
  71. }
  72. /**
  73. * 优惠卷核销
  74. *
  75. * @param order
  76. * @return
  77. */
  78. @Log(title = "优惠卷核销", businessType = BusinessType.UPDATE)
  79. @ApiOperation("优惠卷核销")
  80. @RequestMapping(value = "wx/verification", method = RequestMethod.POST)
  81. public R<OrderVerificationVo> verification(@RequestBody TOrder order) {
  82. try {
  83. return R.ok(orderService.verification(order));
  84. } catch (ServiceException s) {
  85. log.error(s.toString());
  86. return R.fail(s.getMessage());
  87. } catch (Exception e) {
  88. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  89. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  90. return R.fail("系统异常");
  91. }
  92. }
  93. /**
  94. * 转单
  95. *
  96. * @param order
  97. * @return R<TOrder>
  98. */
  99. @Log(title = "转单", businessType = BusinessType.INSERT)
  100. @ApiOperation("转单")
  101. @RequestMapping(value = "wx/transferOrder", method = RequestMethod.POST)
  102. public R<TOrder> transferOrder(@RequestBody TOrder order) {
  103. try {
  104. return R.ok(orderService.transferOrder(order));
  105. } catch (ServiceException s) {
  106. log.error(s.toString());
  107. return R.fail(s.getMessage());
  108. } catch (Exception e) {
  109. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  110. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  111. return R.fail("系统异常");
  112. }
  113. }
  114. /**
  115. * 支付订单
  116. *
  117. * @param order
  118. * @return R
  119. */
  120. @ApiOperation("支付订单")
  121. @Log(title = "支付订单", businessType = BusinessType.UPDATE)
  122. @RequestMapping(value = "wx/pay", method = RequestMethod.POST)
  123. public R pay(@RequestBody TOrder order) {
  124. try {
  125. log.info("支付订单接口前端传递的参数:{}", JSON.toJSONString(order));
  126. return orderService.payOrder(order);
  127. } catch (ServiceException s) {
  128. log.error(s.toString());
  129. return R.fail(s.getMessage());
  130. } catch (Exception e) {
  131. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  132. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  133. return R.fail("系统异常");
  134. }
  135. }
  136. /**
  137. * 取消订单(用户操作的接口)
  138. *
  139. * @param order
  140. * @return R
  141. */
  142. @Log(title = "取消订单", businessType = BusinessType.UPDATE)
  143. @ApiOperation("取消订单")
  144. @RequestMapping(value = "wx/cancle", method = RequestMethod.POST)
  145. public R cancle(@RequestBody TOrder order) {
  146. try {
  147. return R.ok(orderService.cancle(order));
  148. } catch (ServiceException s) {
  149. log.error(s.toString());
  150. return R.fail(s.getMessage());
  151. } catch (Exception e) {
  152. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  153. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  154. return R.fail("系统异常");
  155. }
  156. }
  157. /**
  158. * 拒绝订单
  159. *
  160. * @param order
  161. * @return
  162. */
  163. @Log(title = "拒绝订单", businessType = BusinessType.UPDATE)
  164. @ApiOperation("拒绝订单")
  165. @RequestMapping(value = "wx/jujue", method = RequestMethod.POST)
  166. public R jujue(@RequestBody TOrder order) {
  167. try {
  168. return R.ok(orderService.jujue(order));
  169. } catch (ServiceException s) {
  170. log.error(s.toString());
  171. return R.fail(s.getMessage());
  172. } catch (Exception e) {
  173. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  174. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  175. return R.fail("系统异常");
  176. }
  177. }
  178. /**
  179. * 接受订单(技师端操作的接口)
  180. *
  181. * @param order
  182. * @return R
  183. */
  184. @Log(title = "接受订单", businessType = BusinessType.UPDATE)
  185. @ApiOperation("接受订单")
  186. @RequestMapping(value = "wx/takingOrders", method = RequestMethod.POST)
  187. public R takingOrders(@RequestBody TOrder order) {
  188. try {
  189. orderService.takingOrders(order);
  190. return R.ok();
  191. } catch (ServiceException s) {
  192. log.error(s.toString());
  193. return R.fail(s.getMessage());
  194. } catch (Exception e) {
  195. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  196. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  197. return R.fail("系统异常");
  198. }
  199. }
  200. /**
  201. * 出发(技师端操作的接口)
  202. *
  203. * @param order
  204. * @return R
  205. */
  206. @Log(title = "出发", businessType = BusinessType.UPDATE)
  207. @ApiOperation("出发")
  208. @RequestMapping(value = "wx/depart", method = RequestMethod.POST)
  209. public R depart(@RequestBody TOrder order) {
  210. try {
  211. orderService.depart(order);
  212. return R.ok();
  213. } catch (ServiceException s) {
  214. log.error(s.toString());
  215. return R.fail(s.getMessage());
  216. } catch (Exception e) {
  217. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  218. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  219. return R.fail("系统异常");
  220. }
  221. }
  222. /**
  223. * 到达订单位置(技师端操作的接口)
  224. *
  225. * @param order
  226. * @return R
  227. */
  228. @Log(title = "到达订单位置", businessType = BusinessType.UPDATE)
  229. @ApiOperation("到达订单位置")
  230. @RequestMapping(value = "wx/reach", method = RequestMethod.POST)
  231. public R reach(@RequestBody TOrder order) {
  232. try {
  233. log.info("到达订单位置,order对象的值:{}", JSON.toJSONString(order));
  234. LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
  235. wrapper.eq(TOrder::getcId, order.getcId()).eq(TOrder::getnStatus, OrderStatusEnum.DEPART.getCode());
  236. order.setnStatus(OrderStatusEnum.ARRIVED.getCode());
  237. order.setReachTime(LocalDateTime.now());
  238. order.setArrivalLatitude(Optional.ofNullable(order.getArrivalLatitude()).orElse(BigDecimal.ZERO));
  239. order.setArrivalLongitude(Optional.ofNullable(order.getArrivalLongitude()).orElse(BigDecimal.ZERO));
  240. order.setArrivalPhoto(Optional.ofNullable(order.getArrivalPhoto()).orElse(StringUtils.EMPTY));
  241. return R.ok(orderService.update(order, wrapper));
  242. } catch (ServiceException s) {
  243. log.error(s.toString());
  244. return R.fail(s.getMessage());
  245. } catch (Exception e) {
  246. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  247. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  248. return R.fail("系统异常");
  249. }
  250. }
  251. /**
  252. * 开始服务(技师端操作的接口)
  253. *
  254. * @param order
  255. * @return R
  256. */
  257. @Log(title = "开始服务", businessType = BusinessType.UPDATE)
  258. @ApiOperation("开始服务")
  259. @RequestMapping(value = "wx/service", method = RequestMethod.POST)
  260. public R service(@RequestBody TOrder order) {
  261. try {
  262. LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
  263. wrapper.eq(TOrder::getcId, order.getcId()).eq(TOrder::getnStatus, OrderStatusEnum.ARRIVED.getCode());
  264. // 设置订单状态:服务中
  265. order.setnStatus(OrderStatusEnum.SERVICE.getCode());
  266. order.setStartTime(LocalDateTime.now());
  267. return R.ok(orderService.update(order, wrapper));
  268. } catch (ServiceException s) {
  269. log.error(s.toString());
  270. return R.fail(s.getMessage());
  271. } catch (Exception e) {
  272. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  273. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  274. return R.fail("系统异常");
  275. }
  276. }
  277. /**
  278. * 确认订单(技师端的操作接口)
  279. *
  280. * @param order
  281. * @return R
  282. */
  283. //@Log(title = "确认服务完成", businessType = BusinessType.UPDATE)
  284. @ApiOperation("确认服务完成")
  285. @RequestMapping(value = "wx/confirm", method = RequestMethod.POST)
  286. public R confirm(@RequestBody TOrder order) {
  287. try {
  288. return R.ok(orderService.confirm(order));
  289. } catch (ServiceException s) {
  290. log.error(s.toString());
  291. return R.fail(s.getMessage());
  292. } catch (Exception e) {
  293. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  294. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "."
  295. + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  296. return R.fail("系统异常");
  297. }
  298. }
  299. /**
  300. * 获取订单信息
  301. *
  302. * @param param
  303. * @return R
  304. */
  305. @Log(title = "微信获取订单信息", businessType = BusinessType.OTHER)
  306. @ApiOperation("获取订单信息")
  307. @RequestMapping(value = "wx/getOrder", method = RequestMethod.GET)
  308. public R getOrder(Page<TOrder> page, TOrder param) {
  309. try {
  310. Page<TOrder> all = orderService.getAll(page, param);
  311. return R.ok(all);
  312. } catch (Exception e) {
  313. e.printStackTrace();
  314. throw new RuntimeException(e);
  315. }
  316. }
  317. @Log(title = "技师端-获取待接单数量", businessType = BusinessType.OTHER)
  318. @ApiOperation("技师端-获取待接单数量")
  319. @RequestMapping(value = "wx/waitOrder", method = RequestMethod.GET)
  320. public R waitOrder(@RequestParam String cJsId) {
  321. List<TOrder> list = orderService.list(new LambdaQueryWrapper<TOrder>().
  322. eq(TOrder::getnStatus, OrderStatusEnum.WAIT_JD.getCode()).
  323. eq(TOrder::getcJsId, cJsId));
  324. return R.ok(list.size());
  325. }
  326. /**
  327. * PC获取订单信息(PC端)
  328. *
  329. * @param page
  330. * @param order
  331. * @return R
  332. */
  333. @Log(title = "PC获取订单信息", businessType = BusinessType.OTHER)
  334. @ApiOperation("PC获取订单信息")
  335. @RequestMapping(value = "pc/getOrder", method = RequestMethod.GET)
  336. public R getPcOrder(Page<TOrder> page, TOrder order) {
  337. try {
  338. LoginUser loginUser = this.getLoginUser();
  339. log.info("登录用户信息:{}", JSON.toJSONString(loginUser));
  340. order.setDeptId(loginUser.getDeptId().toString());
  341. Page<TOrder> all = orderService.getAll(page, order);
  342. return R.ok(all);
  343. } catch (Exception e) {
  344. e.printStackTrace();
  345. throw new RuntimeException(e);
  346. }
  347. }
  348. @Log(title = "微信获取订单信息", businessType = BusinessType.EXPORT)
  349. @ApiOperation("导出")
  350. @PostMapping(value = "wx/export")
  351. public void export(HttpServletResponse response, Page<TOrder> page, TOrder param) {
  352. Page<TOrder> all = orderService.getAll(page, param);
  353. ExcelUtil<TOrder> util = new ExcelUtil<>(TOrder.class);
  354. util.exportExcel(response, all.getRecords(), "订单");
  355. }
  356. /**
  357. * 分页查询订单数据
  358. *
  359. * @param page
  360. * @param order
  361. * @return R
  362. */
  363. @ApiOperation("分页查询订单数据")
  364. @RequestMapping(value = "/select", method = RequestMethod.GET)
  365. public R selectSp(Page<TOrder> page, TOrder order) {
  366. LambdaQueryWrapper<TOrder> tOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
  367. tOrderLambdaQueryWrapper.eq(StringUtils.isNotBlank(order.getcJsId()), TOrder::getcJsId, order.getcJsId()).
  368. eq(StringUtils.isNotBlank(order.getcOpenId()), TOrder::getcOpenId, order.getcOpenId()).
  369. eq(null != order.getnStatus(), TOrder::getnStatus, order.getnStatus());
  370. // 获取查询返回结果
  371. Page<TOrder> pageSelect = orderService.page(page, tOrderLambdaQueryWrapper);
  372. return R.ok(pageSelect);
  373. }
  374. @ApiOperation("更新订单数据")
  375. @Log(title = "更新订单数据", businessType = BusinessType.OTHER)
  376. @RequestMapping(value = "/update", method = RequestMethod.POST)
  377. public R update(@RequestBody TOrder borrow) {
  378. try {
  379. return R.ok(orderService.updateAddressById(borrow));
  380. } catch (ServiceException s) {
  381. log.error(s.toString());
  382. return R.fail(s.getMessage());
  383. } catch (Exception e) {
  384. StackTraceElement stackTraceElement = e.getStackTrace()[0];
  385. log.error("系统出错,错误信息:" + e + " at " + stackTraceElement.getClassName() + "."
  386. + stackTraceElement.getMethodName() + ":" + stackTraceElement.getLineNumber());
  387. return R.fail("系统异常");
  388. }
  389. }
  390. @ApiOperation("删除数据")
  391. @RequestMapping(value = "/del", method = RequestMethod.POST)
  392. public R del(@RequestBody TOrder borrow) {
  393. return R.ok(orderService.removeById(borrow));
  394. }
  395. @ApiOperation("根据id查询")
  396. @RequestMapping(value = "/getByid", method = RequestMethod.POST)
  397. public R<TOrder> getByid(@RequestBody TOrder borrow) {
  398. return R.ok(orderService.getById(borrow.getcId()));
  399. }
  400. /**
  401. * 获取订单状态
  402. *
  403. * @return R
  404. */
  405. @ApiOperation("订单状态")
  406. @RequestMapping(value = "/getStatus", method = RequestMethod.GET)
  407. public R getStatus() {
  408. List<Enumproject> statusEnum = OrderStatusEnumVo.getStatusEnum();
  409. return R.ok(statusEnum);
  410. }
  411. /**
  412. * 分页查询订单分配操作记录
  413. *
  414. * @param page 分页参数
  415. * @param orderNo 订单号
  416. * @return R 分页结果
  417. */
  418. @Log(title = "分页查询订单分配操作记录", businessType = BusinessType.OTHER)
  419. @ApiOperation("分页查询订单分配操作记录")
  420. @RequestMapping(value = "/allocationLogs/page", method = RequestMethod.GET)
  421. public R getAllocationLogsPage(Page<OrderAllocationLog> page, @RequestParam String orderNo) {
  422. try {
  423. // 构建查询条件
  424. LambdaQueryWrapper<OrderAllocationLog> wrapper = new LambdaQueryWrapper<>();
  425. // 订单号条件
  426. wrapper.eq(StringUtils.isNotBlank(orderNo), OrderAllocationLog::getOrderNo, orderNo);
  427. // 按创建时间倒序排列
  428. wrapper.orderByDesc(OrderAllocationLog::getCreateTime);
  429. // 分页查询
  430. Page<OrderAllocationLog> resultPage = allocationLogService.page(page, wrapper);
  431. // 转换为VO列表
  432. List<OrderAllocationResultVo> voList = resultPage.getRecords().stream()
  433. .map(log -> {
  434. // 转换为VO
  435. OrderAllocationResultVo vo = new OrderAllocationResultVo();
  436. BeanUtils.copyProperties(log, vo);
  437. //根据newTechnicianId查询新技师电话
  438. if (StringUtils.isNotBlank(vo.getNewTechnicianId())) {
  439. TJs technician = jsService.getById(log.getNewTechnicianId());
  440. if (technician != null) {
  441. vo.setNewTechnicianPhone(technician.getcPhone());
  442. }
  443. }
  444. return vo;
  445. }).collect(Collectors.toList());
  446. // 创建新的分页对象,包装转换后的VO列表
  447. Page<OrderAllocationResultVo> voPage = new Page<>(page.getCurrent(), page.getSize(), resultPage.getTotal());
  448. voPage.setRecords(voList);
  449. voPage.setPages(resultPage.getPages());
  450. return R.ok(voPage);
  451. } catch (Exception e) {
  452. log.error("分页查询订单分配记录失败 - 错误信息:{}", e.getMessage(), e);
  453. return R.fail("分页查询分配记录失败:" + e.getMessage());
  454. }
  455. }
  456. /**
  457. * 获取技师当天可预约时间
  458. *
  459. * @param technicianId 技师ID
  460. * @param date 查询日期(格式:yyyy-MM-dd),可选,不传则查询当天
  461. * @return R
  462. */
  463. //@Log(title = "获取技师当天可预约时间", businessType = BusinessType.OTHER)
  464. @ApiOperation("获取技师当天可预约时间")
  465. @RequestMapping(value = "wx/getTechnicianAvailability", method = RequestMethod.GET)
  466. public R<TechnicianAvailabilityVo> getTechnicianAvailability(@RequestParam String technicianId, @RequestParam(required = false) String date) {
  467. try {
  468. log.info("获取技师当天可预约时间,技师ID:{},查询日期:{}", technicianId, date);
  469. TechnicianAvailabilityVo availability = orderService.getTechnicianAvailability(technicianId, date);
  470. return R.ok(availability);
  471. } catch (ServiceException s) {
  472. log.error(s.toString());
  473. return R.fail(s.getMessage());
  474. } catch (Exception e) {
  475. e.printStackTrace();
  476. return R.fail("系统异常");
  477. }
  478. }
  479. }