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.

571 lines
15 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>
<transition>
<div class="house-container" :style="{ width: handlerWidth }" v-show="show">
<div class="house-header">
<div class="houser-data">
<div class="house-main-row">
<div class="house-name">
<span class="number-font">{{ houseItem.name }}</span>
<span class="number-font"> {{ total }} </span>
</div>
<div class="house-type">{{ houseItem.typename }}</div>
<ColorCell :item="houseItem"
><span class="house-color">
{{ houseItem.color }}</span
></ColorCell
>
<div
class="house-is"
style="border: 1px solid #81204e; color: #e73388"
v-show="houseItem.isD == 1"
>
中共党员
</div>
<div
class="house-is"
style="border: 1px solid #734700; color: #e09100"
v-show="houseItem.isK == 1"
>
帮扶对象
</div>
<div
class="house-is"
style="border: 1px solid #00694c; color: #00c185"
v-show="houseItem.isX == 1"
>
重点人群
</div>
<div
class="house-is"
style="border: 1px solid #006382; color: #02b4e7"
v-show="houseItem.isJ == 1"
>
退伍军人
</div>
</div>
<div class="btn-group">
<div class="btn-gather" v-show="houseItem.color == 'NO'">
确认空关
</div>
<div class="btn-gather">房屋信息采集</div>
<div class="btn-add">添加居民</div>
<div class="btn-close" @click="handleClose()">关闭</div>
</div>
</div>
<div class="house-address">公安地址:{{ houseItem.address }}</div>
</div>
<div class="house-list" v-if="total > 0">
<div class="list-item" v-for="item in list" :key="item.id">
<div class="person-icon">
<img :src="filterIcon(item.credentialNo)" alt="" />
<div class="person-name">{{ item.name }}</div>
</div>
<div class="person-data">
<div class="data-row">
<div class="row-item">
<div class="row-item-lable">
性別:{{ getGender(item.credentialNo) }}
</div>
<div class="row-item-value"></div>
</div>
<div class="row-item">
<div class="row-item-lable">身份证号:</div>
<div class="row-item-value">{{ item.credentialNo }}</div>
</div>
<div class="row-item">
<div class="row-item-lable">户籍:</div>
<div
class="row-item-value"
:style="{ color: item.type == 1 ? '#00C185' : '#E73388' }"
>
{{ item.typename }}
</div>
</div>
</div>
<div class="data-row">
<div class="row-item">
<div class="row-item-lable">年龄:</div>
<div class="row-item-value">
{{ calculateAge(item.credentialNo) }}岁
</div>
</div>
<div class="row-item">
<div class="row-item-lable">手机号:</div>
<div class="row-item-value">{{ item.phone }}</div>
</div>
<div class="row-item">
<div class="row-item-lable">分色:</div>
<div class="row-item-value">
<ColorCell :item="item" size="small"
><span class="house-color">
{{ item.color }}</span
></ColorCell
>
</div>
</div>
</div>
<div class="data-row">
<div class="row-item">
<div class="row-item-lable">出生年月:</div>
<div class="row-item-value">
{{ extractBirthMonth(item.credentialNo) }}
</div>
</div>
<div class="row-item">
<div class="row-item-lable">数据更新时间:</div>
<div class="row-item-value" style="color: #ffb82f">
{{ item.updateTime }}
</div>
</div>
<div class="row-item">
<div class="row-item-lable">更新人员:</div>
<div class="row-item-value" style="color: #ffb82f">
{{ item.updateBy }}
</div>
</div>
</div>
<div class="data-row last-row">
<div class="is-list">
<div
class="house-is"
style="border: 1px solid #81204e; color: #e73388"
v-show="item.isD == 1"
>
中共党员
</div>
<div
class="house-is"
style="border: 1px solid #734700; color: #e09100"
v-show="item.isK == 1"
>
帮扶对象
</div>
<div
class="house-is"
style="border: 1px solid #00694c; color: #00c185"
v-show="item.isX == 1"
>
重点人群
</div>
<div
class="house-is"
style="border: 1px solid #006382; color: #02b4e7"
v-show="item.isJ == 1"
>
退伍军人
</div>
</div>
<div class="row-btn">
<div>删除</div>
<div>修改</div>
<div>设为户主</div>
</div>
</div>
</div>
<div class="item-key" v-show="houseItem.holderId == item.id">
<span>户主</span>
</div>
</div>
</div>
<div v-else class="no-data">
<el-empty
:image="require('@/assets/images/ui/noData.png')"
description="暂无居民"
></el-empty>
</div>
</div>
</transition>
</template>
<script>
import { mapGetters } from "vuex";
import { getHouse } from "@/api/taicangpop/house.js";
import { listPerson } from "@/api/taicangpop/person.js";
import { pxToVw, handleColor } from "@/utils/myFuntion.js";
import ColorCell from "@/components/ColorCell";
export default {
components: { ColorCell },
data() {
return {
show: false,
total: 0,
list: [],
};
},
watch: {
houseItem: {
handler(val) {
if (!val.id) return;
this.getPersonList();
},
deep: true,
},
},
computed: {
...mapGetters(["houseItem", "queryParamsXiaoqu"]),
handlerWidth() {
return pxToVw(this.houseItem.buildingWidth);
},
},
created() {},
methods: {
filterIcon(credentialNo) {
let sex = this.getGender(credentialNo);
if (sex == "男") {
return require("@/assets/images/ui/img_man@2x.png");
} else {
return require("@/assets/images/ui/img_woman@2x.png");
}
},
handleClose() {
this.show = false;
this.$store.commit("SET_BUILDING_WIDTH", {});
},
async getPersonList() {
let result = await getHouse(this.houseItem.id);
this.houseItem.holderId = result.data.holderId; //户主
this.houseItem.address = result.data.address;
let res = await listPerson({
buildingId: this.houseItem.buildingId,
houseId: this.houseItem.id,
deptId: this.houseItem.deptId,
});
this.list = handleColor(res.rows);
this.total = res.total;
this.show = true;
},
isValidID(id) {
// 校验长度和基本格式
if (!/^\d{15}|\d{18}$/.test(id)) return false;
// 将15位升级为18位
if (id.length === 15) {
id =
id.substr(0, 6) + "19" + id.substr(6) + this.calculateCheckDigit(id);
}
// 验证18位身份证的校验位
return this.validateID18(id);
},
validateID18(id) {
if (!/^\d{17}[\dXx]$/.test(id)) return false;
// 校验码计算
const checkDigits = "10X98765432";
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += id[i] * weights[i];
}
const checkDigit = checkDigits[sum % 11];
return checkDigit.toUpperCase() === id[17].toUpperCase();
},
calculateCheckDigit(id) {
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkDigits = "10X98765432";
let sum = 0;
for (let i = 0; i < id.length; i++) {
sum += id[i] * weights[i];
}
return checkDigits[sum % 11];
},
calculateAge(id) {
if (!this.isValidID(id)) return "Invalid ID";
let birthDate;
if (id.length === 18) {
// 从18位身份证中提取出生日期
birthDate = id.substr(6, 8);
} else if (id.length === 15) {
// 从15位身份证中提取出生日期
birthDate = "19" + id.substr(6, 6);
} else {
return "Invalid ID length";
}
// 格式化出生日期
birthDate = birthDate.replace(/(.{4})(.{2})/, "$1-$2-");
const birth = new Date(birthDate);
const today = new Date();
let age = today.getFullYear() - birth.getFullYear();
// 计算是否已过生日
if (
today.getMonth() + 1 < birth.getMonth() + 1 ||
(today.getMonth() + 1 === birth.getMonth() + 1 &&
today.getDate() < birth.getDate())
) {
age--;
}
return age;
},
extractBirthMonth(id) {
if (!this.isValidID(id)) return "Invalid ID";
let birthDate;
if (id.length === 18) {
// 从18位身份证中提取出生日期
birthDate = id.substr(6, 8);
} else if (id.length === 15) {
// 从15位身份证中提取出生日期
birthDate = "19" + id.substr(6, 6);
} else {
return "Invalid ID length";
}
// 格式化出生日期为 YYYY-MM
birthDate = birthDate.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2");
return birthDate;
},
getGender(id) {
if (!this.isValidID(id)) return "Invalid ID";
// 在18位身份证中第17位为性别标识
return parseInt(id[16]) % 2 === 0 ? "女" : "男";
},
},
};
</script>
<style lang="scss" scoped>
div {
font-family: "Alibaba-PuHuiTi-Regular.otf";
}
.house-container {
position: absolute;
z-index: 100;
top: 75px;
left: 0;
height: calc(100% - 75px);
display: flex;
overflow-y: auto;
background: #113666;
border: 1px solid #2d6cad;
border-right: 0px;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding: 15px;
.house-header {
.houser-data {
display: flex;
justify-content: space-between;
align-items: center;
& > div {
display: flex;
align-items: center;
}
}
}
.house-list {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
.list-item {
position: relative;
height: calc((100% / 4) - 15px);
border: 1px solid #2468c1;
margin-bottom: 15px;
display: flex;
align-items: center;
overflow: hidden;
.item-key {
position: absolute;
right: 0;
top: 0;
height: 66px;
width: 66px;
background: url("~@/assets/images/ui/img_tag_hz@2x.png");
background-size: 100% 100%;
font-size: 18px;
line-height: 40px;
color: #ffffff;
text-shadow: 0px 2px 0px rgba(7, 58, 123, 0.5);
font-family: "BY";
text-align: right;
span {
display: inline-block;
transform: rotate(45deg);
}
}
.person-icon {
width: 170px;
height: 100%;
background: linear-gradient(0deg, #00234e, #003980);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
img {
display: block;
height: 74px;
width: 74px;
}
.person-name {
margin-top: 10px;
font-size: 16px;
color: #ffffff;
background: url("~@/assets/images/ui/img_name_bg@2x.png");
background-size: 100% 100%;
padding: 3px 20px;
}
}
.person-data {
flex: 1;
height: 100%;
padding: 0 10px;
background: #004994;
.data-row,
.row-item {
display: flex;
align-items: center;
}
.data-row {
height: calc(100% / 4);
font-size: 14px;
color: #9acfff;
font-weight: 400;
// padding: 10px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
.row-item-value {
color: #fff;
}
}
.data-row > div {
flex: 1;
}
}
}
}
.house-main-row > div {
margin-right: 10px;
}
.house-name {
font-size: 18px;
color: #ffffff;
}
.number-font {
font-size: 20px;
color: #ffffff;
font-style: italic;
font-family: "DIN-Medium-2.otf";
font-weight: bold;
}
.last-row {
display: flex;
align-items: center;
justify-content: space-between;
border: 0px !important;
.is-list,
.row-btn {
display: flex;
align-items: center;
}
.is-list > div {
margin-right: 10px;
}
.row-btn {
flex-direction: row-reverse;
& > div {
cursor: pointer;
color: #fff;
margin: 0 0 0 10px;
font-size: 14px;
background: url("~@/assets/images/ui/btn_1@2x.png");
background-size: 100% 100%;
padding: 3px 15px;
}
& > div:last-child {
background: url("~@/assets/images/ui/tab1.png");
background-size: 100% 100%;
}
}
}
.house-is {
font-size: 14px;
background: rgba(3, 24, 47, 0.8);
padding: 0 6px;
}
.house-type {
font-size: 14px;
color: #00c185;
}
.house-color {
display: inline-block;
margin-left: 3px;
font-size: 14px;
color: #fff;
}
.btn-group > div {
cursor: pointer;
margin-left: 5px;
font-size: 14px;
color: #cdfbff;
font-weight: 400;
padding: 7px 12px 10px 12px;
background: url("~@/assets/images/ui/btn_bg.png");
background-size: 100% 100%;
}
.btn-group > div:last-child {
background: transparent;
}
.house-address {
font-size: 18px;
color: #ffffff;
font-family: "Alibaba-PuHuiTi-Regular.otf";
margin: 3px 0 6px 0;
}
.no-data {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
/* 下面我们会解释这些 class 是做什么的 */
.v-enter-active,
.v-leave-active {
transition: opacity 0.5s ease;
}
.v-enter-from,
.v-leave-to {
opacity: 0;
}
::-webkit-scrollbar {
width: 3px;
height: 3px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
height: 10px;
width: 1px;
background: rgba(255, 255, 255, 0.5);
}
::-webkit-scrollbar-track {
background: transparent;
}
</style>