Procházet zdrojové kódy

查新检索所有代码修改

zhuliu před 11 měsíci
rodič
revize
a51d350229
39 změnil soubory, kde provedl 1891 přidání a 425 odebrání
  1. 68 0
      public/reportTemplate/noveltyCommon/noveltyCommon.css
  2. 282 0
      public/reportTemplate/noveltyCommon/noveltyCommon.txt
  3. 62 2
      src/api/newApi/noveltySearch.js
  4. 5 0
      src/assets/css/main.scss
  5. 1 1
      src/router/index.js
  6. 4 0
      src/store/modules/highlight.js
  7. 5 2
      src/utils/common.js
  8. 149 66
      src/views/components/dialog/menuDialog/noveltySearchContrast.vue
  9. 7 1
      src/views/components/import/PatentNoImport/index.vue
  10. 13 4
      src/views/components/import/conditionImport/searchResult.vue
  11. 7 1
      src/views/components/import/excelImport/index.vue
  12. 39 25
      src/views/layout/components/contextMenu.vue
  13. 30 66
      src/views/noveltySearch/components/details/components/contrastFile/contrastFile.vue
  14. 73 0
      src/views/noveltySearch/components/details/components/contrastFile/mixins.js
  15. 72 76
      src/views/noveltySearch/components/details/components/contrastRecords/contrastRecords.vue
  16. 111 0
      src/views/noveltySearch/components/details/components/searchRecords/dialog/addAndEditSearchRecords.vue
  17. 0 0
      src/views/noveltySearch/components/details/components/searchRecords/index.vue
  18. 260 0
      src/views/noveltySearch/components/details/components/searchRecords/searchRecords.vue
  19. 8 4
      src/views/noveltySearch/components/details/components/signMessage/signMessage.vue
  20. 5 4
      src/views/noveltySearch/components/details/details.vue
  21. 10 5
      src/views/noveltySearch/components/details/index.vue
  22. 26 37
      src/views/noveltySearch/components/dialog/inventionPoint/inventionPoint.vue
  23. 17 5
      src/views/noveltySearch/components/dialog/reportTemplate/reportTemplateDialog.vue
  24. 99 9
      src/views/noveltySearch/components/exportReport/components/common.vue
  25. 109 17
      src/views/noveltySearch/components/exportReport/components/mixins.js
  26. 181 21
      src/views/noveltySearch/components/exportReport/exportReport.vue
  27. 5 2
      src/views/noveltySearch/components/exportReport/index.vue
  28. 9 3
      src/views/noveltySearch/components/exportReport/mixins/index.js
  29. 10 9
      src/views/noveltySearch/components/noveltySearchCard.vue
  30. 5 2
      src/views/noveltySearch/components/reuseResults/index.vue
  31. 47 22
      src/views/noveltySearch/components/reuseResults/reuseResults.vue
  32. 7 5
      src/views/project/patentCollection/components/dialog/addRemark.vue
  33. 41 5
      src/views/project/patentCollection/components/mixins/index.js
  34. 2 1
      src/views/project/patentCollection/components/views/Abstract.vue
  35. 8 5
      src/views/project/patentDetails/components/patentDetails.vue
  36. 2 0
      src/views/project/patentDetails/components/patentMessage/mixins/index.js
  37. 57 6
      src/views/project/patentDetails/index.vue
  38. 3 1
      src/views/report/analysisAndOpinion/components/searchRecords/dialog/addAndEditSearchRecords.vue
  39. 52 18
      src/views/report/components/reportFile/reportFileTable.vue

+ 68 - 0
public/reportTemplate/noveltyCommon/noveltyCommon.css

@@ -0,0 +1,68 @@
+.common{
+        width: 800px;
+        margin: 0px auto;
+        padding: 20px 0;
+    }
+    .reportTitle{
+        font-size: 38px;
+        text-align: center;
+    }
+    
+    table, th, td {
+        border: 1px solid black;
+        border-collapse: collapse; /* 移除单元格之间的间隔 */
+    }
+    table{
+        border: 2px solid black;
+        width: 100%;
+        
+        
+    }
+    table td{
+        padding: 8px;
+        height: 22.5px;
+    }
+    .applicationMessage tr>td:first-child{
+        width: 200px;
+    }
+    .searchRecord{
+        width: 100%;
+        
+    }
+    .searchRecord tr>td:nth-child(1){
+        width: 100px;
+    }
+    .searchRecord tr>td:nth-child(2){
+        width: 130px;
+    }
+    .searchRecord tr>td:nth-child(4){
+        width: 130px;
+    }
+    .mainContent{
+        margin-top: 50px;
+        
+    }
+    .mainContent .title{
+        font-size: 22px;
+        font-weight: bold;
+        padding: 8px;
+    }
+    .mainContent .content{
+        min-height: 50px;
+    }
+    .result{
+        border: 2px solid black;
+    }
+    .mainContent1{
+        border-bottom: 1px solid black;
+        padding: 5px;
+    }
+    .funBtn{
+        position:absolute;
+        width: 100px;
+        right: -110px;
+        display: flex;
+    }
+    .mainContent1:last-child{
+        border-bottom:none
+    }

+ 282 - 0
public/reportTemplate/noveltyCommon/noveltyCommon.txt

@@ -0,0 +1,282 @@
+<div class="common">
+    <div class="reportTitle">
+        查新检索报告
+    </div>
+    <div class="mainContent">
+        <div class="title">一、专利性检索结论:</div>
+        <div class="content" v-html="getColumnData('baseMessage','finalConclusions',setValue([{value:dataObj.baseMessage.preliminaryConclusions},{value:'因此建议'} ,{value:dataObj.baseMessage.applicationAdvice}]))"></div>
+    </div>
+    <div class="mainContent">
+        <div class="title">二. 专利申请信息</div>
+        <div class="content">
+            <table class="applicationMessage">
+                <tr>
+                    <td>申请单位</td>
+                    <td @dblclick="edit('baseMessage','applicants')">
+                        <div v-if="isEdit('baseMessage','applicants')">
+                            <myRichText v-model="reportData.baseMessage.applicants" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','applicants',dataObj.baseMessage.applicants)"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>检索单位</td>
+                    <td @dblclick="edit('baseMessage','searchUnit')">
+                        <div v-if="isEdit('baseMessage','searchUnit')">
+                            <myRichText v-model="reportData.baseMessage.searchUnit" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','searchUnit',dataObj.baseMessage.searchUnit)"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>检索日期</td>
+                    <td @dblclick="edit('baseMessage','searchTime')">
+                        <div v-if="isEdit('baseMessage','searchTime')">
+                            <myRichText v-model="reportData.baseMessage.searchTime" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','searchTime',dataObj.baseMessage.searchTime)"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>检索人及联系方式</td>
+                    <td @dblclick="edit('baseMessage','searchUnitContact')">
+                        <div v-if="isEdit('baseMessage','searchUnitContact')">
+                            <myRichText v-model="reportData.baseMessage.searchUnitContact" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','searchUnitContact',(dataObj.baseMessage.headName || '') + ' ' + (dataObj.baseMessage.searchUnitContact || ''))"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>申请名称</td>
+                    <td @dblclick="edit('baseMessage','caseName')">
+                        <div v-if="isEdit('baseMessage','caseName')">
+                            <myRichText v-model="reportData.baseMessage.caseName" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','caseName',dataObj.baseMessage.caseName)"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>发明人</td>
+                    <td @dblclick="edit('baseMessage','inventor')">
+                        <div v-if="isEdit('baseMessage','inventor')">
+                            <myRichText v-model="reportData.baseMessage.inventor" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','inventor',dataObj.baseMessage.inventor)"></div>
+                    </td>
+                </tr>
+                <tr>
+                    <td>发明人联系方式</td>
+                    <td @dblclick="edit('baseMessage','inventorContact')">
+                        <div v-if="isEdit('baseMessage','inventorContact')">
+                            <myRichText v-model="reportData.baseMessage.inventorContact" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','inventorContact',dataObj.baseMessage.inventorContact)"></div>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+    <div class="mainContent">
+        <div class="title">三. 检索记录表</div>
+        <div class="content">
+            <table class="searchRecord">
+                <tr>
+                    <td>地区</td>
+                    <td>数据库</td>
+                    <td>关键词</td>
+                    <td>数量</td>
+                </tr>
+                <tr style="position: relative;" v-for="(item,index) in getColumnData('searchRecord',null,(dataObj.searchRecord && dataObj.searchRecord.length>0)?dataObj.searchRecord.map(item2=>{return {conditions:item2.conditions,totalNum:item2.totalNum}}): [{}])" :key="index">
+                    
+                    <td @dblclick="edit('searchRecord','area',index)">
+                        <div v-if="isEdit('searchRecord','area',index)">
+                            <myRichText v-model="item.area" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.area"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','dbType',index)">
+                        <div v-if="isEdit('searchRecord','dbType',index)">
+                            <myRichText v-model="item.dbType" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.dbType"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','conditions',index)">
+                        <div v-if="isEdit('searchRecord','conditions',index)">
+                            <myRichText v-model="item.conditions" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.conditions"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','totalNum',index)">
+                        <div v-if="isEdit('searchRecord','totalNum',index)">
+                            <myRichText v-model="item.totalNum" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.totalNum"></div>
+                    </td>
+                    <span class="funBtn">
+                        <el-button type="" size="mini" icon="el-icon-plus" circle @click="addCompareRecord(reportData.searchRecord,index)"></el-button>
+                        <el-button v-if="reportData.searchRecord.length>1" size="mini" type="danger" icon="el-icon-delete" circle @click="delCompareRecord(reportData.searchRecord,index)"></el-button>
+                    </span>
+                </tr>
+            </table>
+        </div>
+    </div>
+    <div class="mainContent">
+        <div class="title">四.最相关对比文件及专利性评估</div>
+        <div class="content result">
+            <div class="mainContent1">
+                <div class="title1">本提案思路</div>
+                <div>
+                    <div class="title1">附图:</div>
+                    <div class="content" style="display:flex;">
+                        <div style="width:150px;height:180px;margin-right:10px" v-for="(item,index) in getColumnData('technicalCase','picture',dataObj.technicalCase.systemFileList?dataObj.technicalCase.systemFileList.map(pic=>pic.guid) : [])" :key="index">
+                            <div style="height:30px;line-height:30px;display:flex;justify-content:flex-end;">
+                                <el-button type="text" size="small" @click="delImage(reportData.technicalCase.picture,item,index)">删除</el-button>
+                            </div>
+                            <div style="width:150px;height:148px;border:1px dashed #c0ccda;border-radius: 6px;">
+                                <el-image style="width:100%;height:100%" :src="$commonJS.checkViewer(item)" :preview-src-list="reportData.technicalCase.picture.map(pic=>$commonJS.checkViewer(item))" fit="contain"></el-image>
+                            </div>
+                        </div>
+                        <el-upload style="margin-right:10px;margin-top: 30px;" ref="upload" action="#" :auto-upload="false" multiple :on-change="(file, fileList)=>handleChange(reportData.technicalCase.picture,file, fileList)" list-type="picture-card" :show-file-list="false">
+                            <span>
+                                <i class="el-icon-plus avatar-uploader-icon"></i>
+                            </span>
+                        </el-upload>
+                    </div>
+                </div>
+                <div @dblclick="edit('technicalCase','inventionPoint')">
+                    <div class="title1">方案要点:</div>
+                    <div class="content" >
+                        <div v-if="isEdit('technicalCase','inventionPoint')">
+                            <myRichText v-model="reportData.technicalCase.inventionPoint" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('technicalCase','inventionPoint',dataObj.technicalCase.inventionPoint)"></div>
+                    </div>
+                </div>
+            </div>
+            <!-- 循环对比记录 -->
+            <div class="mainContent1" style="position: relative;" v-for="(item,index) in getCompareRecordData([
+            {
+                field:'patentMessage.applicant',
+                function:(data)=>{
+                    if(data.patentMessage.applicant && data.patentMessage.applicant.length>0){
+                        return data.patentMessage.applicant.join('、')
+                    }
+                    return ''
+                },
+                type:'function',
+                key:'applicant'
+            },
+            {
+                field:'patentMessage.publicNo',
+                type:'string',
+                key:'publicNo'
+            },
+            {
+                field:'content',
+                function:(data)=>{
+                    var str = ''
+                    var const = 1
+                    if(data.noveltyCompareRecordVOS){
+                        data.noveltyCompareRecordVOS.forEach((item,index) => {
+                            str = `${str}${const}、${item.markNoteText}<br>`
+                            const += 1
+                        });
+                    }
+                    if(data.data && data.data.length>0){
+                        data.data.forEach((item,index) => {
+                            str = `${str}${const}、${item.markSelectField}“${item.markSelectText}”揭示了“${item.technicalFeature}”${item.markNoteText}<br>`
+                            const += 1
+                        });
+                    }
+                    return str
+                },
+                type:'function',
+                key:'content'
+            }
+        ],['patentMessage','noveltyRemark'])" :key="index">
+            <div class="funBtn">
+                <el-button type="" icon="el-icon-plus" circle @click="addCompareRecord(reportData.compareRecord,index)"></el-button>
+                <el-button v-if="reportData.compareRecord.length>1" type="danger" icon="el-icon-delete" circle @click="delCompareRecord(reportData.compareRecord,index)"></el-button>
+            </div>
+                <div>
+                    <div>对比文件{{index+1}}(
+                        <span @dblclick="edit('compareRecord','applicant',index)">
+                            <span v-if="isEdit('compareRecord','applicant',index)">
+                                <el-input v-model="item.applicant" :autofocus="true" class="input_border_none" style="width:150px;border:none"  @blur="()=>saveMessage(item.applicant)"></el-input>
+                            </span>
+                            <span v-else>{{item.applicant||'申请人'}}</span>
+                        </span>
+                        ,
+                        <span @dblclick="edit('compareRecord','publicNo',index)">
+                            <span v-if="isEdit('compareRecord','publicNo',index)">
+                                <el-input v-model="item.publicNo" :autofocus="true" class="input_border_none" style="width:150px;border:none"  @blur="()=>saveMessage(item.publicNo)"></el-input>
+                            </span>
+                            <span v-else>{{item.publicNo||'公开号'}}</span>
+                        </span>
+                        )</div>
+                    <div class="title1">对比文件所公开的与本案有关的内容:</div>
+                    <div class="content" @dblclick="edit('compareRecord','content',index)">
+                        <div v-if="isEdit('compareRecord','content',index)">
+                            <myRichText v-model="item.content" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.content"></div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="mainContent1">
+                <div>分析与结论</div>
+                <div  @dblclick="edit('baseMessage','distinguishTechnical')">
+                    <div class="title1">本方案与对比文件的区别技术特征:</div>
+                    <div class="content">
+                        <div v-if="isEdit('baseMessage','distinguishTechnical')">
+                            <myRichText v-model="reportData.baseMessage.distinguishTechnical" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','distinguishTechnical')"></div>
+                    </div>
+                </div>
+                <div @dblclick="edit('baseMessage','analyse')">
+                    <div class="title1">分析:</div>
+                    <div class="content">
+                        <div v-if="isEdit('baseMessage','analyse')">
+                            <myRichText v-model="reportData.baseMessage.analyse" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','analyse')"></div>
+                    </div>
+                </div>
+                <div @dblclick="edit('baseMessage','preliminaryConclusions')">
+                    <div class="title1">结论:</div>
+                    <div class="content">
+                        <div v-if="isEdit('baseMessage','preliminaryConclusions')">
+                            <myRichText v-model="reportData.baseMessage.preliminaryConclusions" customStyle="border:none" :autoFocus="true" @blur="(value)=>saveMessage(value,(value)=>{this.reportData.baseMessage.finalConclusions = setValue([{value:value},{value:'因此建议'} ,{value:reportData.baseMessage.applicationAdvice}])})"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','preliminaryConclusions',dataObj.baseMessage.preliminaryConclusions)"></div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="mainContent1" @dblclick="edit('baseMessage','applicationAdvice')">
+                <div>
+                    <div class="title1">建议:</div>
+                    <div class="content">
+                        <div v-if="isEdit('baseMessage','applicationAdvice')">
+                            <myRichText v-model="reportData.baseMessage.applicationAdvice" customStyle="border:none" :autoFocus="true" @blur="(value)=>saveMessage(value,(value)=>{this.reportData.baseMessage.finalConclusions = setValue([{value:reportData.baseMessage.preliminaryConclusions},{value:'因此建议'} ,{value:value}])})"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','applicationAdvice',dataObj.baseMessage.applicationAdvice)"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="mainContent1" @dblclick="edit('baseMessage','remark')">
+                <div>
+                    <div class="title1">备注:</div>
+                    <div class="content">
+                        <div v-if="isEdit('baseMessage','remark')">
+                            <myRichText v-model="reportData.baseMessage.remark" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="getColumnData('baseMessage','remark')"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+  </div>

+ 62 - 2
src/api/newApi/noveltySearch.js

@@ -29,12 +29,16 @@ export default {
 
     //查询查新报告对比专利
     queryComparePatent(data){
-        return axios.post('/xiaoshi/noveltyProject/queryComparePatent', data)
+        return axios.post('/xiaoshi/noveltyProject/queryNoveltyCompareLiterature', data)
     },
     //修改查新报告对比专利内容
     editCompareFile(data){
         return axios.post('/xiaoshi/noveltyProject/editCompareFile', data)
     },
+    //修改查新报告对比专利单个栏位数据
+    editCompareFileByProjectId(data){
+        return axios.post('/xiaoshi/noveltyProject/editCompareFileByProjectId', data)
+    },
     //删除对比文件
     delCompareFile(data){
         return axios.post('/xiaoshi/noveltyProject/delCompareFile', data)
@@ -53,6 +57,62 @@ export default {
     },
     //查询对比记录
     queryNoveltyCompareRecord(data){
-        return axios.post('/xiaoshi/noveltyCompareRecord/query', data)
+        return axios.post('/xiaoshi/noveltyCompareRecord/queryCompareRecord', data)
+    },
+    //删除对比记录
+    removeNoveltyCompareRecord(data){
+        return axios.post('/xiaoshi/noveltyCompareRecord/remove', data)
+    },
+
+
+    //检索记录
+    //添加检索记录
+    addNoveltySearchRecord(data){
+        return axios.post('/xiaoshi/noveltyProject/addSearchRecord', data)
+    },
+    //编辑检索记录
+    updateNoveltySearchRecord(data){
+        return axios.post('/xiaoshi/noveltyProject/updateSearchRecord', data)
+    },
+    //查询检索记录
+    queryNoveltySearchRecord(data){
+        return axios.post('/xiaoshi/noveltyProject/querySearchRecord', data)
+    },
+    //删除检索记录
+    deleteNoveltySearchRecord(data){
+        return axios.post('/xiaoshi/noveltyProject/deleteSearchRecord', data)
+    },
+
+    //根据发明点查询相似技术方案
+    querySimilarInventionPoint(data){
+        return axios.post('/xiaoshi/noveltyProject/querySimilarInventionPoint', data)
+    },
+
+    //查询查新检索报告模版
+    queryNoveltyTemplate(data){
+        return axios.post('/xiaoshi/noveltyProject/queryTemplate', data)
+    },
+
+    //报告文档
+    //生成查新检索报告文档
+    exportNoveltyReport(params){
+        return axios.get('/xiaoshi/noveltyReportReference/export', {params})
+    },
+    //删除查新检索报告文档
+    deleteNoveltyReport(data){
+        return axios.post('/xiaoshi/noveltyReportReference/delete', data)
+    },
+    //查询查新检索报告文档
+    queryNoveltyReport(data){
+        return axios.post('/xiaoshi/noveltyReportReference/query', data)
+    },
+    //保存查新检索报告文档数据
+    editNoveltyReport(data){
+        return axios.post('/xiaoshi/noveltyReportReference/edit', data)
+    },
+
+    //复用查新检索报告结果
+    copyNoveltyMessage(data){
+        return axios.post('/xiaoshi/noveltyProject/copyMessage', data)
     },
 };

+ 5 - 0
src/assets/css/main.scss

@@ -5,6 +5,11 @@
   cursor:pointer;
   border-bottom:1px solid red ;
 }
+.input_border_none{
+  .el-input__inner{
+    border: none !important;
+  }
+}
 
 @keyframes shake {
   0% { transform: translateX(0); }

+ 1 - 1
src/router/index.js

@@ -485,7 +485,7 @@ const routes = [
             },
             component: () => import('@/views/noveltySearch/components/details/components/contrastFile/index.vue'),
           },
-          // 对比文件
+          // 导出报告
           {
             path: '/exportReport',
             name: 'exportReport',

+ 4 - 0
src/store/modules/highlight.js

@@ -3,10 +3,14 @@ export default {
     contrastList: [],
     piZhuContrastList: [],
     opinionContrastList: [],
+    NoveltySearchContrastList:[],
     patentHightLight:{}
   },
 
   mutations: {
+    SET_PATENT_NoveltySearchContrastList: (state, NoveltySearchContrastList) => {
+      state.NoveltySearchContrastList = NoveltySearchContrastList;
+    },
     SET_PATENT_OPINION_CONTRAST: (state, opinionContrastList) => {
       state.opinionContrastList = opinionContrastList;
     },

+ 5 - 2
src/utils/common.js

@@ -305,7 +305,7 @@ treeToArray(data,prop={children:children}){
    */
   getColumnData(row, field, prop, data) {
     if(field.type == 'function'){
-      return field.field(row)
+      return field.function(row)
     }
     var text = this.getDataByField(row,field.value || field.field)
     
@@ -353,7 +353,7 @@ treeToArray(data,prop={children:children}){
       if (text == '0') {
         return '0'
       }
-      return text || '--'
+      return text || ''
     }
   },
    /**
@@ -550,6 +550,9 @@ treeToArray(data,prop={children:children}){
       ...params
     }
     if(data){
+      if(data.type){
+        data.type += ''
+      }
       query.importData = JSON.stringify(data)
     }
     router.push(

+ 149 - 66
src/views/components/dialog/menuDialog/noveltySearchContrast.vue

@@ -1,42 +1,45 @@
 <template>
     <div>
       <el-dialog :title="title" v-draggable :visible.sync="visible" width="1000px" custom-class="checkFile" :before-close="close" :modal="false" :close-on-click-modal="false" :modal-append-to-body="false">
-          <el-form :model="form" ref="form" label-width="100px" label-position="left">
+          <el-form :model="form" ref="form" label-width="120px" label-position="left">
             <el-form-item label="选中文本" class="item">
-                <el-input v-model="form.evidenceText" readonly="true" placeholder="请输入" type="textarea" show-word-limit></el-input>
+                <el-input v-model="form.markSelectText" :readonly="true" placeholder="请输入" type="textarea" show-word-limit></el-input>
             </el-form-item>
             <el-form-item label="位置/附图号" class="item">
-                <el-input v-model="form.fieldName" placeholder="请输入备注" show-word-limit></el-input>
+                <el-input v-model="form.markSelectField" placeholder="请输入备注" show-word-limit></el-input>
             </el-form-item>
             <el-form-item label="标的类型" class="item">
-                <el-radio-group v-model="radio">
+                <el-radio-group v-model="form.targetType" @input="changeTargetType">
                     <el-radio :label="1">代表图</el-radio>
                     <el-radio :label="2">技术特征</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="代表图" class="item">
+            <el-form-item label="代表图" class="item" v-if="form.targetType == 1">
                 <el-upload ref="upload" action="#" :auto-upload="false" :on-change="change" list-type="picture" :show-file-list="false">
                         <span style="display:flex;flex-direction:row;flex-wrap:wrap;">
-                            <span class="avatar" v-if="form.fileGuid"
-                                style="margin-left:10px">
-                                <span class="deleteImg">
-                                <span>
-                                    <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview()"></i>
-                                    <i class="el-icon-delete" @click.stop="handleRemove()"></i>
+                            <template v-if="form.pictureUrl && form.pictureUrl.length>0">
+                                <span class="avatar"  v-for="(picture,index) in form.pictureUrl" :key="picture"
+                                    style="margin-left:10px">
+                                    <span class="deleteImg">
+                                    <span>
+                                        <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview(index)"></i>
+                                        <i class="el-icon-delete" @click.stop="handleRemove(index)"></i>
+                                    </span>
+                                    </span>
+                                    <el-image fit="contain" ref="image" class="img"  :src="$commonJS.checkViewer(picture)" :preview-src-list="form.pictureUrl.map(item=>$commonJS.checkViewer(form.fileGuid))"></el-image>
                                 </span>
-                                </span>
-                                <el-image fit="contain" ref="image" class="img" :src="$commonJS.checkViewer(form.fileGuid)" :preview-src-list="[$commonJS.checkViewer(form.fileGuid)]"></el-image>
-                            </span>
+                            </template>
+                            
                             <i class="el-icon-plus avatar-uploader-icon" v-if="!form.fileGuid"></i>
                         </span>
                     </el-upload>
             </el-form-item>
             <el-form-item label="技术特征内容" class="item">
-                <el-input v-model="form.common" placeholder="请输入技术特征内容" show-word-limit></el-input>
+                <el-input v-model="form.technicalFeature" placeholder="请输入技术特征内容" show-word-limit></el-input>
             </el-form-item>
             
             <el-form-item label="对比说明" class="item">
-                <el-input v-model="form.common" placeholder="请输入对比说明" show-word-limit></el-input>
+                <el-input v-model="form.markNoteText" placeholder="请输入对比说明" show-word-limit></el-input>
             </el-form-item>
           </el-form>
 
@@ -60,12 +63,17 @@
           form:{},
           title:'查新对比',
           visible:false,
-          btnLoading:false
+          btnLoading:false,
+          technicalCase:{}
       };
     },
     watch: {},
     computed: {
       ...mapGetters(["contextMenu",'highlight']),
+      // 批注相关信息
+      NoveltySearchContrastList() {
+        return this.$store.state.highlight.NoveltySearchContrastList
+      },
     },
     created() {},
     mounted() {
@@ -73,59 +81,122 @@
     methods: {
       open(){
           this.getData()
+          this.getTechnicalCase()
           this.visible = true
       },
       close(){
-          this.checkData = []
-          this.checkFeatures = []
           this.visible = false
       },
- 
+      //获取技术方案信息
+      getTechnicalCase(){
+        if(!this.form.projectId){
+            return
+        }
+        var params = {
+            projectId:this.form.projectId
+        }
+        this.$api.queryTechnicalCase(params).then(response=>{
+            if(response.code == 200){
+                this.technicalCase = response.data || {}
+                if(!this.technicalCase.systemFileList){
+                    this.$set(this.technicalCase,'systemFileList',[])
+                }
+            }
+        }).catch(error=>{
+            this.technicalCase={
+                systemFileList:[],
+            }
+        })
+      },
+      //保存
+      saveTechnicalCase(){
+            if(!this.form.projectId){
+                return
+            }
+            this.technicalCase.projectId = this.form.projectId
+            this.technicalCase.fileGuids = this.form.pictureUrl
+            this.$api.addOrUpdateTechnicalCase(this.technicalCase).then(response=>{
+                if(response.code == 200){
+                    this.getTechnicalCase()
+                }
+            }).catch(error=>{
+            })
+        
+        },
+      changeTargetType(val){
+        if(this.form.targetType == 1){
+            if(this.form.pictureUrl && this.form.pictureUrl.length>0){
+                return
+            }
+            var data = this.technicalCase.systemFileList.map(item=>{
+                return item.guid
+            })
+            this.$set(this.form,'pictureUrl',data)
+        }
+      },
       getData(){
           var mark = this.contextMenu.mark
           this.form = {
-              literatureId:mark.literatureId,
-              fieldName:mark.column,
-              position:mark.position,
-              markType:mark.markType,
-              markColor:mark.markColor,
-              evidenceText:mark.text,
-              id:mark.id,
-              common:mark.common,
-              fileGuid:mark.fileGuid
-          }
-          this.form.patentNo = mark.signPatentNo
-          this.form.projectId = mark.projectId
+            Id: mark.Id,
+            id: mark.id,//已添加数据的id
+            patentNo: mark.patentNo,//专利号
+            markColor: mark.markColor,//标注颜色
+            markNoteText: mark.markNoteText,//标注备注
+            markType: mark.markType,//标注方式(波浪线)
+            markSelectField: mark.id ? mark.markSelectField : mark.column,//标注栏位
+            markSelectText: mark.id ? mark.markSelectText : mark.text,//标注文本
+            markSite: mark.id ? mark.markSite : mark.position,//选中文本的起始位置
+            projectId: mark.projectId,//项目id
+            patentTitle:mark.patentTitle,//当前专利标题
+            retrieveRecordId:mark.retrieveRecordId,
+            targetType:mark.targetType || 2,
+            technicalFeature:mark.technicalFeature || '',
+            pictureUrl:mark.pictureUrl || [],
+        }
       },
       submit(){
-          if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
-              this.$showPermissionDialog()
-              return false
+        //   if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
+        //       this.$showPermissionDialog()
+        //       return false
+        //   }
+          var message = {
+            type:1,
+            success:'添加成功',
+            error:'添加失败'
           }
-      },
-
-      changeHighlight(id,type){
-          var contrastList = this.highlight.contrastList
-          var message = ''
           if(this.form.id){
-              var index = contrastList.findIndex(item=>{
-                  return item.id == this.form.id
-              })
-              if(type){
-                  message = '删除成功'
-                  contrastList.splice(index,1)
-              }else{
-                  message = '更新成功'
-                  contrastList.splice(index,1,this.form)
-              }
-          }else{
-              message = '新增成功'
-              this.form.id = id
-              contrastList.push(this.form)
+            message = {
+                type:2,
+                success:'编辑成功',
+                error:'编辑失败'
+            }
           }
-          this.$message.success(message)
-          this.$store.commit("SET_PATENT_CONTRAST",contrastList)
+          this.btnLoading = true
+          this.$api.editNoveltyCompareRecord(this.form).then(response=>{
+            if(response.code == 200){
+                this.$message.success(message.success)
+                this.saveTechnicalCase()
+                this.btnLoading = false
+                var NoveltySearchContrastList = this.NoveltySearchContrastList
+                this.form.id = response.data
+                if(message.type == 1){
+                    NoveltySearchContrastList.push(this.form)
+                    this.$store.commit('SET_PATENT_NoveltySearchContrastList', NoveltySearchContrastList)
+                }else{
+                    let index = this.NoveltySearchContrastList.findIndex(item => {
+                        return item.id == this.form.id
+                    })
+                    if (index != -1) {
+                        this.NoveltySearchContrastList.splice(index, 1, this.form)
+                    }
+                }
+                this.close()
+            }
+          }).catch(error=>{
+            this.btnLoading = false
+          })
       },
+
       //文件上传
       change(file,fileList){
           let formData = new FormData()
@@ -133,30 +204,42 @@
           formData.append('files',file.raw)
           this.$api.uploadFile(formData).then(response=>{
               if(response.code == 200){
-                  this.$set(this.form,'fileGuid',response.data[0])
+                var guid = response.data[0]
+                this.form.pictureUrl.push(guid)
+                //   this.$set(this.form,'fileGuid',response.data[0])
               }
           })
       },
-      handleRemove() {
-          this.$set(this.form,'fileGuid','')
+      handleRemove(index) {
+        this.form.pictureUrl.splice(index,1)
       },
       handlePictureCardPreview() {
           this.$refs.image.showViewer = true
       },
       delContrast(){
-          if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
-              this.$showPermissionDialog()
-              return false
+        //   if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
+        //       this.$showPermissionDialog()
+        //       return false
+        //   }
+          var params = {
+            ids:[this.form.id]
           }
-          var ids = [this.form.id]
           this.$confirm('确认删除该数据吗?', '提示', {
               confirmButtonText: '确定',
               cancelButtonText: '取消',
               type: 'warning'
           }).then(() => {
-              this.$api.removeCompareRecord(ids).then(response => {
-                  this.changeHighlight(this.form.id,'删除')
-                  this.close()
+              this.$api.removeNoveltyCompareRecord(params).then(response => {
+                if(response.code == 200){
+                    let index = this.NoveltySearchContrastList.findIndex(item => {
+                        return item.id == this.form.id
+                    })
+                    if (index != -1) {
+                        this.NoveltySearchContrastList.splice(index, 1)
+                    }
+                    this.$message.success('删除成功')
+                    this.close()
+                }
               }).catch(error => {
               })
           })

+ 7 - 1
src/views/components/import/PatentNoImport/index.vue

@@ -17,7 +17,13 @@ export default {
   },
   computed: {
     importData() {
-      return this.$route.query
+      var data = this.$route.query.importData
+      if(data){
+        data = JSON.parse(data)
+      }else{
+        data = {}
+      }
+      return data
     }
   },
   mounted() {

+ 13 - 4
src/views/components/import/conditionImport/searchResult.vue

@@ -89,7 +89,7 @@
       </span>
     </el-dialog>
     <addAndEditSearchRecords ref="addAndEditSearchRecords" :projectId="condition.importToId"></addAndEditSearchRecords>
-    <inventionPointDialog v-if="noveltySearch" :contrastFileList="saveRemarkList"></inventionPointDialog>
+    <inventionPointDialog v-if="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId"  :contrastFileList="saveRemarkList"></inventionPointDialog>
     <reportTemplateDialog ref="reportTemplateDialog"></reportTemplateDialog>
   </div>
 </template>
@@ -180,6 +180,11 @@ export default {
     retrieveRecordId(){
       this.queryParams.retrieveRecordId = this.retrieveRecordId
     },
+    noveltySearch(val){
+      if(val){
+        this.queryComparePatent()
+      }
+    }
   },
   computed: {
     userinfo(){
@@ -189,10 +194,11 @@ export default {
   created() { },
   async mounted() {
     this.columnList = await this.$commonJS.getCustomField('patent',{ projectId: 0, taskId: null })
-    await this.getList();
     if(this.noveltySearch){
       this.queryComparePatent()
     }
+    await this.getList();
+    
 
   },
   methods: {
@@ -211,7 +217,9 @@ export default {
       this.$refs.reportTemplateDialog.open(this.projectId)
     },
     saveRemark(data){
-      this.saveRemarkList.unshift(data)
+      if(this.noveltySearch){
+        this.queryComparePatent()
+      }
     },
     //保存检索式
     saveSearchCondition(){
@@ -241,7 +249,8 @@ export default {
           query: {
             outside:true,
             noveltySearch:this.noveltySearch,
-            projectId:this.projectId
+            projectId:this.projectId,
+            retrieveRecordId:this.queryParams.retrieveRecordId
           }
         }
       )

+ 7 - 1
src/views/components/import/excelImport/index.vue

@@ -17,7 +17,13 @@ export default {
   },
   computed: {
     importData() {
-      return this.$route.query
+      var data = this.$route.query.importData
+      if(data){
+        data = JSON.parse(data)
+      }else{
+        data = {}
+      }
+      return data
     }
   },
   mounted() {

+ 39 - 25
src/views/layout/components/contextMenu.vue

@@ -57,32 +57,46 @@ export default {
     },
     //点击图标回显数据
     selectMark(id, selectType) {
-      var Id = id.substring(1, id.length)
-      if (selectType == 'p') {//批注
-        if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
-            this.$showPermissionDialog()
-            return false
-        }
-        var index = this.highlight.piZhuContrastList.findIndex(item => {
-          if (item.id == Id) {
-            // 清空currentSelectObj,否则Id与id同时存在
-            this.$store.commit("SET_PATENT_INDEX", item)
+      var Id = id.substring(selectType.length, id.length)
+      switch(selectType){
+        case 'p'://批注
+          if(!this.$permission.FunPermissions('xiaoshi/annotationLibrary')){
+              this.$showPermissionDialog()
+              return false
           }
-          return item.id == Id
-        })
-        if (index != -1) {
-          // 打开批注框
-          this.$refs.annotation.open()
-        }
-      } else if (selectType == 'c') {//对比
-        let a = this.highlight.contrastList.find(item => {
-          return item.id == Id
-        })
-        a.column = a.fieldName
-        a.text = a.evidenceText
-        this.$store.commit("SET_PATENT_INDEX", a)
-        this.contrast()
-      } else if (selectType == 'o') {//陈述意见
+          var index = this.highlight.piZhuContrastList.findIndex(item => {
+            if (item.id == Id) {
+              // 清空currentSelectObj,否则Id与id同时存在
+              this.$store.commit("SET_PATENT_INDEX", item)
+            }
+            return item.id == Id
+          })
+          if (index != -1) {
+            // 打开批注框
+            this.$refs.annotation.open()
+          }
+          break;
+        case 'c'://对比
+          let a = this.highlight.contrastList.find(item => {
+            return item.id == Id
+          })
+          a.column = a.fieldName
+          a.text = a.evidenceText
+          this.$store.commit("SET_PATENT_INDEX", a)
+          this.contrast()
+          break;
+        case 'o'://陈述意见
+          break;
+        case 'novelty'://查新检索
+          let novelty = this.highlight.NoveltySearchContrastList.find(item => {
+            return item.id == Id
+          })
+          if(novelty){
+            this.$store.commit("SET_PATENT_INDEX", novelty)
+            this.noveltySearchContrast()
+          }
+          
+          break;
       }
 
     },

+ 30 - 66
src/views/noveltySearch/components/details/components/contrastFile/contrastFile.vue

@@ -20,7 +20,7 @@
               
           </el-header>
           <el-main v-DivHeight="getDivHeight">
-              <el-table :data="tableData" border :maxHeight="tableHeight - 35" style="width: 100%" @cell-dblclick="cellDblclick" @cell-click="cellClick">
+              <el-table v-loading="loading" :data="tableData" border :maxHeight="tableHeight - 35" style="width: 100%" @cell-dblclick="cellDblclick" @cell-click="cellClick">
                   <el-table-column prop="sysOrder" label="序号" width="80" align="center">
                       <template slot-scope="scope">
                           <div v-if="!choose">
@@ -35,7 +35,7 @@
                             </span>
                           </div>
                           <div v-else>
-                            <el-checkbox-group v-model="checkList">
+                            <el-checkbox-group v-model="checkList1">
                                 <el-checkbox :label="scope.row.id">D{{ scope.$index+1 }}</el-checkbox>
                             </el-checkbox-group>
                           </div>
@@ -71,7 +71,7 @@
 <script>
   import { mapGetters } from "vuex";
   import { getTableHeight } from '@/views/components/mixins'
-  import {tableEdit} from './mixins'
+  import {tableEdit,updateNoveltyCompareFile} from './mixins'
   import myDraggable from '@/views/report/InvalidResponse/components/draggable/index.vue'
 
   const column = [
@@ -88,16 +88,18 @@
         editable:false,
     },
     {
-        field:(data)=>{
-            return data.grantNo || data.publicNo || '--'
+        field:'grantNo',
+        function:(data)=>{
+            return data.grantNo || data.publicNo || ''
         },
         type:'function',
         name:'公开/公告号',
         editable:false,
     },
     {
-        field:(data)=>{
-            return data.grantDate || data.publicDate || '--'
+        field:'grantDate',
+        function:(data)=>{
+            return data.grantDate || data.publicDate || ''
         },
         type:'function',
         name:'公开/公告日',
@@ -110,19 +112,26 @@
         editable:false,
     },
     {
-        field:(data)=>{
+        field:'applicant',
+        function:(data)=>{
             if(data.applicant && data.applicant.length>0){
                 return data.applicant.map(item=>item.name).join('、')
             }
-            return  '--'
+            return  ''
         },
         type:'function',
         name:'申请人',
         editable:false,
     },
     {
-        field:'noveltyCompareRecordVO.markNoteText',
-        type:'string',
+        field:'noveltyCompareRecordVOS',
+        function:(data)=>{
+            if(data.noveltyCompareRecordVOS && data.noveltyCompareRecordVOS.length>0){
+                return data.noveltyCompareRecordVOS[0].markNoteText
+            }
+            return '';
+        },
+        type:'function',
         name:'标注',
         editable:true,
     },
@@ -149,7 +158,7 @@
     components: {
         myDraggable
     },
-    mixins:[getTableHeight,tableEdit],
+    mixins:[getTableHeight,tableEdit,updateNoveltyCompareFile],
     props: {
       projectId:{
           default:null
@@ -176,10 +185,12 @@
     },
     data() {
       return {
+         checkList1:this.checkList,
           tableData:[],
           queryParams:{
               projectId:this.projectId,
           },
+          loading:false,
           column:column
       };
     },
@@ -203,7 +214,7 @@
           this.$s.setSession('search', search)
           this.$router.push(
               {
-              path: '/patentDetails/' + row.patentNo,
+              path: '/patentDetails/' + row.literatureNo,
               query: {
                 noveltySearch:true,
                 projectId:this.projectId
@@ -213,34 +224,14 @@
       },
       //获取证据文献
       getList(){
-        
+        this.loading = true
           this.$api.queryComparePatent(this.queryParams).then(response=>{
               if(response.code == 200){
                   this.tableData = response.data.data
+                  this.loading = false
               }
           }).catch(error=>{
-              this.tableData = [
-            {
-                id:1,
-                sysOrder:1,
-                "literatureNo": "CN202421185429.8",
-                name:'A SOLID STATE BATTERY HAVING A DISORDERED HYDROGENATED CARBON NEGATIVE ELECTRODE',
-                "publicNo": "WO9719481A1",
-                "publicDate": "1997-05-29",
-                "grantNo": "US9618644W",
-                "grantDate": "1996-11-20",
-                "applicant": [
-                    {
-                        name:'OVONIC BATTERY CO'
-                    }
-                ],
-                
-                description:'描述',
-                innovate:'是',
-                remark:'备注',
-                relevance:'高'
-                }
-        ]
+            this.loading = false
           })
       },
       //上传证据文献
@@ -284,14 +275,14 @@
         var row = scope.row
         var index = scope.$index
         var ids={
-            compareLitertureId:row.compareFileId
+            compareLitertureId:row.id
         }
         this.$confirm('确认删除本条数据吗?', '提示', {
           confirmButtonText: '确定',
           cancelButtonText: '取消',
           type: 'warning'
         }).then(() => {
-            this.$api.deleteCompareLiterature(ids).then(response=>{
+            this.$api.delCompareFile(ids).then(response=>{
                 if(response.code == 200){
                     this.$message.success('删除成功')
                     this.deleteUpdateOrder(index)
@@ -320,34 +311,7 @@
     edit(row){
         this.addLiterature(row)
     },
-    changeMessage(fieldObj,row,value){
-        var field = fieldObj.field
-        var params = {
-            ...row
-        }
-        params[field] = value
-        var message = this.$message({
-          message: '信息保存中...',
-          type: 'warning',
-          duration:0
-        });
-        this.$api.editCompareFile(params).then(response=>{
-            if(response.code == 200){
-                message.close()
-                this.$message.success('编辑成功')
-                this.$set(row,field,value)
-                this.cancelEdit()
-            }
-        }).catch(error=>{
-          message.close()
-          this.$message.success('编辑失败')
-          if(this.$refs[field.field] && this.$refs[field.field][0]){
-            var fn = this.$refs[field.field][0] || this.$refs[field.field]
-            fn.setFocus()
-          }
-        })
-        
-    },
+    
     /**
      * 交换位置
      * @param {*} now 和谁交换,交换后的排序

+ 73 - 0
src/views/noveltySearch/components/details/components/contrastFile/mixins.js

@@ -8,10 +8,17 @@ export const tableEdit = {
          //双击单元格进行编辑
       cellDblclick(row, column, cell, event){
         var key = column.property
+        var item = this.column.find(item=>{
+          return item.field == key
+        })
         if(row){
             if(this.editedMessage.field){
               return
             }
+            if(!item.editable){
+              // this.$message.warning('该栏位不可编辑')
+              return
+            }
             this.cell={
               rowId:row.id,
               columnId:column.id
@@ -31,4 +38,70 @@ export const tableEdit = {
       },
       
     },
+}
+export const updateNoveltyCompareFile = {
+  methods: {
+    changeMessage(fieldObj,row,value){
+        var field = fieldObj.field
+        var message = this.$message({
+          message: '信息保存中...',
+          type: 'warning',
+          duration:0
+        });
+        if(field == 'noveltyCompareRecordVOS'){
+            var params = {
+                markNoteText:value,
+                projectId:this.projectId,
+                patentNo:row.literatureNo,
+            }
+            if(row.noveltyCompareRecordVOS && row.noveltyCompareRecordVOS.length>0){
+                var obj = row.noveltyCompareRecordVOS[0]
+                params.id = obj.id
+            }
+            this.$api.editNoveltyMark(params).then(response=>{
+                if(response.code == 200){
+                    message.close()
+                    this.$message.success('编辑成功')
+                    if(params.id){
+                        this.$set(row.noveltyCompareRecordVOS[0],'markNoteText',value)
+                    }else{
+                        params.id = response.data
+                        this.$set(row.noveltyCompareRecordVOS,0,params)
+                    }
+                    this.cancelEdit()
+                }
+            }).catch(error=>{
+                message.close()
+                this.$message.error('编辑失败')
+                if(this.$refs[field.field] && this.$refs[field.field][0]){
+                    var fn = this.$refs[field.field][0] || this.$refs[field.field]
+                    fn.setFocus()
+                }
+            })
+            return
+        }
+        var params = {
+            // ...row
+            projectId:this.projectId,
+            patentNo:row.literatureNo || row.patentNo
+        }
+        params[field] = value
+        this.$api.editCompareFileByProjectId(params).then(response=>{
+            if(response.code == 200){
+                message.close()
+                this.$message.success('编辑成功')
+                this.$set(row,field,value)
+                this.cancelEdit()
+            }
+        }).catch(error=>{
+          message.close()
+          this.$message.error('编辑失败')
+          if(this.$refs[field.field] && this.$refs[field.field][0]){
+            var fn = this.$refs[field.field][0] || this.$refs[field.field]
+            fn.setFocus()
+          }
+        })
+        
+    },
+  },
 }

+ 72 - 76
src/views/noveltySearch/components/details/components/contrastRecords/contrastRecords.vue

@@ -7,18 +7,21 @@
             </div>
         </el-header>
         <el-main v-DivHeight="getDivHeight">
-            <el-table ref="table" class="hideIconTable" :data="tableData" border v-loading="loading" :header-cell-style="{'text-align':'center'}" :maxHeight="tableHeight - 50" row-key="keyId"  :span-method="objectSpanMethod">
-                <el-table-column v-for="item in columnList.filter(item=>!item.ifHidden)" :key="item.field" :prop="item.field" :label="item.name"  align="center">
+            <el-table ref="table" class="hideIconTable" :data="tableData" border v-loading="loading" :header-cell-style="{'text-align':'center'}" :maxHeight="tableHeight - 50" row-key="keyId"  :span-method="objectSpanMethod"  @cell-dblclick="cellDblclick" @cell-click="cellClick">
+                <el-table-column v-for="item in column.filter(item=>!item.ifHidden)" :key="item.field" :prop="item.field" :label="item.name"  align="center">
                     <template slot-scope="scope">
                         <div>
-                            <span v-html="scope.row[item.field]"></span>
+                            <div v-if="editedMessage.field && editedMessage.field == item.field && editedMessage.data.id == scope.row.id">
+                                <my-RichText :autoFocus="true" :ref="item.field" :value="scope.row[item.field]" @blur="(value)=>changeMessage(item,scope.row,value)"></my-RichText>
+                            </div>
+                            <div v-else v-html="scope.row[item.field]"></div>
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column v-if="choose" align="center">
+                <el-table-column v-if="choose" align="center" width="50">
                     <template slot-scope="scope">
                         <div >
-                            <el-checkbox-group v-model="checkList">
+                            <el-checkbox-group v-model="checkList1">
                                 <el-checkbox :label="scope.row.id">{{ '' }}</el-checkbox>
                             </el-checkbox-group>
                         </div>
@@ -27,56 +30,41 @@
             </el-table> 
         </el-main>
     </el-container>
+    <reportTemplateDialog ref="reportTemplate"></reportTemplateDialog>
   </div>
 </template>
 
 <script>
-import { getTableHeight } from '@/views/components/mixins'
-export default {
-  components: {},
-  mixins:[getTableHeight],
-  props: {
-    choose:{
-        type:Boolean,
-        default:false
-    },
-    checkList:{
-        type:Array,
-        default:()=>{
-            return []
-        }
-    },
-    projectId:{}
-  },
-  data() {
-    return {
-        tableData:[],
-        loading:false,
-        columnList:[
+const column = [
             {
                 field:'patentNo',
                 name:'对比文件',
-                ifHidden:false
+                ifHidden:false,
+                editable:false,
             },
             {
-                field:'description',
+                field:'generalRemark',
                 name:'总说明',
-                ifHidden:false
+                ifHidden:false,
+                editable:true,
             },
             {
-                field:'keyPoints',
+                field:'technicalPoints',
                 name:'现有技术要点',
-                ifHidden:false
+                ifHidden:false,
+                editable:true,
             },
             {
-                field:'embodiment',
+                field:'excuteCase',
                 name:'实施方案',
-                ifHidden:false
+                ifHidden:false,
+                editable:true,
             },
             {
-                field:'beneficialEffects',
+                field:'beneficialEffect',
                 name:'有益效果',
-                ifHidden:false
+                ifHidden:false,
+                editable:true,
             },
             {
                 field:'technicalFeature',
@@ -84,21 +72,48 @@ export default {
                 ifHidden:false
             },
             {
-                field:'text',
+                field:'markSelectText',
                 name:'选中的文本',
                 ifHidden:false
             },
             {
-                field:'description2',
+                field:'markNoteText',
                 name:'说明',
                 ifHidden:false
             },
-        ],
+        ]
+import { getTableHeight } from '@/views/components/mixins'
+  import {tableEdit,updateNoveltyCompareFile} from '../contrastFile/mixins'
+import reportTemplateDialog from '@/views/noveltySearch/components/dialog/reportTemplate/reportTemplateDialog.vue';
+export default {
+  components: {
+    reportTemplateDialog
+  },
+  mixins:[getTableHeight,tableEdit,updateNoveltyCompareFile],
+  props: {
+    choose:{
+        type:Boolean,
+        default:false
+    },
+    checkList:{
+        type:Array,
+        default:()=>{
+            return []
+        }
+    },
+    projectId:{}
+  },
+  data() {
+    return {
+        checkList1:this.checkList,
+        tableData:[],
+        loading:false,
+        column:column,
         // 计算表格合并行的数量
         mergeObj: {},
         // 表格合并行的栏位
-        mergeArr: ['patentNo','description','keyPoints','embodiment','beneficialEffects'],
-        mergeArr1:['description','keyPoints','embodiment','beneficialEffects']
+        mergeArr: ['patentNo','generalRemark','technicalPoints','excuteCase','beneficialEffect'],
+        mergeArr1:['generalRemark','technicalPoints','excuteCase','beneficialEffect']
     };
   },
   watch: {},
@@ -108,44 +123,25 @@ export default {
     this.getList()
   },
   methods: {
-    exportReport(){},
+    exportReport(){
+        this.$refs.reportTemplate.open(this.projectId)
+    },
     getList(){
-        var obj = {
-            patentNo:'CN202410943719.2',
-            description:'说明一',
-            technicalFeature:'技术特征一',
-            text:'21',
-            description2:'对比说明1',
-        }
-        var obj2 = {
-            patentNo:'CN202410931052.4',
-            description:'说明二',
-            technicalFeature:'技术特征一',
-            text:'21',
-            description2:'对比说明1',
+        var params = {
+            projectId :this.projectId
         }
-        var data = []
-        for(var i = 5;i>0;i--){
-            if(i>3){
-                data.push(
-                    {
-                        ...obj,
-                        technicalFeature:'技术特征' + i,
-                        id:i
-                    }
-                )   
-            }else{
-                data.push(
-                    {
-                        ...obj2,
-                        technicalFeature:'技术特征' + i,
-                        id:i
-                    }
-                )   
+        this.loading = true
+        this.$api.queryNoveltyCompareRecord(params).then(response=>{
+            if(response.code == 200){
+                this.tableData = response.data
+                this.getSpanArr(this.tableData)
+                this.loading = false
             }
-        }
-        this.tableData = data
-        this.getSpanArr(data)
+        }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+        })
+        
     },
       //获取每个元素所需合并的行数
       getSpanArr(data) {

+ 111 - 0
src/views/noveltySearch/components/details/components/searchRecords/dialog/addAndEditSearchRecords.vue

@@ -0,0 +1,111 @@
+<template>
+  <div>
+    <el-dialog :title="title" :visible.sync="showDialog" width="1000px" :close-on-click-modal="false" @close="handleClose" append-to-body>
+        <el-form :model="form" ref="form" label-width="100px" class="demo-ruleForm">
+            <el-form-item label="检索内容" prop="searchCondition">
+                <el-input
+                    v-model="form.conditions"
+                    autocomplete="off"
+                    placeholder="请输入检索内容"
+                ></el-input>
+            </el-form-item>
+            <el-form-item label="检索数据库" prop="searchBase">
+                <el-input
+                    v-model="form.dbType"
+                    autocomplete="off"
+                    placeholder="请输入检索数据库"
+                ></el-input>
+            </el-form-item>
+            <el-form-item label="检索数量" prop="totalNum">
+                <el-input-number v-model="form.totalNum" controls-position="right" :min="0" style="width:100%" ></el-input-number>
+            </el-form-item>
+            <el-form-item label="检索人" prop="searchPersonName">
+                <el-input
+                    v-model="form.searchPersonName"
+                    autocomplete="off"
+                    placeholder="请输入检索人"
+                ></el-input>
+            </el-form-item>
+            <el-form-item label="检索时间" prop="retrieveTime">
+                <el-date-picker
+                    v-model="form.retrieveTime"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择检索时间"
+                    style="width:100%"
+                    >
+                </el-date-picker>
+            </el-form-item>
+        </el-form>
+
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="handleClose">取 消</el-button>
+            <el-button type="primary" :loading="btnLoading" @click="submit">确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    projectId:{
+        default:0
+    },
+  },
+  data() {
+    return {
+        title:'',
+        showDialog:false,
+        form:{},
+        btnLoading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(form){
+        if(form.id){
+            this.title = '编辑检索记录'
+        }else{
+            this.title = '添加检索记录'
+        }
+        this.form = JSON.parse(JSON.stringify(form))
+        this.showDialog =  true
+    },
+    handleClose(){
+        this.showDialog = false
+    },
+    submit(){
+        this.$refs.form.validate((valid) => {
+            if (valid) {
+                this.form.projectId = this.projectId
+                this.btnLoading = true
+                var a = '添加'
+                var api = 'addNoveltySearchRecord'
+                if(this.form.id){
+                    a = '编辑'
+                    api = 'updateNoveltySearchRecord'
+                }
+                this.$api[api](this.form).then(response=>{
+                    if(response.code == 200){
+                        this.btnLoading = false
+                        this.$message.success(a + '成功')
+                        this.$emit('save',true)
+                        this.handleClose()
+                    }
+                }).catch(error=>{
+                    this.$message.error(a + '失败')
+                    this.btnLoading = false
+                })
+            }
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 0 - 0
src/views/noveltySearch/components/details/components/searchRecords/index.vue


+ 260 - 0
src/views/noveltySearch/components/details/components/searchRecords/searchRecords.vue

@@ -0,0 +1,260 @@
+<template>
+    <div class="height_100">
+      <el-container>
+          <el-header v-if="!choose">
+              <div style="display:flex;justify-content:flex-end;width: 100%;">
+                <el-button type="primary" size="small" @click="add">添加</el-button>  
+              </div>
+              
+          </el-header>
+          <el-main v-DivHeight="getDivHeight">
+              <el-table
+                  ref="table"
+                  :data="tableData"
+                  row-key="id"
+                  style="width: 100%"
+                  :maxHeight="tableHeight - 40"
+                  v-loading="loading"
+                  @selection-change="handleSelectionChange"
+              >
+                  <el-table-column type="selection" width="55" :reserve-selection="true" v-if="!choose">
+  
+                  </el-table-column>
+                  <el-table-column  v-if="choose" align="center">
+                      <template slot-scope="scope">
+                          <div>
+                              <el-checkbox-group v-model="checkList1">
+                                  <el-checkbox :label="scope.row.id">{{(scope.$index + 1) + ((queryParams.current - 1) * queryParams.size)}}</el-checkbox>
+                              </el-checkbox-group>
+                          </div>
+                      </template>
+                      
+                  </el-table-column>
+                  <el-table-column prop="conditions" label="检索式"></el-table-column>
+                  <el-table-column prop="dbType" label="检索数据库" width="140">
+                      <template slot-scope="scope">
+                      <div>
+                        {{ dbType[scope.row.dbType] ||  scope.row.dbType}}
+                      </div>
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="totalNum" label="检索数量" width="120">
+                      <template slot-scope="scope">
+                      <div>
+                          {{ scope.row.totalNum || 0 }}件
+                      </div>
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="searchPersonName" label="检索人" width="120">
+                      <template slot-scope="scope">
+                      <div>
+                          {{ scope.row.searchPersonName }}
+                      </div>
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="retrieveTime" label="检索时间" width="120">
+                      <template slot-scope="scope">
+                      <div>
+                          {{ scope.row.retrieveTime }}
+                      </div>
+                      </template>
+                  </el-table-column>
+                  <el-table-column label="操作" width="140" v-if="!choose">
+                      <template slot-scope="scope">
+                          <div class="icon">
+                              <span v-if="scope.row.ifBySystem === false" @click="editSearch(scope.row)" class="margin-left_10">
+                                <el-tooltip class="item" effect="dark" content="编辑" placement="top">
+                                    <i class="iconfont icon-bianji"></i>
+                                </el-tooltip>
+                              </span>
+                              <span v-else @click="executeSearch(scope.row)" class="margin-left_10">
+                                <el-tooltip class="item" effect="dark" content="再次执行" placement="top">
+                                    <i class="iconfont icon-zidongzhihang"></i>
+                                </el-tooltip>
+                              </span>
+                              <span @click="delSearch(scope.row)" class="margin-left_10">
+                                <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                                    <i class="iconfont icon-shanchu"></i>
+                                </el-tooltip>
+                              </span>
+                          </div>
+                      </template>
+                  </el-table-column>
+              </el-table>
+          </el-main>
+          <el-footer class="pagination" style="display:flex;justify-content:space-between;align-items:center" >
+            <div style="display:flex;align-items:center">
+              <span v-if="multipleSelection.length > 0">
+                已勾选 <b>{{ multipleSelection.length }}</b> 条
+              </span>
+              <div v-show="multipleSelection.length" class="margin-left_10">
+                <el-button type="primary" size="small" @click="del">删除</el-button>
+              </div>
+            </div>
+            <div>
+              <el-pagination background layout="total, sizes, prev, pager, next, jumper"
+                :current-page.sync="queryParams.current" :page-size.sync="queryParams.size"
+                @current-change="handleCurrentChange" @size-change="changeSize" :total="total">
+              </el-pagination>
+            </div>
+  
+          </el-footer>
+      </el-container>
+      <addAndEditSearchRecords ref="addAndEditSearchRecords" :projectId="projectId" @save="handleCurrentChange(1)"></addAndEditSearchRecords>
+    </div>
+</template>
+  
+<script>
+  import { getTableHeight } from '@/views/components/mixins'
+  import addAndEditSearchRecords from './dialog/addAndEditSearchRecords.vue';
+  export default {
+      mixins:[getTableHeight],
+    components: {
+      addAndEditSearchRecords
+    },
+    props: {
+      projectId:{
+          default:0
+      },
+      choose:{
+          type:Boolean,
+          default:false
+      },
+      checkList:{
+          type:Array,
+          default:()=>{
+              return []
+          }
+      }
+    },
+    data() {
+      return {
+        checkList1:this.checkList,
+          tableData:[],
+          multipleSelection:[],
+          loading:false,
+          queryParams:{
+              current:1,
+              size:10,
+              projectId:this.projectId
+          },
+          total:0,
+          dbType:{
+          'CN':'中国专利检索',
+          'WD':'世界专利检索'
+        },
+      };
+    },
+    watch: {},
+    computed: {},
+    created() {},
+    mounted() {
+      this.getList()
+    },
+    methods: {
+      getList(){
+          this.loading = true
+          this.$api.queryNoveltySearchRecord(this.queryParams).then(response=>{
+              if(response.code == 200){
+                  this.tableData = response.data.data
+                  this.total = response.data.total
+                  this.loading = false
+              }
+          }).catch(error=>{
+              this.tableData = []
+              this.total = 0
+              this.loading = false
+          })
+      },
+      handleCurrentChange(val){
+          this.queryParams.current = val
+          this.getList()
+      },
+      //切换页大小
+      changeSize(val){
+        this.queryParams.size = val
+        this.queryParams.current = 1
+        this.getList()
+      },
+      add(){
+          this.$refs.addAndEditSearchRecords.open({})
+      },
+      del(){
+          var ids = this.multipleSelection.map(item=>{
+              return item.id
+          })
+          this.removeSearchRecords(ids,1)
+      },
+      delSearch(row){
+          this.removeSearchRecords([row.id])
+      },
+      removeSearchRecords(ids,type){
+          this.$confirm('确认删除本条数据吗?', '提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+          }).then(() => {
+              this.$api.deleteNoveltySearchRecord(ids).then(response=>{
+                  if(response.code == 200){
+                      this.$message.success('删除成功')
+                      this.getList()
+                      if(type){
+                          this.multipleSelection = []
+                          this.$refs.table.clearSelection();
+                      }else{
+                          var id = response.data.data[0]
+                          var index = this.multipleSelection.findIndex(item=>{
+                              return item.id == id
+                          })
+                          if(index!=-1){
+                              this.multipleSelection.splice(index,1)
+                          }
+                      }
+                      
+                  }
+              }).catch(error=>{
+                  this.$message.error('删除失败')
+              })
+          })
+      },
+      handleSelectionChange(val){
+          this.multipleSelection = val
+      },
+      editSearch(row){
+          this.$refs.addAndEditSearchRecords.open(row)
+      },
+      //执行检索历史
+      executeSearch(row){
+        var a = {
+            importToId:this.projectId,
+            importToType:1,
+            type:4,
+            searchCondition:row.conditions,
+            DBType:row.dbType,
+            type:4,
+            retrieveRecordId:row.id
+        }
+        if(row.searchSetting){
+            try{
+                var data = JSON.parse(row.searchSetting)
+                this.$s.setSession('conditionImport',data)
+            }catch{
+
+            }
+        }
+        const router = this.$router.resolve({
+                    path: '/searchResult',
+                    query: {
+                        data:JSON.stringify(a),
+                        noveltySearch:true,
+                        projectId:this.projectId,
+                        retrieveRecordId:row.id
+                    }
+                })
+                window.open(router.href, '_blank');
+        },
+    },
+  };
+  </script>
+  <style lang="scss" scoped>
+  </style>

+ 8 - 4
src/views/noveltySearch/components/details/components/signMessage/signMessage.vue

@@ -112,7 +112,7 @@ export default {
         if(response.code == 200){
           this.form = response.data || {}
           if(!this.form.systemFileList){
-            this.form.systemFileList = []
+            this.$set(this.form,'systemFileList',[])
           }
         }
       }).catch(error=>{
@@ -130,6 +130,11 @@ export default {
       if(this.projectId){
         this.form.projectId = this.projectId
       }
+      var fileGuids = this.$commonJS.checkUploadFile(this.form.systemFileList)
+      if(!fileGuids){
+        return
+      }
+      this.form.fileGuids = fileGuids
       this.$api.addOrUpdateTechnicalCase(this.form).then(response=>{
         if(response.code == 200){
           this.$message.success("编辑成功")
@@ -145,7 +150,7 @@ export default {
     handleChange(file, fileList) {
       file.raw.url = file.url
       this.form.systemFileList.push(file.raw)
-      this.uploadFile(file)
+      this.uploadFile(file.raw)
     },
     // 点击已上传的文件//showViewer是图片显示查看器
     handlePictureCardPreview(file) {
@@ -168,11 +173,10 @@ export default {
     uploadFile(file) {
       let formData = new FormData()
       formData.append('sourceId', this.$constants.sourceId)
-      formData.append('files', file.raw)
+      formData.append('files', file)
       this.$api.uploadFile(formData).then(response => {
         if (response.code == 200) {
           file.guid = response.data[0]
-          file.raw.guid = response.data[0]
         }
       })
     },

+ 5 - 4
src/views/noveltySearch/components/details/details.vue

@@ -13,7 +13,7 @@
         </el-menu>
       </el-aside>
       <el-main>
-        <component :is='activeMenu' :projectId="projectId"></component>
+        <component :is='activeMenu' :projectId="projectId" queryApi="queryNoveltyReport" deleteApi="deleteNoveltyReport"></component>
       </el-main>
     </el-container>
   </div>
@@ -25,7 +25,7 @@ import signMessage from './components/signMessage/signMessage.vue';
 import contrastRecords from './components/contrastRecords/contrastRecords.vue';
 import contrastFile from './components/contrastFile/contrastFile.vue';
 import reportFile from '@/views/report/components/reportFile/reportFileTable.vue';
-import searchRecords from '@/views/report/analysisAndOpinion/components/searchRecords/searchRecords.vue'
+import searchRecords from './components/searchRecords/searchRecords.vue'
 export default {
   components: {
     basicMessageVue,
@@ -36,13 +36,14 @@ export default {
     searchRecords
   },
   props: {
-    projectId:{}
+    projectId:{},
+    firstComponent:{}
   },
   data() {
     return {
       isCollapse:true,
       width:'200px',
-      activeMenu: 'basicMessageVue',
+      activeMenu: this.firstComponent || 'basicMessageVue',
       menuList:[
         {
           label: '基本信息',

+ 10 - 5
src/views/noveltySearch/components/details/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <noveltySearchDetails></noveltySearchDetails>
+    <noveltySearchDetails :projectId="projectId" :firstComponent="firstComponent"></noveltySearchDetails>
   </div>
 </template>
 
@@ -13,13 +13,18 @@ export default {
   props: {},
   data() {
     return {
-      projectId(){
-        return this.$route.query.projectId
-      },
+      
     };
   },
   watch: {},
-  computed: {},
+  computed: {
+    projectId(){
+      return this.$route.query.projectId
+    },
+    firstComponent(){
+      return this.$route.query.firstComponent
+    },
+  },
   created() {},
   mounted() {},
   methods: {},

+ 26 - 37
src/views/noveltySearch/components/dialog/inventionPoint/inventionPoint.vue

@@ -10,8 +10,10 @@
       </div>
       <div class="main">
         <div class="main_head">
-          <span style="font-size:12px">发明点:</span>
-          <el-button v-if="projectId" type="text" size="mini" @click="intoProject" >进入项目</el-button>
+          <div>
+            <span style="font-size:12px">发明点:</span>
+            <el-button v-if="projectId" style="margin-left:10px" type="text" size="mini" @click="intoProject" >进入项目</el-button>
+          </div>
           <div>
             <!-- <el-button  type="text"  size="mini"  :loading="loading" v-if="btns.indexOf(1)!=-1"  @click="submit(1)">关键词</el-button> -->
             <el-button  type="text"  size="mini"  :loading="loading" v-if="btns.indexOf(2)!=-1"  @click="submit(2)">相似案件</el-button>
@@ -98,24 +100,25 @@
           <div class="main_head">
             <span style="font-size:12px">对比文件:</span>
             <div>
-              <el-button v-if="chooseContrastFile.length>0" type="text"  size="mini"  :loading="loading"  @click="exportReport()">生成报告</el-button>
+              <!-- <el-button v-if="chooseContrastFile.length>0" type="text"  size="mini"  :loading="loading"  @click="exportReport()">生成报告</el-button> -->
             </div>
           </div>
           <div class="result">
             <myCard class="box-card" v-for="(item,index) in contrastFileList" :key="index">
               <div slot="head">
                 <div style="font-size:14px">
-                  <el-checkbox-group v-model="chooseContrastFile">
+                  <!-- <el-checkbox-group v-model="chooseContrastFile">
                     <el-checkbox :label="item.patentNo">序号:{{ (index + 1)  }} </el-checkbox>
-                  </el-checkbox-group>
+                  </el-checkbox-group> -->
+                  <div>序号:{{ (index + 1)  }}</div>
                 </div>
               </div>
               <el-form label-width="100px">
                   <el-form-item label="专利号">
-                    <div v-html="item.patentNo"></div>
+                    <div v-html="item.literatureNo"></div>
                   </el-form-item>
                   <el-form-item label="标注">
-                    <div v-html="item.remark"></div>
+                    <div v-if="item.noveltyCompareRecordVOS && item.noveltyCompareRecordVOS.length>0" v-html="item.noveltyCompareRecordVOS[0].markNoteText"></div>
                   </el-form-item>
                 </el-form>
             </myCard>
@@ -338,34 +341,19 @@ export default {
       this.clickType = type
       if(type == 1){}
       else{
-        this.tableData = [
-                {
-                  id:1,
-                  number:'5W262525',
-                  inventionPoint:'发明点',
-                  searchRecords:[
-                    {
-                        searchRecord:'PA = (深圳市江波龙电子股份有限公司)'
-                    }
-                  ],
-                  same:'99%',
-                  createName:'管理员',
-                  createTime:'2024-09-06 17:04'
-                },
-                {
-                    id:2,
-                    number:'5W131553',
-                    inventionPoint:'发明点',
-                    searchRecords:[
-                        {
-                            searchRecord:'TI = (石墨烯薄膜)'
-                        }
-                    ],
-                    same:'90%',
-                    createName:'管理员',
-                    createTime:'2024-09-06 17:04'
-                }
-            ]
+        var params = {
+          content:this.technicalCase.inventionPoint
+        }
+        this.loading = true
+        this.$api.querySimilarInventionPoint(params).then(response=>{
+          if(response.code == 200){
+            this.tableData = response.data
+            this.loading = false
+          }
+        }).catch(error=>{
+          this.tableData = []
+          this.loading = false
+        })
       }
       this.showResult = true;
     },
@@ -380,8 +368,8 @@ export default {
           {
             path:'/reuseResults',
             query:{
-              projectId:this.projectId,
-              reuseId:row.id
+              toProjectId:this.projectId,
+              projectId:row.projectId
             }
           }
         )
@@ -461,6 +449,7 @@ export default {
         display: flex;
         justify-content: space-between;
         align-items: center;
+        line-height: 30px;
       }
       .main_result {
         margin-top: 20px;

+ 17 - 5
src/views/noveltySearch/components/dialog/reportTemplate/reportTemplateDialog.vue

@@ -7,6 +7,7 @@
         append-to-body
         :close-on-click-modal="false"
         :modal="false"
+        v-loading="loading"
         :before-close="close">
         <div style="height: calc(100vh - 350px)">
         <el-container>  
@@ -27,7 +28,7 @@
               <el-table-column prop="name" label="名称">
                 <template slot-scope="scope">
                   <div>
-                    <el-link type="primary" @click="chooseReportTemplate(scope.row)">{{ scope.row.name }}</el-link>
+                    <el-link type="primary" @click="chooseReportTemplate(scope.row)">{{ scope.row.templateName }}</el-link>
                   </div>
                 </template>
               </el-table-column>
@@ -82,7 +83,18 @@ export default {
     },
     //获取模板
     getReportTemplate(){
-
+      this.loading = true
+      this.$api.queryNoveltyTemplate({}).then(response=>{
+        if(response.code = 200){
+          this.tableData = response.data.data
+          this.total = response.data.total
+          this.loading = false
+        }
+      }).catch(error=>{
+        this.tableData = []
+        this.total = 0
+        this.loading = false
+      })
     },
     close(){
         this.visible = false
@@ -100,9 +112,9 @@ export default {
       let router = this.$router.resolve({
           path: '/exportReport',
           query: {
-            templateId: row.id,
-            templateName:row.name,
-            projectId: row.projectId,
+            reportTemplateId: row.id,
+            // path:row.configMessage,
+            projectId: this.projectId,
           }
       })
       window.open(router.href, '_blank')

+ 99 - 9
src/views/noveltySearch/components/exportReport/components/common.vue

@@ -87,8 +87,36 @@
                     <td>关键词</td>
                     <td>数量</td>
                 </tr>
-                <tr>
-
+                <tr style="position: relative;" v-for="(item,index) in getColumnData('searchRecord',null,(dataObj.searchRecord && dataObj.searchRecord.length)>0?dataObj.searchRecord.map(item2=>{return {conditions:item2.conditions,totalNum:item2.totalNum}}): [{}])" :key="index">
+                    
+                    <td @dblclick="edit('searchRecord','area',index)">
+                        <div v-if="isEdit('searchRecord','area',index)">
+                            <myRichText v-model="item.area" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.area"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','dbType',index)">
+                        <div v-if="isEdit('searchRecord','dbType',index)">
+                            <myRichText v-model="item.dbType" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.dbType"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','conditions',index)">
+                        <div v-if="isEdit('searchRecord','conditions',index)">
+                            <myRichText v-model="item.conditions" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.conditions"></div>
+                    </td>
+                    <td @dblclick="edit('searchRecord','totalNum',index)">
+                        <div v-if="isEdit('searchRecord','totalNum',index)">
+                            <myRichText v-model="item.totalNum" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.totalNum"></div>
+                    </td>
+                    <span class="funBtn">
+                        <el-button type="" size="mini" icon="el-icon-plus" circle @click="addCompareRecord(reportData.searchRecord,index)"></el-button>
+                        <el-button v-if="reportData.searchRecord.length>1" size="mini" type="danger" icon="el-icon-delete" circle @click="delCompareRecord(reportData.searchRecord,index)"></el-button>
+                    </span>
                 </tr>
             </table>
         </div>
@@ -99,14 +127,14 @@
             <div class="mainContent1">
                 <div class="title1">本提案思路</div>
                 <div>
-                    <div class="title1">附图</div>
+                    <div class="title1">附图:</div>
                     <div class="content" style="display:flex;">
-                        <div style="width:150px;height:180px;margin-right:10px" v-for="(item,index) in getColumnData('technicalCase','picture',dataObj.technicalCase.systemFileList || [])" :key="index">
+                        <div style="width:150px;height:180px;margin-right:10px" v-for="(item,index) in getColumnData('technicalCase','picture',dataObj.technicalCase.systemFileList?dataObj.technicalCase.systemFileList.map(pic=>pic.guid) : [])" :key="index">
                             <div style="height:30px;line-height:30px;display:flex;justify-content:flex-end;">
                                 <el-button type="text" size="small" @click="delImage(reportData.technicalCase.picture,item,index)">删除</el-button>
                             </div>
                             <div style="width:150px;height:148px;border:1px dashed #c0ccda;border-radius: 6px;">
-                                <el-image style="width:100%;height:100%" :src="$commonJS.checkViewer(item.guid)" :preview-src-list="[$commonJS.checkViewer(form.guid)]" fit="contain"></el-image>
+                                <el-image style="width:100%;height:100%" :src="$commonJS.checkViewer(item)" :preview-src-list="reportData.technicalCase.picture.map(pic=>$commonJS.checkViewer(item))" fit="contain"></el-image>
                             </div>
                         </div>
                         <el-upload style="margin-right:10px;margin-top: 30px;" ref="upload" action="#" :auto-upload="false" multiple :on-change="(file, fileList)=>handleChange(reportData.technicalCase.picture,file, fileList)" list-type="picture-card" :show-file-list="false">
@@ -117,7 +145,7 @@
                     </div>
                 </div>
                 <div @dblclick="edit('technicalCase','inventionPoint')">
-                    <div class="title1">方案要点</div>
+                    <div class="title1">方案要点:</div>
                     <div class="content" >
                         <div v-if="isEdit('technicalCase','inventionPoint')">
                             <myRichText v-model="reportData.technicalCase.inventionPoint" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
@@ -127,11 +155,65 @@
                 </div>
             </div>
             <!-- 循环对比记录 -->
-            <div class="mainContent1">
+            <div class="mainContent1" style="position: relative;" v-for="(item,index) in getCompareRecordData([
+            {
+                field:'patentMessage.applicant',
+                function:(data)=>{
+                    if(data.patentMessage.applicant && data.patentMessage.applicant.length>0){
+                        return data.patentMessage.applicant.join('、')
+                    }
+                    return ''
+                },
+                type:'function',
+                key:'applicant'
+            },
+            {
+                field:'patentMessage.publicNo',
+                type:'string',
+                key:'publicNo'
+            },
+            {
+                field:'content',
+                function:(data)=>{
+                    var str = ''
+                    if(data.data && data.data.length>0){
+                        data.data.forEach((item,index) => {
+                            str = `${str}${index+1}、${item.markSelectField}“${item.markSelectText}”揭示了“${item.technicalFeature}”${item.markNoteText}<br>`
+                        });
+                    }
+                    return str
+                },
+                type:'function',
+                key:'content'
+            }
+        ])" :key="index">
+            <div class="funBtn">
+                <el-button type="" icon="el-icon-plus" circle @click="addCompareRecord(reportData.compareRecord,index)"></el-button>
+                <el-button v-if="reportData.compareRecord.length>1" type="danger" icon="el-icon-delete" circle @click="delCompareRecord(reportData.compareRecord,index)"></el-button>
+            </div>
                 <div>
-                    <div>对比文件(申请人,公开号)</div>
+                    <div>对比文件{{index+1}}(
+                        <span @dblclick="edit('compareRecord','applicant',index)">
+                            <span v-if="isEdit('compareRecord','applicant',index)">
+                                <el-input v-model="item.applicant" :autofocus="true" class="input_border_none" style="width:150px;border:none"  @blur="()=>saveMessage(item.applicant)"></el-input>
+                            </span>
+                            <span v-else>{{item.applicant||'申请人'}}</span>
+                        </span>
+                        ,
+                        <span @dblclick="edit('compareRecord','publicNo',index)">
+                            <span v-if="isEdit('compareRecord','publicNo',index)">
+                                <el-input v-model="item.publicNo" :autofocus="true" class="input_border_none" style="width:150px;border:none"  @blur="()=>saveMessage(item.publicNo)"></el-input>
+                            </span>
+                            <span v-else>{{item.publicNo||'公开号'}}</span>
+                        </span>
+                        )</div>
                     <div class="title1">对比文件所公开的与本案有关的内容</div>
-                    <div class="content"></div>
+                    <div class="content" @dblclick="edit('compareRecord','content',index)">
+                        <div v-if="isEdit('compareRecord','content',index)">
+                            <myRichText v-model="item.content" customStyle="border:none" :autoFocus="true" @blur="saveMessage"></myRichText>
+                        </div>
+                        <div v-else v-html="item.content"></div>
+                    </div>
                 </div>
             </div>
 
@@ -201,6 +283,7 @@ export default {
   props: {},
   data() {
     return {
+        
     };
   },
   watch: {},
@@ -230,6 +313,7 @@ export default {
         width: 100%;
         td{
             padding: 8px;
+            height: 22.5px;
         }
         
     }
@@ -268,6 +352,12 @@ export default {
         border-bottom: 1px solid black;
         padding: 5px;
     }
+    .funBtn{
+        position:absolute;
+        width: 100px;
+        right: -110px;
+        display: flex;
+    }
     .mainContent1:last-child{
         border-bottom:none
     }

+ 109 - 17
src/views/noveltySearch/components/exportReport/components/mixins.js

@@ -1,3 +1,5 @@
+import { groupBy } from "lodash"
+
 export default{
     props:{
         dataObj:{
@@ -91,32 +93,116 @@ export default{
             if(property){
                 return this.reportData[field][property];
             }else{
-                this.reportData[field]
+                return this.reportData[field]
             }
             
+            
+            
+        },
+        //分组
+        groupBy(arr,key){
+            return arr.reduce((acc,obj)=>{
+                const groupKey = obj[key]
+                if(!acc[groupKey]){
+                    acc[groupKey] = [];
+                }
+                acc[groupKey].push(obj)
+                return acc
+            },{})
+        },
+        //获取对比记录所需要的数据
+        getCompareRecordData(column,props=[]){
+            var key = 'compareRecord'
+            if(!this.editModel && !this.hasCopy[key]){
+                
+                if(this.dataObj.compareRecord && this.dataObj.compareRecord.length>0){
+                    var data = []
+                    var that = this
+                    var compareRecord = this.groupBy(this.dataObj.compareRecord,'patentNo')
+                    var patents = Object.keys(compareRecord)
+                    patents.forEach(async item => {
+                        //获取专利信息
+                        var compareRecord1 = {
+                            patentNo:item,
+                            data:compareRecord[item]
+                        }
+                        if(props.indexOf('patentMessage') !=-1){
+                            var patent = await that.getPatentMessage(item)
+                            compareRecord1.patentMessage = patent
+                        }
+                        if(props.indexOf('noveltyRemark') !=-1){
+                            var obj = this.dataObj.compareLiterature.find(file=>{
+                                return file.literatureNo == item
+                            })
+                            if(obj){
+                                if(obj.noveltyCompareRecordVOS && obj.noveltyCompareRecordVOS.length>0){
+                                    compareRecord1.noveltyCompareRecordVOS = obj.noveltyCompareRecordVOS
+                                }
+                            }
+                        }
+                        
+                        var obj = {}
+                        column.forEach(co=>{
+                            var field = co.key
+                            obj[field] = that.$commonJS.getColumnData(compareRecord1,co)
+                            
+                        })
+                        data.push(obj)
+                    });
+                    this.$set(this.reportData,'compareRecord',data)
+                }else{
+                    this.$set(this.reportData,'compareRecord',[{}])
+                }
+                this.hasCopy[key] = true
+            }
+            return this.reportData.compareRecord
+        },
+        delCompareRecord(data,index){
+            data.splice(index,1)
+        },
+        addCompareRecord(data,index){
+            data.splice(index+1,0,{})
+        },
+        async getPatentMessage(patentNo){
+            var params = {
+                patentNo: patentNo
+              }
+              var api = 'selectPatentDetail'
+              var patent = {}
+              await this.$api[api](params).then(response => {
+                if (response.code == 200) {
+                  patent = response.data
+                }
+              }).catch(error => {
+              })
+              return patent
         },
-        edit(field,property){
+        edit(field,property,index=''){
             this.nowEdit = {
                 field:field,
                 property:property,
-                value:this.reportData[field][property]
+                index:index,
+            }
+            if(index === 0 || index){
+                this.nowEdit.value = this.reportData[field][index][property]
+            }else{
+                this.nowEdit.value = this.reportData[field][property]
             }
             var obj = this.editMessage.find(item=>{
-                return item.field == field && item.property == property
+                return item.field == field && item.property == property && item.index == index
             })
+ 
             if(obj){
                 return
             }
             this.editMessage.push(
                 {
-                    field:field,
-                    property:property,
-                    value:this.reportData[field][property]
+                    ...this.nowEdit
                 }
             )
         },
-        isEdit(field,property){
-            if(this.nowEdit.field==field && this.nowEdit.property==property){
+        isEdit(field,property,index=''){
+            if(this.nowEdit.field==field && this.nowEdit.property==property && this.nowEdit.index == index){
                 return true
             }
             return false
@@ -132,8 +218,14 @@ export default{
             //执行保存
             var field = this.nowEdit.field
             var property = this.nowEdit.property
-            this.$set(this.reportData[field],property,value)
-            if(fu){
+            var index = this.nowEdit.index
+            if(index){
+                this.$set(this.reportData[field][index],property,value)
+            }else{
+                this.$set(this.reportData[field],property,value)
+            }
+            
+            if(fu && typeof fu == 'function'){
               fu(value)  
             }
             
@@ -142,9 +234,9 @@ export default{
 
         // 图片变化的change事件
         handleChange(row,file, fileList) {
-            file.raw.url = file.url
-            row.push(file.raw)
-            this.uploadFile(file)
+            // file.raw.url = file.url
+            // row.push(file.raw)
+            this.uploadFile(row,file)
         },
         // 文件列表移除文件
         delImage(row,file,index) {
@@ -162,14 +254,14 @@ export default{
             // }
         },
         //上传附件
-        uploadFile(file) {
+        uploadFile(data,file) {
             let formData = new FormData()
             formData.append('sourceId', this.$constants.sourceId)
             formData.append('files', file.raw)
             this.$api.uploadFile(formData).then(response => {
             if (response.code == 200) {
-                file.guid = response.data[0]
-                file.raw.guid = response.data[0]
+                var guid = response.data[0]
+                data.push(guid)
             }
             })
         },

+ 181 - 21
src/views/noveltySearch/components/exportReport/exportReport.vue

@@ -6,8 +6,8 @@
           <el-button type="primary" size="small" @click="saveEdit">保存修改</el-button>
           <el-button type="primary" size="small" @click="reporting">生成报告</el-button>
       </div>
-      <div style="height:calc(100% - 60px);overflow-y:auto" v-loading="loading">
-          <component :is='component' v-if="!loading" :dataObj="dataObj" :reportData="reportData" :editMessage="editMessage" :editModel="editModel" :reLoadBasicMessage="reLoadBasicMessage"></component>    
+      <div class="reportTemplate" style="height:calc(100% - 60px);overflow-y:auto" v-loading="loading">
+          <component v-if="!loading && component"  :is='component'  :dataObj="dataObj" :reportData="reportData" :editMessage="editMessage" :editModel="editModel" :reLoadBasicMessage="reLoadBasicMessage"></component>    
       </div>
 
       <getMessageByNumber ref="getMessageByNumber" @save="getReportMessage"></getMessageByNumber>
@@ -28,6 +28,7 @@ export default {
     props: {
         reportTemplateId:{},
         projectId:{},
+        reportFileId:{},
         editModel:{
             type:Boolean,
             default:false
@@ -74,39 +75,124 @@ export default {
     },
     methods: {
         async init(){
-            this.getData()
-            // await this.getReportTemplate()
+            await this.getData()
+            // this.loading = true
+            // this.$nextTick(()=>{
+            //     this.loading = false
+            // })
+            await this.getReportTemplate()
         },
         //获取报告所需信息
-        getData(){
-            if(this.editModel){
-                
+        async getData(){
+            if(this.editModel && this.reportFileId){
+                var params = {
+                    id:this.reportFileId,
+                    size:10,
+                    current:1
+                }
+                this.$api.queryNoveltyReport(params).then(response=>{
+                    if(response.code == 200){
+                        var data = response.data.data
+                        if(data.length>0){
+                            var obj = data[0].dataSource
+                            try{
+                                this.reportData = JSON.parse(obj)
+                            }catch{
+
+                            }
+                            
+                        }
+                    }
+                })
                 return
             }
-            this.getReportMessage()
-            this.getContrastFile()
-            this.getContrastRecord()
-            this.getSearchRecord()
+            const [ReportMessage,TechnicalCase,ContrastFile,ContrastRecord,SearchRecord] = await Promise.allSettled([this.getReportMessage(),this.getTechnicalCase(),this.getContrastFile(), this.getContrastRecord(),this.getSearchRecord()])
+            this.dataObj.baseMessage = ReportMessage.status =='fulfilled'?(ReportMessage.value[0]||{}):{}
+            this.dataObj.technicalCase = TechnicalCase.status =='fulfilled'?(TechnicalCase.value||{}):{}
+            this.dataObj.compareLiterature = ContrastFile.status =='fulfilled'?(ContrastFile.value||[]):[]
+            this.dataObj.compareRecord = ContrastRecord.status =='fulfilled'?(ContrastRecord.value||[]):[]
+            this.dataObj.searchRecord = SearchRecord.status =='fulfilled'?(SearchRecord.value||[]):[]
+            // this.getReportMessage()
+            // this.getTechnicalCase()
+            // this.getContrastFile()
+            // this.getContrastRecord()
+            // this.getSearchRecord()
         },
         //获取报告基本信息
-        getReportMessage(){},
+        async getReportMessage(){
+            var params = {
+                projectId:this.projectId
+            }
+            return await this.$api.queryNoveltyProject(params).then(response=> response.data.data)
+            this.$api.queryNoveltyProject(params).then(response=>{
+                if(response.code == 200){
+                    this.dataObj.baseMessage = response.data.data[0] || {}
+                }
+            })
+        },
+        //获取技术方案信息
+        async getTechnicalCase(){
+            var params = {
+                projectId:this.projectId
+            }
+            return await this.$api.queryTechnicalCase(params).then(response=> response.data)
+            this.$api.queryTechnicalCase(params).then(response=>{
+                if(response.code == 200){
+                    this.dataObj.technicalCase = response.data || {}
+                }
+            }).catch(error=>{
+            })
+        },
         //获取对比文件
-        getContrastFile(){},
+        async getContrastFile(){
+            var params = {
+                projectId:this.projectId
+            }
+            return await this.$api.queryComparePatent(params).then(response=> response.data.data)
+        },
         //获取对比记录
-        getContrastRecord(){},
+        async getContrastRecord(){
+            var params = {
+                projectId:this.projectId
+            }
+            return await this.$api.queryNoveltyCompareRecord(params).then(response=> response.data)
+        },
         //获取检索记录
-        getSearchRecord(){},
+        getSearchRecord(){
+            var params = {
+                projectId:this.projectId
+            }
+            return this.$api.queryNoveltySearchRecord(params).then(response=> response.data.data)
+        },
         //获取报告模板
-        getReportTemplate(){
-            var path='dahua'
-            this.getReportTemplateByPath(path)
+        async getReportTemplate(){
+            this.loading  =true
+            var params = {
+                templateId:this.reportTemplateId
+            }
+            await this.$api.queryNoveltyTemplate(params).then(response=>{
+                if(response.code = 200){
+                    this.loading = false
+                    var path=response.data.data[0].configMessage
+                    this.getReportTemplateByPath(path)
+                }
+            }).catch(error=>{
+                this.$message.error('未获取到模板信息')
+                this.loading = false
+            })
         },
         //根据报告名称获取显示的html
         async getReportTemplateByPath(path){
             this.loading = true
             var component1 = await this.getComponents(path)
+            
             component1.mixins = [mixins2]
-            this.component = component1
+           
+            if(!component1.template){
+                this.loading = false
+                return
+            }
+             this.component = component1
             this.loading = false
         },
         getMessage(){
@@ -117,9 +203,73 @@ export default {
             })
         },
         //保存修改的信息
-        saveEdit(){},
+        async saveEdit(type){
+            var message = this.$message({
+                message: '信息保存中...',
+                type: 'warning',
+                duration:0
+            });
+            var params = {
+                id:this.reportFileId,
+                projectId:this.projectId,
+                templateId:this.reportTemplateId,
+                dataSource:JSON.stringify(this.reportData)
+            }
+            await this.$api.editNoveltyReport(params).then(response=>{
+                if(response.code == 200){
+                    message.close()
+                    this.$message.success('信息保存成功')
+                    if(!this.reportFileId){
+                        this.$router.replace(
+                            {
+                                path:'/exportReport',
+                                query:{
+                                    projectId:this.projectId,
+                                    reportTemplateId:this.reportTemplateId,
+                                    reportFileId:response.data,
+                                    editModel:true
+                                }
+                            }
+                        )
+                    }
+                }
+            }).catch(error=>{
+                message.close()
+                this.$message.error('信息保存失败')
+            })
+        },
         //生成报告
-        reporting(){},
+        async reporting(){
+            await this.saveEdit()
+            if(!this.reportFileId){
+                return
+            }
+            var message = this.$message({
+                message: '报告生成中...',
+                type: 'warning',
+                duration:0
+            });
+            var params = {
+                id:this.reportFileId
+            }
+            this.$api.exportNoveltyReport(params).then(response=>{
+                if(response.code == 200){
+                    message.close()
+                    this.$message.success('报告生成成功')
+                    const router = this.$router.resolve({
+                        path: '/noveltySearchDetails',
+                        query: {
+                            projectId:this.projectId,
+                            firstComponent:'reportFile'
+                        }
+                    })
+                    window.open(router.href,"_self")
+                }
+            }).catch(error=>{
+                message.close()
+                this.$message.error('报告生成失败')
+            })
+        },
     },
   };
   </script>
@@ -127,4 +277,14 @@ export default {
       
   </style>
   <style lang="scss" scoped>
+  .reportTemplate:empty{
+    text-align: center;
+    line-height: 100px;
+  }
+  .reportTemplate:empty::before{
+    content: '模板不存在';
+    font-style: normal;
+    white-space: nowrap;
+    color: #cacdd4;
+  }
   </style>

+ 5 - 2
src/views/noveltySearch/components/exportReport/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <exportReport :reportTemplateId="reportTemplateId" :projectId="projectId" :editModel="editModel"></exportReport>
+    <exportReport :reportTemplateId="reportTemplateId" :reportFileId="reportFileId" :projectId="projectId" :editModel="editModel"></exportReport>
   </div>
 </template>
 
@@ -23,8 +23,11 @@ export default {
     reportTemplateId(){
         return this.$route.query.reportTemplateId
     },
+    reportFileId(){
+      return this.$route.query.reportFileId
+    },
     editModel(){
-        return this.$route.query.editModel || false
+        return this.$route.query.editModel==='true'?true: false
     },
   },
   created() {},

+ 9 - 3
src/views/noveltySearch/components/exportReport/mixins/index.js

@@ -1,4 +1,5 @@
 // 引入 Vue 和 VueComponent
+
 export default{
    data() {
     return {
@@ -13,9 +14,14 @@ export default{
             var params = {
                 template:''
             }
-            this.getCss(path)
-            await fetch(`./reportTemplate/${path}/${path}.txt`).then(res =>  res.text() ).then(data => {
-                params.template = data
+            await fetch(`./reportTemplate/${path}/${path}.txt`).then(res => {
+                return res.text()
+            }).then(data => {
+                    if(data.indexOf('<!DOCTYPE html>') == -1){
+                        this.getCss(path)
+                        params.template = data
+                    }
+                    
             })
             return params
         },

+ 10 - 9
src/views/noveltySearch/components/noveltySearchCard.vue

@@ -142,12 +142,13 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
       sortChange({ column, prop, order }){},
       //点击案号
       handleItem(row){
-          this.$router.push({
-              path:'/noveltySearchDetails',
-              query:{
-                  projectId:row.id
-              }
-          })
+        const router = this.$router.resolve({
+            path: '/noveltySearchDetails',
+            query: {
+                projectId:row.projectId
+            }
+        })
+        window.open(router.href,"_self")
       },
       //操作
       handleCommand(event,row){
@@ -158,7 +159,7 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
                           path:'/conditionImport',
                           query:{
                             noveltySearch:true,
-                            projectId:row.id
+                            projectId:row.projectId
                           }
                       }
                   )
@@ -178,7 +179,7 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
                   ) 
                   break;
               case "exportReport"://导出报告
-                  this.$refs.reportTemplate.open(row.id)
+                  this.$refs.reportTemplate.open(row.projectId)
                   break;
               case 'del'://删除
                     this.delProject(row)
@@ -195,7 +196,7 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
             type: 'warning'
         }).then(() => {
             var params = {
-                projectId:row.id
+                projectId:row.projectId
             }
             this.loading = true
             this.$api.deleteNoveltyProject(params).then(response=>{

+ 5 - 2
src/views/noveltySearch/components/reuseResults/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="height_100">
-    <reuseResults :projectId="projectId"></reuseResults>
+    <reuseResults :projectId="projectId" :toProjectId="toProjectId"></reuseResults>
   </div>
 </template>
 
@@ -20,7 +20,10 @@ export default {
   computed: {
     projectId(){
         return this.$route.query.projectId
-    }
+    },
+    toProjectId(){
+      return this.$route.query.toProjectId
+    },
   },
   created() {},
   mounted() {},

+ 47 - 22
src/views/noveltySearch/components/reuseResults/reuseResults.vue

@@ -9,14 +9,14 @@
               </div>
           </el-header>
           <el-main class="height_100" v-DivHeight="getDivHeight">
-              <div v-if="showTable" :style="`padding:0 150px;height:${tableHeight - 80}px`">
-                  <component ref="exportReportMessage" class="height_100" :is='component'  :projectId="projectId" :choose="true" :form="form" :checkList="choose[component]"></component>
+              <div v-if="showTable" :style="`padding:0 50px;height:${tableHeight - 80}px`">
+                  <component ref="exportReportMessage" class="height_100" :is='component'  :projectId="projectId" :choose="true" :checkList="choose[component]"></component>
               </div>
-          </el-main>""
+          </el-main>
           <el-footer class="pagination">
               <div class="btns">
                   <el-button type="primary" size="small" @click="reBack" v-if="this.active!=0">返回上一步</el-button>
-                  <el-button type="primary" size="small" @click="next">{{ active == steps.length-1?'确认并复用':'确认并进行下一步' }}</el-button>
+                  <el-button type="primary" size="small" @click="next" :loading="btnLoading">{{ active == steps.length-1?'确认并复用':'确认并进行下一步' }}</el-button>
               </div>
           </el-footer>
       </el-container>
@@ -27,7 +27,7 @@
   import { getTableHeight } from '@/views/components/mixins'
   import contrastFile from '../details/components/contrastFile/contrastFile.vue';
   import contrastRecords from '../details/components/contrastRecords/contrastRecords.vue';
-  import searchRecords from '@/views/report/analysisAndOpinion/components/searchRecords/searchRecords.vue'
+  import searchRecords from '../details/components/searchRecords/searchRecords.vue'
   const steps = [
       {
           name:'选择对比文件',
@@ -54,7 +54,10 @@
     },
     props: {
       projectId:{
-          default:497
+          
+      },
+      toProjectId:{
+
       }
     },
     data() {
@@ -62,36 +65,28 @@
           active: 0,
           steps:[],
           component:'contrastFile',
-          form:{},
           choose:{
               contrastFile:[],
               contrastRecords:[],
               searchRecords:[],
           },
-
+          btnLoading:false
       };
     },
     watch: {},
     computed: {},
     created() {},
     mounted() {
-    //   this.init()
-      this.getReportMessage()
+      this.init()
     },
     methods: {
       init(){
-          // var step = [1,2,3,4,5]
-          var step = [3,4,5]
+          var step = [1,2,3]
           this.steps = steps.filter(item=>{
               return step.indexOf(item.value) !=-1
           })
           this.component = this.steps[0].component
       },
-      getReportMessage(){
-          this.form = {
-  
-          }
-      },
       reBack(){
           if(this.active == 0){
               return 
@@ -100,13 +95,43 @@
           this.component =  this.steps[this.active].component
       },
       next(){
+        this.choose[this.component] = this.$refs.exportReportMessage.checkList1
           if(this.active == this.steps.length - 1){
-              return 
-          }
-          var a = this.steps[this.active].value
-          switch(a){
-
+            var params = {
+                fromProjectId:this.projectId,
+                toProjectId:this.toProjectId,
+                searchRecordIds:this.choose.searchRecords,
+                compareRecordIds:this.choose.contrastRecords,
+                compareLiteratureIds:this.choose.contrastFile,
+            }
+            var message = this.$message({
+                message: '信息复用中...',
+                type: 'warning',
+                duration:0
+            });
+            this.btnLoading = true
+            this.$api.copyNoveltyMessage(params).then(response=>{
+                if(response.code == 200){
+                    message.close()
+                    this.$message.success('信息复用完成')
+                    this.btnLoading = false
+                    var reportId = response.data
+                    const router = this.$router.resolve({
+                        path: '/noveltySearchDetails',
+                        query: {
+                            projectId:reportId
+                        }
+                    })
+                    window.open(router.href,"_self")
+                }
+            }).catch(error=>{
+                message.close()
+                this.$message.error('信息复用失败')
+                this.btnLoading = false
+            })
+            return 
           }
+          
           this.active++
           this.component =  this.steps[this.active].component
       },

+ 7 - 5
src/views/project/patentCollection/components/dialog/addRemark.vue

@@ -2,7 +2,7 @@
   <div>
     <el-dialog custom-class="shakeDialog" :title="this.form.patentNo+'标注'" v-draggable :visible.sync="visible" width="400px" 
     :before-close="handleClose" :modal="false" :close-on-click-modal="false" :modal-append-to-body="false">
-        <el-input type="textarea" v-model="form.content" placeholder="请输入标注内容"></el-input>
+        <el-input type="textarea" v-model="form.markNoteText" placeholder="请输入标注内容"></el-input>
         <span slot="footer" class="dialog-footer">
         <el-button @click="handleClose">取 消</el-button>
         <el-button type="primary" :loading="loading" @click="submit">确 定</el-button>
@@ -17,7 +17,8 @@ export default {
   props: {
     projectId:{
 
-    }
+    },
+    retrieveRecordId:{}
   },
   data() {
     return {
@@ -31,9 +32,9 @@ export default {
   created() {},
   mounted() {},
   methods: {
-    open(patentNo){
+    open(form){
         this.form = {
-          patentNo:patentNo
+          ...form
         }
         this.visible = true
     },
@@ -41,12 +42,13 @@ export default {
         this.visible = false
     },
     submit(){
-      if(this.form.content.trim() == ''){
+      if(this.form.markNoteText.trim() == ''){
         this.$message.error('请输入标注内容')
         return
       }
       var params = {
         projectId:this.projectId,
+        retrieveRecordId:this.retrieveRecordId,
         ...this.form
       }
       this.loading = true

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 41 - 5
src/views/project/patentCollection/components/mixins/index.js


+ 2 - 1
src/views/project/patentCollection/components/views/Abstract.vue

@@ -57,7 +57,8 @@
                   </template>
                   <el-tag class="margin-left_10" type="primary" effect="dark" size="small" v-if="patent.simpleStatus">{{
                     simpleStatus[patent.simpleStatus] }}</el-tag>
-                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" @click="openAddRemark(patent)" v-if="noveltySearch">添加查新标注</el-tag>
+                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" @click="openAddRemark(patent)" v-if="noveltySearch && !noveltyIsRemark(patent)">添加查新标注</el-tag>
+                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small"  v-if="noveltySearch && noveltyIsRemark(patent)" @click="openAddRemark(patent)">已标注</el-tag>
                 </div>
                 <div style="font-size: 13px;">
                   <el-row>

+ 8 - 5
src/views/project/patentDetails/components/patentDetails.vue

@@ -19,7 +19,8 @@
                 <span v-html="getViewDom(patent.patentNo)"></span>
                 <el-tag type="primary" effect="dark" size="mini" class="margin-left_10" v-if="patent.simpleStatus">{{
                   simpleStatus[patent.simpleStatus] }}</el-tag>
-                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" v-if="noveltySearch" @click="openAddRemark(patent)">添加查新标注</el-tag>
+                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" v-if="noveltySearch && !noveltyIsRemark(patent)" @click="openAddRemark(patent)">添加查新标注</el-tag>
+                  <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" v-if="noveltySearch && noveltyIsRemark(patent)" @click="openAddRemark(patent)">已标注</el-tag>
               </div>
               <div style="color: #6b6868; font-size: 15px;padding-bottom: 5px;">
                 <span v-html="getView(patent, 'title')"></span>
@@ -86,13 +87,13 @@
             <my-view :position="this.positionList.find(item => item.value == radio).position"
               :showView="radio != 1 && activeMenu != activeMenu2">
               <div slot="left">
-                <component :activeName="activeName" style="width:100%;padding-right: 10px;" :is="activeMenu"  :noveltySearch="noveltySearch"
+                <component :activeName="activeName" style="width:100%;padding-right: 10px;" :is="activeMenu"  :noveltySearch="noveltySearch" :retrieveRecordId="retrieveRecordId"
                   :evidence="evidence" :signPatentNo="signPatentNo" :reportType="reportType" :project-id="projectId"
                   :outside="outside" :projectType="projectType" :patent="patent" :patentNo="patent.patentNo"
                   :domId="$commonJS.uuid(36)" @refresh="getPatent()"></component>
               </div>
               <div slot="right">
-                <component :is="activeMenu2" :project-id="projectId" :outside="outside" :projectType="projectType" :noveltySearch="noveltySearch"
+                <component :is="activeMenu2" :project-id="projectId" :outside="outside" :projectType="projectType" :noveltySearch="noveltySearch" :retrieveRecordId="retrieveRecordId"
                   :patent="patent" :signPatentNo="signPatentNo" :reportType="reportType" :sign="true" :patentNo="patent.patentNo"
                   :evidence="evidence"></component>
               </div>
@@ -124,7 +125,7 @@
     <addAndEditReport ref="addAndEditReport"></addAndEditReport>
     <projectListDialog ref="projectListDialog" :importData="condition"></projectListDialog>
     <!-- 查新检索添加标注 -->
-    <addRemark ref="addRemark" v-on="$listeners"></addRemark>
+    <addRemark ref="addRemark" :projectId="projectId" v-on="$listeners"></addRemark>
     <!-- 报告模板 -->
     <reportTemplateDialog ref="reportTemplateDialog"></reportTemplateDialog>
   </div>
@@ -214,7 +215,9 @@ export default {
     },
     noveltySearch:{
       default:false
-    }
+    },
+    retrieveRecordId:{},
+
   },
   data() {
     return {

+ 2 - 0
src/views/project/patentDetails/components/patentMessage/mixins/index.js

@@ -158,6 +158,8 @@ export const patentDetails = {
         a.createFrom = this.outside ? 0 : this.projectType//来源0默认(专利)1专题库2报告
         a.literatureId = this.evidence ? this.evidence.id : null
         a.patentTitle=this.patent.title.find(item => item.if_origin).text_content
+
+        a.retrieveRecordId=this.retrieveRecordId
         this.showMenu(e)
 
         this.$store.commit("SET_PATENT_INDEX", a)

+ 57 - 6
src/views/project/patentDetails/index.vue

@@ -8,17 +8,17 @@
         <div slot="left" style="width:100%">
           <notPatentDetails v-if="evidenceType == 1 " :projectId="projectId" :signPatentNo="signPatentNo" :reportType="reportType" :evidence="evidenceData"></notPatentDetails>
           <!-- <Patent-Details :patentNo="patentNo" :projectId="projectId" :taskId="taskId"></Patent-Details> -->
-          <component v-else :is='components' :noveltySearch="noveltySearch" :patentNo="(signPatentNo && showView)?signPatentNo:patentNo" :value="showView" :evidence="evidenceData" :outside="outside" :projectType="projectType" :lock="signPatentNo?true:false" :signPatentNo="signPatentNo"  :projectId="projectId" :taskId="taskId"
-            :reportType="reportType" :isResult="isResult"></component>
+          <component v-else :is='components' :noveltySearch="noveltySearch" :contrastFileList="saveRemarkList" :retrieveRecordId="retrieveRecordId" :patentNo="(signPatentNo && showView)?signPatentNo:patentNo" :value="showView" :evidence="evidenceData" :outside="outside" :projectType="projectType" :lock="signPatentNo?true:false" :signPatentNo="signPatentNo"  :projectId="projectId" :taskId="taskId"
+            :reportType="reportType" :isResult="isResult" @saveRemark="saveRemark"></component>
         </div>
         <div slot="right" style="width:100%">
           <notPatentDetails v-if="evidenceType == 1 && showView" :projectId="projectId" :signPatentNo="signPatentNo" :reportType="reportType" :evidence="evidenceData"></notPatentDetails>
-          <Patent-Details v-else-if="showView" :noveltySearch="noveltySearch" :patentNo="patentNo" :outside="outside" :value="showView" :projectType="projectType" :evidence="evidenceData" :signPatentNo="signPatentNo" :reportType="reportType" :projectId="projectId" :taskId="taskId"></Patent-Details>
+          <Patent-Details v-else-if="showView" @saveRemark="saveRemark" :contrastFileList="saveRemarkList" :retrieveRecordId="retrieveRecordId" :noveltySearch="noveltySearch" :patentNo="patentNo" :outside="outside" :value="showView" :projectType="projectType" :evidence="evidenceData" :signPatentNo="signPatentNo" :reportType="reportType" :projectId="projectId" :taskId="taskId"></Patent-Details>
         </div>
       </my-View>
     </div>
     <teamwork ref="teamwork" :patentNo="patentNo" :projectId="projectId" :reportType="reportType"></teamwork>
-    <inventionPointDialog v-if="noveltySearch" :projectId="projectId"></inventionPointDialog>
+    <inventionPointDialog v-if="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId" :contrastFileList="saveRemarkList"></inventionPointDialog>
   </div>
 </template>
 
@@ -47,6 +47,7 @@ export default {
       menuList: [],
       evidenceData: {},
       currentState:0,
+      saveRemarkList:[],
     };
   },
   watch: {},
@@ -96,7 +97,10 @@ export default {
     },
     noveltySearch(){
       return this.$route.query.noveltySearch
-    }
+    },
+    retrieveRecordId(){
+      return this.$route.query.retrieveRecordId
+    },
   },
   created() { },
   mounted() {
@@ -119,6 +123,11 @@ export default {
       })
       this.$s.setSession('search',this.search)
     }
+    if(this.noveltySearch){
+      this.queryComparePatent()
+      this.$store.commit('SET_PATENT_NoveltySearchContrastList', [])
+      this.getNoveltySearchContrastList()
+    }
     if (this.evidence) {
       this.evidenceData = JSON.parse(this.evidence)
     } else {
@@ -132,8 +141,46 @@ export default {
     }
     this.$store.commit('SET_PATENT_PIZHU_CONTRAST', [])
     this.getPiZhuData()
+    
   },
   methods: {
+
+    //查询对比文件
+    queryComparePatent(){
+      var params = {
+        projectId:this.projectId
+      }
+      this.$api.queryComparePatent(params).then(response=>{
+        if(response.code == 200){
+          this.saveRemarkList = response.data.data
+        }
+      })
+    },
+    saveRemark(data){
+      if(this.noveltySearch){
+        this.queryComparePatent()
+      }
+    },
+
+    //获取查新检索对比记录
+    getNoveltySearchContrastList(){
+      var params = {
+        projectId:this.projectId,
+        patentNo:this.patentNo
+      }
+      this.$api.queryNoveltyCompareRecord(params).then(response=>{
+        if(response.code == 200){
+          if (this.highlight.NoveltySearchContrastList.length > 0) {
+            var a = this.highlight.NoveltySearchContrastList.filter(item => {
+              return item.patentNo != params.patentNo
+            }).concat(response.data)
+          } else {
+            var a = response.data
+          }
+          this.$store.commit('SET_PATENT_NoveltySearchContrastList', a)
+        }
+      })
+    },
     //获取对比记录
     getContrast(){
       if(!this.evidence){
@@ -244,6 +291,9 @@ export default {
       if(this.reportType == 1 || this.reportType == 2){
         this.getContrast()
       }
+      if(this.noveltySearch){
+        this.getNoveltySearchContrastList()
+      }
       this.getPiZhuData()
       if(window.history.state){
         this.currentState = window.history.state.key
@@ -265,7 +315,8 @@ export default {
             projectType:this.projectType,
             productId:this.productId,
             projectName:this.projectName,
-            noveltySearch:this.noveltySearch
+            noveltySearch:this.noveltySearch,
+            retrieveRecordId:this.retrieveRecordId
           }
         }
       )

+ 3 - 1
src/views/report/analysisAndOpinion/components/searchRecords/dialog/addAndEditSearchRecords.vue

@@ -52,7 +52,9 @@ export default {
   props: {
     projectId:{
         default:0
-    }
+    },
+    addApi:{},
+    editApi:{}
   },
   data() {
     return {

+ 52 - 18
src/views/report/components/reportFile/reportFileTable.vue

@@ -40,14 +40,19 @@
             </template>
           </el-table-column>
 
-          <el-table-column label="操作" align="center" width="150">
+          <el-table-column label="操作" align="center" width="160">
             <template slot-scope="scope">
               <el-dropdown split-button type="primary" size="small" @command="handleCommand($event, scope.row)">
-                <span @click="handleCommand('e', scope.row)">编辑</span>
+                <span @click="handleCommand('e', scope.row)">{{scope.row.ifHaveFinalFile !== false?'编辑':'编辑报告内容'}}</span>
 
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
-                  <el-dropdown-item command="0">下载</el-dropdown-item>
-                  <el-dropdown-item command="1">预览</el-dropdown-item>
+                  <template v-if="scope.row.ifHaveFinalFile !== false">
+                    <el-dropdown-item command="0">下载</el-dropdown-item>
+                    <el-dropdown-item command="1">预览</el-dropdown-item>
+                  </template>
+                  <template v-else>
+                    <el-dropdown-item command="generateReport">生成报告</el-dropdown-item>
+                  </template>
                   <el-dropdown-item command="2" divided style="color: red;">删除</el-dropdown-item>
                 </el-dropdown-menu>
               </el-dropdown>
@@ -90,7 +95,7 @@
 <script>
 import { downLoad2 } from "@/utils"
 export default {
-  props: ['projectId'],
+  props: ['projectId','queryApi','deleteApi'],
   data() {
     return {
       // table数据
@@ -269,17 +274,7 @@ export default {
       this.dialogVisible = true
     },
     getList() {
-      this.tableData = [
-        {
-          referencesName:'浙江大华查新检索报告模板.docx',
-          type:'docx',
-          projectName:'查新检索报告',
-          createName:'管理员',
-          createTime:'2024-09-07'
-        }
-      ]
-      this.total = 1
-      return
+
       let params = {
         projectId: this.projectId,//放在外面还是searchQuery里面??
         ...this.queryParams,//分页信息
@@ -287,8 +282,9 @@ export default {
         // searchQuery: this.$commonJS.objectToString(this.searchOption || {}),//检索条件
         orderDTOList: this.sort,//排序信息
       }
+      var api = this.queryApi?this.queryApi : 'getReferences'
       this.loading = true
-      this.$api.getReferences(params).then(res => {
+      this.$api[api](params).then(res => {
         if (res.code == 200) {
           this.tableData = res.data.data
           this.total = res.data.total
@@ -352,13 +348,50 @@ export default {
         case '2'://删除
           this.handleDelete(row)
           break;
+        case 'generateReport'://生成报告
+          this.generateReport(row)
+          break;
 
         default:
           break;
       }
     },
+    //生成报告
+    generateReport(row){
+      var message = this.$message({
+                message: '报告生成中...',
+                type: 'warning',
+                duration:0
+            });
+            var params = {
+                id:row.id
+            }
+            this.$api.exportNoveltyReport(params).then(response=>{
+                if(response.code == 200){
+                    message.close()
+                    this.$message.success('报告生成成功')
+                    this.getList()
+                }
+            }).catch(error=>{
+                message.close()
+                this.$message.error('报告生成失败')
+            })
+    },
     // 编辑
     handleEdit(data) {
+      if(data.ifHaveFinalFile === false){
+        let router = this.$router.resolve({
+          path: '/exportReport',
+          query: {
+            templateId: data.templateId,
+            projectId: this.projectId,
+            reportFileId:data.id,
+            editModel:true
+          }
+        })
+        window.open(router.href, '_blank')
+        return
+      }
       var row = JSON.parse(JSON.stringify(data))
       row.systemFileList = [{
         name: row.referencesName,
@@ -378,7 +411,8 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        this.$api.deleteReferences(ids).then(response => {
+        var api = this.deleteApi?this.deleteApi:'deleteReferences'
+        this.$api[api](ids).then(response => {
           if (response.code == 200) {
             this.$message.success('删除成功')
             this.queryParams.current = 1