From 109abb8739a7ee8a7e4e3a0fb81152262deea18d Mon Sep 17 00:00:00 2001 From: shenzhouyu Date: Wed, 19 Aug 2026 15:45:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=96=99=E7=AE=A1=E7=90=86=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cclqms-vue/src/api/qc/qc.js | 16 + cclqms-vue/src/i18n/locales/qc.cn.js | 22 +- cclqms-vue/src/i18n/locales/qc.en.js | 24 +- .../views/modules/qc/IQCBatchPurchaseAdd.vue | 170 +-- .../src/views/modules/qc/IQCResultEntry.vue | 1 + .../views/modules/qc/file_collect_upload.vue | 133 ++ .../src/views/modules/qc/qcPartAttribute.vue | 1193 +++++++++++++---- .../src/views/modules/qc/qc_spec_upload.vue | 48 +- 8 files changed, 1202 insertions(+), 405 deletions(-) create mode 100644 cclqms-vue/src/views/modules/qc/file_collect_upload.vue diff --git a/cclqms-vue/src/api/qc/qc.js b/cclqms-vue/src/api/qc/qc.js index d470427..124267e 100644 --- a/cclqms-vue/src/api/qc/qc.js +++ b/cclqms-vue/src/api/qc/qc.js @@ -1,4 +1,5 @@ import { createAPI } from "@/utils/httpRequest.js"; +import httpRequest from '@/utils/httpRequest' // ===================================== 检验方法 ===================================== export const qcMethodSearch = data => createAPI(`/pms/qc/qcMethodSearch`,'post',data) @@ -103,6 +104,14 @@ export const qcPartFileCollectBatchAdd = data => createAPI(`/pms/qc/qcPartFileCo export const qcPartFileCollectBatchSave = data => createAPI(`/pms/qc/qcPartFileCollectBatchSave`,'post',data) export const qcPartFileCollectBatchDelete = data => createAPI(`/pms/qc/qcPartFileCollectBatchDelete`,'post',data) export const qcPartFileCollectReplace = data => createAPI(`/pms/qc/qcPartFileCollectReplace`,'post',data) +export const qcPartFileCollectUpload = data => createAPI(`/pms/qc/qcPartFileCollectUpload`,'post',data) +export const downloadQcPartFileCollectTemplate = () => { + return httpRequest({ + url: httpRequest.adornUrl('/pms/qc/downloadQcPartFileCollectTemplate'), + method: 'get', + responseType: 'blob' + }) +} export const queryFileId = data => createAPI(`/pms/qc/queryFileId`,'post',data) export const getPartDefectTracking = data => createAPI(`/pms/qc/getPartDefectTracking`,'post',data) export const saveDefectTracking = data => createAPI(`/pms/qc/saveDefectTracking`,'post',data) @@ -120,6 +129,13 @@ export const deletePatrolConfig = data => createAPI(`/pms/qc/deletePatrolConfig` export const getAllOperationDescList = data => createAPI(`/pms/qc/getAllOperationDescList`,'post',data) export const patrolConfigUpload = data => createAPI(`/pms/qc/patrolConfigUpload`,'post',data) export const qcSpecUpload = data => createAPI(`/pms/qc/qcSpecUpload`,'post',data) +export const downloadQcSpecTemplate = () => { + return httpRequest({ + url: httpRequest.adornUrl('/pms/qc/downloadQcSpecTemplate'), + method: 'get', + responseType: 'blob' + }) +} export const updateLabelTemplate = data => createAPI(`/pms/qc/updateLabelTemplate`,'post',data) // ===================================== FAI检验 ===================================== diff --git a/cclqms-vue/src/i18n/locales/qc.cn.js b/cclqms-vue/src/i18n/locales/qc.cn.js index 5fe9944..386b15f 100644 --- a/cclqms-vue/src/i18n/locales/qc.cn.js +++ b/cclqms-vue/src/i18n/locales/qc.cn.js @@ -148,7 +148,13 @@ module.exports = { }, specImport: { dialogTitle: '检验标准导入', - dragHintComma: '将文件拖到此处,或' + dragHintComma: '将文件拖到此处,或', + templateFileName: '质检项目导入模板.xlsx' + }, + fileCollectImport: { + dialogTitle: '文件采集配置导入', + dragHintComma: '将文件拖到此处,或', + templateFileName: '文件采集配置导入模板.xlsx' }, patrolImport: { dialogTitle: '巡检配置导入', @@ -1100,6 +1106,7 @@ module.exports = { detail: '详情', uploadFile: '上传文件', projectImport: '项目导入', + fileCollectImport: '配置导入', colIpqcMethod: 'IPQC检验方式', colSupplierId: '供应商编码', colSupplierNameCol: '供应商名称', @@ -1121,7 +1128,7 @@ module.exports = { selectQcSpecCopyRow: '请先勾选要复制的质检项目!', selectQcSpecCopyTarget: '请选择目标物料!', dialogQcSpecCopy: '复制质检项目', - qcSpecCopyHint: '将当前主物料下勾选的质检项目复制到所选其它物料(已存在则覆盖)', + qcSpecCopyHint: '将当前主物料下勾选的质检项目复制到所选物料(均新增一行,不覆盖已有项目)', qcSpecCopyAvailableParts: '可选物料', qcSpecCopyAddSelected: '加入已选({count})', qcSpecCopyAddedParts: '已选物料({count})', @@ -1132,6 +1139,7 @@ module.exports = { selectQcSpecCopyAddedTarget: '请先将目标物料加入已选清单!', qcSpecCopyConfirm: '确认将 {itemCount} 个质检项目复制到 {targetCount} 个物料吗?', qcSpecCopySuccess: '复制成功', + qcSpecCopySourcePart: '原物料', colSort: '排序', dragToSort: '拖拽调整排序', qcSpecRowNoMissing: '当前项目缺少排序号,无法移动!', @@ -1187,7 +1195,15 @@ module.exports = { updateSuccess: '更新成功', updateFail: '更新失败', addSelectedTooltip: '添加选中项目', - removeSelectedTooltip: '移除选中项目' + removeSelectedTooltip: '移除选中项目', + qcSpecAddSelected: '添加选中({count})', + qcSpecAddPendingItems: '本次新增({count})', + qcSpecAddRemovePending: '从本次新增中移除', + dialogQcSpecAddFill: '填写项目信息', + qcSpecAddSameInspectionTypeOnly: '请勾选相同检验类型的项目', + qcSpecAddEmptyPending: '请先添加项目', + qcSpecAddDiscardPending: '本次新增尚未保存,确定关闭吗?', + qcSpecAddSaveSuccess: '新增成功' }, deviceMaintenancePage: { exportPrefix: '外采设备维护', diff --git a/cclqms-vue/src/i18n/locales/qc.en.js b/cclqms-vue/src/i18n/locales/qc.en.js index ed0cf61..ef6fbc4 100644 --- a/cclqms-vue/src/i18n/locales/qc.en.js +++ b/cclqms-vue/src/i18n/locales/qc.en.js @@ -148,7 +148,13 @@ module.exports = { }, specImport: { dialogTitle: 'Inspection standard import', - dragHintComma: 'Drag file here, or ' + dragHintComma: 'Drag file here, or ', + templateFileName: 'QC_Spec_Import_Template.xlsx' + }, + fileCollectImport: { + dialogTitle: 'File collection config import', + dragHintComma: 'Drag file here, or ', + templateFileName: 'File_Collect_Import_Template.xlsx' }, patrolImport: { dialogTitle: 'Patrol configuration import', @@ -793,7 +799,7 @@ module.exports = { ipqcTemplate: 'IPQC templates', itemsSuffix: 'items', remark: 'Remark', - + }, fqcPage: { fqcTemplate: 'FQC templates' @@ -1101,6 +1107,7 @@ module.exports = { detail: 'Detail', uploadFile: 'Upload file', projectImport: 'Project import', + fileCollectImport: 'Config import', colIpqcMethod: 'IPQC inspection method', colSupplierId: 'Supplier code', colSupplierNameCol: 'Supplier name', @@ -1122,7 +1129,7 @@ module.exports = { selectQcSpecCopyRow: 'Please select QC items to copy first!', selectQcSpecCopyTarget: 'Please select target material(s)!', dialogQcSpecCopy: 'Copy QC items', - qcSpecCopyHint: 'Copy selected QC items from the current main material to other selected materials (overwrite if exists)', + qcSpecCopyHint: 'Copy selected QC items from the current main material to selected materials (always add a new row, do not overwrite existing items)', qcSpecCopyAvailableParts: 'Available materials', qcSpecCopyAddSelected: 'Add selected ({count})', qcSpecCopyAddedParts: 'Selected materials ({count})', @@ -1133,6 +1140,7 @@ module.exports = { selectQcSpecCopyAddedTarget: 'Add target material(s) to the selected list first!', qcSpecCopyConfirm: 'Copy {itemCount} QC item(s) to {targetCount} material(s)?', qcSpecCopySuccess: 'Copied successfully', + qcSpecCopySourcePart: 'Source', colSort: 'Sort', dragToSort: 'Drag to reorder', qcSpecRowNoMissing: 'The selected item has no sort number and cannot be moved!', @@ -1188,7 +1196,15 @@ module.exports = { updateSuccess: 'Updated successfully', updateFail: 'Update failed', addSelectedTooltip: 'Add selected items', - removeSelectedTooltip: 'Remove selected items' + removeSelectedTooltip: 'Remove selected items', + qcSpecAddSelected: 'Add selected ({count})', + qcSpecAddPendingItems: 'Added this time ({count})', + qcSpecAddRemovePending: 'Remove from added list', + dialogQcSpecAddFill: 'Fill item details', + qcSpecAddSameInspectionTypeOnly: 'Please select items with the same inspection type', + qcSpecAddEmptyPending: 'Please add items first', + qcSpecAddDiscardPending: 'Added items are not saved yet. Close anyway?', + qcSpecAddSaveSuccess: 'Added successfully' }, deviceMaintenancePage: { exportPrefix: 'External equipment maintenance', diff --git a/cclqms-vue/src/views/modules/qc/IQCBatchPurchaseAdd.vue b/cclqms-vue/src/views/modules/qc/IQCBatchPurchaseAdd.vue index a255ed0..bbe8971 100644 --- a/cclqms-vue/src/views/modules/qc/IQCBatchPurchaseAdd.vue +++ b/cclqms-vue/src/views/modules/qc/IQCBatchPurchaseAdd.vue @@ -6,20 +6,6 @@ @keyup.enter.native="searchList"> - - - - {{ i.sitename }} - - {{ i.buDesc }} - - - - - - @@ -27,27 +13,27 @@ - + - + - + - + - + @@ -148,21 +134,34 @@ - - - - - - - - - {{ $t('qc.table.sender') }} - - - + + + + + + {{ i.sitename }} + + {{ i.buDesc }} + + + + + + + + + {{ $t('qc.table.sender') }} + + + + + + - {{ $t('qc.common.confirm') }} + {{ $t('qc.common.confirm') }} {{ $t('qc.common.close') }} @@ -222,9 +221,7 @@ export default { userBuList: [], dataList: [], selectedRows: [], - selectionSyncing: false, searchData: { - bu: '', site: '', poOrderNo: '', poItemNo: '', @@ -239,6 +236,7 @@ export default { }, createDialogVisible: false, createForm: { + bu: '', inspectorBy: '', inspectorByName: '', }, @@ -267,11 +265,6 @@ export default { sitename, })) }, - selectedSupplierText() { - if (!this.selectedRows.length) return '' - const row = this.selectedRows[0] - return [row.supplierNo, row.supplierDesc].filter(Boolean).join(' / ') - }, }, created() { this.calcTableHeight() @@ -288,29 +281,32 @@ export default { }, methods: { calcTableHeight() { - this.tableHeight = Math.max(320, window.innerHeight - (this.embedded ? 280 : 320)) + this.tableHeight = Math.max( + 320, + window.innerHeight - (this.embedded ? 280 : 320) + ) }, loadBuList() { - getSiteAndBuByUserName({ userName: this.$store.state.user.name }).then(({ data }) => { - if (data && data.code === 0) { - this.userBuList = data.rows || [] - this.initDefaultBuSite() + getSiteAndBuByUserName({ userName: this.$store.state.user.name }).then( + ({ data }) => { + if (data && data.code === 0) { + this.userBuList = data.rows || [] + this.initDefaultBuSite() + } } - }) + ) }, initDefaultBuSite() { - if (!this.searchData.bu && this.userBuList.length) { - this.searchData.bu = this.userBuList[0].buNo - } if (!this.searchData.site && this.poSiteList.length) { this.searchData.site = this.poSiteList[0].site } + if (!this.createForm.bu && this.userBuList.length) { + this.createForm.bu = this.userBuList[0].buNo + } }, resetSearch() { - const bu = this.searchData.bu const site = this.searchData.site this.searchData = { - bu, site, poOrderNo: '', poItemNo: '', @@ -327,10 +323,6 @@ export default { this.selectedRows = [] }, searchList() { - if (!this.searchData.bu) { - this.$message.warning(this.$t('qc.common.pleaseSelectBu')) - return - } if (!this.searchData.site) { this.$message.warning(this.$t('qc.iqcPage.selectSite')) return @@ -353,7 +345,6 @@ export default { this.searchLoading = true this.selectedRows = [] searchPoOrderInfoForBatch({ - bu: this.searchData.bu, site: this.searchData.site, userName: this.$store.state.user.name, poOrderNo: this.searchData.poOrderNo, @@ -372,7 +363,8 @@ export default { this.dataList = (data.rows || []).map((row, index) => { const pending = Number(row.pendingInspectQty) const arrival = Number(row.currentArrivalQty) - let defaultQty = !Number.isNaN(pending) && pending > 0 ? pending : arrival + let defaultQty = + !Number.isNaN(pending) && pending > 0 ? pending : arrival if (Number.isNaN(defaultQty)) defaultQty = undefined return { ...row, @@ -390,7 +382,9 @@ export default { } }) } else { - this.$message.error((data && data.msg) || this.$t('qc.common.systemError')) + this.$message.error( + (data && data.msg) || this.$t('qc.common.systemError') + ) } this.searchLoading = false }) @@ -399,47 +393,20 @@ export default { }) }, handleSelectionChange(rows) { - if (this.selectionSyncing) return - if (!rows.length) { - this.selectedRows = [] - return - } - const supplierSet = new Set(rows.map((r) => String(r.supplierNo || ''))) - if (supplierSet.size <= 1) { - this.selectedRows = rows - return - } - // 不同供应商不能同批创建:保留已选供应商(或首条),并提示,不灰掉其他行 - this.$message.warning(this.$t('qc.iqcPage.batchSupplierDiff')) - const keepSupplier = this.selectedRows.length - ? String(this.selectedRows[0].supplierNo || '') - : String(rows[0].supplierNo || '') - const keepRows = rows.filter((r) => String(r.supplierNo || '') === keepSupplier) - this.selectedRows = keepRows - this.selectionSyncing = true - this.$nextTick(() => { - if (this.$refs.batchTable) { - this.$refs.batchTable.clearSelection() - keepRows.forEach((row) => this.$refs.batchTable.toggleRowSelection(row, true)) - } - this.$nextTick(() => { - this.selectionSyncing = false - }) - }) + this.selectedRows = rows || [] }, openCreateDialog() { if (!this.selectedRows.length) { this.$message.warning(this.$t('qc.iqcPage.batchSelectRows')) return } - const supplierSet = new Set(this.selectedRows.map((r) => String(r.supplierNo || ''))) - if (supplierSet.size > 1) { - this.$message.warning(this.$t('qc.iqcPage.batchSupplierDiff')) - return - } for (let i = 0; i < this.selectedRows.length; i++) { const row = this.selectedRows[i] - if (row.sendInspectQty === '' || row.sendInspectQty == null || Number(row.sendInspectQty) <= 0) { + if ( + row.sendInspectQty === '' || + row.sendInspectQty == null || + Number(row.sendInspectQty) <= 0 + ) { this.$message.warning( this.$t('qc.iqcPage.batchSendQtyRequired', { po: row.poOrderNo, @@ -450,19 +417,22 @@ export default { } } this.createForm = { + bu: + this.createForm.bu || + (this.userBuList.length ? this.userBuList[0].buNo : ''), inspectorBy: '', inspectorByName: '', } this.createDialogVisible = true }, openSenderDialog() { - if (!this.searchData.bu) { + if (!this.createForm.bu) { this.$message.warning(this.$t('qc.common.pleaseSelectBu')) return } this.operatorData = { flag: '3', - bu: this.searchData.bu, + bu: this.createForm.bu, roleId: '', adminID: '', adminName: '', @@ -477,7 +447,9 @@ export default { this.operatorList = data.rows || [] } else { this.operatorList = [] - this.$message.error((data && data.msg) || this.$t('qc.common.systemError')) + this.$message.error( + (data && data.msg) || this.$t('qc.common.systemError') + ) } }) }, @@ -498,12 +470,16 @@ export default { this.operatorModelFlag = false }, confirmCreate() { + if (!this.createForm.bu) { + this.$message.warning(this.$t('qc.common.pleaseSelectBu')) + return + } if (!this.createForm.inspectorBy) { this.$message.warning(this.$t('qc.entry.selectSender')) return } const submitList = this.selectedRows.map((row) => ({ - bu: this.searchData.bu, + bu: this.createForm.bu, site: row.site || this.searchData.site, inspectionTypeNo: '105', inspectionTypeName: 'IQC', @@ -531,7 +507,7 @@ export default { })) this.createLoading = true batchSaveIQCInspection({ - bu: this.searchData.bu, + bu: this.createForm.bu, inspectorBy: this.createForm.inspectorBy, userName: this.createForm.inspectorBy, taskSource: '任务新增', @@ -545,7 +521,9 @@ export default { this.$emit('created') this.searchList() } else { - this.$message.error((data && data.msg) || this.$t('qc.common.systemError')) + this.$message.error( + (data && data.msg) || this.$t('qc.common.systemError') + ) } this.createLoading = false }) diff --git a/cclqms-vue/src/views/modules/qc/IQCResultEntry.vue b/cclqms-vue/src/views/modules/qc/IQCResultEntry.vue index b584d99..aa7cbff 100644 --- a/cclqms-vue/src/views/modules/qc/IQCResultEntry.vue +++ b/cclqms-vue/src/views/modules/qc/IQCResultEntry.vue @@ -4190,6 +4190,7 @@ export default { }, onBatchPurchaseCreated() { + this.batchPurchaseAddFlag = false this.getDataList() }, diff --git a/cclqms-vue/src/views/modules/qc/file_collect_upload.vue b/cclqms-vue/src/views/modules/qc/file_collect_upload.vue new file mode 100644 index 0000000..78a7af8 --- /dev/null +++ b/cclqms-vue/src/views/modules/qc/file_collect_upload.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/cclqms-vue/src/views/modules/qc/qcPartAttribute.vue b/cclqms-vue/src/views/modules/qc/qcPartAttribute.vue index 40fd5fb..e43e921 100644 --- a/cclqms-vue/src/views/modules/qc/qcPartAttribute.vue +++ b/cclqms-vue/src/views/modules/qc/qcPartAttribute.vue @@ -949,6 +949,8 @@ {{ $t('qc.common.add') }} + {{ $t('qc.partAttributePage.fileCollectImport') }} + :visible.sync="operationModelFlag" width="420px" append-to-body @close="onOperationDialogClose">
@@ -1247,7 +1249,7 @@ + :visible.sync="resourceModelFlag" width="420px" append-to-body @close="onResourceDialogClose">
@@ -1282,7 +1284,7 @@ + :visible.sync="manufacturerModelFlag" width="520px" append-to-body>
@@ -1328,7 +1330,7 @@ + :visible.sync="customerModelFlag" width="520px" append-to-body>
@@ -1478,14 +1480,15 @@ - - -
- + +
+ + style="width: 160px"> {{ i.sitename }} @@ -1498,105 +1501,282 @@ + style="width: 140px"> - + - + {{ $t('qc.common.search') }} -
-
- -
-
- - {{ $t('qc.iqcPage.optionalItemList') }} - ({{ qcSpecItemList1.length }}) +
+
+ {{ $t('qc.iqcPage.optionalItemList') }} + + {{ $t('qc.partAttributePage.qcSpecAddSelected', { count: qcSpecItemSelections1.length }) }} + +
+
+ + + + + + + + + + + + + + +
- - - - - - - - - - - -
- -
- - - - - - +
+
+ + {{ $t('qc.partAttributePage.qcSpecAddPendingItems', { count: qcSpecPendingList.length }) }} + + + {{ $t('qc.partAttributePage.qcSpecCopyClearAdded') }} - -
- - -
-
- - {{ $t('qc.iqcPage.selectedItemList') }} - ({{ qcSpecItemList2.length }})
- - - - - - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + {{ $t('qc.common.confirm') }} + {{ $t('qc.common.cancel') }} + + - -