| <template> | 
|   <view class="main_app"> | 
|     <view class="status_wrap"> | 
|       <view class="name">{{ info.createMemberName }}提交的访客报备</view> | 
|       <view | 
|         class="desc" | 
|         :class="{ | 
|           gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '4', | 
|         }" | 
|         >{{ info.info }}</view | 
|       > | 
|       <view v-if="info.businessStatus == '0' || info.businessStatus == '1'" class="status">{{ | 
|         statusMap[info.businessStatus] | 
|       }}</view> | 
|       <image v-if="info.businessStatus == '2'" src="@/static/ic_passed@2x.png" mode="widthFix" class="status_img"></image> | 
|       <image v-if="info.businessStatus == '3' || info.businessStatus == '6'" src="@/static/ic_refused@2x.png" mode="widthFix" | 
|         class="status_img"></image> | 
|     </view> | 
|     <!--  --> | 
|     <view class="emyty"></view> | 
|     <view class="module_list"> | 
|       <view class="item"> | 
|         <view class="label">被访人</view> | 
|         <view class="value">{{ info.receptMemberName }} {{ info.receptMemberDepartment }}</view> | 
|       </view> | 
|       <view class="item"> | 
|         <view class="label">预计入/离园时间</view> | 
|         <view class="value" v-if="info.starttime">{{ info.starttime.slice(5, 16) }} 至 | 
|           {{ info.endtime.slice(5, 16) }}</view> | 
|       </view> | 
|       <view class="emyty"></view> | 
|   | 
|       <view class="item"> | 
|         <view class="label">联系人信息</view> | 
|         <view class="value">{{ info.name }} {{ info.phone }}</view> | 
|       </view> | 
|       <view class="item"> | 
|         <view class="label">入园车辆</view> | 
|         <view class="value">{{ info.carNos }}</view> | 
|       </view> | 
|       <view class="item"> | 
|         <view class="label">随车人数</view> | 
|         <view class="value">{{ info.memberNum }}人</view> | 
|       </view> | 
|       <view class="item"> | 
|         <view class="label">访客单位</view> | 
|         <view class="value">{{ info.companyName }}</view> | 
|       </view> | 
|       <view class="item"> | 
|         <view class="label">来访事由</view> | 
|         <view class="value">{{ info.reason }}</view> | 
|       </view> | 
|     </view> | 
|     <!-- 流程 --> | 
|     <view class="flow_wrap"> | 
|       <view class="flow_title">流程</view> | 
|       <view class="list" v-if=" | 
|         info.approveDateVO != null && info.approveDateVO.approveList != null | 
|       "> | 
|         <view class="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id"> | 
|           <view class="separate"></view> | 
|           <view class="avatar"> | 
|             <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" /> | 
|             <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img" | 
|               src="@/static/staff/ic_shenpiren@2x.png" /> | 
|                         <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image> | 
|             <span v-else class="img_name">{{ item.memberName && item.memberName.slice(0, 1) }}</span> | 
|             <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png" | 
|               mode="widthFix" /> | 
|             <image v-if="item.status == 3" class="status" src="@/static/staff/liucheng_fail@2x.png" mode="widthFix" /> | 
|           </view> | 
|           <view class="content"> | 
|             <view class="head"> | 
|               <view class="event">{{ item.title }}</view> | 
|               <view class="time">{{ item.checkDate }}</view> | 
|             </view> | 
|             <view class="name_wrap"> | 
|               <text>{{ item.memberName | 
|                 }}<text :class="{ status: item.statusInfo == '处理中' || item.status == '1' }" v-if="item.statusInfo">({{ | 
|                   item.statusInfo }})</text></text> | 
|             </view> | 
|             <view v-if="item.checkInfo" class="remark">{{ | 
|               item.checkInfo | 
|               }}</view> | 
|             <!-- 抄送人 --> | 
|             <view v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="children"> | 
|               <view class="child" v-for="child in item.approveList" :key="child.id"> | 
|                 <image v-if="child.faceImg" class="child_img" :src="child.faceImg" /> | 
|                 <view v-else class="child_name">{{ child.memberName && child.memberName.slice(0, 1) }}</view> | 
|                 <view>{{ child.memberName }}</view> | 
|               </view> | 
|             </view> | 
|           </view> | 
|         </view> | 
|       </view> | 
|     </view> | 
|     <view class="emyty"></view> | 
|     <view v-if=" | 
|       info.approveDateVO != null && | 
|       info.approveDateVO.canBeApproved != null && | 
|       info.approveDateVO.canBeApproved == 1 | 
|     " class="main_footer"> | 
|       <view class="btn" @click="cancelShow = true" v-if="checkAuth('business:visits:cancel') && [0,1,2,5].includes(info.status)">取消预约</view> | 
|       <view style="width: 30rpx; height: 100%;"></view> | 
|       <view class="btn" @click="handleSub(3)">拒绝</view> | 
|       <view style="width: 30rpx; height: 100%;"></view> | 
|       <view class="btn agree" @click="handleSub(2)">同意</view> | 
|     </view> | 
|   | 
|     <u-popup :show="showApprModal" :round="10" :safeAreaInsetBottom="true" mode="bottom" @close="showApprModal = false"> | 
|       <view class="appr_modal"> | 
|         <view class="title">{{ param.status == 2 ? "同意" : "拒绝" }}</view> | 
|         <textarea v-model="param.checkInfo" :placeholder="param.status == 2 ? '同意说明,非必填' : '拒绝说明,必填' | 
|           " placeholder-class="placeholder9" /> | 
|         <view class="main_footer"> | 
|           <view class="btn" @click="showApprModal = false">取消</view> | 
|           <view style="width: 30rpx; height: 100%;"></view> | 
|           <view class="btn agree" @click="onSubmit">提交</view> | 
|         </view> | 
|       </view> | 
|     </u-popup> | 
|     <!-- 取消预约弹窗 --> | 
|     <u-modal | 
|         :show="cancelShow" | 
|         :showCancelButton="true" | 
|         title="系统提示" | 
|         content='确定取消当前预约吗?' | 
|         @cancel="cancelShow = false" | 
|         @confirm="cancel" /> | 
|   </view> | 
| </template> | 
|   | 
| <script> | 
| import { | 
|   getVisitedReDetail, // 访客预约详情 | 
|   carUseBookAppr, | 
|   visitsCancel | 
| } from '@/api' | 
| export default { | 
|   data() { | 
|     return { | 
|       showApprModal: false, | 
|       param: {}, | 
|       info: {}, | 
|       userInfo: uni.getStorageSync('userInfo') || { | 
|           permissions: [] | 
|       }, | 
|   | 
|       id: '', | 
|       type: '', | 
|       infoStatus: '', | 
|       cateList: [ | 
|         { name: '访客申请', id: 0 }, | 
|         { name: '访客报备', id: 1 }, | 
|         { name: '用车申请', id: 2 }, | 
|         { name: '隐患随手拍', id: 3 }, | 
|         { name: '物流车申请', id: 4 }, | 
|       ], | 
|       statusMap: { | 
|         0: '待审批', | 
|         1: '审批中', | 
|         2: '已通过', | 
|         3: '已拒绝', | 
|         4: '已取消', | 
|       }, | 
|       cancelShow: false | 
|     } | 
|   }, | 
|   onLoad(op) { | 
|         uni.setStorageSync('ywinfo',{}) | 
|     this.id = op.id | 
|     this.getDetail() | 
|   }, | 
|   methods: { | 
|       checkAuth(str) { | 
|           const permissions = this.userInfo.permissions || [] | 
|           return permissions.indexOf(str) > -1 | 
|       }, | 
|       // 取消预约 | 
|       cancel() { | 
|           visitsCancel(this.id).then(res => { | 
|               this.cancelShow = false | 
|               this.getDetail() | 
|           }) | 
|       }, | 
|     getDetail() { | 
|       const { id } = this | 
|       getVisitedReDetail({ id }).then(res => { | 
|         this.info = res.data | 
|         if (this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0) { | 
|           this.info.approveDateVO.approveList.forEach(item => { | 
|             if (item.approveList && item.approveList.length == 1 && item.type !== 1) { | 
|               item.title = item.approveList[0].title | 
|               item.faceImg = item.approveList[0].faceImg | 
|               item.memberName = item.approveList[0].memberName | 
|               item.statusInfo = item.approveList[0].statusInfo | 
|               item.status = item.approveList[0].status | 
|               item.approveList = [] | 
|             } | 
|           }) | 
|         } | 
|       }) | 
|     }, | 
|     onSubmit() { | 
|       const { param, info } = this | 
|       if (param.status == '3' && !param.checkInfo) { | 
|         return uni.showToast({ | 
|           title: '请输入拒绝说明', | 
|           icon: 'none' | 
|         }) | 
|       } | 
|       carUseBookAppr({ | 
|         status: param.status, | 
|         objType: 2, | 
|         objId: this.id, | 
|         // driverId: param.driverId, | 
|         checkInfo: param.checkInfo | 
|       }).then(res => { | 
|         if (res.code === 200) { | 
|           this.showApprModal = false | 
|           setTimeout(() => { | 
|             uni.showToast({ | 
|               title: '操作成功', | 
|               icon: 'success' | 
|             }) | 
|           }) | 
|           uni.navigateBack() | 
|         } | 
|       }) | 
|     }, | 
|     handleSub(status) { | 
|       // this.param.flag =  | 
|       this.param = { | 
|         status | 
|       } | 
|       this.showApprModal = true | 
|       this.showApprModal = true | 
|     }, | 
|   }, | 
| } | 
| </script> | 
| <style> | 
| page { | 
|   background-color: #f7f7f7; | 
| } | 
| </style> | 
| <style lang="scss"> | 
| .main_app { | 
|   background-color: #fff; | 
|   padding-bottom: 0; | 
|   | 
|   .flow_wrap { | 
|       padding: 30rpx 0; | 
|    | 
|       .flow_title { | 
|           font-weight: 600; | 
|           font-size: 32rpx; | 
|           color: #222222; | 
|           margin-bottom: 24rpx; | 
|       } | 
|    | 
|       .list { | 
|           .item { | 
|               display: flex; | 
|               margin-bottom: 48rpx; | 
|               position: relative; | 
|    | 
|               .separate { | 
|                   position: absolute; | 
|                   width: 4rpx; | 
|                   height: 100%; | 
|                   background-color: #eeeeee; | 
|                   left: 40rpx; | 
|                   transform: translate(-50%, 0); | 
|                   top: 80rpx; | 
|               } | 
|    | 
|               .avatar { | 
|                   width: 80rpx; | 
|                   height: 80rpx; | 
|                   position: relative; | 
|                   margin-right: 20rpx; | 
|                   display: flex; | 
|                   align-items: center; | 
|                   justify-content: center; | 
|    | 
|                   .img { | 
|                       width: 80rpx; | 
|                       height: 80rpx; | 
|                       border-radius: 50%; | 
|                   } | 
|    | 
|                   .img_name { | 
|                       font-size: 32rpx; | 
|                       color: #FFFFFF; | 
|                   } | 
|    | 
|                   .status { | 
|                       width: 28rpx; | 
|                       height: 28rpx; | 
|                       border-radius: 50%; | 
|                       position: absolute; | 
|                       right: 0; | 
|                       bottom: 0; | 
|                   } | 
|               } | 
|    | 
|               .content { | 
|                   flex: 1; | 
|    | 
|                   .head { | 
|                       display: flex; | 
|                       justify-content: space-between; | 
|                       margin-bottom: 4rpx; | 
|    | 
|                       .event { | 
|                           font-size: 30rpx; | 
|                       } | 
|    | 
|                       .time { | 
|                           font-size: 26rpx; | 
|                           color: #999999; | 
|                       } | 
|                   } | 
|    | 
|                   .name_wrap { | 
|                       font-size: 26rpx; | 
|                       color: #777777; | 
|    | 
|                       .status { | 
|                           color: $uni-color-primary; | 
|                       } | 
|                   } | 
|    | 
|                   .children { | 
|                       display: flex; | 
|                       flex-wrap: wrap; | 
|                       margin-top: 12rpx; | 
|    | 
|                       .child { | 
|                           display: flex; | 
|                           flex-direction: column; | 
|                           justify-content: center; | 
|                           align-items: center; | 
|                           margin-right: 12rpx; | 
|                           font-size: 26rpx; | 
|                           color: #777777; | 
|    | 
|                           .child_img { | 
|                               width: 48rpx; | 
|                               height: 48rpx; | 
|                               border-radius: 50%; | 
|                               margin-bottom: 2rpx; | 
|                           } | 
|    | 
|                           .child_name { | 
|                               margin-bottom: 2rpx; | 
|                               width: 48rpx; | 
|                               height: 48rpx; | 
|                               text-align: center; | 
|                               justify-content: center; | 
|                               padding-top: 4rpx; | 
|                               font-size: 28rpx; | 
|                               border-radius: 50%; | 
|                               color: #FFFFFF; | 
|                               background-color: $uni-color-primary; | 
|                           } | 
|                       } | 
|                   } | 
|    | 
|                   .remark { | 
|                       margin-top: 12rpx; | 
|                       background-color: #f7f7f7; | 
|                       padding: 14rpx 20rpx; | 
|                       border-radius: 8rpx; | 
|                       font-size: 26rpx; | 
|                       color: #666666; | 
|                       line-height: 36rpx; | 
|                   } | 
|               } | 
|    | 
|               .carbon { | 
|                   display: flex; | 
|                   width: 590rpx; | 
|                   overflow-x: auto; | 
|                   margin-top: 12rpx; | 
|    | 
|                   .carbon_item { | 
|                       text-align: center; | 
|                       flex-shrink: 0; | 
|                       width: 100rpx; | 
|    | 
|                       image { | 
|                           width: 60rpx; | 
|                           height: 60rpx; | 
|                           margin: 0 auto; | 
|                       } | 
|    | 
|                       view { | 
|                           font-size: 26rpx; | 
|                           color: #777777; | 
|                       } | 
|                   } | 
|               } | 
|    | 
|               &:nth-last-child(1) { | 
|                   .separate { | 
|                       height: 0; | 
|                   } | 
|               } | 
|           } | 
|       } | 
|   } | 
|   | 
|   .module_list { | 
|     .item { | 
|       padding: 30rpx 0; | 
|       border-bottom: 1rpx solid #e5e5e5; | 
|   | 
|       .label { | 
|         font-size: 26rpx; | 
|         color: #666666; | 
|         margin-bottom: 20rpx; | 
|       } | 
|   | 
|       .value { | 
|         font-size: 30rpx; | 
|         display: flex; | 
|         align-items: center; | 
|   | 
|         .avatar { | 
|           margin-right: 20rpx; | 
|           width: 120rpx; | 
|           height: 120rpx; | 
|           border-radius: 8rpx; | 
|           border: 2rpx solid #e5e5e5; | 
|         } | 
|   | 
|         .info { | 
|           flex: 1; | 
|           display: flex; | 
|           flex-direction: column; | 
|           justify-content: space-between; | 
|           font-size: 26rpx; | 
|           color: #666666; | 
|   | 
|           .name { | 
|             font-size: 30rpx; | 
|             color: #333333; | 
|           } | 
|         } | 
|       } | 
|     } | 
|   } | 
|   | 
|   .status_wrap { | 
|     position: relative; | 
|     padding: 30rpx 0; | 
|   | 
|     .name { | 
|       font-weight: 600; | 
|       font-size: 32rpx; | 
|       margin-bottom: 20rpx; | 
|       color: #222222; | 
|     } | 
|   | 
|     .desc { | 
|       font-size: 26rpx; | 
|       color: #ed4545; | 
|     } | 
|   | 
|     .gray { | 
|       color: #999999; | 
|     } | 
|   | 
|     .status { | 
|       position: absolute; | 
|       right: -30rpx; | 
|       top: 0; | 
|       height: 60rpx; | 
|       line-height: 60rpx; | 
|       padding: 0 32rpx; | 
|       border-radius: 0rpx 0rpx 0rpx 30rpx; | 
|       background-color: #e9edff; | 
|       color: $uni-color-primary; | 
|     } | 
|   | 
|     .status_img { | 
|       position: absolute; | 
|       right: 0rpx; | 
|       top: 20rpx; | 
|       width: 120rpx; | 
|     } | 
|   } | 
|   | 
|   .main_footer { | 
|     padding-bottom: 64rpx; | 
|     display: flex; | 
|     justify-content: space-between; | 
|     width: 100%; | 
|     left: 0; | 
|     display: flex; | 
|     justify-content: space-between; | 
|     background: #ffffff; | 
|   | 
|     .btn { | 
|       // width: 336rpx; | 
|       flex: 1; | 
|       height: 88rpx; | 
|       line-height: 88rpx; | 
|       background: #ffffff; | 
|       border-radius: 44rpx; | 
|       border: 1rpx solid #999999; | 
|       font-size: 32rpx; | 
|       text-align: center; | 
|       margin: 16rpx 0; | 
|     } | 
|   | 
|     .agree { | 
|       background: $uni-color-primary; | 
|       color: #fff; | 
|       border: 1rpx solid $uni-color-primary; | 
|     } | 
|   } | 
|   | 
|   .appr_modal { | 
|     padding: 36rpx 30rpx 0; | 
|   | 
|     .title { | 
|       font-weight: 600; | 
|       font-size: 32rpx; | 
|       color: #222222; | 
|       margin-bottom: 40rpx; | 
|       text-align: center; | 
|     } | 
|   | 
|     textarea { | 
|       box-sizing: border-box; | 
|       width: 690rpx; | 
|       background-color: #f7f7f7; | 
|       font-size: 28rpx; | 
|       color: #333333; | 
|       padding: 24rpx; | 
|       border-radius: 8rpx; | 
|       margin-bottom: 30rpx; | 
|     } | 
|   } | 
|   | 
|   .emyty { | 
|     width: 750rpx; | 
|     height: 20rpx; | 
|     background-color: #f7f7f7; | 
|     margin: 0 -30rpx; | 
|   } | 
| } | 
| </style> |