Karsa 9 meses atrás
pai
commit
54029e315b

+ 27 - 0
src/lang/modules/SemanticsManage/indexEn.js

@@ -11,5 +11,32 @@ export default {
     DocumentManagement: DocumentManagementEn,
     TagManagement: TagManagementEn,
     ASRpage:ASRPageEn,
+
+    /* ai纪要 */
+    AiSummeryPage: {
+      btn_add_summery: 'Add Summery',
+      btn_add_prompt: 'Add Prompt',
+      tab_summery: 'Summerys',
+      tab_prompt: 'Prompts',
+      
+      ph_search:'Please enter the name of the summery',
+      public_prompt:'Public Prompt',
+      my_prompt:'My Prompt',
+      add_first_classify:'Add Primary Directory',
+
+      source_tab1:'Original Text',
+      source_tab2:'Document Library',
+      source_tab3:'Upload File',
+      rechoose:'Re-select',
+      source_title:'Title',
+      
+      label_prompt:'Prompt',
+      label_model:'Large Model',
+      send_btn:'Send',
+      new_send_btn:'New Dialogue',
+      summery_name:'Summery Name',
+      summery_clasify:'Summery category',
+      ph_classify:"Please select a summary category"
+    }
   },
 };

+ 28 - 0
src/lang/modules/SemanticsManage/indexZh.js

@@ -10,5 +10,33 @@ export default {
     DocumentManagement: DocumentManagementZh,
     TagManagement: TagManagementZh,
     ASRpage:ASRPageZh,
+
+    /* ai纪要 */
+    AiSummeryPage: {
+      btn_add_summery: '添加纪要',
+      btn_add_prompt: '添加提示词',
+      tab_summery: '纪要库',
+      tab_prompt: '提示词库',
+      
+      ph_search:'请输入纪要名称',
+      public_prompt:'公共提示词',
+      my_prompt:'我的提示词',
+      add_first_classify:'添加一级目录',
+
+      source_tab1:'原文',
+      source_tab2:'文档库',
+      source_tab3:'上传文件',
+      rechoose:'重新选择',
+      source_title:'标题',
+      
+      label_prompt:'提示词',
+      label_model:'大模型',
+      send_btn:'发送',
+      new_send_btn:'新对话中发送',
+
+      summery_name:'纪要名称',
+      summery_clasify:'纪要分类',
+      ph_classify:"请选择纪要分类"
+    }
   },
 };

+ 17 - 1
src/routes/modules/semanticsRoutes.js

@@ -87,6 +87,22 @@ export default [{
       meta:{
         name_en:"ASR"
       },
-    }
+    },
+    {
+      path: "aISummeryPage",
+      name: "AI纪要",
+      component: () => import('@/views/semantics_manage/summery/index.vue'),
+      meta:{
+        name_en:"AI Summery"
+      },
+    },
+    {
+      path: "summeryEdit",
+      name: "添加纪要",
+      component: () => import('@/views/semantics_manage/summery/summeryEdit.vue'),
+      meta:{
+        name_en:"Add Summery"
+      },
+    },
   ]
 }]

+ 115 - 0
src/views/semantics_manage/summery/components/classifyDia.vue

@@ -0,0 +1,115 @@
+<template>
+		<el-dialog
+      :visible.sync="isShow"
+      :close-on-click-modal="false"
+      :modal-append-to-body='false'
+      :title="form.classifyId?$t('SemanticsManage.DocumentManagement.edit_category'):$t('SemanticsManage.DocumentManagement.add_category')"
+      @close="cancelHandle"
+      custom-class="dialog"
+      center
+      width="560px"
+      v-dialogDrag
+    >
+			<div class="dialog-main">
+				<el-form
+          ref="diaForm"
+          label-position="left"
+          hide-required-asterisk
+          label-width="150px"
+          :model="formData"
+          :rules="formRules"
+        >
+				
+          <el-form-item :label="$t('OnlineExcelPage.parent_directory_lable')" v-if="formData.parentClassifyId">
+            <span>{{formData.parentName}}</span>
+          </el-form-item>
+          <el-form-item :label="$t('Chart.classify_name_label')" prop="classifyName">
+            <el-input
+            v-model="formData.classifyName"
+            style="width: 80%"
+            :placeholder="$t('Dialog.require_vaild')"></el-input>
+          </el-form-item>
+				</el-form>
+			</div>
+			<div class="dia-bot">
+				<el-button type="primary" style="margin-right:20px" @click="saveHandle">{{$t('Dialog.confirm_save_btn')}}</el-button>
+				<el-button type="primary" plain @click="cancelHandle">{{$t('Dialog.cancel_btn')}}</el-button>
+			</div>
+		</el-dialog>
+</template>
+
+<script>
+import futuresInterface from '@/api/modules/futuresBaseApi';
+export default {
+	props: {
+		isShow: {
+			type: Boolean,
+		},
+		form: {
+			type: Object,
+		}
+	},
+	watch: {
+		'isShow': {
+			handler(newval) {
+        if(newval) {
+          console.log(this.form)
+          this.formData = {...this.form};
+        }
+			}
+		}
+	},
+	computed:{
+		formRules(){
+			return {
+				classifyName:[
+					{ required: true, message: this.$t('StatisticAnalysis.ChartRelevance.classify_name_tips'), trigger: 'blur' },
+				]
+			}
+		}
+	},
+	data () {
+		return {			
+			formData: {},
+		};
+	},
+	methods: {
+
+		async saveHandle() {
+			await this.$refs.diaForm.validate()
+      const { classifyName,classify_id,parentClassifyId }  = this.formData;
+      
+      const { Ret,Msg } = !classify_id
+        ? await futuresInterface.classifyAdd({ ChartClassifyName:classifyName })
+        : await futuresInterface.classifyEdit({ ChartClassifyName:classifyName, ChartClassifyId:classify_id  })
+        
+      if( Ret !== 200) return
+      this.$message.success(Msg);
+      this.cancelHandle();
+      this.$emit('successCallback')
+		},
+
+		/* 取消 */
+		cancelHandle() {
+      this.formData = {}
+			this.$refs.diaForm.resetFields();
+			this.$emit('update:isShow',false)
+		},
+
+	},
+}
+</script>
+<style lang='scss' scoped>
+	.dialog-main {
+		padding-left: 50px;
+	}
+	.el-cascader .el-input {
+		width: 100%;
+	}
+	.dia-bot {
+		margin: 52px 0 30px;
+		display: flex;
+		justify-content: center;
+
+	}
+</style>

+ 28 - 0
src/views/semantics_manage/summery/components/editor.vue

@@ -0,0 +1,28 @@
+<template>
+  <froala 
+    :id="`froala-editor-documentContent`" 
+    :tag="'textarea'" 
+    :config="{...froalaConfig,placeholderText:$t('SemanticsManage.DocumentComparison.article_content_enter')}" 
+    v-model="content">
+  </froala>
+</template>
+<script>
+import {froalaConfig} from '../../utils/config';
+export default {
+  data() {
+    return {
+      froalaConfig:froalaConfig,
+      content: ''
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+
+</style>

+ 250 - 0
src/views/semantics_manage/summery/components/promptClassifySection.vue

@@ -0,0 +1,250 @@
+<template>
+  <div class="prompt-classify-wrapper">
+    <!-- 公共提示词 -->
+    <div class="public-classify" v-if="publicPromptList.length">
+      <h3 
+        @click="isExpandPublic = !isExpandPublic" 
+        class="classify-type"
+      > 
+        <!-- 公共提示词 -->{{$t('SemanticsManage.AiSummeryPage.public_prompt')}}
+        <span><i :class="{'el-icon-arrow-down':!isExpandPublic,'el-icon-arrow-up':isExpandPublic}"></i></span>
+      </h3>
+    
+      <div class="tree-wrap" v-show="isExpandPublic">
+            <el-tree
+                ref="catalogTree"
+                class="target_tree"
+                empty-text="暂无提示词"
+                :data="publicPromptList"
+                node-key="nodeKeyId"
+                :expand-on-click-node="false"
+                @current-change="(data,node)=>{nodeChange(data,node)}"
+                >
+                <div class="custom-tree-node" slot-scope="{ data }">
+                    <span class="tree-label">{{ data.MyChartClassifyName }}</span>
+                    <div class="right-item-box" >
+                        <el-dropdown @command="handleCommand" trigger="click" v-if="data.MyChartClassifyId">
+                        <span class="el-dropdown-link"> 
+                            <i class="el-icon-more" style="font-size: 16px;transform: rotate(90deg);cursor: pointer"/>
+                        </span>
+                        <el-dropdown-menu slot="dropdown">
+                            <el-dropdown-item :command="{key:'copy'}" :disabled="selectedClassify === roleId"><!-- 复制 -->{{$t('MyEtaPage.option_op_copy')}}</el-dropdown-item>
+                        </el-dropdown-menu>
+                        </el-dropdown>
+                    </div>
+                </div>
+            </el-tree>
+        </div>
+    </div>
+
+    <!-- 我的提示词 -->
+    <div class="classify" v-if="myPromptList.length">
+          <h3 class="classify-type"><!-- 我的提示词 -->{{$t('SemanticsManage.AiSummeryPage.my_prompt')}}</h3>
+          <draggable
+            v-model="myPromptList"
+            class="classify-ul"
+            animation="300"
+            tag="ul"
+            @start="menuDragStart"
+            @update="menuDragenter"
+            @end="menuDragOver"
+          >
+            <li
+              :class="[
+                'classify-item',
+                { 'act': item.MyChartClassifyId === selectedClassify },
+              ]"
+              v-for="item in myPromptList"
+              :key="item.MyChartClassifyId"
+              @click="chooseClassify(item)"
+            >
+              <div>
+                <img
+                  src="~@/assets/img/data_m/move_ico.png"
+                  alt=""
+                  class="move"
+                  style="width: 14px; height: 14px;margin-right: 5px;"
+                />
+                {{ item.MyChartClassifyName }}
+              </div>
+              <div class="right-item-box">
+                <el-dropdown
+                  style="margin-right: 10px" 
+                  @command="handleCommand" 
+                  trigger="click"
+                >
+                  <span class="el-dropdown-link  el-dropdown-link-img">
+
+                     <img src="~@/assets/img/chart_m/Group.png" v-if="item.IsPublic === 0">
+                     <img src="~@/assets/img/chart_m/User.png" v-else>
+                  </span>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item 
+                    :command="{key:'own',IsCompanyPublic:undefined,item}" 
+                    :class="item.IsPublic === 0 ? 'el-dropdown-menu-item-chat-act' : ''"
+                    class="el-dropdown-menu-item-chat"
+                    >
+                    <img v-if="item.IsPublic === 0" src="~@/assets/img/chart_m/Group_act.png">
+                    <img v-else src="~@/assets/img/chart_m/Group.png">
+                    <!-- 仅自己可见 -->{{$t('MyEtaPage.option_view_person')}}</el-dropdown-item>
+                    <el-dropdown-item 
+                    :command="{key:'public',IsCompanyPublic:undefined,item}" 
+                    :class="item.IsPublic === 1 ? 'el-dropdown-menu-item-chat-act' : ''"
+                    class="el-dropdown-menu-item-chat"
+                    >
+                    <img v-if="item.IsPublic === 1" src="~@/assets/img/chart_m/User_act.png">
+                    <img v-else src="~@/assets/img/chart_m/User.png">
+                    <!-- 所有人可见 -->{{$t('MyEtaPage.option_view_all')}}</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+
+                <el-dropdown @command="handleCommand" trigger="click">
+                  <span class="el-dropdown-link"> 
+                    <i class="el-icon-more" style="font-size: 16px;transform: rotate(90deg);cursor: pointer"/>
+                  </span>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item v-if="permissionBtn.isShowBtn('myETAPermission','myChart_classifyOpt_delete')"
+                        :command="{key:'del'}"><!-- 删除 -->{{$t('Table.delete_btn')}}</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </div>
+            </li>
+          </draggable>
+        </div>
+  </div>
+</template>
+<script>
+import draggable from 'vuedraggable';
+import { mychartInterface } from '@/api/api.js';
+export default {
+  components: {  draggable },
+  data() {
+    return {
+      selectedClassify: 0,
+      publicPromptList: [
+        { MyChartClassifyId: 1,MyChartClassifyName:'dwd对我的' }
+      ],
+      isExpandPublic: false,
+
+      myPromptList: [
+        { MyChartClassifyId: 5,MyChartClassifyName:'大秦赋危废物',Content: '队伍等级哦清瘟解毒气雾剂低洼请打击' }
+      ],
+      startIndex: 0,
+      nextIndex: 0,
+      preIndex: 0
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    handleCommand({key,IsCompanyPublic,item}) {
+
+      key === 'copy' && mychartInterface.copyclassify({
+        MyChartClassifyId: this.select_classify
+      }).then(res => {
+        if(res.Ret !== 200) return;
+        this.$message.success(/* '复制成功' */this.$t('MsgPrompt.copy_success_msg'));
+        this.getClassify();
+      });
+
+      ['edit','del'].includes(key) && this.delPrompt(key);
+
+      ['own', 'public'].includes(key) && mychartInterface.setPublic({
+        IsPublic: key === 'own' ? 0 : 1,
+        MyChartClassifyId: this.select_classify
+      }).then(res => {
+        if(res.Ret !== 200) return;
+        this.$message.success(/* '设置成功' */this.$t('MsgPrompt.set_success_msg'));
+        if(key === 'own'){
+          item.IsPublic=0
+        }else{
+          item.IsPublic=1
+        }
+      })
+      
+    },
+
+    delPrompt() {
+
+    },
+
+
+    /* 切换分类 */
+    chooseClassify(item) {
+      const {MyChartClassifyId,fromPublic } = item
+
+      if(fromPublic!==1){
+        this.$refs.catalogTree&&this.$refs.catalogTree.setCurrentKey(null)
+      }
+      this.selectedClassify = MyChartClassifyId;
+
+      this.$emit('change',{ selectItem:item })
+    },
+
+    /* 拖动开始 记录位置 */
+    dragStart({ oldIndex }) {
+      this.startIndex = this.myPromptList[oldIndex].MyChartClassifyId;
+    },
+
+    /* 拖动结束 替换  */
+    dragOver() {
+      mychartInterface.moveClassify({
+          MyChartClassifyId:  this.startIndex,
+          NextClassifyId: this.nextIndex || 0,
+          PrevClassifyId:  this.preIndex || 0,
+      }).then(res => {
+        if(res.Ret !== 200) return;
+      })
+
+    },
+
+    /* 拖动时 获取移动后的上一个位置id 若移到第一位则取0 获取后一个id 若是最后一个取0*/
+    dragenter({ newIndex }) {
+      this.preIndex = newIndex > 0 ? this.myPromptList[newIndex - 1].MyChartClassifyId : 0;
+      this.nextIndex = newIndex ===  this.myPromptList.length - 1 ? 0 : this.myPromptList[newIndex + 1].MyChartClassifyId
+
+    },
+  },
+}
+</script>
+<style scoped lang='scss'>
+.prompt-classify-wrapper {
+  padding: 15px 0 30px;
+  overflow: auto;
+  position: relative;
+  height: calc(100vh - 300px);
+
+  .classify-item {
+    padding: 10px 30px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    &.act {
+      background: #e0eefd;
+      color: #409eff;
+    }
+  }
+  .classify-type {
+    margin-bottom: 8px;
+    padding-left: 15px;
+  }
+  .public-classify {
+    margin-bottom: 20px;
+    .tree-wrap{
+        padding:15px;
+    }
+    .custom-tree-node {
+      display: flex !important;
+      justify-content: space-between;
+      align-items: center;
+      display: block;
+      flex: 1;
+    }
+  }
+  .right-item-box {
+    display: flex;
+    align-items: center;
+  }
+}
+</style>

+ 76 - 0
src/views/semantics_manage/summery/components/promptDetail.vue

@@ -0,0 +1,76 @@
+<template>
+  <div class="edit-prompt">
+    <header>
+      <div>
+        <span>提示词名称</span>
+        <el-input 
+          v-model="name" 
+          style="width:220px" 
+          placeholder="请输入提示词名称"
+        ></el-input>
+      </div>
+    </header>
+
+    <div class="main">
+      <Editor />
+
+      <div class="bot">
+        <el-button type="primary" @click="handleSavePrompt"><!-- 确定 -->{{$t('Dialog.confirm_btn')}}</el-button>
+          <el-button type="primary" plain ><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import Editor from './editor.vue'
+export default {
+  components: { Editor },
+  props: {
+    item: {
+      type: Object
+    }
+  },
+  watch: {
+    item(nval) {
+      if(nval.MyChartClassifyId) {
+
+      }
+    }
+  },
+  data() {
+    return {
+      name: ''
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    handleSavePrompt() {
+      
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.edit-prompt {
+  background: #fff;
+  padding: 20px;
+  height: 100%;
+  .main {
+    margin-top: 30px;
+  }
+  .bot {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 30px;
+  }
+}
+</style>
+<style lang="scss">
+.edit-prompt {
+  .fr-element {
+    height: 300px;
+  }
+} 
+</style>

+ 58 - 0
src/views/semantics_manage/summery/components/summeryDetail.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="detail-wrapper">
+    <header>
+      <div>
+        原文:
+        <span>单位第五季第几点五级地忘记</span>
+        <!-- <span class="editsty" @click="handleLinkToArticle">单位第五季第几点五级地忘记</span> -->
+      </div>
+    </header>
+    
+    <div class="article-item">
+
+    </div>
+
+    <div class="article-item" v-html="detailData.content">
+      
+    </div>
+
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      detailData: {
+        content:'但我觉得今晚ID今晚ID哦较大五级地问答及伟大金娃登记青蛙ID就都忘记打排位都叫我就 记得记得记得我就武器端午节i我都叫我请大家我IQ大家'
+      }
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    handleLinkToArticle() {
+      this.router.push({
+        path: ''
+      })
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.detail-wrapper {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+  header {
+    padding: 10px 20px;
+    background: #fff;
+  }
+
+  .article-item {
+    padding: 20px;
+    background: #fff;
+  }
+}
+</style>

+ 530 - 0
src/views/semantics_manage/summery/index.vue

@@ -0,0 +1,530 @@
+<template>
+  <div class="aiSummery-index-page">
+    <div class="main-left left" id="left">
+				<div class="left_top">
+						<el-button type="primary" @click="goSummeryEdit" v-if="activeTab==='summery'"><!-- 添加纪要 -->{{$t('SemanticsManage.AiSummeryPage.btn_add_summery')}}</el-button>
+						<el-button type="primary" @click="goAddChart" v-else-if="activeTab==='prompt'"><!-- 添加提示词 -->{{$t('SemanticsManage.AiSummeryPage.btn_add_prompt')}}</el-button>
+				</div>
+
+				<div class="left-main">
+					<el-tabs v-model="activeTab" @tab-click="handleClick">
+						<el-tab-pane :label="$t('SemanticsManage.AiSummeryPage.tab_summery')" name="summery"/>
+						<el-tab-pane :label="$t('SemanticsManage.AiSummeryPage.tab_prompt')" name="prompt"/>
+					</el-tabs>
+				
+					<!-- 纪要库 -->
+					<template v-if="activeTab==='summery'">
+						<div class="search-cont">
+							<el-checkbox v-model="isShowMe"
+								@change="() => { getTreeData();}">{{$t('StatisticAnalysis.ChartRelevance.only_see_mine')}}</el-checkbox>
+							<el-select
+								v-model="search_txt"
+								v-loadMore="searchLoad"
+								:filterable="!search_txt"
+								remote
+								clearable
+								:placeholder="$t('SemanticsManage.AiSummeryPage.ph_search')"
+								style="width: 100%; margin-top:10px;"
+								:remote-method="searchHandle"
+								@click.native="inputFocusHandle"
+							>
+								<i slot="prefix" class="el-input__icon el-icon-search"></i>
+								<el-option
+									v-for="item in searchOptions"
+									:key="item.ChartInfoId"
+									:label="currentLang==='en'?(item.ChartNameEn||item.ChartName):item.ChartName"
+									:value="item.ChartInfoId"
+								>
+								</el-option>
+							</el-select>
+						</div>
+
+						<div class="tree-cont">
+							<el-tree
+								ref="treeRef"
+								class="target_tree"
+								:data="classifyData"
+								node-key="UniqueCode"
+								:props="defaultProp"
+								:allow-drag="canDragHandle"
+								:allow-drop="canDropHandle"
+								:current-node-key="select_node"
+								:default-expanded-keys="defaultShowNodes"
+								draggable
+								:expand-on-click-node="false"
+								check-strictly
+								empty-text="暂无分类"
+								@node-expand="handleNodeExpand"
+								@node-collapse="handleNodeCollapse"
+								@current-change="nodeChange"
+								@node-drop="dropOverHandle"
+								@node-drag-end="dropMouseLeave"
+								@node-drag-leave="dropMouseLeave"
+								@node-drag-enter="dropMouseOver"
+							>
+								<span class="custom-tree-node" slot-scope="{ node, data }">
+									<span
+										class="text_oneLine node_label"
+										:style="`width:${
+											(select_node === data.UniqueCode && node.Nodewidth) || ''
+										}`"
+									>
+										<span>{{ data.ChartClassifyName  }}</span>
+									</span>
+									<span
+										style="display: flex; align-items: center"
+										v-if="select_node === data.UniqueCode"
+									>
+										<img
+											src="~@/assets/img/data_m/move_ico.png"
+											alt=""
+											style="width: 14px; height: 14px; margin-right: 8px"
+										/>
+										<img
+											src="~@/assets/img/set_m/add.png"
+											alt=""
+											style="width: 14px; height: 14px; margin-right: 8px"
+											@click.stop="addNode(node,data)"
+											v-if="node.level<6"
+										/>
+										<img
+											src="~@/assets/img/set_m/edit.png"
+											alt=""
+											style="width: 15px; height: 14px; margin-right: 8px"
+											@click.stop="editNode(node, data)"
+											v-if="!data.ChartInfoId&&permissionBtn.isShowBtn('statisticPermission','crossVariety_classifyOpt_edit')"
+										/>
+										<img
+											src="~@/assets/img/set_m/del.png"
+											alt=""
+											style="width: 14px; height: 14px;"
+											@click.stop="removeNode(node,data)"
+											v-if="!data.ChartInfoId&&(data.Button.DeleteButton)&&isEdbBtnShow('deleteCatalog')"
+										/>
+									</span>
+								</span>
+							</el-tree>
+
+						</div>
+
+						<div
+							class="noDepart"
+							@click="handleAddClassify"
+							v-if="permissionBtn.isShowBtn('statisticPermission','fittingEq_classifyOpt_edit')"
+						>
+							<img
+								src="~@/assets/img/set_m/add_ico.png"
+								alt=""
+								style="width: 16px; height: 16px; margin-right: 10px"
+							/>
+							<span><!-- 添加一级目录 -->{{$t('SemanticsManage.AiSummeryPage.add_first_classify')}}</span>
+						</div>
+					</template>
+
+					<!-- 提示词库 -->
+					<promptClassifySection 
+						v-else-if="activeTab==='prompt'" 
+						@change="({selectItem}) => {selectPromatItem=selectItem}"
+					/>
+				</div>
+
+      </div>
+
+			<div class="main-right" id="right">
+
+					<promptDetail v-if="activeTab==='prompt'&&ShowPromptDetail" :item="selectPromatItem"/>
+
+					<summeryDetail v-else-if="activeTab==='summery'"/>
+					<!-- <tableNoData text="暂无数据"/> -->
+			</div>
+
+		<classifyDia
+			:isShow.sync="isOpenClassifyDia"
+			:form="classifyForm"
+		/>
+  </div>
+</template>
+<script>
+import { fittingEquationInterface } from '@/api/modules/chartRelevanceApi';
+import classifyMixin from './mixins/classifyTree';
+import promptClassifySection from './components/promptClassifySection.vue'
+import promptDetail from './components/promptDetail.vue';
+import summeryDetail from './components/summeryDetail.vue';
+import classifyDia from  './components/classifyDia.vue';
+export default {
+  mixins: [ classifyMixin ],
+	components: { promptDetail,summeryDetail,promptClassifySection,classifyDia },
+  data() {
+    return {
+			activeTab: 'summery',
+      classifyData: [],
+			showData: false,
+			isShowMe: false,
+			search_txt: '',
+			searchOptions:[],
+
+			select_node: '',//节点唯一标识code
+			select_classify: '',
+      defaultShowNodes: [], //展开节点
+      defaultProp: {
+        label: 'ChartClassifyName',
+        children: 'Children',
+      }, //树结构配置项
+			dynamicNode: null,
+
+			ShowPromptDetail: false,
+			publicPromptList: [],
+			myPromptList: [],
+			selectPromatItem: {},
+
+			/* 分类弹窗 */
+			isOpenClassifyDia: false, //
+			classifyForm: {
+				parentClassifyId: 0,
+				parentName: '',
+				classifyId: 0,
+				classifyName: '',
+			},
+
+			search_page: 1,
+			search_have_more: false,
+			current_search:'',
+    }
+  },
+  mounted() {
+
+		if(this.$route.query.code) {
+      this.getTreeData({code: this.$route.query.code,id: Number(this.$route.query.id)})
+    } else {
+      this.getTreeData();
+    }
+
+	},
+  methods:{
+		goSummeryEdit() {
+			this.$router.push({
+				path: '/summeryEdit'
+			})
+		},
+		
+		/* 获取分类 */
+		getTreeData(params=null) {
+			fittingEquationInterface.classifyList({IsShowMe:this.isShowMe}).then(res => {
+				const { Ret,Data } = res;
+				if(Ret !== 200) return
+
+				this.showData = true;
+				this.classifyData = Data.AllNodes || [];
+				this.$nextTick(() => {
+					/* 新增完成后 处理树展开和选中 */
+					params && this.selectCurrentNode(params);
+				});
+
+			})
+		},
+
+		/* 搜索 */
+		searchHandle(query) {
+			this.search_page = 1;
+			this.current_search = query;
+			this.searchApi(this.current_search)
+		},
+
+		searchApi(query,page=1) {
+      /* 查找列表 */
+      fittingEquationInterface
+        .searchChart({
+          Keyword: query,
+          IsShowMe:this.isShowMe,
+          CurrentIndex: page
+        })
+        .then((res) => {
+          if (res.Ret !== 200) return
+          const { List,Paging } = res.Data;
+          this.search_have_more = page < Paging.Pages;
+          this.searchOptions = page === 1 ? List : [...this.searchOptions,...List];
+        });
+		},
+
+		/* 聚焦获取当前检索 */
+		inputFocusHandle(e) {
+			this.search_page = 1;
+			this.current_search = e.target.value;
+      if(this.current_search) {
+        this.searchApi(this.current_search)
+      }else {
+        this.searchOptions = [];
+      }
+		},
+
+		searchLoad() {
+			if(!this.search_have_more) return;
+			this.searchApi(this.current_search,++this.search_page);
+		},
+
+		/* 选中分类变化时 */
+		nodeChange({ UniqueCode,ChartInfoId,ChartClassifyId },node) {
+			this.search_txt = '';
+			this.select_node = UniqueCode;
+			this.select_classify = !ChartInfoId ? ChartClassifyId : 0;
+			this.select_id = ChartInfoId || 0;
+
+			this.resetNodeStyle(node);
+			this.dynamicNode = node;
+		},
+
+		/* 添加一级分类 */
+		handleAddClassify() {
+			this.classifyForm = {
+				parentClassifyId: 0,
+				parentName: '',
+				classifyId: 0,
+				classifyName: '',
+			}
+			this.isOpenClassifyDia = true;
+		},
+
+		/* 添加节点 */
+		addNode(node, data) {
+			let arr = []
+      arr = this.getNodeParentData(node,arr).reverse();
+
+      this.classifyForm = {
+				classifyId: 0,
+        classifyName: "",
+        parentClassifyId: data.ChartClassifyId,
+        parentName: arr.map(_=>_.ChartClassifyName).join('/')
+      };
+      this.isOpenClassifyDia = true;
+		},
+
+    /* 编辑节点 */
+    editNode(node, data) {
+			const { ChartClassifyName,ChartClassifyId,ParentId } = data;
+			let arr = []
+			arr = ParentId ? this.getNodeParentData(node.parent,arr).reverse() : [];
+      /* 编辑目录 */
+			this.classifyForm = {
+				parentClassifyId: ParentId,
+				parentName: arr.map(_=>_.ChartClassifyName).join('/'),
+				classifyId: ChartClassifyId,
+				classifyName: ChartClassifyName
+			}
+      this.isOpenClassifyDia = true;
+    },
+
+		 // 递归节点
+		getNodeParentData(data,arr){
+			if(data.level===0) return
+			arr.push({ChartClassifyName:data.data.ChartClassifyName,ChartClassifyId:data.data.ChartClassifyId})
+			this.getNodeParentData(data.parent,arr)
+			return arr
+		},
+
+		 /* 删除节点校验 */
+    async removeNode(node, { ChartClassifyId,ChartInfoId }) {
+
+			const { Data } = await fittingEquationInterface.classifyDelCheck({ ChartClassifyId })
+
+			const { DeleteStatus } = Data;
+
+			DeleteStatus === 1 
+			? this.$confirm(this.$t('Chart.OptMsg.classify_del_fail'), this.$t('Chart.OptMsg.del_fail_tag'), {
+				confirmButtonText: this.$t('MsgPrompt.known'),
+				showCancelButton: false,
+				type: 'error',
+			}) : DeleteStatus === 0
+			?  this.$confirm(this.$t('Chart.OptMsg.classify_del_confirm'), this.$t('Confirm.prompt'), {
+				// confirmButtonText: '确定',
+				// cancelButtonText: '取消',
+				type: 'warning',
+			}).then(() => {
+				this.delApi(ChartClassifyId,ChartInfoId)
+			}): null;
+
+    },
+
+		 /* 删除方法 */
+    delApi(ChartClassifyId,ChartInfoId,type='') {
+      fittingEquationInterface
+        .classifyDel({
+          ChartClassifyId,
+					ChartInfoId
+        })
+        .then((res) => {
+          if (res.Ret !== 200) return
+					this.$message.success(res.Msg);
+
+					if (!res.Data.ChartInfoId) this.select_id = '';
+
+					//删除自动显示下一张
+					type=='del_chart' && res.Data.ChartInfoId
+						? this.getTreeData({
+								code: res.Data.UniqueCode,
+								id: res.Data.ChartInfoId
+							})
+						: this.getTreeData();
+        });
+    },
+
+		/* 分类成功回调 */
+		classifyCallback(type) {
+			this.getTreeData();
+
+			if (type === 'add') {
+        //新增分类完成之后,展开父节点显示刚新增的分类,若已展开节点则不做处理
+        let code = this.add_parent_id;
+        let flag = this.defaultShowNodes.some(item => item === code);
+        // console.log(flag)
+        !flag && this.defaultShowNodes.push(code);
+        this.add_parent_id = '';
+
+      }
+		},
+  }
+}
+</script>
+<style scoped lang='scss'>
+.aiSummery-index-page{
+	display: flex;
+
+	.main-left {
+		width: 300px;
+		min-width: 300px;
+		background: #fff;
+		margin-right: 20px;
+		border: 1px solid #ececec;
+		border-radius: 4px;
+		box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
+		height: calc(100vh - 120px);
+		overflow: hidden;
+		position: relative;
+		box-sizing: border-box;
+
+		.left_top {
+			padding: 20px;
+			background: #fff;
+			border: 1px solid #ececec;
+			box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+			display: flex;
+			justify-content: space-between;
+		}
+		.left-main {
+			padding: 20px;
+		}
+		.search-cont {
+			margin: 10px 0 20px;
+		}
+
+		.tree-cont {
+			padding-bottom: 30px;
+			max-height: calc(100vh - 480px);
+			overflow: auto;
+		}
+		.target_tree {
+			color: #333;
+			overflow: hidden;
+			.custom-tree-node {
+				display: flex !important;
+				justify-content: space-between;
+				align-items: center;
+				display: block;
+				flex: 1;
+				.node_label {
+					margin-right: 2px;
+				}
+				.el-icon-view {
+					color: #409eff;
+					font-size: 18px;
+					margin-left: 5px;
+				}
+			}
+		}
+		.noDepart {
+			margin: 30px 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			color: #409eff;
+			font-size: 16px;
+			cursor: pointer;
+		}
+		.move-btn {
+			height: 100%;
+			width: 4px;
+			/* opacity: 0; */
+			position: absolute;
+			right: 0px;
+			top: 0;
+			&:hover {
+				cursor: col-resize;
+				/* background-color: orange */
+			}
+		}
+	}
+
+	.main-right {
+		flex: 1;
+		height: calc(100vh - 120px);
+	}
+}
+</style>
+<style lang="scss">
+.aiSummery-index-page{
+	*{ box-sizing: border-box; }
+	.target_tree {
+		.el-tree__drop-indicator {
+			height: 3px;
+			background-color: #409eff;
+		}
+
+		.el-tree-node__content {
+			margin-bottom: 14px !important;
+		}
+
+		.el-tree-node__children {
+			.el-tree-node {
+				margin-bottom: 0px !important;
+				padding-left: 18px;
+			}
+
+			.el-tree-node__content {
+				margin-bottom: 5px !important;
+				padding-left: 0 !important;
+			}
+		}
+
+		.expanded.el-icon-caret-right:before {
+			content: url('~@/assets/img/set_m/down.png') !important;
+		}
+
+		.el-icon-caret-right:before {
+			content: url('~@/assets/img/set_m/slide.png') !important;
+		}
+		.el-tree-node__expand-icon{
+			padding-top: 10px;
+		}
+
+		.el-tree-node__expand-icon.is-leaf.el-icon-caret-right:before {
+			content: '' !important;
+		}
+
+		.el-tree-node__expand-icon.expanded {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		.el-tree-node.is-current>.el-tree-node__content {
+			background-color: #f0f4ff !important;
+		}
+
+		.el-tree-node__content {
+			padding-right: 10px !important;
+		}
+	}
+
+	.el-tabs .el-tabs__nav-wrap::after {
+		background: transparent;
+	}
+}
+</style>

+ 324 - 0
src/views/semantics_manage/summery/mixins/classifyTree.js

@@ -0,0 +1,324 @@
+import chartRelevanceApi from '@/api/modules/chartRelevanceApi.js';
+import { fittingEquationInterface,statisticFeatureInterface,crossVarietyInterface } from '@/api/modules/chartRelevanceApi';
+import { dataBaseInterface } from '@/api/api.js';
+
+export default {
+  data() {
+    return {};
+  },
+  watch: {
+    /* 设置动态右侧区域宽度 */
+    isSlideLeft(newval) {
+      this.$nextTick(() => {
+        this.reloadRightWid();
+      });
+    },
+    /* 图表id */
+    select_id(newval) {
+      if (newval) {
+        // this.currentLang = "ch";
+        this.getDetailHandle();
+      } else {
+        this.chartInfo = {};
+      }
+    },
+
+    select_classify(newval) {
+      if (this.$refs.chartListWrap) this.$refs.chartListWrap.$refs.listRef.scrollTop = 0;
+      if (newval) {
+        this.chart_page = 1;
+        // this.getPublicList();
+      }
+    },
+
+    /* 搜索关键词 */
+    search_txt(newval) {
+      if (newval) {
+        let search_obj = this.searchOptions.find(
+          (_) => _.ChartInfoId === newval
+        );
+        let deep_arr = _.cloneDeep(this.treeData);
+        // 查找图表的分类父级id
+
+        let arr = this.findParentNodeHandle(deep_arr, search_obj.UniqueCode)
+          .slice(1)
+          .reverse(); // 父的父的父-父的父-父
+        this.defaultShowNodes = arr;
+        this.select_node = search_obj.UniqueCode;
+        this.$refs.treeRef.setCurrentKey(this.select_node);
+        // 重置筛选状态
+        this.select_id = newval;
+      }
+    },
+  },
+  directives: {
+    drag(el, bindings) {
+      el.onmousedown = function(e) {
+				var init = e.clientX;
+				var box = $("#box")[0]
+				let total_wid = box.offsetWidth
+        var left = $("#left")[0];
+        var right = $("#right")[0];
+        var initWidth = left.offsetWidth;
+        document.onmousemove = function(e) {
+          var end = e.clientX;
+					if(end > 310){
+            var newWidth = end - init + initWidth;
+						// right.style.width = total_wid-end+80 +'px'
+						right.style.width = total_wid - newWidth + 'px'
+            left.style.width = newWidth + "px";
+          }else{
+            end = 350;
+            // 最小宽度300
+            left.style.width = 300 + "px";
+						// right.style.width = total_wid-300-20 +'px'
+          }
+        };
+        document.onmouseup = function() {
+          document.onmousemove = document.onmouseup = null;
+					e.releaseCapture && e.releaseCapture();
+        };
+				e.setCapture && e.setCapture();
+				return false;
+      };
+    }
+  },
+
+  methods: {
+    /* 根据unicode展开树结构并选中当前图表 重置图表配置 日期区间 */
+    selectCurrentNode({ code, id, type }) {
+      let deep_arr = _.cloneDeep(this.treeData);
+      // 查找图表的分类父级id
+      let arr = this.findParentNodeHandle(deep_arr, code).slice(1).reverse(); // 父的父的父-父的父-父
+      this.defaultShowNodes = arr;
+      this.select_node = code;
+      this.$refs.treeRef.setCurrentKey(this.select_node);
+      // // 重置筛选状态
+      this.select_id = id;
+    },
+
+    // 查找树节点所有父节点
+    findParentNodeHandle(arr, id) {
+      // 遍历取父级code push数组
+      for (let i of arr) {
+        if (i.UniqueCode === id) {
+          return [i.UniqueCode];
+        }
+        if (i.Children) {
+          let node = this.findParentNodeHandle(i.Children, id);
+          if (node) {
+            return node.concat(i.UniqueCode);
+          }
+        }
+      }
+    },
+
+    /* 拖动时node宽度跟随变化 */
+    resetNodeStyle: _.debounce(function(node) {
+			const tree = $('.target_tree')[0];
+			let width = tree.offsetWidth;
+			let label_wid =
+				width > 500
+					? 'auto'
+					: width <= 260
+					? 90
+					: 0.7 * width;
+			this.$set(node, 'Nodewidth', label_wid + 'px');
+		},200),
+
+    	/* 双击label出现input修改框 */
+		editNodeLabel(data,type='') {
+        //目录名称可以双击修改
+        if(data.ChartInfoId) return
+        this.$set(data,'isEdit',true)
+        this.new_label = this.currentLang==='en'?data.ChartClassifyNameEn:data.ChartClassifyName;
+        this.$nextTick(() => {
+          this.$refs.editVal.focus();
+        });
+		},
+
+    /* input失去焦点恢复node 修改最新的值*/
+		async changeValue(data) {
+      if(!this.new_label) return this.$message.warning('名称不能为空');
+      this.$set(data,'isEdit',false)
+
+      if((this.new_label===data.ClassifyName&&this.currentLang==='zh')||(this.new_label===data.ClassifyNameEn&&this.currentLang==='en')) return 
+      
+      let res;
+      if(this.$route.path === '/fittingEquationList') {
+        res = await fittingEquationInterface.classifyEdit({
+                ChartClassifyId: data.ChartClassifyId,
+                ChartClassifyName: this.new_label
+              })
+      }else if(this.$route.path === '/statisticFeatureList') {
+        res = await statisticFeatureInterface.classifyEdit({
+                ChartClassifyId: data.ChartClassifyId,
+                ChartClassifyName: this.new_label
+              })
+      }else if(this.$route.path === '/chartrelevance') {
+        res = await chartRelevanceApi.classifyEdit({
+                ChartClassifyId: data.ChartClassifyId,
+                ChartClassifyName: this.new_label
+              })
+      }else if(this.$route.path === '/crossVarietyChartList') {
+        res = await crossVarietyInterface.classifyEdit({
+          ChartClassifyId: data.ChartClassifyId,
+          ChartClassifyName: this.new_label
+        })
+      }
+
+      if(res.Ret !== 200) return
+
+      this.getTreeData();
+    },
+
+    /* 拖拽完成 */
+    dropOverHandle(b, a, i, e) {
+      
+      const isLastLevel=b.data.SummeryId?true:false
+
+			let list=a.parent.childNodes;
+			let targetIndex=0,PrevClassifyId=0,NextClassifyId=0,ParentClassifyId=0;
+			let ClassifyId=0,SummeryId=0,PrevSummeryId=0,NextSummeryId=0;
+
+			ClassifyId=isLastLevel?0:b.data.ClassifyId
+			SummeryId=isLastLevel?b.data.SummeryId:0
+			
+
+			if(i!=='inner'){
+				ParentClassifyId=a.parent.data.ClassifyId||0
+				list.forEach((item,index)=>{
+					if(isLastLevel){
+						if(item.data.SummeryId===b.data.SummeryId){
+							targetIndex=index
+						}
+					}else{
+						if(item.data.ClassifyId===b.data.ClassifyId){
+							targetIndex=index
+						}
+					}
+					
+				})
+
+				
+				if(targetIndex===0){
+					const data=list[targetIndex+1].data
+					NextClassifyId=data.EdbCode?0:data.ClassifyId
+					NextSummeryId=data.EdbCode?data.SummeryId:0
+				}else if(targetIndex===list.length-1){
+					const data=list[targetIndex-1].data
+					PrevClassifyId=data.EdbCode?0:data.ClassifyId
+					PrevSummeryId=data.EdbCode?data.SummeryId:0
+				}else{
+					const pData=list[targetIndex-1].data
+					PrevClassifyId=pData.EdbCode?0:pData.ClassifyId
+
+					PrevSummeryId=pData.EdbCode?pData.SummeryId:0
+
+					const nData=list[targetIndex+1].data
+					NextClassifyId=nData.EdbCode?0:nData.ClassifyId
+					NextSummeryId=nData.EdbCode?nData.SummeryId:0
+				}
+			}else{
+				ParentClassifyId=a.data.ClassifyId||0
+			}
+
+			const params={
+				ClassifyId,
+				ParentClassifyId,
+				SummeryId,
+				PrevClassifyId,
+				NextClassifyId,
+				PrevSummeryId,
+				NextSummeryId
+			}
+			dataBaseInterface.classifyMoveSort(params).then(res=>{
+				if(res.Ret===200){
+					// this.$message.success('移动成功!')
+					this.$message.success(this.$t('MsgPrompt.move_sort_success'))
+				}
+				this.getTreeData()
+				if(this.selected_edbid){
+					this.getDataList();
+				}
+				
+			})
+    },
+
+    /* 拖拽覆盖添加背景色 */
+    dropMouseOver(node1, node2, e) {
+
+      if(!node2.data.SummeryId&&(node1.level>node2.level||(node1.data.SummeryId>0&&!node2.data.SummeryId)) && (e.target.childNodes[0].className.includes('el-tree-node__content') 
+        || e.target.className.includes('el-tree-node__content'))) {
+
+          e.target.childNodes[0].className.includes('el-tree-node__content') 
+          ? e.target.childNodes[0].style.backgroundColor = '#409eff' 
+          : e.target.style.backgroundColor = '#409eff';
+        }
+    },
+
+    /* 拖拽离开/拖拽完成重置背景色 */
+    dropMouseLeave(node1, node2, e) {
+      let arrs = $(".el-tree-node__content");
+      for (let a of arrs) {
+        a.style.backgroundColor = "transparent";
+      }
+    },
+
+    // 树节点展开
+    handleNodeExpand(data) {
+      // 保存当前展开的节点
+      let flag = this.defaultShowNodes.some((item) => item === data.UniqueCode);
+
+      if (!flag) {
+        // 不存在则存到数组里
+        this.defaultShowNodes.push(data.UniqueCode);
+      }
+    },
+
+    // 树节点关闭
+    handleNodeCollapse(data) {
+      this.defaultShowNodes.some((item, index) => {
+        if (item === data.UniqueCode) {
+          // 删除关闭节点
+          this.defaultShowNodes.length = index;
+        }
+      });
+    },
+
+    /* 判断节点是否能被拖拽 */
+    canDragHandle(node) {
+      let canMove = true;
+      return canMove;
+    },
+
+    /* 判断节点是否能被拖入 */
+    canDropHandle(draggingNode, dropNode, type) {
+      let canDrop = false;
+
+     // 拖动的是最小级
+			if(draggingNode.data.SummeryId){
+				if(!(dropNode.level===1&&type!=='inner')){
+					canDrop=true
+				}
+			}else{//拖动的是目录
+
+				//目录层级不能改变
+				if((dropNode.level+1==draggingNode.level&&type==='inner'&&!dropNode.data.SummeryId)||(dropNode.level===draggingNode.level&&type!=='inner')){
+					canDrop=true
+				}
+			}
+			return canDrop
+    },
+
+    /* 展开对应菜单 显示详情 */
+    detailShowHandle({ UniqueCode, ChartInfoId }) {
+      let params = {
+        code: UniqueCode,
+        id: ChartInfoId,
+      };
+      this.selectCurrentNode(params);
+      this.select_classify = 0;
+    },
+  },
+};

+ 0 - 0
src/views/semantics_manage/summery/mixins/utils.js


+ 266 - 0
src/views/semantics_manage/summery/summeryEdit.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="edit-summery-page">
+    <div class="top-wrap">
+      <div class="wrap-item">
+        <div class="header flex">
+          <ul class="tab flex">
+            <li 
+              :class="['tab-item',{'act':item.key===sourceForm.type}]" 
+              v-for="item in tabSources" 
+              :key="item.key"
+            >{{item.label}}</li>
+          </ul>
+          <span class="editsty"><!-- 重新选择 -->{{$t('SemanticsManage.AiSummeryPage.rechoose')}}</span>
+        </div>
+
+        <div class="input-main">
+          <div class="title" v-if="sourceForm.type===1">
+            <label><!-- 标题 -->{{$t('SemanticsManage.AiSummeryPage.source_title')}}</label>
+            <el-input 
+              type="text" 
+              v-model="sourceForm.title" 
+              style="width:200px;"
+              placeholder="请输入标题"
+            />
+          </div>
+
+          <Editor ref="sourceContRef"/>
+        </div>
+      </div>
+
+      <div class="wrap-item">
+        <div class="header flex">
+          <div class="flex" style="gap:0 50px;">
+            <label><!-- 提示词 -->{{$t('SemanticsManage.AiSummeryPage.label_prompt')}}</label>
+            <div>
+              <el-popover
+                placement="bottom"
+                trigger="click"
+              >
+                <el-cascader-panel :options="ownPromptOpts" :props="promptOptProps"/>
+                <span slot="reference" class="editsty"><!-- 我的提示词 -->{{$t('SemanticsManage.AiSummeryPage.my_prompt')}}</span>
+              </el-popover>
+              
+              <el-popover
+                placement="bottom"
+                trigger="click"
+              >
+                <el-cascader-panel :options="publicPromptOpts" :props="promptOptProps"/>
+                <span slot="reference" class="editsty"><!-- 公共提示词 -->{{$t('SemanticsManage.AiSummeryPage.public_prompt')}}</span>
+              </el-popover>
+            </div>
+          </div>
+          <div class="select-box">
+              <span><!-- 大模型 -->{{$t('SemanticsManage.AiSummeryPage.label_model')}}</span>
+              <el-select 
+                v-model="promptForm.model" 
+                :class="{'hint':showHint}" 
+                ref="modelSelect"
+                @change="changeModel"
+              >
+                  <el-option v-for="item in modelList" :key="item.label"
+                      :label="item.label"
+                      :value="item.key">
+                      <span style="float:left">{{item.label}}</span>
+                  </el-option>
+              </el-select>
+          </div>
+        </div>
+
+        <Editor ref="promptContRef"/>
+
+        <div class="bottom flex">
+          <el-button type="primary" @click="handleSendMessage">
+            <i class="el-icon-s-promotion" style="margin-right:5px;"/><!-- 发送 -->{{$t('SemanticsManage.AiSummeryPage.label_model')}}
+          </el-button>
+          <el-button type="primary" @click="handleSendMessage(true)"><!-- 新对话框中发送 -->{{$t('SemanticsManage.AiSummeryPage.new_send_btn')}}</el-button>
+        </div>
+      </div>
+    </div>
+
+    <div class="result-wrap">
+      <div class="create-header flex">
+        <div>
+          <span><!-- 纪要名称 -->{{$t('SemanticsManage.AiSummeryPage.summery_name')}}</span>
+          <el-input v-model="resultData.title" :placeholder="$t('SemanticsManage.AiSummeryPage.ph_search')" style="width:200px"/>
+        </div>
+        <div>
+          <span><!-- 纪要分类 -->{{$t('SemanticsManage.AiSummeryPage.summery_clasify')}}</span>
+          <el-cascader
+            v-model="resultData.classify"
+            :options="classifyOptions"
+            :props="{
+              label: 'ClassifyName',
+              value: 'ClassifyId',
+              children: 'Children',
+              checkStrictly: true,
+              emitPath: false,
+            }"
+            clearable
+            style="width:200px"
+            :placeholder="$t('SemanticsManage.AiSummeryPage.ph_classify')"
+          />
+        </div>
+      </div>
+      <div class="create-cont">
+        <div v-html="resultData.content" class="result-text"></div>
+        <div class="bottom">
+          <el-button type="primary" @click="saveSummeryHandle"><!-- 保存 -->{{$t('Dialog.confirm_save_btn')}}</el-button>
+          <el-button type="primary" plain @click="$router.go(-1)"><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import Editor from './components/editor.vue'
+export default {
+  components: { Editor },
+  computed: {
+    tabSources() {
+      return [
+        { label: /* '原文' */this.$t('SemanticsManage.AiSummeryPage.source_tab1'),key: 1 },
+        { label: /* '文档库' */this.$t('SemanticsManage.AiSummeryPage.source_tab2'),key: 2 },
+        { label: /* '上传文件' */this.$t('SemanticsManage.AiSummeryPage.source_tab3'),key: 3 },
+      ]
+    } 
+  },
+  data() {
+    return {
+
+      modelList:[
+        {
+            label:'GPT',
+            key:'GPT-4 Turbo',
+        },
+        {
+            label:'Kimi',
+            key:'Kimi',
+        },
+      ],
+      sourceForm: {
+        content: '',
+        title: '',
+        type: 1
+      },
+
+      ownPromptOpts: [],//我的提示词库
+      publicPromptOpts: [],//公共提示词库
+      promptOptProps: {
+        label: '',
+        value: '',
+        children: 'Child',
+        emitPath: false
+      },
+      promptForm: {
+        content: '',
+        model:'Kimi'
+      },
+
+      isSending: false,//发送中
+
+      resultData: {
+        content: '',
+        title: '',
+        classify: 0
+      }
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+
+    /* 发送对话 */
+    handleSendMessage(openNew=false) {
+      if(this.isSending) return 
+
+      this.isSending = true;
+    },
+    
+
+    /* 保存纪要 */
+    saveSummeryHandle() {
+      if(!this.resultData.title) return this.$message.warning(this.$t('SemanticsManage.AiSummeryPage.ph_search'))
+      if(!this.resultData.classify) return this.$message.warning(/* '请选择纪要分类' */this.$t('SemanticsManage.AiSummeryPage.ph_classify'))
+
+    },
+  },
+}
+</script>
+<style lang="scss">
+.edit-summery-page {
+  .fr-element {
+    height: 200px;
+  }
+} 
+</style>
+<style scoped lang='scss'>
+.edit-summery-page {
+  .top-wrap {
+    display: flex;
+    gap:0 30px;
+    .wrap-item {
+      width: 50%;
+      background: #fff;
+      padding: 20px;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      overflow-y: auto;
+      
+      .header {
+        justify-content: space-between;
+        margin-bottom: 20px;
+      }
+
+      .bottom {
+        margin-top: 20px;
+        justify-content: flex-end;
+      }
+      
+      .title {
+        margin-bottom: 10px;
+      }
+    }
+  }
+
+  .tab {
+    gap: 0 30px;
+    .tab-item {
+      padding-bottom: 10px;
+      border-bottom: 2px solid transparent;
+      &.act {
+        color: #0052D9;
+        border-color: #0052D9;
+      }
+    }
+  }
+
+  .flex {
+    display: flex;
+    align-items: center;
+  }
+
+  .result-wrap {
+    margin-top: 20px;
+    .create-header {
+      gap: 10px 30px;
+    }
+    .create-cont {
+      background: #fff;
+      padding: 20px;
+    }
+    .result-text {
+      min-height: 300px;
+    }
+    .bottom {
+      display: flex;
+      justify-content: flex-end;
+      .el-button {
+        width: 120px;
+      }
+    }
+  }
+}
+</style>