ShowHanderDialog2.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. <template>
  2. <el-dialog title="指标审批详情" center :visible.sync="showHandlerDialogVisible" width="600px"
  3. :before-close="handleCloseDialog" append-to-body :close-on-press-escape="true">
  4. <div class="dialog-box">
  5. <el-link type="primary" @click="getLogDetails()">操作日志</el-link>
  6. <ol class="steps scroll-bar" style="width: 100%; height: 500px; overflow-y: auto;">
  7. <template v-for="node in showData.nodes">
  8. <template v-if="node.type === 'targetConfirms'">
  9. <template v-if="node.enable">
  10. <li class="title" :class="showData.businessStatus === 'target_confirm' ? 'active' : ''">
  11. 1.确认目标{{ showData.businessStatus === 'target_confirm' ? '(进行中)' : '' }}
  12. </li>
  13. <li class="info-box">
  14. <div class="line"></div>
  15. <div class="content" v-if="node.children && node.children.length > 0">
  16. <div class="content-info" v-for="child in node.children" :key="child.id">
  17. <div class="user-type" v-if="child.tasks && child.tasks.length > 0">
  18. {{ child.assigneeType | filterType }}
  19. </div>
  20. <div class="task-info" v-if="child.tasks && child.tasks.length > 0">
  21. <div class="info" v-for="task in child.tasks" :key="task.taskId">
  22. <div class="info-left">
  23. <span
  24. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  25. {{ task.state === 'created' ? '进行中' : '已完成' }},
  26. </span>
  27. {{ task.assigneeName }}
  28. </div>
  29. <div class="info-right" v-if="task.comment">
  30. <el-tooltip effect="dark" placement="right">
  31. <div v-html="task.comment" slot="content"
  32. style="max-width: 300px">
  33. </div>
  34. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  35. </el-tooltip>
  36. </div>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="content" v-else>
  42. 未开始
  43. </div>
  44. </li>
  45. </template>
  46. <template v-if="!node.enable">
  47. <li class="title">1.确认目标</li>
  48. <li class="info-box">
  49. <div class="line"></div>
  50. <div class="content">
  51. 未启用
  52. </div>
  53. </li>
  54. </template>
  55. </template>
  56. <template v-if="node.type === 'resultInput'">
  57. <template v-if="node.enable">
  58. <li class="title" :class="showData.businessStatus === 'result_input' ? 'active' : ''">
  59. 2.录入结果{{ showData.businessStatus === 'result_input' ? '(进行中)' : '' }}
  60. </li>
  61. <li class="info-box">
  62. <div class="line"></div>
  63. <div class="content" v-if="node.tasks && node.tasks.length > 0">
  64. <div class="content-info">
  65. <div class="user-type">
  66. {{ node.assigneeType | filterType }}
  67. </div>
  68. <div class="task-info" v-for="task in node.tasks" :key="task.taskId">
  69. <div class="info">
  70. <div class="info-left">
  71. <span
  72. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  73. {{ task.state === 'created' ? '进行中' : '已完成' }},
  74. </span>
  75. {{ task.assigneeName }},结果值:{{ task.result || '--'}}
  76. </div>
  77. <div class="info-right" v-if="task.comment">
  78. <el-tooltip effect="dark" placement="right">
  79. <div v-html="task.comment" slot="content"
  80. style="max-width: 300px">
  81. </div>
  82. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  83. </el-tooltip>
  84. </div>
  85. </div>
  86. <div class="files" v-if="task.files && task.files.length > 0">
  87. <div class="file-title">附件列表</div>
  88. <div class="file-list">
  89. <div class="file-item" v-for="file in task.files"
  90. @click="openFileReview2(file)">
  91. {{ file | filterFileName }}
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. <div v-else class="content">
  99. 未开始
  100. </div>
  101. </li>
  102. </template>
  103. <template v-if="!node.enable">
  104. <li class="title">2.录入结果</li>
  105. <li class="info-box">
  106. <div class="line"></div>
  107. <div class="content">
  108. 未启用
  109. </div>
  110. </li>
  111. </template>
  112. </template>
  113. <template v-if="node.type === 'scoreSelf'">
  114. <template v-if="node.enable">
  115. <li class="title" :class="showData.businessStatus === 'score_self' ? 'active' : ''">
  116. 3.自评{{ showData.businessStatus === 'score_self' ? '(进行中)' : '' }}
  117. </li>
  118. <li class="info-box">
  119. <div class="line"></div>
  120. <div class="content" v-if="node.tasks && node.tasks.length > 0">
  121. <div class="content-info">
  122. <div class="user-type">
  123. {{ node.assigneeType | filterType }}
  124. </div>
  125. <div class="task-info" v-for="task in node.tasks" :key="task.taskId">
  126. <div class="info">
  127. <div class="info-left">
  128. <span
  129. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  130. {{ task.state === 'created' ? '进行中' : '已完成' }},
  131. </span>
  132. {{ task.assigneeName }},评分:{{ task.score || '--' }}
  133. </div>
  134. <div class="info-right" v-if="task.comment">
  135. <el-tooltip effect="dark" placement="right">
  136. <div v-html="task.comment" slot="content"
  137. style="max-width: 300px">
  138. </div>
  139. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  140. </el-tooltip>
  141. </div>
  142. </div>
  143. <div class="files" v-if="task.files && task.files.length > 0">
  144. <div class="file-title">附件列表</div>
  145. <div class="file-list">
  146. <div class="file-item" v-for="file in task.files"
  147. @click="openFileReview2(file)">
  148. {{ file | filterFileName }}
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. </div>
  155. <div v-else class="content">
  156. 未开始
  157. </div>
  158. </li>
  159. </template>
  160. <template v-if="!node.enable">
  161. <li class="title">3.自评</li>
  162. <li class="info-box">
  163. <div class="line"></div>
  164. <div class="content">
  165. 未启用
  166. </div>
  167. </li>
  168. </template>
  169. </template>
  170. <template v-if="node.type === 'scoreEachOther'">
  171. <template v-if="node.enable">
  172. <li class="title" :class="showData.businessStatus === 'score_each_other' ? 'active' : ''">
  173. 4.互评{{ showData.businessStatus === 'score_each_other' ? '(进行中)' : '' }}
  174. </li>
  175. <li class="info-box">
  176. <div class="line"></div>
  177. <div class="content" v-if="node.tasks && node.tasks.length > 0">
  178. <div class="content-info">
  179. <div class="user-type">
  180. {{ node.assigneeType | filterType }}
  181. </div>
  182. <div class="task-info" v-for="task in node.tasks" :key="task.taskId">
  183. <div class="info">
  184. <div class="info-left">
  185. <span
  186. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  187. {{ task.state === 'created' ? '进行中' : '已完成' }},
  188. </span>
  189. {{ task.assigneeName }},评分:{{ task.score || '--' }}
  190. </div>
  191. <div class="info-right" v-if="task.comment">
  192. <el-tooltip effect="dark" placement="right">
  193. <div v-html="task.comment" slot="content"
  194. style="max-width: 300px">
  195. </div>
  196. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  197. </el-tooltip>
  198. </div>
  199. </div>
  200. <div class="files" v-if="task.files && task.files.length > 0">
  201. <div class="file-title">附件列表</div>
  202. <div class="file-list">
  203. <div class="file-item" v-for="file in task.files"
  204. @click="openFileReview2(file)">
  205. {{ file | filterFileName }}
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. </div>
  211. </div>
  212. <div v-else class="content">
  213. 未开始
  214. </div>
  215. </li>
  216. </template>
  217. <template v-if="!node.enable">
  218. <li class="title">4.互评</li>
  219. <li class="info-box">
  220. <div class="line"></div>
  221. <div class="content">
  222. 未启用
  223. </div>
  224. </li>
  225. </template>
  226. </template>
  227. <template v-if="node.type === 'scores'">
  228. <template v-if="node.enable">
  229. <li class="title" :class="showData.businessStatus === 'score' ? 'active' : ''">
  230. 5.评分{{ showData.businessStatus === 'score' ? '(进行中)' : '' }}
  231. </li>
  232. <li class="info-box">
  233. <div class="line"></div>
  234. <div class="content" v-if="node.children && node.children.length > 0">
  235. <div class="content-info" v-for="child in node.children" :key="child.id">
  236. <div class="user-type" v-if="child.tasks && child.tasks.length > 0">
  237. {{ child.assigneeType | filterType }}
  238. </div>
  239. <div class="task-info" v-if="child.tasks && child.tasks.length > 0">
  240. <template v-for="task in child.tasks">
  241. <div class="info" :key="task.taskId">
  242. <div class="info-left">
  243. <span
  244. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  245. {{ task.state === 'created' ? '进行中' : '已完成' }},
  246. </span>
  247. {{ task.assigneeName }},评分:{{ task.score }}
  248. </div>
  249. <div class="info-right" v-if="task.comment">
  250. <el-tooltip effect="dark" placement="right">
  251. <div v-html="task.comment" slot="content"
  252. style="max-width: 300px">
  253. </div>
  254. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  255. </el-tooltip>
  256. </div>
  257. </div>
  258. <div class="files" v-if="task.files && task.files.length > 0">
  259. <div class="file-title">附件列表</div>
  260. <div class="file-list">
  261. <div class="file-item" v-for="file in task.files"
  262. @click="openFileReview2(file)">
  263. {{ file | filterFileName }}
  264. </div>
  265. </div>
  266. </div>
  267. </template>
  268. </div>
  269. <div v-else>
  270. 未开始
  271. </div>
  272. </div>
  273. </div>
  274. </li>
  275. </template>
  276. <template v-if="!node.enable">
  277. <li class="title">5.评分</li>
  278. <li class="info-box">
  279. <div class="line"></div>
  280. <div class="content">
  281. 未启用
  282. </div>
  283. </li>
  284. </template>
  285. </template>
  286. <template v-if="node.type === 'reviews'">
  287. <template v-if="node.enable">
  288. <li class="title" :class="showData.businessStatus === 'review' ? 'active' : ''">
  289. 6.审批{{ showData.businessStatus === 'review' ? '(进行中)' : '' }}
  290. </li>
  291. <li class="info-box">
  292. <div class="line"></div>
  293. <div class="content" v-if="node.children && node.children.length > 0">
  294. <div class="content-info" v-for="child in node.children" :key="child.id">
  295. <div class="user-type" v-if="child.tasks && child.tasks.length > 0">
  296. {{ child.assigneeType | filterType }}
  297. </div>
  298. <div class="task-info" v-if="child.tasks && child.tasks.length > 0">
  299. <template v-for="task in child.tasks">
  300. <div class="info" :key="task.taskId">
  301. <div class="info-left">
  302. <span
  303. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  304. {{ task.state === 'created' ? '进行中' : '已完成' }},
  305. </span>
  306. {{ task.assigneeName }},评分:{{ task.score }}
  307. </div>
  308. <div class="info-right" v-if="task.comment">
  309. <el-tooltip effect="dark" placement="right">
  310. <div v-html="task.comment" slot="content"
  311. style="max-width: 300px">
  312. </div>
  313. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  314. </el-tooltip>
  315. </div>
  316. </div>
  317. <div class="files" v-if="task.files && task.files.length > 0">
  318. <div class="file-title">附件列表</div>
  319. <div class="file-list">
  320. <div class="file-item" v-for="file in task.files"
  321. @click="openFileReview2(file)">
  322. {{ file | filterFileName }}
  323. </div>
  324. </div>
  325. </div>
  326. </template>
  327. </div>
  328. <div v-else>
  329. 未开始
  330. </div>
  331. </div>
  332. </div>
  333. </li>
  334. </template>
  335. <template v-if="!node.enable">
  336. <li class="title">6.审批</li>
  337. <li class="info-box">
  338. <div class="line"></div>
  339. <div class="content">
  340. 未启用
  341. </div>
  342. </li>
  343. </template>
  344. </template>
  345. <!-- <template v-if="node.type === 'cc'">
  346. <template v-if="node.enable">
  347. <li class="title" :class="showData.businessStatus === 'cc' ? 'active' : ''">
  348. 7.抄送{{ showData.businessStatus === 'cc' ? '(进行中)' : '' }}
  349. </li>
  350. <li class="info-box">
  351. <div class="line"></div>
  352. <div class="content" v-if="node.tasks && node.tasks.length > 0">
  353. <div class="content-info">
  354. <div class="user-type">
  355. {{ node.assigneeType | filterType }}
  356. </div>
  357. <div class="task-info" v-for="task in node.tasks" :key="task.taskId">
  358. <div class="info">
  359. <div class="info-left">
  360. <span
  361. :class="task.state === 'created' ? 'orange-color' : 'green-color'">
  362. {{ task.state === 'created' ? '进行中' : '已完成' }},
  363. </span>
  364. {{ task.assigneeName }}
  365. </div>
  366. <div class="info-right" v-if="task.comment">
  367. <el-tooltip effect="dark" placement="right">
  368. <div v-html="task.comment" slot="content"
  369. style="max-width: 300px">
  370. </div>
  371. <div class="oneLine">意见:{{ task.comment || '暂无意见' }}</div>
  372. </el-tooltip>
  373. </div>
  374. </div>
  375. </div>
  376. </div>
  377. </div>
  378. <div class="content" v-else>
  379. 未开始
  380. </div>
  381. </li>
  382. </template>
  383. <template v-if="!node.enable">
  384. <li class="title">7.抄送</li>
  385. <li class="info-box">
  386. <div class="line"></div>
  387. <div class="content">
  388. 未启用
  389. </div>
  390. </li>
  391. </template>
  392. </template> -->
  393. </template>
  394. </ol>
  395. <div style="height: 50px;"></div>
  396. </div>
  397. <ExamineLogDialog v-if="examineLogDialogVisible" v-model="examineLogDialogVisible" :reviewId="reviewId"
  398. :reviewIndicatorId="reviewIndicatorId">
  399. </ExamineLogDialog>
  400. </el-dialog>
  401. </template>
  402. <script>
  403. import ExamineLogDialog from '@/newPerformance/components/MyPerformance/ExamineLog'; // 考核日志
  404. export default {
  405. components: {
  406. ExamineLogDialog
  407. },
  408. model: {
  409. prop: 'showHandlerDialogVisible',
  410. event: 'close-dialog'
  411. },
  412. props: {
  413. showHandlerDialogVisible: {
  414. type: Boolean,
  415. default: false
  416. },
  417. dialogTitle: {
  418. type: String,
  419. default: ''
  420. },
  421. status: {
  422. type: String,
  423. default: 'completed'
  424. },
  425. showData: {
  426. type: [],
  427. default: () => []
  428. }
  429. },
  430. data() {
  431. return {
  432. imgUrl: "",
  433. examineLogDialogVisible: false,
  434. reviewIndicatorId: "",
  435. reviewId: ""
  436. }
  437. },
  438. filters: {
  439. filterType(v) {
  440. if (v == 'leader') return v = "管理员"
  441. if (v == 'self') return v = "被考核人"
  442. if (v == 'post') return v = "岗位"
  443. if (v == 'user') return v = "指定人员"
  444. if (v == 'deptLeader') return v = "部门"
  445. },
  446. filterFileName(str) {
  447. if (str) {
  448. let lastIndex = str.lastIndexOf("/")
  449. return str.substr(lastIndex + 1, str.length - 1);
  450. }
  451. }
  452. },
  453. methods: {
  454. handleCloseDialog() {
  455. this.$emit('close-dialog', false)
  456. },
  457. // 文件预览
  458. openFileReview2(url) {
  459. let file = {
  460. url
  461. }
  462. let imgFiles = ['BMP', 'GIF', 'PNG', 'JPEG', 'JPG', 'bmp', 'gif', 'png', 'jpeg', 'jpg'];
  463. let lastIndex = file.url && file.url.lastIndexOf("/") || -1
  464. let suffix; //文件后缀名
  465. if (lastIndex > 0) {
  466. suffix = file.url.substr(lastIndex + 1, file.url.length - 1).split(".")[1];
  467. if (imgFiles.includes(suffix)) {
  468. this.imgUrl = ''
  469. this.imgUrl = file.url;
  470. this.$viewerApi({
  471. images: [this.imgUrl]
  472. })
  473. } else {
  474. window.open(file.url, '_blank');
  475. }
  476. }
  477. },
  478. getLogDetails() {
  479. this.reviewIndicatorId = this.showData.reviewIndicatorId
  480. this.reviewId = this.showData.reviewId
  481. this.examineLogDialogVisible = true
  482. },
  483. }
  484. }
  485. </script>
  486. <style scoped lang="scss">
  487. .oneLine {
  488. overflow: hidden;
  489. white-space: nowrap;
  490. text-overflow: ellipsis;
  491. }
  492. .green-color {
  493. color: #67c23a;
  494. }
  495. .orange-color {
  496. color: #e6a23c;
  497. }
  498. .gray-color {
  499. color: rgb(144, 147, 153);
  500. background: rgb(244, 244, 245);
  501. border-color: rgb(144, 147, 153);
  502. }
  503. .dialog-box {
  504. position: relative;
  505. }
  506. .el-link {
  507. position: absolute;
  508. top: -60px;
  509. left: 0px;
  510. }
  511. .show-data-box {
  512. .item-list {
  513. .item {
  514. .value-box {
  515. margin-bottom: 5px;
  516. .content {
  517. display: flex;
  518. align-items: center;
  519. justify-content: space-between;
  520. &-left {
  521. display: flex;
  522. align-items: center;
  523. &-status {}
  524. }
  525. }
  526. }
  527. }
  528. }
  529. }
  530. .steps {
  531. display: flex;
  532. flex-direction: column;
  533. margin: 0;
  534. padding: 0;
  535. .title {
  536. width: 100%;
  537. height: 30px;
  538. font-weight: 600;
  539. color: #000;
  540. }
  541. .info-box {
  542. display: flex;
  543. margin: 10px 0;
  544. .line {
  545. margin: 0 20px;
  546. width: 1px;
  547. border: 1px dashed #ccc;
  548. }
  549. .content {
  550. width: 90%;
  551. background-color: #f7f7f7;
  552. padding: 10px;
  553. box-sizing: border-box;
  554. color: #999;
  555. &-info {
  556. display: flex;
  557. flex-direction: column;
  558. .user-type {
  559. width: 100px;
  560. display: flex;
  561. align-items: center;
  562. justify-content: center;
  563. border-radius: 30px;
  564. border: 1px solid;
  565. height: 30px;
  566. color: #409eff;
  567. background: #ecf5ff;
  568. border-color: #b3d8ff;
  569. }
  570. .task-info {
  571. margin: 5px;
  572. color: #999;
  573. .info {
  574. width: 100%;
  575. height: 30px;
  576. display: flex;
  577. align-items: center;
  578. justify-content: space-between;
  579. .info-right {
  580. width: 120px;
  581. }
  582. }
  583. }
  584. }
  585. }
  586. }
  587. }
  588. .active {
  589. color: #409eff !important;
  590. }
  591. .files {
  592. display: flex;
  593. flex-direction: column;
  594. border-radius: 6px;
  595. .file-title {
  596. color: #999;
  597. font-weight: 600;
  598. }
  599. .file-item {
  600. color: #999;
  601. transition: 0.2s;
  602. padding-left: 10px;
  603. &:hover {
  604. text-decoration: underline;
  605. cursor: pointer;
  606. }
  607. }
  608. }
  609. </style>