index.vue 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084
  1. <template>
  2. <div class="ele-body">
  3. <el-card class="card_box" :body-style="{display:'flex',flexDirection: 'column',alignItems: 'flex-start'}"
  4. shadow="never">
  5. <!-- 动态表单配置-->
  6. <div class="content-box">
  7. <div v-for="category in Object.keys(templateList)" :key="category" class="category_box">
  8. <div class="category_box_title">{{ getDictV('collaborative_type', category) }}</div>
  9. <div class="category_box_content">
  10. <div v-for="v in templateList[category]" :key="v.id" class="category_content"
  11. :title="v.name"
  12. @click="handleStartProcess(v)">
  13. <svg-icon
  14. style="width: 1.5em;height: 1.5em;"
  15. :icon-class="v.icon"
  16. className="svg-icon-set"
  17. ></svg-icon>
  18. <span>
  19. {{ v.name.length > 3 ? v.name[0] + v.name[1] + v.name[2] + '...' : v.name }}
  20. </span>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="tab-box el-form-box">
  26. <el-tabs type="border-card">
  27. <el-tab-pane label="个人记录">
  28. <ele-pro-table
  29. ref="table"
  30. :toolkit="[]"
  31. height="calc(100vh - 450px)"
  32. :columns="columns"
  33. :datasource="datasource"
  34. cache-key="datasource-1"
  35. :init-load="false"
  36. >
  37. <template v-slot:toolbar="{ row }">
  38. <div class="filter-container">
  39. <el-form
  40. class="ele-form-search"
  41. @keyup.enter.native="reload"
  42. @submit.native.prevent
  43. >
  44. <el-row :gutter="15" style="display: flex;align-items: center">
  45. <el-col v-bind="{ span: 4 }">
  46. <el-form-item label="分类:" label-width="60px">
  47. <el-select v-model="params.dictType">
  48. <el-option v-for="(item,index) in dictList['collaborative_type']" :key="index"
  49. :value="item.value"
  50. :label="item.label"></el-option>
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. <el-col v-bind="{ span: 4 }">
  55. <el-form-item label="单据:" label-width="60px">
  56. <el-select v-model="params.formId">
  57. <el-option v-for="(item,index) in templateList[params.dictType]" :key="index"
  58. :value="item.id"
  59. :label="item.name"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. </el-col>
  63. <el-col v-bind="{ span: 4 }">
  64. <el-form-item label="结果:" prop="result" label-width="60px">
  65. <!-- <el-select
  66. v-model="params.status"
  67. placeholder="请选择状态"
  68. clearable
  69. >
  70. <el-option
  71. v-for="dict in statusList"
  72. :key="dict.value"
  73. :label="dict.label"
  74. :value="dict.value"
  75. />
  76. </el-select> -->
  77. <DictSelection
  78. dictName="流程实例的结果"
  79. clearable
  80. v-model="params.result"
  81. >
  82. </DictSelection>
  83. </el-form-item>
  84. </el-col>
  85. <el-col v-bind="{ span: 10 }">
  86. <el-form-item label="创建时间:" prop="createTime1" label-width="90px">
  87. <el-date-picker
  88. v-model="createTime1"
  89. style="width: 100%"
  90. value-format="yyyy-MM-dd HH:mm:ss"
  91. type="daterange"
  92. range-separator="-"
  93. start-placeholder="开始日期"
  94. end-placeholder="结束日期"
  95. :default-time="['00:00:00', '23:59:59']"
  96. />
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. </el-form>
  101. </div>
  102. </template>
  103. <template v-slot:toolkit="{ row }">
  104. <div class="filter-container">
  105. <div class="ele-form-actions">
  106. <el-button
  107. type="primary"
  108. icon="el-icon-search"
  109. class="ele-btn-icon"
  110. @click="reload"
  111. >
  112. 查询
  113. </el-button>
  114. <el-button @click="reset">重置</el-button>
  115. </div>
  116. </div>
  117. </template>
  118. <template v-slot:result="{ row }">
  119. <el-tag size="medium" :type="getTimelineItemType(getDictValue('流程实例的结果', row.result))">
  120. {{ getDictValue('流程实例的结果', row.result) }}
  121. </el-tag>
  122. </template>
  123. <template v-slot:dictType="{ row }">
  124. {{getDictV('collaborative_type',row.dictType)}}
  125. </template>
  126. <template v-slot:durationInMillis="{ row }">
  127. {{ getDateTime(row.durationInMillis) }}
  128. </template>
  129. <template v-slot:name="{ row }">
  130. <el-link type="primary" :underline="false" @click="handleDetail(row)">
  131. {{ row.name }}
  132. </el-link
  133. >
  134. </template>
  135. <template v-if="formColumnList.length" v-for="(item,index) in formColumnList"
  136. v-slot:[item.model]="{ row }">
  137. <div v-if="item.type=='imgupload'">
  138. <el-image
  139. v-if="row[item.model].length"
  140. style="width: 100px; height: 100px"
  141. :src="row[item.model][0].url"
  142. :preview-src-list="row[item.model].map(i=>i.url)">
  143. </el-image>
  144. </div>
  145. <div v-else-if="item.type=='fileupload'">
  146. <el-button type="text" v-if="row[item.model]?.length" @click="getFiles(row[item.model])">下载
  147. </el-button>
  148. </div>
  149. <div v-else-if="item.type=='userSelect'">
  150. {{ getUserName(row[item.model]) }}
  151. </div>
  152. <div v-else-if="item.type=='deptAndUserCascader'">
  153. {{ getDeptAndUserName(row[item.model]) }}
  154. </div>
  155. <div v-else-if="item.type=='deptCascader'">
  156. {{ getDeptName(row[item.model]) }}
  157. </div>
  158. <div v-else>
  159. {{ row[item.model] }}
  160. </div>
  161. </template>
  162. <!-- 操作列 -->
  163. <template v-slot:action="{ row }">
  164. <el-button
  165. size="mini"
  166. type="text"
  167. icon="el-icon-edit"
  168. @click="handleAudit(row)"
  169. >详情
  170. </el-button
  171. >
  172. </template>
  173. </ele-pro-table>
  174. </el-tab-pane>
  175. <el-tab-pane label="部门记录">
  176. <ele-pro-table
  177. ref="deptTable"
  178. :columns="deptColumns"
  179. :datasource="deptDatasource"
  180. cache-key="deptDatasource"
  181. :toolkit="[]"
  182. height="calc(100vh - 450px)"
  183. :init-load="false"
  184. >
  185. <template v-slot:toolbar="{ row }">
  186. <div class="filter-container">
  187. <el-form
  188. class="ele-form-search"
  189. @keyup.enter.native="deptReload"
  190. @submit.native.prevent
  191. >
  192. <el-row :gutter="15" style="display: flex;align-items: center">
  193. <el-col v-bind="{ span: 4 }">
  194. <el-form-item label="分类:" label-width="60px">
  195. <el-select v-model="params.dictType">
  196. <el-option v-for="(item,index) in dictList['collaborative_type']" :key="index"
  197. :value="item.value"
  198. :label="item.label"></el-option>
  199. </el-select>
  200. </el-form-item>
  201. </el-col>
  202. <el-col v-bind="{ span: 4 }">
  203. <el-form-item label="单据:" label-width="60px">
  204. <el-select v-model="params.formId">
  205. <el-option v-for="(item,index) in defaultTemplateList" :key="index" :value="item.id"
  206. :label="item.name"></el-option>
  207. </el-select>
  208. </el-form-item>
  209. </el-col>
  210. <el-col v-bind="{ span: 4 }">
  211. <el-form-item label="结果:" prop="result" label-width="60px">
  212. <!-- <el-select
  213. v-model="params.status"
  214. placeholder="请选择状态"
  215. clearable
  216. >
  217. <el-option
  218. v-for="dict in statusList"
  219. :key="dict.value"
  220. :label="dict.label"
  221. :value="dict.value"
  222. />
  223. </el-select> -->
  224. <DictSelection
  225. dictName="流程实例的结果"
  226. clearable
  227. v-model="params.result"
  228. >
  229. </DictSelection>
  230. </el-form-item>
  231. </el-col>
  232. <el-col v-bind="{ span: 4 }">
  233. <el-form-item label="发起人:" prop="startUserName" label-width="70px">
  234. <el-input v-model="params.startUserName"></el-input>
  235. </el-form-item>
  236. </el-col>
  237. <el-col v-bind="{ span: 6 }">
  238. <el-form-item label="创建时间:" prop="createTime1" label-width="90px">
  239. <el-date-picker
  240. v-model="createTime1"
  241. style="width: 100%"
  242. value-format="yyyy-MM-dd HH:mm:ss"
  243. type="daterange"
  244. range-separator="-"
  245. start-placeholder="开始日期"
  246. end-placeholder="结束日期"
  247. :default-time="['00:00:00', '23:59:59']"
  248. />
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. </el-form>
  253. </div>
  254. </template>
  255. <template v-slot:toolkit="{ row }">
  256. <div class="filter-container">
  257. <div class="ele-form-actions">
  258. <el-button
  259. type="primary"
  260. icon="el-icon-search"
  261. class="ele-btn-icon"
  262. @click="deptReload"
  263. >
  264. 查询
  265. </el-button>
  266. <el-button @click="deptReset">重置</el-button>
  267. </div>
  268. </div>
  269. </template>
  270. <template v-slot:dictType="{ row }">
  271. {{getDictV('collaborative_type',row.dictType)}}
  272. </template>
  273. <template v-if="formColumnList.length" v-for="(item,index) in formColumnList"
  274. v-slot:[item.model]="{ row }">
  275. <div v-if="item.type=='imgupload'">
  276. <el-image
  277. v-if="row[item.model].length"
  278. style="width: 100px; height: 100px"
  279. :src="row[item.model][0].url"
  280. :preview-src-list="row[item.model].map(i=>i.url)">
  281. </el-image>
  282. </div>
  283. <div v-else-if="item.type=='fileupload'">
  284. <el-button type="text" v-if="row[item.model]?.length" @click="getFiles(row[item.model])">下载
  285. </el-button>
  286. </div>
  287. <div v-else-if="item.type=='userSelect'">
  288. {{ getUserName(row[item.model]) }}
  289. </div>
  290. <div v-else-if="item.type=='deptAndUserCascader'">
  291. {{ getDeptAndUserName(row[item.model]) }}
  292. </div>
  293. <div v-else-if="item.type=='deptCascader'">
  294. {{ getDeptName(row[item.model]) }}
  295. </div>
  296. <div v-else>
  297. {{ row[item.model] }}
  298. </div>
  299. </template>
  300. <template v-slot:result="{ row }">
  301. <el-tag size="medium" :type="getTimelineItemType(getDictValue('流程实例的结果', row.result))">
  302. {{ getDictValue('流程实例的结果', row.result) }}
  303. </el-tag>
  304. </template>
  305. <template v-slot:durationInMillis="{ row }">
  306. {{ getDateTime(row.durationInMillis) }}
  307. </template>
  308. <template v-slot:name="{ row }">
  309. <el-link type="primary" :underline="false" @click="handleDetail(row)">
  310. {{ row.name }}
  311. </el-link
  312. >
  313. </template>
  314. <!-- 操作列 -->
  315. <template v-slot:action="{ row }">
  316. <el-button
  317. size="mini"
  318. type="text"
  319. icon="el-icon-edit"
  320. @click="handleAudit(row)"
  321. >详情
  322. </el-button
  323. >
  324. </template>
  325. </ele-pro-table>
  326. </el-tab-pane>
  327. <el-tab-pane label="通知我的记录">
  328. <ele-pro-table
  329. ref="noticeTable"
  330. :columns="deptColumns"
  331. :datasource="noticeDatasource"
  332. cache-key="noticeDatasource"
  333. height="calc(100vh - 450px)"
  334. :toolkit="[]"
  335. :init-load="false"
  336. >
  337. <template v-slot:toolbar="{ row }">
  338. <div class="filter-container">
  339. <el-form
  340. class="ele-form-search"
  341. @keyup.enter.native="noticeReload"
  342. @submit.native.prevent
  343. >
  344. <el-row :gutter="15" style="display: flex;align-items: center">
  345. <el-col v-bind="{ span: 4 }">
  346. <el-form-item label="单据:" label-width="60px">
  347. <el-select v-model="params.dictType">
  348. <el-option v-for="(item,index) in dictList['collaborative_type']" :key="index"
  349. :value="item.value"
  350. :label="item.label"></el-option>
  351. </el-select>
  352. </el-form-item>
  353. </el-col>
  354. <el-col v-bind="{ span: 4 }">
  355. <el-form-item label="分类:" label-width="60px">
  356. <el-select v-model="params.formId">
  357. <el-option v-for="(item,index) in defaultTemplateList" :key="index" :value="item.id"
  358. :label="item.name"></el-option>
  359. </el-select>
  360. </el-form-item>
  361. </el-col>
  362. <el-col v-bind="{ span: 4 }">
  363. <el-form-item label="结果:" prop="result" label-width="60px">
  364. <!-- <el-select
  365. v-model="params.status"
  366. placeholder="请选择状态"
  367. clearable
  368. >
  369. <el-option
  370. v-for="dict in statusList"
  371. :key="dict.value"
  372. :label="dict.label"
  373. :value="dict.value"
  374. />
  375. </el-select> -->
  376. <DictSelection
  377. dictName="流程实例的结果"
  378. clearable
  379. v-model="params.result"
  380. >
  381. </DictSelection>
  382. </el-form-item>
  383. </el-col>
  384. <el-col v-bind="{ span: 4 }">
  385. <el-form-item label="发起人:" prop="startUserName" label-width="70px">
  386. <el-input v-model="params.startUserName"></el-input>
  387. </el-form-item>
  388. </el-col>
  389. <el-col v-bind="{ span: 6 }">
  390. <el-form-item label="创建时间:" prop="createTime1" label-width="90px">
  391. <el-date-picker
  392. v-model="createTime1"
  393. style="width: 100%"
  394. value-format="yyyy-MM-dd HH:mm:ss"
  395. type="daterange"
  396. range-separator="-"
  397. start-placeholder="开始日期"
  398. end-placeholder="结束日期"
  399. :default-time="['00:00:00', '23:59:59']"
  400. />
  401. </el-form-item>
  402. </el-col>
  403. </el-row>
  404. </el-form>
  405. </div>
  406. </template>
  407. <template v-slot:toolkit="{ row }">
  408. <div class="filter-container">
  409. <div class="ele-form-actions">
  410. <el-button
  411. type="primary"
  412. icon="el-icon-search"
  413. class="ele-btn-icon"
  414. @click="noticeReload"
  415. >
  416. 查询
  417. </el-button>
  418. <el-button @click="noticeReset">重置</el-button>
  419. </div>
  420. </div>
  421. </template>
  422. <template v-slot:dictType="{ row }">
  423. {{getDictV('collaborative_type',row.dictType)}}
  424. </template>
  425. <template v-if="formColumnList.length" v-for="(item,index) in formColumnList"
  426. v-slot:[item.model]="{ row }">
  427. <div v-if="item.type=='imgupload'">
  428. <el-image
  429. v-if="row[item.model].length"
  430. style="width: 100px; height: 100px"
  431. :src="row[item.model][0].url"
  432. :preview-src-list="row[item.model].map(i=>i.url)">
  433. </el-image>
  434. </div>
  435. <div v-else-if="item.type=='fileupload'">
  436. <el-button type="text" v-if="row[item.model]?.length" @click="getFiles(row[item.model])">下载
  437. </el-button>
  438. </div>
  439. <div v-else-if="item.type=='userSelect'">
  440. {{ getUserName(row[item.model]) }}
  441. </div>
  442. <div v-else-if="item.type=='deptAndUserCascader'">
  443. {{ getDeptAndUserName(row[item.model]) }}
  444. </div>
  445. <div v-else-if="item.type=='deptCascader'">
  446. {{ getDeptName(row[item.model]) }}
  447. </div>
  448. <div v-else>
  449. {{ row[item.model] }}
  450. </div>
  451. </template>
  452. <template v-slot:result="{ row }">
  453. <el-tag size="medium" :type="getTimelineItemType(getDictValue('流程实例的结果', row.result))">
  454. {{ getDictValue('流程实例的结果', row.result) }}
  455. </el-tag>
  456. </template>
  457. <template v-slot:durationInMillis="{ row }">
  458. {{ getDateTime(row.durationInMillis) }}
  459. </template>
  460. <template v-slot:name="{ row }">
  461. <el-link type="primary" :underline="false" @click="handleDetail(row)">
  462. {{ row.name }}
  463. </el-link
  464. >
  465. </template>
  466. <!-- 操作列 -->
  467. <template v-slot:action="{ row }">
  468. <el-button
  469. size="mini"
  470. type="text"
  471. icon="el-icon-edit"
  472. @click="handleAudit(row)"
  473. >详情
  474. </el-button
  475. >
  476. </template>
  477. </ele-pro-table>
  478. </el-tab-pane>
  479. </el-tabs>
  480. </div>
  481. </el-card>
  482. <process-submit-dialog :process-submit-dialog-flag.sync="processSubmitDialogFlag" v-if="processSubmitDialogFlag"
  483. ref="processSubmitDialogRef" @reload="reload"></process-submit-dialog>
  484. <detail ref="detailRef"></detail>
  485. <formDetail v-if="formDetailDialogFlag" ref="formDetailDialogRef"
  486. :form-detail-dialog-flag.sync="formDetailDialogFlag"></formDetail>
  487. </div>
  488. </template>
  489. <script>
  490. import {
  491. getBpmCustomFormList,
  492. getProcessInstanceDeptPage,
  493. getProcessInstanceNoticePage,
  494. getProcessInstancePage
  495. } from "@/api/bpm/task";
  496. import {getDate} from "@/utils/dateUtils";
  497. import dictMixins from "@/mixins/dictMixins";
  498. import detail from "@/views/bpm/processInstance/detail.vue";
  499. import formDetail from './detail.vue'
  500. import {getByCode} from "@/api/system/dictionary-data";
  501. import {getFile} from "@/api/system/file";
  502. import {getUserPage} from '@/api/tickets';
  503. import {listOrganizations} from "@/api/system/organization";
  504. // 默认表单数据
  505. const defaultParams = {
  506. dictType: '',
  507. status: '',
  508. name: '',
  509. formId: ''
  510. };
  511. export default {
  512. name: "index",
  513. components: {
  514. detail,
  515. formDetail
  516. },
  517. mixins: [dictMixins],
  518. data() {
  519. return {
  520. configFormDialogFlag: false,
  521. processSubmitDialogFlag: false,
  522. formDetailDialogFlag: false,
  523. templateList: {},
  524. dictList: {},
  525. defaultTemplateList: [],
  526. userList: [],
  527. deptList: [],
  528. params: {...defaultParams},
  529. statusList: [],
  530. formColumnList: [],
  531. createTime1:[]
  532. }
  533. },
  534. computed: {
  535. // 是否开启响应式布局
  536. styleResponsive() {
  537. return this.$store.state.theme.styleResponsive;
  538. },
  539. columns() {
  540. let list = this.formColumnList.map(item => {
  541. return {
  542. prop: item.model,
  543. label: item.name,
  544. align: 'center',
  545. slot: item.model,
  546. showOverflowTooltip: true,
  547. minWidth: 120
  548. }
  549. })
  550. return [
  551. {
  552. columnKey: 'index',
  553. label: '序号',
  554. type: 'index',
  555. width: 55,
  556. align: 'center',
  557. showOverflowTooltip: true,
  558. fixed: 'left'
  559. },
  560. {
  561. prop: 'dictType',
  562. label: '分类',
  563. align: 'center',
  564. slot: 'dictType',
  565. showOverflowTooltip: true,
  566. minWidth: 70
  567. },
  568. {
  569. prop: 'formName',
  570. label: '单据',
  571. align: 'center',
  572. slot: 'formName',
  573. showOverflowTooltip: true,
  574. minWidth: 70
  575. },
  576. {
  577. prop: 'name',
  578. label: '名称',
  579. align: 'center',
  580. slot: 'name',
  581. showOverflowTooltip: true,
  582. minWidth: 80
  583. },
  584. ...list,
  585. {
  586. prop: 'result',
  587. slot: 'result',
  588. label: '结果',
  589. align: 'center',
  590. showOverflowTooltip: true,
  591. minWidth: 80
  592. },
  593. {
  594. prop: 'endTime',
  595. label: '审批时间',
  596. align: 'center',
  597. showOverflowTooltip: true,
  598. minWidth: 120
  599. },
  600. {
  601. prop: 'createTime',
  602. label: '创建时间',
  603. align: 'center',
  604. showOverflowTooltip: true,
  605. minWidth: 120
  606. },
  607. // {
  608. // prop: 'durationInMillis',
  609. // slot: 'durationInMillis',
  610. // label: '耗时',
  611. // align: 'center',
  612. // showOverflowTooltip: true,
  613. // minWidth: 130
  614. // },
  615. {
  616. columnKey: 'action',
  617. label: '操作',
  618. width: 100,
  619. align: 'center',
  620. resizable: false,
  621. slot: 'action',
  622. showOverflowTooltip: true,
  623. fixed: 'right'
  624. }
  625. ]
  626. },
  627. deptColumns() {
  628. let list = this.formColumnList.map(item => {
  629. return {
  630. prop: item.model,
  631. label: item.name,
  632. align: 'center',
  633. slot: item.model,
  634. showOverflowTooltip: true,
  635. minWidth: 120
  636. }
  637. })
  638. return [
  639. {
  640. columnKey: 'index',
  641. label: '序号',
  642. type: 'index',
  643. width: 55,
  644. align: 'center',
  645. showOverflowTooltip: true,
  646. fixed: 'left'
  647. },
  648. {
  649. prop: 'dictType',
  650. label: '分类',
  651. align: 'center',
  652. slot: 'dictType',
  653. showOverflowTooltip: true,
  654. minWidth: 70
  655. },
  656. {
  657. prop: 'formName',
  658. label: '单据',
  659. align: 'center',
  660. slot: 'formName',
  661. showOverflowTooltip: true,
  662. minWidth: 70
  663. },
  664. {
  665. prop: 'name',
  666. label: '名称',
  667. align: 'center',
  668. slot: 'name',
  669. showOverflowTooltip: true,
  670. minWidth: 150
  671. },
  672. {
  673. prop: 'startUserName',
  674. label: '发起人',
  675. align: 'center',
  676. showOverflowTooltip: true,
  677. minWidth: 180
  678. },
  679. ...list,
  680. {
  681. prop: 'result',
  682. slot: 'result',
  683. label: '结果',
  684. align: 'center',
  685. showOverflowTooltip: true,
  686. minWidth: 100
  687. },
  688. {
  689. prop: 'endTime',
  690. label: '审批时间',
  691. align: 'center',
  692. showOverflowTooltip: true,
  693. minWidth: 180
  694. },
  695. {
  696. prop: 'createTime',
  697. label: '创建时间',
  698. align: 'center',
  699. showOverflowTooltip: true,
  700. minWidth: 180
  701. },
  702. // {
  703. // prop: 'durationInMillis',
  704. // slot: 'durationInMillis',
  705. // label: '耗时',
  706. // align: 'center',
  707. // showOverflowTooltip: true,
  708. // minWidth: 130
  709. // },
  710. // {
  711. // columnKey: 'action',
  712. // label: '操作',
  713. // width: 230,
  714. // align: 'center',
  715. // resizable: false,
  716. // slot: 'action',
  717. // showOverflowTooltip: true,
  718. // fixed: 'right'
  719. // }
  720. ]
  721. },
  722. getUserName() {
  723. return (id) => {
  724. if (!id) return ''
  725. let find = this.userList.find(item => item.id == id) || {}
  726. return find.name
  727. }
  728. },
  729. getDeptAndUserName() {
  730. return (id = []) => {
  731. if (!id.length) return ''
  732. id = Array.isArray(id) ? id : [id]
  733. let find = this.userList.find(item => item.id == id[id.length - 1]) || {}
  734. return find.name
  735. }
  736. },
  737. getDeptName() {
  738. return (id = []) => {
  739. if (!id.length) return ''
  740. id = Array.isArray(id) ? id : [id]
  741. let find = this.deptList.find(item => item.id == id[id.length - 1]) || {}
  742. return find.name
  743. }
  744. },
  745. },
  746. watch: {
  747. 'params.formId': {
  748. handler(val) {
  749. this.reload()
  750. this.deptReload()
  751. this.reload()
  752. this.noticeReload()
  753. }
  754. },
  755. 'params.dictType': {
  756. handler(val) {
  757. this.params.formId = this.templateList[val][0].id
  758. this.reload()
  759. this.deptReload()
  760. this.reload()
  761. this.noticeReload()
  762. }
  763. },
  764. },
  765. async created() {
  766. await this.getDictList('collaborative_type')
  767. await this.getTemplateList()
  768. await this.getUserList()
  769. await this.getDeptList()
  770. },
  771. methods: {
  772. getDictV(code, val) {
  773. if (!this.dictList[code]) return '';
  774. return this.dictList[code].find(item => item.value == val)?.label
  775. },
  776. async getDictList(code) {
  777. let {data: res} = await getByCode(code)
  778. this.dictList[code] = res.map(item => {
  779. let values = Object.keys(item)
  780. return {
  781. value: values[0],
  782. label: item[values[0]]
  783. }
  784. })
  785. },
  786. //获取人员数据
  787. async getUserList() {
  788. let params = {pageNum: 1, size: -1};
  789. let {list} = await getUserPage(params);
  790. this.userList = list
  791. },
  792. //获取部门数据
  793. async getDeptList() {
  794. this.deptList = await listOrganizations()
  795. },
  796. getFiles(row = []) {
  797. row.forEach(item => {
  798. getFile({objectName: item.storePath}, item.name);
  799. })
  800. },
  801. async getTemplateList() {
  802. this.defaultTemplateList = await getBpmCustomFormList({status: 1})
  803. this.templateList = _.groupBy(this.defaultTemplateList, 'dictType');
  804. this.params.dictType = this.dictList['collaborative_type'][0].value;
  805. this.params.formId = this.defaultTemplateList[0]?.id;
  806. let makingJson = JSON.parse(this.defaultTemplateList[0].formJson.makingJson) || {}
  807. this.formColumnList = makingJson.list
  808. console.log(this.formColumnList);
  809. },
  810. handleStartProcess(i) {
  811. this.processSubmitDialogFlag = true;
  812. this.$nextTick(() => {
  813. this.$refs.processSubmitDialogRef.init(i);
  814. })
  815. },
  816. /* 表格数据源 */
  817. async datasource({page, limit, where, order}) {
  818. let [createTimeBegin,createTimeEnd]=this.createTime1||[]
  819. let data = await getProcessInstancePage({
  820. pageNo: page,
  821. pageSize: limit,
  822. ...this.params,
  823. processType: '1',
  824. createTimeBegin,createTimeEnd
  825. });
  826. data = data.list.map(item => {
  827. return {
  828. ...
  829. item,
  830. ...
  831. item.valueJson
  832. }
  833. })
  834. return data
  835. },
  836. /* 刷新表格 */
  837. reload(where) {
  838. let find = this.defaultTemplateList.find(item => item.id == this.params.formId) || {};
  839. let makingJson = JSON.parse(find.formJson.makingJson) || {}
  840. this.formColumnList = makingJson.list
  841. this.$refs.table.reload({page: 1, where});
  842. this.$refs.table.reRenderTable()
  843. },
  844. /* 重置 */
  845. reset() {
  846. this.params = {...defaultParams};
  847. this.createTime1=[]
  848. this.params.formId = this.defaultTemplateList[0]?.id
  849. this.params.dictType = this.dictList['collaborative_type'][0].value;
  850. this.reload();
  851. },
  852. /* 表格数据源 */
  853. async deptDatasource({page, limit, where, order}) {
  854. let [createTimeBegin,createTimeEnd]=this.createTime1||[]
  855. let data = await getProcessInstanceDeptPage({
  856. pageNo: page,
  857. pageSize: limit,
  858. ...this.params,
  859. processType: '1',createTimeBegin,createTimeEnd
  860. });
  861. data = data.list.map(item => {
  862. return {
  863. ...
  864. item,
  865. ...
  866. item.valueJson
  867. }
  868. })
  869. return data
  870. },
  871. /* 刷新表格 */
  872. deptReload(where) {
  873. let find = this.defaultTemplateList.find(item => item.id == this.params.formId) || {};
  874. let makingJson = JSON.parse(find.formJson.makingJson) || {}
  875. this.formColumnList = makingJson.list
  876. this.$refs.deptTable.reload({page: 1, where});
  877. },
  878. /* 重置 */
  879. deptReset() {
  880. this.params = {...defaultParams};
  881. this.createTime1=[]
  882. this.params.formId = this.defaultTemplateList[0]?.id
  883. this.params.dictType = this.dictList['collaborative_type'][0].value;
  884. this.deptReload();
  885. },
  886. /* 表格数据源 */
  887. async noticeDatasource({page, limit, where, order}) {
  888. let [createTimeBegin,createTimeEnd]=this.createTime1||[]
  889. let data = await getProcessInstanceNoticePage({
  890. pageNo: page,
  891. pageSize: limit,
  892. ...this.params,
  893. processType: '1',createTimeBegin,createTimeEnd
  894. });
  895. data = data.list.map(item => {
  896. return {
  897. ...
  898. item,
  899. ...
  900. item.valueJson
  901. }
  902. })
  903. return data
  904. },
  905. /* 刷新表格 */
  906. noticeReload(where) {
  907. let find = this.defaultTemplateList.find(item => item.id == this.params.formId) || {};
  908. let makingJson = JSON.parse(find.formJson.makingJson) || {}
  909. this.formColumnList = makingJson.list
  910. this.$refs.noticeTable.reload({page: 1, where});
  911. },
  912. /* 重置 */
  913. noticeReset() {
  914. this.params = {...defaultParams};
  915. this.createTime1=[]
  916. this.params.formId = this.defaultTemplateList[0]?.id
  917. this.params.dictType = this.dictList['collaborative_type'][0].value;
  918. this.noticeReload();
  919. },
  920. /** */
  921. handleAudit(row) {
  922. this.$refs.detailRef.open(row.id);
  923. },
  924. /** */
  925. handleDetail(row) {
  926. this.formDetailDialogFlag = true
  927. this.$nextTick(() => {
  928. this.$refs.formDetailDialogRef.open(row);
  929. })
  930. },
  931. getTimelineItemType(result) {
  932. if (result === '通过') {
  933. return 'success';
  934. }
  935. if (result === '不通过') {
  936. return 'danger';
  937. }
  938. if (result === '取消') {
  939. return 'info';
  940. }
  941. if (result === '处理中') {
  942. return 'warning';
  943. }
  944. return '';
  945. },
  946. getDateTime(ms) {
  947. return getDate(ms)
  948. },
  949. }
  950. }
  951. </script>
  952. <style scoped lang="scss">
  953. .ele-body {
  954. padding: 15px;
  955. }
  956. .content-box {
  957. width: 100%;
  958. //max-width: 273px;
  959. //min-width: 90px;
  960. margin-right: 10px;
  961. display: flex;
  962. flex-direction: row;
  963. flex-wrap: wrap;
  964. //justify-content: space-between;
  965. .category_box {
  966. border-left: 1px solid #e1e1e1;
  967. border-bottom: 1px solid #e1e1e1;
  968. border-radius: 1px;
  969. flex: 1 0 25%;
  970. margin-top: 5px;
  971. overflow: auto;
  972. .category_box_title {
  973. font-size: 14px;
  974. font-weight: bold;
  975. color: #fff8f8;
  976. height: 39px;
  977. display: flex;
  978. padding: 5px 20px;
  979. align-items: center;
  980. background: #1890ffd6;
  981. border-bottom: 1px solid #e1e1e1;
  982. }
  983. .category_box_content {
  984. display: flex;
  985. flex-direction: row;
  986. flex-wrap: wrap;
  987. height: 60px;
  988. overflow: auto;
  989. .category_content {
  990. min-width: 60px;
  991. min-height: 60px;
  992. //flex: 1 1 0;
  993. display: flex;
  994. flex-direction: column;
  995. border-right: 1px solid #e1e1e1;
  996. border-bottom: 1px solid #e1e1e1;
  997. align-items: center;
  998. justify-content: center;
  999. // font-weight: bold;
  1000. &:nth-child(n) {
  1001. span:nth-child(1) {
  1002. transform: scale(2);
  1003. }
  1004. span:nth-child(2) {
  1005. padding-top: 5px;
  1006. }
  1007. }
  1008. }
  1009. .category_content:hover {
  1010. cursor: pointer;
  1011. background-color: rgba(135, 181, 243, 0.29);
  1012. }
  1013. }
  1014. }
  1015. .category_box:last-child {
  1016. border-right: 1px solid #e1e1e1;
  1017. }
  1018. }
  1019. .tab-box {
  1020. width: 100%;
  1021. //max-width: 1100px;
  1022. //min-width: 600px;
  1023. margin-top: 6px;
  1024. height: 98%;
  1025. .el-tabs--border-card {
  1026. height: 100%;
  1027. }
  1028. }
  1029. ::v-deep .card_box {
  1030. .el-card__body {
  1031. padding: 10px;
  1032. height: 86vh;
  1033. }
  1034. }
  1035. ::v-deep .ele-table-tool {
  1036. display: flex;
  1037. flex-direction: row;
  1038. flex-wrap: nowrap !important;
  1039. }
  1040. </style>