index.vue 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535
  1. <template>
  2. <div class="ele-body">
  3. <el-card
  4. class="card_box"
  5. :body-style="{
  6. display: 'flex',
  7. flexDirection: 'column',
  8. alignItems: 'flex-start'
  9. }"
  10. shadow="never"
  11. >
  12. <ele-split-layout
  13. width="252px"
  14. allow-collapse
  15. :right-style="{ overflow: 'hidden' }"
  16. >
  17. <div class="ele-border-lighter split-layout-right-content">
  18. <!-- 动态表单配置-->
  19. <div class="content-box">
  20. <div
  21. v-for="category in Object.keys(templateList)"
  22. :key="category"
  23. class="category_box"
  24. >
  25. <div class="category_box_title">{{
  26. getDictV('collaborative_type', category)
  27. }}</div>
  28. <div class="category_box_content">
  29. <div
  30. v-for="v in templateList[category]"
  31. :key="v.id"
  32. class="category_content"
  33. :title="v.name"
  34. @click="handleStartProcess(v)"
  35. >
  36. <svg-icon
  37. style="width: 1.5em; height: 1.5em"
  38. :icon-class="v.icon"
  39. className="svg-icon-set"
  40. ></svg-icon>
  41. <span>
  42. {{
  43. v.name.length > 3
  44. ? v.name[0] + v.name[1] + v.name[2] + '...'
  45. : v.name
  46. }}
  47. </span>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. <!-- 表格 -->
  54. <template v-slot:content>
  55. <div class="tab-box el-form-box">
  56. <el-tabs
  57. type="border-card"
  58. @tab-click="tabClick"
  59. v-model="activeName"
  60. >
  61. <el-tab-pane label="个人记录" name="user">
  62. <ele-pro-table
  63. ref="table"
  64. height="calc(100vh - 380px)"
  65. :columns="columns"
  66. :datasource="datasource"
  67. :init-load="false"
  68. @columns-change="handleColumnChange"
  69. :cache-key="cacheKeyUrl"
  70. :page-size="20"
  71. >
  72. <template v-slot:toolbar="{ row }">
  73. <div class="filter-container">
  74. <el-form
  75. class="ele-form-search"
  76. @keyup.enter.native="reload"
  77. @submit.native.prevent
  78. >
  79. <el-row
  80. :gutter="15"
  81. style="display: flex; align-items: center"
  82. >
  83. <el-col v-bind="{ span: 4 }">
  84. <el-form-item label="分类:" label-width="60px">
  85. <el-select v-model="params.dictType">
  86. <el-option
  87. v-for="(item, index) in dictList[
  88. 'collaborative_type'
  89. ]"
  90. :key="index"
  91. :value="item.value"
  92. :label="item.label"
  93. ></el-option>
  94. </el-select>
  95. </el-form-item>
  96. </el-col>
  97. <el-col v-bind="{ span: 4 }">
  98. <el-form-item label="单据:" label-width="60px">
  99. <el-select v-model="params.formId">
  100. <el-option
  101. v-for="(item, index) in templateList[
  102. params.dictType
  103. ]"
  104. :key="index"
  105. :value="item.id"
  106. :label="item.name"
  107. ></el-option>
  108. </el-select>
  109. </el-form-item>
  110. </el-col>
  111. <el-col v-bind="{ span: 4 }">
  112. <el-form-item
  113. label="结果:"
  114. prop="result"
  115. label-width="60px"
  116. >
  117. <!-- <el-select
  118. v-model="params.status"
  119. placeholder="请选择状态"
  120. clearable
  121. >
  122. <el-option
  123. v-for="dict in statusList"
  124. :key="dict.value"
  125. :label="dict.label"
  126. :value="dict.value"
  127. />
  128. </el-select> -->
  129. <DictSelection
  130. dictName="流程实例的结果"
  131. clearable
  132. v-model="params.result"
  133. >
  134. </DictSelection>
  135. </el-form-item>
  136. </el-col>
  137. <el-col v-bind="{ span: 10 }">
  138. <el-form-item
  139. label="创建时间:"
  140. prop="createTime1"
  141. label-width="90px"
  142. >
  143. <el-date-picker
  144. v-model="createTime1"
  145. style="width: 100%"
  146. value-format="yyyy-MM-dd HH:mm:ss"
  147. type="daterange"
  148. range-separator="-"
  149. start-placeholder="开始日期"
  150. end-placeholder="结束日期"
  151. :default-time="['00:00:00', '23:59:59']"
  152. />
  153. </el-form-item>
  154. </el-col>
  155. </el-row>
  156. </el-form>
  157. </div>
  158. </template>
  159. <template v-slot:toolkit="{ row }">
  160. <div class="filter-container">
  161. <div class="ele-form-actions">
  162. <el-button
  163. type="primary"
  164. icon="el-icon-search"
  165. class="ele-btn-icon"
  166. @click="reload"
  167. >
  168. 查询
  169. </el-button>
  170. <el-button @click="reset">重置</el-button>
  171. </div>
  172. </div>
  173. </template>
  174. <template v-slot:formName="{ row }">
  175. <el-link
  176. type="primary"
  177. :underline="false"
  178. @click="handleDetail(row)"
  179. >
  180. {{ row.formName }}
  181. </el-link>
  182. </template>
  183. <template v-slot:result="{ row }">
  184. <el-tag
  185. size="medium"
  186. :type="
  187. getTimelineItemType(
  188. getDictValue('流程实例的结果', row.result)
  189. )
  190. "
  191. >
  192. {{ getDictValue('流程实例的结果', row.result) }}
  193. </el-tag>
  194. </template>
  195. <template v-slot:dictType="{ row }">
  196. {{ getDictV('collaborative_type', row.dictType) }}
  197. </template>
  198. <template v-slot:durationInMillis="{ row }">
  199. {{ getDateTime(row.durationInMillis) }}
  200. </template>
  201. <template v-slot:name="{ row }">
  202. <el-link
  203. type="primary"
  204. :underline="false"
  205. @click="handleDetail(row)"
  206. >
  207. {{ row.name }}
  208. </el-link>
  209. </template>
  210. <template
  211. v-if="formColumnList.length"
  212. v-for="(item, index) in formColumnList"
  213. v-slot:[item.model]="{ row }"
  214. >
  215. <div v-if="item.type == 'imgupload'">
  216. <el-image
  217. v-if="row[item.model].length"
  218. style="width: 100px; height: 100px"
  219. :src="row[item.model][0].url"
  220. :preview-src-list="row[item.model].map((i) => i.url)"
  221. >
  222. </el-image>
  223. </div>
  224. <div v-else-if="item.type == 'fileupload'">
  225. <!-- <el-button
  226. type="text"
  227. v-if="row[item.model]?.length"
  228. @click="getFiles(row[item.model])"
  229. >下载
  230. </el-button> -->
  231. <fileMain
  232. v-if="row[item.model]?.length"
  233. type="view"
  234. v-model="row[item.model]"
  235. ></fileMain>
  236. </div>
  237. <div v-else-if="item.type == 'userSelect'">
  238. <el-link
  239. type="primary"
  240. :underline="false"
  241. @click="handleDetail(row)"
  242. >
  243. {{ getUserName(row[item.model]) }}
  244. </el-link>
  245. </div>
  246. <div v-else-if="item.type == 'deptAndUserCascader'">
  247. {{ getDeptAndUserName(row[item.model]) }}
  248. </div>
  249. <div v-else-if="item.type == 'deptCascader'">
  250. {{ getDeptName(row[item.model]) }}
  251. </div>
  252. <div v-else>
  253. {{ formatValue(row[item.model]) }}
  254. </div>
  255. </template>
  256. <!-- 操作列 -->
  257. <!-- <template v-slot:action="{ row }">
  258. <el-button
  259. size="mini"
  260. type="text"
  261. icon="el-icon-edit"
  262. @click="handleAudit(row)"
  263. >详情
  264. </el-button>
  265. </template> -->
  266. </ele-pro-table>
  267. </el-tab-pane>
  268. <el-tab-pane label="部门记录" name="dept" v-if="$hasPermission('wt:collaborative:department')">
  269. <ele-pro-table
  270. ref="deptTable"
  271. :columns="deptColumns"
  272. :datasource="deptDatasource"
  273. cache-key="deptDatasource"
  274. :toolkit="[]"
  275. height="calc(100vh - 450px)"
  276. :init-load="false"
  277. >
  278. <template v-slot:toolbar="{ row }">
  279. <div class="filter-container">
  280. <el-form
  281. class="ele-form-search"
  282. @keyup.enter.native="deptReload"
  283. @submit.native.prevent
  284. >
  285. <el-row
  286. :gutter="15"
  287. style="display: flex; align-items: center"
  288. >
  289. <el-col v-bind="{ span: 4 }">
  290. <el-form-item label="分类:" label-width="60px">
  291. <el-select v-model="params.dictType">
  292. <el-option
  293. v-for="(item, index) in dictList[
  294. 'collaborative_type'
  295. ]"
  296. :key="index"
  297. :value="item.value"
  298. :label="item.label"
  299. ></el-option>
  300. </el-select>
  301. </el-form-item>
  302. </el-col>
  303. <el-col v-bind="{ span: 4 }">
  304. <el-form-item label="单据:" label-width="60px">
  305. <el-select v-model="params.formId">
  306. <el-option
  307. v-for="(item, index) in defaultTemplateList"
  308. :key="index"
  309. :value="item.id"
  310. :label="item.name"
  311. ></el-option>
  312. </el-select>
  313. </el-form-item>
  314. </el-col>
  315. <el-col v-bind="{ span: 4 }">
  316. <el-form-item
  317. label="结果:"
  318. prop="result"
  319. label-width="60px"
  320. >
  321. <!-- <el-select
  322. v-model="params.status"
  323. placeholder="请选择状态"
  324. clearable
  325. >
  326. <el-option
  327. v-for="dict in statusList"
  328. :key="dict.value"
  329. :label="dict.label"
  330. :value="dict.value"
  331. />
  332. </el-select> -->
  333. <DictSelection
  334. dictName="流程实例的结果"
  335. clearable
  336. v-model="params.result"
  337. >
  338. </DictSelection>
  339. </el-form-item>
  340. </el-col>
  341. <el-col v-bind="{ span: 4 }">
  342. <el-form-item
  343. label="发起人:"
  344. prop="startUserName"
  345. label-width="70px"
  346. >
  347. <el-input
  348. v-model="params.startUserName"
  349. ></el-input>
  350. </el-form-item>
  351. </el-col>
  352. <el-col v-bind="{ span: 6 }">
  353. <el-form-item
  354. label="创建时间:"
  355. prop="createTime1"
  356. label-width="90px"
  357. >
  358. <el-date-picker
  359. v-model="createTime1"
  360. style="width: 100%"
  361. value-format="yyyy-MM-dd HH:mm:ss"
  362. type="daterange"
  363. range-separator="-"
  364. start-placeholder="开始日期"
  365. end-placeholder="结束日期"
  366. :default-time="['00:00:00', '23:59:59']"
  367. />
  368. </el-form-item>
  369. </el-col>
  370. </el-row>
  371. </el-form>
  372. </div>
  373. </template>
  374. <template v-slot:toolkit="{ row }">
  375. <div class="filter-container">
  376. <div class="ele-form-actions">
  377. <el-button
  378. type="primary"
  379. icon="el-icon-search"
  380. class="ele-btn-icon"
  381. @click="deptReload"
  382. >
  383. 查询
  384. </el-button>
  385. <el-button @click="deptReset">重置</el-button>
  386. </div>
  387. </div>
  388. </template>
  389. <template v-slot:dictType="{ row }">
  390. {{ getDictV('collaborative_type', row.dictType) }}
  391. </template>
  392. <template
  393. v-if="formColumnList.length"
  394. v-for="(item, index) in formColumnList"
  395. v-slot:[item.model]="{ row }"
  396. >
  397. <div v-if="item.type == 'imgupload'">
  398. <el-image
  399. v-if="row[item.model].length"
  400. style="width: 100px; height: 100px"
  401. :src="row[item.model][0].url"
  402. :preview-src-list="row[item.model].map((i) => i.url)"
  403. >
  404. </el-image>
  405. </div>
  406. <div v-else-if="item.type == 'fileupload'">
  407. <!-- <el-button
  408. type="text"
  409. v-if="row[item.model]?.length"
  410. @click="getFiles(row[item.model])"
  411. >下载
  412. </el-button> -->
  413. <fileMain
  414. v-if="row[item.model]?.length"
  415. type="view"
  416. v-model="row[item.model]"
  417. ></fileMain>
  418. </div>
  419. <div v-else-if="item.type == 'userSelect'">
  420. {{ getUserName(row[item.model]) }}
  421. </div>
  422. <div v-else-if="item.type == 'deptAndUserCascader'">
  423. {{ getDeptAndUserName(row[item.model]) }}
  424. </div>
  425. <div v-else-if="item.type == 'deptCascader'">
  426. {{ getDeptName(row[item.model]) }}
  427. </div>
  428. <div v-else>
  429. {{ formatValue(row[item.model]) }}
  430. </div>
  431. </template>
  432. <template v-slot:result="{ row }">
  433. <el-tag
  434. size="medium"
  435. :type="
  436. getTimelineItemType(
  437. getDictValue('流程实例的结果', row.result)
  438. )
  439. "
  440. >
  441. {{ getDictValue('流程实例的结果', row.result) }}
  442. </el-tag>
  443. </template>
  444. <template v-slot:durationInMillis="{ row }">
  445. {{ getDateTime(row.durationInMillis) }}
  446. </template>
  447. <template v-slot:name="{ row }">
  448. <el-link
  449. type="primary"
  450. :underline="false"
  451. @click="handleDetail(row)"
  452. >
  453. {{ row.name }}
  454. </el-link>
  455. </template>
  456. <!-- 操作列 -->
  457. <!-- <template v-slot:action="{ row }">
  458. <el-button
  459. size="mini"
  460. type="text"
  461. icon="el-icon-edit"
  462. @click="handleAudit(row)"
  463. >详情
  464. </el-button>
  465. </template> -->
  466. </ele-pro-table>
  467. </el-tab-pane>
  468. <el-tab-pane label="通知我的记录" name="notice">
  469. <ele-pro-table
  470. ref="noticeTable"
  471. :columns="deptColumns"
  472. :datasource="noticeDatasource"
  473. cache-key="noticeDatasource"
  474. height="calc(100vh - 450px)"
  475. :toolkit="[]"
  476. :init-load="false"
  477. >
  478. <template v-slot:toolbar="{ row }">
  479. <div class="filter-container">
  480. <el-form
  481. class="ele-form-search"
  482. @keyup.enter.native="noticeReload"
  483. @submit.native.prevent
  484. >
  485. <el-row
  486. :gutter="15"
  487. style="display: flex; align-items: center"
  488. >
  489. <el-col v-bind="{ span: 4 }">
  490. <el-form-item label="单据:" label-width="60px">
  491. <el-select v-model="params.dictType">
  492. <el-option
  493. v-for="(item, index) in dictList[
  494. 'collaborative_type'
  495. ]"
  496. :key="index"
  497. :value="item.value"
  498. :label="item.label"
  499. ></el-option>
  500. </el-select>
  501. </el-form-item>
  502. </el-col>
  503. <el-col v-bind="{ span: 4 }">
  504. <el-form-item label="分类:" label-width="60px">
  505. <el-select v-model="params.formId">
  506. <el-option
  507. v-for="(item, index) in defaultTemplateList"
  508. :key="index"
  509. :value="item.id"
  510. :label="item.name"
  511. ></el-option>
  512. </el-select>
  513. </el-form-item>
  514. </el-col>
  515. <el-col v-bind="{ span: 4 }">
  516. <el-form-item
  517. label="结果:"
  518. prop="result"
  519. label-width="60px"
  520. >
  521. <!-- <el-select
  522. v-model="params.status"
  523. placeholder="请选择状态"
  524. clearable
  525. >
  526. <el-option
  527. v-for="dict in statusList"
  528. :key="dict.value"
  529. :label="dict.label"
  530. :value="dict.value"
  531. />
  532. </el-select> -->
  533. <DictSelection
  534. dictName="流程实例的结果"
  535. clearable
  536. v-model="params.result"
  537. >
  538. </DictSelection>
  539. </el-form-item>
  540. </el-col>
  541. <el-col v-bind="{ span: 4 }">
  542. <el-form-item
  543. label="发起人:"
  544. prop="startUserName"
  545. label-width="70px"
  546. >
  547. <el-input
  548. v-model="params.startUserName"
  549. ></el-input>
  550. </el-form-item>
  551. </el-col>
  552. <el-col v-bind="{ span: 6 }">
  553. <el-form-item
  554. label="创建时间:"
  555. prop="createTime1"
  556. label-width="90px"
  557. >
  558. <el-date-picker
  559. v-model="createTime1"
  560. style="width: 100%"
  561. value-format="yyyy-MM-dd HH:mm:ss"
  562. type="daterange"
  563. range-separator="-"
  564. start-placeholder="开始日期"
  565. end-placeholder="结束日期"
  566. :default-time="['00:00:00', '23:59:59']"
  567. />
  568. </el-form-item>
  569. </el-col>
  570. </el-row>
  571. </el-form>
  572. </div>
  573. </template>
  574. <template v-slot:toolkit="{ row }">
  575. <div class="filter-container">
  576. <div class="ele-form-actions">
  577. <el-button
  578. type="primary"
  579. icon="el-icon-search"
  580. class="ele-btn-icon"
  581. @click="noticeReload"
  582. >
  583. 查询
  584. </el-button>
  585. <el-button @click="noticeReset">重置</el-button>
  586. </div>
  587. </div>
  588. </template>
  589. <template v-slot:dictType="{ row }">
  590. {{ getDictV('collaborative_type', row.dictType) }}
  591. </template>
  592. <template
  593. v-if="formColumnList.length"
  594. v-for="(item, index) in formColumnList"
  595. v-slot:[item.model]="{ row }"
  596. >
  597. <div v-if="item.type == 'imgupload'">
  598. <el-image
  599. v-if="row[item.model].length"
  600. style="width: 100px; height: 100px"
  601. :src="row[item.model][0].url"
  602. :preview-src-list="row[item.model].map((i) => i.url)"
  603. >
  604. </el-image>
  605. </div>
  606. <div v-else-if="item.type == 'fileupload'">
  607. <!-- <el-button
  608. type="text"
  609. v-if="row[item.model]?.length"
  610. @click="getFiles(row[item.model])"
  611. >下载
  612. </el-button> -->
  613. <fileMain
  614. v-if="row[item.model]?.length"
  615. type="view"
  616. v-model="row[item.model]"
  617. ></fileMain>
  618. </div>
  619. <div v-else-if="item.type == 'userSelect'">
  620. {{ getUserName(row[item.model]) }}
  621. </div>
  622. <div v-else-if="item.type == 'deptAndUserCascader'">
  623. {{ getDeptAndUserName(row[item.model]) }}
  624. </div>
  625. <div v-else-if="item.type == 'deptCascader'">
  626. {{ getDeptName(row[item.model]) }}
  627. </div>
  628. <div v-else>
  629. {{ formatValue(row[item.model]) }}
  630. </div>
  631. </template>
  632. <template v-slot:result="{ row }">
  633. <el-tag
  634. size="medium"
  635. :type="
  636. getTimelineItemType(
  637. getDictValue('流程实例的结果', row.result)
  638. )
  639. "
  640. >
  641. {{ getDictValue('流程实例的结果', row.result) }}
  642. </el-tag>
  643. </template>
  644. <template v-slot:durationInMillis="{ row }">
  645. {{ getDateTime(row.durationInMillis) }}
  646. </template>
  647. <template v-slot:name="{ row }">
  648. <el-link
  649. type="primary"
  650. :underline="false"
  651. @click="handleDetail(row)"
  652. >
  653. {{ row.name }}
  654. </el-link>
  655. </template>
  656. <!-- 操作列 -->
  657. <!-- <template v-slot:action="{ row }">
  658. <el-button
  659. size="mini"
  660. type="text"
  661. icon="el-icon-edit"
  662. @click="handleAudit(row)"
  663. >详情
  664. </el-button>
  665. </template> -->
  666. </ele-pro-table>
  667. </el-tab-pane>
  668. <el-tab-pane label="全部记录" name="all" v-if="$hasPermission('wt:collaborative:all')">
  669. <ele-pro-table
  670. ref="allTable"
  671. :columns="deptColumns"
  672. :datasource="allDatasource"
  673. cache-key="allDatasource"
  674. :toolkit="[]"
  675. height="calc(100vh - 450px)"
  676. :init-load="false"
  677. >
  678. <template v-slot:toolbar="{ row }">
  679. <div class="filter-container">
  680. <el-form
  681. class="ele-form-search"
  682. @keyup.enter.native="allReload"
  683. @submit.native.prevent
  684. >
  685. <el-row
  686. :gutter="15"
  687. style="display: flex; align-items: center"
  688. >
  689. <el-col v-bind="{ span: 4 }">
  690. <el-form-item label="分类:" label-width="60px">
  691. <el-select v-model="params.dictType">
  692. <el-option
  693. v-for="(item, index) in dictList[
  694. 'collaborative_type'
  695. ]"
  696. :key="index"
  697. :value="item.value"
  698. :label="item.label"
  699. ></el-option>
  700. </el-select>
  701. </el-form-item>
  702. </el-col>
  703. <el-col v-bind="{ span: 4 }">
  704. <el-form-item label="单据:" label-width="60px">
  705. <el-select v-model="params.formId">
  706. <el-option
  707. v-for="(item, index) in defaultTemplateList"
  708. :key="index"
  709. :value="item.id"
  710. :label="item.name"
  711. ></el-option>
  712. </el-select>
  713. </el-form-item>
  714. </el-col>
  715. <el-col v-bind="{ span: 4 }">
  716. <el-form-item
  717. label="结果:"
  718. prop="result"
  719. label-width="60px"
  720. >
  721. <DictSelection
  722. dictName="流程实例的结果"
  723. clearable
  724. v-model="params.result"
  725. >
  726. </DictSelection>
  727. </el-form-item>
  728. </el-col>
  729. <el-col v-bind="{ span: 4 }">
  730. <el-form-item
  731. label="发起人:"
  732. prop="startUserName"
  733. label-width="70px"
  734. >
  735. <el-input
  736. v-model="params.startUserName"
  737. ></el-input>
  738. </el-form-item>
  739. </el-col>
  740. <el-col v-bind="{ span: 6 }">
  741. <el-form-item
  742. label="创建时间:"
  743. prop="createTime1"
  744. label-width="90px"
  745. >
  746. <el-date-picker
  747. v-model="createTime1"
  748. style="width: 100%"
  749. value-format="yyyy-MM-dd HH:mm:ss"
  750. type="daterange"
  751. range-separator="-"
  752. start-placeholder="开始日期"
  753. end-placeholder="结束日期"
  754. :default-time="['00:00:00', '23:59:59']"
  755. />
  756. </el-form-item>
  757. </el-col>
  758. </el-row>
  759. </el-form>
  760. </div>
  761. </template>
  762. <template v-slot:toolkit="{ row }">
  763. <div class="filter-container">
  764. <div class="ele-form-actions">
  765. <el-button
  766. type="primary"
  767. icon="el-icon-search"
  768. class="ele-btn-icon"
  769. @click="allReload"
  770. >
  771. 查询
  772. </el-button>
  773. <el-button @click="allReset">重置</el-button>
  774. </div>
  775. </div>
  776. </template>
  777. <template v-slot:dictType="{ row }">
  778. {{ getDictV('collaborative_type', row.dictType) }}
  779. </template>
  780. <template
  781. v-if="formColumnList.length"
  782. v-for="(item, index) in formColumnList"
  783. v-slot:[item.model]="{ row }"
  784. >
  785. <div v-if="item.type == 'imgupload'">
  786. <el-image
  787. v-if="row[item.model].length"
  788. style="width: 100px; height: 100px"
  789. :src="row[item.model][0].url"
  790. :preview-src-list="row[item.model].map((i) => i.url)"
  791. >
  792. </el-image>
  793. </div>
  794. <div v-else-if="item.type == 'fileupload'">
  795. <!-- <el-button
  796. type="text"
  797. v-if="row[item.model]?.length"
  798. @click="getFiles(row[item.model])"
  799. >下载
  800. </el-button> -->
  801. <fileMain
  802. v-if="row[item.model]?.length"
  803. type="view"
  804. v-model="row[item.model]"
  805. ></fileMain>
  806. </div>
  807. <div v-else-if="item.type == 'userSelect'">
  808. {{ getUserName(row[item.model]) }}
  809. </div>
  810. <div v-else-if="item.type == 'deptAndUserCascader'">
  811. {{ getDeptAndUserName(row[item.model]) }}
  812. </div>
  813. <div v-else-if="item.type == 'deptCascader'">
  814. {{ getDeptName(row[item.model]) }}
  815. </div>
  816. <div v-else>
  817. {{ formatValue(row[item.model]) }}
  818. </div>
  819. </template>
  820. <template v-slot:result="{ row }">
  821. <el-tag
  822. size="medium"
  823. :type="
  824. getTimelineItemType(
  825. getDictValue('流程实例的结果', row.result)
  826. )
  827. "
  828. >
  829. {{ getDictValue('流程实例的结果', row.result) }}
  830. </el-tag>
  831. </template>
  832. <template v-slot:durationInMillis="{ row }">
  833. {{ getDateTime(row.durationInMillis) }}
  834. </template>
  835. <template v-slot:name="{ row }">
  836. <el-link
  837. type="primary"
  838. :underline="false"
  839. @click="handleDetail(row)"
  840. >
  841. {{ row.name }}
  842. </el-link>
  843. </template>
  844. </ele-pro-table>
  845. </el-tab-pane>
  846. </el-tabs>
  847. </div>
  848. </template>
  849. </ele-split-layout>
  850. </el-card>
  851. <process-submit-dialog
  852. :process-submit-dialog-flag.sync="processSubmitDialogFlag"
  853. v-if="processSubmitDialogFlag"
  854. ref="processSubmitDialogRef"
  855. @reload="reload"
  856. ></process-submit-dialog>
  857. <detail ref="detailRef"></detail>
  858. <formDetail
  859. v-if="formDetailDialogFlag"
  860. :view="true"
  861. ref="formDetailDialogRef"
  862. :form-detail-dialog-flag.sync="formDetailDialogFlag"
  863. ></formDetail>
  864. </div>
  865. </template>
  866. <script>
  867. import {
  868. getBpmCustomFormList,
  869. getProcessInstanceDeptPage,
  870. getProcessInstanceNoticePage,
  871. getProcessInstancePage,
  872. getProcessInstanceAllPage
  873. } from '@/api/bpm/task';
  874. import { getDate } from '@/utils/dateUtils';
  875. import dictMixins from '@/mixins/dictMixins';
  876. import detail from '@/views/bpm/processInstance/detail.vue';
  877. import formDetail from './detail.vue';
  878. import { getByCode } from '@/api/system/dictionary-data';
  879. import { getFile } from '@/api/system/file';
  880. import { getUserPage } from '@/api/tickets';
  881. import { listOrganizations } from '@/api/system/organization';
  882. import tabMixins from '@/mixins/tableColumnsMixin';
  883. // 默认表单数据
  884. const defaultParams = {
  885. dictType: '',
  886. status: '',
  887. name: '',
  888. formId: ''
  889. };
  890. export default {
  891. name: 'index',
  892. components: {
  893. detail,
  894. formDetail
  895. },
  896. mixins: [dictMixins, tabMixins],
  897. data() {
  898. return {
  899. cacheKeyUrl: 'wt-eaf1548b-collaborative',
  900. configFormDialogFlag: false,
  901. processSubmitDialogFlag: false,
  902. formDetailDialogFlag: false,
  903. templateList: {},
  904. dictList: {},
  905. defaultTemplateList: [],
  906. userList: [],
  907. deptList: [],
  908. params: { ...defaultParams },
  909. statusList: [],
  910. formColumnList: [],
  911. createTime1: [],
  912. // 个人 / 部门 / 通知我的
  913. activeName: 'user'
  914. };
  915. },
  916. computed: {
  917. // 是否开启响应式布局
  918. styleResponsive() {
  919. return this.$store.state.theme.styleResponsive;
  920. },
  921. columns() {
  922. let list = this.formColumnList.filter(item => item.name && item.name != '自定义区域').map((item) => {
  923. return {
  924. prop: item.model,
  925. label: item.name,
  926. align: 'center',
  927. slot: item.model,
  928. showOverflowTooltip: true,
  929. minWidth: 120
  930. };
  931. });
  932. return [
  933. {
  934. columnKey: 'index',
  935. label: '序号',
  936. type: 'index',
  937. width: 55,
  938. align: 'center',
  939. showOverflowTooltip: true,
  940. fixed: 'left'
  941. },
  942. {
  943. prop: 'dictType',
  944. label: '分类',
  945. align: 'center',
  946. slot: 'dictType',
  947. showOverflowTooltip: true,
  948. minWidth: 70
  949. },
  950. {
  951. prop: 'formName',
  952. label: '单据',
  953. align: 'center',
  954. slot: 'formName',
  955. showOverflowTooltip: true,
  956. minWidth: 70
  957. },
  958. // {
  959. // prop: 'name',
  960. // label: '名称',
  961. // align: 'center',
  962. // slot: 'name',
  963. // showOverflowTooltip: true,
  964. // minWidth: 80
  965. // },
  966. ...list,
  967. {
  968. prop: 'result',
  969. slot: 'result',
  970. label: '结果',
  971. align: 'center',
  972. showOverflowTooltip: true,
  973. minWidth: 80
  974. },
  975. {
  976. prop: 'endTime',
  977. label: '审批时间',
  978. align: 'center',
  979. showOverflowTooltip: true,
  980. minWidth: 120
  981. },
  982. {
  983. prop: 'createTime',
  984. label: '创建时间',
  985. align: 'center',
  986. showOverflowTooltip: true,
  987. minWidth: 120
  988. },
  989. // {
  990. // prop: 'durationInMillis',
  991. // slot: 'durationInMillis',
  992. // label: '耗时',
  993. // align: 'center',
  994. // showOverflowTooltip: true,
  995. // minWidth: 130
  996. // },
  997. {
  998. columnKey: 'action',
  999. label: '操作',
  1000. width: 100,
  1001. align: 'center',
  1002. resizable: false,
  1003. slot: 'action',
  1004. showOverflowTooltip: true,
  1005. fixed: 'right'
  1006. }
  1007. ];
  1008. },
  1009. deptColumns() {
  1010. let list = this.formColumnList.filter(item => item.name && item.name != '自定义区域').map((item) => {
  1011. return {
  1012. prop: item.model,
  1013. label: item.name,
  1014. align: 'center',
  1015. slot: item.model,
  1016. showOverflowTooltip: true,
  1017. minWidth: 120
  1018. };
  1019. });
  1020. return [
  1021. {
  1022. columnKey: 'index',
  1023. label: '序号',
  1024. type: 'index',
  1025. width: 55,
  1026. align: 'center',
  1027. showOverflowTooltip: true,
  1028. fixed: 'left'
  1029. },
  1030. {
  1031. prop: 'dictType',
  1032. label: '分类',
  1033. align: 'center',
  1034. slot: 'dictType',
  1035. showOverflowTooltip: true,
  1036. minWidth: 70
  1037. },
  1038. {
  1039. prop: 'formName',
  1040. label: '单据',
  1041. align: 'center',
  1042. slot: 'formName',
  1043. showOverflowTooltip: true,
  1044. minWidth: 70
  1045. },
  1046. {
  1047. prop: 'name',
  1048. label: '名称',
  1049. align: 'center',
  1050. slot: 'name',
  1051. showOverflowTooltip: true,
  1052. minWidth: 150
  1053. },
  1054. {
  1055. prop: 'startUserName',
  1056. label: '发起人',
  1057. align: 'center',
  1058. showOverflowTooltip: true,
  1059. minWidth: 180
  1060. },
  1061. ...list,
  1062. {
  1063. prop: 'result',
  1064. slot: 'result',
  1065. label: '结果',
  1066. align: 'center',
  1067. showOverflowTooltip: true,
  1068. minWidth: 100
  1069. },
  1070. {
  1071. prop: 'endTime',
  1072. label: '审批时间',
  1073. align: 'center',
  1074. showOverflowTooltip: true,
  1075. minWidth: 180
  1076. },
  1077. {
  1078. prop: 'createTime',
  1079. label: '创建时间',
  1080. align: 'center',
  1081. showOverflowTooltip: true,
  1082. minWidth: 180
  1083. }
  1084. // {
  1085. // prop: 'durationInMillis',
  1086. // slot: 'durationInMillis',
  1087. // label: '耗时',
  1088. // align: 'center',
  1089. // showOverflowTooltip: true,
  1090. // minWidth: 130
  1091. // },
  1092. // {
  1093. // columnKey: 'action',
  1094. // label: '操作',
  1095. // width: 230,
  1096. // align: 'center',
  1097. // resizable: false,
  1098. // slot: 'action',
  1099. // showOverflowTooltip: true,
  1100. // fixed: 'right'
  1101. // }
  1102. ];
  1103. },
  1104. getUserName() {
  1105. return (id) => {
  1106. if (!id) return '';
  1107. let find = this.userList.find((item) => item.id == id) || {};
  1108. return find.name;
  1109. };
  1110. },
  1111. getDeptAndUserName() {
  1112. return (id = []) => {
  1113. if (!id.length) return '';
  1114. id = Array.isArray(id) ? id : [id];
  1115. let find =
  1116. this.userList.find((item) => item.id == id[id.length - 1]) || {};
  1117. return find.name;
  1118. };
  1119. },
  1120. getDeptName() {
  1121. return (id = []) => {
  1122. if (!id.length) return '';
  1123. id = Array.isArray(id) ? id : [id];
  1124. let find =
  1125. this.deptList.find((item) => item.id == id[id.length - 1]) || {};
  1126. return find.name;
  1127. };
  1128. }
  1129. },
  1130. watch: {
  1131. 'params.formId': {
  1132. handler(val) {
  1133. this.allReload();
  1134. this.reload();
  1135. this.deptReload();
  1136. this.noticeReload();
  1137. }
  1138. },
  1139. 'params.dictType': {
  1140. handler(val) {
  1141. this.params.formId = this.templateList[val][0].id;
  1142. this.allReload();
  1143. this.reload();
  1144. this.deptReload();
  1145. this.noticeReload();
  1146. }
  1147. }
  1148. },
  1149. async created() {
  1150. await this.getDictList('collaborative_type');
  1151. await this.getTemplateList();
  1152. await this.getUserList();
  1153. await this.getDeptList();
  1154. console.log(this.$hasPermission('wt:collaborative:all'))
  1155. },
  1156. methods: {
  1157. formatValue(value) {
  1158. if (value === null || value === undefined) {
  1159. return ''; // 空值处理
  1160. }
  1161. if (typeof value === 'object' && value !== null) {
  1162. if ('id' in value && 'code' in value && 'name' in value) {
  1163. return value.code;
  1164. } else {
  1165. return JSON.stringify(value, null, 2);
  1166. }
  1167. }
  1168. return value;
  1169. },
  1170. getDictV(code, val) {
  1171. if (!this.dictList[code]) return '';
  1172. return this.dictList[code].find((item) => item.value == val)?.label;
  1173. },
  1174. async getDictList(code) {
  1175. let { data: res } = await getByCode(code);
  1176. this.dictList[code] = res.map((item) => {
  1177. let values = Object.keys(item);
  1178. return {
  1179. value: values[0],
  1180. label: item[values[0]]
  1181. };
  1182. });
  1183. },
  1184. //获取人员数据
  1185. async getUserList() {
  1186. let params = { pageNum: 1, size: -1 };
  1187. let { list } = await getUserPage(params);
  1188. this.userList = list;
  1189. },
  1190. //获取部门数据
  1191. async getDeptList() {
  1192. this.deptList = await listOrganizations();
  1193. },
  1194. getFiles(row = []) {
  1195. row.forEach((item) => {
  1196. getFile({ objectName: item.storePath }, item.name);
  1197. });
  1198. },
  1199. async getTemplateList() {
  1200. this.defaultTemplateList = await getBpmCustomFormList({ status: 1 });
  1201. this.templateList = _.groupBy(this.defaultTemplateList, 'dictType');
  1202. this.params.dictType = this.dictList['collaborative_type'][0].value;
  1203. this.params.formId = this.defaultTemplateList[0]?.id;
  1204. let makingJson =
  1205. JSON.parse(this.defaultTemplateList[0].formJson.makingJson) || {};
  1206. console.log('makingJson~~~', makingJson);
  1207. this.formColumnList = makingJson.list;
  1208. console.log(this.formColumnList);
  1209. },
  1210. handleStartProcess(i) {
  1211. this.processSubmitDialogFlag = true;
  1212. this.$nextTick(() => {
  1213. this.$refs.processSubmitDialogRef.init(i);
  1214. });
  1215. },
  1216. /* 表格数据源 */
  1217. async allDatasource({ page, limit, where, order }) {
  1218. let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
  1219. let data = await getProcessInstanceAllPage({
  1220. pageNo: page,
  1221. pageSize: limit,
  1222. ...this.params,
  1223. processType: '1',
  1224. createTimeBegin,
  1225. createTimeEnd
  1226. });
  1227. // data = data.list.map((item) => {
  1228. // return {
  1229. // ...item,
  1230. // ...item.valueJson
  1231. // };
  1232. // });
  1233. return {
  1234. count: data.count,
  1235. list: data.list.map((item) => {
  1236. return {
  1237. ...item,
  1238. ...item.valueJson
  1239. };
  1240. })
  1241. };
  1242. },
  1243. /* 刷新表格 */
  1244. allReload(where) {
  1245. let find =
  1246. this.defaultTemplateList.find(
  1247. (item) => item.id == this.params.formId
  1248. ) || {};
  1249. let makingJson = JSON.parse(find.formJson.makingJson) || {};
  1250. this.formColumnList = makingJson.list;
  1251. this.$refs.allTable.reload({ page: 1, where });
  1252. },
  1253. /* 重置 */
  1254. allReset() {
  1255. this.params = { ...defaultParams };
  1256. this.createTime1 = [];
  1257. this.params.formId = this.defaultTemplateList[0]?.id;
  1258. this.params.dictType = this.dictList['collaborative_type'][0].value;
  1259. this.allReload();
  1260. },
  1261. /* 表格数据源 */
  1262. async datasource({ page, limit, where, order }) {
  1263. let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
  1264. let data = await getProcessInstancePage({
  1265. pageNo: page,
  1266. pageSize: limit,
  1267. ...this.params,
  1268. processType: '1',
  1269. createTimeBegin,
  1270. createTimeEnd
  1271. });
  1272. data = data.list.map((item) => {
  1273. return {
  1274. ...item,
  1275. ...item.valueJson
  1276. };
  1277. });
  1278. return data;
  1279. },
  1280. /* 刷新表格 */
  1281. reload(where) {
  1282. let find =
  1283. this.defaultTemplateList.find(
  1284. (item) => item.id == this.params.formId
  1285. ) || {};
  1286. let makingJson = JSON.parse(find.formJson.makingJson) || {};
  1287. this.formColumnList = makingJson.list;
  1288. this.$refs.table.reload({ page: 1, where });
  1289. this.$refs.table.reRenderTable();
  1290. },
  1291. /* 重置 */
  1292. reset() {
  1293. this.params = { ...defaultParams };
  1294. this.createTime1 = [];
  1295. this.params.dictType = this.dictList['collaborative_type'][0].value;
  1296. this.params.formId = this.templateList[this.params.dictType][0]?.id;
  1297. this.reload();
  1298. },
  1299. /* 表格数据源 */
  1300. async deptDatasource({ page, limit, where, order }) {
  1301. let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
  1302. let data = await getProcessInstanceDeptPage({
  1303. pageNo: page,
  1304. pageSize: limit,
  1305. ...this.params,
  1306. processType: '1',
  1307. createTimeBegin,
  1308. createTimeEnd
  1309. });
  1310. data = data.list.map((item) => {
  1311. return {
  1312. ...item,
  1313. ...item.valueJson
  1314. };
  1315. });
  1316. return data;
  1317. },
  1318. /* 刷新表格 */
  1319. deptReload(where) {
  1320. let find =
  1321. this.defaultTemplateList.find(
  1322. (item) => item.id == this.params.formId
  1323. ) || {};
  1324. let makingJson = JSON.parse(find.formJson.makingJson) || {};
  1325. this.formColumnList = makingJson.list;
  1326. this.$refs.deptTable.reload({ page: 1, where });
  1327. },
  1328. /* 重置 */
  1329. deptReset() {
  1330. this.params = { ...defaultParams };
  1331. this.createTime1 = [];
  1332. this.params.formId = this.defaultTemplateList[0]?.id;
  1333. this.params.dictType = this.dictList['collaborative_type'][0].value;
  1334. this.deptReload();
  1335. },
  1336. /* 表格数据源 */
  1337. async noticeDatasource({ page, limit, where, order }) {
  1338. let [createTimeBegin, createTimeEnd] = this.createTime1 || [];
  1339. let data = await getProcessInstanceNoticePage({
  1340. pageNo: page,
  1341. pageSize: limit,
  1342. ...this.params,
  1343. processType: '1',
  1344. createTimeBegin,
  1345. createTimeEnd
  1346. });
  1347. data = data.list.map((item) => {
  1348. return {
  1349. ...item,
  1350. ...item.valueJson
  1351. };
  1352. });
  1353. return data;
  1354. },
  1355. /* 刷新表格 */
  1356. noticeReload(where) {
  1357. let find =
  1358. this.defaultTemplateList.find(
  1359. (item) => item.id == this.params.formId
  1360. ) || {};
  1361. let makingJson = JSON.parse(find.formJson.makingJson) || {};
  1362. this.formColumnList = makingJson.list;
  1363. this.$refs.noticeTable.reload({ page: 1, where });
  1364. },
  1365. /* 重置 */
  1366. noticeReset() {
  1367. this.params = { ...defaultParams };
  1368. this.createTime1 = [];
  1369. this.params.formId = this.defaultTemplateList[0]?.id;
  1370. this.params.dictType = this.dictList['collaborative_type'][0].value;
  1371. this.noticeReload();
  1372. },
  1373. /** */
  1374. handleAudit(row) {
  1375. this.$refs.detailRef.open(row.id);
  1376. },
  1377. /** */
  1378. handleDetail(row) {
  1379. this.formDetailDialogFlag = true;
  1380. this.$nextTick(() => {
  1381. this.$refs.formDetailDialogRef.open(row);
  1382. });
  1383. },
  1384. getTimelineItemType(result) {
  1385. if (result === '通过') {
  1386. return 'success';
  1387. }
  1388. if (result === '不通过') {
  1389. return 'danger';
  1390. }
  1391. if (result === '取消') {
  1392. return 'info';
  1393. }
  1394. if (result === '处理中') {
  1395. return 'warning';
  1396. }
  1397. return '';
  1398. },
  1399. getDateTime(ms) {
  1400. return getDate(ms);
  1401. },
  1402. tabClick() {
  1403. if (this.activeName == 'all') {
  1404. this.allReset();
  1405. } else if (this.activeName == 'user') {
  1406. this.reset();
  1407. } else if (this.activeName == 'dept') {
  1408. this.deptReset();
  1409. } else if (this.activeName == 'notice') {
  1410. this.noticeReset();
  1411. }
  1412. }
  1413. }
  1414. };
  1415. </script>
  1416. <style scoped lang="scss">
  1417. .ele-body {
  1418. padding: 15px;
  1419. }
  1420. .ele-split-panel {
  1421. width: 100%;
  1422. }
  1423. .content-box {
  1424. width: 100%;
  1425. //max-width: 273px;
  1426. //min-width: 90px;
  1427. // margin-right: 10px;
  1428. display: flex;
  1429. flex-direction: row;
  1430. flex-wrap: wrap;
  1431. //justify-content: space-between;
  1432. .category_box {
  1433. border-left: 1px solid #e1e1e1;
  1434. border-bottom: 1px solid #e1e1e1;
  1435. border-radius: 1px;
  1436. // flex: 1 0 25%;
  1437. margin-top: 5px;
  1438. overflow: auto;
  1439. width: 100%;
  1440. .category_box_title {
  1441. font-size: 14px;
  1442. font-weight: bold;
  1443. color: #fff8f8;
  1444. height: 39px;
  1445. display: flex;
  1446. padding: 5px 20px;
  1447. align-items: center;
  1448. background: #1890ffd6;
  1449. border-bottom: 1px solid #e1e1e1;
  1450. }
  1451. .category_box_content {
  1452. display: flex;
  1453. flex-direction: row;
  1454. flex-wrap: wrap;
  1455. // height: 60px;
  1456. overflow: auto;
  1457. .category_content {
  1458. min-width: 33%;
  1459. min-height: 60px;
  1460. //flex: 1 1 0;
  1461. display: flex;
  1462. flex-direction: column;
  1463. border-right: 1px solid #e1e1e1;
  1464. border-bottom: 1px solid #e1e1e1;
  1465. align-items: center;
  1466. justify-content: center;
  1467. // font-weight: bold;
  1468. &:nth-child(n) {
  1469. span:nth-child(1) {
  1470. transform: scale(2);
  1471. }
  1472. span:nth-child(2) {
  1473. padding-top: 5px;
  1474. }
  1475. }
  1476. }
  1477. .category_content:hover {
  1478. cursor: pointer;
  1479. background-color: rgba(135, 181, 243, 0.29);
  1480. }
  1481. }
  1482. }
  1483. .category_box:last-child {
  1484. border-right: 1px solid #e1e1e1;
  1485. }
  1486. }
  1487. .tab-box {
  1488. // width: calc(100vw - 552px);
  1489. //max-width: 1100px;
  1490. //min-width: 600px;
  1491. margin-top: 6px;
  1492. height: 98%;
  1493. .el-tabs--border-card {
  1494. height: 100%;
  1495. }
  1496. }
  1497. ::v-deep .card_box {
  1498. .el-card__body {
  1499. padding: 10px;
  1500. height: 86vh;
  1501. }
  1502. }
  1503. ::v-deep .ele-table-tool {
  1504. display: flex;
  1505. flex-direction: row;
  1506. flex-wrap: nowrap !important;
  1507. }
  1508. </style>