Order.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace app\controller\mini;
  3. use app\extra\basic\Base;
  4. use app\extra\douyin\Crypt;
  5. use app\extra\douyin\Order as DouyinOrder;
  6. use app\extra\service\saas\OrderService;
  7. use app\extra\tools\CodeExtend;
  8. use app\middleware\DyMiddleware;
  9. use app\model\saas\SaasMember;
  10. use app\model\saas\SaasOrder;
  11. use app\model\saas\SaasOrderLife;
  12. use app\model\saas\SaasOrderLog;
  13. use app\model\saas\SaasStore;
  14. use LinFly\Annotation\Route\Controller;
  15. use LinFly\Annotation\Route\Middleware;
  16. use LinFly\Annotation\Route\Route;
  17. use Shopwwi\WebmanAuth\Auth as AuthMode;
  18. use support\Request;
  19. use support\Response;
  20. use function DI\string;
  21. #[Controller(prefix: "/api/dy/order"),Middleware(DyMiddleware::class)]
  22. class Order extends Base
  23. {
  24. protected array $noNeedLogin = ["getLifeOrder"];
  25. #[Route(path: "life/detail",methods: "get")]
  26. public function getOrderLifeDetail(): Response
  27. {
  28. try {
  29. $param = $this->_valid([
  30. "order.require" => "请求参数错误",
  31. ]);
  32. if (!is_array($param)) return error($param);
  33. $order = (new SaasOrderLife)->where("order_id",$param['order'])->findOrEmpty();
  34. if ($order->isEmpty()) return error("订单数据已失效");
  35. return success("ok",$order->toArray());
  36. } catch (\Throwable $throwable) {
  37. return error($throwable->getMessage());
  38. }
  39. }
  40. /**
  41. * 来客订单详情
  42. * @param Request $request
  43. * @return Response
  44. */
  45. #[Route(path: "life",methods: "post")]
  46. public function getLifeOrder(Request $request): Response
  47. {
  48. try {
  49. $param = $request->post();
  50. $sessionKey = (new Crypt)->config($this->getDyConfig())->getSessionKey($param['auth']);
  51. if (empty($sessionKey)) return error("授权登录失败");
  52. if (!isset($sessionKey['openid'])) return error("获取数据失败");
  53. $openId = $sessionKey['openid'];
  54. $userIn = [
  55. 'open_id' => $openId,
  56. "create_ip" => $request->getRealIp(),
  57. "nickname" => "用户_".strtoupper(CodeExtend::random(3,5)),
  58. "avatar" => "https://img.inmei.cc/logo.png"
  59. ];
  60. $user = (new SaasMember)->where("open_id",$openId)->findOrEmpty();
  61. $userIn['id'] = $user['id'];
  62. if ($user->isEmpty()) {
  63. $userIn['id'] = $user->insertGetId($userIn);
  64. }
  65. // 同步已经下单的订单
  66. if (!empty($param['account_id'])) {
  67. $this->asyncDyOrder($param['account_id'],$openId);
  68. }
  69. $order = (new SaasOrderLife)->where("open_id",$openId)->where('order_id',$param['order_id'])->with(['goods' => function($query){
  70. $query->field("out_id,product_img");
  71. },'store' => function($query){
  72. $query->field("store_id,service_mobile");
  73. }])->append(['expire_at'])->withAttr(['expire_at' => function($data,$resp){
  74. return date("Y-m-d",strtotime($resp['expire_at']));
  75. }])->findOrEmpty();
  76. if ($order->isEmpty()) return error("订单尚未同步");
  77. $order['order'] = (new SaasOrder)->where("order_id",$param['order_id'])->where("status","in",[1,2,4])->field("order_sn,order_id")->findOrEmpty();
  78. return successTrans("success.data",[
  79. "user" => get_object_vars((new AuthMode)->guard("member")->login($userIn)),
  80. "order" => $order
  81. ]);
  82. } catch (\Throwable $throwable) {
  83. return error($throwable->getMessage());
  84. }
  85. }
  86. /**
  87. * 获取门店
  88. * @param Request $request
  89. * @return Response
  90. */
  91. #[Route(path: "store",methods: "post")]
  92. public function getLocationStore(Request $request): Response
  93. {
  94. try {
  95. $param = $this->_valid([
  96. "order.require" => "请求参数错误",
  97. "location.require" => "请求参数错误",
  98. "keyword.default" => ""
  99. ],'post');
  100. if (!is_array($param)) return error($param);
  101. $order = (new SaasOrderLife)->where("order_id",$param['order'])->where("open_id",$request->user['open_id'])->findOrEmpty();
  102. if ($order->isEmpty()) return error("订单尚未同步");
  103. $location = explode(",",$param['location']);
  104. $where = "store_id={$order['store_id']} and agent_id={$order['agent_id']}";
  105. if (!empty($param['keyword'])) {
  106. $where .= " and poi_name like '%".$param['keyword']."%'";
  107. }
  108. $resp = store_region($location[1],$location[0],2,$where);
  109. foreach ($resp as $key=>$val) {
  110. $resp[$key] = $val;
  111. $resp[$key]['poi_id'] = (string) $val['poi_id'];
  112. $resp[$key]['juli'] = format_money($val['juli']/1000);
  113. }
  114. $store = (new SaasStore)->where("store_id",$order['store_id'])->where("agent_id",$order['agent_id'])->findOrEmpty();
  115. return success("ok",[
  116. "data" => $resp,
  117. "store" => $store->toArray()
  118. ]);
  119. } catch (\Throwable $throwable) {
  120. return error($throwable->getMessage());
  121. }
  122. }
  123. /**
  124. * 订单列表
  125. * @param Request $request
  126. * @return Response
  127. */
  128. #[Route(path: "data",methods: "get")]
  129. public function getOrderList(Request $request): Response
  130. {
  131. try {
  132. $param = $this->_valid([
  133. "page.default" => 1,
  134. "size.default" => 10,
  135. "status.default" => 0
  136. ]);
  137. if (!is_array($param)) return error($param);
  138. $param['open_id'] = $request->user['open_id'];
  139. $list = (new OrderService)->getDataListMini($param);
  140. return successTrans(100010,pageFormat($list));
  141. } catch (\Throwable $throwable) {
  142. return error($throwable->getMessage());
  143. }
  144. }
  145. /**
  146. * 订单列表
  147. * @param Request $request
  148. * @return Response
  149. */
  150. #[Route(path: "detail",methods: "get")]
  151. public function getOrderDetail(Request $request): Response
  152. {
  153. try {
  154. $param = $this->_valid([
  155. "order.require" => "参数错误"
  156. ]);
  157. if (!is_array($param)) return error($param);
  158. $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
  159. $query->field("out_id,product_name,product_img,product_price");
  160. },'poi' => function ($query) {
  161. $query->field("poi_id,poi_name,poi_address");
  162. },'parent' => function($query){
  163. $query->field("order_id,pay_amount,expire_at,order_amount");
  164. },"store" => function($query){
  165. $query->field("store_id,service_mobile");
  166. }])->findOrEmpty();
  167. if ($order->isEmpty()) return error("订单数据异常");
  168. if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
  169. return successTrans("success.data",$order->toArray());
  170. } catch (\Throwable $throwable) {
  171. return error($throwable->getMessage());
  172. }
  173. }
  174. /**
  175. * 取消预约/服务
  176. * @param Request $request
  177. * @return Response
  178. */
  179. #[Route(path: "cancel",methods: "post")]
  180. public function cancelOrder(Request $request): Response
  181. {
  182. try {
  183. $param = $this->_valid([
  184. "order.require" => "参数错误",
  185. "type.default" => 1 // 1无需审核 2需要审核
  186. ],"post");
  187. if (!is_array($param)) return error($param);
  188. $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
  189. $query->field("out_id,product_name,product_img,product_price");
  190. },'poi' => function ($query) {
  191. $query->field("poi_id,poi_name,poi_address");
  192. }])->findOrEmpty();
  193. if ($order->isEmpty()) return error("订单数据异常");
  194. if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
  195. if (empty($order['certificate_id'])) {
  196. $orderDetail = (new DouyinOrder)->config($this->getDyConfig())->token()->getOrderDetail([$order['order_id']]);
  197. if (!isset($orderDetail['data']['certificate_info_list'][0]['certificate_id'])) return error("订单数据异常");
  198. $order->certificate_id = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
  199. $order['certificate_id'] = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
  200. }
  201. $resp = (new DouyinOrder)->config($this->getDyConfig())->token()->orderLock(1,$order['order_id'],$order['certificate_id'],$order['lock_key']);
  202. if ($resp['err_no'] <> 0) return error("取消失败,请重试");
  203. $order->status = 3;
  204. $order->save();
  205. (new SaasOrderLife)->where("order_id",$order['order_id'])->update(['status' => 1]);
  206. (new SaasOrderLog)->insertGetId([
  207. 'order_id' => $param['order'],
  208. "title" => "取消订单",
  209. "remark" => "用户取消核销信息"
  210. ]);
  211. return successTrans("success.data",$order->toArray());
  212. } catch (\Throwable $throwable) {
  213. echo $throwable->getLine()."\n";
  214. echo $throwable->getFile()."\n";
  215. return error($throwable->getMessage());
  216. }
  217. }
  218. }