Pārlūkot izejas kodu

Merge branch 'V0.0.3' of http://10.87.21.221:8000/jzyd_yyds/soc_app into V0.0.3

coys 1 gadu atpakaļ
vecāks
revīzija
707f7e24df

+ 3 - 2
src/components/NavBar/index.vue

@@ -18,7 +18,8 @@ export default {
       default: ()=>(
         {
           type:'go', //参数:go push replace
-          path:-1
+          path:-1,
+          obj:null
         }
       )
     }
@@ -31,7 +32,7 @@ export default {
   methods:{
     goBack(){
       console.log(this.go,'go')
-      this.$router[this.go.type](this.go.path);
+      this.$router[this.go.type](this.go.obj||this.go.path);
     },
   }
 }

+ 62 - 30
src/views/menu/visitCheck/detail.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="intro-add">
-    <nav-bar></nav-bar>
+    <nav-bar :go="go"></nav-bar>
     <div class="page-container">
       <!--   基本信息   -->
       <div class="card">
         <van-panel title="来访信息" >
           <template #header>
-            <van-cell title="状态">
+            <van-cell title="审批情况">
               <template #extra>
                   <span :style="{color:getState(approveStatus)}">
                     {{getDictLabel(approveStatus,'out_in_approve_status') }}
@@ -15,24 +15,22 @@
             </van-cell>
           </template>
           <div class="panel-box">
-            <van-cell title="来访类型" :value="getDictLabel(visitInfo.type,'out_in_type')"></van-cell>
-            <van-cell title="到访机构" :value="visitInfo.orgName"></van-cell>
-            <van-cell title="出入事由" :value="visitInfo.reasons"></van-cell>
-            <van-cell title="访问日期" :value="visitInfo.startTimeStr"></van-cell>
-            <van-cell title="结束日期" :value="visitInfo.endTimeStr"></van-cell>
-            <div class="upload-box">
-              <span>介绍信文件</span>
-              <van-cell v-if="visitInfo.letterFile">
-                <div
-                  class="nfc-img van-hairline--surround"
-                  v-for="(v, i) in visitInfo.letterFile"
-                  :key="v.url"
-                  @click="preView(v.url)">
-                  <img :src="imgUrl(v.url)" alt="" />
+            <van-cell title="介绍信类型" :value="getDictLabel(visitInfo.type,'out_in_type')"></van-cell>
+            <van-cell title="接待机构" :value="visitInfo.orgName"></van-cell>
+            <van-cell title="来访事由" :value="visitInfo.reasons"></van-cell>
+            <van-cell title="开具日期" :value="visitInfo.startTimeStr"></van-cell>
+            <van-cell title="有效天数" :value="visitInfo.startTimeStr"></van-cell>
+<!--            <van-cell title="访问日期" :value="visitInfo.startTimeStr"></van-cell>-->
+<!--            <van-cell title="结束日期" :value="visitInfo.endTimeStr"></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>
-                <!--                      <img class="nfc-img" v-for="v in item.imgData" :src="imgUrl(v.imgPath)" alt="" :key="v.id">-->
-              </van-cell>
-            </div>
+              </template>
+            </van-cell>
             <van-cell v-if="visitInfo.description" title="备注信息" :value="visitInfo.description"></van-cell>
           </div>
         </van-panel>
@@ -45,9 +43,11 @@
             <img :src="imgUrl(v.imgFile[0])" alt="">
           </div>
           <div class="card-cell-box">
-            <van-cell title="出入人员" :value="v.userName"></van-cell>
-            <van-cell title="身份证" :value="v.idCard"></van-cell>
-            <van-cell title="单位" :value="v.companyName"></van-cell>
+            <van-cell title="来访单位" :value="v.userName"></van-cell>
+            <van-cell title="来访人员" :value="v.userName"></van-cell>
+            <van-cell title="证件类型" :value="v.idCard"></van-cell>
+            <van-cell title="证件号码" :value="v.idCard"></van-cell>
+<!--            <van-cell title="单位" :value="v.companyName"></van-cell>-->
           </div>
         </div>
       </div>
@@ -65,7 +65,7 @@
         <van-cell title="审批说明" :value="approveRemark"></van-cell>
       </div>
       <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%" plain @click="refuse">不同意</van-button>
         <van-button type="info" style="width: 48%" @click="accredit">同意</van-button>
       </div>
     </div>
@@ -85,6 +85,14 @@ export default {
   components: {Uploader, DateCell},
   data(){
     return {
+      go:{
+        type:'replace', //参数:go push replace
+        obj:{
+          name:'visitCheck',
+          path:'/visitCheck',
+          params:{event:'refresh'},
+        }
+      },
       visitId:null,
       approveStatus:null,
       approveRemark:null,
@@ -119,7 +127,9 @@ export default {
         visitCheck(data).then(res=>{
           this.$toast('操作成功');
           this.$router.replace({
+            name:'visitCheck',
             path:'/visitCheck',
+            params:{event:'refresh'}
           });
         })
       }
@@ -134,7 +144,9 @@ export default {
       visitCheck(data).then(res=>{
         this.$toast('操作成功');
         this.$router.replace({
+          name:'visitCheck',
           path:'/visitCheck',
+          params:{event:'refresh'}
         });
       })
     },
@@ -162,16 +174,30 @@ export default {
           })
           this.visitInfo.letterFile = imgArr;
         }
-        let users = res.data.userInfos.map(v=>{
-          v.imgFile = v.imgFile.split(',');
-          return v
-        });
-        console.log(users,'users')
-        this.userInfos = users;
+        if(res.data.userInfos){
+          let users = res.data.userInfos.map(v=>{
+            if(v.imgFile){
+              v.imgFile = v.imgFile.split(',');
+            }
+            return v
+          });
+          console.log(users,'users')
+          this.userInfos = users;
+        }
       })
     },
+    previewFile(file){
+      this.openFilePreview(file);
+    },
     preView(val) {
-      ImagePreview(val);
+      if(Array.isArray(val)){
+        let arr = val.map(v=>{
+          return imgUrl(v);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
     },
   }
 }
@@ -281,6 +307,12 @@ export default {
 .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;

+ 13 - 6
src/views/menu/visitCheck/index.vue

@@ -6,7 +6,7 @@
       <div class="search-flex">
         <select-cell
           style="border-right: 1px solid #f5f5f5;"
-          title="出入类型"
+          title="介绍信类型"
           :isAll="true"
           :border="false"
           v-model="query.type"
@@ -33,7 +33,7 @@
               :title-style="{color:v.type == 3?'#D7000F':''}"
               :title="getDictLabel(v.type,'out_in_type')"
               @click="clickItem(v.id)">
-              <template #extra>
+              <template #right-icon>
                   <span :style="{color:getState(getDictLabel(v.approveStatus,'out_in_approve_status'))}">
                     {{getDictLabel(v.approveStatus,'out_in_approve_status') }}
                   </span>
@@ -49,7 +49,7 @@
                     <div class="item-value">{{v.startTime}}~{{v.endTime}}</div>
                   </div>
                   <div class="info-item">
-                    <div class="item-label">出入事由:</div>
+                    <div class="item-label">来访事由:</div>
                     <div class="item-value">
                       {{v.reasons}}
                     </div>
@@ -96,6 +96,13 @@ export default {
       dicts:['out_in_approve_status','out_in_type']
     }
   },
+  beforeRouteEnter(to,from,next){
+    next(vm=>{
+      if(to.params.event === 'refresh'){
+        vm.refreshData();
+      }
+    })
+  },
   mounted() {
     this.initData();
   },
@@ -111,7 +118,7 @@ export default {
           return '#bc9f71';
         case '同意':
           return '#009240';
-        case '已逾期':
+        case '未审批':
           return '#D7000F';
       }
     },
@@ -246,12 +253,12 @@ export default {
   justify-content: space-between;
   font-size: 26px;
   .item-label{
-    flex:.25;
+    flex:.29;
     text-align: left;
     color:#333;
   }
   .item-value{
-    flex:.75;
+    flex:.70;
     color:#666;
     min-height: 50px;
     line-height: 36px;

+ 35 - 19
src/views/menu/visitRecord/add.vue

@@ -35,25 +35,22 @@
                   class="nfc-img van-hairline--surround"
                   v-for="(v, i) in selectedUser.imgFile"
                   :key="v"
-                  @click="preView(v)">
+                  @click="preView(selectedUser.imgFile)">
                   <img :src="imgUrl(v)" alt="" />
                 </div>
               </van-cell>
             </div>
             <van-cell title="单位" :value="selectedUser.companyName"></van-cell>
             <van-cell title="出入事由" :value="selectedUser.reasons"></van-cell>
-            <div class="upload-box" v-if="selectedUser.letterFile && selectedUser.letterFile.length > 0">
-              <span>介绍信</span>
-              <van-cell >
-                <div
-                  class="nfc-img van-hairline--surround"
-                  v-for="(v, i) in selectedUser.letterFile"
-                  :key="v.url"
-                  @click="preView(v.url)">
-                  <img :src="imgUrl(v.url)" alt="" />
+            <van-cell title="介绍信"  v-if="selectedUser.letterFile && selectedUser.letterFile.length > 0">
+              <template #right-icon>
+                <div class="file-box">
+                  <p class="van-ellipsis" v-for="(v, i) in selectedUser.letterFile"
+                     :key="v.url"
+                     @click="previewFile(v)">{{v.name}}</p>
                 </div>
-              </van-cell>
-            </div>
+              </template>
+            </van-cell>
             <van-cell title="出入类型" :value="getDictLabel(selectedUser.type,'out_in_type')"></van-cell>
             <van-field
               v-model="formData.accompanyingPerson"
@@ -135,7 +132,7 @@ export default {
         return
       }
       if(!this.formData.arrivalTime){
-        this.$toast('请选择到访时间');
+        this.$toast('请选择到时间');
         return
       }
       let data = {
@@ -145,17 +142,22 @@ export default {
         letterUserId:this.selectedUser.id,
         orgId:this.orgId,
       }
-      alert(JSON.stringify(data))
+      //alert(JSON.stringify(data))
       userRegister(data).then(res=>{
         this.$toast.success('提交成功');
         this.$router.replace({
+          name:'visitRecord',
           path:'/visitRecord',
+          params:{event:'refresh'},
         });
       })
     },
     getItemInfo(item){
       this.selectedUser = item;
     },
+    previewFile(file){
+      this.openFilePreview(file);
+    },
     getUserList(){
       let data = {
         orgId:this.orgId,
@@ -164,16 +166,24 @@ export default {
       userList(data).then(res=>{
         this.userList = res.data.map(v=>{
           v.imgFile = v.imgFile.split(',');
-          v.letterFile = v.letterFile.map(str=>{
-            return JSON.parse(str)
-          })
+          if(v.letterFile && v.letterFile.length >0){
+            v.letterFile = v.letterFile.map(str=>{
+              return JSON.parse(str)
+            })
+          }
           return v
         })
-        console.log(this.userList,'list')
       })
     },
     preView(val) {
-      ImagePreview(imgUrl(val));
+      if(Array.isArray(val)){
+        let arr = val.map(v=>{
+          return imgUrl(v);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
     },
   }
 }
@@ -286,6 +296,12 @@ export default {
     }
   }
 }
+.file-box{
+  width: 70%;
+  display: flex;
+  justify-content: flex-end;
+  color:#008cd6;
+}
 .big-btn-box{
   padding: 20px;
 }

+ 2 - 2
src/views/menu/visitRecord/api.js

@@ -9,11 +9,11 @@ export function dataList(data) {
 }
 
 //用户列表
-export function userList(query) {
+export function userList(params) {
   return request({
     url: "/core/letter/approved/person",
     method: "get",
-    query
+    params
   });
 }
 

+ 42 - 26
src/views/menu/visitRecord/detail.vue

@@ -18,25 +18,22 @@
                   class="nfc-img van-hairline--surround"
                   v-for="(v, i) in selectedUser.imgFile"
                   :key="v"
-                  @click="preView(v)">
+                  @click="preView(selectedUser.imgFile)">
                   <img :src="imgUrl(v)" alt="" />
                 </div>
               </van-cell>
             </div>
             <van-cell title="单位" :value="selectedUser.companyName"></van-cell>
             <van-cell title="出入事由" :value="selectedUser.reasons"></van-cell>
-            <div class="upload-box" v-if="selectedUser.letterFile && selectedUser.letterFile.length > 0">
-              <span>介绍信</span>
-              <van-cell >
-                <div
-                  class="nfc-img van-hairline--surround"
-                  v-for="(v, i) in selectedUser.letterFile"
-                  :key="v.url"
-                  @click="preView(v.url)">
-                  <img :src="imgUrl(v.url)" alt="" />
+            <van-cell title="介绍信"  v-if="selectedUser.letterFile && selectedUser.letterFile.length > 0">
+              <template #right-icon>
+                <div class="file-box">
+                  <p class="van-ellipsis" v-for="(v, i) in selectedUser.letterFile"
+                     :key="v.url"
+                     @click="previewFile(v)">{{v.name}}</p>
                 </div>
-              </van-cell>
-            </div>
+              </template>
+            </van-cell>
             <van-cell title="出入类型" :value="getDictLabel(selectedUser.type,'out_in_type')"></van-cell>
             <van-cell title="陪同人员" :value="selectedUser.accompanyingPerson"></van-cell>
             <div class="upload-box" v-if="selectedUser.checkImage && selectedUser.checkImage.length > 0">
@@ -46,13 +43,15 @@
                 class="nfc-img van-hairline--surround"
                 v-for="(v, i) in selectedUser.checkImage"
                 :key="v"
-                @click="preView(v)">
+                @click="preView(selectedUser.checkImage)">
                 <img :src="imgUrl(v)" alt="" />
               </div>
               </van-cell>
             </div>
-            <date-cell :disabled="selectedUser.departureTime" required title="到达时间" :max-date="maxData" :is-row="true"  v-model="selectedUser.arrivalTime" date-type="datetime" />
-            <date-cell :disabled="selectedUser.departureTime" required title="离开时间" :max-date="maxData" :is-row="true"  v-model="selectedUser.departureTime" date-type="datetime" />
+            <van-cell title="到达时间" v-if="selectedUser.arrivalTime" :value="selectedUser.arrivalTime"></van-cell>
+            <date-cell v-else required title="到达时间" :max-date="maxData" :is-row="true"  v-model="formData.arrivalTime" date-type="datetime" />
+            <van-cell title="离开时间" v-if="selectedUser.departureTime" :value="selectedUser.departureTime"></van-cell>
+            <date-cell v-else required title="离开时间" :max-date="maxData" :is-row="true"  v-model="formData.departureTime" date-type="datetime" />
           </div>
           <div v-if="!selectedUser.departureTime" class="big-btn-box" >
             <van-button  type="info" size="large" @click="onSubmit">确认登记</van-button>
@@ -102,25 +101,23 @@ export default {
   methods:{
     imgUrl,formatDate,
     onSubmit(){
-      let {arrivalTime,departureTime} = this.selectedUser;
-      if(!arrivalTime){
-        this.$toast('请选择到达时间');
-        return
-      }
+      let {departureTime} = this.formData;
       if(!departureTime){
         this.$toast('请选择离开时间');
         return
       }
       let data = {
         id:this.selectedUser.id,
-        arrivalTime,
+        arrivalTime:this.selectedUser.arrivalTime,
         departureTime,
       }
-      alert(JSON.stringify(data))
+      //alert(JSON.stringify(data))
       userDepart(data).then(res=>{
         this.$toast.success('提交成功');
         this.$router.replace({
+          name:'visitRecord',
           path:'/visitRecord',
+          params:{event:'refresh'},
         });
       })
     },
@@ -128,17 +125,30 @@ export default {
       userDetails(this.visitId).then(res=>{
         let checkImage = res.data.checkImage.split(',');
         let imgFile = res.data.imgFile.split(',');
-        let letterFile = res.data.letterFile.map(v=>{
-          return JSON.parse(v)
-        })
+        let letterFile = [];
+        if(res.data.letterFile && res.data.letterFile.length > 0){
+            letterFile = res.data.letterFile.map(v=>{
+            return JSON.parse(v)
+          })
+        }
         this.selectedUser = res.data;
         this.selectedUser.checkImage = checkImage;
         this.selectedUser.imgFile = imgFile;
         this.selectedUser.letterFile = letterFile;
       })
     },
+    previewFile(file){
+      this.openFilePreview(file);
+    },
     preView(val) {
-      ImagePreview(imgUrl(val));
+      if(Array.isArray(val)){
+        let arr = val.map(v=>{
+          return imgUrl(v);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
     },
   }
 }
@@ -254,6 +264,12 @@ export default {
 .big-btn-box{
   padding: 20px;
 }
+.file-box{
+  width: 70%;
+  display: flex;
+  justify-content: flex-end;
+  color:#008cd6;
+}
 .nfc-img {
   display: inline-block;
   width: 140px;

+ 14 - 9
src/views/menu/visitRecord/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="visitRecord">
-    <NavBar />
+    <NavBar/>
     <div class="page-container">
       <van-search v-model="query.userName" class="van-hairline--bottom" placeholder="请输入人员姓名"  @change="refreshData"/>
       <div class="search-flex">
@@ -26,11 +26,9 @@
             :title-style="{color:v.type == 3?'#D7000F':''}"
             :title="getDictLabel(v.type,'out_in_type')"
             @click="clickItem(v.id)">
-<!--              <template #extra>-->
-<!--                <span :style="{color:getState(getDictLabel(v.approveStatus,'out_in_approve_status'))}">-->
-<!--                  {{getDictLabel(v.approveStatus,'out_in_approve_status') }}-->
-<!--                </span>-->
-<!--              </template>-->
+              <template #extra>
+                <van-button v-if="!v.departureTime" type="info" size="mini">登记离开时间</van-button>
+              </template>
             <template #label>
               <div class="info-box">
                 <div class="info-item">
@@ -38,11 +36,11 @@
                   <div class="item-value"> {{v.userName}}</div>
                 </div>
                 <div class="info-item">
-                  <div class="item-label">证件号:</div>
+                  <div class="item-label">证件号:</div>
                   <div class="item-value">{{v.idCard}}</div>
                 </div>
                 <div class="info-item">
-                  <div class="item-label">到访时间:</div>
+                  <div class="item-label">到时间:</div>
                   <div class="item-value">
                     {{v.arrivalTime}}
                   </div>
@@ -50,7 +48,7 @@
                 <div class="info-item">
                   <div class="item-label">离开时间:</div>
                   <div class="item-value">
-                    {{v.departureTime}}
+                    {{v.departureTime || '暂无'}}
                   </div>
                 </div>
                 <div class="info-item">
@@ -103,6 +101,13 @@ export default {
       dicts:['out_in_type']
     }
   },
+  beforeRouteEnter(to,from,next){
+    next(vm=>{
+      if(to.params.event === 'refresh'){
+        vm.refreshData();
+      }
+    })
+  },
   mounted() {
     this.initData();
   },

+ 140 - 84
src/views/menu/visitRegister/add.vue

@@ -6,11 +6,12 @@
       <div class="card">
         <van-panel >
           <template #header>
-<!--            <van-cell title="申请信息"></van-cell>-->
+            <van-cell title="申请信息"></van-cell>
           </template>
           <div class="panel-box">
             <select-cell
               title="介绍信类型"
+              is-row
               :prop="prop"
               v-model="visitType"
               :data-list="typeList"
@@ -32,18 +33,35 @@
               v-model="formData.reasons"
               placeholder="请输入"
               :maxlength="200"/>
+            <date-cell
+              v-if="visitType != 3"
+              required
+              v-model="formData.date"
+              title="开具日期">
+            </date-cell>
+            <select-cell
+              required
+              v-if="visitType != 3"
+              title="有效天数"
+              is-row
+              :label="formData.date"
+              is-link
+              @click="showCalendar">
+            </select-cell>
             <van-cell
               required
-              title="有效期"
+              v-if="visitType != 2"
+              title="出入期限"
               :label="formData.date"
               is-link
               @click="showCalendar">
             </van-cell>
             <div class="upload-box" v-if="visitType != 3" >
-              <span><i>*</i> 介绍信上传</span>
+              <span><i>*</i> 上传介绍信</span>
               <uploader :maxCount="1" v-model="formData.letterFile"/>
             </div>
             <van-field
+              v-if="visitType != 3"
               v-model="formData.description"
               rows="1"
               autosize
@@ -64,11 +82,10 @@
       </div>
 
       <!--  人员列表   -->
-      <div class="card" v-for="(v,i) in pList" :key="i">
+      <div class="card" v-for="(v,i) in pList" :key="v.uuid">
         <van-swipe-cell>
           <div class="goods-card">
            <div class="card-img-box" @click="preView(v.imgFile)">
-<!--             <p>{{v.imgFile[0].imgPath}}</p>-->
              <img :src="imgUrl(v.imgFile[0].imgPath)" alt="">
            </div>
            <div class="card-cell-box">
@@ -86,36 +103,37 @@
         </van-swipe-cell>
       </div>
 
-
       <!--  添加人员信息    -->
       <div class="card" v-show="checked">
         <van-cell title="人员信息">
           <template #right-icon>
-            <van-button type="info"  icon="plus" size="mini" @click="onAdd">添加</van-button>
+            <van-button type="primary" v-if="isAdd" icon="plus" size="mini" @click="onAdd">添加</van-button>
+            <van-button type="info" v-else icon="edit" size="mini" @click="onEdit">确认</van-button>
           </template>
         </van-cell>
         <div class="panel-box">
           <van-form validate-first @failed="onFailed">
-            <van-cell
-              v-if="visitType == 1"
-              title="来访机构"
-              required
-              is-link
-              @click="showOrg"
-              :label="formData.orgName">
-            </van-cell>
             <van-field
               required
               v-model="personnel.userName"
               rows="1"
               autosize
               :maxlength="20"
-              label="来访人员"
+              label="出入人员"
               :rules="[{ pattern:/^(.+)$/, message: '请输入' }]"
               placeholder="请输入"/>
+            <van-field
+              required
+              v-model="personnel.idCard"
+              rows="1"
+              autosize
+              :maxlength="20"
+              label="证件号码"
+              placeholder="请输入"/>
             <select-cell
               title="证件类型"
               :prop="prop"
+              is-row
               v-model="visitType"
               :data-list="typeList"
               required>
@@ -128,20 +146,12 @@
               :maxlength="20"
               label="证件号码"
               placeholder="请输入"/>
-            <van-field
-              required
-              v-model="personnel.companyName"
-              rows="1"
-              autosize
-              :maxlength="20"
-              label="单位"
-              :rules="[{ pattern:/^(.+)$/, message: '请输入' }]"
-              placeholder="请输入"/>
           </van-form>
           <div class="upload-box" >
-            <span><i>*</i> 证件上传</span>
+            <span><i>*</i> 上传证件照</span>
             <uploader :maxCount="2" v-model="personnel.imgFile"/>
           </div>
+          <p class="tip-text" >注:证件号码将作为唯一识别码</p>
         </div>
       </div>
       <div class="big-btn-box" >
@@ -199,6 +209,7 @@ export default {
         imgFile:[],
       },
       pList:[],
+      isAdd:true,
       showPicker:false,
       openCalendar:false,
       prop:{
@@ -237,92 +248,127 @@ export default {
       //     return;
       //   }
       // }
-      if(this.visitType ==  '2'){
-        if(!this.formData.letterNo){
-          this.$toast('请输入介绍信编号');
+      try{
+        if(this.visitType ==  '2'){
+          if(!this.formData.letterNo){
+            this.$toast('请输入介绍信编号');
+            return;
+          }
+          if(!this.formData.letterFile){
+            this.$toast('请上传介绍信');
+            return;
+          }
+        }
+
+        if(!this.formData.reasons){
+          this.$toast('请输入出入事由');
           return;
         }
-        if(!this.formData.letterFile){
-          this.$toast('请上传介绍信');
+        if(!this.formData.range){
+          this.$toast('请选择有效期');
           return;
         }
-      }
-
-      if(!this.formData.reasons){
-        this.$toast('请输入出入事由');
-        return;
-      }
-      if(!this.formData.range){
-        this.$toast('请选择有效期');
-        return;
-      }
-      if(this.pList.length == 0){
-        this.$toast('请添加人员信息');
-        return;
-      }
-      this.formData.status = 1;
-      this.formData.type = this.visitType;
-      this.formData.receptionOrgIds = [this.orgId];
-      this.formData.userInfos = this.pList;
-      let data = this.formData;
-      //alert(JSON.stringify(data))
-      if(this.visitType ==  '2'){
-        data.letterFile = this.formData.letterFile.map(v=>{
-          return JSON.stringify(v);
+        if(this.pList.length == 0){
+          this.$toast('请添加人员信息');
+          return;
+        }
+        this.formData.status = 1;
+        this.formData.type = this.visitType;
+        this.formData.receptionOrgIds = [this.orgId];
+        this.formData.userInfos = this.pList;
+        let data = this.formData;
+        //alert(JSON.stringify(data))
+        if(this.visitType ==  '2'){
+          data.letterFile = this.formData.letterFile.map(v=>{
+            return JSON.stringify(v);
+          })
+        }
+        data.userInfos = this.pList.map(user=>{
+          let urlArr = user.imgFile.map(v=>{
+            return v.imgPath
+          })
+          user.imgFile = urlArr.join(',');
+          return user
         })
-      }
-      data.userInfos = this.pList.map(user=>{
-        let urlArr = user.imgFile.map(v=>{
-          return v.imgPath
+        // alert(JSON.stringify(data));
+        // return;
+        visitAdd(data).then(res=>{
+          this.$toast.success('提交成功');
+          this.$router.replace({
+            name:'visitRegister',
+            path:'/visitRegister',
+            params:{event:'refresh'},
+          });
         })
-        user.imgFile = urlArr.join(',');
-        return user
-      })
-      alert(JSON.stringify(data))
-      visitAdd(data).then(res=>{
-        this.$toast.success('提交成功');
-        this.$router.replace({
-          path:'/visitRegister',
-        });
-      })
+      }catch (e) {
+        alert(e)
+      }
     },
     onFailed(errorInfo) {
       console.log('failed', errorInfo);
     },
     getDate(date){
-      console.log(date,'date');
       const [start, end] = date;
       this.formData.range = date;
       this.formData.date = `${start} ~ ${end}`;
-      console.log( this.formData.date,'date');
     },
     showCalendar(){
       this.$refs.CalendarPicker.show = true;
     },
     editPerson(v,i){
-      console.log(v,'vvvvv');
       this.checked = true;
+      this.isAdd = false;
       this.personnel = JSON.parse(JSON.stringify(v));
     },
     deletePerson(v,i){
-      console.log(v,'vvvvv')
       this.pList.splice(i,1);
     },
-    onAdd(){
-      // this.personnel.imgFile = [{
-      //   url:'askjdkajsdjajkdsa',
-      //   imgPath:'asjkdklaslkdasdlasld',
-      //   name:'asdasdasd'
-      // }]
+    onEdit(){
       if(!this.personnel.userName || !this.personnel.idCard || !this.personnel.companyName || !this.personnel.imgFile){
         this.$toast('请完善人员信息');
         return;
       }
-      if(this.personnel.imgFile.length < 2) {
-        this.$toast('请上传证件照正反面');
+      let strObj = JSON.parse(JSON.stringify(this.personnel));
+      let index = this.pList.findIndex(v=>{return v.uuid === strObj.uuid});
+      this.pList.splice(index,1,strObj);
+      this.personnel = {
+        userName:null,
+        idCard:null,
+        companyName:null,
+        imgFile:[],
+      };
+      this.isAdd = true;
+    },
+    onAdd(){
+      //测试模拟
+      // if(!this.personnel.idCard){
+      //   this.personnel.imgFile = [{
+      //     url:'askjdkajsdjajkdsa',
+      //     imgPath:'asjkdklaslkdasdlasld',
+      //     name:'asdasdasd'
+      //   },
+      //     {
+      //       url:'asdaaskjdkajsdjajkdsa',
+      //       imgPath:'dsaasjkdklaslkdasdlasld',
+      //       name:'asdasdasd'
+      //     }
+      //   ];
+      //   this.personnel.userName = '张三';
+      //   this.personnel.idCard = '123456789012345678'
+      //   this.personnel.companyName = '测试单位';
+      // }
+      if(!this.personnel.userName || !this.personnel.idCard || !this.personnel.companyName || !this.personnel.imgFile){
+        this.$toast('请完善人员信息');
         return;
       }
       let strObj = JSON.parse(JSON.stringify(this.personnel));
+      //判断是否已添加
+      let flag  = this.pList.some(v=> {return v.idCard === strObj.idCard});
+      if(flag) {
+        this.$toast('该人员信息已添加');
+        return;
+      };
+      strObj.uuid = `${new Date().getTime()}`;
       this.pList.push(strObj);
       this.personnel = {
         userName:null,
@@ -342,10 +388,15 @@ export default {
     cancelPicker(){
       this.showPicker = false;
     },
-    preView(imgs) {
-      let arr = imgs.map(v=>{return v.imgPath});
-      console.log(arr,'imgs')
-      ImagePreview(arr)
+    preView(val) {
+      if(Array.isArray(val)){
+        let arr = val.map(v=>{
+          return imgUrl(v.imgPath);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
     },
   }
 }
@@ -452,6 +503,11 @@ export default {
     }
   }
 }
+.tip-text{
+  line-height: 60px;
+  color:red;
+  background-color: #fff;
+}
 .big-btn-box{
   padding-bottom: 20px;
 }

+ 27 - 14
src/views/menu/visitRegister/detail.vue

@@ -20,26 +20,22 @@
             <van-cell title="出入事由" :value="visitInfo.reasons"></van-cell>
             <van-cell title="访问日期" :value="visitInfo.startTimeStr"></van-cell>
             <van-cell title="结束日期" :value="visitInfo.endTimeStr"></van-cell>
-            <div class="upload-box" v-if="visitInfo.letterFile && visitInfo.letterFile.length > 0">
-              <span>介绍信文件</span>
-              <van-cell>
-                <div
-                  class="nfc-img van-hairline--surround"
-                  v-for="(v, i) in visitInfo.letterFile"
-                  :key="v.imgPath"
-                  @click="preView(v.imgPath)">
-                  <img :src="imgUrl(v.imgPath)" alt="" />
+            <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>
-                <!--                      <img class="nfc-img" v-for="v in item.imgData" :src="imgUrl(v.imgPath)" alt="" :key="v.id">-->
-              </van-cell>
-            </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="card" v-for="(v,i) in userInfos" :key="v.id">
           <div class="goods-card">
            <div class="card-img-box" v-if="v.imgFile && v.imgFile.length > 0" @click="preView(v.imgFile)">
              <img :src="imgUrl(v.imgFile[0])" alt="">
@@ -120,8 +116,19 @@ export default {
         this.userInfos = users;
       })
     },
+    previewFile(file){
+      console.log(file,'file')
+      this.openFilePreview(file);
+    },
     preView(val) {
-      ImagePreview(val);
+      if(Array.isArray(val)){
+       let arr = val.map(v=>{
+          return imgUrl(v);
+        })
+        ImagePreview(arr);
+      }else {
+        ImagePreview([imgUrl(val)]);
+      }
     },
   }
 }
@@ -227,6 +234,12 @@ export default {
 .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;

+ 15 - 8
src/views/menu/visitRegister/index.vue

@@ -2,10 +2,10 @@
   <div class="visitRegister">
     <NavBar />
     <div class="page-container">
-      <van-search v-model="query.reasons" class="van-hairline--bottom" placeholder="请输入出入事由" @change="refreshData" />
+      <van-search v-model="query.reasons" class="van-hairline--bottom" placeholder="请输入来访事由" @change="refreshData" />
       <select-cell
         style="border-right: 1px solid #f5f5f5;"
-        title="出入类型"
+        title="介绍信类型"
         :isAll="true"
         :border="false"
         :isRow="true"
@@ -37,15 +37,15 @@
                       <div class="item-value"> {{v.letterNo}}</div>
                     </div>
                     <div class="info-item">
-                      <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-label">来访事由:</div>
                       <div class="item-value">
                           {{v.reasons}}
                       </div>
                     </div>
+                    <div class="info-item">
+                      <div class="item-label">{{v.type == 2? '介绍信有效期': '出入期限'}}</div>
+                      <div class="item-value">{{v.startTime}}~{{v.endTime}}</div>
+                    </div>
                   </div>
                 </template>
               </van-cell>
@@ -94,7 +94,7 @@ export default {
       },
       typeList:[
         {
-          name:'临时出入',
+          name:'纸质',
           value:2
         },
         {
@@ -105,6 +105,13 @@ export default {
       dicts:['out_in_approve_status','out_in_type']
     }
   },
+  beforeRouteEnter(to,from,next){
+    next(vm=>{
+      if(to.params.event === 'refresh'){
+        vm.refreshData();
+      }
+    })
+  },
   mounted() {
     this.initData();
   },