StbzCallbackController.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\common\controllers;
  8. use app\constants\OptionSetting;
  9. use app\models\Goods;
  10. use app\models\PurchaseOrder;
  11. use app\models\Supplier;
  12. use app\modules\admin\models\PlatformForm;
  13. use app\modules\admin\models\SupplierForm;
  14. use app\modules\alliance\models\purchase\order\OrderForm;
  15. use yii\web\Controller;
  16. class StbzCallbackController extends Controller
  17. {
  18. // 验证签名
  19. public function checkSign($data)
  20. {
  21. }
  22. public function actionHandle()
  23. {
  24. $this->checkSign([]);
  25. \debug_log(\post_params());
  26. $post_data = \post_params();
  27. if ($post_data) {
  28. if (is_string($post_data)) {
  29. $post_data = json_decode($post_data, true);
  30. }
  31. $data = $post_data['data'];
  32. $type = 0;
  33. if ($post_data['type'] === 'order.delivery') { //订单发货
  34. $type = 1;
  35. $orderNoHead = substr($data['orderSn'], 0, 2);
  36. $result = [
  37. 'code' => 1,
  38. 'msg' => '状态错误'
  39. ];
  40. switch ($orderNoHead) {
  41. case 'PO':
  42. $result = $this->PurchaseOrderHandle($type, $data);
  43. break;
  44. case 'OR':
  45. $result = $this->OrderHandle($type, $data);
  46. break;
  47. }
  48. } elseif ($post_data['type'] === 'goods.undercarriage'
  49. || $post_data['type'] === 'goods.storage.delete'
  50. || $post_data['type'] === 'goods.storage.remove'
  51. || $post_data['type'] === 'goods.alter'
  52. || $post_data['type'] === 'goods.price.alter'
  53. ) {
  54. $order_url = "/user/setGoods";
  55. $order_data['params_data'] = [
  56. 'stbz_goods_id' => $post_data['data']['goodsIds'],
  57. 'status' => 2
  58. ];
  59. //如果下架或者删除商品就直接删除云仓商品
  60. //如果更改商品信息就下架
  61. if ($post_data['type'] === 'goods.alter'
  62. || $post_data['type'] === 'goods.price.alter') {
  63. //商品下架
  64. foreach ($post_data['data']['goodsIds'] as $item) {
  65. $goods = $this->actionGetGoodsItem($item);
  66. if ($goods['code'] == 1) {
  67. return json_encode($goods);
  68. }
  69. $attr = $this->handleAttr($goods['data']['specs'], $goods['data']['cover']);
  70. $data = [
  71. 'name' => $goods['data']['title'],
  72. 'goods_no' => (string)$item,
  73. 'g_s_pic_url' => $goods['data']['cover'],
  74. 'desc' => $goods['data']['description'],
  75. 'g_price' => sprintf('%.2f', $goods['data']['cost_price'] * 0.01),
  76. 'g_wholesale_price' => sprintf('%.2f', $goods['data']['sale_price'] * 0.01),
  77. 'g_wholesale_ladder_rebate' => '[]',
  78. 'g_wholesale_rebate_switch' => '0',
  79. 'weight' => '',
  80. 'g_original_price' => sprintf('%.2f', $goods['data']['sale_price'] * 0.01),
  81. 'g_unit' => $goods['data']['unit'],
  82. 'g_shop_count' => 1,
  83. 'num' => $goods['data']['total_stock'],
  84. 'use_attr' => '1',
  85. 'g_pic_list' => $goods['data']['covers'],
  86. 'g_send_type' => '0',
  87. 'attrs' => $attr,
  88. 'is_change' => 1,
  89. 'stbz_goods_id' => $item,
  90. 'market_price' => sprintf('%.2f', $goods['data']['market_price'] * 0.01)
  91. ];
  92. $result = $this->commonHandle($data, $item);
  93. if (intval($result['code']) !== 0) {
  94. return json_encode($result);
  95. }
  96. $order_data['params_data'] = json_encode([
  97. 'stbz_goods_id' => [$item],
  98. 'status' => $goods['data']['status'] == 1 ? 0 : 2,
  99. ]);
  100. $domain = (new OptionSetting)->getCloudDomainName();
  101. $orderInfo = cloud_post($domain. $order_url, $order_data);
  102. $orderInfo = json_decode($orderInfo,true);
  103. debug_log('胜天半子更改商品状态' . $goods['data']['status'] . json_encode($orderInfo));
  104. }
  105. return ;
  106. // $order_data['params_data']['status'] = 0;
  107. }
  108. $order_data['params_data'] = json_encode($order_data['params_data']);
  109. $domain = (new OptionSetting)->getCloudDomainName();
  110. $orderInfo = cloud_post($domain. $order_url,
  111. $order_data);
  112. $orderInfo = json_decode($orderInfo, true);
  113. if (intval($orderInfo['code']) === 0) {
  114. $cloud_goods_ids = array_column($orderInfo['data'], 'id');
  115. if ($post_data['type'] === 'goods.undercarriage') {
  116. Goods::updateAll(['status' => 0], ['cloud_goods_id' => $cloud_goods_ids, 'is_wholesale' => 0]);
  117. }
  118. }
  119. debug_log('胜天半子更改商品状态' . json_encode($orderInfo));
  120. } elseif ($post_data['type'] === 'order.cancel') { //订单取消
  121. } elseif ($post_data['type'] === 'afterSale.refuse') { //售后拒绝
  122. $this->PurchaseOrderHandle(2, $data, 1);
  123. } elseif ($post_data['type'] === 'afterSale.agree') { //售后同意
  124. $this->PurchaseOrderHandle(2, $data, 2);
  125. } elseif ($post_data['type'] === 'afterSale.success') { //退款到账
  126. $this->PurchaseOrderHandle(2, $data, 3);
  127. }
  128. return json_encode([
  129. 'code' => 1
  130. ]);
  131. }
  132. }
  133. public function commonHandle($data, $id = 0) {
  134. $supplier = Supplier::findOne(['is_stbz' => 1, 'is_delete' => 0]);
  135. if (!$supplier) {
  136. return [
  137. 'code' => 1,
  138. 'msg' => '供货商未找到',
  139. ];
  140. }
  141. $params = [
  142. 'goods_ids' => $id
  143. ];
  144. $stbz_result = \stbz_client()->getApiResponse('get', '/v2/GoodsStorage/Add', $params);
  145. $returnData = \json_decode($stbz_result, true);
  146. if ($returnData['code'] != 1 && $returnData['code'] != 0) {
  147. return [
  148. 'code' => 1,
  149. 'msg' => $returnData['msg'],
  150. ];
  151. }
  152. $supplierForm = new SupplierForm();
  153. $supplierForm->attributes = $data;
  154. $supplierForm->token_supplier_id = $supplier->cloud_supplier_id;
  155. $setGoods = $supplierForm->setGoods();
  156. if ($setGoods['code'] == 1) {
  157. return $setGoods;
  158. }
  159. // 提交审核
  160. $supplierForm = new SupplierForm();
  161. $supplierForm->attributes = ['goods_id' => $setGoods['data']['goods_id']];
  162. $supplierForm->token_supplier_id = $supplier->cloud_supplier_id;
  163. $submitAudit = $supplierForm->auditSubmit();
  164. if ($submitAudit['code'] == 1) {
  165. return $submitAudit;
  166. }
  167. // 审核商品
  168. $form = new PlatformForm();
  169. $form->attributes = [
  170. 'id' => $submitAudit['data']['goods_id'],
  171. 'status' => 1,
  172. ];
  173. return $form->auditHandle();
  174. }
  175. public function handleAttr($specs, $image) {
  176. $attr = [];
  177. foreach ($specs['options'] as $i) {
  178. $attr_list = [];
  179. $value_ids = explode('_', $i['spec_value_ids']);
  180. foreach ($value_ids as $ii) {
  181. foreach ($specs['values'] as $iii) {
  182. if ($ii == $iii['id']) {
  183. foreach ($specs['names'] as $iiii) {
  184. if ($iiii['id'] == $iii['spec_name_id']) {
  185. $attr_list = array_merge($attr_list, [
  186. [
  187. 'attr_group_name' => ($iiii['name'] === '默认' ? '规格' : $iiii['name']),
  188. 'attr_name' => $iii['name']
  189. ]
  190. ]);
  191. }
  192. }
  193. }
  194. }
  195. }
  196. $attr = array_merge($attr, [
  197. [
  198. 'attr_list' => $attr_list,
  199. 'num' => $i['stock'],
  200. 'price' => sprintf('%.2f', $i['cost_price'] * 0.01),
  201. 'wholesale_price' => sprintf('%.2f', $i['sale_price'] * 0.01),
  202. 'no' => $i['id'],
  203. 'pic' => $i['image'] == '' ? $image : $i['image'],
  204. 'share_commission_first' => '',
  205. 'share_commission_second' => '',
  206. 'share_commission_third' => '',
  207. ]
  208. ]);
  209. }
  210. return $attr;
  211. }
  212. private function PurchaseOrderHandle($type = 0, $data = null, $refund_status = 0) {
  213. try {
  214. $domain = (new OptionSetting)->getCloudDomainName();
  215. if ($type === 1) { //订单发货
  216. //获取订单信息
  217. $order_url = "/user/getOrder";
  218. $order_data['order_no'] = $data['orderSn'];
  219. $order_data['status'] = 1;
  220. $orderInfo = cloud_post($domain. $order_url,
  221. $order_data);
  222. $orderInfo = json_decode($orderInfo,true);
  223. if($orderInfo['code'] != 0){
  224. throw new \Exception($orderInfo['msg']);
  225. }else{
  226. $logistic = \stbz_client()->getApiResponse('get', '/v2/logistic', [
  227. 'orderSn' => $data['orderSn'],
  228. 'sku' => $data['sku'],
  229. ]);
  230. \debug_log($logistic);
  231. // $logistic = '{"id":"51OO7sen5LIgT4c7S9FX","code":1,"msg":"操作成功","data":{"list":null,"info":{"name":"皇家物流","no":"hj413132163413","remark":""}}}';
  232. $returnData = \json_decode($logistic, true);
  233. if ($returnData['code'] != 1) {
  234. throw new \Exception($returnData['msg']);
  235. }
  236. if(empty($returnData['data']['info']) || empty($returnData['data']['info']['no'])){
  237. throw new \Exception('物流单号是空的');
  238. }
  239. $name = $returnData['data']['info']['name'];
  240. $no = $returnData['data']['info']['no'];
  241. $orderInfo = $orderInfo['data'];
  242. $cloud_supplier_id = $orderInfo['supplier_id'];
  243. $supplier = new SupplierForm();
  244. $supplier->send_type = 1;
  245. $supplier->express_name = $name;
  246. $supplier->express_no = $no;
  247. $supplier->order_id = $orderInfo['id'];
  248. $result = $supplier->supplierPurchaseSend($cloud_supplier_id);
  249. if ((int)$result['code'] === 1) {
  250. throw new \Exception($result['msg']);
  251. }
  252. }
  253. } elseif ($type === 2) {//订单售后
  254. //获取订单信息
  255. $order_data['order_no'] = $data['orderSn'];
  256. $orderNoHead = substr($data['orderSn'], 0, 2);
  257. // $order_url = "/user/getOrder";
  258. $order_data['order_no'] = $data['orderSn'];
  259. $order_data['stbz_refund_id'] = $data['afterSaleId'];
  260. if ($orderNoHead === 'OR') {
  261. $order_data['status'] = 1;
  262. } else {
  263. $order_data['status'] = 0;
  264. }
  265. // if ($refund_status !== 3) {
  266. $order_url = "/user/getRefundOrder";
  267. // }
  268. $orderInfo = cloud_post($domain. $order_url,
  269. $order_data);
  270. $orderInfo = json_decode($orderInfo,true);
  271. if($orderInfo['code'] != 0){
  272. throw new \Exception($orderInfo['msg']);
  273. }else{
  274. $orderInfo = $orderInfo['data'];
  275. if ($refund_status === 3) {
  276. $orderTransit = \app\models\OrderTransit::findOne(['cloud_order_no' => $data['orderSn']]);
  277. $order = \app\models\Order::findone($orderTransit['order_id']);
  278. if($order){
  279. $order->stbz_refund_ok = 1;
  280. $order->save();
  281. }
  282. $result = [
  283. 'code' => 1,
  284. 'msg' => '状态错误'
  285. ];
  286. if ($orderNoHead === 'OR') {
  287. $order = PurchaseOrder::findOne(['cloud_order_id' => $orderInfo['id'], 'is_delete' => 0]);
  288. if ((int)$order['trade_status'] === 0) { //未发货时取消订单打款到账
  289. $form = new OrderForm();
  290. $form->delete_pass = 1;
  291. $result = $form->revokeApply($order);
  292. if ($result['code'] === 0) {
  293. return json_encode([
  294. 'code' => 1
  295. ]);
  296. } else {
  297. debug_log('打款失败');
  298. return;
  299. }
  300. }
  301. }
  302. $form = new SupplierForm();
  303. $form->status = 1;
  304. $form->is_agree = 1;
  305. $form->order_id = $orderInfo['id'];
  306. $res = $form->supplierApplyHandle($orderInfo['supplier_id']);
  307. } else {
  308. $form = new SupplierForm();
  309. $form->order_id = $orderInfo['id'];
  310. if ($refund_status === 1) {
  311. $form->is_agree = 2;
  312. $form->reason = "拒绝退货";
  313. $res = $form->supplierApplyHandle($orderInfo['supplier_id']);
  314. } else {
  315. $form->order_id = $orderInfo['order_id'];
  316. if ($orderNoHead === 'PO') {
  317. $res = $form->supplierPurchaseOrderList($orderInfo['supplier_id']);
  318. } else {
  319. $res = $form->supplierOrderList($orderInfo['supplier_id']);
  320. }
  321. if ($res['code'] !== 0) {
  322. debug_log('supplier_id' . $orderInfo['supplier_id']);
  323. debug_log($res['msg']);die;
  324. } else {
  325. debug_log('111');
  326. debug_log('order' . json_encode($orderInfo));
  327. debug_log('res' . json_encode($res));
  328. $stbz_refund_id = $res['data']['list'][0]['stbz_refund_id'];
  329. $goods_list = $res['data']['list'][0]['goods_list'];
  330. debug_log('goods_list' . json_encode($goods_list));
  331. if (!empty($goods_list)) {
  332. foreach ($goods_list as $item) {
  333. if ($item['stbz_goods_id'] && $item['goods_no']) {
  334. $goods_result = $this->actionGetAfterSaleItem($stbz_refund_id);
  335. if ($goods_result['code'] === 1) {
  336. return false;
  337. }
  338. $goods = $goods_result['data'];
  339. $form->is_agree = 1;
  340. $form->mobile = $goods['sellerInfo']['phone'];
  341. $form->name = $goods['sellerInfo']['realName'];
  342. $form->detail = $goods['sellerInfo']['address'];
  343. $form->zipcode = '1';
  344. $form->order_id = $orderInfo['id'];
  345. debug_log('115');
  346. $res = $form->supplierApplyHandle($orderInfo['supplier_id']);
  347. debug_log(json_encode($res));
  348. if ($res['code'] !== 0) {
  349. debug_log($res['msg']);die;
  350. }
  351. }
  352. }
  353. return json_encode([
  354. 'code' => 1
  355. ]);
  356. }
  357. }
  358. }
  359. }
  360. if ((int)$res['code'] === 0) {
  361. return json_encode([
  362. 'code' => 1
  363. ]);
  364. }
  365. }
  366. }
  367. } catch (\Exception $e) {
  368. debug_log('订单发货' . $e->getMessage() . $e->getFile() . $e->getLine());
  369. return [
  370. 'code' => 1,
  371. 'msg' => $e->getMessage()
  372. ];
  373. }
  374. }
  375. private function OrderHandle($type = 0, $data = null) {
  376. try {
  377. if ($type === 1) { //订单发货
  378. //获取订单信息
  379. $order_url = "/user/getOrder";
  380. $order_data['order_no'] = $data['orderSn'];
  381. $order_data['status'] = 2;
  382. $domain = (new OptionSetting)->getCloudDomainName();
  383. $orderInfo = cloud_post($domain. $order_url,
  384. $order_data);
  385. $orderInfo = json_decode($orderInfo,true);
  386. if($orderInfo['code'] != 0){
  387. throw new \Exception($orderInfo['msg']);
  388. }else{
  389. debug_log('order_info' . json_encode($orderInfo));
  390. $orderInfo = $orderInfo['data'];
  391. $cloud_supplier_id = $orderInfo['supplier_id'];
  392. debug_log('cloud_supplier_id' . $cloud_supplier_id);
  393. $supplier = new SupplierForm();
  394. $supplier->send_type = 2;
  395. $supplier->order_id = $orderInfo['id'];
  396. $result = $supplier->supplierOrderSend($cloud_supplier_id);
  397. if ((int)$result['code'] === 1) {
  398. throw new \Exception($result['msg']);
  399. }
  400. }
  401. }
  402. } catch (\Exception $e) {
  403. debug_log('订单发货' . $e->getMessage() . $e->getLine() . $e->getFile());
  404. return [
  405. 'code' => 1,
  406. 'msg' => $e->getMessage()
  407. ];
  408. }
  409. }
  410. /**
  411. * 获取商品详情
  412. * @author Syan mzsongyan@gmail.com
  413. * @date 2022-09-16
  414. */
  415. public function actionGetGoodsItem($goodsId = null)
  416. {
  417. $id = $goodsId;
  418. $params = [
  419. 'id' => $id,
  420. ];
  421. $key = md5(json_encode(\array_merge($params, ['type' => 'stbz_get_goods_item'])));
  422. if (0 && \Yii::$app->cache->exists($key)) {
  423. $data = \Yii::$app->cache->get($key);
  424. $returnData = \json_decode($data, true);
  425. } else {
  426. $data = \stbz_client()->getApiResponse('get', '/v2/Goods/Detail', $params);
  427. $returnData = \json_decode($data, true);
  428. if ($returnData['code'] != 1) {
  429. return [
  430. 'code' => 1,
  431. 'msg' => $returnData['msg'],
  432. ];
  433. }
  434. \Yii::$app->cache->set($key, $data, 600);
  435. }
  436. return [
  437. 'code' => 0,
  438. 'msg' => 'success',
  439. 'data' => $returnData['data'],
  440. ];
  441. }
  442. public function actionGetAfterSaleItem($id = null)
  443. {
  444. $data = \stbz_client()->getApiResponse('get', '/v2/afterSale/' . $id);
  445. $returnData = \json_decode($data, true);
  446. if ($returnData['code'] != 1) {
  447. return [
  448. 'code' => 1,
  449. 'msg' => $returnData['msg'],
  450. ];
  451. }
  452. return [
  453. 'code' => 0,
  454. 'msg' => 'success',
  455. 'data' => $returnData['data'],
  456. ];
  457. }
  458. public function setGoods($stbz_goods) {
  459. if ($stbz_goods['code'] === 1) {
  460. return false;
  461. }
  462. $goods = $stbz_goods['data'];
  463. $price = sprintf("%.2f", ($goods['agreement_price'] * 0.01));
  464. $original_price = sprintf("%.2f", ($goods['guide_price'] * 0.01));
  465. $attr = $this->setAttr($goods['specs'], $goods['cover']);
  466. if ($attr['code'] === 0) {
  467. $attr = $attr['data'];
  468. } else {
  469. debug_log($attr['msg']);
  470. }
  471. $data = [
  472. 'cat_id' => '0',
  473. 'name' => $goods['title'],
  474. 'goods_no' => (string)$goods['id'],
  475. 'g_s_pic_url' => $goods['cover'],
  476. 'desc' => $goods['description'],
  477. 'g_price' => $price,
  478. 'g_wholesale_price' => $price,
  479. 'g_wholesale_ladder_rebate' => '[]',
  480. 'g_wholesale_rebate_switch' => '0',
  481. 'weight' => '',
  482. 'g_original_price' => $original_price,
  483. 'g_unit' => $goods['unit'],
  484. 'g_shop_count' => 1,
  485. 'num' => $goods['total_stock'],
  486. 'use_attr' => '1',
  487. 'g_pic_list' => $goods['covers'],
  488. 'g_send_type' => '0',
  489. 'attrs' => $attr,
  490. 'is_change' => 1,
  491. 'stbz_goods_id' => $goods['id'],
  492. ];
  493. $supplier = Supplier::findOne(['is_stbz' => 1, 'is_delete' => 0]);
  494. if (!$supplier) {
  495. return [
  496. 'code' => 1,
  497. 'msg' => '供货商未找到',
  498. ];
  499. }
  500. $supplierForm = new SupplierForm();
  501. $supplierForm->attributes = $data;
  502. $supplierForm->token_supplier_id = $supplier->cloud_supplier_id;
  503. $setGoods = $supplierForm->setGoods();
  504. if ($setGoods['code'] == 1) {
  505. return $setGoods;
  506. }
  507. // 提交审核
  508. $supplierForm = new SupplierForm();
  509. $supplierForm->attributes = ['goods_id' => $setGoods['data']['goods_id']];
  510. $supplierForm->token_supplier_id = $supplier->cloud_supplier_id;
  511. $submitAudit = $supplierForm->auditSubmit();
  512. debug_log('审核' . json_encode($submitAudit));
  513. if ($submitAudit['code'] == 1) {
  514. return $submitAudit;
  515. }
  516. // 审核商品
  517. $form = new PlatformForm();
  518. $form->attributes = [
  519. 'id' => $submitAudit['data']['goods_id'],
  520. 'status' => 1,
  521. ];
  522. $res = $form->auditHandle();
  523. debug_log('审核' . json_encode($submitAudit));
  524. if ($res['code'] == 1) {
  525. return $submitAudit;
  526. }
  527. }
  528. public function setAttr($specs, $cover) {
  529. try {
  530. $attr = [];
  531. foreach ($specs['options'] as $option) {
  532. $attr_list = [];
  533. $value_ids = explode('_', $option['spec_value_ids']);
  534. foreach ($value_ids as $value_id) {
  535. foreach ($specs['values'] as $value) {
  536. if ($value_id === $value['id']) {
  537. foreach ($specs['names'] as $name) {
  538. if ($name['id'] === $value['spec_name_id']) {
  539. array_push($attr_list, [
  540. 'attr_group_name' => $name['name'] === '默认' ? '规格' : $name['name'],
  541. 'attr_name' => $value['name']
  542. ]);
  543. }
  544. }
  545. }
  546. }
  547. }
  548. array_push($attr, [
  549. 'attr_list' => $attr_list,
  550. 'num' => $option['stock'],
  551. 'price' => sprintf("%.2f", ($option['agreement_price'] * 0.01)),
  552. 'wholesale_price' => sprintf("%.2f", ($option['agreement_price'] * 0.01)),
  553. 'no' => $option['id'],
  554. 'pic' => $option['image'] ?: $cover,
  555. 'share_commission_first' => '',
  556. 'share_commission_second' => '',
  557. 'share_commission_third' => '',
  558. 'weight' => $option['weight']
  559. ]);
  560. }
  561. return [
  562. 'code' => 0,
  563. 'msg' => 'success',
  564. 'data' => $attr
  565. ];
  566. } catch (\Exception $e) {
  567. return [
  568. 'code' => 1,
  569. 'msg' => $e->getMessage()
  570. ];
  571. }
  572. }
  573. }