Compare commits

4 Commits

2 changed files with 66 additions and 1 deletions

View File

@ -597,6 +597,8 @@ import { Plus, Document, Refresh, Setting, Rank, Camera, Link, Download, Bell, C
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'; import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
import type { FormInstance, FormRules } from 'element-plus'; import type { FormInstance, FormRules } from 'element-plus';
import { useUserStore } from '@/stores/user'; import { useUserStore } from '@/stores/user';
import { useRoute } from 'vue-router';
const route = useRoute();
import { import {
listMaterialBase, listMaterialBase,
@ -1589,6 +1591,43 @@ onMounted(() => {
initColumnPermissions(); initColumnPermissions();
getList(); getList();
getOptionsList(); getOptionsList();
// 【优化】:处理外部跳转自动打开编辑弹窗
console.log('--- 准备检测外部跳转参数 ---', route.query);
if (route.query.edit_id) {
const editId = Number(route.query.edit_id);
console.log('检测到 edit_id:', editId);
// 为了防止 API 不支持直接传 id我们改用 keyword 搜索(因为大部分 list 接口都支持 keyword
// 或者直接请求列表,拿到第一页数据进行比对
listMaterialBase({ page: 1, pageSize: 50, id: editId }).then((res: any) => {
// 1. 尝试获取各种可能的数据结构
let rawData = res?.data?.list ?? res?.data?.items ?? res?.data ?? [];
// 2. 如果后端聪明地直接返回了单条数据(对象),把它包装成数组
if (!Array.isArray(rawData) && typeof rawData === 'object' && rawData !== null) {
rawData = [rawData];
}
// 3. 终极兜底,确保 rows 绝对是数组
const rows = Array.isArray(rawData) ? rawData : [];
console.log('兼容处理后的数组数据:', rows);
// 4. 寻找目标行并弹窗
const targetRow = rows.find((r: any) => r.id === editId) || rows[0];
if (targetRow) {
console.log('找到目标物料,准备弹窗:', targetRow);
setTimeout(() => {
handleEdit(targetRow);
}, 800);
} else {
console.warn('未在返回数据中找到该物料');
}
}).catch((error: any) => {
console.error('自动获取物料详情失败', error);
});
}
}); });
</script> </script>

View File

@ -266,6 +266,16 @@
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<el-icon class="icon"><Box/></el-icon> <el-icon class="icon"><Box/></el-icon>
<span>1. 基础信息</span> <span>1. 基础信息</span>
<el-link
v-if="form.base_id"
type="primary"
:underline="false"
style="margin-left: 15px; font-size: 13px;"
@click="openMaterialInNewTab"
>
<el-icon style="margin-right: 4px"><EditPen /></el-icon>前往修改基础信息
</el-link>
</div> </div>
<span class="sub-title" v-if="dialogStatus === 'create'"> (请先搜索锁定物料)</span> <span class="sub-title" v-if="dialogStatus === 'create'"> (请先搜索锁定物料)</span>
</div> </div>
@ -666,7 +676,9 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref, reactive, onMounted, watch, computed} from 'vue' import {ref, reactive, onMounted, watch, computed} from 'vue'
import {Plus, Setting, Refresh, Search, Lock, Box, House, InfoFilled, Link, Printer, Camera, Delete, Picture} from '@element-plus/icons-vue' import {Plus, Setting, Refresh, Search, Lock, Box, House, InfoFilled, Link, Printer, Camera, Delete, Picture, EditPen} from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
const router = useRouter()
import {ElMessage, ElMessageBox, ElLoading} from 'element-plus' import {ElMessage, ElMessageBox, ElLoading} from 'element-plus'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import request from '@/utils/request' import request from '@/utils/request'
@ -1394,6 +1406,20 @@ const handleUpdate = (row: any) => {
visible.value = true visible.value = true
} }
// 在新标签页打开基础信息编辑
const openMaterialInNewTab = () => {
if (!form.base_id) {
return ElMessage.warning('请先选择一个物料')
}
const routeUrl = router.resolve({
path: '/material',
query: {
edit_id: form.base_id
}
})
window.open(routeUrl.href, '_blank')
}
const submitForm = async () => { const submitForm = async () => {
if (!formRef.value) return if (!formRef.value) return
await formRef.value.validate(async (valid: boolean) => { await formRef.value.validate(async (valid: boolean) => {