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.

811 lines
23 KiB

<template>
<div class="house-container" :style="{ width: handlerWidth }" v-show="show">
<transition>
<div>
<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">{{ houseData.typename }}</div>
<ColorCell :item="houseData"
><span class="house-color">
{{ houseData.color }}</span
></ColorCell
>
<div
class="house-is"
style="border: 1px solid #81204e; color: #e73388"
v-show="houseData.isD == 1"
>
中共党员
</div>
<div
class="house-is"
style="border: 1px solid #734700; color: #e09100"
v-show="houseData.isK == 1"
>
帮扶对象
</div>
<div
class="house-is"
style="border: 1px solid #00694c; color: #00c185"
v-show="houseData.isX == 1"
>
重点人群
</div>
<div
class="house-is"
style="border: 1px solid #006382; color: #02b4e7"
v-show="houseData.isJ == 1"
>
退伍军人
</div>
</div>
<div class="btn-group">
<div class="btn-gather" v-show="houseData.color == 'NO'">
确认空关
</div>
<!-- <div class="btn-add"></div> -->
<imageButton size="small" @handlerClcik="addPerson()"
>添加居民</imageButton
>
<div class="btn-close" @click="handleClose()"></div>
8 months ago
</div>
</div>
<div class="house-address">公安地址{{ houseData.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">
<imageButton @handlerClcik="delPerson(item.id)"
>删除</imageButton
>
<imageButton @handlerClcik="getPersonInfo(item.id)"
>修改</imageButton
>
</div>
</div>
</div>
</div>
</div>
<div v-else class="no-data">
<el-empty
:image="require('@/assets/images/ui/noData.png')"
description="暂无居民"
></el-empty>
</div>
</div>
</transition>
<!-- 添加修改居民 -->
<el-dialog
:visible.sync="open"
append-to-body
custom-class="taicang-dialog-small"
>
<div class="dialog-main">
<div class="dialog-title"><span></span> {{ title }}</div>
<el-form ref="form" :rules="rules" :model="form" label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="人员类型">
<el-checkbox-group v-model="multiple">
<el-checkbox label="中共党员"></el-checkbox>
<el-checkbox label="帮扶对象"></el-checkbox>
<el-checkbox label="重点人群"></el-checkbox>
<el-checkbox label="退伍军人"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="身份证" prop="credentialNo">
<el-input v-model="form.credentialNo"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作单位">
<el-input v-model="form.workunit"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="手机号" prop="phone">
<el-input v-model="form.phone"></el-input>
</el-form-item>
</el-col>
<el-col :span="12"> </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="户籍" prop="color">
<el-radio-group v-model="form.color">
<el-radio
:label="dict.value"
v-for="dict in dict.type.b_census_color_type"
:key="dict.value"
>{{ dict.value }}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="流动" prop="color">
<el-radio-group v-model="form.color">
<el-radio
:label="dict.value"
v-for="dict in dict.type.b_flow_color_type"
:key="dict.value"
>{{ dict.value }}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注">
<el-input type="textarea" v-model="form.remark"></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="dialog-btn-group">
<imageButton size="small" @handlerClcik="confirm()"
> </imageButton
>
<imageButton size="small"> </imageButton>
</div>
</el-form>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { getHouse } from "@/api/taicangpop/house.js";
import {
listPerson,
addPerson,
updatePerson,
delPerson,
getPerson,
} from "@/api/taicangpop/person.js";
import { pxToVw, handleColor } from "@/utils/myFuntion.js";
import ColorCell from "@/components/ColorCell";
export default {
components: { ColorCell },
dicts: ["b_census_color_type", "b_flow_color_type"],
data() {
return {
houseData: {},
form: {
name: undefined,
credentialNo: undefined,
workunit: undefined,
phone: undefined,
color: undefined,
remark: undefined,
isD: undefined,
isK: undefined,
isJ: undefined,
isX: undefined,
userId: undefined,
houseId: undefined,
buildingId: undefined,
deptId: undefined,
},
rules: {
name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
credentialNo: [
{ required: true, message: "身份证不能为空", trigger: "blur" },
],
phone: [{ required: true, message: "手机号不能为空", trigger: "blur" }],
workunit: [
{
required: true,
message: "工作单位不能为空",
trigger: "change",
},
],
color: [{ required: true, message: "分色不能为空", trigger: "change" }],
},
multiple: [],
title: "",
open: false,
show: false,
total: 0,
list: [],
};
},
watch: {
houseItem: {
handler(val) {
if (!val.id) return;
this.getPersonList();
},
deep: true,
},
},
computed: {
...mapGetters(["houseItem", "queryParamsXiaoqu", "userId"]),
handlerWidth() {
return pxToVw(this.houseItem.buildingWidth);
},
},
created() {},
methods: {
reset() {
this.form = {
id: null,
name: undefined,
credentialNo: undefined,
workunit: undefined,
phone: undefined,
color: undefined,
remark: undefined,
isD: undefined,
isK: undefined,
isJ: undefined,
isX: undefined,
userId: undefined,
houseId: undefined,
buildingId: undefined,
deptId: undefined,
};
this.multiple = [];
},
async getPersonInfo(id) {
let res = await getPerson(id);
this.reset();
this.title = "修改居民";
res.data.isD == "1" ? this.multiple.push("中共党员") : "";
res.data.isJ == "1" ? this.multiple.push("退伍军人") : "";
res.data.isK == "1" ? this.multiple.push("帮扶对象") : "";
res.data.isX == "1" ? this.multiple.push("重点人群") : "";
this.form = res.data;
this.open = true;
},
delPerson(ids) {
this.$modal
.confirm('是否确认删除居民管理编号为"' + ids + '"的数据项?')
.then(function () {
return delPerson(ids);
})
.then(() => {
this.getPersonList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
confirm() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.form.isD = this.multiple.some((item) => item == "中共党员")
? 1
: 0;
this.form.isK = this.multiple.some((item) => item == "帮扶对象")
? 1
: 0;
this.form.isJ = this.multiple.some((item) => item == "退伍军人")
? 1
: 0;
this.form.isX = this.multiple.some((item) => item == "重点人群")
? 1
: 0;
if (this.form.id != null) {
updatePerson(this.form).then((response) => {
this.open = false;
this.getPersonList();
this.$modal.msgSuccess("修改成功");
});
} else {
this.form.userId = this.userId;
this.form.buildingId = this.houseItem.buildingId;
this.form.houseId = this.houseItem.id;
this.form.deptId = this.houseItem.deptId;
addPerson(this.form).then((res) => {
this.open = false;
this.getPersonList();
this.$modal.msgSuccess("新增成功");
});
}
}
});
},
addPerson() {
this.reset();
this.title = "添加居民";
this.open = true;
},
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.houseData = handleColor([result.data])[0];
this.getList();
},
async getList() {
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);
& > div {
height: 100%;
width: 100%;
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;
}
.row-btn {
flex-direction: row-reverse;
}
.is-list > div {
margin-right: 10px;
}
}
.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;
}
::v-deep .el-form-item__label {
color: #7ff7ff;
}
::v-deep .el-form-item__content {
background: #162841;
}
::v-deep .el-checkbox-group {
padding-left: 10px;
.el-checkbox__label {
padding-left: 3px;
color: #aabace;
}
.el-checkbox {
margin-right: 12px;
}
}
::v-deep .el-radio-group {
padding-left: 10px;
.el-radio__label {
padding-left: 3px;
color: #aabace;
}
.el-radio {
margin-right: 12px;
}
}
</style>