You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1924 lines
54 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<page-meta
:page-style="
'overflow:' +
(adminListShow || configshow || areaShow ? 'hidden' : 'visible')
"
></page-meta>
<view class="containers">
<!-- 拜访须知 -->
<u-popup
:show="configshow"
:mask-close-able="false"
class="configwrap"
mode="bottom"
>
<view class="configtitle">
{{ configInfo.name }}
</view>
<view class="configvalue">
<view v-html="configInfo.value"> </view>
<view style="text-align: center">
<view class="configbtn" @click="closeConfig">
<view>确认/Confirm</view>
</view>
</view>
</view>
</u-popup>
<!-- 普通访客 先选择区域 -->
<u-popup :show="areaShow" class="configwrap" mode="bottom">
<view class="configtitle label-with-en">
<view>前往区域</view>
<view class="en-text">Visit Area</view>
</view>
<block v-if="visitArea.length > 0">
<view class="configvalue areavalue">
<uni-data-checkbox
mode="button"
@change="changeVisitArea"
v-model="form.visit_area_id"
:localdata="visitArea"
:map="{ text: 'name', value: 'id' }"
/>
</view>
<button
class="areabtn button-with-en"
@click="closeArea"
size="large"
type="primary"
>
<view>确认/Confirm</view>
</button>
</block>
<view class="configvalue configload" v-else>
<view class="label-with-en">
<text>数据加载中...</text>
<text class="en-text">Loading data...</text>
</view>
<u-icon
@click="getVisitArea"
name="reload"
color="#2979ff"
size="28"
></u-icon>
</view>
</u-popup>
<view class="steps">
<uni-steps :options="steps" :active="stepActive" active-color="#4f607e" />
</view>
<uni-forms ref="formdata" :model="form" :rules="rules" labelWidth="140px">
<view class="formtext label-with-en">
<view>拜访信息</view>
<view class="en-text">Visit Information</view>
</view>
<uni-forms-item required name="start_date">
<template slot="label">
<view class="label-with-en-inline">
<text>开始日期</text>
<text class="en-text">Start Date</text>
</view>
</template>
<uni-datetime-picker
type="date"
:start="toadyStart"
return-type="string"
v-model="form.start_date"
@change="onStartDateChange"
style="width: 100%"
/>
</uni-forms-item>
<uni-forms-item required name="end_date">
<template slot="label">
<view class="label-with-en-inline">
<text>结束日期</text>
<text class="en-text">End Date</text>
</view>
</template>
<uni-datetime-picker
type="date"
:start="toadyStart"
return-type="string"
v-model="form.end_date"
@change="onEndDateChange"
style="width: 100%"
/>
</uni-forms-item>
<uni-forms-item required name="time">
<template slot="label">
<view class="label-with-en-inline">
<text>到访时间</text>
<text class="en-text">Time</text>
</view>
</template>
<uni-data-select
v-model="form.time"
:localdata="timeOptions"
placeholder="请选择时间 / Please select time"
@change="onTimeChange"
/>
</uni-forms-item>
<!-- <uni-forms-item required name="visit_time_id">
<template slot="label">
<view class="label-with-en-inline">
<text>到访时段</text>
<text class="en-text">Visit Time</text>
</view>
</template>
<uni-data-checkbox
v-model="form.visit_time_id"
:localdata="visitTime"
:map="{ text: 'visitTimeRange', value: 'id' }"
/>
</uni-forms-item> -->
<uni-forms-item required name="visit_area_id">
<template slot="label">
<view class="label-with-en-inline">
<text>前往区域</text>
<text class="en-text">Visit Area</text>
</view>
</template>
<uni-data-checkbox
@change="changeVisitArea"
v-model="form.visit_area_id"
:localdata="visitArea"
:map="{ text: 'name', value: 'id' }"
/>
</uni-forms-item>
<uni-forms-item v-if="form.type == 1">
<template slot="label">
<view class="label-with-en-inline">
<text>到访事由</text>
<text class="en-text">Visit Reason</text>
</view>
</template>
<uni-data-select v-model="form.reason" :localdata="reasonList">
</uni-data-select>
</uni-forms-item>
<uni-forms-item v-if="form.type == 2">
<template slot="label">
<view class="label-with-en-inline">
<text>施工开始时段</text>
<text class="en-text">Construction Start Time</text>
</view>
</template>
<uni-datetime-picker
type="date"
:start="toadyStart"
return-type="string"
v-model="form.work_start_time"
/>
</uni-forms-item>
<uni-forms-item v-if="form.type == 2">
<template slot="label">
<view class="label-with-en-inline">
<text>施工结束时段</text>
<text class="en-text">Construction End Time</text>
</view>
</template>
<uni-datetime-picker
type="date"
:start="toadyStart"
return-type="string"
v-model="form.work_end_time"
/>
</uni-forms-item>
<!-- <uni-forms-item label="车牌号" v-if="form.type==3"> -->
<uni-forms-item required name="plate" v-if="form.type == 3">
<template slot="label">
<view class="label-with-en-inline">
<text>车辆类型</text>
<text class="en-text">Vehicle Type</text>
</view>
</template>
<uni-data-checkbox
v-model="form.plate"
:localdata="parkAreaList"
:map="{ text: 'value', value: 'value' }"
/>
</uni-forms-item>
<uni-forms-item>
<template slot="label">
<view class="label-with-en-inline">
<text>备注</text>
<text class="en-text">Remark</text>
</view>
</template>
<uni-easyinput
type="textarea"
v-model="form.remark"
placeholder="请输入自我备注 / Please enter remarks"
/>
</uni-forms-item>
<view
class="formtext"
style="
display: flex;
justify-content: space-between;
align-items: center;
"
>
<view class="label-with-en" style="flex: 1">
<text>拜访人信息</text>
<text class="en-text">Visitor Information</text>
</view>
<button
style="background-color: #4f607e !important"
type="primary"
size="mini"
@click="pullVisitorInfo"
class="button-mini-with-en"
>
<view>拉取拜访人信息</view>
<view class="en-text">Pull Visitor Info</view>
</button>
</view>
<uni-forms-item required name="name">
<template slot="label">
<view class="label-with-en-inline">
<text>姓名</text>
<text class="en-text">Name</text>
</view>
</template>
<uni-easyinput
v-model="form.name"
placeholder="请输入姓名 / Please enter name"
/>
</uni-forms-item>
<uni-forms-item required name="mobile">
<template slot="label">
<view class="label-with-en-inline">
<text>联系电话</text>
<text class="en-text">Phone Number</text>
</view>
</template>
<uni-easyinput
v-model="form.mobile"
placeholder="请输入联系电话 / Please enter phone number"
/>
</uni-forms-item>
<uni-forms-item required name="credent">
<template slot="label">
<view class="label-with-en-inline">
<text>证件类型</text>
<text class="en-text">ID Type</text>
</view>
</template>
<uni-data-select v-model="form.credent" :localdata="credentList">
</uni-data-select>
</uni-forms-item>
<uni-forms-item required name="idcard" v-if="form.credent == 1">
<template slot="label">
<view class="label-with-en-inline">
<text>证件号码</text>
<text class="en-text">ID Card Number</text>
</view>
</template>
<uni-easyinput
type="idcard"
v-model="form.idcard"
placeholder="请输入证件号码 / Please enter ID card number"
/>
</uni-forms-item>
<uni-forms-item required name="passcard" v-if="form.credent == 2">
<template slot="label">
<view class="label-with-en-inline">
<text>护照号码</text>
<text class="en-text">Passport Number</text>
</view>
</template>
<uni-easyinput
type="text"
v-model="form.passcard"
placeholder="请输入证件号码 / Please enter passport number"
/>
</uni-forms-item>
<uni-forms-item required name="company_name">
<template slot="label">
<view class="label-with-en-inline">
<text>单位名称</text>
<text class="en-text">Company Name</text>
</view>
</template>
<uni-easyinput
v-model="form.company_name"
placeholder="请输入单位名称 / Please enter company name"
/>
</uni-forms-item>
<!-- <uni-forms-item required name="cda" v-if="form.type==1&&visitAreaText=='生产区'">
<template slot="label">
<view class="label-with-en-inline">
<text>CDA编号</text>
<text class="en-text">CDA Number</text>
</view>
</template>
<uni-easyinput type='textarea' v-model="form.cda" placeholder="请输入CDA编号(如无注明原因) / Please enter CDA number (if none, specify reason)" />
</uni-forms-item> -->
<uni-forms-item v-if="form.type != 3">
<template slot="label">
<view class="label-with-en-inline">
<text>到访车辆</text>
<text class="en-text">Visiting Vehicles</text>
</view>
</template>
<view style="text-align: right">
<button
style="background-color: #4f607e"
type="primary"
size="mini"
@click="form.cars.push('')"
class="button-mini-with-en"
>
<view>新增车辆</view>
<view class="en-text">Add Vehicle</view>
</button>
</view>
<view
v-for="(item, index) in form.cars"
:key="index"
class="justify-between align-center"
style="margin-bottom: 20rpx"
>
<uni-easyinput
disabled
@tap="(plateShow = true), (carindex = index)"
v-model.trim="form.cars[index]"
placeholder="请输入到访车辆 / Please enter license plate"
/>
<view
@click="form.cars.splice(index, 1)"
style="color: red; margin-left: 20rpx"
class="label-with-en-inline-del"
>
<text>删除</text>
<text class="en-text">Delete</text>
</view>
</view>
<plate-input
v-if="plateShow"
:plate="form.cars[carindex]"
@export="setCars"
@close="plateShow = false"
/>
</uni-forms-item>
<uni-forms-item required name="cars" v-else>
<template slot="label">
<view class="label-with-en-inline">
<text>到访车辆</text>
<text class="en-text">Visiting Vehicles</text>
</view>
</template>
<view style="text-align: right">
<button
style="background-color: #4f607e"
type="primary"
size="mini"
@click="form.cars.push('')"
class="button-mini-with-en"
>
<view>新增车辆</view>
<view class="en-text">Add Vehicle</view>
</button>
</view>
<view
v-for="(item, index) in form.cars"
:key="index"
class="justify-between align-center"
style="margin-bottom: 20rpx"
>
<uni-easyinput
disabled
@tap="(plateShow = true), (carindex = index)"
v-model.trim="form.cars[index]"
placeholder="请输入到访车辆 / Please enter license plate"
/>
<view
@click="form.cars.splice(index, 1)"
style="color: red; margin-left: 20rpx"
class="label-with-en-inline-del"
>
<text>删除</text>
<text class="en-text">Delete</text>
</view>
</view>
<plate-input
v-if="plateShow"
:plate="form.cars[carindex]"
@export="setCars"
@close="plateShow = false"
/>
</uni-forms-item>
<template v-if="form.type != 3">
<view
class="formtext"
style="display: flex; justify-content: space-between"
>
<view class="label-with-en">
<text>随访人员</text>
<text class="en-text">Follow-up Personnel</text>
</view>
<button
style="background-color: #4f607e !important"
type="primary"
size="mini"
@click="
$refs.showRight.open(),
(follw_people_obj = { credent: 1 }),
(follow_people_index = -1)
"
class="button-mini-with-en"
>
<view>新增随访人员</view>
<view class="en-text">Add Personnel</view>
</button>
</view>
<!-- 随访人员表格 -->
<template>
<uni-table ref="table" border emptyText="暂无更多数据 / No more data">
<uni-tr>
<uni-th width="160" align="center">
<view class="label-with-en-table">
<text>操作</text>
<text class="en-text">Action</text>
</view>
</uni-th>
<uni-th width="120" align="center">
<view class="label-with-en-table">
<text>姓名</text>
<text class="en-text">Name</text>
</view>
</uni-th>
<uni-th width="120" align="left">
<view class="label-with-en-table">
<text>联系电话</text>
<text class="en-text">Phone</text>
</view>
</uni-th>
<uni-th width="120" align="center">
<view class="label-with-en-table">
<text>证件类型</text>
<text class="en-text">ID Type</text>
</view>
</uni-th>
<uni-th width="120" align="left">
<view class="label-with-en-table">
<text>证件号码</text>
<text class="en-text">ID Number</text>
</view>
</uni-th>
</uni-tr>
<uni-tr
style="vertical-align: middle"
v-for="(item, index) in form.follw_people"
:key="index"
>
<uni-td>
<view class="uni-group">
<view
@click="editFollwPeople(index)"
style="color: #4f607e; margin-right: 8px"
class="label-with-en-inline-del"
>
<text>修改</text>
<text class="en-text">Edit</text>
</view>
<view
@click="form.follw_people.splice(index, 1)"
style="color: red; margin-right: 8px"
class="label-with-en-inline-del"
>
<text>删除</text>
<text class="en-text">Delete</text>
</view>
</view>
</uni-td>
<uni-td>{{ item.name }}</uni-td>
<uni-td>
<view class="name">{{ item.mobile }}</view>
</uni-td>
<uni-td align="center">{{
item.credent == 1 ? "身份证 / ID Card" : "护照 / Passport"
}}</uni-td>
<uni-td align="center">{{ item.idcard }}</uni-td>
</uni-tr>
</uni-table>
</template>
</template>
<!-- <uni-forms-item label="长访客申请">
<uni-data-checkbox v-model="form.long_time" :localdata="longList" :map="{text:'value',value:'id'}" />
</uni-forms-item>
<template v-if="form.long_time==1">
<uni-forms-item label="开始日期">
<uni-datetime-picker type="date" :start="toadyStart" return-type="string"
v-model="form.start_date" />
</uni-forms-item>
<uni-forms-item label="结束日期">
<uni-datetime-picker type="date" :start="toadyStart" return-type="string" v-model="form.end_date" />
</uni-forms-item>
</template> -->
<view
class="formtext label-with-en"
v-if="form.type == 1 || form.type == 2"
>
<view>被访人信息</view>
<view class="en-text">Host Information</view>
</view>
<uni-forms-item
required
name="acceptName"
v-if="form.type == 1 || form.type == 2"
>
<template slot="label">
<view class="label-with-en-inline">
<text>被访人</text>
<text class="en-text">Host</text>
</view>
</template>
<uni-easyinput
@clear="clearAccept('accept')"
disabled
v-model="form.acceptName"
@tap="adminListShowOpen('accept')"
placeholder="请选择联系人员 / Please select contact person"
/>
</uni-forms-item>
<view class="formtext label-with-en" v-if="form.type == 3">
<view>被访人信息</view>
<view class="en-text">Consignee Information</view>
</view>
<uni-forms-item v-if="form.type == 3" required name="goodsName">
<template slot="label">
<view class="label-with-en-inline">
<text>被访人</text>
<text class="en-text">Consignee</text>
</view>
</template>
<uni-easyinput
@clear="clearAccept('goods')"
disabled
v-model="form.goodsName"
@tap="adminListShowOpen('goods')"
placeholder="请选择联系人员 / Please select contact person"
/>
</uni-forms-item>
<!-- <view class="formtext label-with-en" v-if="visitAreaText=='生产区'">
<view>陪同人信息</view>
<view class="en-text">Accompanying Personnel Information</view>
</view>
<uni-forms-item required name="accompanyName" v-if="visitAreaText=='生产区'">
<template slot="label">
<view class="label-with-en-inline">
<text>陪同人</text>
<text class="en-text">Accompanying Personnel</text>
</view>
</template>
<uni-easyinput @clear="clearAccept('accompany')" disabled v-model="form.accompanyName"
@tap="adminListShowOpen('accompany')" placeholder="请选择联系人员 / Please select contact person" />
</uni-forms-item> -->
<qianziyu-select
:show="adminListShow"
type="radio"
:popupTitle="'联系人员/Contact Personnel'"
name="cworkStationName"
:dataLists="adminList"
placeholder="输入联系人具体姓名或手机号搜索"
@search="selectSearch"
@submit="submitAccept"
placeholderEnText="请输入联系人具体姓名或手机号搜索/Enter name or phone number to search"
@cancel="cancelAccept"
/>
</uni-forms>
<button
type="primary"
style="background-color: #4f607e !important"
@click="getStudy"
class="button-with-en-submit"
>
<view>{{ goStudy }} / Submit</view>
<!-- <view class="en-text"></view> -->
</button>
<!-- 随访人员弹出 -->
<uni-drawer ref="showRight" mode="right" :mask-click="true" :width="320">
<uni-forms
ref="peopleform"
:model="follw_people_obj"
:rules="peoplerules"
labelWidth="80px"
>
<uni-forms-item required name="name">
<template slot="label">
<view class="label-with-en-inline">
<text>姓名</text>
<text class="en-text">Name</text>
</view>
</template>
<uni-easyinput
v-model="follw_people_obj.name"
placeholder="请输入姓名 / Please enter name"
/>
</uni-forms-item>
<uni-forms-item required name="mobile">
<template slot="label">
<view class="label-with-en-inline">
<text>联系电话</text>
<text class="en-text">Phone Number</text>
</view>
</template>
<uni-easyinput
v-model="follw_people_obj.mobile"
placeholder="请输入联系电话 / Please enter phone number"
/>
</uni-forms-item>
<uni-forms-item required name="credent">
<template slot="label">
<view class="label-with-en-inline">
<text>证件类型</text>
<text class="en-text">ID Type</text>
</view>
</template>
<uni-data-select
@change="chooseCredent"
v-model="follw_people_obj.credent"
:localdata="credentList"
>
</uni-data-select>
</uni-forms-item>
<uni-forms-item
required
name="idcard"
v-if="follw_people_obj.credent == 1"
>
<template slot="label">
<view class="label-with-en-inline">
<text>证件号码</text>
<text class="en-text">ID Card Number</text>
</view>
</template>
<uni-easyinput
type="idcard"
v-model="follw_people_obj.idcard"
placeholder="请输入证件号码 / Please enter ID card number"
/>
</uni-forms-item>
<uni-forms-item
required
name="passcard"
v-if="follw_people_obj.credent == 2"
>
<template slot="label">
<view class="label-with-en-inline">
<text>护照号码</text>
<text class="en-text">Passport Number</text>
</view>
</template>
<uni-easyinput
type="text"
v-model="follw_people_obj.passcard"
placeholder="请输入证件号码 / Please enter passport number"
/>
</uni-forms-item>
</uni-forms>
<view class="uni-group" style="text-align: right;display: flex;justify-content: space-between;">
<button @click="closeDrawer" size="mini" class="button-mini-with-en">
<view>取消/Cancel</view>
</button>
<button
@click="pushFollowPeople"
size="mini"
type="primary"
style="background-color: #4f607e !important; margin-left: 8px"
class="button-mini-with-en"
>
<view>确认/Confirm</view>
</button>
</view>
</uni-drawer>
</view>
</template>
<script>
import plateInput from "@/uni_modules/uni-plate-input/uni-plate-input.vue";
import qianziyuSelect from "@/components/qianziyu-select/qianziyu-select.vue";
export default {
components: {
plateInput,
qianziyuSelect,
},
data() {
return {
steps: [
{
title: "填报\nRegistration",
},
{
title: "学习\nStudy",
},
{
title: "完成\nComplete",
},
],
stepActive: 0,
configshow: false,
areaShow: false,
configInfo: {},
configKey: "ptfk",
toadyStart: "",
dateRange: [],
carindex: 0,
plateShow: false,
adminListShow: false,
adminKeyword: "",
acceptType: "",
acceptName: "",
goodsName: "",
visitAreaText: "",
timeOptions: [],
form: {
type: 1,
date: "",
visit_time_id: "",
time: "",
visit_area_id: "",
reason: "",
plate: "",
remark: "",
name: "",
mobile: "",
credent: 1,
idcard: "",
passcard: "",
company_name: "",
cars: [],
follw_people: [],
long_time: 0,
start_date: "",
end_date: "",
accompany_id: "",
accpet_department_id: "",
accept_admin_id: "",
accept_goods_admin_id: "",
acceptName: "",
goodsName: "",
accompanyName: "",
},
follw_people_obj: {
name: "",
mobile: "",
credent: 1,
idcard: "",
},
follow_people_index: -1,
rules: {
start_date: {
rules: [
{
required: true,
errorMessage: "请选择开始日期 / Please select start date",
},
],
},
end_date: {
rules: [
{
required: true,
errorMessage: "请选择结束日期 / Please select end date",
},
],
},
visit_time_id: {
rules: [
{
required: true,
errorMessage: "请选择拜访时段 / Please select visit time",
},
],
},
visit_area_id: {
rules: [
{
required: true,
errorMessage: "请选择前往区域 / Please select visit area",
},
],
},
time: {
rules: [
{
required: true,
errorMessage: "请选择具体时间 / Please select time",
},
],
},
plate: {
rules: [
{
required: true,
errorMessage: "请填写车辆 / Please select vehicle type",
},
],
},
name: {
rules: [
{
required: true,
errorMessage: "姓名不能为空 / Name cannot be empty",
},
],
},
mobile: {
rules: [
{
required: true,
errorMessage: "联系电话不能为空 / Phone number cannot be empty",
},
{
pattern: "^[1][3-9][\\d]{9}",
errorMessage: "联系号码格式错误 / Invalid phone number format",
},
],
},
credent: {
rules: [
{
required: true,
errorMessage: "请选择身份证类型 / Please select ID type",
},
],
},
idcard: {
rules: [
{
required: true,
errorMessage:
"身份证号码不能为空 / ID card number cannot be empty",
},
{
pattern:
"^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]",
errorMessage: "身份证格式错误 / Invalid ID card format",
},
],
},
// passcard: {
// rules: [
// {
// required: true,
// errorMessage:
// "护照号码不能为空 / Passport number cannot be empty",
// },
// {
// pattern: "/^([a-zA-z]|[0-9]){5,17}$/",
// errorMessage: "护照格式错误 / Invalid passport format",
// },
// ],
// },
company_name: {
rules: [
{
required: true,
errorMessage: "单位名称不能为空 / Company name cannot be empty",
},
],
},
// cda: {
// rules: [{
// required: true,
// errorMessage: 'CDA编号不能为空 / CDA number cannot be empty'
// }]
// },
cars: {
rules: [
{
required: true,
errorMessage: "车辆不能为空 / License plate cannot be empty",
},
],
},
acceptName: {
rules: [
{
required: true,
errorMessage: "请选择被访人 / Please select host",
},
],
},
// accompanyName: {
// rules: [{
// required: true,
// errorMessage: '请选择陪同人 / Please select accompanying personnel'
// }]
// },
goodsName: {
rules: [
{
required: true,
errorMessage: "请选择被访人 / Please select consignee",
},
],
},
},
peoplerules: {
name: {
rules: [
{
required: true,
errorMessage:
"随访人姓名不能为空 / Follower name cannot be empty",
},
],
},
mobile: {
rules: [
{
required: true,
errorMessage: "联系电话不能为空 / Phone number cannot be empty",
},
{
pattern: "^[1][3-9][\\d]{9}",
errorMessage: "联系号码格式错误 / Invalid phone number format",
},
],
},
credent: {
rules: [
{
required: true,
errorMessage: "请选择身份证类型 / Please select ID type",
},
],
},
idcard: {
rules: [
{
required: true,
errorMessage:
"身份证号码不能为空 / ID card number cannot be empty",
},
{
pattern:
"^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]",
errorMessage: "身份证格式错误 / Invalid ID card format",
},
],
},
// passcard: {
// rules: [
// {
// required: true,
// errorMessage:
// "护照号码不能为空 / Passport number cannot be empty",
// },
// {
// pattern: "/^([a-zA-z]|[0-9]){5,17}$/",
// errorMessage: "护照格式错误 / Invalid passport format",
// },
// ],
// },
},
// 单选数据源
visitTime: [],
visitArea: [],
reasonList: [],
parkAreaList: [],
credentList: [
{
value: 1,
text: "身份证 / ID Card",
},
{
value: 2,
text: "护照 / Passport",
},
],
longList: [
{
id: 0,
value: "否",
},
{
id: 1,
value: "是",
},
],
adminList: [],
isCall: "", // 是否待邀约
goStudy: "提交",
isStudy: false,
};
},
onLoad(options) {
// uni.navigateTo({
// url:'/pages/visit/testStudy?type=3'
// })
// return
this.toadyStart = new Date();
this.form.type = options.type;
//this.areaShow = options.type == 1 ? true : false
this.configKey =
options.type == 1 ? "ptfk" : options.type == 2 ? "sgfk" : "wlcl";
this.isCall = options.iscall ? options.iscall : "";
// this.goStudy = this.isCall == 'call' ? '提交' : ''
this.form.audit_status = this.isCall == "call" ? 1 : 0;
// 只有 施工需要提醒
if (options.type == 2) {
this.showStudy();
}
// if (options.type == 2 || options.type == 3) {
this.getConfig();
// }
this.init();
// 设置默认日期为当天
const today = new Date().toISOString().split("T")[0];
this.form.start_date = today;
this.form.end_date = today;
this.form.date = today;
this.form.long_time = 0;
if (uni.getStorageSync("formdata")) {
this.form = uni.getStorageSync("formdata");
if (!this.form.time) {
this.form.time = "";
}
}
// this.getAdminList()
},
onReady() {},
methods: {
init() {
this.getVisitArea();
this.getVisitTime();
this.getReason();
this.getPark();
},
adminListShowOpen(type) {
this.acceptType = type;
this.adminKeyword = "";
// this.getAdminList()
this.adminListShow = true;
},
cancelAccept() {
console.log("123");
this.adminKeyword = "";
this.adminList = [];
this.adminListShow = false;
},
selectSearch(e) {
this.adminKeyword = e;
this.getAdminList();
},
clearAccept(type) {
if (type == "accept") {
this.form.accept_admin_id = "";
this.form.acceptName = "";
} else if (type == "goods") {
this.form.accept_goods_admin_id = "";
this.form.goodsName = "";
} else {
this.form.accompany_id = "";
this.form.accompanyName = "";
}
},
submitAccept(e) {
console.log(e);
this.form.accompany_id = e.id;
this.form.accompanyName = e.name;
if (this.acceptType == "accept") {
this.form.accept_admin_id = e.id;
this.form.accpet_department_id = e.department_id;
this.form.acceptName = e.name;
// if (this.visitAreaText == '非生产区'||this.visitAreaText == '研发R&D') {
// this.form.accompany_id = e.id
// this.form.accompanyName = e.name
// }
} else if (this.acceptType == "goods") {
this.form.accept_goods_admin_id = e.id;
this.form.accept_admin_id = e.id;
this.form.accpet_department_id = e.department_id;
this.form.goodsName = e.name;
// if (this.visitAreaText == '非生产区'||this.visitAreaText == '研发R&D') {
// this.form.accompany_id = e.id
// this.form.accompanyName = e.name
// }
} else {
this.form.accompany_id = e.id;
this.form.accompanyName = e.name;
}
this.adminListShow = false;
},
setCars(e) {
this.form.cars[this.carindex] = e;
this.plateShow = false;
console.log(e, this.carindex);
},
closeConfig() {
this.configshow = false;
},
closeArea() {
if (!this.form.visit_area_id) {
this.util.alert("请先选择前往区域 / Please select visit area first");
return;
}
if (this.visitAreaText == "生产区") {
this.configKey = "ptfk";
this.getConfig();
this.areaShow = false;
} else if (this.visitAreaText == "研发R&D") {
this.configKey = "ptfk";
this.getConfig();
this.areaShow = false;
} else {
this.configKey = "ptfk";
this.getConfig();
this.areaShow = false;
}
},
async getConfig() {
let that = this;
// util.request()
this.util.request({
api: "/api/mobile/user/config",
data: {
page: 1,
page_size: 99,
},
// requestType: 'bd',
utilSuccess: function (res) {
console.log(res);
let data = res;
for (let k of data) {
if (k.key == that.configKey) {
that.configInfo = k;
}
}
that.configshow = true;
},
utilFail: function (res) {},
});
},
// 获取单选数据
getVisitArea() {
let that = this;
// that.visitArea = [{
// name: '非生产区',
// id: 3
// }, {
// name: '生产区',
// id: 4
// }, {
// name: "研发R&D",
// id: 5
// }]
this.util.request({
api: "/api/mobile/visit/visit-area",
data: {},
utilSuccess: function (res) {
console.log(res);
that.visitArea = res;
},
utilFail: function (res) {},
});
},
changeVisitArea(e) {
console.log(e);
this.visitAreaText = e.detail.data.name;
},
onTimeChange(e) {
const selected =
(e && e.detail && e.detail.value) ||
(typeof e === "string" ? e : "") ||
this.form.time;
if (!selected) {
return;
}
this.form.time = selected;
this.matchVisitTimeId(selected);
},
matchVisitTimeId(timeStr) {
if (!timeStr || !this.visitTime || this.visitTime.length === 0) {
return;
}
const current = this.timeToMinutes(timeStr);
if (current === null) {
return;
}
const endMatch = this.visitTime.find(
(item) => this.timeToMinutes(item.end_time) === current
);
if (endMatch) {
this.form.visit_time_id = endMatch.id;
return;
}
const rangeMatch = this.visitTime.find((item) => {
const start = this.timeToMinutes(item.start_time);
const end = this.timeToMinutes(item.end_time);
return start !== null && end !== null && current >= start && current < end;
});
if (rangeMatch) {
this.form.visit_time_id = rangeMatch.id;
}
},
generateTimeOptions(list) {
if (!list || list.length === 0) {
return [];
}
const startMinutes = list
.map((item) => this.timeToMinutes(item.start_time))
.filter((item) => item !== null);
const endMinutes = list
.map((item) => this.timeToMinutes(item.end_time))
.filter((item) => item !== null);
if (!startMinutes.length || !endMinutes.length) {
return [];
}
const minTime = Math.min(...startMinutes);
const maxTime = Math.max(...endMinutes);
const options = [];
const step = 30;
for (let minutes = minTime; minutes <= maxTime; minutes += step) {
const timeText = this.minutesToTime(minutes);
options.push({
text: timeText,
value: timeText,
});
}
const maxText = this.minutesToTime(maxTime);
if (!options.find((option) => option.value === maxText)) {
options.push({
text: maxText,
value: maxText,
});
}
return options;
},
timeToMinutes(timeStr) {
if (!timeStr || typeof timeStr !== "string") {
return null;
}
const parts = timeStr.split(":");
if (parts.length !== 2) {
return null;
}
const hour = parseInt(parts[0], 10);
const minute = parseInt(parts[1], 10);
if (isNaN(hour) || isNaN(minute)) {
return null;
}
return hour * 60 + minute;
},
minutesToTime(minutes) {
if (typeof minutes !== "number") {
return "";
}
const hour = Math.floor(minutes / 60)
.toString()
.padStart(2, "0");
const minute = (minutes % 60).toString().padStart(2, "0");
return `${hour}:${minute}`;
},
getVisitTime() {
let that = this;
// util.request()
this.util.request({
api: "/api/mobile/visit/visit-time",
data: {},
utilSuccess: function (res) {
for (var m of res) {
m.visitTimeRange = m.start_time + "-" + m.end_time;
}
console.log(res);
that.visitTime = res;
that.timeOptions = that.generateTimeOptions(res);
if (!that.form.time && that.timeOptions.length > 0) {
that.form.time = that.timeOptions[0].value;
}
if (that.form.time) {
that.matchVisitTimeId(that.form.time);
}
},
utilFail: function (res) {},
});
},
getReason() {
let that = this;
// util.request()
this.util.request({
api: "/api/admin/parameter/show",
data: {
number: "reasonList",
},
utilSuccess: function (res) {
let arr = [];
console.log(res);
for (var m of res.detail) {
arr.push({
text: m.value,
value: m.value,
});
}
that.reasonList = arr;
},
utilFail: function (res) {},
});
},
getPark() {
let that = this;
// util.request()
this.util.request({
api: "/api/admin/parameter/show",
data: {
number: "parkArea",
},
utilSuccess: function (res) {
that.parkAreaList = res.detail;
},
utilFail: function (res) {},
});
},
async getAdminList() {
let that = this;
// util.request()
this.util.request({
api: "/api/admin/other/admin-user-list",
data: {
page_size: 99,
page: 1,
keyword: this.adminKeyword,
},
utilSuccess: function (res) {
that.adminList = res.data;
},
utilFail: function (res) {},
});
},
//
chooseCredent(e) {
console.log(e);
},
// 随访人员弹出
editFollwPeople(index) {
this.follow_people_index = index;
this.follw_people_obj = this.form.follw_people[index];
this.$refs.showRight.open();
},
closeDrawer() {
this.follw_people_obj = {};
this.follow_people_index = -1;
this.$refs.showRight.close();
},
pushFollowPeople() {
console.log("this.follw_people_obj", this.follw_people_obj);
if (this.follw_people_obj.credent == 2) {
this.follw_people_obj.idcard = this.follw_people_obj.passcard;
}
this.$refs["peopleform"]
.validate()
.then((res) => {
if (this.follow_people_index > -1) {
this.form.follw_people[this.follow_people_index] =
this.follw_people_obj;
} else {
this.form.follw_people.push(this.follw_people_obj);
}
this.follow_people_index = -1;
this.$refs.showRight.close();
})
.catch((err) => {
console.log("err", err);
});
},
// 去学习
// 获取访客学习状态
async showStudy() {
this.util.alert(
"请确保每位访客都已通过学习培训,方可提交拜访 / Please ensure all visitors have completed the training before submitting the visit"
);
// let that = this
// let id_arr = []
// id_arr.push(this.form.idcard)
// for(var k of this.form.follw_people){
// id_arr.push(k.idcard)
// }
// this.util.request({
// api: '/api/mobile/visit/ask-log',
// method: "post",
// data:{
// type:that.form.type
// },
// utilSuccess: function(res) {
// console.log("res",res)
// if(res.msg=='学习有效中'){
// uni.showToast({
// title: '请确保随访人员都已通过学习培训方可提交拜访',
// duration: 2000,
// icon: 'none'
// })
// that.isStudy = true
// that.goStudy = '提交'
// }
// },
// utilFail: function(res) {
// // console.log(res)
// // uni.showToast({
// // title: res,
// // duration: 2000,
// // icon: 'none'
// // })
// }
// })
},
// 获取随访人员的 学习记录
async getStudy() {
let that = this;
// 护照类型提交前需要同步证件号码
if (this.form.credent == 2) {
this.form.idcard = this.form.passcard;
}
// 确保date字段设置为start_date
if (this.form.start_date) {
this.form.date = this.form.start_date;
}
this.$refs["formdata"]
.validate()
.then(() => {
let id_arr = [];
if (this.form.idcard) {
id_arr.push(this.form.idcard);
}
for (var k of this.form.follw_people) {
if (k.idcard) {
id_arr.push(k.idcard);
}
}
// 普通访客和物流司机只需要表单校验,不需要学习校验
if (this.form.type == 1 || this.form.type == 3) {
if (that.isCall === "call") {
that.submitForm();
} else {
that.submitNoStudy();
}
return;
}
this.util.request({
api: "/api/mobile/visit/idcard-check",
method: "post",
data: {
idcard: id_arr,
},
utilSuccess: function (res) {
if (res.length > 0) {
let str =
res.join("") + "未完成学习培训 / Not completed training";
that.util.alert(str);
uni.setStorageSync("formdata", that.form);
} else {
if (that.isCall === "call") {
that.submitForm();
} else {
that.submitNoStudy();
}
}
},
utilFail: function (res) {
uni.showToast({
title: res,
duration: 2000,
icon: "none",
});
},
});
})
.catch((err) => {
console.log("err", err);
});
},
saveFormgoStudy() {
if (this.form.credent == 2) {
this.form.idcard = this.form.passcard;
}
// 确保date字段设置为start_date
if (this.form.start_date) {
this.form.date = this.form.start_date;
}
this.$refs["formdata"]
.validate()
.then((res) => {
console.log("form", this.form);
// return
if (this.isCall === "call") {
this.submitForm();
return;
}
if (this.isStudy) {
this.submitNoStudy();
} else {
uni.setStorageSync("formdata", this.form);
uni.redirectTo({
url: "/pages/visit/study?type=" + this.form.type,
});
}
})
.catch((err) => {
console.log("err", err);
});
},
submitForm() {
let that = this;
console.log("form", this.form);
// return
this.util.request({
api: "/api/admin/visit/save",
method: "POST",
requestType: "bd",
data: that.form,
utilSuccess: function (res) {
uni.showToast({
title: res.msg,
duration: 2000,
icon: "none",
});
uni.removeStorageSync("formdata");
uni.redirectTo({
url: "/pages/visit/successform?iscall=call",
});
},
utilFail: function (res) {
uni.showToast({
title: res,
duration: 2000,
icon: "none",
});
},
});
},
submitNoStudy() {
let that = this;
this.util.request({
api: "/api/mobile/visit/visit-save",
method: "POST",
data: that.form,
utilSuccess: function (res) {
uni.showToast({
title: res.msg,
duration: 2000,
icon: "none",
});
uni.removeStorageSync("formdata");
that.newsSubscription();
},
utilFail: function (res) {
console.log(res);
uni.showToast({
title: res,
duration: 2000,
icon: "none",
});
},
});
},
newsSubscription() {
uni.getSetting({
withSubscriptions: true, //是否获取用户订阅消息的订阅状态默认false不返回
success(res) {
if (res.authSetting["scope.subscribeMessage"]) {
uni.redirectTo({
url: "/pages/visit/successform",
});
} else {
// 用户没有点击"总是保持以上,不再询问"则每次都会调起订阅消息
uni.requestSubscribeMessage({
tmplIds: [
"OfDFwAIZyXqvPgmc_czIXhveVtp3n_ftyWJEks1DSi4",
"r8n41lmkGeob15YBuuxhG7MbpgVSsUxKnK9ORPtr5VY",
],
success(res) {
console.log("res", res);
uni.showToast({
title: "订阅成功",
});
uni.redirectTo({
url: "/pages/visit/successform",
});
},
});
}
},
});
},
// 开始日期变化处理
onStartDateChange(e) {
console.log("开始日期变化:", e);
this.calculateDateRange();
},
// 结束日期变化处理
onEndDateChange(e) {
console.log("结束日期变化:", e);
this.calculateDateRange();
},
// 计算日期范围和长期访问状态
calculateDateRange() {
if (this.form.start_date && this.form.end_date) {
// 计算日期差
const start = new Date(this.form.start_date);
const end = new Date(this.form.end_date);
const timeDiff = end.getTime() - start.getTime();
const daysDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)) + 1; // +1 因为包含开始和结束日期
// 如果超过1天设置为长期访问
this.form.long_time = daysDiff > 1 ? 1 : 0;
// 设置date字段为start_date
this.form.date = this.form.start_date;
console.log("计算后的值:", {
start_date: this.form.start_date,
end_date: this.form.end_date,
long_time: this.form.long_time,
daysDiff: daysDiff,
});
}
},
// 拉取拜访人信息
pullVisitorInfo() {
let that = this;
this.util.request({
api: "/api/mobile/user/my-visit",
method: "get",
data: {
page: 1,
page_size: 1,
type: "",
},
utilSuccess: function (res) {
if (res.data && res.data.length > 0) {
// 获取第一条记录
const firstRecord = res.data[0];
// 自动填充拜访人信息
that.form.name = firstRecord.name || "";
that.form.mobile = firstRecord.mobile || "";
that.form.credent = firstRecord.credent || 1;
that.form.idcard = firstRecord.idcard || "";
that.form.company_name = firstRecord.company_name || "";
// that.form.cda = firstRecord.cda || ''
// 根据证件类型设置对应的证件号码
if (firstRecord.credent == 2) {
that.form.passcard = firstRecord.idcard || "";
}
uni.showToast({
title: "拜访人信息已自动填充 / Visitor information auto-filled",
duration: 2000,
icon: "success",
});
} else {
uni.showToast({
title:
"暂无拜访人历史记录,请手动输入! / No visitor history, please enter manually!",
duration: 2000,
icon: "none",
});
}
},
utilFail: function (res) {
uni.showToast({
title: "拉取失败,请手动输入 / Pull failed, please enter manually",
duration: 2000,
icon: "none",
});
},
});
},
},
};
</script>
<style scoped>
.containers {
background-color: #fff;
min-height: 100vh;
padding: 20rpx;
padding-bottom: 60rpx;
}
.steps {
margin-bottom: 40rpx;
}
.formtext {
margin-bottom: 20rpx;
}
/deep/ .uni-table-td {
vertical-align: middle;
}
/deep/ .uni-drawer__content {
padding: 40rpx;
}
.configtitle {
font-size: 40rpx;
text-align: center;
margin-top: 36rpx;
padding-bottom: 20rpx;
}
.configvalue {
padding: 40rpx;
font-size: 36rpx;
height: 600rpx;
overflow-y: auto;
}
.configbtn {
background: #4f607e;
padding: 20rpx;
/* display: inline-block; */
text-align: center;
margin: 20rpx auto;
color: #fff;
border-radius: 20rpx;
}
.configload {
display: flex;
justify-content: center;
align-items: center;
font-size: 50rpx;
color: #ddd;
}
.configload text {
margin-right: 20rpx;
}
/deep/ .u-popup__content__close .u-icon__icon {
color: #fff !important;
}
.areabtn {
background-color: #4f607e;
/* margin-left: 8px; */
width: 100%;
position: fixed;
bottom: 0;
left: 0;
border-radius: 0;
}
/deep/
.areavalue
.uni-data-checklist
.checklist-group
.checklist-box.is--button {
padding: 30rpx;
}
/* 日期选择器样式优化 */
/deep/ .uni-datetime-picker {
width: 100% !important;
min-width: 0 !important;
flex: 1 !important;
}
/deep/ .uni-datetime-picker .uni-datetime-picker__input {
width: 100% !important;
overflow: visible !important;
white-space: nowrap !important;
min-width: 0 !important;
}
/deep/ .uni-datetime-picker .uni-datetime-picker__input-text {
width: 100% !important;
overflow: visible !important;
text-overflow: ellipsis !important;
min-width: 0 !important;
}
/* 确保表单项有足够空间 */
/deep/ .uni-forms-item__content {
flex: 1 !important;
min-width: 0 !important;
}
.label-with-en-inline {
display: flex;
flex-direction: column;
width: 80px;
min-width: 80px;
font-weight: 500;
}
.label-with-en-inline text {
display: block;
line-height: 1.5;
}
.label-with-en-inline .en-text {
font-size: 20rpx;
color: #999;
margin-top: 4rpx;
font-weight: normal;
}
.label-with-en-inline-del {
display: inline-flex;
flex-direction: column;
align-items: flex-start;
}
.label-with-en-inline-del text {
display: block;
line-height: 1.2;
}
.label-with-en-inline-del .en-text {
font-size: 18rpx;
color: #999;
margin-top: 2rpx;
font-weight: normal;
}
.button-with-en {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.button-with-en .en-text {
font-size: 20rpx;
opacity: 0.9;
margin-top: 2rpx;
font-weight: normal;
}
.button-with-en-submit {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.button-with-en-submit .en-text {
font-size: 20rpx;
opacity: 0.9;
margin-top: 2rpx;
font-weight: normal;
}
.button-mini-with-en {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 8rpx 16rpx;
}
.button-mini-with-en view {
line-height: 1.2;
}
.button-mini-with-en .en-text {
font-size: 18rpx;
opacity: 0.9;
margin-top: 2rpx;
font-weight: normal;
}
.label-with-en {
display: flex;
flex-direction: column;
}
.label-with-en .en-text {
font-size: 24rpx;
color: #999;
margin-top: 4rpx;
}
.label-with-en-table {
display: flex;
flex-direction: column;
align-items: center;
}
.label-with-en-table .en-text {
font-size: 20rpx;
color: #999;
margin-top: 2rpx;
}
/deep/ .uni-forms-item__label {
width: 140px !important;
min-width: 140px !important;
padding-right: 16rpx;
display: flex;
align-items: flex-start;
}
</style>