1, 'name' => '实物商品'); private $goods_state = array( 1 => '正常', 0 => '下架' ); private $verify_state = array( 1 => '已审核', 0 => '待审核', -2 => '审核失败', 10 => '违规下架' ); public function getGoodsState() { return $this->goods_state; } public function getVerifyState() { return $this->verify_state; } /** * 商品添加 * @param $data */ public function addGoods($data) { model('supply_goods')->startTrans(); try { //SKU商品数据(图片数据) $goods_image = $data['goods_image']; if (!empty($data['goods_sku_data'])) { $data['goods_sku_data'] = json_decode($data['goods_sku_data'], true); if (empty($goods_image)) { $goods_image = $data['goods_sku_data'][0]['sku_image']; } } //规格排序 if (!empty($data['goods_attr_format'])) { $goods_attr_format = json_decode($data['goods_attr_format'], true); $keys = array_column($goods_attr_format, 'sort'); if (!empty($keys)) { array_multisort($keys, SORT_ASC, SORT_NUMERIC, $goods_attr_format); $data['goods_attr_format'] = json_encode($goods_attr_format); } } //todo 商品的分佣比率是通过选择的分类来计算的 $goods_category_model = new GoodsCategory(); $category_array = $data['category_array']; $last_category_id = end($category_array); $goods_category_info = $goods_category_model->getCategoryInfo([['category_id', '=', $last_category_id]], 'supply_commission_rate, category_full_name')['data'] ?? []; if (empty($goods_category_info)) { model('goods')->rollback(); return $this->error([], '您选择的分类不存在'); } $commission_rate = $goods_category_info['supply_commission_rate'] ?? 0; $category_name = $goods_category_info['category_full_name'] ?? ''; $goods_data['category_name'] = $category_name; $sku_arr = array(); $goods_stock = 0; //添加sku商品 $all_temp_array = []; foreach ($data['goods_sku_data'] as $item) { //价格阶梯price_json $price_json = $item['price_json'] ?? ''; if (empty($price_json)) { model('supply_goods')->rollback(); return $this->error([], '阶梯价格不能为空!'); } $price_array = json_decode($price_json, true); array_multisort(array_column($price_array, 'num'), SORT_ASC, $price_array); $price_json = json_encode($price_array); $num_column = array_column($price_array, 'num'); $price_column = array_column($price_array, 'price'); if (count($num_column) != count(array_unique($num_column))) { model("supply_goods")->rollback(); return $this->error([], '规格阶梯价格的数量不能重复!'); } $min_price = min($price_column); $max_price = max($price_column); $min_num = min($num_column); $sku_data = array( 'sku_name' => $data['goods_name'] . ' ' . $item['spec_name'], 'spec_name' => $item['spec_name'], 'sku_no' => $item['sku_no'], 'sku_spec_format' => !empty($item['sku_spec_format']) ? json_encode($item['sku_spec_format']) : "", 'market_price' => $item['market_price'], 'cost_price' => $item['cost_price'], 'goods_supplier_format' => $item['goods_supplier_format'] ?? '', 'extend_sku_id' => $item['extend_sku_id'] ?? '', 'stock' => $item['stock'], 'weight' => $item['weight'], 'volume' => $item['volume'], 'sku_image' => $item['sku_image'], 'sku_images' => $item['sku_images'], 'price_json' => $price_json, 'min_price' => $min_price, 'price' => $min_price, 'max_price' => $max_price, 'min_num' => $min_num, 'site_id' => $data['site_id'], 'site_name' => $data['site_name'], 'stock_alarm' => $item['stock_alarm'], 'is_default' => $item['is_default'] ?? 0, ); $sku_arr[] = $sku_data; $all_temp_array = array_merge($all_temp_array, $price_array); $goods_stock += $item['stock']; } //比对 $all_min_price = min(array_column($all_temp_array, 'price')); $all_max_price = max(array_column($all_temp_array, 'price')); $all_min_num = min(array_column($all_temp_array, 'num')); $goods_data = array( 'goods_image' => $goods_image, 'goods_stock' => $goods_stock, 'extend_goods_id' => $data['extend_goods_id'] ?? '', 'market_price' => $data['goods_sku_data'][0]['market_price'], 'cost_price' => $data['goods_sku_data'][0]['cost_price'], 'goods_spec_format' => $data['goods_spec_format'], 'category_id' => $data['category_id'],//分类id 'category_json' => $data['category_json'],//分类json 'goods_supplier_format' => $data['goods_supplier_format'] ?? '',//分类json 'timer_on' => $data['timer_on'] ?? 0,//定时上线 'timer_off' => $data['timer_off'] ?? 0,//定时下线 'min_price' => $all_min_price, 'price' => $all_min_price, 'max_price' => $all_max_price, 'min_num' => $all_min_num, 'commission_rate' => $commission_rate, ); $common_data = array( 'goods_name' => $data['goods_name'], 'goods_class' => $this->goods_class['id'], 'goods_class_name' => $this->goods_class['name'], 'goods_attr_class' => $data['goods_attr_class'], 'goods_attr_name' => $data['goods_attr_name'], 'site_id' => $data['site_id'], 'goods_content' => $data['goods_content'], 'goods_state' => $data['goods_state'], 'goods_stock_alarm' => $data['goods_stock_alarm'], 'is_free_shipping' => $data['is_free_shipping'], 'shipping_template' => $data['shipping_template'], 'goods_attr_format' => $data['goods_attr_format'], 'introduction' => $data['introduction'], 'keywords' => $data['keywords'], 'unit' => $data['unit'], 'video_url' => $data['video_url'], 'create_time' => time(), 'is_own' => $data['is_own'], 'brand_id' => $data['brand_id'], 'brand_name' => $data['brand_name'], 'verify_state' => $data['verify_state'], 'site_name' => $data['site_name'], 'website_id' => $data['website_id'], 'channel_type' => $data['channel_type'] ?? '', ); $goods_id = model('supply_goods')->add(array_merge($goods_data, $common_data)); //添加sku商品 foreach ($sku_arr as $sku_k => $item) { $item['goods_id'] = $goods_id; $sku_arr[$sku_k] = array_merge($common_data, $item); } model('supply_goods_sku')->addList($sku_arr); // 赋值第一个商品sku_id $first_info = model('supply_goods_sku')->getFirstData(['goods_id' => $goods_id], 'sku_id', 'is_default desc,sku_id asc'); model('supply_goods')->update(['sku_id' => $first_info['sku_id'], 'extend_goods_id' => $goods_id], [['goods_id', '=', $goods_id]]); if (!empty($data['goods_spec_format'])) { //刷新SKU商品规格项/规格值JSON字符串 $this->dealGoodsSkuSpecFormat($goods_id, $data['goods_spec_format']); } $cron = new Cron(); //定时上下架 if ($goods_data['timer_on'] > 0) { $cron->addCron(1, 0, "供应商商品定时上架", "CronSupplyGoodsTimerOn", $goods_data['timer_on'], $goods_id); } if ($goods_data['timer_off'] > 0) { $cron->addCron(1, 0, "供应商商品定时下架", "CronSupplyGoodsTimerOff", $goods_data['timer_off'], $goods_id); } //添加供应商添加统计 //添加统计 //todo 供应商统计 $stat = new Stat(); $stat->addShopStat(['add_goods_count' => 1, 'site_id' => $data['site_id']]); model('supply_goods')->commit(); return $this->success($goods_id); } catch (\Exception $e) { model('supply_goods')->rollback(); return $this->error($e->getMessage() . $e->getFile() . $e->getLine()); } } /** * 商品编辑 * @param $data */ public function editGoods($data) { model('supply_goods')->startTrans(); try { $goods_id = $data['goods_id']; //SKU商品数据(图片数据) $goods_image = $data['goods_image']; if (!empty($data['goods_sku_data'])) { $data['goods_sku_data'] = json_decode($data['goods_sku_data'], true); if (empty($goods_image)) { $goods_image = $data['goods_sku_data'][0]['sku_image']; } } //规格排序 if (!empty($data['goods_attr_format'])) { $goods_attr_format = json_decode($data['goods_attr_format'], true); $keys = array_column($goods_attr_format, 'sort'); if (!empty($keys)) { array_multisort($keys, SORT_ASC, SORT_NUMERIC, $goods_attr_format); $data['goods_attr_format'] = json_encode($goods_attr_format); } } //todo 商品的分佣比率是通过选择的分类来计算的 $goods_category_model = new GoodsCategory(); $category_array = $data['category_array']; $last_category_id = end($category_array); $goods_category_info = $goods_category_model->getCategoryInfo([['category_id', '=', $last_category_id]], 'supply_commission_rate, category_full_name')['data'] ?? []; if (empty($goods_category_info)) { model('goods')->rollback(); return $this->error([], '您选择的分类不存在'); } $commission_rate = $goods_category_info['supply_commission_rate'] ?? 0; $category_name = $goods_category_info['category_full_name'] ?? ''; $goods_data['category_name'] = $category_name; $sku_arr = array(); //添加sku商品 $all_temp_array = []; $goods_stock = 0; foreach ($data['goods_sku_data'] as $item) { //价格阶梯price_json $price_json = $item['price_json'] ?? ''; if (empty($price_json)) { model('supply_goods')->rollback(); return $this->error([], '阶梯价格不能为空!'); } $price_array = json_decode($price_json, true); array_multisort(array_column($price_array, 'num'), SORT_ASC, $price_array); $price_json = json_encode($price_array); $num_column = array_column($price_array, 'num'); $price_column = array_column($price_array, 'price'); if (count($num_column) != count(array_unique($num_column))) { model("supply_goods")->rollback(); return $this->error([], '规格阶梯价格的数量不能重复!'); } $min_price = min($price_column); $max_price = max($price_column); $min_num = min($num_column); $sku_data = array( 'sku_name' => $data['goods_name'] . ' ' . $item['spec_name'], 'spec_name' => $item['spec_name'], 'sku_no' => $item['sku_no'], 'sku_spec_format' => !empty($item['sku_spec_format']) ? json_encode($item['sku_spec_format']) : "", 'goods_supplier_format' => $item['goods_supplier_format'] ?? '', 'extend_sku_id' => $item['extend_sku_id'] ?? '', 'price_json' => $item['price_json'], 'market_price' => $item['market_price'], 'cost_price' => $item['cost_price'], 'stock' => $item['stock'], 'weight' => $item['weight'], 'volume' => $item['volume'], 'sku_image' => $item['sku_image'], 'sku_images' => $item['sku_images'], 'min_price' => $min_price, 'price' => $min_price, 'max_price' => $max_price, 'min_num' => $min_num, 'site_id' => $data['site_id'], 'site_name' => $data['site_name'], 'stock_alarm' => $item['stock_alarm'], 'is_default' => $item['is_default'] ?? 0, ); $goods_stock += $item['stock']; $item_sku_id = $item['sku_id'] ?? 0; if ($item_sku_id > 0) { $sku_arr[$item_sku_id] = $sku_data; } else { $sku_arr[] = $sku_data; } $all_temp_array = array_merge($all_temp_array, $price_array); } //比对 $all_min_price = min(array_column($all_temp_array, 'price')); $all_max_price = max(array_column($all_temp_array, 'price')); $all_min_num = min(array_column($all_temp_array, 'num')); $goods_data = array( 'extend_goods_id' => $data['extend_goods_id'] ?? $goods_id, 'goods_image' => $goods_image, 'goods_stock' => $goods_stock, 'market_price' => $data['goods_sku_data'][0]['market_price'], 'cost_price' => $data['goods_sku_data'][0]['cost_price'], 'goods_spec_format' => $data['goods_spec_format'], 'category_id' => $data['category_id'],//分类id 'category_json' => $data['category_json'],//分类json 'timer_on' => $data['timer_on'] ?? 0,//定时上线 'timer_off' => $data['timer_off'] ?? 0,//定时下线 'min_price' => $all_min_price, 'price' => $all_min_price, 'max_price' => $all_max_price, 'min_num' => $all_min_num, 'commission_rate' => $commission_rate,//佣金比率 (只有商品主表有分佣比率) ); $common_data = array( 'goods_name' => $data['goods_name'], 'goods_class' => $this->goods_class['id'], 'goods_class_name' => $this->goods_class['name'], 'goods_attr_class' => $data['goods_attr_class'], 'goods_attr_name' => $data['goods_attr_name'], 'site_id' => $data['site_id'], 'goods_content' => $data['goods_content'], 'goods_state' => $data['goods_state'], 'goods_stock_alarm' => $data['goods_stock_alarm'], 'is_free_shipping' => $data['is_free_shipping'], 'shipping_template' => $data['shipping_template'], 'goods_attr_format' => $data['goods_attr_format'], 'introduction' => $data['introduction'], 'keywords' => $data['keywords'], 'unit' => $data['unit'], 'video_url' => $data['video_url'], 'create_time' => time(), 'is_own' => $data['is_own'], 'brand_id' => $data['brand_id'], 'brand_name' => $data['brand_name'], 'verify_state' => $data['verify_state'], 'site_name' => $data['site_name'], 'website_id' => $data['website_id'], 'channel_type' => $data['channel_type'] ?? '', ); model('supply_goods')->update(array_merge($goods_data, $common_data), [['goods_id', '=', $goods_id], ['goods_class', '=', $this->goods_class['id']]]); // 如果只编辑价格库存就是修改,如果添加规格项/值就需要重新生成 if (!empty($data['goods_sku_data'][0]['sku_id'])) { if ($data['spec_type_status'] == 1) { model('supply_goods_sku')->delete([['goods_id', '=', $goods_id]]); //添加sku商品 foreach ($sku_arr as $sku_k => $item) { $item['goods_id'] = $goods_id; $sku_arr[$sku_k] = array_merge($common_data, $item); } model('supply_goods_sku')->addList($sku_arr); } else { $sku_id_arr = []; //修改sku商品 foreach ($data['goods_sku_data'] as $item) { $sku_data = $sku_arr[$item['sku_id']]; //移除已经不存在的商品sku todo 存在部分sku是原来的,部分sku是新增的情况 if (!empty($item['sku_id'])) { $sku_id_arr[] = $item['sku_id']; model('supply_goods_sku')->update(array_merge($sku_data, $common_data), [['sku_id', '=', $item['sku_id']], ['goods_class', '=', $this->goods_class['id']]]); } else { $sku_id = model('supply_goods_sku')->add(array_merge($sku_data, $common_data)); $sku_id_arr[] = $sku_id; } } // 移除不存在的商品SKU $sku_id_list = model('supply_goods_sku')->getList([['goods_id', '=', $goods_id]], 'sku_id'); $sku_id_list = array_column($sku_id_list, 'sku_id'); foreach ($sku_id_list as $k => $v) { foreach ($sku_id_arr as $ck => $cv) { if ($v == $cv) { unset($sku_id_list[$k]); } } } $sku_id_list = array_values($sku_id_list); if (!empty($sku_id_list)) { model('supply_goods_sku')->delete([['sku_id', 'in', implode(",", $sku_id_list)]]); } } } else { model('supply_goods_sku')->delete([['goods_id', '=', $goods_id]]); //添加sku商品 foreach ($sku_arr as $sku_k => $item) { $item['goods_id'] = $goods_id; $sku_arr[$sku_k] = array_merge($common_data, $item); } model('supply_goods_sku')->addList($sku_arr); } // 赋值第一个商品sku_id $first_info = model('supply_goods_sku')->getFirstData(['goods_id' => $goods_id], 'sku_id', 'is_default desc,sku_id asc'); model('supply_goods')->update(['sku_id' => $first_info['sku_id']], [['goods_id', '=', $goods_id]]); if (!empty($data['goods_spec_format'])) { //刷新SKU商品规格项/规格值JSON字符串 $this->dealGoodsSkuSpecFormat($goods_id, $data['goods_spec_format']); } $cron = new Cron(); //定时上下架 if ($goods_data['timer_on'] > 0) { $cron->deleteCron([['event', '=', 'CronSupplyGoodsTimerOn'], ['relate_id', '=', $goods_id]]); $cron->addCron(1, 0, "供应商商品定时上架", "CronSupplyGoodsTimerOn", $goods_data['timer_on'], $goods_id); } if ($goods_data['timer_off'] > 0) { $cron->deleteCron([['event', '=', 'CronSupplyGoodsTimerOff'], ['relate_id', '=', $goods_id]]); $cron->addCron(1, 0, "供应商商品定时下架", "CronSupplyGoodsTimerOff", $goods_data['timer_off'], $goods_id); } model('supply_goods')->commit(); event('SupplyGoodsEdit', [ 'site_id' => $data['site_id'], 'goods_id' => $goods_id, ]); return $this->success($goods_id); } catch (\Exception $e) { model('supply_goods')->rollback(); return $this->error($e->getMessage() . $e->getLine() . $e->getFile()); } } /** * 修改商品状态 * @param $goods_ids * @param $goods_state * @param $site_id * @return \multitype */ public function modifyGoodsState($goods_ids, $goods_state, $site_id) { model('supply_goods')->update(['goods_state' => $goods_state], [['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); model('supply_goods_sku')->update(['goods_state' => $goods_state], [['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); return $this->success(1); } /** * 修改审核状态 * @param $goods_ids * @param $verify_state * @param $verify_state_remark * @return \multitype */ public function modifyVerifyState($goods_ids, $verify_state, $verify_state_remark) { model('supply_goods')->update(['verify_state' => $verify_state, 'verify_state_remark' => $verify_state_remark], [['goods_id', 'in', $goods_ids]]); model('supply_goods_sku')->update(['verify_state' => $verify_state, 'verify_state_remark' => $verify_state_remark], [['goods_id', 'in', $goods_ids]]); return $this->success(1); } /** * 修改删除状态 * @param $goods_ids * @param $is_delete * @param $site_id */ public function modifyIsDelete($goods_ids, $is_delete, $site_id) { model('supply_goods')->update(['is_delete' => $is_delete], [['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); model('supply_goods_sku')->update(['is_delete' => $is_delete], [['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); return $this->success(1); } /** * 违规下架商品 * @param $condition * @param $verify_state_remark * @return array */ public function lockup($condition, $verify_state_remark) { model('supply_goods')->update(['verify_state_remark' => $verify_state_remark, 'verify_state' => 10, 'goods_state' => 0], $condition); model('supply_goods_sku')->update(['verify_state_remark' => $verify_state_remark, 'verify_state' => 10, 'goods_state' => 0], $condition); return $this->success(1); } /** * 修改商品点击量 * @param $sku_id * @param $site_id */ public function modifyClick($sku_id, $site_id) { model("supply_goods_sku")->setInc([['sku_id', '=', $sku_id], ['site_id', '=', $site_id]], 'click_num', 1); return $this->success(1); } /** * 删除回收站商品 * @param $goods_ids * @param $site_id */ public function deleteRecycleGoods($goods_ids, $site_id) { model('supply_goods')->delete([['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); model('supply_goods_sku')->delete([['goods_id', 'in', $goods_ids], ['site_id', '=', $site_id]]); return $this->success(1); } /** * 获取商品信息 * @param array $condition * @param string $field */ public function getGoodsInfo($condition, $field = 'goods_id,goods_name,goods_class,goods_class_name,goods_attr_class,goods_attr_name,category_id,category_id_1,category_id_2,category_id_3,category_name,brand_id,brand_name,goods_image,goods_content,goods_state,verify_state,market_price,cost_price,goods_stock,goods_stock_alarm,is_free_shipping,shipping_template,goods_spec_format,goods_attr_format,introduction,keywords,unit,sort,commission_rate,video_url,site_id,site_name,min_price,max_price,min_num') { $info = model('supply_goods')->getInfo($condition, $field); return $this->success($info); } /** * 获取商品详情 * @param $goods_id * @return \multitype */ public function getGoodsDetail($goods_id) { $info = model('supply_goods')->getInfo([['goods_id', '=', $goods_id]], "*"); $info['sku_data'] = model('supply_goods_sku')->getList([['goods_id', '=', $goods_id]], 'sku_id, sku_name, sku_no, sku_spec_format, min_price,max_price,min_num, market_price, cost_price, stock, weight, volume, sku_image, sku_images, sort'); return $this->success($info); } /** * 商品sku 基础信息 * @param $condition * @param string $field * @return array */ public function getGoodsSkuInfo($condition, $field = "sku_id,sku_name,sku_spec_format,market_price,stock,click_num,sale_num,collect_num,sku_image,sku_images,goods_id,goods_content,goods_state,verify_state,is_virtual,is_free_shipping,goods_spec_format,goods_attr_format,introduction,unit,video_url, min_price,max_price,min_num") { $info = model('supply_goods_sku')->getInfo($condition, $field); return $this->success($info); } /** * 商品SKU 详情 * @param $sku_id * @return mixed */ public function getGoodsSkuDetail($sku_id, $goods_id = 0) { $where = [ ['is_delete', '=', 0] ]; if ($goods_id) { $where[] = ['goods_id', '=', $goods_id]; } else { $where[] = ['sku_id', '=', $sku_id]; } $info = model('supply_goods_sku')->getInfo($where, "goods_id,sku_id,sku_name,sku_spec_format,price,market_price,stock,click_num,sale_num,collect_num,sku_image,sku_images,goods_id,site_id,goods_content,goods_state,verify_state,is_virtual,is_free_shipping,goods_spec_format,goods_attr_format,introduction,unit,video_url,evaluate,min_price,max_price,min_num,price_json"); return $this->success($info); } /** * 获取商品列表 * @param array $condition * @param string $field * @param string $order * @param string $limit */ public function getGoodsList($condition = [], $field = 'goods_id,goods_class,goods_class_name,goods_attr_name,goods_name,site_id,site_name,website_id,sort,category_name,brand_name,goods_image,goods_content,is_own,goods_state,verify_state,price,market_price,cost_price,goods_stock,goods_stock_alarm,is_virtual,is_free_shipping,shipping_template,goods_spec_format,goods_attr_format,create_time, min_price,max_price,min_num', $order = 'create_time desc', $limit = null) { $list = model('supply_goods')->getList($condition, $field, $order, '', '', '', $limit); return $this->success($list); } /** * 获取商品分页列表 * @param array $condition * @param number $page * @param string $page_size * @param string $order * @param string $field */ public function getGoodsPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = 'goods_id,goods_name,site_name,site_id,goods_image,is_own,goods_state,verify_state,goods_stock,create_time,sale_num,is_virtual,goods_class,is_fenxiao,fenxiao_type,sku_id, min_price,max_price,min_num') { $list = model('supply_goods')->pageList($condition, $field, $order, $page, $page_size); return $this->success($list); } /** * 获取商品sku列表 * @param array $condition * @param string $field * @param string $order * @param string $limit */ public function getGoodsSkuList($condition = [], $field = 'sku_id,sku_name,price,stock,sale_num,sku_image,goods_id,goods_name,site_name,spec_name,price_json', $order = 'create_time desc', $limit = null) { $list = model('supply_goods_sku')->getList($condition, $field, $order, '', '', '', $limit); return $this->success($list); } /** * 获取商品sku分页列表 * @param array $condition * @param number $page * @param string $page_size * @param string $order * @param string $field * @param string $alias * @param string $join */ public function getGoodsSkuPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = 'sku_id,sku_name,price,sku_image,create_time,stock,goods_state,goods_class,goods_class_name', $alias = '', $join = '', $group = null) { $list = model('supply_goods_sku')->pageList($condition, $field, $order, $page, $page_size, $alias, $join, $group); return $this->success($list); } /** * 刷新SKU商品规格项/规格值JSON字符串 * @param int $goods_id 商品id * @param string $goods_spec_format 商品完整规格项/规格值json */ private function dealGoodsSkuSpecFormat($goods_id, $goods_spec_format) { if (empty($goods_spec_format)) return; $goods_spec_format = json_decode($goods_spec_format, true); //根据goods_id查询sku商品列表,查询:sku_id、sku_spec_format 列 $sku_list = model('supply_goods_sku')->getList([['goods_id', '=', $goods_id], ['sku_spec_format', '<>', '']], 'sku_id,sku_spec_format', 'sku_id asc'); if (!empty($sku_list)) { // $temp = 0;//测试性能,勿删 //循环SKU商品列表 foreach ($sku_list as $k => $v) { // $temp++; $sku_format = $goods_spec_format;//最终要存储的值 $current_format = json_decode($v['sku_spec_format'], true);//当前SKU商品规格值json $selected_data = [];//已选规格/规格值json //1、找出已选规格/规格值json //循环完整商品规格json foreach ($sku_format as $sku_k => $sku_v) { // $temp++; //循环当前SKU商品规格json foreach ($current_format as $current_k => $current_v) { // $temp++; //匹配规格项 if ($current_v['spec_id'] == $sku_v['spec_id']) { //循环规格值 foreach ($sku_v['value'] as $sku_value_k => $sku_value_v) { // $temp++; //匹配规格值id if ($current_v['spec_value_id'] == $sku_value_v['spec_value_id']) { $sku_format[$sku_k]['value'][$sku_value_k]['selected'] = true; $sku_format[$sku_k]['value'][$sku_value_k]['sku_id'] = $v['sku_id']; $selected_data[] = $sku_format[$sku_k]['value'][$sku_value_k]; break; } } } } } //2、找出未选中的规格/规格值json foreach ($sku_format as $sku_k => $sku_v) { // $temp++; foreach ($sku_v['value'] as $sku_value_k => $sku_value_v) { // $temp++; if (!isset($sku_value_v['selected'])) { $refer_data = [];//参考已选中的规格/规格值json $refer_data[] = $sku_value_v; // 根据已选中的规格值进行参考 foreach ($selected_data as $selected_k => $selected_v) { // $temp++; // 排除自身,然后进行参考 if ($selected_v['spec_id'] != $sku_value_v['spec_id']) { $refer_data[] = $selected_v; } } foreach ($sku_list as $again_k => $again_v) { // $temp++; //排除当前SKU商品 if ($again_v['sku_id'] != $v['sku_id']) { $current_format_again = json_decode($again_v['sku_spec_format'], true); $count = count($current_format_again);//规格总数量 $curr_count = 0;//当前匹配规格数量 //循环当前SKU商品规格json foreach ($current_format_again as $current_again_k => $current_again_v) { // $temp++; foreach ($refer_data as $fan_k => $fan_v) { if ($current_again_v['spec_value_id'] == $fan_v['spec_value_id'] && $current_again_v['spec_id'] == $fan_v['spec_id']) { $curr_count++; } } } // 匹配数量跟规格总数一致表示匹配成功 if ($curr_count == $count) { $sku_format[$sku_k]['value'][$sku_value_k]['selected'] = false; $sku_format[$sku_k]['value'][$sku_value_k]['sku_id'] = $again_v['sku_id']; break; } } } //没有匹配到规格值,则禁用 if (!isset($sku_format[$sku_k]['value'][$sku_value_k]['selected'])) { $sku_format[$sku_k]['value'][$sku_value_k]['disabled'] = false; } } } } //修改goods_sku表表中的goods_spec_format字段,将$sku_format值传入 model('supply_goods_sku')->update(['goods_spec_format' => json_encode($sku_format)], [['sku_id', '=', $v['sku_id']]]); } } } /** * 增加商品销量 * @param $sku_id * @param $num */ public function incGoodsSaleNum($sku_id, $num) { $condition = array( ["sku_id", "=", $sku_id] ); //增加sku销量 $res = model("supply_goods_sku")->setInc($condition, "sale_num", $num); if ($res !== false) { $sku_info = model("supply_goods_sku")->getInfo($condition, "goods_id"); $res = model("supply_goods")->setInc([["goods_id", "=", $sku_info["goods_id"]]], "sale_num", $num); return $this->success($res); } return $this->error($res); } /** * 减少商品销量 * @param $sku_id * @param $num */ public function decGoodsSaleNum($sku_id, $num) { $condition = array( ["sku_id", "=", $sku_id] ); //增加sku销量 $res = model("supply_goods_sku")->setDec($condition, "sale_num", $num); if ($res !== false) { $sku_info = model("supply_goods_sku")->getInfo($condition, "goods_id"); $res = model("supply_goods")->setDec([["goods_id", "=", $sku_info["goods_id"]]], "sale_num", $num); return $this->success($res); } return $this->error($res); } /** * 获取商品总数 * @param array $condition * @return array */ public function getGoodsTotalCount($condition = []) { $res = model('supply_goods')->getCount($condition); return $this->success($res); } /** * 获取商品规格项总数 * @param array $condition * @return array */ public function getGoodsSkuCount($condition = []) { $res = model('supply_goods_sku')->getCount($condition); return $this->success($res); } /** * 获取商品信息 * @param array $condition * @param string $field */ public function editGetGoodsInfo($condition, $field = '*') { $info = model('supply_goods')->getInfo($condition, $field); if (empty($info)) return $this->success([]); $category_json = json_decode($info['category_json']); $goods_category = []; foreach ($category_json as $k => $v) { if (!empty($v)) { $category_name = model('goods_category')->getColumn([['category_id', 'in', (string)$v]], 'category_name'); $category_name = implode('/', $category_name); $goods_category[$k] = [ 'id' => $v, 'category_name' => $category_name ]; } } $info['goods_category'] = $goods_category; return $this->success($info); } /** * 商品上架 */ public function goodsOn($condition) { model('supply_goods')->update(['goods_state' => 1], $condition); model('supply_goods_sku')->update(['goods_state' => 1], $condition); return $this->success(1); } /** * 商品下架 */ public function goodsOff($condition) { model('supply_goods')->update(['goods_state' => 0], $condition); model('supply_goods_sku')->update(['goods_state' => 0], $condition); return $this->success(1); } /** * 编辑商品分类 * @param $category_id * @param $condition */ public function modifyCategory($category_id, $condition) { $category_info = model('goods_category')->getInfo([['category_id', '=', $category_id]], 'category_id,category_id_1, category_id_2, category_id_3, category_full_name'); $category_array = []; if ($category_info['category_id_1'] > 0) { $category_array[] = $category_info['category_id_1']; } if ($category_info['category_id_2'] > 0) { $category_array[] = $category_info['category_id_2']; } if ($category_info['category_id_3'] > 0) { $category_array[] = $category_info['category_id_3']; } $category_json = json_encode($category_array); $category_id_string = ',' . implode(',', $category_array) . ','; $data = array( 'category_id' => $category_id_string, 'category_json' => $category_json, ); model('supply_goods')->update($data, $condition); return $this->success(); } /** * 设置商品是否包邮 * @param $is_free_shipping * @param $shipping_template * @param $condition * @return array */ public function modifyGoodsShipping($is_free_shipping, $shipping_template, $condition) { $condition[] = ['goods_class', '=', 1];//只有实物商品才可以编辑物流信息 model('supply_goods')->update(['is_free_shipping' => $is_free_shipping, 'shipping_template' => $shipping_template], $condition); model('supply_goods_sku')->update(['is_free_shipping' => $is_free_shipping, 'shipping_template' => $shipping_template], $condition); return $this->success(); } /** * 获取商品详情 * @param $goods_id * @return array */ public function generateGoodsInfo($site_id, $goodsDetail, $template_id = 0, $cloud_info = [], $saleType = 'normal') { $where = [ 'w.open_offer_id' => $goodsDetail['productID'], 'w.site_id' => $site_id, ]; if ($cloud_info) { $where['cloud_id'] = $cloud_info['id']; } $goods_info = model('supply_goods_warehousing')->getInfo( $where, 'w.goods_id,g.*', 'w', [['goods g', 'g.goods_id=w.goods_id', 'left']]); $goods_category = []; $sku = $goodsDetail['sku_list'] ?? []; $category_id = ''; $categoryjson = ''; $brandId = ''; $brand_name = ''; $goods_id = ''; $goods_name = $goodsDetail['goods_name']; if ($goods_info) { $categoryjson = $goods_info['category_json']; $category_json = json_decode($categoryjson); $category_id = $goods_info['category_id']; $brandId = $goods_info['category_id']; $brand_name = $goods_info['brand_name']; $goods_id = $goods_info['goods_id']; $goods_name = $goods_info['goods_name']; foreach ($category_json as $k => $v) { if (!empty($v)) { $category_list = model('goods_category')->getList([['category_id', 'in', $v]], 'category_name', 'level asc'); $category_name = array_column($category_list, 'category_name'); $category_name = implode('/', $category_name); $goods_category[$k] = [ 'id' => $v, 'category_name' => $category_name ]; } } $goods_category = $goods_category; } $price_template = [ 'price_set' => [ 'multiple' => 35, 'increase' => 0, ], 'title_set' => [], 'sku_set' => [], ]; if ($template_id) { $template = model('supply_price_template')->getInfo(['id' => $template_id]); if ($template) { $price_template['price_set'] = json_decode($template['price_set'], true); $price_template['title_set'] = json_decode($template['title_set'], true); $price_template['sku_set'] = json_decode($template['sku_set'], true); } } else { $template = model('supply_price_template')->getInfo(['site_id' => $site_id, 'is_default' => 1]); if ($template) { $price_template['price_set'] = json_decode($template['price_set'], true); $price_template['title_set'] = json_decode($template['title_set'], true); $price_template['sku_set'] = json_decode($template['sku_set'], true); } } $goods_image = $goodsDetail['goods_image']; $default_img = explode(',', $goods_image)[0]; $skuList = $this->generateGoodsSkuInfo($sku, $goods_id, $price_template, $default_img, $goodsDetail['productID'], $cloud_info, $saleType); $skuInfo = $skuList[0]; $newData = [ 'goods_id' => $goods_id, 'goods_name' => $goods_name,// 商品名称 'category_id' => $category_id,// 商品分类id,逗号隔开 'category_json' => $categoryjson,// 分类json字符串 'goods_category' => $goods_category,// 分类json字符串 'brand_id' => $brandId,// 商品品牌id 'brand_name' => $brand_name,// 品牌名称 'price' => $skuInfo['price'],// 商品价格(取第一个sku) 对应-建议零售价 'cost_price' => $skuInfo['cost_price'],// 成本价(取第一个sku) 对应-结算价 'sku_list' => $skuList,// 商品名称 'virtual_sale' => 0, 'is_limit' => 0, 'goods_stock_alarm' => $goodsDetail['goods_stock_alarm'] ?? 0, 'goods_attr_name' => $goodsDetail['goods_attr_name'] ?? 0, 'goods_attr_format' => $goodsDetail['goods_attr_format'] ?? '', 'sort' => $goodsDetail['sort'] ?? 0, 'min_buy' => $skuInfo['min_buy'], 'is_zmxx' => 0, 'is_consume_discount' => 0, 'barrage_show' => 0, 'sale_channel' => $goods_info['sale_channel'] ?? '', 'sale_store' => 'all', 'stock_show' => 1, 'sale_show' => 1, 'market_price_show' => 1, 'is_unify_pirce' => 1, 'timer_off' => 0, 'qr_id' => $goods_info['qr_id'] ?? '', 'cloud_type' => $goodsDetail['cloud_type'] ?? 'own', 'support_trade_type' => $goods_info['support_trade_type'] ?? '', 'goods_service_ids' => $goods_info['goods_service_ids'] ?? '', ]; if ($cloud_info) { } return array_merge($goodsDetail, $newData); } /*** * @param $data * @return void */ public function sitePushGenerateGoodsSku($data = []) { $goods_id = $data['goods_id'] ?? 0; if ($goods_id) { $supply_goods_info = model('supply_goods_warehousing')->getColumn(['open_offer_id' => $goods_id], '*', 'channel_type'); //查询本站入库列表 $sku_info = model('supply_goods_sku')->getList(['goods_id' => $goods_id], 'sku_id,goods_state,stock,price,min_price,max_price,price_json', 'channel_type'); //查询本站入库列表 $SupplyCron = new SupplyCron(); $supply_sku_info=array_column($sku_info, null, 'sku_id'); if ($supply_goods_info) { $push_arr = []; foreach ($supply_goods_info as $k => $v) { switch ($k) { case 'own': //自有仓库 foreach ($v as $k1 => $v1) { } break; default://云仓库通知 foreach ($v as $k1 => $v1) { if (is_numeric($v1['channel_type'])) { $push_arr = [ 'itemId' => $goods_id, 'itemId' => $goods_id, 'appid' => $v1['appid'], 'sku_info' => $sku_info, ]; $SupplyCron->AddCron($v1['channel_type'], 'SUPPLY_PRODUCT_MODIFY', $push_arr); } } break; } } } } } /** * Common: 商品入库 - 生成本平台商品规格信息 * @param $goodsDetail * @param $goodsId * @return array|array[] */ private function generateGoodsSkuInfo($sku, $goodsId, $price_template, $defaultSkuImage, $productID, $cloud_info = [], $saleType = '') { // 获取默认主图 // 处理规格信息 生成本平台规矩信息列表 $skuList = array_map(function ($skuItem) use ($goodsId, $defaultSkuImage, $price_template, $productID, $saleType) { if (is_string($skuItem['price_json'])) { $price_array = empty($skuItem['price_json']) ? [] : json_decode($skuItem['price_json'], true); } elseif (is_array($skuItem['price_json'])) { $price_array = $skuItem['price_json']; } array_multisort(array_column($price_array, 'num'), SORT_ASC, $price_array); $consignPrice = $price_array[0]['price']; $number = $price_array[0]['num']; $min_num = $skuItem['min_num'] ?? ''; $min_buy = $min_num ?: $number; //if ($saleType == 'normal') { // $consignPrice = $skuItem['retailPrice']; // } else { // $consignPrice = $skuItem['jxhyPfPrice']; // } //进一位 $mul_inc_price = $price_template['price_set']['multiple'] ?? 0; if ($mul_inc_price) { $inc_price = ($consignPrice * $mul_inc_price / 100); $inc_price = $inc_price < 0.01 ? 0.01 : $inc_price; } else { $inc_price = ($price_template['price_set']['increase'] ?: $skuItem['retailPrice'] * 5 / 100); $inc_price = $inc_price < 0.01 ? 0.01 : $inc_price; } $sku_set = $price_template['sku_set'] ?? ''; $price = $consignPrice + $inc_price; $price = ceil($price * 10) / 10; $sku_name = $skuItem['sku_name']; if ($sku_set) { if (isset($sku_set['delete_keywords']) && $sku_set['delete_keywords']) { $sku_name = str_replace($sku_set['delete_keywords'], '', $sku_name); } $sku_name = $sku_set['prefix'] . $sku_name . $sku_set['suffix']; } // 规格列表 return [ 'goods_id' => $goodsId,// 商品id 'sku_id' => '',// 商品id 'sku_name' => $sku_name,// 商品sku名称 'sku_no' => $skuItem['sku_no'],// 商品sku编码 'price' => $price, // sku单价 'cost_price' => $consignPrice,//sku成本价 'stock' => $skuItem['stock'], // 商品sku库存 'sku_image' => $skuItem['sku_image'] ?: $defaultSkuImage, 'sku_images' => $skuItem['sku_images'] ?: $defaultSkuImage, 'goods_class' => $skuItem['goods_class'], 'goods_class_name' => '实物商品', 'create_time' => time(), 'modify_time' => time(), 'goods_attr_class' => 0, 'is_default' => 0, 'spec_name' => $skuItem['spec_name'] ?? '', // 'real_stock' => $skuItem['stock'], // 实物库存 'sku_spec_format' => $skuItem['sku_spec_format'], 'goods_supplier_format' => json_encode([ 'spec_id' => $skuItem['sku_id'], 'skuId' => $skuItem['sku_id'], 'productID' => $productID, 'saleType' => $saleType, 'offerId' => $skuItem['sku_id'], ]), // 必须内容 'market_price' => moneyFormat(round($price + $price * 35 / 100, 1)), 'discount_price' => moneyFormat(round($price, 1)), // sku单价 'min_buy' => $min_buy, 'weight' => 0, 'volume' => 0, 'sale_num' => 0, 'virtual_sale' => 0, 'fenxiao_price' => 0, 'stock_alarm' => '', ]; }, $sku); if ($goodsId) { $goods_model = new GoodsModel(); $goods_sku_list = $goods_model->getGoodsSkuList([['goods_id', '=', $goodsId]], "sku_id,sku_name,sku_no,sku_spec_format,price,market_price,cost_price,stock,weight,volume,sku_image,sku_images,goods_spec_format,spec_name,stock_alarm,is_default,goods_supplier_format", '')['data']; $mpsku_arr = array_column($skuList, null, 'sku_no'); foreach ($goods_sku_list as $key => &$skuItem) { if (isset($mpsku_arr[$skuItem['sku_no']])) { $skuItem = array_merge($skuItem, $mpsku_arr[$skuItem['sku_no']]); } } return $goods_sku_list; } return $skuList ?? []; } }