Order.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. namespace app\controller\merchant;
  3. use app\extra\basic\Base;
  4. use app\extra\douyin\Order as DouyinOrder;
  5. use app\extra\service\saas\OrderLogService;
  6. use app\extra\service\saas\OrderService;
  7. use app\middleware\AuthMiddleware;
  8. use app\model\saas\SaasOrder;
  9. use app\model\saas\SaasOrderLife;
  10. use app\model\saas\SaasOrderLog;
  11. use DI\Attribute\Inject;
  12. use LinFly\Annotation\Route\Controller;
  13. use LinFly\Annotation\Route\Route;
  14. use support\Request;
  15. use support\Response;
  16. use Webman\Annotation\Middleware;
  17. #[Controller(prefix: "/api/merchant/order"),Middleware(AuthMiddleware::class)]
  18. class Order extends Base
  19. {
  20. #[Inject]
  21. protected OrderService $service;
  22. #[Inject]
  23. protected OrderLogService $log;
  24. #[Inject]
  25. protected SaasOrder $mode;
  26. #[Route(path: "list",methods: "get")]
  27. public function getOrderList(Request $request): Response
  28. {
  29. try {
  30. $param = $request->get();
  31. $param['agent'] = $request->user['agent_id'];
  32. $list = $this->service->getList($param);
  33. return successTrans("success.data",pageFormat($list),200);
  34. } catch (\Throwable $throwable) {
  35. return error($throwable->getMessage());
  36. }
  37. }
  38. #[Route(path: "log",methods: "get")]
  39. public function getOrderLog(Request $request): Response
  40. {
  41. try {
  42. $param = $request->get();
  43. $list = $this->log->getList($param);
  44. return successTrans("success.data",$list,200);
  45. } catch (\Throwable $throwable) {
  46. return error($throwable->getMessage());
  47. }
  48. }
  49. /**
  50. * 更新收货地址
  51. * @param Request $request
  52. * @return Response
  53. */
  54. #[Route(path: "save",methods: "post")]
  55. public function save(Request $request): Response
  56. {
  57. try {
  58. $param = $this->_valid([
  59. "id.require" => trans("empty.require"),
  60. "username.require" => trans("empty.require"),
  61. "mobile.require" => trans("empty.require"),
  62. "address.require" => trans("empty.require")
  63. ],"post");
  64. if (!is_array($param)) return error($param);
  65. $order = $this->mode->where("order_sn",$param['order'])->findOrEmpty();
  66. if ($order->isEmpty()) return error("订单数据异常");
  67. $state = $order->save($param);
  68. if (!$state) return errorTrans("error.data");
  69. return successTrans("success.data");
  70. } catch (\Throwable $throwable) {
  71. echo $throwable->getMessage()."\n";
  72. echo $throwable->getFile()."\n";
  73. echo $throwable->getLine()."\n";
  74. return error($throwable->getMessage());
  75. }
  76. }
  77. /**
  78. * 批量修改订单状态
  79. * @param Request $request
  80. * @return Response
  81. */
  82. #[Route(path: "batch",methods: "post")]
  83. public function batchSetState(Request $request): Response
  84. {
  85. try {
  86. $param = $this->_valid([
  87. "order.require" => trans("empty.require")
  88. ],"post");
  89. if (!is_array($param)) return error($param);
  90. $state = $this->mode->where("order_sn","in",$param['order'])->save(['express_status' => 1,'status' => 2]);
  91. $log = [];
  92. foreach ($param['order'] as $key=>$val) {
  93. $log[$key] = [
  94. 'order_id' => $val,
  95. "title" => "手动发货",
  96. "remark" => "管理员手动完成发货,订单进入待核销"
  97. ];
  98. }
  99. (new SaasOrderLog)->insertAll($log);
  100. if (!$state) return errorTrans("error.data");
  101. return successTrans("success.data");
  102. } catch (\Throwable $throwable) {
  103. return error($throwable->getMessage());
  104. }
  105. }
  106. /**
  107. * 同意解锁申请
  108. * @param Request $request
  109. * @return Response
  110. */
  111. #[Route(path: "agree",methods: "post")]
  112. public function setOrderAgree(Request $request): Response
  113. {
  114. try {
  115. $param = $this->_valid([
  116. "order.require" => trans("empty.require")
  117. ],"post");
  118. if (!is_array($param)) return error($param);
  119. $order = $this->mode->where("order_sn",$param['order'])->with(['goods' => function($query){
  120. $query->field("out_id,product_name,product_img,product_price");
  121. },'poi' => function ($query) {
  122. $query->field("poi_id,poi_name,poi_address");
  123. }])->findOrEmpty();
  124. if ($order->isEmpty()) return error("订单数据异常");
  125. $resp = (new DouyinOrder)->config($this->getDyConfig())->token()->orderLock(1,$order['order_id'],$order['certificate_id'],$order['lock_key']);
  126. if ($resp['err_no'] <> 0) return error($resp['err_msg']);
  127. $order->status = 3;
  128. $order->express_status = 3;
  129. $order->refund_at = getDateFull();
  130. $state = $order->save();
  131. (new SaasOrderLife)->where("order_id",$order['order_id'])->update(['status' => 1]);
  132. (new SaasOrderLog)->insertGetId([
  133. 'order_id' => $param['order'],
  134. "title" => "同意解锁申请",
  135. "remark" => "管理员手动同意解锁申请,用户可以申请退款"
  136. ]);
  137. if (!$state) return errorTrans("error.data");
  138. return successTrans("success.data");
  139. } catch (\Throwable $throwable) {
  140. return error($throwable->getMessage());
  141. }
  142. }
  143. /**
  144. * 拒绝解锁申请
  145. * @param Request $request
  146. * @return Response
  147. */
  148. #[Route(path: "refuse",methods: "post")]
  149. public function setOrderRefuse(Request $request): Response
  150. {
  151. try {
  152. $param = $this->_valid([
  153. "order.require" => trans("empty.require")
  154. ],"post");
  155. if (!is_array($param)) return error($param);
  156. $order = $this->mode->where("order_sn",$param['order'])->findOrEmpty();
  157. if ($order->isEmpty()) return error("订单数据异常");
  158. $order->status = 2;
  159. $order->express_status = 1;
  160. $order->refund_at = getDateFull();
  161. $state = $order->save();
  162. (new SaasOrderLog)->insertGetId([
  163. 'order_id' => $param['order'],
  164. "title" => "拒绝解锁申请",
  165. "remark" => "管理员手动拒绝解锁申请,用户还不能申请退款"
  166. ]);
  167. if (!$state) return errorTrans("error.data");
  168. return successTrans("success.data");
  169. } catch (\Throwable $throwable) {
  170. return error($throwable->getMessage());
  171. }
  172. }
  173. /**
  174. * 手动核销
  175. * @param Request $request
  176. * @return Response
  177. */
  178. #[Route(path: "end",methods: "post")]
  179. public function setOrderEnd(Request $request): Response
  180. {
  181. try {
  182. $param = $this->_valid([
  183. "order.require" => trans("empty.require")
  184. ],"post");
  185. if (!is_array($param)) return error($param);
  186. $order = $this->mode->where("order_sn",$param['order'])->findOrEmpty();
  187. if ($order->isEmpty()) return error("订单数据异常");
  188. $dyConfig = sConf("dy.");
  189. $endStart = strtotime(date("Y-m-d ".$dyConfig['end_start'].":00"));
  190. $endEnd = strtotime(date("Y-m-d ".$dyConfig['end_end'].":00"));
  191. if (time() < $endStart) return error("为确保店铺安全,该时间内系统暂停核销功能!");
  192. if (time() > $endEnd) return error("为确保店铺安全,该时间内系统暂停核销功能~");
  193. if (empty($order['verify_id'])) {
  194. $resp = (new \app\extra\douyin\Order)->config($this->getDyConfig())->token()->verifyOrder($order->toArray());
  195. if ($resp['err_no'] <> 0) return error($resp['err_msg']);
  196. $verify_id = $resp['data']['order_verify_results'][0]['certificate_verify_results'][0]['verify_id']??'';
  197. $order->verify_id = $verify_id;
  198. $order['verify_id'] = $verify_id;
  199. }
  200. $resps = (new \app\extra\douyin\Order)->config($this->getDyConfig())->token()->verifyOrderPush($order['order_id'],[$order['verify_id']]);
  201. if ($resps['err_no'] <> 0) return error($resps['err_msg']);
  202. $order->express_status = 2;
  203. $order->status = 4;
  204. $state = $order->save();
  205. (new SaasOrderLife)->where("order_id",$order['order_id'])->update(['status' => 3]);
  206. (new SaasOrderLog)->insertGetId([
  207. 'order_id' => $param['order'],
  208. "title" => "完成核销",
  209. "remark" => "管理员手动完成就核销,该笔交易完成"
  210. ]);
  211. if (!$state) return errorTrans("error.data");
  212. return successTrans("success.data");
  213. } catch (\Throwable $throwable) {
  214. return error($throwable->getMessage());
  215. }
  216. }
  217. /**
  218. * 手动呼叫快递
  219. * @param Request $request
  220. * @return Response
  221. */
  222. #[Route(path: "express",methods: "post")]
  223. public function setOrderExpress(Request $request): Response
  224. {
  225. try {
  226. $param = $this->_valid([
  227. "order.require" => trans("empty.require")
  228. ],"post");
  229. if (!is_array($param)) return error($param);
  230. $order = $this->mode->where("order_sn",$param['order'])->findOrEmpty();
  231. if ($order->isEmpty()) return error("订单数据异常");
  232. $dyConfig = sConf("dy.");
  233. $endStart = strtotime(date("Y-m-d ".$dyConfig['express_start'].":00"));
  234. $endEnd = strtotime(date("Y-m-d ".$dyConfig['express_end'].":00"));
  235. if (time() < $endStart) return error("为确保店铺安全,该时间内系统暂停呼叫快递功能!");
  236. if (time() > $endEnd) return error("为确保店铺安全,该时间内系统暂停呼叫快递功能~");
  237. return errorTrans("error.data");
  238. } catch (\Throwable $throwable) {
  239. return error($throwable->getMessage());
  240. }
  241. }
  242. }