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.
 
 
 
 
 
 

214 lines
4.6 KiB

<template>
<view class="police-c">
<view class="police-item-tag-box">
<view v-for="item in activePolices" class="police-item-tag police-item-tag_small">{{ item.name.substring(item.name.length - 2) }}</view>
</view>
<button size="small" @tap="show = true" class="add-btn">
<uni-icons type="plusempty" size="20"></uni-icons>
</button>
</view>
<view class="police-picker-container" v-if="show">
<view class="header">
<view class="hidden-btn" @tap="show = false">
<uni-icons type="left" size="20"></uni-icons>
</view>
<uni-easyinput prefixIcon="search" type="text" placeholder="搜索" v-model="query.name" />
</view>
<!-- <uni-data-picker :localdata="departs" :border="false"
:map="{text:'shortName', value: 'id'}" v-model="query.departId" /> -->
<view class="police-container">
<view class="police-item" v-for="item in polices" @tap="handleChange(item)">
<checkbox :checked="activePolices.findIndex(police => item.empNo === police.empNo) !== -1" @tap.stop="handleChange(item)" />
<view class="police-item-tag">{{ item.name.substring(item.name.length - 2) }}</view>
<view>{{ item.name }}</view>
</view>
</view>
<view class="footer">
<view class="footer-left">
<view>已选择({{ activePolices.length }}):</view>
<view class="police-item-tag-container">
<view class="police-item-tag-box">
<view v-for="item in activePolices" class="police-item-tag police-item-tag_small">{{ item.name.substring(item.name.length - 2) }}</view>
</view>
</view>
</view>
<button type="primary" @tap="show = false">确定</button>
</view>
</view>
</template>
<script setup>
import { onMounted, ref, watch, defineProps, defineEmits } from 'vue';
import { listPolice } from '@/api/police'
import {
departTree
} from '@/api/depart'
const props = defineProps({
modelValue: {
type: Array,
default: []
},
departId: {
type: String,
default: ''
}
})
const emit = defineEmits(['update:modelValue'])
const show = ref(false);
const polices = ref([]);
const query = ref({
current: 1,
size: 16,
departBranch: true,
})
watch(() => props.modelValue, (val) => {
if (val) {
polices.value = val
} else {
polices.value = []
}
})
watch(() => props.departId, (val) => {
query.value.departId = val;
getPolice()
})
const activePolices = ref(props.modelValue || []);
function handleChange(police) {
const index = activePolices.value.findIndex(item => item.empNo === police.empNo);
if (index === -1) {
activePolices.value.push({
name: police.name,
empNo: police.empNo,
})
emit('update:modelValue', activePolices.value)
} else {
activePolices.value.splice(index, 1)
emit('update:modelValue', activePolices.value)
}
}
const departs = ref([])
const departId = ref('')
onMounted(() => {
getPolice()
departTree().then(data => {
departs.value = data[0].children
})
})
watch(() => query.value.name, () => {
getPolice()
})
function getPolice() {
listPolice(query.value).then(data => {
polices.value = data.records
})
}
</script>
<style lang="scss" scoped>
.police-picker-container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #f5f5f5;
z-index: 9999;
.header {
display: flex;
padding: 24rpx;
padding-left: 0;
display: flex;
align-items: center;
gap: 0 12rpx;
background-color: #fff;
margin-bottom: 12rpx;
position: relative;
.hidden-btn {
height: 37px;
width: 37px;
display: flex;
align-items: center;
justify-content: center;
}
}
.police-item {
background-color: #fff;
height: 88rpx;
line-height: 88rpx;
display: flex;
gap: 0 24rpx;
align-items: center;
padding-left: 24rpx;
}
.footer {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
background-color: #fff;
button {
margin: 0;
}
.footer-left {
display: flex;
align-items: center;
width: calc(100% - 64px);
}
}
}
.police-container {
max-height: 82vh;
overflow: auto;
}
.police-item-tag {
background-color: var(--primary-color);
color: #fff;
height: 72rpx;
width: 72rpx;
line-height: 72rpx;
text-align: center;
border-radius: 10rpx;
&_small {
height: 52rpx;
width: 52rpx;
line-height: 52rpx;
font-size: 12px;
}
}
.add-btn {
height: 52rpx;
width: 52rpx;
line-height: 52rpx;
padding: 0;
}
.police-item-tag-container {
width: calc(100% - 200rpx);
overflow: hidden;
}
.police-item-tag-box {
display: flex;
gap: 0 12rpx;
width: max-content;
}
.police-c {
display: flex;
gap: 0 12rpx;
}
</style>