From f180d30cbbcb52767197bee350be86d85c8dc0cb Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 28 May 2026 15:13:49 +0800 Subject: [PATCH 01/20] =?UTF-8?q?feat=EF=BC=9A=E7=BB=B4=E4=BF=AE=E5=8D=95?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mes/dvrepair/index.ts | 10 + src/components/UploadFile/src/UploadImgs.vue | 13 +- src/locales/en.ts | 20 + src/locales/zh-CN.ts | 20 + src/views/mes/dvrepair/DvRepairForm.vue | 961 +++++++++++++------ src/views/mes/dvrepair/index.vue | 43 +- 6 files changed, 764 insertions(+), 303 deletions(-) diff --git a/src/api/mes/dvrepair/index.ts b/src/api/mes/dvrepair/index.ts index f3f9c4b7..881b088e 100644 --- a/src/api/mes/dvrepair/index.ts +++ b/src/api/mes/dvrepair/index.ts @@ -15,6 +15,16 @@ export interface DvRepairVO { finishDate: Date // 完成日期 confirmDate: Date // 验收日期 repairResult: string // 维修结果 + repairStatus?: string // 维修结果状态 + faultPhenomenon?: string // 故障现象 + faultDescription?: string // 故障描述 + faultImages?: string // 故障图片,逗号分隔 + downtimeDuration?: string // 停机时长 + faultReason?: string // 故障原因 + handlingMeasures?: string // 处理措施 + replacementParts?: string // 更换配件 + repairContent?: string // 维修内容 + repairedImages?: string // 维修后图片,逗号分隔 acceptedBy: string // 维修人员 confirmBy: string // 验收人员 status: string // 单据状态 diff --git a/src/components/UploadFile/src/UploadImgs.vue b/src/components/UploadFile/src/UploadImgs.vue index 86e1109c..6bd31db1 100644 --- a/src/components/UploadFile/src/UploadImgs.vue +++ b/src/components/UploadFile/src/UploadImgs.vue @@ -119,18 +119,27 @@ interface UploadEmits { } const emit = defineEmits() +const unwrapUploadPayload = (res: any) => { + if (!res) return undefined + const payload = res.data ?? res + if (payload && typeof payload === 'object' && payload.data) { + return payload.data + } + return payload +} + const getUrlFromRes = (res: any): string => { if (!res) return '' if (typeof res === 'string') return res if (typeof res.data === 'string') return res.data - const data = res.data || res + const data = unwrapUploadPayload(res) if (typeof data === 'string') return data if (data.fileUrl) return data.fileUrl return '' } const getNameFromRes = (res: any, url: string): string => { - const data = res && res.data ? res.data : res + const data = unwrapUploadPayload(res) if (data && typeof data === 'object' && data.fileName) return data.fileName if (!url) return '' const idx = url.lastIndexOf('/') diff --git a/src/locales/en.ts b/src/locales/en.ts index 7e2ddee2..49418503 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1584,6 +1584,15 @@ export default { finishDate: 'Finish Date', confirmDate: 'Accept Date', repairResult: 'Repair Result', + faultPhenomenon: 'Fault Phenomenon', + faultDescription: 'Fault Description', + faultImages: 'On-site Images', + downtimeDuration: 'Downtime Duration', + faultReason: 'Fault Reason', + handlingMeasures: 'Handling Measures', + replacementParts: 'Replacement Parts', + repairContent: 'Repair Content', + repairedImages: 'After-repair Images', repairStatus: 'Result', status: 'Order Status', deviceTypeDevice: 'Device', @@ -1623,7 +1632,16 @@ export default { placeholderRequireDate: 'Select request date', placeholderFinishDate: 'Select finish date', placeholderConfirmDate: 'Select accept date', + placeholderRepairResult: 'Please select repair result', placeholderAutoFill: 'Auto fill', + placeholderFaultPhenomenon: 'Please enter fault phenomenon', + placeholderFaultDescription: 'Please enter fault description', + placeholderDowntimeDuration: 'Please enter downtime duration', + placeholderFaultReason: 'Please enter fault reason', + placeholderHandlingMeasures: 'Please enter handling measures', + placeholderReplacementParts: 'Please enter replacement parts (optional)', + placeholderRepairContent: 'Please describe the repair process and result', + placeholderRemark: 'Please enter remarks within 300 characters', placeholderLineSubjectCode: 'Please input repair code', placeholderLineSubjectName: 'Please input repair name', placeholderLineSubjectContent: 'Please input repair content', @@ -1637,6 +1655,8 @@ export default { validatorFinishDateRequired: 'Finish date can not be empty', validatorConfirmDateRequired: 'Accept date can not be empty', validatorRepairResultRequired: 'Repair result can not be empty', + validatorFaultPhenomenonRequired: 'Fault phenomenon can not be empty', + validatorComponentRequired: 'Component can not be empty', validatorLineRepairIdRequired: 'Repair order ID can not be empty', validatorLineSubjectIdRequired: 'Item ID can not be empty', validatorLineSubjectCodeRequired: 'Item code can not be empty', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 627218dc..6e9a3026 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -1581,6 +1581,15 @@ export default { finishDate: '完成日期', confirmDate: '验收日期', repairResult: '维修结果', + faultPhenomenon: '故障现象', + faultDescription: '故障描述', + faultImages: '现场图片', + downtimeDuration: '停机时长', + faultReason: '故障原因', + handlingMeasures: '处理措施', + replacementParts: '更换配件', + repairContent: '维修总结 / 维修内容', + repairedImages: '附件 / 维修后图片', repairStatus: '结果', status: '单据状态', deviceTypeDevice: '设备', @@ -1620,7 +1629,16 @@ export default { placeholderRequireDate: '选择报修日期', placeholderFinishDate: '选择完成日期', placeholderConfirmDate: '选择验收日期', + placeholderRepairResult: '请选择维修结果', placeholderAutoFill: '自动带出', + placeholderFaultPhenomenon: '请输入故障现象', + placeholderFaultDescription: '请输入故障描述', + placeholderDowntimeDuration: '请输入停机时长', + placeholderFaultReason: '请输入故障原因', + placeholderHandlingMeasures: '请输入处理措施', + placeholderReplacementParts: '请输入更换配件(可选)', + placeholderRepairContent: '请详细描述维修过程、处理情况及结果', + placeholderRemark: '请输入备注信息,限 300 字以内', placeholderLineSubjectCode: '请输入维修编码', placeholderLineSubjectName: '请输入维修名称', placeholderLineSubjectContent: '请输入维修内容', @@ -1634,6 +1652,8 @@ export default { validatorFinishDateRequired: '完成日期不能为空', validatorConfirmDateRequired: '验收日期不能为空', validatorRepairResultRequired: '维修结果不能为空', + validatorFaultPhenomenonRequired: '故障现象不能为空', + validatorComponentRequired: '关键件不能为空', validatorLineRepairIdRequired: '维修单ID不能为空', validatorLineSubjectIdRequired: '项目ID不能为空', validatorLineSubjectCodeRequired: '项目编码不能为空', diff --git a/src/views/mes/dvrepair/DvRepairForm.vue b/src/views/mes/dvrepair/DvRepairForm.vue index 863e83d0..82ec0879 100644 --- a/src/views/mes/dvrepair/DvRepairForm.vue +++ b/src/views/mes/dvrepair/DvRepairForm.vue @@ -1,167 +1,380 @@ + + + diff --git a/src/views/mes/dvrepair/index.vue b/src/views/mes/dvrepair/index.vue index 4f3704ab..b04f2ee1 100644 --- a/src/views/mes/dvrepair/index.vue +++ b/src/views/mes/dvrepair/index.vue @@ -120,6 +120,20 @@ + + + + + + @@ -147,23 +161,8 @@ prop="confirmDate" :formatter="dateFormatter2" width="110px" sortable /> - - - - - - - + v-if="String(scope.row.status) !== '1' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']"> {{ t('EquipmentManagement.DvRepair.repair') }} {{ t('action.update') }} + + {{ t('action.detail') }} + {{ t('action.delete') }} @@ -276,6 +282,11 @@ const getResultTagType = (value: any) => { return 'info' } +const isProcessedRepair = (value: any) => { + const v = value === '' || value === null || value === undefined ? '0' : String(value) + return v !== '0' +} + const tableRef = ref() const selectedIds = ref([]) const handleSelectionChange = (rows: any[]) => { From 55d978bef1f8c5025a4b354a7158b50e89b31ce5 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 28 May 2026 15:22:59 +0800 Subject: [PATCH 02/20] =?UTF-8?q?style=EF=BC=9A=E4=BF=AE=E6=94=B9=E7=BB=B4?= =?UTF-8?q?=E4=BF=AE=E5=8D=95-=E6=96=B0=E5=A2=9E=E3=80=81=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E3=80=81=E7=BB=B4=E4=BF=AE=E5=BC=B9=E6=A1=86=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/dvrepair/DvRepairForm.vue | 73 +++++++++++++++++++------ src/views/mes/dvrepair/index.vue | 49 +++++++++-------- 2 files changed, 83 insertions(+), 39 deletions(-) diff --git a/src/views/mes/dvrepair/DvRepairForm.vue b/src/views/mes/dvrepair/DvRepairForm.vue index 82ec0879..7a541c19 100644 --- a/src/views/mes/dvrepair/DvRepairForm.vue +++ b/src/views/mes/dvrepair/DvRepairForm.vue @@ -1,5 +1,11 @@ diff --git a/src/views/mes/dvrepair/index.vue b/src/views/mes/dvrepair/index.vue index b04f2ee1..129fbb08 100644 --- a/src/views/mes/dvrepair/index.vue +++ b/src/views/mes/dvrepair/index.vue @@ -1,7 +1,9 @@ - - + + From bae32191465d315ae1fb443cfb49ed7260e47f45 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 28 May 2026 16:23:02 +0800 Subject: [PATCH 05/20] =?UTF-8?q?style=EF=BC=9A=E6=89=93=E5=8D=B0/?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8-=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=B8=E5=BC=A0=E5=B0=BA=E5=AF=B8=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../printTemplate/PrintTemplateDesigner.vue | 39 +++++++++++++++---- .../printTemplate/ReportTemplateDesigner.vue | 39 +++++++++++++++---- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/views/mes/printTemplate/PrintTemplateDesigner.vue b/src/views/mes/printTemplate/PrintTemplateDesigner.vue index 6708ddde..dae7097e 100644 --- a/src/views/mes/printTemplate/PrintTemplateDesigner.vue +++ b/src/views/mes/printTemplate/PrintTemplateDesigner.vue @@ -307,10 +307,13 @@ const paperTypes = { B4: { width: 250, height: 352.6 }, B5: { width: 250, height: 175.6 } } -const curPaper = ref({ +const defaultPaperConfig = { type: 'A4', width: 210, height: 296.6 +} +const curPaper = ref({ + ...defaultPaperConfig }) const paperPopVisible = ref(false) const paperWidth = ref(220) @@ -342,6 +345,31 @@ let iconSelectEventKey = '' let iconSelectHandler: ((payload: any) => void) | undefined let clearSettingHandler: (() => void) | undefined +const normalizePaperConfig = (value: any) => { + const width = Number(value?.width) + const height = Number(value?.height) + if (width <= 0 || height <= 0 || Number.isNaN(width) || Number.isNaN(height)) { + return { ...defaultPaperConfig } + } + return { + type: typeof value?.type === 'string' && value.type ? value.type : 'other', + width, + height + } +} + +const applyPaperConfig = (value: any) => { + const paper = normalizePaperConfig(value) + curPaper.value = paper + paperWidth.value = paper.width + paperHeight.value = paper.height +} + +const getTemplatePaperConfig = (value: any) => { + const panel = Array.isArray(value?.panels) ? value.panels[0] : undefined + return panel +} + const ensureInit = () => { if (hiprintInited) { return @@ -549,13 +577,7 @@ const handleSave = async () => { const resetState = () => { scaleValue.value = 1 setSelectedIconState(null) - curPaper.value = { - type: 'A4', - width: 210, - height: 296.6 - } - paperWidth.value = 220 - paperHeight.value = 80 + applyPaperConfig(defaultPaperConfig) paperPopVisible.value = false } @@ -564,6 +586,7 @@ const open = async (row: any) => { dialogTitle.value = `${t('TemplateManagement.PrintTemplate.designTitle')}${row.templateName ? ' - ' + row.templateName : ''}` currentTemplateJson.value = row.templateJson ? (typeof row.templateJson === 'string' ? JSON.parse(row.templateJson) : row.templateJson) : undefined resetState() + applyPaperConfig(getTemplatePaperConfig(currentTemplateJson.value)) await loadBarcodeDictData() dialogVisible.value = true await nextTick() diff --git a/src/views/mes/printTemplate/ReportTemplateDesigner.vue b/src/views/mes/printTemplate/ReportTemplateDesigner.vue index 44c127a2..9aeed5ff 100644 --- a/src/views/mes/printTemplate/ReportTemplateDesigner.vue +++ b/src/views/mes/printTemplate/ReportTemplateDesigner.vue @@ -528,10 +528,13 @@ const paperTypes = { B4: { width: 250, height: 352.6 }, B5: { width: 250, height: 175.6 } } -const curPaper = ref({ +const defaultPaperConfig = { type: 'A4', width: 210, height: 296.6 +} +const curPaper = ref({ + ...defaultPaperConfig }) const paperPopVisible = ref(false) const paperWidth = ref(220) @@ -563,6 +566,31 @@ let iconSelectEventKey = '' let iconSelectHandler: ((payload: any) => void) | undefined let clearSettingHandler: (() => void) | undefined +const normalizePaperConfig = (value: any) => { + const width = Number(value?.width) + const height = Number(value?.height) + if (width <= 0 || height <= 0 || Number.isNaN(width) || Number.isNaN(height)) { + return { ...defaultPaperConfig } + } + return { + type: typeof value?.type === 'string' && value.type ? value.type : 'other', + width, + height + } +} + +const applyPaperConfig = (value: any) => { + const paper = normalizePaperConfig(value) + curPaper.value = paper + paperWidth.value = paper.width + paperHeight.value = paper.height +} + +const getTemplatePaperConfig = (value: any) => { + const panel = Array.isArray(value?.panels) ? value.panels[0] : undefined + return panel +} + const ensureInit = () => { if (hiprintInited) { return @@ -788,13 +816,7 @@ const handleSave = async () => { const resetState = () => { scaleValue.value = 1 setSelectedIconState(null) - curPaper.value = { - type: 'A4', - width: 210, - height: 296.6 - } - paperWidth.value = 220 - paperHeight.value = 80 + applyPaperConfig(defaultPaperConfig) paperPopVisible.value = false } @@ -803,6 +825,7 @@ const open = async (row: any) => { dialogTitle.value = `${t('TemplateManagement.PrintTemplate.designTitle')}${row.templateName ? ' - ' + row.templateName : ''}` currentTemplateJson.value = row.templateJson ? (typeof row.templateJson === 'string' ? JSON.parse(row.templateJson) : row.templateJson) : undefined resetState() + applyPaperConfig(getTemplatePaperConfig(currentTemplateJson.value)) dialogVisible.value = true await nextTick() ensureInit() From f2c5dac7bea11940357206c1532ceeb40d47745b Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 28 May 2026 17:42:02 +0800 Subject: [PATCH 06/20] =?UTF-8?q?feat=EF=BC=9A=E5=B7=A5=E5=8E=82=E5=BB=BA?= =?UTF-8?q?=E6=A8=A1-=E6=A8=A1=E6=9D=BF=E9=85=8D=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/QrcodeActionCard/index.vue | 173 +++++++++++++----- .../erp/component/product/ProductForm.vue | 1 + src/views/erp/mold/components/MoldForm.vue | 1 + src/views/erp/product/product/ProductForm.vue | 1 + .../CriticalComponentForm.vue | 1 + .../mes/deviceledger/DeviceLedgerForm.vue | 1 + src/views/mes/deviceledger/detail/index.vue | 1 + src/views/mes/deviceledger/index.vue | 1 + .../printTemplate/PrintTemplateDesigner.vue | 84 +++++++-- 9 files changed, 203 insertions(+), 61 deletions(-) diff --git a/src/components/QrcodeActionCard/index.vue b/src/components/QrcodeActionCard/index.vue index 7477e779..6d8eb2c6 100644 --- a/src/components/QrcodeActionCard/index.vue +++ b/src/components/QrcodeActionCard/index.vue @@ -39,6 +39,7 @@ import request from '@/config/axios' import HiprintPreviewDialog from '@/components/HiprintPreviewDialog/index.vue' import { createImageViewer } from '@/components/ImageViewer' import { ElLoading } from 'element-plus' +import { getSimpleDictDataList } from '@/api/system/dict/dict.data' const { t } = useI18n() const message = useMessage() @@ -66,6 +67,7 @@ const props = withDefaults( templateJsonUrl?: string templateJson?: any printData?: Record + printTemplateType?: string | number }>(), { imageUrl: '', @@ -88,7 +90,8 @@ const props = withDefaults( printMaxHeight: 120, templateJsonUrl: '', templateJson: undefined, - printData: () => ({}) + printData: () => ({}), + printTemplateType: undefined } ) @@ -99,14 +102,49 @@ const emit = defineEmits<{ const hiprintPreviewDialogRef = ref() const refreshLoading = ref(false) +type TemplateFieldMap = { + qrcodeField?: string + nameField?: string + codeField?: string +} + +let printTemplateDictCache: any[] | undefined + const showActionMask = computed(() => props.showPreview || props.showPrint || props.showRefresh) +const parseTemplateFieldMap = (remark: any): TemplateFieldMap | undefined => { + const parts = String(remark || '') + .split(',') + .map((item) => item.trim()) + .filter(Boolean) + if (!parts.length) return undefined + return { + qrcodeField: parts[0], + nameField: parts[1], + codeField: parts[2] || parts[1] + } +} + +const getTemplateFieldMap = async (): Promise => { + if (props.printTemplateType === undefined || props.printTemplateType === null || props.printTemplateType === '') { + return undefined + } + if (!printTemplateDictCache) { + printTemplateDictCache = await getSimpleDictDataList() + } + const matched = (printTemplateDictCache || []).find( + (item: any) => item.dictType === 'print_template_type' && String(item.value) === String(props.printTemplateType) + ) + return parseTemplateFieldMap(matched?.remark) +} + const buildQrcodeTemplateJson = ( qrcodeUrl: string, - printId: string, + printData: Record, imageWidth: number, imageHeight: number, - paperHeight: number + paperHeight: number, + fieldMap?: TemplateFieldMap ) => ({ panels: [ { @@ -124,7 +162,7 @@ const buildQrcodeTemplateJson = ( width: imageWidth, height: imageHeight, src: qrcodeUrl, - field: 'qrcodeUrl', + field: fieldMap?.qrcodeField || 'qrcodeUrl', title: '二维码图片', testData: qrcodeUrl }, @@ -133,23 +171,7 @@ const buildQrcodeTemplateJson = ( type: 'image' } }, - { - options: { - left: 0, - top: imageHeight + 2, - height: 10, - width: imageWidth, - testData: printId, - title: 'ID', - field: 'printId', - textAlign: 'center', - fontSize: 10 - }, - printElementType: { - title: '文本', - type: 'text' - } - } + ...buildDefaultTextElements(printData, imageWidth, imageHeight, fieldMap) ], paperNumberDisabled: true, paperNumberContinue: true, @@ -159,6 +181,60 @@ const buildQrcodeTemplateJson = ( ] }) +const buildDefaultTextElements = ( + printData: Record, + imageWidth: number, + imageHeight: number, + fieldMap?: TemplateFieldMap +) => { + const fields = [ + { title: '名称', field: fieldMap?.nameField }, + { title: '编码', field: fieldMap?.codeField } + ].filter((item) => item.field) + + if (!fields.length) { + const printId = printData.printId === undefined || printData.printId === null ? '' : String(printData.printId) + if (!printId) return [] + return [ + { + options: { + left: 0, + top: imageHeight + 2, + height: 10, + width: imageWidth, + testData: printId, + title: 'ID', + field: 'printId', + textAlign: 'center', + fontSize: 10 + }, + printElementType: { + title: '文本', + type: 'text' + } + } + ] + } + + return fields.map((item, index) => ({ + options: { + left: 0, + top: imageHeight + 2 + index * 12, + height: 10, + width: imageWidth, + testData: printData[item.field!] === undefined || printData[item.field!] === null ? '' : String(printData[item.field!]), + title: item.title, + field: item.field, + textAlign: 'center', + fontSize: 10 + }, + printElementType: { + title: '文本', + type: 'text' + } + })) +} + const getImageSize = (src: string) => new Promise<{ width: number; height: number }>((resolve, reject) => { const img = new Image() @@ -208,33 +284,44 @@ const handlePreview = () => { }) } -const replaceTemplateValues = (templateJson: any, printData: Record) => { +const resolveElementFieldKey = (element: any, fieldMap?: TemplateFieldMap) => { + const fieldKey = typeof element?.options?.field === 'string' ? element.options.field.trim() : '' + const qidKey = typeof element?.options?.qid === 'string' ? element.options.qid.trim() : '' + const title = String(element?.options?.title || element?.printElementType?.title || '').trim() + + if (fieldMap) { + if (title.includes('二维码')) return fieldMap.qrcodeField || fieldKey || qidKey + if (title.includes('名称')) return fieldMap.nameField || fieldKey || qidKey + if (title.includes('编码') || title.includes('条码') || title.includes('文本')) return fieldMap.codeField || fieldKey || qidKey + } + + return fieldKey || qidKey +} + +const replaceTemplateValues = (templateJson: any, printData: Record, fieldMap?: TemplateFieldMap) => { if (!templateJson?.panels) return templateJson - + return { ...templateJson, panels: templateJson.panels.map((panel: any) => ({ ...panel, printElements: panel.printElements?.map((element: any) => { - if (!element?.options?.qid) return element - - const qid = element.options.qid - const value = printData[qid] - + const valueKey = resolveElementFieldKey(element, fieldMap) + if (!valueKey) return element + + const value = printData[valueKey] if (value === undefined || value === null) return element - + const newOptions = { ...element.options } - - if (qid === 'qrcodeUrl') { + + if (element?.printElementType?.type === 'image') { newOptions.src = value newOptions.testData = value } else { - newOptions.field = qid - if (newOptions.testData === undefined || newOptions.testData === '') { - newOptions.testData = String(value) - } + newOptions.field = valueKey + newOptions.testData = String(value) } - + return { ...element, options: newOptions @@ -249,6 +336,7 @@ const handlePrint = async () => { let templateJson: any let printData: Record + const templateFieldMap = await getTemplateFieldMap() printData = { qrcodeUrl: props.imageUrl, @@ -257,12 +345,12 @@ const handlePrint = async () => { } if (props.templateJson) { - templateJson = replaceTemplateValues(props.templateJson, printData) + templateJson = replaceTemplateValues(props.templateJson, printData, templateFieldMap) } else if (props.templateJsonUrl) { try { const response = await request.get({ url: props.templateJsonUrl }) templateJson = typeof response.data === 'string' ? JSON.parse(response.data) : response.data - templateJson = replaceTemplateValues(templateJson, printData) + templateJson = replaceTemplateValues(templateJson, printData, templateFieldMap) } catch (error) { console.error('获取打印模板失败', error) message.error('获取打印模板失败') @@ -273,10 +361,11 @@ const handlePrint = async () => { const imageWidth = printSize.width const imageHeight = printSize.height const printId = props.printId === undefined || props.printId === null ? '' : String(props.printId) - const idAreaHeight = printId ? 14 : 0 - const paperHeight = imageHeight + idAreaHeight - - templateJson = buildQrcodeTemplateJson(props.imageUrl, printId, imageWidth, imageHeight, paperHeight) + const hasMappedFields = Boolean(templateFieldMap?.nameField || templateFieldMap?.codeField) + const textLineCount = hasMappedFields ? [templateFieldMap?.nameField, templateFieldMap?.codeField].filter(Boolean).length : (printId ? 1 : 0) + const paperHeight = imageHeight + textLineCount * 12 + (textLineCount ? 4 : 0) + + templateJson = buildQrcodeTemplateJson(props.imageUrl, printData, imageWidth, imageHeight, paperHeight, templateFieldMap) } const paperSize = templateJson?.panels?.[0] ? { diff --git a/src/views/erp/component/product/ProductForm.vue b/src/views/erp/component/product/ProductForm.vue index 6ee2127b..4c4566c8 100644 --- a/src/views/erp/component/product/ProductForm.vue +++ b/src/views/erp/component/product/ProductForm.vue @@ -109,6 +109,7 @@ {{ item.label }} -
条码类型
-
-
- +
+
+
{{ group.label }}
+
+
+ {{ item.label }} +
+
@@ -158,7 +162,18 @@ const ensureIconRuntime = () => { ;(window as any).__hiprintBuildIconHtml = buildIconHtml } -const barcodeElements = ref<{ tid: string; label: string }[]>([]) +type BarcodeElementItem = { + tid: string + label: string +} + +type BarcodeElementGroup = { + value: string | number + label: string + elements: BarcodeElementItem[] +} + +const barcodeGroups = ref([]) const barcodeDictData = ref([]) const loadBarcodeDictData = async () => { @@ -166,12 +181,15 @@ const loadBarcodeDictData = async () => { const res = await getSimpleDictDataList() const filtered = (res || []).filter((item: any) => item.dictType === 'print_template_type') barcodeDictData.value = filtered - const elements: { tid: string; label: string }[] = [] - filtered.forEach((item: any) => { - elements.push({ tid: `barcodeModule.${item.value}_qrcode`, label: `${item.label}
二维码` }) - elements.push({ tid: `barcodeModule.${item.value}_text`, label: `${item.label}
文本` }) - }) - barcodeElements.value = elements + barcodeGroups.value = filtered.map((item: any) => ({ + value: item.value, + label: item.label, + elements: [ + { tid: `barcodeModule.${item.value}_qrcode`, label: '二维码' }, + { tid: `barcodeModule.${item.value}_name`, label: '名称' }, + { tid: `barcodeModule.${item.value}_code`, label: '编码' } + ] + })) } catch (e) { console.error('加载条码字典数据失败', e) } @@ -186,12 +204,13 @@ const barcodeProvider = function () { const remark = item.remark || '' const parts = remark.split(',').map((s: string) => s.trim()) const qrcodeField = parts[0] || '' - const textField = parts[1] || '' + const nameField = parts[1] || '' + const codeField = parts[2] || parts[1] || '' groups.push( new hiprint.PrintElementTypeGroup(item.label, [ { tid: `barcodeModule.${item.value}_qrcode`, - title: `${item.label}`, + title: '二维码', type: 'image', options: { field: qrcodeField, @@ -199,17 +218,31 @@ const barcodeProvider = function () { testData: qrCodeImg, width: 80, height: 80, - title: `${item.label}
二维码` + title: '二维码' } }, { - tid: `barcodeModule.${item.value}_text`, - title: `${item.label}`, + tid: `barcodeModule.${item.value}_name`, + title: '名称', type: 'text', options: { - field: textField, + field: nameField, testData: '', - title: `${item.label}
文本`, + title: '名称', + fontSize: 10, + textAlign: 'center', + width: 80, + height: 16 + } + }, + { + tid: `barcodeModule.${item.value}_code`, + title: '编码', + type: 'text', + options: { + field: codeField, + testData: '', + title: '编码', fontSize: 10, textAlign: 'center', width: 80, @@ -472,7 +505,7 @@ const buildLeftElement = () => { return } hiprint.PrintElementTypeManager.buildByHtml(jquery(`#${dragContainerId} .ep-draggable-item`)) - if (barcodeElements.value.length) { + if (barcodeGroups.value.length) { hiprint.PrintElementTypeManager.buildByHtml(jquery(`#${barcodeDragContainerId} .ep-draggable-item`)) } } @@ -687,10 +720,18 @@ watch(selectedIconColor, () => { font-weight: 600; } +.hiprint-title-group { + padding-top: 12px; +} + .hiprint-title-inline { padding: 0 0 12px; } +.hiprint-barcode-groups { + padding-bottom: 10px; +} + .hiprint-drag-wrap { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -698,6 +739,11 @@ watch(selectedIconColor, () => { padding: 10px; } +.hiprint-drag-wrap-compact { + grid-template-columns: repeat(3, minmax(0, 1fr)); + padding-top: 8px; +} + .hiprint-item { min-height: 56px; display: flex; From e4439acc7a2f41befa9ec69a141d4d43b4381106 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 28 May 2026 17:53:56 +0800 Subject: [PATCH 07/20] =?UTF-8?q?feat=EF=BC=9A=E8=AE=BE=E5=A4=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86-=E7=BB=B4=E4=BF=AE=E5=8D=95=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/dvrepair/DvRepairForm.vue | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/views/mes/dvrepair/DvRepairForm.vue b/src/views/mes/dvrepair/DvRepairForm.vue index 89f938d5..5e28625b 100644 --- a/src/views/mes/dvrepair/DvRepairForm.vue +++ b/src/views/mes/dvrepair/DvRepairForm.vue @@ -65,7 +65,7 @@ clearable :placeholder="t('EquipmentManagement.DvRepair.placeholderAcceptedBy')" class="!w-full" - :disabled="isBaseInfoReadonly" + :disabled="isRepairMetaReadonly" > @@ -78,7 +78,7 @@ filterable clearable :placeholder="t('EquipmentManagement.DvRepair.placeholderConfirmBy')" - :disabled="isBaseInfoReadonly" + :disabled="isRepairMetaReadonly" > @@ -89,6 +89,14 @@ + + + + + + + + @@ -364,6 +372,7 @@ type RepairFormType = 'create' | 'update' | 'repair' | 'detail' | '' interface DvRepairFormData extends Partial { deviceId?: number componentId?: number + isShutdown?: boolean isCode?: boolean repairStatus?: string faultPhenomenon?: string @@ -408,6 +417,7 @@ const createDefaultFormData = (): DvRepairFormData => ({ repairedImages: '', acceptedBy: undefined, confirmBy: undefined, + isShutdown: undefined, status: undefined, remark: undefined, isCode: true @@ -422,6 +432,7 @@ const formData = ref(createDefaultFormData()) const isDetailMode = computed(() => formType.value === 'detail') const repairCodeDisabled = computed(() => formData.value.isCode === true || formType.value === 'update' || formType.value === 'repair' || formType.value === 'detail') const isBaseInfoReadonly = computed(() => formType.value === 'repair' || formType.value === 'detail') +const isRepairMetaReadonly = computed(() => formType.value === 'detail') const isFaultInfoReadonly = computed(() => formType.value === 'repair' || formType.value === 'detail') const currentStatusValue = computed(() => { const value = formData.value.status From 732ef1de336024c9acc9c15aa2973d3a5dbd7b89 Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Thu, 28 May 2026 18:04:30 +0800 Subject: [PATCH 08/20] =?UTF-8?q?style=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=A8=A1?= =?UTF-8?q?=E5=85=B7=E7=AE=A1=E7=90=86=E7=9A=84=E7=BB=B4=E4=BF=AE=E5=8D=95?= =?UTF-8?q?-=E6=96=B0=E5=A2=9E=E3=80=81=E7=BC=96=E8=BE=91=E3=80=81?= =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E5=BC=B9=E6=A1=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mold/moldrepair/MoldRepairForm.vue | 452 ++++++++++--------- src/views/mold/moldrepair/index.vue | 21 +- 2 files changed, 260 insertions(+), 213 deletions(-) diff --git a/src/views/mold/moldrepair/MoldRepairForm.vue b/src/views/mold/moldrepair/MoldRepairForm.vue index 13264125..6ae10f93 100644 --- a/src/views/mold/moldrepair/MoldRepairForm.vue +++ b/src/views/mold/moldrepair/MoldRepairForm.vue @@ -1,149 +1,154 @@ + + + diff --git a/src/views/mold/moldrepair/index.vue b/src/views/mold/moldrepair/index.vue index 582b9255..7f8e533b 100644 --- a/src/views/mold/moldrepair/index.vue +++ b/src/views/mold/moldrepair/index.vue @@ -1,5 +1,6 @@ + - +
+ +
- + + diff --git a/src/views/erp/product/product/index.vue b/src/views/erp/product/product/index.vue index 82e7df02..28214408 100644 --- a/src/views/erp/product/product/index.vue +++ b/src/views/erp/product/product/index.vue @@ -1,97 +1,79 @@ From 39ca00a09cbcb9a0029784bac95cfb4376150146 Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Fri, 29 May 2026 10:30:23 +0800 Subject: [PATCH 10/20] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E5=BB=BA=E6=A8=A1=E4=B8=AD=E4=BA=A7=E5=93=81BOM?= =?UTF-8?q?=E7=9A=84=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91=E5=BC=B9?= =?UTF-8?q?=E6=A1=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/bom/BomForm.vue | 209 +++++++++++++-------- src/views/mes/bom/index.vue | 331 +++++++++++++++++----------------- 2 files changed, 303 insertions(+), 237 deletions(-) diff --git a/src/views/mes/bom/BomForm.vue b/src/views/mes/bom/BomForm.vue index c0e84fc4..98696afa 100644 --- a/src/views/mes/bom/BomForm.vue +++ b/src/views/mes/bom/BomForm.vue @@ -1,53 +1,62 @@ + + diff --git a/src/views/mes/bom/index.vue b/src/views/mes/bom/index.vue index e09a0102..cfbdad2e 100644 --- a/src/views/mes/bom/index.vue +++ b/src/views/mes/bom/index.vue @@ -1,155 +1,158 @@ From ca007733bfa59948511e96d03db77533edcfe9c3 Mon Sep 17 00:00:00 2001 From: hwj Date: Fri, 29 May 2026 10:34:20 +0800 Subject: [PATCH 11/20] =?UTF-8?q?feat=EF=BC=9A=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=B7=BB=E5=8A=A0app=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/menu/index.ts | 4 +- src/api/system/permission/index.ts | 7 +- src/views/system/menu/MenuForm.vue | 28 +---- src/views/system/menu/index.vue | 15 --- src/views/system/role/RoleAssignMenuForm.vue | 116 +++++++++++++++++-- 5 files changed, 117 insertions(+), 53 deletions(-) diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index 804082d7..04dbc258 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -37,12 +37,12 @@ export const getMenu = (id: number) => { } // 新增菜单 -export const createMenu = (data: MenuVO) => { +export const createMenu = (data: Partial) => { return request.post({ url: '/system/menu/create', data }) } // 修改菜单 -export const updateMenu = (data: MenuVO) => { +export const updateMenu = (data: Partial) => { return request.put({ url: '/system/menu/update', data }) } diff --git a/src/api/system/permission/index.ts b/src/api/system/permission/index.ts index b3c7696b..b6369288 100644 --- a/src/api/system/permission/index.ts +++ b/src/api/system/permission/index.ts @@ -17,8 +17,11 @@ export interface PermissionAssignRoleDataScopeReqVO { } // 查询角色拥有的菜单权限 -export const getRoleMenuList = async (roleId: number) => { - return await request.get({ url: '/system/permission/list-role-menus?roleId=' + roleId }) +export const getRoleMenuList = async (roleId: number, clientType?: number) => { + return await request.get({ + url: '/system/permission/list-role-menus', + params: { roleId, clientType } + }) } // 赋予角色菜单权限 diff --git a/src/views/system/menu/MenuForm.vue b/src/views/system/menu/MenuForm.vue index acba7cb4..5ebfbf57 100644 --- a/src/views/system/menu/MenuForm.vue +++ b/src/views/system/menu/MenuForm.vue @@ -66,16 +66,6 @@ - - - {{ t('SystemManagement.Menu.terminalTypeMobile') }} - {{ t('SystemManagement.Menu.terminalTypeScanner') }} - - ({ name: [{ required: true, message: t('SystemManagement.Menu.nameRequired'), trigger: 'blur' }], sort: [{ required: true, message: t('SystemManagement.Menu.sortRequired'), trigger: 'blur' }], path: [{ required: clientType.value === 1, message: t('SystemManagement.Menu.pathRequired'), trigger: 'blur' }], - status: [{ required: true, message: t('SystemManagement.Menu.statusRequired'), trigger: 'blur' }], - terminalType: [{ required: clientType.value === 2 && formData.value.type === SystemMenuTypeEnum.DIR, message: t('SystemManagement.Menu.terminalTypeRequired'), trigger: 'change' }] + status: [{ required: true, message: t('SystemManagement.Menu.statusRequired'), trigger: 'blur' }] })) const formRef = ref() // 表单 Ref @@ -222,16 +210,13 @@ const submitForm = async () => { } } } - const data = formData.value as unknown as MenuApi.MenuVO & { terminalType?: number } + const { terminalType: _terminalType, ...data } = formData.value as typeof formData.value & { terminalType?: number } data.clientType = clientType.value - data.terminalType = clientType.value === 2 && formData.value.type === SystemMenuTypeEnum.DIR - ? formData.value.terminalType - : undefined if (formType.value === 'create') { - await MenuApi.createMenu(data) + await MenuApi.createMenu(data as unknown as MenuApi.MenuVO) message.success(t('common.createSuccess')) } else { - await MenuApi.updateMenu(data) + await MenuApi.updateMenu(data as unknown as MenuApi.MenuVO) message.success(t('common.updateSuccess')) } dialogVisible.value = false @@ -272,8 +257,7 @@ const resetForm = () => { visible: true, keepAlive: true, alwaysShow: true, - clientType: 1, - terminalType: 1 + clientType: 1 } formRef.value?.resetFields() } diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index b157633d..681319da 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -88,16 +88,6 @@ - - - @@ -197,11 +187,6 @@ const handleClientTypeChange = (val: number | string) => { getList() } -const getTerminalTypeLabel = (value?: number) => { - if (Number(value) === 2) return t('SystemManagement.Menu.terminalTypeScanner') - return t('SystemManagement.Menu.terminalTypeMobile') -} - /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() diff --git a/src/views/system/role/RoleAssignMenuForm.vue b/src/views/system/role/RoleAssignMenuForm.vue index e5812672..a69d847f 100644 --- a/src/views/system/role/RoleAssignMenuForm.vue +++ b/src/views/system/role/RoleAssignMenuForm.vue @@ -16,6 +16,12 @@ ({ id: undefined, name: '', code: '', @@ -74,30 +89,80 @@ const menuOptions = ref([]) // 菜单树形结构 const menuExpand = ref(false) // 展开/折叠 const treeRef = ref() // 菜单树组件 Ref const treeNodeAll = ref(false) // 全选/全不选 +const activeClientType = ref(1) // 客户端类型:1=Web,2=APP +const currentTreeClientType = ref(1) // 当前树实际对应的客户端类型 +const roleMenuIdsByClientType = reactive>({ + 1: [], + 2: [] +}) +const loadedClientTypes = reactive>({ + 1: false, + 2: false +}) + +const getCurrentTreeMenuIds = () => { + if (!treeRef.value) return [] + return Array.from(new Set([ + ...(treeRef.value.getCheckedKeys(false) as Array), + ...(treeRef.value.getHalfCheckedKeys() as Array) + ])) +} + +const saveCurrentClientMenuIds = () => { + if (!dialogVisible.value) return + roleMenuIdsByClientType[currentTreeClientType.value] = getCurrentTreeMenuIds() +} + +const ensureRoleMenuIdsLoaded = async (roleId: number, clientType: number) => { + if (loadedClientTypes[clientType]) return + roleMenuIdsByClientType[clientType] = await PermissionApi.getRoleMenuList(roleId, clientType) + loadedClientTypes[clientType] = true +} + +const loadRoleMenus = async (roleId: number) => { + currentTreeClientType.value = activeClientType.value + treeNodeAll.value = false + menuExpand.value = false + treeRef.value?.setCheckedNodes([]) + menuOptions.value = handleTree(await MenuApi.getSimpleMenusList(currentTreeClientType.value)) + await ensureRoleMenuIdsLoaded(roleId, currentTreeClientType.value) + await nextTick() + formData.menuIds = roleMenuIdsByClientType[currentTreeClientType.value] ?? [] + formData.menuIds.forEach((menuId: number) => { + treeRef.value.setChecked(menuId, true, false) + }) +} /** 打开弹窗 */ const open = async (row: RoleApi.RoleVO) => { dialogVisible.value = true resetForm() - // 加载 Menu 列表。注意,必须放在前面,不然下面 setChecked 没数据节点 - menuOptions.value = handleTree(await MenuApi.getSimpleMenusList()) // 设置数据 formData.id = row.id formData.name = row.name formData.code = row.code formLoading.value = true try { - formData.menuIds = await PermissionApi.getRoleMenuList(row.id) - // 设置选中 - formData.menuIds.forEach((menuId: number) => { - treeRef.value.setChecked(menuId, true, false) - }) + await loadRoleMenus(row.id) } finally { formLoading.value = false } } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 +/** 切换客户端类型 */ +const handleClientTypeChange = async (val: number | string) => { + saveCurrentClientMenuIds() + activeClientType.value = Number(val) + if (!dialogVisible.value || !formData.id) return + formLoading.value = true + try { + await loadRoleMenus(formData.id) + } finally { + formLoading.value = false + } +} + /** 提交表单 */ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 const submitForm = async () => { @@ -105,15 +170,18 @@ const submitForm = async () => { if (!formRef) return const valid = await formRef.value.validate() if (!valid) return + if (formData.id === undefined) return + saveCurrentClientMenuIds() // 提交请求 formLoading.value = true try { + await Promise.all([1, 2].map((clientType) => ensureRoleMenuIdsLoaded(formData.id as number, clientType))) const data = { roleId: formData.id, - menuIds: [ - ...(treeRef.value.getCheckedKeys(false) as unknown as Array), // 获得当前选中节点 - ...(treeRef.value.getHalfCheckedKeys() as unknown as Array) // 获得半选中的父节点 - ] + menuIds: Array.from(new Set([ + ...roleMenuIdsByClientType[1], + ...roleMenuIdsByClientType[2] + ])) } await PermissionApi.assignRoleMenu(data) message.success(t('common.updateSuccess')) @@ -128,6 +196,8 @@ const submitForm = async () => { /** 重置表单 */ const resetForm = () => { // 重置选项 + activeClientType.value = 1 + currentTreeClientType.value = 1 treeNodeAll.value = false menuExpand.value = false // 重置表单 @@ -135,6 +205,10 @@ const resetForm = () => { formData.name = '' formData.code = '' formData.menuIds = [] + roleMenuIdsByClientType[1] = [] + roleMenuIdsByClientType[2] = [] + loadedClientTypes[1] = false + loadedClientTypes[2] = false treeRef.value?.setCheckedNodes([]) formRef.value?.resetFields() } @@ -160,4 +234,22 @@ const handleCheckedTreeExpand = () => { .role-assign-menu-form :deep(.el-form-item__label) { min-width: 80px; } + +.role-assign-menu-form__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.role-assign-menu-form__header :deep(.el-tabs__header) { + margin: 0; +} + +.role-assign-menu-form__actions { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} From 6c2e5bc96aa11553ff8d0e04806675717a8d3c1a Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Fri, 29 May 2026 10:48:17 +0800 Subject: [PATCH 12/20] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E5=BB=BA=E6=A8=A1=E4=B8=AD=E7=BC=96=E7=A0=81=E8=A7=84?= =?UTF-8?q?=E5=88=99=E7=9A=84=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=BC=B9=E6=A1=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/erp/autocode/AutocodeIndex.vue | 292 +++++++++---------- src/views/erp/autocode/AutocodeRuleForm.vue | 295 ++++++++++++-------- 2 files changed, 328 insertions(+), 259 deletions(-) diff --git a/src/views/erp/autocode/AutocodeIndex.vue b/src/views/erp/autocode/AutocodeIndex.vue index b90f8ed7..88da4a5a 100644 --- a/src/views/erp/autocode/AutocodeIndex.vue +++ b/src/views/erp/autocode/AutocodeIndex.vue @@ -1,132 +1,135 @@ + + From 4f6bdec21de8bd83b09ccdd50f67c72f6e11f33c Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Fri, 29 May 2026 11:19:40 +0800 Subject: [PATCH 13/20] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=E4=BB=93?= =?UTF-8?q?=E5=82=A8=E7=AE=A1=E7=90=86=E4=B8=AD=E5=85=A5=E5=BA=93=E5=8D=95?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=BC=B9=E6=A1=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/erp/stock/in/StockInForm.vue | 301 ++++++++------ src/views/erp/stock/in/index.vue | 534 ++++++++++++------------- 2 files changed, 434 insertions(+), 401 deletions(-) diff --git a/src/views/erp/stock/in/StockInForm.vue b/src/views/erp/stock/in/StockInForm.vue index 76b110b0..83becfa7 100644 --- a/src/views/erp/stock/in/StockInForm.vue +++ b/src/views/erp/stock/in/StockInForm.vue @@ -1,121 +1,110 @@ + diff --git a/src/views/erp/stock/in/index.vue b/src/views/erp/stock/in/index.vue index ed58dbb8..75e143d7 100644 --- a/src/views/erp/stock/in/index.vue +++ b/src/views/erp/stock/in/index.vue @@ -1,283 +1,262 @@ - - - - - - - - - - - - - - - - - - - - - - + + +
+ + diff --git a/src/views/erp/warehouselocation/index.vue b/src/views/erp/warehouselocation/index.vue index 147ef28f..817ae239 100644 --- a/src/views/erp/warehouselocation/index.vue +++ b/src/views/erp/warehouselocation/index.vue @@ -1,175 +1,179 @@ - + + diff --git a/src/views/mes/criticalComponent/index.vue b/src/views/mes/criticalComponent/index.vue index e311b84d..8b68930e 100644 --- a/src/views/mes/criticalComponent/index.vue +++ b/src/views/mes/criticalComponent/index.vue @@ -1,154 +1,204 @@