Copy99api.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace crmeb\services\copyproduct\storage;
  12. use crmeb\services\copyproduct\BaseCopyProduct;
  13. use crmeb\services\CacheService;
  14. use crmeb\services\HttpService;
  15. /**
  16. * Class Copy99api
  17. * @package crmeb\services\copyproduct\storage
  18. */
  19. class Copy99api extends BaseCopyProduct
  20. {
  21. /**
  22. * @var string[]
  23. */
  24. protected $host = ['taobao', 'tmall', 'jd', 'pinduoduo', 'suning', 'yangkeduo', '1688'];
  25. //接口地址
  26. protected static $api = [
  27. 'taobao' => 'https://api03.6bqb.com/taobao/detail', //https://api03.6bqb.com/app/taobao/detail
  28. 'tmall' => 'https://api03.6bqb.com/tmall/detail',
  29. 'jd' => 'https://api03.6bqb.com/jd/detail',
  30. 'pdd' => 'https://api03.6bqb.com/pdd/detail',
  31. 'suning' => 'https://api03.6bqb.com/suning/detail',
  32. '1688' => 'https://api03.6bqb.com/alibaba/detail'
  33. ];
  34. protected static $apiKey = '';//996EF05B079F8706345938A0CD7339BB
  35. //商品默认字段
  36. protected static $productInfo = [
  37. 'cate_id' => '',
  38. 'store_name' => '',
  39. 'store_info' => '',
  40. 'unit_name' => '件',
  41. 'price' => 0,
  42. 'keyword' => '',
  43. 'ficti' => 0,
  44. 'ot_price' => 0,
  45. 'give_integral' => 0,
  46. 'postage' => 0,
  47. 'cost' => 0,
  48. 'image' => '',
  49. 'slider_image' => '',
  50. 'video_link' => '',
  51. 'add_time' => 0,
  52. 'stock' => 0,
  53. 'description' => '',
  54. 'description_images' => [],
  55. 'soure_link' => '',
  56. 'temp_id' => '',
  57. 'items' => [],
  58. 'attrs' => [],
  59. 'info' => [],
  60. 'sku' => []
  61. ];
  62. /**
  63. * 整合
  64. * @param $url
  65. * @param $method
  66. * @param $data
  67. * @return string
  68. */
  69. public static function makeUrl(string $url, string $method, array $data)
  70. {
  71. $param = '';
  72. if (strtolower($method) == 'get' && $data) {
  73. foreach ($data as $key => $value) {
  74. $param .= '&' . $key . '=' . $value;
  75. }
  76. }
  77. return $url . '?apikey=' . self::$apiKey . $param;
  78. }
  79. /**
  80. * @param bool $status
  81. * @param string $msg
  82. * @param array $data
  83. */
  84. public static function setReturn(bool $status = true, string $msg = 'SUCCESS', array $data = [])
  85. {
  86. return ['status' => $status, 'msg' => $msg, 'data' => $data];
  87. }
  88. public function open()
  89. {
  90. return true;
  91. }
  92. public function getType(string $link)
  93. {
  94. $shopid = 0;
  95. $url_arr = parse_url($link);
  96. if (isset($url_arr['host'])) {
  97. foreach ($this->host as $name) {
  98. if (strpos($url_arr['host'], $name) !== false) {
  99. $type = $name;
  100. }
  101. }
  102. }
  103. $type = ($type == 'pinduoduo' || $type == 'yangkeduo') ? 'pdd' : $type;
  104. switch ($type) {
  105. case 'taobao':
  106. case 'tmall':
  107. $params = [];
  108. if (isset($url_arr['query']) && $url_arr['query']) {
  109. $queryParts = explode('&', $url_arr['query']);
  110. foreach ($queryParts as $param) {
  111. $item = explode('=', $param);
  112. if (isset($item[0]) && $item[1]) $params[$item[0]] = $item[1];
  113. }
  114. }
  115. $id = $params['id'] ?? '';
  116. break;
  117. case 'jd':
  118. $params = [];
  119. if (isset($url_arr['path']) && $url_arr['path']) {
  120. $path = str_replace('.html', '', $url_arr['path']);
  121. $params = explode('/', $path);
  122. }
  123. $id = $params[1] ?? '';
  124. break;
  125. case 'pdd':
  126. $params = [];
  127. if (isset($url_arr['query']) && $url_arr['query']) {
  128. $queryParts = explode('&', $url_arr['query']);
  129. foreach ($queryParts as $param) {
  130. $item = explode('=', $param);
  131. if (isset($item[0]) && $item[1]) $params[$item[0]] = $item[1];
  132. }
  133. }
  134. $id = $params['goods_id'] ?? $params['goodsId'] ?? '';
  135. break;
  136. case 'suning':
  137. $params = [];
  138. if (isset($url_arr['path']) && $url_arr['path']) {
  139. $path = str_replace('.html', '', $url_arr['path']);
  140. $params = explode('/', $path);
  141. }
  142. $id = $params[2] ?? '';
  143. $shopid = $params[1] ?? '';
  144. break;
  145. case '1688':
  146. $params = [];
  147. if (isset($url_arr['query']) && $url_arr['query']) {
  148. $path = str_replace('.html', '', $url_arr['path']);
  149. $params = explode('/', $path);
  150. }
  151. $id = $params[2] ?? '';
  152. $shopid = $params[1] ?? '';
  153. break;
  154. }
  155. return [$type, $id, $shopid];
  156. }
  157. /**
  158. *
  159. * @param string $link
  160. * @param array $options
  161. * @return array
  162. */
  163. public function goods(string $link, array $options = [])
  164. {
  165. [$type, $id, $shopid] = $this->getType($link);
  166. $apikey = $options['apikey'] ?? null;
  167. $data = [
  168. 'itemid' => $id,
  169. 'shopid' => $shopid,
  170. ];
  171. if (!$apikey) {
  172. return self::setReturn(false, '请先去设置复制商品apiKey');
  173. }
  174. $url = self::$api[$type] ?? '';
  175. $type = $type == '1688' ? 'alibaba' : $type;
  176. $action = $type . 'Info';
  177. $deal_action = $type . 'Deal';
  178. $method = 'get';
  179. self::$apiKey = $apikey;
  180. if (!$data || !$url || !is_callable(self::class, $action) || !is_callable(self::class, $deal_action)) {
  181. return self::setReturn(false, '暂不支持该平台商品复制');
  182. }
  183. switch ($type) {
  184. case 'taobao':
  185. case 'tmall':
  186. case 'jd':
  187. case 'pdd':
  188. case 'alibaba':
  189. $method = 'get';
  190. if (!isset($data['itemid']) || !$data['itemid'])
  191. return self::setReturn(false, '缺少商品ID');
  192. break;
  193. case 'suning':
  194. $method = 'get';
  195. if (!isset($data['itemid']) || !$data['itemid'])
  196. return self::setReturn(false, '缺少商品ID');
  197. if (!isset($data['shopid']) || !$data['shopid'])
  198. return self::setReturn(false, '缺少商户ID');
  199. break;
  200. }
  201. $url = self::makeUrl($url, $method, $data);
  202. if ($cache_info = CacheService::get(md5($url))) {
  203. return self::setReturn(true, 'SUCCESS', $cache_info);
  204. }
  205. $info = self::$action($url, $data);
  206. if (!$info) return self::setReturn(false, '获取商品失败');
  207. $info = json_decode($info, true);
  208. if (!$info || (!in_array($info['retcode'], ['0000']))) {
  209. return self::setReturn(false, $info['message'] ?? '获取商品失败', $info);
  210. }
  211. $result = $info['data'];
  212. //可能存在下一页 但是api中没有分页参数 暂留
  213. // if (isset($info['hasNext']) && $info['hasNext']) {
  214. // $data['page'] = $info['page'] + 1;
  215. // }
  216. $result = self::$deal_action($result);
  217. //过滤采集到的规格 删除其中的空值
  218. if ($result['items']) {
  219. foreach ($result['items'] as $k => $item) {
  220. if (isset($item['value'])) {
  221. if ($item['value'] == '') unset($result['items'][$k]);
  222. if (!$item['detail'] || !isset($item['detail'][0]) || $item['detail'][0] == '') unset($result['items'][$k]);
  223. } else {
  224. unset($result['items'][$k]);
  225. }
  226. }
  227. }
  228. if (!$result['items']) {
  229. $result['items'] = [
  230. [
  231. 'value' => '默认',
  232. 'detail' => [
  233. '默认'
  234. ]
  235. ]
  236. ];
  237. }
  238. $result['info'] = self::formatAttr($result['items'], $result['sku']);
  239. if (!$result['image'] && $result['slider_image'])
  240. $result['image'] = $result['slider_image'][0] ?? '';
  241. if ($result['description']) {
  242. $result['description'] = str_replace('data-lazyload', 'src', $result['description']);
  243. }
  244. CacheService::set(md5($url), $result, 3600 * 24);
  245. return self::setReturn(true, 'SUCCESS', $result);
  246. }
  247. /**
  248. * 获取淘宝商品
  249. * @param $url
  250. * @param $data
  251. * @param string $method
  252. * @return bool|string
  253. */
  254. public static function taobaoInfo(string $url, array $data, string $method = 'get')
  255. {
  256. $info = HttpService::request($url, $method, $data);
  257. $result = false;
  258. if ($info) {
  259. $result = $info;
  260. }
  261. return $result;
  262. }
  263. /**
  264. * 处理获取淘宝的商品
  265. * @param $data
  266. * @return mixed
  267. */
  268. public static function taobaoDeal(array $data)
  269. {
  270. $info = $data['item'] ?? [];
  271. $result = self::$productInfo;
  272. if ($info) {
  273. $result['store_name'] = $info['title'] ?? '';
  274. $result['store_info'] = $info['subTitle'] ?? '';
  275. $result['slider_image'] = $info['images'] ?? '';
  276. $result['description'] = $info['desc'] ?? '';
  277. $result['description_images'] = $info['descImgs'] ?? [];
  278. $items = [];
  279. if (isset($info['props']) && $info['props']) {
  280. foreach ($info['props'] as $key => $prop) {
  281. $item['value'] = $prop['name'];
  282. $item['detail'] = [];
  283. foreach ($prop['values'] as $name) {
  284. $item['detail'][] = $name['name'];
  285. }
  286. $items[] = $item;
  287. }
  288. }
  289. $sku = [];
  290. if (isset($info['sku']) && $info['sku']) {
  291. foreach ($info['sku'] as $item) {
  292. if ($item['skuId']) {
  293. $skuName = explode(';', $item['skuName']);
  294. $skuNameData = [];
  295. foreach ($skuName as $v) {
  296. [$kp, $vv] = explode('--', $v);
  297. $skuNameData[] = $vv;
  298. }
  299. $sku[implode(',', $skuNameData)] = [
  300. 'price' => $item['price']
  301. ];
  302. }
  303. }
  304. }
  305. $result['sku'] = $sku;
  306. $result['items'] = array_merge($items);
  307. }
  308. return $result;
  309. }
  310. /**
  311. * 获取天猫商品
  312. * @param $url
  313. * @param $data
  314. * @param string $method
  315. * @return bool|string
  316. */
  317. public static function tmallInfo(string $url, array $data, string $method = 'get')
  318. {
  319. $info = HttpService::request($url, $method, $data);
  320. $result = false;
  321. if ($info) {
  322. $result = $info;
  323. }
  324. return $result;
  325. }
  326. /**
  327. * 处理天猫商品
  328. * @param $data
  329. * @return mixed
  330. */
  331. public static function tmallDeal(array $data)
  332. {
  333. $info = $data['item'] ?? [];
  334. $result = self::$productInfo;
  335. if ($info) {
  336. $result['store_name'] = $info['title'] ?? '';
  337. $result['store_info'] = $info['subTitle'] ?? '';
  338. $result['slider_image'] = self::lingByHttp($info['images'] ?? '');
  339. $result['description_images'] = self::lingByHttp($info['descImgs'] ?? []);
  340. $description = '';
  341. foreach ($result['description_images'] as $item) {
  342. $description .= '<img src="' . $item . '">';
  343. }
  344. unset($item);
  345. $result['description'] = $description;
  346. $items = [];
  347. if (isset($info['props']) && $info['props']) {
  348. foreach ($info['props'] as $key => $prop) {
  349. $item['value'] = $prop['name'];
  350. $item['detail'] = [];
  351. foreach ($prop['values'] as $name) {
  352. $item['detail'][] = $name['name'];
  353. }
  354. $items[] = $item;
  355. }
  356. }
  357. $sku = [];
  358. if (isset($info['sku']) && $info['sku']) {
  359. foreach ($info['sku'] as $item) {
  360. if ($item['skuId']) {
  361. $skuName = explode(';', $item['skuName']);
  362. $skuNameData = [];
  363. foreach ($skuName as $v) {
  364. [$kp, $vv] = explode('--', $v);
  365. $skuNameData[] = $vv;
  366. }
  367. $sku[implode(',', $skuNameData)] = [
  368. 'price' => $item['price']
  369. ];
  370. }
  371. }
  372. }
  373. $result['sku'] = $sku;
  374. $result['items'] = array_merge($items);
  375. }
  376. return $result;
  377. }
  378. /**
  379. * 获取京东商品
  380. * @param $url
  381. * @param $data
  382. * @param string $method
  383. * @return bool|string
  384. */
  385. public static function jdInfo(string $url, array $data, string $method = 'get')
  386. {
  387. $info = HttpService::request($url, $method, $data);
  388. $result = false;
  389. if ($info) {
  390. $result = $info;
  391. }
  392. return $result;
  393. }
  394. /**
  395. * 处理京东商品
  396. * @param $data
  397. * @return mixed
  398. */
  399. public static function jdDeal(array $data)
  400. {
  401. $info = $data['item'] ?? [];
  402. $result = self::$productInfo;
  403. if ($info) {
  404. $result['store_name'] = $info['name'] ?? '';
  405. $result['store_info'] = $result['store_name'];
  406. $result['price'] = $info['price'] ?? 0;
  407. $result['ot_price'] = $info['originalPrice'] ?? 0;
  408. $result['slider_image'] = $info['images'] ?? [];
  409. $result['description'] = $info['desc'] ?? '';
  410. $result['description_images'] = $info['descImgs'] ?? [];
  411. $result['description_images'] = array_map(function ($item) {
  412. if (strstr($item, 'http') === false) {
  413. $item = 'http:' . $item;
  414. }
  415. return $item;
  416. }, $result['description_images']);
  417. if (strstr($result['description'], '<style>') !== false && strstr($result['description'], '<img') === false) {
  418. $content = '';
  419. foreach ($result['description_images'] as $item_img) {
  420. $content .= '<p><img src="' . $item_img . '"></p>';
  421. }
  422. $result['description'] = $content;
  423. }
  424. $items = [];
  425. if (isset($info['skuProps']) && $info['skuProps']) {
  426. foreach ($info['skuProps'] as $key => $prop) {
  427. $item['value'] = $info['saleProp'][$key] ?? '';
  428. $item['detail'] = $prop;
  429. $items[] = $item;
  430. }
  431. }
  432. $sku = [];
  433. if (isset($info['sku']) && $info['sku']) {
  434. foreach ($info['sku'] as $v) {
  435. $kkk = [];
  436. foreach ($v as $vv => $kk) {
  437. if (is_numeric($vv) && $kk) {
  438. $kkk[] = $kk;
  439. }
  440. }
  441. $sku[implode(',', $kkk)] = [
  442. 'cost' => $v['originalPrice'],
  443. 'price' => $v['price']
  444. ];
  445. }
  446. }
  447. $result['sku'] = $sku;
  448. $result['items'] = array_merge($items);
  449. }
  450. return $result;
  451. }
  452. /**
  453. * @param $data
  454. * @return array|string
  455. */
  456. public static function lingByHttp($data)
  457. {
  458. if (is_array($data)) {
  459. foreach ($data as &$item) {
  460. if (strstr($item, 'http://') === false && strstr($item, 'https://') === false) {
  461. $item = 'http:' . $item;
  462. }
  463. }
  464. return $data;
  465. } else {
  466. if (strstr($data, 'http://') === false && strstr($data, 'https://') === false) {
  467. $data = 'http:' . $data;
  468. }
  469. return $data;
  470. }
  471. }
  472. /**
  473. * 获取拼多多商品
  474. * @param $url
  475. * @param $data
  476. * @param string $method
  477. * @return bool|string
  478. */
  479. public static function pddInfo(string $url, array $data, string $method = 'get')
  480. {
  481. $info = HttpService::request($url, $method, $data);
  482. $result = false;
  483. if ($info) {
  484. $result = $info;
  485. }
  486. return $result;
  487. }
  488. /**
  489. * 处理拼多多商品
  490. * @param $data
  491. * @return mixed
  492. */
  493. public static function pddDeal(array $data)
  494. {
  495. $info = $data['item'] ?? [];
  496. $result = self::$productInfo;
  497. if ($info) {
  498. $result['store_name'] = $info['goodsName'] ?? '';
  499. $result['store_info'] = $info['goodsDesc'] ?? '';
  500. $result['image'] = $info['thumbUrl'] ?? '';
  501. $result['slider_image'] = $info['banner'] ?? [];
  502. $image = [];
  503. foreach ($result['slider_image'] as &$item) {
  504. if (is_array($item) && isset($item['url'])) {
  505. $image[] = $item['url'];
  506. }
  507. }
  508. if ($image) {
  509. $result['slider_image'] = $image;
  510. }
  511. $result['video_link'] = $info['video']['videoUrl'] ?? '';
  512. $result['price'] = $info['maxNormalPrice'] ?? 0;
  513. $result['ot_price'] = $info['marketPrice'] ?? 0;
  514. $descImgs = [];
  515. if (isset($info['detail']) && $info['detail']) {
  516. foreach ($info['detail'] as $img) {
  517. if (isset($img['url']) && $img['url']) $descImgs[] = $img['url'];
  518. }
  519. }
  520. $result['description_images'] = $descImgs;
  521. $desc = '<p>';
  522. foreach ($descImgs as $item) {
  523. $desc .= '<img src="' . $item . '"/>';
  524. }
  525. $desc .= '</p>';
  526. $result['description'] = $desc;
  527. $items = [];
  528. if (isset($info['skus']) && $info['skus']) {
  529. $i = 0;
  530. foreach ($info['skus'] as $sku) {
  531. foreach ($sku['specs'] as $key => $spec) {
  532. if ($i == 0) $items[$key]['value'] = $spec['spec_key'];
  533. $items[$key]['detail'][] = $spec['spec_value'];
  534. }
  535. $i++;
  536. }
  537. }
  538. foreach ($items as $k => $item) {
  539. $items[$k]['detail'] = array_unique($item['detail']);
  540. }
  541. $result['sku'] = [];
  542. $result['items'] = array_merge($items);
  543. }
  544. return $result;
  545. }
  546. /**
  547. * 获取苏宁商品
  548. * @param $url
  549. * @param $data
  550. * @param string $method
  551. * @return bool|string
  552. */
  553. public static function suningInfo(string $url, array $data, string $method = 'get')
  554. {
  555. $info = HttpService::request($url, $method, $data);
  556. $result = false;
  557. if ($info) {
  558. $result = $info;
  559. }
  560. return $result;
  561. }
  562. /**
  563. *
  564. * @param string $url
  565. * @param array $data
  566. * @param string $method
  567. * @return bool|string
  568. */
  569. public static function alibabaInfo(string $url, array $data, string $method = 'get')
  570. {
  571. $info = HttpService::request($url, $method, $data);
  572. $result = false;
  573. if ($info) {
  574. $result = $info;
  575. }
  576. return $result;
  577. }
  578. /**
  579. * @param array $data
  580. * @return array
  581. */
  582. public static function alibabaDeal(array $data)
  583. {
  584. $result = self::$productInfo;
  585. if ($data) {
  586. $result['store_name'] = $data['title'] ?? '';
  587. $result['store_info'] = $result['store_name'];
  588. $result['slider_image'] = $data['images'] ?? [];
  589. $result['price'] = $data['price'] ?? 0;
  590. $result['description'] = $data['desc'] ?? '';
  591. $items = [];
  592. if (isset($data['skuProps']) && $data['skuProps']) {
  593. $i = 0;
  594. foreach ($data['skuProps'] as $passSUb) {
  595. $items[$i]['value'] = $passSUb['prop'];
  596. $items[$i]['detail'] = array_column($passSUb['value'], 'name');
  597. $i++;
  598. }
  599. }
  600. foreach ($items as $k => $item) {
  601. $items[$k]['detail'] = array_unique($item['detail']);
  602. }
  603. $result['sku'] = [];
  604. $result['items'] = $items;
  605. }
  606. return $result;
  607. }
  608. /**
  609. * 处理苏宁商品
  610. * @param $data
  611. * @return mixed
  612. */
  613. public static function suningDeal(array $data)
  614. {
  615. $result = self::$productInfo;
  616. if ($data) {
  617. $result['store_name'] = $data['title'] ?? '';
  618. $result['store_info'] = $result['store_name'];
  619. $result['slider_image'] = $data['images'] ?? [];
  620. $result['price'] = $data['price'] ?? 0;
  621. $result['description'] = $data['desc'] ?? '';
  622. $items = [];
  623. if (isset($data['passSubList']) && $data['passSubList']) {
  624. $i = 0;
  625. foreach ($data['passSubList'] as $passSUb) {
  626. $j = 0;
  627. foreach ($passSUb as $key => $sub) {
  628. if ($i == 0) $items[$j]['value'] = $key;
  629. foreach ($sub as $value) {
  630. if (isset($value['characterValueDisplayName']) && $value['characterValueDisplayName'])
  631. $items[$j]['detail'][] = $value['characterValueDisplayName'];
  632. }
  633. $j++;
  634. }
  635. $i++;
  636. }
  637. }
  638. foreach ($items as $k => $item) {
  639. $items[$k]['detail'] = array_unique($item['detail']);
  640. }
  641. $result['sku'] = [];
  642. $result['items'] = array_merge($items);
  643. }
  644. return $result;
  645. }
  646. /**
  647. * 格式化规格
  648. * @param $attr
  649. * @return array
  650. */
  651. public static function formatAttr(array $attr, array $sku = [])
  652. {
  653. $attr = array_merge($attr);
  654. list($value, $head) = attr_format($attr);
  655. $valueNew = [];
  656. $count = 0;
  657. foreach ($value as $suk) {
  658. $detail = explode(',', $suk);
  659. $sukValue[$suk]['pic'] = '';
  660. $sukValue[$suk]['price'] = $sku[$suk]['price'] ?? 0;
  661. $sukValue[$suk]['cost'] = $sku[$suk]['cost'] ?? 0;
  662. $sukValue[$suk]['ot_price'] = 0;
  663. $sukValue[$suk]['stock'] = 0;
  664. $sukValue[$suk]['bar_code'] = '';
  665. $sukValue[$suk]['weight'] = 0;
  666. $sukValue[$suk]['volume'] = 0;
  667. $sukValue[$suk]['brokerage'] = 0;
  668. $sukValue[$suk]['brokerage_two'] = 0;
  669. foreach ($head as $k => $title) {
  670. if ($title == '') continue;
  671. $header[$k]['title'] = $title;
  672. $header[$k]['align'] = 'center';
  673. $header[$k]['minWidth'] = 120;
  674. }
  675. foreach ($detail as $k => $v) {
  676. if ($v == '') continue;
  677. $valueNew[$count]['value' . ($k + 1)] = $v;
  678. $header[$k]['key'] = 'value' . ($k + 1);
  679. }
  680. $valueNew[$count]['detail'] = array_combine($head, $detail);
  681. $valueNew[$count]['pic'] = $sukValue[$suk]['pic'] ?? '';
  682. $valueNew[$count]['price'] = $sukValue[$suk]['price'] ? floatval($sukValue[$suk]['price']) : 0;
  683. $valueNew[$count]['cost'] = $sukValue[$suk]['cost'] ? floatval($sukValue[$suk]['cost']) : 0;
  684. $valueNew[$count]['ot_price'] = isset($sukValue[$suk]['ot_price']) ? floatval($sukValue[$suk]['ot_price']) : 0;
  685. $valueNew[$count]['vip_price'] = isset($sukValue[$suk]['vip_price']) ? floatval($sukValue[$suk]['vip_price']) : 0;
  686. $valueNew[$count]['stock'] = $sukValue[$suk]['stock'] ? intval($sukValue[$suk]['stock']) : 0;
  687. $valueNew[$count]['bar_code'] = $sukValue[$suk]['bar_code'] ?? '';
  688. $valueNew[$count]['weight'] = $sukValue[$suk]['weight'] ? floatval($sukValue[$suk]['weight']) : 0;
  689. $valueNew[$count]['volume'] = $sukValue[$suk]['volume'] ? floatval($sukValue[$suk]['volume']) : 0;
  690. $valueNew[$count]['brokerage'] = $sukValue[$suk]['brokerage'] ? floatval($sukValue[$suk]['brokerage']) : 0;
  691. $valueNew[$count]['brokerage_two'] = $sukValue[$suk]['brokerage_two'] ? floatval($sukValue[$suk]['brokerage_two']) : 0;
  692. $count++;
  693. }
  694. $header[] = ['title' => '图片', 'slot' => 'pic', 'align' => 'center', 'minWidth' => 80];
  695. $header[] = ['title' => '售价', 'slot' => 'price', 'align' => 'center', 'minWidth' => 95];
  696. $header[] = ['title' => '成本价', 'slot' => 'cost', 'align' => 'center', 'minWidth' => 95];
  697. $header[] = ['title' => '原价', 'slot' => 'ot_price', 'align' => 'center', 'minWidth' => 95];
  698. $header[] = ['title' => '会员价', 'slot' => 'vip_price', 'align' => 'center', 'minWidth' => 140];
  699. $header[] = ['title' => '库存', 'slot' => 'stock', 'align' => 'center', 'minWidth' => 95];
  700. $header[] = ['title' => '商品编号', 'slot' => 'bar_code', 'align' => 'center', 'minWidth' => 120];
  701. $header[] = ['title' => '重量(KG)', 'slot' => 'weight', 'align' => 'center', 'minWidth' => 95];
  702. $header[] = ['title' => '体积(m³)', 'slot' => 'volume', 'align' => 'center', 'minWidth' => 95];
  703. $header[] = ['title' => '操作', 'slot' => 'action', 'align' => 'center', 'minWidth' => 70];
  704. $info = ['attr' => $attr, 'value' => $valueNew, 'header' => $header];
  705. return $info;
  706. }
  707. }