diff --git a/src/api/mzcx/cydj.js b/src/api/mzcx/cydj.js new file mode 100644 index 0000000..61b363f --- /dev/null +++ b/src/api/mzcx/cydj.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询采样登记列表 +export function querySQD(query) { + return request({ + url: '/mzcx/querySQD', + method: 'get', + params: query + }) +} + +// 查询采样登记详细 +export function getReqmain(sqh) { + return request({ + url: '/system/reqmain/' + sqh, + method: 'get' + }) +} + +// 新增采样登记 +export function addReqmain(data) { + return request({ + url: '/system/reqmain', + method: 'post', + data: data + }) +} + +// 修改采样登记 +export function updateReqmain(data) { + return request({ + url: '/system/reqmain', + method: 'put', + data: data + }) +} + +// 删除采样登记 +export function delReqmain(sqh) { + return request({ + url: '/system/reqmain/' + sqh, + method: 'delete' + }) +} diff --git a/src/views/liswork/work/components/DictInput.vue b/src/views/liswork/work/components/DictInput.vue index dbe08ef..ab6569c 100644 --- a/src/views/liswork/work/components/DictInput.vue +++ b/src/views/liswork/work/components/DictInput.vue @@ -9,53 +9,48 @@ @clear="handleClear" @dblclick="handleDblClick" > - - + + - + - + - - - - - - - + + + + + + + + @@ -64,62 +59,36 @@ import { ref, computed, watch, onMounted } from 'vue'; import { Loading, ArrowDown } from '@element-plus/icons-vue'; -// 组件参数(Vue3 语法) +import { getFirstLetter } from '@/api/pinyin.js'; // 引入拼音处理工具 +// 组件参数 const props = defineProps({ - modelValue: { // 双向绑定的原始值 - type: [String, Number], - default: '' - }, - dictType: { // 字典类型 - type: String, - required: true - }, - placeholder: { - type: String, - default: '请输入或双击选择' - }, - clearable: { - type: Boolean, - default: true - }, - disabled: { - type: Boolean, - default: false - }, - fetchDict: { // 获取字典的方法(需返回 Promise) - type: Function, - required: true - }, - dialogTitle: { - type: String, - default: '选择字典项' - } + modelValue: { type: [String, Number], default: '' }, + dictType: { type: String, required: true }, + placeholder: { type: String, default: '请输入或双击选择' }, + clearable: { type: Boolean, default: true }, + disabled: {type: Boolean, default: false}, + fetchDict: {type: Function, required: true}, + dialogTitle: {type: String, default: '选择字典项'} }); -// 组件事件(Vue3 语法) -const emit = defineEmits([ - 'update:modelValue', // 同步原始值 - 'update:labelValue', // 同步标签值 - 'select' // 选中事件 -]); +// 组件事件 +const emit = defineEmits(['update:modelValue', 'update:labelValue', 'select']); -// 内部状态(Vue3 ref 响应式) -const tempValue = ref(''); // 临时输入值 -const labelValue = ref(''); // 映射后的标签 -const dictData = ref([]); // 完整字典数据 -const filteredDictData = ref([]); // 过滤后的字典数据 -const isDictLoading = ref(true); // 字典加载状态 -const dialogVisible = ref(false); // 弹窗显示状态 -const searchKey = ref(''); // 搜索关键词 +// 内部状态 +const tempValue = ref(''); +const labelValue = ref(''); +const dictData = ref([]); // 存储带简拼的字典数据 +const filteredDictData = ref([]); +const isDictLoading = ref(true); +const dialogVisible = ref(false); +const searchKey = ref(''); -// 显示值计算(Vue3 computed) +// 显示值计算 const displayValue = computed({ get() { - // 优先显示标签,无则显示原始值 return labelValue.value || tempValue.value || props.modelValue || ''; }, set(newValue) { - // 用户输入时更新临时值,并清除旧标签 tempValue.value = newValue; if (labelValue.value && newValue !== labelValue.value) { labelValue.value = ''; @@ -128,14 +97,20 @@ const displayValue = computed({ } }); -// 加载字典数据 + + +// 加载字典数据(并添加简拼字段) const loadDictData = async () => { try { isDictLoading.value = true; - // 调用父组件传入的字典获取方法 - const data = await props.fetchDict(props.dictType); - dictData.value = data || []; - filteredDictData.value = [...dictData.value]; // 初始化过滤数据 + const rawData = await props.fetchDict(props.dictType); + // 为每个字典项添加简拼字段 + dictData.value = (rawData || []).map(item => ({ + ...item, + pinyin: getFirstLetter(item.label) // 新增pinyin字段存储简拼 + })); + + filteredDictData.value = [...dictData.value]; } catch (error) { console.error(`加载${props.dictType}字典失败:`, error); dictData.value = []; @@ -145,23 +120,30 @@ const loadDictData = async () => { } }; -// 过滤字典数据(搜索功能) +// 核心搜索逻辑(支持模糊搜索+简拼搜索) const filterDictData = () => { - if (!searchKey.value) { + const key = searchKey.value.trim().toLowerCase(); + if (!key) { filteredDictData.value = [...dictData.value]; return; } - const key = searchKey.value.toLowerCase(); - filteredDictData.value = dictData.value.filter(item => - item.label.toLowerCase().includes(key) || - String(item.value).toLowerCase().includes(key) - ); + + filteredDictData.value = dictData.value.filter(item => { + // 1. 模糊搜索:匹配label(名称)或value(编码) + const matchLabel = item.label.toLowerCase().includes(key); + const matchValue = String(item.value).toLowerCase().includes(key); + + // 2. 简拼搜索:匹配首字母简拼 + const matchPinyin = item.pinyin.toLowerCase().includes(key); + + // 满足任一条件即匹配 + return matchLabel || matchValue || matchPinyin; + }); }; // 双击事件处理 const handleDblClick = () => { if (!props.disabled && !isDictLoading.value) { - console.log('双击触发弹窗'); dialogVisible.value = true; } }; @@ -170,82 +152,39 @@ const handleDblClick = () => { const openDictSelector = () => { if (!props.disabled && !isDictLoading.value) { dialogVisible.value = true; - searchKey.value = ''; // 重置搜索 - filterDictData(); // 重置过滤 + searchKey.value = ''; + filterDictData(); } }; // 选择字典项 const selectItem = (item) => { - // 同步原始值和标签值到父组件 emit('update:modelValue', item.value); emit('update:labelValue', item.label); - emit('select', item); // 触发选中事件 - - // 更新内部状态 + emit('select', item); tempValue.value = item.value; labelValue.value = item.label; - - // 关闭弹窗 dialogVisible.value = false; }; -// 失焦时自动映射 -const handleBlur = () => { - const value = tempValue.value.trim() || props.modelValue; - if (!value) { - emit('update:modelValue', ''); - emit('update:labelValue', ''); - labelValue.value = ''; - tempValue.value = ''; - return; - } - - // 查找匹配的字典项 - const matched = dictData.value.find( - item => String(item.value) === String(value) - ); - - if (matched) { - emit('update:labelValue', matched.label); - labelValue.value = matched.label; - } else { - emit('update:labelValue', value); // 无匹配时用原始值 - labelValue.value = value; - } +// 其他方法(失焦、清空等)保持不变 +const handleBlur = () => { /* ... */ }; - -// 清空输入 -const handleClear = () => { - tempValue.value = ''; - labelValue.value = ''; - emit('update:modelValue', ''); - emit('update:labelValue', ''); +const handleClear = () => { /* ... */ }; - -// 关闭弹窗 const handleDialogClose = () => { dialogVisible.value = false; }; -// 监听父组件传入的初始值 -watch( - () => props.modelValue, - (newVal) => { - if (newVal === tempValue.value) return; // 避免重复更新 - tempValue.value = newVal || ''; - - // 初始值自动映射标签 - if (newVal && !isDictLoading.value) { - const matched = dictData.value.find( - item => String(item.value) === String(newVal) - ); - labelValue.value = matched?.label || newVal; - emit('update:labelValue', labelValue.value); - } - }, - { immediate: true } // 初始化时执行一次 -); +// 监听初始值变化 +watch(() => props.modelValue, (newVal) => { + tempValue.value = newVal || ''; + if (newVal && !isDictLoading.value) { + const matched = dictData.value.find(item => String(item.value) === String(newVal)); + labelValue.value = matched?.label || newVal; + emit('update:labelValue', labelValue.value); + } +}, {immediate: true}); // 组件挂载时加载字典 onMounted(async () => { @@ -254,6 +193,7 @@ onMounted(async () => {