$post['name'], 'code' => $post['code'], 'first_category_id' => $post['first_category_id'], 'second_category_id' => $post['second_category_id'], 'third_category_id' => $post['third_category_id'], 'brand_id' => $post['brand_id'], 'supplier_id' => $post['supplier_id'], 'image' => $post['image'], 'video' => $video, 'poster' => $post['poster'] ?? '', 'remark' => $post['remark'], 'content' => $post['content'], 'max_price' => $max_price, 'min_price' => $min_price, 'market_price' => $market_price, 'stock' => $total_stock, 'status' => $post['status'], 'virtual_sales_sum' => $post['virtual_sales_sum'], 'virtual_click' => $post['virtual_click'] ?? 0, 'stock_warn' => $post['stock_warn'], 'is_show_stock' => $post['is_show_stock'], 'free_shipping_type' => $post['free_shipping_type'], 'free_shipping' => $free_shipping, 'free_shipping_template_id' => $free_shipping_template_id, 'is_new' => isset($post['is_new']) && $post['is_new'] == 'on' ? 1 : 0, 'is_best' => isset($post['is_best']) && $post['is_best'] == 'on' ? 1 : 0, 'is_like' => isset($post['is_like']) && $post['is_like'] == 'on' ? 1 : 0, 'is_integral' => $post['is_integral'], 'is_member' => $post['is_member'], 'give_integral_type' => $give_integral_type, 'give_integral' => $give_integral, 'spec_type' => $post['spec_type'], 'create_time' => $time, 'is_express' => isset($post['is_express']) && $post['is_express'] == 'on' ? 1 : 0, 'is_selffetch' => isset($post['is_selffetch']) && $post['is_selffetch'] == 'on' ? 1 : 0, ]; $goods_id = Db::name('goods')->insertGetId($data); //写入图片表 $data = []; foreach ($post['goods_image'] as $k => $v) { $data[] = [ 'goods_id' => $goods_id, 'uri' => $v, ]; } Db::name('goods_image')->insertAll($data); //写入规格表 if ($post['spec_type'] == 1) { //单规格写入 $goods_spec_id = Db::name('goods_spec') ->insertGetId(['goods_id' => $goods_id, 'name' => '默认']); $goods_spec_value_id = Db::name('goods_spec_value') ->insertGetId(['spec_id' => $goods_spec_id, 'goods_id' => $goods_id, 'value' => '默认']); $data = [ 'image' => $post['one_spec_image'], 'goods_id' => $goods_id, 'spec_value_ids' => $goods_spec_value_id, 'spec_value_str' => '默认', 'market_price' => $post['one_market_price'], 'price' => $post['one_price'], 'cost_price' => $post['one_cost_price'], 'stock' => $post['one_stock'], 'volume' => $post['one_volume'], 'weight' => $post['one_weight'], 'bar_code' => $post['one_bar_code'], ]; Db::name('goods_item') ->insert($data); } else { //多规格写入 $goods_specs = []; foreach ($post['spec_name'] as $k => $v) { $temp = ['goods_id' => $goods_id, 'name' => $v]; $goods_specs[] = $temp; } Db::name('goods_spec')->insertAll($goods_specs); $goods_spec_name_key_id = Db::name('goods_spec') ->where(['goods_id' => $goods_id]) ->where('name', 'in', $post['spec_name']) ->column('id', 'name'); $data = []; $check_values = []; //检查规格项是否存在相同值,相同值会出现错误 foreach ($post['spec_values'] as $k => $v) { $row = explode(',', $v); foreach ($row as $k2 => $v2) { if (in_array($v2, $check_values)) { throw new Exception('请勿添加相同规格值'); } $temp = [ 'goods_id' => $goods_id, 'spec_id' => $goods_spec_name_key_id[$post['spec_name'][$k]], 'value' => $v2, ]; $data[] = $temp; $check_values[] = $v2; } } Db::name('goods_spec_value')->insertAll($data); $goods_spec_name_value_id = Db::name('goods_spec_value') ->where(['goods_id' => $goods_id]) ->column('id', 'value'); foreach ($spec_lists as $k => $v) { $spec_lists[$k]['spec_value_ids'] = ''; $temp = explode(',', $v['spec_value_str']); foreach ($temp as $k2 => $v2) { $spec_lists[$k]['spec_value_ids'] .= $goods_spec_name_value_id[$v2] . ','; } $spec_lists[$k]['spec_value_ids'] = trim($spec_lists[$k]['spec_value_ids'], ','); // $spec_lists[$k]['image'] = $spec_lists[$k]['spec_image']; $spec_lists[$k]['goods_id'] = $goods_id; // unset($spec_lists[$k]['spec_image']); unset($spec_lists[$k]['spec_id']); unset($spec_lists[$k]['item_id']); } Db::name('goods_item')->insertAll($spec_lists); } Db::commit(); return true; } catch (Exception $e) { Db::rollback(); return $e->getMessage(); } } /** * 编辑商品 * @param $post * @param $spec_lists * @return bool */ public static function edit($post, $spec_lists) { try { Db::startTrans(); $oldItemIds = GoodsItem::where('goods_id', $post['id'])->column('id'); $time = time(); //算出最大最小价格 if ($post['spec_type'] == 1) { $max_price = $post['one_price']; $min_price = $post['one_price']; $market_price = $post['one_market_price']; $total_stock = $post['one_stock']; } else { $max_price = max($post['price']); $min_price = min($post['price']); $min_price_key = array_search($min_price,$post['price']); $market_price = $post['market_price'][$min_price_key]; $total_stock = array_sum($post['stock']); } $free_shipping = $post['free_shipping_type'] == 2 ? $post['free_shipping']: ''; $free_shipping_template_id = $post['free_shipping_type'] == 3 ? $post['free_shipping_template_id']: ''; $old_spec_type = Db::name('goods') ->where('id', $post['id']) ->value('spec_type'); // 替换内容中图片地址 $domain = UrlServer::getFileUrl('/'); $post['content'] = str_replace($domain, '/', $post['content']); //赠送积分 $give_integral_type = $post['give_integral_type'] ?? 0; switch ($give_integral_type){ case 1: $give_integral = empty($post['give_integral_num']) ? 0 : $post['give_integral_num']; break; case 2: $give_integral = empty($post['give_integral_ratio']) ? 0 : $post['give_integral_ratio']; break; default: $give_integral = 0; } $video = isset($post['video']) ? UrlServer::setFileUrl($post['video']) : ''; //写入主表 $data = [ 'name' => $post['name'], 'code' => $post['code'], 'first_category_id' => $post['first_category_id'], 'second_category_id' => $post['second_category_id'], 'third_category_id' => $post['third_category_id'], 'brand_id' => $post['brand_id'], 'supplier_id' => $post['supplier_id'], 'image' => $post['image'], 'video' => $video, 'poster' => $post['poster'] ?? '', 'remark' => $post['remark'], 'content' => $post['content'], 'max_price' => $max_price, 'min_price' => $min_price, 'market_price' => $market_price, 'stock' => $total_stock, 'status' => $post['status'], 'virtual_sales_sum' => $post['virtual_sales_sum'], 'virtual_click' => $post['virtual_click'] ?? 0, 'stock_warn' => $post['stock_warn'], 'is_show_stock' => $post['is_show_stock'], 'free_shipping_type' => $post['free_shipping_type'], 'free_shipping' => $free_shipping, 'free_shipping_template_id' => $free_shipping_template_id, 'is_new' => isset($post['is_new']) && $post['is_new'] == 'on' ? 1 : 0, 'is_best' => isset($post['is_best']) && $post['is_best'] == 'on' ? 1 : 0, 'is_like' => isset($post['is_like']) && $post['is_like'] == 'on' ? 1 : 0, 'is_integral' => $post['is_integral'], 'is_member' => $post['is_member'], 'give_integral_type' => $give_integral_type, 'give_integral' => $give_integral, 'spec_type' => $post['spec_type'], 'update_time' => $time, 'is_express' => isset($post['is_express']) && $post['is_express'] == 'on' ? 1 : 0, 'is_selffetch' => isset($post['is_selffetch']) && $post['is_selffetch'] == 'on' ? 1 : 0, ]; Db::name('goods') ->where(['id' => $post['id']]) ->update($data); // 下架或删除商品,更新商品收藏 if ($data['status'] != 1) { Hook::listen('update_collect', ['goods_id' => $post['id']]); } //重新更新图片表 Db::name('goods_image') ->where(['goods_id' => $post['id']]) ->delete(); $data = []; foreach ($post['goods_image'] as $k => $v) { $data[] = [ 'goods_id' => $post['id'], 'uri' => $v, ]; } Db::name('goods_image')->insertAll($data); //写入规格表 if ($post['spec_type'] == 1) { //单规格写入 if ($old_spec_type == 1) { //原来是单规格 $data = [ 'image' => $post['one_spec_image'], 'price' => $post['one_price'], 'market_price' => $post['one_market_price'], 'cost_price' => $post['one_cost_price'], 'stock' => $post['one_stock'], 'volume' => $post['one_volume'], 'weight' => $post['one_weight'], 'bar_code' => $post['one_bar_code'], ]; Db::name('goods_item') ->where(['goods_id' => $post['id']]) ->update($data); } else { //原来非单规格 //删除多规格 Db::name('goods_spec') ->where('goods_id', $post['id']) ->delete(); Db::name('goods_spec_value') ->where('goods_id', $post['id']) ->delete(); Db::name('goods_item') ->where('goods_id', $post['id']) ->delete(); $goods_spec_id = Db::name('goods_spec') ->insertGetId(['goods_id' => $post['id'], 'name' => '默认']); $goods_spec_value_id = Db::name('goods_spec_value') ->insertGetId(['spec_id' => $goods_spec_id, 'goods_id' => $post['id'], 'value' => '默认']); $data = [ 'image' => $post['one_spec_image'], 'goods_id' => $post['id'], 'spec_value_ids' => $goods_spec_value_id, 'spec_value_str' => '默认', 'market_price' => $post['one_market_price'], 'cost_price' => $post['one_cost_price'], 'price' => $post['one_price'], 'stock' => $post['one_stock'], 'volume' => $post['one_volume'], 'weight' => $post['one_weight'], 'bar_code' => $post['one_bar_code'], ]; Db::name('goods_item') ->insert($data); } } else { $goods_specs = []; foreach ($post['spec_name'] as $k => $v) { $temp = ['goods_id' => $post['id'], 'name' => $v, 'spec_id' => $post['spec_id'][$k]]; $goods_specs[] = $temp; } $new_spec_name_ids = []; foreach ($goods_specs as $k => $v) { if ($v['spec_id']) { //更新规格名 Db::name('goods_spec') ->where(['goods_id' => $post['id'], 'id' => $v['spec_id']]) ->update(['name' => $v['name']]); $new_spec_name_ids[] = $v['spec_id']; } else { //添加规格名 $new_spec_name_ids[] = Db::name('goods_spec') ->insertGetId(['goods_id' => $post['id'], 'name' => $v['name']]); } } //删除规格名 $all_spec_ids = Db::name('goods_spec') ->where('goods_id', $post['id']) ->column('id'); $del_spec_name_ids = array_diff($all_spec_ids, $new_spec_name_ids); if (!empty($del_spec_name_ids)) { Db::name('goods_spec') ->where('goods_id', $post['id']) ->where('id', 'in', $del_spec_name_ids) ->delete(); } $new_spec_value_ids = []; $goods_spec_name_key_id = Db::name('goods_spec') ->where(['goods_id' => $post['id']]) ->where('name', 'in', $post['spec_name']) ->column('id', 'name'); $check_values = [];//检查规格值是否存在相同 foreach ($post['spec_values'] as $k => $v) { $value_id_row = explode(',', $post['spec_value_ids'][$k]); $value_row = explode(',', $v); foreach ($value_row as $k2 => $v2) { if (in_array($v2, $check_values)) { throw new Exception('请勿添加相同规格值'); } $temp = [ 'goods_id' => $post['id'], 'spec_id' => $goods_spec_name_key_id[$post['spec_name'][$k]], 'value' => $v2, ]; $check_values[] = $v2; if ($value_id_row[$k2]) { //更新规格值 Db::name('goods_spec_value') ->where(['id' => $value_id_row[$k2]]) ->update($temp); $new_spec_value_ids[] = $value_id_row[$k2]; } else { //添加规格值 $new_spec_value_ids[] = Db::name('goods_spec_value') ->insertGetId($temp); } } } $all_spec_value_ids = Db::name('goods_spec_value') ->where('goods_id', $post['id']) ->column('id'); $del_spec_value_ids = array_diff($all_spec_value_ids, $new_spec_value_ids); if (!empty($del_spec_value_ids)) { //删除规格值 Db::name('goods_spec_value') ->where('goods_id', $post['id']) ->where('id', 'in', $del_spec_value_ids) ->delete(); } $new_item_id = []; $goods_spec_name_value_id = Db::name('goods_spec_value') ->where(['goods_id' => $post['id']]) ->column('id', 'value'); foreach ($spec_lists as $k => $v) { $spec_lists[$k]['spec_value_ids'] = ''; $temp = explode(',', $v['spec_value_str']); foreach ($temp as $k2 => $v2) { $spec_lists[$k]['spec_value_ids'] .= $goods_spec_name_value_id[$v2] . ','; } $spec_lists[$k]['spec_value_ids'] = trim($spec_lists[$k]['spec_value_ids'], ','); $spec_lists[$k]['image'] = str_replace(UrlServer::getFileUrl('/'), '', $spec_lists[$k]['spec_image']); unset($spec_lists[$k]['spec_image']); $spec_lists[$k]['goods_id'] = $post['id']; unset($spec_lists[$k]['spec_id']); $item_id = $spec_lists[$k]['item_id']; unset($spec_lists[$k]['item_id']); if ($item_id) { Db::name('goods_item') ->where(['id' => $item_id]) ->update($spec_lists[$k]); $new_item_id[] = $item_id; } else { $new_item_id[] = Db::name('goods_item') ->insertGetId($spec_lists[$k]); } } $all_item_id = Db::name('goods_item') ->where('goods_id', $post['id']) ->column('id'); $del_item_ids = array_diff($all_item_id, $new_item_id); if (!empty($del_item_ids)) { //删除规格值 Db::name('goods_item') ->where('goods_id', $post['id']) ->where('id', 'in', $del_item_ids) ->delete(); } } $newItemIds = GoodsItem::where('goods_id', $post['id'])->column('id'); $destroyIds = DistributionGoods::where('goods_id', $post['id'])->column('id'); // 删除原来的分销设置 if ($oldItemIds != $newItemIds && $destroyIds) { DistributionGoods::destroy($destroyIds); self::$error = '商品信息修改成功,该商品属于分销商品,请重新设置分销信息'; } Db::commit(); return true; } catch (Exception $e) { Db::rollback(); return $e->getMessage(); } } /** * @notes 删除 * @param array $params * @return bool * @author likeadmin * @date 2025/05/08 15:34 */ public static function delete(array $params): bool { return Goods::destroy($params['id']); } /** * @notes 获取详情 * @param $params * @return array * @author likeadmin * @date 2025/05/08 15:34 */ public static function detail($params): array { return Goods::findOrEmpty($params['id'])->toArray(); } /* * 商品信息 */ /** * 获取商品信息 * @param $goods_id * @return array */ public static function info($goods_id) { $info['base'] = Db::name('goods') ->where(['id' => $goods_id]) ->withAttr('abs_image', function ($value, $data) { return UrlServer::getFileUrl($data['image']); }) ->withAttr('content', function ($value){ $preg = '/()/is'; $local_url = UrlServer::getFileUrl('/'); return preg_replace($preg, "\${1}$local_url\${2}\${3}",$value); }) ->withAttr('abs_video',function ($value,$data){ if($data['video']){ return UrlServer::getFileUrl($data['video']); } return ''; }) ->withAttr('abs_poster',function ($value,$data){ if($data['poster']){ return UrlServer::getFileUrl($data['poster']); } return ''; }) ->append(['abs_image','abs_video'])->find(); $info['base']['goods_image'] = Db::name('goods_image') ->where(['goods_id' => $goods_id]) ->withAttr('abs_image', function ($value, $data) { return UrlServer::getFileUrl($data['uri']);}) ->append(['abs_image']) ->select(); $info['item'] = Db::name('goods_item') ->where(['goods_id' => $goods_id]) ->select(); $info['spec'] = Db::name('goods_spec') ->where(['goods_id' => $goods_id]) ->select(); $spec_value = Db::name('goods_spec_value') ->where(['goods_id' => $goods_id]) ->select(); $data = []; foreach ($spec_value as $k => $v) { $data[$v['spec_id']][] = $v; } $info['spec'] = $info['spec']->toArray(); foreach ($info['spec'] as $k => $v) { $info['spec'][$k]['values'] = isset($data[$v['id']]) ? $data[$v['id']] : []; } return $info; } }