Browse Source

来访管理流程变化 调整页面

zhulu 1 year ago
parent
commit
2b90d8fea7

+ 6 - 0
src/router/router.config.js

@@ -334,6 +334,12 @@ export let routers = [
         meta: { title: '新增申请', keepAlive: false, hideTabBar: true, deep: 2 }
       },
       {
+        path: '/visitAddOutInRequset',
+        name: 'visitAddOutInRequset',
+        component: () => import('@/views/menu/visitRegister/addOutInRequest.vue'),
+        meta: { title: '出入申请', keepAlive: false, hideTabBar: true, deep: 2 }
+      },
+      {
         path: '/visitDetail',
         name: 'visitDetail',
         component: () => import('@/views/menu/visitRegister/detail.vue'),

+ 10 - 1
src/views/menu/cockpit/indexEcharts.js

@@ -457,7 +457,16 @@ let resumption = (data, type = 0) => {
         type: 'none'
       },
       formatter: function (params) {
-        return getzszy[params[0].dataIndex] + '<br>完成率: ' + getzswcl2[params[0].dataIndex]
+        // console.log("params",params)
+        let tempValue= getzswcl2[params[0].dataIndex];
+        if(tempValue.includes("项") || params[0].name=="整改率")
+        {
+          return getzszy[params[0].dataIndex] + ': '+getzswcl2[params[0].dataIndex]
+        }
+        else
+        {
+          return getzszy[params[0].dataIndex] + '<br>完成率: ' + getzswcl2[params[0].dataIndex]
+        }      
       }
     },
     xAxis: {

+ 3 - 1
src/views/menu/visitCheck/api.js

@@ -12,11 +12,13 @@ export function dataList(params) {
 //获取详情
 export function visitDetails(id){
   return request({
-    url: "/core/letter/"+id,
+    url: "/core/letter/outinrequest/"+id,
     method: "get",
   });
 }
 
+
+
 // 审批
 export function visitCheck(data) {
   return request({

+ 60 - 9
src/views/menu/visitCheck/detail.vue

@@ -15,8 +15,8 @@
             </van-cell>
           </template>
           <div class="panel-box">
-            <van-cell title="来访类型" :value="getDictLabel(visitInfo.type,'out_in_type')"></van-cell>
-            <van-cell title="来访事由" :value="visitInfo.reasons"></van-cell>
+            <van-cell title="来访类型" :value="getDictLabel(visitInfo.letterType,'out_in_type')"></van-cell>
+            <van-cell title="来访事由" :value="visitInfo.letterReasons"></van-cell>
             <van-cell title="介绍信编号" v-if="visitInfo.letterNo"  :value="visitInfo.letterNo"></van-cell>
             <van-cell title="开具日期" v-if="visitInfo.startTimeStr"  :value="visitInfo.startTimeStr"></van-cell>
             <van-cell title="有效天数" v-if="visitInfo.effectiveDays"  :value="`${visitInfo.effectiveDays}天`"></van-cell>
@@ -29,7 +29,18 @@
                 </div>
               </template>
             </van-cell>
-            <van-cell v-if="visitInfo.description" title="备注信息" :value="visitInfo.description"></van-cell>
+            <van-cell v-if="visitInfo.letterDescription" title="备注信息" :value="visitInfo.letterDescription"></van-cell>
+            <!-- <div class="upload-box" v-if="visitInfo.approveSignImg">
+              <span>审批签名</span>
+              <van-cell >
+                <div
+                  class="nfc-img van-hairline--surround"
+                  :key="visitInfo.approveSignImg"
+                  @click="preView(visitInfo.approveSignImg)">
+                  <img :src="imgUrl(visitInfo.approveSignImg)" alt="" />
+                </div>
+              </van-cell>
+            </div> -->
           </div>
         </van-panel>
       </div>
@@ -61,7 +72,10 @@
       <div v-if="approveRemark" class="input-box">
         <van-cell title="审批说明" :value="approveRemark"></van-cell>
       </div>
-      <div v-if="approveStatus == 0 && visitInfo.status == 1" class="flex-box">
+      <van-action-sheet v-model="showSign" title="签署名字" class="sheet">
+            <writingPad ref="esign" @resultImg="resultImg"></writingPad>
+          </van-action-sheet>
+      <div v-if="approveStatus == 0" class="flex-box">
         <van-button type="info" style="width: 48%" plain @click="refuse">不同意</van-button>
         <van-button type="info" style="width: 48%" @click="accredit">同意</van-button>
       </div>
@@ -78,8 +92,15 @@ import {mapGetters} from "vuex";
 import {imgUrl} from "@/utils";
 import { ImagePreview } from 'vant'
 import {visitDetails,visitCheck} from './api'
+import writingPad from '@/components/writingPad/index.vue'
+import imgCom from '@/components/imgCom/index.vue'
+import { base64ToBlob } from '@/utils/base64TurnImg.js'
+import { upload } from '@/api/public'
 export default {
-  components: {Uploader, DateCell},
+  components: {Uploader, DateCell,
+    imgCom,
+    writingPad
+  },
   data(){
     return {
       go:{
@@ -94,6 +115,7 @@ export default {
       userInfos:[],
       formData:{},
       showInput:false,
+      showSign:false,
       dicts:['out_in_approve_status','out_in_type','letter_id_type']
     }
   },
@@ -112,7 +134,7 @@ export default {
         let data = {
           approveStatus:2,
           approveRemark:this.formData.description,
-          id:this.visitInfo.approveLog.id
+          id:this.visitInfo.id
         }
         visitCheck(data).then(res=>{
           this.$toast('操作成功');
@@ -125,6 +147,27 @@ export default {
       }
       this.showInput = true;
     },
+    //上传签名图到服务器
+    resultImg(img) {
+      let obj = base64ToBlob(img)
+      let formData = new FormData()
+
+      obj.name = '签名.jpg'
+      formData.append('file', base64ToBlob(img))
+
+      upload(formData, 'image')
+        .then(res => {
+          console.log(process.env.NODE_ENV)
+          /*上传成功*/
+          let imgUrl = process.env.NODE_ENV === 'development' ? res.data.url : res.data.url
+          // this.submitSign(imgUrl)
+          this.submitApproveData(imgUrl);
+          // this.$emit("imgUrl", res.data.url);
+        })
+        .catch(err => {
+          /*上传失败*/
+        })
+    },
     //页面跳转逻辑
     toPagesFcn(){
       this.getRouter();
@@ -140,9 +183,14 @@ export default {
     },
     // 同意
     accredit(){
+      this.showSign=true;      
+    },
+    submitApproveData(imgUrl)
+    {
       let data = {
         approveStatus:1,
-        id:this.visitInfo.approveLog.id
+        id:this.visitInfo.id,
+        approveSignImg:imgUrl
       }
       visitCheck(data).then(res=>{
         this.$toast('操作成功');
@@ -168,8 +216,8 @@ export default {
     getInfo(){
       visitDetails(this.visitId).then(res=>{
         this.visitInfo = res.data;
-        this.approveStatus = this.visitInfo.approveLog.approveStatus;
-        this.approveRemark = this.visitInfo.approveLog.approveRemark;
+        this.approveStatus = this.visitInfo.approveStatus;
+        this.approveRemark = this.visitInfo.approveRemark;
         if(res.data.letterFile){
           let imgArr = res.data.letterFile.map(v=>{
             return JSON.parse(v)
@@ -344,6 +392,9 @@ export default {
   }
 
 }
+.sheet {
+  height: 45%;
+}
 .input-box{
   margin-bottom: 20px;
 }

+ 9 - 5
src/views/menu/visitCheck/index.vue

@@ -33,7 +33,7 @@
               :border="false"
               class="item-title"
               :title-style="{color:'#008cd6'}"
-              :title="`介绍信类型: ${getDictLabel(v.type,'out_in_type')}`"
+              :title="`介绍信类型: ${getDictLabel(v.letterType,'out_in_type')}`"
               @click="clickItem(v.id)">
               <template #right-icon>
                   <span :style="{color:getState(getDictLabel(v.approveStatus,'out_in_approve_status'))}">
@@ -52,13 +52,17 @@
                     <div class="item-value"> {{v.letterNo}}</div>
                   </div>
                   <div class="info-item">
-                    <div class="item-label">有效期限</div>
+                    <div class="item-label">介绍信有效期限</div>
                     <div class="item-value">{{v.startTime}}~{{v.endTime}}</div>
                   </div>
                   <div class="info-item">
+                    <div class="item-label">出入申请日期</div>
+                    <div class="item-value">{{v.createTime}}</div>
+                  </div>
+                  <div class="info-item">
                     <div class="item-label">来访事由</div>
                     <div class="item-value">
-                      {{v.reasons}}
+                      {{v.letterReasons}}
                     </div>
                   </div>
                 </div>
@@ -271,12 +275,12 @@ export default {
   align-items: center;
   font-size: 26px;
   .item-label{
-    flex:.25;
+    flex:.30;
     text-align: left;
     color:#333;
   }
   .item-value{
-    flex:.75;
+    flex:.70;
     color:#666;
     min-height: 50px;
     max-height: 250px;

+ 8 - 0
src/views/menu/visitRecord/api.js

@@ -34,6 +34,14 @@ export function userRegister(data){
   });
 }
 
+//人员登记
+export function deleteUserRegister(ids){
+  return request({
+    url: "/core/outinrecord/"+ids,
+    method: "delete",
+  });
+}
+
 //登记离开
 export function userDepart(data){
   return request({

+ 143 - 22
src/views/menu/visitRecord/detail.vue

@@ -10,8 +10,8 @@
             </template>
           <div class="panel-box">
             <van-cell title="来访人员" :value="selectedUser.userName"></van-cell>
-            <van-cell title="介绍信类型" :value="getDictLabel(selectedUser.type,'out_in_type')"></van-cell>
-            <van-cell title="来访事由" :value="selectedUser.reasons"></van-cell>
+            <van-cell title="介绍信类型" :value="getDictLabel(selectedUser.letterType,'out_in_type')"></van-cell>
+            <van-cell title="来访事由" :value="selectedUser.letterReasons"></van-cell>
             <van-cell title="来访单位" :value="selectedUser.companyName"></van-cell>
             <van-cell title="证件类型" :value="getDictLabel(selectedUser.idType,'letter_id_type')"></van-cell>
             <van-cell title="证件号码" :value="selectedUser.idCard"></van-cell>
@@ -49,12 +49,44 @@
                 </div>
               </van-cell>
             </div>
-            <van-cell title="陪同人员" :value="selectedUser.accompanyingPerson"></van-cell>
+            <div class="upload-box" v-if="canRecord() && !selectedUser.departureTime && !selectedUser.checkImage">
+              <span class="required">核验结果</span>
+              <van-cell>
+                <uploader :maxCount="2" v-model="formData.checkImage"/>
+              </van-cell>
+            </div>
+            <van-cell v-if="selectedUser.accompanyingPerson" title="陪同人员" :value="selectedUser.accompanyingPerson"></van-cell>
+            <!-- <date-cell v-if="selectedUser.approveStatus==1 && !selectedUser.accompanyingPerson" required title="到达时间" :max-date="maxData" :min-date='minDate' :is-row="true"  v-model="formData.arrivalTime" date-type="datetime" /> -->
+            <van-field
+              v-if="canRecord() && !selectedUser.accompanyingPerson"
+              v-model="formData.accompanyingPerson"
+              rows="1"
+              autosize
+              required
+              :maxlength="200"
+              placeholder="请输入陪同人员姓名"
+              label="陪同人员"></van-field>
             <van-cell title="到达时间" v-if="selectedUser.arrivalTime" :value="dayjs(selectedUser.arrivalTime).format('YYYY-DD-MM HH:mm')"></van-cell>
             <van-cell title="离开时间" v-if="selectedUser.departureTime" :value="dayjs(selectedUser.departureTime).format('YYYY-DD-MM HH:mm')"></van-cell>
-            <date-cell v-else required title="离开时间" :max-date="maxData" :min-date='minDate' :is-row="true"  v-model="formData.departureTime" date-type="datetime" />
+            <div class="upload-box" v-if="selectedUser.submitSign">
+              <span>登记签名</span>
+              <van-cell >
+                <div
+                  class="nfc-img van-hairline--surround"
+                  :key="selectedUser.submitSign"
+                  @click="preView(selectedUser.submitSign)">
+                  <img :src="imgUrl(selectedUser.submitSign)" alt="" />
+                </div>
+              </van-cell>
+            </div>
+            <date-cell v-if="canRecord() && !selectedUser.arrivalTime" required title="到达时间" :max-date="maxData" :min-date='minDate' :is-row="true"  v-model="formData.arrivalTime" date-type="datetime" />
+            <date-cell v-if="canRecord() && selectedUser.arrivalTime && !selectedUser.departureTime" required title="离开时间" :max-date="maxData" :min-date='minDate' :is-row="true"  v-model="formData.departureTime" date-type="datetime" />
           </div>
-          <div v-if="!selectedUser.departureTime" class="big-btn-box" >
+          
+          <van-action-sheet v-model="showSign" title="签署名字" class="sheet">
+            <writingPad ref="esign" @resultImg="resultImg"></writingPad>
+          </van-action-sheet>
+          <div v-if="canRecord() &&!selectedUser.departureTime" class="big-btn-box" >
             <van-button  type="info" size="large" @click="onSubmit">确认登记</van-button>
           </div>
         </van-panel>
@@ -72,10 +104,14 @@ import {formatDate} from "@/filters/filter";
 import {mapGetters} from "vuex";
 import {imgUrl} from "@/utils";
 import { ImagePreview } from 'vant'
+import writingPad from '@/components/writingPad/index.vue'
+import imgCom from '@/components/imgCom/index.vue'
+import { base64ToBlob } from '@/utils/base64TurnImg.js'
+import { upload } from '@/api/public'
 import {userDetails, userDepart} from './api'
 import dayjs from 'dayjs'
 export default {
-  components: {Uploader, DateCell},
+  components: {Uploader, DateCell,writingPad,imgCom},
   data(){
     return {
       maxData:new Date(),
@@ -83,6 +119,7 @@ export default {
       visitId:null,
       userList:[],
       selectedUser:{},
+      showSign:false,
       prop:{
         label:'userName',
         value:'id'
@@ -90,6 +127,8 @@ export default {
       formData:{
         arrivalTime:null,
         departureTime:null,
+        checkImage:null,
+        accompanyingPerson:null,
       },
       dicts:['out_in_approve_status','out_in_type','letter_id_type']
     }
@@ -103,30 +142,109 @@ export default {
   },
   methods:{
     imgUrl,formatDate,
+    canRecord(){
+      return this.selectedUser.approveStatus==1 && this.selectedUser.status!=3
+    },
     onSubmit(){
-      let {departureTime} = this.formData;
-      if(!departureTime){
+      let {arrivalTime,departureTime,accompanyingPerson,checkImage} = this.formData;
+      if(!this.selectedUser.checkImage && !checkImage){
+        this.$toast('请上传审核结果');
+        return
+      }
+
+      if(!this.selectedUser.accompanyingPerson && !accompanyingPerson){
+        this.$toast('请输入陪同人员姓名');
+        return
+      }
+
+      if(!this.selectedUser.arrivalTime && !arrivalTime){
+        this.$toast('请选择到达时间');
+        return
+      }
+
+      if(this.selectedUser.arrivalTime && !this.selectedUser.departureTime && !departureTime){
         this.$toast('请选择离开时间');
         return
       }
-      let data = {
-        id:this.selectedUser.id,
-        arrivalTime:this.selectedUser.arrivalTime,
-        departureTime,
+      
+      if(departureTime){
+        this.signatureHandler();
       }
-      //alert(JSON.stringify(data))
-      userDepart(data).then(res=>{
-        this.$toast.success('提交成功');
-        this.$router.replace({
-          name:'visitRecord',
-          path:'/visitRecord',
-          params:{event:'refresh'},
-        });
-      })
+      else{
+        this.submitRecordData(arrivalTime,departureTime,accompanyingPerson,checkImage);
+      }      
+    },
+    submitRecordData(arrivalTime,departureTime,accompanyingPerson,checkImage,signImgUrl)
+    {
+        let data = {
+          id:this.selectedUser.id,
+          // accompanyingPerson:this.selectedUser.accompanyingPerson?this.selectedUser.accompanyingPerson:accompanyingPerson,
+          // arrivalTime: this.selectedUser.arrivalTime ? this.selectedUser.arrivalTime:arrivalTime,
+          // departureTime,
+        }
+        if(arrivalTime)
+        {
+          data.arrivalTime=arrivalTime;
+        }
+        if(departureTime)
+        {
+          data.departureTime=departureTime;
+        }
+        if(accompanyingPerson)
+        {
+          data.accompanyingPerson=accompanyingPerson;
+        }
+        if(checkImage)
+        {
+          data.checkImage=checkImage;
+        }
+        if(signImgUrl)
+        {
+          data.submitSign=signImgUrl;
+        }
+        //alert(JSON.stringify(data))
+        userDepart(data).then(res=>{
+          this.$toast.success('提交成功');
+          this.$router.replace({
+            name:'visitRecord',
+            path:'/visitRecord',
+            params:{event:'refresh'},
+          });
+        })
+    },
+    signatureHandler() {
+      this.showSign = true
+    },
+    //上传签名图到服务器
+    resultImg(img) {
+      let obj = base64ToBlob(img)
+      let formData = new FormData()
+
+      obj.name = '签名.jpg'
+      formData.append('file', base64ToBlob(img))
+
+      upload(formData, 'image')
+        .then(res => {
+          console.log(process.env.NODE_ENV)
+          /*上传成功*/
+          let signImgUrl = process.env.NODE_ENV === 'development' ? res.data.url : res.data.url
+          // this.submitSign(imgUrl)
+          let {arrivalTime,departureTime,accompanyingPerson,checkImage} = this.formData;
+          this.submitRecordData(arrivalTime,departureTime,accompanyingPerson,checkImage,signImgUrl);
+          // this.$emit("imgUrl", res.data.url);
+        })
+        .catch(err => {
+          /*上传失败*/
+        })
     },
     getUserInfo(){
       userDetails(this.visitId).then(res=>{
-        let checkImage = res.data.checkImage.split(',');
+
+        let checkImage = "";
+        if(res.data.checkImage)
+        {
+          checkImage= res.data.checkImage.split(',')
+        }
         let imgFile = res.data.imgFile.split(',');
         let letterFile = [];
         if(res.data.letterFile && res.data.letterFile.length > 0){
@@ -304,4 +422,7 @@ export default {
     height: 30px;
   }
 }
+.sheet {
+  height: 45%;
+}
 </style>

+ 66 - 6
src/views/menu/visitRecord/index.vue

@@ -14,6 +14,14 @@
           @change="refreshData"/>
         <date-cell title="日期" is-all v-model="query.arrivalTime" date-type="date" @change="refreshData"/>
       </div>
+      <select-cell
+          style="border-right: 1px solid #f5f5f5;"
+          title="审批状态"
+          :isAll="true"
+          :border="false"
+          v-model="query.approveStatus"
+          :data-list="getDictItem('out_in_approve_status')"
+          @change="refreshData"/>
       <div class="card-list">
         <Scroll
           ref="Scroll"
@@ -26,10 +34,15 @@
               :border="false"
               class="item-title"
               :title-style="{color:'#008cd6'}"
-              :title="`介绍信类型: ${getDictLabel(v.type,'out_in_type')}`"
+              :title="`介绍信类型: ${getDictLabel(v.letterType,'out_in_type')}`"
               @click="clickItem(v.id)">
               <template #right-icon>
-                <van-button v-if="!v.departureTime" type="info" size="mini">登记离开时间</van-button>
+                <span v-if="v.approveStatus==1 && v.status==3" style="color:#D7000F">
+                    已失效
+                  </span>
+                <van-button v-if="v.approveStatus==0" @click.stop="cancelOutInRequest(v.id)" type="info" size="mini">取消出入申请</van-button>
+                <van-button v-if="v.approveStatus==1 && v.status!=3 &&!v.arrivalTime" type="info" size="mini">登记达到时间</van-button>
+                <van-button v-if="v.approveStatus==1 && v.status!=3 && v.arrivalTime&&!v.departureTime" type="info" size="mini">登记离开时间</van-button>
               </template>
             </van-cell>
             <van-cell
@@ -39,13 +52,32 @@
               <template #default>
                 <div class="info-box">
                   <div class="info-item">
+                    <div class="item-label">审批状态</div>
+                    <div class="item-value" :style="{color:getState(getDictLabel(v.approveStatus,'out_in_approve_status'))}">
+                      {{getDictLabel(v.approveStatus,'out_in_approve_status') }}
+                    </div>
+                  </div>
+                  <div class="info-item" v-if="v.approveRemark">
+                    <div class="item-label">审批说明</div>
+                    <div class="item-value"> {{v.approveRemark}}</div>
+                  </div>
+                  <div class="info-item">
+                    <div class="item-label">审批时间</div>
+                    <div class="item-value">
+                       <!-- {{v.approveTime}} -->
+                       {{v.approveTime? dayjs(v.approveTime).format('YYYY-MM-DD HH:mm') : '暂无'}}
+                      </div>
+                  </div>
+                
+                  <div class="info-item">
                     <div class="item-label">人员姓名</div>
                     <div class="item-value"> {{v.userName}}</div>
                   </div>
                   <div class="info-item">
                     <div class="item-label">到达时间</div>
                     <div class="item-value">
-                      {{ dayjs(v.arrivalTime).format('YYYY-MM-DD HH:mm')}}
+                      <!-- {{ dayjs(v.arrivalTime).format('YYYY-MM-DD HH:mm')}} -->
+                      {{v.arrivalTime? dayjs(v.arrivalTime).format('YYYY-MM-DD HH:mm') : '暂无'}}
                     </div>
                   </div>
                   <div class="info-item">
@@ -103,8 +135,9 @@
 <!--          </card>-->
         </Scroll>
       </div>
+     
     </div>
-    <drag-button @btnClick="clickAdd"></drag-button>
+    <!-- <drag-button @btnClick="clickAdd"></drag-button> -->
   </div>
 </template>
 <script>
@@ -114,7 +147,7 @@ import Scroll from '@/components/scroll/scroll.vue'
 import Card from '@/components/card/index.vue'
 import dateCell from '@/components/dateCell/index.vue'
 import selectCell from '@/components/selectCell/index.vue'
-import {dataList} from './api'
+import {dataList,deleteUserRegister} from './api'
 import {mapGetters} from "vuex";
 import {formatDate} from "@/filters/filter";
 import DragButton from "@/components/DragButton/index.vue";
@@ -142,7 +175,7 @@ export default {
       },
       dataList:[],
       pullup:false,
-      dicts:['out_in_type']
+      dicts:['out_in_type','out_in_approve_status']
     }
   },
   beforeRouteEnter(to,from,next){
@@ -160,6 +193,18 @@ export default {
   },
   methods: {
     dayjs,
+    getState(state){
+      switch (state){
+        case '待审批':
+          return '#008cd6';
+        case '不同意':
+          return '#bc9f71';
+        case '同意':
+          return '#009240';
+        case '已失效':
+          return '#D7000F';
+      }
+    },
     clickAdd(){
       this.$router.push({
         path:'/visitUserRecord',
@@ -207,6 +252,21 @@ export default {
         path:'/visitRecordDetail',
         query:{id}
       });
+    },
+    cancelOutInRequest(id)
+    {
+      // let data = {
+      //   id:this.selectedUser.id,
+      //   accompanyingPerson:this.selectedUser.accompanyingPerson?this.selectedUser.accompanyingPerson:accompanyingPerson,
+      //   arrivalTime: this.selectedUser.arrivalTime ? this.selectedUser.arrivalTime:arrivalTime,
+      //   departureTime,
+      // }
+      //alert(JSON.stringify(data))
+      let ids=[id];
+      deleteUserRegister(ids).then(res=>{
+        this.$toast.success('提交成功');
+        this.refreshData();
+      })
     }
   }
 }

+ 405 - 0
src/views/menu/visitRegister/addOutInRequest.vue

@@ -0,0 +1,405 @@
+<template>
+  <div class="intro-add">
+    <nav-bar></nav-bar>
+    <div class="page-container">
+      <!--   基本信息   -->
+      <div class="card">
+        <van-panel title="来访信息" >
+          <template #header>
+            <van-cell title="介绍信情况">
+              <template #extra>
+                  <span :style="{color:getState(visitInfo.status)}">
+                    {{getDictLabel(visitInfo.status,'letter_status') }}
+                  </span>
+              </template>
+            </van-cell>
+          </template>
+          <div class="panel-box">
+            <van-cell title="来访类型" :value="getDictLabel(visitInfo.type,'out_in_type')"></van-cell>
+            <van-cell title="来访事由" :value="visitInfo.reasons"></van-cell>
+            <van-cell title="介绍信编号" v-if="visitInfo.letterNo"  :value="visitInfo.letterNo"></van-cell>
+            <van-cell title="开具日期" v-if="visitInfo.startTimeStr"  :value="visitInfo.startTimeStr"></van-cell>
+            <van-cell title="有效天数" v-if="visitInfo.effectiveDays"  :value="`${visitInfo.effectiveDays}天`"></van-cell>
+            <van-cell title="介绍信附件"  v-if="visitInfo.letterFile && visitInfo.letterFile.length > 0">
+              <template #right-icon>
+                <div class="file-box">
+                  <p class="van-ellipsis" v-for="(v, i) in visitInfo.letterFile"
+                     :key="v.url"
+                     @click="previewFile(v)">{{v.name}}</p>
+                </div>
+              </template>
+            </van-cell>
+            <van-cell v-if="visitInfo.description" title="备注信息" :value="visitInfo.description"></van-cell>
+          </div>
+        </van-panel>
+      </div>
+
+      <!--  人员列表  -->
+      <div class="card" v-for="(v,i) in userInfos" :key="i">
+        <div class="goods-card">
+          <div class="card-cell-checkbox">
+            <van-checkbox v-model="v.checked" shape="square" @click.native="checkboxClicked(i)"/>
+          </div>
+          <div class="card-img-box" v-if="v.imgFile && v.imgFile.length > 0" @click="preView(v.imgFile)">
+            <img :src="imgUrl(v.imgFile[0])" alt="">
+          </div>
+          <div class="card-cell-box">
+            <van-cell title="来访单位" :value="v.companyName"></van-cell>
+            <van-cell title="来访人员" :value="v.userName"></van-cell>
+            <van-cell title="证件类型" :value="getDictLabel(v.idType,'letter_id_type')"></van-cell>
+            <van-cell title="证件号码" :value="v.idCard"></van-cell>
+          </div>
+        </div>
+      </div>
+      <!-- <van-checkbox v-model="checked" icon-size="24px">复选框</van-checkbox> -->
+      <!-- <div v-show="showInput" class="input-box">
+        <van-field
+          v-model="formData.description"
+          rows="1"
+          autosize
+          :maxlength="200"
+          label="审批说明"
+          type="textarea"
+          placeholder="请输入"/>
+      </div>
+      <div v-if="approveRemark" class="input-box">
+        <van-cell title="审批说明" :value="approveRemark"></van-cell>
+      </div> -->
+      <!-- <div v-if="approveStatus == 0 && visitInfo.status == 1" class="flex-box">
+        <van-button type="info" style="width: 48%" plain @click="refuse">不同意</van-button>
+        <van-button type="info" style="width: 48%" @click="accredit">同意</van-button>
+      </div> -->
+      <div class="big-btn-box">
+        <van-button  type="info" size="large" @click="onSubmit">提交申请</van-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import DateCell from "@/components/dateCell/index.vue";
+import Uploader from "@/components/upload/gxuploader.vue";
+import {formatDate} from "@/filters/filter";
+import {mapGetters} from "vuex";
+import { ref } from 'vue';
+import {imgUrl} from "@/utils";
+import { ImagePreview } from 'vant'
+import {visitDetails,visitCheck,outInRequestAdd} from './api'
+export default {
+  components: {Uploader, DateCell},
+  data(){
+    return {
+      go:{
+        type:'replace', //参数:go push replace
+        path:'/visitCheck',
+      },
+      visitId:null,
+      approveStatus:null,
+      approveRemark:null,
+      activeNames:['1'],
+      visitInfo: {},
+      userInfos:[],
+      formData:{},
+      showInput:false,
+      dicts:['out_in_approve_status','out_in_type','letter_id_type','letter_status'],
+      checked:null
+    }
+  },
+  computed:{
+    ...mapGetters(['orgId','id','dictionary'])
+  },
+  mounted(){
+    this.visitId = this.$route.query.id;
+    this.getInfo();
+  },
+  methods:{
+    imgUrl,formatDate,
+    // 拒绝
+    refuse(){
+      if(this.showInput){
+        let data = {
+          approveStatus:2,
+          approveRemark:this.formData.description,
+          id:this.visitInfo.approveLog.id
+        }
+        visitCheck(data).then(res=>{
+          this.$toast('操作成功');
+          this.toPagesFcn();
+        }).catch(error=>{
+          if( error === '任务已完成'){
+            this.toPagesFcn();
+          }
+        })
+      }
+      this.showInput = true;
+    },
+    //页面跳转逻辑
+    toPagesFcn(){
+      this.getRouter();
+      if(this.fromPages.name === "works"){
+        this.$router.go(-1)
+      }else {
+        this.$router.replace({
+          name:'visitCheck',
+          path:'/visitCheck',
+          params:{event:'refresh'}
+        });
+      }
+    },
+    // 同意
+    accredit(){
+      let data = {
+        approveStatus:1,
+        id:this.visitInfo.approveLog.id
+      }
+      visitCheck(data).then(res=>{
+        this.$toast('操作成功');
+        this.toPagesFcn();
+      }).catch(error=>{
+        if( error === '任务已完成'){
+          this.toPagesFcn();
+        }
+      })
+    },
+    getState(state){
+      switch (state){
+        case 0:
+          return '#008cd6';
+        case 1:
+          return '#009240';
+        case 2:
+          return '#bc9f71';
+        case 3:
+          return '#D7000F';
+      }
+    },
+    getInfo(){
+      visitDetails(this.visitId).then(res=>{
+        this.visitInfo = res.data;
+        // this.approveStatus = this.visitInfo.approveLog.approveStatus;
+        // this.approveRemark = this.visitInfo.approveLog.approveRemark;
+        if(res.data.letterFile){
+          let imgArr = res.data.letterFile.map(v=>{
+            return JSON.parse(v)
+          })
+          this.visitInfo.letterFile = imgArr;
+        }
+        if(res.data.userInfos){
+          let users = res.data.userInfos.map(v=>{
+            if(v.imgFile){
+              v.imgFile = v.imgFile.split(',');
+            }
+            v.checked=false;
+            return v
+          });
+          console.log(users,'users')
+          this.userInfos = users;
+        }
+      })
+    },
+    previewFile(file){
+      this.openFilePreview(file);
+    },
+    preView(val) {
+      if(Array.isArray(val)){
+        let arr = val.map(v=>{
+          return imgUrl(v);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
+    },
+    checkboxClicked(index)
+    {
+      this.userInfos[index].checked=!this.userInfos[index].checked;
+      this.$nextTick(()=>{
+        this.$forceUpdate();
+      })
+      // console.log('checkboxClicked', this.userInfos )     
+    },
+    onSubmit(){      
+      try{
+
+        if (this.userInfos.filter(x=>x.checked==true).length == 0) {
+          this.$toast('请勾选出入申请出入人员');
+          return;
+        }
+        
+        let requestUserInfos=JSON.parse(JSON.stringify(this.userInfos));        
+        let data = {id:this.visitInfo.id};        
+        data.userInfos = requestUserInfos.filter(x=>x.checked==true).map(user=>{
+          let urlArr = user.imgFile.map(v=>{
+            return v.imgPath
+          })
+          user.imgFile = urlArr.join(',');
+          return user
+        });
+        console.log("data",data)
+        outInRequestAdd(data).then(res=>{
+          this.$toast.success('提交成功');
+          this.$router.replace({
+            name:'visitRegister',
+            path:'/visitRegister',
+            params:{event:'refresh'},
+          });
+        })
+      }catch (e) {
+        alert(e)
+      }
+    },
+
+  }
+}
+</script>
+<style lang="scss">
+.intro-add{
+  .van-card{
+    padding: 20px;
+  }
+  .card-cell-box{
+    width: 60%;
+    .van-cell{
+      padding: 4px;
+      &::after{
+        left:10px;
+        right:10px;
+      }
+    }
+    .van-cell__title{
+      flex:.30;
+    }
+    .van-cell__value{
+      flex:.70;
+    }
+  }
+}
+</style>
+<style scoped lang="scss">
+.intro-add{
+  height: 100%;
+  overflow: hidden;
+}
+.page-container{
+  height: calc(100vh - 94px);
+  overflow: auto;
+  padding: 20px;
+
+}
+.flex-box{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  >span{
+    margin: 0 20px;
+  }
+}
+.card{
+  margin-bottom: 20px;
+  box-shadow: 0 10px 10px #eaeaea;
+}
+.card:last-child{
+  margin-bottom: 0;
+}
+.panel-box{
+  -padding:0 20px;
+}
+.panel-box-item{
+  height: 36px;
+  line-height: 36px;
+}
+.item-label{
+  width: 100%;
+  display: flex;
+  justify-content: right;
+  align-items: center;
+}
+.item-value{
+  width: 100%;
+  display: flex;
+  justify-content: left;
+  align-items: center;
+}
+.upload-box{
+  padding: 20px 30px;
+  display: flex;
+  >span{
+    display: inline-block;
+    height: 160px;
+    width: 200px;
+    line-height: 160px;
+    font-size: 28px;
+    color:#999;
+    >i{
+      font-style: normal;
+      color: #ee0a24;
+    }
+  }
+}
+.goods-card{
+  width: 100%;
+  display: flex;
+  align-items: center;
+  padding: 10px;
+  background-color: #fff;
+  .card-img-box{
+    width: 200px;
+    height: 200px;
+    margin-right: 10px;
+    >img{
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+      border-radius: 10px;
+    }
+  }
+  .card-cell-checkbox{
+    margin-right: 10px;
+  }
+}
+.big-btn-box{
+  padding-bottom: 20px;
+}
+.file-box{
+  width: 70%;
+  display: flex;
+  justify-content: flex-end;
+  color:#008cd6;
+}
+.nfc-img {
+  display: inline-block;
+  width: 140px;
+  height: 140px;
+  margin: 0 10px;
+  position: relative;
+  > img {
+    width: 100%;
+    height: 100%;
+    border: none;
+  }
+  > span {
+    position: absolute;
+    padding: 0 10px;
+    bottom: 0;
+    left: 0;
+    display: block;
+    width: 100%;
+    background-color: rgba(0, 0, 0, 0.2);
+    color: #eaeaea;
+    font-size: 20px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    line-height: 30px;
+    height: 30px;
+  }
+
+}
+.input-box{
+  margin-bottom: 20px;
+}
+.checkboxList {
+  z-index: 999;
+}
+</style>

+ 10 - 0
src/views/menu/visitRegister/api.js

@@ -17,6 +17,16 @@ export function visitAdd(data) {
   });
 }
 
+// 添加
+export function outInRequestAdd(data) {
+  return request({
+    url: "/core/letter/outInRequest",
+    method: "post",
+    data,
+  });
+}
+
+
 //获取详情
 export function visitDetails(id){
   return request({

+ 8 - 10
src/views/menu/visitRegister/detail.vue

@@ -9,8 +9,8 @@
           <div class="panel-box">
             <van-cell title="状态">
               <template #extra>
-                  <span :style="{color:getState(approveStatus)}">
-                    {{getDictLabel(approveStatus,'out_in_approve_status') }}
+                  <span :style="{color:getState(visitInfo.status)}">
+                    {{getDictLabel(visitInfo.status,'letter_status') }}
                   </span>
               </template>
             </van-cell>
@@ -69,14 +69,14 @@ export default {
       activeNames:['1'],
       visitInfo: {},
       userInfos:[],
-      approveStatus:null,
-      approveRemark:null,
+      // approveStatus:null,
+      // approveRemark:null,
       reformData: {
         reformDate: null,
         description: null,
         images: null,
       },
-      dicts:['out_in_approve_status','out_in_type','letter_id_type']
+      dicts:['out_in_approve_status','out_in_type','letter_id_type','letter_status']
     }
   },
   computed:{
@@ -95,16 +95,14 @@ export default {
         case 1:
           return '#009240';
         case 2:
-          return '#bc9f71';
-        case 3:
           return '#D7000F';
       }
     },
     getInfo(){
       visitDetails(this.visitId).then(res=>{
         this.visitInfo = res.data;
-        this.approveStatus = this.visitInfo.approveLog.approveStatus;
-        this.approveRemark = this.visitInfo.approveLog.approveRemark;
+        // this.approveStatus = this.visitInfo.approveLog.approveStatus;
+        // this.approveRemark = this.visitInfo.approveLog.approveRemark;
         if(res.data.letterFile){
           let imgArr = res.data.letterFile.map(v=>{
             return JSON.parse(v)
@@ -136,7 +134,7 @@ export default {
   }
 }
 </script>
-<style lang="scss">
+<style scoped lang="scss">
 .intro-add{
   .van-card{
     padding: 20px;

+ 32 - 22
src/views/menu/visitRegister/index.vue

@@ -9,9 +9,8 @@
         :isAll="true"
         :border="false"
         :isRow="true"
-        :prop="prop"
         v-model="query.type"
-        :data-list="typeList"
+        :data-list="getDictItem('out_in_type')"
         @change="refreshData"/>
       <div class="card-list">
         <Scroll
@@ -28,9 +27,10 @@
                 :title="`介绍信类型: ${getDictLabel(v.type,'out_in_type')}`"
                 @click="clickItem(v.id)">
                   <template #right-icon>
-                    <span :style="{color:getState(getDictLabel(v.approveStatus,'out_in_approve_status'))}">
-                      {{getDictLabel(v.approveStatus,'out_in_approve_status') }}
-                    </span>
+                    <span v-if="v.status==2" :style="{color:getState(getDictLabel(v.status,'letter_status'))}">
+                      {{getDictLabel(v.status,'letter_status') }}
+                    </span>                 
+                   <van-button v-if="v.status==1" @click.stop="clickItem(v.id,true)" type="info" size="mini">出入申请</van-button>             
                   </template>
               </van-cell>
               <van-cell :border="false" @click="clickItem(v.id)">
@@ -97,17 +97,17 @@ export default {
         label:'name',
         value:'value'
       },
-      typeList:[
-        {
-          name:'纸质',
-          value:2
-        },
-        {
-          name:'紧急',
-          value:3
-        }
-      ],
-      dicts:['out_in_approve_status','out_in_type']
+      // typeList:[
+      //   {
+      //     name:'纸质',
+      //     value:2
+      //   },
+      //   {
+      //     name:'紧急',
+      //     value:3
+      //   }
+      // ],
+      dicts:['out_in_approve_status','out_in_type','letter_status']
     }
   },
   beforeRouteEnter(to,from,next){
@@ -180,12 +180,22 @@ export default {
         query:{type:'add'}
       });
     },
-    clickItem(id){
-      console.log(id,'idddddddd')
-      this.$router.push({
-        path:'/visitDetail',
-        query: {id}
-      });
+    clickItem(id,isAddOutInRequest){     
+      if(isAddOutInRequest)
+      {
+        console.log(id,'isAddOutInRequest')
+        this.$router.push({
+          path:'/visitAddOutInRequset',
+          query: {id}
+        });
+      }
+      else{
+        console.log(id,'visitDetail')
+        this.$router.push({
+          path:'/visitDetail',
+          query: {id}
+        });
+      }
     }
   }
 }