From f67a24d8b3e1ad0c3133590516959ec9412af003 Mon Sep 17 00:00:00 2001 From: shaoleiliu-netizen123 <480188199@qq.com> Date: Sat, 6 Jun 2026 16:44:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A9=E6=AD=A5=E6=8E=A5=E6=94=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=AE=A1=E6=89=B9=E6=8E=A8=E9=80=81=E9=92=89=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 让步接收申请单前端页面 --- mes-ui/src/api/concessionApply.ts | 82 +++ .../src/views/biz/concessionApply/index.vue | 427 ++++++++++++ src/api/ConcessionApply.ts | 93 +++ src/api/production.ts | 2 +- src/api/qcResultDetail.ts | 2 + src/views/biz/concessionApply/index.vue | 609 ++++++++++++++++++ src/views/biz/qualityTesting/index.vue | 135 ++-- src/views/production/dispatchwork/index.vue | 10 +- src/views/production/myassigtask/index.vue | 10 +- 9 files changed, 1313 insertions(+), 57 deletions(-) create mode 100644 mes-ui/src/api/concessionApply.ts create mode 100644 mes-ui/src/views/biz/concessionApply/index.vue create mode 100644 src/api/ConcessionApply.ts create mode 100644 src/views/biz/concessionApply/index.vue diff --git a/mes-ui/src/api/concessionApply.ts b/mes-ui/src/api/concessionApply.ts new file mode 100644 index 0000000..042db53 --- /dev/null +++ b/mes-ui/src/api/concessionApply.ts @@ -0,0 +1,82 @@ +import { request } from '@/utils/request' + +// 让步接收申请表 类型定义 +export interface ConcessionApply { + id?: number + + qcId?: number + + concessionQty?: number + + applyRemark?: string + + applyContent?: string + + applyFile?: string + + applyUserId?: number + + deptId?: number + + instanceId?: string + + approveStatus?: number + + createTime?: string + + updateTime?: string + +} + +// 让步接收申请表 API +export const concessionApplyApi = { + // 分页查询 + page(params: { page: number; pageSize: number; id?: number }) { + return request({ url: '/biz/concessionApply/page', method: 'get', params }) + }, + + // 获取详情 + detail(id: string) { + return request({ url: `/biz/concessionApply/${id}`, method: 'get' }) + }, + + // 新增 + create(data: ConcessionApply) { + return request({ url: '/biz/concessionApply', method: 'post', data }) + }, + + // 修改 + update(data: ConcessionApply) { + return request({ url: '/biz/concessionApply', method: 'put', data }) + }, + + // 删除 + delete(ids: string[]) { + return request({ url: `/biz/concessionApply/${ids.join(',')}`, method: 'delete' }) + }, + + // 导出 + export(params?: { ids?: string[]; id?: number }) { + const p: Record = {} + if (params?.ids?.length) p.ids = params.ids.join(',') + if (params?.id !== undefined && params?.id !== null) p.id = params.id + return request({ url: `/biz/concessionApply/export`, method: 'get', params: p, responseType: 'blob' }) + }, + + // 导入 + importData(file: File) { + const formData = new FormData() + formData.append('file', file) + return request<{ success: number; fail: number; errors: string[] }>({ + url: `/biz/concessionApply/import`, + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' } + }) + }, + + // 下载导入模板 + downloadTemplate() { + return request({ url: `/biz/concessionApply/template`, method: 'get', responseType: 'blob' }) + } +} diff --git a/mes-ui/src/views/biz/concessionApply/index.vue b/mes-ui/src/views/biz/concessionApply/index.vue new file mode 100644 index 0000000..f6415ae --- /dev/null +++ b/mes-ui/src/views/biz/concessionApply/index.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/src/api/ConcessionApply.ts b/src/api/ConcessionApply.ts new file mode 100644 index 0000000..14857d4 --- /dev/null +++ b/src/api/ConcessionApply.ts @@ -0,0 +1,93 @@ +import { request } from '@/utils/request' + +// 让步接收申请表 类型定义 +export interface ConcessionApply { + id?: number + + qcId?: number + + concessionQty?: number + + applyRemark?: string + + applyContent?: string + + applyFile?: string + + applyUserId?: number + + deptId?: number + + instanceId?: string + + approveStatus?: number + + createTime?: string + + updateTime?: string + +} + + +export interface DetailModel { + + businessId:string, + title:string, + deptName:string, + approveResult:string, + approveRecord:[] +} + +// 让步接收申请表 API +export const concessionApplyApi = { + // 分页查询 + page(params: { page: number; pageSize: number; id?: number }) { + return request({ url: '/biz/concessionApply/page', method: 'get', params }) + }, + + // 获取详情 + detail(id: string) { + return request({ url: `/biz/concessionApply/${id}`, method: 'get' }) + }, + + // 新增 + create(data: ConcessionApply) { + return request({ url: '/biz/concessionApply', method: 'post', data }) + }, + + // 修改 + update(data: ConcessionApply) { + return request({ url: '/biz/concessionApply', method: 'put', data }) + }, + + // 删除 + delete(ids: string[]) { + return request({ url: `/biz/concessionApply/${ids.join(',')}`, method: 'delete' }) + }, + + // 导出 + export(params?: { ids?: string[]; id?: number }) { + const p: Record = {} + if (params?.ids?.length) p.ids = params.ids.join(',') + if (params?.id !== undefined && params?.id !== null) p.id = params.id + return request({ url: `/biz/concessionApply/export`, method: 'get', params: p, responseType: 'blob' }) + }, + + // 导入 + importData(file: File) { + const formData = new FormData() + formData.append('file', file) + return request<{ success: number; fail: number; errors: string[] }>({ + url: `/biz/concessionApply/import`, + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' } + }) + }, + + // 下载导入模板 + downloadTemplate() { + return request({ url: `/biz/concessionApply/template`, method: 'get', responseType: 'blob' }) + }, + +} \ No newline at end of file diff --git a/src/api/production.ts b/src/api/production.ts index 3709567..0374a9c 100644 --- a/src/api/production.ts +++ b/src/api/production.ts @@ -59,7 +59,7 @@ export function workload(params?:any) { export function inspectio(data:any) { return request({ url: `/mes/dispatch/qc`, - method: 'put', + method: 'post', data }) } \ No newline at end of file diff --git a/src/api/qcResultDetail.ts b/src/api/qcResultDetail.ts index 713b2f1..515c4b9 100644 --- a/src/api/qcResultDetail.ts +++ b/src/api/qcResultDetail.ts @@ -24,6 +24,8 @@ export interface QcResultDetail { updateTime?: string + files?:any[] + } // 质检结果明细表 API diff --git a/src/views/biz/concessionApply/index.vue b/src/views/biz/concessionApply/index.vue new file mode 100644 index 0000000..78c5cda --- /dev/null +++ b/src/views/biz/concessionApply/index.vue @@ -0,0 +1,609 @@ + + + + + \ No newline at end of file diff --git a/src/views/biz/qualityTesting/index.vue b/src/views/biz/qualityTesting/index.vue index 29a26ea..efb0b86 100644 --- a/src/views/biz/qualityTesting/index.vue +++ b/src/views/biz/qualityTesting/index.vue @@ -317,31 +317,34 @@ type="textarea" placeholder="输入备注原因" /> - - - -
- - - -
- - 点击或者拖动文件到该区域来上传 - - - 仅支持 PDF、DOC、DOCX,单文件最大10MB - -
-
+ + + + +
+ + + +
+ + 点击或者拖动文件到该区域来上传 + + + 仅支持 PDF、DOC、DOCX、XLS、XLSX、JPG、PNG、GIF,单文件最大10MB + +
+
+
@@ -368,7 +371,7 @@ import { import { SearchOutline, RefreshOutline, AddOutline, TrashOutline, CreateOutline, CloudUploadOutline, DownloadOutline, - EllipsisHorizontalOutline, ArrowDownOutline, ArrowUpOutline + EllipsisHorizontalOutline, ArrowDownOutline, ArrowUpOutline,ArchiveOutline as ArchiveIcon } from '@vicons/ionicons5' import { qualityTestingApi, type QualityTesting } from '@/api/qualityTesting' import {assingReworkApi} from '@/api/assingRework' @@ -376,6 +379,8 @@ import { dictDataApi } from '@/api/org' import {Language} from "@xterm/xterm/src/vs/base/common/platform.ts"; +import {fileApi} from '@/api/system1' + import value = Language.value; import {QcResultDetail} from "@/api/qcResultDetail.ts"; import router from "@/router"; @@ -986,8 +991,19 @@ function submitResultDetail(row) { formDetailConcessionData.qcId = row.id } + + async function handleSubmitResultDetail() { - const submitParam = [formDetailOKData,formDetailScrapData,formDetailReworkData,formDetailConcessionData] + + formDetailConcessionData.files = uploadFiles.value + + const submitParam = [ + formDetailOKData, + formDetailScrapData, + formDetailReworkData, + formDetailConcessionData] + console.log(submitParam); + submitFlag.value? await qualityTestingApi.submit(submitParam) : await qualityTestingApi.submitBF(submitParam) message.success('提交成功') @@ -1043,21 +1059,60 @@ function handleCancelQuality(row) { //上传附件 -const handleUploadChange = ({ file, fileList: list }: any) => { - uploadFiles.value = list.map(item => item.file) +async function handleUploadChange ({ file, fileList: list }: any) { + // 允许的后缀白名单 + const allowExt = ['pdf','doc','docx','xls','xlsx','jpg','jpeg','png','gif','bmp'] + const invalidFiles:any[] = [] + + list.forEach(item=>{ + const name = item.file.name.toLowerCase() + const ext = name.split('.').pop() + if(!allowExt.includes(ext)){ + invalidFiles.push(item.file.name) + item.status = 'error' + } + }) + if(invalidFiles.length){ + window.$message.error(`【${invalidFiles.join('、')}】文件格式不支持`) + } + + + + fileList.value = list + console.log('选中的文件列表', fileList.value) + + // ✅关键:只筛选【pending等待上传】的文件,success/error/removed全部跳过,不再重复上传 + const validList = list.filter(item => + item.status === 'pending' && item.file && item.status !== 'error' + ) + + const successIds = list.filter(x=>x.status==='success' && x.file).map(x=>x.id) + // 只保留页面还存在的附件信息 + uploadFiles.value = uploadFiles.value.filter(item=> successIds.includes(item.uid)) + + // 只上传pending新文件 + const pendingList = list.filter(item => item.status === 'pending' && item.file && item.status !== 'error') + if(pendingList.length === 0) return + + const uploadPromises = validList.map(async (item: any) => { + try { + const res = await fileApi.upload(item.file, null, null) + uploadFiles.value.push(res) + const targetFile = fileList.value.find(f => f.id === item.id) + if (targetFile) { + targetFile.status = 'success' + targetFile.percentage = 100 + } + } catch (error) { + console.error('文件上传失败', error) + const targetFile = fileList.value.find(f => f.id === item.id) + if (targetFile) targetFile.status = 'error' + } + }) + await Promise.all(uploadPromises) } -// 表单保存时调用 -const submitUpload = async (billId: number) => { - if (!uploadFiles.value.length) return - const formData = new FormData() - formData.append('billId', String(billId)) - uploadFiles.value.forEach(file => { - formData.append('files', file) - }) - console.log(uploadFiles); - -} + onMounted(() => { loadData() diff --git a/src/views/production/dispatchwork/index.vue b/src/views/production/dispatchwork/index.vue index c922db7..21ba027 100644 --- a/src/views/production/dispatchwork/index.vue +++ b/src/views/production/dispatchwork/index.vue @@ -9,9 +9,9 @@ label-placement="left" > - + @@ -490,12 +490,6 @@ const columns = [ key:"assingCode", minWidth:150 }, - { - align:'center', - title: '工序编号', - key: 'processId', - minWidth: 150 - }, { align:'center', title: '工序名称', diff --git a/src/views/production/myassigtask/index.vue b/src/views/production/myassigtask/index.vue index 15aa868..7d8985a 100644 --- a/src/views/production/myassigtask/index.vue +++ b/src/views/production/myassigtask/index.vue @@ -9,9 +9,9 @@ label-placement="left" > - + @@ -255,12 +255,6 @@ const columns = [ key:"assingCode", minWidth:150 }, - { - align:'center', - title: '工序编号', - key: 'processId', - minWidth: 150 - }, { align:'center', title: '工序名称',