|
@@ -0,0 +1,179 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace app\common\library;
|
|
|
+
|
|
|
+/**
|
|
|
+ * SKU辅助工具类
|
|
|
+ */
|
|
|
+class SkuHelper
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * 格式化SKU规格属性显示
|
|
|
+ * @param string $skuAttr 规格属性JSON字符串,格式:[{"name":"规格名","value":"规格值"}]
|
|
|
+ * @return string 格式化后的显示文本
|
|
|
+ */
|
|
|
+ public static function formatSkuAttr($skuAttr)
|
|
|
+ {
|
|
|
+ if (empty($skuAttr)) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+
|
|
|
+ // 尝试解析JSON格式
|
|
|
+ $attrs = json_decode($skuAttr, true);
|
|
|
+ if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) {
|
|
|
+ // JSON格式
|
|
|
+ $formatted = [];
|
|
|
+ foreach ($attrs as $attr) {
|
|
|
+ if (isset($attr['name']) && isset($attr['value'])) {
|
|
|
+ $formatted[] = $attr['name'] . ': ' . $attr['value'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return implode(' | ', $formatted);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 兼容旧的字符串格式:规格名:规格值,规格名:规格值
|
|
|
+ if (strpos($skuAttr, ':') !== false) {
|
|
|
+ $attrs = explode(',', $skuAttr);
|
|
|
+ $formatted = [];
|
|
|
+ foreach ($attrs as $attr) {
|
|
|
+ if (strpos($attr, ':') !== false) {
|
|
|
+ list($name, $value) = explode(':', $attr, 2);
|
|
|
+ $formatted[] = trim($name) . ': ' . trim($value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return implode(' | ', $formatted);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $skuAttr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析SKU规格属性为数组
|
|
|
+ * @param string $skuAttr 规格属性字符串
|
|
|
+ * @return array 规格属性数组,格式:[['name' => '颜色', 'value' => '红色'], ...]
|
|
|
+ */
|
|
|
+ public static function parseSkuAttr($skuAttr)
|
|
|
+ {
|
|
|
+ if (empty($skuAttr)) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 尝试解析JSON格式
|
|
|
+ $attrs = json_decode($skuAttr, true);
|
|
|
+ if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) {
|
|
|
+ // 确保每个元素都有name和value字段
|
|
|
+ $parsed = [];
|
|
|
+ foreach ($attrs as $attr) {
|
|
|
+ if (isset($attr['name']) && isset($attr['value'])) {
|
|
|
+ $parsed[] = [
|
|
|
+ 'name' => $attr['name'],
|
|
|
+ 'value' => $attr['value']
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $parsed;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 兼容旧的字符串格式
|
|
|
+ if (strpos($skuAttr, ':') !== false) {
|
|
|
+ $attrs = explode(',', $skuAttr);
|
|
|
+ $parsed = [];
|
|
|
+ foreach ($attrs as $attr) {
|
|
|
+ if (strpos($attr, ':') !== false) {
|
|
|
+ list($name, $value) = explode(':', $attr, 2);
|
|
|
+ $parsed[] = [
|
|
|
+ 'name' => trim($name),
|
|
|
+ 'value' => trim($value)
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $parsed;
|
|
|
+ }
|
|
|
+
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成SKU规格属性JSON字符串
|
|
|
+ * @param array $specs 规格数组,格式:[['name' => '颜色', 'value' => '红色'], ...]
|
|
|
+ * @return string 规格属性JSON字符串
|
|
|
+ */
|
|
|
+ public static function buildSkuAttr($specs)
|
|
|
+ {
|
|
|
+ if (empty($specs) || !is_array($specs)) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+
|
|
|
+ $attrs = [];
|
|
|
+ foreach ($specs as $spec) {
|
|
|
+ if (isset($spec['name']) && isset($spec['value']) && !empty($spec['name']) && !empty($spec['value'])) {
|
|
|
+ $attrs[] = [
|
|
|
+ 'name' => trim($spec['name']),
|
|
|
+ 'value' => trim($spec['value'])
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return !empty($attrs) ? json_encode($attrs, JSON_UNESCAPED_UNICODE) : '';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查SKU规格属性是否匹配
|
|
|
+ * @param string $skuAttr1 第一个SKU的规格属性
|
|
|
+ * @param string $skuAttr2 第二个SKU的规格属性
|
|
|
+ * @return bool 是否匹配
|
|
|
+ */
|
|
|
+ public static function isSkuAttrMatch($skuAttr1, $skuAttr2)
|
|
|
+ {
|
|
|
+ if (empty($skuAttr1) && empty($skuAttr2)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (empty($skuAttr1) || empty($skuAttr2)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解析为统一的数组格式进行比较
|
|
|
+ $parsed1 = self::parseSkuAttr($skuAttr1);
|
|
|
+ $parsed2 = self::parseSkuAttr($skuAttr2);
|
|
|
+
|
|
|
+ if (count($parsed1) !== count($parsed2)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按规格名排序后比较
|
|
|
+ usort($parsed1, function($a, $b) {
|
|
|
+ return strcmp($a['name'], $b['name']);
|
|
|
+ });
|
|
|
+
|
|
|
+ usort($parsed2, function($a, $b) {
|
|
|
+ return strcmp($a['name'], $b['name']);
|
|
|
+ });
|
|
|
+
|
|
|
+ for ($i = 0; $i < count($parsed1); $i++) {
|
|
|
+ if ($parsed1[$i]['name'] !== $parsed2[$i]['name'] ||
|
|
|
+ $parsed1[$i]['value'] !== $parsed2[$i]['value']) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取SKU规格的简短显示文本
|
|
|
+ * @param string $skuAttr 规格属性字符串
|
|
|
+ * @param int $maxLength 最大长度
|
|
|
+ * @return string 简短显示文本
|
|
|
+ */
|
|
|
+ public static function getShortSkuAttr($skuAttr, $maxLength = 50)
|
|
|
+ {
|
|
|
+ $formatted = self::formatSkuAttr($skuAttr);
|
|
|
+
|
|
|
+ if (mb_strlen($formatted) <= $maxLength) {
|
|
|
+ return $formatted;
|
|
|
+ }
|
|
|
+
|
|
|
+ return mb_substr($formatted, 0, $maxLength - 3) . '...';
|
|
|
+ }
|
|
|
+}
|