From 69a1b3bf45738f048361ee4ccb6bdc64fce35720 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 12 三月 2025 11:31:46 +0800
Subject: [PATCH] 更新

---
 h5/pages/staff/visitorReport.vue |  718 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 718 insertions(+), 0 deletions(-)

diff --git a/h5/pages/staff/visitorReport.vue b/h5/pages/staff/visitorReport.vue
new file mode 100644
index 0000000..4431d4e
--- /dev/null
+++ b/h5/pages/staff/visitorReport.vue
@@ -0,0 +1,718 @@
+<template>
+  <view class="visit">
+    <view class="list">
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>琚浜哄鍚�</text>
+        </view>
+        <!-- <view class="list_item_content" @click="showName = true"> -->
+        <view class="list_item_content">
+          <text :style="{ color: form1.receptMemberName ? '#000000' : '' }">{{
+            form1.receptMemberName
+              ? form1.receptMemberName + " " + form1.receptCompanyName
+              : "璇烽�夋嫨"
+          }}</text>
+          <!-- <u-icon name="arrow-right" color="#CCCCCC" size="20"></u-icon> -->
+        </view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鍏ュ洯鏃堕棿</text>
+        </view>
+        <view class="list_item_content" @click="show4 = true">
+          <text :style="{ color: form1.starttime ? '#000000' : '' }">{{
+            form1.starttime ? form1.starttime : "璇烽�夋嫨"
+          }}</text>
+          <u-icon name="arrow-right" color="#CCCCCC" size="20"></u-icon>
+        </view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>绂诲洯鏃堕棿</text>
+        </view>
+        <view class="list_item_content" @click="openLC">
+          <text :style="{ color: form1.endtime ? '#000000' : '' }">{{
+            form1.endtime ? form1.endtime : "璇烽�夋嫨"
+          }}</text>
+          <u-icon name="arrow-right" color="#CCCCCC" size="20"></u-icon>
+        </view>
+      </view>
+      <div class="empty"></div>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鑱旂郴浜�</text>
+        </view>
+        <view class="list_item_content"
+          ><input
+            type="text"
+            v-model="form1.name"
+            placeholder="璇疯緭鍏ヨ仈绯讳汉濮撳悕"
+            placeholder-style="color: #999999;"
+        /></view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鎵嬫満鍙�</text>
+        </view>
+        <view class="list_item_content">
+          <input
+            type="number"
+            maxlength="13"
+            v-model="form1.phone"
+            :placeholder="'璇疯緭鍏ヨ仈绯讳汉鎵嬫満鍙�'"
+            placeholder-style="color: #999999;"
+          />
+        </view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鏉ヨ鍗曚綅</text>
+        </view>
+        <view class="list_item_content"
+          ><input
+            type="text"
+            v-model="form1.companyName"
+            placeholder="璇疯緭鍏ユ潵璁垮崟浣嶇殑鍏ㄧО"
+            placeholder-style="color: #999999;"
+        /></view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鍏ュ洯杞﹁締</text>
+        </view>
+        <view class="list_item_content" @click="openInput(1)">
+          <text :style="{ color: form1.carNos ? '#000000' : '' }">{{
+            form1.carNos ? form1.carNos : "璇疯緭鍏ヨ溅鐗屽彿鐮�"
+          }}</text>
+          <!-- <input type="text" placeholder="璇疯緭鍏ヨ溅鐗屽彿" v-model="form1.carNos" maxlength="8" placeholder-style="color: #999999;" /> -->
+        </view>
+      </view>
+      <view class="list_item">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>闅忚溅浜烘暟</text>
+        </view>
+        <view class="list_item_content"
+          ><input
+            type="number"
+            v-model="form1.memberNum"
+            placeholder="璇疯緭鍏ラ殢杞︿汉鍛樻�绘暟"
+            placeholder-style="color: #999999;"
+        /></view>
+      </view>
+      <view class="list_item" @click="isShowReason = true">
+        <view class="list_item_label">
+          <text>*</text>
+          <text>鏉ヨ浜嬬敱</text>
+        </view>
+				<view class="list_item_content">
+				  <text
+				    class="mr6"
+				    :style="{ color: form1.reason ? '#000000' : '#999999' }"
+				    >{{ form1.reason ? form1.reason : "璇烽�夋嫨" }}</text
+				  >
+				  <u-icon name="arrow-right" color="#CCCCCC" size="20"></u-icon>
+				</view>
+        <!-- <view class="list_item_content"
+          ><input
+            type="text"
+            v-model="form1.reason"
+            placeholder="璇疯緭鍏ユ潵璁夸簨鐢�"
+            placeholder-style="color: #999999;"
+        /></view> -->
+      </view>
+    </view>
+    <view class="zw"></view>
+    <view class="footer"
+      ><view class="footer_btn" @click="submit">鎻愪氦</view></view
+    >
+    <!-- 鍏ュ洯鏃堕棿 -->
+    <u-datetime-picker
+      :show="show4"
+      :minDate="new Date().getTime()"
+      mode="datetime"
+			:formatter="formatter"
+      @cancel="show4 = false"
+      @confirm="setinDate"
+    ></u-datetime-picker>
+    <!-- 绂诲洯鏃堕棿 -->
+    <u-datetime-picker
+      v-if="form1.starttime"
+      :show="show5"
+			:formatter="formatter"
+      :minDate="formatTimeStamp(form1.starttime)"
+      :maxDate="formatTimeStamp(maxTime)"
+      mode="datetime"
+      @cancel="show5 = false"
+      @confirm="setoutDate"
+    ></u-datetime-picker>
+    <!-- 杞﹁締 -->
+    <u-popup
+      :show="show2"
+      :round="10"
+      :safeAreaInsetBottom="true"
+      :closeable="true"
+      mode="bottom"
+      @close="show2 = false"
+    >
+      <view class="addcar">
+        <view class="addcar_head">娣诲姞杞﹁締</view>
+        <view class="addcar_ipt"
+          ><input type="text" v-model="carName" placeholder="璇疯緭鍏ヨ溅鐗屽彿"
+        /></view>
+        <view class="addcar_footer">
+          <view class="addcar_footer_item" @click="show2 = false">鍙栨秷</view>
+          <view class="addcar_footer_item t" @click="submitCart">鎻愪氦</view>
+        </view>
+      </view>
+    </u-popup>
+		<!-- 鏉ヨ鏄敱 -->
+		<u-picker
+		  keyName="title"
+		  :show="isShowReason"
+		  closeOnClickOverlay
+		  :columns="reasonList"
+		  @confirm="reasonSel"
+		  @close="isShowReason = false"
+		  @cancel="isShowReason = false"
+		></u-picker>
+		
+    <u-picker
+      keyName="name"
+      :show="showName"
+      closeOnClickOverlay
+      :columns="memberList"
+      @confirm="seleteName"
+      @cancel="showName = false"
+      @close="showName = false"
+    ></u-picker>
+    <!-- <tly-picture-cut ref="tlyPictureCut" :pictureSrc="photoSrc" @createImg="uploadImg"></tly-picture-cut> -->
+    <keyboardInput ref="keyboard" @export="setPlate" @close="closeInput" />
+    <qf-image-cropper
+      ref="cropper"
+      :width="280"
+      :height="280"
+      :radius="30"
+      @crop="uploadImg"
+    ></qf-image-cropper>
+  </view>
+</template>
+
+<script>
+import tlyPictureCut from '@/components/tly-picture-cut/tlyPictureCut.vue'
+import keyboardInput from '@/components/keyboard-input/keyboard-input.vue'
+import QfImageCropper from '@/uni_modules/qf-image-cropper/components/qf-image-cropper/qf-image-cropper.vue'
+import { getDaysAfterDate } from '@/utils/utils.js'
+import { createVisit, getVisitedMember, getVisitReason } from '@/api'
+export default {
+  data() {
+    return {
+      photoSrc: '',
+      type: '',
+      inputType: '',
+      show1: false,
+      show2: false,
+      show4: false,
+      show5: false,
+      show7: false,
+      isShowReason: false,
+      showName: false,
+      fileList: [],
+			reasonList: [],
+      memberList: [[{ name: '韬唤璇�', id: 0 }, { name: '娓境璇佷欢', id: 1 }, { name: '鎶ょ収', id: 2 }]],
+      columnsNames: [[{ name: '寮犱笁', id: 0 }, { name: '寮犱笁', id: 1 }, { name: '寮犱笁', id: 2 }]],
+      columns: [],
+      cars: [],
+      day: null,
+      maxTime: '',
+      carName: '',
+      personnel: [],
+      userAnswerId: '',
+      form1: {
+        receptMemberId: '',
+        receptMemberName: '',
+        starttime: '',
+        endtime: '',
+        reason: '',
+        carNos: ''
+      },
+      visit: '',
+      form: {},
+      accessControl: '',
+      verify: ''
+    }
+  },
+  components: { tlyPictureCut, keyboardInput, QfImageCropper },
+  onLoad(options) {
+    if (options.data) {
+      this.form = JSON.parse(options.data)
+    }
+    this.getUser()
+    const userInfo = uni.getStorageSync('userInfo') || {}
+    this.$set(this.form1, 'receptMemberName', userInfo.realname)
+    this.$set(this.form1, 'receptMemberId', userInfo.id || '')
+    this.$set(this.form1, 'receptCompanyName', userInfo.company.name || '')
+    // this.getvisit()
+    // this.getVisit1()
+    // this.getUserValid()
+  },
+  methods: {
+		formatter(type, value) {
+			if (type === 'year') {
+				return `${value}骞碻
+			}
+			if (type === 'month') {
+				return `${value}鏈坄
+			}
+			if (type === 'day') {
+				return `${value}鏃
+			}
+			if (type === 'hour') {
+				return `${value}鏃禶
+			}
+			if (type === 'minute') {
+				return `${value}鍒哷
+			}
+			return value
+		},
+    openInput(type) {
+      this.inputType = type
+      this.$refs.keyboard.open()
+    },
+    setPlate(e) {
+      if (this.inputType === 1) {
+        this.form1.carNos = e
+      } else if (this.inputType === 2) {
+        this.withUserList.carNos = e
+      }
+      this.$forceUpdate()
+      this.closeInput()
+    },
+    seleteName(e) {
+      this.$set(this.form1, 'receptMemberName', e.value[0].name)
+      this.$set(this.form1, 'receptMemberId', e.value[0].id)
+      this.$set(this.form1, 'receptCompanyName', e.value[0].companyName)
+      this.showName = false
+    },
+		reasonSel(e) {
+			console.log('e',e);
+			this.$set(this.form1, 'reason', e.value[0].title)
+			this.isShowReason = false
+		},
+    getUser() {
+      getVisitedMember().then(res => {
+        this.memberList = [res.data || []]
+      })
+			getVisitReason().then(res => {
+				this.reasonList = [res.data || []]
+			})
+    },
+    closeInput() {
+      this.$refs.keyboard.close()
+    },
+    submit() {
+      const { form1 } = this
+      if (!this.form1.receptMemberId)
+        return uni.showToast({
+          title: '璇烽�夋嫨鏈夋晥鐨勮璁夸汉',
+          icon: 'none'
+        })
+      if (!this.form1.starttime)
+        return uni.showToast({
+          title: '鍏ュ洯鏃堕棿涓嶈兘涓虹┖',
+          icon: 'none'
+        })
+      if (!this.form1.endtime)
+        return uni.showToast({
+          title: '绂诲洯鏃堕棿涓嶈兘涓虹┖',
+          icon: 'none'
+        })
+      if (!this.form1.name) return uni.showToast({
+        title: '鑱旂郴浜轰笉鑳戒负绌�',
+        icon: 'none'
+      })
+      if (!this.form1.phone) return uni.showToast({
+        title: '鎵嬫満鍙蜂笉鑳戒负绌�',
+        icon: 'none'
+      })
+      var re = /^1[3,4,5,6,7,8,9][0-9]{9}$/;
+		  var result = re.test(this.form1.phone);
+      if (!result) return uni.showToast({
+        title: '鎵嬫満鍙锋牸寮忎笉姝g‘',
+        icon: 'none'
+      }) 
+      if (!this.form1.companyName) return uni.showToast({
+        title: '鏉ヨ鍗曚綅涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      if (!this.form1.carNos) return uni.showToast({
+        title: '鍏ュ洯杞﹁締涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      if (!this.form1.memberNum) return uni.showToast({
+        title: '闅忚溅浜烘暟涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      if (!this.form1.reason) return uni.showToast({
+        title: '鎷滆浜嬬敱涓嶈兘涓虹┖',
+        icon: 'none'
+      })
+      // this.form1.starttime = this.form1.starttime + ':00'
+      // this.form1.endtime = this.form1.endtime + ':00'
+      let data = JSON.parse(JSON.stringify(this.form1))
+      data.starttime = data.starttime + ':00'
+      data.endtime = data.endtime + ':00'
+      createVisit({
+        ...data,
+        type: '2',
+        openid: this.$store.state.openId
+      })
+        .then(res => {
+          if (res.code === 200) {
+            setTimeout(() => {
+              uni.showToast({
+                title: '鎻愪氦鎴愬姛',
+                icon: 'success'
+              })
+            })
+            uni.reLaunch({
+              url: `/pages/staff/index`
+            })
+          }
+        })
+    },
+    deleUser(i) {
+      this.personnel.splice(i, 1)
+    },
+    getVisit1() {
+      // 鏄惁闇�瑕佺瓟棰�
+      this.$u.api
+        .getSystemDictData({
+          dictCode: 'SYSTEM',
+          label: 'HEALTH_CARD'
+        })
+        .then(res => {
+          if (res.code === 200) {
+            this.visit = res.data.code
+          }
+        })
+      // 璧峰鏃堕棿鏃堕暱
+      this.$u.api
+        .getSystemDictData({
+          dictCode: 'VISIT_CONFIG',
+          label: 'VALIDATE_VISIT'
+        })
+        .then(res => {
+          if (res.code === 200) {
+            this.day = Number(res.data.code)
+            // console.log(nextDay('after', true, this.day))
+          }
+        })
+    },
+    submitCart() {
+      if (!this.carName)
+        return uni.showToast({
+          title: '璇疯緭鍏ヨ溅鐗屽彿鐮�',
+          icon: 'none'
+        })
+      this.cars.push(this.carName)
+      this.form1.carNos = this.cars.join(',')
+      this.carName = ''
+      this.show2 = false
+    },
+    deleCars(i) {
+      this.cars.splice(i, 1)
+      this.form1.carNos = this.cars.join(',')
+    },
+    seleMJ(i) {
+      this.columns.forEach((item, index) => {
+        if (index === i) {
+          item.active = !item.active
+        }
+      })
+    },
+    openLC() {
+      if (!this.form1.starttime)
+        return uni.showToast({
+          title: '璇峰厛閫夋嫨鍏ュ洯鏃堕棿',
+          icon: 'none'
+        })
+      this.show5 = true
+    },
+    setinDate(e) {
+      this.form1.starttime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
+      // this.maxTime = getDaysAfterDate(uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM'), this.day)
+      this.maxTime = this.form1.starttime.slice(0, 11) + '23:59'
+      this.form1.endtime = ''
+      this.show4 = false
+    },
+    setoutDate(e) {
+      this.form1.endtime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
+      this.show5 = false
+    },
+    formatTimeStamp(date) {
+      return Date.parse(new Date(`${date}`)) || Date.parse(new Date(`${date.replace(/-/g, '/')}`))
+    },
+    // 琚嫓璁夸汉淇℃伅鏍¢獙鏂瑰紡锛�0鎵嬫満鍙峰崟鐙牎楠� 1鎵嬫満鍙峰拰濮撳悕缁勫悎鏍¢獙锛�
+    getUserValid() {
+      this.$u.api
+        .getSystemDictData({
+          dictCode: 'SYSTEM',
+          label: 'BEVISITED_USER_VALID'
+        })
+        .then(res => {
+          if (res.code === 200) {
+            this.verify = res.data.code
+          }
+        })
+    },
+    // 鑾峰彇鏄惁闇�瑕侀�夋嫨闂ㄧ/闂ㄧ鍒楄〃
+    getvisit() {
+      this.$u.api
+        .getSystemDictData({
+          dictCode: 'SYSTEM',
+          label: 'SELECT_DOORS_VISIT_REQUIRED'
+        })
+        .then(res => {
+          if (res.code === 200) {
+            this.accessControl = res.data.code
+            if (res.data.code === '1') {
+              this.$u.api.deviceRoleList({ type: 1 }).then(device => {
+                if (device.code === 200) {
+                  if (device.data.length > 0) {
+                    device.data.forEach(item => {
+                      item.active = false
+                    })
+                    this.columns = device.data
+                  }
+                }
+              })
+            }
+          }
+        })
+    }
+  }
+};
+</script>
+<style lang="scss">
+page {
+  background-color: #f7f7f7 !important;
+}
+.u-upload__button {
+  margin: 0 !important;
+}
+</style>
+<style lang="scss" scoped>
+.visit {
+  width: 100%;
+  padding-top: 10rpx 0;
+  .menjin {
+    width: 100%;
+    .respondent-title {
+      width: 100%;
+      height: 100rpx;
+      line-height: 100rpx;
+      text-align: center;
+      font-size: 32rpx;
+      font-weight: 600;
+      color: #222222;
+    }
+    .list {
+      width: 100%;
+      height: 400rpx;
+      display: flex;
+      flex-direction: column;
+      .list_item {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        text {
+          font-size: 28rpx;
+          color: #000000;
+        }
+        image {
+          width: 30rpx;
+          height: 30rpx;
+        }
+      }
+    }
+    .menjin_footer {
+      width: 100%;
+      padding: 30rpx;
+      box-sizing: border-box;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .menjin_footer_item {
+        flex: 1;
+        height: 80rpx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-radius: 10rpx;
+        background-color: #025eef;
+        color: #ffffff;
+        font-size: 26rpx;
+        margin-left: 30rpx;
+        &:first-child {
+          margin-left: 0 !important;
+        }
+      }
+    }
+  }
+
+  .addcar {
+    padding: 30rpx;
+    width: 100%;
+    box-sizing: border-box;
+    .addcar_head {
+      text-align: center;
+      font-size: 32rpx;
+      font-family: PingFangSC, PingFang SC;
+      font-weight: 600;
+      color: #222222;
+    }
+    .addcar_ipt {
+      width: 100%;
+      height: 100rpx;
+      line-height: 100rpx;
+      text-align: center;
+      background: #f7f7f7;
+      border-radius: 50rpx;
+      margin-top: 60rpx;
+      input {
+        width: 100%;
+        height: 100%;
+        font-size: 28rpx;
+        font-weight: 400;
+        color: #000000;
+        text-align: center;
+      }
+    }
+    .addcar_footer {
+      width: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin-top: 60rpx;
+      .t {
+        background: #025eef !important;
+        color: #ffffff !important;
+      }
+      .addcar_footer_item {
+        flex: 1;
+        height: 88rpx;
+        line-height: 88rpx;
+        font-size: 32rpx;
+        font-weight: 400;
+        color: #025eef;
+        text-align: center;
+        border-radius: 44rpx;
+        border: 1rpx solid #025eef;
+        margin-right: 18rpx;
+        &:last-child {
+          margin-right: 0 !important;
+        }
+      }
+    }
+  }
+  .list {
+    width: 100%;
+    padding: 0 30rpx;
+    box-sizing: border-box;
+    background-color: #ffffff;
+    .empty {
+      width: 750rpx;
+      height: 20rpx;
+      background-color: #f7f7f7;
+      margin: 0 -30rpx;
+    }
+    .list_item {
+      width: 100%;
+      // min-height: 98rpx;
+      padding: 30rpx 0;
+      box-sizing: border-box;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border-bottom: 1rpx solid #e5e5e5;
+
+      .list_item_label {
+        flex-shrink: 0;
+        display: flex;
+        align-items: center;
+
+        text {
+          &:nth-child(2) {
+            font-size: 30rpx;
+            font-weight: 400;
+            color: #222222;
+          }
+
+          &:nth-child(1) {
+            font-size: 30rpx;
+            font-weight: 400;
+            color: #e42d2d;
+          }
+        }
+      }
+
+      .list_item_content {
+        flex: 1;
+        height: 100%;
+        margin-left: 30rpx;
+        display: flex;
+        align-items: center;
+        justify-content: flex-end;
+
+        text {
+          font-size: 28rpx;
+          font-weight: 400;
+          color: #999999;
+          margin-right: 6rpx;
+        }
+
+        input {
+          width: 100%;
+          height: 100%;
+          text-align: right;
+          font-size: 28rpx;
+          font-weight: 400;
+          color: #222222;
+        }
+      }
+    }
+  }
+
+  .zw {
+    width: 100%;
+    height: calc(env(safe-area-inset-bottom) + 118rpx);
+  }
+
+  .footer {
+    width: 100%;
+    padding: 0 30rpx;
+    padding-bottom: env(safe-area-inset-bottom);
+    box-sizing: border-box;
+		margin-top: 80rpx;
+    .footer_btn {
+      width: 100%;
+      height: 88rpx;
+      line-height: 88rpx;
+      text-align: center;
+      background: $uni-color-primary;
+      border-radius: 44rpx;
+      font-size: 32rpx;
+      color: #ffffff;
+    }
+  }
+}
+</style>

--
Gitblit v1.9.3