| src/api/qualityManagement/nonconformingManagement.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/qualityManagement/nonconformingManagement/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/qualityManagement/nonconformingManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/deliveryLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/qualityManagement/nonconformingManagement.js
@@ -1,42 +1,50 @@ import request from '@/utils/request' import request from "@/utils/request"; // 查询不合格管理列表 export function qualityUnqualifiedListPage(query) { return request({ url: '/quality/qualityUnqualified/listPage', method: 'get', params: query, }) return request({ url: "/quality/qualityUnqualified/listPage", method: "get", params: query, }); } // 新增不合格管理列表 export function qualityUnqualifiedAdd(query) { return request({ url: '/quality/qualityUnqualified/add', method: 'post', data: query, }) return request({ url: "/quality/qualityUnqualified/add", method: "post", data: query, }); } // 修改不合格管理列表 export function qualityUnqualifiedUpdate(query) { return request({ url: '/quality/qualityUnqualified/update', method: 'post', data: query, }) return request({ url: "/quality/qualityUnqualified/update", method: "post", data: query, }); } // 不合格处理 export function qualityUnqualifiedDeal(query) { return request({ url: "/quality/qualityUnqualified/deal", method: "post", data: query, }); } // 删除不合格管理列表 export function qualityUnqualifiedDel(query) { return request({ url: '/quality/qualityUnqualified/del', method: 'delete', data: query, }) return request({ url: "/quality/qualityUnqualified/del", method: "delete", data: query, }); } // 查询不合格管理信息 export function getQualityUnqualifiedInfo(query) { return request({ url: '/quality/qualityUnqualified/' + query, method: 'get', data: query, }) } return request({ url: "/quality/qualityUnqualified/" + query, method: "get", data: query, }); } src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -9,14 +9,6 @@ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="状态:" prop="inspectState"> <el-select v-model="form.inspectState"> <el-option label="待处理" :value="0" /> <el-option label="已处理" :value="1" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="类别:" prop="inspectType"> <el-select v-model="form.inspectType"> <el-option label="原材料检验" :value="0" /> @@ -150,7 +142,6 @@ quantity: "", checkCompany: "", checkResult: "", inspectState: '', inspectType: '', defectivePhenomena: '', dealResult: '', @@ -178,7 +169,8 @@ getProductOptions(); if (operationType.value === 'edit') { getQualityUnqualifiedInfo(row.id).then(res => { form.value = {...res.data} const { inspectState, ...rest } = (res.data || {}) form.value = { ...rest } }) } } @@ -222,13 +214,15 @@ const submitForm = () => { proxy.$refs.formRef.validate(valid => { if (valid) { // 状态字段不在表单填写,也不传给后端 const { inspectState, ...payload } = (form.value || {}) if (operationType.value === "add") { qualityUnqualifiedAdd(form.value).then(res => { qualityUnqualifiedAdd(payload).then(res => { proxy.$modal.msgSuccess("提交成功"); closeDia(); }) } else { qualityUnqualifiedUpdate(form.value).then(res => { qualityUnqualifiedUpdate(payload).then(res => { proxy.$modal.msgSuccess("提交成功"); closeDia(); }) src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -9,14 +9,6 @@ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="状态:" prop="inspectState"> <el-select v-model="form.inspectState"> <el-option label="待处理" :value="0" /> <el-option label="已处理" :value="1" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="类别:" prop="inspectType"> <el-select v-model="form.inspectType" disabled> <el-option label="原材料检验" :value="0" /> @@ -131,8 +123,7 @@ import {productTreeList} from "@/api/basicData/product.js"; import { getQualityUnqualifiedInfo, qualityUnqualifiedAdd, qualityUnqualifiedUpdate qualityUnqualifiedDeal } from "@/api/qualityManagement/nonconformingManagement.js"; const { proxy } = getCurrentInstance() const emit = defineEmits(['close']) @@ -152,7 +143,6 @@ quantity: "", checkCompany: "", checkResult: "", inspectState: '', inspectType: '', defectivePhenomena: '', dealResult: '', @@ -186,7 +176,8 @@ getProductOptions(); if (operationType.value === 'edit') { getQualityUnqualifiedInfo(row.id).then(res => { form.value = {...res.data} const { inspectState, ...rest } = (res.data || {}) form.value = { ...rest } }) } } @@ -230,17 +221,12 @@ const submitForm = () => { proxy.$refs.formRef.validate(valid => { if (valid) { if (operationType.value === "add") { qualityUnqualifiedAdd(form.value).then(res => { proxy.$modal.msgSuccess("提交成功"); closeDia(); }) } else { qualityUnqualifiedUpdate(form.value).then(res => { proxy.$modal.msgSuccess("提交成功"); closeDia(); }) } // 状态字段不在表单填写,也不传给后端;处理统一走 /deal 接口 const { inspectState, ...payload } = (form.value || {}) qualityUnqualifiedDeal(payload).then(() => { proxy.$modal.msgSuccess("提交成功"); closeDia(); }) } }) } src/views/qualityManagement/nonconformingManagement/index.vue
@@ -185,6 +185,7 @@ clickFun: (row) => { openForm("edit", row); }, disabled: (row) => row.inspectState === 1, }, { name: "处理", @@ -192,6 +193,7 @@ clickFun: (row) => { openInspectionForm("edit", row); }, disabled: (row) => row.inspectState === 1, }, ], }, @@ -247,12 +249,20 @@ // 打开弹框 const openForm = (type, row) => { if (type !== 'add' && row?.inspectState === 1) { proxy.$modal.msgWarning("已处理的数据不能再编辑"); return; } nextTick(() => { formDia.value?.openDialog(type, row) }) }; // 打开处理弹框 const openInspectionForm = (type, row) => { if (row?.inspectState === 1) { proxy.$modal.msgWarning("已处理的数据不能再处理"); return; } nextTick(() => { inspectionFormDia.value?.openDialog(type, row) }) src/views/salesManagement/deliveryLedger/index.vue
@@ -45,14 +45,20 @@ </el-tag> </template> </el-table-column> <el-table-column fixed="right" label="操作" width="150" align="center"> <el-table-column fixed="right" label="操作" width="200" align="center"> <template #default="scope"> <el-button link type="primary" size="small" :disabled="isApproving(scope.row.status)" :disabled="!isApproved(scope.row.status)" @click="openForm('edit', scope.row)">补充发货信息</el-button> <el-button link type="primary" size="small" @click="openDetail(scope.row)" >详情</el-button> <el-button link type="danger" @@ -166,6 +172,41 @@ </div> </template> </el-dialog> <!-- 详情弹框 --> <el-dialog v-model="detailDialogVisible" title="发货台账详情" width="55%" @close="closeDetail"> <div v-if="detailRow" class="detail-wrapper"> <el-descriptions :column="2" border> <el-descriptions-item label="销售订单">{{ detailRow.salesContractNo || '--' }}</el-descriptions-item> <el-descriptions-item label="发货订单号">{{ detailRow.shippingNo || '--' }}</el-descriptions-item> <el-descriptions-item label="客户名称">{{ detailRow.customerName || '--' }}</el-descriptions-item> <el-descriptions-item label="发货类型">{{ detailRow.type || '--' }}</el-descriptions-item> <el-descriptions-item label="发货日期">{{ detailRow.shippingDate || '--' }}</el-descriptions-item> <el-descriptions-item label="审核状态">{{ getApprovalStatusText(detailRow.status) }}</el-descriptions-item> <el-descriptions-item label="发货车牌号">{{ detailRow.shippingCarNumber || '--' }}</el-descriptions-item> <el-descriptions-item label="快递公司">{{ detailRow.expressCompany || '--' }}</el-descriptions-item> <el-descriptions-item label="快递单号" :span="2">{{ detailRow.expressNumber || '--' }}</el-descriptions-item> </el-descriptions> <div class="detail-images" v-if="detailImages.length"> <div class="detail-images-title">发货图片</div> <el-image v-for="img in detailImages" :key="img.url" :src="img.url" :preview-src-list="detailImages.map(i => i.url)" fit="cover" class="detail-image" /> </div> <div v-else class="detail-images-empty">暂无发货图片</div> </div> <template #footer> <div class="dialog-footer"> <el-button @click="closeDetail">关闭</el-button> </div> </template> </el-dialog> </div> </template> @@ -196,6 +237,31 @@ const total = ref(0); const deliveryFileList = ref([]); const javaApi = proxy.javaApi; // 详情弹框 const detailDialogVisible = ref(false); const detailRow = ref(null); const detailImages = ref([]); const normalizeFileUrl = (rawUrl = '') => { let fileUrl = rawUrl || ''; // Windows 路径转 URL if (fileUrl && fileUrl.indexOf('\\') > -1) { const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads'); if (uploadsIndex > -1) { const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/'); fileUrl = '/' + relativePath; } else { const parts = fileUrl.split('\\'); const fileName = parts[parts.length - 1]; fileUrl = '/uploads/' + fileName; } } if (fileUrl && !fileUrl.startsWith('http')) { if (!fileUrl.startsWith('/')) fileUrl = '/' + fileUrl; fileUrl = javaApi + fileUrl; } return fileUrl; }; // 上传配置 const upload = reactive({ @@ -284,9 +350,9 @@ // 打开弹框 const openForm = async (type, row) => { // 编辑时检查审核状态,只有审核中不能编辑 if (type === 'edit' && row && isApproving(row.status)) { proxy.$modal.msgWarning("审核中的数据不能编辑"); // 补充发货信息:仅“审核通过”允许编辑 if (type === 'edit' && row && !isApproved(row.status)) { proxy.$modal.msgWarning("只有审核通过的数据才可以补充发货信息"); return; } @@ -307,38 +373,7 @@ // 如果有图片,将 commonFileList 转换为文件列表格式 if (row.commonFileList && Array.isArray(row.commonFileList) && row.commonFileList.length > 0) { deliveryFileList.value = row.commonFileList.map((file, index) => { // 处理 URL:将 Windows 路径转换为可访问的 URL let fileUrl = file.url || ''; console.log('原始 URL:', fileUrl); // 如果 URL 是 Windows 路径格式(包含反斜杠),需要转换 if (fileUrl && fileUrl.indexOf('\\') > -1) { // 查找 uploads 关键字的位置,从那里开始提取相对路径 const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads'); if (uploadsIndex > -1) { // 从 uploads 开始提取路径,并将反斜杠替换为正斜杠 const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/'); fileUrl = '/' + relativePath; console.log('转换后的相对路径:', fileUrl); } else { // 如果没有找到 uploads,提取最后一个目录和文件名 const parts = fileUrl.split('\\'); const fileName = parts[parts.length - 1]; fileUrl = '/uploads/' + fileName; console.log('未找到 uploads,使用文件名:', fileUrl); } } // 确保所有非 http 开头的 URL 都拼接 baseUrl if (fileUrl && !fileUrl.startsWith('http')) { // 确保路径以 / 开头 if (!fileUrl.startsWith('/')) { fileUrl = '/' + fileUrl; } // 拼接 baseUrl fileUrl = javaApi + fileUrl; console.log('最终拼接的 URL:', fileUrl); } const fileUrl = normalizeFileUrl(file.url || ''); return { uid: file.id || Date.now() + index, @@ -373,6 +408,21 @@ } dialogFormVisible.value = true; }; // 打开详情弹框 const openDetail = (row) => { detailRow.value = row || null; const list = Array.isArray(row?.commonFileList) ? row.commonFileList : []; detailImages.value = list .map((f) => ({ url: normalizeFileUrl(f?.url || '') })) .filter((i) => !!i.url); detailDialogVisible.value = true; }; const closeDetail = () => { detailDialogVisible.value = false; detailRow.value = null; detailImages.value = []; }; // 提交表单 @@ -671,5 +721,27 @@ display: none; } } .detail-wrapper { padding: 8px 0; } .detail-images { margin-top: 16px; } .detail-images-title { font-weight: 600; margin-bottom: 10px; color: #303133; } .detail-image { width: 120px; height: 120px; margin-right: 10px; margin-bottom: 10px; border-radius: 6px; } .detail-images-empty { margin-top: 16px; color: #909399; } </style>