소스 검색

接口联调

Karsa 8 달 전
부모
커밋
973c0bf519

+ 210 - 1
src/api/modules/semanticsApi.js

@@ -516,5 +516,214 @@ const asrInterface = {
 }
 
 
+/* ai纪要 */
+const aiSummeryInterface = {
+  /**
+   * 获取纪要分类
+   * @param {*} params IsShowMe
+   * @returns 
+   */
+  getClassify: params => {
+    return http.get('/ai/summary/classify/list',params)
+  },
+
+  /**
+   * 新增纪要分类
+   * @param {*} params 
+   * "ClassifyName": "测试分类2",
+    "ParentId": 0,
+    "Level": 0
+   * @returns 
+   */
+  classifyAdd: params => {
+    return http.post('/ai/summary/classify/add',params)
+  },
+
+  /**
+   * 编辑纪要分类
+   * @param {*} params 
+   * "ClassifyName": "测试分类2",
+    "AiSummaryClassifyId": 1011 
+   * @returns 
+   */
+  classifyEdit: params => {
+    return http.post('/ai/summary/classify/edit',params)
+  },
+
+  /**
+   * 删除分类监测
+   * @param {*AiSummaryClassifyId} params 
+   * @returns 
+   */
+  classifyDelCheck: params => {
+    return http.post('/ai/summary/classify/delete/check',params)
+  },
+
+  /**
+   * 删除分类
+   * @param {*AiSummaryClassifyId} params 
+   * @returns 
+   */
+  classifyDel: params => {
+    return http.post('/ai/summary/classify/delete',params)
+  },
+
+  /**
+   * 移动分类
+   * @param {*} params 
+   * {
+      "AiSummaryClassifyId": 1015,
+      "AiSummaryId": 0,
+      "ParentClassifyId": 0,
+      "PrevId": 0,
+      "NextId": 1013,
+      "PrevType": 1,
+      "NextType": 1
+    }
+   * @returns 
+   */
+  classifyMove: params => {
+    return http.post('/ai/summary/classify/move',params)
+  },
+
+  /**
+   * 纪要搜索
+   * @param {*} params IsShowMe PageSize CurrentIndex KeyWord
+   * @returns 
+   */
+  summerySearch: params => {
+    return http.get('/ai/summary/list',params)
+  },
+
+  /**
+   * 提示词新增
+   * @param {* PromptContent Title} params 
+   * @returns 
+   */
+  promptAdd: params => {
+    return http.post('/ai/prompt/add',params)
+  },
+
+  /**
+   * 提示词编辑
+   * @param {*} params 
+   * "PromptContent": "提示词内容2",
+    "Title": "标题",
+    "AiPromptId": 637,
+   * @returns 
+   */
+  promptEdit: params => {
+    return http.post('/ai/prompt/edit',params)
+  },
+
+  /**
+   * 提示词删除
+   * @param {*AiPromptId} params 
+   * @returns 
+   */
+  promptDel: params => {
+    return http.post('/ai/prompt/delete',params)
+  },
+
+  /**
+   * 移动提示词
+   * @param {*} params 
+   * "AiPromptId": 638,
+    "PrevAiPromptId": 640,
+    "NextAiPromptId": 641
+   * @returns 
+   */
+  promptMove: params => {
+    return http.post('/ai/prompt/move',params)
+  },
+
+  /**
+   * 提示词详情
+   * @param {*AiPromptId} params 
+   * @returns 
+   */
+  promptDetail: params => {
+    return http.get('/ai/prompt/detail',params)
+  },
+
+  /**
+   * 我的提示词库
+   * @param {*} params 
+   * @returns 
+   */
+  getMyPromptClassify: params => {
+    return http.get('/ai/prompt/list',params)
+  },
+
+  /**
+   * 公共提示词库
+   * @param {*} params 
+   * @returns 
+   */
+  getPublicPromptClassify: params => {
+    return http.get('/ai/prompt/groups',params)
+  },
+
+  /**
+   * 设置提示词共享状态
+   * @param {*AiPromptId} params 
+   * @returns 
+   */
+  setPromptPublic: params => {
+    return http.post('/ai/prompt/share',params)
+  },
+
+  /**
+   * 生成结果
+   * @param {*} params 
+   * "AiChatTopicId": 307, 
+    "OriginContent": "", 
+    "OpenaiFileId": [
+    "cq73762tnn0umrare230"
+    ], 
+    "Prompt": "你是一名产品经理,分析下这张图", 
+    "Model": "Kimi" 
+   * @returns 
+   */
+  createAiSummery: params => {
+    return http.post('/ai/summary/generate',params)
+  },
+
+  /**
+   * 保存纪要
+   * @param {*} params 
+   *  "SaDocId": 0,
+      "OriginContent": "你是谁",
+      "SummaryContent": "我是一个人工智能,被训练来回答问题和提供帮助。虽然我没有个人身份或情感,但我会尽我所能为您提供有用的信息和支持。如果您有任何问题,请随时向我咨询!",
+      "ClassifyId": 1012,
+      "Title": "测试",
+      "Prompt": "",
+      "OpenaiFileName": "",
+      "OpenaiFilePath": ""
+   */
+  summerySave: params => {
+    return http.post('/ai/summary/add',params)
+  },
+
+  /**
+   * 纪要详情
+   * @param {*} params AiSummaryId
+   * @returns 
+   */
+  summeryDetail: params => {
+    return http.get('/ai/summary/detail',params)
+  },
+
+  /**
+   * 获取所有层级分类不包含纪要
+   * @param {*} params 
+   * @returns 
+   */
+  getSummeryAllClassify: params => {
+    return http.get('/ai/summary/classifyList',params)
+  }
+} 
+
+
 
-export {tagInterface,documentInterface,semanticInterface,asrInterface}
+export {tagInterface,documentInterface,semanticInterface,asrInterface,aiSummeryInterface}

+ 11 - 0
src/utils/buttonConfig.js

@@ -535,6 +535,17 @@ export const semanticPermission = {
     ASR_deleteVoice:'ASR:deleteVoice',//删除音频
     ASR_copyText:'ASR:copyText',//复制
     ASR_toggleTimestampShow:'ASR:toggleTimestampShow',//隐藏/显示时间戳
+
+    /* ai纪要 */
+    AiSummery_add: 'AiSummery:add',//添加纪要
+    AiSummery_view: 'AiSummery:view',//查看
+    AiSummery_prompt_add: 'AiSummery:prompt:add',//添加提示词
+    AiSummery_classify_edit: 'AiSummery:classify:edit',//添加编辑纪要分类
+    AiSummery_classify_move: 'AiSummery:classify:move',//移动分类
+    AiSummery_classify_del: 'AiSummery:classify:del',//删除分类
+    AiSummery_prompt_classify_move: 'AiSummery:prompt:classify:move',//提示词分类移动
+    AiSummery_prompt_classify_del: 'AiSummery:prompt:classify:del',//提示词分类删除
+    AiSummery_prompt_classify_edit: 'AiSummery:prompt:classify:edit',//提示词分类修改
 }
 /*
  * --------------------------------------------------------------------------统计分析------------------------------------------------

+ 6 - 6
src/views/semantics_manage/summery/components/classifyDia.vue

@@ -39,7 +39,7 @@
 </template>
 
 <script>
-import futuresInterface from '@/api/modules/futuresBaseApi';
+import { aiSummeryInterface } from '@/api/modules/semanticsApi';
 export default {
 	props: {
 		isShow: {
@@ -77,11 +77,11 @@ export default {
 
 		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  })
+      const { classifyName,classifyId,parentClassifyId,parentLevel }  = this.formData;
+
+      const { Ret,Msg } = !classifyId
+        ? await aiSummeryInterface.classifyAdd({ ClassifyName:classifyName,ParentId:parentClassifyId,Level: parentLevel })
+        : await aiSummeryInterface.classifyEdit({ ClassifyName:classifyName, AiSummaryClassifyId:classifyId  })
         
       if( Ret !== 200) return
       this.$message.success(Msg);

+ 15 - 7
src/views/semantics_manage/summery/components/editor.vue

@@ -2,24 +2,32 @@
   <froala 
     :id="`froala-editor-documentContent`" 
     :tag="'textarea'" 
-    :config="{...froalaConfig,placeholderText:$t('SemanticsManage.DocumentComparison.article_content_enter')}" 
-    v-model="content">
+    :config="froalaConfig" 
+    v-model="content"
+  >
   </froala>
 </template>
 <script>
 import {froalaConfig} from '../../utils/config';
 export default {
+  props: {
+    disabled: {
+      type: Boolean
+    }
+  },
   data() {
     return {
-      froalaConfig:froalaConfig,
+      froalaConfig:{
+        ...froalaConfig,
+        placeholderText:this.$t('SemanticsManage.DocumentComparison.article_content_enter')
+      },
       content: ''
     }
-  },
-  mounted(){
-
   },
   methods:{
-
+    initData(content) {
+      this.content = content;
+    }
   },
 }
 </script>

+ 143 - 120
src/views/semantics_manage/summery/components/promptClassifySection.vue

@@ -15,194 +15,217 @@
                 ref="catalogTree"
                 class="target_tree"
                 empty-text="暂无提示词"
+                :props="defaultProp"
                 :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>
+                    <span class="tree-label">{{ data.label }}</span>
                 </div>
             </el-tree>
         </div>
     </div>
 
     <!-- 我的提示词 -->
-    <div class="classify" v-if="myPromptList.length">
+    <div class="classify">
           <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)"
+          <template v-if="myPromptList.length">
+            <draggable
+              v-model="myPromptList"
+              class="classify-ul"
+              animation="300"
+              tag="ul"
+              @start="dragStart"
+              @update="dragenter"
+              @end="dragOver"
             >
-              <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>
+              <li
+                :class="[
+                  'classify-item',
+                  { 'act': item.AiPromptId=== selectId },
+                ]"
+                v-for="item in myPromptList"
+                :key="item.AiPromptId"
+                @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.Title }}
+                </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.IsShare === 0">
+                      <img src="~@/assets/img/chart_m/User.png" v-else>
+                    </span>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item 
+                      :command="{key:'own',IsPublic:undefined,item}" 
+                      :class="item.IsShare === 0 ? 'el-dropdown-menu-item-chat-act' : ''"
+                      class="el-dropdown-menu-item-chat"
+                      >
+                      <img v-if="item.IsShare === 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',IsPublic:undefined,item}" 
+                      :class="item.IsShare === 1 ? 'el-dropdown-menu-item-chat-act' : ''"
+                      class="el-dropdown-menu-item-chat"
+                      >
+                      <img v-if="item.IsShare === 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',IsPublic:undefined,item}"><!-- 删除 -->{{$t('Table.delete_btn')}}</el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                </div>
+              </li>
+            </draggable>
+          </template>
+
+          <tableNoData text="暂无提示词" v-else size="mini"/>
         </div>
   </div>
 </template>
 <script>
 import draggable from 'vuedraggable';
-import { mychartInterface } from '@/api/api.js';
+import { aiSummeryInterface } from '@/api/modules/semanticsApi';
 export default {
   components: {  draggable },
+  props: {
+    publicList: {
+      type: Array
+    },
+    myList: {
+      type: Array
+    }
+  },
   data() {
     return {
-      selectedClassify: 0,
-      publicPromptList: [
-        { MyChartClassifyId: 1,MyChartClassifyName:'dwd对我的' }
-      ],
+      selectId: 0,
+      defaultProp: {
+        label: 'label',
+        value: 'value',
+        children: 'children'
+      },
+      publicPromptList: [],
       isExpandPublic: false,
 
-      myPromptList: [
-        { MyChartClassifyId: 5,MyChartClassifyName:'大秦赋危废物',Content: '队伍等级哦清瘟解毒气雾剂低洼请打击' }
-      ],
+      myPromptList: [],
       startIndex: 0,
       nextIndex: 0,
       preIndex: 0
     }
   },
-  mounted(){
-
+  watch: {
+    myList(nval) {
+      this.myPromptList = nval
+    },
+    publicList(nval) {
+      this.publicPromptList = nval
+    }
   },
   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();
-      });
+    handleCommand({key,IsPublic,item}) {
 
-      ['edit','del'].includes(key) && this.delPrompt(key);
+      key==='del' && this.delPrompt(item);
 
-      ['own', 'public'].includes(key) && mychartInterface.setPublic({
-        IsPublic: key === 'own' ? 0 : 1,
-        MyChartClassifyId: this.select_classify
+      ['own', 'public'].includes(key) && aiSummeryInterface.setPromptPublic({
+        AiPromptId: this.selectId
       }).then(res => {
         if(res.Ret !== 200) return;
         this.$message.success(/* '设置成功' */this.$t('MsgPrompt.set_success_msg'));
         if(key === 'own'){
-          item.IsPublic=0
+          item.IsShare=0
         }else{
-          item.IsPublic=1
+          item.IsShare=1
         }
+        this.$emit('getData')
       })
       
     },
 
-    delPrompt() {
+    delPrompt(item) {
+      this.$confirm('确认删除该提示词吗?', this.$t('Confirm.prompt'), {
+				type: 'warning',
+			}).then(async() => {
+				
+        const res = await aiSummeryInterface.promptDel({
+          AiPromptId: item.AiPromptId
+        })
+        
+        if(res.Ret !== 200) return 
+        this.$message.success(res.Msg)
+        this.myPromptList.splice(1,this.myPromptList.findIndex(_ =>_.AiPromptId===item.AiPromptId))
 
+        this.selectId = 0;
+        this.$emit('close')
+			});
+    },
+
+    nodeChange(data,node) {
+      console.log(data)
+      if(data.AiPromptId) { //提示词
+        // this.selectId = data.AiPromptId;
+
+        this.$emit('change',data)
+      }
     },
 
 
     /* 切换分类 */
     chooseClassify(item) {
-      const {MyChartClassifyId,fromPublic } = item
+      const {AiPromptId } = item
 
-      if(fromPublic!==1){
-        this.$refs.catalogTree&&this.$refs.catalogTree.setCurrentKey(null)
-      }
-      this.selectedClassify = MyChartClassifyId;
+      this.$refs.catalogTree&&this.$refs.catalogTree.setCurrentKey(null)
+      this.selectId = AiPromptId;
 
-      this.$emit('change',{ selectItem:item })
+      this.$emit('change',item)
     },
 
     /* 拖动开始 记录位置 */
     dragStart({ oldIndex }) {
-      this.startIndex = this.myPromptList[oldIndex].MyChartClassifyId;
+      this.startIndex = this.myPromptList[oldIndex].AiPromptId;
     },
 
     /* 拖动结束 替换  */
     dragOver() {
-      mychartInterface.moveClassify({
-          MyChartClassifyId:  this.startIndex,
-          NextClassifyId: this.nextIndex || 0,
-          PrevClassifyId:  this.preIndex || 0,
+      aiSummeryInterface.promptMove({
+          AiPromptId:  this.startIndex,
+          NextAiPromptId: this.nextIndex || 0,
+          PrevAiPromptId:  this.preIndex || 0,
       }).then(res => {
         if(res.Ret !== 200) return;
+        this.$message.success(res.Msg)
       })
 
     },
 
     /* 拖动时 获取移动后的上一个位置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
+      this.preIndex = newIndex > 0 ? this.myPromptList[newIndex - 1].AiPromptId: 0;
+      this.nextIndex = newIndex ===  this.myPromptList.length - 1 ? 0 : this.myPromptList[newIndex + 1].AiPromptId
 
     },
   },

+ 43 - 10
src/views/semantics_manage/summery/components/promptDetail.vue

@@ -4,17 +4,18 @@
       <div>
         <span>提示词名称</span>
         <el-input 
-          v-model="name" 
+          v-model="promptData.title" 
           style="width:220px" 
           placeholder="请输入提示词名称"
+          :disabled="item.type==='public'"
         ></el-input>
       </div>
     </header>
 
     <div class="main">
-      <Editor />
+      <Editor ref="editorRef" :disabled="item.type==='public'"/>
 
-      <div class="bot">
+      <div class="bot" v-if="item.type!=='public'">
         <el-button type="primary" @click="handleSavePrompt"><!-- 确定 -->{{$t('Dialog.confirm_btn')}}</el-button>
           <el-button type="primary" plain ><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
       </div>
@@ -22,6 +23,7 @@
   </div>
 </template>
 <script>
+import { aiSummeryInterface } from '../../../../api/modules/semanticsApi'
 import Editor from './editor.vue'
 export default {
   components: { Editor },
@@ -32,22 +34,53 @@ export default {
   },
   watch: {
     item(nval) {
-      if(nval.MyChartClassifyId) {
-
+      console.log(nval)
+      if(nval.AiPromptId) {
+        this.promptData.title = nval.Title;
+        this.$refs.editorRef.initData(nval.PromptContent)
+      }else {
+        this.promptData.title=''
+        this.$refs.editorRef.initData('')
       }
     }
   },
   data() {
     return {
-      name: ''
+      promptData: {
+        title: ''
+      }
     }
   },
-  mounted(){
-
+  mounted() {
+    if(this.item.AiPromptId) {
+      this.promptData.title = this.item.Title;
+      this.$nextTick(() => {
+        this.$refs.editorRef.initData(this.item.PromptContent)
+      })
+    }else {
+      this.promptData.title=''
+      this.$nextTick(() => {
+        this.$refs.editorRef.initData('')
+      })
+    }
   },
   methods:{
-    handleSavePrompt() {
+    async handleSavePrompt() {
+      if(!this.promptData.title) return this.$message.warning('请输入提示词名称')
+
+      let params = {
+        Title: this.promptData.title,
+        PromptContent: this.$refs.editorRef.content
+      }
       
+      const res = this.item.AiPromptId
+        ? await aiSummeryInterface.promptEdit({AiPromptId: this.item.AiPromptId,...params})
+        : await aiSummeryInterface.promptAdd(params)
+        
+      if(res.Ret !== 200) return
+      this.$message.success(res.Msg)
+
+      this.$emit('success')
     }
   },
 }
@@ -70,7 +103,7 @@ export default {
 <style lang="scss">
 .edit-prompt {
   .fr-element {
-    height: 300px;
+    height: calc(100vh - 400px);
   }
 } 
 </style>

+ 53 - 18
src/views/semantics_manage/summery/components/summeryDetail.vue

@@ -1,41 +1,71 @@
 <template>
   <div class="detail-wrapper">
     <header>
-      <div>
         原文:
-        <span>单位第五季第几点五级地忘记</span>
-        <!-- <span class="editsty" @click="handleLinkToArticle">单位第五季第几点五级地忘记</span> -->
-      </div>
-    </header>
-    
-    <div class="article-item">
+        <span v-if="summeryInfo.OriginTitle" @click="handleLinkToArticle">{{summeryInfo.OriginTitle}}</span>
 
-    </div>
+        <span v-else-if="summeryInfo.AiSummaryId" @click="handleLinkToArticle">{{summeryInfo.SaDocTitle}}</span>
 
-    <div class="article-item" v-html="detailData.content">
-      
-    </div>
+        <span v-else-if="summeryInfo.OpenaiFilePath" class="editsty" @click="previewFileHandle(summeryInfo.OpenaiFilePath)">{{summeryInfo.OpenaiFileName}}</span>
+    </header>
+    
+    <div class="article-item" v-html="summeryInfo.OriginContent" v-if="summeryInfo.OriginContent"></div>
+    
+    <div>纪要:{{summeryInfo.Title}}</div>
+    <div class="article-item" v-html="summeryInfo.SummaryContent"></div>
 
   </div>
 </template>
 <script>
+import { aiSummeryInterface } from '@/api/modules/semanticsApi'
 export default {
+  props: {
+    id: {
+      type: Object
+    }
+  },
+  watch: {
+    id(nval) {
+      this.getDetail()
+    }
+  },
   data() {
     return {
-      detailData: {
-        content:'但我觉得今晚ID今晚ID哦较大五级地问答及伟大金娃登记青蛙ID就都忘记打排位都叫我就 记得记得记得我就武器端午节i我都叫我请大家我IQ大家'
-      }
+      summeryInfo: {}
     }
   },
   mounted(){
-
+    this.getDetail();
   },
   methods:{
+    async getDetail() {
+      let res = await aiSummeryInterface.summeryDetail({
+        AiSummaryId: this.id
+      })
+      if(res.Ret !== 200) return
+
+      this.summeryInfo = res.Data
+    },
+
     handleLinkToArticle() {
+
       this.router.push({
-        path: ''
+        path: '/documentPage'
       })
-    }
+    },
+
+    previewFileHandle(url) {
+       // 预览文件
+      let href;
+      if(url.endsWith('.doc') || url.endsWith('.docx')||url.endsWith('.ppt')||
+      url.endsWith('.pptx') || url.endsWith('.xls')||url.endsWith('.xlsx')){
+        //是否是 ppt、doc、xls
+        href = 'https://view.officeapps.live.com/op/view.aspx?src='+url
+      }else{
+        href=url
+      }
+      window.open(href, "_blank")
+    },
   },
 }
 </script>
@@ -44,15 +74,20 @@ export default {
   height: 100%;
   display: flex;
   flex-direction: column;
-  gap: 20px;
   header {
     padding: 10px 20px;
     background: #fff;
+    display: flex;
+    align-items: center;
+    margin-bottom: 15px;
   }
 
   .article-item {
     padding: 20px;
     background: #fff;
+    overflow-y: auto;
+    flex: 1;
+    margin-bottom: 20px;
   }
 }
 </style>

+ 154 - 59
src/views/semantics_manage/summery/index.vue

@@ -2,12 +2,12 @@
   <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>
+						<el-button type="primary" @click="goSummeryEdit" v-if="activeTab==='summery'&&permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_add)"><!-- 添加纪要 -->{{$t('SemanticsManage.AiSummeryPage.btn_add_summery')}}</el-button>
+						<el-button type="primary" @click="handleAddPrompt" v-else-if="activeTab==='prompt'&&permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_prompt_add)"><!-- 添加提示词 -->{{$t('SemanticsManage.AiSummeryPage.btn_add_prompt')}}</el-button>
 				</div>
 
 				<div class="left-main">
-					<el-tabs v-model="activeTab" @tab-click="handleClick">
+					<el-tabs v-model="activeTab" @tab-click="changeTab">
 						<el-tab-pane :label="$t('SemanticsManage.AiSummeryPage.tab_summery')" name="summery"/>
 						<el-tab-pane :label="$t('SemanticsManage.AiSummeryPage.tab_prompt')" name="prompt"/>
 					</el-tabs>
@@ -31,9 +31,9 @@
 								<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"
+									:key="item.AiSummaryId"
+									:label="item.Title"
+									:value="item.AiSummaryId"
 								>
 								</el-option>
 							</el-select>
@@ -50,10 +50,12 @@
 								:allow-drop="canDropHandle"
 								:current-node-key="select_node"
 								:default-expanded-keys="defaultShowNodes"
-								draggable
+								:draggable="permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_move)"
 								:expand-on-click-node="false"
 								check-strictly
 								empty-text="暂无分类"
+								lazy
+								:load="getLazyTreeData"
 								@node-expand="handleNodeExpand"
 								@node-collapse="handleNodeCollapse"
 								@current-change="nodeChange"
@@ -69,7 +71,7 @@
 											(select_node === data.UniqueCode && node.Nodewidth) || ''
 										}`"
 									>
-										<span>{{ data.ChartClassifyName  }}</span>
+										<span>{{ data.ClassifyName  }}</span>
 									</span>
 									<span
 										style="display: flex; align-items: center"
@@ -79,27 +81,28 @@
 											src="~@/assets/img/data_m/move_ico.png"
 											alt=""
 											style="width: 14px; height: 14px; margin-right: 8px"
+											v-if="permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_move)"
 										/>
 										<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"
+											v-if="node.level<6&&!data.AiSummaryId&&permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_edit)"
 										/>
 										<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')"
+											v-if="!data.AiSummaryId&&permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_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')"
+											v-if="!data.AiSummaryId&&permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_del)"
 										/>
 									</span>
 								</span>
@@ -110,7 +113,7 @@
 						<div
 							class="noDepart"
 							@click="handleAddClassify"
-							v-if="permissionBtn.isShowBtn('statisticPermission','fittingEq_classifyOpt_edit')"
+							v-if="permissionBtn.checkPermissionBtn(permissionBtn.semanticPermission.AiSummery_classify_edit)"
 						>
 							<img
 								src="~@/assets/img/set_m/add_ico.png"
@@ -124,7 +127,12 @@
 					<!-- 提示词库 -->
 					<promptClassifySection 
 						v-else-if="activeTab==='prompt'" 
-						@change="({selectItem}) => {selectPromatItem=selectItem}"
+						ref="promptClassifyRef"
+						:publicList="publicPromptList"
+						:myList="myPromptList"
+						@change="(selectItem) => {selectPromptInfo=selectItem;showPromptDetail=true}"
+						@close="() => { selectPromptInfo={};showPromptDetail=false }"
+						@getData="getPromptClassify('public')"
 					/>
 				</div>
 
@@ -132,20 +140,29 @@
 
 			<div class="main-right" id="right">
 
-					<promptDetail v-if="activeTab==='prompt'&&ShowPromptDetail" :item="selectPromatItem"/>
+					<promptDetail 
+						v-if="activeTab==='prompt'&&showPromptDetail" 
+						:item="selectPromptInfo"
+						@success="getPromptClassify('mine')"
+					/>
+
+					<summeryDetail 
+						v-else-if="activeTab==='summery'&&showSummertDetail&&select_id"
+						:id="select_id"
+					/>
 
-					<summeryDetail v-else-if="activeTab==='summery'"/>
-					<!-- <tableNoData text="暂无数据"/> -->
+					<tableNoData text="暂无数据" v-else/>
 			</div>
 
 		<classifyDia
 			:isShow.sync="isOpenClassifyDia"
 			:form="classifyForm"
+			@successCallback="getTreeData"
 		/>
   </div>
 </template>
 <script>
-import { fittingEquationInterface } from '@/api/modules/chartRelevanceApi';
+import { aiSummeryInterface } from '@/api/modules/semanticsApi';
 import classifyMixin from './mixins/classifyTree';
 import promptClassifySection from './components/promptClassifySection.vue'
 import promptDetail from './components/promptDetail.vue';
@@ -153,7 +170,12 @@ import summeryDetail from './components/summeryDetail.vue';
 import classifyDia from  './components/classifyDia.vue';
 export default {
   mixins: [ classifyMixin ],
-	components: { promptDetail,summeryDetail,promptClassifySection,classifyDia },
+	components: { 
+		promptDetail,
+		summeryDetail,
+		promptClassifySection,
+		classifyDia 
+	},
   data() {
     return {
 			activeTab: 'summery',
@@ -165,17 +187,20 @@ export default {
 
 			select_node: '',//节点唯一标识code
 			select_classify: '',
+			select_id: 0,
       defaultShowNodes: [], //展开节点
       defaultProp: {
-        label: 'ChartClassifyName',
+        label: 'ClassifyName',
         children: 'Children',
+				isLeaf: 'isLeaf'
       }, //树结构配置项
-			dynamicNode: null,
+			summeryInfo: {},
+			showSummertDetail: false,
 
-			ShowPromptDetail: false,
+			showPromptDetail: false,//显示promat详情
 			publicPromptList: [],
 			myPromptList: [],
-			selectPromatItem: {},
+			selectPromptInfo: {},
 
 			/* 分类弹窗 */
 			isOpenClassifyDia: false, //
@@ -206,10 +231,28 @@ export default {
 				path: '/summeryEdit'
 			})
 		},
+
+		/* 添加提示词 */
+		handleAddPrompt() {
+			this.selectPromptInfo = {};
+			this.showPromptDetail = true;
+			this.$refs.promptClassifyRef.selectId = 0;
+		},
+
+		/* 改变tab */
+		changeTab({name}) {
+			this.search_txt = '';
+			this.select_node = [];
+			this.defaultShowNodes = [];
+			this.select_id = 0;
+			this.showPromptDetail = false;
+			this.showSummertDetail = false;
+			name === 'summery' ? this.getTreeData() : this.getPromptClassify();
+		},
 		
 		/* 获取分类 */
 		getTreeData(params=null) {
-			fittingEquationInterface.classifyList({IsShowMe:this.isShowMe}).then(res => {
+			aiSummeryInterface.getClassify({IsShowMe:this.isShowMe}).then(res => {
 				const { Ret,Data } = res;
 				if(Ret !== 200) return
 
@@ -223,6 +266,57 @@ export default {
 			})
 		},
 
+		//加载子分类
+		async getLazyTreeData (node,resolve){
+			if(node.level===0){
+				resolve(this.classifyData)
+			}else{
+				let arr=[]
+				const res=await aiSummeryInterface.getClassify({AiSummaryClassifyId:node.data.AiSummaryClassifyId,IsOnlyMe:this.isShowMe})
+				if (res.Ret === 200) {
+					const temarr = res.Data.AllNodes || [];
+					arr=temarr.map(item=>{
+						return {
+							...item,
+							isLeaf:item.AiSummaryId?true:false
+						}
+					})
+				}
+				resolve(arr)
+			}
+		},
+
+		/* 获取提示词分类 */
+		async getPromptClassify(type="all") {
+			if(type!=='mine') {
+				const publicRes = await aiSummeryInterface.getPublicPromptClassify()
+				if(publicRes.Ret !== 200) return
+				const publicData = publicRes.Data || []
+				this.publicPromptList = publicData.map(_ => {
+					return {
+						..._,
+						label: _.GroupName,
+						value: _.GroupId,
+						children: _.PromptList.map(childitem =>({
+							...childitem,
+							label: childitem.Title,
+							value: childitem.AiPromptId,
+							type:'public',
+						})),
+					}
+				})
+			}
+
+			if(type!=='public') {
+				const res = await aiSummeryInterface.getMyPromptClassify()
+				if(res.Ret !==200) return 
+				this.myPromptList = res.Data&&res.Data.map(_ =>({
+					..._,
+					type: 'mine'
+				}))
+			}
+		},
+
 		/* 搜索 */
 		searchHandle(query) {
 			this.search_page = 1;
@@ -232,17 +326,22 @@ export default {
 
 		searchApi(query,page=1) {
       /* 查找列表 */
-      fittingEquationInterface
-        .searchChart({
-          Keyword: query,
+      aiSummeryInterface
+        .summerySearch({
+          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];
+					
+					if(res.Data) {
+						const { List,Paging } = res.Data;
+						this.search_have_more = page < Paging.Pages;
+						this.searchOptions = page === 1 ? List : [...this.searchOptions,...List];
+					}else {
+						this.searchOptions = []
+					}
         });
 		},
 
@@ -263,14 +362,11 @@ export default {
 		},
 
 		/* 选中分类变化时 */
-		nodeChange({ UniqueCode,ChartInfoId,ChartClassifyId },node) {
+		nodeChange({ UniqueCode,AiSummaryId,AiSummaryClassifyId },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;
+			this.select_classify = !AiSummaryId ? AiSummaryClassifyId : 0;
+			this.select_id = AiSummaryId || 0;
 		},
 
 		/* 添加一级分类 */
@@ -278,6 +374,7 @@ export default {
 			this.classifyForm = {
 				parentClassifyId: 0,
 				parentName: '',
+				parentLevel: 0,
 				classifyId: 0,
 				classifyName: '',
 			}
@@ -286,29 +383,32 @@ export default {
 
 		/* 添加节点 */
 		addNode(node, data) {
+			console.log(node)
 			let arr = []
       arr = this.getNodeParentData(node,arr).reverse();
 
       this.classifyForm = {
 				classifyId: 0,
         classifyName: "",
-        parentClassifyId: data.ChartClassifyId,
-        parentName: arr.map(_=>_.ChartClassifyName).join('/')
+        parentClassifyId: data.AiSummaryClassifyId,
+        parentName: arr.map(_=>_.ClassifyName).join('/'),
+				parentLevel: node.level
       };
       this.isOpenClassifyDia = true;
 		},
 
     /* 编辑节点 */
     editNode(node, data) {
-			const { ChartClassifyName,ChartClassifyId,ParentId } = data;
+			const { ClassifyName,AiSummaryClassifyId,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
+				parentName: arr.map(_=>_.ClassifyName).join('/'),
+				classifyId: AiSummaryClassifyId,
+				classifyName: ClassifyName,
+				parentLevel: node.parent.level
 			}
       this.isOpenClassifyDia = true;
     },
@@ -316,15 +416,15 @@ export default {
 		 // 递归节点
 		getNodeParentData(data,arr){
 			if(data.level===0) return
-			arr.push({ChartClassifyName:data.data.ChartClassifyName,ChartClassifyId:data.data.ChartClassifyId})
+			arr.push({ClassifyName:data.data.ClassifyName,AiSummaryClassifyId:data.data.AiSummaryClassifyId})
 			this.getNodeParentData(data.parent,arr)
 			return arr
 		},
 
 		 /* 删除节点校验 */
-    async removeNode(node, { ChartClassifyId,ChartInfoId }) {
+    async removeNode(node, { AiSummaryClassifyId,AiSummaryId }) {
 
-			const { Data } = await fittingEquationInterface.classifyDelCheck({ ChartClassifyId })
+			const { Data } = await aiSummeryInterface.classifyDelCheck({ AiSummaryClassifyId })
 
 			const { DeleteStatus } = Data;
 
@@ -335,35 +435,27 @@ export default {
 				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)
+				this.delApi(AiSummaryClassifyId,AiSummaryId)
 			}): null;
 
     },
 
 		 /* 删除方法 */
-    delApi(ChartClassifyId,ChartInfoId,type='') {
-      fittingEquationInterface
+    delApi(AiSummaryClassifyId,AiSummaryId,type='') {
+      aiSummeryInterface
         .classifyDel({
-          ChartClassifyId,
-					ChartInfoId
+          AiSummaryClassifyId,
+					AiSummaryId
         })
         .then((res) => {
           if (res.Ret !== 200) return
 					this.$message.success(res.Msg);
 
-					if (!res.Data.ChartInfoId) this.select_id = '';
+					if (!res.Data) this.select_id = '';
 
-					//删除自动显示下一张
-					type=='del_chart' && res.Data.ChartInfoId
-						? this.getTreeData({
-								code: res.Data.UniqueCode,
-								id: res.Data.ChartInfoId
-							})
-						: this.getTreeData();
+					this.getTreeData();
         });
     },
 
@@ -466,6 +558,9 @@ export default {
 	.main-right {
 		flex: 1;
 		height: calc(100vh - 120px);
+		#froala-editor-documentContent {
+			display: none;
+		}
 	}
 }
 </style>

+ 59 - 136
src/views/semantics_manage/summery/mixins/classifyTree.js

@@ -1,33 +1,26 @@
-import chartRelevanceApi from '@/api/modules/chartRelevanceApi.js';
-import { fittingEquationInterface,statisticFeatureInterface,crossVarietyInterface } from '@/api/modules/chartRelevanceApi';
 import { dataBaseInterface } from '@/api/api.js';
+import { aiSummeryInterface } from '@/api/modules/semanticsApi';
 
 export default {
   data() {
     return {};
   },
   watch: {
-    /* 设置动态右侧区域宽度 */
-    isSlideLeft(newval) {
-      this.$nextTick(() => {
-        this.reloadRightWid();
-      });
-    },
-    /* 图表id */
+    /* 选中id */
     select_id(newval) {
       if (newval) {
-        // this.currentLang = "ch";
-        this.getDetailHandle();
-      } else {
-        this.chartInfo = {};
-      }
-    },
+        let deep_arr = _.cloneDeep(this.treeData);
+        // 查找图表的分类父级id
 
-    select_classify(newval) {
-      if (this.$refs.chartListWrap) this.$refs.chartListWrap.$refs.listRef.scrollTop = 0;
-      if (newval) {
-        this.chart_page = 1;
-        // this.getPublicList();
+        // let arr = this.findParentNodeHandle(deep_arr,this.select_node)
+        //   .slice(1)
+        //   .reverse(); // 父的父的父-父的父-父
+        // this.defaultShowNodes = arr;
+        // this.$refs.treeRef.setCurrentKey(this.select_node);
+        
+        this.showSummertDetail = true;
+      } else {
+        this.summeryInfo = {};
       }
     },
 
@@ -35,15 +28,8 @@ export default {
     search_txt(newval) {
       if (newval) {
         let search_obj = this.searchOptions.find(
-          (_) => _.ChartInfoId === newval
+          (_) => _.AiSummaryId === 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);
         // 重置筛选状态
@@ -85,27 +71,27 @@ export default {
   },
 
   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;
+    /* 根据unicode展开树结构并选中 */
+    selectCurrentNode({ code, id, classifyId }) {
+      // 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.$refs.treeRef.setCurrentKey(this.select_node);
       // // 重置筛选状态
       this.select_id = id;
     },
 
     // 查找树节点所有父节点
-    findParentNodeHandle(arr, id) {
+    findParentNodeHandle(arr, code) {
       // 遍历取父级code push数组
       for (let i of arr) {
-        if (i.UniqueCode === id) {
+        if (i.UniqueCode === code) {
           return [i.UniqueCode];
         }
         if (i.Children) {
-          let node = this.findParentNodeHandle(i.Children, id);
+          let node = this.findParentNodeHandle(i.Children, code);
           if (node) {
             return node.concat(i.UniqueCode);
           }
@@ -113,87 +99,28 @@ export default {
       }
     },
 
-    /* 拖动时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
+      const isLastLevel=b.data.AiSummaryId?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;
+			let ClassifyId=0,AiSummaryId=0,PrevAiSummaryId=0,NextAiSummaryId=0;
 
-			ClassifyId=isLastLevel?0:b.data.ClassifyId
-			SummeryId=isLastLevel?b.data.SummeryId:0
+			ClassifyId=isLastLevel?0:b.data.AiSummaryClassifyId
+			AiSummaryId=isLastLevel?b.data.AiSummaryId:0
 			
 
 			if(i!=='inner'){
-				ParentClassifyId=a.parent.data.ClassifyId||0
+				ParentClassifyId=a.parent.data.AiSummaryClassifyId||0
 				list.forEach((item,index)=>{
 					if(isLastLevel){
-						if(item.data.SummeryId===b.data.SummeryId){
+						if(item.data.AiSummaryId===b.data.AiSummaryId){
 							targetIndex=index
 						}
 					}else{
-						if(item.data.ClassifyId===b.data.ClassifyId){
+						if(item.data.AiSummaryClassifyId===b.data.AiSummaryClassifyId){
 							targetIndex=index
 						}
 					}
@@ -203,44 +130,50 @@ export default {
 				
 				if(targetIndex===0){
 					const data=list[targetIndex+1].data
-					NextClassifyId=data.EdbCode?0:data.ClassifyId
-					NextSummeryId=data.EdbCode?data.SummeryId:0
+					NextClassifyId=data.AiSummaryId?0:data.AiSummaryClassifyId
+					NextAiSummaryId=data.AiSummaryId?data.AiSummaryId: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
+					PrevClassifyId=data.AiSummaryId?0:data.AiSummaryClassifyId
+					PrevAiSummaryId=data.AiSummaryId?data.AiSummaryId:0
 				}else{
 					const pData=list[targetIndex-1].data
-					PrevClassifyId=pData.EdbCode?0:pData.ClassifyId
+					PrevClassifyId=pData.AiSummaryId?0:pData.AiSummaryClassifyId
 
-					PrevSummeryId=pData.EdbCode?pData.SummeryId:0
+					PrevAiSummaryId=pData.AiSummaryId?pData.AiSummaryId:0
 
 					const nData=list[targetIndex+1].data
-					NextClassifyId=nData.EdbCode?0:nData.ClassifyId
-					NextSummeryId=nData.EdbCode?nData.SummeryId:0
+					NextClassifyId=nData.AiSummaryId?0:nData.AiSummaryClassifyId
+					NextAiSummaryId=nData.AiSummaryId?nData.AiSummaryId:0
 				}
 			}else{
-				ParentClassifyId=a.data.ClassifyId||0
+				ParentClassifyId=a.data.AiSummaryClassifyId||0
 			}
 
+			// const params={
+			// 	ClassifyId,
+			// 	ParentClassifyId,
+			// 	AiSummaryId,
+			// 	PrevClassifyId,
+			// 	NextClassifyId,
+			// 	PrevAiSummaryId,
+			// 	NextAiSummaryId
+			// }
 			const params={
-				ClassifyId,
+        AiSummaryClassifyId: ClassifyId,
+				AiSummaryId,
 				ParentClassifyId,
-				SummeryId,
-				PrevClassifyId,
-				NextClassifyId,
-				PrevSummeryId,
-				NextSummeryId
+        PrevId: AiSummaryId?PrevAiSummaryId:PrevClassifyId,
+        NextId: AiSummaryId?NextAiSummaryId:NextClassifyId,
+        PrevType: AiSummaryId?2:1,
+        NextType: AiSummaryId?2:1
 			}
-			dataBaseInterface.classifyMoveSort(params).then(res=>{
+			aiSummeryInterface.classifyMove(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();
-				}
 				
 			})
     },
@@ -248,7 +181,7 @@ export default {
     /* 拖拽覆盖添加背景色 */
     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') 
+      if(!node2.data.AiSummaryId&&(node1.level>node2.level||(node1.data.AiSummaryId>0&&!node2.data.AiSummaryId)) && (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') 
@@ -297,28 +230,18 @@ export default {
       let canDrop = false;
 
      // 拖动的是最小级
-			if(draggingNode.data.SummeryId){
+			if(draggingNode.data.AiSummaryId){
 				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')){
+				if((dropNode.level+1==draggingNode.level&&type==='inner'&&!dropNode.data.AiSummaryId)||(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;
-    },
   },
 };

+ 374 - 46
src/views/semantics_manage/summery/summeryEdit.vue

@@ -4,27 +4,81 @@
       <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>
+            <li :class="['tab-item',{'act':sourceForm.type===1}]" @click="tabClick(1)"><!-- 原文 -->{{$t('SemanticsManage.AiSummeryPage.source_tab1')}}</li>
+            <li :class="['tab-item',{'act':sourceForm.type===2}]" @click="tabClick(2)">
+              
+              <el-popover
+                placement="bottom"
+                trigger="click"
+                :disabled="sourceForm.type!==2"
+              >
+                <el-cascader-panel
+                  v-model="sourceForm.docId"
+                  :options="docOptions" 
+                  :props="{
+                    emitPath: false
+                  }"
+                  @change="selectDocument"
+                />
+                <span slot="reference" :class="{'editsty':sourceForm.type===2}"><!-- 文档库 -->{{$t('SemanticsManage.AiSummeryPage.source_tab2')}}</span>
+              </el-popover>
+            </li>
+            <li :class="['tab-item',{'act':sourceForm.type===3}]" @click="tabClick(3)">
+              
+              <div class="upload-row">
+                  <el-upload
+                  style="display: inline-block; margin-right: 8px"
+                  accept=".pptx,.pdf,.docx"
+                  action=""
+                  :http-request="handleUpload"
+                  :before-upload="handleBeforeUpload"
+                  :show-file-list="false"
+                  :disabled="isUploading">
+                      <!-- <img src="~@/assets/img/icons/ai-upload.png" /> -->
+                      <!-- 上传文件 -->{{$t('SemanticsManage.AiSummeryPage.source_tab3')}}
+                  </el-upload>
+              </div>
+            </li>
           </ul>
-          <span class="editsty"><!-- 重新选择 -->{{$t('SemanticsManage.AiSummeryPage.rechoose')}}</span>
+          <span class="editsty" @click="clearSelection"><!-- 重新选择 -->{{$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>
+          <template v-if="sourceForm.type===1">
+            <div class="title">
+              <label><!-- 标题 -->{{$t('SemanticsManage.AiSummeryPage.source_title')}}</label>
+              <el-input 
+                type="text" 
+                v-model="sourceForm.title" 
+                style="width:200px;"
+                placeholder="请输入标题"
+              />
+            </div>
+            <!-- 原文 -->
+            <Editor ref="sourceContRef"/>
+          </template>
+
+          <!-- 文档库 -->
+          <template v-else-if="sourceForm.type===2">
+            <div class="title">
+              <label><!-- 标题 -->{{$t('SemanticsManage.AiSummeryPage.source_title')}}</label>
+              <p>{{docInfo.Title}}</p>
+            </div>
+            <div class="document-html" v-if="docInfo.SectionList">
+              <p v-for="doc in docInfo.SectionList" :key="doc.SaDocSectionId">{{doc.innerText}}</p>
+            </div>
+          </template>
 
-          <Editor ref="sourceContRef"/>
+          <!-- 上传文件 -->
+          <template v-else-if="sourceForm.type===3">
+            <div class="title">
+              <label><!-- 标题 -->{{$t('SemanticsManage.AiSummeryPage.source_title')}}</label>
+              <p v-if="fileInfo.Id" @click="previewFileHandle(fileInfo.ResourceUrl)">
+                 <img :src="iconGetMap(fileInfo.ResourceUrl)" width="16" height="16"/>
+                {{fileInfo.ResourceName}}
+              </p>
+            </div>
+          </template>
         </div>
       </div>
 
@@ -37,7 +91,17 @@
                 placement="bottom"
                 trigger="click"
               >
-                <el-cascader-panel :options="ownPromptOpts" :props="promptOptProps"/>
+                <el-cascader-panel
+                  ref="myPromptRef" 
+                  v-model="promptForm.myPrompt"
+                  :options="myPromptOptions" 
+                  :props="{
+                    label: 'Title',
+                    value: 'AiPromptId',
+                    emitPath: false
+                  }"
+                  @change="selectPrompt($event,'mine')"
+                />
                 <span slot="reference" class="editsty"><!-- 我的提示词 -->{{$t('SemanticsManage.AiSummeryPage.my_prompt')}}</span>
               </el-popover>
               
@@ -45,7 +109,15 @@
                 placement="bottom"
                 trigger="click"
               >
-                <el-cascader-panel :options="publicPromptOpts" :props="promptOptProps"/>
+                <el-cascader-panel
+                  ref="publicPromptRef"
+                  v-model="promptForm.publicPrompt"
+                  :options="publicPromptOptions" 
+                  :props="{
+                    emitPath: false
+                  }"
+                  @change="selectPrompt($event,'public')"
+                />
                 <span slot="reference" class="editsty"><!-- 公共提示词 -->{{$t('SemanticsManage.AiSummeryPage.public_prompt')}}</span>
               </el-popover>
             </div>
@@ -70,10 +142,10 @@
         <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 type="primary" @click="handleSendMessage" :disabled="isSending">
+            <i class="el-icon-s-promotion" style="margin-right:5px;"/><!-- 发送 -->{{$t('SemanticsManage.AiSummeryPage.send_btn')}}
           </el-button>
-          <el-button type="primary" @click="handleSendMessage(true)"><!-- 新对话框中发送 -->{{$t('SemanticsManage.AiSummeryPage.new_send_btn')}}</el-button>
+          <el-button type="primary" @click="handleSendMessage(true)" :disabled="isSending"><!-- 新对话框中发送 -->{{$t('SemanticsManage.AiSummeryPage.new_send_btn')}}</el-button>
         </div>
       </div>
     </div>
@@ -82,16 +154,16 @@
       <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"/>
+          <el-input v-model="resultForm.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"
+            v-model="resultForm.classifyId"
             :options="classifyOptions"
             :props="{
               label: 'ClassifyName',
-              value: 'ClassifyId',
+              value: 'AiSummaryClassifyId',
               children: 'Children',
               checkStrictly: true,
               emitPath: false,
@@ -103,7 +175,7 @@
         </div>
       </div>
       <div class="create-cont">
-        <div v-html="resultData.content" class="result-text"></div>
+        <div v-html="resultForm.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>
@@ -113,6 +185,10 @@
   </div>
 </template>
 <script>
+import { aiSummeryInterface } from '@/api/modules/semanticsApi';
+import {documentInterface} from '@/api/modules/semanticsApi.js';
+import {aiQAInterence} from '@/api/modules/aiApi.js'; 
+import { formatFile } from '../utils/index';
 import Editor from './components/editor.vue'
 export default {
   components: { Editor },
@@ -127,7 +203,6 @@ export default {
   },
   data() {
     return {
-
       modelList:[
         {
             label:'GPT',
@@ -138,51 +213,288 @@ export default {
             key:'Kimi',
         },
       ],
+
       sourceForm: {
-        content: '',
+        docId: 0,
         title: '',
-        type: 1
+        type: 1,
+        fileId: '',
       },
+      docOptions:[],
+      docInfo: {},
+      fileInfo: {},//上传文件信息
+      fileTypeRule:new RegExp(/\.pdf|\.pptx|\.docx$/,'i'),
+      isUploading: false,
 
-      ownPromptOpts: [],//我的提示词库
-      publicPromptOpts: [],//公共提示词库
-      promptOptProps: {
-        label: '',
-        value: '',
-        children: 'Child',
-        emitPath: false
-      },
+      myPromptOptions: [],//我的提示词库
+      publicPromptOptions: [],//公共提示词库
       promptForm: {
+        myPrompt: 0,
+        publicPrompt: 0,
         content: '',
         model:'Kimi'
       },
 
       isSending: false,//发送中
 
-      resultData: {
+      chatTopicId: 0,
+
+      classifyOptions: [],
+      resultForm: {
         content: '',
         title: '',
-        classify: 0
+        classifyId: 0
       }
     }
   },
   mounted(){
-
+    this.getDocumentOptions();
+    this.getPublicPrompt();
+    this.getMyPrompt();
+    this.getClassify()
   },
   methods:{
 
-    /* 发送对话 */
-    handleSendMessage(openNew=false) {
-      if(this.isSending) return 
+    /* 获取文档库 */
+    async getDocumentOptions() {
+      const res = await documentInterface.getClassifyList()
+
+      if(res.Ret!==200) return 
+      this.docOptions = res.Data&&res.Data.map(_ =>{
+        return {
+          ..._,
+          label: _.ClassifyName,
+          value: _.SaDocClassifyId,
+          children: _.Children&&_.Children.map(sub_item =>({
+            ...sub_item,
+            label: sub_item.Title,
+            value: sub_item.SaDocId,
+          }))
+        }
+      })
+    },
+    
+    // 获取提示词
+    async getPublicPrompt() {
+      const publicRes = await aiSummeryInterface.getPublicPromptClassify()
+				if(publicRes.Ret !== 200) return
+				const publicData = publicRes.Data || []
+				this.publicPromptOptions = publicData.map(_ => {
+					return {
+						..._,
+						label: _.GroupName,
+						value: _.GroupId,
+						children: _.PromptList.map(childitem =>({
+							...childitem,
+							label: childitem.Title,
+							value: childitem.AiPromptId
+						})),
+					}
+				})
+    },
+
+    async getMyPrompt() {
+      const res = await aiSummeryInterface.getMyPromptClassify()
+				if(res.Ret !==200) return 
+				this.myPromptOptions = res.Data||[]
+    },
+
+    async getClassify() {
+      const res = await aiSummeryInterface.getSummeryAllClassify();
+      if(res.Ret !== 200) return
+
+      this.classifyOptions = res.Data.AllNodes;
+    },
+
+    selectPrompt(val,type='mine') {
+      let publicPromptArr = this.publicPromptOptions.map(_ => _.PromptList).flat(1)
+      
+      let promptItem = type==='public'
+        ? publicPromptArr.find(_ => _.AiPromptId===val)
+        : this.myPromptOptions.find(_ => _.AiPromptId===val)
+
+      if(promptItem) {
+        this.$refs.promptContRef.initData(promptItem.PromptContent)
+        this.promptForm.myPrompt = 0;
+        this.promptForm.publicPrompt = 0;
+      }
+    },
+
+    tabClick(type) {
+      if((this.$refs.sourceContRef&&this.$refs.sourceContRef.content) 
+        || this.fileInfo.Id 
+        || this.docInfo.SaDocId) return this.$message.warning('请先清除内容重新选择')
+      this.sourceForm.type = type;
+    },
+
+    clearSelection() {
+      this.sourceForm.docId = 0;
+      this.sourceForm.title = '';
+      this.sourceForm.fileId = '';
+      this.docInfo = {}
+      this.fileInfo = {}
+      this.chatTopicId = 0;
+      this.$refs.sourceContRef&&this.$refs.sourceContRef.initData('')
+    },
+
+    selectDocument(val) {
+      // console.log(val)
+      this.getDocDetail(val)
+    },
+
+    //获取文档详情
+    getDocDetail(SaDocId){
+
+      documentInterface.getDocumentDetail({
+        DocId:Number(SaDocId)
+      }).then(res=>{
+        if(res.Ret!==200) return 
+        this.docInfo = formatFile(res.Data)
+      })
+    },
+
+    handleBeforeUpload(e) {
+      if(!this.fileTypeRule.test(e.name)){
+          this.$message.error("上传文件格式只支持PDF、PPTX、DOCX");
+          return false;
+      }
+      if(!(e.size/1024/1024 < 50.1)){
+          this.$message.error("上传文件大小不超过50MB");
+          return false;
+      }
+    },
+    handleUpload(e){
+        let {file} = e;
+        this.isUploading = true;
+        let downloadHint = this.$message({
+            type:"info",
+            message:/* '上传中,请稍后······' */this.$t('ReportManage.CloudPage.upload_msg'),
+            duration:0,
+            iconClass:'el-icon-loading'
+        })
+        let formData = new FormData()
+        formData.append('File',file)
+        formData.append('AiChatTopicId',0)
+        formData.append('Model',this.promptForm.model)
+        aiQAInterence.fileUpload(formData).then(res=>{
+            downloadHint.close()
+            this.isUploading = false;
+
+            if(res.Ret !== 200) return
+              let Data = res.Data || {}
+              this.$message.success(`${Data.ResourceName}上传成功`)
+              this.chatTopicId = Data.AiChatTopicId;
+              this.sourceForm.fileId = Data.OpenaiFileId
+              this.fileInfo = Data;
+        }).catch(()=>{
+            downloadHint.close()
+            this.isUploading = false;
+        })
+    },
 
+    previewFileHandle(url) {
+       // 预览文件
+      let href;
+      if(url.endsWith('.doc') || url.endsWith('.docx')||url.endsWith('.ppt')||
+      url.endsWith('.pptx') || url.endsWith('.xls')||url.endsWith('.xlsx')){
+        //是否是 ppt、doc、xls
+        href = 'https://view.officeapps.live.com/op/view.aspx?src='+url
+      }else{
+        href=url
+      }
+      window.open(href, "_blank")
+    },
+
+    // 文件icon
+    iconGetMap(url) {
+      let fileUrl=url.toLocaleLowerCase()
+
+      if(fileUrl.endsWith('.pdf')){
+          return require('@/assets/img/cloudDisk/pdf_icon.png')
+      }else if(fileUrl.endsWith('.pptx')){
+          return require('@/assets/img/cloudDisk/ppt_icon.png')
+      }else if(fileUrl.endsWith('.doc') || fileUrl.endsWith('.docx')){
+          return require('@/assets/img/cloudDisk/word_icon.png')
+      }else{
+          return require('@/assets/img/cloudDisk/config_icon.png')
+      }
+    },
+
+    /* 发送对话 */
+    async handleSendMessage(openNew=false) {
       this.isSending = true;
+
+      let loading = this.$message({
+          type:"info",
+          message:'生成纪要中...',
+          duration:0,
+          iconClass:'el-icon-loading'
+      })
+
+      let OriginContent = this.sourceForm.type===1 
+        ? this.$refs.sourceContRef.content
+        : ''
+
+      let params = {
+        AiChatTopicId: openNew ? 0 : this.chatTopicId||0,
+        SaDocId: this.sourceForm.type===2?this.docInfo.SaDocId: 0,
+        OriginContent,
+        OpenaiFileId: this.sourceForm.type===3 ? [this.sourceForm.fileId] : [],
+        Prompt: this.$refs.promptContRef.content,
+        Model: this.promptForm.model
+      }
+
+      const res = await aiSummeryInterface.createAiSummery(params)
+      
+      loading.close();
+      this.isSending = false;
+      this.$message.success(res.Msg)
+      if(res.Ret !== 200) return
+
+      this.resultForm.content = res.Data.Answer;
+      this.chatTopicId = res.Data.AiChatTopicId;
     },
     
 
     /* 保存纪要 */
-    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'))
+   async saveSummeryHandle() {
+      if(!this.resultForm.content) return this.$message.warning('请先生成纪要')
+
+      if(this.sourceForm.type===1 && !this.sourceForm.title) return this.$message.warning('请输入原文标题')
+
+      if(!this.resultForm.title) return this.$message.warning(this.$t('SemanticsManage.AiSummeryPage.ph_search'))
+
+      if(!this.resultForm.classifyId) return this.$message.warning(/* '请选择纪要分类' */this.$t('SemanticsManage.AiSummeryPage.ph_classify'))
+
+      let OriginContent = this.sourceForm.type===1 
+        ? this.$refs.sourceContRef.content
+        : ''
+
+      let params = {
+        SaDocId: this.sourceForm.type===2 ? this.sourceForm.docId : 0,
+        OriginTitle: this.sourceForm.title,
+        OriginContent,
+        SummaryContent: this.resultForm.content,
+        ClassifyId: this.resultForm.classifyId,
+        Title: this.resultForm.title,
+        Prompt: this.$refs.promptContRef.content,
+        OpenaiFileName:this.sourceForm.type===3 ? this.fileInfo.ResourceName:'',
+        OpenaiFilePath:this.sourceForm.type===3 ? this.fileInfo.ResourceUrl:''
+      }
+      const res = await aiSummeryInterface.summerySave(params)
+
+      if(res.Ret !== 200) return
+      this.$message.success(res.Msg)
+
+      this.$router.replace({
+        path: '/aISummeryPage',
+        query: {
+          classifyId: res.Data.ParentId,
+          code: res.Data.UniqueCode,
+          id: res.Data.AiSummaryId
+        }
+      })
+
 
     },
   },
@@ -221,6 +533,16 @@ export default {
       
       .title {
         margin-bottom: 10px;
+        display: flex;
+        font-size: 16px;
+        align-items: center;
+        label { margin-right: 20px; }
+      }
+
+      .document-html {
+        padding: 20px 0;
+        height: 400px;
+        overflow-y: auto;
       }
     }
   }
@@ -252,7 +574,9 @@ export default {
       padding: 20px;
     }
     .result-text {
-      min-height: 300px;
+      height: 250px;
+      overflow-y: auto;
+      margin-bottom: 10px;
     }
     .bottom {
       display: flex;
@@ -262,5 +586,9 @@ export default {
       }
     }
   }
+
+  #froala-editor-documentContent {
+    display: none !important;
+  }
 }
 </style>