diff --git a/src/components/FormCreate/src/components/DeptSelect.vue b/src/components/FormCreate/src/components/DeptSelect.vue
new file mode 100644
index 000000000..2e18f4ad6
--- /dev/null
+++ b/src/components/FormCreate/src/components/DeptSelect.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
diff --git a/src/components/FormCreate/src/components/useApiSelect.tsx b/src/components/FormCreate/src/components/useApiSelect.tsx
index 89a7e8dbb..25e9d70d2 100644
--- a/src/components/FormCreate/src/components/useApiSelect.tsx
+++ b/src/components/FormCreate/src/components/useApiSelect.tsx
@@ -2,6 +2,7 @@ import request from '@/config/axios'
import { isEmpty } from '@/utils/is'
import { ApiSelectProps } from '@/components/FormCreate/src/type'
import { jsonParse } from '@/utils'
+import { useUserStoreWithOut } from '@/store/modules/user'
export const useApiSelect = (option: ApiSelectProps) => {
return defineComponent({
@@ -61,13 +62,62 @@ export const useApiSelect = (option: ApiSelectProps) => {
returnType: {
type: String,
default: 'id'
+ },
+ // 是否默认选中当前用户(仅 UserSelect 使用)
+ defaultCurrentUser: {
+ type: Boolean,
+ default: false
}
},
- setup(props) {
+ setup(props, { emit }) {
const attrs = useAttrs()
const options = ref([]) // 下拉数据
const loading = ref(false) // 是否正在从远程获取数据
const queryParam = ref() // 当前输入的值
+
+ // 检查是否有有效的预设值
+ const hasValidPresetValue = (): boolean => {
+ const value = attrs.modelValue
+ if (value === undefined || value === null || value === '') {
+ return false
+ }
+ if (Array.isArray(value)) {
+ return value.length > 0
+ }
+ return true
+ }
+
+ // 设置默认当前用户(仅当 defaultCurrentUser 为 true 且无预设值时)
+ const setDefaultCurrentUser = () => {
+ console.log('[UserSelect] setDefaultCurrentUser called, defaultCurrentUser:', props.defaultCurrentUser)
+
+ // 仅当组件名为 UserSelect 且 defaultCurrentUser 为 true 时处理
+ if (option.name !== 'UserSelect' || !props.defaultCurrentUser) {
+ console.log('[UserSelect] skip - not UserSelect or defaultCurrentUser is false')
+ return
+ }
+
+ // 检查是否已有预设值(预设值优先级高于默认当前用户)
+ if (hasValidPresetValue()) {
+ console.log('[UserSelect] has preset value, skip:', attrs.modelValue)
+ return
+ }
+
+ // 获取当前用户 ID
+ const userStore = useUserStoreWithOut()
+ const user = userStore.getUser
+ const currentUserId = user?.id
+
+ console.log('[UserSelect] current user:', user, 'userId:', currentUserId)
+
+ if (currentUserId) {
+ // 根据多选/单选模式设置默认值
+ const defaultValue = props.multiple ? [currentUserId] : currentUserId
+ console.log('[UserSelect] setting default value:', defaultValue)
+ emit('update:modelValue', defaultValue)
+ }
+ }
+
const getOptions = async () => {
options.value = []
// 接口选择器
@@ -188,6 +238,8 @@ export const useApiSelect = (option: ApiSelectProps) => {
onMounted(async () => {
await getOptions()
+ // 设置默认当前用户(在数据加载完成后)
+ setDefaultCurrentUser()
})
const buildSelect = () => {
diff --git a/src/components/FormCreate/src/config/useSelectRule.ts b/src/components/FormCreate/src/config/useSelectRule.ts
index e1d77fbcc..c95e047db 100644
--- a/src/components/FormCreate/src/config/useSelectRule.ts
+++ b/src/components/FormCreate/src/config/useSelectRule.ts
@@ -19,13 +19,24 @@ export const useSelectRule = (option: SelectRuleOption) => {
name,
event: option.event,
rule() {
- return {
+ // 构建基础规则
+ const baseRule: any = {
type: name,
field: generateUUID(),
title: label,
info: '',
$required: false
}
+ // 将自定义 props 的默认值添加到 rule 的 props 中
+ if (option.props && option.props.length > 0) {
+ baseRule.props = {}
+ option.props.forEach((prop: any) => {
+ if (prop.field && prop.value !== undefined) {
+ baseRule.props[prop.field] = prop.value
+ }
+ })
+ }
+ return baseRule
},
props(_, { t }) {
if (!option.props) {
diff --git a/src/components/FormCreate/src/useFormCreateDesigner.ts b/src/components/FormCreate/src/useFormCreateDesigner.ts
index 4e87e432e..5769b4baa 100644
--- a/src/components/FormCreate/src/useFormCreateDesigner.ts
+++ b/src/components/FormCreate/src/useFormCreateDesigner.ts
@@ -52,7 +52,15 @@ export const useFormCreateDesigner = async (designer: Ref) => {
const userSelectRule = useSelectRule({
name: 'UserSelect',
label: '用户选择器',
- icon: 'icon-user-o'
+ icon: 'icon-user-o',
+ props: [
+ {
+ type: 'switch',
+ field: 'defaultCurrentUser',
+ title: '默认选中当前用户',
+ value: true
+ }
+ ]
})
const deptSelectRule = useSelectRule({
name: 'DeptSelect',
@@ -68,6 +76,12 @@ export const useFormCreateDesigner = async (designer: Ref) => {
{ label: '部门编号', value: 'id' },
{ label: '部门名称', value: 'name' }
]
+ },
+ {
+ type: 'switch',
+ field: 'defaultCurrentDept',
+ title: '默认选中当前部门',
+ value: true
}
]
})
diff --git a/src/plugins/formCreate/index.ts b/src/plugins/formCreate/index.ts
index 01a57bebc..6e0a971fe 100644
--- a/src/plugins/formCreate/index.ts
+++ b/src/plugins/formCreate/index.ts
@@ -68,6 +68,7 @@ import { UploadFile, UploadImg, UploadImgs } from '@/components/UploadFile'
import { useApiSelect } from '@/components/FormCreate'
import { Editor } from '@/components/Editor'
import DictSelect from '@/components/FormCreate/src/components/DictSelect.vue'
+import DeptSelect from '@/components/FormCreate/src/components/DeptSelect.vue'
const UserSelect = useApiSelect({
name: 'UserSelect',
@@ -75,12 +76,6 @@ const UserSelect = useApiSelect({
valueField: 'id',
url: '/system/user/simple-list'
})
-const DeptSelect = useApiSelect({
- name: 'DeptSelect',
- labelField: 'name',
- valueField: 'id',
- url: '/system/dept/simple-list'
-})
const ApiSelect = useApiSelect({
name: 'ApiSelect'
})
diff --git a/src/views/mall/product/spu/components/SkuList.vue b/src/views/mall/product/spu/components/SkuList.vue
index c41da4b2c..10d82319f 100644
--- a/src/views/mall/product/spu/components/SkuList.vue
+++ b/src/views/mall/product/spu/components/SkuList.vue
@@ -318,6 +318,7 @@ const props = defineProps({
const formData: Ref = ref() // 表单数据
const skuList = ref([
{
+ name: '', // SKU 名称
price: 0, // 商品价格
marketPrice: 0, // 市场价
costPrice: 0, // 成本价
@@ -449,6 +450,7 @@ const generateTableData = (propertyList: any[]) => {
}
for (const item of buildSkuList) {
const row = {
+ name: '', // SKU 名称,提交时会自动使用 SPU 名称
properties: Array.isArray(item) ? item : [item], // 如果只有一个属性的话返回的是一个 property 对象
price: 0,
marketPrice: 0,
@@ -525,6 +527,7 @@ watch(
if (props.isBatch) {
skuList.value = [
{
+ name: '', // SKU 名称
price: 0,
marketPrice: 0,
costPrice: 0,
diff --git a/src/views/mall/product/spu/form/SkuForm.vue b/src/views/mall/product/spu/form/SkuForm.vue
index 18cd0296f..782d8ed48 100644
--- a/src/views/mall/product/spu/form/SkuForm.vue
+++ b/src/views/mall/product/spu/form/SkuForm.vue
@@ -173,6 +173,7 @@ const onChangeSpec = () => {
// 重置sku列表
formData.skus = [
{
+ name: '', // SKU 名称,提交时会自动使用 SPU 名称
price: 0,
marketPrice: 0,
costPrice: 0,
diff --git a/src/views/mall/product/spu/form/index.vue b/src/views/mall/product/spu/form/index.vue
index c4e4b7b2d..bf4aa9341 100644
--- a/src/views/mall/product/spu/form/index.vue
+++ b/src/views/mall/product/spu/form/index.vue
@@ -62,6 +62,7 @@ import OtherForm from './OtherForm.vue'
import SkuForm from './SkuForm.vue'
import DeliveryForm from './DeliveryForm.vue'
import { convertToInteger, floatToFixed2, formatToFraction } from '@/utils'
+import { isEmpty } from '@/utils/is'
defineOptions({ name: 'ProductSpuAdd' })
@@ -94,6 +95,7 @@ const formData = ref({
subCommissionType: false, // 分销类型
skus: [
{
+ name: '', // SKU 名称,提交时会自动使用 SPU 名称
price: 0, // 商品价格
marketPrice: 0, // 市场价
costPrice: 0, // 成本价
@@ -158,8 +160,13 @@ const submitForm = async () => {
await unref(otherRef)?.validate()
// 深拷贝一份, 这样最终 server 端不满足,不需要影响原始数据
const deepCopyFormData = cloneDeep(unref(formData.value)) as ProductSpuApi.Spu
+ // 校验商品名称不能为空(用于 SKU name)
+ if (isEmpty(deepCopyFormData.name)) {
+ message.error('商品名称不能为空')
+ return
+ }
deepCopyFormData.skus!.forEach((item) => {
- // 给sku name赋值
+ // 给sku name赋值(使用商品名称作为 SKU 名称)
item.name = deepCopyFormData.name
// sku相关价格元转分
item.price = convertToInteger(item.price)