taskDetail.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <template>
  2. <div class="task-detail">
  3. <el-descriptions class="margin-top" :column="7" direction="vertical">
  4. <el-descriptions-item label="负责人">
  5. <div class="desc-item-content">{{ form.executorName }}</div>
  6. </el-descriptions-item>
  7. <el-descriptions-item label="当前状态">
  8. <el-tag size="mini" :type="statusMap[form.status].type">
  9. <!-- {{ statusMap[form.status].name }}-->
  10. {{ getStatusName(form.status) }}
  11. </el-tag>
  12. </el-descriptions-item>
  13. <el-descriptions-item label="进度" :span="2">
  14. <div style="padding: 0 60px 0 0">
  15. <el-progress :percentage="form.progressValue" :text-inside="true" :stroke-width="15"
  16. :color="cellColorMap[form.status]"></el-progress>
  17. </div>
  18. </el-descriptions-item>
  19. <el-descriptions-item label="优先级">
  20. <el-tag :color="priorityColorMap[form.priority]" effect="dark" :hit="false">
  21. {{ getTaskPriority(form.priority) }}
  22. </el-tag>
  23. </el-descriptions-item>
  24. <el-descriptions-item label="开始时间">
  25. <div class="desc-item-content">{{ form.beginDate }}</div>
  26. </el-descriptions-item>
  27. <el-descriptions-item label="结束时间">
  28. <div class="desc-item-content">{{ form.endDate }}</div>
  29. </el-descriptions-item>
  30. </el-descriptions>
  31. <el-descriptions>
  32. <el-descriptions-item label="父任务">
  33. <div v-if="form.ancestorsTask&&form.ancestorsTask.length>0">
  34. <template v-for="item in form.ancestorsTask">
  35. <span class="p-task" @click="toTask(item.id)">{{ item.id + '、' + item.taskName }}</span><i
  36. class="el-icon-arrow-right"></i>
  37. </template>
  38. <span>当前任务</span>
  39. </div>
  40. <div v-else>无</div>
  41. </el-descriptions-item>
  42. </el-descriptions>
  43. <el-tabs v-model="activeName">
  44. <el-tab-pane name="first">
  45. <span slot="label"><i class="el-icon-info"></i><span style="margin-left: 5px">任务信息</span></span>
  46. <el-form :model="form" size="mini" label-width="100px">
  47. <el-form-item label="所属项目:">
  48. <div>{{ form.projectName }}</div>
  49. </el-form-item>
  50. <!-- <el-form-item label="父任务:" v-if="form.parentTaskId">-->
  51. <!-- <div class="p-task" @click="getParentTask(form.parentTaskId)">{{ form.parentTaskName }}</div>-->
  52. <!-- </el-form-item>-->
  53. <el-form-item label="附件:">
  54. <div v-if="form.fileList.length>0">
  55. <div v-for="(file,index) in form.fileList">
  56. <a :href="file.url">
  57. <span class="file">{{ file.name }}</span>
  58. </a>
  59. </div>
  60. </div>
  61. <div v-else>无</div>
  62. </el-form-item>
  63. <el-form-item label="任务描述:">
  64. <div v-if="form.description" v-html="form.description" class="description"></div>
  65. <div v-else>无</div>
  66. </el-form-item>
  67. </el-form>
  68. <div class="footer">
  69. <div>
  70. <span>{{ form.createUserName }}</span>
  71. <span style="margin-left: 5px;margin-right: 5px">创建于</span>
  72. <span>{{ form.createTime }}</span>
  73. </div>
  74. <el-divider direction="vertical" v-if="form.updateUserName"></el-divider>
  75. <div v-if="form.updateUserName">
  76. <span>{{ form.updateUserName }}</span>
  77. <span style="margin-left: 5px;margin-right: 5px">更新于</span>
  78. <span>{{ form.updateTime }}</span>
  79. </div>
  80. </div>
  81. </el-tab-pane>
  82. <el-tab-pane name="second">
  83. <span slot="label"><i class="el-icon-document"></i>
  84. <span style="margin-left: 5px">反馈信息({{ form.feedbacks.length }})</span>
  85. </span>
  86. <el-table :data="form.feedbacks" size="mini" max-height="400" border>
  87. <el-table-column width="75" label="反馈状态">
  88. <template slot-scope="scope">
  89. <div>{{ getFeedbackTypeName(scope.row.feedbackType) }}</div>
  90. </template>
  91. </el-table-column>
  92. <el-table-column width="60" property="userName" label="反馈人"></el-table-column>
  93. <el-table-column width="60" label="完成度">
  94. <template slot-scope="scope">
  95. <div v-if="scope.row.value!==undefined">{{ scope.row.value + '%' }}</div>
  96. </template>
  97. </el-table-column>
  98. <el-table-column width="120" property="createTime" label="反馈时间">
  99. <template slot-scope="scope">
  100. <span>{{ parseTime(scope.row.createTime) }}</span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column width="70" property="hours" label="工时(h)"></el-table-column>
  104. <el-table-column label="反馈备注">
  105. <template slot-scope="scope">
  106. <span>{{ scope.row.description }}</span>
  107. <span v-for="(file,index) in scope.row.fileList">
  108. <a :href="file.url" style="color: darkgreen">
  109. <span style="margin-left: 5px">{{ file.name }}</span>
  110. </a>
  111. </span>
  112. </template>
  113. </el-table-column>
  114. <el-table-column label="当前达成进度" width="100px">
  115. <template slot-scope="scope">
  116. <el-popover
  117. v-if="scope.row.descriptionDetail&&scope.row.descriptionDetail.length>0"
  118. placement="top"
  119. width="600"
  120. trigger="hover">
  121. <div v-html="scope.row.descriptionDetail"></div>
  122. <el-button slot="reference" type="text">详情</el-button>
  123. </el-popover>
  124. </template>
  125. </el-table-column>
  126. </el-table>
  127. </el-tab-pane>
  128. <el-tab-pane label="子任务" name="third">
  129. <span slot="label"><i class="el-icon-more"></i>
  130. <span style="margin-left: 5px">子任务({{ form.children.length }})</span>
  131. </span>
  132. <el-table :data="form.children"
  133. max-height="400"
  134. size="mini"
  135. @cell-mouse-enter="cellMouseEnter"
  136. @cell-mouse-leave="cellMouseLeave"
  137. @cell-click="cellClick">
  138. <el-table-column width="70" prop="id" label="编号"></el-table-column>
  139. <el-table-column label="任务名称" prop="taskName" min-width="150" :show-overflow-tooltip="true"/>
  140. <el-table-column label="执行(负责)人" prop="executorName" width="100"/>
  141. <el-table-column label="进度" prop="progressValue" width="70">
  142. <template slot-scope="scope">
  143. <span>{{ (scope.row.progressValue ? scope.row.progressValue : 0) + '%' }}</span>
  144. </template>
  145. </el-table-column>
  146. <el-table-column label="状态" align="center" width="80">
  147. <template slot-scope="scope">
  148. <el-tag size="mini" :type="statusMap[scope.row.status].type">{{
  149. statusMap[scope.row.status].name
  150. }}
  151. </el-tag>
  152. </template>
  153. </el-table-column>
  154. <el-table-column label="优先级" prop="priority" align="center" width="80">
  155. <template slot-scope="scope">
  156. <el-tag v-if="scope.row.priority==='1'" color="#fa8888" effect="dark" :hit="false">
  157. {{ getTaskPriority(scope.row.priority) }}
  158. </el-tag>
  159. <el-tag v-else-if="scope.row.priority==='2'" color="#fb7fb7" effect="dark" :hit="false">
  160. {{ getTaskPriority(scope.row.priority) }}
  161. </el-tag>
  162. <el-tag v-else-if="scope.row.priority==='3'" color="#40e0c3" effect="dark" :hit="false">
  163. {{ getTaskPriority(scope.row.priority) }}
  164. </el-tag>
  165. <el-tag v-else color="#5dcfff" effect="dark" :hit="false">{{
  166. getTaskPriority(scope.row.priority)
  167. }}
  168. </el-tag>
  169. </template>
  170. </el-table-column>
  171. <el-table-column label="开始时间" prop="beginDate" width="100"/>
  172. <el-table-column label="结束时间" prop="endDate" width="100"/>
  173. </el-table>
  174. </el-tab-pane>
  175. <el-tab-pane label="修改日志" name="four">
  176. <span slot="label"><i class="el-icon-edit"></i>
  177. <span style="margin-left: 5px">修改日志({{ form.updateLogs.length }})</span>
  178. </span>
  179. <el-table :data="form.updateLogs"
  180. max-height="400"
  181. size="mini">
  182. <el-table-column label="修改项" prop="fieldName" width="90">
  183. <template slot-scope="scope">
  184. <span>{{ getFieldName(scope.row.field) }}</span>
  185. </template>
  186. </el-table-column>
  187. <el-table-column label="旧值" prop="oldValue" min-width="150" :show-overflow-tooltip="true">
  188. <template slot-scope="scope">
  189. <div v-html="scope.row.oldValue"></div>
  190. </template>
  191. </el-table-column>
  192. <el-table-column label="新值" prop="newValue" min-width="150" :show-overflow-tooltip="true">
  193. <template slot-scope="scope">
  194. <div v-html="scope.row.newValue"></div>
  195. </template>
  196. </el-table-column>
  197. <el-table-column label="修改人" prop="operatorName" width="90"/>
  198. <el-table-column label="修改时间" prop="createTime" width="120">
  199. <template slot-scope="scope">
  200. <span>{{ parseTime(scope.row.createTime) }}</span>
  201. </template>
  202. </el-table-column>
  203. </el-table>
  204. </el-tab-pane>
  205. </el-tabs>
  206. </div>
  207. </template>
  208. <script>
  209. import {getTask} from "@/api/task/task";
  210. import task from "@/views/mixins/task";
  211. import DateUtil from "@/utils/date"
  212. export default {
  213. name: "taskDetail",
  214. mixins: [task],
  215. dicts: ['task_status', 'task_priority'],
  216. props: {
  217. detailForm: {
  218. type: Object,
  219. default: {}
  220. }
  221. },
  222. watch: {
  223. detailForm(val) {
  224. this.activeName = 'first'
  225. if (val && JSON.stringify(val) != '{}') {
  226. this.form = val
  227. }
  228. }
  229. },
  230. data() {
  231. return {
  232. form: {},
  233. activeName: 'first'
  234. }
  235. },
  236. created() {
  237. this.form = this.detailForm
  238. },
  239. methods: {
  240. getFeedbackTypeName(type) {
  241. if (type === '1') {
  242. return '进度反馈'
  243. } else if (type === '2') {
  244. return '完成'
  245. } else if (type === '3') {
  246. return '终止'
  247. } else if (type === '4') {
  248. return '评论'
  249. }
  250. return '审批'
  251. },
  252. toTask(id) {
  253. getTask(id).then(res => {
  254. this.form = res.data;
  255. this.activeName = 'first'
  256. })
  257. },
  258. cellClick(row, column, cell, event) {
  259. if (column.property != 'taskName') {
  260. return
  261. }
  262. getTask(row.id).then(res => {
  263. this.form = res.data;
  264. this.activeName = 'first'
  265. })
  266. },
  267. getStatusName(status) {
  268. let name = this.statusMap[status].name
  269. if (status === '6') {
  270. let result = DateUtil.compare(this.detailForm.endDate, this.detailForm.finishDate);
  271. let temp = result < 0 ? '延期' : '正常'
  272. name = name + '(' + temp + ')'
  273. }
  274. return name
  275. }
  276. }
  277. }
  278. </script>
  279. <style scoped lang="scss">
  280. .task-detail {
  281. height: 500px;
  282. }
  283. .desc-item-content {
  284. font-size: 14px;
  285. font-weight: bold;
  286. }
  287. .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
  288. margin-bottom: 10px;
  289. }
  290. .task-detail ::v-deep.el-tabs__header {
  291. margin: 0 0 5px;
  292. }
  293. .p-task {
  294. color: #1c84c6;
  295. cursor: pointer;
  296. }
  297. .p-task:hover {
  298. text-decoration-line: underline;
  299. text-decoration-color: #1c84c6;
  300. }
  301. .file {
  302. margin-right: 10px;
  303. color: darkgreen;
  304. }
  305. .file:hover {
  306. text-decoration-line: underline;
  307. text-decoration-color: darkgreen;
  308. }
  309. .description {
  310. margin-top: -13px;
  311. max-height: 270px;
  312. overflow: auto;
  313. }
  314. .footer {
  315. margin-top: 10px;
  316. margin-left: 10px;
  317. display: flex;
  318. justify-content: start;
  319. color: #aaaaaa;
  320. }
  321. .el-tag--dark {
  322. border-color: white;
  323. }
  324. </style>