Order.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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. #[Controller(prefix: "/api/dy/order"),Middleware(DyMiddleware::class)]
  21. class Order extends Base
  22. {
  23. protected array $noNeedLogin = ["getLifeOrder"];
  24. #[Route(path: "life/detail",methods: "get")]
  25. public function getOrderLifeDetail(): Response
  26. {
  27. try {
  28. $param = $this->_valid([
  29. "order.require" => "请求参数错误",
  30. ]);
  31. if (!is_array($param)) return error($param);
  32. $order = (new SaasOrderLife)->where("certificate_id",$param['order'])->findOrEmpty();
  33. if ($order->isEmpty()) return error("订单数据已失效");
  34. return success("ok",$order->toArray());
  35. } catch (\Throwable $throwable) {
  36. return error($throwable->getMessage());
  37. }
  38. }
  39. /**
  40. * 来客订单详情
  41. * @param Request $request
  42. * @return Response
  43. */
  44. #[Route(path: "life",methods: "post")]
  45. public function getLifeOrder(Request $request): Response
  46. {
  47. try {
  48. $param = $request->post();
  49. $sessionKey = (new Crypt)->config($this->getDyConfig())->getSessionKey($param['auth']);
  50. if (empty($sessionKey)) return error("授权登录失败");
  51. if (!isset($sessionKey['openid'])) return error("获取数据失败");
  52. $openId = $sessionKey['openid'];
  53. $userIn = [
  54. 'open_id' => $openId,
  55. "create_ip" => $request->getRealIp(),
  56. "nickname" => "用户_".strtoupper(CodeExtend::random(3,5)),
  57. "avatar" => "https://img.inmei.cc/logo.png"
  58. ];
  59. $user = (new SaasMember)->where("open_id",$openId)->findOrEmpty();
  60. $userIn['id'] = $user['id'];
  61. if ($user->isEmpty()) {
  62. $userIn['id'] = $user->insertGetId($userIn);
  63. }
  64. // 同步已经下单的订单
  65. if (!empty($param['account_id'])) {
  66. $this->asyncDyOrder($param['account_id'],$openId,$param['order_id']);
  67. }
  68. echo getDateFull()."===={$openId}===同步订单\n";
  69. print_r($param);
  70. // where("open_id",$openId)->
  71. $order = (new SaasOrderLife)->where('order_id',$param['order_id'])->with(['goods' => function($query){
  72. $query->field("out_id,product_img");
  73. },'store' => function($query){
  74. $query->field("store_id,service_mobile");
  75. }])->append(['expire_at','order'])->withAttr(['expire_at' => function($data,$resp){
  76. return date("Y-m-d",strtotime($resp['expire_at']));
  77. },'order' => function($data,$resp){
  78. return (new SaasOrder)->where("certificate_id",$resp['certificate_id'])->where("express_status","in",[0,1,2,4])->field("order_sn,order_id")->findOrEmpty();
  79. }])->select();
  80. if ($order->isEmpty()) return error("订单尚未同步");
  81. (new SaasOrderLife)->where('order_id',$param['order_id'])->update(['open_id' => $openId]);
  82. // $order['order'] = (new SaasOrder)->where("order_id",$param['order_id'])->where("express_status","in",[0,1,2,4])->field("order_sn,order_id")->findOrEmpty();
  83. return successTrans("success.data",[
  84. "user" => get_object_vars((new AuthMode)->guard("member")->login($userIn)),
  85. "order" => $order
  86. ]);
  87. } catch (\Throwable $throwable) {
  88. echo $throwable->getLine()."\n";
  89. echo $throwable->getFile()."\n";
  90. return error($throwable->getMessage());
  91. }
  92. }
  93. /**
  94. * 获取门店
  95. * @param Request $request
  96. * @return Response
  97. */
  98. #[Route(path: "store",methods: "post")]
  99. public function getLocationStore(Request $request): Response
  100. {
  101. try {
  102. $param = $this->_valid([
  103. "order.require" => "请求参数错误",
  104. "location.require" => "请求参数错误",
  105. "keyword.default" => ""
  106. ],'post');
  107. if (!is_array($param)) return error($param);
  108. $order = (new SaasOrderLife)->where("certificate_id",$param['order'])->where("open_id",$request->user['open_id'])->findOrEmpty();
  109. if ($order->isEmpty()) return error("订单尚未同步");
  110. $location = explode(",",$param['location']);
  111. $where = "store_id={$order['store_id']} and agent_id={$order['agent_id']}";
  112. if (!empty($param['keyword'])) {
  113. $where .= " and poi_name like '%".$param['keyword']."%'";
  114. }
  115. $resp = store_region($location[1],$location[0],2,$where);
  116. foreach ($resp as $key=>$val) {
  117. $resp[$key] = $val;
  118. $resp[$key]['poi_id'] = (string) $val['poi_id'];
  119. $resp[$key]['juli'] = format_money($val['juli']/1000);
  120. }
  121. $store = (new SaasStore)->where("store_id",$order['store_id'])->where("agent_id",$order['agent_id'])->findOrEmpty();
  122. return success("ok",[
  123. "data" => $resp,
  124. "store" => $store->toArray()
  125. ]);
  126. } catch (\Throwable $throwable) {
  127. return error($throwable->getMessage());
  128. }
  129. }
  130. /**
  131. * 订单列表
  132. * @param Request $request
  133. * @return Response
  134. */
  135. #[Route(path: "data",methods: "get")]
  136. public function getOrderList(Request $request): Response
  137. {
  138. try {
  139. $param = $this->_valid([
  140. "page.default" => 1,
  141. "size.default" => 10,
  142. "status.default" => 0
  143. ]);
  144. if (!is_array($param)) return error($param);
  145. $param['open_id'] = $request->user['open_id'];
  146. $list = (new OrderService)->getDataListMini($param);
  147. return successTrans(100010,pageFormat($list));
  148. } catch (\Throwable $throwable) {
  149. return error($throwable->getMessage());
  150. }
  151. }
  152. /**
  153. * 订单列表
  154. * @param Request $request
  155. * @return Response
  156. */
  157. #[Route(path: "detail",methods: "get")]
  158. public function getOrderDetail(Request $request): Response
  159. {
  160. try {
  161. $param = $this->_valid([
  162. "order.require" => "参数错误"
  163. ]);
  164. if (!is_array($param)) return error($param);
  165. $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
  166. $query->field("out_id,product_name,product_img,product_price");
  167. },'poi' => function ($query) {
  168. $query->field("poi_id,poi_name,poi_address,longitude,latitude");
  169. },'parent' => function($query){
  170. $query->field("order_id,pay_amount,expire_at,order_amount");
  171. },"store" => function($query){
  172. $query->field("store_id,service_mobile");
  173. }])->findOrEmpty();
  174. if ($order->isEmpty()) return error("订单数据异常");
  175. if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
  176. return successTrans("success.data",$order->toArray());
  177. } catch (\Throwable $throwable) {
  178. return error($throwable->getMessage());
  179. }
  180. }
  181. /**
  182. * 取消预约/服务
  183. * @param Request $request
  184. * @return Response
  185. */
  186. #[Route(path: "cancel",methods: "post")]
  187. public function cancelOrder(Request $request): Response
  188. {
  189. try {
  190. $param = $this->_valid([
  191. "order.require" => "参数错误",
  192. "type.default" => 1 // 1无需审核 2需要审核
  193. ],"post");
  194. if (!is_array($param)) return error($param);
  195. $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
  196. $query->field("out_id,product_name,product_img,product_price");
  197. },'poi' => function ($query) {
  198. $query->field("poi_id,poi_name,poi_address");
  199. }])->findOrEmpty();
  200. if ($order->isEmpty()) return error("订单数据异常");
  201. if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
  202. if ($param['type'] == 1) {
  203. if (empty($order['certificate_id'])) {
  204. $orderDetail = (new DouyinOrder)->config($this->getDyConfig())->token()->getOrderDetail([$order['order_id']]);
  205. if (!isset($orderDetail['data']['certificate_info_list'][0]['certificate_id'])) return error("订单数据异常");
  206. $order->certificate_id = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
  207. $order['certificate_id'] = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
  208. }
  209. $resp = (new DouyinOrder)->config($this->getDyConfig())->token()->orderLock(1,$order['order_id'],$order['certificate_id'],$order['lock_key']);
  210. if ($resp['err_no'] <> 0) return error("取消失败,请重试");
  211. $order->express_status = 3;
  212. $lifeState = 1;
  213. } else {
  214. $order->express_status = 4;
  215. $lifeState = 2;
  216. }
  217. $order->refund_apply_at = getDateFull();
  218. $order->status = 3;
  219. $order->save();
  220. (new SaasOrderLife)->where("order_id",$order['order_id'])->update(['status' => $lifeState]);
  221. (new SaasOrderLog)->insertGetId([
  222. 'order_id' => $param['order'],
  223. "title" => "取消预约/服务",
  224. "remark" => ($param['type']==1?'用户取消预约,未发货自动同意解锁':'该订单已发货,需审核通过后才可解锁退款按钮')
  225. ]);
  226. return successTrans("success.data",$order->toArray());
  227. } catch (\Throwable $throwable) {
  228. echo $throwable->getLine()."\n";
  229. echo $throwable->getFile()."\n";
  230. return error($throwable->getMessage());
  231. }
  232. }
  233. /**
  234. * 删除预约订单
  235. * @param Request $request
  236. * @return Response
  237. */
  238. #[Route(path: "del",methods: "post")]
  239. public function delOrder(Request $request): Response
  240. {
  241. try {
  242. $param = $this->_valid([
  243. "order.require" => "参数错误"
  244. ], "post");
  245. if (!is_array($param)) return error($param);
  246. $order = (new SaasOrder)->where("order_sn",$param['order'])->findOrEmpty();
  247. if ($order->isEmpty()) return error("订单数据异常");
  248. if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
  249. if ($order['express_status'] == 4) return error("该订单正在撤销审核中,不允许删除!");
  250. $state = $order->delete();
  251. if (!$state) return error("删除失败");
  252. return success("删除成功");
  253. } catch (\Throwable $throwable) {
  254. echo $throwable->getLine()."\n";
  255. echo $throwable->getFile()."\n";
  256. return error($throwable->getMessage());
  257. }
  258. }
  259. }