From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/mall/product/spu/form/SkuForm.vue |  194 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 194 insertions(+), 0 deletions(-)

diff --git a/src/views/mall/product/spu/form/SkuForm.vue b/src/views/mall/product/spu/form/SkuForm.vue
new file mode 100644
index 0000000..18cd029
--- /dev/null
+++ b/src/views/mall/product/spu/form/SkuForm.vue
@@ -0,0 +1,194 @@
+<!-- 鍟嗗搧鍙戝竷 - 搴撳瓨浠锋牸 -->
+<template>
+  <el-form
+    ref="formRef"
+    v-loading="formLoading"
+    :disabled="isDetail"
+    :model="formData"
+    :rules="rules"
+    label-width="120px"
+  >
+    <el-form-item label="鍒嗛攢绫诲瀷" prop="subCommissionType">
+      <el-radio-group
+        v-model="formData.subCommissionType"
+        class="w-80"
+        @change="changeSubCommissionType"
+      >
+        <el-radio :value="false">榛樿璁剧疆</el-radio>
+        <el-radio :value="true" class="radio">鍗曠嫭璁剧疆</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item label="鍟嗗搧瑙勬牸" prop="specType">
+      <el-radio-group v-model="formData.specType" class="w-80" @change="onChangeSpec">
+        <el-radio :value="false" class="radio">鍗曡鏍�</el-radio>
+        <el-radio :value="true">澶氳鏍�</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <!-- 澶氳鏍兼坊鍔�-->
+    <el-form-item v-if="!formData.specType">
+      <SkuList
+        ref="skuListRef"
+        :prop-form-data="formData"
+        :property-list="propertyList"
+        :rule-config="ruleConfig"
+      />
+    </el-form-item>
+    <el-form-item v-if="formData.specType" label="鍟嗗搧灞炴��">
+      <el-button class="mb-10px mr-15px" @click="attributesAddFormRef.open">娣诲姞灞炴��</el-button>
+      <ProductAttributes
+        :is-detail="isDetail"
+        :property-list="propertyList"
+        @success="generateSkus"
+      />
+    </el-form-item>
+    <template v-if="formData.specType && propertyList.length > 0">
+      <el-form-item v-if="!isDetail" label="鎵归噺璁剧疆">
+        <SkuList :is-batch="true" :prop-form-data="formData" :property-list="propertyList" />
+      </el-form-item>
+      <el-form-item label="瑙勬牸鍒楄〃">
+        <SkuList
+          ref="skuListRef"
+          :is-detail="isDetail"
+          :prop-form-data="formData"
+          :property-list="propertyList"
+          :rule-config="ruleConfig"
+        />
+      </el-form-item>
+    </template>
+  </el-form>
+
+  <!-- 鍟嗗搧灞炴�ф坊鍔� Form 琛ㄥ崟 -->
+  <ProductPropertyAddForm ref="attributesAddFormRef" :propertyList="propertyList" />
+</template>
+<script lang="ts" setup>
+import { PropType } from 'vue'
+import { copyValueToTarget } from '@/utils'
+import { propTypes } from '@/utils/propTypes'
+import {
+  getPropertyList,
+  PropertyAndValues,
+  RuleConfig,
+  SkuList
+} from '@/views/mall/product/spu/components/index'
+import ProductAttributes from './ProductAttributes.vue'
+import ProductPropertyAddForm from './ProductPropertyAddForm.vue'
+import type { Spu } from '@/api/mall/product/spu'
+
+defineOptions({ name: 'ProductSpuSkuForm' })
+
+// sku 鐩稿叧灞炴�ф牎楠岃鍒�
+const ruleConfig: RuleConfig[] = [
+  {
+    name: 'stock',
+    rule: (arg) => arg >= 0,
+    message: '鍟嗗搧搴撳瓨蹇呴』澶т簬绛変簬 1 锛侊紒锛�'
+  },
+  {
+    name: 'price',
+    rule: (arg) => arg >= 0.01,
+    message: '鍟嗗搧閿�鍞环鏍煎繀椤诲ぇ浜庣瓑浜� 0.01 鍏冿紒锛侊紒'
+  },
+  {
+    name: 'marketPrice',
+    rule: (arg) => arg >= 0.01,
+    message: '鍟嗗搧甯傚満浠锋牸蹇呴』澶т簬绛変簬 0.01 鍏冿紒锛侊紒'
+  },
+  {
+    name: 'costPrice',
+    rule: (arg) => arg >= 0.01,
+    message: '鍟嗗搧鎴愭湰浠锋牸蹇呴』澶т簬绛変簬 0.00 鍏冿紒锛侊紒'
+  }
+]
+
+const message = useMessage() // 娑堟伅寮圭獥
+const formLoading = ref(false)
+const props = defineProps({
+  propFormData: {
+    type: Object as PropType<Spu>,
+    default: () => {}
+  },
+  isDetail: propTypes.bool.def(false) // 鏄惁浣滀负璇︽儏缁勪欢
+})
+const attributesAddFormRef = ref() // 娣诲姞鍟嗗搧灞炴�ц〃鍗�
+const formRef = ref() // 琛ㄥ崟 Ref
+const propertyList = ref<PropertyAndValues[]>([]) // 鍟嗗搧灞炴�у垪琛�
+const skuListRef = ref() // 鍟嗗搧灞炴�у垪琛� Ref
+const formData = reactive<Spu>({
+  specType: false, // 鍟嗗搧瑙勬牸
+  subCommissionType: false, // 鍒嗛攢绫诲瀷
+  skus: []
+})
+const rules = reactive({
+  specType: [required],
+  subCommissionType: [required]
+})
+
+/** 灏嗕紶杩涙潵鐨勫�艰祴鍊肩粰 formData */
+watch(
+  () => props.propFormData,
+  (data) => {
+    if (!data) {
+      return
+    }
+    copyValueToTarget(formData, data)
+    // 灏� SKU 鐨勫睘鎬э紝鏁寸悊鎴� PropertyAndValues 鏁扮粍
+    propertyList.value = getPropertyList(data)
+  },
+  {
+    immediate: true
+  }
+)
+
+/** 琛ㄥ崟鏍¢獙 */
+const emit = defineEmits(['update:activeName'])
+const validate = async () => {
+  if (!formRef) return
+  try {
+    // 鏍¢獙 sku
+    skuListRef.value.validateSku()
+    await unref(formRef).validate()
+    // 鏍¢獙閫氳繃鏇存柊鏁版嵁
+    Object.assign(props.propFormData, formData)
+  } catch (e) {
+    message.error('銆愬簱瀛樹环鏍笺�戜笉瀹屽杽锛岃濉啓鐩稿叧淇℃伅')
+    emit('update:activeName', 'sku')
+    throw e // 鐩殑鎴柇涔嬪悗鐨勬牎楠�
+  }
+}
+defineExpose({ validate })
+
+/** 鍒嗛攢绫诲瀷 */
+const changeSubCommissionType = () => {
+  // 榛樿涓洪浂锛岀被鍨嬪垏鎹㈠悗涔熻閲嶇疆涓洪浂
+  for (const item of formData.skus!) {
+    item.firstBrokeragePrice = 0
+    item.secondBrokeragePrice = 0
+  }
+}
+
+/** 閫夋嫨瑙勬牸 */
+const onChangeSpec = () => {
+  // 閲嶇疆鍟嗗搧灞炴�у垪琛�
+  propertyList.value = []
+  // 閲嶇疆sku鍒楄〃
+  formData.skus = [
+    {
+      price: 0,
+      marketPrice: 0,
+      costPrice: 0,
+      barCode: '',
+      picUrl: '',
+      stock: 0,
+      weight: 0,
+      volume: 0,
+      firstBrokeragePrice: 0,
+      secondBrokeragePrice: 0
+    }
+  ]
+}
+
+/** 璋冪敤 SkuList generateTableData 鏂规硶*/
+const generateSkus = (propertyList: any[]) => {
+  skuListRef.value.generateTableData(propertyList)
+}
+</script>

--
Gitblit v1.8.0