Files
fad_oa/ruoyi-ui/src/views/oa/remind/index.vue
hdka de37820973 1、文件上传功能重构
2、实现签到删除
3、实现签到表格处弹性布局
4、库存删除问题修正
2024-12-16 08:02:05 +08:00

574 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="wrap">
<el-row :gutter="20">
<el-col :span="16">
<el-row :gutter="20">
<el-col :span="6">
<div class="grid-content bg01">
<div class="info-left"><i class="el-icon-alarm-clock"></i></div>
<div class="info-right">
<h4>今日待办</h4>
<div class="conter"><span class="pull-right"></span>{{todayRemind}}</div>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="grid-content bg02">
<div class="info-left"><i class="el-icon-timer"></i></div>
<div class="info-right">
<h4>所有待办</h4>
<div class="conter"><span class="pull-right"></span>{{allRemind}}</div>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="grid-content bg03">
<div class="info-left"><i class="el-icon-basketball"></i></div>
<div class="info-right">
<h4>逾期未办</h4>
<div class="conter">{{overdueRemind}}</div>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="grid-content bg04">
<div class="info-left"><i class="el-icon-edit-outline"></i></div>
<div class="info-right">
<h4>历史已办</h4>
<div class="conter"><span class="pull-right"></span>{{historyRemind}}</div>
</div>
</div>
</el-col>
<el-col :span="24">
<div class="table-block">
<template>
<el-table :data="listRemind" stripe style="width: 100%">
<el-table-column prop="taskTitle" label="待办事件"></el-table-column>
<el-table-column prop="content" label="事件内容"></el-table-column>
<el-table-column label="待办日期" align="center" prop="createTime" width="120">
<template slot-scope="scope">
<span v-if="getTimesTamp(now) > getTimesTamp(scope.row.taskTime)"
style="color: #1ab394">{{ parseTime(scope.row.taskTime, '{y}-{m}-{d}') }}</span>
<span v-else style="color: #ff9900">{{ parseTime(scope.row.taskTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="createBy" label="创建者" width="120"></el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="120">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="办理操作" align="center" width="120">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleLook(scope.row)"
v-hasPermi="['oa:remind:edit']"
>查看
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleTask(scope.row)"
v-hasPermi="['oa:remind:edit']"
>办理
</el-button>
</template>
</el-table-column>
</el-table>
</template>
</div>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<div class="demo-block">
<el-calendar>
<!-- 这里使用的是 2.5 slot 语法-->
<template
slot="dateCell"
slot-scope="{date, data}">
<!--自定义内容-->
<div class="calendar-day" style="text-align: center">
<div>
<span class="everyDay">{{ data.day.split('-').slice(2).join('-') }}</span>
</div>
<div v-for="item in brightDate">
<div v-if="(parseTime(item.taskTime, '{y}-{m}-{d}')).indexOf(data.day) != -1" class="task-block">
待办({{ item.count }})
</div>
</div>
</div>
</template>
</el-calendar>
</div>
</el-col>
</el-row>
<!--查看事件弹出层-->
<el-dialog :title="title" :visible.sync="openLook" width="30%" append-to-body>
<el-descriptions :column="4" border>
<el-descriptions-item label="待办事件" :labelStyle="lableBg" span="2" width="80px">
{{ lookRemind.taskTitle }}
</el-descriptions-item>
<el-descriptions-item label="待办时间" :labelStyle="lableBg" span="2">
{{ parseTime(lookRemind.taskTime, '{y}-{m}-{d}') }}
</el-descriptions-item>
<el-descriptions-item label="事件内容" :labelStyle="lableBg" span="4">
{{ lookRemind.content }}
</el-descriptions-item>
<el-descriptions-item label="创建者" :labelStyle="lableBg" span="2" width="80px">
{{ lookRemind.createBy }}
</el-descriptions-item>
<el-descriptions-item label="创建时间" :labelStyle="lableBg" span="2">
{{ parseTime(lookRemind.createTime, '{y}-{m}-{d}') }}
</el-descriptions-item>
<el-descriptions-item label="备注" :labelStyle="lableBg" span="4">
{{ lookRemind.remark }}
</el-descriptions-item>
<el-descriptions-item :labelStyle="lableBg" span="4">
<template slot="label">
<i class="el-icon-paperclip"></i>
附件
</template>
<!--附件-->
<template v-if="lookRemind.accessory">
<el-tooltip class="item" effect="dark" content="点击下载" placement="bottom">
<el-link type="primary" @click="downloadFile(form.accessory)">{{form.accessory.match('[^/]+(?!.*/)')[0]}}</el-link>
</el-tooltip>
</template>
<template v-else>
<span style="color: #999999">暂无附件</span>
</template>
<!--附件-->
</el-descriptions-item>
</el-descriptions>
</el-dialog>
<!--办理事件弹出层-->
<el-dialog :title="title" :visible.sync="openTask" width="30%" append-to-body>
<el-descriptions :column="4" border>
<el-descriptions-item label="待办事件" :labelStyle="lableBg" span="2" width="80px">
{{ form.taskTitle }}
</el-descriptions-item>
<el-descriptions-item label="待办时间" :labelStyle="lableBg" span="2">
{{ parseTime(form.taskTime, '{y}-{m}-{d}') }}
</el-descriptions-item>
<el-descriptions-item label="事件内容" :labelStyle="lableBg" span="4">
{{ form.content }}
</el-descriptions-item>
<el-descriptions-item label="创建者" :labelStyle="lableBg" span="2" width="80px">
{{ form.createBy }}
</el-descriptions-item>
<el-descriptions-item label="创建时间" :labelStyle="lableBg" span="2">
{{ parseTime(form.createTime, '{y}-{m}-{d}') }}
</el-descriptions-item>
<el-descriptions-item label="备注" :labelStyle="lableBg" span="4">
{{ form.remark }}
</el-descriptions-item>
<el-descriptions-item :labelStyle="lableBg" span="4">
<template slot="label">
<i class="el-icon-paperclip"></i>
附件
</template>
<!--附件-->
<template v-if="form.accessory">
<el-tooltip class="item" effect="dark" content="点击下载" placement="bottom">
<el-link type="primary" @click="downloadFile(form.accessory)">{{form.accessory.match('[^/]+(?!.*/)')[0]}}</el-link>
</el-tooltip>
</template>
<template v-else>
<span style="color: #999999">暂无附件</span>
</template>
<!--附件-->
</el-descriptions-item>
</el-descriptions>
<div class="form-back">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="办理情况" prop="manage">
<el-input v-model="form.manage" type="textarea" placeholder="请输入办理情况"/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancelTask"> </el-button>
</span>
</div>
</el-dialog>
<!--添加事件弹出层-->
<el-dialog :title="title" :visible.sync="open" width="30%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="待办事件" prop="taskTitle">
<el-input v-model="form.taskTitle" placeholder="请输入待办事件"/>
</el-form-item>
<el-form-item label="事件内容" prop="content">
<el-input v-model="form.content" type="textarea" placeholder="请输入内容"/>
</el-form-item>
<el-form-item label="办理时间" prop="taskTime">
<el-date-picker clearable
v-model="form.taskTime"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择办理时间">
</el-date-picker>
</el-form-item>
<el-form-item label="附件" prop="accessory">
<file-upload v-model="form.accessory"/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注"/>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</span>
</el-dialog>
<div class="footer-bottom">
<el-button type="primary" @click="addForm">添加事件</el-button>
</div>
</div>
</template>
<script>
import {addRemind, getRemind, getRemindList, getRemindCount, updateRemind} from "@/api/oa/remind";
export default {
name: "index",
data() {
return {
now: new Date(),
brightDate: [],
open: false,
openLook: false,
openTask: false,
title: '',
//详情lable背景
lableBg: "background: #f0f9eb; width:120px; text-align: center;",
// 表单参数
form: {},
lookRemind: {},
//今日待办
todayRemind: 0,
//所有待办
allRemind: 0,
//逾期未办
overdueRemind: 0,
//历史已经办
historyRemind: 0,
// 表单校验
rules: {
taskTitle: [
{required: true, message: "提醒名称不能为空", trigger: "blur"}
],
content: [
{required: true, message: "事件内容不能为空", trigger: "blur"}
],
taskTime: [
{required: true, message: "办理时间不能为空", trigger: "blur"}
],
},
listRemind: [],
// 查询参数
queryParams: {},
// 表单重置
reset() {
this.form = {
remindId: undefined,
taskTitle: undefined,
content: undefined,
taskTime: undefined,
taskStatus: undefined,
accessory: undefined,
remark: undefined,
createBy: undefined,
createTime: undefined,
updateBy: undefined,
updateTime: undefined
};
this.resetForm("form");
},
}
},
created() {
this.getList();
this.getNowRamind();
this.getAllRamind();
this.getOverdueRamind()
this.getHistoryRamind();
},
methods: {
/** 查询事件提醒列表 */
getList() {
this.loading = true;
let data = {
taskStatus: '0',
}
//获取待办事件列表
getRemindList(data).then(response => {
this.listRemind = response.data;
//日历待办遍历去重、增加属性字段count遇到重复+1
let arr = response.data;
// 使用reduce方法遍历数组累计相同id的次数并构建新数组
let newArr = arr.reduce((acc, current) => {
let duplicateCount = acc.filter(item => this.parseTime(item.taskTime, '{y}-{m}-{d}') === this.parseTime(current.taskTime, '{y}-{m}-{d}')).length;
if (duplicateCount === 0) {
acc.push({...current, count: 1});
} else {
// 找到重复对象并加1
let index = acc.findIndex(item => this.parseTime(item.taskTime, '{y}-{m}-{d}') === this.parseTime(current.taskTime, '{y}-{m}-{d}'));
acc[index].count = acc[index].count + 1;
}
return acc;
}, []);
this.brightDate = newArr;
this.loading = false;
});
},
/**今日待办事件统计**/
getNowRamind(){
this.queryParams.params = {};
this.queryParams.taskStatus = '0'
this.queryParams.params["beginTime"] = this.parseTime(this.now, '{y}-{m}-{d}') + ' 00:00:00';
this.queryParams.params["endTime"] = this.parseTime(this.now, '{y}-{m}-{d}') + ' 23:59:59';
getRemindCount(this.queryParams).then(response => {
this.todayRemind = response.data
})
},
/**逾期未办事件统计**/
getOverdueRamind(){
this.queryParams.params = {};
this.queryParams.taskStatus = '0'
this.queryParams.params["beginTime"] = this.parseTime(new Date('2020-01-01'), '{y}-{m}-{d}') + ' 00:00:00';
this.queryParams.params["endTime"] = this.parseTime(this.now, '{y}-{m}-{d}') + ' 23:59:59';
getRemindCount(this.queryParams).then(response => {
this.overdueRemind = response.data
})
},
/**所有待办事件统计**/
getAllRamind(){
this.queryParams.params = {};
this.queryParams.taskStatus = '0'
getRemindCount(this.queryParams).then(response => {
this.allRemind = response.data
})
},
/**已办事件统计**/
getHistoryRamind(){
this.queryParams.params = {};
this.queryParams.taskStatus = '1'
getRemindCount(this.queryParams).then(response => {
this.historyRemind = response.data
})
},
/**添加事件按钮操作**/
addForm() {
this.reset();
this.open = true;
},
/** 查看按钮操作 */
handleLook(row) {
this.loading = true;
this.reset();
const remindId = row.remindId || this.ids
getRemind(remindId).then(response => {
this.loading = false;
this.lookRemind = response.data;
this.openLook = true;
this.title = "查看待办详情";
});
},
/** 办理按钮操作 */
handleTask(row) {
this.loading = true;
this.reset();
const remindId = row.remindId || this.ids
getRemind(remindId).then(response => {
this.loading = false;
this.form = response.data;
this.openTask = true;
this.title = "事件办理";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
this.buttonLoading = true;
if (this.form.remindId != null) {
if (this.getTimesTamp(this.now) > this.getTimesTamp(this.form.taskTime) && this.form.manage != null) {
console.log("执行任务办理")
this.form.taskStatus = '1';
updateRemind(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.openTask = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
} else {
this.$modal.msgWarning("办理情况不可为空!或任务时间未到!")
}
} else {
addRemind(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).finally(() => {
this.buttonLoading = false;
});
}
//执行办理统计
this.getNowRamind();
this.getAllRamind();
this.getOverdueRamind()
this.getHistoryRamind();
}
});
},
getTimesTamp(date) {
return new Date(date).getTime()
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
cancelTask() {
this.openTask = false;
this.reset();
},
/** 下载文件 */
downloadFile(filePath){
this.$download.resource(filePath)
},
}
}
</script>
<style scoped>
.wrap {
padding: 30px;
}
.grid-content {
display: flex;
border-radius: 8px;
min-height: 36px;
color: #f5f5f5;
padding: 12px;
}
.info-left {
height: 100px;
width: 100px;
font-size: 88px;
text-align: center
}
.info-right {
margin-left: 15px;
}
.info-right h4 {
font-size: 18px;
color: #f5f5f5;
margin: 12px 0 10px 0;
}
.info-right .conter {
font-size: 45px;
color: #ffffff
}
.info-right .conter span {
font-size: 16px;
margin-top: 24px;
color: #f5f5f5
}
.bg01 {
background-color: #1ab394
}
.bg02 {
background-color: #409EFF
}
.bg03 {
background-color: #F56C6C
}
.bg04 {
background-color: #E6A23C
}
.form-back {
margin-top: 20px;
}
.table-block {
border: 1px solid #ebebeb;
border-bottom: 0;
border-radius: 6px;
transition: .2s;
margin-top: 20px;
}
.demo-block {
border: 1px solid #ebebeb;
border-radius: 6px;
transition: .2s;
padding-bottom: 8px;
}
.task-block {
color: #1ab394;
font-size: 14px;
margin-top: 20px
}
.footer-bottom {
margin: 24px 0;
}
</style>