RequestAccessNot.vue 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877
  1. <template>
  2. <div class="RequestAccess-all" v-loading.fullscreen.lock="RequestAccessLoading" :element-loading-text="loadingtext">
  3. <el-dialog :close-on-click-modal="false" top="28vh" width="450px" title="添加公务出访(无团组)" :visible.sync="AddRequestAccessVisible">
  4. <div class="RequestAccess-li">
  5. <label>公务名称:</label>
  6. <el-input style="width:312px" size="small" v-model="invName" placeholder="请输入公务名称"></el-input>
  7. </div>
  8. <div class="RequestAccess-btn">
  9. <el-button type="primary" @click="InvitationAI_NoGroupAdd" size="small">确 定</el-button>
  10. <el-button size="small" @click="AddRequestAccessVisible=false">取消</el-button>
  11. </div>
  12. </el-dialog>
  13. <el-dialog :close-on-click-modal="false" top="18vh" width="450px" title="AI访问关键字设置" :visible.sync="RequestAccessVisible">
  14. <div class="RequestAccess-ul">
  15. <!-- <div class="RequestAccess-li">
  16. <label>公务名称:</label>
  17. <el-input style="width:312px" size="small" v-model="invName" placeholder="请输入公务名称"></el-input>
  18. </div> -->
  19. <div class="RequestAccess-li">
  20. <label>拜访单位:</label>
  21. <el-select style="width:312px" size="small" filterable remote :filter-method="InvAIClientKeywordSearch" :loading="selectLoadings" v-model="unitName" clearable placeholder="请选择">
  22. <el-option v-for="item in unitNamess" :key="item" :label="item" :value="item">
  23. </el-option>
  24. </el-select>
  25. </div>
  26. <div class="RequestAccess-li">
  27. <label>拜访国家:</label>
  28. <el-select style="width:312px" size="small" multiple filterable remote :filter-method="InvAICountryKeywordSearch" :loading="selectLoadingss" v-model="countrie" clearable placeholder="请选择">
  29. <el-option v-for="item in countriess" :key="item" :label="item" :value="item">
  30. </el-option>
  31. </el-select>
  32. </div>
  33. <div class="RequestAccess-li">
  34. <label>拜访时间:</label>
  35. <el-date-picker style="width:312px" size="small" v-model="visitDate" type="date" placeholder="选择日期">
  36. </el-date-picker>
  37. </div>
  38. <div class="RequestAccess-li">
  39. <label>拜访目的:</label>
  40. <el-input style="width:312px" size="small" v-model="objective" placeholder="请输入拜访目的"></el-input>
  41. </div>
  42. <div class="RequestAccess-li">
  43. <label>规模类型:</label>
  44. <el-select style="width:312px" size="small" multiple filterable v-model="orgScale" clearable placeholder="请选择">
  45. <el-option v-for="item in orgScales" :key="item" :label="item" :value="item">
  46. </el-option>
  47. </el-select>
  48. </div>
  49. <div class="RequestAccess-li">
  50. <label>行业:</label>
  51. <el-select style="width:312px" size="small" multiple filterable v-model="industryNode" clearable placeholder="请选择">
  52. <el-option v-for="item in industryNodes" :key="item" :label="item" :value="item">
  53. </el-option>
  54. </el-select>
  55. </div>
  56. <div class="RequestAccess-li">
  57. <label>华人单位筛选:</label>
  58. <el-radio-group v-model="isBackground">
  59. <el-radio :label="true">筛选</el-radio>
  60. <el-radio :label="false">不筛选</el-radio>
  61. </el-radio-group>
  62. </div>
  63. <div class="RequestAccess-li">
  64. <label>公司层级:</label>
  65. <el-radio-group v-model="orgLevel">
  66. <el-radio v-for="(item,index) in orgLevels" :key="index" :label="item">{{item}}</el-radio>
  67. </el-radio-group>
  68. </div>
  69. <div class="RequestAccess-li" style="align-items: flex-start;">
  70. <label>其他信息:</label>
  71. <el-input style="width:312px" type="textarea" rows="3" size="small" v-model="otherConstraints"></el-input>
  72. </div>
  73. <div class="RequestAccess-btn">
  74. <el-button type="primary" @click="InvitationAI_NoGroupSetPrompt" size="small">确 定</el-button>
  75. <el-button size="small" @click="RequestAccessVisible=false">取消</el-button>
  76. </div>
  77. </div>
  78. </el-dialog>
  79. <el-dialog :close-on-click-modal="false" top="5vh" width="900px" title="邮件预览" :visible.sync="RequestAccessEmailVisible">
  80. <div style="margin-bottom: 15px;">
  81. <div class="quill-title" style="font-weight: 600;margin-bottom: 5px;">邮件标题:</div>
  82. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="contenttitle"></el-input>
  83. </div>
  84. <!-- 新增:附件上传区域 -->
  85. <div style="margin-bottom: 15px;">
  86. <div class="quill-title" style="font-weight: 600;margin-bottom: 5px;">邮件附件:</div>
  87. <div class="attachment-section">
  88. <el-upload
  89. class="pop-upload"
  90. ref="upload"
  91. action="#"
  92. :file-list="fileList"
  93. :auto-upload="false"
  94. :multiple="true"
  95. :on-change="handleChange"
  96. :on-remove="handleremove"
  97. name="files"
  98. accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.jpg,.jpeg,.png,.zip,.rar">
  99. <el-button size="small" slot="trigger" type="primary" icon="el-icon-upload">选择文件(可多选)</el-button>
  100. <el-button style="margin-left:15px ;" @click="handleEmailAttachmentUpload" size="small" type="primary">上传</el-button>
  101. <div slot="tip" class="el-upload__tip">支持多文件上传</div>
  102. </el-upload>
  103. <!-- 上传进度 -->
  104. <div class="upload-progress" v-if="uploadProgress.visible">
  105. <el-progress :percentage="uploadProgress.percent" :status="uploadProgress.status"></el-progress>
  106. <div class="upload-progress-text">{{ uploadProgress.text }}</div>
  107. </div>
  108. <!-- 已上传附件列表 -->
  109. <div class="email-attachment-list" v-if="emailAttachments.length > 0">
  110. <div class="attachment-header">
  111. <span>已上传附件({{ emailAttachments.length }}个)</span>
  112. <el-button type="text" size="small" @click="clearAllAttachments"
  113. style="color: #F56C6C;">清空全部</el-button>
  114. </div>
  115. <div v-for="(file, index) in emailAttachments" :key="index" class="attachment-item">
  116. <i class="el-icon-document"></i>
  117. <span class="attachment-name">{{ file.split('/').pop() }}</span>
  118. <!-- <span class="attachment-size">{{ formatFileSize(file.fileSize) }}</span> -->
  119. <el-button type="text" size="small" @click="previewAttachment(file)"
  120. v-if="canPreview(file)">预览</el-button>
  121. <el-button v-if="canDownload(file)" type="text" size="small" @click="downloadAttachment(file)">下载</el-button>
  122. <el-button type="text" size="small" style="color: #F56C6C;"
  123. @click="removeEmailAttachment(index,file.split('/').pop())">删除</el-button>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. <div class="quill-title" style="font-weight: 600;margin-bottom: 5px;">邮件内容:</div>
  129. <div class="quill-box">
  130. <quill-editor class="editor" ref="myTextEditor" v-model="content" :options="editorOption"
  131. @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @ready="onEditorReady($event)"
  132. @change="onEditorChange($event)">
  133. <button id="custom-button">defineAsyncComponent</button>
  134. </quill-editor>
  135. </div>
  136. <div class="quill-btn">
  137. <el-button type="primary" @click="InvitationAI_NoGroupEmailSave" size="small">保 存</el-button>
  138. <el-button size="small" @click="RequestAccessEmailVisible=false">取 消</el-button>
  139. </div>
  140. </el-dialog>
  141. <div class="RequestAccess-hader">
  142. <div class="RequestAccess-hader-top">
  143. <div>
  144. <el-select style="width:250px" @change="InvitationAI_NoGroupItemByName" size="small" filterable remote :filter-method="InvAIKeywordSearch" :loading="selectLoading" v-model="itemNameid" placeholder="请选择">
  145. <el-option v-for="item in itemNamess" :key="item.id" :label="item.name" :value="item.id">
  146. </el-option>
  147. </el-select>
  148. </div>
  149. <div>
  150. <el-button type="primary" size="small" @click="openaddbox">新增</el-button>
  151. <el-button type="primary" size="small" @click="InvitationAI_NoGroupInsertResource">添加入资料库</el-button>
  152. <!-- <el-button type="primary" size="small" @click="BusinessSynchronizationWrite" >行程单位传递</el-button> -->
  153. <el-button type="primary" size="small" @click="AIKeyWords">AI关键字设置</el-button>
  154. <!-- <el-button type="primary" size="small" @click="InvitationAICompleteText" >AI续查</el-button> -->
  155. <el-button type="primary" size="small" @click="InvitationAI_NoGroupSearchStreamProgress">AI重新搜索公务方/机构(覆盖)</el-button>
  156. <el-button type="primary" size="small" @click="InvitationAI_NoGroupCompleteTextStream" >AI续查</el-button>
  157. <!-- <el-button type="primary" size="small" @click="InvitationAISearch">AI重新搜索公务方/机构(覆盖)</el-button> -->
  158. <el-button type="primary" size="small" @click="InvitationAI_NoGroupFileGenerator">下载文件</el-button>
  159. <!-- <el-button type="primary" size="small" @click="InvitationAIGenerateEmail">AI生成邮件</el-button> -->
  160. <el-button type="primary" size="small" @click="InvitationAI_NoGroupGenerateEmailStream">AI生成邮件</el-button>
  161. <!-- <el-button type="primary" size="small" @click="InvitationAISeedEmail">发送邮件</el-button> -->
  162. <el-button type="primary" size="small" @click="InvitationAI_NoGroupSeedEmailStream">发送邮件</el-button>
  163. </div>
  164. </div>
  165. </div>
  166. <div class="RequestAccess-table">
  167. <el-table height="700" ref="multipleTable" :data="tableData" border style="width: 100%" @select="tableselect" @select-all="handleSelectAll" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
  168. <el-table-column type="selection" prop="isChecked" width="55">
  169. </el-table-column>
  170. <el-table-column type="index" label="序号" width="50">
  171. </el-table-column>
  172. <el-table-column prop="region" label="国家" width="80">
  173. <template slot-scope="scope">
  174. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.region">
  175. </el-input>
  176. </template>
  177. </el-table-column>
  178. <el-table-column prop="nameCn" label="名称">
  179. <template slot-scope="scope">
  180. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.nameCn">
  181. </el-input>
  182. </template>
  183. </el-table-column>
  184. <el-table-column prop="address" label="地址">
  185. <template slot-scope="scope">
  186. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.address">
  187. </el-input>
  188. </template>
  189. </el-table-column>
  190. <el-table-column prop="scope" label="经营范围">
  191. <template slot-scope="scope">
  192. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.scope">
  193. </el-input>
  194. </template>
  195. </el-table-column>
  196. <el-table-column prop="contact" label="联系人">
  197. <template slot-scope="scope">
  198. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.contact">
  199. </el-input>
  200. </template>
  201. </el-table-column>
  202. <el-table-column prop="phone" label="联系电话" width="140">
  203. <template slot-scope="scope">
  204. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.phone">
  205. </el-input>
  206. </template>
  207. </el-table-column>
  208. <!-- <el-table-column label="官方网址">
  209. <template slot-scope="scope">
  210. <el-link type="primary" :href="scope.row.siteUrl" target="_blank">{{scope.row.siteUrl}}</el-link>
  211. </template>
  212. </el-table-column> -->
  213. <el-table-column prop="email" label="联系邮箱">
  214. <template slot-scope="scope">
  215. <el-input type="textarea" autosize placeholder="请输入内容" size="small" v-model="scope.row.email">
  216. </el-input>
  217. </template>
  218. </el-table-column>
  219. <el-table-column label="相关信息" width="80">
  220. <template slot-scope="scope">
  221. <el-popover v-if="scope.row.postUrl.length>0" placement="right" width="400" trigger="hover">
  222. <div style="margin-bottom: 15px;" v-for="(item,index) in scope.row.postUrl" :key="index">
  223. <div>时间:{{ item.date }}</div>
  224. <div>内容:{{ item.description }}</div>
  225. <div>
  226. <div>链接:</div>
  227. <el-link type="primary" :href="item.url" target="_blank">{{ item.url }}</el-link>
  228. </div>
  229. </div>
  230. <el-button slot="reference" type="primary" size="mini">查看</el-button>
  231. </el-popover>
  232. <div v-else>
  233. 暂无信息
  234. </div>
  235. </template>
  236. </el-table-column>
  237. <el-table-column prop="address" label="操作" width="100">
  238. <template slot-scope="scope">
  239. <div style="display: flex;flex-direction: column;align-items: center;">
  240. <el-button style="width:85px" type="primary" @click="EmailPreview(scope.row)" size="mini">{{scope.row.emailInfo.status===4?'已发送':'邮件预览'}}</el-button>
  241. <el-button style="margin: 10px 0;width:85px" type="primary" @click="InvitationAI_NoGroupSave(scope.row)" size="mini">保 存</el-button>
  242. <el-button style="margin:0;width:85px" type="danger" @click="InvitationAI_NoGroupSingleDel(scope.row)" size="mini" >删 除</el-button>
  243. </div>
  244. </template>
  245. </el-table-column>
  246. </el-table>
  247. <div class="RAaddline">
  248. <el-button size="small" @click="addlineclick" type="primary">添加一行</el-button>
  249. </div>
  250. </div>
  251. </div>
  252. </template>
  253. <script>
  254. import { streamRequestGET, streamRequestPOST } from '@/store/streamRequest';
  255. import { co } from '@fullcalendar/core/internal-common';
  256. export default {
  257. data () {
  258. return {
  259. RequestAccessLoading:false,
  260. userid: '',
  261. value:'',
  262. options: [],
  263. tableData:[],
  264. RequestAccessVisible:false,
  265. AddRequestAccessVisible:false,
  266. RequestAccessEmailVisible:false,
  267. itemNameid:'',
  268. itemNames:[],
  269. itemNamess:[],
  270. invName:'',
  271. objective:'',
  272. unitName:'',
  273. unitNames:[],
  274. unitNamess:[],
  275. countrie:[],
  276. countries:[],
  277. countriess:[],
  278. otherConstraints:'',
  279. selectLoading:false,
  280. selectLoadings:false,
  281. selectLoadingss:false,
  282. multipleSelection: [],
  283. entry:{},
  284. Id:0,
  285. contenttitle:'',
  286. singleguid:'',
  287. industryNode:[],
  288. industryNodes:[],
  289. orgScale:[],
  290. orgScales:[],
  291. isBackground:'',
  292. //富文本
  293. content: '',
  294. contents:'',
  295. editorOption: {
  296. modules: {
  297. toolbar: [
  298. ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线
  299. ["blockquote", "code-block"], // 引用 代码块
  300. [{ header: 1 }, { header: 2 }], // 1、2 级标题
  301. [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表
  302. [{ script: "sub" }, { script: "super" }], // 上标/下标
  303. [{ indent: "-1" }, { indent: "+1" }], // 缩进
  304. // [{'direction': 'rtl'}], // 文本方向
  305. [{ size: ["small", false, "large", "huge"] }], // 字体大小
  306. [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
  307. [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
  308. [{ font: [] }], // 字体种类
  309. [{ align: [] }], // 对齐方式
  310. ["clean"], // 清除文本格式
  311. ["link", "image", "video"], // 链接、图片、视频
  312. ["sourceEditor"]
  313. ], //工具菜单栏配置
  314. },
  315. placeholder: '编写邮件内容', //提示
  316. readyOnly: false, //是否只读
  317. theme: 'snow', //主题 snow/bubble
  318. syntax: true, //语法检测
  319. },
  320. cs:`<p><span class="ql-font-monospace" style="color: rgb(220, 54, 46);">&lt;h3&gt;Official Study Visit Inquiry – Chengdu Yimin Group &amp;amp; Washington State Premium Apple Cooperative&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Dear Leaders at the Washington State Premium Apple Cooperative,&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;On behalf of Chengdu Yimin Group—responsible for securing Chengdu’s food security and elevating access to premium agricultural products—I am pleased to formally request a strategic study visit to your cooperative in June 2025.&lt;/p&gt;&lt;p&gt;As a vital player in Chengdu’s push for sustainable, traceable food systems, we recognize that &lt;strong&gt;integrating global horticultural standards with premium market access&lt;/strong&gt; is key to meeting urban consumers’ growing demand for high-quality produce. Your Cooperative, with 50,000 mu of orchards, 20,000 tons of annual exports, and certifications in HACCP and GlobalGAP, leads Washington’s apple industry by merging sustainable farming with success in China and European premium markets. We aim to draw on your expertise to strengthen our own premium agricultural sourcing and export capabilities.&lt;/p&gt;&lt;p&gt;We are particularly interested in:&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Integration of GlobalGAP and HACCP standards across apple cultivation, harvesting, and post-harvest handling;&lt;/li&gt;&lt;li&gt;Sustainable farming techniques for producing high-yield, nutrient-dense premium apple varieties;&lt;/li&gt;&lt;li&gt;Branding and distribution strategies for premium apples in China and Europe—including regulatory alignment and consumer trust-building.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We propose a 2–3 day visit during the week of June 1, 2025, including orchard and processing facility tours, discussions with your agronomists and market leads, and insights into export compliance. This visit will allow us to learn from your end-to-end model while exploring synergies in premium produce trade.&lt;/p&gt;&lt;p&gt;Enclosed please find the &lt;em&gt;StrategicInquiryBrief&lt;/em&gt; detailing our priorities and logistics. We are confident this engagement will foster a partnership aligned with global trends in sustainable agriculture and high-value food trade. Please advise on your availability for next steps.&lt;/p&gt;&lt;p&gt;— Sincerely,&lt;/p&gt;&lt;p&gt;Chengdu Yimin Group11&lt;/p&gt;</span></p>`,
  321. abortController:null,
  322. loadingtext:'正在加载',
  323. fileList:[],
  324. emailAttachments: [], // 邮件附件列表(仅用于展示,不影响保存)
  325. uploadProgress: {
  326. visible: false,
  327. percent: 0,
  328. status: null,
  329. text: ''
  330. },
  331. isUploading: false, // 添加上传锁标识,防止重复上传
  332. visitDate:'',
  333. orgLevels:[],
  334. orgLevel:'',
  335. }
  336. },
  337. methods:{
  338. //处理时间
  339. disposeTime(val){
  340. var date = new Date(val);
  341. var y = date.getFullYear();
  342. var m = date.getMonth() + 1;
  343. m = m < 10 ? ('0' + m) : m;
  344. var d = date.getDate();
  345. d = d < 10 ? ('0' + d) : d;
  346. let time = y + '-' + m + '-' + d;
  347. return time
  348. },
  349. // 失去焦点
  350. onEditorBlur(editor) {
  351. // this.content=this.contents
  352. // this.$refs.myTextEditor.quill.enable(false);
  353. // setTimeout(()=>{
  354. // this.$refs.myTextEditor.quill.enable(true);
  355. // },1000)
  356. },
  357. // 获得焦点
  358. onEditorFocus(editor) {},
  359. // 开始
  360. onEditorReady(editor) {},
  361. // 值发生变化
  362. onEditorChange(editor) {
  363. // this.contents = editor.text;
  364. },
  365. initSelection() {
  366. this.$nextTick(() => {
  367. this.tableData.forEach(row => {
  368. if (row.isChecked) {
  369. this.$refs.multipleTable.toggleRowSelection(row, true);
  370. }
  371. });
  372. });
  373. },
  374. //选中
  375. InvitationAI_NoGroupSetChecked(guids){
  376. var url = "/api/Resource/InvitationAI_NoGroupSetChecked"
  377. var that = this
  378. this.$axios({
  379. method: 'post',
  380. url: url,
  381. headers: {
  382. Authorization: 'Bearer '
  383. },
  384. data: {
  385. id: that.Id,
  386. currUserId: that.userid,
  387. guids:guids
  388. }
  389. }).then(function (res) {
  390. })
  391. },
  392. handleSelectionChange(val) {
  393. this.multipleSelection = val;
  394. // this.InvitationAISetChecked(guids);
  395. },
  396. tableselect(val){
  397. this.multipleSelection = val;
  398. var guids=[];
  399. for (let i = 0; i < this.multipleSelection.length; i++) {
  400. guids.push(this.multipleSelection[i].guid);
  401. }
  402. this.InvitationAI_NoGroupSetChecked(guids);
  403. },
  404. handleSelectAll(val){
  405. this.multipleSelection = val;
  406. var guids=[];
  407. for (let i = 0; i < this.multipleSelection.length; i++) {
  408. guids.push(this.multipleSelection[i].guid);
  409. }
  410. this.InvitationAI_NoGroupSetChecked(guids);
  411. },
  412. AIKeyWords(){
  413. this.otherConstraints = this.entry!={}?this.entry.otherConstraints:'';
  414. this.countrie = this.entry!={}?this.entry.targetCountry:[];
  415. this.unitName = this.entry!={}?this.entry.originUnit:'';
  416. this.invName = this.entry!={}?this.entry.invName:'';
  417. this.visitDate = this.entry!={}?this.entry.visitDate:'';
  418. this.objective = this.entry!={}?this.entry.objective:'';
  419. this.orgScale = this.entry!={}?this.entry.scaleTypes:[];
  420. this.industryNode = this.entry!={}?this.entry.industries:[];
  421. this.isBackground = this.entry!={}?this.entry.isBackground:'';
  422. this.orgLevel = this.entry!={}?this.entry.orgLevel:'';
  423. this.RequestAccessVisible=true;
  424. },
  425. //获取基础数据
  426. InvitationAI_NoGroupInit() {
  427. var url = "/api/Resource/InvitationAI_NoGroupInit"
  428. var that = this
  429. new Promise(function (resolve, reject) {
  430. that.$axios({
  431. method: 'get',
  432. url: url,
  433. headers: {
  434. Authorization: 'Bearer '
  435. }
  436. }).then(function (res) {
  437. if (res.data.code == 200) {
  438. that.itemNames = res.data.data.itemNames;
  439. that.itemNamess = that.itemNames;
  440. if (that.itemNameid=='') {
  441. that.itemNameid = that.itemNames[0].id;
  442. }
  443. that.unitNames = res.data.data.unitNames;
  444. that.unitNamess = that.unitNames;
  445. that.countries = res.data.data.countries;
  446. that.countriess = that.countries;
  447. that.orgScales = res.data.data.orgScales;
  448. that.industryNodes = res.data.data.industryNodes;
  449. that.orgLevels = res.data.data.orgLevels;
  450. resolve();
  451. } else {
  452. that.$message({
  453. type: 'error',
  454. message: res.data.msg
  455. });
  456. }
  457. })
  458. }).then(() => {
  459. this.InvitationAI_NoGroupItemByName();
  460. });
  461. },
  462. //添加一行
  463. addlineclick() {
  464. // 生成唯一标识
  465. const newGuid = this.generateGuid();
  466. // 新行数据模板
  467. const newRow = {
  468. guid: newGuid,
  469. region: '', // 国家
  470. nameCn: '', // 名称
  471. address: '', // 地址
  472. scope: '', // 经营范围
  473. contact: '', // 联系人
  474. phone: '', // 联系电话
  475. email: '', // 联系邮箱
  476. postUrl: [
  477. {
  478. date:"",
  479. description:"",
  480. url:"",
  481. }
  482. ], // 相关信息链接
  483. isChecked: false, // 是否选中
  484. source: 2, // 来源:2-手动添加,1-AI生成
  485. emailInfo: { // 邮件信息
  486. status: 0, // 0-未生成,1-已生成,4-已发送
  487. emailTitle: '',
  488. emailContent: ''
  489. },
  490. intgAdvice:'',
  491. recLevel:'',
  492. industry:'',
  493. nameEn:'',
  494. siteUrl:'',
  495. remark: '',
  496. };
  497. // 添加到表格数据最前面
  498. this.tableData.unshift(newRow);
  499. // 可选:滚动到顶部
  500. this.$nextTick(() => {
  501. const table = this.$refs.multipleTable;
  502. if (table && table.$el) {
  503. table.$el.scrollIntoView({ behavior: 'smooth' });
  504. }
  505. });
  506. this.$message({
  507. message: '已添加新行,请填写信息后保存',
  508. type: 'success',
  509. duration: 2000
  510. });
  511. },
  512. /**
  513. * 生成唯一标识
  514. */
  515. generateGuid() {
  516. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  517. const r = Math.random() * 16 | 0;
  518. const v = c === 'x' ? r : (r & 0x3 | 0x8);
  519. return v.toString(16);
  520. });
  521. },
  522. //邮件预览
  523. EmailPreview(val){
  524. this.RequestAccessEmailVisible = true;
  525. var contents = '';
  526. this.contenttitle = '';
  527. this.singleguid = '';
  528. this.emailAttachments = []; // 清空附件列表
  529. this.uploadProgress = {
  530. visible: false,
  531. percent: 0,
  532. status: null,
  533. text: ''
  534. };
  535. if (this.$marked && typeof this.$marked === 'function') {
  536. contents = this.$marked(val.emailInfo.emailContent);
  537. } else {
  538. contents = val.emailInfo.emailContent;
  539. }
  540. console.log(this.content);
  541. this.content = contents;
  542. this.contenttitle = val.emailInfo.emailTitle;
  543. this.singleguid = val.guid;
  544. // 加载已有附件(仅用于展示)
  545. if (val.emailInfo.attachmentPaths && val.emailInfo.attachmentPaths.length > 0) {
  546. for (let i = 0; i < val.emailInfo.attachmentPaths.length; i++) {
  547. console.log(val.emailInfo.attachmentPaths[i]);
  548. this.emailAttachments.push(val.emailInfo.attachmentPaths[i])
  549. console.log(this.emailAttachments);
  550. }
  551. // this.emailAttachments = [...val.emailInfo.attachmentPaths];
  552. }
  553. },
  554. // 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用,function(file, fileList)
  555. handleChange(file, fileList) {
  556. this.fileList=fileList;
  557. },
  558. //未上传时移除文件
  559. handleremove(file, fileList) {
  560. this.fileList=fileList;
  561. },
  562. /**
  563. * 文件上传前校验
  564. */
  565. beforeEmailAttachmentUpload(file) {
  566. // const isLt10M = file.size / 1024 / 1024 < 10;
  567. // if (!isLt10M) {
  568. // this.$message.error(`文件 ${file.name} 大小不能超过 10MB!`);
  569. // return false;
  570. // }
  571. const allowedExts = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'jpg', 'jpeg', 'png', 'zip', 'rar'];
  572. const ext = file.name.split('.').pop().toLowerCase();
  573. const isAllowedType = allowedExts.includes(ext);
  574. if (!isAllowedType) {
  575. this.$message.error(`文件 ${file.name} 格式不支持!`);
  576. return false;
  577. }
  578. return true;
  579. },
  580. /**
  581. * 处理邮件附件上传(支持多文件)
  582. */
  583. handleEmailAttachmentUpload() {
  584. if (this.isUploading) {
  585. this.$message.warning('正在上传中,请稍后...');
  586. return;
  587. }
  588. // 设置上传锁
  589. this.isUploading = true;
  590. const formData = new FormData();
  591. this.fileList.forEach(file => {
  592. formData.append('Attachments', file.raw);
  593. });
  594. formData.append('Guid', this.singleguid);
  595. formData.append('Id', this.Id);
  596. formData.append('CurrUserId', this.userid);
  597. // 显示上传进度
  598. this.uploadProgress.visible = true;
  599. this.uploadProgress.percent = 0;
  600. this.uploadProgress.status = null;
  601. this.uploadProgress.text = '上传中...';
  602. var that = this
  603. new Promise(function (resolve, reject) {
  604. that.RequestAccessLoading=true;
  605. that.$axios({
  606. method: 'post',
  607. url: '/api/Resource/InvitationAI_NoGroupFileSave', // 多文件上传接口
  608. headers: {
  609. 'Authorization': 'Bearer ',
  610. 'Content-Type': 'multipart/form-data'
  611. },
  612. data: formData,
  613. onUploadProgress: (progressEvent) => {
  614. const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
  615. that.uploadProgress.percent = percent;
  616. if (percent === 100) {
  617. that.uploadProgress.text = '上传完成,处理中...';
  618. } else {
  619. that.uploadProgress.text = `上传中 ${percent}%`;
  620. }
  621. }
  622. }).then(response => {
  623. that.uploadProgress.visible = false;
  624. that.emailAttachments = []
  625. if (response.data.code === 200) {
  626. const uploadedFiles = response.data.data;
  627. if (uploadedFiles && uploadedFiles.length > 0) {
  628. uploadedFiles.forEach(file => {
  629. that.emailAttachments.push(file);
  630. });
  631. that.$message.success(`成功上传 ${uploadedFiles.length} 个文件`);
  632. } else {
  633. that.$message.success('文件上传成功');
  634. }
  635. that.fileList = []
  636. resolve();
  637. } else {
  638. that.RequestAccessLoading=false;
  639. that.$message.error(response.data.msg || '上传失败');
  640. }
  641. }).catch(error => {
  642. that.RequestAccessLoading=false;
  643. that.uploadProgress.visible = false;
  644. that.$message.error('上传失败:' + (error.message || '网络错误'));
  645. }).finally(() => {
  646. // 无论成功或失败,都释放上传锁
  647. that.isUploading = false;
  648. });
  649. }).then(() => {
  650. this.InvitationAI_NoGroupItemByName();
  651. });
  652. },
  653. /**
  654. * 删除附件
  655. */
  656. removeEmailAttachment(index,val) {
  657. this.$confirm('确定要删除该附件吗?', '提示', {
  658. confirmButtonText: '确定',
  659. cancelButtonText: '取消',
  660. type: 'warning'
  661. }).then(() => {
  662. this.RequestAccessLoading=true;
  663. var that = this
  664. new Promise(function (resolve, reject) {
  665. // 调用删除接口
  666. that.$axios({
  667. method: 'post',
  668. url: '/api/Resource/InvitationAI_NoGroupFileDel',
  669. headers: {
  670. 'Authorization': 'Bearer '
  671. },
  672. data: {
  673. id: that.Id,
  674. currUserId: that.userid,
  675. guid: that.singleguid,
  676. attachmentNames: [val],
  677. }
  678. }).then(res => {
  679. if (res.data.code === 200) {
  680. that.emailAttachments = [];
  681. // this.emailAttachments.splice(index, 1);
  682. const uploadedFiles = res.data.data;
  683. uploadedFiles.forEach(file => {
  684. that.emailAttachments.push(file);
  685. });
  686. that.$message.success(res.data.msg);
  687. resolve();
  688. } else {
  689. that.RequestAccessLoading=false;
  690. that.$message.error(res.data.msg || '删除失败');
  691. }
  692. }).catch(error => {
  693. that.RequestAccessLoading=false;
  694. that.$message.error('删除失败:' + (error.message || '网络错误'));
  695. });
  696. }).then(() => {
  697. this.InvitationAI_NoGroupItemByName();
  698. });
  699. }).catch(() => { });
  700. },
  701. /**
  702. * 清空所有附件
  703. */
  704. clearAllAttachments() {
  705. if (this.emailAttachments.length === 0) {
  706. this.$message.info('没有可清空的附件');
  707. return;
  708. }
  709. this.$confirm(`确定要清空全部 ${this.emailAttachments.length} 个附件吗?`, '提示', {
  710. confirmButtonText: '确定',
  711. cancelButtonText: '取消',
  712. type: 'warning'
  713. }).then(() => {
  714. this.RequestAccessLoading=true;
  715. const attachmentIds = this.emailAttachments.map(a => a.split('/').pop());
  716. var that = this
  717. new Promise(function (resolve, reject) {
  718. // 调用删除接口
  719. that.$axios({
  720. method: 'post',
  721. url: '/api/Resource/InvitationAI_NoGroupFileDel',
  722. headers: {
  723. 'Authorization': 'Bearer '
  724. },
  725. data: {
  726. id: that.Id,
  727. currUserId: that.userid,
  728. guid: that.singleguid,
  729. attachmentNames: attachmentIds,
  730. }
  731. }).then(res => {
  732. if (res.data.code === 200) {
  733. that.emailAttachments = [];
  734. const uploadedFiles = res.data.data;
  735. uploadedFiles.forEach(file => {
  736. that.emailAttachments.push(file);
  737. });
  738. that.$message.success(res.data.msg);
  739. resolve();
  740. } else {
  741. that.RequestAccessLoading=false;
  742. that.$message.error(res.data.msg || '删除失败');
  743. }
  744. }).catch(error => {
  745. that.RequestAccessLoading=false;
  746. that.$message.error('删除失败:' + (error.message || '网络错误'));
  747. });
  748. }).then(() => {
  749. this.InvitationAI_NoGroupItemByName();
  750. });
  751. }).catch(() => { });
  752. },
  753. /**
  754. * 预览附件
  755. */
  756. previewAttachment(file) {
  757. if (file) {
  758. const previewableExts = ['pdf', 'jpg', 'jpeg', 'png', 'gif', 'txt'];
  759. const ext = file.split('.').pop().toLowerCase();
  760. if (previewableExts.includes(ext)) {
  761. window.open(file, '_blank');
  762. } else {
  763. this.$message.info('该文件类型不支持在线预览,请下载后查看');
  764. this.downloadAttachment(file);
  765. }
  766. } else {
  767. this.$message.warning('文件地址不存在');
  768. }
  769. },
  770. /**
  771. * 下载附件
  772. */
  773. downloadAttachment(file) {
  774. if (file) {
  775. window.open(file);
  776. // const link = document.createElement('a');
  777. // link.href = file;
  778. // link.download = file;
  779. // document.body.appendChild(link);
  780. // link.click();
  781. // document.body.removeChild(link);
  782. } else {
  783. this.$message.warning('文件地址不存在');
  784. }
  785. },
  786. /**
  787. * 判断是否可以预览
  788. */
  789. canPreview(file) {
  790. const previewableExts = ['pdf', 'jpg', 'jpeg', 'png', 'gif', 'txt'];
  791. const ext = file.split('.').pop().toLowerCase();
  792. return previewableExts.includes(ext) && file;
  793. },
  794. //判断是否可以下载
  795. canDownload(file) {
  796. const previewableExts = ['pdf', 'jpg', 'jpeg', 'png', 'gif', 'txt'];
  797. const ext = file.split('.').pop().toLowerCase();
  798. return !previewableExts.includes(ext) && file;
  799. },
  800. /**
  801. * 格式化文件大小
  802. */
  803. formatFileSize(bytes) {
  804. if (bytes === 0) return '0 B';
  805. const k = 1024;
  806. const sizes = ['B', 'KB', 'MB', 'GB'];
  807. const i = Math.floor(Math.log(bytes) / Math.log(k));
  808. return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
  809. },
  810. //dakaixinzeng
  811. openaddbox(){
  812. this.invName='',
  813. this.AddRequestAccessVisible=true
  814. },
  815. //添加公务出访(无团组)
  816. InvitationAI_NoGroupAdd() {
  817. this.RequestAccessLoading=true;
  818. var url = "/api/Resource/InvitationAI_NoGroupAdd"
  819. var that = this
  820. new Promise(function (resolve, reject) {
  821. that.$axios({
  822. method: 'post',
  823. url: url,
  824. headers: {
  825. Authorization: 'Bearer '
  826. },
  827. data: {
  828. invName: that.invName,
  829. currUserId: that.userid,
  830. }
  831. }).then(function (res) {
  832. if (res.data.code == 200) {
  833. that.$message({
  834. message: res.data.msg,
  835. type: 'success',
  836. });
  837. that.AddRequestAccessVisible=false;
  838. resolve();
  839. } else {
  840. that.RequestAccessLoading=false;
  841. that.$message({
  842. type: 'error',
  843. message: res.data.msg
  844. });
  845. }
  846. })
  847. }).then(() => {
  848. that.InvitationAI_NoGroupInit();
  849. });
  850. },
  851. //邮件修改保存
  852. InvitationAI_NoGroupEmailSave() {
  853. this.RequestAccessLoading=true;
  854. var url = "/api/Resource/InvitationAI_NoGroupEmailSave"
  855. var that = this
  856. new Promise(function (resolve, reject) {
  857. that.$axios({
  858. method: 'post',
  859. url: url,
  860. headers: {
  861. Authorization: 'Bearer '
  862. },
  863. data: {
  864. id: that.Id,
  865. currUserId: that.userid,
  866. guid:that.singleguid,
  867. emailTitle:that.contenttitle,
  868. emailContent:that.content,
  869. }
  870. }).then(function (res) {
  871. if (res.data.code == 200) {
  872. that.$message({
  873. message: res.data.msg,
  874. type: 'success',
  875. });
  876. that.RequestAccessEmailVisible=false;
  877. resolve();
  878. } else {
  879. that.RequestAccessLoading=false;
  880. that.$message({
  881. type: 'error',
  882. message: res.data.msg
  883. });
  884. }
  885. })
  886. }).then(() => {
  887. that.InvitationAI_NoGroupItemByName();
  888. });
  889. },
  890. //查询资料
  891. InvitationAISearch() {
  892. this.RequestAccessLoading=true;
  893. var url = "/api/Resource/InvitationAISearch"
  894. var that = this
  895. new Promise(function (resolve, reject) {
  896. that.$axios({
  897. method: 'post',
  898. url: url,
  899. headers: {
  900. Authorization: 'Bearer '
  901. },
  902. data: {
  903. id: that.Id,
  904. currUserId: that.userid,
  905. }
  906. }).then(function (res) {
  907. if (res.data.code == 200) {
  908. that.$message({
  909. message: res.data.msg,
  910. type: 'success',
  911. });
  912. resolve();
  913. } else {
  914. that.RequestAccessLoading=false;
  915. that.$message({
  916. type: 'error',
  917. message: res.data.msg
  918. });
  919. }
  920. })
  921. }).then(() => {
  922. that.InvitationAI_NoGroupItemByName();
  923. });
  924. },
  925. //资料续查
  926. InvitationAICompleteText() {
  927. this.RequestAccessLoading=true;
  928. var url = "/api/Resource/InvitationAICompleteText"
  929. var that = this
  930. new Promise(function (resolve, reject) {
  931. that.$axios({
  932. method: 'post',
  933. url: url,
  934. headers: {
  935. Authorization: 'Bearer '
  936. },
  937. data: {
  938. id: that.Id,
  939. currUserId: that.userid,
  940. }
  941. }).then(function (res) {
  942. if (res.data.code == 200) {
  943. that.$message({
  944. message: res.data.msg,
  945. type: 'success',
  946. });
  947. resolve();
  948. } else {
  949. that.RequestAccessLoading=false;
  950. that.$message({
  951. type: 'error',
  952. message: res.data.msg
  953. });
  954. }
  955. })
  956. }).then(() => {
  957. that.InvitationAI_NoGroupItemByName();
  958. });
  959. },
  960. //根据id获取团名称
  961. reasonidgetname(id) {
  962. var name = '';
  963. for (let i = 0; i < this.itemNames.length; i++) {
  964. if (this.itemNames[i].id == id) {
  965. name = this.itemNames[i].name;
  966. break;
  967. }
  968. }
  969. return name;
  970. },
  971. //下载文件
  972. InvitationAI_NoGroupFileGenerator() {
  973. this.RequestAccessLoading=true;
  974. var url = "/api/Resource/InvitationAI_NoGroupFileGenerator/"+this.Id
  975. var that = this
  976. this.$axios({
  977. method: 'get',
  978. url: url,
  979. headers: {
  980. Authorization: 'Bearer '
  981. },
  982. }).then(function (res) {
  983. if (res.data.code == 200) {
  984. that.RequestAccessLoading=false;
  985. window.open(res.data.data.url);
  986. } else {
  987. that.RequestAccessLoading=false;
  988. that.$message({
  989. type: 'error',
  990. message: res.data.msg
  991. });
  992. }
  993. })
  994. },
  995. //流式(生成邮件)
  996. InvitationAI_NoGroupGenerateEmailStream() {
  997. var guids=[];
  998. for (let i = 0; i < this.multipleSelection.length; i++) {
  999. guids.push(this.multipleSelection[i].guid);
  1000. }
  1001. if (guids.length==0) {
  1002. this.$message({
  1003. type: 'error',
  1004. message: '请选择需要生成的邮件!'
  1005. });
  1006. return;
  1007. }
  1008. this.RequestAccessLoading = true;
  1009. var url = "http://132.232.92.186:8888/api/Resource/InvitationAI_NoGroupGenerateEmailStream"
  1010. this.loadingtext = '';
  1011. var that = this
  1012. this.abortController = streamRequestPOST(
  1013. url,
  1014. {
  1015. id: that.Id,
  1016. currUserId: that.userid,
  1017. guids:guids
  1018. },
  1019. (data) => {
  1020. that.loadingtext = data.message;
  1021. if (data.progress != -1) {
  1022. if (data.progress === 100) {
  1023. // that.RequestAccessLoading=false;
  1024. that.$message({
  1025. message: data.message,
  1026. type: 'success',
  1027. });
  1028. that.loadingtext='正在加载';
  1029. that.InvitationAI_NoGroupItemByName();
  1030. }
  1031. } else {
  1032. that.RequestAccessLoading = false;
  1033. that.$message({
  1034. type: 'error',
  1035. message: data.message
  1036. });
  1037. }
  1038. }
  1039. );
  1040. },
  1041. //流式(发送邮件)
  1042. InvitationAI_NoGroupSeedEmailStream() {
  1043. var guids=[];
  1044. for (let i = 0; i < this.multipleSelection.length; i++) {
  1045. guids.push(this.multipleSelection[i].guid);
  1046. }
  1047. if (guids.length==0) {
  1048. this.$message({
  1049. type: 'error',
  1050. message: '请选择需要发送的邮件!'
  1051. });
  1052. return;
  1053. }
  1054. this.RequestAccessLoading = true;
  1055. var url = "http://132.232.92.186:8888/api/Resource/InvitationAI_NoGroupSeedEmailStream"
  1056. this.loadingtext = '';
  1057. var that = this
  1058. this.abortController = streamRequestPOST(
  1059. url,
  1060. {
  1061. id: that.Id,
  1062. currUserId: that.userid,
  1063. guids:guids
  1064. },
  1065. (data) => {
  1066. that.loadingtext = data.message;
  1067. if (data.progress != -1) {
  1068. if (data.progress === 100) {
  1069. // that.RequestAccessLoading=false;
  1070. that.$message({
  1071. message: data.message,
  1072. type: 'success',
  1073. });
  1074. that.loadingtext='正在加载';
  1075. that.InvitationAI_NoGroupItemByName();
  1076. }
  1077. } else {
  1078. that.RequestAccessLoading = false;
  1079. that.$message({
  1080. type: 'error',
  1081. message: data.message
  1082. });
  1083. }
  1084. }
  1085. );
  1086. },
  1087. //流式(AI重新搜索公务方/机构(续写))
  1088. InvitationAI_NoGroupCompleteTextStream() {
  1089. this.RequestAccessLoading=true;
  1090. var url = "http://132.232.92.186:8888/api/Resource/InvitationAI_NoGroupCompleteTextStream"
  1091. this.loadingtext='';
  1092. var that = this
  1093. streamRequestPOST(
  1094. url,
  1095. {
  1096. id:that.Id,
  1097. currUserId:that.userid,
  1098. },
  1099. (data) => {
  1100. that.loadingtext=data.message;
  1101. if (data.progress!=-1) {
  1102. if (data.progress===100) {
  1103. // that.RequestAccessLoading=false;
  1104. that.$message({
  1105. message: data.message,
  1106. type: 'success',
  1107. });
  1108. that.loadingtext='正在加载';
  1109. that.InvitationAI_NoGroupItemByName();
  1110. }
  1111. }else{
  1112. that.RequestAccessLoading=false;
  1113. that.$message({
  1114. type: 'error',
  1115. message:data.message
  1116. });
  1117. }
  1118. });
  1119. },
  1120. //AI重新搜索公务方/机构(覆盖)
  1121. InvitationAI_NoGroupSearchStreamProgress() {
  1122. this.RequestAccessLoading = true;
  1123. var url = "http://132.232.92.186:8888/api/Resource/InvitationAI_NoGroupSearchStreamProgress"
  1124. this.loadingtext = '';
  1125. var that = this
  1126. this.abortController = streamRequestPOST(
  1127. url,
  1128. {
  1129. id: that.Id,
  1130. currUserId: that.userid,
  1131. },
  1132. (data) => {
  1133. that.loadingtext = data.message;
  1134. if (data.progress != -1) {
  1135. if (data.progress === 100) {
  1136. // that.RequestAccessLoading=false;
  1137. that.loadingtext='正在加载';
  1138. that.$message({
  1139. message: data.message,
  1140. type: 'success',
  1141. });
  1142. that.InvitationAI_NoGroupItemByName();
  1143. }
  1144. } else {
  1145. that.RequestAccessLoading = false;
  1146. that.$message({
  1147. type: 'error',
  1148. message: data.message
  1149. });
  1150. }
  1151. }
  1152. );
  1153. },
  1154. //资料列表、
  1155. InvitationAI_NoGroupItemByName() {
  1156. this.RequestAccessLoading=true;
  1157. var url = "/api/Resource/InvitationAI_NoGroupItemByName/"+this.reasonidgetname(this.itemNameid)
  1158. var that = this
  1159. this.$axios({
  1160. method: 'get',
  1161. url: url,
  1162. headers: {
  1163. Authorization: 'Bearer '
  1164. },
  1165. }).then(function (res) {
  1166. that.tableData=[];
  1167. that.otherConstraints='';
  1168. that.countrie=[];
  1169. that.unitName='';
  1170. that.invName='';
  1171. that.objective='';
  1172. that.Id=0;
  1173. if (res.data.code == 200) {
  1174. that.tableData = res.data.data.aiCrawledDetails;
  1175. that.Id = res.data.data.id;
  1176. that.entry = res.data.data.entry;
  1177. that.entry.invName=res.data.data.invName;
  1178. that.initSelection();
  1179. that.RequestAccessLoading=false;
  1180. // that.otherConstraints = res.data.data.id!=0?res.data.data.entry.otherConstraints:'';
  1181. // that.countrie = res.data.data.id!=0?res.data.data.entry.targetCountry:'';
  1182. // that.unitName = res.data.data.id!=0?res.data.data.entry.originUnit:'';
  1183. } else {
  1184. that.RequestAccessLoading=false;
  1185. that.$message({
  1186. type: 'error',
  1187. message: res.data.msg
  1188. });
  1189. }
  1190. })
  1191. },
  1192. //保存
  1193. InvitationAI_NoGroupSave(val) {
  1194. this.RequestAccessLoading=true;
  1195. var url = "/api/Resource/InvitationAI_NoGroupSave"
  1196. var that = this
  1197. new Promise(function (resolve, reject) {
  1198. that.$axios({
  1199. method: 'post',
  1200. url: url,
  1201. headers: {
  1202. Authorization: 'Bearer '
  1203. },
  1204. data: {
  1205. id: that.Id,
  1206. currUserId: that.userid,
  1207. aiCrawledDetail:val
  1208. }
  1209. }).then(function (res) {
  1210. if (res.data.code == 200) {
  1211. that.$message({
  1212. message: res.data.msg,
  1213. type: 'success',
  1214. });
  1215. resolve();
  1216. } else {
  1217. that.RequestAccessLoading=false;
  1218. that.$message({
  1219. type: 'error',
  1220. message: res.data.msg
  1221. });
  1222. }
  1223. })
  1224. }).then(() => {
  1225. that.InvitationAI_NoGroupItemByName();
  1226. });
  1227. },
  1228. //生成邮件
  1229. InvitationAIGenerateEmail() {
  1230. var guids=[];
  1231. for (let i = 0; i < this.multipleSelection.length; i++) {
  1232. guids.push(this.multipleSelection[i].guid);
  1233. }
  1234. if (guids.length==0) {
  1235. this.$message({
  1236. type: 'error',
  1237. message: '请选择需要生成的邮件!'
  1238. });
  1239. return;
  1240. }
  1241. this.RequestAccessLoading=true;
  1242. var url = "/api/Resource/InvitationAIGenerateEmail"
  1243. var that = this
  1244. new Promise(function (resolve, reject) {
  1245. that.$axios({
  1246. method: 'post',
  1247. url: url,
  1248. headers: {
  1249. Authorization: 'Bearer '
  1250. },
  1251. data: {
  1252. id: that.Id,
  1253. currUserId: that.userid,
  1254. guids:guids
  1255. }
  1256. }).then(function (res) {
  1257. if (res.data.code == 200) {
  1258. that.$message({
  1259. message: res.data.msg,
  1260. type: 'success',
  1261. });
  1262. resolve();
  1263. } else {
  1264. that.RequestAccessLoading=false;
  1265. that.$message({
  1266. type: 'error',
  1267. message: res.data.msg
  1268. });
  1269. }
  1270. })
  1271. }).then(() => {
  1272. that.InvitationAI_NoGroupItemByName();
  1273. });
  1274. },
  1275. //添加资料库
  1276. InvitationAI_NoGroupInsertResource() {
  1277. var guids=[];
  1278. for (let i = 0; i < this.multipleSelection.length; i++) {
  1279. guids.push(this.multipleSelection[i].guid);
  1280. }
  1281. if (guids.length==0) {
  1282. this.$message({
  1283. type: 'error',
  1284. message: '请选择需要添加的资料!'
  1285. });
  1286. return;
  1287. }
  1288. this.RequestAccessLoading=true;
  1289. var url = "/api/Resource/InvitationAI_NoGroupInsertResource"
  1290. var that = this
  1291. new Promise(function (resolve, reject) {
  1292. that.$axios({
  1293. method: 'post',
  1294. url: url,
  1295. headers: {
  1296. Authorization: 'Bearer '
  1297. },
  1298. data: {
  1299. id: that.Id,
  1300. currUserId: that.userid,
  1301. guids:guids
  1302. }
  1303. }).then(function (res) {
  1304. if (res.data.code == 200) {
  1305. that.$message({
  1306. message: res.data.msg,
  1307. type: 'success',
  1308. });
  1309. resolve();
  1310. } else {
  1311. that.RequestAccessLoading=false;
  1312. that.$message({
  1313. type: 'error',
  1314. message: res.data.msg
  1315. });
  1316. }
  1317. })
  1318. }).then(() => {
  1319. that.InvitationAI_NoGroupItemByName();
  1320. });
  1321. },
  1322. //发送邮件
  1323. InvitationAISeedEmail() {
  1324. var guids=[];
  1325. for (let i = 0; i < this.multipleSelection.length; i++) {
  1326. guids.push(this.multipleSelection[i].guid);
  1327. }
  1328. if (guids.length==0) {
  1329. this.$message({
  1330. type: 'error',
  1331. message: '请选择需要发送邮件的单位!'
  1332. });
  1333. return;
  1334. }
  1335. this.RequestAccessLoading=true;
  1336. var url = "/api/Resource/InvitationAISeedEmail"
  1337. var that = this
  1338. new Promise(function (resolve, reject) {
  1339. that.$axios({
  1340. method: 'post',
  1341. url: url,
  1342. headers: {
  1343. Authorization: 'Bearer '
  1344. },
  1345. data: {
  1346. id: that.Id,
  1347. currUserId: that.userid,
  1348. guids:guids
  1349. }
  1350. }).then(function (res) {
  1351. if (res.data.code == 200) {
  1352. that.$message({
  1353. message: res.data.msg,
  1354. type: 'success',
  1355. });
  1356. resolve();
  1357. // that.RequestAccessLoading=false;
  1358. } else {
  1359. that.RequestAccessLoading=false;
  1360. that.$message({
  1361. type: 'error',
  1362. message: res.data.msg
  1363. });
  1364. }
  1365. })
  1366. }).then(() => {
  1367. that.InvitationAI_NoGroupItemByName();
  1368. });
  1369. },
  1370. //单行删除
  1371. InvitationAI_NoGroupSingleDel(row){
  1372. this.$confirm('此操作将删除该数据, 是否继续?', '提示', {
  1373. confirmButtonText: '确定',
  1374. cancelButtonText: '取消',
  1375. type: 'warning'
  1376. }).then(() => {
  1377. if(this.Id===0){
  1378. this.tableData.splice(this.tableData.findIndex(item=>item.guid===row.guid),1);
  1379. this.$message({
  1380. message: '删除成功',
  1381. type: 'success',
  1382. });
  1383. return;
  1384. }
  1385. var url = "/api/Resource/InvitationAI_NoGroupSingleDel"
  1386. var that = this
  1387. new Promise(function (resolve, reject) {
  1388. that.$axios({
  1389. method: 'post',
  1390. url: url,
  1391. headers: {
  1392. Authorization: 'Bearer '
  1393. },
  1394. data: {
  1395. id: that.Id,
  1396. guid: row.guid,
  1397. }
  1398. }).then(function (res) {
  1399. if (res.data.code == 200) {
  1400. that.$message({
  1401. message: res.data.msg,
  1402. type: 'success',
  1403. });
  1404. resolve();
  1405. } else {
  1406. that.$message({
  1407. type: 'error',
  1408. message: res.data.msg
  1409. });
  1410. }
  1411. })
  1412. }).then(() => {
  1413. that.InvitationAI_NoGroupItemByName();
  1414. })
  1415. }).catch(() => {
  1416. this.$message({
  1417. type: 'info',
  1418. message: '操作已取消!'
  1419. });
  1420. });
  1421. },
  1422. //关键字设置
  1423. InvitationAI_NoGroupSetPrompt(){
  1424. var url = "/api/Resource/InvitationAI_NoGroupSetPrompt"
  1425. var that = this
  1426. new Promise(function (resolve, reject) {
  1427. that.$axios({
  1428. method: 'post',
  1429. url: url,
  1430. headers: {
  1431. Authorization: 'Bearer '
  1432. },
  1433. data: {
  1434. id: that.itemNameid,
  1435. originUnit: that.unitName,
  1436. visitDate: that.disposeTime(that.visitDate),
  1437. objective: that.objective,
  1438. targetCountry: that.countrie,
  1439. industries: that.industryNode,
  1440. scaleTypes: that.orgScale,
  1441. isBackground: that.isBackground,
  1442. otherConstraints: that.otherConstraints,
  1443. orgLevel: that.orgLevel,
  1444. currUserId: that.userid
  1445. }
  1446. }).then(function (res) {
  1447. if (res.data.code == 200) {
  1448. that.$message({
  1449. message: res.data.msg,
  1450. type: 'success',
  1451. });
  1452. that.RequestAccessVisible = false;
  1453. resolve();
  1454. } else {
  1455. that.$message({
  1456. type: 'error',
  1457. message: res.data.msg
  1458. });
  1459. }
  1460. })
  1461. }).then(()=>{
  1462. that.InvitationAI_NoGroupInit();
  1463. });
  1464. },
  1465. //联想搜索提示
  1466. InvAIKeywordSearch(query) {
  1467. if (query !== '') {
  1468. this.selectLoading=true;
  1469. var url = "/api/search/InvAIKeywordSearch/" + query
  1470. var that = this
  1471. this.$axios({
  1472. method: 'get',
  1473. url: url,
  1474. headers: {
  1475. Authorization: 'Bearer '
  1476. },
  1477. }).then(function (res) {
  1478. if (res.data.code == 200) {
  1479. that.itemNamess = res.data.data;
  1480. }else{
  1481. that.itemNamess=[];
  1482. }
  1483. }).finally(()=>{
  1484. that.selectLoading=false;
  1485. })
  1486. }else{
  1487. this.itemNamess = this.itemNames;
  1488. }
  1489. },
  1490. //联想搜索提示
  1491. InvAIClientKeywordSearch(query) {
  1492. if (query !== '') {
  1493. this.selectLoadings=true;
  1494. var url = "/api/search/InvAIClientKeywordSearch/" + query
  1495. var that = this
  1496. this.$axios({
  1497. method: 'get',
  1498. url: url,
  1499. headers: {
  1500. Authorization: 'Bearer '
  1501. },
  1502. }).then(function (res) {
  1503. if (res.data.code == 200) {
  1504. that.unitNamess = res.data.data;
  1505. }else{
  1506. that.unitNamess=[];
  1507. }
  1508. }).finally(()=>{
  1509. that.selectLoadings=false;
  1510. })
  1511. }else{
  1512. this.unitNamess = this.unitNames;
  1513. }
  1514. },
  1515. //联想搜索提示
  1516. InvAICountryKeywordSearch(query) {
  1517. if (query !== '') {
  1518. this.selectLoadingss=true;
  1519. var url = "/api/search/InvAICountryKeywordSearch/" + query
  1520. var that = this
  1521. this.$axios({
  1522. method: 'get',
  1523. url: url,
  1524. headers: {
  1525. Authorization: 'Bearer '
  1526. },
  1527. }).then(function (res) {
  1528. if (res.data.code == 200) {
  1529. that.countriess = res.data.data;
  1530. }else{
  1531. that.countriess=[];
  1532. }
  1533. }).finally(()=>{
  1534. that.selectLoadingss=false;
  1535. })
  1536. }else{
  1537. this.countriess = this.countries;
  1538. }
  1539. },
  1540. //单位传递
  1541. BusinessSynchronizationWrite() {
  1542. var enterpriseNames=[];
  1543. for (let i = 0; i < this.multipleSelection.length; i++) {
  1544. enterpriseNames.push(this.multipleSelection[i].nameCn);
  1545. }
  1546. if (enterpriseNames.length==0) {
  1547. this.$message({
  1548. type: 'error',
  1549. message: '请选择需要传递的单位!'
  1550. });
  1551. return;
  1552. }
  1553. this.RequestAccessLoading=true;
  1554. var url = "/api/Groups/BusinessSynchronizationWrite"
  1555. var that = this
  1556. this.$axios({
  1557. method: 'post',
  1558. url: url,
  1559. headers: {
  1560. Authorization: 'Bearer '
  1561. },
  1562. data:{
  1563. diid:that. itemNameid,
  1564. enterpriseNames:enterpriseNames,
  1565. }
  1566. }).then(function (res) {
  1567. if (res.data.code == 200) {
  1568. that.RequestAccessLoading=false;
  1569. that.$message({
  1570. message: res.data.msg,
  1571. type: 'success',
  1572. });
  1573. }else{
  1574. that.RequestAccessLoading=false;
  1575. that.$message({
  1576. message: res.data.msg,
  1577. type: 'error',
  1578. });
  1579. }
  1580. })
  1581. },
  1582. tableRowClassName({ row }) {
  1583. if (row.source===1) {
  1584. return 'error-row';
  1585. }
  1586. // if (row.status === 'error') {
  1587. // return 'error-row';
  1588. // } else if (row.status === 'success') {
  1589. // return 'success-row';
  1590. // }
  1591. return '';
  1592. }
  1593. },
  1594. mounted() {
  1595. this.userid = JSON.parse(localStorage.getItem('userinif')).userInfo.userId;
  1596. this.InvitationAI_NoGroupInit();
  1597. }
  1598. }
  1599. </script>
  1600. <style>
  1601. .error-row {
  1602. color: green !important;
  1603. }
  1604. .error-row .el-textarea__inner{
  1605. color: green !important;
  1606. }
  1607. .RequestAccess-all {
  1608. background-color: #fff;
  1609. padding: 10px;
  1610. box-shadow: 0 0 5px #0005;
  1611. border-radius: 10px;
  1612. min-height: 768px;
  1613. }
  1614. .RequestAccess-hader-top{
  1615. display: flex;
  1616. justify-content: space-between;
  1617. }
  1618. .RequestAccess-table{
  1619. margin-top: 20px;
  1620. }
  1621. .RequestAccess-li{
  1622. display: flex;
  1623. align-items: center;
  1624. margin-bottom: 20px;
  1625. }
  1626. .RequestAccess-li>label{
  1627. width: 98px;
  1628. text-align: right;
  1629. }
  1630. .RequestAccess-li .el-radio{
  1631. margin-top: 4px;
  1632. }
  1633. .RequestAccess-btn{
  1634. text-align: right;
  1635. }
  1636. .quill-btn{
  1637. text-align: right;
  1638. }
  1639. .RAaddline {
  1640. margin-top: 10px;
  1641. text-align: center;
  1642. }
  1643. /*富文本样式*/
  1644. .quill-box{
  1645. display: flex;
  1646. align-items: baseline;
  1647. margin-bottom: 22px;
  1648. }
  1649. .quill-box .ql-container{
  1650. height: 86%;
  1651. }
  1652. .quill-title{
  1653. font-size: 14px;
  1654. color: #606266;
  1655. width: 70px;
  1656. text-align: right;
  1657. padding: 0 12px 0 0;
  1658. }
  1659. .quill-box .editor {
  1660. line-height: normal !important;
  1661. height: 500px;
  1662. width: 100%;
  1663. }
  1664. .quill-box .ql-snow .ql-tooltip[data-mode=link]::before {
  1665. content: "请输入链接地址:";
  1666. }
  1667. .quill-box .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
  1668. border-right: 0px;
  1669. content: '保存';
  1670. padding-right: 0px;
  1671. }
  1672. .quill-box .ql-snow .ql-tooltip[data-mode=video]::before {
  1673. content: "请输入视频地址:";
  1674. }
  1675. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-label::before,
  1676. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-item::before {
  1677. content: '14px';
  1678. }
  1679. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
  1680. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
  1681. content: '10px';
  1682. }
  1683. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
  1684. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
  1685. content: '18px';
  1686. }
  1687. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
  1688. .quill-box .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
  1689. content: '32px';
  1690. }
  1691. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label::before,
  1692. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item::before {
  1693. content: '文本';
  1694. }
  1695. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
  1696. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
  1697. content: '标题1';
  1698. }
  1699. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
  1700. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
  1701. content: '标题2';
  1702. }
  1703. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
  1704. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
  1705. content: '标题3';
  1706. }
  1707. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
  1708. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
  1709. content: '标题4';
  1710. }
  1711. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
  1712. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
  1713. content: '标题5';
  1714. }
  1715. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
  1716. .quill-box .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
  1717. content: '标题6';
  1718. }
  1719. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-label::before,
  1720. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-item::before {
  1721. content: '标准字体';
  1722. }
  1723. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
  1724. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
  1725. content: '衬线字体';
  1726. }
  1727. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
  1728. .quill-box .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
  1729. content: '等宽字体';
  1730. }
  1731. /* 多文件上传样式 */
  1732. .attachment-section {
  1733. border: 1px solid #EBEEF5;
  1734. border-radius: 4px;
  1735. padding: 15px;
  1736. background-color: #FAFAFA;
  1737. }
  1738. .attachment-uploader {
  1739. margin-bottom: 15px;
  1740. }
  1741. .upload-progress-list {
  1742. margin: 10px 0;
  1743. padding: 10px;
  1744. background-color: #F5F7FA;
  1745. border-radius: 4px;
  1746. }
  1747. .upload-progress-item {
  1748. margin-bottom: 10px;
  1749. }
  1750. .upload-progress-item:last-child {
  1751. margin-bottom: 0;
  1752. }
  1753. .progress-name {
  1754. font-size: 12px;
  1755. color: #606266;
  1756. margin-bottom: 5px;
  1757. display: block;
  1758. }
  1759. .email-attachment-list {
  1760. max-height: 250px;
  1761. overflow-y: auto;
  1762. border-top: 1px solid #EBEEF5;
  1763. padding-top: 10px;
  1764. }
  1765. .attachment-header {
  1766. display: flex;
  1767. justify-content: space-between;
  1768. align-items: center;
  1769. padding: 5px 0 10px 0;
  1770. font-size: 14px;
  1771. font-weight: 600;
  1772. color: #606266;
  1773. }
  1774. .attachment-item {
  1775. display: flex;
  1776. align-items: center;
  1777. padding: 8px 12px;
  1778. background-color: #FFFFFF;
  1779. margin-bottom: 8px;
  1780. border-radius: 4px;
  1781. border: 1px solid #EBEEF5;
  1782. transition: all 0.3s;
  1783. }
  1784. .attachment-item:hover {
  1785. background-color: #F5F7FA;
  1786. border-color: #409EFF;
  1787. }
  1788. .attachment-item i {
  1789. margin-right: 8px;
  1790. color: #409EFF;
  1791. }
  1792. .attachment-item .attachment-name {
  1793. flex: 1;
  1794. font-size: 14px;
  1795. color: #606266;
  1796. word-break: break-all;
  1797. }
  1798. .attachment-item .attachment-size {
  1799. margin: 0 10px;
  1800. font-size: 12px;
  1801. color: #909399;
  1802. }
  1803. .attachment-item .el-button--text {
  1804. margin: 0 5px;
  1805. padding: 0;
  1806. }
  1807. .el-upload__tip {
  1808. font-size: 12px;
  1809. color: #909399;
  1810. margin-top: 5px;
  1811. }
  1812. </style>