123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- <?php
- namespace app\admin\model\shopro\goods;
- use app\admin\model\shopro\Common;
- use traits\model\SoftDelete;
- use addons\shopro\library\Tree;
- use app\admin\model\shopro\Category;
- use app\admin\model\shopro\activity\Activity as ActivityModel;
- use app\admin\model\shopro\activity\SkuPrice as ActivitySkuPriceModel;
- use app\admin\model\shopro\app\ScoreSkuPrice;
- use app\admin\model\shopro\user\GoodsLog;
- use app\admin\model\shopro\order\Order;
- use app\admin\model\shopro\order\OrderItem;
- use addons\shopro\facade\Activity as ActivityFacade;
- class Goods extends Common
- {
- use SoftDelete;
- protected $deleteTime = 'deletetime';
- // 表名
- protected $name = 'shopro_goods';
- protected $type = [
- 'images' => 'json',
- 'image_wh' => 'json',
- 'params' => 'json',
- ];
- // 追加属性
- protected $append = [
- 'status_text',
- 'type_text',
- 'dispatch_type_text'
- ];
- protected $hidden = [
- 'content',
- 'max_sku_price',
- 'score_sku_prices',
- 'activity_sku_prices',
- 'total_sales' // 商品列表,销量排序会用到
- ];
- /**
- * type 中文
- */
- public function typeList()
- {
- return [
- 'normal' => '实体商品',
- 'virtual' => '虚拟商品',
- 'card' => '电子卡密',
- ];
- }
- /**
- * status 中文
- */
- public function statusList()
- {
- return [
- 'up' => '上架中',
- 'down' => '已下架',
- 'hidden' => '已隐藏',
- ];
- }
- /**
- * status 中文
- */
- public function dispatchTypeList()
- {
- return [
- 'express' => '快递物流',
- 'autosend' => '自动发货',
- 'custom' => '商家发货'
- ];
- }
- /**
- * 修改器 service_ids
- *
- * @param array|string $value
- * @param array $data
- * @return string
- */
- public function setServiceIdsAttr($value, $data)
- {
- $service_ids = is_array($value) ? join(',', $value) : $value;
- return $service_ids;
- }
- public function setIsOfflineAttr($value, $data)
- {
- // 除了实体商品,其他都是 0
- return $data['type'] == 'normal' ? $value : 0;
- }
- public function scopeShow($query)
- {
- return $query->whereIn('status', ['up', 'hidden']);
- }
- public function getDispatchTypeTextAttr($value, $data)
- {
- $value = $value ?: ($data['dispatch_type'] ?? null);
- $list = $this->dispatchTypeList();
- return isset($list[$value]) ? $list[$value] : '';
- }
- //最低价格,金钱格式,而不是数组格式
- public function getPriceminAttr($value, $data)
- {
- // 前端传入的 session_id
- $activity_id = session('goods-activity_id:' . $data['id']);
- if ($activity_id && $this->activity) {
- // 活动商品的价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $prices = $skuPrices instanceof \think\Collection ? $skuPrices->column('min_price') : array_column($skuPrices, 'min_price');
- $maxPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column('max_price') : array_column($skuPrices, 'max_price');
- $min_price = $prices ? min($prices) : $data['price'];
- $max_price = $maxPrices ? max($maxPrices) : $data['price'];
- //原版
- /*$priceArr[] = $min_price;
- if ($min_price < $max_price) {
- $priceArr[] = $max_price;
- }*/
- //新的
- $priceArr = $min_price;
- } else if (isset($data['show_score_shop'])) {
- // 积分商品价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $skuPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column(null, 'score') : array_column($skuPrices, null, 'score');
- ksort($skuPrices);
- $skuPrice = current($skuPrices); // 需要积分最少的规格
- if ($skuPrice) {
- // 不自动拼接积分
- // $price = $skuPrice['score'] . '积分';
- // if ($skuPrice['price'] > 0) {
- // $price .= '+¥' . $skuPrice['price'];
- // }
- // $priceArr[] = $price;
- $priceArr[] = $skuPrice['price'];
- } else {
- // 防止没有规格
- $priceArr[] = $data['price'];
- }
- } else {
- // 普通商品的价格区间
- $price = $value ? $value : ($data['price'] ?? 0);
- //原版
- /*$priceArr = [$price];
- if ($price && isset($data['is_sku']) && $data['is_sku']) {
- $max_price = $this->max_sku_price->price;
- if ($price < $max_price) {
- $priceArr[] = $max_price;
- }
- }*/
- $priceArr = $price;
- }
- return $priceArr;
- }
- public function getPriceAttr($value, $data)
- {
- // 前端传入的 session_id
- $activity_id = session('goods-activity_id:' . $data['id']);
- if ($activity_id && $this->activity) {
- // 活动商品的价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $prices = $skuPrices instanceof \think\Collection ? $skuPrices->column('min_price') : array_column($skuPrices, 'min_price');
- $maxPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column('max_price') : array_column($skuPrices, 'max_price');
- $min_price = $prices ? min($prices) : $data['price'];
- $max_price = $maxPrices ? max($maxPrices) : $data['price'];
- $priceArr[] = $min_price;
- if ($min_price < $max_price) {
- $priceArr[] = $max_price;
- }
- } else if (isset($data['show_score_shop'])) {
- // 积分商品价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $skuPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column(null, 'score') : array_column($skuPrices, null, 'score');
- ksort($skuPrices);
- $skuPrice = current($skuPrices); // 需要积分最少的规格
- if ($skuPrice) {
- // 不自动拼接积分
- // $price = $skuPrice['score'] . '积分';
- // if ($skuPrice['price'] > 0) {
- // $price .= '+¥' . $skuPrice['price'];
- // }
- // $priceArr[] = $price;
- $priceArr[] = $skuPrice['price'];
- } else {
- // 防止没有规格
- $priceArr[] = $data['price'];
- }
- } else {
- // 普通商品的价格区间
- $price = $value ? $value : ($data['price'] ?? 0);
- $priceArr = [$price];
- if ($price && isset($data['is_sku']) && $data['is_sku']) {
- $max_price = $this->max_sku_price->price;
- if ($price < $max_price) {
- $priceArr[] = $max_price;
- }
- }
- }
- return $priceArr;
- }
- /**
- * 这个目前只有拼团单独购买要使用
- *
- * @return void
- */
- public function getOriginalGoodsPriceAttr($value, $data)
- {
- $activity_id = session('goods-activity_id:' . $data['id']);
- $priceArr = [];
- if ($activity_id && $this->activity) {
- // 活动商品的价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $prices = $skuPrices instanceof \think\Collection ? $skuPrices->column('old_price') : array_column($skuPrices, 'old_price');
- $min_price = $prices ? min($prices) : $data['price'];
- $max_price = $prices ? max($prices) : $data['price'];
- $priceArr[] = $min_price;
- if ($min_price < $max_price) {
- $priceArr[] = $max_price;
- }
- }
- return $priceArr;
- }
- /**
- * 前端积分商城列表,获取默认所需积分(价格不自动拼接积分了,所以这里单独设置一个属性)
- */
- public function getScoreAttr($value, $data)
- {
- // 积分商品价格
- $skuPrices = $data['new_sku_prices'] ?? [];
- $skuPrices = $skuPrices instanceof \think\Collection ? $skuPrices->column(null, 'score') : array_column($skuPrices, null, 'score');
- ksort($skuPrices);
- $skuPrice = current($skuPrices); // 需要积分最少的规格
- if ($skuPrice) {
- $scoreAmount = $skuPrice['score'] ?? 0;
- } else {
- // 防止没有规格
- $scoreAmount = 0;
- }
- return $scoreAmount;
- }
- public function getSalesAttr($value, $data)
- {
- // 前端传入的 session_id
- $activity_id = session('goods-activity_id:' . $data['id']);
- $sales = $data['sales'] ?? 0;
- $sales += ($data['show_sales'] ?? 0);
- if ($activity_id && $this->activity) {
- if ($this->activity['rules'] && isset($this->activity['rules']['sales_show_type']) && $this->activity['rules']['sales_show_type'] == 'real') {
- // 活动设置显示真实销量
- $skuPrices = $data['new_sku_prices'] ?? [];
- $sales = array_sum($skuPrices instanceof \think\Collection ? $skuPrices->column('sales') : array_column($skuPrices, 'sales'));
- }
- } else if (isset($data['show_score_shop'])) {
- // 积分商城显示真实销量
- $skuPrices = $data['new_sku_prices'] ?? [];
- $sales = array_sum($skuPrices instanceof \think\Collection ? $skuPrices->column('sales') : array_column($skuPrices, 'sales'));
- }
- return $sales;
- }
- /**
- * 真实销量
- */
- public function getRealSalesAttr($value, $data)
- {
- $sales = $data['sales'] ?? 0;
- return $sales;
- }
- /**
- * 相关商品(包含活动)购买用户,只查三个
- *
- * @param [type] $value
- * @param [type] $data
- * @return void
- */
- public function getBuyersAttr($value, $data)
- {
- // 查询活动正在购买的人Goods
- $activity_id = session('goods-activity_id:' . $data['id']);
- $orderItems = OrderItem::with(['user' => function ($query) {
- return $query->field('id,nickname,avatar');
- }])->whereExists(function ($query) {
- $order_name = (new Order())->getQuery()->getTable();
- $order_item_name = (new OrderItem())->getQuery()->getTable();
- $query->table($order_name)->where($order_item_name . '.order_id=' . $order_name . '.id')->whereIn('status', [Order::STATUS_PAID, Order::STATUS_COMPLETED, Order::STATUS_PENDING]);
- });
- if ($activity_id) {
- $orderItems = $orderItems->where('activity_id', $activity_id);
- }
- $orderItems = $orderItems->fieldRaw('max(id),user_id')->where('goods_id', $data['id'])->group('user_id')->limit(3)->select();
- $user = [];
- foreach ($orderItems as $item) {
- if ($item['user']) {
- $user[] = $item['user'];
- }
- }
- return $user;
- }
- public function getIsScoreShopAttr($value, $data)
- {
- $scoreGoodsIds = ScoreSkuPrice::group('goods_id')->cache(20)->column('goods_id');
- return in_array($data['id'], $scoreGoodsIds) ? 1 : 0;
- }
- /**
- * 获取当前商品所属分类的所有上级
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getCategoryIdsArrAttr($value, $data)
- {
- $categoryIds = $data['category_ids'] ? explode(',', $data['category_ids']) : [];
- $categoryIdsArr = [];
- $category = new Category();
- foreach ($categoryIds as $key => $category_id) {
- $currentCategoryIds = (new Tree($category))->getParentFields($category_id);
- if ($currentCategoryIds) {
- $categoryIdsArr[] = $currentCategoryIds;
- }
- }
- return $categoryIdsArr;
- }
- /**
- * 获取服务ids数组
- *
- * @param [type] $value
- * @param [type] $data
- * @return void
- */
- public function getServiceIdsAttr($value, $data)
- {
- $serviceIds = $this->attrFormatComma($value, $data, 'service_ids', true);
- return $serviceIds ? array_values(array_filter(array_map("intval", $serviceIds))) : $serviceIds;
- }
- /**
- * 获取所有服务列表
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getServiceAttr($value, $data)
- {
- $serviceIds = $this->attrFormatComma($value, $data, 'service_ids');
- $serviceData = [];
- if ($serviceIds) {
- $serviceData = Service::whereIn('id', $serviceIds)->select();
- }
- return $serviceData;
- }
- /**
- * 获取规格列表
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getSkusAttr($value, $data)
- {
- $sku = Sku::with('children')->where('goods_id', $data['id'])->where('parent_id', 0)->select();
- return $sku;
- }
- /**
- * 获取规格项列表
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getSkuPricesAttr($value, $data)
- {
- $skuPrices = collection(SkuPrice::where('goods_id', $data['id'])->select());
- return $skuPrices;
- }
- /**
- * 获取器获取所有活动
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getActivitiesAttr($value, $data)
- {
- $activities = ActivityFacade::getGoodsActivitys($data['id']);
- return $activities;
- }
- /**
- * 获取器获取指定活动
- *
- * @param string $value
- * @param array $data
- * @return array
- */
- public function getActivityAttr($value, $data)
- {
- $activity_id = session('goods-activity_id:' . $data['id']);//获取商品活动id的session
- $activities = ActivityFacade::getGoodsActivityByActivity($data['id'], $activity_id); //new \addons\shopro\library\activity\ActivityRedis; getGoodsActivityByActivity
- return $activities;
- }
- public function getPromosAttr($value, $data)
- {
- $promos = ActivityFacade::getGoodsPromos($data['id']);
- foreach ($promos as $key => $promo) {
- $rules = $promo['rules'];
- $rules['simple'] = true;
- $tags = ActivityFacade::formatRuleTags($rules, $promo['type']);
- $promo['tag'] = $tags[0] ?? '';
- $promo['tags'] = $tags;
- $texts = ActivityFacade::formatRuleTexts($rules, $promo['type']);
- $promo['texts'] = $texts;
- $promos[$key] = $promo;
- }
- return $promos ?? [];
- }
- /**
- * 积分商城价格,积分商城的属性
- *
- * @param string $value
- * @param array $data
- * @return string
- */
- public function getScorePriceAttr($value, $data)
- {
- $scoreSkuPrices = collection($this->score_sku_prices)->column(null, 'score');
- ksort($scoreSkuPrices);
- $scoreSkuPrice = current($scoreSkuPrices); // 需要积分最少的规格
- // print_r($scoreSkuPrices);exit;
- if ($scoreSkuPrice) {
- $price['score'] = $scoreSkuPrice['score'] ?? 0;
- $price['price'] = $scoreSkuPrice['price'] ?? 0;
- return $price;
- } else {
- return null;
- }
- // return $score . '积分' . ($price > 0 ? '+¥' . $price : '');
- }
- /**
- * 积分商城销量
- *
- * @param string $value
- * @param array $data
- * @return string
- */
- public function getScoreSalesAttr($value, $data)
- {
- $scoreSkuPrices = $this->score_sku_prices;
- return array_sum(collection($scoreSkuPrices)->column('sales'));
- }
- /**
- * 积分商城库存
- *
- * @param string $value
- * @param array $data
- * @return string
- */
- public function getScoreStockAttr($value, $data)
- {
- $scoreSkuPrices = $this->score_sku_prices;
- return array_sum(collection($scoreSkuPrices)->column('stock'));
- }
- public function maxSkuPrice()
- {
- return $this->hasOne(SkuPrice::class, 'goods_id')->order('price', 'desc');
- }
- public function favorite()
- {
- $user = auth_user();
- $user_id = empty($user) ? 0 : $user->id;
- return $this->hasOne(GoodsLog::class, 'goods_id', 'id')->where('user_id', $user_id)->favorite();
- }
- public function activitySkuPrices()
- {
- return $this->hasMany(ActivitySkuPriceModel::class, 'goods_id');
- }
- public function scoreSkuPrices()
- {
- return $this->hasMany(ScoreSkuPrice::class, 'goods_id')->up();
- }
- /**
- * 包含下架的积分规格
- */
- public function allScoreSkuPrices()
- {
- return $this->hasMany(ScoreSkuPrice::class, 'goods_id');
- }
- public function delScoreSkuPrices()
- {
- return $this->hasMany(ScoreSkuPrice::class, 'goods_id')->removeOption('soft_delete')->whereNotNull('deletetime'); // 只查被删除的记录,这里使用 onlyTrashed 报错
- }
- // -- commission code start --
- public function commissionGoods()
- {
- return $this->hasOne(\app\admin\model\shopro\commission\CommissionGoods::class, 'goods_id');
- }
- // -- commission code end --
- }
|