detail.vue 17 KB

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