From 039d3312517124112282103609e54a8ee6267ee3 Mon Sep 17 00:00:00 2001 From: Admin <978517621@qq.com> Date: 星期一, 18 七月 2022 16:40:00 +0800 Subject: [PATCH] 添加人员排班管理各页面 --- src/views/basicRightsManagement/personnelShiftManagement/shiftManagement/index.vue | 577 +++++++++++++++++++ src/views/basicRightsManagement/personnelShiftManagement/holidayManagement/index.vue | 380 +++++++++++++ src/views/basicRightsManagement/personnelShiftManagement/personnelManagement/index.vue | 375 ++++++++++++ src/views/basicRightsManagement/personnelShiftManagement/teamManagement/index.vue | 385 +++++++++++++ 4 files changed, 1,717 insertions(+), 0 deletions(-) diff --git a/src/views/basicRightsManagement/personnelShiftManagement/holidayManagement/index.vue b/src/views/basicRightsManagement/personnelShiftManagement/holidayManagement/index.vue new file mode 100644 index 0000000..a93ad45 --- /dev/null +++ b/src/views/basicRightsManagement/personnelShiftManagement/holidayManagement/index.vue @@ -0,0 +1,380 @@ +<template> + <div class="home-container"> + <el-scrollbar height="100%"> + <el-row class="homeCard"> + <el-col :span="8"> + <div class="grid-content topInfo"> + <el-input v-model="searchWord" placeholder="休息日名称"></el-input> + <el-button type="primary">查询</el-button> + <el-button plain>重置</el-button> + </div> + </el-col> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" :icon="Plus" size="default" @click="dialogAddRecord=true">新建</el-button> +<!-- <el-button type="warning" :icon="Edit" size="default" plain>修改</el-button>--> + <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button> + </el-col> + <el-button type="primary" :icon="Refresh" size="default"/> + </el-row> + <el-table + ref="multipleTableRef" + :data="tableData" + style="width: 100%" + :header-cell-style="{background: '#fafafa'}" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="55" /> + <el-table-column property="name" label="休息日名称"/> + <el-table-column property="type" label="休息类型"/> + <el-table-column fixed="right" label="操作" align="center" width="250"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="editRecord(scope.$index ,scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div class="pageBtn"> + <el-pagination + v-model:currentPage="currentPage" + v-model:page-size="pageSize" + :page-sizes="[10, 15]" + small=false + background + layout="total, sizes, prev, pager, next, jumper" + :total="100" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + </div> + </div> + </el-scrollbar> + <el-dialog v-model="dialogDetails" title="休息日详情"> + <el-form :model="details" label-width="120px"> + <el-form-item label="名称"> + <el-input + v-model="details.name" + readonly + /> + </el-form-item> + <el-form-item label="休假类型"> + <el-input + v-model="details.type" + readonly + /> + </el-form-item> + <el-form-item label="休假时间" v-if="details.content.length>0"> + <el-input + v-model="details.content" + readonly + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="dialogDetails = false" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="dialogAddRecord" title="休息日编辑" @close="closeAdd"> + <el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules"> + <el-form-item label="名称" prop="name"> + <el-input + v-model="addRecord.name" + > + </el-input> + </el-form-item> + <el-form-item label="休假类型" prop="type"> + <el-cascader + v-model="addRecord.type" + :options="holidayList" + :props="casProps" + @change="handleChange" + /> + </el-form-item> + <el-form-item label="选择休假时间" prop="content" v-if="addRecord.type && JSON.parse(JSON.stringify(addRecord.type))[1] == '每周'"> + <el-checkbox-group v-model="addRecord.content"> + <el-checkbox v-for="(item,i) in weekDays" :label="item" :key="i"/> + </el-checkbox-group> + </el-form-item> + <el-form-item label="选择休假时间" prop="content" v-if="addRecord.type && JSON.parse(JSON.stringify(addRecord.type))[1] == '每月'"> + <el-checkbox-group v-model="addRecord.content"> + <el-checkbox v-for="index in 31" :label="index" :key="index"/> + </el-checkbox-group> + </el-form-item> + <el-form-item> + <el-button type="warning" @click="dialogAddRecord = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="confirmAddRecord(addRef)" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="deleteDialog" title="提示" width="30%" center @close="indexClear"> + <span>您确定要删除该条记录吗?</span> + <template #footer> + <span class="dialog-footer"> + <el-button @click="deleteDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="conFirmDelete" size="default">确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> + import { toRefs, reactive, ref } from 'vue'; + import { storeToRefs } from 'pinia'; + import { initBackEndControlRoutes } from '/@/router/backEnd'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Session } from '/@/utils/storage'; + import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue' + import { ElTable } from 'element-plus' + import { FormInstance, FormRules } from 'element-plus' + let global: any = { + homeChartOne: null, + homeChartTwo: null, + homeCharThree: null, + dispose: [null, '', undefined], + }; + + interface stateType { + homeOne: Array <type> + } + interface type { + + } + // export default defineComponent({ + // name: 'workCheckinRecord', + // setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({}); + const currentPage = ref(1) + const pageSize = ref(10) + const chosenIndex = ref(-1) + const handleSizeChange = (val: number) => { + console.log(`${val} items per page`) + } + const handleCurrentChange = (val: number) => { + console.log(`current page: ${val}`) + } + const casProps = { + expandTrigger: 'hover', + } + const tableData = reactive( + [ + { + name: '周末休息', + type: '每周公休假日', + content: '' + }, + { + name: '节假日休息', + type: '每年法定节假日', + content: '' + }, + { + name: '每周一、周四休息', + type: '自定义休息日,每周', + content: ['周一','周四'] + }, + { + name: '每月休息日休息', + type: '自定义休息日,每月', + content: ['5','15','25'] + } + ] + ) + const holidayList =reactive([ + { + value: '每周公休假日', + label: '每周公休假日' + }, + { + value: '每年法定节假日', + label: '每年法定节假日' + }, + { + value: '自定义休息日', + label: '自定义休息日', + children: [ + { + value: '每周', + label: '每周', + }, + { + value: '每月', + label: '每月', + } + ] + } + ]) + const handleChange = (value) => { + addRecord.value.content = [] + console.log(JSON.parse(JSON.stringify(value))) + } + const weekDays = reactive(['周一','周二','周三','周四','周五','周六','周日']) + const addRef = ref<FormInstance>() + const addRules = reactive<FormRules>({ + name:[{required: true, message: '该内容不能为空',trigger:'blur'}], + type:[{required: true, message: '该内容不能为空',trigger:'blur'}], + content:[{required: true, message: '该内容不能为空'}] + }) + const dialogDetails = ref(false) + const dialogAddRecord = ref(false) + const deleteDialog = ref(false) + const addRecord = ref({}) + const details = ref({}) + const viewRecord = (row) =>{ + details.value = JSON.parse(JSON.stringify(row)) + dialogDetails.value = true + } + const deleteRecord = (index) =>{ + chosenIndex.value = index + deleteDialog.value = true + } + const conFirmDelete = ()=> { + tableData.splice(chosenIndex.value,1) + deleteDialog.value = false + } + const confirmAddRecord = async (formEl: FormInstance | undefined) =>{ + if (!formEl) return + await formEl.validate((valid, fields) => { + if (valid) { + if(chosenIndex.value == -1){ + tableData.push(addRecord.value) + }else{ + tableData[chosenIndex.value] = addRecord.value + } + dialogAddRecord.value =false + } else { + console.log('error submit!', fields) + } + }) + + } + const closeAdd =()=>{ + addRecord.value={} + chosenIndex.value = -1 + } + const indexClear = ()=>{ + chosenIndex.value = -1 + } + const editRecord =(index, row)=>{ + dialogAddRecord.value = true + chosenIndex.value = index + addRecord.value = JSON.parse(JSON.stringify(row)) + } + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + // return { + // renderMenu, + // multipleTableRef, + // tableData, + // currentPage, + // pageSize, + // dialogDetails, + // details, + // deleteDialog, + // dialogAddRecord, + // viewRecord, + // deleteRecord, + // handleSizeChange, + // handleCurrentChange, + // Plus, + // Edit, + // Delete, + // Search, + // Download, + // handleSelectionChange, + // Refresh, + // ...toRefs(state), + // }; + // }, + // }); +</script> + +<style scoped lang="scss"> + $homeNavLengh: 8; + .home-container { + height: 100%; + overflow: hidden; + padding: 20px; + .homeCard{ + width: 100%; + padding: 20px; + background: #fff; + border-radius: 4px; + } + .el-row{ + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content{ + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + &>div{ + white-space: nowrap; + margin-right: 20px; + } + } + } + .mainPages{ + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } + .main-card{ + width: 100%; + .cardTop{ + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn{ + margin: 0; + } + } + } + .pageBtn{ + display: flex; + align-items: center; + justify-content: right; + margin-top: 20px; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + .el-input{ + width: 100% !important; + } + .el-date-editor::v-deep{ + width: 100%; + } + .el-select{ + width: 100%; + } +</style> diff --git a/src/views/basicRightsManagement/personnelShiftManagement/personnelManagement/index.vue b/src/views/basicRightsManagement/personnelShiftManagement/personnelManagement/index.vue new file mode 100644 index 0000000..a763fc0 --- /dev/null +++ b/src/views/basicRightsManagement/personnelShiftManagement/personnelManagement/index.vue @@ -0,0 +1,375 @@ +<template> + <div class="home-container"> + <el-scrollbar height="100%"> + <el-row class="homeCard"> + <el-col :span="8"> + <div class="grid-content topInfo"> + <el-input v-model="searchWord" placeholder="排班名称"></el-input> + <el-button type="primary">查询</el-button> + <el-button plain>重置</el-button> + </div> + </el-col> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" :icon="Plus" size="default" @click="dialogAddRecord=true">新建</el-button> +<!-- <el-button type="warning" :icon="Edit" size="default" plain>修改</el-button>--> + <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button> + </el-col> + <el-button type="primary" :icon="Refresh" size="default"/> + </el-row> + <el-table + ref="multipleTableRef" + :data="tableData" + style="width: 100%" + :header-cell-style="{background: '#fafafa'}" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="55" /> + <el-table-column property="schedName" label="排班名称"/> + <el-table-column property="schedPlan" label="排班方案"/> + <el-table-column property="restType" label="休息类型"/> + <el-table-column property="team" label="班组"/> + <el-table-column property="startTime" label="排班开始时间"/> + <el-table-column property="endTime" label="排班结束时间"/> + <el-table-column fixed="right" label="操作" align="center" width="250"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="editRecord(scope.$index ,scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div class="pageBtn"> + <el-pagination + v-model:currentPage="currentPage" + v-model:page-size="pageSize" + :page-sizes="[10, 15]" + small=false + background + layout="total, sizes, prev, pager, next, jumper" + :total="100" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + </div> + </div> + </el-scrollbar> + <el-dialog v-model="dialogDetails" title="人员排班"> + <el-form :model="details" label-width="120px"> + <el-form-item label="排班名称"> + <el-input + v-model="details.schedName" + readonly + /> + </el-form-item> + <el-form-item label="排班方案"> + <el-input v-model="details.schedPlan" readonly/> + </el-form-item> + <el-form-item label="休息类型"> + <el-input v-model="details.restType" type="textarea" readonly/> + </el-form-item> + <el-form-item label="班组选择"> + <el-input v-model="details.team" readonly/> + </el-form-item> + <el-form-item label="排班开始时间"> + <el-input v-model="details.startTime" readonly/> + </el-form-item> + <el-form-item label="排班结束时间"> + <el-input v-model="details.endTime" readonly/> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="dialogDetails = false" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="dialogAddRecord" title="人员排班编辑" @close="closeAdd"> + <el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules"> + <el-form-item label="排班名称" prop="schedName"> + <el-input + v-model="addRecord.schedName" + > + </el-input> + </el-form-item> + <el-form-item label="排班方案" prop="schedPlan"> + <el-select v-model="addRecord.schedPlan"> + <el-option label="三班三倒" value="三班三倒" /> + <el-option label="常白班" value="常白班" /> + </el-select> + </el-form-item> + <el-form-item label="休息类型" prop="restType"> + <el-select v-model="addRecord.restType" multiple> + <el-option label="每周公休假日" value="每周公休假日" /> + <el-option label="自定义/每月" value="自定义/每月" /> + </el-select> + </el-form-item> + <el-form-item label="班组选择" prop="team"> + <el-select v-model="addRecord.team"> + <el-option label="A车间班组" value="A车间班组" /> + <el-option label="B车间班组" value="B车间班组" /> + </el-select> + </el-form-item> + <el-form-item label="排班时间段" prop="timeRange"> + <el-date-picker + v-model="addRecord.timeRange" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD" + type="daterange" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间" + size="large" + /> + </el-form-item> + <el-form-item> + <el-button type="warning" @click="dialogAddRecord = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="confirmAddRecord(addRef)" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="deleteDialog" title="提示" width="30%" center @close="indexClear"> + <span>您确定要删除该条记录吗?</span> + <template #footer> + <span class="dialog-footer"> + <el-button @click="deleteDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="conFirmDelete" size="default">确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> + import { toRefs, reactive, ref } from 'vue'; + import { storeToRefs } from 'pinia'; + import { initBackEndControlRoutes } from '/@/router/backEnd'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Session } from '/@/utils/storage'; + import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue' + import { ElTable } from 'element-plus' + import { FormInstance, FormRules } from 'element-plus' + let global: any = { + homeChartOne: null, + homeChartTwo: null, + homeCharThree: null, + dispose: [null, '', undefined], + }; + + interface stateType { + homeOne: Array <type> + } + interface type { + + } + // export default defineComponent({ + // name: 'workCheckinRecord', + // setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({}); + const currentPage = ref(1) + const pageSize = ref(10) + const chosenIndex = ref(-1) + const casProps = { + expandTrigger: 'hover', + multiple: true, + emitPath: false, + checkStrictly: false + } + const handleSizeChange = (val: number) => { + console.log(`${val} items per page`) + } + const handleCurrentChange = (val: number) => { + console.log(`current page: ${val}`) + } + const tableData = reactive( + [ + { + schedName: 'A车间三班三倒', + schedPlan: '三班三倒', + restType: ['每周公休假日'], + team: 'A车间班组', + startTime: '2022-07-14', + endTime: '2022-07-16' + }, + { + schedName: 'B车间常白班', + schedPlan: '常白班', + restType: ['自定义休息日/每周'], + team: 'B车间班组', + startTime: '2022-07-16', + endTime: '2022-07-20' + }, + ] + ) + const addRef = ref<FormInstance>() + const addRules = reactive<FormRules>({ + schedName:[{required: true, message: '该内容不能为空',trigger:'blur'}], + schedPlan:[{required: true, message: '该内容不能为空',trigger:'blur'}], + restType:[{required: true, message: '该内容不能为空',trigger:'blur'}], + team:[{required: true, message: '该内容不能为空',trigger:'blur'}], + timeRange:[{required: true, message: '该内容不能为空',trigger:'blur'}] + }) + const dialogDetails = ref(false) + const dialogAddRecord = ref(false) + const deleteDialog = ref(false) + const addRecord = ref({}) + const details = ref({}) + const viewRecord = (row) =>{ + details.value = JSON.parse(JSON.stringify(row)) + dialogDetails.value = true + } + const deleteRecord = (index) =>{ + chosenIndex.value = index + deleteDialog.value = true + } + const conFirmDelete = ()=> { + tableData.splice(chosenIndex.value,1) + deleteDialog.value = false + } + const confirmAddRecord = async (formEl: FormInstance | undefined) =>{ + if (!formEl) return + await formEl.validate((valid, fields) => { + if (valid) { + if(chosenIndex.value == -1){ + addRecord.value.startTime = JSON.parse(JSON.stringify(addRecord.value.timeRange))[0] + addRecord.value.endTime = JSON.parse(JSON.stringify(addRecord.value.timeRange))[1] + tableData.push(addRecord.value) + }else{ + addRecord.value.startTime = JSON.parse(JSON.stringify(addRecord.value.timeRange))[0] + addRecord.value.endTimeTime = JSON.parse(JSON.stringify(addRecord.value.timeRange))[1] + tableData[chosenIndex.value] = addRecord.value + } + dialogAddRecord.value =false + } else { + console.log('error submit!', fields) + } + }) + + } + const closeAdd =()=>{ + addRecord.value={} + chosenIndex.value = -1 + } + const indexClear = ()=>{ + chosenIndex.value = -1 + } + const editRecord =(index, row)=>{ + dialogAddRecord.value = true + chosenIndex.value = index + addRecord.value = JSON.parse(JSON.stringify(row)) + } + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + // return { + // renderMenu, + // multipleTableRef, + // tableData, + // currentPage, + // pageSize, + // dialogDetails, + // details, + // deleteDialog, + // dialogAddRecord, + // viewRecord, + // deleteRecord, + // handleSizeChange, + // handleCurrentChange, + // Plus, + // Edit, + // Delete, + // Search, + // Download, + // handleSelectionChange, + // Refresh, + // ...toRefs(state), + // }; + // }, + // }); +</script> + +<style scoped lang="scss"> + $homeNavLengh: 8; + .home-container { + height: 100%; + overflow: hidden; + padding: 20px; + .homeCard{ + width: 100%; + padding: 20px; + background: #fff; + border-radius: 4px; + } + .el-row{ + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content{ + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + &>div{ + white-space: nowrap; + margin-right: 20px; + } + } + } + .mainPages{ + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } + .main-card{ + width: 100%; + .cardTop{ + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn{ + margin: 0; + } + } + } + .pageBtn{ + display: flex; + align-items: center; + justify-content: right; + margin-top: 20px; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + .el-input{ + width: 100% !important; + } + .el-date-editor::v-deep{ + width: 100%; + } + .el-select{ + width: 100%; + } +</style> diff --git a/src/views/basicRightsManagement/personnelShiftManagement/shiftManagement/index.vue b/src/views/basicRightsManagement/personnelShiftManagement/shiftManagement/index.vue new file mode 100644 index 0000000..2375810 --- /dev/null +++ b/src/views/basicRightsManagement/personnelShiftManagement/shiftManagement/index.vue @@ -0,0 +1,577 @@ +<template> + <div class="home-container"> + <el-scrollbar height="100%"> + <el-row class="homeCard"> + <el-col :span="8"> + <div class="grid-content topInfo"> + <el-input v-model="searchWord" placeholder="排班方案名称"></el-input> + <el-button type="primary">查询</el-button> + <el-button plain>重置</el-button> + </div> + </el-col> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" :icon="Plus" size="default" @click="dialogAddRecord=true">新建</el-button> +<!-- <el-button type="warning" :icon="Edit" size="default" plain>修改</el-button>--> + <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button> + </el-col> + <el-button type="primary" :icon="Refresh" size="default"/> + </el-row> + <el-table + ref="multipleTableRef" + :data="tableData" + style="width: 100%" + :header-cell-style="{background: '#fafafa'}" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="55" /> + <el-table-column property="name" label="排班方案名称"/> + <el-table-column property="type" label="排班类型"/> + <el-table-column fixed="right" label="操作" align="center" width="250"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="editRecord(scope.$index ,scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div class="pageBtn"> + <el-pagination + v-model:currentPage="currentPage" + v-model:page-size="pageSize" + :page-sizes="[10, 15]" + small=false + background + layout="total, sizes, prev, pager, next, jumper" + :total="100" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + </div> + </div> + </el-scrollbar> + <el-dialog v-model="dialogDetails" title="排班方案"> + <el-form :model="details" label-width="120px"> + <el-form-item label="名称"> + <el-input + v-model="details.name" + readonly + /> + </el-form-item> + <el-form-item label="排班类型"> + <el-input + v-model="details.type" + readonly + /> + </el-form-item> + <el-form-item label="自定义循环班" v-if="JSON.parse(JSON.stringify(details.type)) == '循环班'"> + <div> + <div v-for="(item,index) in details.shiftSteps" class="stepItem"> + <div class="stepNum">{{index+1}}</div> + <div class="stepCard"> + <el-card class="box-card" shadow="hover"> + <template #header> + <div class="card-header"> + <div>第<span>{{index+1}}</span>班</div> + </div> + </template> + <div class="text item">排班名称:<span>{{item.name}}</span></div> + <div class="text item">工作天数:<span>{{item.days}}</span></div> + <div class="text item">休息天数:<span>{{item.rest}}</span></div> + <div class="text item">工作时段:<span>{{item.timeRange}}</span></div> + </el-card> + </div> + </div> + </div> + </el-form-item> + <el-form-item label="工作时段" prop="timeRange" v-if="JSON.parse(JSON.stringify(details.type)) == '固定班'"> + <el-input + v-model="details.timeRange" + readonly + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="dialogDetails = false" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="dialogAddRecord" title="排班方案编辑" @close="closeAdd"> + <el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules"> + <el-form-item label="排班方案名称" prop="name"> + <el-input + v-model="addRecord.name" + > + </el-input> + </el-form-item> + <el-form-item label="排班类型" prop="type"> + <el-select v-model="addRecord.type"> + <el-option label="循环班" value="循环班" /> + <el-option label="固定班" value="固定班" /> + </el-select> + </el-form-item> + <el-form-item label="自定义循环班" v-if="addRecord.type && JSON.parse(JSON.stringify(addRecord.type)) == '循环班'"> + <div v-if="!addRecord.shiftSteps || addRecord.shiftSteps.length == 0"> + <el-button type="primary" size="default" @click="dialogAddShift = true">新增排班</el-button> + </div> + <div> + <div v-for="(item,index) in addRecord.shiftSteps" class="stepItem"> + <div class="stepNum">{{index+1}}</div> + <div class="stepCard"> + <el-card class="box-card" shadow="hover"> + <template #header> + <div class="card-header"> + <div>第<span>{{index+1}}</span>班</div> + <div> + <el-button type="primary" size="default" @click="addFlow(index)">新增</el-button> + <el-button type="danger" size="default" @click="deleteFlow(index)">删除</el-button> + </div> + </div> + </template> + <div class="text item">排班名称:<span>{{item.name}}</span></div> + <div class="text item">工作天数:<span>{{item.days}}</span></div> + <div class="text item">休息天数:<span>{{item.rest}}</span></div> + <div class="text item">工作时段:<span>{{item.timeRange}}</span></div> + </el-card> + </div> + </div> + </div> + </el-form-item> + <el-form-item label="工作时段" prop="timeRange" v-if="addRecord.type && JSON.parse(JSON.stringify(addRecord.type)) == '固定班'"> + <el-select v-model="addRecord.timeRange"> + <el-option label="四班三倒早班" value="四班三倒早班" /> + <el-option label="四班三倒中班" value="四班三倒中班" /> + <el-option label="四班三倒夜班" value="四班三倒夜班" /> + <el-option label="常白班" value="常白班" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="warning" @click="dialogAddRecord = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="confirmAddRecord(addRef)" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="deleteDialog" title="提示" width="30%" center @close="indexClear"> + <span>您确定要删除该条记录吗?</span> + <template #footer> + <span class="dialog-footer"> + <el-button @click="deleteDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="conFirmDelete" size="default">确认</el-button> + </span> + </template> + </el-dialog> + <el-dialog v-model="deleteShiftDialog" title="提示" width="30%" center @close="indexShiftClear"> + <span>您确定要删除该班次吗?</span> + <template #footer> + <span class="dialog-footer"> + <el-button @click="deleteShiftDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="conFirmShiftDelete" size="default">确认</el-button> + </span> + </template> + </el-dialog> + <el-dialog v-model="dialogAddShift" title="新增排班" @close="closeAddShift"> + <el-form :model="addShift" label-width="120px" ref="addShiftRef" :rules="addShiftRules"> + <el-form-item label="排班方案名称" prop="name"> + <el-input + v-model="addShift.name" + > + </el-input> + </el-form-item> + <el-form-item label="工作天数" prop="days"> + <el-input + v-model="addShift.days" + > + </el-input> + </el-form-item> + <el-form-item label="休息天数" prop="rest"> + <el-input + v-model="addShift.rest" + > + </el-input> + </el-form-item> + <el-form-item label="工作时段" prop="timeRange"> + <el-select v-model="addShift.timeRange"> + <el-option label="三班三倒早班" value="三班三倒早班" /> + <el-option label="三班三倒中班" value="三班三倒中班" /> + <el-option label="三班三倒夜班" value="三班三倒夜班" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="warning" @click="dialogAddShift = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="confirmAddShift(addShiftRef)" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> + import { toRefs, reactive, ref } from 'vue'; + import { storeToRefs } from 'pinia'; + import { initBackEndControlRoutes } from '/@/router/backEnd'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Session } from '/@/utils/storage'; + import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue' + import { ElTable, ElMessage } from 'element-plus' + import { FormInstance, FormRules } from 'element-plus' + let global: any = { + homeChartOne: null, + homeChartTwo: null, + homeCharThree: null, + dispose: [null, '', undefined], + }; + + interface stateType { + homeOne: Array <type> + } + interface type { + + } + // export default defineComponent({ + // name: 'workCheckinRecord', + // setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({}); + const currentPage = ref(1) + const pageSize = ref(10) + const chosenIndex = ref(-1) + const chosenShiftIndex = ref(-1) + const handleSizeChange = (val: number) => { + console.log(`${val} items per page`) + } + const handleCurrentChange = (val: number) => { + console.log(`current page: ${val}`) + } + const casProps = { + expandTrigger: 'hover', + } + const tableData = reactive( + [ + { + name: '三班三倒', + type: '循环班', + shiftSteps:[ + { + name: '第一班', + days: '5', + rest: '1', + timeRange: '三班三倒早班' + }, + { + name: '第二班', + days: '5', + rest: '2', + timeRange: '三班三倒中班' + }, + { + name: '第三班', + days: '5', + rest: '3', + timeRange: '三班三倒三班' + } + ] + }, + { + name: '常白班', + type: '固定板' + } + ] + ) + const handleChange = (value) => { + addRecord.value.content = [] + console.log(JSON.parse(JSON.stringify(value))) + } + const addRef = ref<FormInstance>() + const addShiftRef = ref<FormInstance>() + const addRules = reactive<FormRules>({ + name:[{required: true, message: '该内容不能为空',trigger:'blur'}], + type:[{required: true, message: '该内容不能为空',trigger:'blur'}], + timeRange:[{required: true, message: '该内容不能为空',trigger:'blur'}] + }) + const addShiftRules = reactive<FormRules>({ + name:[{required: true, message: '该内容不能为空',trigger:'blur'}], + days:[{required: true, message: '该内容不能为空',trigger:'blur'}], + rest:[{required: true, message: '该内容不能为空',trigger:'blur'}], + timeRange:[{required: true, message: '该内容不能为空',trigger:'blur'}] + }) + const dialogDetails = ref(false) + const dialogAddRecord = ref(false) + const deleteDialog = ref(false) + const deleteShiftDialog = ref(false) + const dialogAddShift = ref(false) + const addRecord = ref({}) + const addShift = ref({}) + const details = ref({}) + const viewRecord = (row) =>{ + details.value = JSON.parse(JSON.stringify(row)) + dialogDetails.value = true + } + const deleteRecord = (index) =>{ + chosenIndex.value = index + deleteDialog.value = true + } + const conFirmDelete = ()=> { + tableData.splice(chosenIndex.value,1) + deleteDialog.value = false + } + const confirmAddRecord = async (formEl: FormInstance | undefined) =>{ + if (!formEl) return + await formEl.validate((valid, fields) => { + if (valid) { + if(chosenIndex.value == -1){ + if(addRecord.value.type == '循环班' && (!addRecord.value.shiftSteps || addRecord.value.shiftSteps.length == 0)){ + ElMessage({ + message: '请先设置自定义排班后再提交', + type: 'warning', + }) + return + }else{ + tableData.push(addRecord.value) + } + }else{ + if(addRecord.value.type == '循环班' && addRecord.value.shiftSteps.length == 0){ + ElMessage({ + message: '请先设置自定义排班后再提交', + type: 'warning', + }) + return + }else{ + if(addRecord.value.type == '固定班'){delete addRecord.value.shiftSteps} + console.log(addRecord.value,'addRecord') + tableData[chosenIndex.value] = addRecord.value + } + } + dialogAddRecord.value =false + } else { + console.log('error submit!', fields) + } + }) + + } + const closeAdd =()=>{ + addRecord.value={} + chosenIndex.value = -1 + addShift.value={} + chosenShiftIndex.value = -1 + } + const indexClear = ()=>{ + chosenIndex.value = -1 + } + const indexShiftClear = ()=>{ + chosenShiftIndex.value = -1 + } + const editRecord =(index, row)=>{ + dialogAddRecord.value = true + chosenIndex.value = index + addRecord.value = JSON.parse(JSON.stringify(row)) + } + + // 添加删除排班步骤 + const addFlow = (index) => { + dialogAddShift.value = true + chosenShiftIndex.value = index + } + const deleteFlow = (index) => { + deleteShiftDialog.value = true + chosenShiftIndex.value = index + } + const conFirmShiftDelete = () => { + addRecord.value.shiftSteps.splice( chosenShiftIndex.value,1) + deleteShiftDialog.value = false + } + const confirmAddShift = async (formEl: FormInstance | undefined) => { + if (!formEl) return + await formEl.validate((valid, fields) => { + if (valid) { + if(addRecord.value.shiftSteps){ + addRecord.value.shiftSteps.splice(chosenShiftIndex.value+1,0,addShift.value) + }else{ + addRecord.value.shiftSteps = [] + addRecord.value.shiftSteps.push(addShift.value) + } + dialogAddShift.value = false + } else { + console.log('error submit!', fields) + } + }) + + } + const closeAddShift =()=>{ + addShift.value={} + chosenShiftIndex.value = -1 + } + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + // return { + // renderMenu, + // multipleTableRef, + // tableData, + // currentPage, + // pageSize, + // dialogDetails, + // details, + // deleteDialog, + // dialogAddRecord, + // viewRecord, + // deleteRecord, + // handleSizeChange, + // handleCurrentChange, + // Plus, + // Edit, + // Delete, + // Search, + // Download, + // handleSelectionChange, + // Refresh, + // ...toRefs(state), + // }; + // }, + // }); +</script> + +<style scoped lang="scss"> + $homeNavLengh: 8; + .home-container { + height: 100%; + overflow: hidden; + padding: 20px; + .homeCard{ + width: 100%; + padding: 20px; + background: #fff; + border-radius: 4px; + } + .el-row{ + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content{ + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + &>div{ + white-space: nowrap; + margin-right: 20px; + } + } + } + .mainPages{ + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } + .main-card{ + width: 100%; + .cardTop{ + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn{ + margin: 0; + } + } + } + .pageBtn{ + display: flex; + align-items: center; + justify-content: right; + margin-top: 20px; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + .stepItem{ + width: 100%; + display: flex; + align-items: flex-start; + margin-bottom: 30px; + margin-left: 30px; + padding-bottom: 30px; + border-left: 2px solid #ccc; + &:first-of-type{ + margin-top: 30px; + } + &:last-of-type{ + margin-bottom: 0; + border-left: none; + } + .stepNum { + width: 30px; + height: 30px; + border-radius: 15px; + box-sizing: border-box; + color: #333; + border: 1px solid #999; + line-height: 28px; + text-align: center; + margin-right: 20px; + margin-left: -16px; + margin-top: -30px; + } + .stepCard { + width: 100%; + margin-top: -30px; + + .box-card { + width: 100%; + &:deep(.el-card__header){ + padding: 10px 15px + } + .card-header { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + &>div:first-of-type{ + margin-right: 80px; + } + span{ + font-weight: bold; + margin-left: 10px; + } + } + } + } + &:hover .card-header{ + color: #0098F5; + } + &:hover .stepNum{ + border: 2px solid #0098F5; + color: #0098F5; + } + } + .el-input{ + width: 100% !important; + } + :deep(.el-date-editor){ + width: 100%; + } + .el-select{ + width: 100%; + } +</style> diff --git a/src/views/basicRightsManagement/personnelShiftManagement/teamManagement/index.vue b/src/views/basicRightsManagement/personnelShiftManagement/teamManagement/index.vue new file mode 100644 index 0000000..96a6435 --- /dev/null +++ b/src/views/basicRightsManagement/personnelShiftManagement/teamManagement/index.vue @@ -0,0 +1,385 @@ +<template> + <div class="home-container"> + <el-scrollbar height="100%"> + <el-row class="homeCard"> + <el-col :span="8"> + <div class="grid-content topInfo"> + <el-input v-model="searchWord" placeholder="班组名称"></el-input> + <el-button type="primary">查询</el-button> + <el-button plain>重置</el-button> + </div> + </el-col> + </el-row> + <div class="homeCard"> + <div class="main-card"> + <el-row class="cardTop"> + <el-col :span="12" class="mainCardBtn"> + <el-button type="primary" :icon="Plus" size="default" @click="dialogAddRecord=true">新建</el-button> +<!-- <el-button type="warning" :icon="Edit" size="default" plain>修改</el-button>--> + <el-button type="danger" :icon="Delete" size="default" plain>删除</el-button> + </el-col> + <el-button type="primary" :icon="Refresh" size="default"/> + </el-row> + <el-table + ref="multipleTableRef" + :data="tableData" + style="width: 100%" + :header-cell-style="{background: '#fafafa'}" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="55" /> + <el-table-column property="teamName" label="班组名称"/> + <el-table-column property="teamMember" label="班组人员"/> + <el-table-column fixed="right" label="操作" align="center" width="250"> + <template #default="scope"> + <el-button link type="primary" size="small" :icon="View" @click="viewRecord(scope.row)">查看</el-button> + <el-button link type="primary" size="small" :icon="Edit" @click="editRecord(scope.$index ,scope.row)">修改</el-button> + <el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div class="pageBtn"> + <el-pagination + v-model:currentPage="currentPage" + v-model:page-size="pageSize" + :page-sizes="[10, 15]" + small=false + background + layout="total, sizes, prev, pager, next, jumper" + :total="100" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + </div> + </div> + </el-scrollbar> + <el-dialog v-model="dialogDetails" title="班组信息"> + <el-form :model="details" label-width="120px"> + <el-form-item label="班组名称"> + <el-input + v-model="details.teamName" + readonly + /> + </el-form-item> + <el-form-item label="班组人员"> + <el-input v-model="details.teamMember" type="textarea" readonly/> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="dialogDetails = false" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="dialogAddRecord" title="班组信息编辑" @close="closeAdd"> + <el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules"> + <el-form-item label="班组名称" prop="teamName"> + <el-input + v-model="addRecord.teamName" + > + </el-input> + </el-form-item> + <el-form-item label="班组人员" prop="teamMember"> + <el-cascader + v-model="addRecord.teamMember" + :options="workerList" + :props="casProps" + :show-all-levels="false" + @change="handleChange" + /> + </el-form-item> + <el-form-item> + <el-button type="warning" @click="dialogAddRecord = false" size="default" plain>取消</el-button> + <el-button type="primary" @click="confirmAddRecord(addRef)" size="default">确认</el-button> + </el-form-item> + </el-form> + </el-dialog> + <el-dialog v-model="deleteDialog" title="提示" width="30%" center @close="indexClear"> + <span>您确定要删除该条记录吗?</span> + <template #footer> + <span class="dialog-footer"> + <el-button @click="deleteDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="conFirmDelete" size="default">确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> + +<script lang="ts" setup> + import { toRefs, reactive, ref } from 'vue'; + import { storeToRefs } from 'pinia'; + import { initBackEndControlRoutes } from '/@/router/backEnd'; + import {useUserInfo} from "/@/stores/userInfo"; + import { Session } from '/@/utils/storage'; + import { Edit, View, Plus, Delete, Refresh, Search, Download } from '@element-plus/icons-vue' + import { ElTable } from 'element-plus' + import { FormInstance, FormRules } from 'element-plus' + let global: any = { + homeChartOne: null, + homeChartTwo: null, + homeCharThree: null, + dispose: [null, '', undefined], + }; + + interface stateType { + homeOne: Array <type> + } + interface type { + + } + // export default defineComponent({ + // name: 'workCheckinRecord', + // setup() { + const userInfo = useUserInfo() + const { userInfos } = storeToRefs(userInfo); + const state = reactive<stateType>({}); + const currentPage = ref(1) + const pageSize = ref(10) + const chosenIndex = ref(-1) + const casProps = { + expandTrigger: 'hover', + multiple: true, + emitPath: false, + checkStrictly: false + } + const handleSizeChange = (val: number) => { + console.log(`${val} items per page`) + } + const handleCurrentChange = (val: number) => { + console.log(`current page: ${val}`) + } + const workerList =reactive([ + { + value: 'A部门车间', + label: 'A部门车间', + children: [ + { + value: '刘能', + label: '刘能', + }, + { + value: '赵四', + label: '赵四', + }, + { + value: '谢广坤', + label: '谢广坤', + }, + { + value: '王大拿', + label: '王大拿', + }, + { + value: '刘能', + label: '刘能', + }, + { + value: '赵四', + label: '赵四', + } + ] + }, + { + value: 'B部门车间', + label: 'B部门车间', + children: [ + { + value: '刘备', + label: '刘备', + }, + { + value: '关羽', + label: '关羽', + }, + { + value: '张飞', + label: '张飞', + }, + { + value: '赵云', + label: '赵云', + }, + { + value: '黄忠', + label: '黄忠', + }, + { + value: '马超', + label: '马超', + } + ] + } + ]) + const tableData = reactive( + [ + { + teamName: 'A车间班组', + teamMember: ['张三','李四','李羽飞'] + }, + { + teamName: 'B车间班组', + teamMember: ['刘能','赵四','谢广坤'] + }, + ] + ) + const addRef = ref<FormInstance>() + const addRules = reactive<FormRules>({ + teamName:[{required: true, message: '该内容不能为空',trigger:'blur'}], + teamMember:[{required: true, message: '该内容不能为空',trigger:'blur'}] + }) + const dialogDetails = ref(false) + const dialogAddRecord = ref(false) + const deleteDialog = ref(false) + const addRecord = ref({}) + const details = ref({}) + const viewRecord = (row) =>{ + details.value = JSON.parse(JSON.stringify(row)) + dialogDetails.value = true + } + const deleteRecord = (index) =>{ + chosenIndex.value = index + deleteDialog.value = true + } + const conFirmDelete = ()=> { + tableData.splice(chosenIndex.value,1) + deleteDialog.value = false + } + const confirmAddRecord = async (formEl: FormInstance | undefined) =>{ + if (!formEl) return + await formEl.validate((valid, fields) => { + if (valid) { + if(chosenIndex.value == -1){ + tableData.push(addRecord.value) + }else{ + tableData[chosenIndex.value] = addRecord.value + } + dialogAddRecord.value =false + } else { + console.log('error submit!', fields) + } + }) + + } + const closeAdd =()=>{ + addRecord.value={} + chosenIndex.value = -1 + } + const indexClear = ()=>{ + chosenIndex.value = -1 + } + const editRecord =(index, row)=>{ + dialogAddRecord.value = true + chosenIndex.value = index + addRecord.value = JSON.parse(JSON.stringify(row)) + } + // 折线图 + const renderMenu = async (value: string) => { + Session.set('projectId',value) + userInfos.value.projectId = value + await initBackEndControlRoutes(); + }; + // return { + // renderMenu, + // multipleTableRef, + // tableData, + // currentPage, + // pageSize, + // dialogDetails, + // details, + // deleteDialog, + // dialogAddRecord, + // viewRecord, + // deleteRecord, + // handleSizeChange, + // handleCurrentChange, + // Plus, + // Edit, + // Delete, + // Search, + // Download, + // handleSelectionChange, + // Refresh, + // ...toRefs(state), + // }; + // }, + // }); +</script> + +<style scoped lang="scss"> + $homeNavLengh: 8; + .home-container { + height: 100%; + overflow: hidden; + padding: 20px; + .homeCard{ + width: 100%; + padding: 20px; + background: #fff; + border-radius: 4px; + } + .el-row{ + display: flex; + align-items: center; + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } + .grid-content{ + align-items: center; + min-height: 36px; + } + + .topInfo { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + + &>div{ + white-space: nowrap; + margin-right: 20px; + } + } + } + .mainPages{ + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } + .main-card{ + width: 100%; + .cardTop{ + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + .mainCardBtn{ + margin: 0; + } + } + } + .pageBtn{ + display: flex; + align-items: center; + justify-content: right; + margin-top: 20px; + + .demo-pagination-block + .demo-pagination-block { + margin-top: 10px; + } + .demo-pagination-block .demonstration { + margin-bottom: 16px; + } + } + } + .el-input{ + width: 100% !important; + } + .el-date-editor::v-deep{ + width: 100%; + } + .el-select{ + width: 100%; + } +</style> -- Gitblit v1.9.2