AppealPopup.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. <template>
  2. <div v-loading="loading">
  3. <el-container v-if="appealInfo">
  4. <el-main class="detail_popup">
  5. <!-- 基础信息 -->
  6. <el-card shadow="always" class="appeal_content">
  7. <template slot="header">
  8. <userImage
  9. :user_name="appealInfo.employee_name"
  10. :img_url="appealInfo.employee_img_url"
  11. class="fl"
  12. width="50px"
  13. height="50px"
  14. fontSize="15"
  15. />
  16. <span style="line-height: 50px; margin-left:10px;margin-right:4px;">{{appealInfo.employee_name}}</span>
  17. <el-tag :type="appealStatusType(appealInfo.status)">{{appealStatusMap[appealInfo.status] || '--'}}</el-tag>
  18. </template>
  19. <div>
  20. <p><el-tag>{{appealInfo.create_time}}</el-tag>&nbsp;发起申诉</p>
  21. <p>共&nbsp;<el-tag>{{appealInfo.events.length}}</el-tag>&nbsp;条积分事件</p>
  22. <div v-if="appealInfo.global_remark">
  23. <p>申请原因:</p>
  24. <el-alert
  25. :title="appealInfo.global_remark"
  26. type="info"
  27. :closable="false"
  28. />
  29. </div>
  30. <template v-if="appealInfo.complete_time">
  31. <p><el-tag>{{appealInfo.complete_time}}</el-tag>&nbsp;审批结束</p>
  32. </template>
  33. </div>
  34. </el-card>
  35. <!-- 审批流程 -->
  36. <div class="process">
  37. <h5>审批流程</h5>
  38. <el-steps direction="vertical" :space="50" >
  39. <el-step v-for="(item, index) in appealInfo.process" :key="index" style="margin-bottom: 5px;">
  40. <template slot="icon">
  41. <userImage width="36px" height="36px" :img_url="item.reviewer_img_url" :user_name="item.reviewer_name"></userImage>
  42. </template>
  43. <template slot="title">
  44. 阶段{{item.step}}
  45. <el-tag :type="processStatusType(item.status)">{{processStatusMap[item.status] || '--'}}</el-tag>
  46. </template>
  47. <template slot="description">
  48. <el-descriptions :column="2" direction="vertical" size="small" :label-style="{width:'80px'}" border>
  49. <el-descriptions-item label="发起人">{{item.publisher_name}}</el-descriptions-item>
  50. <el-descriptions-item label="发起时间">{{item.create_time}}</el-descriptions-item>
  51. <el-descriptions-item label="审批人">{{item.reviewer_name}}</el-descriptions-item>
  52. <el-descriptions-item label="审批意见" v-if="item.remark" >
  53. <el-alert
  54. :closable="false"
  55. :title="item.remark"
  56. type="info"
  57. />
  58. </el-descriptions-item>
  59. <el-descriptions-item label="完结时间" v-if="item.complete_time" >{{item.complete_time}}</el-descriptions-item>
  60. </el-descriptions>
  61. </template>
  62. </el-step>
  63. </el-steps>
  64. </div>
  65. <!-- 隐藏信息 -->
  66. <el-collapse v-model="infoActiveNames">
  67. <el-collapse-item :title="appealInfo.events.length + '条积分事件'" name="events" >
  68. <el-descriptions class="detail_row" v-for="(item,index) in appealInfo.events" size="small" :key="index" :column="1" :label-style="{width : '80px'}" border>
  69. <el-descriptions-item label="积分">
  70. {{item.point + ' ' + ptName(item.pt_id)}}
  71. <el-tag :type="pointStatusType(item.status)" v-if="pointStatusMap[item.status]">{{pointStatusMap[item.status]}}</el-tag>
  72. </el-descriptions-item>
  73. <el-descriptions-item label="积分备注">
  74. <el-alert
  75. :title="item.event_remark"
  76. :closable="false"
  77. type="success"
  78. />
  79. </el-descriptions-item>
  80. <el-descriptions-item label="时间">{{item.event_time}}</el-descriptions-item>
  81. <el-descriptions-item v-if="item.appeal_remark" label="申诉原因">{{item.appeal_remark}}</el-descriptions-item>
  82. <el-descriptions-item v-if="item.delete_time" label="已删除">{{item.delete_time}}</el-descriptions-item>
  83. </el-descriptions>
  84. </el-collapse-item>
  85. <el-collapse-item :title="appealInfo.logs.length + '条操作日志'" name="logs">
  86. <el-alert
  87. v-for="(item,index) in appealInfo.logs"
  88. :key="index"
  89. type="info"
  90. show-icon
  91. :title="item.create_time + ' ' + item.msg"
  92. :closable="false"
  93. />
  94. </el-collapse-item>
  95. </el-collapse>
  96. </el-main>
  97. <el-footer class="appeal_footer flex-box-end flex-v-ce" height="60" >
  98. <el-popconfirm
  99. v-if="appealInfo.can_delete"
  100. title="删除申诉后将不可恢复,确认提交吗"
  101. confirm-button-text="提交"
  102. cancel-button-text="取消"
  103. icon="el-icon-question"
  104. icon-color="red"
  105. @confirm="removeAppeal"
  106. style="margin: 0 10px"
  107. >
  108. <el-button type="danger" size="mini" slot="reference" :loading="submitting || !hasOpen" >删除申诉</el-button>
  109. </el-popconfirm>
  110. <el-button type="danger" size="mini" v-if="appealInfo.can_refuse" @click="showReviewRefuse = true" :loading="submitting || !hasOpen">拒绝</el-button>
  111. <el-button type="warning" size="mini" v-if="appealInfo.can_reject_rewrite" @click="showReviewRejectRewrite = true" :loading="submitting || !hasOpen">驳回重做</el-button>
  112. <el-popconfirm
  113. v-if="appealInfo.can_cancel"
  114. title="审批撤回后可以重新编辑内容重新提交"
  115. confirm-button-text="提交"
  116. cancel-button-text="取消"
  117. icon="el-icon-question"
  118. icon-color="red"
  119. @confirm="reviewCancel"
  120. style="margin: 0 10px"
  121. >
  122. <el-button type="info" size="mini" slot="reference" :loading="submitting || !hasOpen">撤回审批</el-button>
  123. </el-popconfirm>
  124. <el-popconfirm
  125. v-if="appealInfo.can_cancel_appeal"
  126. title="申诉撤回后可以重新编辑内容重新提交"
  127. confirm-button-text="提交"
  128. cancel-button-text="取消"
  129. icon="el-icon-question"
  130. icon-color="red"
  131. @confirm="cancelAppeal"
  132. style="margin: 0 10px"
  133. >
  134. <el-button type="info" size="mini" slot="reference" :loading="submitting || !hasOpen" >撤回申诉</el-button>
  135. </el-popconfirm>
  136. <el-button type="success" size="mini" v-if="appealInfo.can_rewrite" :loading="submitting || !hasOpen" @click="openRewrite">重新填写</el-button>
  137. <el-button type="success" size="mini" v-if="appealInfo.can_submit" @click="showReviewSubmit = true" :loading="submitting || !hasOpen">递交审批</el-button>
  138. <el-button type="primary" size="mini" v-if="appealInfo.can_approval" @click="showReviewApproval = true" :loading="submitting || !hasOpen">通过</el-button>
  139. </el-footer>
  140. </el-container>
  141. <noData class="center" v-else />
  142. <!-- 拒绝审批 -->
  143. <el-dialog
  144. title="拒绝审批"
  145. :visible.sync="showReviewRefuse"
  146. :modal="false"
  147. :close-on-click-modal="false"
  148. :close-on-press-escape="false"
  149. :center="true"
  150. :show-close="false"
  151. width="600px"
  152. >
  153. <template>
  154. <el-form v-model="formData">
  155. <el-form-item >
  156. <el-input
  157. type="textarea"
  158. :rows="3"
  159. :autosize="true"
  160. :clearable="true"
  161. :maxlength="100"
  162. :show-word-limit="true"
  163. placeholder="原因说明"
  164. v-model="formData.remark"
  165. @input="onFormRemarkInput"
  166. />
  167. </el-form-item>
  168. </el-form>
  169. </template>
  170. <template slot="footer">
  171. <div class="flex-box-end flex-v-ce">
  172. <el-button type="danger" @click="formData.remark = '',showReviewRefuse = false">关闭</el-button>
  173. <el-button type="primary" @click="reviewRefuse" :disabled="!canConfirmReviewRefuse" :loading="submitting || !showReviewRefuse || !hasOpen" >确认</el-button>
  174. </div>
  175. </template>
  176. </el-dialog>
  177. <!-- 驳回重做 -->
  178. <el-dialog
  179. title="驳回重做"
  180. :visible.sync="showReviewRejectRewrite"
  181. :modal="false"
  182. :close-on-click-modal="false"
  183. :close-on-press-escape="false"
  184. :center="true"
  185. :show-close="false"
  186. width="600px"
  187. >
  188. <template>
  189. <el-form v-model="formData">
  190. <el-form-item >
  191. <el-input
  192. type="textarea"
  193. :rows="3"
  194. :autosize="true"
  195. :clearable="true"
  196. :maxlength="100"
  197. :show-word-limit="true"
  198. placeholder="原因说明"
  199. v-model="formData.remark"
  200. @input="onFormRemarkInput"
  201. />
  202. </el-form-item>
  203. </el-form>
  204. </template>
  205. <template slot="footer">
  206. <div class="flex-box-end flex-v-ce">
  207. <el-button type="danger" @click="formData.remark = '',showReviewRejectRewrite = false">关闭</el-button>
  208. <el-button type="primary" @click="reviewRejectRewrite" :disabled="!canConfirmReviewRejectRewrite" :loading="submitting || !showReviewRejectRewrite || !hasOpen">确认</el-button>
  209. </div>
  210. </template>
  211. </el-dialog>
  212. <!-- 重新填写 -->
  213. <AppealRewrite
  214. :visible.sync="showRewrite"
  215. :id="id"
  216. @rewriteFinish="onAppRewriteFinish"
  217. />
  218. <!-- 递交审批 -->
  219. <el-dialog
  220. title="递交审批"
  221. width="600px"
  222. :visible.sync="showReviewSubmit"
  223. :modal="false"
  224. :close-on-click-modal="false"
  225. :close-on-press-escape="false"
  226. :center="true"
  227. :show-close="false"
  228. >
  229. <template>
  230. <el-form v-model="formData">
  231. <el-form-item>
  232. <el-input class="w250" auto-complete="off" v-model="formData.reviewerName" placeholder="请选择审批人" />
  233. <div @click="showReviewerSelector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
  234. <EmployeeSelector
  235. :multi="false"
  236. :user_employee_list="true"
  237. :isChecKedAll="false"
  238. :is_filtration_creator="false"
  239. :employee_list="superiorList"
  240. :selected="formData.employeeSelected"
  241. :visible.sync="showReviewerSelector"
  242. @confirm="handleReviewerSelector"
  243. />
  244. </el-form-item>
  245. <el-form-item>
  246. <el-input
  247. type="textarea"
  248. :autosize="true"
  249. :clearable="true"
  250. :maxlength="100"
  251. :show-word-limit="true"
  252. placeholder="请填写原因说明"
  253. v-model="formData.remark"
  254. @input="onFormRemarkInput"
  255. />
  256. </el-form-item>
  257. </el-form>
  258. </template>
  259. <template slot="footer">
  260. <div class="flex-box-end flex-v-ce">
  261. <el-button @click="formData.remark = '',formData.reviewerId = 0,formData.reviewerName = '',formData.employeeSelected = { dept: [], employee: [] },showReviewSubmit = false">关闭</el-button>
  262. <el-button type="primary" @click="reviewSubmit" :disabled="!canConfirmReviewSubmit" :loading="submitting || !showReviewSubmit || !hasOpen" >确认</el-button>
  263. </div>
  264. </template>
  265. </el-dialog>
  266. <!-- 通过 -->
  267. <el-dialog
  268. title="通过"
  269. :visible.sync="showReviewApproval"
  270. :modal="false"
  271. :close-on-click-modal="false"
  272. :close-on-press-escape="false"
  273. :center="true"
  274. :show-close="false"
  275. width="600px"
  276. >
  277. <template>
  278. <el-form v-model="formData">
  279. <el-form-item >
  280. <el-input
  281. type="textarea"
  282. :rows="3"
  283. :autosize="true"
  284. :clearable="true"
  285. :maxlength="100"
  286. :show-word-limit="true"
  287. placeholder="原因说明"
  288. v-model="formData.remark"
  289. @input="onFormRemarkInput"
  290. />
  291. </el-form-item>
  292. </el-form>
  293. </template>
  294. <template slot="footer">
  295. <div class="flex-box-end flex-v-ce">
  296. <el-button type="danger" @click="formData.remark = '',showReviewApproval = false">关闭</el-button>
  297. <el-button type="primary" @click="reviewApproval" :disabled="!canConfirmReviewApproval" :loading="submitting || !showReviewApproval || !hasOpen">确认</el-button>
  298. </div>
  299. </template>
  300. </el-dialog>
  301. </div>
  302. </template>
  303. <script>
  304. import Template from "../../../examine/components/Template.vue";
  305. import EmployeeSelector from "../../../components/EmployeeSelector.vue";
  306. import AppealRewrite from "../../../components/AppealRewrite.vue";
  307. import {specialFilter} from "../../../utils";
  308. export default {
  309. name:'appealPopup',
  310. components: {AppealRewrite, Template,EmployeeSelector},
  311. props:{
  312. id:{
  313. type: Number,
  314. default:0
  315. }
  316. },
  317. data() {
  318. return {
  319. userInfo: this.$userInfo(),
  320. hasOpen:false,
  321. hasSubmit:false, //标识复议记录是否有提交操作,用来通知父组件如果有需要的话
  322. loading:false,
  323. appealInfo:null,
  324. superiorList:[],
  325. infoActiveNames:[],
  326. eventSelected:[],
  327. appealStatusMap:{
  328. 0:'全部',
  329. 1:'审批中',
  330. 2:'审批通过',
  331. 3:'驳回重做',
  332. 4:'撤回重填',
  333. 5:'拒绝'
  334. },
  335. pointStatusMap:{
  336. 1:'正常',
  337. 2:'已删除',
  338. 3:'已通过申诉并删除'
  339. },
  340. processStatusMap:{
  341. 1:'待处理',
  342. 2:'审批通过',
  343. 3:'递交审批',
  344. 4:'拒绝',
  345. 5:'驳回重做',
  346. 6:'撤回上个节点重填',
  347. 7:'申诉撤回',
  348. },
  349. pts:[],
  350. formData:{
  351. reviewerId:0,
  352. reviewerName:'',
  353. remark:'',
  354. employeeSelected: { dept: [], employee: [] },
  355. },
  356. rewriteData:{
  357. events:[],
  358. globalRemark:'',
  359. reviewerId:'',
  360. reviewerName:'',
  361. employeeSelected: { dept: [], employee: [] },
  362. },
  363. showReviewRefuse:false,
  364. showReviewRejectRewrite:false,
  365. showReviewApproval:false,
  366. showReviewerSelector:false,
  367. showReviewSubmit:false,
  368. submitting:false,
  369. showEventSelector:false,
  370. showRewrite:false,
  371. }
  372. },
  373. watch:{
  374. },
  375. computed:{
  376. canConfirmReviewSubmit(){
  377. return this.appealInfo && this.appealInfo.can_submit && this.formData.reviewerId && this.showReviewSubmit
  378. },
  379. canConfirmReviewApproval(){
  380. return this.appealInfo && this.appealInfo.can_approval && this.showReviewApproval
  381. },
  382. canConfirmReviewRejectRewrite(){
  383. return this.appealInfo && this.appealInfo.can_reject_rewrite && this.showReviewRejectRewrite
  384. },
  385. canConfirmReviewRefuse(){
  386. return this.appealInfo && this.appealInfo.can_refuse && this.showReviewRefuse
  387. }
  388. },
  389. methods:{
  390. getAppealInfo(){
  391. if (!this.$props.id) return
  392. let self = this
  393. self.loading = true
  394. self.$axiosUser('get','api/pro/integral/appeal/info',{appeal_id:this.$props.id})
  395. .then((res) => {
  396. if (res.data.code === 1){
  397. self.appealInfo = res.data.data
  398. }
  399. })
  400. .finally(() => {
  401. self.loading = false
  402. })
  403. },
  404. initData(){
  405. this.formData.reviewerId = 0
  406. this.formData.remark = ''
  407. this.formData.reviewerName = ''
  408. this.formData.employeeSelected = { dept: [], employee: [] }
  409. this.hasSubmit = false
  410. this.appealInfo = null
  411. this.infoActiveNames = []
  412. this.showReviewRefuse = false
  413. this.showReviewRejectRewrite = false
  414. this.showReviewApproval = false
  415. this.showReviewerSelector = false
  416. this.showReviewSubmit = false
  417. this.showRewrite = false
  418. this.showEventSelector = false
  419. this.submitting = false
  420. },
  421. closedHandler(){
  422. if(this.hasSubmit) this.$emit('update:appeal')
  423. this.initData()
  424. },
  425. closeHandler(){
  426. this.hasOpen = false
  427. },
  428. openedHandler(){
  429. this.hasOpen = true
  430. this.initData()
  431. this.getAppealInfo()
  432. },
  433. ptName(ptId){
  434. let item = this.pts.find(item => item.id === ptId)
  435. return item ? item.name : ''
  436. },
  437. pointStatusType(status){
  438. switch (status){
  439. case 2:
  440. case 3:
  441. return 'warning'
  442. default:
  443. return "success"
  444. }
  445. },
  446. appealStatusType(status){
  447. const map = {
  448. 1:'info',
  449. 2:'success',
  450. 3:'warning',
  451. 4:'warning',
  452. 5:'danger'
  453. }
  454. return map[status] || 'info'
  455. },
  456. processStatusType(status){
  457. const map = {
  458. 1:'info',
  459. 2:'success',
  460. 3:'success',
  461. 4:'danger',
  462. 5:'warning',
  463. 6:'warning',
  464. 7:'info',
  465. }
  466. return map[status] || 'info'
  467. },
  468. onAppRewriteFinish(){
  469. this.hasSubmit = true
  470. this.getAppealInfo()
  471. },
  472. removeAppeal(){
  473. if (!this.appealInfo) return
  474. let self = this
  475. self.submitting = true
  476. let params = {
  477. appeal_id:self.appealInfo.id
  478. }
  479. self.$axiosUser('post','api/pro/integral/appeal/remove',params)
  480. .then(res => {
  481. if (res.data.code === 1){
  482. self.$message.info('处理完毕')
  483. self.hasSubmit = true
  484. self.getAppealInfo()
  485. }else {
  486. self.$message.error(res.data.msg)
  487. }
  488. })
  489. .finally(() => {
  490. self.submitting = false
  491. })
  492. },
  493. reviewRefuse(){
  494. if (!this.appealInfo) return
  495. let self = this
  496. self.submitting = true
  497. let params = {
  498. appeal_id:self.appealInfo.id,
  499. remark:self.formData.remark
  500. }
  501. self.$axiosUser('post','api/pro/integral/appeal/review/refuse',params)
  502. .then(res => {
  503. if (res.data.code === 1){
  504. self.hasSubmit = true
  505. self.getAppealInfo()
  506. self.$message.success(res.data.msg)
  507. self.showReviewRefuse = false
  508. }else {
  509. self.$message.error(res.data.msg)
  510. }
  511. })
  512. .finally(() => {
  513. self.submitting = false
  514. })
  515. },
  516. reviewRejectRewrite(){
  517. if (!this.appealInfo) return
  518. let self = this
  519. self.submitting = true
  520. let params = {
  521. appeal_id:self.appealInfo.id,
  522. remark:self.formData.remark
  523. }
  524. self.$axiosUser('post','api/pro/integral/appeal/review/reject',params)
  525. .then(res => {
  526. if (res.data.code === 1){
  527. self.hasSubmit = true
  528. self.getAppealInfo()
  529. self.$message.success(res.data.msg)
  530. self.showReviewRejectRewrite = false
  531. }else {
  532. self.$message.error(res.data.msg)
  533. }
  534. })
  535. .finally(() => {
  536. self.submitting = false
  537. })
  538. },
  539. reviewCancel(){
  540. if (!this.appealInfo) return
  541. this.submitting = true
  542. let self = this
  543. self.$axiosUser('post','api/pro/integral/appeal/review/cancel',{appeal_id:self.appealInfo.id})
  544. .then(res => {
  545. if (res.data.code === 1){
  546. self.hasSubmit = true
  547. self.getAppealInfo()
  548. self.$message.success(res.data.msg)
  549. }else {
  550. self.$message.error(res.data.msg)
  551. }
  552. })
  553. .finally(() => {
  554. self.submitting = false
  555. })
  556. },
  557. cancelAppeal(){
  558. if (!this.appealInfo) return
  559. this.submitting = true
  560. let self = this
  561. self.$axiosUser('post','api/pro/integral/appeal/cancel',{appeal_id:self.appealInfo.id})
  562. .then(res => {
  563. if (res.data.code === 1){
  564. self.hasSubmit = true
  565. self.getAppealInfo()
  566. self.$message.success(res.data.msg)
  567. }else {
  568. this.$message.error(res.data.msg)
  569. }
  570. })
  571. .finally(() => {
  572. self.submitting = false
  573. })
  574. },
  575. reviewSubmit(){
  576. if (!this.appealInfo) return
  577. let self = this
  578. self.submitting = true
  579. let params = {
  580. appeal_id:self.appealInfo.id,
  581. reviewer_id:self.formData.reviewerId,
  582. remark:self.formData.remark
  583. }
  584. self.$axiosUser('post','api/pro/integral/appeal/review/submit',params)
  585. .then(res => {
  586. if (res.data.code === 1){
  587. self.hasSubmit = true
  588. self.getAppealInfo()
  589. self.$message.success(res.data.msg)
  590. self.showReviewSubmit = false
  591. }else {
  592. self.$message.error(res.data.msg)
  593. }
  594. })
  595. .finally(() => {
  596. self.submitting = false
  597. })
  598. },
  599. reviewApproval(){
  600. if (!this.appealInfo) return
  601. let self = this
  602. self.submitting = true
  603. let params = {
  604. appeal_id:self.appealInfo.id,
  605. remark:self.formData.remark
  606. }
  607. self.$axiosUser('post','api/pro/integral/appeal/review/approval',params)
  608. .then(res => {
  609. if (res.data.code === 1){
  610. self.hasSubmit = true
  611. self.getAppealInfo()
  612. self.$message.success(res.data.msg)
  613. self.showReviewApproval = false
  614. }else {
  615. self.$message.error(res.data.msg)
  616. }
  617. })
  618. .finally(() => {
  619. self.submitting = false
  620. })
  621. },
  622. handleReviewerSelector(val){
  623. this.formData.reviewerName = ''
  624. this.formData.employeeSelected = { dept: [], employee: [] }
  625. this.formData.reviewerId = 0
  626. if (val.employee.length > 0){
  627. this.formData.reviewerName = val.employee[0].name
  628. this.formData.employeeSelected.employee = [{name:val.employee[0].name,id:val.employee[0].id,img_url:val.employee[0].img_url}]
  629. this.formData.reviewerId = val.employee[0].id
  630. }
  631. },
  632. openRewrite(){
  633. if (!this.appealInfo) return
  634. this.rewriteData.events = this.appealInfo.events.map(event => {
  635. let pt = this.pts.find(item => item.id === event.pt_id)
  636. pt = pt ? pt.name : ''
  637. return {
  638. id:event.id,
  639. remark:`${event.point} ${pt} ${event.event_remark}`,
  640. appeal_remark:event.appeal_remark
  641. }
  642. })
  643. this.rewriteData.globalRemark = this.appealInfo.global_remark
  644. let node = this.appealInfo.process.find(item => item.step === 1)
  645. if (node){
  646. this.rewriteData.reviewerId = node.reviewer_id
  647. this.rewriteData.reviewerName = node.reviewer_name
  648. }
  649. this.showRewrite = true
  650. },
  651. onFormRemarkInput(val){
  652. this.formData.remark = specialFilter(val)
  653. }
  654. },
  655. mounted() {
  656. this.pts = this.$getTyps()
  657. this.superiorList = this.$store.getters.user_info.employee_detail.superior_list
  658. }
  659. }
  660. </script>
  661. <style scoped lang="scss">
  662. .detail_popup {
  663. padding: 20px;
  664. overflow-y: auto;
  665. overflow-x: hidden !important;
  666. height: calc(100vh - 60px);
  667. }
  668. .detail_row {
  669. padding-bottom: 10px;
  670. line-height: 50px;
  671. }
  672. .appeal_content {
  673. font-size: 18px;
  674. }
  675. .appeal_content p{
  676. margin-bottom: 10px;
  677. font-size: 12px;
  678. color: rgb(144, 147, 153);
  679. }
  680. .process{
  681. position: relative;
  682. margin: 0 0 20px 0;
  683. padding-top: 12px;
  684. font-size: 16px;
  685. color: #303133;
  686. line-height: 22px;
  687. }
  688. .process:before{
  689. position: absolute;
  690. top: 0;
  691. content: ' ';
  692. width: 100%;
  693. border-top: 1px #f8f8f8 solid;
  694. }
  695. .appeal_footer{
  696. border-top: 1px solid #ebebeb;
  697. padding: 10px 20px;
  698. font-size: 14px;
  699. }
  700. .appeal_action {
  701. text-align: center;
  702. }
  703. .center{
  704. margin-top: calc(100vh * 0.3);
  705. }
  706. .desc-content{
  707. display: block;
  708. width: 200px;
  709. text-align: center;
  710. overflow: hidden;
  711. text-overflow: ellipsis;
  712. white-space: nowrap;
  713. }
  714. </style>