participation_detail.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. <template>
  2. <div class="box" style="position: relative">
  3. <el-page-header @back="$router.go(-1)" class="header"></el-page-header>
  4. <div style="position:absolute;top:23px;left:126px;color:#303133;font-size: 17px;"><WWOpenData type="userName" :openid="dataList.employee_name"></WWOpenData>{{date}}绩效</div>
  5. <div class="search"><el-date-picker :clearable="false" v-model="date" type="month" placeholder="选择月" value-format="yyyy-MM"></el-date-picker></div>
  6. <div class="flex-box">
  7. <div class="flex-1 flex-box flex-v-ce">
  8. <div class="point" v-if="dataList.base_point">
  9. <div>{{ dataList.base_point }}</div>
  10. <div>月平衡分</div>
  11. </div>
  12. <div class="point" v-if="dataList.status == 3">
  13. <div>{{ dataList.review_point }}</div>
  14. <div>最终得分</div>
  15. </div>
  16. </div>
  17. <div class="flex-box" style="height: 20px;">
  18. <el-dropdown>
  19. <span class="el-dropdown-link">
  20. 审批者
  21. <i class="el-icon-arrow-down el-icon--right"></i>
  22. </span>
  23. <el-dropdown-menu slot="dropdown">
  24. <el-dropdown-item v-if="dataList.reviewer_name"><WWOpenData type="userName" :openid="dataList.reviewer_name"></WWOpenData></el-dropdown-item>
  25. <el-dropdown-item class="fontColorF" v-else>无数据</el-dropdown-item>
  26. </el-dropdown-menu>
  27. </el-dropdown>
  28. <el-dropdown style="margin-left: 20px;">
  29. <span class="el-dropdown-link">
  30. <el-tooltip placement="top">
  31. <div slot="content">发布人可修改/删除绩效</div>
  32. <span class="tips">?</span>
  33. </el-tooltip>
  34. 发布人<i class="el-icon-arrow-down el-icon--right"></i></span>
  35. <el-dropdown-menu slot="dropdown">
  36. <el-dropdown-item v-if="dataList.publisher_name"><WWOpenData type="userName" :openid="dataList.publisher_name"></WWOpenData></el-dropdown-item>
  37. <el-dropdown-item class="fontColorF" v-else>无数据</el-dropdown-item>
  38. </el-dropdown-menu>
  39. </el-dropdown>
  40. <el-dropdown style="margin-left: 20px;">
  41. <span class="el-dropdown-link">
  42. <el-tooltip placement="top" style="margin-right: 5px;">
  43. <div slot="content">监察员可查看次员工的月绩效,参与月终的绩效评审。</div>
  44. <span class="tips">?</span>
  45. </el-tooltip>
  46. 监察员
  47. <i class="el-icon-arrow-down el-icon--right"></i>
  48. </span>
  49. <el-dropdown-menu slot="dropdown">
  50. <template v-if="dataList.notice_info.length > 0">
  51. <el-dropdown-item v-for="(item, index) in dataList.notice_info" :key="index"><WWOpenData type="userName" :openid="item.name"></WWOpenData></el-dropdown-item>
  52. </template>
  53. <el-dropdown-item class="fontColorF" v-else>无数据</el-dropdown-item>
  54. </el-dropdown-menu>
  55. </el-dropdown>
  56. </div>
  57. </div>
  58. <div class="table_page">
  59. <el-table :data="dataList.work_list" style="width:100%" ref="dataList" tooltip-effect="dark" v-loading="loading" @row-click="openDetail">
  60. <el-table-column prop="task_name" label="绩效任务" align="center" width="400px">
  61. <template slot-scope="scope">
  62. <div class="flex-box flex-v-ce">
  63. <el-progress type="circle" :percentage="scope.row.progress" :width="width"></el-progress>
  64. <span style="margin-left: 10px;">{{ scope.row.task_name }}</span>
  65. </div>
  66. </template>
  67. </el-table-column>
  68. <el-table-column prop="expire_time" label="截止时间" align="center"></el-table-column>
  69. <el-table-column prop="orderNo" label="权重" align="center">
  70. <template slot-scope="scope">
  71. <span>{{ ((scope.row.base_point / scope.row.base_point) * 100).toFixed(0) }}%</span>
  72. </template>
  73. </el-table-column>
  74. <el-table-column prop="base_point" label="工作绩效分" align="center"></el-table-column>
  75. <el-table-column prop="status" label="状态" align="center">
  76. <template slot-scope="scope">
  77. <span v-if="scope.row.status == 1">待完成</span>
  78. <span v-if="scope.row.status == 2" class="blue" @click.stop="openSp(scope.row)">审批</span>
  79. <span v-if="scope.row.status == 4" class="green">已审批</span>
  80. </template>
  81. </el-table-column>
  82. <template slot="empty">
  83. <noData></noData>
  84. </template>
  85. </el-table>
  86. <!-- table end -->
  87. <div class="page">
  88. <el-pagination
  89. @current-change="handleCurrentChange"
  90. :current-page="this.page"
  91. :page-size="this.perPage"
  92. :page-sizes="[10, 20, 50, 100]"
  93. layout="total, prev, pager, next"
  94. :total="this.total"
  95. ></el-pagination>
  96. </div>
  97. </div>
  98. <!-- 抽屉2 -->
  99. <el-drawer :visible.sync="drawer2" :with-header="false" :before-close="handleClose2">
  100. <div class="drawer_title">审批</div>
  101. <el-form :model="examineItem2" ref="examineItem2" label-width="100px" class="demo-ruleForm">
  102. <!-- <div class="fontColorF" style="margin-left: 100px;margin-bottom: 20px;">任务100分</div> -->
  103. <el-form-item label="积分" prop="point" :rules="[{required: true, message: '请输入积分', trigger: 'blur' },{ type: 'number', message: '积分必须为数字值'}]">
  104. <el-input placeholder="请输入内容" v-model.number="examineItem2.point" class="input-with-select"></el-input>
  105. </el-form-item>
  106. <el-form-item label="审批意见">
  107. <el-input type="textarea" rows="3" v-model="examineItem2.remark" maxlength="50" show-word-limit></el-input>
  108. </el-form-item>
  109. <div class="fontColorF" style="margin-left: 100px;margin-bottom: 20px;">奖票用于优秀表现和重要事项的表彰</div>
  110. <el-form-item label="发放奖票">
  111. <el-switch v-model="ticket_count"></el-switch>
  112. </el-form-item>
  113. <!-- <el-form-item label="递交审批">
  114. <div class="border flex-box flex-v-ce" @click="add_employee_show = true">
  115. <div class="flex-1 fontColorF" v-if="!selectUser.name">请选择</div>
  116. <div class="flex-1" v-else>{{selectUser.name}}</div>
  117. <i class="el-icon-arrow-down"></i>
  118. </div>
  119. </el-form-item> -->
  120. <el-form-item>
  121. <el-button @click="handleClose2()">取消</el-button>
  122. <el-button type="primary" @click="submitForm2('examineItem2')">确定</el-button>
  123. </el-form-item>
  124. </el-form>
  125. </el-drawer>
  126. <!-- 抽屉3 -->
  127. <el-drawer :visible.sync="drawer3" :with-header="false" :before-close="handleClose">
  128. <div class="drawer_title">绩效工作详情</div>
  129. <div class="drawer_box" v-if="workDetailData" v-loading = 'loading'>
  130. <div class="flex-box flex-v-ce">
  131. <userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>
  132. <div class="d_userMessage">
  133. <div><WWOpenData type="userName" :openid="workDetailData.employee_name"></WWOpenData></div>
  134. <div v-if="workDetailData.dept_list[0]"><WWOpenData type="userName" :openid="workDetailData.dept_list[0].dept_name"></WWOpenData></div>
  135. </div>
  136. </div>
  137. <ul>
  138. <li class="flex-box">
  139. <div class="label">任务内容</div>
  140. <div class="content_text">{{ workDetailData.task_name }}</div>
  141. </li>
  142. <li class="flex-box">
  143. <div class="label">任务备注</div>
  144. <!-- <div class="content_text">{{workDetailData.task_remark}}</div> -->
  145. <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark" style="border: none;height:100px"></textarea>
  146. </li>
  147. <li class="flex-box">
  148. <div class="label">绩效分</div>
  149. <div class="content_text yellow">{{ workDetailData.point_config.base_point }}</div>
  150. </li>
  151. <li class="flex-box" v-if="workDetailData.point_config.review_point">
  152. <div class="label">最终分</div>
  153. <div class="content_text yellow">{{ workDetailData.point_config.review_point }}</div>
  154. </li>
  155. <li class="flex-box">
  156. <div class="label">截止时间</div>
  157. <div class="content_text">{{ workDetailData.expire_time }}</div>
  158. </li>
  159. <li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point > 0">
  160. <div class="label">逾期扣分</div>
  161. <div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}</div>
  162. </li>
  163. <li class="flex-box">
  164. <div class="label">审批人</div>
  165. <div class="content_text"><WWOpenData type="userName" :openid="workDetailData.reviewer_name"></WWOpenData></div>
  166. </li>
  167. <li class="flex-box">
  168. <div class="label">积分种类</div>
  169. <div class="content_text">{{ workDetailData.pt_name }}</div>
  170. </li>
  171. </ul>
  172. <div class="d_progress">
  173. <div class="flex-box">
  174. <div class="flex-1">工作进度({{ workDetailData.progress }}%)</div>
  175. <div class="fontColorF addJf" @click="isSlider = true" v-if="workDetailData.employee_id == userId && workDetailData.status == 1">+更新进度</div>
  176. </div>
  177. <el-progress :percentage="workDetailData.progress"></el-progress>
  178. </div>
  179. <el-tabs v-model="activeName">
  180. <el-tab-pane label="工作记录" name="work">
  181. <div class="flex-box">
  182. <div class="flex-1"></div>
  183. <div class="fontColorF addJf" @click="isOne = true" v-if="workDetailData.employee_id == userId && workDetailData.status == 1 || workDetailData.employee_id == userId && workDetailData.status == 2">+记一条工作记录</div>
  184. </div>
  185. <div class="work_box" style="padding-top:10px">
  186. <div class="flex-box work_item" v-for="(item, index) in text_list">
  187. <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
  188. <div class="work_right flex-1">
  189. <div class="flex-box">
  190. <div class="d_name flex-1"><WWOpenData type="userName" :openid="item.recorder"></WWOpenData></div>
  191. <div class="d_date">{{ item.time }}</div>
  192. </div>
  193. <div class="d_content">{{ item.remark }}</div>
  194. </div>
  195. </div>
  196. <div v-if="!text_list[0]" class="fontColorF" style="text-align: center;">暂无工作记录</div>
  197. </div>
  198. </el-tab-pane>
  199. <el-tab-pane label="记分记录" name="participation">
  200. <div class="flex-box" style="padding-bottom: 10px;border-bottom: 1px solid #f1f1f1;">
  201. <div class="flex-1 fontColorF">
  202. <span v-if="point_total > 0">合计:{{ point_total }}</span>
  203. </div>
  204. <div class="fontColorF addJf" @click="isIntegral = true" v-if="workDetailData.reviewer_id == userId && workDetailData.status == 1 || workDetailData.reviewer_id==userId&&workDetailData.status==2">+记分</div>
  205. </div>
  206. <div class="work_box" style="padding-top:10px">
  207. <div class="flex-box work_item" v-for="(item, index) in point_list">
  208. <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
  209. <div class="work_right flex-1">
  210. <div class="flex-box">
  211. <div class="d_name flex-1">
  212. <WWOpenData type="userName" :openid="item.recorder"></WWOpenData>
  213. <span class="blue" v-if="item.point > 0">+{{ item.point }}</span>
  214. <span class="green" v-if="item.point < 0">{{ item.point }}</span>
  215. </div>
  216. <div class="d_date">{{ item.time }}</div>
  217. </div>
  218. <div class="d_content">{{ item.remark }}</div>
  219. </div>
  220. </div>
  221. <div v-if="!point_list[0]" class="fontColorF" style="text-align: center;">暂无记分记录</div>
  222. </div>
  223. </el-tab-pane>
  224. </el-tabs>
  225. <div class="flex-box d_footer" v-if="workDetailData.reviewer_id == userId && workDetailData.status == 2">
  226. <div class="flex-1"></div>
  227. <el-button @click="drawer3 = false">取消</el-button>
  228. <el-button type="primary" @click="openSp()">审批</el-button>
  229. </div>
  230. </div>
  231. </el-drawer>
  232. <!-- 添加人员 -->
  233. <el-dialog title="添加人员" :visible.sync="add_employee_show" :before-close="publicClose" width="700px">
  234. <EmployeeSelector1 v-if="add_employee_form" ref="Employee" :isChecKedAll="false" :can_select_dept="false" :multi="false" @confirm="add_employee_confirm"></EmployeeSelector1>
  235. <span slot="footer">
  236. <el-button @click="publicClose()">取消</el-button>
  237. <el-button type="primary" @click="sub_add_employee">完成</el-button>
  238. </span>
  239. </el-dialog>
  240. <!-- 更新进度 -->
  241. <el-dialog title="更新进度" :visible.sync="isSlider" :before-close="publicClose" width="40%">
  242. <div class="slider">
  243. <div class="fontColorF">拖动滑杆更新进度</div>
  244. <el-slider v-model="progress" :marks="{ 0: '0%' }"></el-slider>
  245. </div>
  246. <span slot="footer">
  247. <el-button @click="publicClose()">取消</el-button>
  248. <el-button type="primary" @click="sliderSend">完成</el-button>
  249. </span>
  250. </el-dialog>
  251. <!-- 记一条 -->
  252. <el-dialog title="记一条" :visible.sync="isOne" :before-close="publicClose" width="40%">
  253. <div class="flex-box">
  254. <div style="width: 80px;">工作记录</div>
  255. <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="textarea"></el-input>
  256. </div>
  257. <span slot="footer">
  258. <el-button @click="publicClose()">取消</el-button>
  259. <el-button type="primary" @click="one">完成</el-button>
  260. </span>
  261. </el-dialog>
  262. <!-- 记分记录 -->
  263. <el-dialog title="记分" :visible.sync="isIntegral" :before-close="publicClose" width="40%">
  264. <el-form :model="integral" ref="integral" label-width="80px">
  265. <el-form-item label="记录" prop="text" :rules="[{ required: true, message: '记录不能为空' }]">
  266. <el-input type="textarea" :rows="3" v-model="integral.text"></el-input>
  267. </el-form-item>
  268. <el-form-item label="记分" prop="num" :rules="[{ required: true, message: '记分不能为空' }, { type: 'number', message: '积分必须为数字值' }]">
  269. <div class="num" :class="[integral.type == '1' ? 'add' : 'jian']"></div>
  270. <el-input placeholder="请输入内容" v-model.number="integral.num">
  271. <el-select v-model="integral.type" slot="prepend" placeholder="请选择" style="width: 80px;">
  272. <el-option label="奖分" value="1"></el-option>
  273. <el-option label="扣分" value="2"></el-option>
  274. </el-select>
  275. </el-input>
  276. </el-form-item>
  277. </el-form>
  278. <span slot="footer">
  279. <el-button @click="publicClose()">取消</el-button>
  280. <el-button type="primary" @click="integralSend('integral')">完成</el-button>
  281. </span>
  282. </el-dialog>
  283. </div>
  284. </template>
  285. <script>
  286. import EmployeeSelector1 from '@/views/common/EmployeeSelector1'
  287. import noData from '@/components/noData';
  288. export default {
  289. name: 'participation_detail',
  290. components: {EmployeeSelector1, noData },
  291. data() {
  292. return {
  293. width: 46,
  294. page: 1,
  295. perPage: 10,
  296. total: 0,
  297. loading: false,
  298. userId: this.$store.getters.user_info.id,
  299. employee_id: '',
  300. date: this.$moment().format('YYYY-MM'),
  301. dataList: {
  302. notice_info: []
  303. },
  304. ticket_count:false,//是否奖票
  305. drawer: false,
  306. examineItem: {
  307. //审批实例
  308. package_id: 0,
  309. point: '',
  310. remark: ''
  311. },
  312. drawer2: false,
  313. examineItem2: {
  314. //审批实例
  315. review_id: 0,
  316. action: 'complete',
  317. rule_id: 0,
  318. item_id: 0,
  319. point: 0,
  320. reviewer_id: 0,
  321. remark: '',
  322. ticket_count: 0
  323. },
  324. //人员选择
  325. add_employee_show: false,
  326. add_employee_form: {
  327. employee_ids: []
  328. },
  329. //工作详情相关
  330. workDetail: '',
  331. workDetailData: '',
  332. drawer3: false,
  333. activeName: '',
  334. isSlider: false,
  335. isOne: false,
  336. isIntegral: false,
  337. textarea: '', //记录一条内容
  338. integral: {
  339. text: '',
  340. num: 0,
  341. type: '1'
  342. },
  343. text_list: [],
  344. point_list: [],
  345. point_total: 0,
  346. progress: 0,
  347. selectUser:{},
  348. parameter:{},//参数
  349. };
  350. },
  351. watch: {
  352. date() {
  353. this.getData();
  354. }
  355. },
  356. mounted() {
  357. if (this.$route.query.date && this.$route.query.employee_id) {
  358. this.employee_id = this.$route.query.employee_id;
  359. this.date = this.$route.query.date;
  360. this.getData();
  361. }
  362. },
  363. methods: {
  364. one() {
  365. if (!this.textarea) {
  366. this.$message.error('请输入备注内容');
  367. return;
  368. }
  369. var self = this;
  370. var items = this.workDetailData.process.list;
  371. var process = {
  372. img_url: this.$store.getters.user_info.img_url,
  373. point: 0,
  374. recorder_id: this.$store.getters.user_info.id,
  375. recorder: this.$store.getters.user_info.name,
  376. remark: this.textarea,
  377. time: this.$moment().format('YYYY-MM-DD HH:mm')
  378. };
  379. var data = {
  380. work_id: this.workDetail.id,
  381. process: []
  382. };
  383. items.unshift(process);
  384. data.process = items;
  385. self.$http('post','/api/integral/work', data).then(res => {
  386. if (res.data.code == 1) {
  387. self.publicClose();
  388. self.openDetail();
  389. } else {
  390. self.$message.error(res.data.msg);
  391. }
  392. });
  393. },
  394. integralSend(formName) {
  395. var self = this;
  396. var items = this.workDetailData.process.list || [];
  397. var process = {
  398. img_url: this.$store.getters.user_info.img_url,
  399. point: this.integral.type == '1' ? this.integral.num : '-' + this.integral.num,
  400. recorder_id: this.$store.getters.user_info.id,
  401. recorder: this.$store.getters.user_info.name,
  402. remark: this.integral.text,
  403. time: this.$moment().format('YYYY-MM-DD HH:mm')
  404. };
  405. var data = {
  406. work_id: this.workDetail.id,
  407. process: []
  408. };
  409. items.unshift(process);
  410. data.process = items;
  411. this.$refs[formName].validate(valid => {
  412. if (valid) {
  413. self.$http('post','/api/integral/work', data)
  414. .then(res => {
  415. if (res.data.code == 1) {
  416. self.openDetail();
  417. self.publicClose();
  418. } else {
  419. self.$message.error(res.data.msg);
  420. }
  421. })
  422. .finally(() => {});
  423. }
  424. });
  425. },
  426. //更新进度
  427. sliderSend() {
  428. var self = this;
  429. let data = {
  430. work_id: self.workDetailData.id,
  431. progress: self.progress
  432. };
  433. self.$http('post','/api/integral/work', data).then(res => {
  434. if (res.data.code == 1) {
  435. self.openDetail();
  436. self.isSlider = false;
  437. } else {
  438. self.$message.error(res.data.msg);
  439. }
  440. });
  441. },
  442. //人员确定
  443. sub_add_employee(item) {
  444. this.$refs.Employee.confirm(); //调用组件的confirm();
  445. this.add_employee_show = false;
  446. },
  447. //人员选择
  448. add_employee_confirm(val) {
  449. this.selectUser = val.employee[0];
  450. },
  451. //弹窗关闭公共方法
  452. publicClose() {
  453. this.isIntegral = false;
  454. this.isOne = false;
  455. this.isSlider = false;
  456. (this.textarea = ''), //记录一条内容
  457. (this.integral = {
  458. text: '',
  459. num: 0,
  460. type: '1'
  461. });
  462. this.add_employee_show = false;
  463. },
  464. //绩效包审批
  465. submitForm(formName) {
  466. var self = this;
  467. this.$refs[formName].validate(valid => {
  468. if (valid) {
  469. self.examineItem.package_id = self.dataList.id;
  470. self.btnLoad = true;
  471. self.$http('put','/api/integral/performance', self.examineItem).then(res => {
  472. if (res.data.code == 1) {
  473. self.$message.success('已审批');
  474. self.openDetail();
  475. self.handleClose();
  476. } else {
  477. self.$message.error(res.data.msg);
  478. }
  479. })
  480. .finally(() => {
  481. self.btnLoad = false;
  482. });
  483. } else {
  484. return false;
  485. }
  486. });
  487. },
  488. //绩效包工作任务审批
  489. submitForm2(formName) {
  490. var self = this;
  491. this.$refs[formName].validate(valid => {
  492. if (valid) {
  493. self.examineItem2.review_id=self.workDetailData.review_id;
  494. self.examineItem2.reviewer_id = self.selectUser.id ? self.selectUser.id : 0;
  495. self.$http('post','/api/integral/review', self.examineItem2).then(res => {
  496. if (res.data.code == 1) {
  497. self.$message.success('已审批');
  498. self.openDetail();
  499. self.handleClose2();
  500. } else {
  501. self.$message.error(res.data.msg);
  502. }
  503. });
  504. }
  505. });
  506. },
  507. handleClose() {
  508. this.examineItem.point = '';
  509. this.examineItem.remark = '';
  510. this.drawer = false;
  511. this.activeName = '';
  512. this.drawer3 = false;
  513. this.getData();
  514. },
  515. handleClose2() {
  516. this.selectUser = {};
  517. this.examineItem2 = {
  518. //审批实例
  519. review_id: 0,
  520. action: 'complete',
  521. rule_id: 0,
  522. item_id: 0,
  523. point: 0,
  524. reviewer_id: 0,
  525. remark: '',
  526. ticket_count: 0
  527. };
  528. this.ticket_count = false; //是否奖票
  529. this.drawer2 = false;
  530. this.getData();
  531. },
  532. openSp(item) {
  533. var self = this;
  534. if (item) {
  535. this.workDetail=item;
  536. self.$http('get',`/api/integral/work?work_id=${item.id}`).then(res => {
  537. if (res.data.code == 1) {
  538. if (res.data.data.reviewer_id != self.userId) {
  539. self.$message.error('当前登录者不是该任务审批者!');
  540. } else {
  541. self.workDetailData=res.data.data;
  542. this.drawer2 = true;
  543. }
  544. } else {
  545. self.$message.error(res.data.msg);
  546. }
  547. });
  548. } else {
  549. this.drawer2 = true;
  550. }
  551. },
  552. //打开工作详情
  553. openDetail(item) {
  554. var self = this;
  555. self.drawer3 = true;
  556. self.loading = true;
  557. if (item) {this.workDetail = item;}
  558. self.$http('get',`/api/integral/work?work_id=${this.workDetail.id}`).then(res => {
  559. if (res.data.code == 1) {
  560. self.loading = false;
  561. self.workDetailData = res.data.data;
  562. self.progress = self.workDetailData.progress;
  563. self.text_list = [];
  564. self.point_list = [];
  565. self.point_total = 0;
  566. if (self.workDetailData.process.list && self.workDetailData.process.list.length > 0) {
  567. for (let i in self.workDetailData.process.list) {
  568. self.point_total += self.workDetailData.process.list[i].point * 1;
  569. if (self.workDetailData.process.list[i].point != 0) {
  570. self.point_list.push(self.workDetailData.process.list[i]);
  571. } else {
  572. self.text_list.push(self.workDetailData.process.list[i]);
  573. }
  574. }
  575. }
  576. setTimeout(function() {
  577. self.activeName = 'work';
  578. }, 400);
  579. } else {
  580. self.loading = false;
  581. self.$message.error(res.data.msg);
  582. }
  583. });
  584. },
  585. getData() {
  586. let self = this;
  587. self.loading = true;
  588. self.$http('get','/api/integral/performance/info',{ employee_id: self.employee_id, month: self.date }).then(res => {
  589. if (res.data.code == 1) {
  590. self.dataList = res.data.data || [];
  591. self.total = res.data.data.work_count;
  592. } else {
  593. self.$message.error(res.data.msg);
  594. }
  595. })
  596. .finally(() => {
  597. self.loading = false;
  598. });
  599. },
  600. //页码变更
  601. handleCurrentChange: function(val) {
  602. this.page = val;
  603. this.getData(this.page, this.perPage);
  604. }
  605. }
  606. };
  607. </script>
  608. <style lang="scss" scoped="scoped">
  609. $blue: #26a2ff;
  610. $red: #f56c6c;
  611. $yellow: #e6a23c;
  612. $green: #67c23a;
  613. $fontColorZ: #303133;
  614. $fontColorF: #909399;
  615. $fontColorT: #c0c4cc;
  616. .green {
  617. color: #67c23a;
  618. }
  619. .blue {
  620. color: #26a2ff;
  621. cursor: pointer;
  622. }
  623. .fontColorF {
  624. color: #909399;
  625. }
  626. .yellow {
  627. color: #e6a23c;
  628. }
  629. .drawer_box {
  630. padding: 0 20px;
  631. .d_userMessage {
  632. margin-left: 10px;
  633. }
  634. .d_userMessage div:nth-child(1) {
  635. font-size: 16px;
  636. margin-bottom: 8px;
  637. }
  638. .d_userMessage div:nth-child(2) {
  639. font-size: 12px;
  640. color: $fontColorF;
  641. }
  642. ul {
  643. padding: 12px 0;
  644. border-bottom: 1px solid #f1f1f1;
  645. }
  646. li {
  647. padding: 6px 0;
  648. }
  649. li .label {
  650. width: 80px;
  651. text-align: left;
  652. color: $fontColorF;
  653. }
  654. .content_text {
  655. flex: 1;
  656. }
  657. .d_progress {
  658. padding: 12px 0;
  659. border-bottom: 1px solid #f1f1f1;
  660. margin-bottom: 10px;
  661. }
  662. .work_box {
  663. max-height: 180px;
  664. overflow: auto;
  665. }
  666. .d_footer {
  667. position: fixed;
  668. bottom: 20px;
  669. right: 20px;
  670. }
  671. .work_right {
  672. margin-top: 10px;
  673. margin-left: 10px;
  674. padding-bottom: 10px;
  675. border-bottom: 1px solid #f1f1f1;
  676. }
  677. .d_name {
  678. color: $fontColorZ;
  679. margin-bottom: 10px;
  680. }
  681. .d_date {
  682. color: $fontColorF;
  683. }
  684. .work_item {
  685. margin-bottom: 10px;
  686. }
  687. .addJf {
  688. font-size: 13px;
  689. cursor: pointer;
  690. margin-bottom: 5px;
  691. padding: 5px;
  692. }
  693. .addJf:hover {
  694. color: $blue;
  695. }
  696. }
  697. .slider {
  698. padding: 30px 20px;
  699. }
  700. .num {
  701. position: absolute;
  702. height: 20px;
  703. width: 20px;
  704. z-index: 999;
  705. left: 85px;
  706. }
  707. .add:before {
  708. position: absolute;
  709. content: '+';
  710. color: $red;
  711. }
  712. .jian:before {
  713. position: absolute;
  714. content: '-';
  715. color: $green;
  716. }
  717. .border {
  718. -webkit-appearance: none;
  719. background-color: #fff;
  720. background-image: none;
  721. border-radius: 4px;
  722. border: 1px solid #dcdfe6;
  723. -webkit-box-sizing: border-box;
  724. box-sizing: border-box;
  725. color: #606266;
  726. font-size: inherit;
  727. height: 40px;
  728. line-height: 40px;
  729. outline: 0;
  730. padding: 0 15px;
  731. width: 100%;
  732. cursor: pointer;
  733. }
  734. .drawer_title {
  735. font-size: 18px;
  736. padding: 20px;
  737. border-bottom: 1px #efefef solid;
  738. margin-bottom: 20px;
  739. }
  740. .box {
  741. overflow: hidden;
  742. padding: 20px;
  743. .header {
  744. padding-bottom: 20px;
  745. border-bottom: 1px solid #f1f1f1;
  746. }
  747. .search {
  748. padding: 20px 0;
  749. }
  750. .point {
  751. margin-right: 20px;
  752. }
  753. .point div:nth-child(1) {
  754. font-size: 18px;
  755. font-weight: 600;
  756. margin-bottom: 10px;
  757. }
  758. .point div:nth-child(2) {
  759. color: $fontColorF;
  760. }
  761. .page {
  762. text-align: center;
  763. padding: 20px 0;
  764. }
  765. .tips {
  766. background: $fontColorF;
  767. border-radius: 50%;
  768. width: 14px;
  769. height: 14px;
  770. color: #fff;
  771. display: inline-block;
  772. font-size: 12px;
  773. line-height: 14px;
  774. text-align: center;
  775. }
  776. .demo-ruleForm {
  777. padding: 0 20px;
  778. }
  779. }
  780. /deep/ .el-table tr:hover{
  781. cursor:pointer
  782. }
  783. </style>