when($goodsIds != '', function ($query) use ($goodsIds) { $query->whereIn('goods_id', $goodsIds); }) ->select('goods_id', 'goods_name') ->get(); return json_success('', $goods); } public static function selectAllByGoodsName($goodsName) { $goods = Goods::with('sku') ->where('goods_status', 'ON') ->when($goodsName != '', function ($query) use ($goodsName) { $query->where('goods_name', 'like', "%" . $goodsName . '%'); }) ->select('goods_id', 'goods_name', 'goods_classify') ->get() ->toArray(); foreach ($goods as &$item) { if (!empty($item['sku'])) { foreach ($item['sku'] as $key => $sku) { $specsJson = json_decode($sku['goods_sku_specs_json'], true); $skuTitle = ''; foreach ($specsJson as $item2) { if (is_array($item2)) { $item2 = implode(',', $item2); } $skuTitle .= $item2 . '-'; } $item['sku'][$key]['goods_sku_id'] = strval($item['sku'][$key]['goods_sku_id']); $item['sku'][$key]['goods_sku_title'] = rtrim($skuTitle, '-'); } } } return json_success('', $goods); } public static function selectAllByCategoryForRuleAddComponent($category = "GOODS") { $categoryIds = []; $categorySuperIds = []; if ($category == 'GOODS') { $categorySuperIds = [5]; } elseif ($category == 'SERVICE') { $categorySuperIds = [31, 154, 42, 65, 30, 66, 72, 70]; } $categorys = SysCategory::whereIn('category_id', $categorySuperIds)->get()->toArray(); foreach ($categorys as $item) { if (empty($item['category_super_path'])) { $item['category_super_path'] = '#' . $item['category_id'] . '#'; } else { $item['category_super_path'] = $item['category_super_path'] . '#' . $item['category_id'] . '#'; } $categoryIds = SysCategory::where('category_super_path', 'like', '%' . $item['category_super_path'] . '%')->pluck('category_id'); $categoryIds = $categoryIds ? $categoryIds->toArray() : []; $categorySuperIds = array_merge($categorySuperIds, $categoryIds); } $categoryIds = array_unique($categorySuperIds); $goods = Goods::with('sku') // ->where('goods_classify', $category) ->when(!empty($categoryIds), function ($query) use ($categoryIds) { $query->whereIn('join_goods_category_id', $categoryIds); })->when(empty($categoryIds), function ($query) { $query->where('goods_classify', '<>', 'RECHARGE'); })->where('goods_status', 'ON') ->select('goods_id', 'goods_name', 'join_goods_category_id') ->get() ->toArray(); foreach ($goods as &$good) { if (!empty($good['sku'])) { foreach ($good['sku'] as $key => $sku) { if (!empty($sku['goods_sku_specs_json'])) { $specsJson = json_decode($sku['goods_sku_specs_json'], true); $skuTitle = ''; foreach ($specsJson as $item) { if (is_array($item)) { $item = implode(',', $item); } $skuTitle .= $item . '-'; } $good['sku'][$key]['goods_sku_id'] = strval($good['sku'][$key]['goods_sku_id']); $good['sku'][$key]['goods_sku_title'] = rtrim($skuTitle, '-'); } unset($good['sku'][$key]['goods_sku_specs_json'], $good['sku'][$key]['join_sku_goods_id']); } } else { $good['sku'] = []; } } return json_success('', $goods); } public static function selectPremisesByGoodsId($goodsId) { $goods = Goods::where('goods_id', $goodsId) ->select('goods_id', 'goods_attribute_json') ->first(); $premisses = []; if (!empty($goods->goods_attribute_json)) { $attributeJson = json_decode($goods->goods_attribute_json, true); if (isset($attributeJson['premisses'])) { $premisses = SysDept::whereIn('dept_id', $attributeJson['premisses']) ->select('dept_id', 'dept_name') ->get() ->toArray(); } } return json_success('', $premisses); } public static function select(Request $request, $classify = "GOODS") { $page = $request->get('page', 1); $pageSize = $request->get('pageSize', 20); $goodsName = $request->get('goods_name', ''); $categoryId = $request->get('join_goods_category_id', null); $goodsCategory = $request->get('goods_category', null); $goodsSupplierId = $request->get('join_goods_supplier_id', null); $goodsStatus = $request->get('goods_status', null); $type = $request->get('type', ''); if ($categoryId != null) { $categoryPath = SysCategory::where('category_id', $categoryId)->value('category_super_path'); $categoryPath .= '#' . $categoryId . '#'; $categoryIds = SysCategory::where('category_super_path', 'like', $categoryPath . '%')->pluck('category_id')->toArray(); $categoryIds[] = intval($categoryId); if (!empty($categoryIds)) { $categoryId = $categoryIds; } else { $categoryId = [intval($categoryId)]; } } $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'); }, 'user' => function ($query) { $query->select('user_id', 'user_name'); } ])->leftJoin('goods_running', 'goods_running.join_running_goods_id', '=', 'goods.goods_id') ->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_attribute_json', 'goods_addtimes', 'goods_updatetimes') ->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->whereIn('join_goods_category_id', $categoryId); })->when($goodsCategory != null, function ($query) use ($goodsCategory) { $query->where('goods_category', $goodsCategory); }) ->when($classify != '', function ($query) use ($classify, $categoryId) { if ($classify == 'GOODS' && empty($categoryId)) { $query->whereIn('join_goods_category_id', ['6', '7', '8', '9', '10', '11', '12', '30']); } else if ($classify != 'GOODS' && empty($categoryId)) { $query->where('goods_classify', $classify); } })->when(!empty($type), function ($query) use ($type) { if ($type == 'storageWarning') { $query->where('goods_running.goods_running_storage', '<=', 2); } })->when(!empty($goodsSupplierId), function ($query) use ($goodsSupplierId) { $query->where('join_goods_supplier_id', $goodsSupplierId); })->when(!empty($goodsStatus), function ($query) use ($goodsStatus) { $query->where('goods_status', $goodsStatus); }) ->orderBy('goods_sort', 'DESC') ->orderBy('goods_addtimes', 'DESC') ->forPage($page, $pageSize) ->get() ->toArray(); $total = Goods::leftJoin('goods_running', 'goods_running.join_running_goods_id', '=', 'goods.goods_id') ->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->whereIn('join_goods_category_id', $categoryId); })->when($goodsCategory != null, function ($query) use ($goodsCategory) { $query->where('goods_category', $goodsCategory); })->when($classify != '', function ($query) use ($classify, $categoryId) { if ($classify == 'GOODS' && empty($categoryId)) { $query->whereIn('join_goods_category_id', ['6', '7', '8', '9', '10', '11', '12', '30']); } else if ($classify != 'GOODS' && empty($categoryId)) { $query->where('goods_classify', $classify); } })->when(!empty($type), function ($query) use ($type) { if ($type == 'storageWarning') { $query->where('goods_running.goods_running_storage', '<=', 2); } })->when(!empty($goodsSupplierId), function ($query) use ($goodsSupplierId) { $query->where('join_goods_supplier_id', $goodsSupplierId); })->when(!empty($goodsStatus), function ($query) use ($goodsStatus) { $query->where('goods_status', $goodsStatus); }) ->count(); foreach ($rows as &$row) { $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover']; if (isset($row['running'])) { $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']); } if (!empty($row['goods_attribute_json'])) { $row['goods_attribute_json'] = json_decode($row['goods_attribute_json']); } if (!empty($row['goods_category']) && $row['goods_category'] == 'INDEX') { $row['goods_recommend_index'] = 'INDEX'; } } return json_success('', compact('rows', 'page', 'pageSize', 'total')); } public static function selectSpecial(Request $request) { $page = $request->get('page'); $pageSize = $request->get('pageSize'); $goodsName = $request->get('goods_name', ''); $categoryId = $request->get('join_goods_category_id', null); if ($categoryId == null) { $categoryId = [65, 43]; } elseif (is_string($categoryId)) { $categoryId = [$categoryId]; } $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'); }, 'user' => function ($query) { $query->select('user_id', 'user_name'); } ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes', 'goods_updatetimes') ->when($goodsName != '', function ($query) use ($goodsName) { $query->where(function ($q) use ($goodsName) { $q->where('goods_name', 'like', '%' . $goodsName . '%'); // ->OrWhere('goods_title', 'like', '%' . $goodsName . '%'); }); })->whereIn('join_goods_category_id', $categoryId) ->orderBy('goods_sort', 'DESC') ->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 . '%'); }); })->whereIn('join_goods_category_id', $categoryId)->count(); foreach ($rows as &$row) { $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover']; if (isset($row['running'])) { $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']); } } return json_success('', compact('rows', 'page', 'pageSize', 'total')); } public static function selectPicking(Request $request) { $page = $request->get('page'); $pageSize = $request->get('pageSize'); $goodsName = $request->get('goods_name', ''); $categorySuperId = $request->get('category_super_id', ''); $categoryIds = $request->get('join_goods_category_id', []); if (!empty($categorySuperId) && is_array($categoryIds)) { $category = SysCategory::where('category_id', $categorySuperId)->first(); if (empty($category->category_super_path)) { $category->category_super_path = '#' . $categorySuperId . '#'; } else { $category->category_super_path = $category->category_super_path . '#' . $categorySuperId . '#'; } $categoryIds = SysCategory::where('category_super_path', 'like', '%' . $category->category_super_path)->pluck('category_id'); $categoryIds = $categoryIds ? $categoryIds->toArray() : []; $categoryIds = array_merge($categoryIds, [$categorySuperId]); } elseif (!is_array($categoryIds)) { $categoryIds = [$categoryIds]; } $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'); }, 'user' => function ($query) { $query->select('user_id', 'user_name'); } ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes', 'goods_updatetimes') ->when($goodsName != '', function ($query) use ($goodsName) { $query->where(function ($q) use ($goodsName) { $q->where('goods_name', 'like', '%' . $goodsName . '%') ->OrWhere('goods_title', 'like', '%' . $goodsName . '%'); }); })->whereIn('join_goods_category_id', $categoryIds) ->orderBy('goods_sort', 'DESC') ->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 . '%'); }); })->whereIn('join_goods_category_id', $categoryIds) ->count(); foreach ($rows as &$row) { $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover']; if (isset($row['running'])) { $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']); } } 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'); }, 'user' => function ($query) { $query->select('user_id', 'user_name'); } ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes', 'goods_updatetimes') ->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_sort', 'DESC') ->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 (isset($row['running'])) { $row['running']['goods_running_storage'] = intval($row['running']['goods_running_storage']); } // 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, $goodsClassify = "SERVICE") { $keywords = $request->get('keywords', ''); $isSupportAppointment = $request->get('is_support_appointment', ''); // if (!$keywords){ // return json_success('暂无数据'); // } // $categoryIds = SysCategory::whereIn('category_super_id', [5, 31, 32, 42, 66, 70, 72])->pluck('category_id'); $goods = Goods::with('sku') // ->whereIn('join_goods_category_id', $categoryIds) ->when($keywords != '', function ($query) use ($keywords) { $query->where('goods_name', 'like', "%" . $keywords . "%"); }) ->when($goodsClassify != '', function ($query) use ($goodsClassify) { if ($goodsClassify == 'NOPACKAGE') { $query->where('goods_classify', '<>', 'PACKAGE'); } else if ($goodsClassify == 'SERVICE') { $query->whereIn('goods_classify', ['SERVICE', 'CHNMED', 'CHNNCD']); } else { $query->where('goods_classify', $goodsClassify); } }) ->when($isSupportAppointment != '', function ($query) use ($isSupportAppointment) { $query->where('is_support_appointment', $isSupportAppointment); }) ->select('goods_id', 'goods_name', 'goods_sales_price', 'join_goods_category_id', 'goods_attribute_json') ->get() ->toArray(); foreach ($goods as &$good) { if (!empty($good['sku'])) { foreach ($good['sku'] as $key => $sku) { if (!empty($sku['goods_sku_specs_json'])) { $good['sku'][$key]['goods_sku_specs_json'] = json_decode($sku['goods_sku_specs_json']); $skuName = ''; foreach ($good['sku'][$key]['goods_sku_specs_json'] as $specsKey => $skuSpecs) { if (is_array($skuSpecs)) { $skuName = $skuName . ' ' . $specsKey . ':' . implode(' ', $skuSpecs) . ';'; } else { $skuName = $skuName . ' ' . $specsKey . ':' . $skuSpecs . ';'; } } $good['sku'][$key]['sku_name'] = $skuName; } } } else { $good['sku'] = []; } $good['premisses'] = []; if (!empty($good['goods_attribute_json'])) { $attributeJson = json_decode($good['goods_attribute_json'], true); if (isset($attributeJson['premisses'])) { $premisses = SysDept::when(!empty($attributeJson['premisses']), function ($query) use ($attributeJson) { $query->whereIn('dept_id', $attributeJson['premisses']); })->where('dept_category', '营业场所') ->select('dept_id', 'dept_name') ->get(); $good['premisses'] = $premisses; } } } return json_success('', $goods); } public static function selectCascaderList(Request $request) { $categoryIds = $request->get('category_id', ''); $categorySuperId = $request->get('category_super_id', ''); $joinGoodsCategoryId = $request->get('join_goods_category_id', ''); $type = $request->get('type', ''); if (!$categoryIds && !$categorySuperId && !$joinGoodsCategoryId) { return json_fail('参数异常'); } $data = []; $categorys = []; if (!empty($categoryIds)) { $categorys = SysCategory::whereIn('category_id', $categoryIds) ->where('category_status', 'ACTIVED') ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path') ->orderBy('category_sort', 'DESC') ->get() ->toArray(); $data = array_merge($data, $categorys); } else if (!empty($categorySuperId)) { $categorys = SysCategory::where('category_super_id', $categorySuperId) ->where('category_status', 'ACTIVED') ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path') ->orderBy('category_sort', 'DESC') ->get() ->toArray(); $data = array_merge($data, $categorys); } foreach ($categorys as $category) { // if(empty($category['category_super_path'])){ $category['category_super_path'] = '#' . $category['id'] . '#'; // } $subCategory = SysCategory::where('category_super_path', 'like', '%' . $category['category_super_path'] . '%') ->where('category_status', 'ACTIVED') ->select('category_id as id', 'category_name as name', 'category_super_id as pid', 'category_super_path') ->orderBy('category_sort', 'DESC') ->get() ->toArray(); $data = array_merge($data, $subCategory); } if (empty($data) && !empty($joinGoodsCategoryId)) { $goodsCategoryIds = $joinGoodsCategoryId; } else { $goodsCategoryIds = array_column($data, 'id'); } $goods = Goods::with([ 'sku' => function ($query) { $query->where('goods_sku_status', 'ON'); } ]) ->leftJoin('goods_running', 'goods_running.join_running_goods_id', '=', 'goods.goods_id') ->where('goods_running.goods_running_storage', '>', 0) ->whereIn('join_goods_category_id', $goodsCategoryIds) ->where('goods_status', 'ON'); if ($type == 'dishes') { $uid = JwtToken::getCurrentId(); $user = SysUser::where('user_id', $uid)->first(); $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) { $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id); })->first(); $supplier = Supplier::where('join_supplier_dept_id', $restaurant->dept_id)->first(); if ($supplier) { $goods = $goods->where('join_goods_supplier_id', $supplier->supplier_id); } } $goods = $goods->select('goods_id', 'goods_id as id', 'goods_name as name', 'join_goods_category_id as pid', 'goods_attribute_json', 'goods_classify', 'goods_sales_price', 'goods_cover', 'goods_running.goods_running_storage') ->orderBy('goods_sort', 'DESC') ->orderBy('goods_addtimes', 'DESC') ->get() ->toArray(); foreach ($goods as &$good) { $good['goods_cover'] = getenv('STORAGE_DOMAIN') . $good['goods_cover']; $good['goods_running_storage'] = intval($good['goods_running_storage']); $good['nbr'] = 0; if (!empty($good['sku'])) { foreach ($good['sku'] as $key => $sku) { if (!empty($sku['goods_sku_specs_json'])) { $good['sku'][$key]['goods_sku_specs_json'] = json_decode($sku['goods_sku_specs_json']); $skuName = ''; foreach ($good['sku'][$key]['goods_sku_specs_json'] as $specsKey => $skuSpecs) { $keyStr = ($specsKey == '规格') ? '' : ($specsKey . ':'); if (is_array($skuSpecs)) { $skuName = $skuName . $keyStr . ' ' . implode(' ', $skuSpecs) . '; '; } else { $skuName = $skuName . $keyStr . ' ' . $skuSpecs . '; '; } } $good['sku'][$key]['sku_name'] = rtrim($skuName, '; '); } } } else { $good['sku'] = []; } $good['premisses'] = []; if (!empty($good['goods_attribute_json'])) { $attributeJson = json_decode($good['goods_attribute_json'], true); if (isset($attributeJson['premisses'])) { $premisses = SysDept::when(!empty($attributeJson['premisses']), function ($query) use ($attributeJson) { $query->whereIn('dept_id', $attributeJson['premisses']); })->where('dept_category', '营业场所') ->select('dept_id', 'dept_name') ->get(); $good['premisses'] = $premisses; } } } $data = array_merge($data, $goods); $tree = new Tree($data); $cascaderData = $tree->getTree(); foreach ($cascaderData as $key1 => $cascader1) { if (isset($cascader1['children'])) { foreach ($cascader1['children'] as $key2 => $cascader2) { if (isset($cascader2['children'])) { foreach ($cascader2['children'] as $key3 => $cascader3) { if (isset($cascader3['children'])) { foreach ($cascader3['children'] as $key4 => $cascader4) { if (!isset($cascader4['goods_id'])) { unset($cascaderData[$key1]['children'][$key2]['children'][$key3]['children'][$key4]); } if (isset($cascader4['goods_id']) && empty($cascader4['sku'])) { unset($cascaderData[$key1]['children'][$key2]['children'][$key3]['children'][$key4]); } } } else if (!isset($cascader3['goods_id'])) { unset($cascaderData[$key1]['children'][$key2]['children'][$key3]); } if (isset($cascader3['goods_id']) && empty($cascader3['sku'])) { unset($cascaderData[$key1]['children'][$key2]['children'][$key3]); continue; } if (isset($cascader3['children']) && count($cascaderData[$key1]['children'][$key2]['children']) == 0) { unset($cascaderData[$key1]['children'][$key2]); } if (isset($cascader3['children']) && count($cascaderData[$key1]['children'][$key2]['children'][$key3]['children']) > 0) { $cascaderData[$key1]['children'][$key2]['children'][$key3]['children'] = array_values($cascaderData[$key1]['children'][$key2]['children'][$key3]['children']); } } } else if (!isset($cascader2['goods_id'])) { unset($cascaderData[$key1]['children'][$key2]); } if (isset($cascader2['goods_id']) && empty($cascader2['sku'])) { unset($cascaderData[$key1]['children'][$key2]); continue; } if (isset($cascader2['children']) && count($cascaderData[$key1]['children'][$key2]['children']) == 0) { unset($cascaderData[$key1]['children'][$key2]); } if (isset($cascader2['children']) && isset($cascaderData[$key1]['children'][$key2]) && count($cascaderData[$key1]['children'][$key2]['children']) > 0) { $cascaderData[$key1]['children'][$key2]['children'] = array_values($cascaderData[$key1]['children'][$key2]['children']); } } } else if (!isset($cascader1['goods_id'])) { unset($cascaderData[$key1]); } if (isset($cascader1['goods_id']) && empty($cascader1['sku'])) { unset($cascaderData[$key1]); continue; } if (isset($cascader1['children']) && count($cascaderData[$key1]['children']) == 0) { unset($cascaderData[$key1]); } if (isset($cascader1['children']) && isset($cascaderData[$key1]) && count($cascaderData[$key1]['children']) > 0) { $cascaderData[$key1]['children'] = array_values($cascaderData[$key1]['children']); } } $cascaderData = array_values($cascaderData); return json_success('success', $cascaderData); } /** * @Desc 商品详情 * @Author Gorden * @Date 2024/3/28 10:25 * * @param $goodsId * @return Response */ public static function info($goodsId) { try { // 商品主表 $main = Goods::with('category')->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(); if (!empty($running['goods_running_off_json']) && is_json($running['goods_running_off_json'])) { $goodsRunningOffJson = json_decode($running['goods_running_off_json'], true); $running['goods_off_addtimes'] = isset($goodsRunningOffJson['time']) ? date("Y-m-d H:i", $goodsRunningOffJson['time']) : ''; } $running['goods_running_storage'] = !empty($running['goods_running_storage']) ? intval($running['goods_running_storage']) : ''; $running['goods_running_sale'] = !empty($running['goods_running_sale']) ? intval($running['goods_running_sale']) : ''; } else { $running = []; } // Sku表 $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->where('goods_sku_status', 'ON')->get(); if (!empty($skus)) { $skus = $skus->toArray(); $submitList = []; foreach ($skus as $key => $sku) { $skuSpecsJson = json_decode($sku['goods_sku_specs_json'], true); $skuSpecs = ''; $skuNameValue = []; $i = 1; foreach ($skuSpecsJson as $k => $item) { if (is_array($item)) { $item = implode(',', $item); } $skuSpecs = $skuSpecs . $item . ','; $skuNameKey = 'skuName' . $i; $skuValueKey = 'skuValue' . $i; $skuNameValue[$skuNameKey] = $k; $skuNameValue[$skuValueKey] = $item; $skuNameValue[$k] = $item; $i++; } $storage = json_decode($sku['goods_sku_storage_json'], true); $priceStorage = [ 'sku_id' => $sku['goods_sku_id'], 'sku' => rtrim($skuSpecs, ',') ?? '', 'stock' => $storage['storage'] ?? '', 'price' => $sku['goods_sku_sales_price'] ?? '', ]; $submitList[] = array_merge($skuNameValue, $priceStorage); } $skus['submitList'] = $submitList; } else { $skus = []; } // 合并数据 $data = array_merge($main, $detail, $label, $running, ['sku' => $skus]); $data['goods_sku_json_label'] = []; $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : []; $data['goods_json'] = $data['goods_json'] ? json_decode($data['goods_json'], true) : []; $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover']; if (!empty($data['goods_category']) && $data['goods_category'] == 'INDEX') { $data['goods_recommend_index'] = 'INDEX'; } // 创建者 $data['creator_username'] = ''; if (!empty($data['creator_user_id'])) { $data['creator_username'] = SysUser::where('user_id', $data['creator_user_id'])->value('user_name'); } if (!empty($data['goods_detail_slider_json'])) { $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true); // …… if (isset($data['goods_detail_slider_json']['slider'])) { $data['goods_detail_slider_json'] = explode(',', $data['goods_detail_slider_json']['slider']); } $slider = ''; foreach ($data['goods_detail_slider_json'] as $item) { $slider .= getenv('STORAGE_DOMAIN') . $item . ','; } $data['goods_detail_slider_json'] = rtrim($slider, ','); } $extendJson = []; if (!empty($data['goods_attribute_json'])) { $extendJson = json_decode($data['goods_attribute_json'], true); $data['goods_attribute_json'] = $extendJson; } if (!empty($extendJson['card_main_id'])) { $data['card_main_id'] = $extendJson['card_main_id']; $cardMain = CardMain::with('category')->where('card_main_id', $extendJson['card_main_id'])->first(); if (!empty($cardMain) && !empty($cardMain->card_main_valid_mode)) { $validTerm = ''; if ($cardMain->card_main_valid_mode == 'LONG') { $validTerm = '长期有效'; } else if ($cardMain->card_main_valid_mode == 'DAYS') { $validTerm = $cardMain->card_main_valid_days ? $cardMain->card_main_valid_days . '天' : 0; } else if ($cardMain->card_main_valid_mode == 'DATE') { $validTerm = date('Y/m/d', strtotime($cardMain->card_main_valid_begin)) . '-' . date('Y/m/d', strtotime($cardMain->card_main_valid_end)); } $data['card'][] = [ 'card_main_name' => $cardMain->card_main_name, 'card_main_category' => !empty($cardMain->category) ? $cardMain->category->category_name : '--', 'card_main_classify' => $cardMain->card_main_classify, 'card_main_status' => $cardMain->card_main_status, 'card_main_amount' => $cardMain->card_main_amount, 'card_main_added' => $cardMain->card_main_added, 'valid_term' => $validTerm, 'card_main_addtimes' => date('Y-m-d H:i:s', strtotime($cardMain->card_main_addtimes)) ]; } } $data['express_json'] = []; if (!empty($data['goods_express_json'])) { $goodsExpressJson = json_decode($data['goods_express_json'], true); if (isset($goodsExpressJson['express']) && $goodsExpressJson['express'] == 'Y') { $data['express_json'][] = 'express'; } if (isset($goodsExpressJson['self']) && $goodsExpressJson['self'] == 'Y') { $data['express_json'][] = 'self'; } if (isset($goodsExpressJson['arrival']) && $goodsExpressJson['arrival'] == 'Y') { $data['express_json'][] = 'arrival'; } } // 详情表数据 if (!empty($data['goods_detail_specs_json'])) { $specsJson = json_decode($data['goods_detail_specs_json'], true); foreach ($specsJson as $itemSpecsJson) { if (isset($itemSpecsJson['key']) && $itemSpecsJson['key'] == '课时') { $data['curriculum']['period'] = $itemSpecsJson['val']; } elseif (isset($itemSpecsJson['key']) && $itemSpecsJson['key'] == '群体') { $data['curriculum']['group'] = $itemSpecsJson['val']; } elseif (isset($itemSpecsJson['key']) && $itemSpecsJson['key'] == '课程') { $data['curriculum']['course'] = $itemSpecsJson['val']; } } } return json_success('', $data); } catch (\Exception $e) { dump($e->getMessage()); return json_fail("查询错误~"); } } /** * @Desc 添加商品 * @Author Gorden * @Date 2024/3/11 10:20 * * @param $params * @return Response */ public static function insert($params): Response { Db::beginTransaction(); try { $params['goods_id'] = "GD" . date('ymdHi') . random_string(4, 'up'); // 主表 self::mainInsert($params); // 商品详情表 self::detailInsert($params); // 商品标签表 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']); } // 自动下架 if (!empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T' && !empty($params['goods_off_addtimes'])) { $redis = Redis::connection(); $key = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', strtotime($params['goods_off_addtimes'])); $redis->sAdd($key, $params['goods_id']); } Db::commit(); } catch (\PDOException $e) { Db::rollBack(); dump($e->getFile() . '(' . $e->getLine() . '):' . $e->getMessage()); return json_fail('数据写入失败~'); } catch (BusinessException $e) { Db::rollBack(); dump($e->getFile() . '(' . $e->getLine() . '):' . $e->getMessage()); return json_fail($e->getMessage()); } catch (\Exception $e) { Db::rollBack(); dump($e->getTrace()); return json_fail('数据写入失败~'); } _syslog("添加商品", "商品名【" . $params['goods_name'] . "】"); return json_success('success'); } public static function insertRecharge($params) { try { Db::beginTransaction(); $goods = new Goods(); $goods->goods_id = "GD" . date('ymdHi') . random_string(4, 'up'); $goods->join_goods_category_id = 59; $goods->goods_classify = 'RECHARGE'; $goods->goods_status = $params['goods_status']; $goods->goods_sort = $params['goods_sort']; $goods->goods_category = $params['goods_category']; $goods->goods_name = $params['goods_name']; $goods->goods_market_price = $params['goods_sales_price']; $goods->goods_sales_price = $params['goods_sales_price']; $goods->goods_sku_json = json_encode(['规格' => [$params['goods_sales_price'] . '元']]); $goods->goods_attribute_json = json_encode(['added' => ['nbr' => $params['goods_rate'] / 100, 'mode' => 'rate'], 'min-count' => 1]); $goods->goods_cover = '/images/app/common/null-service.png'; $goods->goods_process_json = json_encode(['mode' => 'do_shopping']); $goods->goods_addtimes = time(); $goods->save(); $sku = new GoodsSku(); $sku->join_sku_goods_id = $goods->goods_id; $sku->goods_sku_status = $params['goods_status']; $sku->goods_sku_specs_json = json_encode(['规格' => $params['goods_sales_price'] . '元']); $sku->goods_sku_market_price = $params['goods_sales_price']; $sku->goods_sku_sales_price = $params['goods_sales_price']; $sku->goods_sku_storage_json = json_encode(['storage' => 9999]); $sku->save(); Db::commit(); return json_success('success'); } catch (\Exception $e) { Db::rollBack(); return json_fail('添加充值产品失败'); } } public static function updateRecharge($params) { try { Db::beginTransaction(); $goods = Goods::where('goods_id', $params['goods_id'])->first(); if (!$goods) { return json_fail("数据异常"); } $goods->goods_market_price = $params['goods_sales_price']; $goods->goods_sales_price = $params['goods_sales_price']; $goods->goods_status = $params['goods_status']; $goods->goods_sku_json = json_encode(['规格' => [$params['goods_sales_price'] . '元']]); $goods->goods_sort = $params['goods_sort']; if (!empty($goods->goods_attribute_json)) { $attributeJson = json_decode($goods->goods_attribute_json, true); $attributeJson['added']['nbr'] = $params['goods_rate'] / 100; $goods->goods_attribute_json = json_encode($attributeJson); } $goods->save(); $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_status', 'ON')->first(); $sku->goods_sku_status = $params['goods_status']; $sku->goods_sku_specs_json = json_encode(['规格' => $params['goods_sales_price'] . '元']); $sku->goods_sku_market_price = $params['goods_sales_price']; $sku->goods_sku_sales_price = $params['goods_sales_price']; $sku->save(); Db::commit(); return json_success("success"); } catch (\Exception $e) { Db::rollBack(); dump($e->getMessage()); return json_fail('编辑充值产品失败'); } } public static function insertPackage($params): Response { Db::beginTransaction(); try { $params['goods_id'] = "GD" . date('ymdHi') . random_string(4, '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('数据写入失败~'); } _syslog("添加套餐", "商品名【" . $params['goods_name'] . "】"); return json_success('success'); } public static function update($params) { Db::beginTransaction(); try { // 主表 self::mainUpdate($params); // 商品详情表 self::detailUpdate($params); // 商品标签表 self::labelUpdate($params); // 产品运行控制信息表 self::goodsRunningUpdate($params); // sku表 self::goodsSkuSet($params, 'update'); Db::commit(); } catch (BusinessException $e) { Db::rollBack(); return json_fail($e->getMessage()); } catch (\Exception $e) { Db::rollBack(); return json_fail('数据更新失败~'); } _syslog("编辑商品", "商品名【" . $params['goods_name'] . "】" ?? "商品ID:【" . $params['goods_id'] . "】"); return json_success('success'); } public static function changeStatus($params) { try { Goods::where('goods_id', $params['goods_id'])->update(['goods_status' => $params['goods_status']]); return json_success('修改成功'); } catch (\Exception $e) { return json_fail('修改状态失败'); } } public static function updatePackage($params) { Db::beginTransaction(); try { // 主表 self::mainUpdate($params); // 商品详情表 self::detailUpdate($params); // 套包组件表 self::componentUpdate($params, 'update'); // 商品标签表 self::labelUpdate($params); // 产品运行控制信息表 self::goodsRunningUpdate($params); // sku表 self::goodsSkuSet($params, 'update'); Db::commit(); } catch (BusinessException $e) { Db::rollBack(); return json_fail($e->getMessage()); } catch (\Exception $e) { Db::rollBack(); dump($e->getTrace()); return json_fail('数据更新失败~'); } _syslog("编辑套餐", "商品名【" . $params['goods_name'] . "】" ?? "商品ID:【" . $params['goods_id'] . "】"); return json_success('success'); } /** * @Desc 删除商品 * @Author Gorden * @Date 2024/3/28 13:20 * * @param $ids * @return Response */ public static function delete($ids) { if (!$ids) { return json_fail("数据错误~"); } if (!is_array($ids)) { $ids = [$ids]; } $goods = Goods::whereIn('goods_id', $ids)->get()->toArray(); if (!$goods) { return json_fail("数据错误~"); } // 是否在套包里 if (GoodsComponent::whereIn('join_component_goods_id', $ids)->exists()) { return json_fail("当前商品存在于套包中,请先在套包中删除"); } // 是否已被购买过 if (OrderSheet::whereIn('join_sheet_goods_id', $ids)->exists()) { return json_fail("当前商品已有购买历史,如不在APP显示,请选择【下架】操作"); } // 是否预约过 if (Appointment::whereIn('join_appointment_goods_id', $ids)->exists()) { return json_fail("当前商品已有预约历史,如不在APP显示,请选择【下架】操作"); } Db::beginTransaction(); try { Goods::whereIn('goods_id', $ids)->delete(); GoodsDetail::whereIn('join_detail_goods_id', $ids)->delete(); GoodsLabel::whereIn('join_label_goods_id', $ids)->delete(); GoodsRunning::whereIn('join_running_goods_id', $ids)->delete(); GoodsSku::whereIn('join_sku_goods_id', $ids)->delete(); Db::commit(); _syslog("删除商品 / 套餐", "ID:【" . implode(',', $ids) . "】", $goods); return json_success("商品删除成功"); } catch (\Exception $e) { Db::rollBack(); return json_fail("商品删除失败~"); } } /** * @Desc 商品主表 * @Author Gorden * @Date 2024/3/11 11:20 * * @param $params * @return mixed|string * @throws BusinessException */ public static function mainInsert($params) { if (!empty($params['goods_cover'])) { $params['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_cover']); } // 如果产品是待处理状态 if ($params['goods_status'] == 'PENDING') { if (strtotime($params['goods_on_addtimes']) <= time()) { $params['goods_status'] = 'ON'; } } $category = SysCategory::where('category_id', $params['join_goods_category_id'])->first(); if (!$category) { throw new BusinessException("产品分类不存在~"); } if (empty($params['goods_category'])) { $params['goods_category'] = $category->category_classify; } try { $model = new Goods(); $model->goods_id = $params['goods_id']; $model->join_goods_category_id = $params['join_goods_category_id'] ?? 0; $model->join_goods_supplier_id = $params['join_goods_supplier_id'] ?? 0; $model->goods_classify = $params['goods_classify'] ?? ''; $model->goods_status = $params['goods_status'] ?? ''; $model->goods_category = $params['goods_category'] ?? ''; // $model->goods_prefix = $params['goods_prefix'] ?? 】($category->category_name ? '【' . $category->category_name . '' : ''); $model->goods_prefix = $params['goods_prefix'] ?? ''; $model->goods_name = $params['goods_name']; $model->goods_market_price = $params['goods_market_price'] ?? 0; $model->goods_sales_price = $params['goods_sales_price'] ?? 0; $model->goods_sku_json = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => ['标准']]); $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '[]'; $model->goods_title = $params['goods_title'] ?? ''; $model->goods_cover = $params['goods_cover'] ?? ''; $model->goods_on_addtimes = isset($params['goods_on_addtimes']) ? strtotime($params['goods_on_addtimes']) : null; $model->goods_sort = $params['goods_sort'] ?? null; $model->goods_groupby = $params['goods_groupby'] ?? ''; $model->goods_remark = $params['goods_remark'] ?? ''; $model->goods_extend_json = $params['goods_extend_json'] ?? '{}'; $model->is_support_appointment = $params['is_support_appointment'] ?? 'N'; $model->creator_user_id = JwtToken::getCurrentId(); $model->goods_addtimes = time(); $model->goods_updatetimes = time(); // {"express":"Y","self":"Y","arrival":"Y"} $expressJson = []; if (!empty($params['express_json'])) { if (in_array('express', $params['express_json'])) { $expressJson['express'] = 'Y'; } else { $expressJson['express'] = 'N'; } if (in_array('self', $params['express_json'])) { $expressJson['self'] = 'Y'; } else { $expressJson['self'] = 'N'; } if (in_array('arrival', $params['express_json'])) { $expressJson['arrival'] = 'Y'; } else { $expressJson['arrival'] = 'N'; } $model->goods_express_json = json_encode($expressJson); } $model->goods_json = '[]'; if (!empty($params['goods_premisses'])) { $attributeJson = []; if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['premisses'] = $params['goods_premisses']; $model->goods_attribute_json = json_encode($attributeJson); } if (!empty($params['goods_theme_color']) && !empty($params['goods_theme_icon'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['bg'] = $params['goods_theme_color']; $attributeJson['icon'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_theme_icon']); $model->goods_attribute_json = json_encode($attributeJson); } if (!empty($params['address'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['address'] = $params['address']; $model->goods_attribute_json = json_encode($attributeJson); } if (!empty($params['position'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['position'] = $params['position']; $model->goods_attribute_json = json_encode($attributeJson); } if (isset($params['goods_service_premises'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['service_premises_id'] = $params['goods_service_premises']; $model->goods_attribute_json = json_encode($attributeJson); } if (isset($params['min_count'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['min-count'] = $params['min_count']; $model->goods_attribute_json = json_encode($attributeJson); } if (isset($params['teachers'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['teachers'] = $params['teachers']; $model->goods_attribute_json = json_encode($attributeJson); } if (!empty($params['card_main_id'])) { if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) { $attributeJson = json_decode($model->goods_attribute_json, true); } elseif (empty($model->goods_attribute_json)) { $attributeJson = []; } $attributeJson['payment'] = 'Wx+Ali'; $attributeJson['card_main_id'] = $params['card_main_id']; $model->goods_attribute_json = json_encode($attributeJson, JSON_UNESCAPED_UNICODE); } if ($model->save()) { return $model->goods_id; } // 异常 throw new BusinessException("数据写入失败~"); } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException("数据写入失败~"); } } /** * @Desc 详情表 * @Author Gorden * @Date 2024/3/11 11:19 * * @param $params * @return void * @throws BusinessException */ public static function detailInsert($params) { if (!empty($params['goods_detail_slider_json'])) { $params['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_detail_slider_json']); $params['goods_detail_slider_json'] = json_encode(['slider' => $params['goods_detail_slider_json']]); } if (isset($params['curriculum'])) { $params['goods_detail_specs_json'] = json_encode([ [ 'key' => '课时', 'val' => $params['curriculum']['period'] ?? '', ], [ 'key' => '群体', 'val' => $params['curriculum']['group'] ?? '', ], [ 'key' => '课程', 'val' => $params['curriculum']['course'] ?? '', ], ]); } try { $model = new GoodsDetail(); $model->join_detail_goods_id = $params['goods_id']; $model->goods_detail_code_json = $params['goods_detail_code_json'] ?? '{}'; $model->goods_detail_slider_json = $params['goods_detail_slider_json'] ?? '{}'; $model->goods_detail_specs_json = $params['goods_detail_specs_json'] ?? '{}'; $model->goods_detail_content = $params['goods_detail_content'] ?? ''; if (!$model->save()) { // 异常 throw new BusinessException("轮播图/详情数据写入失败~"); } } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException("轮播图/详情数据写入失败~"); } } public static function componentUpdate($params, $type = 'insert') { Db::beginTransaction(); try { $goodsSku = ''; // 有先删除 if ($type == 'update') { GoodsComponent::where('join_component_master_goods_id', $params['goods_id'])->delete(); $goodsSku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first(); if ($goodsSku) { $goodsSku->goods_sku_market_price = $params['goods_market_price'] ?? 0; $goodsSku->goods_sku_sales_price = $params['goods_sales_price'] ?? 0; $goodsSku->save(); } } if ($type == 'insert' || !$goodsSku) { Goods::where('goods_id', $params['goods_id'])->update(['goods_sku_json' => '{"规格": ["标准"]}']); $skuData = [ 'join_sku_goods_id' => $params['goods_id'], 'goods_sku_status' => 'ON', 'goods_sku_specs_json' => '{"规格": "标准"}', 'goods_sku_title' => "标准" . $params['goods_name'], 'goods_sku_market_price' => $params['goods_market_price'] ?? 0, 'goods_sku_sales_price' => $params['goods_sales_price'] ?? 0, ]; GoodsSku::insert($skuData); } $data = []; foreach ($params['goods_content_list'] as $item) { if (!in_array($item['goods_id'], $params['join_component_goods_id'])) { continue; } $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'] ?? '', 'join_component_goods_sku_id' => $item['sku_id'] ?? '', 'goods_component_price' => $item['goods_sales_price'] ?? '', 'goods_component_cover' => $goods->goods_cover, 'goods_component_json' => json_encode(['goods_name' => $item['goods_name'], 'nbr' => $item['nbr'], 'sku_id' => $item['sku_id'] ?? '']), 'goods_component_addtimes' => time() ]; } if ($data) { GoodsComponent::insert($data); } Db::commit(); } catch (\Exception $e) { Db::rollBack(); dump($e->getMessage()); throw new BusinessException("数据写入失败~"); } } /** * @Desc 标签表 * @Author Gorden * @Date 2024/3/11 11:32 * * @param $params * @return void * @throws BusinessException */ public static function labelInsert($params) { $model = new GoodsLabel(); $model->join_label_goods_id = $params['goods_id']; $model->goods_label = $params['goods_label'] ? implode(',', $params['goods_label']) : ''; $model->goods_label_extend_json = !empty($params['goods_label_extend_json']) ? $params['goods_label_extend_json'] : '{}'; if (!$model->save()) { // 异常 throw new BusinessException('数据写入失败~'); } } /** * @Desc 产品运行控制信息表 * @Author Gorden * @Date 2024/3/11 11:38 * * @param $params * @return void * @throws BusinessException */ public static function goodsRunningInsert($params) { try { $model = new GoodsRunning(); $model->join_running_goods_id = $params['goods_id']; $model->goods_running_storage = $params['goods_running_storage'] ?? 0; $model->goods_running_sale = $params['goods_running_sale'] ?? 0; $model->goods_running_off_type = !empty($params['goods_running_off_type']) ? $params['goods_running_off_type'] : ''; $model->goods_running_off_json = !empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T' && !empty($params['goods_off_addtimes']) ? json_encode(['time' => strtotime($params['goods_off_addtimes'])]) : '[]'; if (!$model->save()) { throw new BusinessException('数据写入失败'); } } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException('数据写入失败'); } } /** * @Desc SKU * @Author Gorden * @Date 2024/3/11 12:01 * * @param $params * @return void * @throws BusinessException */ public static function skuInsert($params) { $model = new GoodsSku(); $model->join_sku_goods_id = $params['goods_id']; $model->goods_sku_status = $params['goods_sku_status']; $model->goods_sku_specs_json = $params['goods_sku_specs_json']; $model->goods_sku_title = $params['goods_sku_title']; $model->goods_sku_images_json = $params['goods_sku_images_json']; $model->goods_sku_content = $params['goods_sku_content']; $model->goods_sku_market_price = $params['goods_sku_market_price']; $model->goods_sku_sales_price = $params['goods_sku_sales_price']; $model->goods_sku_storage_json = $params['goods_sku_storage_json']; $model->goods_sku_service_json = $params['goods_sku_service_json']; $model->goods_sku_extend_json = $params['goods_sku_extend_json']; if (!$model->save()) { throw new BusinessException('规格数据写入失败~'); } } /** * @Desc * @Author Gorden * @Date 2024/3/12 8:44 * * @param $params * @return void * @throws BusinessException */ public static function mainUpdate($params) { try { $data = self::inputFilter($params, new Goods()); if (!empty($data['goods_cover'])) { $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']); } $data['goods_on_addtimes'] = isset($data['goods_on_addtimes']) ? strtotime($data['goods_on_addtimes']) : 0; $data['goods_sku_json'] = !empty($params['goods_sku_json_label']) ? json_encode($params['goods_sku_json_label']) : json_encode(['规格' => ['标准']]); $row = Goods::find($data['goods_id']); if ($row->join_goods_category_id != $data['join_goods_category_id']) { $category = SysCategory::where('category_id', $params['join_goods_category_id'])->first(); if (!$category) { throw new BusinessException("产品分类不存在~"); } $data['goods_category'] = $category->category_classify ?? ''; $data['goods_prefix'] = $data['goods_prefix'] ?? ($category->category_name ? '【' . $category->category_name . '】' : ''); } $expressJson = []; if (!empty($params['express_json'])) { if (in_array('express', $params['express_json'])) { $expressJson['express'] = 'Y'; } else { $expressJson['express'] = 'N'; } if (in_array('self', $params['express_json'])) { $expressJson['self'] = 'Y'; } else { $expressJson['self'] = 'N'; } if (in_array('arrival', $params['express_json'])) { $expressJson['arrival'] = 'Y'; } else { $expressJson['arrival'] = 'N'; } $data['goods_express_json'] = json_encode($expressJson); } $attributeJson = []; if (!empty($row->goods_attribute_json)) { $attributeJson = json_decode($row->goods_attribute_json, true); } if (!empty($params['card_main_id'])) { $attributeJson['card_main_id'] = $params['card_main_id']; } $data['goods_attribute_json'] = json_encode($attributeJson, JSON_UNESCAPED_UNICODE); foreach ($data as $key => $val) { $row->{$key} = $val; } $row->goods_updatetimes = time(); $row->updator_user_id = JwtToken::getCurrentId(); $row->save(); } catch (BusinessException $e) { throw new BusinessException($e->getMessage()); } catch (\Exception $e) { dump($e->getTrace()); throw new BusinessException('数据更新异常~1'); } } /** * @Desc * @Author Gorden * @Date 2024/3/12 9:57 * * @param $params * @return void * @throws BusinessException */ public static function detailUpdate($params) { try { $data = self::inputFilter($params, new GoodsDetail()); if (!empty($data['goods_detail_slider_json'])) { $data['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_detail_slider_json']); $data['goods_detail_slider_json'] = json_encode(['slider' => $data['goods_detail_slider_json']]); } if (isset($params['curriculum'])) { $data['goods_detail_specs_json'] = json_encode([ [ 'key' => '课时', 'val' => $params['curriculum']['period'] ?? '', ], [ 'key' => '群体', 'val' => $params['curriculum']['group'] ?? '', ], [ 'key' => '课程', 'val' => $params['curriculum']['course'] ?? '', ], ]); } // 根据goods_id 查详情ID $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first(); if ($detail) { self::doUpdate($detail->join_detail_goods_id, $data, new GoodsDetail()); } else { $data['join_detail_goods_id'] = $params['goods_id']; GoodsDetail::insert($data); } } catch (BusinessException $e) { throw new BusinessException($e->getMessage()); } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException('轮播图/详情数据更新异常~'); } } /** * @Desc * @Author Gorden * @Date 2024/3/12 9:58 * * @param $params * @return void * @throws BusinessException */ public static function labelUpdate($params) { try { $data = self::inputFilter($params, new GoodsLabel()); // 根据goods_id 查详情ID $detail = GoodsLabel::where('join_label_goods_id', $params['goods_id'])->first(); if ($detail) { self::doUpdate($detail->goods_label_id, $data, new GoodsLabel()); } else { $data['join_label_goods_id'] = $params['goods_id']; GoodsLabel::insert($data); } } catch (BusinessException $e) { throw new BusinessException($e->getMessage()); } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException('数据更新异常~3'); } } /** * @Desc * @Author Gorden * @Date 2024/3/12 9:59 * * @param $params * @return void * @throws BusinessException */ public static function goodsRunningUpdate($params) { try { $data = self::inputFilter($params, new GoodsRunning()); // 根据goods_id 查详情ID $detail = GoodsRunning::where('join_running_goods_id', $params['goods_id'])->first(); if (!empty($params['goods_running_off_type']) && $params['goods_running_off_type'] == 'T') { $redis = Redis::connection(); if (!empty($detail->goods_running_off_json)) { $goodsRunningOffJson = json_decode($detail->goods_running_off_json, true); if (isset($goodsRunningOffJson['time'])) { $oldKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', $goodsRunningOffJson['time']); $goodsRunningOffJson['time'] = strtotime($params['goods_off_addtimes']); $data['goods_running_off_json'] = json_encode($goodsRunningOffJson); // 有老的下架时间,删除老的 $redis->srem($oldKey, $params['goods_id']); } else { $goodsRunningOffJson['time'] = strtotime($params['goods_off_addtimes']); $data['goods_running_off_json'] = json_encode($goodsRunningOffJson); } } else { $data['goods_running_off_json'] = json_encode(['time' => strtotime($params['goods_off_addtimes'])]); } // 加入自动下架 $newKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', strtotime($params['goods_off_addtimes'])); $redis->sAdd($newKey, $params['goods_id']); } else if (!empty($params['goods_running_off_type']) && !empty($detail->goods_running_off_type) && $params['goods_running_off_type'] == 'H' && $detail->goods_running_off_type == 'T') { $goodsRunningOffJson = json_decode($detail->goods_running_off_json, true); if (isset($goodsRunningOffJson['time'])) { $oldKey = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi', $goodsRunningOffJson['time']); $redis = Redis::connection(); $redis->srem($oldKey, $params['goods_id']); } } if ($detail) { self::doUpdate($detail->join_running_goods_id, $data, new GoodsRunning()); } else { // 兼容老数据…… $data['join_running_goods_id'] = $params['goods_id']; GoodsRunning::insert($data); } } catch (BusinessException $e) { throw new BusinessException($e->getMessage()); } catch (\Exception $e) { dump($e->getMessage()); throw new BusinessException('数据更新异常~'); } } /** * @Desc sku 设置 * @Author Gorden * @Date 2024/4/10 10:43 * * @param $params * @return void * @throws BusinessException */ public static function goodsSkuSet($params, $operation = 'insert') { try { Db::beginTransaction(); $skusOldIds = []; if ($operation == 'update') { // 查出所有的 $skusOldIds = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->pluck('goods_sku_id', 'goods_sku_id'); // 删掉原有的 // GoodsSku::where('join_sku_goods_id', $params['goods_id'])->delete(); } if (empty($skusOldIds) && empty($params['goods_sku_json_value'])) { $skuData = [ 'join_sku_goods_id' => $params['goods_id'], 'goods_sku_status' => 'ON', 'goods_sku_specs_json' => '{"规格": "标准"}', 'goods_sku_title' => "标准" . $params['goods_name'], 'goods_sku_market_price' => $params['goods_market_price'] ?? 0, 'goods_sku_sales_price' => $params['goods_sales_price'] ?? 0, ]; GoodsSku::insert($skuData); } // 入新的 if (!empty($params['goods_sku_json_value'])) { foreach ($params['goods_sku_json_value'] as $item) { $skus = explode(',', $item['sku']); $skuArr = []; for ($i = 1; $i <= count($skus); $i++) { $skuName = "skuName" . $i; $key = $item[$skuName]; $skuArr[$key] = $skus[$i - 1]; } $specsJson = json_encode($skuArr); $skuTitle = str_replace('-', ',', $item['sku']) . $params['goods_name']; if ($operation == 'update' && !empty($item['sku_id'])) { $model = GoodsSku::where('goods_sku_id', $item['sku_id'])->where('goods_sku_status', 'ON')->first(); if (!$model) { $model = new GoodsSku(); } else { unset($skusOldIds[$model->goods_sku_id]); } } else { $model = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_status', 'ON')->where('goods_sku_title', $skuTitle)->first(); if (!$model) { $model = new GoodsSku(); } else { unset($skusOldIds[$model->goods_sku_id]); } } $model->join_sku_goods_id = $params['goods_id']; $model->goods_sku_status = $params['goods_status']; $model->goods_sku_specs_json = $specsJson; $model->goods_sku_title = $skuTitle; $model->goods_sku_market_price = $params['goods_market_price'] ?? 0; $model->goods_sku_sales_price = $item['price']; $model->goods_sku_storage_json = json_encode(['storage' => $item['stock']]); $model->save(); } } if ($operation == 'update' && !empty($skusOldIds)) { // GoodsSku::whereIn('goods_sku_id', $skusOldIds)->delete(); GoodsSku::whereIn('goods_sku_id', $skusOldIds)->update(['goods_sku_status' => 'DISABLED']); } Db::commit(); } catch (\Exception $e) { dump($e->getTrace()); Db::rollBack(); throw new BusinessException('规格数据更新异常~'); } } /** * @Desc * @Author Gorden * @Date 2024/3/12 8:45 * * @param array $data * @param $model * @return array * @throws BusinessException */ private static function inputFilter(array $data, $model): array { $table = config('database.connections.mysql.prefix') . $model->getTable(); $allow_column = $model->getConnection()->select("desc `$table`"); if (!$allow_column) { throw new BusinessException('表不存在', 2); } $columns = array_column($allow_column, 'Type', 'Field'); foreach ($data as $col => $item) { if (!isset($columns[$col])) { unset($data[$col]); continue; } // 非字符串类型传空则为null if ($item === '' && strpos(strtolower($columns[$col]), 'varchar') === false && strpos(strtolower($columns[$col]), 'text') === false) { $data[$col] = null; } if (is_array($item)) { $data[$col] = implode(',', $item); } if ($item != '' && (strpos(strtolower($columns[$col]), 'varchar') || strpos(strtolower($columns[$col]), 'text'))) { // $data[$col] = htmlspecialchars($item); } } if (empty($data['created_at'])) { unset($data['created_at']); } if (empty($data['updated_at'])) { unset($data['updated_at']); } return $data; } /** * @Desc 执行更新 * @Author Gorden * @Date 2024/3/12 8:43 * * @param $id * @param $data * @param $model * @return void */ private static function doUpdate($id, $data, $model) { $row = $model->find($id); foreach ($data as $key => $val) { $row->{$key} = $val; } $row->save(); } /** * @Desc 上架定时 * @Author Gorden * @Date 2024/4/11 15:13 * * @return void */ public static function checkListing() { $key = Goods::LISTING_KEY_PREFIX . date('YmdHi'); $redis = Redis::connection(); if (!$redis->exists($key)) { return; } $goodsIds = $redis->sMembers($key); if (Goods::whereIn('goods_id', $goodsIds)->update(['goods_status' => 'ON'])) { $redis->del($key); } } /** * @Desc 自动下架 * @Author Gorden * @Date 2024/4/26 15:26 * * @return void */ public static function checkOffListing() { $key = Goods::LISTING_OFF_KEY_PREFIX . date('YmdHi'); $redis = Redis::connection(); if (!$redis->exists($key)) { return; } $goodsIds = $redis->sMembers($key); if (Goods::whereIn('goods_id', $goodsIds)->update(['goods_status' => 'OFF'])) { $redis->del($key); } } public static $week = [ '周一' => 1, '周二' => 2, '周三' => 3, '周四' => 4, '周五' => 5, '周六' => 6, '周日' => 7, ]; }