|
@@ -3,6 +3,7 @@
|
|
|
namespace app\admin\service\goods;
|
|
|
|
|
|
use app\model\Goods;
|
|
|
+use app\model\GoodsComponent;
|
|
|
use app\model\GoodsDetail;
|
|
|
use app\model\GoodsLabel;
|
|
|
use app\model\GoodsRunning;
|
|
@@ -31,9 +32,9 @@ class GoodsService
|
|
|
$query->select('join_running_goods_id', 'goods_running_storage');
|
|
|
},
|
|
|
'supplier' => function ($query) {
|
|
|
- $query->select('supplier_id','supplier_name');
|
|
|
+ $query->select('supplier_id', 'supplier_name');
|
|
|
}
|
|
|
- ])->select('goods_id', 'join_goods_category_id','join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
|
|
|
+ ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
|
|
|
->when($goodsName != '', function ($query) use ($goodsName) {
|
|
|
$query->where(function ($q) use ($goodsName) {
|
|
|
$q->where('goods_name', 'like', '%' . $goodsName . '%')
|
|
@@ -63,6 +64,97 @@ class GoodsService
|
|
|
return json_success('', compact('rows', 'page', 'pageSize', 'total'));
|
|
|
}
|
|
|
|
|
|
+ public static function selectPackage(Request $request)
|
|
|
+ {
|
|
|
+ $page = $request->get('page');
|
|
|
+ $pageSize = $request->get('pageSize');
|
|
|
+ $goodsName = $request->get('goods_name', '');
|
|
|
+ $categoryId = $request->get('join_goods_category_id', null);
|
|
|
+
|
|
|
+ $rows = Goods::with([
|
|
|
+ 'category' => function ($query) {
|
|
|
+ $query->select('category_id', 'category_name');
|
|
|
+ },
|
|
|
+ 'running' => function ($query) {
|
|
|
+ $query->select('join_running_goods_id', 'goods_running_storage');
|
|
|
+ },
|
|
|
+ 'supplier' => function ($query) {
|
|
|
+ $query->select('supplier_id', 'supplier_name');
|
|
|
+ },
|
|
|
+// 'component' => function ($query) {
|
|
|
+// $query->select('join_component_master_goods_id', 'join_component_goods_id', 'goods_component_price', 'goods_component_config_json');
|
|
|
+// }
|
|
|
+ ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
|
|
|
+ ->when($goodsName != '', function ($query) use ($goodsName) {
|
|
|
+ $query->where(function ($q) use ($goodsName) {
|
|
|
+ $q->where('goods_name', 'like', '%' . $goodsName . '%')
|
|
|
+ ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
|
|
|
+ });
|
|
|
+ })->when($categoryId != null, function ($query) use ($categoryId) {
|
|
|
+ $query->where('join_goods_category_id', $categoryId);
|
|
|
+ })
|
|
|
+ ->where('goods_classify', 'PACKAGE')
|
|
|
+ ->orderBy('goods_addtimes', 'DESC')
|
|
|
+ ->forPage($page, $pageSize)
|
|
|
+ ->get()
|
|
|
+ ->toArray();
|
|
|
+ $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
|
|
|
+ $query->where(function ($q) use ($goodsName) {
|
|
|
+ $q->where('goods_name', 'like', '%' . $goodsName . '%')
|
|
|
+ ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
|
|
|
+ });
|
|
|
+ })->when($categoryId != null, function ($query) use ($categoryId) {
|
|
|
+ $query->where('join_goods_category_id', $categoryId);
|
|
|
+ })->where('goods_classify', 'PACKAGE')->count();
|
|
|
+
|
|
|
+ foreach ($rows as &$row) {
|
|
|
+ $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
|
|
|
+// if (!empty($row['component'])) {
|
|
|
+// $ids = [];
|
|
|
+// $contentList = [];
|
|
|
+// foreach ($row['component'] as $component) {
|
|
|
+// $ids[] = $component['join_component_goods_id'];
|
|
|
+// $configJson = json_decode($component['goods_component_config_json'], true);
|
|
|
+// $contentList[] = [
|
|
|
+// 'goods_name' => $configJson['goods_name'] ?? '',
|
|
|
+// 'goods_sales_price' => $component['goods_component_price'],
|
|
|
+// 'nbr' => $configJson['nbr'] ?? 0
|
|
|
+// ];
|
|
|
+// }
|
|
|
+//
|
|
|
+// $row['join_component_goods_id'] = $ids;
|
|
|
+// $row['goodsContentList'] = $contentList;
|
|
|
+// }
|
|
|
+ }
|
|
|
+
|
|
|
+ return json_success('', compact('rows', 'page', 'pageSize', 'total'));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Desc 下拉选择服务商品
|
|
|
+ * @Author Gorden
|
|
|
+ * @Date 2024/4/24 13:32
|
|
|
+ *
|
|
|
+ * @param Request $request
|
|
|
+ * @return Response
|
|
|
+ */
|
|
|
+ public static function selectList(Request $request)
|
|
|
+ {
|
|
|
+// $keywords = $request->get('keywords', '');
|
|
|
+// if (!$keywords){
|
|
|
+// return json_success('暂无数据');
|
|
|
+// }
|
|
|
+
|
|
|
+ $goods = Goods::where('goods_classify', 'PACKAGE')
|
|
|
+// ->where('goods_name','like',"%".$keywords."%")
|
|
|
+ ->select('goods_id', 'goods_name', 'goods_sales_price')
|
|
|
+ ->get()
|
|
|
+ ->toArray();
|
|
|
+
|
|
|
+ return json_success('', $goods);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @Desc 商品详情
|
|
|
* @Author Gorden
|
|
@@ -168,6 +260,91 @@ class GoodsService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static function infoPackage($goodsId)
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 商品主表
|
|
|
+ $main = Goods::where('goods_id', $goodsId)->first();
|
|
|
+ if (!empty($main)) {
|
|
|
+ $main = $main->toArray();
|
|
|
+ $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
|
|
|
+ $main['specList'] = [];
|
|
|
+ foreach ($main['goods_sku_json'] as $key => $sku) {
|
|
|
+ $main['specList'][] = [
|
|
|
+ 'label' => $key,
|
|
|
+ 'tags' => $sku
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ $main = [];
|
|
|
+ }
|
|
|
+ // 详情表
|
|
|
+ $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
|
|
|
+ if (!empty($detail)) {
|
|
|
+ $detail = $detail->toArray();
|
|
|
+ } else {
|
|
|
+ $detail = [];
|
|
|
+ }
|
|
|
+ // 标签表
|
|
|
+ $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
|
|
|
+ if (!empty($label)) {
|
|
|
+ $label = $label->toArray();
|
|
|
+ } else {
|
|
|
+ $label = [];
|
|
|
+ }
|
|
|
+ // Running表
|
|
|
+ $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
|
|
|
+ if (!empty($running)) {
|
|
|
+ $running = $running->toArray();
|
|
|
+ } else {
|
|
|
+ $running = [];
|
|
|
+ }
|
|
|
+ // 组件表
|
|
|
+ $component = GoodsComponent::where('join_component_master_goods_id', $goodsId)->get()->toArray();
|
|
|
+ $componentArr['join_component_goods_id'] = [];
|
|
|
+ $componentArr['goodsContentList'] = [];
|
|
|
+ if ($component) {
|
|
|
+ $ids = [];
|
|
|
+ $contentList = [];
|
|
|
+ foreach ($component as $item) {
|
|
|
+ $ids[] = $item['join_component_goods_id'];
|
|
|
+ $configJson = json_decode($item['goods_component_config_json'], true);
|
|
|
+ $contentList[] = [
|
|
|
+ 'goods_name' => $configJson['goods_name'] ?? '',
|
|
|
+ 'goods_sales_price' => $item['goods_component_price'],
|
|
|
+ 'nbr' => $configJson['nbr'] ?? 0
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ $componentArr['join_component_goods_id'] = $ids;
|
|
|
+ $componentArr['goodsContentList'] = $contentList;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合并数据
|
|
|
+ $data = array_merge($main, $detail, $label, $running, $componentArr);
|
|
|
+ $data['goods_sku_json_label'] = [];
|
|
|
+
|
|
|
+ $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
|
|
|
+ $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
|
|
|
+ if (!empty($data['goods_detail_slider_json'])) {
|
|
|
+ $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
|
|
|
+ $slider = '';
|
|
|
+ foreach ($data['goods_detail_slider_json'] as $item) {
|
|
|
+ $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
|
|
|
+ }
|
|
|
+ $data['goods_detail_slider_json'] = rtrim($slider, ',');
|
|
|
+ }
|
|
|
+
|
|
|
+ $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
|
|
|
+
|
|
|
+ return json_success('', $data);
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ dump($e->getTrace());
|
|
|
+ return json_fail("查询错误~");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* @Desc 添加商品
|
|
@@ -216,6 +393,47 @@ class GoodsService
|
|
|
return json_success('success');
|
|
|
}
|
|
|
|
|
|
+ public static function insertPackage($params): Response
|
|
|
+ {
|
|
|
+ Db::beginTransaction();
|
|
|
+ try {
|
|
|
+ $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
|
|
|
+ // 主表
|
|
|
+ self::mainInsert($params);
|
|
|
+ // 商品详情表
|
|
|
+ self::detailInsert($params);
|
|
|
+ // 套包组件表
|
|
|
+ self::componentUpdate($params, 'insert');
|
|
|
+ // 商品标签表
|
|
|
+ self::labelInsert($params);
|
|
|
+ // 产品运行控制信息表
|
|
|
+ self::goodsRunningInsert($params);
|
|
|
+ // sku表
|
|
|
+ self::goodsSkuSet($params, 'insert');
|
|
|
+ // 待上架状态,上架时间大于当前时间
|
|
|
+ if ($params['goods_status'] == 'PENDING' && strtotime($params['goods_on_addtimes']) > time()) {
|
|
|
+ $redis = Redis::connection();
|
|
|
+ $key = date('YmdHi', strtotime($params['goods_on_addtimes']));
|
|
|
+ $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
|
|
|
+ }
|
|
|
+ Db::commit();
|
|
|
+ } catch (\PDOException $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ dump($e->getMessage());
|
|
|
+ return json_fail('数据写入失败~');
|
|
|
+ } catch (BusinessException $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ dump($e->getMessage());
|
|
|
+ return json_fail($e->getMessage());
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ dump($e->getTrace());
|
|
|
+ return json_fail('数据写入失败~');
|
|
|
+ }
|
|
|
+
|
|
|
+ return json_success('success');
|
|
|
+ }
|
|
|
+
|
|
|
public static function update($params)
|
|
|
{
|
|
|
Db::beginTransaction();
|
|
@@ -242,6 +460,34 @@ class GoodsService
|
|
|
return json_success('success');
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public static function updatePackage($params)
|
|
|
+ {
|
|
|
+ Db::beginTransaction();
|
|
|
+ try {
|
|
|
+ // 主表
|
|
|
+ self::mainUpdate($params);
|
|
|
+ // 商品详情表
|
|
|
+ self::detailUpdate($params);
|
|
|
+ // 套包组件表
|
|
|
+ self::componentUpdate($params, 'update');
|
|
|
+ // 商品标签表
|
|
|
+ self::labelUpdate($params);
|
|
|
+ // 产品运行控制信息表
|
|
|
+ self::goodsRunningUpdate($params);
|
|
|
+
|
|
|
+ Db::commit();
|
|
|
+ } catch (BusinessException $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ return json_fail($e->getMessage());
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ dump($e->getTrace());
|
|
|
+ return json_fail('数据更新失败~');
|
|
|
+ }
|
|
|
+ return json_success('success');
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @Desc 删除商品
|
|
|
* @Author Gorden
|
|
@@ -361,6 +607,42 @@ class GoodsService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public static function componentUpdate($params, $type = 'insert')
|
|
|
+ {
|
|
|
+ Db::beginTransaction();
|
|
|
+ try {
|
|
|
+ // 有先删除
|
|
|
+ if ($type == 'update') {
|
|
|
+ GoodsComponent::where('join_component_master_goods_id', $params['goods_id'])->delete();
|
|
|
+ }
|
|
|
+ $data = [];
|
|
|
+ foreach ($params['goods_content_list'] as $item) {
|
|
|
+ $goods = Goods::where('goods_id', $params['goods_id'])->first();
|
|
|
+ if (!$goods) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $data[] = [
|
|
|
+ 'join_component_master_goods_id' => $params['goods_id'],
|
|
|
+ 'join_component_goods_id' => $item['goods_id'] ?? '',
|
|
|
+ 'goods_component_price' => $item['goods_sales_price'] ?? '',
|
|
|
+ 'goods_component_cover' => $goods->goods_cover,
|
|
|
+ 'goods_component_config_json' => json_encode(['goods_name' => $item['goods_name'], 'nbr' => $item['nbr']]),
|
|
|
+ 'goods_component_addtimes' => time()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($data) {
|
|
|
+ GoodsComponent::insert($data);
|
|
|
+ }
|
|
|
+ Db::commit();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Db::rollBack();
|
|
|
+ dump($e->getTrace());
|
|
|
+ throw new BusinessException("数据写入失败~");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @Desc 标签表
|
|
|
* @Author Gorden
|