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)