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 @@
-
- {{ t('moldPressureNet.history') }}
+
@@ -400,8 +399,7 @@ function getCurrentTime() {