|
@@ -310,56 +310,60 @@ class Goods extends Backend
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //处理商品SKU(统一处理单规格和多规格)
|
|
|
+ /**
|
|
|
+ * 处理商品SKU(统一处理单规格和多规格)
|
|
|
+ * @param array $params 商品参数
|
|
|
+ * @param int $goods_id 商品ID
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
protected function processGoodsSku($params, $goods_id)
|
|
|
{
|
|
|
// 统一通过skus和spec字段处理
|
|
|
- if (isset($params['skus']) && isset($params['spec'])) {
|
|
|
- $skus = (array)json_decode($params['skus'], true);
|
|
|
- $spec = (array)json_decode($params['spec'], true);
|
|
|
-
|
|
|
- // 判断是单规格还是多规格
|
|
|
- if (empty($spec) && count($skus) === 1) {
|
|
|
- // 单规格处理
|
|
|
- $this->addSingleSpecSku($skus[0], $goods_id);
|
|
|
- } else {
|
|
|
- // 多规格处理
|
|
|
- $this->addMultiSpecSku($skus, $spec, $goods_id);
|
|
|
- }
|
|
|
- } else {
|
|
|
+ if (!isset($params['skus']) || !isset($params['spec'])) {
|
|
|
throw new \Exception('SKU数据格式错误');
|
|
|
}
|
|
|
+
|
|
|
+ $skus = (array)json_decode($params['skus'], true);
|
|
|
+ $spec = (array)json_decode($params['spec'], true);
|
|
|
+
|
|
|
+ if (empty($skus)) {
|
|
|
+ throw new \Exception('SKU数据不能为空');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是单规格还是多规格
|
|
|
+ if (empty($spec) && count($skus) === 1) {
|
|
|
+ // 单规格处理
|
|
|
+ $this->processSingleSpecSku($skus[0], $goods_id);
|
|
|
+ } else {
|
|
|
+ // 多规格处理
|
|
|
+ $this->processMultiSpecSku($skus, $spec, $goods_id);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- //添加单规格商品SKU
|
|
|
- protected function addSingleSpecSku($skuData, $goods_id)
|
|
|
+ /**
|
|
|
+ * 处理单规格商品SKU
|
|
|
+ * @param array $skuData SKU数据
|
|
|
+ * @param int $goods_id 商品ID
|
|
|
+ */
|
|
|
+ protected function processSingleSpecSku($skuData, $goods_id)
|
|
|
{
|
|
|
- // 如果原来是多规格,先清理多余的SKU记录
|
|
|
+ // 验证单规格SKU数据
|
|
|
+ $this->validateSingleSpecSku($skuData);
|
|
|
+
|
|
|
+ // 如果原来是多规格,先清理多余的SKU记录和规格关联
|
|
|
$existingSkuCount = $this->sku_model->where('goods_id', $goods_id)->count();
|
|
|
if ($existingSkuCount > 1) {
|
|
|
// 从多规格改为单规格,删除所有旧记录
|
|
|
$this->sku_model->where('goods_id', $goods_id)->delete();
|
|
|
+ // 删除规格关联数据
|
|
|
+ Db::name('shop_goods_sku_spec')->where('goods_id', $goods_id)->delete();
|
|
|
}
|
|
|
|
|
|
// 查询现有的SKU记录
|
|
|
$existingSku = $this->sku_model->where('goods_id', $goods_id)->find();
|
|
|
|
|
|
// 创建单规格SKU数据
|
|
|
- $newSkuData = [
|
|
|
- 'goods_id' => $goods_id,
|
|
|
- 'spec_value_ids' => '', // 单规格无规格值ID
|
|
|
- 'sku_attr' => '', // 单规格无规格属性
|
|
|
- 'sku_sn' => $skuData['sku_sn'] ?? '',
|
|
|
- 'image' => $skuData['image'] ?? '',
|
|
|
- 'price' => $skuData['price'] ?? 0,
|
|
|
- 'lineation_price'=> $skuData['lineation_price'] ?? 0,
|
|
|
- 'cost_price' => $skuData['cost_price'] ?? 0,
|
|
|
- 'weight' => $skuData['weight'] ?? 0,
|
|
|
- 'volume' => $skuData['volume'] ?? 0,
|
|
|
- 'stocks' => $skuData['stocks'] ?? 0,
|
|
|
- 'status' => 1,
|
|
|
- 'is_default' => 1, // 单规格默认为默认SKU
|
|
|
- ];
|
|
|
+ $newSkuData = $this->buildSingleSkuData($skuData, $goods_id);
|
|
|
|
|
|
$defaultSkuId = 0;
|
|
|
|
|
@@ -376,156 +380,351 @@ class Goods extends Backend
|
|
|
}
|
|
|
|
|
|
// 更新商品主表信息
|
|
|
+ $this->updateGoodsForSingleSpec($skuData, $goods_id, $defaultSkuId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证单规格SKU数据
|
|
|
+ * @param array $skuData
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
+ protected function validateSingleSpecSku($skuData)
|
|
|
+ {
|
|
|
+ if (!isset($skuData['price']) || floatval($skuData['price']) <= 0) {
|
|
|
+ throw new \Exception('单规格商品销售价必须大于0');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isset($skuData['stocks']) || intval($skuData['stocks']) <= 0) {
|
|
|
+ throw new \Exception('单规格商品库存必须大于0');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建单规格SKU数据
|
|
|
+ * @param array $skuData
|
|
|
+ * @param int $goods_id
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ protected function buildSingleSkuData($skuData, $goods_id)
|
|
|
+ {
|
|
|
+ return [
|
|
|
+ 'goods_id' => $goods_id,
|
|
|
+ 'spec_value_ids' => '', // 单规格无规格值ID
|
|
|
+ 'sku_attr' => '', // 单规格无规格属性
|
|
|
+ 'sku_sn' => $skuData['sku_sn'] ?? '',
|
|
|
+ 'image' => $skuData['image'] ?? '',
|
|
|
+ 'price' => floatval($skuData['price'] ?? 0),
|
|
|
+ 'lineation_price'=> floatval($skuData['lineation_price'] ?? 0),
|
|
|
+ 'cost_price' => floatval($skuData['cost_price'] ?? 0),
|
|
|
+ 'weight' => floatval($skuData['weight'] ?? 0),
|
|
|
+ 'volume' => floatval($skuData['volume'] ?? 0),
|
|
|
+ 'stocks' => intval($skuData['stocks'] ?? 0),
|
|
|
+ 'status' => 1,
|
|
|
+ 'is_default' => 1, // 单规格默认为默认SKU
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新商品主表信息(单规格)
|
|
|
+ * @param array $skuData
|
|
|
+ * @param int $goods_id
|
|
|
+ * @param int $defaultSkuId
|
|
|
+ */
|
|
|
+ protected function updateGoodsForSingleSpec($skuData, $goods_id, $defaultSkuId)
|
|
|
+ {
|
|
|
$updateData = [
|
|
|
'spec_type' => 0, // 单规格
|
|
|
- 'stocks' => $skuData['stocks'] ?? 0,
|
|
|
- 'min_price' => $skuData['price'] ?? 0,
|
|
|
- 'max_price' => $skuData['price'] ?? 0,
|
|
|
- 'price' => $skuData['price'] ?? 0,
|
|
|
- 'min_lineation_price'=> $skuData['lineation_price'] ?? 0,
|
|
|
- 'max_lineation_price'=> $skuData['lineation_price'] ?? 0,
|
|
|
- 'lineation_price' => $skuData['lineation_price'] ?? 0,
|
|
|
+ 'stocks' => intval($skuData['stocks'] ?? 0),
|
|
|
+ 'min_price' => floatval($skuData['price'] ?? 0),
|
|
|
+ 'max_price' => floatval($skuData['price'] ?? 0),
|
|
|
+ 'price' => floatval($skuData['price'] ?? 0),
|
|
|
+ 'min_lineation_price'=> floatval($skuData['lineation_price'] ?? 0),
|
|
|
+ 'max_lineation_price'=> floatval($skuData['lineation_price'] ?? 0),
|
|
|
+ 'lineation_price' => floatval($skuData['lineation_price'] ?? 0),
|
|
|
'default_sku_id' => $defaultSkuId,
|
|
|
];
|
|
|
|
|
|
$this->model->where('id', $goods_id)->update($updateData);
|
|
|
}
|
|
|
|
|
|
- //添加商品多规格
|
|
|
- protected function addMultiSpecSku($skus, $spec, $goods_id)
|
|
|
+ /**
|
|
|
+ * 处理多规格商品SKU
|
|
|
+ * @param array $skus SKU数据数组
|
|
|
+ * @param array $spec 规格数据数组
|
|
|
+ * @param int $goods_id 商品ID
|
|
|
+ */
|
|
|
+ protected function processMultiSpecSku($skus, $spec, $goods_id)
|
|
|
{
|
|
|
- //属性入库,传递规格类型信息
|
|
|
+ // 验证多规格数据
|
|
|
+ $this->validateMultiSpecSku($skus, $spec);
|
|
|
+
|
|
|
+ // 规格属性入库,传递规格类型信息
|
|
|
$specList = Spec::push($spec);
|
|
|
$newSpec = GoodsSkuSpec::push($specList, $goods_id, $spec);
|
|
|
- //匹配属性
|
|
|
- $list = $this->sku_model->where('goods_id', $goods_id)->select();
|
|
|
- $newData = [];
|
|
|
- $stocks = 0;
|
|
|
+
|
|
|
+ // 处理SKU数据
|
|
|
+ $this->processSkuData($skus, $newSpec, $spec, $goods_id);
|
|
|
+
|
|
|
+ // 处理默认SKU
|
|
|
+ $defaultSkuId = $this->processDefaultSku($skus, $goods_id);
|
|
|
+
|
|
|
+ // 更新商品主表信息
|
|
|
+ $this->updateGoodsForMultiSpec($skus, $goods_id, $defaultSkuId);
|
|
|
+
|
|
|
+ // 清理无用的SKU记录
|
|
|
+ $this->cleanupUnusedSkus($goods_id, count($skus));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证多规格SKU数据
|
|
|
+ * @param array $skus
|
|
|
+ * @param array $spec
|
|
|
+ * @throws \Exception
|
|
|
+ */
|
|
|
+ protected function validateMultiSpecSku($skus, $spec)
|
|
|
+ {
|
|
|
+ if (empty($spec)) {
|
|
|
+ throw new \Exception('多规格商品必须设置规格信息');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证是否有有效的SKU
|
|
|
+ $hasValidSku = false;
|
|
|
+ foreach ($skus as $sku) {
|
|
|
+ if (isset($sku['status']) && ($sku['status'] == 1 || $sku['status'] === '1')) {
|
|
|
+ $hasValidSku = true;
|
|
|
+
|
|
|
+ if (!isset($sku['price']) || floatval($sku['price']) <= 0) {
|
|
|
+ throw new \Exception('SKU销售价必须大于0');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isset($sku['stocks']) || intval($sku['stocks']) <= 0) {
|
|
|
+ throw new \Exception('SKU库存必须大于0');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$hasValidSku) {
|
|
|
+ throw new \Exception('多规格商品至少需要一个有效的SKU');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理SKU数据
|
|
|
+ * @param array $skus
|
|
|
+ * @param array $newSpec
|
|
|
+ * @param array $spec
|
|
|
+ * @param int $goods_id
|
|
|
+ */
|
|
|
+ protected function processSkuData($skus, $newSpec, $spec, $goods_id)
|
|
|
+ {
|
|
|
+ $existingSkus = $this->sku_model->where('goods_id', $goods_id)->select();
|
|
|
+ $newSkuData = [];
|
|
|
+
|
|
|
foreach ($skus as $k => $sk) {
|
|
|
$newSkuId = $this->getSkuId($sk['skus'], $newSpec, $spec);
|
|
|
-
|
|
|
- // 生成SKU规格属性JSON字符串
|
|
|
$skuAttr = $this->generateSkuAttr($sk['skus'], $newSpec, $spec);
|
|
|
|
|
|
- $newSkuData = [
|
|
|
- 'goods_id' => $goods_id,
|
|
|
- 'spec_value_ids' => $newSkuId,
|
|
|
- 'sku_attr' => $skuAttr,
|
|
|
- 'sku_sn' => $sk['sku_sn'] ?? '',
|
|
|
- 'image' => $sk['image'] ?? '',
|
|
|
- 'price' => $sk['price'] ?? 0,
|
|
|
- 'lineation_price' => $sk['lineation_price'] ?? 0,
|
|
|
- 'cost_price' => $sk['cost_price'] ?? 0,
|
|
|
- 'weight' => $sk['weight'] ?? 0,
|
|
|
- 'volume' => $sk['volume'] ?? 0,
|
|
|
- 'stocks' => $sk['stocks'] ?? 0,
|
|
|
- 'status' => isset($sk['status']) ? intval($sk['status']) : 1,
|
|
|
- 'is_default' => isset($sk['is_default']) ? intval($sk['is_default']) : 0,
|
|
|
- ];
|
|
|
- if (isset($list[$k])) {
|
|
|
- $row = $list[$k];
|
|
|
- $oldSkuIdsArr = explode(',', $row['spec_value_ids']);
|
|
|
- sort($oldSkuIdsArr);
|
|
|
- $oldSkuId = implode(',', $oldSkuIdsArr);
|
|
|
-
|
|
|
+ $skuData = $this->buildMultiSkuData($sk, $goods_id, $newSkuId, $skuAttr);
|
|
|
+
|
|
|
+ if (isset($existingSkus[$k])) {
|
|
|
+ $existingSku = $existingSkus[$k];
|
|
|
+ $oldSkuId = $this->normalizeSkuId($existingSku['spec_value_ids']);
|
|
|
+
|
|
|
if ($oldSkuId == $newSkuId) {
|
|
|
- //相等的更新
|
|
|
- $row->save($newSkuData);
|
|
|
+ // 规格匹配,更新数据
|
|
|
+ $skuData['sales'] = $existingSku->sales; // 保持原有销量
|
|
|
+ $existingSku->save($skuData);
|
|
|
} else {
|
|
|
- //不等的
|
|
|
- $row->save(array_merge($newSkuData, ['sales' => 0]));
|
|
|
+ // 规格不匹配,重置销量
|
|
|
+ $skuData['sales'] = 0;
|
|
|
+ $existingSku->save($skuData);
|
|
|
}
|
|
|
- unset($list[$k]);
|
|
|
- } else { //多余的
|
|
|
- $newData[] = array_merge($newSkuData, ['sales' => 0]);
|
|
|
+ unset($existingSkus[$k]);
|
|
|
+ } else {
|
|
|
+ // 新增SKU
|
|
|
+ $skuData['sales'] = 0;
|
|
|
+ $newSkuData[] = $skuData;
|
|
|
}
|
|
|
- $stocks = bcadd($stocks, $sk['stocks'] ?? 0);
|
|
|
- }
|
|
|
- if (!empty($newData)) {
|
|
|
- $this->sku_model->saveAll($newData);
|
|
|
}
|
|
|
|
|
|
- // 处理默认SKU
|
|
|
+ if (!empty($newSkuData)) {
|
|
|
+ $this->sku_model->saveAll($newSkuData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建多规格SKU数据
|
|
|
+ * @param array $skuData
|
|
|
+ * @param int $goods_id
|
|
|
+ * @param string $specValueIds
|
|
|
+ * @param string $skuAttr
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ protected function buildMultiSkuData($skuData, $goods_id, $specValueIds, $skuAttr)
|
|
|
+ {
|
|
|
+ return [
|
|
|
+ 'goods_id' => $goods_id,
|
|
|
+ 'spec_value_ids' => $specValueIds,
|
|
|
+ 'sku_attr' => $skuAttr,
|
|
|
+ 'sku_sn' => $skuData['sku_sn'] ?? '',
|
|
|
+ 'image' => $skuData['image'] ?? '',
|
|
|
+ 'price' => floatval($skuData['price'] ?? 0),
|
|
|
+ 'lineation_price'=> floatval($skuData['lineation_price'] ?? 0),
|
|
|
+ 'cost_price' => floatval($skuData['cost_price'] ?? 0),
|
|
|
+ 'weight' => floatval($skuData['weight'] ?? 0),
|
|
|
+ 'volume' => floatval($skuData['volume'] ?? 0),
|
|
|
+ 'stocks' => intval($skuData['stocks'] ?? 0),
|
|
|
+ 'status' => isset($skuData['status']) ? intval($skuData['status']) : 1,
|
|
|
+ 'is_default' => isset($skuData['is_default']) ? intval($skuData['is_default']) : 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 规范化SKU ID字符串
|
|
|
+ * @param string $skuIds
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ protected function normalizeSkuId($skuIds)
|
|
|
+ {
|
|
|
+ $idsArray = explode(',', $skuIds);
|
|
|
+ sort($idsArray);
|
|
|
+ return implode(',', $idsArray);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理默认SKU
|
|
|
+ * @param array $skus
|
|
|
+ * @param int $goods_id
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ protected function processDefaultSku($skus, $goods_id)
|
|
|
+ {
|
|
|
$defaultSkuId = 0;
|
|
|
$hasDefault = false;
|
|
|
- foreach ($skus as $k => $sk) {
|
|
|
- if (isset($sk['is_default']) && $sk['is_default']) {
|
|
|
+
|
|
|
+ // 检查是否有明确设置的默认SKU
|
|
|
+ foreach ($skus as $sku) {
|
|
|
+ if (isset($sku['is_default']) && $sku['is_default']) {
|
|
|
$hasDefault = true;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 如果没有明确设置默认SKU,则使用第一个SKU作为默认
|
|
|
if (!$hasDefault && !empty($skus)) {
|
|
|
- $firstSku = $this->sku_model->where('goods_id', $goods_id)->order('id', 'asc')->find();
|
|
|
- if ($firstSku) {
|
|
|
- $firstSku->save(['is_default' => 1]);
|
|
|
- $defaultSkuId = $firstSku->id;
|
|
|
+ // 如果没有明确设置默认SKU,则使用第一个有效SKU作为默认
|
|
|
+ $firstValidSku = $this->sku_model->where('goods_id', $goods_id)
|
|
|
+ ->where('status', 1)
|
|
|
+ ->order('id', 'asc')
|
|
|
+ ->find();
|
|
|
+ if ($firstValidSku) {
|
|
|
+ $firstValidSku->save(['is_default' => 1]);
|
|
|
+ $defaultSkuId = $firstValidSku->id;
|
|
|
}
|
|
|
} else {
|
|
|
// 查找默认SKU的ID
|
|
|
- $defaultSku = $this->sku_model->where('goods_id', $goods_id)->where('is_default', 1)->find();
|
|
|
+ $defaultSku = $this->sku_model->where('goods_id', $goods_id)
|
|
|
+ ->where('is_default', 1)
|
|
|
+ ->find();
|
|
|
if ($defaultSku) {
|
|
|
$defaultSkuId = $defaultSku->id;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //更新库存和默认SKU,计算价格范围
|
|
|
- if (!empty($skus)) {
|
|
|
- $prices = array_column($skus, 'price');
|
|
|
- $lineationPrices = array_column($skus, 'lineation_price');
|
|
|
-
|
|
|
- // 使用bc函数计算平均价格,保证精度
|
|
|
- $totalPrice = '0';
|
|
|
- $validPriceCount = 0;
|
|
|
- foreach ($prices as $price) {
|
|
|
- if ($price > 0) {
|
|
|
- $totalPrice = bcadd($totalPrice, (string)$price, 2);
|
|
|
- $validPriceCount++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 计算平均价格
|
|
|
- $avgPrice = $validPriceCount > 0 ? bcdiv($totalPrice, (string)$validPriceCount, 2) : '0.00';
|
|
|
-
|
|
|
- // 使用bc函数计算平均划线价格
|
|
|
- $totalLineationPrice = '0';
|
|
|
- $validLineationPriceCount = 0;
|
|
|
- foreach ($lineationPrices as $lineationPrice) {
|
|
|
- if ($lineationPrice > 0) {
|
|
|
- $totalLineationPrice = bcadd($totalLineationPrice, (string)$lineationPrice, 2);
|
|
|
- $validLineationPriceCount++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 计算平均划线价格
|
|
|
- $avgLineationPrice = $validLineationPriceCount > 0 ? bcdiv($totalLineationPrice, (string)$validLineationPriceCount, 2) : '0.00';
|
|
|
-
|
|
|
- // 过滤掉0值的划线价格来计算最大最小值
|
|
|
- $validLineationPrices = array_filter($lineationPrices, function($price) {
|
|
|
- return $price > 0;
|
|
|
- });
|
|
|
-
|
|
|
- $updateData = [
|
|
|
- 'stocks' => $stocks,
|
|
|
- 'spec_type' => 1,
|
|
|
- 'min_price' => min($prices),
|
|
|
- 'max_price' => max($prices),
|
|
|
- 'price' => $avgPrice,
|
|
|
- 'min_lineation_price' => !empty($validLineationPrices) ? min($validLineationPrices) : '0.00',
|
|
|
- 'max_lineation_price' => !empty($validLineationPrices) ? max($validLineationPrices) : '0.00',
|
|
|
- 'lineation_price' => $avgLineationPrice
|
|
|
- ];
|
|
|
- if ($defaultSkuId > 0) {
|
|
|
- $updateData['default_sku_id'] = $defaultSkuId;
|
|
|
- }
|
|
|
- $this->model->where('id', $goods_id)->update($updateData);
|
|
|
- } else {
|
|
|
+ return $defaultSkuId;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新商品主表信息(多规格)
|
|
|
+ * @param array $skus
|
|
|
+ * @param int $goods_id
|
|
|
+ * @param int $defaultSkuId
|
|
|
+ */
|
|
|
+ protected function updateGoodsForMultiSpec($skus, $goods_id, $defaultSkuId)
|
|
|
+ {
|
|
|
+ if (empty($skus)) {
|
|
|
$this->model->where('id', $goods_id)->update(['spec_type' => 0]);
|
|
|
+ return;
|
|
|
}
|
|
|
- //原来多的删除
|
|
|
- foreach ($list as $it) {
|
|
|
- $it->delete();
|
|
|
+
|
|
|
+ // 计算价格范围和库存
|
|
|
+ $priceStats = $this->calculatePriceStats($skus);
|
|
|
+ $totalStocks = $this->calculateTotalStocks($skus);
|
|
|
+
|
|
|
+ $updateData = [
|
|
|
+ 'stocks' => $totalStocks,
|
|
|
+ 'spec_type' => 1,
|
|
|
+ 'min_price' => $priceStats['min_price'],
|
|
|
+ 'max_price' => $priceStats['max_price'],
|
|
|
+ 'price' => $priceStats['avg_price'],
|
|
|
+ 'min_lineation_price'=> $priceStats['min_lineation_price'],
|
|
|
+ 'max_lineation_price'=> $priceStats['max_lineation_price'],
|
|
|
+ 'lineation_price' => $priceStats['avg_lineation_price'],
|
|
|
+ ];
|
|
|
+
|
|
|
+ if ($defaultSkuId > 0) {
|
|
|
+ $updateData['default_sku_id'] = $defaultSkuId;
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->model->where('id', $goods_id)->update($updateData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算价格统计信息
|
|
|
+ * @param array $skus
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ protected function calculatePriceStats($skus)
|
|
|
+ {
|
|
|
+ $prices = array_column($skus, 'price');
|
|
|
+ $lineationPrices = array_filter(array_column($skus, 'lineation_price'), function($price) {
|
|
|
+ return $price > 0;
|
|
|
+ });
|
|
|
+
|
|
|
+ // 计算平均价格
|
|
|
+ $validPrices = array_filter($prices, function($price) { return $price > 0; });
|
|
|
+ $avgPrice = !empty($validPrices) ? array_sum($validPrices) / count($validPrices) : 0;
|
|
|
+
|
|
|
+ // 计算平均划线价格
|
|
|
+ $avgLineationPrice = !empty($lineationPrices) ? array_sum($lineationPrices) / count($lineationPrices) : 0;
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'min_price' => !empty($prices) ? min($prices) : 0,
|
|
|
+ 'max_price' => !empty($prices) ? max($prices) : 0,
|
|
|
+ 'avg_price' => round($avgPrice, 2),
|
|
|
+ 'min_lineation_price' => !empty($lineationPrices) ? min($lineationPrices) : 0,
|
|
|
+ 'max_lineation_price' => !empty($lineationPrices) ? max($lineationPrices) : 0,
|
|
|
+ 'avg_lineation_price' => round($avgLineationPrice, 2),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算总库存
|
|
|
+ * @param array $skus
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ protected function calculateTotalStocks($skus)
|
|
|
+ {
|
|
|
+ $totalStocks = 0;
|
|
|
+ foreach ($skus as $sku) {
|
|
|
+ $totalStocks += intval($sku['stocks'] ?? 0);
|
|
|
+ }
|
|
|
+ return $totalStocks;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清理无用的SKU记录
|
|
|
+ * @param int $goods_id
|
|
|
+ * @param int $currentSkuCount
|
|
|
+ */
|
|
|
+ protected function cleanupUnusedSkus($goods_id, $currentSkuCount)
|
|
|
+ {
|
|
|
+ // 删除多余的SKU记录(保留当前SKU数量)
|
|
|
+ $allSkus = $this->sku_model->where('goods_id', $goods_id)->order('id', 'asc')->select();
|
|
|
+ if (count($allSkus) > $currentSkuCount) {
|
|
|
+ $skusToDelete = array_slice($allSkus->toArray(), $currentSkuCount);
|
|
|
+ foreach ($skusToDelete as $sku) {
|
|
|
+ $this->sku_model->where('id', $sku['id'])->delete();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|