detail.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  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="7" class="label">
  11. <div>问题名称</div>
  12. </van-col>
  13. <van-col :span="17">
  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="7" class="label">
  24. <div>问题状态</div>
  25. </van-col>
  26. <van-col :span="17">
  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="7" class="label">
  39. <div>隐患所在机构</div>
  40. </van-col>
  41. <van-col :span="17">
  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="7" class="label">
  51. <div>检查项</div>
  52. </van-col>
  53. <van-col :span="17">
  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="7" class="label">
  63. <div>检查内容</div>
  64. </van-col>
  65. <van-col :span="17">
  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="7" class="label">
  75. <div>隐患描述</div>
  76. </van-col>
  77. <van-col :span="17">
  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="7" class="label">
  87. <div>发现时间</div>
  88. </van-col>
  89. <van-col :span="17">
  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="7" class="label">
  99. <div>提出人</div>
  100. </van-col>
  101. <van-col :span="17">
  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="7" class="label">
  111. <div>整改期限</div>
  112. </van-col>
  113. <van-col :span="17">
  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="7" class="label">
  123. <div>隐患图片</div>
  124. </van-col>
  125. <van-col :span="17">
  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="7" class="label"><div>整改日期</div></van-col>
  144. <van-col :span="17"><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="7" class="label"><div>整改描述</div></van-col>
  150. <van-col :span="17"><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="7" class="label"><div>上传信息</div></van-col>
  156. <van-col :span="17">
  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="7" class="label"><div>处理意见</div></van-col>
  173. <van-col :span="17"><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="7" class="label"><div>异议内容</div></van-col>
  179. <van-col :span="17"><span>{{taskInfo.confirm.description}}</span></van-col>
  180. </van-row>
  181. </div>
  182. <div class="mainItem">
  183. <van-row >
  184. <van-col :span="7" class="label"><div>异议人</div></van-col>
  185. <van-col :span="17"><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="7" class="label"><div>审核结果</div></van-col>
  196. <van-col :span="17"><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="7" class="label"><div>原因</div></van-col>
  202. <van-col :span="17"><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 :min-date="dayjs(taskInfo.submitTime).toDate()" :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. import dayjs from "dayjs";
  313. export default {
  314. components:{NavBar,SelectCell,DateCell,Uploader},
  315. data(){
  316. return {
  317. maxDate:new Date(),
  318. //基本信息
  319. taskInfo:[],
  320. formData:{},
  321. //确认
  322. confirmData: {
  323. status: 0,
  324. description: null,
  325. },
  326. //审核
  327. confirmDissentData: {
  328. status: 0,
  329. description: null,
  330. },
  331. //整改
  332. reformData: {
  333. reformDate: null,
  334. description: null,
  335. images: null,
  336. },
  337. type:null,
  338. preViewImages:{},
  339. dicts:['resumption_status'],
  340. }
  341. },
  342. mounted() {
  343. console.log('系统信息:'+window.navigator.platform);
  344. this.getData();
  345. },
  346. computed:{
  347. ...mapGetters(['orgId','id','dictionary'])
  348. },
  349. methods:{
  350. dayjs,formatDate,
  351. getState(state){
  352. switch (state){
  353. case '待整改':
  354. return '#008cd6';
  355. case '已整改':
  356. return '#009240';
  357. case '已逾期':
  358. return '#D7000F';
  359. }
  360. },
  361. //图片预览
  362. clickImage(arr,i){
  363. this.preViewImages.images = arr.map(v=>imgUrl(v));
  364. this.preViewImages.startPosition = i;
  365. ImagePreview(this.preViewImages);
  366. },
  367. //提交
  368. onSubmit(type){
  369. let data,queryMethod;
  370. switch (type){
  371. case '确认':
  372. data = this.confirmData;
  373. queryMethod = confirm;
  374. break;
  375. case '审核':
  376. data = this.confirmDissentData;
  377. queryMethod = confirmDissent;
  378. break
  379. case '整改':
  380. data = this.reformData;
  381. queryMethod = reform;
  382. }
  383. if(type === '确认' || type === '审核'){
  384. if(data.status == 1 && !data.description) {
  385. return this.$toast("请填写信息");
  386. }
  387. }else {
  388. if(!data.reformDate || !data.description){
  389. return this.$toast("请填写完整信息");
  390. }
  391. if(data.images){
  392. let img = data.images.map(v=>{return v.imgPath});
  393. data.images = img.toString();
  394. }
  395. }
  396. data.id = this.taskInfo.id;
  397. queryMethod(data).then((r) => {
  398. this.$toast("提交成功");
  399. this.$router.replace({
  400. name:'problemItem',
  401. path:'/problemItem',
  402. params:{event:'refresh'}
  403. });
  404. });
  405. },
  406. //初始化数据
  407. getData() {
  408. let id = this.$route.query.id;
  409. this.type = this.$route.query.type;
  410. taskDetails(id).then(res=>{
  411. this.taskInfo = res.data;
  412. this.taskInfo.confirm = res.data.flows.find((d) => d.executeStep === 1);
  413. this.taskInfo.confirmDissent = res.data.flows.find((d) => d.executeStep === 2);
  414. this.taskInfo.reform = res.data.flows.find((d) => d.executeStep === 11);
  415. if(this.taskInfo.reform && this.taskInfo.reform.images) {
  416. this.taskInfo.reform.images=this.taskInfo.reform.images.split(",")
  417. }
  418. })
  419. },
  420. //返回
  421. goBack(){
  422. this.$router.go(-1);
  423. this.clearData();
  424. },
  425. //清空数据
  426. clearData(){
  427. this.taskInfo= [];
  428. //确认
  429. this.confirmData = {
  430. status: 0,
  431. description: null,
  432. }
  433. //审核
  434. this.confirmDissentData = {
  435. status: 0,
  436. description: null,
  437. }
  438. //整改
  439. this.reformData = {
  440. reformDate: null,
  441. description: null,
  442. images: null,
  443. }
  444. },
  445. }
  446. }
  447. </script>
  448. <style lang="scss">
  449. .question-edit{
  450. .panel-box{
  451. }
  452. }
  453. </style>
  454. <style lang="scss" scoped>
  455. .question-edit{
  456. height: 100%;
  457. overflow: hidden;
  458. }
  459. .page-container{
  460. height: calc(100vh - 194px);
  461. overflow: auto;
  462. padding: 20px;
  463. }
  464. .flex-box{
  465. display: flex;
  466. justify-content: space-between;
  467. align-items: center;
  468. >span{
  469. margin: 0 20px;
  470. }
  471. }
  472. .info-title{
  473. height: 100px;
  474. line-height: 120px;
  475. }
  476. .mainItem {
  477. font-size: 28px;
  478. width: 100%;
  479. }
  480. .mainItemData {
  481. justify-content: end;
  482. }
  483. .van-row {
  484. background-color: #f0f0f0;
  485. display: flex;
  486. align-items: center;
  487. .van-col--7 {
  488. min-height: 100px;
  489. display: flex;
  490. justify-content: center;
  491. align-items: center;
  492. padding: 10px;
  493. background-color: rgb(230, 230, 230,0.4);
  494. opacity: 1;
  495. }
  496. .van-col{
  497. text-align: justify;
  498. white-space: pre-wrap;
  499. }
  500. .zl {
  501. display: block !important;
  502. flex: none !important;
  503. padding-left: 10px;
  504. }
  505. .van-col--17 {
  506. min-height: 100px;
  507. display: flex;
  508. align-items: center;
  509. background-color: #fff;
  510. padding: 10px;
  511. padding-left: 10px;
  512. flex-flow: wrap;
  513. // opacity: 0.9;
  514. }
  515. .tagCls {
  516. margin-top: 10px;
  517. }
  518. .bgc{
  519. background-color: #fff;
  520. padding: 10px;
  521. }
  522. }
  523. .edit-panel{
  524. margin-top: 20px;
  525. }
  526. .card{
  527. margin-bottom: 20px;
  528. box-shadow: 0 10px 10px #eaeaea;
  529. }
  530. .card:last-child{
  531. margin-bottom: 0;
  532. }
  533. .panel-box{
  534. padding:0 20px;
  535. }
  536. .panel-box-item{
  537. height: 36px;
  538. line-height: 36px;
  539. }
  540. .item-label{
  541. width: 100%;
  542. display: flex;
  543. justify-content: right;
  544. align-items: center;
  545. }
  546. .item-value{
  547. width: 100%;
  548. display: flex;
  549. justify-content: left;
  550. align-items: center;
  551. }
  552. .upload-box{
  553. padding: 20px 30px;
  554. }
  555. .nfc-img{
  556. display: inline-block;
  557. width: 140px;
  558. height: 140px;
  559. margin: 10px;
  560. position: relative;
  561. //&:first-child{
  562. // margin-left: 0;
  563. //}
  564. >img{
  565. width: 100%;
  566. height: 100%;
  567. border: none;
  568. }
  569. >span{
  570. position: absolute;
  571. padding: 0 10px;
  572. bottom: 0;
  573. left: 0;
  574. display: block;
  575. width: 100%;
  576. background-color: rgba(0,0,0,.2 );
  577. color: #eaeaea;
  578. font-size: 20px;
  579. overflow: hidden;
  580. text-overflow: ellipsis;
  581. white-space: nowrap;
  582. line-height: 30px;
  583. height: 30px;
  584. }
  585. }
  586. .big-btn-box{
  587. padding-bottom: 20px;
  588. }
  589. </style>