liuhairui 6 mesiacov pred
rodič
commit
f8ddf226ed

+ 34 - 9
src/api/mes/job.js

@@ -992,6 +992,21 @@ export const getUploadPath = (data) => {
     data
   })
 }
+
+export const TemplateList = (params) => {
+  return service({
+    url: '/mes_server/Facility/TemplateList',
+    method: 'get',
+    params
+  })
+}
+export const setActiveTemplate = (params) => {
+  return service({
+    url: '/mes_server/Facility/setActiveTemplate',
+    method: 'get',
+    params
+  })
+}
 //
 export const Template = (params) => {
   return service({
@@ -1000,6 +1015,14 @@ export const Template = (params) => {
     params
   })
 }
+export const Template_ids = (params) => {
+  return service({
+    url: '/mes_server/Facility/Template_ids',
+    method: 'get',
+    params
+  })
+}
+
 export const updatetemplate = (data) => {
   return service({
     url: '/mes_server/Facility/updatetemplate',
@@ -1112,20 +1135,23 @@ export const PatternApi = (params) => {
 }
 
 
+export const sd_models = (params) => {
+  return service({
+    url: '/mes_server/work_order/sd_models',
+    method: 'get',
+    params
+  })
+}
+
 
-/*
-* 工单超节损核算
-*/
 
-// 1.1获取左侧菜单栏
-export const getSide = (params) => {
+export const getSide = (data) => {
   return service({
     url: '/mes_server/order_super_loss/getTab',
-    method: 'get',
-    params
+    method: 'post',
+    data
   })
 }
-// 1.2获取超节损工单列表
 export const getTable = (params) => {
   return service({
     url: '/mes_server/order_super_loss/getList',
@@ -1133,7 +1159,6 @@ export const getTable = (params) => {
     params
   })
 }
-//AI 超节损分析(月度)
 export const oversizedloss = (data) => {
   return service({
     url: '/mes_server/order_super_loss/oversizedloss',

+ 117 - 70
src/view/performance/QualityAssessment/Template.vue

@@ -1,7 +1,28 @@
 <template>
   <div class="page-container">
     <el-descriptions :column="2" border class="queue-status-box">
-      
+      <!-- 模版选择器 -->
+      <el-descriptions-item label="模版选择" :span="2">
+        <el-row :gutter="10" align="middle">
+          <el-col :span="6">
+            <el-select v-model="selectedId" placeholder="请选择模版" @change="loadTemplateDetail">
+              <el-option
+                v-for="tpl in templateList"
+                :key="tpl.id"
+                :label="'模版 ' + tpl.id + (tpl.ids === 1 ? '(使用中)' : '')"
+                :value="tpl.id"
+              />
+            </el-select>
+          </el-col>
+          <el-col :span="3">
+            <el-button type="primary" @click="createNewTemplate">新增模版</el-button>
+          </el-col>
+          <el-col :span="4">
+            <el-button type="success" @click="setActive" :disabled="selectedId === usedId">设为当前使用模版</el-button>
+          </el-col>
+        </el-row>
+      </el-descriptions-item>
+
       <!-- 图生文模版输入区域 -->
       <el-descriptions-item label="图生文模版" :span="2">
         <textarea
@@ -12,15 +33,17 @@
           @keydown.tab.prevent="insertTab"
         ></textarea>
       </el-descriptions-item>
-	  <el-descriptions-item label="文生文模版" :span="2">
-	    <textarea
-	      v-model="english_content"
-	      placeholder="请输入提示词"
-	      rows="10"
-	      class="custom-textarea"
-	      @keydown.tab.prevent="insertTab"
-	    ></textarea>
-	  </el-descriptions-item>
+
+      <!-- 文生文模版输入区域 -->
+      <el-descriptions-item label="文生文模版" :span="2">
+        <textarea
+          v-model="english_content"
+          placeholder="请输入提示词"
+          rows="10"
+          class="custom-textarea"
+          @keydown.tab.prevent="insertTab"
+        ></textarea>
+      </el-descriptions-item>
 
       <!-- 出图尺寸输入区域 -->
       <el-descriptions-item label="出图尺寸" :span="2">
@@ -47,17 +70,12 @@
         </el-row>
       </el-descriptions-item>
 
-      <!-- 更新按钮 -->
+      <!-- 操作按钮 -->
       <el-descriptions-item label="操作" :span="2">
-        <el-button
-          type="primary"
-          @click="updathandle"
-          :loading="isLoading"
-        >
-          更新模版
+        <el-button type="primary" @click="saveTemplate" :loading="isLoading">
+          保存模版
         </el-button>
       </el-descriptions-item>
-
     </el-descriptions>
   </div>
 </template>
@@ -65,91 +83,118 @@
 <script setup>
 import { ref, nextTick, onMounted } from 'vue'
 import { ElMessage } from 'element-plus'
-import { Template, updatetemplate } from '@/api/mes/job'
-
+import {
+  TemplateList,
+  Template,
+  updatetemplate,
+  setActiveTemplate
+} from '@/api/mes/job'
+
+// 模版状态数据
+const templateList = ref([])
+const selectedId = ref(null)
+const usedId = ref(null)
+
+// 模版内容
 const textareaContent = ref('')
 const english_content = ref('')
-
 const height = ref('')
 const width = ref('')
 const isLoading = ref(false)
 
-// 页面加载时获取模版数据
-const handleRowClick = async () => {
-  const res = await Template()
+// 加载模版列表
+const loadTemplateList = async () => {
+  const res = await TemplateList()
+  templateList.value = res.data.list || []
+  usedId.value = res.data.usedId
+  selectedId.value = usedId.value
+  await loadTemplateDetail(selectedId.value)
+}
+
+// 加载某个模版详情
+const loadTemplateDetail = async (id) => {
+  const res = await Template({ id })
   textareaContent.value = res.data.content || ''
   english_content.value = res.data.english_content || ''
-  height.value = res.data.height || ''
   width.value = res.data.width || ''
+  height.value = res.data.height || ''
+}
+
+// 创建新模版(清空内容)
+const createNewTemplate = () => {
+  selectedId.value = null
+  textareaContent.value = ''
+  english_content.value = ''
+  width.value = ''
+  height.value = ''
 }
-onMounted(handleRowClick)
 
-// 提交更新模版数据
-const updathandle = async () => {
+// 保存模版(新增或更新)
+const saveTemplate = async () => {
+  if (!textareaContent.value || !width.value || !height.value) {
+    ElMessage.warning('请填写完整模版内容和尺寸')
+    return
+  }
+
   isLoading.value = true
   const res = await updatetemplate({
+    id: selectedId.value,
     textareaContent: textareaContent.value,
-	english_content: english_content.value,
-    height: height.value,
-    width: width.value
+    english_content: english_content.value,
+    width: width.value,
+    height: height.value
   })
   isLoading.value = false
+
+  if (res.code === 0) {
+    ElMessage.success('模版保存成功')
+    loadTemplateList()
+  } else {
+    ElMessage.error('保存失败')
+  }
+}
+
+// 设为当前模版
+const setActive = async () => {
+  const res = await setActiveTemplate({ id: selectedId.value })
   if (res.code === 0) {
-    ElMessage.success('模版设置成功')
+    ElMessage.success('已设为当前使用模版')
+    await loadTemplateList()
   } else {
-    ElMessage.error('模版设置失败')
+    ElMessage.error('设置失败')
   }
 }
 
-// 处理 Tab / Shift+Tab 缩进和缩回逻辑
+// tab 缩进逻辑
 const insertTab = (event) => {
   const textarea = event.target
   const start = textarea.selectionStart
   const end = textarea.selectionEnd
-  const value = textareaContent.value
   const isShift = event.shiftKey
-
+  const value = textareaContent.value
   const before = value.substring(0, start)
   const selected = value.substring(start, end)
   const after = value.substring(end)
 
   if (selected.includes('\n')) {
     const lines = selected.split('\n')
-    if (isShift) {
-      // 缩回
-      const newLines = lines.map(line =>
-        line.startsWith('\t') ? line.substring(1) :
-        line.startsWith('    ') ? line.substring(4) : line
-      )
-      const newText = newLines.join('\n')
-      textareaContent.value = before + newText + after
-
-      const removedLen = selected.length - newText.length
-      nextTick(() => {
-        textarea.selectionStart = start
-        textarea.selectionEnd = end - removedLen
-      })
-    } else {
-      // 缩进
-      const newLines = lines.map(line => '\t' + line)
-      const newText = newLines.join('\n')
-      textareaContent.value = before + newText + after
-
-      const addedLen = newText.length - selected.length
+    const newText = lines
+      .map(line => (isShift
+        ? (line.startsWith('\t') ? line.substring(1) : line.startsWith('    ') ? line.substring(4) : line)
+        : '\t' + line))
+      .join('\n')
+    textareaContent.value = before + newText + after
+    const offset = newText.length - selected.length
+    nextTick(() => {
+      textarea.selectionStart = start
+      textarea.selectionEnd = end + offset
+    })
+  } else {
+    if (isShift && value.substring(start - 1, start) === '\t') {
+      textareaContent.value = before.slice(0, -1) + selected + after
       nextTick(() => {
-        textarea.selectionStart = start
-        textarea.selectionEnd = end + addedLen
+        textarea.selectionStart = textarea.selectionEnd = start - 1
       })
-    }
-  } else {
-    // 单行缩进/缩回
-    if (isShift) {
-      if (value.substring(start - 1, start) === '\t') {
-        textareaContent.value = before.slice(0, -1) + selected + after
-        nextTick(() => {
-          textarea.selectionStart = textarea.selectionEnd = start - 1
-        })
-      }
     } else {
       textareaContent.value = before + '\t' + selected + after
       nextTick(() => {
@@ -160,6 +205,9 @@ const insertTab = (event) => {
 
   event.preventDefault()
 }
+
+// 初始化加载
+onMounted(loadTemplateList)
 </script>
 
 <style scoped>
@@ -180,7 +228,6 @@ const insertTab = (event) => {
   box-sizing: border-box;
 }
 
-/* 修正表格单元格布局 */
 :deep(.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell) {
   width: 100px;
 }

+ 337 - 0
src/view/performance/QualityAssessment/TestTemplate.vue

@@ -0,0 +1,337 @@
+<template>
+  <div>
+    <!-- 搜索区域 -->
+    <el-form inline>
+      <el-form-item>
+        <el-input v-model="searchInfo" placeholder="搜索" clearable style="width: 300px;" />
+        <el-button type="primary" icon="search" @click="onSubmit" title="搜索">查询</el-button>
+        <el-button type="primary" title="选择图片,文生图" @click="texttoimg" :loading="isLoading">文生图</el-button>
+        <el-button type="primary" title="选择图片,图生图" @click="imgtoimg" :loading="isLoading">图生图</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 模型选择 -->
+    <el-descriptions column="1" border>
+      <el-descriptions-item label="文生图模型">
+        <el-radio-group v-model="selectedOption">
+          <el-radio label="black-forest-labs/FLUX.1-kontext-pro">flux-pro</el-radio>
+          <el-radio label="dall-e-3">dall-e-3</el-radio>
+          <el-radio label="gpt-image-1">gpt-image-1</el-radio>
+        </el-radio-group>
+      </el-descriptions-item>
+    </el-descriptions>
+
+    <!-- 表格展示 :show-overflow-tooltip="true" -->
+    <el-table
+      ref="multipleTable"
+      style="width: 100%; height: 65vh;"
+      :row-style="{ height: '20px' }"
+      :header-cell-style="{ padding: '0px' }"
+      :cell-style="{ padding: '0px' }"
+      :header-row-style="{ height: '20px' }"
+      border tooltip-effect="dark"
+      :data="tableData1"
+      row-key="ID"
+      highlight-current-row
+      :cell-class-name="tableDataCellClass"
+      @selection-change="SelectionChange"
+      @row-dblclick="onRowDblClick"
+	  :show-overflow-tooltip="true"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="ID" prop="id" width="70" />
+      <el-table-column label="第一段" prop="chinese_description" width="300" />
+      <el-table-column label="第二段" prop="english_description" width="300" />
+      <el-table-column label="图片名称" prop="img_name" width="500" />
+      <el-table-column label="文生图预览" width="120">
+        <template #default="{ row }">
+          <el-image
+            :src="formatImageUrl(row.new_image_url)"
+            :preview-src-list="[formatImageUrl(row.new_image_url)]"
+            style="width: 90px; height: 70px;"
+            fit="contain"
+            preview-teleported
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="图生图预览" width="120">
+        <template #default="{ row }">
+          <el-image
+            :src="formatImageUrl(row.imgtoimg_url)"
+            :preview-src-list="[formatImageUrl(row.imgtoimg_url)]"
+            style="width: 90px; height: 70px;"
+            fit="contain"
+            preview-teleported
+          />
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <div class="gva-pagination">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="page"
+        :page-sizes="[10, 30, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      />
+    </div>
+
+    <el-dialog 
+      v-model="editDialogVisible" 
+      title="查看信息" 
+      style="width: 70%; height: 80%;top: -6%;" 
+      :modal="true">
+      <el-scrollbar style="max-height: 60vh; overflow-y: auto;">
+        <el-form :model="editFormData">
+			<el-form-item label="ID" label-width="80px">
+				<el-input v-model="editFormData.id" disabled />
+			</el-form-item>
+    
+          <el-form-item label="文生图路径">
+            <el-input v-model="editFormData.new_image_url" disabled />
+          </el-form-item>
+    
+          <el-form-item label="图生图路径">
+            <el-input v-model="editFormData.imgtoimg_url" disabled />
+          </el-form-item>
+    
+          <el-form-item label="第一段">
+            <el-input
+              type="textarea"
+              v-model="editFormData.chinese_description"
+              :rows="6"
+            />
+          </el-form-item>
+    
+          <el-form-item label="第二段">
+            <el-input
+              type="textarea"
+              v-model="editFormData.english_description"
+              :rows="6"
+            />
+          </el-form-item>
+    
+          <el-form-item label="图片名称">
+            <el-input v-model="editFormData.img_name" />
+          </el-form-item>
+        </el-form>
+      </el-scrollbar>
+    
+      <template #footer>
+        <el-button @click="editDialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="submitEdit">确定</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 图片预览 -->
+    <el-dialog v-model="dialogVisible" title="图片预览" width="70%" top="5vh" destroy-on-close>
+      <div style="text-align: center;">
+        <el-image :src="currentImageUrl" style="max-width: 100%; max-height: 70vh;" fit="contain" />
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRaw, onMounted } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getTable, imageToText, Template_ids,getSide } from '@/api/mes/job'
+import { useUserStore } from '@/pinia/modules/user'
+
+const userStore = useUserStore()
+const _username = ref(userStore.userInfo.userName + '/' + userStore.userInfo.nickName)
+
+const searchInfo = ref('')
+const tableData1 = ref([])
+const total = ref(0)
+const page = ref(1)
+const pageSize = ref(50)
+const dialogVisible = ref(false)
+const currentImageUrl = ref('')
+const width = ref('')
+const height = ref('')
+const isLoading = ref(false)
+const txttotxt_selectedOption = ref('gemini-2.0-flash')
+const selectedOption = ref('black-forest-labs/FLUX.1-kontext-pro')
+const num = ref(1)
+const _parh = ref([])
+
+const editDialogVisible = ref(false)
+const editFormData = reactive({
+  id: '',
+  chinese_description: '',
+  english_description: '',
+  new_image_url:'',
+  imgtoimg_url:'',
+  img_name: ''
+})
+
+const formatImageUrl = (path) => {
+  if (!path) return ''
+  const base = 'http://20.0.16.128:9093'
+  return `${base}/${path.replace(/^public\//, '')}`
+}
+
+const getTableData = async () => {
+  try {
+    const res = await getTable({
+      search: searchInfo.value,
+      limit: pageSize.value,
+      page: page.value
+    })
+    tableData1.value = res.data.list
+    total.value = res.data.total
+
+    const res_Template = await Template_ids()
+    height.value = res_Template.data.height
+    width.value = res_Template.data.width
+  } catch (err) {
+    ElMessage.error('数据加载失败')
+  }
+}
+
+const onSubmit = () => {
+  page.value = 1
+  getTableData()
+}
+
+const handleCurrentChange = (val) => {
+  page.value = val
+  getTableData()
+}
+
+const handleSizeChange = (val) => {
+  pageSize.value = val
+  page.value = 1
+  getTableData()
+}
+
+const SelectionChange = (rows) => {
+  _parh.value = rows.map(item => item.old_image_url)
+}
+
+const texttoimg = () => {
+  processImages(toRaw(_parh.value), '文生图')
+}
+
+const imgtoimg = () => {
+  processImages(toRaw(_parh.value), '图生图')
+}
+
+const processImages = async (files, type) => {
+  if (!Array.isArray(files) || files.length === 0) {
+    ElMessage.warning('请选择要处理的图片')
+    return
+  }
+
+  const pathGroups = {}
+  _parh.value.forEach(path => {
+    const dir = path.replace(/\/[^\/]*$/, '')
+    if (!pathGroups[dir]) pathGroups[dir] = []
+    pathGroups[dir].push(path)
+  })
+
+  isLoading.value = true
+  const failList = []
+
+  for (const [dir, images] of Object.entries(pathGroups)) {
+    const payload = {
+      old_image_file: dir,
+      type,
+      selectedOption: selectedOption.value,
+      txttotxt_selectedOption: txttotxt_selectedOption.value,
+      batch: images,
+      num: num.value,
+      width: width.value,
+      height: height.value
+    }
+
+    try {
+      await imageToText(payload)
+      ElMessage.success(`处理目录:${dir},共 ${images.length} 张 * ${num.value} 次`)
+    } catch (e) {
+      console.warn('处理失败:', dir, e)
+      images.forEach((_, i) => failList.push(`目录 ${dir} 第 ${i + 1} 张`))
+    }
+  }
+
+  if (failList.length > 0) {
+    ElMessage.warning('部分图片处理失败,请查看控制台')
+  }
+
+  await new Promise(resolve => setTimeout(resolve, 3000))
+  isLoading.value = false
+}
+
+const previewImage = (url) => {
+  currentImageUrl.value = url
+  dialogVisible.value = true
+}
+
+const onRowDblClick = (row) => {
+  editFormData.id = row.id
+  editFormData.chinese_description = row.chinese_description
+  editFormData.english_description = row.english_description
+  editFormData.img_name = row.img_name
+  editFormData.new_image_url = row.new_image_url
+  editFormData.imgtoimg_url = row.imgtoimg_url
+  editDialogVisible.value = true
+}
+
+const submitEdit = async () => {
+  try {
+    // 校验表单字段是否存在
+    const { id, chinese_description, english_description, img_name } = editFormData;
+
+    // 打印调试信息
+    console.log('修改后的数据:', editFormData);
+
+    // 构造 payload
+    const payload = {
+      id,
+      chinese_description,
+      english_description,
+      img_name
+    };
+
+    // 调用接口
+    const res_Template = await getSide(payload);
+
+    // 成功提示
+    ElMessage.success('修改成功');
+
+    // 关闭弹窗
+    editDialogVisible.value = false;
+
+    // 刷新数据
+    getTableData();
+  } catch (error) {
+    console.error('修改失败:', error);
+    ElMessage.error('修改失败,请稍后重试');
+  }
+};
+
+onMounted(() => {
+  getTableData()
+})
+</script>
+
+<style scoped>
+:deep(.el-table td .cell) {
+  line-height: 22px !important;
+}
+:deep(.el-dialog__body) {
+  padding: 10px 20px;
+}
+.gva-pagination {
+  margin-top: 10px;
+  text-align: right;
+}
+:deep(.el-table__body tr.current-row) > td {
+  background: #ff80ff !important;
+}
+</style>

+ 147 - 80
src/view/performance/QualityAssessment/excessive.vue

@@ -131,6 +131,26 @@
 	  </el-table-column>
 	</el-table>
 	
+	
+	
+	<el-dialog v-model="zipview" title="请选择打包尺寸" width="500px" top="20%">
+	  <el-radio-group v-model="zipselectedOption" size="medium">
+	    <el-radio label="1024x1024">1024 x 1024</el-radio>
+	    <el-radio label="1024x1303">1024 x 1303</el-radio>
+	    <el-radio label="图生图">图生图</el-radio>
+	    <el-radio label="高清放大">高清放大</el-radio>
+	  </el-radio-group>
+	
+	  <template #footer>
+	    <div style="text-align: right">
+	      <el-button @click="zipview = false">取消</el-button>
+	      <el-button type="primary" @click="confirmPack">确认打包</el-button>
+	    </div>
+	  </template>
+	</el-dialog>
+
+		
+		
 	<el-dialog v-model="showDescDialog" title="" width="890px" top="0%">
 	  <div style="display: flex; gap: 10px; max-height: 70vh; overflow: hidden;">
 	    <!-- 左侧图片区域,自适应图片尺寸,可滚动查看完整图片 -->
@@ -227,6 +247,7 @@
 				<el-option label="文生文" value="文生文" />
 				<el-option label="文生图" value="文生图" />
 				<el-option label="图生图" value="图生图" />
+				<el-option label="高清放大" value="高清放大" />
 	          </el-select>
 	        </el-form-item>
 	      </el-form>
@@ -256,7 +277,7 @@
 	          <el-tag v-else type="danger">未出图</el-tag>
 	        </template>
 	      </el-table-column>
-	        <el-table-column prop="status_name" label="操作模型" width="90" align="center" />
+	        <el-table-column prop="status_name" label="操作" width="70" align="center" />
 			<el-table-column prop="queue_status" label="状态说明" width="140" align="center" />
 	        <el-table-column prop="same_count" label="出图数量" width="90" align="center" />
 	        <el-table-column label="原图预览" width="120">
@@ -292,17 +313,18 @@
 	    <!-- 右侧详情 -->
 	    <div class="dialog-right">
 	      <div class="dialog-right-scroll">
-	        <el-card shadow="hover" body-style="padding: 20px;">
+	        <el-card shadow="hover" body-style="padding: 0px;">
 	          <el-form :model="mlformdata" label-position="top">
 	            <el-descriptions column="1" border>
 					
 					<el-descriptions-item label="操作">
-					    <el-button type="primary" title="执行选择中图片到队列中,图生文" @click="imgtotext" :loading="isLoading">执行图生文</el-button>
-					    <el-button type="primary" title="执行选择中图片到队列中,文生文" @click="texttotxt" :loading="isLoading">执行文生文</el-button>
-						<el-button type="primary" title="执行选择中图片到队列中,文生图" @click="texttoimg" :loading="isLoading">执行文生图</el-button>
-					    <el-button type="primary" title="执行选中图片到队列中,执行顺序:图生文->文生文->文生图->图生图" @click="handleSelected" :loading="isLoading" :disabled="isLoading">执行选择任务</el-button>
-					    <el-button type="primary" title="执行当前所有图片到队列中,执行顺序:图生文->文生文->文生图->图生图" @click="handleAll" :loading="isLoading">执行全部任务</el-button>
-						<el-button type="primary" title="执行选择中图片到队列中,图生图" @click="imgtoimg" :loading="isLoading">SD图生图</el-button>
+					    <el-button type="primary" title="选择图片,图生文" @click="imgtotext" :loading="isLoading">图生文</el-button>
+					    <el-button type="primary" title="选择图片,文生文" @click="texttotxt" :loading="isLoading">文生文</el-button>
+						<el-button type="primary" title="选择图片,文生图" @click="texttoimg" :loading="isLoading">文生图</el-button>
+						<el-button type="primary" title="选择图片,图生图" @click="imgtoimg" :loading="isLoading">图生图</el-button>
+						<el-button type="primary" title="选择图片,图像高清放大处理" @click="singleimg" :loading="isLoading">图像高清放大处理</el-button>
+					    <el-button type="primary" title="选中图片,执行顺序:图生文->文生文->文生图->图生图" @click="handleSelected" :loading="isLoading" :disabled="isLoading">执选择任务</el-button>
+					    <el-button type="primary" title="执行当前所有图片,执行顺序:图生文->文生文->文生图->图生图" @click="handleAll" :loading="isLoading">执行全部任务</el-button>
 					</el-descriptions-item>
 					
 					<el-descriptions-item label="文生文模型">
@@ -314,10 +336,27 @@
 					 
 					 <el-descriptions-item label="文生图模型">
 					    <el-radio-group v-model="selectedOption">
+							<el-radio label="black-forest-labs/FLUX.1-kontext-pro">flux-pro</el-radio>
 					      <el-radio label="dall-e-3">dall-e-3</el-radio>
 					      <el-radio label="gpt-image-1">gpt-image-1</el-radio>
 					    </el-radio-group>
 					  </el-descriptions-item>
+					  
+					  <!-- <el-descriptions-item label="图生图模型">
+					    <el-select
+					      v-model="selectedModel"
+					      placeholder="请选择模型"
+					      filterable
+					      style="width: 100%"
+					    >
+					      <el-option
+					        v-for="(model, index) in modelList"
+					        :key="index"
+					        :label="model.title"
+					        :value="model.model_name"
+					      />
+					    </el-select>
+					  </el-descriptions-item> -->
 					
 					<el-descriptions-item label="出图预览">
 					<div style="display: flex; gap: 20px; align-items: flex-start;">
@@ -334,26 +373,28 @@
 							1024x1024
 						  </div>
 						</div>
-						<div class="image-preview-wrap" style="margin-top: 16px; height: 145px;">
+					
+						<div class="image-preview-wrap" style="margin-top: 16px; height: 167px;">
 						  <div
 							v-for="(img, index) in imageList"
-							:key="'custom-' + index"
-							class="image-items"
-							@click="showDescription(img, 'custom')"
+							:key="'imgtoimg-' + index"
+							class="image-itemsimg"
+							@click="showDescription(img, 'san')"
 						  >
-							<img :src="formatImageUrl(img.custom_image_url)" />
-							{{ img.size }}
+							<img :src="formatImageUrl(img.imgtoimg_url)" />
+							图生图
 						  </div>
 						</div>
-						<div class="image-preview-wrap" style="margin-top: 16px; height: 145px;">
+						
+						<div class="image-preview-wrap" style="margin-top: 16px; height: 140px;">
 						  <div
 							v-for="(img, index) in imageList"
-							:key="'imgtoimg-' + index"
-							class="image-itemsimg"
-							@click="showDescription(img, 'san')"
+							:key="'custom-' + index"
+							class="image-items"
+							@click="showDescription(img, 'custom')"
 						  >
-							<img :src="formatImageUrl(img.imgtoimg_url)" />
-							图生图 679x862
+							<img :src="formatImageUrl(img.custom_image_url)" />
+							高清放大
 						  </div>
 						</div>
 					  </div>
@@ -383,9 +424,9 @@
 	                </div>
 	              </el-descriptions-item>
 	
-	              <el-descriptions-item label="执行次数">
+	         <!--     <el-descriptions-item label="执行次数">
 	                <el-input-number v-model="num" :step="1" />
-	              </el-descriptions-item>
+	              </el-descriptions-item> -->
 				  
 				  <el-descriptions-item label="任务队列">
 				    <el-table 
@@ -431,7 +472,7 @@ import axios from 'axios'
 import {Plus,Delete,CircleCheck,CircleClose} from '@element-plus/icons-vue'
 import {stopQueueProcesses, queueStats, viewQueueStatus,ImgUpload,getPreviewSubDirs,getPreviewimg,getlsit,
 imageToText,
-textToImage,Template,
+textToImage,Template_ids,sd_models,
 packImagess,getUploadPath,get_queue_logs,getTaskProgress
 } from '@/api/mes/job'
 
@@ -657,6 +698,8 @@ const fetchPreviewImages = async () => {
 	  params.status_name = "文生图"
   }else if(filterStatus.value === '图生图') {
 	  params.status_name = "图生图"
+  }else if(filterStatus.value === '高清放大') {
+	  params.status_name = "高清放大"
   }
 
   // 获取分页数据
@@ -705,15 +748,20 @@ const _resrow = ref('')
 const TaskqueueVisible = ref(false)
 const table_queue = ref([])
 const table_Taskqueue = ref([])
+
+//SD模型
+const selectedModel = ref('Realistic_Vision_V5.0-inpainting.safetensors [cf5d9eb09b]')
+const modelList = ref([])
+
+
 //查看详情按钮
 const record_deleteRow = async (row) => {
-	// getPreviewSubDirslist()
-	_resrow.value = row;
-	// page.value = 1;
-	
 	//打开弹窗
 	mlinventoryVisible.value = true;
 	
+	//获取当前文件夹行信息
+	_resrow.value = row;
+	
 	//清空信息保持数据最新
 	imageList.value = []
 	img_id.value = '';
@@ -723,12 +771,17 @@ const record_deleteRow = async (row) => {
 	path_image_url.value = '';
 	activeDescription.value =  '';
 	
+	// 获取 SD 模型列表
+	const sd_models_list = await sd_models();
+	modelList.value = sd_models_list.data
+		
 	// 任务队列
 	const queue_logs = await get_queue_logs({ old_image_file: row['old_image_url'] });
 	table_queue.value = queue_logs.data;
 	
 	// 出图尺寸
-	const res = await Template();
+	const res = await Template_ids();
+	console.log(res)
 	height.value = res.data.height
 	width.value = res.data.width
 		
@@ -816,10 +869,8 @@ const highlightKeywords = (text) => {
 const showDescription = async (img, type) => {
   showDescDialog.value = true;
   
-  Refresh_Status()
   // 任务队列
-  const queue_logs = await get_queue_logs({ old_image_file: _resrow.value['old_image_url'] });
-  table_queue.value = queue_logs.data;
+  Refresh_Status()
   
   // 公共字段初始化
   img_id.value = img.id || '';
@@ -849,6 +900,7 @@ const showDescription = async (img, type) => {
 	imgtoimg_url.value = img.imgtoimg_url || '图片未生成';
 	activeDescription.value =  '';
 	model.value =  '';
+	
   }else if (type === 'old') {
 	  
     path_image_url.value = img.path || '暂无说明';
@@ -856,7 +908,7 @@ const showDescription = async (img, type) => {
 	activeDescription.value = '';
 	
   } else {
-    console.log('无效的类型');
+    // console.log('无效的类型');
   }
 };
 
@@ -875,7 +927,7 @@ const num = ref(1)
 //文生文模型下拉(默认值)
 const txttotxt_selectedOption = ref('gemini-2.0-flash')
 //文生图模型下拉(默认值)
-const selectedOption = ref('dall-e-3')
+const selectedOption = ref('black-forest-labs/FLUX.1-kontext-pro')
 
 
 //刷新表格任务状态
@@ -909,6 +961,9 @@ const texttoimg = () => {
 const imgtoimg = () => {
 	processImages(toRaw(_parh.value),'图生图');
 };
+const singleimg = () => {
+	processImages(toRaw(_parh.value),'高清放大');
+};
 
 //执行选择任务
 const handleSelected = () => {
@@ -917,7 +972,6 @@ const handleSelected = () => {
 
 //执行全部任务
 const allTableData = ref([]); // 全部数据缓存
-
 const handleAll = async () => {
   try {
     await ElMessageBox.confirm(
@@ -939,19 +993,6 @@ const handleAll = async () => {
       page: 1,
       limit: 10000
     };
-    
-
-   //  const allRes = await getPreviewimg(allParams);
-   //  console.log(allRes);
-
-   //  if (allRes.code === 0) {
-   //    allTableData.value = allRes.data;
-   //    const allPaths = toRaw(allTableData.value).map(item => item.path);
-	  // processImages(toRaw(allPaths),'');
-   //  } else {
-   //    ElMessage.error(allRes.msg || '获取全部图片失败');
-   //  }
-   
    const allRes = await getPreviewimg(allParams);
    console.log(allRes);
    
@@ -981,21 +1022,20 @@ const handleAll = async () => {
 };
 
 
-//队列操作 统一执行操作按钮处理方法
+//操作 统一执行操作按钮处理方法
 const processImages = async (files,type) => {
-	
+	//判断是否选择图片列表
 	if (!Array.isArray(files) || files.length === 0) {
 		ElMessage.warning('请选择要处理的图片')
 		return
 	}
-	// 限制尺寸校验放外面更合理
-	if (width.value >= 1024 || height.value >= 1024) {
-		ElMessage.warning('尺寸不可超过1024')
-		return
-	}
-
+	//生成图片是1024,所有需要限制尺寸不可以超过原始尺寸
+	// if (width.value >= 1024 || height.value >= 1024) {
+	// 	ElMessage.warning('尺寸不可超过1024')
+	// 	return
+	// }
+	//加载开启
 	isLoading.value = true
-	let successCount = 0
 	const failList = []
 	const payload = {
 		old_image_file:_resrow.value['old_image_url'],
@@ -1035,57 +1075,84 @@ const processImages = async (files,type) => {
 }
 
 // --------------------- 打包zip ---------------------
+const zipview = ref(false)
+const ziprow = ref('')
+const zipselectedOption = ref('1024x1303') // 默认选中
+//点击打包按钮
 const packRow = async (row) => {
+	zipview.value = true;
+	
+	ziprow.value = row
+}
+//确定按钮
+const confirmPack = async (row) => {
   isLoading.value = true;
   try {
-    // 请求预览图接口获取图片路径
     const res = await getPreviewimg({
-      path: row.old_image_url,
+      path: ziprow.value.old_image_url,
       page: 1,
       limit: 10000
     });
+
     if (res.code !== 0 || !res.data || res.data.length === 0) {
       ElMessage.warning('未找到出图记录');
-      isLoading.value = false;
       return;
     }
-   const imagePaths = res.data
-	 .map(item => item.custom_image_url)
-     .filter(path => path && path.trim() !== '');
-
+   const imagePaths = res.data.flatMap(item => {
+     const paths = [];
+     if (item.custom_image_url?.trim()) {
+       paths.push({ type: 'custom_image_url', path: item.custom_image_url });
+     }
+     if (item.imgtoimg_url?.trim()) {
+       paths.push({ type: 'imgtoimg_url', path: item.imgtoimg_url });
+     }
+     return paths;
+   });
     if (imagePaths.length === 0) {
       ElMessage.warning('没有可打包的图片');
-      isLoading.value = false;
       return;
     }
-    // 发起打包请求
+
     const packRes = await packImagess({ paths: imagePaths });
 
     if (packRes.code === 0 && packRes.download_url) {
       ElMessage.success('打包成功,正在下载...');
-    // 自动触发浏览器下载 zip 文件
-    let url = packRes.download_url.replace('127.0.0.1', '20.0.16.128');
-    const link = document.createElement('a');
-    link.href = url;
-    link.setAttribute('download', '');
-    document.body.appendChild(link);
-    link.click();
-    document.body.removeChild(link);
+
+      // ✅ 替换为服务的真实 IP 和端口
+      const basePath = import.meta.env.VITE_BASE_PATH || 'http://20.0.16.128';
+      const uploadsPort = import.meta.env.VITE_UPLOADS_PORT || '9093';
+
+      let url = packRes.download_url;
+
+      try {
+        const parsedUrl = new URL(url);
+        if (parsedUrl.hostname === '127.0.0.1' || parsedUrl.hostname === 'localhost') {
+          parsedUrl.hostname = new URL(basePath).hostname;
+          parsedUrl.port = uploadsPort;
+          url = parsedUrl.toString();
+        }
+      } catch (e) {
+        console.error('URL 解析失败:', e);
+      }
+
+      const link = document.createElement('a');
+      link.href = url;
+      link.setAttribute('download', '');
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
     } else {
       ElMessage.error(`打包失败:${packRes.msg || '未知错误'}`);
     }
   } catch (err) {
     ElMessage.error('打包请求异常');
     console.error(err);
+  } finally {
+    isLoading.value = false;
   }
-  isLoading.value = false;
 };
 
-
-
-
 </script>
-
 <style scoped>
 .page-container {
   padding: 20px;
@@ -1366,8 +1433,8 @@ const packRow = async (row) => {
   width: 110px;
 }
 .image-itemsimg img {
-  width: 95px;
-  height: 120px;
+  width: 118px;
+  height: 150px;
   border: 1px solid #ccc;
   object-fit: contain;
 }