薪资管理和考勤分析
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="120px">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
|
||||
<!-- <el-form-item label="关联汇报概述ID" prop="summaryId">
|
||||
<el-input
|
||||
v-model="queryParams.summaryId"
|
||||
@@ -93,26 +93,25 @@
|
||||
|
||||
<el-table v-loading="loading" :data="reportDetailList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" align="center" type="index" v-if="true"/>
|
||||
<!-- <el-table-column label="关联汇报概述ID" align="center" prop="summaryId" /> -->
|
||||
<el-table-column label="设备编号" align="center" prop="deviceCode" />
|
||||
<el-table-column label="设备类别" align="center" prop="category" />
|
||||
<!-- <el-table-column label="设备生产说明" align="center" prop="deviceDescription" /> -->
|
||||
<el-table-column label="汇报详情内容" align="center" prop="reportDetail" />
|
||||
<el-table-column label="图片概况" align="center" prop="ossIds" width="100">
|
||||
<template slot-scope="scope">
|
||||
<!-- <el-table-column label="图片概况" align="center" prop="ossIds" width="100">
|
||||
<template #default="scope">
|
||||
<image-preview :src="scope.row.ossIds" :width="50" :height="50"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
<template #default="scope">
|
||||
<!-- <el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-view"
|
||||
@click="handleImageDetail(scope.row)"
|
||||
>图片详情</el-button>
|
||||
>图片详情</el-button> -->
|
||||
|
||||
|
||||
<el-button
|
||||
@@ -142,7 +141,7 @@
|
||||
/>
|
||||
|
||||
<!-- 添加或修改设计项目汇报详情对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
|
||||
<el-dialog :title="title" v-model="open" width="50%" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form-item label="设备编号" prop="deviceCode">
|
||||
<el-input v-model="form.deviceCode" placeholder="请输入设备唯一编号" />
|
||||
@@ -162,14 +161,14 @@
|
||||
<el-form-item label="详情内容" prop="reportDetail">
|
||||
<el-input v-model="form.reportDetail" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item label="图像" prop="ossIds">
|
||||
<!-- <el-form-item label="图像" prop="ossIds">
|
||||
<image-upload v-model="form.ossIds"/>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<div class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="汇报标题" prop="reportTitle">
|
||||
<el-input
|
||||
v-model="queryParams.reportTitle"
|
||||
@@ -75,26 +75,25 @@
|
||||
|
||||
<el-table v-loading="loading" :data="reportSummaryList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" align="center" type="index" v-if="true"/>
|
||||
<el-table-column label="汇报标题" align="center" prop="reportTitle">
|
||||
<template slot-scope="scope">
|
||||
<router-link class="link-type" :to="'/produce/construction/detail/' + scope.row.summaryId">{{ scope.row.reportTitle }}</router-link>
|
||||
<template #default="scope">
|
||||
<router-link class="link-type" :to="'/info/construction/detail/' + scope.row.summaryId">{{ scope.row.reportTitle }}</router-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="最近汇报时间" align="center" prop="lastUpdateTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.lastUpdateTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="汇报日期" align="center" prop="reportDate" width="180">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.reportDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="汇报人" align="center" prop="reporter" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
@@ -129,7 +128,7 @@
|
||||
<el-date-picker clearable
|
||||
v-model="form.reportDate"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="请选择汇报日期"
|
||||
style="width: 100%;">
|
||||
</el-date-picker>
|
||||
@@ -141,7 +140,7 @@
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<div class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="96px">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="96px">
|
||||
<el-form-item label="物流编号" prop="expressCode">
|
||||
<el-input
|
||||
v-model="queryParams.expressCode"
|
||||
@@ -42,12 +42,12 @@
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="物流公司" prop="expressType">
|
||||
<el-select v-model="queryParams.expressType" placeholder="请选择物流公司标识" clearable>
|
||||
<el-select style="width: 200px;" v-model="queryParams.expressType" placeholder="请选择物流公司标识" clearable>
|
||||
<el-option
|
||||
v-for="dict in oa_express_type"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -117,7 +117,7 @@
|
||||
<el-table-column type="selection" width="55" align="center"/>
|
||||
<el-table-column label="物流编号" align="center" prop="expressCode"/>
|
||||
<el-table-column label="数据状态" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.status===0" type="warning">未确认</el-tag>
|
||||
<el-tag v-if="scope.row.status===1" type="primary">进行中</el-tag>
|
||||
<el-tag v-if="scope.row.status===2" type="success">已完成</el-tag>
|
||||
@@ -125,7 +125,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="物流状态" align="center" prop="status" width="200">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<ExpressStatusEditor
|
||||
:lastStatus.sync="scope.row.lastStatus"
|
||||
:lastUpdateTime.sync="scope.row.lastUpdateTime"
|
||||
@@ -135,7 +135,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="剩余时间" align="center" width="120">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<ExpressRemainTime :planDate="scope.row.planDate" :status="scope.row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -143,23 +143,23 @@
|
||||
<el-table-column label="负责人" align="center" prop="ownerName"/>
|
||||
<el-table-column label="负责人手机" align="center" prop="ownerPhone"/>
|
||||
<el-table-column label="计划到货时间" align="center" prop="planDate" width="180">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{parseTime(scope.row.planDate,'{y}-{m}-{d}')}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="更新时间" align="center" prop="planDate" width="180">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{scope.row.updateTime}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="物流公司标识" align="center" prop="expressType">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="oa_express_type" :value="scope.row.expressType"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
@@ -228,7 +228,7 @@
|
||||
/>
|
||||
|
||||
<!-- 添加或修改物流预览对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form-item label="物流编号" prop="expressCode">
|
||||
<el-input v-model="form.expressCode" placeholder="请输入物流编号"/>
|
||||
@@ -249,8 +249,8 @@
|
||||
<el-form-item label="计划到货时间" prop="planDate">
|
||||
<el-date-picker clearable
|
||||
v-model="form.planDate"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择计划到货时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
@@ -265,17 +265,6 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="发货记录" prop="detailId">
|
||||
<el-select v-model="form.detailId" placeholder="请选择发货记录">
|
||||
<el-option
|
||||
v-for="item in reportDetailList"
|
||||
:key="item.detailId"
|
||||
:label="item.reportDetail"
|
||||
:value="item.detailId"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
|
||||
</el-form-item>
|
||||
@@ -289,7 +278,7 @@
|
||||
<!-- 物流详情弹窗 -->
|
||||
<el-dialog
|
||||
title="物流详情"
|
||||
:visible.sync="detailOpen"
|
||||
v-model="detailOpen"
|
||||
width="600px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -324,7 +313,7 @@
|
||||
<!-- 异常登记弹窗表单 -->
|
||||
<el-dialog
|
||||
title="异常问题登记"
|
||||
:visible.sync="questionDialogVisible"
|
||||
v-model="questionDialogVisible"
|
||||
width="500px"
|
||||
append-to-body
|
||||
>
|
||||
@@ -375,7 +364,13 @@ import ExpressStatusEditor from './components/ExpressStatusEditor.vue';
|
||||
export default {
|
||||
name: "Express",
|
||||
components: {UserSelect, ExpressStatusEditor, ExpressRemainTime},
|
||||
dicts: ['oa_express_type'],
|
||||
setup() {
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { oa_express_type } = proxy.useDict("oa_express_type")
|
||||
return {
|
||||
oa_express_type
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
@@ -444,9 +439,6 @@ export default {
|
||||
expressType: [
|
||||
{required: true, message: "物流公司标识不能为空", trigger: "change"}
|
||||
],
|
||||
remark: [
|
||||
{required: true, message: "备注不能为空", trigger: "blur"}
|
||||
]
|
||||
},
|
||||
allProject:[],
|
||||
reportDetailList:[],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="关联快递" prop="expressId">
|
||||
<el-input
|
||||
v-model="queryParams.expressId"
|
||||
@@ -40,15 +40,15 @@
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<!-- <el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-check"
|
||||
icon="Check"
|
||||
size="mini"
|
||||
@click="handleUpdateStatus"
|
||||
>修复</el-button>
|
||||
</el-col>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
@@ -87,20 +87,20 @@
|
||||
<el-table-column label="快递单号" align="center" prop="expressCode" />
|
||||
<el-table-column label="问题描述" align="center" prop="description" />
|
||||
<el-table-column label="汇报时间" align="center" prop="reportTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.reportTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="汇报人" align="center" prop="reportBy" />
|
||||
<el-table-column label="是否解决" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.status===0" type="danger">未解决</el-tag>
|
||||
<el-tag v-if="scope.row.status===1" type="success">完成</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
@@ -126,7 +126,7 @@
|
||||
/>
|
||||
|
||||
<!-- 添加或修改快递问题对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="问题描述" prop="description">
|
||||
<el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
|
||||
@@ -146,7 +146,7 @@
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<div class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<!-- 对话框:新增 Feedback -->
|
||||
<el-dialog
|
||||
title="新增反馈"
|
||||
:visible.sync="dialogVisible"
|
||||
v-model="dialogVisible"
|
||||
width="800px"
|
||||
@close="resetForm"
|
||||
>
|
||||
@@ -82,7 +82,7 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleAddFeedback">提交</el-button>
|
||||
</span>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:visible.sync="visible"
|
||||
v-model="visible"
|
||||
width="860px"
|
||||
custom-class="project-report-detail"
|
||||
:before-close="handleClose"
|
||||
append-to-body
|
||||
>
|
||||
<template #title>
|
||||
<template #header>
|
||||
<div class="dialog-title flex items-center gap-2">
|
||||
<i class="el-icon-document"></i>
|
||||
<span>项目报工详情</span>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref, onMounted, onBeforeUnmount, watch } from 'vue';
|
||||
import * as echarts from 'echarts';
|
||||
|
||||
export default {
|
||||
@@ -13,30 +14,20 @@ export default {
|
||||
required: true
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
data: {
|
||||
handler() {
|
||||
this.renderChart();
|
||||
},
|
||||
deep: true,
|
||||
immediate: true
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.chart = echarts.init(this.$refs.chartRef);
|
||||
this.renderChart();
|
||||
window.addEventListener('resize', this.resizeChart);
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener('resize', this.resizeChart);
|
||||
this.chart && this.chart.dispose();
|
||||
},
|
||||
methods: {
|
||||
renderChart() {
|
||||
// 如果数据为空,清空图表并显示暂无数据 loading
|
||||
if (!this.data || this.data.length === 0) {
|
||||
this.chart.clear();
|
||||
this.chart.showLoading({
|
||||
setup(props) {
|
||||
const chartRef = ref(null);
|
||||
let chart = null;
|
||||
|
||||
const renderChart = () => {
|
||||
// 确保 chart 已初始化
|
||||
if (!chart && chartRef.value) {
|
||||
chart = echarts.init(chartRef.value);
|
||||
}
|
||||
|
||||
// 如果没有数据
|
||||
if (!props.data || props.data.length === 0) {
|
||||
chart?.clear();
|
||||
chart?.showLoading({
|
||||
text: '暂无数据',
|
||||
color: '#999',
|
||||
textColor: '#999',
|
||||
@@ -45,20 +36,18 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
// 有数据时,隐藏 loading 并渲染图表
|
||||
this.chart.hideLoading();
|
||||
|
||||
// 有数据时渲染图表
|
||||
const option = {
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: this.data.map(i => i.date)
|
||||
data: props.data.map(i => i.date)
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
data: this.data.map(i => i.count),
|
||||
data: props.data.map(i => i.count),
|
||||
type: 'line',
|
||||
areaStyle: {}
|
||||
}
|
||||
@@ -67,12 +56,36 @@ export default {
|
||||
trigger: 'axis'
|
||||
}
|
||||
};
|
||||
// 第二个参数 true 避免与之前配置合并
|
||||
this.chart.setOption(option, true);
|
||||
},
|
||||
resizeChart() {
|
||||
this.chart && this.chart.resize();
|
||||
}
|
||||
chart?.setOption(option, true);
|
||||
};
|
||||
|
||||
const resizeChart = () => {
|
||||
chart?.resize();
|
||||
};
|
||||
|
||||
// 生命周期钩子
|
||||
onMounted(() => {
|
||||
renderChart();
|
||||
window.addEventListener('resize', resizeChart);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener('resize', resizeChart);
|
||||
chart?.dispose();
|
||||
});
|
||||
|
||||
// 监听 props.data 变化
|
||||
watch(
|
||||
() => props.data,
|
||||
() => {
|
||||
renderChart();
|
||||
},
|
||||
{ deep: true, immediate: true }
|
||||
);
|
||||
|
||||
return {
|
||||
chartRef
|
||||
};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -90,4 +103,4 @@ export default {
|
||||
top: 50% !important;
|
||||
transform: translateY(-50%) !important;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -18,7 +18,7 @@
|
||||
</el-row>
|
||||
|
||||
<!-- Summary Cards with Skeleton -->
|
||||
<el-skeleton :loading="loading" animated>
|
||||
<!-- <el-skeleton :loading="loading" animated>
|
||||
<template #template>
|
||||
<el-row :gutter="20" class="summary-cards">
|
||||
<el-col :span="6" v-for="n in 4" :key="n">
|
||||
@@ -48,20 +48,20 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
</el-skeleton>
|
||||
</el-skeleton> -->
|
||||
|
||||
<!-- Charts & Ranking with Skeleton -->
|
||||
<!-- 图表部分 -->
|
||||
<el-skeleton :loading="loading" animated>
|
||||
<template #template>
|
||||
<el-row :gutter="20" class="charts-ranking">
|
||||
<el-col :span="8" v-for="n in 3" :key="n">
|
||||
<el-col :span="12" v-for="n in 2" :key="n">
|
||||
<el-skeleton-item variant="rect" style="width: 100%; height: 300px" />
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
<template #default>
|
||||
<el-row type="flex" :gutter="20" class="charts-ranking">
|
||||
<el-col :span="8">
|
||||
<el-col :span="12">
|
||||
<el-card
|
||||
class="charts-card"
|
||||
:body-style="{ height: '300px', padding: '16px' }"
|
||||
@@ -70,16 +70,7 @@
|
||||
<TrendChart :data="trendData" style="height: 100%;" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-card
|
||||
class="charts-card"
|
||||
:body-style="{ height: '300px', padding: '16px' }"
|
||||
>
|
||||
<template #header>项目分布</template>
|
||||
<PieChart :data="pieData" style="height: 100%;" />
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-col :span="12">
|
||||
<el-card
|
||||
class="charts-card"
|
||||
:body-style="{ height: '300px', padding: '16px' }"
|
||||
@@ -96,7 +87,6 @@
|
||||
<el-card class="table-card">
|
||||
<el-tabs v-model="activeTab">
|
||||
<el-tab-pane label="数据总结" name="summary" />
|
||||
<el-tab-pane label="项目进度" name="progress" />
|
||||
<el-tab-pane label="历史记录" name="history" />
|
||||
</el-tabs>
|
||||
|
||||
@@ -135,55 +125,11 @@
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<div v-show="activeTab==='progress'">
|
||||
<el-table :data="projectList" stripe>
|
||||
<el-table-column label="项目代号">
|
||||
<template #default="{row}">
|
||||
<el-tag v-if="row.projectCode==null" type="danger">无</el-tag>
|
||||
<el-tag v-else>{{ row.projectCode }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="projectNum" label="项目编号" />
|
||||
<el-table-column prop="projectName" label="项目名称" />
|
||||
<el-table-column prop="reportCount" label="参与人天" />
|
||||
<el-table-column label="剩余时间" align="center" prop="remainTime">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.remainTime>=0">
|
||||
<div v-if="scope.row.projectStatus===0">
|
||||
<span v-if="scope.row.remainTime>5">剩余{{ scope.row.remainTime }}天</span>
|
||||
<el-tag v-else-if="scope.row.remainTime<=5 &&scope.row.remainTime>3" type="warning">
|
||||
剩余{{ scope.row.remainTime }}天
|
||||
</el-tag>
|
||||
<el-tag v-else type="danger">剩余{{ scope.row.remainTime }}天</el-tag>
|
||||
</div>
|
||||
<div v-else>-</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<el-tag type="danger" v-if="scope.row.projectStatus===0">过期{{
|
||||
Math.abs(scope.row.remainTime)
|
||||
}}天
|
||||
</el-tag>
|
||||
<div v-else>-</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="center" prop="projectStatus">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="sys_project_status" :value="scope.row.projectStatus"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<div v-show="activeTab==='history'">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<export-dialog />
|
||||
</el-col>
|
||||
<el-col>
|
||||
<el-button icon="Download" type="text" size="small" @click="loadMore">更多</el-button>
|
||||
</el-col>
|
||||
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-table :data="filteredHistory" stripe style="margin-top:16px">
|
||||
@@ -227,28 +173,22 @@
|
||||
|
||||
<script>
|
||||
import {
|
||||
getCardData,
|
||||
getPieData,
|
||||
getProjectData,
|
||||
getProjectReport,
|
||||
getRankData, getSummaryList,
|
||||
getTrendData,
|
||||
listClearProjectReport
|
||||
} from '@/api/oa/projectReport';
|
||||
import ExportDialog from './components/ExportDialog.vue';
|
||||
import PieChart from './components/PieChart.vue';
|
||||
import ProjectReportDetail from "./components/ProjectReportDetail.vue";
|
||||
import RankList from "./components/RankList.vue";
|
||||
import TrendChart from './components/TrendChart.vue';
|
||||
|
||||
export default {
|
||||
name: 'ReportDashboard',
|
||||
dicts:['sys_project_status'],
|
||||
name: 'ReportDashboard',
|
||||
components: {
|
||||
ProjectReportDetail,
|
||||
RankList,
|
||||
TrendChart,
|
||||
PieChart,
|
||||
ExportDialog
|
||||
},
|
||||
data() {
|
||||
@@ -307,10 +247,6 @@ export default {
|
||||
this.summaryList = res.data
|
||||
})
|
||||
},
|
||||
|
||||
loadMore(){
|
||||
this.$router.push('/hint/projectReport')
|
||||
},
|
||||
/** 查询详情 */
|
||||
openDetail(row) {
|
||||
getProjectReport(row.reportId).then(response => {
|
||||
@@ -324,33 +260,27 @@ export default {
|
||||
},
|
||||
async getBaseData() {
|
||||
this.fetchSummary()
|
||||
const [ cardRes, trendRes, pieRes,rankRes,ProjRes,reportRes ] = await Promise.all([
|
||||
getCardData(),
|
||||
const [ trendRes,rankRes,reportRes ] = await Promise.all([
|
||||
getTrendData(this.dateRange[0], this.dateRange[1]),
|
||||
getPieData(this.dateRange[0], this.dateRange[1]),
|
||||
getRankData(this.dateRange[0], this.dateRange[1]),
|
||||
getProjectData(this.dateRange[0], this.dateRange[1]),
|
||||
listClearProjectReport(this.dateRange[0], this.dateRange[1])
|
||||
]);
|
||||
// 处理卡片
|
||||
const { todayCount, todayCountChange: yc,
|
||||
inProgressProjects, projectChange: yp,
|
||||
completionRate, completionChange: ycr,
|
||||
exceptions
|
||||
} = cardRes.data;
|
||||
const pct = (t,y) => y===0 ? '—' : (((t-y)/y)*100).toFixed(1) + '%';
|
||||
this.summaryCards = [
|
||||
{ title:'今日报工人数', value:todayCount, displayChange:`${pct(todayCount,yc)} 较昨日`, changeClass: todayCount-yc>=0?'up':'down', icon:'el-icon-user', iconColor:'#67C23A' },
|
||||
{ title:'进行中项目', value:inProgressProjects, displayChange:`${pct(inProgressProjects,yp)} 较昨日`, changeClass: inProgressProjects-yp>=0?'up':'down', icon:'el-icon-document', iconColor:'#409EFF' },
|
||||
{ title:'本月报工', value:completionRate, displayChange:`${pct(completionRate,ycr)} 较上月`, changeClass: completionRate-ycr>=0?'up':'down', icon:'el-icon-data-analysis', iconColor:'#E6A23C' },
|
||||
{ title:'异常预警', value:exceptions, exception:true, icon:'el-icon-warning', iconColor:'#F56C6C' }
|
||||
];
|
||||
// const { todayCount, todayCountChange: yc,
|
||||
// inProgressProjects, projectChange: yp,
|
||||
// completionRate, completionChange: ycr,
|
||||
// exceptions
|
||||
// } = cardRes.data;
|
||||
// const pct = (t,y) => y===0 ? '—' : (((t-y)/y)*100).toFixed(1) + '%';
|
||||
// this.summaryCards = [
|
||||
// { title:'今日报工人数', value:todayCount, displayChange:`${pct(todayCount,yc)} 较昨日`, changeClass: todayCount-yc>=0?'up':'down', icon:'el-icon-user', iconColor:'#67C23A' },
|
||||
// { title:'进行中项目', value:inProgressProjects, displayChange:`${pct(inProgressProjects,yp)} 较昨日`, changeClass: inProgressProjects-yp>=0?'up':'down', icon:'el-icon-document', iconColor:'#409EFF' },
|
||||
// { title:'本月报工', value:completionRate, displayChange:`${pct(completionRate,ycr)} 较上月`, changeClass: completionRate-ycr>=0?'up':'down', icon:'el-icon-data-analysis', iconColor:'#E6A23C' },
|
||||
// { title:'异常预警', value:exceptions, exception:true, icon:'el-icon-warning', iconColor:'#F56C6C' }
|
||||
// ];
|
||||
// 赋值图表数据
|
||||
this.trendData = trendRes.data;
|
||||
this.pieData = pieRes.data;
|
||||
this.ranking = rankRes.data;
|
||||
this.projectList = ProjRes.data;
|
||||
console.log(this.projectList)
|
||||
this.historyList = reportRes.data;
|
||||
this.loading = false;
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="96px">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="96px">
|
||||
<el-form-item label="报工人" prop="nickName">
|
||||
<el-input
|
||||
v-model="queryParams.nickName"
|
||||
@@ -87,21 +87,8 @@
|
||||
|
||||
<el-table v-loading="loading" :data="projectReportList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center"/>
|
||||
<el-table-column label="项目代号" prop="projectCode" width="100" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.projectCode==null" type="danger">无</el-tag>
|
||||
<el-tag v-else>{{ scope.row.projectCode }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目名称" align="center" width="150" prop="projectName">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.prePay>0">⭐</span>
|
||||
<span>{{ scope.row.projectName }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目编号" align="left" prop="projectNum"/>
|
||||
<el-table-column label="经办人" align="center" prop="nickName">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.nickName }}
|
||||
<template v-if="scope.row.deptName!=null">
|
||||
({{ scope.row.deptName }})
|
||||
@@ -111,19 +98,19 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="工作地点" align="center" prop="workPlace"/>
|
||||
<el-table-column label="国内/国外" align="center" prop="workType">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-tag :type="scope.row.workType===0?'':'warning'">{{ scope.row.workType===0?'国内':'国外' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="报工时间" align="center" prop="createTime">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<span>{{parseTime(scope.row.createTime,'{y}-{m}-{d}')}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
@@ -338,7 +325,6 @@ export default {
|
||||
this.projectReportList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
this.getProjectList()
|
||||
this.getDeptList();
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user