Order.php 11 KB

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