taskDetailsPopup.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <template>
  2. <div>
  3. <!-- 任务详情弹窗 -->
  4. <el-drawer :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
  5. <div class="details_title">{{ title }}</div>
  6. <div class="details_content" v-if="workDetailData" v-loading="loading">
  7. <div class="flex-box flex-v-ce">
  8. <userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>
  9. <div class="d_userMessage">
  10. <div>{{ workDetailData.employee_name }}</div>
  11. <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{ workDetailData.dept_list[0].dept_name }}</div>
  12. </div>
  13. <div style="margin-left: 5px;" class="flex-box flex-v-ce">
  14. <div v-if="workDetailData.point_config.base_point > 0" class="red">+{{ workDetailData.point_config.base_point }}</div>
  15. <div v-else class="green">{{ workDetailData.point_config.base_point }}</div>
  16. <div style="margin-left: 5px;">{{ $getTypsName(workDetailData.pt_id) }}</div>
  17. </div>
  18. </div>
  19. <ul>
  20. <li class="flex-box">
  21. <div class="label">任务内容</div>
  22. <div class="content_text">{{ workDetailData.task_name }}</div>
  23. </li>
  24. <li class="flex-box">
  25. <div class="label">任务备注</div>
  26. <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark" style="border: none;height:100px"></textarea>
  27. </li>
  28. <li class="flex-box">
  29. <div class="label">任务积分</div>
  30. <div class="content_text">{{ workDetailData.point_config.base_point }}{{ workDetailData.pt_name }}</div>
  31. </li>
  32. <li class="flex-box" v-if="workDetailData.point_config.review_point">
  33. <div class="label">最终分</div>
  34. <div class="content_text">{{ workDetailData.point_config.review_point }}</div>
  35. </li>
  36. <li class="flex-box">
  37. <div class="label">截止时间</div>
  38. <div class="content_text">{{ workDetailData.expire_time }}</div>
  39. </li>
  40. <li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point > 0">
  41. <div class="label">逾期扣分</div>
  42. <div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}</div>
  43. </li>
  44. <li class="flex-box" v-if="workDetailData.point_config.ahead_award_point > 0">
  45. <div class="label">提前奖分</div>
  46. <div class="content_text">{{ workDetailData.point_config.ahead_award_point }}</div>
  47. </li>
  48. <li class="flex-box">
  49. <div class="label">审批人</div>
  50. <div class="content_text">{{ workDetailData.reviewer_name }}</div>
  51. </li>
  52. <li class="flex-box">
  53. <div class="label">发布人</div>
  54. <div class="content_text">{{ workDetailData.publisher_name }}</div>
  55. </li>
  56. <li class="flex-box">
  57. <div class="label">积分种类</div>
  58. <div class="content_text">{{ workDetailData.pt_name }}</div>
  59. </li>
  60. </ul>
  61. <div v-show="showWork">
  62. <div class="d_progress">
  63. <div class="flex-box">
  64. <div class="flex-1">工作进度({{ workDetailData.progress }}%)</div>
  65. </div>
  66. <el-progress :percentage="workDetailData.progress"></el-progress>
  67. </div>
  68. <div>
  69. <el-tabs v-model="activeName">
  70. <el-tab-pane label="工作记录" name="work">
  71. <div class="work_box" style="padding-top:10px">
  72. <div class="work_item" v-for="(item, index) in text_list" :key="index">
  73. <div class="flex-box-ce">
  74. <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
  75. <div class="d_name flex-1">{{ item.recorder }}
  76. <span v-if="item.point * 1 > 0">+{{ item.point }}</span>
  77. <span v-if="item.point * 1 < 0">{{ item.point }}</span>
  78. </div>
  79. <div class="d_date fontColorF">{{ item.time }}</div>
  80. </div>
  81. <div class="d_content fontColorB">{{ item.remark }}</div>
  82. </div>
  83. <div v-if="text_list.length==0" class="fontColorF" style="text-align: center;">暂无工作记录</div>
  84. </div>
  85. </el-tab-pane>
  86. <el-tab-pane label="记分记录" name="participation">
  87. <div class="flex-box" style="padding-bottom: 10px;border-bottom: 1px solid #f1f1f1;">
  88. <div class="flex-1 blue">
  89. <span v-if="point_total > 0">合计:+{{ point_total }}</span>
  90. <span v-else>合计:{{ point_total }}</span>
  91. </div>
  92. </div>
  93. <div class="work_box" style="padding-top:10px">
  94. <div class="work_item" v-for="(item, index) in point_list" :key="index">
  95. <div class="flex-box-ce">
  96. <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
  97. <div class="d_name flex-1">{{ item.recorder }}
  98. <span class="red" v-if="item.point * 1 > 0">+{{ item.point }}</span>
  99. <span class="green" v-if="item.point * 1 < 0">{{ item.point }}</span>
  100. </div>
  101. <div class="d_date fontColorF">{{ item.time }}</div>
  102. </div>
  103. <div class="d_content fontColorB">{{ item.remark }}</div>
  104. </div>
  105. <div v-if="point_list.length==0" class="fontColorF" style="text-align: center;">暂无积分记录</div>
  106. </div>
  107. </el-tab-pane>
  108. </el-tabs>
  109. </div>
  110. </div>
  111. </div>
  112. </el-drawer>
  113. </div>
  114. </template>
  115. <script>
  116. export default {
  117. name: 'taskDetailsPopup',
  118. props: {
  119. title: {
  120. type: String,
  121. default: ''
  122. },
  123. visible: {
  124. type: Boolean,
  125. default: false
  126. },
  127. id: {
  128. type: Number,
  129. default: 0
  130. },
  131. showWork: {
  132. type: Boolean,
  133. default: true
  134. },
  135. detailType: {
  136. type: String,
  137. default: ''
  138. }
  139. },
  140. data() {
  141. return {
  142. Delay_to_open: false, //打开抽屉
  143. loading: false,
  144. workDetailData: {
  145. process: [],
  146. dept_list: [],
  147. point_config: {
  148. base_point: '0'
  149. }
  150. },
  151. // itemId: getId,
  152. isOne: false,
  153. text_list: [],
  154. isIntegral: false,
  155. point_total: 0,
  156. point_list: [],
  157. activeName: 'work',
  158. getDataUrl: '/api/integral/work',
  159. params: {}
  160. };
  161. },
  162. mounted() {
  163. this.detailType == 2 ? (this.getDataUrl = '/api/integral/schedule') : (this.getDataUrl = '/api/integral/work');
  164. this.$nextTick(() => {
  165. this.getData();
  166. this.Delay_to_open = this.visible; //更换打开抽屉时机,避免打开两次
  167. });
  168. },
  169. methods: {
  170. // 关闭弹窗
  171. handleClose() {
  172. this.$emit('update:visible', false);
  173. },
  174. // 删除
  175. delItem() {
  176. console.log('删除');
  177. },
  178. // 获取数据
  179. getData() {
  180. this.loading = true;
  181. let data = this.detailType == 2 ? { schedule_id: this.id } : { work_id: this.id };
  182. this.$axios('get', this.getDataUrl, data).then(res => {
  183. if (res.data.code == 1) {
  184. this.workDetailData = res.data.data;
  185. this.workDetailData = res.data.data
  186. this.text_list = []
  187. this.point_list = []
  188. this.point_total = 0
  189. if (this.workDetailData.process.list && this.workDetailData.process.list.length > 0) {
  190. for (let i in this.workDetailData.process.list) {
  191. this.point_total += this.workDetailData.process.list[i].point * 1
  192. if (this.workDetailData.process.list[i].point != 0) {
  193. this.point_list.push(this.workDetailData.process.list[i])
  194. } else {
  195. this.text_list.push(this.workDetailData.process.list[i])
  196. }
  197. }
  198. }
  199. }
  200. }).finally(() => {
  201. this.loading = false;
  202. });
  203. }
  204. }
  205. };
  206. </script>
  207. <style lang="scss" scoped="scoped">
  208. .details_content {
  209. & .d_userMessage {
  210. margin-left: 10px;
  211. }
  212. & .d_userMessage div:nth-child(1) {
  213. font-size: 16px;
  214. }
  215. & .d_userMessage div:nth-child(2) {
  216. font-size: 12px;
  217. color: #909399;
  218. }
  219. & .d_progress {
  220. padding: 12px 0;
  221. border-bottom: 1px solid #f1f1f1;
  222. margin-bottom: 10px;
  223. }
  224. & ul {
  225. padding: 12px 0;
  226. border-bottom: 1px solid #f1f1f1;
  227. & li {
  228. padding: 6px 0;
  229. }
  230. & .label {
  231. width: 80px;
  232. text-align: left;
  233. color: #909399;
  234. }
  235. & .content_text {
  236. flex: 1;
  237. }
  238. }
  239. }
  240. .fontColorF {
  241. color: #909399;
  242. }
  243. .details_content {
  244. padding: 20px;
  245. height: calc(100vh - 60px);
  246. overflow: auto;
  247. .row_title {
  248. position: relative;
  249. margin: 0 0 20px 0;
  250. padding-top: 12px;
  251. font-size: 16px;
  252. color: #303133;
  253. line-height: 22px;
  254. }
  255. .row_title:before {
  256. position: absolute;
  257. top: 0;
  258. content: ' ';
  259. width: 100%;
  260. border-top: 1px #f8f8f8 solid;
  261. }
  262. .el-row {
  263. margin-bottom: 10px;
  264. font-size: 14px;
  265. .el-col-4 {
  266. color: #606266;
  267. }
  268. }
  269. }
  270. .details_title {
  271. font-size: 18px;
  272. padding: 20px;
  273. border-bottom: 1px #efefef solid;
  274. }
  275. .d_name{
  276. margin-left: 10px;
  277. }
  278. .d_content{
  279. margin-left: 50px;
  280. }
  281. </style>