薪资管理和考勤分析

This commit is contained in:
砂糖
2025-08-09 14:39:14 +08:00
parent 996e8d3258
commit 7e160a1623
22 changed files with 1871 additions and 222 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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:[],

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
},

View File

@@ -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();
});