Goods.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace app\api\model;
  3. use app\common\library\helper;
  4. use app\common\model\Goods as GoodsModel;
  5. use app\api\service\Goods as GoodsService;
  6. /**
  7. * 商品模型
  8. * Class Goods
  9. * @package app\api\model
  10. */
  11. class Goods extends GoodsModel
  12. {
  13. /**
  14. * 隐藏字段
  15. * @var array
  16. */
  17. protected $hidden = [
  18. 'spec_rel',
  19. 'delivery',
  20. 'sales_initial',
  21. 'sales_actual',
  22. 'is_delete',
  23. 'wxapp_id',
  24. 'create_time',
  25. 'update_time'
  26. ];
  27. /**
  28. * 商品详情:HTML实体转换回普通字符
  29. * @param $value
  30. * @return string
  31. */
  32. public function getContentAttr($value)
  33. {
  34. return htmlspecialchars_decode($value);
  35. }
  36. /**
  37. * 获取商品列表
  38. * @param $param
  39. * @param bool $userInfo
  40. * @return mixed
  41. * @throws \think\exception\DbException
  42. */
  43. public function getList($param, $userInfo = false)
  44. {
  45. // 获取商品列表
  46. $data = parent::getList($param);
  47. // 隐藏api属性
  48. !$data->isEmpty() && $data->hidden(['category', 'content', 'image', 'sku']);
  49. // 整理列表数据并返回
  50. return $this->setGoodsListDataFromApi($data, true, ['userInfo' => $userInfo]);
  51. }
  52. /**
  53. * 商品详情
  54. * @param $goodsId
  55. * @return GoodsModel
  56. */
  57. public static function detail($goodsId)
  58. {
  59. // 商品详情
  60. $detail = parent::detail($goodsId);
  61. // 多规格商品sku信息
  62. $detail['goods_multi_spec'] = GoodsService::getSpecData($detail);
  63. return $detail;
  64. }
  65. /**
  66. * 获取商品详情页面
  67. * @param int $goodsId 商品id
  68. * @param array|bool $userInfo 用户信息
  69. * @return array|bool|false|mixed|\PDOStatement|string|\think\Model
  70. * @throws \think\db\exception\DataNotFoundException
  71. * @throws \think\db\exception\ModelNotFoundException
  72. * @throws \think\exception\DbException
  73. */
  74. public function getDetails($goodsId, $userInfo = false)
  75. {
  76. // 获取商品详情
  77. $detail = $this->with([
  78. 'category',
  79. 'image' => ['file'],
  80. 'sku' => ['image'],
  81. 'spec_rel' => ['spec'],
  82. 'delivery' => ['rule'],
  83. 'commentData' => function ($query) {
  84. $query->with('user')->where(['is_delete' => 0, 'status' => 1])->limit(2);
  85. }
  86. ])->withCount(['commentData' => function ($query) {
  87. $query->where(['is_delete' => 0, 'status' => 1]);
  88. }])
  89. ->where('goods_id', '=', $goodsId)
  90. ->find();
  91. // 判断商品的状态
  92. if (empty($detail) || $detail['is_delete'] || $detail['goods_status']['value'] != 10) {
  93. $this->error = '很抱歉,商品信息不存在或已下架';
  94. return false;
  95. }
  96. // 设置商品展示的数据
  97. $detail = $this->setGoodsListDataFromApi($detail, false, ['userInfo' => $userInfo]);
  98. // 多规格商品sku信息
  99. $detail['goods_multi_spec'] = GoodsService::getSpecData($detail);
  100. return $detail;
  101. }
  102. /**
  103. * 根据商品id集获取商品列表
  104. * @param $goodsIds
  105. * @param bool $userInfo
  106. * @return mixed
  107. * @throws \think\db\exception\DataNotFoundException
  108. * @throws \think\db\exception\ModelNotFoundException
  109. * @throws \think\exception\DbException
  110. */
  111. public function getListByIdsFromApi($goodsIds, $userInfo = false)
  112. {
  113. // 获取商品列表
  114. $data = parent::getListByIds($goodsIds, 10);
  115. // 整理列表数据并返回
  116. return $this->setGoodsListDataFromApi($data, true, ['userInfo' => $userInfo]);
  117. }
  118. /**
  119. * 设置商品展示的数据 api模块
  120. * @param $data
  121. * @param bool $isMultiple
  122. * @param array $param
  123. * @return mixed
  124. */
  125. private function setGoodsListDataFromApi(&$data, $isMultiple, $param)
  126. {
  127. return parent::setGoodsListData($data, $isMultiple, function ($goods) use ($param) {
  128. // 计算并设置商品会员价
  129. $this->setGoodsGradeMoney($param['userInfo'], $goods);
  130. });
  131. }
  132. /**
  133. * 设置商品的会员价
  134. * @param $user
  135. * @param $goods
  136. */
  137. private function setGoodsGradeMoney($user, &$goods)
  138. {
  139. // 会员等级状态
  140. $gradeStatus = (!empty($user) && $user['grade_id'] > 0 && !empty($user['grade']))
  141. && (!$user['grade']['is_delete'] && $user['grade']['status']);
  142. // 判断商品是否参与会员折扣
  143. if (!$gradeStatus || !$goods['is_enable_grade']) {
  144. $goods['is_user_grade'] = false;
  145. return;
  146. }
  147. // 商品单独设置了会员折扣
  148. if ($goods['is_alone_grade'] && isset($goods['alone_grade_equity'][$user['grade_id']])) {
  149. // 折扣比例
  150. $discountRatio = helper::bcdiv($goods['alone_grade_equity'][$user['grade_id']], 10);
  151. } else {
  152. // 折扣比例
  153. $discountRatio = helper::bcdiv($user['grade']['equity']['discount'], 10);
  154. }
  155. if ($discountRatio > 0) {
  156. // 标记参与会员折扣
  157. $goods['is_user_grade'] = true;
  158. // 会员折扣价
  159. foreach ($goods['sku'] as &$skuItem) {
  160. $skuItem['goods_price'] = helper::number2(helper::bcmul($skuItem['goods_price'], $discountRatio), true);
  161. }
  162. }
  163. }
  164. }