Product.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. <?php
  2. /*
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fecshop\services;
  10. use yii\base\InvalidCallException;
  11. use yii\base\InvalidConfigException;
  12. use Yii;
  13. /**
  14. * Product Service is the component that you can get product info from it.
  15. *
  16. * @property \fecshop\services\Image | \fecshop\services\Product\Image $image image service or product image sub-service
  17. * @property \fecshop\services\product\Info $info product info sub-service
  18. * @property \fecshop\services\product\Stock $stock stock sub-service of product service
  19. *
  20. * @method getByPrimaryKey($primaryKey) get product model by primary key
  21. * @see \fecshop\services\Product::actionGetByPrimaryKey()
  22. * @method getEnableStatus() get enable status
  23. * @see \fecshop\services\Product::actionGetEnableStatus()
  24. *
  25. * @author Terry Zhao <2358269014@qq.com>
  26. * @since 1.0
  27. */
  28. class Product extends Service
  29. {
  30. /**
  31. * @var array 自定义的属性组配置数组
  32. */
  33. public $customAttrGroup;
  34. public $categoryAggregateMaxCount = 5000; // Yii::$service->product->categoryAggregateMaxCount;
  35. /**
  36. * 分类页面的产品,如果一个spu下面由多个sku同时在这个分类,
  37. * 那么,是否只显示一个sku(score最高),而不是全部sku
  38. * true: 代表只显示一个sku
  39. * false: 代表产品全部显示
  40. */
  41. public $productSpuShowOnlyOneSku = true;
  42. /**
  43. * $storagePrex , $storage , $storagePath 为找到当前的storage而设置的配置参数
  44. * 可以在配置中更改,更改后,就会通过容器注入的方式修改相应的配置值
  45. */
  46. public $storage; // = 'ProductMysqldb'; // ProductMysqldb | ProductMongodb 当前的storage,如果在config中配置,那么在初始化的时候会被注入修改
  47. /**
  48. * 设置storage的path路径,
  49. * 如果不设置,则系统使用默认路径
  50. * 如果设置了路径,则使用自定义的路径
  51. */
  52. public $storagePath = '';
  53. /**
  54. * @var \fecshop\services\product\ProductInterface 根据 $storage 及 $storagePath 配置的 Product 的实现
  55. */
  56. protected $_product;
  57. /**
  58. * @var string 默认属性组名称
  59. */
  60. protected $_defaultAttrGroup = 'default';
  61. public function init()
  62. {
  63. parent::init();
  64. // init $this->productSpuShowOnlyOneSku
  65. $appName = Yii::$service->helper->getAppName();
  66. $productSpuShowOnlyOneSku = Yii::$app->store->get($appName.'_catalog','category_productSpuShowOnlyOneSku');
  67. $this->productSpuShowOnlyOneSku = ($productSpuShowOnlyOneSku == Yii::$app->store->enable) ? true : false;
  68. // 从数据库配置中得到值, 设置成当前service存储,是Mysqldb 还是 Mongodb
  69. $config = Yii::$app->store->get('service_db', 'category_and_product');
  70. $this->storage = 'ProductMysqldb';
  71. if ($config == Yii::$app->store->serviceMongodbName) {
  72. $this->storage = 'ProductMongodb';
  73. }
  74. $currentService = $this->getStorageService($this);
  75. $this->_product = new $currentService();
  76. // 从数据库配置数据,初始化customAttrGroup
  77. $this->initCustomAttrGroup();
  78. }
  79. // 动态更改为mongodb model
  80. public function changeToMongoStorage()
  81. {
  82. $this->storage = 'ProductMongodb';
  83. $currentService = $this->getStorageService($this);
  84. $this->_product = new $currentService();
  85. }
  86. public function serviceStorageName()
  87. {
  88. return $this->_product->serviceStorageName();
  89. }
  90. // 动态更改为mongodb model
  91. public function changeToMysqlStorage()
  92. {
  93. $this->storage = 'ProductMysqldb';
  94. $currentService = $this->getStorageService($this);
  95. $this->_product = new $currentService();
  96. }
  97. protected function actionGetEnableStatus()
  98. {
  99. return $this->_product->getEnableStatus();
  100. }
  101. // 从数据库配置数据,初始化customAttrGroup
  102. protected function initCustomAttrGroup()
  103. {
  104. $attrPrimaryKey =$this->attr->getPrimaryKey();
  105. $attrGroupPrimaryKey = $this->attrGroup->getPrimaryKey();
  106. $allGroupColl = $this->attrGroup->getActiveAllColl();
  107. // attr
  108. $allAttrColl = $this->attr->getActiveAllColl();
  109. $attrTypeColl = [];
  110. if ($allAttrColl) {
  111. foreach ($allAttrColl as $one) {
  112. $attrTypeColl[$one[$attrPrimaryKey]] = $one;
  113. }
  114. }
  115. $customAttrGroupArr = [];
  116. if ($allGroupColl) {
  117. foreach ($allGroupColl as $one) {
  118. $groupName = $one['name'];
  119. $attr_ids = $one['attr_ids'];
  120. if (!is_array($attr_ids) || empty($attr_ids)) {
  121. continue;
  122. }
  123. $attr_ids = \fec\helpers\CFunc::array_sort($attr_ids, 'sort_order', 'desc');
  124. //var_dump($attr_ids);exit;
  125. foreach ($attr_ids as $attr_id_one) {
  126. if (!is_array($attr_id_one)) {
  127. continue;
  128. }
  129. $attr_id = $attr_id_one['attr_id'];
  130. $attr_sort_order = $attr_id_one['sort_order'];
  131. $attrOne = $attrTypeColl[$attr_id];
  132. if (!$attrOne) {
  133. continue;
  134. }
  135. $attrName = $attrOne['name'];
  136. $attrType = $attrOne['attr_type'];
  137. $attrInfo = [
  138. 'dbtype' => $attrOne['db_type'],
  139. 'name' => $attrName,
  140. 'showAsImg' => $attrOne['show_as_img'] == 1 ? true : false ,
  141. 'sort_order' => $attr_sort_order,
  142. ];
  143. $displayType = $attrOne['display_type'];
  144. $displayInfo = [];
  145. if ($displayType == 'inputString-Lang') {
  146. $displayInfo['type'] = 'inputString';
  147. $displayInfo['lang'] = true;
  148. } else {
  149. $displayInfo['type'] = $displayType;
  150. }
  151. if (is_array($attrOne['display_data'])) {
  152. $d_arr = [];
  153. foreach ($attrOne['display_data'] as $o) {
  154. if ($o['key']) {
  155. $d_arr[] = $o['key'];
  156. }
  157. }
  158. $displayInfo['data'] = $d_arr;
  159. }
  160. $attrInfo['display'] = $displayInfo;
  161. $customAttrGroupArr[$groupName][$attrType][$attrName] = $attrInfo;
  162. }
  163. }
  164. }
  165. $this->customAttrGroup = $customAttrGroupArr;
  166. }
  167. /**
  168. * 得到产品的所有的属性组。
  169. */
  170. protected function actionGetCustomAttrGroup()
  171. {
  172. $customAttrGroup = $this->customAttrGroup;
  173. $arr = array_keys($customAttrGroup);
  174. $arr[] = $this->_defaultAttrGroup;
  175. return $arr;
  176. }
  177. /**
  178. * @param $productAttrGroup|string
  179. * 得到这个产品属性组里面的所有的产品属性详细,
  180. * 注解:不同类型的产品,对应不同的属性组,譬如衣服有颜色尺码,电脑类型的有不同cpu型号等
  181. * 属性组,以及属性组对应的属性,是在Product Service config中配置的。
  182. */
  183. protected function actionGetGroupAttrInfo($productAttrGroup)
  184. {
  185. $arr = [];
  186. if ($productAttrGroup == $this->_defaultAttrGroup) {
  187. return [];
  188. }
  189. // 得到普通属性
  190. if (isset($this->customAttrGroup[$productAttrGroup]['general_attr'])
  191. && is_array($this->customAttrGroup[$productAttrGroup]['general_attr'])
  192. ) {
  193. $arr = array_merge($arr, $this->customAttrGroup[$productAttrGroup]['general_attr']);
  194. }
  195. // 得到用于spu,细分sku的属性,譬如颜色尺码之类。
  196. if (isset($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  197. && is_array($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  198. ) {
  199. $arr = array_merge($arr, $this->customAttrGroup[$productAttrGroup]['spu_attr']);
  200. }
  201. return $arr;
  202. }
  203. public function getGroupGeneralAttr($productAttrGroup)
  204. {
  205. $arr = [];
  206. if ($productAttrGroup == $this->_defaultAttrGroup) {
  207. return [];
  208. }
  209. // 得到普通属性
  210. if (isset($this->customAttrGroup[$productAttrGroup]['general_attr'])
  211. && is_array($this->customAttrGroup[$productAttrGroup]['general_attr'])
  212. ) {
  213. $arr = array_merge($arr, $this->customAttrGroup[$productAttrGroup]['general_attr']);
  214. }
  215. return $arr;
  216. }
  217. public function getGroupSpuAttr($productAttrGroup)
  218. {
  219. $arr = [];
  220. if ($productAttrGroup == $this->_defaultAttrGroup) {
  221. return [];
  222. }
  223. // 得到用于spu,细分sku的属性,譬如颜色尺码之类。
  224. if (isset($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  225. && is_array($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  226. ) {
  227. $arr = array_merge($arr, $this->customAttrGroup[$productAttrGroup]['spu_attr']);
  228. }
  229. return $arr;
  230. }
  231. /**
  232. * @param $productAttrGroup|string
  233. * 得到这个产品属性组里面的所有的产品属性,
  234. * 注解:不同类型的产品,对应不同的属性组,譬如衣服有颜色尺码,电脑类型的有不同cpu型号等
  235. * 属性组,以及属性组对应的属性,是在Product Service config中配置的。
  236. */
  237. protected function actionGetGroupAttr($productAttrGroup)
  238. {
  239. $arr = [];
  240. // 得到普通属性
  241. if (isset($this->customAttrGroup[$productAttrGroup]['general_attr'])
  242. && is_array($this->customAttrGroup[$productAttrGroup]['general_attr'])
  243. ) {
  244. $general_attr = $this->customAttrGroup[$productAttrGroup]['general_attr'];
  245. if (is_array($general_attr)) {
  246. foreach ($general_attr as $attr => $info) {
  247. $arr[] = $attr;
  248. }
  249. }
  250. }
  251. // 得到用于spu,细分sku的属性,譬如颜色尺码之类。
  252. if (isset($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  253. && is_array($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  254. ) {
  255. $spu_attr = $this->customAttrGroup[$productAttrGroup]['spu_attr'];
  256. if (is_array($spu_attr)) {
  257. foreach ($spu_attr as $attr => $info) {
  258. $arr[] = $attr;
  259. }
  260. }
  261. }
  262. return $arr;
  263. }
  264. /**
  265. * @param $productAttrGroup|string
  266. * @return array 一维数组
  267. * 得到这个产品属性组里面的属性,也就是原来的产品属性+属性组对应的属性
  268. */
  269. protected function actionGetSpuAttr($productAttrGroup)
  270. {
  271. $arr = [];
  272. if ($productAttrGroup == $this->_defaultAttrGroup) {
  273. return [];
  274. }
  275. // 得到用于spu,细分sku的属性,譬如颜色尺码之类。
  276. if (isset($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  277. && is_array($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  278. ) {
  279. $arr = array_merge($arr, $this->customAttrGroup[$productAttrGroup]['spu_attr']);
  280. }
  281. return array_keys($arr);
  282. }
  283. /**
  284. * @param $productAttrGroup | String
  285. * @return string 显示图片的spu属性。
  286. */
  287. protected function actionGetSpuImgAttr($productAttrGroup)
  288. {
  289. if ($productAttrGroup == $this->_defaultAttrGroup) {
  290. return '';
  291. }
  292. // 得到用于spu,细分sku的属性,譬如颜色尺码之类。
  293. if (isset($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  294. && is_array($this->customAttrGroup[$productAttrGroup]['spu_attr'])
  295. ) {
  296. foreach ($this->customAttrGroup[$productAttrGroup]['spu_attr'] as $attr => $one) {
  297. if (isset($one['showAsImg']) && $one['showAsImg']) {
  298. return $attr;
  299. }
  300. }
  301. }
  302. return '';
  303. }
  304. /**
  305. * 产品状态是否是 active
  306. * @param int $status
  307. * @return boolean 如果产品状态是 active 返回 true, 否则返回 false
  308. */
  309. protected function actionIsActive($status)
  310. {
  311. return ($status == 1) ? true : false;
  312. }
  313. /**
  314. * @param $productAttrGroup | String 产品属性组
  315. * 通过产品属性组,从配置中得到对应的custom_options部分的配置
  316. * @return array
  317. */
  318. protected function actionGetCustomOptionAttrInfo($productAttrGroup)
  319. {
  320. if ($productAttrGroup == $this->_defaultAttrGroup) {
  321. return [];
  322. }
  323. if (isset($this->customAttrGroup[$productAttrGroup]['custom_options'])
  324. && is_array($this->customAttrGroup[$productAttrGroup]['custom_options'])
  325. ) {
  326. return $this->customAttrGroup[$productAttrGroup]['custom_options'];
  327. }
  328. return [];
  329. }
  330. /**
  331. * 得到默认的产品属性组。
  332. */
  333. protected function actionGetDefaultAttrGroup()
  334. {
  335. return $this->_defaultAttrGroup;
  336. }
  337. /**
  338. * 得到主键的名称.
  339. */
  340. protected function actionGetPrimaryKey()
  341. {
  342. return $this->_product->getPrimaryKey();
  343. }
  344. public function getCategoryIdsByProductId($product_id)
  345. {
  346. return $this->_product->getCategoryIdsByProductId($product_id);
  347. }
  348. public function getProductIdsByCategoryId($category_id)
  349. {
  350. return $this->_product->getProductIdsByCategoryId($category_id);
  351. }
  352. /**
  353. * get Product model by primary key.
  354. */
  355. protected function actionGetByPrimaryKey($primaryKey)
  356. {
  357. return $this->_product->getByPrimaryKey($primaryKey);
  358. }
  359. /**
  360. * get Product model by primary key.
  361. */
  362. protected function actionGetArrByPrimaryKey($primaryKey)
  363. {
  364. return $this->_product->getArrByPrimaryKey($primaryKey);
  365. }
  366. /**
  367. * @param $attr_group | String , 属性组名称
  368. * 给product model 增加相应的属性组对应的属性。
  369. */
  370. protected function actionAddGroupAttrs($attr_group)
  371. {
  372. return $this->_product->addGroupAttrs($attr_group);
  373. }
  374. /**
  375. * api部分
  376. * 和coll()的不同在于,该方式不走active record,因此可以获取产品的所有数据的。
  377. */
  378. protected function actionApicoll()
  379. {
  380. return $this->_product->apicoll();
  381. }
  382. /**
  383. * api部分
  384. */
  385. protected function actionApiGetByPrimaryKey($primaryKey)
  386. {
  387. return $this->_product->apiGetByPrimaryKey($primaryKey);
  388. }
  389. /**
  390. * api部分
  391. */
  392. protected function actionApiSave($product_one)
  393. {
  394. return $this->_product->apiSave($product_one);
  395. }
  396. /**
  397. * api部分
  398. */
  399. protected function actionApiDelete($primaryKey)
  400. {
  401. return $this->_product->apiDelete($primaryKey);
  402. }
  403. public function updateProductFavoriteCount($product_id, $count)
  404. {
  405. return $this->_product->updateProductFavoriteCount($product_id, $count);
  406. }
  407. /**
  408. * 得到Product model的全名.
  409. */
  410. protected function actionGetModelName()
  411. {
  412. return get_class($this->_product->getByPrimaryKey());
  413. }
  414. /**
  415. * @param $sku | string
  416. * @param $returnArr | boolean , 是否返回数组格式
  417. * 通过sku查询产品
  418. */
  419. protected function actionGetBySku($sku, $returnArr = true)
  420. {
  421. return $this->_product->getBySku($sku, $returnArr);
  422. }
  423. /**
  424. * @param $spu | string
  425. * 通过spu查询产品
  426. */
  427. protected function actionGetBySpu($spu)
  428. {
  429. return $this->_product->getBySpu($spu);
  430. }
  431. /**
  432. * @param $filter|array
  433. * get artile collection by $filter
  434. * example filter:
  435. * [
  436. * 'numPerPage' => 20,
  437. * 'pageNum' => 1,
  438. * 'orderBy' => ['_id' => SORT_DESC, 'sku' => SORT_ASC ],
  439. * 'where' => [
  440. * ['>','price',1],
  441. * ['<=','price',10]
  442. * ['sku' => 'uk10001'],
  443. * ],
  444. * 'asArray' => true,
  445. * ]
  446. * 根据传入的查询条件,得到产品的列表
  447. */
  448. protected function actionColl($filter = [])
  449. {
  450. return $this->_product->coll($filter);
  451. }
  452. protected function actionCollCount($filter = [])
  453. {
  454. return $this->_product->collCount($filter);
  455. }
  456. /**
  457. * 通过where条件 和 查找的select 字段信息,得到产品的列表信息,
  458. * 这里一般是用于前台的区块性的不分页的产品查找。
  459. * 结果数据没有进行进一步处理,需要前端获取数据后在处理。
  460. */
  461. protected function actionGetProducts($filter)
  462. {
  463. return $this->_product->getProducts($filter);
  464. }
  465. /**
  466. * @param $product_id_arr | Array
  467. * @param $category_id | String
  468. * 在给予的产品id数组$product_id_arr中,找出来那些产品属于分类 $category_id
  469. * 该功能是后台分类编辑中,对应的分类产品列表功能
  470. * 也就是在当前的分类下,查看所有的产品,属于当前分类的产品,默认被勾选。
  471. */
  472. protected function actionGetCategoryProductIds($product_id_arr, $category_id)
  473. {
  474. return $this->_product->getCategoryProductIds($product_id_arr, $category_id);
  475. }
  476. /**
  477. * @param $one|array , 产品数据数组
  478. * @param $originUrlKey|string , 分类的原来的url key ,也就是在前端,分类的自定义url。
  479. * 保存产品(插入和更新),以及保存产品的自定义url
  480. * 如果提交的数据中定义了自定义url,则按照自定义url保存到urlkey中,如果没有自定义urlkey,则会使用name进行生成。
  481. */
  482. protected function actionSave($one, $originUrlKey = 'catalog/product/index', $isLoginUser=true)
  483. {
  484. return $this->_product->save($one, $originUrlKey, $isLoginUser);
  485. }
  486. /**
  487. * @param $ids | Array or String
  488. * 删除产品,如果ids是数组,则删除多个产品,如果是字符串,则删除一个产品
  489. * 在产品产品的同时,会在url rewrite表中删除对应的自定义url数据。
  490. */
  491. protected function actionRemove($ids)
  492. {
  493. return $this->_product->remove($ids);
  494. }
  495. public function spuCollData($select, $spuAttrArr, $spu)
  496. {
  497. return $this->_product->spuCollData($select, $spuAttrArr, $spu);
  498. }
  499. /**
  500. * @param $category_id | String 分类的id的值
  501. * @param $addCateProductIdArr | Array 分类中需要添加的产品id数组,也就是给这个分类增加这几个产品。
  502. * @param $deleteCateProductIdArr | Array 分类中需要删除的产品id数组,也就是在这个分类下面去除这几个产品的对应关系。
  503. * 这个函数是后台分类编辑功能中使用到的函数,在分类中可以一次性添加多个产品,也可以删除多个产品,产品和分类是多对多的关系。
  504. */
  505. protected function actionAddAndDeleteProductCategory($category_id, $addCateProductIdArr, $deleteCateProductIdArr)
  506. {
  507. return $this->_product->addAndDeleteProductCategory($category_id, $addCateProductIdArr, $deleteCateProductIdArr);
  508. }
  509. /**
  510. * [
  511. * 'category_id' => 1,
  512. * 'pageNum' => 2,
  513. * 'numPerPage' => 50,
  514. * 'orderBy' => 'name',
  515. * 'where' => [
  516. * ['>','price',11],
  517. * ['<','price',22],
  518. * ],
  519. * 'select' => ['xx','yy'],
  520. * 'group' => '$spu',
  521. * ]
  522. * 得到分类下的产品,在这里需要注意的是:
  523. * 1.同一个spu的产品,有很多sku,但是只显示score最高的产品,这个score可以通过脚本取订单的销量(最近一个月,或者
  524. * 最近三个月等等),或者自定义都可以。
  525. * 2.结果按照filter里面的orderBy排序
  526. * 3.由于使用的是mongodb的aggregate(管道)函数,因此,此函数有一定的限制,就是该函数
  527. * 处理后的结果不能大约32MB,因此,如果一个分类下面的产品几十万的时候可能就会出现问题,
  528. * 这种情况可以用专业的搜索引擎做聚合工具。
  529. * 不过,对于一般的用户来说,这个不会成为瓶颈问题,一般一个分类下的产品不会出现几十万的情况。
  530. * 4.最后就得到spu唯一的产品列表(多个spu相同,sku不同的产品,只要score最高的那个).
  531. */
  532. protected function actionGetFrontCategoryProducts($filter)
  533. {
  534. return $this->_product->getFrontCategoryProducts($filter);
  535. }
  536. public function actionSync($arr)
  537. {
  538. return $this->_product->sync($arr);
  539. }
  540. /**
  541. * @param $filter_attr | String 需要进行统计的字段名称
  542. * @propertuy $where | Array 搜索条件。这个需要些mongodb的搜索条件。
  543. * 得到的是个属性,以及对应的个数。
  544. * 这个功能是用于前端分类侧栏进行属性过滤。
  545. */
  546. protected function actionGetFrontCategoryFilter($filter_attr, $where)
  547. {
  548. return $this->_product->getFrontCategoryFilter($filter_attr, $where);
  549. }
  550. /**
  551. * 全文搜索
  552. * $filter Example:
  553. * $filter = [
  554. * 'pageNum' => $this->getPageNum(),
  555. * 'numPerPage' => $this->getNumPerPage(),
  556. * 'where' => $this->_where,
  557. * 'product_search_max_count' => Yii::$app->controller->module->params['product_search_max_count'],
  558. * 'select' => $select,
  559. * ];
  560. * 因为mongodb的搜索涉及到计算量,因此产品过多的情况下,要设置 product_search_max_count的值。减轻服务器负担
  561. * 因为对客户来说,前10页的产品已经足矣,后面的不需要看了,限定一下产品个数,减轻服务器的压力。
  562. * 多个spu,取score最高的那个一个显示。
  563. * 按照搜索的匹配度来进行排序,没有其他排序方式.
  564. */
  565. //protected function actionFullTearchText($filter){
  566. // return $this->_product->fullTearchText($filter);
  567. //}
  568. /**
  569. * @param $ids | Array
  570. * 通过产品ids得到产品sku
  571. */
  572. public function getSkusByIds($ids)
  573. {
  574. return $this->_product->getSkusByIds($ids);
  575. }
  576. /**
  577. * @param $spu | String
  578. * @param $avag_rate | Int 产品的总平均得分
  579. * @param $count | Int 产品的总评论数
  580. * @param $avag_lang_rate | 当前语言的总平均得分
  581. * @param $lang_count | 当前语言的总评论数
  582. */
  583. protected function actionUpdateProductReviewInfo($spu, $avag_rate, $count, $lang_code, $avag_lang_rate, $lang_count, $rate_total_arr, $rate_lang_total_arr)
  584. {
  585. return $this->_product->updateProductReviewInfo($spu, $avag_rate, $count, $lang_code, $avag_lang_rate, $lang_count, $rate_total_arr, $rate_lang_total_arr);
  586. }
  587. public function updateAllScoreToZero()
  588. {
  589. return $this->_product->updateAllScoreToZero();
  590. }
  591. public function excelSave($productArr)
  592. {
  593. return $this->_product->excelSave($productArr);
  594. }
  595. }