Order.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace app\controller\merchant;
  3. use app\extra\basic\Base;
  4. use app\extra\dyLife\data\OrderData;
  5. use app\middleware\AuthMiddleware;
  6. use app\model\saas\SaasOrder;
  7. use app\model\saas\SaasStore;
  8. use app\service\saas\GoodsService;
  9. use app\service\saas\OrderService;
  10. use DI\Attribute\Inject;
  11. use LinFly\Annotation\Attributes\Route\Controller;
  12. use LinFly\Annotation\Attributes\Route\GetMapping;
  13. use LinFly\Annotation\Attributes\Route\Middleware;
  14. use LinFly\Annotation\Attributes\Route\PostMapping;
  15. use support\Request;
  16. use support\Response;
  17. #[Controller("/api/merchant/order"),Middleware(AuthMiddleware::class)]
  18. class Order extends Base
  19. {
  20. #[Inject]
  21. protected OrderService $service;
  22. #[Inject]
  23. protected SaasOrder $model;
  24. #[Inject]
  25. protected GoodsService $goodsService;
  26. #[GetMapping('list')]
  27. public function getOrderList(Request $request): Response
  28. {
  29. try {
  30. $param = $request->all();
  31. $param['poi_id'] = $request->user['store_id'];
  32. $productType = $this->goodsService->productType();
  33. $data = $this->service->setModel()->getList($param,['product' => function($query) use($productType){
  34. $query->field("product_id,product_name,product_type")->append(['types'])->withAttr(['types' => function($query,$resp) use($productType){
  35. $productTypeArr = [];
  36. foreach ($productType as $val) {
  37. $productTypeArr[$val['key']] = $val['name'];
  38. }
  39. return $productTypeArr[$resp['product_type']]??'';
  40. }]);
  41. },'user' => function($query){
  42. $query->field("openid,nickname,avatar");
  43. }],true,['end_time'],["end_time" => function ($resp,$next) {
  44. return timeDiff(strtotime("+30 minutes",strtotime($next['create_at'])),time());
  45. }]);
  46. return successTrans("success.data",pageFormat($data),200);
  47. } catch (\Throwable $throwable) {
  48. return error($throwable->getMessage());
  49. }
  50. }
  51. #[GetMapping('detail')]
  52. public function getOrderDetail(Request $request): Response
  53. {
  54. try {
  55. $param = $this->_valid([
  56. "order.require" => trans("empty.require"),
  57. ],$request->method());
  58. if (!is_array($param)) return error($param);
  59. $order = $this->model->where("out_order_no",$param['order'])->with(['product','poi','user'])->findOrEmpty();
  60. if ($order->isEmpty()) return errorTrans("empty.data");
  61. if ($order['poi_id'] <> $request->user['store_id']) return errorTrans("empty.data");
  62. $order['end_time'] = timeDiff(strtotime("+30 minutes",strtotime($order['create_at'])),time());
  63. return successTrans("success.data",$order->toArray());
  64. } catch (\Throwable $throwable) {
  65. return error($throwable->getMessage());
  66. }
  67. }
  68. /**
  69. * 手动核销
  70. * @param Request $request
  71. * @return Response|void
  72. */
  73. #[PostMapping('done')]
  74. public function doneOrder(Request $request)
  75. {
  76. try {
  77. $param = $this->_valid([
  78. "id.require" => trans("empty.require")
  79. ],$request->method());
  80. if (!is_array($param)) return error($param);
  81. $order = $this->model->where("order_sn",$param['id'])->with(['product','poi','user'])->findOrEmpty();
  82. if ($order->isEmpty()) return errorTrans("empty.data");
  83. if ($order['poi_id'] <> $request->user['store_id']) return errorTrans("empty.data");
  84. if ($order['status'] <> 1) return error("该订单状态不支持核销");
  85. $store = (new SaasStore)->where("poi_id",$request->user['store_id'])->findOrEmpty();
  86. if ($store->isEmpty()) return errorTrans("error.data");
  87. // 获取到订单encrypted_code
  88. $orderCode = (new OrderData)->config([
  89. "appid" => sConf("wechat.appid"),
  90. "secret" => sConf("wechat.secret"),
  91. "account" => sConf("wechat.shop_id"),
  92. ])->token()->getCertificate($order['order_sn'],$store['store_id']);
  93. if (empty($orderCode['certificates'])) return error("获取订单数据失败");
  94. if (!isset($orderCode['certificates'][0]['encrypted_code'])) return error("获取订单数据失败");
  95. if ($orderCode['certificates'][0]['status'] <> 1) return error("该订单状态不支持核销");
  96. // 核销订单
  97. $orderDone = (new OrderData)->config([
  98. "appid" => sConf("wechat.appid"),
  99. "secret" => sConf("wechat.secret"),
  100. "account" => sConf("wechat.shop_id"),
  101. ])->token()->verifyCertificate([
  102. "account_id" => $store['store_id'],
  103. "pay_sn" => $order['pay_sn'],
  104. "encrypted_code" => $orderCode['certificates'][0]['encrypted_code'],
  105. "order_id" => $order['order_sn'],
  106. "poi_id" => $order['poi_id']
  107. ]);
  108. if (empty($orderDone['verify_results'])) return error("核销失败");
  109. if (!isset($orderDone['verify_results'][0]['verify_id'])) return error("核销失败");
  110. if (!isset($orderDone['verify_results'][0]['certificate_id'])) return error("核销失败");
  111. $order->status = 2;
  112. $order->verify_id = $orderDone['verify_results'][0]['verify_id'];
  113. $order->certificate_id = $orderDone['verify_results'][0]['certificate_id'];
  114. $order->done_at = getDateFull();
  115. $state = $order->save();
  116. if (!$state) return error("核销失败");
  117. return success("核销成功");
  118. } catch (\Throwable $throwable) {
  119. }
  120. }
  121. }