detail.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <template>
  2. <div class="question-edit">
  3. <nav-bar></nav-bar>
  4. <div class="page-container">
  5. <!-- 基本信息 -->
  6. <div v-if="taskInfo">
  7. <div class="card">
  8. <div class="mainItem">
  9. <van-row>
  10. <van-col :span="8" class="label">
  11. <div>问题名称</div>
  12. </van-col>
  13. <van-col :span="16">
  14. <span>
  15. {{taskInfo.srcTaskName}}
  16. </span>
  17. </van-col>
  18. </van-row>
  19. </div>
  20. <div class="bigbox">
  21. <div class="mainItem">
  22. <van-row>
  23. <van-col :span="8" class="label">
  24. <div>问题状态</div>
  25. </van-col>
  26. <van-col :span="16">
  27. <span v-if="taskInfo.reformStatus" :style="{color:getState(getDictLabel(taskInfo.reformStatus,'question_reform_status'))}">
  28. {{getDictLabel(taskInfo.reformStatus,'question_reform_status')}}
  29. </span>
  30. <span v-else :style="{color:getState(getDictLabel(taskInfo.confirmStatus,'question_confirm_status'))}">
  31. {{getDictLabel(taskInfo.confirmStatus,'question_confirm_status')}}
  32. </span>
  33. </van-col>
  34. </van-row>
  35. </div>
  36. <div class="mainItem">
  37. <van-row>
  38. <van-col :span="8" class="label">
  39. <div>隐患所在机构</div>
  40. </van-col>
  41. <van-col :span="16">
  42. <span>
  43. {{taskInfo.orgName}}
  44. </span>
  45. </van-col>
  46. </van-row>
  47. </div>
  48. <div class="mainItem">
  49. <van-row>
  50. <van-col :span="8" class="label">
  51. <div>检查项</div>
  52. </van-col>
  53. <van-col :span="16">
  54. <span>
  55. {{taskInfo.checkItem}}
  56. </span>
  57. </van-col>
  58. </van-row>
  59. </div>
  60. <div class="mainItem">
  61. <van-row>
  62. <van-col :span="8" class="label">
  63. <div>检查内容</div>
  64. </van-col>
  65. <van-col :span="16">
  66. <span>
  67. {{taskInfo.checkContent}}
  68. </span>
  69. </van-col>
  70. </van-row>
  71. </div>
  72. <div class="mainItem">
  73. <van-row>
  74. <van-col :span="8" class="label">
  75. <div>隐患描述</div>
  76. </van-col>
  77. <van-col :span="16">
  78. <span>
  79. {{taskInfo.questionDesc}}
  80. </span>
  81. </van-col>
  82. </van-row>
  83. </div>
  84. <div class="mainItem">
  85. <van-row>
  86. <van-col :span="8" class="label">
  87. <div>发现时间</div>
  88. </van-col>
  89. <van-col :span="16">
  90. <span>
  91. {{taskInfo.submitTime}}
  92. </span>
  93. </van-col>
  94. </van-row>
  95. </div>
  96. <div class="mainItem">
  97. <van-row>
  98. <van-col :span="8" class="label">
  99. <div>提出人</div>
  100. </van-col>
  101. <van-col :span="16">
  102. <span>
  103. {{taskInfo.submitorName}}
  104. </span>
  105. </van-col>
  106. </van-row>
  107. </div>
  108. <div class="mainItem">
  109. <van-row>
  110. <van-col :span="8" class="label">
  111. <div>整改期限</div>
  112. </van-col>
  113. <van-col :span="16">
  114. <span>
  115. {{formatDate(taskInfo.reformDeadline,'YYYY-MM-DD')}}
  116. </span>
  117. </van-col>
  118. </van-row>
  119. </div>
  120. <div class="mainItem" v-if="taskInfo.images && taskInfo.images.length > 0">
  121. <van-row>
  122. <van-col :span="8" class="label">
  123. <div>隐患图片</div>
  124. </van-col>
  125. <van-col :span="16">
  126. <div class="nfc-img" v-for="(v,i) in taskInfo.images" :key="v" @click="clickImage(taskInfo.images,i)">
  127. <img :src="imgUrl(v)" alt="" >
  128. </div>
  129. </van-col>
  130. </van-row>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <div v-if="taskInfo.reform">
  136. <p class="info-title">整改情况</p>
  137. <div class="card" >
  138. <div class="mainItem">
  139. <van-row>
  140. <van-col :span="8" class="label"><div>整改日期</div></van-col>
  141. <van-col :span="16"><span>{{formatDate(taskInfo.reform.reformDate,'YYYY-MM-DD')}}</span></van-col>
  142. </van-row>
  143. </div>
  144. <div class="mainItem">
  145. <van-row>
  146. <van-col :span="8" class="label"><div>整改描述</div></van-col>
  147. <van-col :span="16"><span>{{taskInfo.reform.description}}</span></van-col>
  148. </van-row>
  149. </div>
  150. <div class="mainItem" v-if="taskInfo.reform.images">
  151. <van-row>
  152. <van-col :span="8" class="label"><div>上传信息</div></van-col>
  153. <van-col :span="16">
  154. <div v-if="taskInfo.reform.images && taskInfo.reform.images.length > 0">
  155. <div class="nfc-img van-hairline--surround" v-for="(v,i) in taskInfo.reform.images" :key="v" @click="clickImage(taskInfo.reform.images,i)">
  156. <img :src="imgUrl(v)" alt="" >
  157. </div>
  158. </div>
  159. </van-col>
  160. </van-row>
  161. </div>
  162. </div>
  163. </div>
  164. <div v-if="taskInfo.confirm" >
  165. <p class="info-title">处理情况</p>
  166. <div class="card">
  167. <div class="mainItem">
  168. <van-row>
  169. <van-col :span="8" class="label"><div>处理意见</div></van-col>
  170. <van-col :span="16"><span>{{taskInfo.confirm.executeStatus === 0 ? '确认' : '提出异议'}}</span></van-col>
  171. </van-row>
  172. </div>
  173. <div class="mainItem" v-show="taskInfo.confirm.executeStatus===1">
  174. <van-row >
  175. <van-col :span="8" class="label"><div>异议内容</div></van-col>
  176. <van-col :span="16"><span>{{taskInfo.confirm.description}}</span></van-col>
  177. </van-row>
  178. </div>
  179. <div class="mainItem">
  180. <van-row >
  181. <van-col :span="8" class="label"><div>异议人</div></van-col>
  182. <van-col :span="16"><span>{{taskInfo.confirm.executorName}}</span></van-col>
  183. </van-row>
  184. </div>
  185. </div>
  186. </div>
  187. <div v-if="taskInfo.confirmDissent">
  188. <p class="info-title">审批情况</p>
  189. <div class="card">
  190. <div class="mainItem">
  191. <van-row>
  192. <van-col :span="8" class="label"><div>审核结果</div></van-col>
  193. <van-col :span="16"><span>{{taskInfo.confirmDissent.executeStatus === 0 ? '同意' : '不同意'}}</span></van-col>
  194. </van-row>
  195. </div>
  196. <div class="mainItem" v-show="taskInfo.confirmDissent.executeStatus===1">
  197. <van-row>
  198. <van-col :span="8" class="label"><div>原因</div></van-col>
  199. <van-col :span="16"><span>{{taskInfo.confirmDissent.description}}</span></van-col>
  200. </van-row>
  201. </div>
  202. </div>
  203. </div>
  204. <div class="card edit-panel" v-if="type === 'confirm'">
  205. <van-panel title="确认">
  206. <div class="panel-box">
  207. <van-radio-group v-model="confirmData.status" required>
  208. <van-cell-group>
  209. <van-cell title="确认情况" clickable>
  210. <template #right-icon>
  211. <van-radio :name="0" />
  212. </template>
  213. </van-cell>
  214. <van-cell title="提出异议" clickable>
  215. <template #right-icon>
  216. <van-radio :name="1" />
  217. </template>
  218. </van-cell>
  219. </van-cell-group>
  220. </van-radio-group>
  221. <van-field
  222. v-show="confirmData.status"
  223. v-model="confirmData.description"
  224. rows="1"
  225. autosize
  226. required
  227. :maxlength="200"
  228. label="异议内容"
  229. type="textarea"
  230. show-word-limit
  231. placeholder="请输入"/>
  232. <div class="big-btn-box" v-if="taskInfo.orgId == orgId && taskInfo.confirmStatus==0">
  233. <van-button type="info" size="large" @click="onSubmit('确认')">提交</van-button>
  234. </div>
  235. </div>
  236. </van-panel>
  237. </div>
  238. <div class="card edit-panel" v-if="type === 'confirmDissent'">
  239. <van-panel title="审批">
  240. <div class="panel-box">
  241. <van-radio-group v-model="confirmDissentData.status" required>
  242. <van-cell-group>
  243. <van-cell title="同意" clickable>
  244. <template #right-icon>
  245. <van-radio :name="0" />
  246. </template>
  247. </van-cell>
  248. <van-cell title="不同意" clickable>
  249. <template #right-icon>
  250. <van-radio :name="1" />
  251. </template>
  252. </van-cell>
  253. </van-cell-group>
  254. </van-radio-group>
  255. <van-field
  256. v-show="confirmDissentData.status"
  257. v-model="confirmDissentData.description"
  258. rows="1"
  259. autosize
  260. required
  261. :maxlength="200"
  262. label="原因"
  263. :rules="[{ required: true, message: '请输入' }]"
  264. type="textarea"
  265. show-word-limit
  266. placeholder="请输入"/>
  267. <div class="big-btn-box" v-if="taskInfo.submitorId == id && taskInfo.confirmStatus==1">
  268. <van-button type="info" size="large" @click="onSubmit('审核')">提交</van-button>
  269. </div>
  270. </div>
  271. </van-panel>
  272. </div>
  273. <div class="card edit-panel" v-if="type === 'reform'">
  274. <van-panel title="整改情况">
  275. <div class="panel-box">
  276. <date-cell required :max-date="maxDate" is-row title="整改日期" v-model="reformData.reformDate" dateType="date" />
  277. <van-field
  278. required
  279. v-model="reformData.description"
  280. rows="1"
  281. autosize
  282. :maxlength="200"
  283. label="整改描述:"
  284. type="textarea"
  285. show-word-limit
  286. placeholder="请输入"/>
  287. <div class="upload-box" >
  288. <uploader :maxCount="5" v-model="reformData.images"/>
  289. </div>
  290. <div class="big-btn-box" v-if="taskInfo.orgId==orgId && taskInfo.confirmStatus==2 && taskInfo.reformStatus!=11">
  291. <van-button type="info" size="large" @click="onSubmit('整改')">提交</van-button>
  292. </div>
  293. </div>
  294. </van-panel>
  295. </div>
  296. </div>
  297. </div>
  298. </template>
  299. <script>
  300. import NavBar from '@/components/NavBar';
  301. import SelectCell from '@/components/selectCell';
  302. import DateCell from '@/components/dateCell';
  303. import Uploader from '@/components/upload/gxuploader.vue';
  304. import {taskDetails,confirm, confirmDissent, reform,} from "./api";
  305. import {formatDate} from "@/filters/filter";
  306. import { ImagePreview } from 'vant';
  307. import {mapGetters} from "vuex";
  308. import {imgUrl} from "@/utils";
  309. export default {
  310. components:{NavBar,SelectCell,DateCell,Uploader},
  311. data(){
  312. return {
  313. maxDate:new Date(),
  314. //基本信息
  315. taskInfo:[],
  316. formData:{},
  317. //确认
  318. confirmData: {
  319. status: 0,
  320. description: null,
  321. },
  322. //审核
  323. confirmDissentData: {
  324. status: 0,
  325. description: null,
  326. },
  327. //整改
  328. reformData: {
  329. reformDate: null,
  330. description: null,
  331. images: null,
  332. },
  333. type:null,
  334. preViewImages:{},
  335. dicts:['resumption_status','question_confirm_status','question_reform_status','rectification_deadline'],
  336. }
  337. },
  338. mounted() {
  339. console.log('系统信息:'+window.navigator.platform);
  340. this.getData();
  341. },
  342. computed:{
  343. ...mapGetters(['orgId','id','dictionary'])
  344. },
  345. methods:{
  346. formatDate,
  347. getState(state){
  348. switch (state){
  349. case '待整改':
  350. return '#008cd6';
  351. case '已整改':
  352. return '#009240';
  353. case '已逾期':
  354. return '#D7000F';
  355. }
  356. },
  357. //图片预览
  358. clickImage(arr,i){
  359. this.preViewImages.images = arr.map(v=>imgUrl(v));
  360. this.preViewImages.startPosition = i;
  361. ImagePreview(this.preViewImages);
  362. },
  363. //提交
  364. onSubmit(type){
  365. let data,queryMethod;
  366. switch (type){
  367. case '确认':
  368. data = this.confirmData;
  369. queryMethod = confirm;
  370. break;
  371. case '审核':
  372. data = this.confirmDissentData;
  373. queryMethod = confirmDissent;
  374. break
  375. case '整改':
  376. data = this.reformData;
  377. queryMethod = reform;
  378. }
  379. if(type === '确认' || type === '审核'){
  380. if(data.status == 1 && !data.description) {
  381. return this.$toast("请填写信息");
  382. }
  383. }else {
  384. if(!data.reformDate || !data.description){
  385. return this.$toast("请填写完整信息");
  386. }
  387. if(data.images){
  388. let img = data.images.map(v=>{return v.imgPath});
  389. data.images = img.toString();
  390. }
  391. }
  392. data.id = this.taskInfo.id;
  393. queryMethod(data).then((r) => {
  394. this.$toast("提交成功");
  395. this.$router.replace({
  396. name:'problemItem',
  397. path:'/problemItem',
  398. params:{event:'refresh'}
  399. });
  400. });
  401. },
  402. //初始化数据
  403. getData() {
  404. let id = this.$route.query.id;
  405. this.type = this.$route.query.type;
  406. taskDetails(id).then(res=>{
  407. this.taskInfo = res.data;
  408. this.taskInfo.confirm = res.data.flows.find((d) => d.executeStep === 1);
  409. this.taskInfo.confirmDissent = res.data.flows.find((d) => d.executeStep === 2);
  410. this.taskInfo.reform = res.data.flows.find((d) => d.executeStep === 11);
  411. if(this.taskInfo.reform && this.taskInfo.reform.images) {
  412. this.taskInfo.reform.images=this.taskInfo.reform.images.split(",")
  413. }
  414. })
  415. },
  416. //返回
  417. goBack(){
  418. this.$router.go(-1);
  419. this.clearData();
  420. },
  421. //清空数据
  422. clearData(){
  423. this.taskInfo= [];
  424. //确认
  425. this.confirmData = {
  426. status: 0,
  427. description: null,
  428. }
  429. //审核
  430. this.confirmDissentData = {
  431. status: 0,
  432. description: null,
  433. }
  434. //整改
  435. this.reformData = {
  436. reformDate: null,
  437. description: null,
  438. images: null,
  439. }
  440. },
  441. }
  442. }
  443. </script>
  444. <style lang="scss">
  445. .question-edit{
  446. .panel-box{
  447. }
  448. }
  449. </style>
  450. <style lang="scss" scoped>
  451. .question-edit{
  452. height: 100%;
  453. overflow: hidden;
  454. }
  455. .page-container{
  456. height: calc(100vh - 194px);
  457. overflow: auto;
  458. padding: 20px;
  459. }
  460. .flex-box{
  461. display: flex;
  462. justify-content: space-between;
  463. align-items: center;
  464. >span{
  465. margin: 0 20px;
  466. }
  467. }
  468. .info-title{
  469. height: 100px;
  470. line-height: 120px;
  471. }
  472. .mainItem {
  473. display: flex;
  474. font-size: 28px;
  475. align-items: center;
  476. justify-content: space-between;
  477. background-color: #fff;
  478. flex-wrap: wrap;
  479. border-bottom: 1px solid #ccc;
  480. &:last-child{
  481. border-bottom:none;
  482. }
  483. div {
  484. flex: 1;
  485. text-align: left;
  486. }
  487. p {
  488. }
  489. .label {
  490. width: 230px;
  491. flex: none;
  492. }
  493. .labelPeople {
  494. margin-bottom: 20px;
  495. }
  496. }
  497. .mainItemData {
  498. justify-content: end;
  499. }
  500. .van-row {
  501. background-color: #f0f0f0;
  502. display: flex;
  503. align-items: center;
  504. .van-col--8 {
  505. min-height: 100px;
  506. display: flex;
  507. justify-content: center;
  508. align-items: center;
  509. padding: 10px;
  510. background-color: rgb(230, 230, 230,0.4);
  511. opacity: 1;
  512. }
  513. .van-col{
  514. text-align: justify;
  515. white-space: pre-wrap;
  516. }
  517. .zl {
  518. display: block !important;
  519. flex: none !important;
  520. padding-left: 10px;
  521. }
  522. .van-col--16 {
  523. min-height: 100px;
  524. display: flex;
  525. align-items: center;
  526. padding-left: 10px;
  527. background-color: #fff;
  528. padding: 10px;
  529. opacity: 0.9;
  530. }
  531. .tagCls {
  532. margin-top: 10px;
  533. }
  534. .bgc{
  535. background-color: #fff;
  536. padding: 10px;
  537. }
  538. }
  539. .edit-panel{
  540. margin-top: 20px;
  541. }
  542. .card{
  543. margin-bottom: 20px;
  544. box-shadow: 0 10px 10px #eaeaea;
  545. }
  546. .card:last-child{
  547. margin-bottom: 0;
  548. }
  549. .panel-box{
  550. padding:0 20px;
  551. }
  552. .panel-box-item{
  553. height: 36px;
  554. line-height: 36px;
  555. }
  556. .item-label{
  557. width: 100%;
  558. display: flex;
  559. justify-content: right;
  560. align-items: center;
  561. }
  562. .item-value{
  563. width: 100%;
  564. display: flex;
  565. justify-content: left;
  566. align-items: center;
  567. }
  568. .upload-box{
  569. padding: 20px 30px;
  570. }
  571. .nfc-img{
  572. display: inline-block;
  573. width: 140px;
  574. height: 140px;
  575. margin: 10px;
  576. position: relative;
  577. &:first-child{
  578. margin-left: 0;
  579. }
  580. >img{
  581. width: 100%;
  582. height: 100%;
  583. border: none;
  584. }
  585. >span{
  586. position: absolute;
  587. padding: 0 10px;
  588. bottom: 0;
  589. left: 0;
  590. display: block;
  591. width: 100%;
  592. background-color: rgba(0,0,0,.2 );
  593. color: #eaeaea;
  594. font-size: 20px;
  595. overflow: hidden;
  596. text-overflow: ellipsis;
  597. white-space: nowrap;
  598. line-height: 30px;
  599. height: 30px;
  600. }
  601. }
  602. .big-btn-box{
  603. padding-bottom: 20px;
  604. }
  605. </style>