4 changed files with 668 additions and 457 deletions
@ -0,0 +1,28 @@ |
|||||||
|
import request from '@/utils/request' |
||||||
|
|
||||||
|
export function consoleData(params?: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/consoleData', params }) |
||||||
|
} |
||||||
|
|
||||||
|
export function peopleMail(params?: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/peopleMail', params }) |
||||||
|
} |
||||||
|
export function mailTypeRank(params?: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/mailTypeRank', params }) |
||||||
|
} |
||||||
|
|
||||||
|
export function mailTrend(params?: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/mailTrend', params }) |
||||||
|
} |
||||||
|
export function mapCountyData(params?: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/mapData', params }) |
||||||
|
} |
||||||
|
|
||||||
|
export function dutyDay(params: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/dutyDay'}) |
||||||
|
} |
||||||
|
|
||||||
|
export function threeRate(params: Record<string, any>) { |
||||||
|
return request.get({ url: '/dataScreen/threeRate'}) |
||||||
|
} |
||||||
|
|
||||||
@ -0,0 +1,270 @@ |
|||||||
|
<template> |
||||||
|
<div class="details-popup"> |
||||||
|
<popup |
||||||
|
ref="popupRef" |
||||||
|
:title="popupTitle" |
||||||
|
:async="true" |
||||||
|
width="550px" |
||||||
|
:clickModalClose="true" |
||||||
|
@confirm="handleSubmit" |
||||||
|
@close="handleClose" |
||||||
|
> |
||||||
|
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules"> |
||||||
|
<el-form-item label="部门" prop="departId"> |
||||||
|
<el-tree-select |
||||||
|
class="flex-1" |
||||||
|
v-model="formData.departId" |
||||||
|
:data="optionsData.dept" |
||||||
|
clearable |
||||||
|
filterable |
||||||
|
node-key="id" |
||||||
|
:props="{ |
||||||
|
value: 'id', |
||||||
|
label: 'name', |
||||||
|
disabled(data: any) { |
||||||
|
return !!data.isStop |
||||||
|
} |
||||||
|
}" |
||||||
|
check-strictly |
||||||
|
:default-expand-all="true" |
||||||
|
placeholder="请选择部门" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
|
||||||
|
<el-form-item label="机构类型" prop="deptType"> |
||||||
|
<el-select |
||||||
|
class="flex-1" |
||||||
|
clearable |
||||||
|
v-model="formData.deptType" |
||||||
|
placeholder="请选择机构类型" |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="(item, index) in optionsData.deptTypes.lists" |
||||||
|
:key="index" |
||||||
|
:label="item.name" |
||||||
|
:value="item.value" |
||||||
|
/> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="名称" prop="empNo"> |
||||||
|
<!-- <el-input v-model="formData.policeName" placeholder="请输入" />--> |
||||||
|
|
||||||
|
<el-select |
||||||
|
v-model="formData.policeName" |
||||||
|
filterable |
||||||
|
class="flex-1" |
||||||
|
clearable |
||||||
|
remote |
||||||
|
placeholder="请搜索名字/警号/手机号" |
||||||
|
:remote-method="searchPoliceUser" |
||||||
|
@change="handleSelectChange" |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="(item, index) in optionsData.policeList" |
||||||
|
:key="index" |
||||||
|
:label="item.name" |
||||||
|
:value="item.empNo" |
||||||
|
/> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item label="警号" prop="empNo"> |
||||||
|
<el-input v-model="formData.empNo" disabled="disabled" placeholder="请输入" /> |
||||||
|
</el-form-item> |
||||||
|
<!-- <el-form-item label="手机号" prop="mobile">--> |
||||||
|
<!-- <el-input v-model="formData.mobile" placeholder="请输入" />--> |
||||||
|
<!-- </el-form-item>--> |
||||||
|
<el-form-item label="值班日期" prop="startTime"> |
||||||
|
<daterange-picker |
||||||
|
v-model:startTime="formData.startTime" |
||||||
|
v-model:endTime="formData.endTime" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</el-form> |
||||||
|
</popup> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<script lang="ts" setup> |
||||||
|
import type { FormInstance, ListItem } from 'element-plus' |
||||||
|
import { dutyEdit, dutyAdd, dutyDetail, dutyLists } from '@/api/duty' |
||||||
|
import { dictDataDelete, dictDataLists, dictTypeAll } from '@/api/setting/dict' |
||||||
|
import Popup from '@/components/popup/index.vue' |
||||||
|
import feedback from '@/utils/feedback' |
||||||
|
import type { PropType } from 'vue' |
||||||
|
import { useDictOptions } from '@/hooks/useDictOptions' |
||||||
|
import { roleAll } from '@/api/perms/role' |
||||||
|
import { postAll } from '@/api/org/post' |
||||||
|
import { deptLists } from '@/api/org/department' |
||||||
|
import { searchPolice } from '@/api/perms/admin' |
||||||
|
import { usePaging } from '@/hooks/usePaging' |
||||||
|
import { loginCaptcha } from '@/api/user' |
||||||
|
import { isFunction } from 'lodash' |
||||||
|
defineProps({ |
||||||
|
dictData: { |
||||||
|
type: Object as PropType<Record<string, any[]>>, |
||||||
|
default: () => ({}) |
||||||
|
} |
||||||
|
}) |
||||||
|
const emit = defineEmits(['success', 'close']) |
||||||
|
const formRef = shallowRef<FormInstance>() |
||||||
|
const popupRef = shallowRef<InstanceType<typeof Popup>>() |
||||||
|
const mode = ref('add') |
||||||
|
const popupTitle = computed(() => { |
||||||
|
return mode.value == 'edit' ? '编辑值班信息' : '新增值班' |
||||||
|
}) |
||||||
|
|
||||||
|
const formData = reactive({ |
||||||
|
startTime: '', |
||||||
|
departId: '', |
||||||
|
departName: '', |
||||||
|
policeName: '', |
||||||
|
mobile: '', |
||||||
|
typeName: '', |
||||||
|
empNo: '', |
||||||
|
endTime: '', |
||||||
|
deptType: '' |
||||||
|
}) |
||||||
|
|
||||||
|
const { optionsData } = useDictOptions<{ |
||||||
|
deptTypes: any[], |
||||||
|
policeList: any[], |
||||||
|
dept: any[] |
||||||
|
}>({ |
||||||
|
dept: { |
||||||
|
api: deptLists |
||||||
|
}, |
||||||
|
deptTypes: { |
||||||
|
api: dictDataLists, |
||||||
|
params: { |
||||||
|
dictType: 'dept_type' |
||||||
|
} |
||||||
|
}, |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const formRules = { |
||||||
|
|
||||||
|
departId: [ |
||||||
|
{ |
||||||
|
required: true, |
||||||
|
message: '请输入', |
||||||
|
trigger: ['blur'] |
||||||
|
} |
||||||
|
], |
||||||
|
|
||||||
|
|
||||||
|
empNo: [ |
||||||
|
{ |
||||||
|
required: true, |
||||||
|
message: '请输入', |
||||||
|
trigger: ['blur'] |
||||||
|
} |
||||||
|
], |
||||||
|
startTime: [ |
||||||
|
{ |
||||||
|
required: true, |
||||||
|
message: '请选择', |
||||||
|
trigger: ['blur'] |
||||||
|
} |
||||||
|
], |
||||||
|
endTime: [ |
||||||
|
{ |
||||||
|
required: true, |
||||||
|
message: '请选择', |
||||||
|
trigger: ['blur'] |
||||||
|
} |
||||||
|
], |
||||||
|
deptType: [ |
||||||
|
{ |
||||||
|
required: true, |
||||||
|
message: '请选择', |
||||||
|
trigger: ['blur'] |
||||||
|
} |
||||||
|
], |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
const handleSubmit = async () => { |
||||||
|
await formRef.value?.validate() |
||||||
|
const data: any = { ...formData } |
||||||
|
mode.value == 'edit' ? await dutyEdit(data) : await dutyAdd(data) |
||||||
|
popupRef.value?.close() |
||||||
|
feedback.msgSuccess('操作成功') |
||||||
|
emit('success') |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const open = (type = 'add') => { |
||||||
|
mode.value = type |
||||||
|
popupRef.value?.open() |
||||||
|
} |
||||||
|
|
||||||
|
const setFormData = async (data: Record<string, any>) => { |
||||||
|
for (const key in formData) { |
||||||
|
if (data[key] != null && data[key] != undefined) { |
||||||
|
//@ts-ignore |
||||||
|
if(key=='departId'){ |
||||||
|
formData[key]= parseInt( data[key]) |
||||||
|
}else{ |
||||||
|
formData[key] = data[key] |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
const getDetail = async (row: Record<string, any>) => { |
||||||
|
const data = await dutyDetail({ |
||||||
|
id: row.id |
||||||
|
}) |
||||||
|
setFormData(data) |
||||||
|
} |
||||||
|
const searchPoliceUser = (query: string) => { |
||||||
|
if (query) { |
||||||
|
setTimeout(() => { |
||||||
|
console.log(query) |
||||||
|
const params= { |
||||||
|
searchName: query |
||||||
|
} |
||||||
|
const policeList = searchPolice(params).then((res: any) => { |
||||||
|
optionsData.policeList=res; |
||||||
|
return Promise.resolve(res) |
||||||
|
}) |
||||||
|
.catch((err: any) => { |
||||||
|
return Promise.reject(err) |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
}, 200) |
||||||
|
} else { |
||||||
|
optionsData.policeList = [] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
const handleSelectChange = (newValue) => { |
||||||
|
formData.empNo=newValue |
||||||
|
console.log('选中的值:', newValue); |
||||||
|
}; |
||||||
|
const handleClose = () => { |
||||||
|
emit('close') |
||||||
|
} |
||||||
|
|
||||||
|
defineExpose({ |
||||||
|
open, |
||||||
|
setFormData, |
||||||
|
getDetail |
||||||
|
}) |
||||||
|
</script> |
||||||
@ -1,188 +0,0 @@ |
|||||||
<template> |
|
||||||
<div ref="echart5" id="echart5"style="width: 400px"></div> |
|
||||||
<!-- <el-tabs v-model="activeName" class="trend-tabs" type="card" @tab-click="handleTabClick">--> |
|
||||||
<!-- <el-tab-pane label="按天计算" name="first3">--> |
|
||||||
<!-- --> |
|
||||||
<!-- </el-tab-pane>--> |
|
||||||
<!-- <el-tab-pane label="按月计算" name="third4">--> |
|
||||||
|
|
||||||
<!-- </el-tab-pane>--> |
|
||||||
<!-- <el-tab-pane label="按年计算" name="third15">--> |
|
||||||
|
|
||||||
<!-- </el-tab-pane>--> |
|
||||||
|
|
||||||
<!-- </el-tabs>--> |
|
||||||
</template> |
|
||||||
<style> |
|
||||||
@import 'assets/css/index.css'; |
|
||||||
|
|
||||||
</style> |
|
||||||
<script lang="ts" setup> |
|
||||||
import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue'; |
|
||||||
import * as echarts from 'echarts'; |
|
||||||
import type {TabsPaneContext} from "element-plus"; |
|
||||||
|
|
||||||
const activeName = ref('first3'); |
|
||||||
const tabs = [ |
|
||||||
{ name: 'tab1', label: 'Tab 1' }, |
|
||||||
{ name: 'tab2', label: 'Tab 2' }, |
|
||||||
{ name: 'tab3', label: 'Tab 3' } |
|
||||||
]; |
|
||||||
const handleTabClick = (tab: TabsPaneContext, event: Event) => { |
|
||||||
console.log("Click event triggered!"+tab.name); |
|
||||||
//activeName = tab.props.name; |
|
||||||
} |
|
||||||
|
|
||||||
let echart_5 = ref('echart5'); |
|
||||||
onMounted(() => { |
|
||||||
echarts_5() |
|
||||||
|
|
||||||
}); |
|
||||||
const echarts_5=() => { |
|
||||||
// 基于准备好的dom,初始化echarts实例 |
|
||||||
var echartMap = echarts.init(echart_5.value); |
|
||||||
|
|
||||||
var lightBlue = { |
|
||||||
type: 'linear', |
|
||||||
x: 0, |
|
||||||
y: 0, |
|
||||||
x2: 0, |
|
||||||
y2: 1, |
|
||||||
colorStops: [{ |
|
||||||
offset: 0, |
|
||||||
color: 'rgba(41, 121, 255, 1)' |
|
||||||
}, { |
|
||||||
offset: 1, |
|
||||||
color: 'rgba(0, 192, 255, 1)' |
|
||||||
}], |
|
||||||
globalCoord: false |
|
||||||
} |
|
||||||
let option = { |
|
||||||
tooltip: { |
|
||||||
trigger: 'axis', |
|
||||||
axisPointer: { |
|
||||||
lineStyle: { |
|
||||||
color: '#dddc6b' |
|
||||||
} |
|
||||||
} |
|
||||||
}, |
|
||||||
legend: { |
|
||||||
top:'0%', |
|
||||||
right: '0%', |
|
||||||
data:['信件数'], |
|
||||||
textStyle: { |
|
||||||
color: 'rgba(255,255,255,.5)', |
|
||||||
fontSize:'12', |
|
||||||
} |
|
||||||
}, |
|
||||||
grid: { |
|
||||||
left: '10', |
|
||||||
top: '30', |
|
||||||
right: '10', |
|
||||||
bottom: '10', |
|
||||||
containLabel: true |
|
||||||
}, |
|
||||||
|
|
||||||
xAxis: [{ |
|
||||||
type: 'category', |
|
||||||
boundaryGap: false, |
|
||||||
axisLabel: { |
|
||||||
textStyle: { |
|
||||||
color: "rgba(255,255,255,.6)", |
|
||||||
fontSize:12, |
|
||||||
}, |
|
||||||
}, |
|
||||||
axisLine: { |
|
||||||
lineStyle: { |
|
||||||
color: 'rgba(255,255,255,.2)' |
|
||||||
} |
|
||||||
|
|
||||||
}, |
|
||||||
|
|
||||||
data: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'] |
|
||||||
|
|
||||||
}, { |
|
||||||
|
|
||||||
axisPointer: {show: false}, |
|
||||||
axisLine: { show: false}, |
|
||||||
position: 'bottom', |
|
||||||
offset: 20, |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}], |
|
||||||
|
|
||||||
yAxis: [{ |
|
||||||
type: 'value', |
|
||||||
axisTick: {show: false}, |
|
||||||
axisLine: { |
|
||||||
lineStyle: { |
|
||||||
color: 'rgba(255,255,255,.1)' |
|
||||||
} |
|
||||||
}, |
|
||||||
axisLabel: { |
|
||||||
textStyle: { |
|
||||||
color: "rgba(255,255,255,.6)", |
|
||||||
fontSize:12, |
|
||||||
}, |
|
||||||
}, |
|
||||||
|
|
||||||
splitLine: { |
|
||||||
lineStyle: { |
|
||||||
color: 'rgba(255,255,255,.1)' |
|
||||||
} |
|
||||||
} |
|
||||||
}], |
|
||||||
series: [ |
|
||||||
{ |
|
||||||
name: '信件数', |
|
||||||
type: 'line', |
|
||||||
smooth: true, |
|
||||||
symbol: 'circle', |
|
||||||
symbolSize: 5, |
|
||||||
showSymbol: false, |
|
||||||
lineStyle: { |
|
||||||
|
|
||||||
normal: { |
|
||||||
color: '#0184d5', |
|
||||||
width: 2 |
|
||||||
} |
|
||||||
}, |
|
||||||
areaStyle: { |
|
||||||
normal: { |
|
||||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ |
|
||||||
offset: 0, |
|
||||||
color: 'rgba(1, 132, 213, 0.4)' |
|
||||||
}, { |
|
||||||
offset: 0.8, |
|
||||||
color: 'rgba(1, 132, 213, 0.1)' |
|
||||||
}], false), |
|
||||||
shadowColor: 'rgba(0, 0, 0, 0.1)', |
|
||||||
} |
|
||||||
}, |
|
||||||
itemStyle: { |
|
||||||
normal: { |
|
||||||
color: '#0184d5', |
|
||||||
borderColor: 'rgba(221, 220, 107, .1)', |
|
||||||
borderWidth: 12 |
|
||||||
} |
|
||||||
}, |
|
||||||
data: [3, 4, 3, 4, 3, 4, 3, 6, 2, 4, 2, 4,3, 4, 3, 4, 3, 4, 3, 6, 2, 4, 2, 4] |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
] |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
// 使用刚指定的配置项和数据显示图表。 |
|
||||||
echartMap.setOption(option); |
|
||||||
window.addEventListener("resize",function(){ |
|
||||||
echartMap.resize(); |
|
||||||
}); |
|
||||||
} |
|
||||||
</script> |
|
||||||
|
|
||||||
<style scoped> |
|
||||||
/* 样式定义 */ |
|
||||||
</style> |
|
||||||
Loading…
Reference in new issue