From f141e59f144aab85d9020ab7318870693708be42 Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Tue, 16 Jun 2026 13:38:53 +0800 Subject: [PATCH 1/6] =?UTF-8?q?style:=20=E4=B8=8A=E6=A8=A1/=E4=B8=8B?= =?UTF-8?q?=E6=A8=A1=E6=93=8D=E4=BD=9C=E4=BA=BA=E8=87=AA=E5=8A=A8=E5=B8=A6?= =?UTF-8?q?=E5=87=BA=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=20&=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/zh-CN.js | 4 +- .../pages/moldoperate/deviceSelect.vue | 83 +++----- .../pages/moldoperate/dismount.vue | 182 +++++------------- .../pages/moldoperate/index.vue | 166 +++++----------- .../pages/moldoperate/moldSelect.vue | 8 +- src/utils/permissionMenu.js | 4 +- 6 files changed, 135 insertions(+), 312 deletions(-) diff --git a/src/locales/zh-CN.js b/src/locales/zh-CN.js index ef11324..3182ff6 100644 --- a/src/locales/zh-CN.js +++ b/src/locales/zh-CN.js @@ -355,8 +355,8 @@ export default { productionLine: '所属产线', currentMold: '当前在机模具', deviceStatus: '设备状态', - statusRunning: '运行中', - statusStop: '已停止', + statusRunning: '正常', + statusStop: '停用', statusFault: '故障', selectMountMold: '选择待上模模具', product: '产品', diff --git a/src/pages_function/pages/moldoperate/deviceSelect.vue b/src/pages_function/pages/moldoperate/deviceSelect.vue index 4bbf07c..8714cd9 100644 --- a/src/pages_function/pages/moldoperate/deviceSelect.vue +++ b/src/pages_function/pages/moldoperate/deviceSelect.vue @@ -69,6 +69,7 @@ import { useI18n } from 'vue-i18n' import NavBar from '@/components/common/NavBar.vue' import { getDeviceLedgerList } from '@/api/mes/moldoperate' import { getDeviceLineTree } from '@/api/mes/deviceLine' +import { getMoldBrandPage } from '@/api/mes/mold' const { t } = useI18n() @@ -105,65 +106,43 @@ function getStatusLabel(device) { return map[status] || textValue(device.deviceStatus) || '-' } -// 当前在机模具 - 优先从持久化存储读取(实时),否则 fallback 设备台账字段 -function getCurrentMold(device) { - const deviceId = device?.id - const deviceCode = device?.deviceCode +// 设备名 → 在机模具名 映射表 +const deviceMoldMap = ref(new Map()) - // 1. 优先读新版 _mountedMoldInfoMap(按 deviceId 索引,再用 deviceCode fallback) +async function loadDeviceMolds() { try { - const map = uni.getStorageSync('_mountedMoldInfoMap') || {} - // 先按 id 匹配 - const key = String(deviceId) - let info = deviceId != null ? map[key] : null - // 再按 deviceCode 匹配(兼容 id 可能不一致的情况) - if (!info && deviceCode) { - const found = Object.values(map).find((item) => item?.deviceCode === deviceCode) - if (found) info = found - } - - // 调试日志:只在首次加载时输出一次 - if (!getCurrentMold._logged) { - getCurrentMold._logged = true - console.log('[deviceSelect] === 调试信息 ===') - console.log('[deviceSelect] storage map keys:', Object.keys(map)) - console.log('[deviceSelect] storage map values:', map) - console.log('[deviceSelect] 当前设备 deviceId:', deviceId, 'type:', typeof deviceId, 'key:', key) - console.log('[deviceSelect] 当前设备 deviceCode:', deviceCode) - console.log('[deviceSelect] id匹配结果:', info ? '命中' : '未命中') - if (!info) { - console.log('[deviceSelect] 尝试 deviceCode fallback...') - for (const [k, v] of Object.entries(map)) { - console.log('[deviceSelect] storage[', k, '].deviceCode =', v?.deviceCode, 'vs 设备 code =', deviceCode, '匹配:', v?.deviceCode === deviceCode) - } + const res = await getMoldBrandPage({ pageSize: 100 }) + console.log('[deviceSelect] getMoldBrandPage 原始响应:', JSON.stringify(res)) + const root = res && res.data !== undefined ? res.data : res + console.log('[deviceSelect] root 类型:', typeof root, 'keys:', Object.keys(root || {})) + const pageData = root?.pageResult || root + const list = Array.isArray(pageData) ? pageData : (Array.isArray(pageData?.list) ? pageData.list : []) + console.log('[deviceSelect] 模具型号总数:', list.length, '前3条:', list.slice(0, 3).map(m => ({ name: m.name, deviceName: m.deviceName }))) + const map = new Map() + for (const mold of list) { + const deviceName = mold.deviceName + if (deviceName) { + if (!map.has(deviceName)) map.set(deviceName, []) + map.get(deviceName).push(mold.name || '') } - // fallback 检查 - const saved = uni.getStorageSync('_mountedMoldInfo') || null - console.log('[deviceSelect] 旧版 _mountedMoldInfo:', saved) - console.log('[deviceSelect] 设备台账字段 currentMold:', device?.currentMold, 'moldName:', device?.moldName, 'moldId:', device?.moldId) - } - - if (info?.mold) { - return info.mold.name || info.mold.moldName || '-' } + deviceMoldMap.value = map + console.log('[deviceSelect] 在机模具映射表:', map.size, '个设备, keys:', [...map.keys()]) } catch (e) { - console.warn('[deviceSelect] read _mountedMoldInfoMap error', e) + console.error('loadDeviceMolds error', e) } +} - // 2. 兼容旧版 _mountedMoldInfo - let saved = null - try { saved = uni.getStorageSync('_mountedMoldInfo') || null } catch {} - if (saved) { - const idMatch = deviceId != null && String(saved.deviceId) === String(deviceId) - const codeMatch = deviceCode && saved.deviceCode === deviceCode - if (idMatch || codeMatch) { - return saved.mold?.name || saved.mold?.moldName || '-' - } +// 当前在机模具 - 从模具型号接口获取 +function getCurrentMold(device) { + if (!device) return t('moldOperate.noMoldOnDevice') + const deviceName = device.deviceName + if (deviceName && deviceMoldMap.value.has(deviceName)) { + const names = deviceMoldMap.value.get(deviceName) || [] + return names.join(',') } - - // 3. fallback 设备台账静态字段 - const staticMold = textValue(device.currentMold || device.moldName || device.moldId) - return staticMold === '-' ? t('moldOperate.noMoldOnDevice') : staticMold + // fallback 设备台账静态字段 + return textValue(device.currentMold || device.moldName) || t('moldOperate.noMoldOnDevice') } function flattenLineTree(nodes, parentId) { @@ -269,7 +248,7 @@ function handleConfirm() { } onShow(async () => { - await Promise.allSettled([loadDevices(), loadLineTree()]) + await Promise.allSettled([loadDevices(), loadLineTree(), loadDeviceMolds()]) }) diff --git a/src/pages_function/pages/moldoperate/dismount.vue b/src/pages_function/pages/moldoperate/dismount.vue index ada878e..acd1683 100644 --- a/src/pages_function/pages/moldoperate/dismount.vue +++ b/src/pages_function/pages/moldoperate/dismount.vue @@ -80,16 +80,6 @@ {{ t('moldOperate.product') }} {{ textValue(selectedMold.productName) }} - - {{ t('moldOperate.mountTime') }} - {{ textValue(selectedMold.mountTime) }} - - - - - {{ t('moldOperate.useCount') }} - {{ formatUseCount(selectedMold.useCount) }} - @@ -117,40 +107,15 @@ {{ t('moldOperate.operator') + ' & ' + t('moldOperate.remark') }} - - - - *{{ t('moldOperate.operator') }} - - - - {{ selectedOperator ? selectedOperator.label : t('moldOperate.placeholderOperator') }} - - - - - - - {{ item.label }} - - - 暂无数据 - + + + + *{{ t('moldOperate.operator') }} + + {{ currentUserName }} - {{ t('moldOperate.remark') }} @@ -202,11 +167,17 @@ import { computed, reactive, ref } from 'vue' import { onShow } from '@dcloudio/uni-app' import { useI18n } from 'vue-i18n' import NavBar from '@/components/common/NavBar.vue' -import { getLowerMoldList, getDeviceLedgerList, createMoldOperate } from '@/api/mes/moldoperate' +import { getDeviceLedgerList, createMoldOperate } from '@/api/mes/moldoperate' +import { getMoldBrandPage } from '@/api/mes/mold' +import useUserStore from '@/store/modules/user' import { getDeviceLineTree } from '@/api/mes/deviceLine' -import { getSimpleUserList } from '@/api/system/user' const { t } = useI18n() +const userStore = useUserStore() + +// 当前登录用户 +const currentUserName = computed(() => userStore.name || '未知用户') +const currentUserId = computed(() => userStore.userId) const lineInfoMap = ref(new Map()) // deviceLine id → { name, parentId, parentChain } @@ -282,10 +253,7 @@ const tempSelectedMoldId = ref(null) // ---- 操作人与备注 ---- const remarkText = ref('') -const operatorOptions = ref([]) const selectedOperator = ref(null) -const operatorIndex = ref(-1) -const showOperatorDropdown = ref(false) // ---- 工具函数 ---- function textValue(v) { @@ -295,12 +263,7 @@ function textValue(v) { return s || '-' } -function formatUseCount(count) { - if (count == null) return '-' - const num = Number(count) - if (isNaN(num)) return String(count) - return num.toLocaleString() + ' ' + t('moldOperate.countUnit') -} + function formatTime(time) { if (!time) return '-' @@ -374,45 +337,20 @@ function findArr(obj, d = 0) { return [] } -async function loadLowerMolds(deviceId) { +async function loadLowerMolds(deviceName) { lowerMoldLoading.value = true try { - // ====== 策略1:优先从持久化存储读取(按设备ID索引,不会互覆盖)====== - let map = {} - try { map = uni.getStorageSync('_mountedMoldInfoMap') || {} } catch {} - const savedInfo = map[String(deviceId)] || null - - console.log('[下模] 持久化在机模具信息 =', savedInfo ? JSON.stringify(savedInfo) : 'null', 'deviceId=', deviceId) - - if (savedInfo && savedInfo.mold) { - console.log('[下模] 命中持久化数据, deviceId=', deviceId) - const m = savedInfo.mold - lowerMoldOptions.value = [{ - id: m.id, - moldId: m.id, - moldName: m.name || m.moldName || '-', - moldCode: m.code || m.moldCode || '-', - productName: m.productName || '-', - mountTime: formatTime(savedInfo.mountTime), - useCount: '-' - }] - console.log('[下模] 使用持久化数据 =', JSON.stringify(lowerMoldOptions.value[0])) - return - } - console.log('[下模] 未命中持久化数据,进入接口查询') - - // ====== 策略2:fallback - 调用在机模具接口 ====== - let list = [] - try { - const res = await getLowerMoldList(deviceId) - const root = (res && res.data !== undefined) ? res.data : res - list = findArr(root) - } catch (apiErr) { - console.warn('[下模] getLowerMoldList 接口异常', apiErr) - } - - lowerMoldOptions.value = list - console.log('[下模] loadLowerMolds 返回 list.length =', list.length) + const res = await getMoldBrandPage({ deviceName, pageSize: 100 }) + const root = (res && res.data !== undefined) ? res.data : res + const pageData = root?.pageResult || root + const list = Array.isArray(pageData) ? pageData : (Array.isArray(pageData?.list) ? pageData.list : []) + lowerMoldOptions.value = list.map(m => ({ + id: m.id, + moldId: m.id, + moldName: m.name || '-', + moldCode: m.code || '-', + productName: m.productName || '-' + })) } catch (e) { console.error('loadLowerMolds error', e) } finally { @@ -450,8 +388,8 @@ function selectDevice(device) { selectedDevice.value = device || {} moldsLoaded.value = false selectedMold.value = {} - if (device?.id) { - loadLowerMolds(device.id).then(() => { + if (device?.deviceName) { + loadLowerMolds(device.deviceName).then(() => { moldsLoaded.value = true if (lowerMoldOptions.value.length > 0) { const first = lowerMoldOptions.value[0] @@ -459,9 +397,7 @@ function selectDevice(device) { id: first.id || first.moldId, moldName: first.moldName || first.name, moldCode: first.moldCode || first.code, - productName: first.productName || '-', - mountTime: first.mountTime || '-', - useCount: first.useCount ?? '-' + productName: first.productName || '-' } } }) @@ -475,12 +411,12 @@ function openDevicePicker() { // ---- 在机模具选择(更换下模对象)---- function openLowerMoldPicker() { - if (!selectedDevice.value?.id) { + if (!selectedDevice.value?.deviceName) { uni.showToast({ title: t('moldOperate.validatorDeviceRequired'), icon: 'none' }) return } tempSelectedMoldId.value = selectedMold.value ? String(selectedMold.value.id || selectedMold.value.moldId) : null - loadLowerMolds(selectedDevice.value.id).then(() => { + loadLowerMolds(selectedDevice.value.deviceName).then(() => { lowerMoldPickerRef.value?.open() }) } @@ -494,9 +430,7 @@ function confirmLowerMoldSelection() { id: mold.id || mold.moldId, moldName: mold.moldName || mold.name, moldCode: mold.moldCode || mold.code, - productName: mold.productName || '-', - mountTime: mold.mountTime || '-', - useCount: mold.useCount ?? '-' + productName: mold.productName || '-' } } lowerMoldPickerRef.value?.close() @@ -504,34 +438,16 @@ function confirmLowerMoldSelection() { function closeLowerMoldPicker() { lowerMoldPickerRef.value?.close() } -// ---- 操作人列表加载 ---- -async function loadOperators() { - try { - const res = await getSimpleUserList() - const data = Array.isArray(res) ? res : (Array.isArray(res?.data) ? res.data : []) - operatorOptions.value = data.map((u) => ({ - value: u.id || u.userId, - label: u.nickname || u.userName || u.name || String(u.id || '') - })) - } catch (e) { - console.error('loadOperators error', e) +// ---- 操作人自动设置为当前登录用户 ---- +function autoSetOperator() { + if (currentUserId.value && currentUserName.value) { + selectedOperator.value = { + value: currentUserId.value, + label: currentUserName.value + } } } -function toggleOperatorDropdown() { - showOperatorDropdown.value = !showOperatorDropdown.value -} - -function closeOperatorDropdown() { - showOperatorDropdown.value = false -} - -function handleSelectOperator(item, idx) { - selectedOperator.value = item - operatorIndex.value = idx - closeOperatorDropdown() -} - function goToHistory() { uni.navigateTo({ url: '/pages_function/pages/moldoperate/history?type=down' }) } @@ -578,21 +494,11 @@ async function handleConfirm() { console.log('[下模] 提交参数 =', JSON.stringify(payload)) await createMoldOperate(payload) uni.showToast({ title: t('functionCommon.createSuccess'), icon: 'success' }) - // 下模成功后清除该设备的持久化数据 - if (selectedDevice.value?.id) { - try { - const map = uni.getStorageSync('_mountedMoldInfoMap') || {} - delete map[String(selectedDevice.value.id)] - uni.setStorageSync('_mountedMoldInfoMap', map) - } catch {} - } // 重置表单 selectedDevice.value = {} selectedMold.value = {} lowerMoldOptions.value = [] remarkText.value = '' - selectedOperator.value = null - operatorIndex.value = -1 } catch (e) { console.error('[下模] 保存失败 =', e) const errMsg = e?.msg || (typeof e === 'string' ? e : e?.message) || '系统异常' @@ -608,7 +514,8 @@ function handleCancel() { } onShow(async () => { - await Promise.allSettled([loadDevices(), loadLineTree(), loadOperators()]) + autoSetOperator() + await Promise.allSettled([loadDevices(), loadLineTree()]) // 从 globalData 读取设备选择页回传的设备 const device = getApp().globalData._deviceSelectResult if (device) { @@ -854,6 +761,11 @@ onShow(async () => { font-size: 27rpx; color: #333; background: #f9fafb; + + &.readonly-input { + background: #f8fafc; + border-color: #f0f0f0; + } } .dropdown-value { diff --git a/src/pages_function/pages/moldoperate/index.vue b/src/pages_function/pages/moldoperate/index.vue index 656b25d..be8e0ff 100644 --- a/src/pages_function/pages/moldoperate/index.vue +++ b/src/pages_function/pages/moldoperate/index.vue @@ -115,35 +115,8 @@ *{{ t('moldOperate.operator') }} - - - - - {{ selectedOperator ? selectedOperator.label : t('moldOperate.placeholderOperator') }} - - - - - - - - {{ item.label }} - - - 暂无数据 - - + + {{ currentUserName }} @@ -176,9 +149,15 @@ import { onShow } from '@dcloudio/uni-app' import { useI18n } from 'vue-i18n' import NavBar from '@/components/common/NavBar.vue' import { getDeviceLedgerList, createMoldOperate } from '@/api/mes/moldoperate' -import { getSimpleUserList } from '@/api/system/user' +import { getMoldBrandPage } from '@/api/mes/mold' +import useUserStore from '@/store/modules/user' const { t } = useI18n() +const userStore = useUserStore() + +// 当前登录用户 +const currentUserName = computed(() => userStore.name || '未知用户') +const currentUserId = computed(() => userStore.userId) // ---- 工具函数 ---- function textValue(v) { @@ -217,9 +196,7 @@ const selectedDevice = ref({}) const selectedMountMolds = ref([]) const tempSelectedDeviceId = ref(null) const remarkText = ref('') -const operatorOptions = ref([]) const selectedOperator = ref(null) -const operatorIndex = ref(-1) // 设备状态 - 上模 const deviceStatusClass = computed(() => { @@ -241,7 +218,7 @@ const deviceStatusLabel = computed(() => { return map[status] || textValue(selectedDevice.value?.deviceStatus) || '-' }) -const MOLD_STATUS_MAP = { 0: '在机', 1: '待用', 2: '维修', 3: '报废' } +const MOLD_STATUS_MAP = { 0: '在机', 1: '待用', 2: '维修', 3: '报废', 4: '在库' } function getMoldStatusText(s) { return MOLD_STATUS_MAP[s] || textValue(s) } function getMoldStatusClass(s) { if (s === 0) return 'inuse-tag' @@ -250,91 +227,54 @@ function getMoldStatusClass(s) { return 'standby-tag' } -// ---- 持久化在机模具信息(按设备ID索引,避免多设备覆盖)---- -const MOUNTED_MOLD_KEY = '_mountedMoldInfoMap' -function getMountedMoldMap() { - try { - const data = uni.getStorageSync(MOUNTED_MOLD_KEY) || {} - return data - } catch (e) { - console.warn('[上模] getMountedMoldMap 异常', e) - return {} +// 当前在机模具 - 通过模具分页接口查询(machineId = 当前设备ID) +const currentMoldList = ref([]) + +async function fetchCurrentMolds(deviceName) { + if (!deviceName) { + currentMoldList.value = [] + return } -} -function getMountedMoldByDevice(deviceId) { - if (!deviceId) return null - const map = getMountedMoldMap() - const key = String(deviceId) - return map[key] || null -} -function saveMountedMoldInfo(info) { - if (!info || !info.deviceId) return try { - const map = getMountedMoldMap() - map[String(info.deviceId)] = info - uni.setStorageSync(MOUNTED_MOLD_KEY, map) - console.log('[上模] saveMountedMoldInfo 写入成功, deviceId=', info.deviceId, 'map keys=', Object.keys(map)) + // 查模具型号表,按当前设备名称筛选 + const params = { deviceName, pageSize: 100 } + console.log('[上模] fetchCurrentMolds 请求参数:', JSON.stringify(params)) + const res = await getMoldBrandPage(params) + console.log('[上模] fetchCurrentMolds 原始响应:', JSON.stringify(res)) + const root = res && res.data !== undefined ? res.data : res + const pageData = root?.pageResult || root + const list = Array.isArray(pageData) ? pageData : (Array.isArray(pageData?.list) ? pageData.list : []) + console.log('[上模] fetchCurrentMolds 解析后:', list.length, '条数据', list.map(m => ({ id: m.id, name: m.name, currentDevice: m.currentDevice }))) + currentMoldList.value = list } catch (e) { - console.warn('[上模] saveMountedMoldInfo 异常', e) + console.error('fetchCurrentMolds error', e) + currentMoldList.value = [] } } -function clearMountedMoldInfo(deviceId) { - if (!deviceId) { - try { uni.removeStorageSync(MOUNTED_MOLD_KEY) } catch {} - return - } - try { - const map = getMountedMoldMap() - delete map[String(deviceId)] - uni.setStorageSync(MOUNTED_MOLD_KEY, map) - } catch {} -} -// 当前在机模具 - 优先从持久化存储获取(实时),否则用设备台账静态字段 const currentMoldDisplay = computed(() => { if (!selectedDevice.value?.id) return '-' - const saved = getMountedMoldByDevice(selectedDevice.value.id) - if (saved) { - console.log('[上模] currentMoldDisplay 命中持久化, deviceId=', selectedDevice.value.id, 'mold=', saved.mold?.name || saved.mold?.moldName) - return saved.mold?.name || saved.mold?.moldName || '-' + if (currentMoldList.value.length > 0) { + return currentMoldList.value.map(m => m.name || '').filter(Boolean).join(',') || '-' } - return textValue(selectedDevice.value.currentMold) + return t('moldOperate.noMoldOnDevice') }) -// ---- 操作人列表加载 ---- -async function loadOperators() { - try { - const res = await getSimpleUserList() - const data = Array.isArray(res) ? res : (Array.isArray(res?.data) ? res.data : []) - operatorOptions.value = data.map((u) => ({ - value: u.id || u.userId, - label: u.nickname || u.userName || u.name || String(u.id || '') - })) - } catch (e) { - console.error('loadOperators error', e) +// ---- 操作人自动设置为当前登录用户 ---- +function autoSetOperator() { + if (currentUserId.value && currentUserName.value) { + selectedOperator.value = { + value: currentUserId.value, + label: currentUserName.value + } } } -const showOperatorDropdown = ref(false) - -function toggleOperatorDropdown() { - showOperatorDropdown.value = !showOperatorDropdown.value -} - -function closeOperatorDropdown() { - showOperatorDropdown.value = false -} - -function handleSelectOperator(item, idx) { - selectedOperator.value = item - operatorIndex.value = idx - closeOperatorDropdown() -} - function selectDevice(device) { selectedDevice.value = device || {} tempSelectedDeviceId.value = device ? device.id : null selectedMountMolds.value = [] + if (device?.deviceName) fetchCurrentMolds(device.deviceName) } function openDevicePicker() { @@ -394,22 +334,6 @@ async function handleConfirmMount() { console.log('=== 上模返回 ===', JSON.stringify(res)) uni.showToast({ title: t('functionCommon.createSuccess'), icon: 'success' }) - // 上模成功后持久化保存,供下模/设备选择页读取 - if (selectedMountMolds.value.length > 0) { - const info = { - deviceId: selectedDevice.value.id, - deviceCode: selectedDevice.value.deviceCode, - deviceName: selectedDevice.value.deviceName, - mold: selectedMountMolds.value[0], - mountTime: new Date().toLocaleString() - } - saveMountedMoldInfo(info) - // 同步到 globalData(兼容旧逻辑) - getApp().globalData._mountedMoldInfo = info - getApp().globalData._mountedMoldInfoMap = getMountedMoldMap() - console.log('=== 已保存在机模具信息 ===', JSON.stringify(info)) - } - selectedDevice.value = {} selectedMountMolds.value = [] } catch (e) { @@ -449,8 +373,6 @@ function handleCancel() { selectedDevice.value = {} selectedMountMolds.value = [] remarkText.value = '' - selectedOperator.value = null - operatorIndex.value = -1 // 返回上一页(管理页面) uni.navigateBack({ fail: () => uni.switchTab({ url: '/pages/work' }) @@ -462,7 +384,8 @@ function goToHistory() { } onShow(async () => { - await Promise.allSettled([loadDevices(), loadOperators()]) + autoSetOperator() + await Promise.allSettled([loadDevices()]) // 从 globalData 读取设备选择页回传的设备 const device = getApp().globalData._deviceSelectResult if (device) { @@ -706,6 +629,11 @@ onShow(async () => { font-size: 27rpx; color: #333; background: #f9fafb; + + &.readonly-input { + background: #f8fafc; + border-color: #f0f0f0; + } } .dropdown-value { diff --git a/src/pages_function/pages/moldoperate/moldSelect.vue b/src/pages_function/pages/moldoperate/moldSelect.vue index cfe4b3d..f867c66 100644 --- a/src/pages_function/pages/moldoperate/moldSelect.vue +++ b/src/pages_function/pages/moldoperate/moldSelect.vue @@ -77,7 +77,7 @@ function textValue(v) { return s || '-' } -const STATUS_MAP = { 0: '在机', 1: '待用', 2: '维修', 3: '报废' } +const STATUS_MAP = { 0: '在机', 1: '待用', 2: '维修', 3: '报废', 4: '在库' } function getStatusText(s) { return STATUS_MAP[s] || textValue(s) } function getStatusClass(s) { if (s === 0) return 'in-use-tag' @@ -87,9 +87,11 @@ function getStatusClass(s) { } const filteredList = computed(() => { + // 排除在机状态的模具(status=0),不能重复上模 + const available = moldList.value.filter(m => Number(m.status) !== 0) const keyword = searchText.value.trim().toLowerCase() - if (!keyword) return moldList.value - return moldList.value.filter((m) => { + if (!keyword) return available + return available.filter((m) => { return (m.name || '').toLowerCase().includes(keyword) || (m.code || '').toLowerCase().includes(keyword) || (m.productName || '').toLowerCase().includes(keyword) diff --git a/src/utils/permissionMenu.js b/src/utils/permissionMenu.js index f431de9..f40c1ed 100644 --- a/src/utils/permissionMenu.js +++ b/src/utils/permissionMenu.js @@ -311,10 +311,12 @@ export function resolveMenuUrl(menu) { return directRoute } - const keys = [menu?.component, menu?.path, menu?.enName, menu?.name] + // 优先用 menu.name(中文,最不容易冲突),再用 component/path + const keys = [menu?.name, menu?.enName, menu?.component, menu?.path] for (const key of keys) { const normalizedKey = normalizeMenuKey(key) if (normalizedKey && MENU_ROUTE_MAP[normalizedKey]) { + console.log('[resolveMenuUrl] menu.name="', menu?.name, '" matched key="', normalizedKey, '" → route="', MENU_ROUTE_MAP[normalizedKey], '"') return MENU_ROUTE_MAP[normalizedKey] } } From 6fbb7fbc5adc4db69774dd5ee073742e45da6442 Mon Sep 17 00:00:00 2001 From: hwj Date: Tue, 16 Jun 2026 14:30:47 +0800 Subject: [PATCH 2/6] =?UTF-8?q?style=EF=BC=9A=E6=9B=B4=E6=8D=A2=E5=8E=8B?= =?UTF-8?q?=E7=BD=91-=E5=8E=8B=E7=BD=91=E6=97=B6=E9=97=B4=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=99=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/en-US.js | 4 ++ src/locales/zh-CN.js | 4 ++ .../pages/moldPressureNet/index.vue | 42 +++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/locales/en-US.js b/src/locales/en-US.js index 38a2237..6e9cec3 100644 --- a/src/locales/en-US.js +++ b/src/locales/en-US.js @@ -200,6 +200,7 @@ export default { loadFailed: 'Load failed', deleteSuccess: 'Deleted successfully', deleteFailed: 'Delete failed', + saveSuccess: 'Saved successfully', saveFailed: 'Save failed', createSuccess: 'Created successfully', updateSuccess: 'Updated successfully', @@ -1332,6 +1333,7 @@ export default { placeholderRequireDate: 'Select require date', placeholderAcceptedBy: 'Select repair user', placeholderConfirmBy: 'Select confirm user', + placeholderUserSearch: 'Search by nickname', placeholderMold: 'Select mold', placeholderMoldNameAuto: 'Auto filled', placeholderMoldCodeAuto: 'Auto filled', @@ -1351,6 +1353,7 @@ export default { moldNotFound: 'Mold not found', scanFailed: 'Scan failed', maxUploadCount: 'Max 9 images', + noUserData: 'No user data', saving: 'Saving', saveSuccess: 'Saved successfully', submitSuccess: 'Submitted successfully', @@ -1364,6 +1367,7 @@ export default { validatorFaultLevelRequired: 'Fault level is required', validatorIsShutdownRequired: 'Is shutdown is required', validatorFaultPhenomenonRequired: 'Fault phenomenon is required', + validatorUserRequired: 'Please select a user', validatorRepairStatusRequired: 'Repair result is required', validatorFinishDateRequired: 'Finish date is required', validatorConfirmDateRequired: 'Confirm date is required' diff --git a/src/locales/zh-CN.js b/src/locales/zh-CN.js index ef11324..29a25ba 100644 --- a/src/locales/zh-CN.js +++ b/src/locales/zh-CN.js @@ -200,6 +200,7 @@ export default { loadFailed: '加载失败', deleteSuccess: '删除成功', deleteFailed: '删除失败', + saveSuccess: '保存成功', saveFailed: '保存失败', createSuccess: '新增成功', updateSuccess: '更新成功', @@ -1335,6 +1336,7 @@ export default { placeholderRequireDate: '请选择报修日期', placeholderAcceptedBy: '请选择维修人员', placeholderConfirmBy: '请选择验收人员', + placeholderUserSearch: '请输入姓名搜索', placeholderMold: '请选择模具', placeholderMoldNameAuto: '自动带出', placeholderMoldCodeAuto: '自动带出', @@ -1354,6 +1356,7 @@ export default { moldNotFound: '未找到对应模具', scanFailed: '扫码失败', maxUploadCount: '最多上传 9 张图片', + noUserData: '暂无人员数据', saving: '保存中', saveSuccess: '保存成功', submitSuccess: '提交成功', @@ -1367,6 +1370,7 @@ export default { validatorFaultLevelRequired: '请选择故障等级', validatorIsShutdownRequired: '请选择是否停机', validatorFaultPhenomenonRequired: '请输入故障现象', + validatorUserRequired: '请选择人员', validatorRepairStatusRequired: '请选择维修结果', validatorFinishDateRequired: '请选择完成日期', validatorConfirmDateRequired: '请选择验收日期' diff --git a/src/pages_function/pages/moldPressureNet/index.vue b/src/pages_function/pages/moldPressureNet/index.vue index c901f4e..fa70621 100644 --- a/src/pages_function/pages/moldPressureNet/index.vue +++ b/src/pages_function/pages/moldPressureNet/index.vue @@ -83,7 +83,12 @@ {{ t('moldPressureNet.pressureNetTime') }}* - + {{ t('moldPressureNet.remark') }} @@ -317,6 +322,14 @@ function goHistory() { uni.navigateTo({ url: '/pages_function/pages/moldPressureNet/history' }) } +function onPressureNetTimeChange(value) { + const normalizedValue = normalizePressureNetTime(value) + pressureNetTime.value = normalizedValue + setTimeout(() => { + pressureNetTime.value = normalizePressureNetTime(pressureNetTime.value || value) || normalizedValue + }, 0) +} + async function handleSubmit() { if (submitLoading.value) return if (!selectedBrand.id) { @@ -327,7 +340,8 @@ async function handleSubmit() { uni.showToast({ title: t('moldPressureNet.selectSubMoldError'), icon: 'none' }) return } - if (!pressureNetTime.value) { + const normalizedPressureNetTime = normalizePressureNetTime(pressureNetTime.value) + if (!normalizedPressureNetTime) { uni.showToast({ title: t('moldPressureNet.selectReplaceTimeError'), icon: 'none' }) return } @@ -342,12 +356,12 @@ async function handleSubmit() { moldBrandName: selectedBrand.name, moldId: moldId, moldName: selected?.name || '', - pressureNetTime: pressureNetTime.value, + pressureNetTime: normalizedPressureNetTime, remark: remark.value.trim() || undefined } }) await createPressureNetRecord(createReqVOList) - uni.showToast({ title: t('moldPressureNet.submitSuccess'), icon: 'success' }) + uni.showToast({ title: t('functionCommon.saveSuccess'), icon: 'success' }) // 清空表单 selectedBrand.id = '' selectedBrand.name = '' @@ -362,6 +376,26 @@ async function handleSubmit() { submitLoading.value = false } } + +function normalizePressureNetTime(value) { + const text = String(value || '').trim().replace(/\//g, '-') + const dateOnlyMatch = text.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(?:undefined|null|选择时间|select time))?$/i) + if (dateOnlyMatch) { + return `${dateOnlyMatch[1]} ${getCurrentTime()}` + } + const dateTimeMatch = text.match(/^(\d{4}-\d{2}-\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?$/) + if (!dateTimeMatch) return '' + const [, date, hour, minute, second = '00'] = dateTimeMatch + return `${date} ${hour}:${minute}:${second}` +} + +function getCurrentTime() { + const date = new Date() + const hour = String(date.getHours()).padStart(2, '0') + const minute = String(date.getMinutes()).padStart(2, '0') + const second = String(date.getSeconds()).padStart(2, '0') + return `${hour}:${minute}:${second}` +} From 773e58c0afb0a0edaace2ce7d1350d47fdfe69e8 Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Tue, 16 Jun 2026 15:56:54 +0800 Subject: [PATCH 4/6] =?UTF-8?q?style:=20=E4=B8=8A=E6=A8=A1/=E4=B8=8B?= =?UTF-8?q?=E6=A8=A1=E4=BF=AE=E5=A4=8D=E6=89=AB=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/moldoperate/deviceSelect.vue | 4 - .../pages/moldoperate/dismount.vue | 23 ++++- .../pages/moldoperate/index.vue | 97 +++++++++++++++++-- src/utils/permissionMenu.js | 1 - 4 files changed, 108 insertions(+), 17 deletions(-) diff --git a/src/pages_function/pages/moldoperate/deviceSelect.vue b/src/pages_function/pages/moldoperate/deviceSelect.vue index 8714cd9..cac770e 100644 --- a/src/pages_function/pages/moldoperate/deviceSelect.vue +++ b/src/pages_function/pages/moldoperate/deviceSelect.vue @@ -112,12 +112,9 @@ const deviceMoldMap = ref(new Map()) async function loadDeviceMolds() { try { const res = await getMoldBrandPage({ pageSize: 100 }) - console.log('[deviceSelect] getMoldBrandPage 原始响应:', JSON.stringify(res)) const root = res && res.data !== undefined ? res.data : res - console.log('[deviceSelect] root 类型:', typeof root, 'keys:', Object.keys(root || {})) const pageData = root?.pageResult || root const list = Array.isArray(pageData) ? pageData : (Array.isArray(pageData?.list) ? pageData.list : []) - console.log('[deviceSelect] 模具型号总数:', list.length, '前3条:', list.slice(0, 3).map(m => ({ name: m.name, deviceName: m.deviceName }))) const map = new Map() for (const mold of list) { const deviceName = mold.deviceName @@ -127,7 +124,6 @@ async function loadDeviceMolds() { } } deviceMoldMap.value = map - console.log('[deviceSelect] 在机模具映射表:', map.size, '个设备, keys:', [...map.keys()]) } catch (e) { console.error('loadDeviceMolds error', e) } diff --git a/src/pages_function/pages/moldoperate/dismount.vue b/src/pages_function/pages/moldoperate/dismount.vue index acd1683..8b11943 100644 --- a/src/pages_function/pages/moldoperate/dismount.vue +++ b/src/pages_function/pages/moldoperate/dismount.vue @@ -364,11 +364,26 @@ function handleScan() { onlyFromCamera: false, scanType: ['qrCode', 'barCode'], success(res) { - const code = res.result?.trim() + const code = (res.result || '').trim() if (!code) return - const matched = deviceOptions.value.find((d) => - d.raw.deviceCode === code || String(d.raw.code) === code || d.label.includes(code) - ) + let matched = null + if (code.toUpperCase().startsWith('EQUIPMENT-')) { + const idFromQr = code.replace(/EQUIPMENT-/i, '') + matched = deviceOptions.value.find((d) => String(d.raw.id) === idFromQr) + } + if (!matched) { + matched = deviceOptions.value.find((d) => + Object.values(d.raw).some((v) => + typeof v === 'string' && v.trim().toUpperCase() === code.toUpperCase() + ) || d.label.toUpperCase().includes(code.toUpperCase()) + ) + } + if (!matched) { + const idMatch = code.match(/(\d+)$/) + if (idMatch) { + matched = deviceOptions.value.find((d) => String(d.raw.id) === idMatch[1]) + } + } if (matched) { selectDevice(matched.raw) } else { diff --git a/src/pages_function/pages/moldoperate/index.vue b/src/pages_function/pages/moldoperate/index.vue index be8e0ff..20cbaf9 100644 --- a/src/pages_function/pages/moldoperate/index.vue +++ b/src/pages_function/pages/moldoperate/index.vue @@ -150,6 +150,7 @@ import { useI18n } from 'vue-i18n' import NavBar from '@/components/common/NavBar.vue' import { getDeviceLedgerList, createMoldOperate } from '@/api/mes/moldoperate' import { getMoldBrandPage } from '@/api/mes/mold' +import { getDeviceLineTree } from '@/api/mes/deviceLine' import useUserStore from '@/store/modules/user' const { t } = useI18n() @@ -190,6 +191,70 @@ async function loadDevices() { } } +// 产线树 - 用于设备产线名称转换 +const lineInfoMap = ref(new Map()) + +function flattenLineTree(nodes, parentId) { + if (!Array.isArray(nodes)) return + for (const node of nodes) { + if (node.id != null && node.name != null) { + lineInfoMap.value.set(String(node.id), { + id: node.id, + name: node.name, + parentId: node.parentId != null ? node.parentId : (parentId || null), + parentChain: node.parentChain || '' + }) + } + if (Array.isArray(node.children)) { + flattenLineTree(node.children, node.id) + } + } +} + +function getTopLineName(deviceLineId) { + if (deviceLineId == null) return '-' + const node = lineInfoMap.value.get(String(deviceLineId)) + if (!node) return '-' + if (node.parentChain) { + const firstId = node.parentChain.split(',')[0]?.trim() + if (firstId) { + const topNode = lineInfoMap.value.get(firstId) + if (topNode) return topNode.name + } + } + let current = node + const visited = new Set() + while (current.parentId != null && current.parentId > 0 && !visited.has(current.id)) { + visited.add(current.id) + const parent = lineInfoMap.value.get(String(current.parentId)) + if (!parent) break + current = parent + } + return current.name || '-' +} + +async function loadLineTree() { + if (lineInfoMap.value.size > 0) return + try { + const res = await getDeviceLineTree() + const tree = (res && res.data !== undefined) ? res.data : res + const nodes = Array.isArray(tree) ? tree : (tree?.list || tree?.children || []) + flattenLineTree(nodes) + } catch (e) { + console.error('load line tree error', e) + } +} + +// 设置设备产线名称(从产线树转换) +function setDeviceLineName(device) { + if (device && device.deviceLine != null) { + const lineName = getTopLineName(device.deviceLine) + if (lineName && lineName !== '-') { + device.workshopName = lineName + } + } +} + // ==================== 上模模块 ==================== const selectedDevice = ref({}) @@ -238,13 +303,10 @@ async function fetchCurrentMolds(deviceName) { try { // 查模具型号表,按当前设备名称筛选 const params = { deviceName, pageSize: 100 } - console.log('[上模] fetchCurrentMolds 请求参数:', JSON.stringify(params)) const res = await getMoldBrandPage(params) - console.log('[上模] fetchCurrentMolds 原始响应:', JSON.stringify(res)) const root = res && res.data !== undefined ? res.data : res const pageData = root?.pageResult || root const list = Array.isArray(pageData) ? pageData : (Array.isArray(pageData?.list) ? pageData.list : []) - console.log('[上模] fetchCurrentMolds 解析后:', list.length, '条数据', list.map(m => ({ id: m.id, name: m.name, currentDevice: m.currentDevice }))) currentMoldList.value = list } catch (e) { console.error('fetchCurrentMolds error', e) @@ -350,12 +412,31 @@ function handleScan() { onlyFromCamera: false, scanType: ['qrCode', 'barCode'], success(res) { - const code = res.result?.trim() + const code = (res.result || '').trim() if (!code) return - const matched = deviceOptions.value.find((d) => - d.raw.deviceCode === code || String(d.raw.code) === code || d.label.includes(code) - ) + let matched = null + // 格式1: EQUIPMENT-{设备ID} + if (code.toUpperCase().startsWith('EQUIPMENT-')) { + const idFromQr = code.replace(/EQUIPMENT-/i, '') + matched = deviceOptions.value.find((d) => String(d.raw.id) === idFromQr) + } + // 格式2: 匹配设备字段或 label + if (!matched) { + matched = deviceOptions.value.find((d) => + Object.values(d.raw).some((v) => + typeof v === 'string' && v.trim().toUpperCase() === code.toUpperCase() + ) || d.label.toUpperCase().includes(code.toUpperCase()) + ) + } + // 格式3: 提取末尾数字匹配设备ID + if (!matched) { + const idMatch = code.match(/(\d+)$/) + if (idMatch) { + matched = deviceOptions.value.find((d) => String(d.raw.id) === idMatch[1]) + } + } if (matched) { + setDeviceLineName(matched.raw) selectDevice(matched.raw) } else { uni.showToast({ title: t('moldOperate.deviceNotFound'), icon: 'none' }) @@ -385,7 +466,7 @@ function goToHistory() { onShow(async () => { autoSetOperator() - await Promise.allSettled([loadDevices()]) + await Promise.allSettled([loadDevices(), loadLineTree()]) // 从 globalData 读取设备选择页回传的设备 const device = getApp().globalData._deviceSelectResult if (device) { diff --git a/src/utils/permissionMenu.js b/src/utils/permissionMenu.js index baf5a51..885dbe5 100644 --- a/src/utils/permissionMenu.js +++ b/src/utils/permissionMenu.js @@ -317,7 +317,6 @@ export function resolveMenuUrl(menu) { for (const key of keys) { const normalizedKey = normalizeMenuKey(key) if (normalizedKey && MENU_ROUTE_MAP[normalizedKey]) { - console.log('[resolveMenuUrl] menu.name="', menu?.name, '" matched key="', normalizedKey, '" → route="', MENU_ROUTE_MAP[normalizedKey], '"') return MENU_ROUTE_MAP[normalizedKey] } } From 16d67cc1ddff0270b81b00ee7b2ac7705c84d97c Mon Sep 17 00:00:00 2001 From: hwj Date: Tue, 16 Jun 2026 16:59:55 +0800 Subject: [PATCH 5/6] =?UTF-8?q?style=EF=BC=9A=E6=9B=B4=E6=8D=A2=E5=8E=8B?= =?UTF-8?q?=E7=BD=91-=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages_function/pages/moldPressureNet/index.vue | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/pages_function/pages/moldPressureNet/index.vue b/src/pages_function/pages/moldPressureNet/index.vue index fa70621..0bc0e87 100644 --- a/src/pages_function/pages/moldPressureNet/index.vue +++ b/src/pages_function/pages/moldPressureNet/index.vue @@ -3,8 +3,7 @@ @@ -400,8 +399,7 @@ function getCurrentTime() {