Browse Source

新增工资汇总页面

master
xuesinan 4 years ago
parent
commit
d69f3008a8
  1. 193
      package-lock.json
  2. 1
      package.json
  3. 137
      src/components/BarChart/BarChart.vue
  4. 105
      src/components/LineChart/LineChart.vue
  5. 22
      src/main.js
  6. 14
      src/router/index.js
  7. 391
      src/views/SalarySummary/SalarySummary.vue

193
package-lock.json

@ -1808,6 +1808,16 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cacache": { "cacache": {
"version": "13.0.1", "version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594427999421&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594427999421&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@ -1840,6 +1850,34 @@
"integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
"dev": true "dev": true
}, },
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"css-loader": { "css-loader": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1604507107408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz", "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1604507107408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz",
@ -1893,6 +1931,13 @@
"universalify": "^0.1.0" "universalify": "^0.1.0"
} }
}, },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"icss-utils": { "icss-utils": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz?cache=0&sync_timestamp=1602527330977&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-4.1.1.tgz", "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz?cache=0&sync_timestamp=1602527330977&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-4.1.1.tgz",
@ -2007,6 +2052,16 @@
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
}, },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"terser-webpack-plugin": { "terser-webpack-plugin": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1603881757308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz", "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1603881757308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@ -2023,6 +2078,32 @@
"terser": "^4.6.12", "terser": "^4.6.12",
"webpack-sources": "^1.4.3" "webpack-sources": "^1.4.3"
} }
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"loader-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
} }
} }
}, },
@ -5224,6 +5305,22 @@
"safer-buffer": "^2.1.0" "safer-buffer": "^2.1.0"
} }
}, },
"echarts": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.2.2.tgz",
"integrity": "sha512-yxuBfeIH5c+0FsoRP60w4De6omXhA06c7eUYBsC1ykB6Ys2yK5fSteIYWvkJ4xJVLQgCvAdO8C4mN6MLeJpBaw==",
"requires": {
"tslib": "2.3.0",
"zrender": "5.2.1"
},
"dependencies": {
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
}
}
},
"ee-first": { "ee-first": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
@ -12649,87 +12746,6 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.5.0",
"resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-16.5.0.tgz?cache=0&sync_timestamp=1628666727543&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-16.5.0.tgz",
"integrity": "sha1-CcTgcSRmiZ40uZpoZSTxkWX7KJI=",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995588464&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
"integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646734234&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz",
"integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
"integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
"integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626716095603&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz",
"integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
"integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
"integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-quill-editor": { "vue-quill-editor": {
"version": "3.0.6", "version": "3.0.6",
"resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz", "resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
@ -13829,6 +13845,21 @@
"dev": true "dev": true
} }
} }
},
"zrender": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.2.1.tgz",
"integrity": "sha512-M3bPGZuyLTNBC6LiNKXJwSCtglMp8XUEqEBG+2MdICDI3d1s500Y4P0CzldQGsqpRVB7fkvf3BKQQRxsEaTlsw==",
"requires": {
"tslib": "2.3.0"
},
"dependencies": {
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
}
}
} }
} }
} }

1
package.json

@ -11,6 +11,7 @@
"ant-design-vue": "^1.2.4", "ant-design-vue": "^1.2.4",
"compression-webpack-plugin": "^6.1.1", "compression-webpack-plugin": "^6.1.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"echarts": "^5.2.2",
"moment": "^2.29.1", "moment": "^2.29.1",
"quill": "^1.3.7", "quill": "^1.3.7",
"register-service-worker": "^1.7.1", "register-service-worker": "^1.7.1",

137
src/components/BarChart/BarChart.vue

@ -0,0 +1,137 @@
<template>
<div id="linBarbox" :style="{ width: '100%', height: '200px' }" class="chart-box">
<div :id="id" style="width: 100%; height: 100%"></div>
</div>
</template>
<script>
export default {
name: 'LineBar',
props: {
id: {
default: '',
type: String,
},
color: {
default: () => [],
type: Array,
},
},
data() {
return {};
},
computed: {
// option
option() {
return {
grid: {
left: '0',
right: '5%',
bottom: '0',
top: '20px',
containLabel: true,
},
xAxis: [
{
type: 'value',
splitLine: { show: false },
// boundaryGap: false,
// show: true,
// axisLine: { show: false },
// axisTick: { show: false },
},
],
yAxis: [
{
// show: true,
type: 'category',
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
axisLine: { show: false },
axisTick: { show: false },
// splitLine: { show: false },
// data: ['0', '10', '20'],
},
// {
// show: false,
// type: 'value',
// },
],
series: [
{
type: 'bar',
// yAxisIndex: 1,
color: `${this.color[0]}`,
barWidth: '10',
data: [
{
value: 200,
itemStyle: { color: `${this.color[0]}` },
},
{
value: 232,
itemStyle: { color: `${this.color[1]}` },
},
{
value: 101,
itemStyle: { color: `${this.color[2]}` },
},
{
value: 264,
itemStyle: { color: `${this.color[3]}` },
},
{
value: 90,
itemStyle: { color: `${this.color[0]}` },
},
{
value: 340,
itemStyle: { color: `${this.color[1]}` },
},
{
value: 250,
itemStyle: { color: `${this.color[2]}` },
},
],
},
// {
// type: 'line',
// stack: '',
// smooth: true,
// lineStyle: {
// width: 2,
// color: `rgba(105,207,76,1)`,
// boxShadow: '10px 10px 10px #000',
// },
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: `rgba(105,207,76,0.4)`,
// },
// {
// offset: 1,
// color: `rgba(105,207,76,0)`,
// },
// ]),
// },
// emphasis: { focus: 'series' },
// data: [140, 232, 101, 264, 90, 340, 250],
// },
],
};
},
},
mounted() {
this.drawLine();
},
methods: {
drawLine() {
// domecharts
let myChart = this.$echarts.init(document.getElementById(this.id));
//
myChart.setOption(this.option);
},
},
};
</script>

105
src/components/LineChart/LineChart.vue

@ -0,0 +1,105 @@
<template>
<div id="linBarbox" :style="{ width: '100%', height: '200px' }" class="chart-box">
<div :id="id" style="width: 100%; height: 100%"></div>
</div>
</template>
<script>
export default {
name: 'LineBar',
props: {
id: {
default: '',
type: String,
},
color: {
default: () => [],
type: Array,
},
},
data() {
return {};
},
computed: {
// option
option() {
return {
grid: {
left: '5%',
right: '1%',
bottom: '0',
top: '20px',
containLabel: true,
},
xAxis: [
{
type: 'category',
// boundaryGap: false,
// show: true,
axisLine: { show: false },
axisTick: { show: false },
data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
},
],
yAxis: [
{
// show: true,
type: 'value',
splitLine: { show: false },
data: ['0', '10', '20'],
},
// {
// show: false,
// type: 'value',
// },
],
series: [
// {
// type: 'bar',
// yAxisIndex: 1,
// color: `rgba(105,207,76,0.4)`,
// barWidth: '10',
// data: [null, 140, 232, 101, 264, 90, 340, 250, null],
// },
{
type: 'line',
stack: '总量',
smooth: true,
lineStyle: {
width: 2,
color: `rgba(105,207,76,1)`,
boxShadow: '10px 10px 10px #000',
},
showSymbol: false,
areaStyle: {
opacity: 0.8,
color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: `rgba(105,207,76,0.4)`,
},
{
offset: 1,
color: `rgba(105,207,76,0)`,
},
]),
},
emphasis: { focus: 'series' },
data: [140, 232, 101, 264, 90, 340, 250],
},
],
};
},
},
mounted() {
this.drawLine();
},
methods: {
drawLine() {
// domecharts
let myChart = this.$echarts.init(document.getElementById(this.id));
//
myChart.setOption(this.option);
},
},
};
</script>

22
src/main.js

@ -1,22 +1,32 @@
// @ts-ignore
import Vue from 'vue';
import './plugins/axios'; import './plugins/axios';
import App from './App.vue';
import './registerServiceWorker'; import './registerServiceWorker';
import router from './router';
import store from './store';
import './plugins/ant-design-vue.js'; import './plugins/ant-design-vue.js';
import 'common/portrait.styl'; import 'common/portrait.styl';
import './assets/icon/iconfont.css'; import './assets/icon/iconfont.css';
import moment from 'moment'; //导入文件
import 'moment/locale/zh-cn'; import 'moment/locale/zh-cn';
import * as echarts from 'echarts';
import App from './App.vue';
// @ts-ignore
import Vue from 'vue';
import moment from 'moment'; //导入文件
import router from './router';
import store from './store';
moment.locale('zh-cn'); moment.locale('zh-cn');
Vue.prototype.$echarts = echarts;
Vue.prototype.$moment = moment; //赋值使用 Vue.prototype.$moment = moment; //赋值使用
Vue.config.productionTip = false; Vue.config.productionTip = false;
router.beforeEach((to, from, next) => {
//to and from are Route Object,next() must be called to resolve the hook}
document.title = to.matched[0].meta.title;
next();
});
window.vm = new Vue({ window.vm = new Vue({
router, router,
store, store,

14
src/router/index.js

@ -10,11 +10,25 @@ const routes = [
path: '/', path: '/',
name: 'Home', name: 'Home',
component: Home, component: Home,
meta: {
title: '考勤',
},
}, },
{ {
path: '/salary', path: '/salary',
name: 'salary', name: 'salary',
component: () => import('views/Salary/Salary.vue'), component: () => import('views/Salary/Salary.vue'),
meta: {
title: '工资表',
},
},
{
path: '/salary-summary',
name: 'salary-summary',
component: () => import('views/SalarySummary/SalarySummary.vue'),
meta: {
title: '工资汇总',
},
}, },
]; ];

391
src/views/SalarySummary/SalarySummary.vue

@ -0,0 +1,391 @@
<template>
<div class="salary-summary">
<!-- 日期选择 -->
<div class="date-box px-4 white flex justify-between items-center">
<div class="flex items-center"><a-icon class="icon" type="left" />上个月</div>
<!-- <div class="flex items-center">2021年11月<a-icon class="icon" type="down" /></div> -->
<div>
<a-month-picker
:default-value="$moment(currDate, monthFormat)"
:format="monthFormat"
@change="onChange"
:getCalendarContainer="getCalendarContainer()"
>
<a-icon slot="suffixIcon" type="down" />
</a-month-picker>
</div>
<div class="next-btn flex items-center" :style="{ color: isCurr ? '#BFBFBF' : '#595959' }">
下个月<a-icon class="icon" type="right" />
</div>
</div>
<!-- 金额汇总 -->
<div class="salary-total mt-3 white">
<div class="table-total">
<a-table :columns="columns" :data-source="data" :pagination="false" size="middle" />
</div>
</div>
<!-- 工资汇总表 -->
<div class="salary-table mt-3 p-4 white">
<div class="title-box flex items-center justify-between">
<div class="title">薪资明细</div>
<div class="right flex items-center color-gray"><span>更多</span><a-icon class="icon" type="right" /></div>
</div>
<div class="summary-table">
<a-table :columns="columns_all" :data-source="data_all" :pagination="false" size="middle" bordered :scroll="{ y: 140, x: 100 }" />
</div>
</div>
<!-- 近半年工资总额折线图 -->
<div class="echarts mt-3 py-4 white">
<div class="title-box px-4 flex items-center justify-between">
<div class="title">薪资总额</div>
<div class="right">
<a-dropdown>
<a class="ant-dropdown-link flex items-center">
<span>{{ companyName }}</span>
<a-icon class="icon" type="down" />
</a>
<a-menu slot="overlay" @click="handleMenuClick">
<a-menu-item v-for="item in companyList" :key="item.key">{{ item.name }}</a-menu-item>
</a-menu>
</a-dropdown>
</div>
</div>
<div>
<LineChart :id="'salaryTotalLine'" :color="['#69CF4C']" />
</div>
</div>
<!-- 近半年各部门薪资总额折线图 -->
<div class="echarts mt-3 p-4 white">
<div class="title-box flex items-center justify-between">
<div class="title">部门薪资概览</div>
<div class="right flex items-center">
<a-dropdown>
<a class="ant-dropdown-link flex items-center">
<span>{{ branchOfficeName }}</span>
<a-icon class="icon" type="down" />
</a>
<a-menu slot="overlay" @click="handleMenuClick">
<a-menu-item v-for="item in companyList" :key="item.key">{{ item.name }}</a-menu-item>
</a-menu>
</a-dropdown>
<a-dropdown class="ml-3">
<a class="ant-dropdown-link flex items-center">
<span>{{ departmentName }}</span>
<a-icon class="icon" type="down" />
</a>
<a-menu slot="overlay" @click="handleMenuClickDepartment">
<a-menu-item v-for="item in departmentList" :key="item.key">{{ item.name }}</a-menu-item>
</a-menu>
</a-dropdown>
<a-dropdown class="ml-3">
<a class="ant-dropdown-link flex items-center">
<span>{{ projectName }}</span>
<a-icon class="icon" type="down" />
</a>
<a-menu slot="overlay" @click="handleMenuClickProject">
<a-menu-item v-for="item in projectList" :key="item.key">{{ item.name }}</a-menu-item>
</a-menu>
</a-dropdown>
</div>
</div>
</div>
<!-- 员工薪资排行 -->
<div class="echarts mt-3 p-4 white">
<div class="title-box flex items-center justify-between">
<div class="title">薪资top排行榜</div>
</div>
<div>
<BarChart :id="'staffBar'" :color="['#0263FF', '#FF7723', '#8E30FF', '#247884']" />
</div>
</div>
</div>
</template>
<script>
import LineChart from '@/components/LineChart/LineChart.vue';
import BarChart from '@/components/BarChart/BarChart.vue';
const columns = [
{
title: '月份',
dataIndex: 'month',
width: 120,
align: 'center',
},
{
title: '总人数',
dataIndex: 'num',
width: 100,
align: 'center',
},
{
title: '薪资总额(元)',
dataIndex: 'salaryTotal',
align: 'center',
},
];
const data = [
{
key: '1',
month: '10月份薪资',
num: 25,
salaryTotal: '200000',
},
];
const columns_all = [
{
title: '姓名',
dataIndex: 'name',
width: 100,
align: 'center',
},
{
title: '工资',
dataIndex: 'salary',
width: 100,
align: 'center',
},
{
title: '所在部门',
dataIndex: 'department',
width: 100,
align: 'center',
},
{
title: '职务',
dataIndex: 'position',
width: 100,
align: 'center',
},
{
title: '工资卡号',
dataIndex: 'payrollCard',
width: 200,
align: 'center',
},
];
const data_all = [
{
key: '1',
name: '张三',
salary: 5000,
department: '技术',
position: '前端',
payrollCard: '111111111111111111',
},
{
key: '2',
name: '张三',
salary: 5000,
department: '技术',
position: '前端',
payrollCard: '111111111111111111',
},
{
key: '3',
name: '张三',
salary: 5000,
department: '技术',
position: '前端',
payrollCard: '111111111111111111',
},
{
key: '4',
name: '张三',
salary: 5000,
department: '技术',
position: '前端',
payrollCard: '111111111111111111',
},
{
key: '5',
name: '张三',
salary: 5000,
department: '技术',
position: '前端',
payrollCard: '111111111111111111',
},
];
export default {
components: { LineChart, BarChart },
data() {
return {
monthFormat: 'YYYY年MM月',
today: this.$moment(new Date()).format('YYYY年MM月'),
isCurr: true,
columns,
data,
columns_all,
data_all,
companyName: '公司名称',
branchOfficeName: '公司名称',
companyList: [
{ key: 1, name: '公司名称' },
{ key: 2, name: '子公司1' },
{ key: 3, name: '子公司2' },
],
departmentName: '全部',
departmentList: [
{ key: 1, name: '全部' },
{ key: 2, name: '部门1' },
{ key: 3, name: '部门2' },
],
projectName: '全部',
projectList: [
{ key: 1, name: '全部' },
{ key: 2, name: '项目1' },
{ key: 3, name: '项目2' },
],
};
},
computed: {
currDate() {
var myDate = new Date();
var tYear = myDate.getFullYear();
var tMonth = myDate.getMonth();
let m = tMonth === 0 ? 12 : tMonth;
let y = tMonth === 0 ? tYear - 1 : tYear;
let data = y + '年' + m + '月';
return data;
},
},
methods: {
//
onChange(date, dateString) {
if (dateString == this.today) {
isCurr = true;
} else {
isCurr = false;
}
},
//
getCalendarContainer() {
return triggerNode => triggerNode.parentNode;
},
// --
handleMenuClick(e) {
this.companyList.forEach((item, index) => {
if (e.key == item.key) {
this.companyName = item.name;
}
});
},
// --
handleMenuClickDepartment(e) {
this.departmentList.forEach((item, index) => {
if (e.key == item.key) {
this.departmentName = item.name;
}
});
},
// --
handleMenuClickProject(e) {
this.projectList.forEach((item, index) => {
if (e.key == item.key) {
this.projectName = item.name;
}
});
},
},
};
</script>
<style lang="less" scoped>
.salary-summary {
width: 100%;
min-height: 100vh;
padding-bottom: 70px;
background: #f3f3f3;
color: #595959;
}
.icon {
margin-left: 5px;
font-size: 12px;
}
.date-box {
height: 32px;
.ant-calendar-picker {
width: 120px;
}
/deep/ .ant-input {
border: none;
}
.next-btn {
color: #bfbfbf;
}
}
/deep/ .ant-calendar-picker-container {
left: -80px !important;
top: 32px !important;
}
.table-total {
/deep/ .ant-table-thead > tr > th {
border-top: 1px solid #e5e5e5;
}
}
/deep/ .ant-table-thead > tr > th {
background: #f2f2f2;
}
/deep/ .ant-table-thead > tr > th,
/deep/ .ant-table-tbody > tr > td {
border-bottom: 1px solid #e5e5e5;
}
.title-box {
height: 20px;
.title {
color: #262626;
font-weight: bold;
}
}
.salary-table {
.summary-table {
margin-top: 10px;
}
}
.ant-dropdown-link {
font-size: 12px;
color: #595959;
}
.color-gray {
color: #929292;
}
/deep/ .ant-modal {
top: calc(~'50vh - 130px');
}
</style>
Loading…
Cancel
Save