2018-12-28 18:58:37 +08:00
< ? php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
2019-02-18 13:52:07 +08:00
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
2018-12-28 18:58:37 +08:00
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service ;
use think\Db ;
2019-02-26 22:45:47 +08:00
use think\facade\Hook ;
2019-01-17 00:37:20 +08:00
use app\service\ResourcesService ;
use app\service\BrandService ;
use app\service\RegionService ;
2018-12-28 18:58:37 +08:00
/**
* 商品服务层
* @ author Devil
* @ blog http :// gong . gg /
* @ version 0.0 . 1
* @ datetime 2016 - 12 - 01 T21 : 51 : 08 + 0800
*/
class GoodsService
{
/**
* 根据id获取一条商品分类
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsCategoryRow ( $params = [])
2018-12-28 18:58:37 +08:00
{
if ( empty ( $params [ 'id' ]))
{
return null ;
}
$field = empty ( $params [ 'field' ]) ? 'id,pid,icon,name,vice_name,describe,bg_color,big_images,sort,is_home_recommended' : $params [ 'field' ];
2019-01-17 00:37:20 +08:00
$data = self :: GoodsCategoryDataDealWith ([ Db :: name ( 'GoodsCategory' ) -> field ( $field ) -> where ([ 'is_enable' => 1 , 'id' => intval ( $params [ 'id' ])]) -> find ()]);
2018-12-28 18:58:37 +08:00
return empty ( $data [ 0 ]) ? null : $data [ 0 ];
}
/**
2019-04-05 00:35:46 +08:00
* 获取所有分类
2018-12-28 18:58:37 +08:00
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-04-05 00:35:46 +08:00
public static function GoodsCategoryAll ( $params = [])
2018-12-28 18:58:37 +08:00
{
2019-03-30 01:40:34 +08:00
// 从缓存获取
2019-03-30 01:51:19 +08:00
$key = config ( 'shopxo.cache_goods_category_key' );
2019-03-30 01:40:34 +08:00
$data = cache ( $key );
if ( ! empty ( $data ))
{
return $data ;
}
2019-04-05 00:35:46 +08:00
// 获取分类
$params [ 'where' ] = [ 'pid' => 0 , 'is_enable' => 1 ];
$data = self :: GoodsCategory ( $params );
// 存储缓存
cache ( $key , $data );
return $data ;
}
/**
* 获取分类
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
public static function GoodsCategory ( $params = [])
{
2019-03-30 01:40:34 +08:00
// 获取分类
2018-12-28 18:58:37 +08:00
$where = empty ( $params [ 'where' ]) ? [ 'pid' => 0 , 'is_enable' => 1 ] : $params [ 'where' ];
2019-01-17 00:37:20 +08:00
$data = self :: GoodsCategoryList ( $where );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $data ))
{
foreach ( $data as & $v )
{
2019-04-05 00:35:46 +08:00
$where [ 'pid' ] = $v [ 'id' ];
$v [ 'items' ] = self :: GoodsCategoryList ( $where );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $v [ 'items' ]))
{
// 一次性查出所有二级下的三级、再做归类、避免sql连接超多
2019-04-05 00:35:46 +08:00
$where [ 'pid' ] = array_column ( $v [ 'items' ], 'id' );
$items = self :: GoodsCategoryList ( $where );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $items ))
{
foreach ( $v [ 'items' ] as & $vs )
{
foreach ( $items as $vss )
{
if ( $vs [ 'id' ] == $vss [ 'pid' ])
{
$vs [ 'items' ][] = $vss ;
}
}
}
}
}
}
}
return $data ;
}
/**
* 根据pid获取商品分类列表
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $where [ 条件 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsCategoryList ( $where = [])
2018-12-28 18:58:37 +08:00
{
$where [ 'is_enable' ] = 1 ;
2019-06-02 21:45:10 +08:00
$field = 'id,pid,icon,name,vice_name,describe,bg_color,big_images,sort,is_home_recommended,seo_title,seo_keywords,seo_desc' ;
2018-12-28 18:58:37 +08:00
$data = Db :: name ( 'GoodsCategory' ) -> field ( $field ) -> where ( $where ) -> order ( 'sort asc' ) -> select ();
2019-01-17 00:37:20 +08:00
return self :: GoodsCategoryDataDealWith ( $data );
2018-12-28 18:58:37 +08:00
}
/**
* 商品分类数据处理
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 06
* @ desc description
* @ param [ array ] $data [ 商品分类数据 二维数组 ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsCategoryDataDealWith ( $data )
2018-12-28 18:58:37 +08:00
{
if ( ! empty ( $data ) && is_array ( $data ))
{
foreach ( $data as & $v )
{
if ( is_array ( $v ))
{
if ( isset ( $v [ 'icon' ]))
{
2019-01-14 00:03:29 +08:00
$v [ 'icon' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'icon' ]);
2018-12-28 18:58:37 +08:00
}
if ( isset ( $v [ 'big_images' ]))
{
$v [ 'big_images_old' ] = $v [ 'big_images' ];
2019-01-14 00:03:29 +08:00
$v [ 'big_images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'big_images' ]);
2018-12-28 18:58:37 +08:00
}
}
}
}
return $data ;
}
/**
* 获取首页楼层数据
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function HomeFloorList ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 商品大分类
2019-04-05 00:35:46 +08:00
$params [ 'where' ] = [ 'pid' => 0 , 'is_home_recommended' => 1 , 'is_enable' => 1 ];
2019-01-17 00:37:20 +08:00
$goods_category = self :: GoodsCategory ( $params );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $goods_category ))
{
foreach ( $goods_category as & $v )
{
2019-01-17 00:37:20 +08:00
$category_ids = self :: GoodsCategoryItemsIds ([ $v [ 'id' ]], 1 );
2019-07-31 00:16:12 +08:00
$goods = self :: CategoryGoodsList ([ 'where' => [ 'gci.category_id' => $category_ids , 'g.is_home_recommended' => 1 , 'g.is_shelves' => 1 ], 'm' => 0 , 'n' => 8 , 'field' => 'g.*' ]);
2019-02-26 22:45:47 +08:00
$v [ 'goods' ] = $goods [ 'data' ];
2018-12-28 18:58:37 +08:00
}
}
return $goods_category ;
}
/**
* 获取商品分类下的所有分类id
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $ids [ 分类id数组 ]
* @ param [ int ] $is_enable [ 是否启用 null , 0 否 , 1 是 ]
2019-09-29 21:51:47 +08:00
* @ param [ string ] $order_by [ 排序 , 默认sort asc ]
2018-12-28 18:58:37 +08:00
*/
2019-09-29 21:51:47 +08:00
public static function GoodsCategoryItemsIds ( $ids = [], $is_enable = null , $order_by = 'sort asc' )
2018-12-28 18:58:37 +08:00
{
$where = [ 'pid' => $ids ];
if ( $is_enable !== null )
{
$where [ 'is_enable' ] = $is_enable ;
}
2019-09-29 21:51:47 +08:00
$data = Db :: name ( 'GoodsCategory' ) -> where ( $where ) -> order ( $order_by ) -> column ( 'id' );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $data ))
{
2019-09-29 21:51:47 +08:00
$temp = self :: GoodsCategoryItemsIds ( $data , $is_enable , $order_by );
2018-12-28 18:58:37 +08:00
if ( ! empty ( $temp ))
{
2019-08-01 16:31:52 +08:00
$data = array_merge ( $data , $temp );
2018-12-28 18:58:37 +08:00
}
}
2019-08-01 16:31:52 +08:00
$data = empty ( $data ) ? $ids : array_merge ( $ids , $data );
2018-12-28 18:58:37 +08:00
return $data ;
}
/**
* 获取分类与商品关联总数
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 07
* @ desc description
* @ param array $where [ 条件 ]
*/
2019-01-17 00:37:20 +08:00
public static function CategoryGoodsTotal ( $where = [])
2018-12-28 18:58:37 +08:00
{
return ( int ) Db :: name ( 'Goods' ) -> alias ( 'g' ) -> join ([ '__GOODS_CATEGORY_JOIN__' => 'gci' ], 'g.id=gci.goods_id' ) -> where ( $where ) -> count ( 'DISTINCT g.id' );
}
/**
* 获取分类与商品关联列表
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param array $params [ 输入参数 : where , field , is_photo ]
*/
2019-01-17 00:37:20 +08:00
public static function CategoryGoodsList ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = empty ( $params [ 'where' ]) ? [] : $params [ 'where' ];
$field = empty ( $params [ 'field' ]) ? 'g.*' : $params [ 'field' ];
$order_by = empty ( $params [ 'order_by' ]) ? 'g.id desc' : trim ( $params [ 'order_by' ]);
$m = isset ( $params [ 'm' ]) ? intval ( $params [ 'm' ]) : 0 ;
$n = isset ( $params [ 'n' ]) ? intval ( $params [ 'n' ]) : 10 ;
$data = Db :: name ( 'Goods' ) -> alias ( 'g' ) -> join ([ '__GOODS_CATEGORY_JOIN__' => 'gci' ], 'g.id=gci.goods_id' ) -> field ( $field ) -> where ( $where ) -> group ( 'g.id' ) -> order ( $order_by ) -> limit ( $m , $n ) -> select ();
2019-01-17 00:37:20 +08:00
return self :: GoodsDataHandle ( $params , $data );
2018-12-28 18:58:37 +08:00
}
/**
* 商品数据处理
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 08 T23 : 16 : 42 + 0800
* @ param [ array ] $params [ 输入参数 ]
* @ param [ array ] $data [ 商品列表 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsDataHandle ( $params , $data )
2018-12-28 18:58:37 +08:00
{
if ( ! empty ( $data ))
{
// 其它额外处理
$is_photo = ( isset ( $params [ 'is_photo' ]) && $params [ 'is_photo' ] == true ) ? true : false ;
$is_spec = ( isset ( $params [ 'is_spec' ]) && $params [ 'is_spec' ] == true ) ? true : false ;
$is_content_app = ( isset ( $params [ 'is_content_app' ]) && $params [ 'is_content_app' ] == true ) ? true : false ;
$is_category = ( isset ( $params [ 'is_category' ]) && $params [ 'is_category' ] == true ) ? true : false ;
// 开始处理数据
foreach ( $data as & $v )
{
2019-02-26 22:45:47 +08:00
// 商品处理前钩子
$hook_name = 'plugins_service_goods_handle_begin' ;
2019-12-02 20:58:24 +08:00
$ret = HookReturnHandle ( Hook :: listen ( $hook_name , [
2019-02-26 22:45:47 +08:00
'hook_name' => $hook_name ,
'is_backend' => true ,
'params' => & $params ,
'goods' => & $v ,
2019-09-25 21:52:33 +08:00
'goods_id' => isset ( $v [ 'id' ]) ? $v [ 'id' ] : 0 ,
2019-12-02 20:58:24 +08:00
]));
2019-02-26 22:45:47 +08:00
if ( isset ( $ret [ 'code' ]) && $ret [ 'code' ] != 0 )
{
return $ret ;
}
2019-07-25 17:11:32 +08:00
// 商品价格容器
$v [ 'price_container' ] = [
'price' => isset ( $v [ 'price' ]) ? $v [ 'price' ] : 0.00 ,
'min_price' => isset ( $v [ 'min_price' ]) ? $v [ 'min_price' ] : 0.00 ,
'max_price' => isset ( $v [ 'max_price' ]) ? $v [ 'max_price' ] : 0.00 ,
'original_price' => isset ( $v [ 'original_price' ]) ? $v [ 'original_price' ] : 0.00 ,
'min_original_price' => isset ( $v [ 'min_original_price' ]) ? $v [ 'min_original_price' ] : 0.00 ,
'max_original_price' => isset ( $v [ 'max_original_price' ]) ? $v [ 'max_original_price' ] : 0.00 ,
];
2018-12-28 18:58:37 +08:00
// 商品url地址
if ( ! empty ( $v [ 'id' ]))
{
$v [ 'goods_url' ] = MyUrl ( 'index/goods/index' , [ 'id' => $v [ 'id' ]]);
}
// 商品封面图片
if ( isset ( $v [ 'images' ]))
{
$v [ 'images_old' ] = $v [ 'images' ];
2019-01-14 00:03:29 +08:00
$v [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'images' ]);
2018-12-28 18:58:37 +08:00
}
// 视频
if ( isset ( $v [ 'video' ]))
{
$v [ 'video_old' ] = $v [ 'video' ];
2019-01-14 00:03:29 +08:00
$v [ 'video' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'video' ]);
2018-12-28 18:58:37 +08:00
}
// 商品首页推荐图片,不存在则使用商品封面图片
if ( isset ( $v [ 'home_recommended_images' ]))
{
2019-03-03 21:07:02 +08:00
if ( empty ( $v [ 'home_recommended_images' ]))
{
if ( isset ( $v [ 'images' ]))
{
$v [ 'home_recommended_images' ] = $v [ 'images' ];
} else {
if ( ! empty ( $v [ 'id' ]))
{
$images = Db :: name ( 'Goods' ) -> where ([ 'id' => $v [ 'id' ]]) -> value ( 'images' );
$v [ 'home_recommended_images' ] = ResourcesService :: AttachmentPathViewHandle ( $images );
}
}
} else {
$v [ 'home_recommended_images_old' ] = $v [ 'home_recommended_images' ];
$v [ 'home_recommended_images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'home_recommended_images' ]);
}
2018-12-28 18:58:37 +08:00
}
// PC内容处理
if ( isset ( $v [ 'content_web' ]))
{
$v [ 'content_web' ] = ResourcesService :: ContentStaticReplace ( $v [ 'content_web' ], 'get' );
}
2019-11-13 20:51:43 +08:00
// 虚拟商品展示数据
2019-11-19 21:46:22 +08:00
if ( isset ( $v [ 'fictitious_goods_value' ]))
2019-11-13 20:51:43 +08:00
{
2019-11-19 21:46:22 +08:00
$v [ 'fictitious_goods_value' ] = ResourcesService :: ContentStaticReplace ( $v [ 'fictitious_goods_value' ], 'get' );
2019-11-13 20:51:43 +08:00
}
2018-12-28 18:58:37 +08:00
// 产地
2019-03-07 18:28:01 +08:00
if ( isset ( $v [ 'place_origin' ]))
2019-03-06 23:05:09 +08:00
{
$v [ 'place_origin_name' ] = empty ( $v [ 'place_origin' ]) ? null : RegionService :: RegionName ( $v [ 'place_origin' ]);
}
2018-12-28 18:58:37 +08:00
// 品牌
2019-03-06 23:05:09 +08:00
if ( isset ( $v [ 'brand_id' ]))
{
$v [ 'brand_name' ] = empty ( $v [ 'brand_id' ]) ? null : BrandService :: BrandName ( $v [ 'brand_id' ]);
}
2018-12-28 18:58:37 +08:00
// 时间
if ( ! empty ( $v [ 'add_time' ]))
{
$v [ 'add_time' ] = date ( 'Y-m-d H:i:s' , $v [ 'add_time' ]);
}
if ( ! empty ( $v [ 'upd_time' ]))
{
$v [ 'upd_time' ] = date ( 'Y-m-d H:i:s' , $v [ 'upd_time' ]);
}
// 是否需要分类名称
if ( $is_category && ! empty ( $v [ 'id' ]))
{
$v [ 'category_ids' ] = Db :: name ( 'GoodsCategoryJoin' ) -> where ([ 'goods_id' => $v [ 'id' ]]) -> column ( 'category_id' );
$category_name = Db :: name ( 'GoodsCategory' ) -> where ([ 'id' => $v [ 'category_ids' ]]) -> column ( 'name' );
$v [ 'category_text' ] = implode ( ', ' , $category_name );
}
// 获取相册
if ( $is_photo && ! empty ( $v [ 'id' ]))
{
$v [ 'photo' ] = Db :: name ( 'GoodsPhoto' ) -> where ([ 'goods_id' => $v [ 'id' ], 'is_show' => 1 ]) -> order ( 'sort asc' ) -> select ();
if ( ! empty ( $v [ 'photo' ]))
{
foreach ( $v [ 'photo' ] as & $vs )
{
$vs [ 'images_old' ] = $vs [ 'images' ];
2019-01-14 00:03:29 +08:00
$vs [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $vs [ 'images' ]);
2018-12-28 18:58:37 +08:00
}
}
}
2019-09-23 13:56:03 +08:00
// 规格基础
if ( isset ( $v [ 'spec_base' ]))
{
$v [ 'spec_base' ] = empty ( $v [ 'spec_base' ]) ? '' : json_decode ( $v [ 'spec_base' ], true );
}
2018-12-28 18:58:37 +08:00
// 获取规格
if ( $is_spec && ! empty ( $v [ 'id' ]))
{
2019-01-17 00:37:20 +08:00
$v [ 'specifications' ] = self :: GoodsSpecifications ([ 'goods_id' => $v [ 'id' ]]);
2018-12-28 18:58:37 +08:00
}
// 获取app内容
if ( $is_content_app && ! empty ( $v [ 'id' ]))
{
2019-01-17 00:37:20 +08:00
$v [ 'content_app' ] = self :: GoodsContentApp ([ 'goods_id' => $v [ 'id' ]]);
2018-12-28 18:58:37 +08:00
}
2019-02-26 22:45:47 +08:00
2019-03-26 17:48:53 +08:00
// 展示字段
$v [ 'show_field_original_price_text' ] = '原价' ;
$v [ 'show_field_price_text' ] = '销售价' ;
2019-06-26 00:13:47 +08:00
// 商品处理后钩子
2019-02-26 22:45:47 +08:00
$hook_name = 'plugins_service_goods_handle_end' ;
2019-12-02 20:58:24 +08:00
$ret = HookReturnHandle ( Hook :: listen ( $hook_name , [
2019-02-26 22:45:47 +08:00
'hook_name' => $hook_name ,
'is_backend' => true ,
'params' => & $params ,
'goods' => & $v ,
2019-09-25 21:52:33 +08:00
'goods_id' => isset ( $v [ 'id' ]) ? $v [ 'id' ] : 0 ,
2019-12-02 20:58:24 +08:00
]));
2019-02-26 22:45:47 +08:00
if ( isset ( $ret [ 'code' ]) && $ret [ 'code' ] != 0 )
{
return $ret ;
}
2018-12-28 18:58:37 +08:00
}
}
2019-02-26 22:45:47 +08:00
return DataReturn ( '处理成功' , 0 , $data );
2018-12-28 18:58:37 +08:00
}
/**
* 获取商品手机详情
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
* @ return [ array ] [ app内容 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsContentApp ( $params = [])
2018-12-28 18:58:37 +08:00
{
$data = Db :: name ( 'GoodsContentApp' ) -> where ([ 'goods_id' => $params [ 'goods_id' ]]) -> field ( 'id,images,content' ) -> order ( 'sort asc' ) -> select ();
if ( ! empty ( $data ))
{
foreach ( $data as & $v )
{
$v [ 'images_old' ] = $v [ 'images' ];
2019-01-14 00:03:29 +08:00
$v [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'images' ]);
2018-12-28 18:58:37 +08:00
$v [ 'content_old' ] = $v [ 'content' ];
$v [ 'content' ] = empty ( $v [ 'content' ]) ? null : explode ( " \n " , $v [ 'content' ]);
}
}
return $data ;
}
/**
* 获取商品属性
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsSpecifications ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 条件
$where = [ 'goods_id' => $params [ 'goods_id' ]];
// 规格类型
$choose = Db :: name ( 'GoodsSpecType' ) -> where ( $where ) -> order ( 'id asc' ) -> select ();
if ( ! empty ( $choose ))
{
// 数据处理
foreach ( $choose as & $temp_type )
{
$temp_type_value = json_decode ( $temp_type [ 'value' ], true );
foreach ( $temp_type_value as & $vs )
{
2019-01-14 00:03:29 +08:00
$vs [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $vs [ 'images' ]);
2018-12-28 18:58:37 +08:00
}
$temp_type [ 'value' ] = $temp_type_value ;
$temp_type [ 'add_time' ] = date ( 'Y-m-d H:i:s' );
}
2019-01-23 10:53:24 +08:00
// 只有一个规格的时候直接获取规格值的库存数
if ( count ( $choose ) == 1 )
{
foreach ( $choose [ 0 ][ 'value' ] as & $temp_spec )
{
$temp_spec_params = [
'id' => $params [ 'goods_id' ],
'spec' => [
[ 'type' => $choose [ 0 ][ 'name' ], 'value' => $temp_spec [ 'name' ]]
],
];
$temp = self :: GoodsSpecDetail ( $temp_spec_params );
if ( $temp [ 'code' ] == 0 )
{
$temp_spec [ 'is_only_level_one' ] = 1 ;
2019-07-25 18:21:36 +08:00
$temp_spec [ 'inventory' ] = $temp [ 'data' ][ 'spec_base' ][ 'inventory' ];
2019-01-23 10:53:24 +08:00
}
}
}
2018-12-28 18:58:37 +08:00
}
return [ 'choose' => $choose ];
}
/**
* 商品收藏
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsFavor ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '商品id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'user' ,
'error_msg' => '用户信息有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
2019-02-27 11:51:19 +08:00
// 查询用户状态是否正常
$ret = UserService :: UserStatusCheck ( 'id' , $params [ 'user' ][ 'id' ]);
if ( $ret [ 'code' ] != 0 )
{
return $ret ;
}
2018-12-28 18:58:37 +08:00
// 开始操作
$data = [ 'goods_id' => intval ( $params [ 'id' ]), 'user_id' => $params [ 'user' ][ 'id' ]];
$temp = Db :: name ( 'GoodsFavor' ) -> where ( $data ) -> find ();
if ( empty ( $temp ))
{
// 添加收藏
$data [ 'add_time' ] = time ();
if ( Db :: name ( 'GoodsFavor' ) -> insertGetId ( $data ) > 0 )
{
return DataReturn ( '收藏成功' , 0 , [
'text' => '已收藏' ,
'status' => 1 ,
2019-01-17 00:37:20 +08:00
'count' => self :: GoodsFavorTotal ([ 'goods_id' => $data [ 'goods_id' ]]),
2018-12-28 18:58:37 +08:00
]);
} else {
return DataReturn ( '收藏失败' );
}
} else {
// 是否强制收藏
if ( isset ( $params [ 'is_mandatory_favor' ]) && $params [ 'is_mandatory_favor' ] == 1 )
{
return DataReturn ( '收藏成功' , 0 , [
'text' => '已收藏' ,
'status' => 1 ,
2019-01-17 00:37:20 +08:00
'count' => self :: GoodsFavorTotal ([ 'goods_id' => $data [ 'goods_id' ]]),
2018-12-28 18:58:37 +08:00
]);
}
// 删除收藏
if ( Db :: name ( 'GoodsFavor' ) -> where ( $data ) -> delete () > 0 )
{
return DataReturn ( '取消成功' , 0 , [
'text' => '收藏' ,
'status' => 0 ,
2019-01-17 00:37:20 +08:00
'count' => self :: GoodsFavorTotal ([ 'goods_id' => $data [ 'goods_id' ]]),
2018-12-28 18:58:37 +08:00
]);
} else {
return DataReturn ( '取消失败' );
}
}
}
/**
* 用户是否收藏了商品
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
* @ return [ int ] [ 1 已收藏 , 0 未收藏 ]
*/
2019-01-17 00:37:20 +08:00
public static function IsUserGoodsFavor ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'goods_id' ,
'error_msg' => '商品id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'user' ,
'error_msg' => '用户信息有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
$data = [ 'goods_id' => intval ( $params [ 'goods_id' ]), 'user_id' => $params [ 'user' ][ 'id' ]];
$temp = Db :: name ( 'GoodsFavor' ) -> where ( $data ) -> find ();
return DataReturn ( '操作成功' , 0 , empty ( $temp ) ? 0 : 1 );
}
/**
* 前端商品收藏列表条件
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function UserGoodsFavorListWhere ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = [
[ 'g.is_delete_time' , '=' , 0 ]
];
// 用户id
if ( ! empty ( $params [ 'user' ]))
{
$where [] = [ 'f.user_id' , '=' , $params [ 'user' ][ 'id' ]];
}
if ( ! empty ( $params [ 'keywords' ]))
{
2019-06-22 23:11:37 +08:00
$where [] = [ 'g.title|g.model|g.simple_desc|g.seo_title|g.seo_keywords|g.seo_keywords' , 'like' , '%' . $params [ 'keywords' ] . '%' ];
2018-12-28 18:58:37 +08:00
}
return $where ;
}
/**
* 商品收藏总数
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $where [ 条件 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsFavorTotal ( $where = [])
2018-12-28 18:58:37 +08:00
{
return ( int ) Db :: name ( 'GoodsFavor' ) -> alias ( 'f' ) -> join ([ '__GOODS__' => 'g' ], 'g.id=f.goods_id' ) -> where ( $where ) -> count ();
}
/**
* 商品收藏列表
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsFavorList ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = empty ( $params [ 'where' ]) ? [] : $params [ 'where' ];
$m = isset ( $params [ 'm' ]) ? intval ( $params [ 'm' ]) : 0 ;
$n = isset ( $params [ 'n' ]) ? intval ( $params [ 'n' ]) : 10 ;
$order_by = empty ( $params [ 'order_by' ]) ? 'f.id desc' : $params [ 'order_by' ];
2019-05-31 00:50:04 +08:00
$field = 'f.*, g.title, g.original_price, g.price, g.min_price, g.images' ;
2018-12-28 18:58:37 +08:00
// 获取数据
$data = Db :: name ( 'GoodsFavor' ) -> alias ( 'f' ) -> join ([ '__GOODS__' => 'g' ], 'g.id=f.goods_id' ) -> field ( $field ) -> where ( $where ) -> limit ( $m , $n ) -> order ( $order_by ) -> select ();
if ( ! empty ( $data ))
{
foreach ( $data as & $v )
{
// 图片
$v [ 'images_old' ] = $v [ 'images' ];
2019-01-14 00:03:29 +08:00
$v [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'images' ]);
2018-12-28 18:58:37 +08:00
$v [ 'goods_url' ] = MyUrl ( 'index/goods/index' , [ 'id' => $v [ 'goods_id' ]]);
}
}
return DataReturn ( '处理成功' , 0 , $data );
}
/**
* 商品访问统计加1
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 10 - 15
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsAccessCountInc ( $params = [])
2018-12-28 18:58:37 +08:00
{
if ( ! empty ( $params [ 'goods_id' ]))
{
2019-03-13 15:47:36 +08:00
return Db :: name ( 'Goods' ) -> where ([ 'id' => intval ( $params [ 'goods_id' ])]) -> setInc ( 'access_count' );
2018-12-28 18:58:37 +08:00
}
return false ;
}
/**
* 商品浏览保存
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 10 - 15
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsBrowseSave ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'goods_id' ,
'error_msg' => '商品id有误' ,
],
[
'checked_type' => 'is_array' ,
'key_name' => 'user' ,
'error_msg' => '用户信息有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
$where = [ 'goods_id' => intval ( $params [ 'goods_id' ]), 'user_id' => $params [ 'user' ][ 'id' ]];
$temp = Db :: name ( 'GoodsBrowse' ) -> where ( $where ) -> find ();
$data = [
'goods_id' => intval ( $params [ 'goods_id' ]),
'user_id' => $params [ 'user' ][ 'id' ],
'upd_time' => time (),
];
if ( empty ( $temp ))
{
$data [ 'add_time' ] = time ();
$status = Db :: name ( 'GoodsBrowse' ) -> insertGetId ( $data ) > 0 ;
} else {
$status = Db :: name ( 'GoodsBrowse' ) -> where ( $where ) -> update ( $data ) !== false ;
}
if ( $status )
{
return DataReturn ( '处理成功' , 0 );
}
return DataReturn ( '处理失败' , - 100 );
}
/**
* 前端商品浏览列表条件
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function UserGoodsBrowseListWhere ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = [
[ 'g.is_delete_time' , '=' , 0 ]
];
// 用户id
if ( ! empty ( $params [ 'user' ]))
{
$where [] = [ 'b.user_id' , '=' , $params [ 'user' ][ 'id' ]];
}
if ( ! empty ( $params [ 'keywords' ]))
{
2019-06-22 23:11:37 +08:00
$where [] = [ 'g.title|g.model|g.simple_desc|g.seo_title|g.seo_keywords|g.seo_keywords' , 'like' , '%' . $params [ 'keywords' ] . '%' ];
2018-12-28 18:58:37 +08:00
}
return $where ;
}
/**
* 商品浏览总数
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $where [ 条件 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsBrowseTotal ( $where = [])
2018-12-28 18:58:37 +08:00
{
return ( int ) Db :: name ( 'GoodsBrowse' ) -> alias ( 'b' ) -> join ([ '__GOODS__' => 'g' ], 'g.id=b.goods_id' ) -> where ( $where ) -> count ();
}
/**
* 商品浏览列表
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 29
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsBrowseList ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = empty ( $params [ 'where' ]) ? [] : $params [ 'where' ];
$m = isset ( $params [ 'm' ]) ? intval ( $params [ 'm' ]) : 0 ;
$n = isset ( $params [ 'n' ]) ? intval ( $params [ 'n' ]) : 10 ;
$order_by = empty ( $params [ 'order_by' ]) ? 'b.id desc' : $params [ 'order_by' ];
2019-05-31 00:50:04 +08:00
$field = 'b.*, g.title, g.original_price, g.price, g.min_price, g.images' ;
2018-12-28 18:58:37 +08:00
// 获取数据
$data = Db :: name ( 'GoodsBrowse' ) -> alias ( 'b' ) -> join ([ '__GOODS__' => 'g' ], 'g.id=b.goods_id' ) -> field ( $field ) -> where ( $where ) -> limit ( $m , $n ) -> order ( $order_by ) -> select ();
if ( ! empty ( $data ))
{
foreach ( $data as & $v )
{
$v [ 'images_old' ] = $v [ 'images' ];
2019-01-14 00:03:29 +08:00
$v [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'images' ]);
2018-12-28 18:58:37 +08:00
$v [ 'goods_url' ] = MyUrl ( 'index/goods/index' , [ 'id' => $v [ 'goods_id' ]]);
}
}
return DataReturn ( '处理成功' , 0 , $data );
}
/**
* 商品浏览删除
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 14
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsBrowseDelete ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '删除数据id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'user' ,
'error_msg' => '用户信息有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 删除
$where = [
'id' => explode ( ',' , $params [ 'id' ]),
'user_id' => $params [ 'user' ][ 'id' ]
];
if ( Db :: name ( 'GoodsBrowse' ) -> where ( $where ) -> delete ())
{
return DataReturn ( '删除成功' , 0 );
}
return DataReturn ( '删除失败或资源不存在' , - 100 );
}
/**
* 获取商品总数
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 09 - 07
* @ desc description
* @ param [ array ] $where [ 条件 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsTotal ( $where = [])
2018-12-28 18:58:37 +08:00
{
return ( int ) Db :: name ( 'Goods' ) -> where ( $where ) -> count ();
}
/**
* 获取商品列表
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param array $params [ 输入参数 : where , field , is_photo ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsList ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = empty ( $params [ 'where' ]) ? [] : $params [ 'where' ];
$field = empty ( $params [ 'field' ]) ? '*' : $params [ 'field' ];
$order_by = empty ( $params [ 'order_by' ]) ? 'id desc' : trim ( $params [ 'order_by' ]);
$m = isset ( $params [ 'm' ]) ? intval ( $params [ 'm' ]) : 0 ;
$n = isset ( $params [ 'n' ]) ? intval ( $params [ 'n' ]) : 10 ;
$data = Db :: name ( 'Goods' ) -> field ( $field ) -> where ( $where ) -> order ( $order_by ) -> limit ( $m , $n ) -> select ();
2019-01-17 00:37:20 +08:00
return self :: GoodsDataHandle ( $params , $data );
2018-12-28 18:58:37 +08:00
}
/**
* 后台管理商品列表条件
* @ author Devil
* @ blog http :// gong . gg /
* @ version 0.0 . 1
* @ datetime 2016 - 12 - 10 T22 : 16 : 29 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GetAdminIndexWhere ( $params = [])
2018-12-28 18:58:37 +08:00
{
$where = [
[ 'is_delete_time' , '=' , 0 ],
];
// 模糊
if ( ! empty ( $params [ 'keywords' ]))
{
2019-06-22 23:11:37 +08:00
$where [] = [ 'title|model|simple_desc|seo_title|seo_keywords|seo_keywords' , 'like' , '%' . $params [ 'keywords' ] . '%' ];
2018-12-28 18:58:37 +08:00
}
// 是否更多条件
if ( isset ( $params [ 'is_more' ]) && $params [ 'is_more' ] == 1 )
{
// 等值
if ( isset ( $params [ 'is_shelves' ]) && $params [ 'is_shelves' ] > - 1 )
{
$where [] = [ 'is_shelves' , '=' , intval ( $params [ 'is_shelves' ])];
}
if ( isset ( $params [ 'is_home_recommended' ]) && $params [ 'is_home_recommended' ] > - 1 )
{
$where [] = [ 'is_home_recommended' , '=' , intval ( $params [ 'is_home_recommended' ])];
}
// 时间
if ( ! empty ( $params [ 'time_start' ]))
{
$where [] = [ 'add_time' , '>' , strtotime ( $params [ 'time_start' ])];
}
if ( ! empty ( $params [ 'time_end' ]))
{
$where [] = [ 'add_time' , '<' , strtotime ( $params [ 'time_end' ])];
}
2019-08-15 18:56:05 +08:00
// 商品分类
if ( ! empty ( $params [ 'category_id' ]) && $params [ 'category_id' ] > 0 )
{
$category_ids = self :: GoodsCategoryItemsIds ([ intval ( $params [ 'category_id' ])], 1 );
$goods_ids = Db :: name ( 'GoodsCategoryJoin' ) -> where ([ 'category_id' => $category_ids ]) -> column ( 'goods_id' );
if ( ! empty ( $goods_ids ))
{
$where [] = [ 'id' , 'in' , $goods_ids ];
} else {
// 避免空条件造成无效的错觉
$where [] = [ 'id' , '=' , 0 ];
}
}
// 品牌
if ( ! empty ( $params [ 'brand_id' ]) && $params [ 'brand_id' ] > 0 )
{
$where [] = [ 'brand_id' , '=' , intval ( $params [ 'brand_id' ])];
}
2018-12-28 18:58:37 +08:00
}
return $where ;
}
/**
* 商品保存
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 10 T01 : 02 : 11 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsSave ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'length' ,
'key_name' => 'title' ,
'checked_data' => '2,60' ,
'error_msg' => '标题名称格式 2~60 个字符' ,
],
2019-06-13 10:59:53 +08:00
[
'checked_type' => 'length' ,
'key_name' => 'simple_desc' ,
2019-08-04 10:52:12 +08:00
'checked_data' => '160' ,
2019-06-13 10:59:53 +08:00
'is_checked' => 1 ,
2019-08-04 10:52:12 +08:00
'error_msg' => '商品简述格式 最多160个字符' ,
2019-06-13 10:59:53 +08:00
],
2018-12-28 18:58:37 +08:00
[
'checked_type' => 'length' ,
'key_name' => 'model' ,
'checked_data' => '30' ,
'is_checked' => 1 ,
'error_msg' => '商品型号格式 最多30个字符' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'category_id' ,
'error_msg' => '请至少选择一个商品分类' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'inventory_unit' ,
'checked_data' => '1,6' ,
'error_msg' => '库存单位格式 1~6 个字符' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'buy_min_number' ,
'error_msg' => '请填写有效的最低起购数量' ,
],
2019-06-02 21:45:10 +08:00
[
'checked_type' => 'length' ,
'key_name' => 'seo_title' ,
'checked_data' => '100' ,
'is_checked' => 1 ,
'error_msg' => 'SEO标题格式 最多100个字符' ,
],
2019-05-05 11:29:55 +08:00
[
'checked_type' => 'length' ,
'key_name' => 'seo_keywords' ,
'checked_data' => '130' ,
'is_checked' => 1 ,
'error_msg' => 'SEO关键字格式 最多130个字符' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'seo_desc' ,
'checked_data' => '230' ,
'is_checked' => 1 ,
'error_msg' => 'SEO描述格式 最多230个字符' ,
],
2018-12-28 18:58:37 +08:00
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
2019-09-23 13:56:03 +08:00
// 规格基础
$specifications_base = self :: GetFormGoodsSpecificationsBaseParams ( $params );
if ( $specifications_base [ 'code' ] != 0 )
{
return $specifications_base ;
}
// 规格值
2019-01-17 00:37:20 +08:00
$specifications = self :: GetFormGoodsSpecificationsParams ( $params );
2018-12-28 18:58:37 +08:00
if ( $specifications [ 'code' ] != 0 )
{
return $specifications ;
}
// 相册
2019-01-17 00:37:20 +08:00
$photo = self :: GetFormGoodsPhotoParams ( $params );
2018-12-28 18:58:37 +08:00
if ( $photo [ 'code' ] != 0 )
{
return $photo ;
}
// 手机端详情
2019-01-17 00:37:20 +08:00
$content_app = self :: GetFormGoodsContentAppParams ( $params );
2018-12-28 18:58:37 +08:00
if ( $content_app [ 'code' ] != 0 )
{
return $content_app ;
}
// 其它附件
$data_fields = [ 'home_recommended_images' , 'video' ];
$attachment = ResourcesService :: AttachmentParams ( $params , $data_fields );
if ( $attachment [ 'code' ] != 0 )
{
return $attachment ;
}
2019-02-20 16:18:21 +08:00
// 编辑器内容
2019-04-12 00:44:35 +08:00
$content_web = empty ( $params [ 'content_web' ]) ? '' : ResourcesService :: ContentStaticReplace ( htmlspecialchars_decode ( $params [ 'content_web' ]), 'add' );
2019-11-19 21:46:22 +08:00
$fictitious_goods_value = empty ( $params [ 'fictitious_goods_value' ]) ? '' : ResourcesService :: ContentStaticReplace ( htmlspecialchars_decode ( $params [ 'fictitious_goods_value' ]), 'add' );
2019-02-20 16:18:21 +08:00
2018-12-28 18:58:37 +08:00
// 基础数据
$data = [
'title' => $params [ 'title' ],
2019-02-15 11:13:52 +08:00
'title_color' => empty ( $params [ 'title_color' ]) ? '' : $params [ 'title_color' ],
2019-06-13 10:59:53 +08:00
'simple_desc' => $params [ 'simple_desc' ],
2018-12-28 18:58:37 +08:00
'model' => $params [ 'model' ],
2019-02-15 11:13:52 +08:00
'place_origin' => isset ( $params [ 'place_origin' ]) ? intval ( $params [ 'place_origin' ]) : 0 ,
2018-12-28 18:58:37 +08:00
'inventory_unit' => $params [ 'inventory_unit' ],
'give_integral' => intval ( $params [ 'give_integral' ]),
2019-02-15 11:13:52 +08:00
'buy_min_number' => max ( 1 , isset ( $params [ 'buy_min_number' ]) ? intval ( $params [ 'buy_min_number' ]) : 1 ),
'buy_max_number' => isset ( $params [ 'buy_max_number' ]) ? intval ( $params [ 'buy_max_number' ]) : 0 ,
2018-12-28 18:58:37 +08:00
'is_deduction_inventory' => isset ( $params [ 'is_deduction_inventory' ]) ? intval ( $params [ 'is_deduction_inventory' ]) : 0 ,
'is_shelves' => isset ( $params [ 'is_shelves' ]) ? intval ( $params [ 'is_shelves' ]) : 0 ,
2019-04-12 00:44:35 +08:00
'content_web' => $content_web ,
2018-12-28 18:58:37 +08:00
'images' => isset ( $photo [ 'data' ][ 0 ]) ? $photo [ 'data' ][ 0 ] : '' ,
'photo_count' => count ( $photo [ 'data' ]),
'is_home_recommended' => isset ( $params [ 'is_home_recommended' ]) ? intval ( $params [ 'is_home_recommended' ]) : 0 ,
'home_recommended_images' => $attachment [ 'data' ][ 'home_recommended_images' ],
2019-02-15 11:13:52 +08:00
'brand_id' => isset ( $params [ 'brand_id' ]) ? intval ( $params [ 'brand_id' ]) : 0 ,
2018-12-28 18:58:37 +08:00
'video' => $attachment [ 'data' ][ 'video' ],
2019-06-02 21:45:10 +08:00
'seo_title' => empty ( $params [ 'seo_title' ]) ? '' : $params [ 'seo_title' ],
2019-05-05 11:29:55 +08:00
'seo_keywords' => empty ( $params [ 'seo_keywords' ]) ? '' : $params [ 'seo_keywords' ],
'seo_desc' => empty ( $params [ 'seo_desc' ]) ? '' : $params [ 'seo_desc' ],
2019-08-02 16:37:38 +08:00
'is_exist_many_spec' => empty ( $specifications [ 'data' ][ 'title' ]) ? 0 : 1 ,
2019-09-23 13:56:03 +08:00
'spec_base' => empty ( $specifications_base [ 'data' ]) ? '' : json_encode ( $specifications_base [ 'data' ]),
2019-11-19 21:46:22 +08:00
'fictitious_goods_value' => $fictitious_goods_value ,
2018-12-28 18:58:37 +08:00
];
2019-07-24 00:12:51 +08:00
// 商品保存处理钩子
$hook_name = 'plugins_service_goods_save_handle' ;
2019-12-02 20:58:24 +08:00
$ret = HookReturnHandle ( Hook :: listen ( $hook_name , [
2019-07-24 00:12:51 +08:00
'hook_name' => $hook_name ,
'is_backend' => true ,
'params' => & $params ,
'data' => & $data ,
2019-07-24 18:25:48 +08:00
'spec' => $specifications [ 'data' ],
2019-07-24 00:12:51 +08:00
'goods_id' => isset ( $params [ 'id' ]) ? intval ( $params [ 'id' ]) : 0 ,
2019-12-02 20:58:24 +08:00
]));
2019-07-24 00:12:51 +08:00
if ( isset ( $ret [ 'code' ]) && $ret [ 'code' ] != 0 )
{
return $ret ;
}
2018-12-28 18:58:37 +08:00
// 启动事务
Db :: startTrans ();
// 添加/编辑
if ( empty ( $params [ 'id' ]))
{
$data [ 'add_time' ] = time ();
$goods_id = Db :: name ( 'Goods' ) -> insertGetId ( $data );
} else {
$goods = Db :: name ( 'Goods' ) -> find ( $params [ 'id' ]);
$data [ 'upd_time' ] = time ();
if ( Db :: name ( 'Goods' ) -> where ([ 'id' => intval ( $params [ 'id' ])]) -> update ( $data ))
{
$goods_id = $params [ 'id' ];
}
}
// 是否成功
if ( isset ( $goods_id ) && $goods_id > 0 )
{
// 分类
2019-01-17 00:37:20 +08:00
$ret = self :: GoodsCategoryInsert ( explode ( ',' , $params [ 'category_id' ]), $goods_id );
2018-12-28 18:58:37 +08:00
if ( $ret [ 'code' ] != 0 )
{
// 回滚事务
Db :: rollback ();
return $ret ;
}
// 规格
2019-01-17 00:37:20 +08:00
$ret = self :: GoodsSpecificationsInsert ( $specifications [ 'data' ], $goods_id );
2018-12-28 18:58:37 +08:00
if ( $ret [ 'code' ] != 0 )
{
// 回滚事务
Db :: rollback ();
return $ret ;
} else {
// 更新商品基础信息
2019-01-17 00:37:20 +08:00
$ret = self :: GoodsSaveBaseUpdate ( $params , $goods_id );
2018-12-28 18:58:37 +08:00
if ( $ret [ 'code' ] != 0 )
{
// 回滚事务
Db :: rollback ();
return $ret ;
}
}
// 相册
2019-01-17 00:37:20 +08:00
$ret = self :: GoodsPhotoInsert ( $photo [ 'data' ], $goods_id );
2018-12-28 18:58:37 +08:00
if ( $ret [ 'code' ] != 0 )
{
// 回滚事务
Db :: rollback ();
return $ret ;
}
// 手机详情
2019-01-17 00:37:20 +08:00
$ret = self :: GoodsContentAppInsert ( $content_app [ 'data' ], $goods_id );
2018-12-28 18:58:37 +08:00
if ( $ret [ 'code' ] != 0 )
{
// 回滚事务
Db :: rollback ();
return $ret ;
}
// 提交事务
Db :: commit ();
return DataReturn ( '操作成功' , 0 );
}
// 回滚事务
Db :: rollback ();
return DataReturn ( '操作失败' , - 100 );
}
/**
* 商品保存基础信息更新
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 16 T01 : 56 : 42 + 0800
* @ param [ array ] $params [ 输入参数 ]
* @ param [ int ] $goods_id [ 商品id ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsSaveBaseUpdate ( $params , $goods_id )
2018-12-28 18:58:37 +08:00
{
$data = Db :: name ( 'GoodsSpecBase' ) -> field ( 'min(price) AS min_price, max(price) AS max_price, sum(inventory) AS inventory, min(original_price) AS min_original_price, max(original_price) AS max_original_price' ) -> where ([ 'goods_id' => $goods_id ]) -> find ();
if ( empty ( $data ))
{
return DataReturn ( '没找到商品基础信息' , - 1 );
}
// 销售价格 - 展示价格
$data [ 'price' ] = ( ! empty ( $data [ 'max_price' ]) && $data [ 'min_price' ] != $data [ 'max_price' ]) ? $data [ 'min_price' ] . '-' . $data [ 'max_price' ] : $data [ 'min_price' ];
// 原价价格 - 展示价格
$data [ 'original_price' ] = ( ! empty ( $data [ 'max_original_price' ]) && $data [ 'min_original_price' ] != $data [ 'max_original_price' ]) ? $data [ 'min_original_price' ] . '-' . $data [ 'max_original_price' ] : $data [ 'min_original_price' ];
// 更新商品表
$data [ 'upd_time' ] = time ();
if ( Db :: name ( 'Goods' ) -> where ([ 'id' => $goods_id ]) -> update ( $data ))
{
return DataReturn ( '操作成功' , 0 );
}
return DataReturn ( '操作失败' , 0 );
}
/**
2019-09-23 13:56:03 +08:00
* 获取规格值参数
2018-12-28 18:58:37 +08:00
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 09
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
private static function GetFormGoodsSpecificationsParams ( $params = [])
2018-12-28 18:58:37 +08:00
{
$data = [];
$title = [];
$images = [];
2019-01-12 01:41:02 +08:00
// 基础字段数据字段长度
2019-07-22 00:46:16 +08:00
$base_count = 7 ;
2019-01-12 01:41:02 +08:00
2018-12-28 18:58:37 +08:00
// 规格值
foreach ( $params as $k => $v )
{
if ( substr ( $k , 0 , 15 ) == 'specifications_' )
{
$keys = explode ( '_' , $k );
if ( count ( $keys ) > 1 )
{
if ( $keys [ 1 ] != 'name' )
{
foreach ( $v as $ks => $vs )
{
2019-07-22 00:46:16 +08:00
if ( $keys [ 1 ] == 'extends' )
{
$data [ $ks ][] = empty ( $vs ) ? null : htmlspecialchars_decode ( $vs );
} else {
$data [ $ks ][] = $vs ;
}
2018-12-28 18:58:37 +08:00
}
}
}
}
}
2019-01-12 01:41:02 +08:00
// 规格处理
2018-12-28 18:58:37 +08:00
if ( ! empty ( $data [ 0 ]))
{
2019-01-12 01:41:02 +08:00
$count = count ( $data [ 0 ]) - $base_count ;
2018-12-28 18:58:37 +08:00
if ( $count > 0 )
{
2019-01-12 01:41:02 +08:00
// 列之间是否存在相同的值
$column_value = [];
foreach ( $data as $data_value )
{
foreach ( $data_value as $temp_key => $temp_value )
{
if ( $temp_key < $count )
{
$column_value [ $temp_key ][] = $temp_value ;
}
}
}
if ( ! empty ( $column_value ) && count ( $column_value ) > 1 )
{
$temp_column = [];
foreach ( $column_value as $column_key => $column_val )
{
foreach ( $column_value as $column_keys => $column_vals )
{
if ( $column_key != $column_keys )
{
$temp = array_intersect ( $column_val , $column_vals );
$temp_column = array_merge ( $temp_column , $temp );
}
}
}
if ( ! empty ( $temp_column ))
{
2019-01-14 01:08:02 +08:00
return DataReturn ( '规格值列之间不能重复[' . implode ( ',' , array_unique ( $temp_column )) . ']' , - 1 );
2019-01-12 01:41:02 +08:00
}
}
2019-08-02 16:37:38 +08:00
// 规格值是否重复
if ( ! empty ( $column_value [ 0 ]))
{
$temp_row_data = [];
$temp_row_count = count ( $column_value );
foreach ( $column_value [ 0 ] as $row_key => $row_value )
{
for ( $i = 0 ; $i < $temp_row_count ; $i ++ )
{
if ( isset ( $column_value [ $i ][ $row_key ]))
{
if ( isset ( $temp_row_data [ $row_key ]))
{
$temp_row_data [ $row_key ] .= $column_value [ $i ][ $row_key ];
} else {
$temp_row_data [ $row_key ] = $column_value [ $i ][ $row_key ];
}
}
}
}
if ( ! empty ( $temp_row_data ))
{
$unique_all = array_unique ( $temp_row_data );
$repeat_rows_all = array_diff_assoc ( $temp_row_data , $unique_all );
if ( ! empty ( $repeat_rows_all ))
{
return DataReturn ( '规格值不能重复[' . implode ( ',' , array_unique ( $repeat_rows_all )) . ']' , - 1 );
}
}
}
2019-01-12 01:41:02 +08:00
// 规格名称
2019-01-14 01:08:02 +08:00
$names_value = [];
2018-12-28 18:58:37 +08:00
$names = array_slice ( $data [ 0 ], 0 , $count );
foreach ( $names as $v )
{
foreach ( $params as $ks => $vs )
{
if ( substr ( $ks , 0 , 21 ) == 'specifications_value_' )
{
if ( in_array ( $v , $vs ))
{
$key = substr ( $ks , 21 );
if ( ! empty ( $params [ 'specifications_name_' . $key ]))
{
$title [ $params [ 'specifications_name_' . $key ]] = [
'name' => $params [ 'specifications_name_' . $key ],
'value' => array_unique ( $vs ),
];
2019-01-14 01:08:02 +08:00
$names_value [] = $params [ 'specifications_name_' . $key ];
2018-12-28 18:58:37 +08:00
}
}
}
}
}
2019-01-14 01:08:02 +08:00
2019-01-14 01:13:39 +08:00
// 规格名称列之间是否存在重复
2019-01-14 01:08:02 +08:00
$unique_all = array_unique ( $names_value );
$repeat_names_all = array_diff_assoc ( $names_value , $unique_all );
if ( ! empty ( $repeat_names_all ))
{
2019-08-02 16:37:38 +08:00
return DataReturn ( '规格名称列之间不能重复[' . implode ( ',' , array_unique ( $repeat_names_all )) . ']' , - 1 );
2019-01-14 01:08:02 +08:00
}
2018-12-28 18:58:37 +08:00
} else {
if ( empty ( $data [ 0 ][ 0 ]) || $data [ 0 ][ 0 ] <= 0 )
{
return DataReturn ( '请填写有效的规格销售价格' , - 1 );
}
2019-06-19 00:44:11 +08:00
if ( ! isset ( $data [ 0 ][ 1 ]) || $data [ 0 ][ 1 ] < 0 )
2018-12-28 18:58:37 +08:00
{
return DataReturn ( '请填写规格库存' , - 1 );
}
}
} else {
return DataReturn ( '请填写规格' , - 1 );
}
// 规格图片
if ( ! empty ( $params [ 'spec_images_name' ]) && ! empty ( $params [ 'spec_images' ]))
{
foreach ( $params [ 'spec_images_name' ] as $k => $v )
{
if ( ! empty ( $params [ 'spec_images' ][ $k ]))
{
$images [ $v ] = $params [ 'spec_images' ][ $k ];
}
}
}
2019-08-02 16:38:34 +08:00
2018-12-28 18:58:37 +08:00
return DataReturn ( 'success' , 0 , [ 'data' => $data , 'title' => $title , 'images' => $images ]);
}
2019-09-23 13:56:03 +08:00
/**
* 获取规格基础参数
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2019 - 09 - 23
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
private static function GetFormGoodsSpecificationsBaseParams ( $params = [])
{
$result = [];
foreach ( $params as $k => $v )
{
if ( substr ( $k , 0 , 16 ) == 'spec_base_title_' )
{
$key = substr ( $k , 16 );
$result [] = [
'title' => $v ,
'value' => isset ( $params [ 'spec_base_value_' . $key ]) ? $params [ 'spec_base_value_' . $key ] : [],
];
}
}
return DataReturn ( 'success' , 0 , $result );
}
2018-12-28 18:58:37 +08:00
/**
* 获取商品相册
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
* @ return [ array ] [ 一维数组但图片地址 ]
*/
2019-01-17 00:37:20 +08:00
private static function GetFormGoodsPhotoParams ( $params = [])
2018-12-28 18:58:37 +08:00
{
if ( empty ( $params [ 'photo' ]))
{
return DataReturn ( '请上传相册' , - 1 );
}
$result = [];
if ( ! empty ( $params [ 'photo' ]) && is_array ( $params [ 'photo' ]))
{
foreach ( $params [ 'photo' ] as $v )
{
$result [] = ResourcesService :: AttachmentPathHandle ( $v );
}
}
return DataReturn ( 'success' , 0 , $result );
}
/**
* 获取app内容
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 09
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
private static function GetFormGoodsContentAppParams ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 开始处理
$result = [];
$name = 'content_app_' ;
foreach ( $params AS $k => $v )
{
if ( substr ( $k , 0 , 12 ) == $name )
{
$key = explode ( '_' , str_replace ( $name , '' , $k ));
if ( count ( $key ) == 2 )
{
$result [ $key [ 1 ]][ $key [ 0 ]] = $v ;
if ( $key [ 0 ] == 'images' )
{
$result [ $key [ 1 ]][ $key [ 0 ]] = ResourcesService :: AttachmentPathHandle ( $v );
}
}
}
}
return DataReturn ( 'success' , 0 , $result );
}
/**
* 商品分类添加
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $data [ 数据 ]
* @ param [ int ] $goods_id [ 商品id ]
* @ return [ array ] [ boolean | msg ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsCategoryInsert ( $data , $goods_id )
2018-12-28 18:58:37 +08:00
{
Db :: name ( 'GoodsCategoryJoin' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
if ( ! empty ( $data ))
{
foreach ( $data as $category_id )
{
$temp_category = [
'goods_id' => $goods_id ,
'category_id' => $category_id ,
'add_time' => time (),
];
if ( Db :: name ( 'GoodsCategoryJoin' ) -> insertGetId ( $temp_category ) <= 0 )
{
return DataReturn ( '商品分类添加失败' , - 1 );
}
}
}
return DataReturn ( '添加成功' , 0 );
}
/**
* 商品手机详情添加
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $data [ 数据 ]
* @ param [ int ] $goods_id [ 商品id ]
* @ return [ array ] [ boolean | msg ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsContentAppInsert ( $data , $goods_id )
2018-12-28 18:58:37 +08:00
{
Db :: name ( 'GoodsContentApp' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
if ( ! empty ( $data ))
{
foreach ( array_values ( $data ) as $k => $v )
{
$temp_content = [
'goods_id' => $goods_id ,
'images' => empty ( $v [ 'images' ]) ? '' : $v [ 'images' ],
'content' => $v [ 'text' ],
'sort' => $k ,
'add_time' => time (),
];
if ( Db :: name ( 'GoodsContentApp' ) -> insertGetId ( $temp_content ) <= 0 )
{
return DataReturn ( '手机详情添加失败' , - 1 );
}
}
}
return DataReturn ( '添加成功' , 0 );
}
/**
* 商品相册添加
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $data [ 数据 ]
* @ param [ int ] $goods_id [ 商品id ]
* @ return [ array ] [ boolean | msg ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsPhotoInsert ( $data , $goods_id )
2018-12-28 18:58:37 +08:00
{
Db :: name ( 'GoodsPhoto' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
if ( ! empty ( $data ))
{
foreach ( $data as $k => $v )
{
$temp_photo = [
'goods_id' => $goods_id ,
'images' => $v ,
'is_show' => 1 ,
'sort' => $k ,
'add_time' => time (),
];
if ( Db :: name ( 'GoodsPhoto' ) -> insertGetId ( $temp_photo ) <= 0 )
{
return DataReturn ( '相册添加失败' , - 1 );
}
}
}
return DataReturn ( '添加成功' , 0 );
}
/**
* 商品规格添加
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 07 - 10
* @ desc description
* @ param [ array ] $data [ 数据 ]
* @ param [ int ] $goods_id [ 商品id ]
* @ return [ array ] [ boolean | msg ]
*/
2019-01-17 00:37:20 +08:00
private static function GoodsSpecificationsInsert ( $data , $goods_id )
2018-12-28 18:58:37 +08:00
{
// 删除原来的数据
Db :: name ( 'GoodsSpecType' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
Db :: name ( 'GoodsSpecValue' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
Db :: name ( 'GoodsSpecBase' ) -> where ([ 'goods_id' => $goods_id ]) -> delete ();
// 类型
if ( ! empty ( $data [ 'title' ]))
{
foreach ( $data [ 'title' ] as & $v )
{
$spec = [];
foreach ( $v [ 'value' ] as $vs )
{
$spec [] = [
'name' => $vs ,
'images' => isset ( $data [ 'images' ][ $vs ]) ? ResourcesService :: AttachmentPathHandle ( $data [ 'images' ][ $vs ]) : '' ,
];
}
$v [ 'goods_id' ] = $goods_id ;
$v [ 'value' ] = json_encode ( $spec );
$v [ 'add_time' ] = time ();
}
if ( Db :: name ( 'GoodsSpecType' ) -> insertAll ( $data [ 'title' ]) < count ( $data [ 'title' ]))
{
return DataReturn ( '规格类型添加失败' , - 1 );
}
}
// 基础/规格值
if ( ! empty ( $data [ 'data' ]))
{
// 基础字段
$count = count ( $data [ 'data' ][ 0 ]);
2019-07-22 00:46:16 +08:00
$temp_key = [ 'price' , 'inventory' , 'weight' , 'coding' , 'barcode' , 'original_price' , 'extends' ];
2018-12-28 18:58:37 +08:00
$key_count = count ( $temp_key );
// 等于key总数则只有一列基础规格
if ( $count == $key_count )
{
$temp_data = [
'goods_id' => $goods_id ,
'add_time' => time (),
];
for ( $i = 0 ; $i < $count ; $i ++ )
{
$temp_data [ $temp_key [ $i ]] = $data [ 'data' ][ 0 ][ $i ];
}
// 规格基础添加
if ( Db :: name ( 'GoodsSpecBase' ) -> insertGetId ( $temp_data ) <= 0 )
{
return DataReturn ( '规格基础添加失败' , - 1 );
}
// 多规格操作
} else {
$base_start = $count - $key_count ;
$value = [];
$base = [];
foreach ( $data [ 'data' ] as $v )
{
$temp_value = [];
$temp_data = [
'goods_id' => $goods_id ,
'add_time' => time (),
];
for ( $i = 0 ; $i < $count ; $i ++ )
{
if ( $i < $base_start )
{
$temp_value [] = [
'goods_id' => $goods_id ,
'value' => $v [ $i ],
'add_time' => time ()
];
} else {
$temp_data [ $temp_key [ $i - $base_start ]] = $v [ $i ];
}
}
// 规格基础添加
$base_id = Db :: name ( 'GoodsSpecBase' ) -> insertGetId ( $temp_data );
if ( empty ( $base_id ))
{
return DataReturn ( '规格基础添加失败' , - 1 );
}
// 规格值添加
foreach ( $temp_value as & $value )
{
$value [ 'goods_spec_base_id' ] = $base_id ;
}
if ( Db :: name ( 'GoodsSpecValue' ) -> insertAll ( $temp_value ) < count ( $temp_value ))
{
return DataReturn ( '规格值添加失败' , - 1 );
}
}
}
}
return DataReturn ( '添加成功' , 0 );
}
/**
* 商品删除
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 07 T00 : 24 : 14 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsDelete ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 参数是否有误
if ( empty ( $params [ 'id' ]))
{
return DataReturn ( '商品id有误' , - 1 );
}
// 开启事务
Db :: startTrans ();
// 删除商品
if ( Db :: name ( 'Goods' ) -> delete ( intval ( $params [ 'id' ])))
{
// 商品规格
if ( Db :: name ( 'GoodsSpecType' ) -> where ([ 'goods_id' => intval ( $params [ 'id' ])]) -> delete () === false )
{
Db :: rollback ();
return DataReturn ( '规格类型删除失败' , - 100 );
}
if ( Db :: name ( 'GoodsSpecValue' ) -> where ([ 'goods_id' => intval ( $params [ 'id' ])]) -> delete () === false )
{
Db :: rollback ();
return DataReturn ( '规格值删除失败' , - 100 );
}
if ( Db :: name ( 'GoodsSpecBase' ) -> where ([ 'goods_id' => intval ( $params [ 'id' ])]) -> delete () === false )
{
Db :: rollback ();
return DataReturn ( '规格基础删除失败' , - 100 );
}
// 相册
if ( Db :: name ( 'GoodsPhoto' ) -> where ([ 'goods_id' => intval ( $params [ 'id' ])]) -> delete () === false )
{
Db :: rollback ();
return DataReturn ( '相册删除失败' , - 100 );
}
// app内容
if ( Db :: name ( 'GoodsContentApp' ) -> where ([ 'goods_id' => intval ( $params [ 'id' ])]) -> delete () === false )
{
Db :: rollback ();
return DataReturn ( '相册删除失败' , - 100 );
}
// 提交事务
Db :: commit ();
return DataReturn ( '删除成功' , 0 );
}
Db :: rollback ();
return DataReturn ( '删除失败' , - 100 );
}
/**
* 商品状态更新
* @ author Devil
* @ blog http :// gong . gg /
* @ version 0.0 . 1
* @ datetime 2016 - 12 - 06 T21 : 31 : 53 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsStatusUpdate ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '操作id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'field' ,
'error_msg' => '未指定操作字段' ,
],
[
'checked_type' => 'in' ,
'key_name' => 'state' ,
'checked_data' => [ 0 , 1 ],
'error_msg' => '状态有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 数据更新
if ( Db :: name ( 'Goods' ) -> where ([ 'id' => intval ( $params [ 'id' ])]) -> update ([ $params [ 'field' ] => intval ( $params [ 'state' ]), 'upd_time' => time ()]))
{
return DataReturn ( '操作成功' );
}
return DataReturn ( '操作失败' , - 100 );
}
/**
* 获取商品编辑规格
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 12 - 14
* @ desc description
* @ param [ int ] $goods_id [ 商品id ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsEditSpecifications ( $goods_id )
2018-12-28 18:58:37 +08:00
{
$where = [ 'goods_id' => $goods_id ];
// 获取规格类型
$type = Db :: name ( 'GoodsSpecType' ) -> where ( $where ) -> order ( 'id asc' ) -> field ( 'id,name,value' ) -> select ();
$value = [];
if ( ! empty ( $type ))
{
// 数据处理
foreach ( $type as & $temp_type )
{
$temp_type_value = json_decode ( $temp_type [ 'value' ], true );
foreach ( $temp_type_value as & $vs )
{
$vs [ 'images_old' ] = $vs [ 'images' ];
2019-01-14 00:03:29 +08:00
$vs [ 'images' ] = ResourcesService :: AttachmentPathViewHandle ( $vs [ 'images' ]);
2018-12-28 18:58:37 +08:00
}
$temp_type [ 'value' ] = $temp_type_value ;
}
// 获取规格值
$temp_value = Db :: name ( 'GoodsSpecValue' ) -> where ( $where ) -> field ( 'goods_spec_base_id,value' ) -> order ( 'id asc' ) -> select ();
if ( ! empty ( $temp_value ))
{
foreach ( $temp_value as $value_v )
{
$key = '' ;
foreach ( $type as $type_v )
{
foreach ( $type_v [ 'value' ] as $type_vs )
{
if ( $type_vs [ 'name' ] == $value_v [ 'value' ])
{
$key = $type_v [ 'id' ];
break ;
}
}
}
$value [ $value_v [ 'goods_spec_base_id' ]][] = [
'data_type' => 'spec' ,
'data' => [
'key' => $key ,
'value' => $value_v [ 'value' ],
],
];
}
}
if ( ! empty ( $value ))
{
foreach ( $value as $k =>& $v )
{
$base = Db :: name ( 'GoodsSpecBase' ) -> find ( $k );
2019-02-25 11:15:31 +08:00
$base [ 'weight' ] = PriceBeautify ( $base [ 'weight' ]);
2018-12-28 18:58:37 +08:00
$v [] = [
'data_type' => 'base' ,
'data' => $base ,
];
}
}
} else {
$base = Db :: name ( 'GoodsSpecBase' ) -> where ( $where ) -> find ();
2019-02-25 11:15:31 +08:00
$base [ 'weight' ] = PriceBeautify ( $base [ 'weight' ]);
2018-12-28 18:58:37 +08:00
$value [][] = [
'data_type' => 'base' ,
'data' => $base ,
];
}
return [
'type' => $type ,
'value' => array_values ( $value ),
];
}
/**
* 商品规格信息
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 12 - 14
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsSpecDetail ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '商品id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'spec' ,
'is_checked' => 1 ,
'error_msg' => '请选择规格' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 条件
$goods_id = intval ( $params [ 'id' ]);
$where = [
'goods_id' => intval ( $params [ 'id' ]),
];
// 有规格值
if ( ! empty ( $params [ 'spec' ]))
{
$value = [];
// 规格不为数组则为json字符串
if ( ! is_array ( $params [ 'spec' ]))
{
2019-03-25 09:52:38 +08:00
$params [ 'spec' ] = json_decode ( htmlspecialchars_decode ( $params [ 'spec' ]), true );
2018-12-28 18:58:37 +08:00
}
foreach ( $params [ 'spec' ] as $v )
{
$value [] = $v [ 'value' ];
}
$where [ 'value' ] = $value ;
// 获取规格值基础值id
$ids = Db :: name ( 'GoodsSpecValue' ) -> where ( $where ) -> column ( 'goods_spec_base_id' );
if ( ! empty ( $ids ))
{
// 根据基础值id获取规格值列表
$temp_data = Db :: name ( 'GoodsSpecValue' ) -> where ([ 'goods_spec_base_id' => $ids ]) -> field ( 'goods_spec_base_id,value' ) -> select ();
if ( ! empty ( $temp_data ))
{
// 根据基础值id分组
$data = [];
foreach ( $temp_data as $v )
{
$data [ $v [ 'goods_spec_base_id' ]][] = $v ;
}
// 从条件中匹配对应的规格值得到最终的基础值id
$base_id = 0 ;
$spec_str = implode ( '' , array_column ( $params [ 'spec' ], 'value' ));
foreach ( $data as $value_v )
{
$temp_str = implode ( '' , array_column ( $value_v , 'value' ));
if ( $temp_str == $spec_str )
{
$base_id = $value_v [ 0 ][ 'goods_spec_base_id' ];
break ;
}
}
// 获取基础值数据
if ( ! empty ( $base_id ))
{
2019-01-21 15:19:03 +08:00
$base = Db :: name ( 'GoodsSpecBase' ) -> find ( $base_id );
2018-12-28 18:58:37 +08:00
}
}
}
} else {
2019-01-21 15:19:03 +08:00
$base = Db :: name ( 'GoodsSpecBase' ) -> where ( $where ) -> find ();
2019-02-26 23:07:22 +08:00
}
// 是否有规格
if ( ! empty ( $base ))
{
// 单位 .00 处理
2019-02-25 11:15:31 +08:00
$base [ 'weight' ] = PriceBeautify ( $base [ 'weight' ]);
2019-02-26 23:07:22 +08:00
2019-07-25 17:11:32 +08:00
// 处理好的数据
// 扩展元素标记与html内容数据
// extends_element下包含多个元素 ['element'=>'', 'content'=>'']
$data = [
'spec_base' => $base ,
'extends_element' => [],
];
// 商品获取规格钩子
2019-02-26 23:07:22 +08:00
$hook_name = 'plugins_service_goods_spec_base' ;
2019-12-02 20:58:24 +08:00
$ret = HookReturnHandle ( Hook :: listen ( $hook_name , [
2019-02-26 23:07:22 +08:00
'hook_name' => $hook_name ,
'is_backend' => true ,
2019-07-25 17:11:32 +08:00
'params' => $params ,
'data' => & $data ,
2019-02-26 23:07:22 +08:00
'goods_id' => $goods_id
2019-12-02 20:58:24 +08:00
]));
2019-02-26 23:07:22 +08:00
if ( isset ( $ret [ 'code' ]) && $ret [ 'code' ] != 0 )
2018-12-28 18:58:37 +08:00
{
2019-02-26 23:07:22 +08:00
return $ret ;
2018-12-28 18:58:37 +08:00
}
2019-02-26 23:07:22 +08:00
// 返回成功
2019-07-25 17:11:32 +08:00
return DataReturn ( '操作成功' , 0 , $data );
2018-12-28 18:58:37 +08:00
}
2019-02-26 23:07:22 +08:00
2018-12-28 18:58:37 +08:00
return DataReturn ( '没有相关规格' , - 100 );
}
/**
* 商品规格类型
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 12 - 14
* @ desc description
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsSpecType ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '商品id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'spec' ,
'error_msg' => '请选择规格' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 条件
$goods_id = intval ( $params [ 'id' ]);
$where = [
'goods_id' => intval ( $params [ 'id' ]),
];
// 规格不为数组则为json字符串
2019-07-25 17:11:32 +08:00
$value = [];
2018-12-28 18:58:37 +08:00
if ( ! is_array ( $params [ 'spec' ]))
{
2019-03-25 09:52:38 +08:00
$params [ 'spec' ] = json_decode ( htmlspecialchars_decode ( $params [ 'spec' ]), true );
2018-12-28 18:58:37 +08:00
}
foreach ( $params [ 'spec' ] as $v )
{
$value [] = $v [ 'value' ];
}
$where [ 'value' ] = $value ;
// 获取规格值基础值id
$ids = Db :: name ( 'GoodsSpecValue' ) -> where ( $where ) -> column ( 'goods_spec_base_id' );
if ( ! empty ( $ids ))
{
// 根据基础值id获取规格值列表
$temp_data = Db :: name ( 'GoodsSpecValue' ) -> where ([ 'goods_spec_base_id' => $ids ]) -> field ( 'goods_spec_base_id,value' ) -> select ();
if ( ! empty ( $temp_data ))
{
// 根据基础值id分组
2019-07-25 17:11:32 +08:00
$group = [];
2018-12-28 18:58:37 +08:00
foreach ( $temp_data as $v )
{
2019-07-25 17:11:32 +08:00
$group [ $v [ 'goods_spec_base_id' ]][] = $v ;
2018-12-28 18:58:37 +08:00
}
// 获取当前操作元素索引
$last = end ( $params [ 'spec' ]);
$index = count ( $params [ 'spec' ]) - 1 ;
$spec_str = implode ( '' , array_column ( $params [ 'spec' ], 'value' ));
2019-07-25 17:11:32 +08:00
$spec_type = [];
foreach ( $group as $v )
2018-12-28 18:58:37 +08:00
{
$temp_str = implode ( '' , array_column ( $v , 'value' ));
if ( isset ( $v [ $index + 1 ]) && stripos ( $temp_str , $spec_str ) !== false )
{
// 判断是否还有库存
$inventory = Db :: name ( 'GoodsSpecBase' ) -> where ([ 'id' => $v [ $index + 1 ][ 'goods_spec_base_id' ]]) -> value ( 'inventory' );
if ( $inventory > 0 )
{
2019-07-25 17:11:32 +08:00
$spec_type [ $v [ $index + 1 ][ 'value' ]] = $v [ $index + 1 ][ 'value' ];
2018-12-28 18:58:37 +08:00
}
}
}
2019-07-25 17:11:32 +08:00
// 处理好的数据
// 扩展元素标记与html内容数据
// extends_element下包含多个元素 ['element'=>'', 'content'=>'']
$data = [
'spec_type' => array_values ( $spec_type ),
'extends_element' => [],
];
// 商品获取规格类型钩子
$hook_name = 'plugins_service_goods_spec_type' ;
2019-12-02 20:58:24 +08:00
$ret = HookReturnHandle ( Hook :: listen ( $hook_name , [
2019-07-25 17:11:32 +08:00
'hook_name' => $hook_name ,
'is_backend' => true ,
'params' => $params ,
'data' => & $data ,
'goods_id' => $goods_id
2019-12-02 20:58:24 +08:00
]));
2019-07-25 17:11:32 +08:00
if ( isset ( $ret [ 'code' ]) && $ret [ 'code' ] != 0 )
{
return $ret ;
}
return DataReturn ( '操作成功' , 0 , $data );
2018-12-28 18:58:37 +08:00
}
}
return DataReturn ( '没有相关规格类型' , - 100 );
}
/**
* 获取商品分类节点数据
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 16 T23 : 54 : 46 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsCategoryNodeSon ( $params = [])
2018-12-28 18:58:37 +08:00
{
// id
$id = isset ( $params [ 'id' ]) ? intval ( $params [ 'id' ]) : 0 ;
// 获取数据
2019-06-02 21:45:10 +08:00
$field = 'id,pid,icon,name,sort,is_enable,bg_color,big_images,vice_name,describe,is_home_recommended,seo_title,seo_keywords,seo_desc' ;
2018-12-28 18:58:37 +08:00
$data = Db :: name ( 'GoodsCategory' ) -> field ( $field ) -> where ([ 'pid' => $id ]) -> order ( 'sort asc' ) -> select ();
if ( ! empty ( $data ))
{
foreach ( $data as & $v )
{
$v [ 'is_son' ] = ( Db :: name ( 'GoodsCategory' ) -> where ([ 'pid' => $v [ 'id' ]]) -> count () > 0 ) ? 'ok' : 'no' ;
$v [ 'ajax_url' ] = MyUrl ( 'admin/goodscategory/getnodeson' , array ( 'id' => $v [ 'id' ]));
$v [ 'delete_url' ] = MyUrl ( 'admin/goodscategory/delete' );
2019-01-14 00:03:29 +08:00
$v [ 'icon_url' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'icon' ]);
$v [ 'big_images_url' ] = ResourcesService :: AttachmentPathViewHandle ( $v [ 'big_images' ]);
2018-12-28 18:58:37 +08:00
$v [ 'json' ] = json_encode ( $v );
}
return DataReturn ( '操作成功' , 0 , $data );
}
return DataReturn ( '没有相关数据' , - 100 );
}
/**
* 商品分类保存
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 17 T01 : 04 : 03 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsCategorySave ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'length' ,
'key_name' => 'name' ,
'checked_data' => '2,16' ,
'error_msg' => '名称格式 2~16 个字符' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'vice_name' ,
'checked_data' => '60' ,
'is_checked' => 1 ,
'error_msg' => '副名称格式 最多30个字符' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'describe' ,
'checked_data' => '200' ,
'is_checked' => 1 ,
'error_msg' => '描述格式 最多200个字符' ,
],
2019-06-02 21:45:10 +08:00
[
'checked_type' => 'length' ,
'key_name' => 'seo_title' ,
'checked_data' => '100' ,
'is_checked' => 1 ,
'error_msg' => 'SEO标题格式 最多100个字符' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'seo_keywords' ,
'checked_data' => '130' ,
'is_checked' => 1 ,
'error_msg' => 'SEO关键字格式 最多130个字符' ,
],
[
'checked_type' => 'length' ,
'key_name' => 'seo_desc' ,
'checked_data' => '230' ,
'is_checked' => 1 ,
'error_msg' => 'SEO描述格式 最多230个字符' ,
],
2018-12-28 18:58:37 +08:00
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 其它附件
$data_fields = [ 'icon' , 'big_images' ];
$attachment = ResourcesService :: AttachmentParams ( $params , $data_fields );
if ( $attachment [ 'code' ] != 0 )
{
return $attachment ;
}
// 数据
$data = [
'name' => $params [ 'name' ],
'pid' => isset ( $params [ 'pid' ]) ? intval ( $params [ 'pid' ]) : 0 ,
'vice_name' => isset ( $params [ 'vice_name' ]) ? $params [ 'vice_name' ] : '' ,
'describe' => isset ( $params [ 'describe' ]) ? $params [ 'describe' ] : '' ,
'bg_color' => isset ( $params [ 'bg_color' ]) ? $params [ 'bg_color' ] : '' ,
'is_home_recommended' => isset ( $params [ 'is_home_recommended' ]) ? intval ( $params [ 'is_home_recommended' ]) : 0 ,
'sort' => isset ( $params [ 'sort' ]) ? intval ( $params [ 'sort' ]) : 0 ,
'is_enable' => isset ( $params [ 'is_enable' ]) ? intval ( $params [ 'is_enable' ]) : 0 ,
'icon' => $attachment [ 'data' ][ 'icon' ],
'big_images' => $attachment [ 'data' ][ 'big_images' ],
2019-06-02 21:45:10 +08:00
'seo_title' => empty ( $params [ 'seo_title' ]) ? '' : $params [ 'seo_title' ],
'seo_keywords' => empty ( $params [ 'seo_keywords' ]) ? '' : $params [ 'seo_keywords' ],
'seo_desc' => empty ( $params [ 'seo_desc' ]) ? '' : $params [ 'seo_desc' ],
2018-12-28 18:58:37 +08:00
];
2019-03-29 00:22:57 +08:00
// 父级id宇当前id不能相同
if ( ! empty ( $params [ 'id' ]) && $params [ 'id' ] == $data [ 'pid' ])
{
return DataReturn ( '父级不能与当前相同' , - 10 );
}
2019-04-16 15:17:30 +08:00
// 添加/编辑
$msg = '操作失败' ;
$code = - 100 ;
2018-12-28 18:58:37 +08:00
if ( empty ( $params [ 'id' ]))
{
$data [ 'add_time' ] = time ();
if ( Db :: name ( 'GoodsCategory' ) -> insertGetId ( $data ) > 0 )
{
2019-04-16 15:17:30 +08:00
$code = 0 ;
$msg = '添加成功' ;
} else {
$msg = '添加失败' ;
2018-12-28 18:58:37 +08:00
}
} else {
$data [ 'upd_time' ] = time ();
if ( Db :: name ( 'GoodsCategory' ) -> where ([ 'id' => intval ( $params [ 'id' ])]) -> update ( $data ))
{
2019-04-16 15:17:30 +08:00
$code = 0 ;
$msg = '编辑成功' ;
} else {
$msg = '编辑失败' ;
2018-12-28 18:58:37 +08:00
}
}
2019-04-16 15:17:30 +08:00
// 状态
if ( $code == 0 )
{
// 删除大分类缓存
cache ( config ( 'shopxo.cache_goods_category_key' ), null );
}
return DataReturn ( $msg , $code );
2018-12-28 18:58:37 +08:00
}
/**
* 商品分类删除
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2018 - 12 - 17 T02 : 40 : 29 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
2019-01-17 00:37:20 +08:00
public static function GoodsCategoryDelete ( $params = [])
2018-12-28 18:58:37 +08:00
{
// 请求参数
$p = [
[
'checked_type' => 'empty' ,
'key_name' => 'id' ,
'error_msg' => '删除数据id有误' ,
],
[
'checked_type' => 'empty' ,
'key_name' => 'admin' ,
'error_msg' => '用户信息有误' ,
],
];
$ret = ParamsChecked ( $params , $p );
if ( $ret !== true )
{
return DataReturn ( $ret , - 1 );
}
// 获取分类下所有分类id
2019-01-17 00:37:20 +08:00
$ids = self :: GoodsCategoryItemsIds ([ $params [ 'id' ]]);
2018-12-28 18:58:37 +08:00
$ids [] = $params [ 'id' ];
// 开始删除
if ( Db :: name ( 'GoodsCategory' ) -> where ([ 'id' => $ids ]) -> delete ())
{
2019-03-30 01:40:34 +08:00
// 删除大分类缓存
2019-03-30 01:51:19 +08:00
cache ( config ( 'shopxo.cache_goods_category_key' ), null );
2019-03-30 01:40:34 +08:00
2018-12-28 18:58:37 +08:00
return DataReturn ( '删除成功' , 0 );
}
return DataReturn ( '删除失败' , - 100 );
}
2019-07-17 16:11:53 +08:00
/**
* 根据商品id获取分类名称
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ date 2018 - 08 - 29
* @ desc description
* @ param [ int ] $goods_id [ 商品id ]
*/
public static function GoodsCategoryNames ( $goods_id )
{
$data = Db :: name ( 'GoodsCategory' ) -> alias ( 'gc' ) -> join ([ '__GOODS_CATEGORY_JOIN__' => 'gci' ], 'gc.id=gci.category_id' ) -> where ([ 'gci.goods_id' => $goods_id ]) -> column ( 'gc.name' );
return DataReturn ( '获取成功' , 0 , $data );
}
2019-07-21 23:51:47 +08:00
/**
* 商品规格扩展数据
* @ author Devil
* @ blog http :// gong . gg /
* @ version 1.0 . 0
* @ datetime 2019 - 07 - 21 T16 : 08 : 34 + 0800
* @ param [ array ] $params [ 输入参数 ]
*/
public static function GoodsSpecificationsExtends ( $params = [])
{
// 数据
$data = [];
// 规格扩展数据钩子
$hook_name = 'plugins_service_goods_spec_extends_handle' ;
Hook :: listen ( $hook_name , [
'hook_name' => $hook_name ,
'is_backend' => true ,
2020-01-14 15:27:38 +08:00
'params' => $params ,
2019-07-21 23:51:47 +08:00
'data' => & $data ,
]);
return DataReturn ( '获取成功' , 0 , $data );
}
2018-12-28 18:58:37 +08:00
}
?>