master
parent
0e3a2fa46b
commit
89b23d46ea
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-card shadow="always">
|
||||||
|
<template #header>
|
||||||
|
<slot name="header">
|
||||||
|
<div>
|
||||||
|
<Icon :icon="$route.meta.icon"></Icon>
|
||||||
|
<span style="font-weight: 600;letter-spacing: 1px;">{{ $route.meta.title }}</span>
|
||||||
|
</div>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #default>
|
||||||
|
<slot></slot>
|
||||||
|
</template>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Icon from "@/layout/components/Sidebar/Icon.vue"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Icon
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
computed: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
</style>
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "Icon",
|
||||||
|
props: {
|
||||||
|
icon: String
|
||||||
|
},
|
||||||
|
render(h) {
|
||||||
|
if (this.icon) {
|
||||||
|
if (this.icon.includes('el-icon')) {
|
||||||
|
return <i class={[this.icon, 'sub-el-icon']} />
|
||||||
|
}
|
||||||
|
else if(this.icon.includes("iviewicon")){
|
||||||
|
let icon = this.icon.split("/")[1];
|
||||||
|
return <Icon type={icon} class='sub-el-icon' size="18" />
|
||||||
|
}
|
||||||
|
else if(this.icon.includes("iconfont")){
|
||||||
|
let icon = this.icon.split("/")[1]+" iconfont";
|
||||||
|
return <Icon custom={icon} class='sub-el-icon' size="18" />
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return <i class="sub-el-icon"><svg-icon class-name="sub-el-icon__svg" icon-class={this.icon}/></i>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
computed: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.sub-el-icon {
|
||||||
|
margin-right: 5px;
|
||||||
|
width: 18px !important;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
color: currentColor;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
&__svg {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<div class="container">
|
||||||
|
<div class="left-bar">
|
||||||
|
<el-card>
|
||||||
|
<el-radio-group v-model="pickedType" size="small">
|
||||||
|
<el-radio v-for="item in types" :key="item.value" :label="item.value" border>{{ item.name }}</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
<card-container class="right-content">
|
||||||
|
<div class="select">
|
||||||
|
<el-date-picker
|
||||||
|
:value="select.date_range ? select.date_range.split('~') : []"
|
||||||
|
type="daterange"
|
||||||
|
align="right"
|
||||||
|
unlink-panels
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="yyyy-MM-dd"
|
||||||
|
:picker-options="pickerOptions"
|
||||||
|
@input="e => select.date_range = e ? e.join('~') : ''">
|
||||||
|
</el-date-picker>
|
||||||
|
</div>
|
||||||
|
</card-container>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { statistics } from '@/api/flow'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
pickedType: 'custom-model',
|
||||||
|
types: [
|
||||||
|
{
|
||||||
|
value: 'avg-time',
|
||||||
|
name: '平均办结时长'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'mixed',
|
||||||
|
name: '流程模块+发起科室'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'department',
|
||||||
|
name: '发起科室'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'custom-model',
|
||||||
|
name: '流程模块'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
select: {
|
||||||
|
date_range: '',
|
||||||
|
department_id: ''
|
||||||
|
},
|
||||||
|
pickerOptions: {
|
||||||
|
shortcuts: [{
|
||||||
|
text: '最近一周',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date();
|
||||||
|
const start = new Date();
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
|
||||||
|
picker.$emit('pick', [start, end]);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
text: '最近一个月',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date();
|
||||||
|
const start = new Date();
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
|
||||||
|
picker.$emit('pick', [start, end]);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
text: '最近三个月',
|
||||||
|
onClick(picker) {
|
||||||
|
const end = new Date();
|
||||||
|
const start = new Date();
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
|
||||||
|
picker.$emit('pick', [start, end]);
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async getData() {
|
||||||
|
try {
|
||||||
|
const res = await statistics(this.pickedType, this.select)
|
||||||
|
console.log(res)
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.left-bar {
|
||||||
|
flex-basis: 22%;
|
||||||
|
}
|
||||||
|
.right-content {
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.container {
|
||||||
|
display: inherit;
|
||||||
|
|
||||||
|
.right-content {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::v-deep .el-radio.is-bordered+.el-radio.is-bordered {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
::v-deep .el-radio.is-bordered {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Loading…
Reference in new issue