jh-admin/addon/supply/model/goods/Goods.php

1136 lines
51 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\supply\model\goods;
use app\model\BaseModel;
use app\model\goods\Goods as GoodsModel;
use app\model\system\Cron;
use app\model\system\Stat;
use addon\supply\model\SupplyGoodsCategory as GoodsCategory;
use addon\supply\model\SupplyCron;
use app\model\goods\Config as GoodsConfig;
/**
* 商品
*/
class Goods extends BaseModel
{
private $goods_class = array('id' => 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 ?? [];
}
}