Order.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <?php
  2. namespace app\controller\v2;
  3. use app\extra\basic\Base;
  4. use app\middleware\AuthMiddleware;
  5. use app\model\saas\SaasComplaint;
  6. use app\model\saas\SaasGoodsOff;
  7. use app\model\saas\SaasOrder;
  8. use app\model\saas\SaasOrderAddress;
  9. use app\model\saas\SaasOrderItem;
  10. use app\model\saas\SaasOrderRefund;
  11. use app\model\saas\SaasUserOpen;
  12. use app\service\saas\OrderService;
  13. use DI\Attribute\Inject;
  14. use LinFly\Annotation\Attributes\Route\Controller;
  15. use LinFly\Annotation\Attributes\Route\GetMapping;
  16. use LinFly\Annotation\Attributes\Route\Middleware;
  17. use LinFly\Annotation\Attributes\Route\PostMapping;
  18. use support\Request;
  19. use support\Response;
  20. #[Controller("/v2/order"),Middleware(AuthMiddleware::class)]
  21. class Order extends Base
  22. {
  23. #[Inject]
  24. protected SaasOrder $model;
  25. #[Inject]
  26. protected OrderService $service;
  27. #[GetMapping('list')]
  28. public function getDataList(Request $request): Response
  29. {
  30. try {
  31. $param = $request->all();
  32. if (!empty($param['size'])) {
  33. $param['pageSize'] = $param['size'];
  34. }
  35. if (empty($param['status'])) {
  36. $param['statusGt'] = 1;
  37. }
  38. $param['openid'] = $request->user['openid'];
  39. $data = $this->service->setModel()->getList($param,['product' => function($query){
  40. $query->field("product_id,product_name,price,is_new,line_price");
  41. },'poi' => function($query){
  42. $query->field("poi_id,poi_name");
  43. }]);
  44. return successTrans("success.data",pageFormat($data));
  45. } catch (\Throwable $th) {
  46. return error($th->getMessage());
  47. }
  48. }
  49. #[GetMapping('chat')]
  50. public function getDataListChat(Request $request): Response
  51. {
  52. try {
  53. $param = $request->all();
  54. if (!empty($param['size'])) {
  55. $param['pageSize'] = $param['size'];
  56. }
  57. if (empty($param['status'])) {
  58. $param['statusGt'] = 1;
  59. }
  60. $param['openid'] = $request->user['openid'];
  61. $data = $this->service->setModel()->getList($param,['product' => function($query){
  62. $query->field("product_id,product_name,price");
  63. },'poi' => function($query){
  64. $query->field("poi_id,poi_name");
  65. }]);
  66. return successTrans("success.data",pageFormat($data));
  67. } catch (\Throwable $th) {
  68. return error($th->getMessage());
  69. }
  70. }
  71. #[GetMapping('detail')]
  72. public function getDataDetail(Request $request): Response
  73. {
  74. try {
  75. $param = $this->_valid([
  76. "order.require" => trans("empty.require"),
  77. "option.default" => ""
  78. ],$request->method());
  79. if (!is_array($param)) return error($param);
  80. $where = [];
  81. if (stripos($param['order'], 'AL') !== false) {
  82. $where['out_order_no'] = $param['order'];
  83. } else {
  84. $where['order_sn'] = $param['order'];
  85. }
  86. $order = $this->model->where($where)->with(['product' => function($query){
  87. $query->field("product_id,product_name,price,is_new,line_price");
  88. },'poi' => function($query){
  89. $query->field("poi_id,poi_name,poi_address,poi_logo,longitude,latitude,poi_city,service_mobile,start_at,end_at");
  90. }])->append(['refund_num'])->withAttr(['refund_num' => function($data,$next){
  91. return (new SaasOrderItem)->where(['order_sn' => $next['order_sn'],'status' => 2])->count();
  92. }])->findOrEmpty();
  93. if ($order->isEmpty()) return errorTrans("empty.data");
  94. $order['end_time'] = timeDiff(strtotime("+30 minutes",strtotime($order['create_at'])),time());
  95. $order['mobile'] = $order['mobile']?hide_mobile($order['mobile']):'-';
  96. $user = (new SaasUserOpen)->where(['openid' => $request->user['openid']])->findOrEmpty();
  97. if ($user->isEmpty()) return error("数据错误");
  98. $userState = 1;
  99. if (empty($user['avatar'])) {
  100. $userState = 0;
  101. }
  102. $order['user'] = $userState;
  103. return $this->encode("ok",$order->toArray());
  104. } catch (\Throwable $th) {
  105. return error($th->getMessage());
  106. }
  107. }
  108. /**
  109. * 订单投诉
  110. * @param Request $request
  111. * @return Response
  112. */
  113. #[PostMapping("complaint")]
  114. public function setOrderComplaint(Request $request): Response
  115. {
  116. try {
  117. $param = $this->_valid([
  118. "content.require" => trans("empty.require"),
  119. "mobile.default" => "",
  120. "order.require" => trans("empty.require"),
  121. "text.require" => trans("empty.require"),
  122. ],$request->method());
  123. if (!is_array($param)) return error($param);
  124. $order = (new SaasOrder)->where("out_order_no",$param['order'])->findOrEmpty();
  125. if ($order->isEmpty()) return error("该笔交易不存在");
  126. if ($order['openid'] <> $request->user['openid']) return error("非法操作");
  127. $state = (new SaasComplaint)->insertGetId([
  128. "openid" => $request->user['openid'],
  129. "poi_id" => $order['poi_id'],
  130. "content" => $param['content'],
  131. "question" => $param['text'],
  132. "order_sn" => $param['order'],
  133. "mobile" => $param['mobile']??$order['mobile'],
  134. ]);
  135. if (!$state) return error("提交失败");
  136. return success("提交成功,请耐心等待");
  137. } catch (\Throwable $throwable) {
  138. return error($throwable->getMessage());
  139. }
  140. }
  141. #[GetMapping("goods")]
  142. public function getOrderGoods(Request $request): Response
  143. {
  144. try {
  145. $param = $this->_valid([
  146. "order.require" => trans("empty.require"),
  147. "page.default" => 0,
  148. "size.require" => 10,
  149. ],$request->method());
  150. if (!is_array($param)) return error($param);
  151. $order = (new SaasOrder)->where("out_order_no",$param['order'])->findOrEmpty();
  152. if ($order->isEmpty()) return error("该笔交易不存在");
  153. if ($order['openid'] <> $request->user['openid']) return error("非法操作");
  154. $goods = (new SaasGoodsOff)->where("goods_id",$order['life_goods_id'])->append(['check','number'])->withAttr(['check' => function(){
  155. return false;
  156. },'number' => function () {
  157. return 1;
  158. }])->paginate([
  159. "list_rows" => $param['size'],
  160. "page" => $param['page']
  161. ]);
  162. return successTrans("success.data",$goods->toArray());
  163. } catch (\Throwable $th) {
  164. return error($th->getMessage());
  165. }
  166. }
  167. /**
  168. * 提交核销信息-状态变为 进行中
  169. * @param Request $request
  170. * @return Response
  171. */
  172. #[PostMapping("done")]
  173. public function setOrderAddress(Request $request): Response
  174. {
  175. try {
  176. $param = $this->_valid([
  177. "city.require" => trans("empty.require"),
  178. "mobile.require" => trans("empty.require"),
  179. "mobile.mobile" => trans("error.mobile"),
  180. "address.require" => trans("empty.require"),
  181. "nickname.require" => trans("empty.require"),
  182. "order.require" => trans("empty.require"),
  183. "goods.require" => trans("empty.require"),
  184. ],$request->method());
  185. if (!is_array($param)) return error($param);
  186. $cityJson = json_decode($param['city'],true);
  187. $goodsJson = json_decode($param['goods'],true);
  188. $param['city_text'] = $cityJson['hide'];
  189. $param['city_code'] = json_encode($cityJson['list']);
  190. $param['goods'] = $goodsJson[0]['id'];
  191. $param['openid'] = $request->user['openid'];
  192. $order = (new SaasOrder)->where("out_order_no",$param["order"])->with(['poi'])->findOrEmpty();
  193. if ($order->isEmpty()) return error("关联订单错误");
  194. if ($order['openid'] <> $request->user['openid']) return error("关联订单错误");
  195. if ($order['status'] <> 1) return error("关联订单错误");
  196. $address = (new SaasOrderAddress)->where(['openid' => $request->user['openid'],'order_sn' => $param['order']])->findOrEmpty();
  197. if (!$address->isEmpty()) {
  198. $state = $address->setAutoData($param);
  199. if (!$state) return error("提交失败");
  200. return success("更新信息成功");
  201. }
  202. $param['order_sn'] = $param['order'];
  203. $address->setAutoData($param);
  204. $order->status = 7; // 7进行中
  205. $order->express_status = 1;
  206. $order->save();
  207. return success("提交成功");
  208. } catch (\Throwable $throwable) {
  209. return error($throwable->getMessage());
  210. }
  211. }
  212. /**
  213. * 核销后申请退款
  214. * Array
  215. * (
  216. * [order] => AL202608215835460704413
  217. * [msg] => 计划有变,暂时不需要了
  218. * [type] => alipay
  219. * [content] => {"truename":"测试","account":"13213442334"}
  220. * [content] => {"truename":"测试","bank":"13213442334","name":"中国银行xxx支行"}
  221. * )
  222. * @param Request $request
  223. * @return Response
  224. */
  225. #[PostMapping("refund")]
  226. public function setOrderRefund(Request $request): Response
  227. {
  228. try {
  229. $param = $this->_valid([
  230. "order.require" => trans("empty.require"),
  231. "msg.require" => trans("empty.require"),
  232. "type.require" => trans("empty.require"),
  233. "content.require" => trans("empty.require"),
  234. ],$request->method());
  235. if (!is_array($param)) return error($param);
  236. $order = $this->model->where("out_order_no",$param["order"])->with(['poi'])->findOrEmpty();
  237. if ($order->isEmpty()) return error("关联订单错误");
  238. if ($order['openid'] <> $request->user['openid']) return error("关联订单错误");
  239. if ($order['status'] <> 2) return error("订单不支持该操作");
  240. $refund = (new SaasOrderRefund)->where("order_sn",$param["order"])->findOrEmpty();
  241. if (!$refund->isEmpty()) {
  242. $refund->insertGetId([
  243. "order_sn" => $param['order'],
  244. "content" => !empty($param['content']) ? json_encode($param['content']) : [],
  245. "type" => $param['type'],
  246. "poi_id" => $order['poi_id'],
  247. ]);
  248. } else {
  249. $refund->save([
  250. "order_sn" => $param['order'],
  251. "content" => !empty($param['content']) ? json_encode($param['content']) : [],
  252. "type" => $param['type'],
  253. "poi_id" => $order['poi_id'],
  254. ]);
  255. }
  256. $order->status = 9;
  257. $order->refund_msg = json_encode([$param['msg']]);
  258. $state = $order->save();
  259. if (!$state) return error('申请失败');
  260. return success("申请成功");
  261. } catch (\Throwable $throwable) {
  262. return error($throwable->getMessage());
  263. }
  264. }
  265. /**
  266. * 履约中申请退款
  267. * Array
  268. * (
  269. * [order] => AL202608215835460704413
  270. * [msg] => 计划有变,暂时不需要了
  271. * )
  272. * @param Request $request
  273. * @return Response
  274. */
  275. #[PostMapping("keeps")]
  276. public function setOrderRefundKeeps(Request $request): Response
  277. {
  278. try {
  279. $param = $this->_valid([
  280. "order.require" => trans("empty.require"),
  281. "msg.require" => trans("empty.require"),
  282. ],$request->method());
  283. if (!is_array($param)) return error($param);
  284. $order = $this->model->where("out_order_no",$param["order"])->with(['poi'])->findOrEmpty();
  285. if ($order->isEmpty()) return error("关联订单错误");
  286. if ($order['openid'] <> $request->user['openid']) return error("关联订单错误");
  287. if ($order['status'] <> 7) return error("订单不支持该操作");
  288. $order->status = 8;
  289. $order->refund_msg = json_encode([$param['msg']]);
  290. $state = $order->save();
  291. if (!$state) return error('申请失败');
  292. return success("申请成功");
  293. } catch (\Throwable $throwable) {
  294. return error($throwable->getMessage());
  295. }
  296. }
  297. }