From ac7d9e20978e710a54164b2e74ea464027754b7e Mon Sep 17 00:00:00 2001
From: Your Name <123456>
Date: 星期二, 02 八月 2022 09:09:57 +0800
Subject: [PATCH] Merge branch 'master' of https://sinanoaq.cn:8888/r/gtqt

---
 src/views/basicRightsManagement/personnelShiftManagement/workingHours/index.vue |  638 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 439 insertions(+), 199 deletions(-)

diff --git a/src/views/basicRightsManagement/personnelShiftManagement/workingHours/index.vue b/src/views/basicRightsManagement/personnelShiftManagement/workingHours/index.vue
index bb15eed..682c49e 100644
--- a/src/views/basicRightsManagement/personnelShiftManagement/workingHours/index.vue
+++ b/src/views/basicRightsManagement/personnelShiftManagement/workingHours/index.vue
@@ -1,12 +1,12 @@
 <template>
 	<div class="home-container">
-		<el-scrollbar height="100%">
+		<div style="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>
+					<el-button type="primary" @click="searchRecord">查询</el-button>
+					<el-button plain @click="clearSearch">重置</el-button>
 				</div>
 			</el-col>
 		</el-row>
@@ -16,57 +16,70 @@
 					<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-button type="danger" :icon="Delete" size="default" plain @click="deleteWorkTimePeriods">删除</el-button>
 					</el-col>
-					<el-button type="primary" :icon="Refresh" size="default"/>
+					<el-button type="primary" :icon="Refresh" size="default" @click="reLoadData()"/>
 				</el-row>
 				<el-table
 						ref="multipleTableRef"
 						:data="tableData"
 						style="width: 100%"
+						height="calc(100% - 100px)"
 						:header-cell-style="{background: '#fafafa'}"
 						@selection-change="handleSelectionChange"
 				>
 					<el-table-column type="selection" width="100" />
 					<el-table-column property="name" label="工作时段名称"/>
-					<el-table-column property="range" label="排班时段"/>
+					<el-table-column property="startTime" label="开始时间"/>
+					<el-table-column property="endTime" label="结束时间"/>
+					<el-table-column property="info" 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>
+							<el-button link type="danger" size="small" :icon="Delete" @click="deleteRecord(scope.row)">删除</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 class="pageBtn">
+					<el-pagination
+							v-model:currentPage="pageIndex"
+							v-model:page-size="pageSize"
+							:page-sizes="[10, 15]"
+							small=false
+							background
+							layout="total, sizes, prev, pager, next, jumper"
+							:total="totalSize"
+							@size-change="handleSizeChange"
+							@current-change="handleCurrentChange"
+					/>
+				</div>
 			</div>
 		</div>
-		</el-scrollbar>
+		</div>
 		<el-dialog v-model="dialogDetails" title="工作时段">
 			<el-form :model="details" label-width="120px">
 				<el-form-item label="工作时段名称">
 					<el-input
 							v-model="details.name"
-							class="input-with-select"
 							readonly
 					/>
 				</el-form-item>
-				<el-form-item label="排班时段">
+				<el-form-item label="开始时间">
 					<el-input
-							v-model="details.range"
-							class="input-with-select"
+							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 label="描述信息">
+					<el-input
+							v-model="details.info"
 							readonly
 					/>
 				</el-form-item>
@@ -75,7 +88,7 @@
 				</el-form-item>
 			</el-form>
 		</el-dialog>
-		<el-dialog v-model="dialogAddRecord" title="工作时段编辑" @close="closeAdd">
+		<el-dialog v-model="dialogAddRecord" title="工作时段编辑" @close="closeAdd" @open="openAdd">
 			<el-form :model="addRecord" label-width="120px" ref="addRef" :rules="addRules">
 				<el-form-item label="工作时段名称" prop="name">
 					<el-input
@@ -84,22 +97,27 @@
 					</el-input>
 				</el-form-item>
 				<el-form-item label="上班开始时间" prop="startTime">
-					<el-time-select
+					<el-time-picker
 							v-model="addRecord.startTime"
-							start="00:00"
-							step="00:15"
-							end="24:00"
+							format="HH:mm"
+							value-format="HH:mm"
 							placeholder="Select time"
 					/>
 				</el-form-item>
 				<el-form-item label="上班结束时间" prop="endTime">
-					<el-time-select
+					<el-time-picker
 							v-model="addRecord.endTime"
-							start="00:00"
-							step="00:15"
-							end="24:00"
+							format="HH:mm"
+							value-format="HH:mm"
 							placeholder="Select time"
 					/>
+				</el-form-item>
+				<el-form-item label="描述信息" prop="info">
+					<el-input
+							v-model="addRecord.info"
+							type="textarea"
+					>
+					</el-input>
 				</el-form-item>
 				<el-form-item>
 					<el-button type="warning" @click="dialogAddRecord = false" size="default" plain>取消</el-button>
@@ -119,167 +137,420 @@
 	</div>
 </template>
 
-<script lang="ts" setup>
-	import { toRefs, reactive, ref } from 'vue';
+<script lang="ts">
+	import { toRefs, reactive, ref, onMounted } 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],
-	};
+	import { FormInstance, FormRules, ElMessage } from 'element-plus'
+	import { workingHoursApi } from '/@/api/basicDateManage/personShiftManage/workingHours';
 
+
+
+	// 定义接口来定义对象的类型
 	interface stateType {
-		homeOne: Array <type>
+		tableData: Array<string>,
+		multipleSelection: Array<any>,
+		deleteArr: Array<any>,
+		dialogDetails: boolean,
+		dialogAddRecord: boolean,
+		deleteDialog: boolean,
+		pageIndex: number,
+		pageSize: number,
+		searchWord: string,
+		totalSize: number,
+		addRecord: {
+			name: string,
+			startTime: string,
+			endTime: string,
+			info: string
+		},
+		details: {
+			name: string,
+			startTime: string,
+			endTime: string,
+			info: string
+		}
 	}
-	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 tableData = reactive(
-					[
-					{
-						name: '四班三倒早班',
-						range: '04:00 - 12:00'
-					},
-					{
-						name: '四班三倒中班',
-						range: '12:00 - 20:00'
-					},
-					{
-						name: '四班三倒中班',
-						range: '20:00 - 次日04:00'
-					},
-					{
-						name: '常白班',
-						range: '08:00 - 18:00'
-					}
-				]
-			)
-			const addRef = ref<FormInstance>()
-			const addRules = reactive<FormRules>({
-				name:[{required: true, message: '该内容不能为空',trigger:'blur'}],
-				startTime:[{required: true, message: '该内容不能为空',trigger:'blur'}],
-				endTime:[{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){
-							if(addRecord.value.startTime >=  addRecord.value.endTime){
-								addRecord.value.endTime = '次日' + addRecord.value.endTime
-							}
-							addRecord.value.range = addRecord.value.startTime + '\xa0-\xa0' + addRecord.value.endTime
-							tableData.unshift(addRecord.value)
-						}else{
-							if(addRecord.value.startTime >=  addRecord.value.endTime){
-								addRecord.value.endTime = '次日' + addRecord.value.endTime
-							}
-							addRecord.value.range = addRecord.value.startTime + '\xa0-\xa0' + addRecord.value.endTime
-							tableData[chosenIndex.value] = addRecord.value
-						}
-						dialogAddRecord.value =false
-					} else {
-						console.log('error submit!', fields)
-					}
+	export default {
+    name: 'workingHours',
+	components:{},
+    setup() {
+		const userInfo = useUserInfo()
+		const {userInfos} = storeToRefs(userInfo);
+
+		const state = reactive<stateType>({
+			pageIndex: 1,
+			pageSize: 10,
+			totalSize: 0,
+			chosenIndex: null,
+			searchWord: '',
+			tableData: [],
+			multipleSelection: [],
+			dialogDetails: false,
+			dialogAddRecord: false,
+			deleteDialog: false,
+			addRecord: {
+				name: '',
+				startTime: '',
+				endTime: '',
+				info: ''
+			},
+			details: {
+				name: '',
+				startTime: '',
+				endTime: '',
+				info: ''
+			},
+			deleteId: null,
+			deleteArr: []
+		})
+		interface User {
+			name: string,
+			startTime: string,
+			endTime: string,
+			info: string
+		}
+		const multipleTableRef = ref<InstanceType<typeof ElTable>>()
+		const toggleSelection = (rows?: User[]) => {
+			if (rows) {
+				rows.forEach((row) => {
+					// TODO: improvement typing when refactor table
+					// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+					// @ts-expect-error
+					multipleTableRef.value!.toggleRowSelection(row, undefined)
 				})
+			} else {
+				multipleTableRef.value!.clearSelection()
+			}
+		}
 
+		// 多选
+		const handleSelectionChange = (val: User[]) => {
+			state.multipleSelection = JSON.parse(JSON.stringify(val))
+			state.deleteArr = state.multipleSelection.map((item)=>{
+				item = item.id
+				return item
+			})
+		}
+
+		const addRef = ref<FormInstance>()
+		const addRules = reactive<FormRules>({
+			name: [{required: true, message: '该内容不能为空', trigger: 'blur'}],
+			startTime: [{required: true, message: '该内容不能为空', trigger: 'blur'}],
+			endTime: [{required: true, message: '该内容不能为空', trigger: 'blur'}]
+		})
+
+		// 页面载入时执行方法
+		onMounted(() => {
+			// getWorkTimePeriod()
+			getListByPage()
+		})
+
+		// 获取工作时段列表
+		const getWorkTimePeriod = async () => {
+			let res = await workingHoursApi().getWorkTimePeriod({name: state.searchWord});
+			if (res.data.code === '200') {
+				state.tableData = res.data.data.map((item)=>{
+					item.startHour = item.startHour==null?'00':(item.startHour.toString()[1]?item.startHour.toString():'0'+item.startHour.toString())
+					item.startMin = item.startMin==null?'00':(item.startMin.toString()[1]?item.startMin.toString():'0'+item.startMin.toString())
+					item.endHour = item.endHour==null?'00':(item.endHour.toString()[1]?item.endHour.toString():'0'+item.endHour.toString())
+					item.endMin = item.endMin==null?'00':(item.endMin.toString()[1]?item.endMin.toString():'0'+item.endMin.toString())
+					item.startTime = item.startHour + ':' + item.startMin
+					item.endTime = item.endHour + ':' + item.endMin
+					return item
+				})
+			} else {
+				ElMessage({
+					type: 'warning',
+					message: res.data.msg
+				});
 			}
-			const closeAdd =()=>{
-				addRecord.value={}
-				chosenIndex.value = -1
+		}
+
+		// 分页获取工作时段列表
+		const getListByPage = async ()=>{
+			const data = {pageSize: state.pageSize,pageIndex: state.pageIndex,searchParams:{name: state.searchWord}}
+			let res = await workingHoursApi().postPeriodPage(data);
+			if (res.data.code === '200') {
+				state.tableData = res.data.data.map((item)=>{
+					item.startHour = item.startHour==null?'00':(item.startHour.toString()[1]?item.startHour.toString():'0'+item.startHour.toString())
+					item.startMin = item.startMin==null?'00':(item.startMin.toString()[1]?item.startMin.toString():'0'+item.startMin.toString())
+					item.endHour = item.endHour==null?'00':(item.endHour.toString()[1]?item.endHour.toString():'0'+item.endHour.toString())
+					item.endMin = item.endMin==null?'00':(item.endMin.toString()[1]?item.endMin.toString():'0'+item.endMin.toString())
+					item.startTime = item.startHour + ':' + item.startMin
+					item.endTime = item.endHour + ':' + item.endMin
+					return item
+				})
+				state.totalSize = res.data.total
+			} else {
+				ElMessage({
+					type: 'warning',
+					message: res.data.msg
+				});
 			}
-			const indexClear = ()=>{
-				chosenIndex.value = -1
+		}
+
+		// 关键词查询记录
+		const searchRecord = async()=>{
+			if(state.searchWord==''){
+				ElMessage({
+					type: 'warning',
+					message: '请输入查询关键词'
+				});
+			}else{
+				getListByPage()
 			}
-			const editRecord =(index, row)=>{
-				dialogAddRecord.value = true
-				chosenIndex.value = index
-				addRecord.value = JSON.parse(JSON.stringify(row))
-				addRecord.value.startTime = addRecord.value.range.substring(0,5)
-				addRecord.value.endTime = addRecord.value.range.substring(8)
+		}
+
+		const clearSearch = async()=>{
+			state.searchWord=''
+			getListByPage()
+		}
+
+		// 添加工作时段
+		const addWorkTimePeriod = async (data:any) => {
+			let res = await workingHoursApi().postWorkTimePeriod(data);
+			if (res.data.code === '200') {
+				ElMessage({
+					type: 'success',
+					message: res.data.msg
+				});
+				getListByPage()
+			} else {
+				ElMessage({
+					type: 'warning',
+					message: res.data.msg
+				});
 			}
-			// 折线图
-			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),
-			// };
-	// 	},
-	// });
+		};
+
+		// 修改工作时段
+		const editWorkTimePeriod = async (data:any) => {
+			let res = await workingHoursApi().updateWorkTimePeriod(data);
+			if (res.data.code === '200') {
+				ElMessage({
+					type: 'success',
+					message: res.data.msg
+				});
+				getListByPage()
+			} else {
+				ElMessage({
+					type: 'warning',
+					message: res.data.msg
+				});
+			}
+		}
+
+		// 删除工作时段
+		const deleteWorkTimePeriod = async (data:any) => {
+			let res = await workingHoursApi().deletWorkTimePeriod(data);
+			if (res.data.code === '200') {
+				ElMessage({
+					type: 'success',
+					message: res.data.msg
+				});
+				getListByPage()
+			} else {
+				ElMessage({
+					type: 'warning',
+					message: res.data.msg
+				});
+			}
+		}
+
+		const deleteRecord = (row) => {
+			state.deleteId = row.id
+			state.deleteDialog = true
+		}
+
+		const conFirmDelete = () => {
+			deleteWorkTimePeriod({ id: state.deleteId })
+			state.deleteDialog = false
+		}
+
+		// 批量删除
+		const deleteWorkTimePeriods = async () => {
+			if(state.deleteArr.length>0){
+				console.log(state.deleteArr)
+				let res = await workingHoursApi().deleteBatchWorkTimePeriod({ids: state.deleteArr});
+				if (res.data.code === '200') {
+					ElMessage({
+						type: 'success',
+						message: res.data.msg
+					});
+					getListByPage()
+				} else {
+					ElMessage({
+						type: 'warning',
+						message: res.data.msg
+					});
+				}
+			}else{
+				ElMessage({
+					type: 'warning',
+					message: '请先选择要删除的记录'
+				});
+			}
+		}
+
+		const handleSizeChange = (val: number) => {
+			state.pageSize = val
+			getListByPage()
+		}
+		const handleCurrentChange = (val: number) => {
+			state.pageIndex = val
+			getListByPage()
+		}
+
+		// 查看记录
+		const viewRecord = (row) => {
+			state.details = row
+			state.dialogDetails = true
+		}
+
+		// 刷新
+		const reLoadData = async () =>{
+			getListByPage()
+		}
+		const editRecord = (index, row) => {
+			state.dialogAddRecord = true
+			state.chosenIndex = index
+			state.addRecord = JSON.parse(JSON.stringify(row))
+		}
+
+		// 新增修改记录
+		const confirmAddRecord = async (formEl: FormInstance | undefined) => {
+			if (!formEl) return
+			await formEl.validate(async (valid, fields) => {
+				if (valid) {
+					const data = {
+						name: state.addRecord.name,
+						info: state.addRecord.info,
+						startHour: Number(state.addRecord.startTime.substring(0, 2)),
+						startMin: Number(state.addRecord.startTime.substring(3)),
+						endHour: Number(state.addRecord.endTime.substring(0, 2)),
+						endMin: Number(state.addRecord.endTime.substring(3))
+					}
+					if (state.chosenIndex == null) {
+						// if (state.addRecord.startTime >= state.addRecord.endTime) {
+						// 	state.addRecord.endTime = '次日' + state.addRecord.endTime
+						// }
+						// state.tableData.unshift(data)
+						await addWorkTimePeriod(data)
+					} else {
+						// if (state.addRecord.startTime >= state.addRecord.endTime) {
+						// 	state.addRecord.endTime = '次日' + state.addRecord.endTime
+						// }
+						// state.tableData[state.chosenIndex] = state.addRecord
+						data.id = state.addRecord.id,
+						await editWorkTimePeriod(data)
+					}
+					state.dialogAddRecord = false
+				} else {
+					console.log('error submit!', fields)
+				}
+			})
+
+		}
+		const closeAdd = () => {
+			state.addRecord = {}
+			state.chosenIndex = null
+		}
+		const openAdd = () => {
+			if (state.chosenIndex == null) {
+				state.addRecord.info = ''
+			}
+		}
+		const indexClear = () => {
+			state.deleteId = null
+		}
+
+		// 折线图
+		const renderMenu = async (value: string) => {
+			Session.set('projectId', value)
+			userInfos.value.projectId = value
+			await initBackEndControlRoutes();
+		};
+		return {
+			addRef,
+			addRules,
+			View,
+			Edit,
+			Delete,
+			Refresh,
+			Plus,
+			toggleSelection,
+			handleSelectionChange,
+			deleteWorkTimePeriods,
+			searchRecord,
+			clearSearch,
+			viewRecord,
+			deleteRecord,
+			conFirmDelete,
+			getWorkTimePeriod,
+			getListByPage,
+			reLoadData,
+			deleteWorkTimePeriod,
+			handleSizeChange,
+			handleCurrentChange,
+			confirmAddRecord,
+			closeAdd,
+			openAdd,
+			indexClear,
+			editRecord,
+			...toRefs(state)
+		};
+	}
+	}
 </script>
 
 <style scoped lang="scss">
 	$homeNavLengh: 8;
 	.home-container {
-		height: 100%;
+		height: calc(100vh - 114px);
+		box-sizing: border-box;
 		overflow: hidden;
 		.homeCard{
 			width: 100%;
 			padding: 20px;
+			box-sizing: border-box;
 			background: #fff;
 			border-radius: 4px;
+
+			.main-card{
+				width: 100%;
+				height: 100%;
+				.cardTop{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-bottom: 20px;
+					.mainCardBtn{
+						margin: 0;
+					}
+				}
+				.pageBtn{
+					height: 60px;
+					display: flex;
+					align-items: center;
+					justify-content: right;
+
+					.demo-pagination-block + .demo-pagination-block {
+						margin-top: 10px;
+					}
+					.demo-pagination-block .demonstration {
+						margin-bottom: 16px;
+					}
+				}
+			}
+			&:last-of-type{
+				height: calc(100% - 100px);
+			}
 		}
 		.el-row{
 			display: flex;
@@ -303,37 +574,6 @@
 					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;
 			}
 		}
 	}

--
Gitblit v1.9.2