Files
dvcp_v2_wxcp_app/src/saas/AppBackUserList/Add.vue
2022-02-11 17:19:07 +08:00

782 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="album">
<div class="tips">
请确保以下信息全部由本人填写本人对所填写内容的真实性和完整性负责
</div>
<div class="form-item__group">
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>返乡人员姓名</h2>
</div>
<div class="form-item__right">
<input placeholder="请输入" v-model="form.name" :maxlength="20" />
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>身份证号</h2>
</div>
<div class="form-item__right">
<input
placeholder="请输入"
type="idcard"
v-model="form.idNumber"
:maxlength="20"
/>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>手机号码</h2>
</div>
<div class="form-item__right">
<input
placeholder="请输入"
type="number"
v-model="form.phone"
:maxlength="11"
/>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>人员类别</h2>
</div>
<div class="form-item__right">
<AiSelect
v-model="form.type"
dict="epidemicRecentPersonType"
class="select"
></AiSelect>
</div>
</div>
</div>
</div>
<div class="form-item__group">
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>出行方式</h2>
</div>
<div class="form-item__right">
<AiSelect
dict="epidemicRecentTravel"
v-model="form.travelType"
class="select"
></AiSelect>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>出发时间</h2>
</div>
<div class="form-item__right">
<div class="ai-area" @click="isShowStartTime = true">
<div class="ai-area__wrapper">
<span class="label" v-if="form.startTime">{{
form.startTime
}}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd" />
</div>
</div>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>出发地区</h2>
</div>
<div class="form-item__right">
<AiAreaPicker
ref="area"
class="ai-area"
:value="form.startAreaId"
:fullName.sync="form.startAreaName"
all
mode="custom"
@select="(v) => (form.startAreaId = v)"
>
<div class="ai-area__wrapper">
<span class="label" v-if="form.startAreaName">{{
form.startAreaName
}}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd" />
</div>
</AiAreaPicker>
</div>
</div>
</div>
<div class="form-item form-item__textarea">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>出发地址</h2>
</div>
<div class="form-item__right">
<textarea
auto-height
v-model="form.startAddress"
:maxlength="500"
placeholder="请输入详细的出发地址"
placeholder-style="font-size: 16px"
></textarea>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>到达时间</h2>
</div>
<div class="form-item__right">
<div class="ai-area" @click="isShowEndTime = true">
<div class="ai-area__wrapper">
<span class="label" v-if="form.arriveTime">{{
form.arriveTime
}}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd" />
</div>
</div>
</div>
</div>
</div>
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>到达地区</h2>
</div>
<div class="form-item__right">
<AiAreaPicker
ref="area"
class="ai-area"
:value="form.arriveAreaId"
:fullName.sync="form.arriveAreaName"
mode="custom"
@select="(v) => (form.arriveAreaId = v)"
all
>
<div class="ai-area__wrapper">
<span class="label" v-if="form.arriveAreaName">{{
form.arriveAreaName
}}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd" />
</div>
</AiAreaPicker>
</div>
</div>
</div>
<div class="form-item form-item__textarea">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>返乡地址</h2>
</div>
<div class="form-item__right">
<textarea
auto-height
v-model="form.arriveAddress"
:maxlength="500"
placeholder="请输入详细的返乡地址"
placeholder-style="font-size: 16px"
></textarea>
</div>
</div>
</div>
<div class="form-item form-item__textarea">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>行程描述</h2>
</div>
<div class="form-item__right">
<textarea
auto-height
style="height: 90px"
v-model="form.description"
:maxlength="500"
placeholder="请输入行程描述"
placeholder-style="font-size: 16px"
></textarea>
</div>
</div>
</div>
</div>
<div class="form-item__group">
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>核酸检测日期</h2>
</div>
<div class="form-item__right">
<div class="ai-area" @click="isShowDate = true">
<div class="ai-area__wrapper">
<span class="label" v-if="form.checkTime">{{
form.checkTime
}}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd" />
</div>
</div>
</div>
</div>
</div>
<div class="form-item form-item__imgs">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>本人健康码截图或核酸检测报告</h2>
</div>
<div class="form-item__right">
<AiUploader :def.sync="form.checkPhoto" :limit="1" action="/admin/file/add2"></AiUploader>
</div>
</div>
</div>
<div class="form-item form-item__imgs">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>核酸检测结果</h2>
</div>
<div class="form-item__right">
<AiRadio
style="width: 100%"
v-model="form.checkResult"
dict="epidemicRecentTestResult"
></AiRadio>
</div>
</div>
</div>
</div>
<div class="form-item__group">
<div class="form-item">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>当前体温</h2>
</div>
<div class="form-item__right">
<input
placeholder="请输入"
v-model="form.temperature"
:maxlength="20"
/>
<i></i>
</div>
</div>
</div>
<div class="form-item form-item__imgs">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>14天内是否接触新冠确诊或疑似患者</h2>
</div>
<div class="form-item__right">
<AiRadio
style="width: 100%"
v-model="form.touchInFourteen"
dict="epidemicTouchInFourteen"
></AiRadio>
</div>
</div>
</div>
<div class="form-item form-item__imgs">
<div class="form-item__wrapper">
<div class="form-item__title">
<i>*</i>
<h2>当前健康状况可多选</h2>
</div>
<div class="form-item__right">
<AiCheckbox
style="width: 100%"
v-model="form.health"
dict="epidemicRecentHealth"
></AiCheckbox>
</div>
</div>
</div>
</div>
<u-picker
mode="time"
:params="dataParams"
v-model="isShowDate"
@confirm="onDateChange"
></u-picker>
<u-picker
mode="time"
:params="params"
v-model="isShowStartTime"
@confirm="onStartChange"
></u-picker>
<u-picker
mode="time"
:params="params"
v-model="isShowEndTime"
@confirm="onEndChange"
></u-picker>
<div class="btn-wrapper">
<div class="btn" hover-class="text-hover" @click="submit">提交</div>
</div>
</div>
</template>
<script>
// import AiUploader from "@/components/AiUploader/AiUploader";
// import AiSelect from "@/components/AiSelect/AiSelect";
import { mapState } from "vuex";
export default {
data() {
return {
isShowType: false,
isShowEndTime: false,
isShowStartTime: false,
isShowDate: false,
params: {
year: true,
month: true,
day: true,
hour: true,
minute: true,
},
dataParams: {
year: true,
month: true,
day: true,
},
form: {
arriveAddress: "",
arriveAreaId: "",
arriveAreaName: "",
arriveTime: "",
checkPhoto: [],
checkResult: "",
checkTime: "",
description: "",
health: [],
idNumber: "",
name: "",
phone: "",
startAddress: "",
startAreaId: "",
startAreaName: "",
startTime: "",
temperature: "",
touchInFourteen: "",
travelType: "",
type: "",
unusual: "",
arriveGirdId: '',
arriveGirdName: '',
corpId: '',
},
dictList: [],
arr: [],
gridList: [[], [], []],
flag: false,
areaId: "",
};
},
computed: {
...mapState(["user"]),
},
onLoad(option) {
this.areaId = this.user.areaId;
document.title = '返乡登记'
if(option.corpId) {
this.form.corpId = option.corpId
}
this.form.arriveGirdId = option.arriveGirdId
this.form.arriveGirdName = option.arriveGirdName
},
methods: {
onDateChange(e) {
this.form.checkTime = `${e.year}-${e.month}-${e.day}`;
},
onStartChange(e) {
this.form.startTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}`;
},
onEndChange(e) {
this.form.arriveTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}`;
},
submit() {
if (!this.form.name) {
return this.$u.toast("请输入返乡人员姓名");
}
if (!this.form.idNumber) {
return this.$u.toast("请输入返乡人员身份证号");
}
if (
!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(this.form.idNumber)
) {
return this.$u.toast("请输入正确的身份证账号");
}
if (!this.form.phone) {
return this.$u.toast("请输入返乡人员手机号码");
}
if (!/^1[0-9]{10,10}$/.test(this.form.phone)) {
return this.$u.toast("请输入正确的手机号码");
}
if (!this.form.type) {
return this.$u.toast("请选择人员类别");
}
if (!this.form.travelType) {
return this.$u.toast("请选择出行方式");
}
if (!this.form.startTime) {
return this.$u.toast("请选择出发时间");
}
if (
new Date(this.form.startTime.replace(/-/g, "/")).getTime() >
new Date().getTime()
) {
return this.$u.toast("出发时间不得晚于当前时间");
}
if (!this.form.startAreaName) {
return this.$u.toast("请选择出发地区");
}
if (
this.form.startAreaId.substr(this.form.startAreaId.length - 3, 3) ===
"000"
) {
return this.$u.toast("出发地区必须选到村或社区");
}
if (!this.form.startAddress) {
return this.$u.toast("请输入出发详细地址");
}
if (!this.form.arriveTime) {
return this.$u.toast("请选择到达时间");
}
if (
new Date(this.form.startTime.replace(/-/g, "/")).getTime() >=
new Date(this.form.arriveTime.replace(/-/g, "/")).getTime()
) {
return this.$u.toast("到达时间不得早于出发时间");
}
if (!this.form.arriveAreaName) {
return this.$u.toast("请选择到达地区");
}
if (
this.form.arriveAreaId.substr(this.form.arriveAreaId.length - 3, 3) ===
"000"
) {
return this.$u.toast("到达地区必须选到村或社区");
}
if (!this.form.arriveAddress) {
return this.$u.toast("请输入返乡地址");
}
if (!this.form.description) {
return this.$u.toast("请输入行程描述");
}
if (!this.form.checkTime) {
return this.$u.toast("请选择核酸检测日期");
}
if (!this.form.checkPhoto.length) {
return this.$u.toast("请上传本人健康码截图或核酸检测报告");
}
if (!this.form.checkResult) {
return this.$u.toast("请选择核酸检测结果");
}
if (!this.form.temperature) {
return this.$u.toast("请输入当前体温");
}
if (!this.form.touchInFourteen) {
return this.$u.toast("请选择14天内是否接触新冠确诊或疑似患者");
}
if (!this.form.health.length) {
return this.$u.toast("请选择当前健康状况");
}
if (this.flag) return;
this.flag = true;
this.$loading();
this.$http
.post(`/app/appepidemicbackhomerecord/addOrUpdate`, {
...this.form,
startTime: this.form.startTime + ":00",
arriveTime: this.form.arriveTime + ":00",
checkTime: this.form.checkTime + " 00:00:00",
health: this.form.health.join(","),
checkPhoto: JSON.stringify(this.form.checkPhoto),
})
.then((res) => {
this.$hideLoading();
this.flag = false;
if (res.code == 0) {
uni.$emit("update");
setTimeout(() => {
uni.navigateTo({url: `./Success?status=1&corpId=${this.form.corpId}`})
}, 400);
}
}).catch(() => {
uni.navigateTo({url: `./Success?status=1&corpId=${this.form.corpId}`})
})
},
},
};
</script>
<style lang="scss">
.album {
padding-bottom: 140px;
.tips {
line-height: 1.3;
padding: 32px 32px;
color: #ff883c;
font-size: 30px;
text-align: justify;
background: #fff8f3;
}
.form-item__group {
margin-bottom: 24px;
background: #fff;
}
.form-item {
padding-left: 32px;
.form-item__checkbox {
width: 100%;
div {
width: 100%;
height: 80px;
line-height: 80px;
margin-bottom: 24px;
text-align: center;
background: #ffffff;
border-radius: 16px;
color: #333333;
font-size: 28px;
border: 1px solid #cccccc;
&.active {
background: #4181ff;
color: #fff;
border-color: #4181ff;
}
}
}
.form-item__radio {
display: flex;
align-items: center;
flex-wrap: wrap;
div {
width: 212px;
height: 80px;
line-height: 80px;
margin-right: 16px;
margin-bottom: 8px;
text-align: center;
background: #ffffff;
border-radius: 16px;
color: #333333;
font-size: 28px;
border: 1px solid #cccccc;
&:nth-of-type(3n) {
margin-right: 0;
}
&.active {
background: #4181ff;
color: #fff;
border-color: #4181ff;
}
}
}
.ai-area__wrapper {
display: flex;
align-items: center;
padding-left: 100px;
span {
color: #333;
font-size: 30px;
}
i {
color: #999;
font-size: 30px;
}
image {
width: 16px;
height: 8px;
}
}
.form-item__wrapper {
display: flex;
align-items: center;
justify-content: space-between;
height: 128px;
padding-right: 28px;
border-bottom: 1px solid #dddddd;
input {
flex: 1;
height: 100%;
text-align: right;
color: #333;
padding-right: 10px;
}
.form-item__right {
display: flex;
align-items: center;
font-size: 32px;
.select {
._i {
padding-left: 100px;
}
}
span {
max-width: 400px;
margin-right: 8px;
color: #333333;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
i {
margin-right: 8px;
color: #999999;
}
}
}
&:last-child {
.form-item__wrapper {
border-bottom: none;
}
}
.form-item__title {
display: flex;
align-items: center;
i {
font-size: 32px;
color: #ff4466;
}
span {
font-size: 28px;
color: #999999;
}
h2 {
padding: 0 4px;
font-weight: 600;
font-size: 32px;
color: #333333;
}
}
&.form-item__imgs,
&.form-item__textarea {
.form-item__wrapper {
display: block;
height: auto;
padding-bottom: 32px;
}
textarea {
width: 100%;
height: 90px;
}
.form-item__title {
padding: 32px 0;
}
.form-item__right {
padding-left: 18px;
}
}
}
.btn-wrapper {
position: fixed;
left: 50%;
bottom: 0;
z-index: 11;
width: 100%;
padding: 20px 0 20px 0 !important;
transform: translateX(-50%);
background: #f3f6f9;
}
.btn-wrapper .btn {
width: 686px;
height: 88px;
line-height: 88px;
margin: 0 auto;
padding: 0 !important;
text-align: center;
color: #fff;
font-size: 34px;
background: #4181FF;
border-radius: 16px;
}
.btn-wrapper .disabled {
color: #B9E7D0;
background: #50C48A;
}
}
</style>