Goods.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace app\api\model\sharing;
  3. use app\common\model\sharing\Goods as GoodsModel;
  4. use app\common\library\helper;
  5. use app\common\exception\BaseException;
  6. /**
  7. * 拼团商品模型
  8. * Class Goods
  9. * @package app\api\model\sharing
  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)->hidden(['category', 'content', 'image', 'sku']);
  47. // 整理列表数据并返回
  48. return $this->setGoodsListDataFromApi($data, true, ['userInfo' => $userInfo]);
  49. }
  50. /**
  51. * 获取商品详情信息
  52. * @param int $goodsId 商品id
  53. * @param array|bool $userInfo 用户信息
  54. * @return array|false|\PDOStatement|string|\think\Model|static
  55. * @throws BaseException
  56. */
  57. public function getDetails($goodsId, $userInfo = false)
  58. {
  59. // 获取商品详情
  60. $model = new static;
  61. $goods = $model->with([
  62. 'category',
  63. 'image' => ['file'],
  64. 'sku' => ['image'],
  65. 'spec_rel' => ['spec'],
  66. 'delivery' => ['rule'],
  67. 'commentData' => function ($query) {
  68. $query->with('user')->where(['is_delete' => 0, 'status' => 1])->limit(2);
  69. }
  70. ])->withCount(['commentData' => function ($query) {
  71. $query->where(['is_delete' => 0, 'status' => 1]);
  72. }])
  73. ->where('goods_id', '=', $goodsId)
  74. ->find();
  75. // 判断商品的状态
  76. if (!$goods || $goods['is_delete'] || $goods['goods_status']['value'] != 10) {
  77. throw new BaseException(['msg' => '很抱歉,商品信息不存在或已下架']);
  78. }
  79. // 设置商品展示的数据
  80. $goods = $model->setGoodsListDataFromApi($goods, false, ['userInfo' => $userInfo]);
  81. // 多规格商品sku信息
  82. $goods['goods_multi_spec'] = $goods['spec_type'] == 20 ? $model->getManySpecData($goods['spec_rel'], $goods['sku']) : null;
  83. return $goods;
  84. }
  85. /**
  86. * 根据商品id集获取商品列表
  87. * @param $goodsIds
  88. * @param bool $userInfo
  89. * @return mixed
  90. * @throws \think\db\exception\DataNotFoundException
  91. * @throws \think\db\exception\ModelNotFoundException
  92. * @throws \think\exception\DbException
  93. */
  94. public function getListByIdsFromApi($goodsIds, $userInfo = false)
  95. {
  96. // 获取商品列表
  97. $data = parent::getListByIds($goodsIds, 10);
  98. // 整理列表数据并返回
  99. return $this->setGoodsListDataFromApi($data, true, ['userInfo' => $userInfo]);
  100. }
  101. /**
  102. * 设置商品展示的数据 api模块
  103. * @param $data
  104. * @param bool $isMultiple
  105. * @param array $param
  106. * @return mixed
  107. */
  108. private function setGoodsListDataFromApi(&$data, $isMultiple, $param)
  109. {
  110. return parent::setGoodsListData($data, $isMultiple, function ($goods) use ($param) {
  111. // 计算并设置商品会员价
  112. $this->setGoodsGradeMoney($param['userInfo'], $goods);
  113. });
  114. }
  115. /**
  116. * 设置商品的会员价
  117. * @param $user
  118. * @param $goods
  119. */
  120. private function setGoodsGradeMoney($user, &$goods)
  121. {
  122. // 会员等级状态
  123. $gradeStatus = (!empty($user) && $user['grade_id'] > 0 && !empty($user['grade']))
  124. && (!$user['grade']['is_delete'] && $user['grade']['status']);
  125. // 判断商品是否参与会员折扣
  126. if (!$gradeStatus || !$goods['is_enable_grade']) {
  127. $goods['is_user_grade'] = false;
  128. return;
  129. }
  130. // 商品单独设置了会员折扣
  131. if ($goods['is_alone_grade'] && isset($goods['alone_grade_equity'][$user['grade_id']])) {
  132. // 折扣比例
  133. $discountRatio = helper::bcdiv($goods['alone_grade_equity'][$user['grade_id']], 10);
  134. } else {
  135. // 折扣比例
  136. $discountRatio = helper::bcdiv($user['grade']['equity']['discount'], 10);
  137. }
  138. if ($discountRatio > 0) {
  139. // 标记参与会员折扣
  140. $goods['is_user_grade'] = true;
  141. // 会员折扣价
  142. foreach ($goods['sku'] as &$skuItem) {
  143. $skuItem['goods_price'] = helper::number2(helper::bcmul($skuItem['goods_price'], $discountRatio), true);
  144. $skuItem['sharing_price'] = helper::number2(helper::bcmul($skuItem['sharing_price'], $discountRatio), true);
  145. }
  146. }
  147. }
  148. }