Merge branch 'dev' into vite

# Conflicts:
#	packages/IntelligentSecurity/AppISManage/AppISManage.vue
#	vue.config.js
This commit is contained in:
aixianling
2022-04-28 18:42:05 +08:00
31 changed files with 1437 additions and 1538 deletions

View File

@@ -184,7 +184,7 @@
tableData: [],
recordList: [],
colConfigs: [
{prop: 'createTime', label: '上报日期', align: 'center', dateFormart: 'YYYY-MM-DD'},
{prop: 'createTime', label: '上报日期', align: 'center', dateFormat: 'YYYY-MM-DD'},
{prop: 'status', label: '健康状态', align: 'center', formart: v => v === '0' ? '异常' : '正常' }
],
tabList: ['基本信息', '每日上报', '异常处理']

View File

@@ -1,62 +1,36 @@
<template>
<section class="AppISManage">
<device-slider :permissions="permissions" :show.sync="slider" :ins="instance" :dict="dict"
@treeCommand="handleSliderOption" @select="handleSelectMonitor"
:render-item="renderTreeItem" ref="DeviceSlider"/>
<device-slider :permissions="permissions" :show.sync="slider" :ins="instance" :dict="dict" @treeCommand="handleSliderOption" @select="handleSelectMonitor" :render-item="renderTreeItem" ref="DeviceSlider" />
<div class="monitorPane" v-loading="isLoading" element-loading-background="rgba(0, 0, 0, 0.6)">
<div class="headerBar">
<el-select default-first-option size="small" v-model="splitScreen" @change="onChange">
<!-- <i slot="prefix" class="iconfont iconjdq_led_Led1"/> -->
<img slot="prefix" src="https://cdn.cunwuyun.cn/slw2.0/images/fp.png">
<el-option v-for="(op,i) in splitOps" :key="i" v-bind="op"/>
<el-option v-for="(op,i) in splitOps" :key="i" v-bind="op" />
</el-select>
<div class="headerBar-item" v-if="monitors.length > 1" @click="playbackUrls = [], isShowBar = !isShowBar" :class="[isShowBar ? '' : 'cancel-xt']">
<div class="headerBar-item" @click="playbackUrls = [], isShowBar = !isShowBar" :class="[isShowBar ? '' : 'cancel-xt']">
<img src="https://cdn.cunwuyun.cn/slw2.0/images/xt.png">
<span>{{ isShowBar ? '视频协同' : '取消协同' }}</span>
</div>
</div>
<div class="videoList">
<div
class="videoBox"
v-for="(m, i) in monitors"
:key="m.id"
:style="currentSplitStyle">
<AiMonitor
:instance="instance"
:deviceId="m.deviceId"
:isShowBar="isShowBar"
:id="m.id"
:playbackUrls="playbackUrls"
:name="m.name"
@close="removeMonitor(i)"
ref="AiMonitor">
<div class="videoBox" v-for="(m, i) in monitors" :key="m.id" :style="currentSplitStyle">
<AiMonitor :instance="instance" :deviceId="m.deviceId" :isShowBar="isShowBar" :id="m.id" :playbackUrls="playbackUrls" :name="m.name" @close="removeMonitor(i)" ref="AiMonitor">
</AiMonitor>
</div>
</div>
<Synergy
ref="Synergy"
:ids="ids"
:instance="instance"
@replay="onReplay"
:isLoading.sync="isLoading"
@backLiveing="playbackUrls = []"
@checkChange="onCheckChange"
v-if="!isShowBar && monitors.length"
style="width: 100%; height: 68px;">
<Synergy ref="Synergy" :ids="ids" :instance="instance" @replay="onReplay" :isLoading.sync="isLoading" @backLiveing="playbackUrls = []" @checkChange="onCheckChange" v-if="!isShowBar && monitors.length" style="width: 100%; height: 68px;">
</Synergy>
</div>
<ai-dialog title="修改名称" :visible.sync="dialog" width="500px" @onConfirm="handleSubmit(selected)"
@closed="selected={}">
<ai-dialog title="修改名称" :visible.sync="dialog" width="500px" @onConfirm="handleSubmit(selected)" @closed="selected={}">
<el-form ref="form" :model="selected" label-width="80px" size="small" :rules="rules">
<el-form-item label="设备名称" prop="name">
<el-input v-model="selected.name" clearable/>
<el-input v-model="selected.name" clearable />
</el-form-item>
</el-form>
</ai-dialog>
<locate-dialog v-model="locate" :ins="instance" :latlng="latlng" @confirm="v=>handleLocate(selected,v)"/>
<ai-area custom-clicker :input-clicker="false" :hideLevel="disabledLevel" v-model="selected.areaId"
:instance="instance" ref="BindArea"
@change="handleSubmit(selected)"/>
<locate-dialog v-model="locate" :ins="instance" :latlng="latlng" @confirm="v=>handleLocate(selected,v)" />
<ai-area custom-clicker :input-clicker="false" :hideLevel="disabledLevel" v-model="selected.areaId" :instance="instance" ref="BindArea" @change="handleSubmit(selected)" />
</section>
</template>
@@ -68,33 +42,34 @@
import Synergy from "../components/Synergy"
export default {
name: "AppISManage",
components: {LocateDialog, DeviceSlider, AiMonitor, Synergy},
label: "监控实况",
name: 'AppISManage',
components: { LocateDialog, DeviceSlider, AiMonitor, Synergy },
label: '监控实况',
props: {
instance: Function,
dict: Object,
permissions: Function
permissions: Function,
},
computed: {
splitOps() {
return [
{label: "单分屏", value: 1, per: "100%"},
{label: "四分屏", value: 4, per: "49.2%"},
{label: "九分屏", value: 9, per: "32%"}
{ label: '单分屏', value: 1, per: '100%' },
{ label: '四分屏', value: 4, per: '49.2%' },
{ label: '九分屏', value: 9, per: '32%' },
]
},
currentSplitStyle() {
let per = this.splitOps.find(e => e.value == this.splitScreen)?.per || "100%"
return {width: per, height: per}
let per =
this.splitOps.find((e) => e.value == this.splitScreen)?.per || '100%'
return { width: per, height: per }
},
...mapState(['user']),
ids () {
ids() {
if (!this.monitors.length) return ''
return this.monitors.map(v => v.id).join(',')
}
return this.monitors.map((v) => v.id).join(',')
},
},
data() {
@@ -108,26 +83,27 @@
isLoading: false,
isShowBar: true,
selected: {
areaId: ''
areaId: '',
},
videoUrl: '',
playbackUrls: [],
latlng: null,
disabledLevel: 0,
rules: {
name: [{required: true, message: "请填写 设备名称"}]
}
name: [{ required: true, message: '请填写 设备名称' }],
},
}
},
watch: {
slider () {
this.$refs.AiMonitor && this.$refs.AiMonitor.forEach(e => {
e.reset()
})
slider() {
this.$refs.AiMonitor &&
this.$refs.AiMonitor.forEach((e) => {
e.reset()
})
this.$refs.Synergy && this.$refs.Synergy.init()
}
},
},
created() {
@@ -143,18 +119,21 @@
handleSelectMonitor(monitor) {
if (monitor.type !== '1') return
let {id} = monitor,
index = this.monitors.findIndex(e => e.id == id)
let { id } = monitor,
index = this.monitors.findIndex((e) => e.id == id)
if (index > -1) {
this.$message.error('该监控视频已存在')
} else if (this.monitors.length >= this.splitScreen && this.splitScreen > 1) {
this.$message.error("可分屏监控已满,请先取消其他的监控")
} else if (
this.monitors.length >= this.splitScreen &&
this.splitScreen > 1
) {
this.$message.error('可分屏监控已满,请先取消其他的监控')
} else {
this.showMonitor(monitor)
}
},
onCheckChange (e) {
onCheckChange(e) {
this.monitors.forEach((item, index) => {
if (e.indexOf(item.index) === -1) {
this.monitors.splice(index, 1)
@@ -167,347 +146,375 @@
this.monitors = [this.monitors[0]]
}
this.$refs.AiMonitor && this.$refs.AiMonitor.forEach(e => {
e.reset()
})
this.$refs.AiMonitor &&
this.$refs.AiMonitor.forEach((e) => {
e.reset()
})
},
onReplay (e) {
onReplay(e) {
this.isLoading = true
this.instance.post(`/app/appzyvideoequipment/getSlwPlaybackUrl`, null, {
params: {
ids: this.ids,
startTime: e.startTime,
endTime: e.endTime,
nvrCodes: this.ids
}
}).then(res => {
if (res.code == 0) {
if (res.data && res.data.length) {
this.playbackUrls = res.data
this.isLoading = false
this.instance
.post(`/app/appzyvideoequipment/getSlwPlaybackUrl`, null, {
params: {
ids: this.ids,
startTime: e.startTime,
endTime: e.endTime,
nvrCodes: this.ids,
},
})
.then((res) => {
if (res.code == 0) {
if (res.data && res.data.length) {
this.playbackUrls = res.data
this.isLoading = false
}
}
}
}).catch(() => {
this.isLoading = false
})
})
.catch(() => {
this.isLoading = false
})
},
removeMonitor(i) {
this.monitors.splice(i, 1)
if (!this.monitors.length) {
this.isShowBar = true
}
},
showMonitor(monitor, refresh = false) {
let {id: deviceId} = monitor
deviceId && this.instance.post("/app/appzyvideoequipment/getWebSdkUrl", null, {
params: {deviceId}
}).then(res => {
if (res?.data) {
this.videoUrl = res.data
let data = {
url: res.data,
isShowPlayBtn: false
}
if (refresh) {
monitor.url = data.url
} else if (this.splitScreen == 1) {
this.monitors = [{...monitor, ...data}]
} else {
if (this.monitors.findIndex(e => e.id == monitor.id) === -1 && this.monitors.length <= this.splitScreen) {
this.monitors.push({...monitor, ...data})
let { id: deviceId } = monitor
if (deviceId) {
this.isLoading = true
this.instance.post('/app/appzyvideoequipment/getWebSdkUrl', null, {
params: { deviceId },
}).then((res) => {
if (res?.data) {
this.videoUrl = res.data
let data = {
url: res.data,
isShowPlayBtn: false,
}
if (refresh) {
monitor.url = data.url
} else if (this.splitScreen == 1) {
this.monitors = [{ ...monitor, ...data }]
} else {
if (
this.monitors.findIndex((e) => e.id == monitor.id) === -1 &&
this.monitors.length <= this.splitScreen
) {
this.monitors.push({ ...monitor, ...data })
}
}
}
}
})
this.isLoading = false
}).catch(() => {
this.isLoading = false
})
}
},
renderTreeItem: function (h, {node, data}) {
renderTreeItem: function (h, { node, data }) {
let show = data.deviceStatus == 1 ? 'show' : ''
const ids = this.ids.split(',')
const index = ids.indexOf(data.id) + 1
if (node.isLeaf) {
return (
<div class="flexRow">
{index > 0 ?
<span>{ index }</span>
: ''
}
<i class={['iconfont', 'iconshipinjiankong', show]}/>
<div>{node.label}</div>
</div>
<div class="flexRow">
{index > 0 ? <span>{index}</span> : ''}
<i class={['iconfont', 'iconshipinjiankong', show]} />
<div>{node.label}</div>
</div>
)
} else return (
} else
return (
<div class="flexRow">
<div>{node.label}</div>
{data.id != 'no_area' ? <div class="sta">
<p>{data.online || 0}</p>/{data.sum || 0}
</div>
: <div/>}
{data.id != 'no_area' ? (
<div class="sta">
<p>{data.online || 0}</p>/{data.sum || 0}
</div>
) : (
<div />
)}
</div>
)
)
},
handleSliderOption(e) {
this.selected = {
command: e.type,
...e.node
...e.node,
}
this.selected.areaId = e.node.areaId || this.user.info.areaId
if (e.type == "edit") {//修改名称
if (e.type == 'edit') {
//修改名称
this.dialog = true
} else if (e.type == "area") {//绑定areaId
} else if (e.type == 'area') {
//绑定areaId
this.$refs.BindArea?.chooseArea()
} else if (e.type == "locate") {//地图标绘
this.latlng = e.node.lat && e.node.lng ? {
lat: e.node.lat,
lng: e.node.lng
} : ''
} else if (e.type == 'locate') {
//地图标绘
this.latlng =
e.node.lat && e.node.lng
? {
lat: e.node.lat,
lng: e.node.lng,
}
: ''
this.locate = true
}
},
handleSubmit(row) {
delete row.createTime
return this.instance.post("/app/appzyvideoequipment/addOrUpdate", {
...row
}).then(res => {
if (res?.code == 0) {
this.$message.success("提交成功!")
this.dialog = false
this.$refs.DeviceSlider?.getDevices()
}
})
return this.instance
.post('/app/appzyvideoequipment/addOrUpdate', {
...row,
})
.then((res) => {
if (res?.code == 0) {
this.$message.success('提交成功!')
this.dialog = false
this.$refs.DeviceSlider?.getDevices()
}
})
},
handleLocate(row, locate) {
if (locate) {
let {lat, lng} = locate.location
this.handleSubmit({...row, lat, lng}).then(() => {
let { lat, lng } = locate.location
this.handleSubmit({ ...row, lat, lng }).then(() => {
this.locate = false
})
}
}
},
},
beforeDestroy() {
this.monitors = []
}
},
}
</script>
<style lang="scss" scoped>
.AppISManage {
display: flex;
background: #202330;
height: 100%;
.monitorPane {
flex: 1;
min-width: 0;
padding: 20px 20px 20px 4px;
.AppISManage {
display: flex;
flex-direction: column;
background: #202330;
height: 100%;
::v-deep .headerBar {
.monitorPane {
flex: 1;
min-width: 0;
padding: 20px 20px 20px 4px;
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
margin-bottom: 24px;
flex-direction: column;
.headerBar-item {
::v-deep .headerBar {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 40px;
background: #2C2F3E;
border-radius: 4px;
justify-content: flex-end;
gap: 8px;
margin-bottom: 24px;
.headerBar-item {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 40px;
background: #2c2f3e;
border-radius: 4px;
color: #fff;
font-size: 12px;
cursor: pointer;
&.cancel-xt {
background: linear-gradient(90deg, #299fff 0%, #0c61ff 100%);
}
&:hover {
opacity: 0.7;
}
span {
margin-left: 6px;
}
}
.iconfont {
color: #fff;
height: 100%;
display: flex;
align-items: center;
font-size: 20px;
}
.el-input__icon {
color: #fff;
}
.el-input--prefix .el-input__inner {
padding-left: 16px;
}
.el-input--suffix .el-input__inner {
padding-right: 16px;
}
.el-input__prefix {
top: 50%;
left: 10px;
height: auto;
transform: translateY(-50%);
}
.el-input {
display: flex;
align-items: center;
font-size: 12px;
width: 100px;
height: 40px;
padding: 0 12px;
box-sizing: border-box;
background: #2c2f3e;
}
input {
text-align: center;
}
.el-input__inner,
.el-button {
color: #fff;
border: none;
background: transparent;
&:hover {
color: #26f;
}
}
}
.videoList {
display: flex;
justify-content: flex-start;
align-content: flex-start;
flex-wrap: wrap;
flex: 1;
min-height: 0;
overflow: hidden;
gap: 8px;
}
.videoBox {
position: relative;
background: #000;
flex-shrink: 0;
& > span {
position: absolute;
bottom: 0;
left: 0;
z-index: 11;
width: 60%;
height: 38px;
line-height: 38px;
padding: 0 10px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #fff;
font-size: 16px;
}
.videoBox-close {
display: flex;
position: absolute;
align-items: center;
justify-content: center;
right: 8px;
top: 8px;
z-index: 11;
width: 84px;
height: 32px;
line-height: 1;
background: linear-gradient(180deg, #2e3447 0%, #151825 100%);
border-radius: 2px;
cursor: pointer;
font-size: 12px;
color: #fff;
&:hover {
opacity: 0.8;
}
span {
margin-left: 4px;
}
i {
position: relative;
font-size: 16px;
}
}
iframe {
width: 100%;
height: 100%;
}
}
}
::v-deep.el-tree-node__content:hover {
.menuBtn {
display: block;
}
}
::v-deep .flexRow {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: #fff;
span {
width: 16px;
height: 16px;
line-height: 16px;
text-align: center;
color: #fff;
font-size: 12px;
cursor: pointer;
&.cancel-xt {
background: linear-gradient(90deg, #299FFF 0%, #0C61FF 100%);
}
&:hover {
opacity: 0.7;
}
span {
margin-left: 6px;
}
border-radius: 1px;
background: #2266ff;
}
.iconfont {
color: #fff;
height: 100%;
display: flex;
align-items: center;
font-size: 20px;
}
color: #89b;
.el-input__icon {
color: #fff;
}
.el-input--prefix .el-input__inner {
padding-left: 16px;
}
.el-input--suffix .el-input__inner {
padding-right: 16px;
}
.el-input__prefix {
top: 50%;
left: 10px;
height: auto;
transform: translateY(-50%);
}
.el-input {
display: flex;
align-items: center;
font-size: 12px;
width: 100px;
height: 40px;
padding: 0 12px;
box-sizing: border-box;
background: #2C2F3E;
}
input {
text-align: center;
}
.el-input__inner, .el-button {
color: #fff;
border: none;
background: transparent;
&:hover {
color: #26f;
&.show {
color: #19d286;
}
}
}
.videoList {
display: flex;
justify-content: flex-start;
align-content: flex-start;
flex-wrap: wrap;
flex: 1;
min-height: 0;
overflow: hidden;
gap: 8px;
}
.sta {
display: flex;
flex: 1;
min-width: 0;
.videoBox {
position: relative;
background: #000;
flex-shrink: 0;
& > p {
color: #19d286;
}
}
& > span {
.menuBtn {
display: none;
position: absolute;
bottom: 0;
left: 0;
z-index: 11;
width: 60%;
height: 38px;
line-height: 38px;
padding: 0 10px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #fff;
font-size: 16px;
}
.videoBox-close {
display: flex;
position: absolute;
align-items: center;
justify-content: center;
right: 8px;
top: 8px;
z-index: 11;
width: 84px;
height: 32px;
line-height: 1;
background: linear-gradient(180deg, #2E3447 0%, #151825 100%);
border-radius: 2px;
cursor: pointer;
font-size: 12px;
color: #fff;
&:hover {
opacity: 0.8;
}
span {
margin-left: 4px;
}
i {
position: relative;
font-size: 16px;
}
}
iframe {
width: 100%;
height: 100%;
right: 4px;
}
}
}
::v-deep.el-tree-node__content:hover {
.menuBtn {
display: block;
}
}
::v-deep .flexRow {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: #fff;
span {
width: 16px;
height: 16px;
line-height: 16px;
text-align: center;
color: #fff;
font-size: 12px;
border-radius: 1px;
background: #2266FF;
}
.iconfont {
color: #89b;
&.show {
color: #19D286;
}
}
.sta {
display: flex;
flex: 1;
min-width: 0;
& > p {
color: #19D286;
}
}
.menuBtn {
display: none;
position: absolute;
right: 4px;
}
}
}
</style>

View File

@@ -7,12 +7,7 @@
<span>关闭视频</span>
</div>
</div>
<iframe
v-if="isShow"
:id="iframeId"
allow="autoplay *; microphone *; fullscreen *" allowfullscreen allowtransparency key="" allowusermedia frameBorder="no"
style="width: 100%; height: 100%;"
:src="`https://cdn.cunwuyun.cn/slw2.0/index.html?url=${src}`">
<iframe v-if="isShow" :id="iframeId" allow="autoplay *; microphone *; fullscreen *" allowfullscreen allowtransparency key="" allowusermedia frameBorder="no" style="width: 100%; height: 100%;" :src="`https://cdn.cunwuyun.cn/slw2.0/index.html?url=${src}`">
</iframe>
<div class="slw-bottom" v-if="isShowBar">
<Timeline class="Timeline" v-if="times.length" :times="times" @replay="onReplay" :isLiveing="isLiveing" :width="width" ref="timeline" :style="{width: width}"></Timeline>
@@ -20,24 +15,13 @@
<div class="left">
<div class="left-btns">
<el-tooltip effect="dark" :content="isPause ? '播放' : '暂停'" placement="top">
<img
:src="isPause ? 'https://cdn.cunwuyun.cn/slw2.0/images/play.png' : 'https://cdn.cunwuyun.cn/slw2.0/images/pause.png'"
@click="changePlayStatus">
<img :src="isPause ? 'https://cdn.cunwuyun.cn/slw2.0/images/play.png' : 'https://cdn.cunwuyun.cn/slw2.0/images/pause.png'" @click="changePlayStatus">
</el-tooltip>
</div>
<div
class="volume"
@mouseleave.stop="isShowVolume = false">
<img
@mouseenter.stop="isShowVolume = true"
src="https://cdn.cunwuyun.cn/slw2.0/images/sound.png">
<div class="volume" @mouseleave.stop="isShowVolume = false">
<img @mouseenter.stop="isShowVolume = true" src="https://cdn.cunwuyun.cn/slw2.0/images/sound.png">
<div class="volume-slider" :class="[isShowVolume ? 'active' : '']">
<el-slider
input-size="mini"
v-model="volume"
vertical
@change="onVolume"
height="80px">
<el-slider input-size="mini" v-model="volume" vertical @change="onVolume" height="80px">
</el-slider>
</div>
</div>
@@ -63,19 +47,10 @@
</div>
</div>
</div>
<ai-dialog
title="选择日期"
:visible.sync="isShowDate"
width="520px"
@onConfirm="onConfirm">
<ai-dialog title="选择日期" :visible.sync="isShowDate" width="520px" @onConfirm="onConfirm">
<el-form class="ai-form" ref="form" :model="form" label-width="80px" size="small">
<el-form-item label="选择日期" prop="date" :rules="[{ required: true, message: '请选择日期', trigger: 'change' }]">
<el-date-picker
value-format="yyyy-MM-dd"
v-model="form.date"
type="date"
:picker-options="pickerOptions"
placeholder="选择日期">
<el-date-picker value-format="yyyy-MM-dd" v-model="form.date" type="date" :picker-options="pickerOptions" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-form>
@@ -128,7 +103,8 @@
computed: {
src () {
if (this.playbackUrls.length) {
return this.playbackUrls.filter(v => v.id === this.id)[0].playbackUrl
const arr = this.playbackUrls.filter(v => v.id === this.id)
return arr.length ? arr[0].playbackUrl : []
}
if (this.isLiveing) {
@@ -252,6 +228,7 @@
fullScreenChange () {
if (document.fullscreenElement) {
this.reset()
} else {
this.reset()
}
@@ -269,7 +246,7 @@
},
changePlayStatus () {
const subPage = document.querySelector(`#${this.id}`).contentWindow
const subPage = document.querySelector(`#${this.iframeId}`).contentWindow
subPage.postMessage({
type: 'play',
value: this.isPause
@@ -314,7 +291,7 @@
this.$nextTick(() => {
this.$refs.timeline && this.$refs.timeline.init()
})
}, 60)
}, 100)
},
screenshots () {

View File

@@ -1,19 +1,9 @@
<template>
<div class="synergr" :id="videoId" v-if="isInit" @mouseleave="isHide = true" @mousemove.stop="onMousemove" @mouseup="onMouseUp">
<canvas
id="synergr-canvas"
:style="{height: '28px'}"
v-if="canvasWidth"
@click="onClick"
:width="canvasWidth"
height="28">
<canvas id="synergr-canvas" :style="{height: '28px'}" v-if="canvasWidth" @click="onClick" :width="canvasWidth" height="28">
</canvas>
<div class="time" v-show="!isHide && left > 100" :style="{left: (left) + 'px'}">{{ time }}</div>
<img
@mousedown="onDragDown"
class="drag-img"
:style="{left: (x) + 'px'}"
src="https://cdn.cunwuyun.cn/slw2.0/images/drag.png" />
<img @mousedown="onDragDown" class="drag-img" :style="{left: (x) + 'px'}" src="https://cdn.cunwuyun.cn/slw2.0/images/drag.png" />
<div class="slw-bottom">
<div class="action-bar">
<div class="left">
@@ -58,25 +48,17 @@
<div class="playback-item" v-for="(item, index) in times" :key="index">
<el-checkbox :label="item.id">
<span>通道{{ index + 1 }}</span>
<PlaybackTime class="playback-item__timeline" :key="'PlaybackTime' + index" v-if="item.times.length" :deviceId="item.id" :times="item.times"></PlaybackTime>
</el-checkbox>
<PlaybackTime class="playback-item__timeline" :key="'PlaybackTime' + index" v-if="item.times.length" :deviceId="item.id" :times="item.times"></PlaybackTime>
<i :style="{left: (x - 17) + 'px'}"></i>
</div>
</el-checkbox-group>
</div>
</div>
<ai-dialog
title="选择日期"
:visible.sync="isShowDate"
width="520px"
@onConfirm="onConfirm">
<ai-dialog title="选择日期" :visible.sync="isShowDate" width="520px" @onConfirm="onConfirm">
<el-form class="ai-form" ref="form" :model="form" label-width="80px" size="small">
<el-form-item label="选择日期" prop="date" :rules="[{ required: true, message: '请选择日期', trigger: 'change' }]">
<el-date-picker
value-format="yyyy-MM-dd"
v-model="form.date"
type="date"
:picker-options="pickerOptions"
placeholder="选择日期">
<el-date-picker value-format="yyyy-MM-dd" v-model="form.date" type="date" :picker-options="pickerOptions" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-form>
@@ -159,7 +141,12 @@
const canvasInfo = document.querySelector(`#synergr-canvas`).getBoundingClientRect()
const seconds = 24 * 60 * 60
const x = e.clientX - canvasInfo.left + 100
if (x < 100) return
if (x < 100 || x > this.canvasWidth + 100) {
this.isHide = true
return false
}
const unit = seconds / this.canvasWidth * (x - 100)
this.left = x
@@ -430,30 +417,43 @@
color: #FFFFFF;
.playback-item {
position: relative;
display: flex;
align-items: center;
width: 100%;
margin-bottom: 4px;
i {
position: absolute;
top: 50%;
z-index: 1;
width: 2px;
height: 12px;
background: #FFC916;
transform: translateY(-50%);
}
&:last-child {
margin-bottom: 0;
}
.playback-item__timeline {
flex: 1;
height: 12px;
line-height: 1;
border-radius: 6px;
}
.el-checkbox {
display: flex;
align-items: center;
width: 100%;
// width: 100%;
.el-checkbox__label {
display: flex;
align-items: center;
flex: 1;
.playback-item__timeline {
flex: 1;
height: 12px;
line-height: 1;
border-radius: 6px;
}
span {
width: 60px;
color: #fff;

View File

@@ -1,21 +1,12 @@
<template>
<div :class="wrapper" class="canvas" @click="onClick" @mousemove.stop="onMousemove" @mouseup="onMouseUp" @mouseleave="isHide = true" v-if="isInit">
<canvas
:id="id"
:style="{height: '52px'}"
v-if="canvasWidth"
:width="canvasWidth"
height="52">
<div :class="wrapper" class="canvas" @click="onClick" @mousemove.stop="onMousemove" @mouseup="onMouseUp" @mouseleave="isHide = true" v-if="isInit">
<canvas :id="id" :style="{height: '52px'}" v-if="canvasWidth" :width="canvasWidth" height="52">
</canvas>
<div class="time" v-show="!isHide" :style="{left: left + 'px'}">{{ time }}</div>
<div class="time-scale" :style="{left: x + 'px'}">
<span></span>
</div>
<img
@mousedown="onDragDown"
class="drag-img"
:style="{left: x + 'px'}"
src="https://cdn.cunwuyun.cn/slw2.0/images/drag.png" />
<img @mousedown="onDragDown" class="drag-img" :style="{left: x + 'px'}" src="https://cdn.cunwuyun.cn/slw2.0/images/drag.png" />
</div>
</template>

View File

@@ -29,7 +29,7 @@
export default {
name: "AppGridMemberJp",
label: "网格管理员",
label: "网格管理员(防返贫)",
props: {
instance: Function,

View File

@@ -8,38 +8,39 @@
<template #left>
<el-button size="small" type="primary" icon="iconfont iconAdd" @click="isShow = true">添加</el-button>
<el-button size="small" :disabled="!ids.length" icon="iconfont iconDelete" @click="removeAll">批量删除</el-button>
<el-select size="small" style="width: 200px;" v-model="search.girdId" placeholder="所属网格" clearable @change="getListInit()">
<el-select size="small" style="width: 200px;" v-model="search.girdId" placeholder="所属网格" clearable
@change="getListInit()">
<el-option
v-for="(item,i) in girdList"
:key="i"
:label="item.girdName"
:value="item.id"
v-for="(item,i) in girdList"
:key="i"
:label="item.girdName"
:value="item.id"
>
</el-option>
</el-select>
</template>
<template #right>
<el-input
v-model="search.name"
class="search-input"
size="small"
v-throttle="() => {search.current = 1, getList()}"
placeholder="姓名/身份证/联系方式"
clearable
@clear="search.current = 1, search.name = '', getList()"
suffix-icon="iconfont iconSearch">
v-model="search.name"
class="search-input"
size="small"
v-throttle="() => {search.current = 1, getList()}"
placeholder="姓名/身份证/联系方式"
clearable
@clear="search.current = 1, search.name = '', getList()"
suffix-icon="iconfont iconSearch">
</el-input>
</template>
</ai-search-bar>
<ai-table
:tableData="tableData"
:col-configs="colConfigs"
:total="total"
style="margin-top: 6px;"
:current.sync="search.current"
:size.sync="search.size"
@handleSelectionChange="handleSelectionChange"
@getList="getList">
:tableData="tableData"
:col-configs="colConfigs"
:total="total"
style="margin-top: 6px;"
:current.sync="search.current"
:size.sync="search.size"
@handleSelectionChange="handleSelectionChange"
@getList="getList">
<el-table-column slot="options" width="100px" fixed="right" label="操作" align="center">
<template slot-scope="{ row }">
<div class="table-options">
@@ -49,19 +50,20 @@
</el-table-column>
</ai-table>
<ai-dialog
:visible.sync="isShow"
width="890px"
@close="closeDialog"
title="添加户主"
@onConfirm="onConfirm">
<ai-area-select clearable always-show :instance="instance" v-model="areaId" :disabled-level="disabledLevel" @change="search.current = 1, getUserList()"></ai-area-select>
:visible.sync="isShow"
width="890px"
@close="closeDialog"
title="添加户主"
@onConfirm="onConfirm">
<ai-area-select clearable always-show :instance="instance" v-model="areaId" :disabled-level="disabledLevel"
@change="search.current = 1, getUserList()"></ai-area-select>
<span style="margin-top:16px;"><span style="color:#f46;margin-right:4px;">*</span>网格</span>
<el-select size="small" style="width: 280px;margin-top:16px;" v-model="girdId" placeholder="请选择网格" clearable>
<el-option
v-for="(item,i) in girdList"
:key="i"
:label="item.girdName"
:value="item.id"
v-for="(item,i) in girdList"
:key="i"
:label="item.girdName"
:value="item.id"
>
</el-option>
</el-select>
@@ -72,22 +74,22 @@
<h2>户主信息列表</h2>
</div>
<el-input
class="search-input"
size="mini"
placeholder="请输入姓名/身份证号"
v-model="name"
clearable
v-throttle="getUserList"
@clear="name = '', getUserList()"
suffix-icon="iconfont iconSearch">
class="search-input"
size="mini"
placeholder="请输入姓名/身份证号"
v-model="name"
clearable
v-throttle="getUserList"
@clear="name = '', getUserList()"
suffix-icon="iconfont iconSearch">
</el-input>
</div>
<el-scrollbar class="AiWechatSelecter-list">
<el-checkbox-group v-model="chooseUser">
<el-checkbox
:label="`${item.name}~${item.id}`"
v-for="(item, index) in userList"
:key="index">
:label="`${item.name}~${item.id}`"
v-for="(item, index) in userList"
:key="index">
{{ item.name }}-{{ item.idNumber }}
</el-checkbox>
</el-checkbox-group>
@@ -102,12 +104,12 @@
<el-scrollbar class="AiWechatSelecter-list">
<div class="tags-wrapper">
<el-tag
v-for="(item, index) in chooseUser"
:key="index"
closable
@close="del(item)"
size="small"
type="info">
v-for="(item, index) in chooseUser"
:key="index"
closable
@close="del(item)"
size="small"
type="info">
{{ item.split('~')[0] }}
</el-tag>
</div>
@@ -120,379 +122,380 @@
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'Family',
import {mapState} from 'vuex'
props: {
instance: Function,
dict: Object,
params: Object
},
export default {
name: 'Family',
data() {
return {
search: {
current: 1,
size: 10,
name: '',
girdId: ''
},
isLoading: false,
form: {
props: {
instance: Function,
dict: Object,
params: Object
},
},
userList: [],
data() {
return {
search: {
current: 1,
size: 10,
name: '',
chooseUser: [],
isShow: false,
total: 10,
colConfigs: [
{ type: 'selection', label: '' },
{ prop: 'name', label: '户主姓名', align: 'left', width: '200px' },
{ prop: 'idNumber', label: '身份证号', align: 'center' },
{ prop: 'phone', label: '联系方式', align: 'center' },
{ prop: 'girdName', label: '所属网格', align: 'center' },
{ prop: 'createTime', label: '添加时间', align: 'center' },
{ slot: 'options', label: '操作', align: 'center' }
],
tableData: [],
areaId: '',
ids: [],
disabledLevel: 0,
girdList: [],
girdId: '',
}
},
girdId: ''
},
isLoading: false,
form: {},
userList: [],
name: '',
chooseUser: [],
isShow: false,
total: 10,
colConfigs: [
{type: 'selection', label: ''},
{prop: 'name', label: '户主姓名', align: 'left', width: '200px'},
{prop: 'idNumber', label: '身份证号', align: 'center'},
{prop: 'phone', label: '联系方式', align: 'center'},
{prop: 'girdName', label: '所属网格', align: 'center'},
{prop: 'createTime', label: '添加时间', align: 'center'},
{slot: 'options', label: '操作', align: 'center'}
],
tableData: [],
areaId: '',
ids: [],
disabledLevel: 0,
girdList: [],
girdId: '',
}
},
computed: {
...mapState(['user'])
},
computed: {
...mapState(['user'])
},
created() {
this.areaId = this.user.info.areaId
this.disabledLevel = this.user.info.areaList.length
this.dict.load('epidemicDangerousAreaLevel').then(() => {
this.getGirdList()
this.getList()
this.getUserList()
created() {
this.areaId = this.user.info.areaId
this.disabledLevel = this.user.info.areaList.length
this.dict.load('epidemicDangerousAreaLevel').then(() => {
this.getGirdList()
this.getList()
this.getUserList()
})
},
methods: {
getGirdList() {
this.instance.post(`/app/appgirdmemberinfo/queryMyGirdListByLevel2?girdMemberId=${this.params.id}`).then(res => {
if (res.code == 0) {
this.girdList = res.data
}
})
},
getListInit() {
this.search.current = 1
this.getList()
},
getList() {
this.instance.post(`/app/appgirdmemberpoverty/listByGirdMemberByWeb`, null, {
params: {
...this.search,
girdMemberId: this.params.id,
}
}).then(res => {
if (res.code == 0) {
this.tableData = res.data.records
this.total = res.data.total
}
})
},
methods: {
getGirdList() {
this.instance.post(`/app/appgirdmemberinfo/queryMyGirdListByLevel2?girdMemberId=${this.params.id}`).then(res => {
if (res.code == 0) {
this.girdList = res.data
}
})
},
getListInit() {
this.search.current = 1
this.getList()
},
getList () {
this.instance.post(`/app/appgirdmemberpoverty/listByGirdMemberByWeb`, null, {
params: {
...this.search,
girdMemberId: this.params.id,
}
}).then(res => {
if (res.code == 0) {
this.tableData = res.data.records
this.total = res.data.total
}
})
},
removeAll() {
if (!this.ids) {
return this.$message.error('请选择户主')
}
this.remove(this.ids.join(','))
},
handleSelectionChange(e) {
this.ids = e.map(v => v.gmrId)
},
clearAll () {
this.chooseUser = []
},
onConfirm () {
if(!this.girdId) {
return this.$message.error('请选择网格')
}
if (!this.chooseUser.length) {
return this.$message.error('请选择户主')
}
const povertyList = this.chooseUser.map(v => {
return {
girdMemberId: this.params.id,
name: v.split('~')[0],
girdId: this.girdId,
povertyId: v.split('~')[1]
}
})
this.instance.post(`/app/appgirdmemberpoverty/add`, {
povertyList
}).then(res => {
if (res.code == 0) {
this.current = 1
this.getList()
this.$message.success('添加成功')
this.closeDialog()
}
})
},
closeDialog() {
this.isShow = false
this.chooseUser = []
this.girdId = ''
this.name = ''
this.areaId = this.user.info.areaId
this.getUserList()
},
del (e) {
this.chooseUser.splice(this.chooseUser.indexOf(e), 1)
},
getUserList () {
this.isLoading = true
this.instance.post(`/app/apppreventionreturntopoverty/list`, null, {
params: {
current: 1,
size: 200,
con: this.name,
isHousehold: 1,
areaId: this.areaId
}
}).then(res => {
if (res.code == 0) {
this.userList = res.data.records
}
this.isLoading = false
})
},
onBack () {
this.$emit('change', {
type: 'list'
})
},
remove(id) {
this.$confirm('确定删除该数据?').then(() => {
this.instance.post(`/app/appgirdmemberresident/delete?ids=${id}`).then(res => {
if (res.code == 0) {
this.$message.success('删除成功!')
this.getList()
}
})
})
if (!this.ids) {
return this.$message.error('请选择户主')
}
this.remove(this.ids.join(','))
},
handleSelectionChange(e) {
this.ids = e.map(v => v.gmpId)
},
clearAll() {
this.chooseUser = []
},
onConfirm() {
if (!this.girdId) {
return this.$message.error('请选择网格')
}
if (!this.chooseUser.length) {
return this.$message.error('请选择户主')
}
const povertyList = this.chooseUser.map(v => {
return {
girdMemberId: this.params.id,
name: v.split('~')[0],
girdId: this.girdId,
povertyId: v.split('~')[1]
}
})
this.instance.post(`/app/appgirdmemberpoverty/add`, {
povertyList
}).then(res => {
if (res.code == 0) {
this.current = 1
this.getList()
this.$message.success('添加成功')
this.closeDialog()
}
})
},
closeDialog() {
this.isShow = false
this.chooseUser = []
this.girdId = ''
this.name = ''
this.areaId = this.user.info.areaId
this.getUserList()
},
del(e) {
this.chooseUser.splice(this.chooseUser.indexOf(e), 1)
},
getUserList() {
this.isLoading = true
this.instance.post(`/app/apppreventionreturntopoverty/list`, null, {
params: {
current: 1,
size: 200,
con: this.name,
isHousehold: 1,
areaId: this.areaId
}
}).then(res => {
if (res.code == 0) {
this.userList = res.data.records
}
this.isLoading = false
})
},
onBack() {
this.$emit('change', {
type: 'list'
})
},
remove(id) {
this.$confirm('确定删除该数据?').then(() => {
this.instance.post(`/app/appgirdmemberresident/delete?ids=${id}`).then(res => {
if (res.code == 0) {
this.$message.success('删除成功!')
this.getList()
}
})
})
}
}
}
</script>
<style lang="scss" scoped>
.Family {
.AiWechatSelecter-container {
display: flex;
height: 380px;
margin-top: 20px;
.Family {
.AiWechatSelecter-container {
display: flex;
height: 380px;
margin-top: 20px;
::v-deep {
.el-icon-circle-close {
display: inline-block!important;
}
::v-deep {
.el-icon-circle-close {
display: inline-block !important;
}
}
.tree-container {
& > span {
display: block;
margin-bottom: 4px;
}
.tree-container {
& > span {
display: block;
margin-bottom: 4px;
}
.tree-user__item {
display: flex;
align-items: center;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
}
img {
width: 27px;
height: 27px;
margin-right: 10px;
}
}
::v-deep .el-tree {
background: transparent;
.el-tree-node {
margin-bottom: 8px;
&:last-child {
margin-bottom: 0;
}
}
.el-tree-node__content {
height: auto;
margin-top: 2px;
// align-items: inherit;
}
.el-tree-node__expand-icon {
height: 24px;
}
}
.mask-btn__wrapper {
position: relative;
}
.mask-btn {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.userlist-item {
.tree-user__item {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
}
img {
width: 27px;
height: 27px;
margin-right: 10px;
}
}
::v-deep .el-tree {
background: transparent;
.el-tree-node {
margin-bottom: 8px;
padding: 0 17px;
cursor: pointer;
user-select: none;
::v-deep .el-checkbox__label {
display: none;
}
.userlist-item__left {
display: flex;
align-items: center;
span {
color: #222222;
font-size: 14px;
}
img {
width: 40px;
height: 40px;
margin-right: 8px;
}
&:last-child {
margin-bottom: 0;
}
}
& > div {
width: 280px;
background: #FCFCFC;
border: 1px solid #D0D4DC;
.el-tree-node__content {
height: auto;
margin-top: 2px;
// align-items: inherit;
}
.AiWechatSelecter-list {
height: calc(100% - 40px);
padding: 8px 0;
.el-tree-node__expand-icon {
height: 24px;
}
}
::v-deep .el-scrollbar__wrap {
margin-bottom: 0!important;
overflow-x: hidden;
}
.mask-btn__wrapper {
position: relative;
}
::v-deep .el-checkbox-group {
padding: 0 8px;
.mask-btn {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
}
.el-checkbox {
display: block;
margin-right: 0;
}
}
.userlist-item {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
padding: 0 17px;
cursor: pointer;
user-select: none;
::v-deep .el-checkbox__label {
display: none;
}
.AiWechatSelecter-container__left {
flex: 1;
}
.AiWechatSelecter-container__right {
flex: 1;
margin-left: 20px;
.AiWechatSelecter-list {
.tags-wrapper {
padding: 0 8px;
}
.el-tag {
margin: 0 8px 8px 0px;
color: #222222;
font-size: 14px;
}
}
}
.AiWechatSelecter-header {
.userlist-item__left {
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
padding: 0 8px 0 0;
border-bottom: 1px solid #D0D4DC;
background: #F5F7FA;
.AiWechatSelecter-header__left {
display: flex;
align-items: center;
padding: 0 8px;
h2 {
height: 100%;
line-height: 40px;
color: #222222;
font-size: 14px;
text-align: center;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
color: #2266FF;
border-color: #2266FF;
}
}
}
.el-button {
height: 28px;
padding: 7px 5px;
}
.el-input {
width: 160px;
}
}
.AiWechatSelecter-header__right {
padding: 0 8px;
h2 {
span {
color: #222222;
font-size: 14px;
text-align: center;
}
img {
width: 40px;
height: 40px;
margin-right: 8px;
}
}
}
& > div {
width: 280px;
background: #FCFCFC;
border: 1px solid #D0D4DC;
}
.AiWechatSelecter-list {
height: calc(100% - 40px);
padding: 8px 0;
::v-deep .el-scrollbar__wrap {
margin-bottom: 0 !important;
overflow-x: hidden;
}
::v-deep .el-checkbox-group {
padding: 0 8px;
.el-checkbox {
display: block;
margin-right: 0;
}
}
}
.AiWechatSelecter-container__left {
flex: 1;
}
.AiWechatSelecter-container__right {
flex: 1;
margin-left: 20px;
.AiWechatSelecter-list {
.tags-wrapper {
padding: 0 8px;
}
.el-tag {
margin: 0 8px 8px 0px;
color: #222222;
font-size: 14px;
}
}
}
.AiWechatSelecter-header {
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
padding: 0 8px 0 0;
border-bottom: 1px solid #D0D4DC;
background: #F5F7FA;
.AiWechatSelecter-header__left {
display: flex;
align-items: center;
padding: 0 8px;
h2 {
height: 100%;
line-height: 40px;
color: #222222;
font-size: 14px;
text-align: center;
cursor: pointer;
border-bottom: 2px solid transparent;
&.active {
color: #2266FF;
border-color: #2266FF;
}
}
}
.el-button {
height: 28px;
padding: 7px 5px;
}
.el-input {
width: 160px;
}
}
.AiWechatSelecter-header__right {
padding: 0 8px;
h2 {
color: #222222;
font-size: 14px;
text-align: center;
}
}
}
}
</style>

View File

@@ -26,11 +26,11 @@ export default {
}
},
created() {
this.dict.load("sex", "fpNation", "fpPrtpStatus", "fpHealth", "fpStudentsInSchool", 'fpYesOrNo', "fpRelationship",
"yesOrNo", "fpLaborSkills", "fpEducation", "fpType", "fpPoliticalOutlook","fpType", "fpRiskType", "fpAssistanceMeasures",
this.dict.load("fpYear", "sex", "fpNation", "fpPrtpStatus", "fpHealth", "fpStudentsInSchool", 'fpYesOrNo', "fpRelationship",
"yesOrNo", "fpLaborSkills", "fpEducation", "fpPoliticalOutlook","fpType", "fpRiskType", "fpAssistanceMeasures",
"fpPublicWelfarePostAssistance","fpHealthAssistance","fpFnancialAssistance","fpEmploymentAssistance","fpEducationalAssistance",
"fpIndustrialAssistance","fpSocialAssistance", "fpRiskEliminationMethod", "fpNaturalDisaster", "fpHouseType", "fpHouseRoadType",
"fpFuelType", "fpDisabilityType",)
"fpFuelType", "fpDisabilityType", "fpEmploymentChannels")
}
}
</script>

View File

@@ -19,7 +19,7 @@
<el-input v-model="form.phone" placeholder="请输入联系方式" :maxlength="11" show-word-limit/>
</el-form-item>
<el-form-item label="证件号码" prop="idNumber">
<el-input v-model="form.idNumber" placeholder="请输入证件号码" :maxlength="18" :disabled="isEdit || isSelectUser" @change="handleIdNumberAutocomplete"/>
<el-input v-model="form.idNumber" placeholder="请输入证件号码" :maxlength="20" :disabled="isEdit || isSelectUser" @change="handleIdNumberAutocomplete"/>
</el-form-item>
</div>
<el-form-item label="个人照片" prop="photo">
@@ -54,10 +54,10 @@
</el-form-item>
<div flex class="half wrap">
<el-form-item label="残疾类别">
<ai-select v-model="form.disabilityType" :selectList="dict.getDict('fpDisabilityType')" placeholder="请选择" />
<ai-select v-model="form.disabilityType" :selectList="dict.getDict('fpDisabilityType')" />
</el-form-item>
<el-form-item label="残疾办证年度">
<el-date-picker v-model="form.disabilityCertificateYear" type="year" placeholder="请选择"/>
<ai-select v-model="form.disabilityCertificateYear" :selectList="dict.getDict('fpYear')" />
</el-form-item>
</div>
<el-form-item label="基础保险">
@@ -75,13 +75,13 @@
<ai-select v-model="form.labourStatus" :selectList="dict.getDict('fpLaborSkills')"/>
</el-form-item>
<el-form-item label="是否会讲普通话">
<ai-select v-model="form.mandarin" :selectList="dict.getDict('fpYesOrNo')" placeholder="请选择" />
<ai-select v-model="form.mandarin" :selectList="dict.getDict('fpYesOrNo')" />
</el-form-item>
<el-form-item label="务工时间(月)">
<el-input v-model="form.workeMonths" placeholder="请输入" clearable/>
<el-input type="number" v-model="form.workeMonths" placeholder="请输入" clearable @input="numberInput('workeMonths')" />
</el-form-item>
<el-form-item label="就业渠道">
<el-input v-model="form.employmentChannels" placeholder="请输入" clearable/>
<ai-select v-model="form.employmentChannels" :selectList="dict.getDict('fpEmploymentChannels')" />
</el-form-item>
<el-form-item label="务工企业名称">
<el-input v-model="form.migrantEnterprises" placeholder="请输入" clearable/>
@@ -90,26 +90,15 @@
<el-input v-model="form.publicWelfarePosts" placeholder="请输入" clearable/>
</el-form-item>
<el-form-item label="是否国外务工">
<ai-select v-model="form.foreignWorkers" :selectList="dict.getDict('fpYesOrNo')" placeholder="请选择" />
<ai-select v-model="form.foreignWorkers" :selectList="dict.getDict('fpYesOrNo')" />
</el-form-item>
<el-form-item label="公益性岗位(月数)">
<el-input v-model="form.publicWelfarePostsMonths" placeholder="请输入" clearable/>
<el-input type="number" v-model="form.publicWelfarePostsMonths" placeholder="请输入" clearable @input="numberInput('publicWelfarePostsMonths')" />
</el-form-item>
</div>
<el-form-item label="务工所在地">
<el-input v-model="form.foreignWorkersAddress" placeholder="请输入" clearable maxlength="30" show-word-limit/>
</el-form-item>
<div flex class="half wrap">
<el-form-item label="判刑收监年度">
<el-date-picker v-model="form.sentencingYear" type="year" placeholder="请选择"/>
</el-form-item>
<el-form-item label="刑满释放">
<el-date-picker v-model="form.releaseFromPrisonYear" type="year" placeholder="请选择"/>
</el-form-item>
<el-form-item label="死亡年度">
<el-date-picker v-model="form.deathYear" type="year" placeholder="请选择"/>
</el-form-item>
</div>
<el-form-item label="现住址" prop="currentAreaId">
<ai-area-get :instance="instance" v-model="form.currentAreaId" :root="rootArea" valueLevel="5"/>
<el-form-item prop="currentAddress">
@@ -125,7 +114,7 @@
<el-input v-model="form.houseArea" placeholder="请输入" :maxlength="8"/>
</el-form-item>
<el-form-item label="户类型">
<ai-select v-model="form.houseType" :selectList="dict.getDict('fpYesOrNo')"/>
<ai-select v-model="form.houseType" :selectList="dict.getDict('fpHouseType')"/>
</el-form-item>
<el-form-item label="与村主干路距离(公里)">
<el-input v-model="form.trunkRoadDistance" placeholder="请输入" :maxlength="8"/>
@@ -203,7 +192,7 @@
<ai-select v-model="form.riskType" :selectList="dict.getDict('fpRiskType')"/>
</el-form-item>
<el-form-item label="脱贫年度">
<el-date-picker v-model="form.povertyYear" type="year" placeholder="请选择"/>
<ai-select v-model="form.povertyYear" :selectList="dict.getDict('fpYear')"/>
</el-form-item>
<el-form-item label="因自然灾害子项">
<ai-select v-model="form.naturalDisasterType" :selectList="dict.getDict('fpNaturalDisaster')"/>
@@ -213,10 +202,10 @@
</el-form-item>
</div>
<el-form-item label="义务阶段未上学原因">
<el-input v-model="form.dropOutOfSchoolReason" placeholder="请输入" maxlength="30" show-word-limit clearable/>
<el-input v-model="form.dropOutOfSchoolReason" type="textarea" placeholder="请输入" maxlength="500" show-word-limit clearable/>
</el-form-item>
<el-form-item label="备注说明">
<el-input v-model="form.detail" placeholder="请输入" maxlength="30" show-word-limit clearable/>
<el-input v-model="form.detail" placeholder="请输入" type="textarea" maxlength="500" show-word-limit clearable/>
</el-form-item>
<el-form-item label="图片最多9张" >
<ai-uploader
@@ -235,49 +224,83 @@
<template slot="content">
<div flex class="half wrap">
<el-form-item label="纳入监测对象的收入参考范围">
<el-input v-model="form.income1" placeholder="请输入" clearable/>
<el-input v-model="form.income1" placeholder="请输入" type="number" @input="decimalInput('income1')" clearable/>
</el-form-item>
<el-form-item label="纳入监测对象的人均收入参考范围">
<el-input v-model="form.income2" placeholder="请输入" clearable/>
<el-input v-model="form.income2" placeholder="请输入" type="number" @input="decimalInput('income2')" clearable/>
</el-form-item>
<el-form-item label="工资性收入(元)">
<el-input v-model="form.income3" placeholder="请输入" clearable/>
<el-input v-model="form.income3" placeholder="请输入" type="number" @input="decimalInput('income3')" clearable/>
</el-form-item>
<el-form-item label="生产经营性收入(元)">
<el-input v-model="form.income4" placeholder="请输入" clearable/>
<el-input v-model="form.income4" placeholder="请输入" type="number" @input="decimalInput('income4')" clearable/>
</el-form-item>
<el-form-item label="计划生育金(元)">
<el-input v-model="form.income5" placeholder="请输入" clearable/>
<el-input v-model="form.income5" placeholder="请输入" type="number" @input="decimalInput('income5')" clearable/>
</el-form-item>
<el-form-item label="资产收益扶贫分红收入">
<el-input v-model="form.income6" placeholder="请输入" clearable/>
<el-input v-model="form.income6" placeholder="请输入" type="number" @input="decimalInput('income6')" clearable/>
</el-form-item>
<el-form-item label="低保金(元)">
<el-input v-model="form.income7" placeholder="请输入" clearable/>
<el-input v-model="form.income7" placeholder="请输入" type="number" @input="decimalInput('income7')" clearable/>
</el-form-item>
<el-form-item label="特困供养金(元)">
<el-input v-model="form.income8" placeholder="请输入" clearable/>
<el-input v-model="form.income8" placeholder="请输入" type="number" @input="decimalInput('income8')" clearable/>
</el-form-item>
<el-form-item label="养老保险金(元)">
<el-input v-model="form.income9" placeholder="请输入" clearable/>
<el-input v-model="form.income9" placeholder="请输入" type="number" @input="decimalInput('income9')" clearable/>
</el-form-item>
<el-form-item label="生态补偿金(元)">
<el-input v-model="form.income10" placeholder="请输入" clearable/>
<el-input v-model="form.income10" placeholder="请输入" type="number" @input="decimalInput('income10')" clearable/>
</el-form-item>
<el-form-item label="转移性收入(元)">
<el-input v-model="form.income11" placeholder="请输入" clearable/>
<el-input v-model="form.income11" placeholder="请输入" type="number" @input="decimalInput('income11')" clearable/>
</el-form-item>
<el-form-item label="其它转移性收入(元)">
<el-input v-model="form.income12" placeholder="请输入" clearable/>
<el-input v-model="form.income12" placeholder="请输入" type="number" @input="decimalInput('income12')" clearable/>
</el-form-item>
<el-form-item label="财产性收入(元)">
<el-input v-model="form.income13" placeholder="请输入" clearable/>
<el-input v-model="form.income13" placeholder="请输入" type="number" @input="decimalInput('income13')" clearable/>
</el-form-item>
<el-form-item label="其它财产收入(元)">
<el-input v-model="form.income14" placeholder="请输入" clearable/>
<el-input v-model="form.income14" placeholder="请输入" type="number" @input="decimalInput('income14')" clearable/>
</el-form-item>
<el-form-item label="生产经营性支出(元)">
<el-input v-model="form.income15" placeholder="请输入" clearable/>
<el-input v-model="form.income15" placeholder="请输入" type="number" @input="decimalInput('income15')" clearable/>
</el-form-item>
</div>
</template>
</ai-card>
<ai-card title="风险消除情况" v-if="form.status == 3">
<template slot="content">
<div flex class="half wrap">
<el-form-item label="工资性收入情况">
<el-input v-model="form.fxxcIncome1" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome1')" clearable/>
</el-form-item>
<el-form-item label="生产经营性收入情况">
<el-input v-model="form.fxxcIncome2" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome2')" clearable/>
</el-form-item>
<el-form-item label="财产性收入情况">
<el-input v-model="form.fxxcIncome3" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome3')" clearable/>
</el-form-item>
<el-form-item label="转移性收入情况">
<el-input v-model="form.fxxcIncome4" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome4')" clearable/>
</el-form-item>
<el-form-item label="理赔收入情况">
<el-input v-model="form.fxxcIncome5" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome5')" clearable/>
</el-form-item>
<el-form-item label="生产经营性支出情况">
<el-input v-model="form.fxxcIncome6" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome6')" clearable/>
</el-form-item>
<el-form-item label="合规自然收支情况">
<el-input v-model="form.fxxcIncome7" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome7')" clearable/>
</el-form-item>
<el-form-item label="家庭纯收入情况">
<el-input v-model="form.fxxcIncome8" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome8')" clearable/>
</el-form-item>
<el-form-item label="家庭人均纯收入情况">
<el-input v-model="form.fxxcIncome9" placeholder="请输入" type="number" @input="decimalInput('fxxcIncome9')" clearable/>
</el-form-item>
</div>
</template>
@@ -333,22 +356,22 @@ export default {
},
guaranteeCheckList() {
return [
{label: '享受农村最低生活保障', value: 0},
{label: '是否特困供养人员', value: 1},
{label: '分散供养五保户转集中供养(减少)', value: 2},
{label: '是否接受医疗救助', value: 3},
{label: '是否接受其它健康扶贫', value: 4},
{label: '享受农村最低生活保障', value: '0'},
{label: '是否特困供养人员', value: '1'},
{label: '分散供养五保户转集中供养(减少)', value: '2'},
{label: '是否接受医疗救助', value: '3'},
{label: '是否接受其它健康扶贫', value: '4'},
]
},
basicsCheckList() {
return [
{label: '城乡居民基本医疗保险', value: 0},
{label: '城镇职工基本医疗保险', value: 1},
{label: '大病保险', value: 2},
{label: '商业补充医疗保险', value: 3},
{label: '城乡居民基本养老保险', value: 4},
{label: '城镇职工基本养老保险', value: 5},
{label: '享受人身意外保险补贴', value: 6},
{label: '城乡居民基本医疗保险', value: '0'},
{label: '城镇职工基本医疗保险', value: '1'},
{label: '大病保险', value: '2'},
{label: '商业补充医疗保险', value: '3'},
{label: '城乡居民基本养老保险', value: '4'},
{label: '城镇职工基本养老保险', value: '5'},
{label: '享受人身意外保险补贴', value: '6'},
]
},
},
@@ -403,18 +426,23 @@ export default {
res.data.healthyStatusList = res.data.healthyStatus.split(',')
}
if(res.data.basicsCheck) {
res.data.basicsList = res.data.basicsCheck.split(',')
res.data.basicsList = res.data.basicsCheck.split(',')
}
if(res.data.guaranteeCheck) {
res.data.guaranteeList = res.data.guaranteeCheck.split(',')
res.data.guaranteeList = res.data.guaranteeCheck.split(',')
}
console.log(res.data)
this.form = {...res.data}
}
})
},
handleIdNumberAutocomplete(v) {
let {birthday: birthDate, sex} = this.idCardNoUtil.getIdCardInfo(v)
this.form = {...this.form, birthDate, sex, age: this.$calcAge(v)}
var idNumber = v
if(v.length == 20) {
idNumber = v.substring(0, 17)
}
let {birthday: birthDate, sex} = this.idCardNoUtil.getIdCardInfo(idNumber)
this.form = {...this.form, birthDate, sex, age: this.$calcAge(idNumber)}
},
submit() {
this.$refs.ruleForm.validate(v => {
@@ -433,6 +461,25 @@ export default {
if(this.form.guaranteeList.length) {
this.form.guaranteeCheck = this.form.basicsList.join(',')
}
if([1, 2, 3].includes(2)) {
this.form.jcbxCxyiliao = '01'
}else {
this.form.jcbxCxyiliao = '02'
}
this.checkInit('jcbxCxyiliao',this.form.basicsList, '0')
this.checkInit('jcbxCzyiliao',this.form.basicsList, '1')
this.checkInit('jcbxDabing',this.form.basicsList, '2')
this.checkInit('jcbxShangye',this.form.basicsList, '3')
this.checkInit('jcbxCxyanglao',this.form.basicsList, '4')
this.checkInit('jcbxCzyanglao',this.form.basicsList, '5')
this.checkInit('jcbxRenshenyiwai',this.form.basicsList, '6')
this.checkInit('bzcsNongcundibao',this.form.guaranteeList, '0')
this.checkInit('bzcsTekungongyang',this.form.guaranteeList, '1')
this.checkInit('bzcsWubaohu',this.form.guaranteeList, '2')
this.checkInit('bzcsYiliaojiuzhu',this.form.guaranteeList, '3')
this.checkInit('bzcsQita',this.form.guaranteeList, '4')
this.instance.post(`/app/apppreventionreturntopoverty/addOrUpdate`, this.form).then(res => {
if (res.code == 0) {
this.$message.success('提交成功!');
@@ -441,7 +488,26 @@ export default {
})
}
})
}
},
checkInit(formName, list, value) {
if(list.includes(value)) {
this.form[formName] = '01'
}else {
this.form[formName] = '02'
}
},
decimalInput(name) {
if(!/^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/g.test(this.form[name])){
this.form[name] = ''
return this.$message.error('最多只保留两位小数点')
}
},
numberInput(name) {
if(!/^[0-9]*[1-9][0-9]*$/g.test(this.form[name])){
this.form[name] = ''
return this.$message.error('请输入正整数')
}
},
},
created() {
this.getDetail()

View File

@@ -5,20 +5,21 @@
<template #rightBtn>
<el-button type="primary" icon="iconfont iconEdit" @click="gotoEdit" v-if="$permissions('app_apppreventionreturntopoverty_edit')">编辑</el-button>
<template v-if="isGridAdmin">
<el-button type="primary" @click="applyMonitor('纳入监测', 1)" v-if="detail.status == 0 && girdAdminApplyStatus != 1">纳入监测</el-button>
<el-button type="primary" @click="examine('纳入监测审批', 2)" v-if="detail.status == 0 && girdAdminApplyStatus == 1">纳入监测审批</el-button>
<el-button type="primary" @click="applyMonitor('纳入监测', 1)" v-if="detail.status == 4 && girdAdminApplyStatus != 1">纳入监测</el-button>
<el-button type="primary" @click="examine('纳入监测审批', 2)" v-if="detail.status == 4 && girdAdminApplyStatus == 1">纳入监测审批</el-button>
<template v-if="detail.status == 0 || detail.status == 4">
<el-button type="primary" @click="applyMonitor('纳入监测', 1)" v-if="girdAdminApplyStatus != 1">纳入监测</el-button>
<el-button type="primary" @click="examine('纳入监测审批', 2)" v-if="girdAdminApplyStatus == 1">纳入监测审批</el-button>
</template>
<el-button type="primary" @click="applyMonitor('纳入监测', 1)" v-if="detail.status == 3">纳入监测</el-button>
<el-button type="primary" @click="applyMonitor('解除风险', 4)" v-if="detail.status == 1">解除风险</el-button>
<el-button type="primary" @click="examine('解除风险审批', 5)" v-if="detail.status == 2">解除风险审批</el-button>
<el-button type="primary" @click="applyMonitor('纳入监测', 1)" v-if="detail.status == 3">纳入监测</el-button>
</template>
<template v-if="user.info.girdCheckType == 1">
<el-button type="primary" @click="applyMonitor('申请纳入监测', 0)" v-if="detail.status == 3">申请纳入监测</el-button>
<el-button type="primary" @click="applyMonitor('申请纳入监测', 0)" v-if="detail.status == 4">申请纳入监测</el-button>
<el-button type="primary" @click="applyMonitor('申请纳入监测', 0)" v-if="detail.status == 4 || detail.status == 3">申请纳入监测</el-button>
<el-button type="primary" @click="applyMonitor('申请解除风险', 3)" v-if="detail.status == 1">申请解除风险</el-button>
</template>
<el-button v-if="$permissions('app_apppreventionreturntopoverty_del') && /4/g.test(detail.status) && user.info.girdCheckType != 0" icon="iconfont iconDelete" @click="handleDelete(detail.id)">删除</el-button>
<template v-if="detail.status == 3 || detail.status == 4">
<el-button v-if="$permissions('app_apppreventionreturntopoverty_del') && user.info.girdCheckType != 0" icon="iconfont iconDelete" @click="handleDelete(detail.id)">删除</el-button>
</template>
</template>
</ai-title>
<template #content>
@@ -46,7 +47,7 @@
</el-form-item>
<div flex class="half wrap">
<el-form-item label="残疾类别">{{dict.getLabel("fpDisabilityType", detail.disabilityType)}}</el-form-item>
<el-form-item label="残疾办证年度">{{detail.disabilityCertificateYear}}</el-form-item>
<el-form-item label="残疾办证年度">{{dict.getLabel("fpYear", detail.disabilityCertificateYear)}}</el-form-item>
</div>
<div flex class="half wrap">
<el-form-item label="城乡居民基本医疗保险">{{dict.getLabel("fpYesOrNo", detail.jcbxCxyiliao)}}</el-form-item>
@@ -64,7 +65,7 @@
<el-form-item label="劳动技能">{{dict.getLabel("fpLaborSkills", detail.labourStatus)}}</el-form-item>
<el-form-item label="是否会讲普通话">{{dict.getLabel("fpYesOrNo", detail.mandarin)}}</el-form-item>
<el-form-item label="务工时间(月)">{{detail.workeMonths}}</el-form-item>
<el-form-item label="就业渠道">{{detail.employmentChannels}}</el-form-item>
<el-form-item label="就业渠道">{{dict.getLabel("fpEmploymentChannels", detail.employmentChannels)}}</el-form-item>
<el-form-item label="务工企业名称">{{detail.migrantEnterprises}}</el-form-item>
<el-form-item label="公益性岗位">{{detail.publicWelfarePosts}}</el-form-item>
<el-form-item label="是否国外务工">{{dict.getLabel("fpYesOrNo", detail.foreignWorkers)}}</el-form-item>
@@ -72,11 +73,6 @@
</div>
<el-form-item label="务工所在地">{{detail.foreignWorkersAddress}}
</el-form-item>
<div flex class="half wrap">
<el-form-item label="判刑收监年度">{{detail.sentencingYear}} </el-form-item>
<el-form-item label="刑满释放">{{detail.releaseFromPrisonYear}}</el-form-item>
<el-form-item label="死亡年度">{{detail.deathYear}}</el-form-item>
</div>
<el-form-item label="现住址">{{currentFullAddress}}</el-form-item>
</template>
</ai-card>
@@ -114,7 +110,7 @@
<el-form-item label="监测对象类型" prop="objectType">{{ dict.getLabel("fpType", detail.objectType)}}</el-form-item>
<el-form-item label="是否军烈属">{{ dict.getLabel("fpYesOrNo", detail.militaryMartyrs)}}</el-form-item>
<el-form-item label="风险因素" prop="riskType">{{ dict.getLabel("fpRiskType", detail.riskType)}} </el-form-item>
<el-form-item label="脱贫年度">{{detail.povertyYear}} </el-form-item>
<el-form-item label="脱贫年度">{{ dict.getLabel("fpYear", detail.povertyYear)}} </el-form-item>
<el-form-item label="因自然灾害子项">{{ dict.getLabel("fpNaturalDisaster", detail.naturalDisasterType)}}</el-form-item>
<el-form-item label="是否义务阶段失学辍学">{{ dict.getLabel("fpYesOrNo", detail.dropOutOfSchool)}}</el-form-item>
<el-form-item label="识别监测时间">{{ detail.createTime}}</el-form-item>
@@ -124,10 +120,10 @@
<el-form-item label="信息采集人联系电话">{{ detail.updateUserPhone}}</el-form-item>
</div>
<el-form-item label="义务阶段未上学原因">{{detail.dropOutOfSchoolReason}}</el-form-item>
<el-form-item label="备注说明">{{detail.detail}}</el-form-item>
<!-- <el-form-item label="备注说明">{{detail.detail}}</el-form-item>
<el-form-item label="图片">
<ai-uploader disabled v-model="detail.files"></ai-uploader>
</el-form-item>
</el-form-item> -->
</template>
</ai-card>
<ai-card title="家庭收支情况">
@@ -154,6 +150,21 @@
</div>
</template>
</ai-card>
<ai-card title="风险消除情况" v-if="detail.status == 3">
<template slot="content">
<div flex class="half wrap">
<el-form-item label="工资性收入情况">{{detail.fxxcIncome1}}</el-form-item>
<el-form-item label="生产经营性收入情况">{{detail.fxxcIncome2}}</el-form-item>
<el-form-item label="财产性收入情况">{{detail.fxxcIncome3}}</el-form-item>
<el-form-item label="转移性收入情况">{{detail.fxxcIncome4}}</el-form-item>
<el-form-item label="理赔收入情况">{{detail.fxxcIncome5}}</el-form-item>
<el-form-item label="生产经营性支出情况">{{detail.fxxcIncome6}}</el-form-item>
<el-form-item label="合规自然收支情况">{{detail.fxxcIncome7}}</el-form-item>
<el-form-item label="家庭纯收入情况">{{detail.fxxcIncome8}}</el-form-item>
<el-form-item label="家庭人均纯收入情况">{{detail.fxxcIncome9}}</el-form-item>
</div>
</template>
</ai-card>
<ai-card title="家庭成员">
<template #right>
<span style=" color: #2266ff; margin-left: 16px;cursor: pointer;font-size: 12px;" @click="addFamily({})">添加</span>
@@ -170,6 +181,7 @@
</ai-table>
</template>
</ai-card>
<div style="height:20px;"></div>
</el-tab-pane>
<el-tab-pane label="走访日志" lazy name="HrLog" v-if="$permissions('app_apppreventionreturntopovertylog_detail')">
<hr-log v-if="currentTab == 'HrLog'" :instance="instance" :dict="dict" :permissions="permissions" />
@@ -256,10 +268,10 @@
<ai-select v-model="form.mandarin" :selectList="dict.getDict('fpYesOrNo')" placeholder="请选择" />
</el-form-item>
<el-form-item label="务工时间(月)">
<el-input v-model="form.workeMonths" placeholder="请输入" clearable />
<el-input type="number" v-model="form.workeMonths" placeholder="请输入" clearable @input="numberInput('workeMonths')" />
</el-form-item>
<el-form-item label="就业渠道">
<el-input v-model="form.employmentChannels" placeholder="请输入" clearable />
<ai-select v-model="form.employmentChannels" :selectList="dict.getDict('fpEmploymentChannels')" />
</el-form-item>
<el-form-item label="务工企业名称">
<el-input v-model="form.migrantEnterprises" placeholder="请输入" clearable />
@@ -271,23 +283,12 @@
<ai-select v-model="form.foreignWorkers" :selectList="dict.getDict('fpYesOrNo')" placeholder="请选择" />
</el-form-item>
<el-form-item label="公益性岗位(月数)">
<el-input v-model="form.publicWelfarePostsMonths" placeholder="请输入" clearable />
<el-input type="number" v-model="form.publicWelfarePostsMonths" placeholder="请输入" clearable @input="numberInput('publicWelfarePostsMonths')" />
</el-form-item>
</div>
<el-form-item label="务工所在地">
<el-input v-model="form.foreignWorkersAddress" placeholder="请输入" clearable maxlength="30" show-word-limit />
</el-form-item>
<div flex class="half wrap">
<el-form-item label="判刑收监年度">
<el-date-picker v-model="form.sentencingYear" type="year" placeholder="请选择" />
</el-form-item>
<el-form-item label="刑满释放">
<el-date-picker v-model="form.releaseFromPrisonYear" type="year" placeholder="请选择" />
</el-form-item>
<el-form-item label="死亡年度">
<el-date-picker v-model="form.deathYear" type="year" placeholder="请选择" />
</el-form-item>
</div>
<el-form-item label="现住址" prop="currentAreaId">
<ai-area-get :instance="instance" v-model="form.currentAreaId" :root="rootArea" valueLevel="5" />
<el-form-item prop="currentAddress">
@@ -336,7 +337,7 @@
<el-form-item label="劳动技能">{{dict.getLabel("fpLaborSkills", familyInfo.labourStatus)}}</el-form-item>
<el-form-item label="是否会讲普通话">{{dict.getLabel("fpYesOrNo", familyInfo.mandarin)}}</el-form-item>
<el-form-item label="务工时间(月)">{{familyInfo.workeMonths}}</el-form-item>
<el-form-item label="就业渠道">{{familyInfo.employmentChannels}}</el-form-item>
<el-form-item label="就业渠道">{{dict.getLabel("fpEmploymentChannels", familyInfo.employmentChannels)}}</el-form-item>
<el-form-item label="务工企业名称">{{familyInfo.migrantEnterprises}}</el-form-item>
<el-form-item label="公益性岗位">{{familyInfo.publicWelfarePosts}}</el-form-item>
<el-form-item label="是否国外务工">{{dict.getLabel("fpYesOrNo", familyInfo.foreignWorkers)}}</el-form-item>
@@ -344,11 +345,6 @@
</div>
<el-form-item label="务工所在地">{{familyInfo.foreignWorkersAddress}}
</el-form-item>
<div flex class="half wrap">
<el-form-item label="判刑收监年度">{{familyInfo.sentencingYear}} </el-form-item>
<el-form-item label="刑满释放">{{familyInfo.releaseFromPrisonYear}}</el-form-item>
<el-form-item label="死亡年度">{{familyInfo.deathYear}}</el-form-item>
</div>
<el-form-item label="现住址">{{currentFullAddressFamily}}</el-form-item>
</el-form>
<template slot="footer">
@@ -502,22 +498,22 @@ export default {
},
guaranteeCheckList() {
return [
{ label: '享受农村最低生活保障', value: 0 },
{ label: '是否特困供养人员', value: 1 },
{ label: '分散供养五保户转集中供养(减少)', value: 2 },
{ label: '是否接受医疗救助', value: 3 },
{ label: '是否接受其它健康扶贫', value: 4 },
{label: '享受农村最低生活保障', value: '0'},
{label: '是否特困供养人员', value: '1'},
{label: '分散供养五保户转集中供养(减少)', value: '2'},
{label: '是否接受医疗救助', value: '3'},
{label: '是否接受其它健康扶贫', value: '4'},
]
},
basicsCheckList() {
return [
{ label: '城乡居民基本医疗保险', value: 0 },
{ label: '城镇职工基本医疗保险', value: 1 },
{ label: '大病保险', value: 2 },
{ label: '商业补充医疗保险', value: 3 },
{ label: '城乡居民基本养老保险', value: 4 },
{ label: '城镇职工基本养老保险', value: 5 },
{ label: '享受人身意外保险补贴', value: 6 },
{label: '城乡居民基本医疗保险', value: '0'},
{label: '城镇职工基本医疗保险', value: '1'},
{label: '大病保险', value: '2'},
{label: '商业补充医疗保险', value: '3'},
{label: '城乡居民基本养老保险', value: '4'},
{label: '城镇职工基本养老保险', value: '5'},
{label: '享受人身意外保险补贴', value: '6'},
]
},
},
@@ -633,6 +629,19 @@ export default {
if (this.form.guaranteeList.length) {
this.form.guaranteeCheck = this.form.basicsList.join(',')
}
this.checkInit('jcbxCxyiliao',this.form.basicsList, '0')
this.checkInit('jcbxCzyiliao',this.form.basicsList, '1')
this.checkInit('jcbxDabing',this.form.basicsList, '2')
this.checkInit('jcbxShangye',this.form.basicsList, '3')
this.checkInit('jcbxCxyanglao',this.form.basicsList, '4')
this.checkInit('jcbxCzyanglao',this.form.basicsList, '5')
this.checkInit('jcbxRenshenyiwai',this.form.basicsList, '6')
this.checkInit('bzcsNongcundibao',this.form.guaranteeList, '0')
this.checkInit('bzcsTekungongyang',this.form.guaranteeList, '1')
this.checkInit('bzcsWubaohu',this.form.guaranteeList, '2')
this.checkInit('bzcsYiliaojiuzhu',this.form.guaranteeList, '3')
this.checkInit('bzcsQita',this.form.guaranteeList, '4')
this.instance.post(`/app/apppreventionreturntopoverty/addOrUpdate`, this.form).then(res => {
if (res.code == 0) {
this.getDetail()
@@ -643,6 +652,13 @@ export default {
}
});
},
checkInit(formName, list, value) {
if(list.includes(value)) {
this.form[formName] = '01'
}else {
this.form[formName] = '02'
}
},
onClose() {
this.isShowAdd = false;
},
@@ -710,7 +726,11 @@ export default {
})
this.applyInfo.files = ids.join(',')
}
this.instance.post(url, null, { params: this.applyInfo }).then(res => {
let fromData = new FormData()
for (let key in this.applyInfo) {
fromData.append(key, this.applyInfo[key])
}
this.instance.post(url, fromData).then(res => {
if (res.code == 0) {
this.getDetail()
this.$message.success('提交成功!');
@@ -744,7 +764,11 @@ export default {
if (this.changeStatus == 5) { //5 解除风险
url = `/app/apppreventionreturntopoverty/relieve`
}
this.instance.post(url, null, { params: this.examineFrom }).then(res => {
let fromData = new FormData()
for (let key in this.examineFrom) {
fromData.append(key, this.examineFrom[key])
}
this.instance.post(url, fromData ).then(res => {
if (res.code == 0) {
this.getDetail()
this.$message.success('提交成功!');
@@ -774,6 +798,12 @@ export default {
});
})
},
numberInput(name) {
if(!/^[0-9]*[1-9][0-9]*$/g.test(this.form[name])){
this.form[name] = ''
return this.$message.error('请输入正整数')
}
},
},
created() {
this.getDetail();
@@ -783,7 +813,6 @@ export default {
<style lang="scss" scoped>
.hrDetail {
height: 100%;
.flex-start {
align-items: flex-start;

View File

@@ -18,9 +18,9 @@
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="search.birthEnd" type="date" size="small" placeholder="选择出生结束日期"
unlink-panels @change="page.current=1,getTableData()" />
<ai-select placeholder="性别" v-model="search.sex" :selectList="dict.getDict('sex')" @change="page.current=1,getTableData()"/>
<ai-select placeholder="文化程度" v-model="search.education" :selectList="dict.getDict('fpEducation')" @change="page.current=1,getTableData()"/>
<!-- <ai-select placeholder="文化程度" v-model="search.education" :selectList="dict.getDict('fpEducation')" @change="page.current=1,getTableData()"/>
<ai-select placeholder="民族" v-model="search.nation" :selectList="dict.getDict('fpNation')" @change="page.current=1,getTableData()"/>
<!-- <ai-select placeholder="政治面貌" v-model="search.politicsStatus" :selectList="dict.getDict('fpPoliticalOutlook')" @change="page.current=1,getTableData()"/> -->
<ai-select placeholder="政治面貌" v-model="search.politicsStatus" :selectList="dict.getDict('fpPoliticalOutlook')" @change="page.current=1,getTableData()"/> -->
</template>
<template #right>
<el-input size="small" placeholder="姓名/身份证/联系方式" v-model="search.con" clearable

View File

@@ -2,24 +2,30 @@
<section class="List">
<ai-list>
<ai-title slot="title" title="宣传资讯" isShowBottomBorder isShowArea v-model="search.areaId" :instance="instance"
@change="page.current=1,getTableData()">
@change="page.current=1,getTableData()">
</ai-title>
<template #content>
<div class="flex">
<div class="flex fill">
<div class="type">
<div class="title">宣传板块<span><el-button type="text" @click="addType(0, typeList.length+1, '')">添加</el-button></span></div>
<div class="title">宣传板块<span><el-button type="text"
@click="addType(0, typeList.length+1, '')">添加</el-button></span>
</div>
<div class="list">
<div class="item" v-for="(item, index) in typeList" :key="index" :class="typeIndex == index ? 'active' : ''" @click="typeClick(index)">
{{item.categoryName}}
<div class="item" v-for="(item, index) in typeList" :key="index"
:class="typeIndex == index ? 'active' : ''" @click="typeClick(index)">
{{ item.categoryName }}
</div>
<div class="item" v-if="!typeList.length">暂无数据</div>
</div>
</div>
<div class="type mini-type">
<div class="title">模块名称<span><el-button type="text" @click="addType(1, miniTypeList.length+1, typeList[typeIndex].id)">添加</el-button></span></div>
<div class="title">模块名称<span><el-button type="text"
@click="addType(1, miniTypeList.length+1, typeList[typeIndex].id)">添加</el-button></span>
</div>
<div class="list">
<div class="item" v-for="(item, index) in miniTypeList" :key="index" :class="miniTypeIndex == index ? 'active' : ''" @click="miniTypeClick(index)">
<span class="text">{{item.categoryName}}</span>
<div class="item" v-for="(item, index) in miniTypeList" :key="index"
:class="miniTypeIndex == index ? 'active' : ''" @click="miniTypeClick(index)">
<span class="text">{{ item.categoryName }}</span>
<span class="icon">
<i class="el-icon-circle-plus-outline" @click="addNewType(index)"></i>
<i class="el-icon-edit" @click="editMini(index)"></i>
@@ -32,12 +38,15 @@
<div class="content">
<ai-search-bar>
<template #right>
<el-input size="small" placeholder="请输入标题" v-model="search.title" clearable @change="page.current=1,getTableData()"/>
<el-input size="small" placeholder="请输入标题" v-model="search.title" clearable
@change="page.current=1,getTableData()"/>
</template>
</ai-search-bar>
<ai-search-bar>
<template #left>
<el-button type="primary" icon="iconfont iconAdd" @click="showEdit('')" v-if="typeList.length && miniTypeList.length">添加</el-button>
<el-button type="primary" icon="iconfont iconAdd" @click="showEdit('')"
v-if="typeList.length && miniTypeList.length">添加
</el-button>
<!-- <el-button icon="iconfont iconDelete" :disabled="!ids.length" @click="handleDelete(ids)">删除</el-button> -->
</template>
</ai-search-bar>
@@ -53,7 +62,6 @@
</ai-table>
</div>
</div>
</template>
</ai-list>
<ai-dialog :visible.sync="dialog" :title="dialogTitle" @closed="form={}" @onConfirm="submitDialog" width="600px">
@@ -65,8 +73,9 @@
<el-input-number v-model="form.showIndex" @change="handleChange" :min="1" :max="100"></el-input-number>
</el-form-item>
</el-form>
<ai-table :tableData="newTypeList" :total="newPage.total" :current.sync="newPage.current" :size.sync="newPage.size"
:col-configs="colConfigsNew" v-if="type == 2">
<ai-table :tableData="newTypeList" :total="newPage.total" :current.sync="newPage.current"
:size.sync="newPage.size"
:col-configs="colConfigsNew" v-if="type == 2">
<el-table-column slot="options" label="操作" fixed="right" align="center">
<template slot-scope="{row}">
<el-button type="text" @click="editNew(row)">编辑</el-button>
@@ -139,7 +148,13 @@ export default {
})
},
showEdit(id) {
this.$router.push({query: {id: id, parentId: this.typeList[this.typeIndex].id, moduleId: this.miniTypeList[this.miniTypeIndex].id}, hash: "#add"})
this.$router.push({
query: {
id: id,
parentId: this.typeList[this.typeIndex].id,
moduleId: this.miniTypeList[this.miniTypeIndex].id
}, hash: "#add"
})
},
handleDelete(ids) {
this.$confirm("是否删除该条宣传资讯信息").then(() => {
@@ -164,10 +179,10 @@ export default {
this.instance.post(`/app/apppublicitycategory/addPublicityCategory`, this.form).then(res => {
if (res.code == 0) {
this.$message.success('添加成功');
if(this.type == 0) {
if (this.type == 0) {
this.getTypeList()
}
if(this.type == 1) {
if (this.type == 1) {
this.getMiniTypeList(this.typeList[this.typeIndex].id)
}
this.dialog = false
@@ -182,7 +197,7 @@ export default {
this.form.showIndex = index
this.dialogTitle = ['宣传板块', '宣传模块', '文章分类'][e]
this.addLabelText = ['板块名称', '模块名称', '分类名称'][e]
this.rules.categoryName = [{required: true, message: "请输入"+this.addLabelText, trigger: "change"}]
this.rules.categoryName = [{required: true, message: "请输入" + this.addLabelText, trigger: "change"}]
this.dialog = true
},
getTypeList() {
@@ -197,10 +212,10 @@ export default {
this.instance.post(`/app/apppublicitycategory/list?categoryType=1&size=100&parentId=${parentId}`).then(res => {
if (res.code == 0) {
this.miniTypeList = res.data.records
if(res.data.records && res.data.records.length) {
if (res.data.records && res.data.records.length) {
this.miniTypeClick(0)
}
}
})
},
@@ -261,27 +276,32 @@ export default {
<style lang="scss" scoped>
.List {
height: 100%;
.flex{
.flex {
display: flex;
.type{
.type {
width: 250px;
border: 1px solid #ddd;
box-sizing: border-box;
.title{
.title {
font-size: 16px;
line-height: 40px;
border-bottom: 1px solid #ddd;
padding: 0 16px;
font-weight: 600;
span{
span {
color: #26f;
font-size: 12px;
font-weight: 400;
float: right;
}
}
.list{
.item{
.list {
.item {
padding: 0 16px;
display: flex;
justify-content: space-between;
@@ -289,38 +309,51 @@ export default {
font-size: 14px;
color: #333;
box-sizing: border-box;
.text{
.text {
width: calc(100% - 70px);
cursor: pointer;
}
.icon{
.icon {
width: 70px;
text-align: right;
i{
i {
font-size: 14px;
cursor: pointer;
margin-left: 8px;
}
.el-icon-delete{
.el-icon-delete {
color: #f46;
}
.el-icon-circle-plus-outline{
.el-icon-circle-plus-outline {
color: #26f;
}
}
}
.active{
.active {
// color: #26f;
background-color: #f3f6f9;
}
}
}
.mini-type{
.mini-type {
margin-right: 16px;
}
.content{
.content {
width: calc(100% - 516px);
}
}
::v-deep .ai-list__content--right-wrapper {
min-height: calc(100% - 6px) !important;
display: flex;
}
}
</style>
</style>

View File

@@ -117,7 +117,7 @@
<ai-info-item label="政治面貌" :value="dict.getLabel('politicsStatus', baseInfo.politicsStatus)"/>
<ai-info-item label="兵役状况" :value="dict.getLabel('militaryStatus', baseInfo.militaryStatus)"/>
<ai-info-item label="宗教信仰" :value="dict.getLabel('faithType', baseInfo.faithType)"/>
<ai-info-item label="职业" :value="dict.getLabel('faithType', baseInfo.job)"/>
<ai-info-item label="职业" :value="dict.getLabel('job', baseInfo.job)"/>
</ai-wrapper>
<ai-avatar v-model="baseInfo.photo" :editable="false"/>
</el-row>
@@ -707,7 +707,7 @@ export default {
font-size: 14px;
::v-deep.el-tabs__content {
max-height: calc(100vh - 136px);
max-height: calc(100vh - 176px);
overflow-y: auto;
}

View File

@@ -84,7 +84,7 @@
{ prop: 'type', label: '类型', formart: v => this.dict.getLabel('villInfoType', v) },
{ prop: 'title', label: '标题', align: 'left' },
{ prop: 'status', label: '发布状态', align: 'center', formart: v => this.dict.getLabel('villInfoStatus', v) },
{ prop: 'createDate', label: '发布时间', dateFormart: 'YYYY-MM-DD', align: 'center' },
{ prop: 'createDate', label: '发布时间', dateFormat: 'YYYY-MM-DD', align: 'center' },
{ prop: 'createUser', label: '发布人', align: 'center' },
{ prop: 'areaName', label: '来源地区', align: 'center' },
{ slot: 'options', label: '操作' }