Goods.php 5.4 KB

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