Files
desktop_task_schedule/code/web/task_schedule/src/views/RewardManagement.vue

392 lines
11 KiB
Vue
Raw Normal View History

2023-03-23 18:39:15 +08:00
<!--
* @Author: Kane
* @Date: 2023-03-23 16:05:08
* @LastEditors: Kane
2023-09-24 01:17:54 +08:00
* @FilePath: /task_schedule/src/views/RewardManagement.vue
2023-03-23 18:39:15 +08:00
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
-->
<template>
2023-09-12 18:12:27 +08:00
<div
v-if="ui.showUI"
class="wrapper"
>
2023-09-06 18:37:50 +08:00
<div class="reward-wrapper">
<div class="reward-gainer-wrapper">
<el-divider content-position="left">
2023-09-15 18:05:03 +08:00
90俱乐部 & 消7灭6包围战
2023-09-06 18:37:50 +08:00
</el-divider>
2023-09-08 17:57:34 +08:00
<div class="toolbutton-wrapper">
2023-09-12 18:12:27 +08:00
<el-button
type="primary"
icon="documentAdd"
2023-09-24 01:17:54 +08:00
@click="onAddRewardGainer"
2023-09-12 18:12:27 +08:00
>
2023-09-08 17:57:34 +08:00
新增
</el-button>
2023-09-12 18:12:27 +08:00
<el-button
type="danger"
icon="delete"
2023-09-24 16:34:31 +08:00
@click="onDeleteRewardGainer"
2023-09-12 18:12:27 +08:00
>
2023-09-08 17:57:34 +08:00
删除
</el-button>
2023-09-12 18:12:27 +08:00
<el-button
type="warning"
icon="Refresh"
@click="refresh"
>
刷新
</el-button>
2023-09-08 17:57:34 +08:00
</div>
2023-09-06 18:37:50 +08:00
<el-table
2023-09-24 16:34:31 +08:00
ref="rewardTelsalerTable"
2023-09-06 18:37:50 +08:00
border
stripe
style="width:100%;"
2023-09-12 18:12:27 +08:00
:data="rewardGainerData"
2023-09-06 18:37:50 +08:00
>
<el-table-column type="selection" />
<el-table-column
label="坐席名称"
align="center"
2023-09-12 18:12:27 +08:00
>
<template #default="rewardGainer">
<span
class="reward-gainer-td"
2023-09-13 18:01:07 +08:00
@dblclick="onEditRewardGainer(rewardGainer.row.recID, rewardGainer.row.callerName, rewardGainer.row.rewardProjectCode)"
2023-09-12 18:12:27 +08:00
>{{ rewardGainer.row.callerName }}</span>
</template>
</el-table-column>
2023-09-06 18:37:50 +08:00
<el-table-column
label="奖项名称"
align="center"
2023-09-12 18:12:27 +08:00
>
<template #default="rewardGainer">
<span
class="reward-gainer-td"
2023-09-13 18:01:07 +08:00
@dblclick="onEditRewardGainer( rewardGainer.row.recID, rewardGainer.row.callerName, rewardGainer.row.rewardProjectCode)"
2023-09-12 18:12:27 +08:00
>{{ rewardGainer.row.rewardProjectName }}</span>
</template>
</el-table-column>
2023-09-06 18:37:50 +08:00
</el-table>
2023-09-12 18:12:27 +08:00
<div class="pagination-wrapper">
<el-pagination
v-model="ui.tablePageIndex"
class="pull_left"
size="small"
background
:page-size="ui.tablePageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
2023-09-13 18:01:07 +08:00
:total="(ui.rewardGainerList ?? []).length"
2023-09-12 18:12:27 +08:00
@current-change="onCurrentPageIndexChange"
@size-change="onTablePageSizeChange"
/>
</div>
2023-09-06 18:37:50 +08:00
</div>
</div>
2023-09-13 18:01:07 +08:00
<div
v-if="ui.showEditRewardGainerDialog"
class="dialog-wrapper"
>
2023-09-12 18:12:27 +08:00
<el-dialog
v-model="ui.showEditRewardGainerDialog"
2023-09-13 18:01:07 +08:00
title="编辑获奖人员"
2023-09-12 18:12:27 +08:00
width="400px"
>
2023-09-13 18:01:07 +08:00
<RewardGainerDialog
:selected-rec-id="(ui.selectedRecID ?? -9999)"
:selected-reward-project-code="ui.selectedRewardProjectCode"
:selected-telsaler-name="ui.selectedTelsalerName"
/>
2023-09-12 18:12:27 +08:00
</el-dialog>
</div>
2023-03-23 18:39:15 +08:00
</div>
</template>
<script lang="ts">
2023-09-25 16:23:26 +08:00
import { reactive, computed, onBeforeMount, ref } from "vue";
2023-09-24 16:34:31 +08:00
import { type RewardGainer, type RewardGainerResponse, requestRewardGainers, type DeleteRewardTelsalerResponse, deleteRewardTelsaler, type DeleteRewardTelsalerRequest } from "@/utils/reward.js";
2023-09-14 00:42:03 +08:00
import eventBus from "@/utils/api/EventBus.js";
2023-09-25 16:23:26 +08:00
import { ElMessage, ElMessageBox, type ElTable } from "element-plus";
2023-09-13 18:01:07 +08:00
import RewardGainerDialog from "@/views/reward/RewardTelsaler.vue";
2023-09-11 18:27:06 +08:00
interface UI
{
2023-09-12 18:12:27 +08:00
showUI: boolean;
showEditRewardGainerDialog: boolean;
2023-09-13 18:01:07 +08:00
rewardGainerList: RewardGainer[] | null;
2023-09-12 18:12:27 +08:00
tablePageIndex: number;
tablePageSize: number;
2023-09-13 18:01:07 +08:00
selectedRecID: number | null;
selectedTelsalerName: string;
selectedRewardProjectCode: number;
2023-09-11 18:27:06 +08:00
}
2023-09-08 17:57:34 +08:00
2023-03-23 18:39:15 +08:00
export default {
2023-09-24 01:17:54 +08:00
name: "RewardManagement",
2023-09-12 18:12:27 +08:00
components: { RewardGainerDialog, },
2023-03-23 18:39:15 +08:00
setup()
{
2023-09-11 18:27:06 +08:00
const ui: UI = reactive({
2023-09-12 18:12:27 +08:00
showUI: true,
showEditRewardGainerDialog: false,
2023-09-13 18:01:07 +08:00
rewardGainerList: null,
2023-09-12 18:12:27 +08:00
tablePageIndex: 1,
tablePageSize: 10,
2023-09-13 18:01:07 +08:00
selectedRecID: null,
selectedTelsalerName: "",
selectedRewardProjectCode: -999,
2023-09-11 18:27:06 +08:00
});
2023-09-25 16:23:26 +08:00
const rewardTelsalerTable = ref<InstanceType<typeof ElTable>>();
2023-09-08 17:57:34 +08:00
2023-09-12 18:12:27 +08:00
/** 请求数据相关 ***************************/
2023-09-25 16:23:26 +08:00
const requestRewardTelsalerListHandler = ( response: RewardGainerResponse, error: any ): void =>
2023-09-12 18:12:27 +08:00
{
if ( !response.success )
{
console.log( error );
ElMessageBox({
message: "请求获奖人列表失败,请查看日志!",
type: "error",
center: true,
})
.then((): void => {})
.catch((): void => {});
return;
}
ui.rewardGainerList = response.gainerList;
console.log( "请求获奖人员列表", ui.rewardGainerList );
2023-09-25 16:23:26 +08:00
refreshUI();
2023-09-12 18:12:27 +08:00
};
/** 表格相关 ***************************/
2023-09-08 17:57:34 +08:00
const tableHeight = computed((): number =>
{
2023-09-12 18:12:27 +08:00
return ( ui.tablePageSize + 1 ) * 40;
2023-09-08 17:57:34 +08:00
});
2023-09-13 18:01:07 +08:00
/**
* 用于根据分页组件的参数生成表格用的数据
*/
2023-09-12 18:12:27 +08:00
const rewardGainerData = computed((): RewardGainer[] =>
2023-09-11 18:27:06 +08:00
{
2023-09-13 18:01:07 +08:00
// 防御性验证
if ( ui.rewardGainerList === null )
{
return [];
}
2023-09-12 18:12:27 +08:00
const startIndex = ui.tablePageSize * ( ui.tablePageIndex - 1 );
const endIndex = startIndex + ui.tablePageSize;
const data = ui.rewardGainerList.slice( startIndex, endIndex );
console.log( ui.tablePageSize, ui.tablePageIndex );
console.log( "表格数据:", data );
return data;
});
const onCurrentPageIndexChange = ( pageIndex: number ): void =>
{
ui.tablePageIndex = pageIndex;
2023-09-11 18:27:06 +08:00
};
2023-09-12 18:12:27 +08:00
const onTablePageSizeChange = ( pageSize: number ): void =>
{
ui.tablePageSize = pageSize;
};
2023-09-24 16:34:31 +08:00
/** 功能按钮相关 *******************************/
2023-09-24 01:17:54 +08:00
/**
* 添加获奖坐席
*/
const onAddRewardGainer = (): void =>
{
ui.selectedRecID = -1;
ui.selectedRewardProjectCode = 3;
ui.selectedTelsalerName = "";
ui.showEditRewardGainerDialog = true;
};
2023-09-13 18:01:07 +08:00
/**
* 响应用户在表格中的双击
* @param telsalerName
* @param rewardProjectName
*/
const onEditRewardGainer = ( recID: number, telsalerName: string, rewardProjectCode: number ): void =>
2023-09-12 18:12:27 +08:00
{
2023-09-13 18:01:07 +08:00
console.log( "编辑获奖清单", recID, telsalerName, rewardProjectCode );
2023-09-12 18:12:27 +08:00
2023-09-13 18:01:07 +08:00
ui.selectedRecID = recID;
ui.selectedTelsalerName = telsalerName;
ui.selectedRewardProjectCode = rewardProjectCode;
2023-09-12 18:12:27 +08:00
ui.showEditRewardGainerDialog = true;
};
2023-09-24 16:34:31 +08:00
/**
* 响应点击删除按钮
*/
const onDeleteRewardGainer = (): void =>
{
2023-09-25 16:23:26 +08:00
const selectedRecord: RewardGainer[] = rewardTelsalerTable.value?.getSelectionRows();
2023-09-24 16:34:31 +08:00
const deleteRequest: DeleteRewardTelsalerRequest = {
2023-09-25 16:23:26 +08:00
recordID: [],
2023-09-24 16:34:31 +08:00
};
2023-09-25 16:23:26 +08:00
if ( selectedRecord !== undefined )
{
selectedRecord.forEach(( item: RewardGainer ): void =>
{
deleteRequest.recordID.push( item.recID );
});
}
2023-09-24 16:34:31 +08:00
deleteRewardTelsaler( deleteRequest, deleteTelsalerRewardHandler );
};
/** 回调函数 ************************/
const deleteTelsalerRewardHandler = ( response: DeleteRewardTelsalerResponse, error: any ): void =>
{
if ( response.success )
{
ElMessage({
message: response.message,
type: "success",
});
}
else
{
ElMessage({
message: response.message,
type: "error",
});
}
2023-09-25 16:23:26 +08:00
refresh();
2023-09-24 16:34:31 +08:00
};
2023-09-12 18:12:27 +08:00
2023-09-14 00:42:03 +08:00
/** 事件相关 ***************/
2023-09-25 16:23:26 +08:00
/** 订阅新增和保存修改获奖者事件 */
2023-09-14 00:42:03 +08:00
eventBus.on( "onSavedRewardTelsaler", (): void =>
{
2023-09-25 16:23:26 +08:00
// 关闭对话框后,重新请求获奖清单,刷新页面。
2023-09-14 00:42:03 +08:00
ui.showEditRewardGainerDialog = false;
2023-09-24 01:17:54 +08:00
refresh();
2023-09-14 00:42:03 +08:00
});
2023-09-12 18:12:27 +08:00
/**
* 用于刷新页面
*/
const refresh = (): void =>
{
2023-09-25 16:23:26 +08:00
requestRewardGainers( requestRewardTelsalerListHandler );
};
const refreshUI = (): void =>
{
ui.showUI = false;
setTimeout(() =>
{
ui.showUI = true;
}, 0 );
2023-09-12 18:12:27 +08:00
};
onBeforeMount((): void =>
{
refresh();
});
2023-09-08 17:57:34 +08:00
return {
ui,
tableHeight,
2023-09-12 18:12:27 +08:00
rewardGainerData,
2023-09-25 16:23:26 +08:00
rewardTelsalerTable,
2023-09-12 18:12:27 +08:00
onCurrentPageIndexChange,
onTablePageSizeChange,
onEditRewardGainer,
refresh,
2023-09-24 01:17:54 +08:00
onAddRewardGainer,
2023-09-24 16:34:31 +08:00
onDeleteRewardGainer,
2023-09-08 17:57:34 +08:00
};
2023-03-23 18:39:15 +08:00
},
};
</script>
<style lang="scss" scoped>
2023-09-06 18:37:50 +08:00
@import "@/assets/css/public/_public.scss";
2023-03-23 18:39:15 +08:00
2023-09-06 18:37:50 +08:00
.wrapper {
margin: 10px;
2023-09-14 00:42:03 +08:00
// padding: 10px;
2023-09-06 18:37:50 +08:00
// background-color: #fff;
// border-radius: 5px;
// box-shadow: $box-shadow;
// &:hover {
// box-shadow: $box-shadow-hover;
// }
min-width: 800px;
>*+* {
margin-top: 10px;
}
}
.reward-wrapper {
display: flex;
justify-content: center;
align-items: center;
>div {
background-color: #fff;
border-radius: 5px;
box-shadow: $box-shadow;
padding: 10px;
&:hover {
box-shadow: $box-shadow-hover;
}
}
>*+* {
margin-left: 10px;
}
}
.reward-gainer-wrapper {
flex-grow: 1;
}
.dishonor-wrapper {
flex-grow: 1;
}
2023-09-08 17:57:34 +08:00
.toolbutton-wrapper {
text-align: left;
margin-bottom: 10px;
>*+* {
margin-left: 15px;
}
}
2023-09-12 18:12:27 +08:00
.pagination-wrapper {
margin-top: 10px;
display: flex;
justify-content: flex-end;
}
.reward-gainer-td {
cursor: pointer;
display: block;
}
2023-03-23 18:39:15 +08:00
</style>