Browse Source

基础排班系统已完成

qin_v13
hreenshan112 10 months ago
parent
commit
dc0d289feb
  1. 20
      src/api/calendar/Calendar.ts
  2. 5
      src/api/calendar/config.ts
  3. 46
      src/api/calendar/dayWeekMonthYears.ts
  4. 23
      src/api/hr/org/index.ts
  5. 20
      src/api/hr/people/index.ts
  6. 20
      src/api/hr/people/type.ts
  7. 223
      src/views/hr/teams/classTime/addNewClass.vue
  8. 7
      src/views/hr/teams/classTime/dayInfoPage.vue
  9. 32
      src/views/hr/teams/classTime/dayPage.vue
  10. 1
      src/views/hr/teams/classTime/editClass.vue
  11. 234
      src/views/hr/teams/classTime/editNewClass.vue
  12. 3
      src/views/hr/teams/classTime/monthInfoPage.vue
  13. 34
      src/views/hr/teams/classTime/monthPage.vue
  14. 234
      src/views/hr/teams/classTime/setupPollingPage.vue
  15. 4
      src/views/hr/teams/classTime/setupShiftRules.vue
  16. 90
      src/views/hr/teams/classTime/setupTimePage/dayPage.vue
  17. 10
      src/views/hr/teams/classTime/setupTimePage/monthPage.vue
  18. 10
      src/views/hr/teams/classTime/setupTimePage/quarterPage.vue
  19. 11
      src/views/hr/teams/classTime/setupTimePage/weekPage.vue
  20. 713
      src/views/hr/teams/classTime/setupTimePage/workTimePage.vue
  21. 10
      src/views/hr/teams/classTime/setupTimePage/yearsPage.vue
  22. 8
      src/views/hr/teams/classTime/weekInfoPage.vue
  23. 34
      src/views/hr/teams/classTime/weekPage.vue
  24. 34
      src/views/hr/teams/classes.vue
  25. 187
      src/views/hr/teams/classes_20250121black.vue
  26. 60
      src/views/hr/teams/scheduling.vue

20
src/api/calendar/Calendar.ts

@ -57,11 +57,17 @@ class Calendar {
}
getDateParams(day: dateBase[], date: number[]) {
return day.map((el, index) => {
let dayTime = new Date(el.date)
let y: any = dayTime.getFullYear();
let m: any = dayTime.getMonth() + 1;
let d: any = dayTime.getDate();
// console.log("获取日文----》",dayTime.getFullYear(), dayTime.getMonth()+1, dayTime.getDate())
return {
title: el.title,
isCurrent: el.isCurrent,
value: 'tCalendar' + new Date().getTime(),
isWeek: new Date(el.date).getDay() === 6 || new Date(el.date).getDay() === 0,
isWorks: DateClass.getWorks([y,m,d]),
isHolidays: el.isHolidays,
date: el.date,
lunars: el.lunars,
@ -104,7 +110,7 @@ class Calendar {
animal: DateClass.getAnimal(Number(l[0])),
astro: DateClass.toAstro(y, m, w - i),
term: getTerm(Number(l[0]), m, w - i),
isWeek: i === 6 || i === 7,
isWeek: w - i === 6 || w - i === 7,
});
}
return arr;
@ -134,7 +140,8 @@ class Calendar {
lunarDay: DateClass.getlunarDay(Number(l[0]), Number(l[1]), Number(l[2])),
animal: DateClass.getAnimal(Number(l[0])),
astro: DateClass.toAstro(y, m, i),
term: getTerm(Number(l[0]), m, i)
term: getTerm(Number(l[0]), m, i),
isWeek: i === 6 || i === 7,
});
}
return [...day, ...arr];
@ -160,7 +167,8 @@ class Calendar {
lunarDay: DateClass.getlunarDay(Number(l[0]), Number(l[1]), Number(l[2])),
animal: DateClass.getAnimal(Number(l[0])),
astro: DateClass.toAstro(date[0], date[1], i),
term: getTerm(Number(l[0]), date[1], i)
term: getTerm(Number(l[0]), date[1], i),
isWeek: i === 6 || i === 7,
});
}
return [...beforDays, ...dateArray];
@ -256,7 +264,7 @@ class Calendar {
animal: DateClass.getAnimal(Number(l[0])),
astro: DateClass.toAstro(y, m, d),
term: getTerm(Number(l[0]), m, d),
isWeek: i === 6 || i === 7,
isWeek: nowDayOfWeek === 6 || nowDayOfWeek === 7,
});
}
@ -290,7 +298,7 @@ class Calendar {
// let d: any = nextWeekFirstDaty.getDate();
// dataAry.push([y,m,d])
// }
let nowDayOfWeek = now.getDay()==0?7:now.getDay(); //今天本周的第几天
console.log("获得一周的所有日期---------------->",dateStr,now.getDay(),day,nextWeekFirstDatysss,endTime)
@ -320,7 +328,7 @@ class Calendar {
animal: DateClass.getAnimal(Number(l[0])),
astro: DateClass.toAstro(y, m, d + i),
term: getTerm(Number(l[0]), m, d + i),
isWeek: nowDayOfWeek === 6 || nowDayOfWeek === 7,
});
}
return dateArray

5
src/api/calendar/config.ts

@ -205,5 +205,10 @@ export default {
'20240914',
'20240929',
'20241012',
'20250126',
'20250208',
'20250427',
'20250928',
'20251011',
],
};

46
src/api/calendar/dayWeekMonthYears.ts

@ -0,0 +1,46 @@
export default {
week:[
{
id: 1,
name: "周一",
value: "",
days:"周一"
},
{
id: 2,
name: "周二",
value: "",
days:"周二"
},
{
id: 3,
name: "周三",
value: "",
days:"周三"
},
{
id: 4,
name: "周四",
value: "",
days:"周四"
},
{
id: 5,
name: "周五",
value: "",
days:"周五"
},
{
id: 6,
name: "周六",
value: "",
days:"周六"
},
{
id: 7,
name: "周七",
value: "",
days:"周七"
}
]
}

23
src/api/hr/org/index.ts

@ -252,3 +252,26 @@ export function getTeamListCont(data: searchTeamList): AxiosPromise<orgTeamListC
data: data
});
}
/**
*
*/
export function saveCycleRules(data:any){
return request({
url: '/systemapi/menus/saveCycleRules',
method: 'post',
data: data
});
}
/**
*
*/
export function gainCycleRule(data:any){
return request({
url: '/systemapi/menus/gainCycleRule',
method: 'post',
data: data
});
}

20
src/api/hr/people/index.ts

@ -741,7 +741,8 @@ export function teamTimeList(data?: any):AxiosPromise {
//添加工作时间段设定
export function addTeamTime(data?: any):AxiosPromise {
return request({
url: '/hrapi/rostering/add_team_time',
// url: '/hrapi/rostering/add_team_time',
url: '/systemapi/menus/addTeamTime',
method: 'post',
data: data
})
@ -758,7 +759,8 @@ export function editWorkTimeState(data?: any):AxiosPromise {
//编辑工作时间段内容
export function editWorkTimeCont(data?: any):AxiosPromise {
return request({
url: '/hrapi/rostering/edit_work_time_cont',
// url: '/hrapi/rostering/edit_work_time_cont',
url: '/systemapi/menus/editWorkTimeCont',
method: 'post',
data: data
})
@ -823,7 +825,19 @@ export function getSchedule(data?: any):AxiosPromise {
*/
export function analysisMonthRulers(data?: any){
return request({
url: '/systemapi/menus/analysisMonthRulers',
// url: '/systemapi/menus/analysisMonthRulers',
url: '/systemapi/menus/amrn',
method: 'post',
data: data
});
}
/**
* ()
*/
export function amrnWeek(data?: any){
return request({
// url: '/systemapi/menus/analysisMonthRulers',
url: '/systemapi/menus/amrnWeek',
method: 'post',
data: data
});

20
src/api/hr/people/type.ts

@ -785,3 +785,23 @@ export interface ruleInfo {
id: number;
teamid: string;
}
//工作时间段轮询
export interface teamsPickTry {
sortName: string;
types: number;
value:string;
list?: workTeams[];
}
export interface workTeams{
id:string;
name:string;
value:string;
days:string;
}
export interface guiZeInfo {
id:string;
name:string;
list:workTeams[];
}

223
src/views/hr/teams/classTime/addNewClass.vue

@ -0,0 +1,223 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 15:20:48
@ 备注: 添加倒班制度
-->
<script lang="ts" setup>
import { workTimeInfo, ruleInfo, TimesClassInfo } from "@/api/hr/people/type";
import { teamcontlist } from "@/api/hr/org/index";
import { addTeamTime } from "@/api/hr/people/index";
const props = defineProps({
open: {
type: Boolean,
default: false,
},
teamInfo: {
type: Object,
default() {
return {};
},
},
});
const emits = defineEmits(["update:open", "restdata"]);
const sunmitBut = ref(false);
const formInfo = reactive({
name: "",
});
const worktimeList = ref<workTimeInfo[]>([
{
title: "",
startTime: "",
endTime: "",
},
]);
/**
* 弹窗显示控制
*/
const isShow = computed({
get: () => {
if (props.open) {
}
return props.open;
},
set: (val) => {
emits("update:open", val);
},
});
/**
@ 作者: 秦东
@ 时间: 2025-01-14 13:57:36
@ 功能: 关闭弹窗
*/
const closeDialog = () => {
emits("update:open", false);
worktimeList.value = [
{
title: "",
startTime: "",
endTime: "",
},
];
formInfo.name = "";
sunmitBut.value = false;
emits("restdata");
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 15:16:33
@ 功能: 添加工作时间段安排
*/
const addTimeSet = () => {
worktimeList.value.push({
title: "",
startTime: "",
endTime: "",
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 15:34:42
@ 功能: 删除时间片段
*/
const delTimeSet = (val: any) => {
console.log("删除时间片段", val.$index, worktimeList.value.length);
if (worktimeList.value.length > 1) {
worktimeList.value.splice(val.$index, 1);
console.log("删除时间片段", val.$index);
} else {
val.title = "";
val.startTime = "";
val.title = "";
}
};
/**
@ 作者: 秦东
@ 时间: 2025-01-21 15:33:34
@ 功能: 提交日程安排
*/
const addContsubmit = () => {
sunmitBut.value = true;
if (!formInfo.name) {
ElMessage.error("请输入名称");
sunmitBut.value = false;
return false;
} else {
if (formInfo.name == "" || formInfo.name == null) {
ElMessage.error("请输入名称");
sunmitBut.value = false;
return false;
}
}
let workList = new Array();
if (worktimeList.value.length < 1) {
ElMessage.error("请输入工作时间安排!");
sunmitBut.value = false;
return false;
} else {
let isTrue = false;
worktimeList.value.forEach((item: any) => {
if (!item.title) {
isTrue = true;
} else {
if (item.title == "" || item.title == null) {
isTrue = true;
}
}
if (!item.startTime) {
isTrue = true;
} else {
if (item.startTime == "" || item.startTime == null) {
isTrue = true;
}
}
if (!item.endTime) {
isTrue = true;
} else {
if (item.endTime == "" || item.endTime == null) {
isTrue = true;
}
}
workList.push(item);
});
if (isTrue) {
ElMessage.error("请输入工作时间安排!");
sunmitBut.value = false;
return false;
}
}
};
</script>
<template>
<el-dialog
v-model="isShow"
width="60%"
title="添加班组轮询规则"
append-to-body
:before-close="closeDialog"
>
<el-form ref="addForm" :model="formInfo" label-width="120px" class="demo-ruleForm">
<el-form-item label="名称" prop="name">
<el-input v-model="formInfo.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="工作时间段安排" prop="rule">
<el-table :data="worktimeList" border style="width: 100%">
<el-table-column align="center" prop="title" label="时段名称" width="180">
<template #default="scope">
<el-input v-model="scope.row.title" placeholder="请输入时段名称"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="开始与结束时间">
<template #default="scope">
<el-time-select
style="width: 120px"
placeholder="起始时间"
v-model="scope.row.startTime"
start="00:00"
step="00:01"
end="23:59"
>
</el-time-select>
<el-time-select
style="width: 120px"
placeholder="结束时间"
v-model="scope.row.endTime"
:min-time="scope.row.startTime"
start="00:00"
step="00:01"
end="23:59"
>
</el-time-select>
</template>
</el-table-column>
<el-table-column align="center" width="100">
<template #header>
<el-button type="primary" size="small" @click="addTimeSet()"
><i class="fa fa-plus iconLeft"></i> 新增</el-button
>
</template>
<template #default="scope">
<el-button
v-if="worktimeList.length > 1"
type="danger"
size="small"
@click="delTimeSet(scope)"
><i class="fa fa-trash-o iconLeft"></i>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<template #footer class="el_dialog__footer">
<div class="dialog-footer">
<el-button size="small" type="primary" @click="addContsubmit" :loading="sunmitBut"
> </el-button
>
<el-button size="small" @click="closeDialog"> </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

7
src/views/hr/teams/classTime/dayInfoPage.vue

@ -55,8 +55,15 @@ const searchtData = (val: any, time?: any) => {
<div class="dayStyle">
<span>{{ col.title }}</span>
<div v-if="col.isHolidays"></div>
<div v-if="col.isWorks"></div>
<span>{{ col.lunarsChina }}</span>
</div>
<div class="dayList">
<div v-if="false" class="dayLogCont" @click="lookPageInfo">白班</div>
<div v-if="col.list != bull" v-for="itemCol in col.list" @click="lookPageInfo">
{{ itemCol.rankName }}---{{ itemCol.rulesName }}
</div>
</div>
</div>
</template>
<style lang="scss" scoped></style>

32
src/views/hr/teams/classTime/dayPage.vue

@ -9,6 +9,7 @@ import DateClass from "@/api/calendar/DateClass";
import { dateBase } from "@/api/calendar/Calendar";
import { clockFactory } from "@/api/calendar/utils";
import { gainCalendarList } from "@/api/calendar/request";
import { amrnWeek } from "@/api/hr/people/index";
import DayInfoPage from "@/views/hr/teams/classTime/dayInfoPage.vue";
const props = defineProps({
taDay: {
@ -17,6 +18,10 @@ const props = defineProps({
return [2024, 7, 13];
},
},
orgId: {
type: String,
default: 0,
},
});
const curttWeek = computed(() => {
// console.log("---------->",props.taDay[0])
@ -36,6 +41,7 @@ onMounted(() => {
let ddTime = DateClass.getCurrent();
selectedTime.value =
ddTime[0] + "-" + clockFactory(ddTime[1]) + "-" + clockFactory(ddTime[2]);
analysisDays();
});
});
@ -55,6 +61,32 @@ const changeDate = (time: dateBase) => {
emit("getDate", time);
};
const loadDay = ref(false);
/**
@ 作者: 秦东
@ 时间: 2025-01-24 11:22:05
@ 功能: 解析周数据
*/
const analysisDays = (id?: any) => {
loadDay.value = true;
let sendData = {
orgId: id ? id : props.orgId.toString() != "0" ? props.orgId.toString() : "103",
weekAllDay: [dayInfo.value],
};
console.log("获取每天数据条件", sendData);
amrnWeek(sendData)
.then(({ data }) => {
console.log("获取每天排班", data);
dayInfo.value = data;
loadDay.value = false;
})
.finally(() => {
loadDay.value = false;
});
};
//
defineExpose({
analysisDays,
});
</script>
<template>
<div

1
src/views/hr/teams/classTime/editClass.vue

@ -56,6 +56,7 @@ const isOpen = computed({
const getTimeClassList = () => {
teamcontlist().then((data: any) => {
if (data.data.list && data.data.list.length > 0) {
tiemList.value = [];
data.data.list.forEach((item: any) => {
tiemList.value.push({
id: item.id.toString(),

234
src/views/hr/teams/classTime/editNewClass.vue

@ -0,0 +1,234 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 15:51:07
@ 备注: 编辑工作时间段
-->
<script lang="ts" setup>
import { teamcontlist } from "@/api/hr/org/index";
import { editWorkTimeCont } from "@/api/hr/people/index";
const props = defineProps({
open: {
type: Boolean,
default: false,
},
teamInfo: {
type: Object,
default() {
return {};
},
},
});
const emits = defineEmits(["update:open", "restdata"]);
const editBut = ref(false);
const editFormInfo = reactive({
id: props.teamInfo.id,
name: props.teamInfo.name,
});
const editWorktimeList = ref<workTimeInfo[]>([]);
/**
* 弹窗显示控制
*/
const isOpen = computed({
get: () => {
if (props.open) {
editFormInfo.id = props.teamInfo.id.toString();
editFormInfo.name = props.teamInfo.name;
editWorktimeList.value = props.teamInfo.list;
}
return props.open;
},
set: (val) => {
emits("update:open", val);
},
});
/**
@ 作者: 秦东
@ 时间: 2025-01-15 13:01:03
@ 功能: 关闭修改轮询
*/
const closeEditDialog = () => {
editFormInfo.id = "";
editFormInfo.name = "";
editWorktimeList.value = [];
emits("update:open", false);
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 15:16:33
@ 功能: 添加工作时间段安排
*/
const addTimeSet = () => {
editWorktimeList.value.push({
title: "",
startTime: "",
endTime: "",
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 15:34:42
@ 功能: 删除时间片段
*/
const delTimeSet = (val: any) => {
console.log("删除时间片段", val.$index, editWorktimeList.value.length);
if (editWorktimeList.value.length > 1) {
editWorktimeList.value.splice(val.$index, 1);
console.log("删除时间片段", val.$index);
} else {
val.title = "";
val.startTime = "";
val.title = "";
}
};
/**
@ 作者: 秦东
@ 时间: 2025-01-15 13:13:43
@ 功能: 提交编辑轮询规则
*/
const editContsubmit = () => {
editBut.value = true;
if (!editFormInfo.name) {
ElMessage.error("请输入名称");
editBut.value = false;
return false;
} else {
if (editFormInfo.name == "" || editFormInfo.name == null) {
ElMessage.error("请输入名称");
editBut.value = false;
return false;
}
}
let workList = new Array();
if (editWorktimeList.value.length < 1) {
ElMessage.error("请输入工作时间安排!");
editBut.value = false;
return false;
} else {
let isTrue = false;
editWorktimeList.value.forEach((item: any) => {
if (!item.title) {
isTrue = true;
} else {
if (item.title == "" || item.title == null) {
isTrue = true;
}
}
if (!item.startTime) {
isTrue = true;
} else {
if (item.startTime == "" || item.startTime == null) {
isTrue = true;
}
}
if (!item.endTime) {
isTrue = true;
} else {
if (item.endTime == "" || item.endTime == null) {
isTrue = true;
}
}
workList.push(item);
});
if (isTrue) {
ElMessage.error("请输入工作时间安排!");
editBut.value = false;
return false;
}
}
var sendData = {
id: editFormInfo.id,
name: editFormInfo.name,
list: workList,
};
console.log("上传规则", sendData);
editBut.value = false;
editWorkTimeCont(sendData)
.then((data) => {
ElMessage.success(data.msg);
closeEditDialog();
})
.finally(() => {
editBut.value = false;
});
};
</script>
<template>
<el-dialog
v-model="isOpen"
width="60%"
title="编辑班组设定"
append-to-body
:before-close="closeEditDialog"
>
<el-form
ref="addForm"
:model="editFormInfo"
label-width="120px"
class="demo-ruleForm"
>
<el-form-item label="名称" prop="name">
<el-input v-model="editFormInfo.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="工作时间段安排" prop="rule">
<el-table :data="editWorktimeList" border style="width: 100%">
<el-table-column align="center" prop="title" label="时段名称" width="180">
<template #default="scope">
<el-input v-model="scope.row.title" placeholder="请输入时段名称"></el-input>
</template>
</el-table-column>
<el-table-column align="center" label="开始与结束时间">
<template #default="scope">
<el-time-select
style="width: 120px"
placeholder="起始时间"
v-model="scope.row.startTime"
start="00:00"
step="00:01"
end="23:59"
>
</el-time-select>
<el-time-select
style="width: 120px"
placeholder="结束时间"
v-model="scope.row.endTime"
:min-time="scope.row.startTime"
start="00:00"
step="00:01"
end="23:59"
>
</el-time-select>
</template>
</el-table-column>
<el-table-column align="center" width="100">
<template #header>
<el-button type="primary" size="small" @click="addTimeSet()"
><i class="fa fa-plus iconLeft"></i> 新增</el-button
>
</template>
<template #default="scope">
<el-button
v-if="editWorktimeList.length > 1"
type="danger"
size="small"
@click="delTimeSet(scope)"
><i class="fa fa-trash-o iconLeft"></i>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<template #footer class="el_dialog__footer">
<div class="dialog-footer">
<el-button size="small" type="primary" @click="editContsubmit" :loading="editBut"
> </el-button
>
<el-button size="small" @click="closeEditDialog"> </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

3
src/views/hr/teams/classTime/monthInfoPage.vue

@ -45,7 +45,7 @@ const searchtData = (val: any, time?: any) => {
{
'is-current': col.isCurrent,
'is-holidays': col.isHolidays,
'is-week': col.isWeek,
'is-week': col.isWeek && !col.isWorks,
'is-selected': col.date === props.time,
'is-current-month': isCurrentMonth(col.date),
},
@ -55,6 +55,7 @@ const searchtData = (val: any, time?: any) => {
<div class="dayStyle">
<span>{{ col.title }}</span>
<div v-if="col.isHolidays"></div>
<div v-if="col.isWorks"></div>
<span>{{ col.lunarsChina }}</span>
</div>
<div class="dayList">

34
src/views/hr/teams/classTime/monthPage.vue

@ -20,7 +20,7 @@ const props = defineProps({
},
},
orgId: {
type: Number,
type: String,
default: 0,
},
});
@ -31,17 +31,32 @@ const selectedTime = ref(
props.taDay[0] + "-" + clockFactory(props.taDay[1]) + "-" + clockFactory(props.taDay[2])
);
// const orgKey = computed({
// get: () => {
// return props.orgId;
// },
// set: (val) => {
// emits("update:open", val);
// },
// });
//
const analyban = () => {
const analyban = (id?: any) => {
loadMonth.value = true;
let sendData = {
orgId: props.orgId.toString() != "0" ? props.orgId.toString() : "103",
orgId: id ? id : props.orgId.toString() != "0" ? props.orgId.toString() : "103",
monthAllDay: TBody.value,
};
console.log("获取每天数据条件", sendData);
analysisMonthRulers(sendData).then((data: any) => {
console.log("获取排班", data);
TBody.value = data.data;
});
// console.log("", sendData);
analysisMonthRulers(sendData)
.then((data: any) => {
// console.log("", data);
TBody.value = data.data;
loadMonth.value = false;
})
.finally(() => {
loadMonth.value = false;
});
};
onMounted(() => {
@ -74,6 +89,9 @@ const changeDate = (time: dateBase) => {
selectedTime.value = time.date;
emit("getDate", time);
};
defineExpose({
analyban,
});
//
const THeader = Calendar.title();
</script>

234
src/views/hr/teams/classTime/setupPollingPage.vue

@ -0,0 +1,234 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:19:52
@ 备注: 设置轮询规则
-->
<script lang="ts" setup>
import { teamcontlist, gainCycleRule, saveCycleRules } from "@/api/hr/org/index";
import DayPage from "@/views/hr/teams/classTime/setupTimePage/dayPage.vue";
import WeekPage from "@/views/hr/teams/classTime/setupTimePage/weekPage.vue";
import MonthPage from "@/views/hr/teams/classTime/setupTimePage/monthPage.vue";
import QuarterPage from "@/views/hr/teams/classTime/setupTimePage/quarterPage.vue";
import YearsPage from "@/views/hr/teams/classTime/setupTimePage/yearsPage.vue";
import WorkTimePage from "@/views/hr/teams/classTime/setupTimePage/workTimePage.vue";
const props = defineProps({
open: {
type: Boolean,
default: false,
},
teamInfo: {
type: Object,
default() {
return {};
},
},
});
const pickCycle = ref(""); //
const emits = defineEmits(["update:open", "restdata"]);
/**
* 弹窗显示控制
*/
const isOpen = computed({
get: () => {
if (props.open) {
if (props.teamInfo.list && props.teamInfo.list.length > 0) {
pickCycle.value = props.teamInfo.list[0].id;
}
setupFormInfo.id = props.teamInfo.id;
setupFormInfo.name = props.teamInfo.name;
gainTimeList();
gainTeamRules();
}
return props.open;
},
set: (val) => {
emits("update:open", val);
},
});
//
const setupFormInfo = reactive({
id: props.teamInfo.id,
cycle: 1,
name: props.teamInfo.name,
list: [],
});
const workPageDay = ref(null);
/**
@ 作者: 秦东
@ 时间: 2025-01-15 13:01:03
@ 功能: 关闭修改轮询
*/
const closeSetupDialog = () => {
setupFormInfo.id = "";
setupFormInfo.name = "";
workPageDay.value.initWorkTime();
// editWorktimeList.value = [];
emits("update:open", false);
};
/**
@ 作者: 秦东
@ 时间: 2025-01-23 13:07:41
@ 功能: 获取班组规则
*/
const gainTeamRules = () => {
gainCycleRule({ id: props.teamInfo.id }).then((data: any) => {
console.log("获取班组规则", data);
if (data.code == 0) {
setupFormInfo.id = data.data.id.toString();
setupFormInfo.name = data.data.name;
setupFormInfo.cycle = data.data.cycle;
setupFormInfo.list = data.data.list;
workPageDay.value.callBackData(data.data.list);
}
});
};
const tiemList = ref([]);
/**
@ 作者: 秦东
@ 时间: 2025-01-14 10:27:12
@ 功能: 获取班组列表
*/
const gainTimeList = () => {
let searchMap = {
page: 1,
pagesize: 2000,
name: "",
};
teamcontlist(searchMap).then((data) => {
tiemList.value = data.data.list;
// tiemList.value.push({
// id: 10110,
// name: "",
// time: 1656752010,
// state: 1,
// status: true,
// });
// tiemList.value.push({
// id: 10111,
// name: "",
// time: 1656752010,
// state: 1,
// status: true,
// });
// tiemList.value.push({
// id: 10112,
// name: "",
// time: 1656752010,
// state: 1,
// status: true,
// });
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-22 14:35:46
@ 功能: 更新数据
*/
const restdata = (val: any) => {
// console.log("", val);
setupFormInfo.list = val;
};
/**
@ 作者: 秦东
@ 时间: 2025-01-23 08:32:01
@ 功能: 提交数据
*/
const setupContsubmit = () => {
console.log("更新数据", setupFormInfo);
saveCycleRules(setupFormInfo).then((data: any) => {
ElMessage({
message: data.msg,
type: "success",
});
closeSetupDialog();
});
};
</script>
<template>
<el-dialog
v-model="isOpen"
width="60%"
title="编辑班组轮询规则"
append-to-body
:before-close="closeSetupDialog"
>
<el-form
ref="addForm"
:model="setupFormInfo"
label-width="120px"
class="demo-ruleForm"
>
<el-form-item label="制度名称" prop="name">
<el-input v-model="setupFormInfo.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="周期" prop="cycle">
<el-radio-group v-model="setupFormInfo.cycle">
<el-radio :value="1"></el-radio>
<el-radio :value="2"></el-radio>
<el-radio :value="3"></el-radio>
<el-radio :value="4"></el-radio>
<el-radio :value="5"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="轮询规则设定" prop="cycle">
<WorkTimePage
ref="workPageDay"
v-model:pick-cycle="setupFormInfo.cycle"
:team-info="props.teamInfo"
:tiem-list="tiemList"
:ruler-info="setupFormInfo"
@restdata="restdata"
/>
<!-- <el-tabs v-model="pickCycle" class="demo-tabs" style="width: 100%">
<el-tab-pane
v-for="item in props.teamInfo.list"
:label="item.title + ' (' + item.startTime + '-' + item.endTime + ')'"
:name="item.id"
>
<DayPage
v-if="setupFormInfo.cycle == 1"
:team-info="props.teamInfo"
:tiem-list="tiemList"
/>
<WeekPage
v-if="setupFormInfo.cycle == 2"
:team-info="props.teamInfo"
:tiem-list="tiemList"
/>
<MonthPage
v-if="setupFormInfo.cycle == 3"
:team-info="props.teamInfo"
:tiem-list="tiemList"
/>
<QuarterPage
v-if="setupFormInfo.cycle == 4"
:team-info="props.teamInfo"
:tiem-list="tiemList"
/>
<YearsPage
v-if="setupFormInfo.cycle == 5"
:team-info="props.teamInfo"
:tiem-list="tiemList"
/>
</el-tab-pane>
</el-tabs> -->
</el-form-item>
</el-form>
<template #footer class="el_dialog__footer">
<div class="dialog-footer">
<el-button size="small" type="primary" @click="setupContsubmit" :loading="editBut"
> </el-button
>
<el-button size="small" @click="closeSetupDialog"> </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

4
src/views/hr/teams/classTime/setupShiftRules.vue

@ -207,7 +207,7 @@ const setOrgRulessubmit = () => {
/>
</el-select>
</el-form-item>
<el-form-item label="起始工作时间段" prop="shifttime">
<!-- <el-form-item label="起始工作时间段" prop="shifttime">
<el-select
v-model="rulesInfo.shifttime"
placeholder="请选择起始工作时间段"
@ -230,7 +230,7 @@ const setOrgRulessubmit = () => {
:value="item.id"
/>
</el-select>
</el-form-item>
</el-form-item> -->
</el-form>
<template #footer class="el_dialog__footer">
<div class="dialog-footer">

90
src/views/hr/teams/classTime/setupTimePage/dayPage.vue

@ -0,0 +1,90 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:53:22
@ 备注: 按日设置规则
-->
<script lang="ts" setup>
import { workTeams } from "@/api/hr/people/type";
const props = defineProps({
teamInfo: {
type: Object,
default() {
return {};
},
},
tiemList: {
type: Object,
default() {
return {};
},
},
});
const dayList = reactive<workTeams>([]);
onMounted(() => {
dayList.push({
id: "1",
name: "1",
value: "",
});
});
</script>
<template>
<el-scrollbar>
<div class="scrollbar-flex-content">
<div v-for="item in dayList" :key="item.id" class="infobox">
<div class="titleBox">{{ item.name }}</div>
<el-select v-model="item.value" placeholder="">
<el-option
v-for="item in props.tiemList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</div>
<div class="infoAddbox">
<i class="fa fa-plus"></i>
</div>
</div>
</el-scrollbar>
</template>
<style lang="scss" scoped>
.scrollbar-flex-content {
display: flex;
border-left: 1px solid rgb(177.3, 179.4, 183.6);
}
.scrollbar-demo-item {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 50px;
margin: 10px;
text-align: center;
border-radius: 4px;
background: var(--el-color-danger-light-9);
color: var(--el-color-danger);
}
.infobox {
width: 100px;
text-align: center;
border: 1px solid rgb(177.3, 179.4, 183.6);
margin-left: -1px;
.titleBox {
background-color: rgb(177.3, 179.4, 183.6);
}
}
.infoAddbox {
width: 50px;
border: 1px solid rgb(177.3, 179.4, 183.6);
margin-left: -1px;
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
font-size: 30px;
color: rgb(51.2, 126.4, 204);
cursor: pointer;
}
</style>

10
src/views/hr/teams/classTime/setupTimePage/monthPage.vue

@ -0,0 +1,10 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:53:22
@ 备注: 按月设置规则
-->
<script lang="ts" setup></script>
<template>
<div></div>
</template>
<style lang="scss" scoped></style>

10
src/views/hr/teams/classTime/setupTimePage/quarterPage.vue

@ -0,0 +1,10 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:53:22
@ 备注: 按季度设置规则
-->
<script lang="ts" setup></script>
<template>
<div></div>
</template>
<style lang="scss" scoped></style>

11
src/views/hr/teams/classTime/setupTimePage/weekPage.vue

@ -0,0 +1,11 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:53:22
@ 备注: 按周设置规则
-->
<script lang="ts" setup></script>
<template>
<div></div>
</template>
<style lang="scss" scoped></style>

713
src/views/hr/teams/classTime/setupTimePage/workTimePage.vue

@ -0,0 +1,713 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-22 10:01:49
@ 备注: 以班组为基准
-->
<script lang="ts" setup>
import constTimeVal from "@/api/calendar/dayWeekMonthYears";
import { guiZeInfo, teamsPickTry, workTeams } from "@/api/hr/people/type";
const props = defineProps({
pickCycle: {
type: String,
default: "1",
},
teamInfo: {
type: Object,
default() {
return {};
},
},
tiemList: {
type: Object,
default() {
return {};
},
},
rulerInfo: {
type: Object,
default() {
return {};
},
},
});
/**
@ 作者: 秦东
@ 时间: 2025-01-22 15:20:14
@ 功能: 当月最后一天
*/
const getCurrentMonthDays = () => {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth() + 1; // 0 1
//
const lastDay = new Date(year, month, 0);
return lastDay.getDate();
};
const emits = defineEmits(["update:pickCycle", "restdata"]);
const dayList = reactive<workTeams>([]);
const lunXunRule = ref<guiZeInfo[]>([]);
const teamPick = ref([]);
let jiShuQi = 1;
onMounted(() => {
let listAry = [];
switch (props.pickCycle) {
case 2: //
listAry = constTimeVal.week;
break;
case 3: //
let lastDay = getCurrentMonthDays();
console.log("最后一天", lastDay);
for (let i = 1; i <= lastDay; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
case 4: //
for (let i = 1; i <= 90; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
case 5: //
for (let i = 1; i <= 365; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
default:
for (let i = 1; i <= jiShuQi; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
}
lunXunRule.value.push({
id: "",
name: "",
list: listAry,
});
});
watch(
() => props.pickCycle,
(val: any) => {
let listAry = [];
switch (props.pickCycle) {
case 2: //
listAry = [];
listAry = constTimeVal.week;
lunXunRule.value.forEach((item: guiZeInfo) => {
item.list = listAry;
});
break;
case 3: //
listAry = [];
let lastDay = getCurrentMonthDays();
console.log("最后一天", lastDay);
for (let i = 1; i <= lastDay; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
lunXunRule.value.forEach((item: guiZeInfo) => {
item.list = listAry;
});
break;
case 4: //
listAry = [];
for (let i = 1; i <= 90; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
lunXunRule.value.forEach((item: guiZeInfo) => {
item.list = listAry;
});
break;
case 5: //
listAry = [];
for (let i = 1; i <= 365; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
lunXunRule.value.forEach((item: guiZeInfo) => {
item.list = listAry;
});
break;
default:
listAry = [];
jiShuQi = 1;
// for (let i = 1; i <= jiShuQi; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// });
// }
lunXunRule.value.splice(0);
lunXunRule.value.push({
id: "",
name: "",
list: [
{
id: jiShuQi,
name: jiShuQi.toString(),
value: "",
days: jiShuQi.toString(),
},
],
});
break;
}
console.log("计步器", jiShuQi);
},
{
deep: true,
}
);
//
// const pickCycleVal = computed({
// get: () => {
// let listAry = [];
// switch (props.pickCycle) {
// case 2: //
// listAry = constTimeVal.week;
// break;
// case 3: //
// let lastDay = getCurrentMonthDays();
// console.log("", lastDay);
// for (let i = 1; i <= lastDay; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// });
// }
// break;
// case 4: //
// for (let i = 1; i <= 90; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// });
// }
// break;
// case 5: //
// for (let i = 1; i <= 365; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// });
// }
// break;
// default:
// jiShuQi = 1;
// listAry = [
// {
// id: jiShuQi,
// name: jiShuQi.toString(),
// value: "",
// },
// ];
// break;
// }
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// console.log("", lunXunRule);
// return props.pickCycle;
// },
// set: (val) => {
// emits("update:pickCycle", val);
// },
// });
/**
@ 作者: 秦东
@ 时间: 2025-01-22 11:41:18
@ 功能: 添加周期
*/
const addCycle = (val: any) => {
console.log("addCycle", val);
let valNum = val.length + 1;
let zhijie = {
id: valNum,
name: valNum.toString(),
value: "",
days: valNum.toString(),
};
val.push(zhijie);
// if (lunXunRule && lunXunRule.length > 0) {
// console.log("1", lunXunRule);
// jiShuQi++;
// let zhijie = {
// id: jiShuQi,
// name: jiShuQi.toString(),
// value: "",
// days: jiShuQi.toString(),
// };
// lunXunRule.forEach((item: guiZeInfo) => {
// console.log("1------->", item.list, zhijie, item.list.length);
// // item.list[item.list.length] = zhijie;
// item.list.push(zhijie);
// });
// } else {
// console.log("2", lunXunRule.list);
// jiShuQi = 1;
// lunXunRule.push({
// id: "",
// name: "",
// list: [
// {
// id: jiShuQi,
// name: jiShuQi,
// value: "",
// days: jiShuQi.toString(),
// },
// ],
// });
// }
// console.log("", lunXunRule);
};
/**
@ 作者: 秦东
@ 时间: 2025-01-22 13:59:16
@ 功能: 添加班次
*/
const addTeamsInfo = () => {
console.log("添加班次", jiShuQi);
let listAry = [];
switch (props.pickCycle) {
case 2: //
listAry = constTimeVal.week;
break;
case 3: //
let lastDay = getCurrentMonthDays();
console.log("最后一天", lastDay);
for (let i = 1; i <= lastDay; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
case 4: //
console.log("最后si天", props.pickCycle);
for (let i = 1; i <= 90; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
case 5: //
console.log("最后nian天", vprops.pickCycle);
for (let i = 1; i <= 365; i++) {
listAry.push({
id: i,
name: i.toString(),
value: "",
days: i.toString(),
});
}
break;
default:
for (let j = 1; j <= jiShuQi; j++) {
listAry.push({
id: j,
name: j.toString(),
value: "",
days: j.toString(),
});
}
// console.log("", props.pickCycle);
// console.log("", listAry);
// console.log("", jiShuQi);
break;
}
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// let zhouqi = [];
// for (let j = 1; j <= jiShuQi; j++) {
// zhouqi.push({
// id: j,
// name: j.toString(),
// value: "",
// });
// }
console.log("最天------------->", lunXunRule, listAry);
lunXunRule.value.push({
id: "",
name: "",
list: listAry,
});
console.log("最天------2324------->", lunXunRule);
};
/**
@ 作者: 秦东
@ 时间: 2025-01-22 14:25:44
@ 功能: 删除轮询周期
*/
const delCycle = (val: any) => {
if (val && val.length > 0) {
val.pop();
}
// if (lunXunRule && lunXunRule.length > 1) {
// console.log("", lunXunRule);
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list.pop();
// jiShuQi = item.list.length;
// });
// }
};
/**
@ 作者: 秦东
@ 时间: 2025-01-22 14:40:09
@ 功能: 删除班次
*/
const delCycleTeam = (val: number) => {
if (lunXunRule.value && lunXunRule.value.length > 1) {
console.log("删除班次", val);
lunXunRule.value.splice(val, 1);
}
};
//
watch(
() => lunXunRule.value,
(val: guiZeInfo[]) => {
emits("restdata", val);
if (val && val.length > 0) {
teamPick.value = [];
val.forEach((item: guiZeInfo) => {
teamPick.value.push(item.id);
if (props.tiemList && props.tiemList.length > 0) {
props.tiemList.forEach((tlItem: any) => {
if (item.id == tlItem.id) {
item.name = tlItem.name;
}
});
}
if (props.teamInfo.list && props.teamInfo.list.length > 0) {
props.teamInfo.list.forEach((itemTeam: any) => {
// console.log("", itemTeam);
// console.log("--1--", item.list);
if (item.list && item.list.length > 0) {
item.list.forEach((itVal: any) => {
// console.log("----", itVal);
if (itVal.value == itemTeam.id) {
itVal.days = itemTeam.title;
}
});
}
});
}
});
}
},
{
deep: true,
}
);
/**
@ 作者: 秦东
@ 时间: 2025-01-22 14:51:14
@ 功能: 判断是否已经选择
*/
const isPickVal = (id: string) => {
if (teamPick.value && teamPick.value.length > 0) {
// console.log("", teamPick.value.includes(id));
return teamPick.value.includes(id);
}
return false;
};
/**
@ 作者: 秦东
@ 时间: 2025-01-23 08:22:04
@ 功能: 初始化数据
*/
const initWorkTime = () => {
// let listAry = [];
// switch (props.pickCycle) {
// case 2: //
// listAry = [];
// listAry = constTimeVal.week;
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// break;
// case 3: //
// listAry = [];
// let lastDay = getCurrentMonthDays();
// console.log("", lastDay);
// for (let i = 1; i <= lastDay; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// days: i.toString(),
// });
// }
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// break;
// case 4: //
// listAry = [];
// for (let i = 1; i <= 90; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// days: i.toString(),
// });
// }
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// break;
// case 5: //
// listAry = [];
// for (let i = 1; i <= 365; i++) {
// listAry.push({
// id: i,
// name: i.toString(),
// value: "",
// days: i.toString(),
// });
// }
// lunXunRule.forEach((item: guiZeInfo) => {
// item.list = listAry;
// });
// break;
// default:
// listAry = [];
// jiShuQi = 1;
// lunXunRule.splice(0);
// lunXunRule.push({
// id: "",
// name: "",
// list: [
// {
// id: jiShuQi,
// name: jiShuQi.toString(),
// value: "",
// days: jiShuQi.toString(),
// },
// ],
// });
// break;
// }
// listAry = [];
jiShuQi = 1;
lunXunRule.value.splice(0);
lunXunRule.value.push({
id: "",
name: "",
list: [
{
id: jiShuQi,
name: jiShuQi.toString(),
value: "",
days: jiShuQi.toString(),
},
],
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-23 13:19:32
@ 功能: 回填规则
*/
const callBackData = (val: any) => {
lunXunRule.value.splice(0);
if (val && val.length > 0) {
}
lunXunRule.value = val;
// val.forEach((item: any) => {
// console.log("-2-->", item);
// lunXunRule.value.push(item);
// });
console.log("回填规则--->", val);
console.log("回填规则", lunXunRule.value);
};
defineExpose({
initWorkTime,
callBackData,
});
</script>
<template>
<table cellspacing="1" class="table_body" style="width: 100%">
<tr>
<td width="150">参与班次</td>
<td>周期</td>
<td v-if="props.pickCycle == 1" width="120">操作</td>
</tr>
<tr v-for="(item, index) in lunXunRule" :key="item.id">
<td>
<el-select v-model="item.id" placeholder="请选择班组" clearable>
<el-option
v-for="items in props.tiemList"
:key="items.id.toString()"
:label="items.name"
:value="items.id.toString()"
:disabled="isPickVal(items.id.toString())"
>
</el-option>
</el-select>
<el-button
v-if="lunXunRule && lunXunRule.length > 1"
type="danger"
size="small"
@click="delCycleTeam(index)"
>删除班次</el-button
>
</td>
<td align="left" style="display: grid">
<div class="jksfd">
<div
v-for="(itemDay, indexDay) in item.list"
:key="index + '_' + itemDay.id + '_' + indexDay"
class="infobox"
>
<div class="titleBox">
<el-text>{{ itemDay.name }}</el-text>
</div>
<div class="selectBox">
<el-select
v-model="itemDay.value"
placeholder="请选择工作时间段"
clearable
:key="index + '_' + itemDay.id + '_' + indexDay"
>
<el-option
v-for="itemGroup in props.teamInfo.list"
:key="index + '_' + itemDay.id + '_' + indexDay"
:label="
itemGroup.title +
'(' +
itemGroup.startTime +
'-' +
itemGroup.endTime +
')'
"
:value="itemGroup.id.toString()"
>
</el-option>
</el-select>
</div>
</div>
</div>
</td>
<td>
<el-button type="primary" @click.top="addCycle(item.list)"
><i class="fa fa-plus"></i
></el-button>
<el-button
v-if="item.list && item.list.length > 1"
type="danger"
@click.top="delCycle(item.list)"
><i class="fa fa-minus"></i
></el-button>
</td>
</tr>
<tr>
<td :colspan="props.pickCycle == 1 ? 3 : 2">
<el-button @click="addTeamsInfo" type="success" style="margin-bottom: 5px"
>添加参数班次</el-button
>
</td>
</tr>
</table>
</template>
<style lang="scss" scoped>
.table_body {
background-color: #ffffff;
border-collapse: collapse;
/*
* 设置边框
*/
td,
th {
border: 1px solid #f0f0f0;
padding: 5px 5px 0 5px;
text-align: center;
}
}
.tdWidth {
width: 200px;
}
.jksfd {
display: flex;
width: 100%;
overflow: hidden;
overflow-x: auto;
.infobox {
width: 200px;
text-align: center;
border: 1px solid rgb(177.3, 179.4, 183.6);
// margin-left: -1px;
margin-bottom: 5px;
.selectBox {
padding: 5px;
}
.titleBox {
display: flex;
width: 200px;
background-color: rgb(177.3, 179.4, 183.6);
span {
width: 90%;
}
i {
margin-right: 5px;
margin-top: 8px;
cursor: pointer;
}
}
}
}
</style>

10
src/views/hr/teams/classTime/setupTimePage/yearsPage.vue

@ -0,0 +1,10 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-21 16:53:22
@ 备注: 按年设置规则
-->
<script lang="ts" setup></script>
<template>
<div></div>
</template>
<style lang="scss" scoped></style>

8
src/views/hr/teams/classTime/weekInfoPage.vue

@ -53,11 +53,17 @@ const searchtData = (val: any, time?: any) => {
@click="changeTargetDate(col)"
>
<div class="dayStyle">
{{ col }}
<span>{{ col.title }}</span>
<div v-if="col.isHolidays"></div>
<div v-if="col.isWorks"></div>
<span>{{ col.lunarsChina }}</span>
</div>
<div class="dayList">
<div v-if="false" class="dayLogCont" @click="lookPageInfo">白班</div>
<div v-if="col.list != bull" v-for="itemCol in col.list" @click="lookPageInfo">
{{ itemCol.rankName }}---{{ itemCol.rulesName }}
</div>
</div>
</div>
</template>
<style lang="scss" scoped></style>

34
src/views/hr/teams/classTime/weekPage.vue

@ -9,6 +9,7 @@ import DateClass from "@/api/calendar/DateClass";
import { dateBase } from "@/api/calendar/Calendar";
import { clockFactory } from "@/api/calendar/utils";
import { gainCalendarList } from "@/api/calendar/request";
import { amrnWeek } from "@/api/hr/people/index";
import WeekInfoPage from "@/views/hr/teams/classTime/weekInfoPage.vue";
const props = defineProps({
@ -18,6 +19,11 @@ const props = defineProps({
return [2024, 7, 13];
},
},
orgId: {
type: String,
default: 0,
},
});
//
const THeader = Calendar.title();
@ -35,6 +41,7 @@ onMounted(() => {
let ddTime = DateClass.getCurrent();
selectedTime.value =
ddTime[0] + "-" + clockFactory(ddTime[1]) + "-" + clockFactory(ddTime[2]);
analysisWeek();
});
});
const emit = defineEmits(["getDate"]);
@ -56,6 +63,33 @@ watch(
}
);
const loadWeek = ref(false);
/**
@ 作者: 秦东
@ 时间: 2025-01-24 11:22:05
@ 功能: 解析周数据
*/
const analysisWeek = (id?: any) => {
loadWeek.value = true;
let sendData = {
orgId: id ? id : props.orgId.toString() != "0" ? props.orgId.toString() : "103",
weekAllDay: WeekBody.value,
};
console.log("获取周每天数据条件", sendData);
amrnWeek(sendData)
.then((data: any) => {
console.log("获取周排班", data);
WeekBody.value = data.data;
loadWeek.value = false;
})
.finally(() => {
loadWeek.value = false;
});
};
//
defineExpose({
analysisWeek,
});
</script>
<template>
<div class="monthCalendarBox">

34
src/views/hr/teams/classes.vue

@ -7,8 +7,9 @@
import { TimesClassInfo } from "@/api/hr/people/type";
import { teamTimeList, editWorkTimeState } from "@/api/hr/people/index";
import AddClass from "@/views/hr/teams/classTime/addClass.vue";
import EditClass from "@/views/hr/teams/classTime/editClass.vue";
import AddClass from "@/views/hr/teams/classTime/addNewClass.vue";
import EditClass from "@/views/hr/teams/classTime/editNewClass.vue";
import SetupPollingPage from "@/views/hr/teams/classTime/setupPollingPage.vue";
const searchData = reactive({
name: "",
@ -101,15 +102,26 @@ const deleteOperate = (val: any) => {
onMounted(() => {
getTimeClassList();
});
//
const setupPolling = (val: any) => {
teamLookInfo.value = val;
setupIsShow.value = true;
};
</script>
<template>
<AddClass v-model:open="addIsShow" @restdata="getTimeClassList" />
<EditClass
v-model:open="editIsShow"
:team-info="teamLookInfo"
@restdata="getTimeClassList"
/>
<SetupPollingPage
v-model:open="setupIsShow"
:team-info="teamLookInfo"
@restdata="getTimeClassList"
/>
<div class="app-container">
<AddClass v-model:open="addIsShow" @restdata="getTimeClassList" />
<EditClass
v-model:open="editIsShow"
:team-info="teamLookInfo"
@restdata="getTimeClassList"
/>
<el-card shadow="never">
<template #header>
<el-form ref="searchFormRef" :model="searchData" :inline="true">
@ -130,7 +142,6 @@ onMounted(() => {
</template>
<el-table :data="timeClassList" style="width: 100%">
<el-table-column prop="name" label="名称" width="200"> </el-table-column>
<el-table-column prop="rulename" label="轮询规则"> </el-table-column>
<el-table-column label="工作时段安排">
<template #default="scope">
<el-row v-for="item in scope.row.list" :key="item.title">
@ -162,13 +173,16 @@ onMounted(() => {
align="center"
fixed="right"
label="操作"
width="160"
width="260"
header-align="center"
>
<template #default="scope">
<el-button v-if="false" size="small" @click="setOrigin(scope.row)"
>设置源点</el-button
>
<el-button size="small" @click="setupPolling(scope.row)"
>设置轮询规则</el-button
>
<el-button size="small" @click="showEdit(scope.row)">编辑</el-button>
<el-button size="small" @click="deleteOperate(scope.row)">删除</el-button>
</template>

187
src/views/hr/teams/classes_20250121black.vue

@ -0,0 +1,187 @@
<!--
@ 作者: 秦东
@ 时间: 2025-01-14 11:17:13
@ 备注: 班次管理
-->
<script lang="ts" setup>
import { TimesClassInfo } from "@/api/hr/people/type";
import { teamTimeList, editWorkTimeState } from "@/api/hr/people/index";
import AddClass from "@/views/hr/teams/classTime/addClass.vue";
import EditClass from "@/views/hr/teams/classTime/editClass.vue";
const searchData = reactive({
name: "",
});
const searchFormRef = ref(ElForm);
const timeClassList = ref<TimesClassInfo[]>([]);
const teamLookInfo = ref<TimesClassInfo>();
const addIsShow = ref(false);
const editIsShow = ref(false);
const setupIsShow = ref(false);
/**
@ 作者: 秦东
@ 时间: 2025-01-14 11:34:57
@ 功能: 获取班次列表
*/
const getTimeClassList = () => {
teamTimeList(searchData).then((data: any) => {
timeClassList.value = data.data;
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 11:39:01
@ 功能: 查询班次
*/
const searchSubmit = () => {
getTimeClassList();
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 13:14:17
@ 功能: 改变班次轮询规则状态
*/
const switchChange = (val: any) => {
// console.log("", val);
let setState = 2;
if (val.states) setState = 1;
let sendData = {
id: val.id.toString(),
state: setState,
constrain: 2,
};
editWorkTimeState(sendData).then((data: any) => {
getTimeClassList();
});
};
/**
@ 作者: 秦东
@ 时间: 2025-01-14 13:31:30
@ 功能: 新增班次轮询规则
*/
const addNewCont = () => {
// console.log("");
addIsShow.value = true;
// console.log("", addIsShow.value);
};
/**
@ 作者: 秦东
@ 时间: 2025-01-15 09:16:08
@ 功能: 编辑班次轮询
*/
const showEdit = (val: any) => {
teamLookInfo.value = val;
editIsShow.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2025-01-15 09:12:06
@ 功能: 删除班次轮询
*/
const deleteOperate = (val: any) => {
ElMessageBox.confirm("您确定要删除此内容?一经删除!内容将不可恢复!", "Warning", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
let sendData = {
id: val.id.toString(),
state: 3,
constrain: 2,
};
editWorkTimeState(sendData).then((data: any) => {
getTimeClassList();
});
})
.catch(() => {});
};
//
onMounted(() => {
getTimeClassList();
});
</script>
<template>
<div class="app-container">
<AddClass v-model:open="addIsShow" @restdata="getTimeClassList" />
<EditClass
v-model:open="editIsShow"
:team-info="teamLookInfo"
@restdata="getTimeClassList"
/>
<el-card shadow="never">
<template #header>
<el-form ref="searchFormRef" :model="searchData" :inline="true">
<el-form-item label="班次名称">
<el-input v-model="searchData.name" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchSubmit"
><i class="fa fa-search"></i>查询</el-button
>
</el-form-item>
<el-form-item>
<el-button type="warning" @click="addNewCont"
><i class="fa fa-plus"></i>新增</el-button
>
</el-form-item>
</el-form>
</template>
<el-table :data="timeClassList" style="width: 100%">
<el-table-column prop="name" label="名称" width="200"> </el-table-column>
<el-table-column prop="rulename" label="轮询规则"> </el-table-column>
<el-table-column label="工作时段安排">
<template #default="scope">
<el-row v-for="item in scope.row.list" :key="item.title">
<el-col :span="24"
>{{ item.title }} 工作时间{{ item.startTime }} -
{{ item.endTime }}</el-col
>
</el-row>
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="scope">
<el-switch
@change="switchChange(scope.row)"
style="display: block"
v-model="scope.row.states"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="启用"
inactive-text="禁用"
inline-prompt
>
</el-switch>
</template>
</el-table-column>
<el-table-column
align="center"
fixed="right"
label="操作"
width="160"
header-align="center"
>
<template #default="scope">
<el-button v-if="false" size="small" @click="setOrigin(scope.row)"
>设置源点</el-button
>
<el-button size="small" @click="showEdit(scope.row)">编辑</el-button>
<el-button size="small" @click="deleteOperate(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<style lang="scss" scoped>
.app-container {
:deep .el-card__header {
padding-bottom: 0px;
}
}
</style>

60
src/views/hr/teams/scheduling.vue

@ -19,6 +19,9 @@ const orgTreeProps = {
children: "child",
label: "name",
}; //
const monthPageRef = ref(null);
const weekPageRef = ref(null);
const dayPageRef = ref(null);
const cureeOrgName = ref("");
const cureeOrgId = ref(0);
const taday = ref<any>([]); //
@ -48,7 +51,7 @@ const gainOrgTree = () => {
orgTreeLoading.value = true;
accordRoleGiveOrg()
.then((dada) => {
// console.log("", dada);
console.log("获取行政组织树", dada);
orgTreeList.value = dada.data.orgTree;
if (dada.data.orgName != "") {
cureeOrgName.value = dada.data.orgName;
@ -76,6 +79,19 @@ const handleOrgTreeNodeClick = (val: any) => {
cureeOrgName.value = val.name;
cureeOrgId.value = val.id;
getCurrOrgRules(val.id.toString());
switch (curtteDayType.value) {
case 1:
monthPageRef.value.analyban(val.id.toString());
break;
case 2:
weekPageRef.value.analysisWeek(val.id.toString());
break;
case 3:
dayPageRef.value.analysisDays(val.id.toString());
break;
default:
}
// monthPageRef.value.analyban(val.id.toString());
};
//
@ -146,6 +162,25 @@ const backTime = () => {
);
taday.value = weekObject;
}
console.log("curtteDayType.value--------->", curtteDayType.value);
nextTick(() => {
switch (curtteDayType.value) {
case 1:
console.log("curtteDayType.value-----1---->", curtteDayType.value);
monthPageRef.value.analyban();
break;
case 2:
console.log("curtteDayType.value---2------>", curtteDayType.value);
weekPageRef.value.analysisWeek();
break;
case 3:
console.log("curtteDayType.value---3------>", curtteDayType.value);
dayPageRef.value.analysisDays();
break;
default:
console.log("curtteDayType.value---4------>", curtteDayType.value);
}
});
};
/**
@ 作者: 秦东
@ -173,6 +208,25 @@ const forwardTime = () => {
);
taday.value = weekObject;
}
console.log("curtteDayType.value--------->", curtteDayType.value);
nextTick(() => {
switch (curtteDayType.value) {
case 1:
console.log("curtteDayType.value-----1---->", curtteDayType.value);
monthPageRef.value.analyban();
break;
case 2:
console.log("curtteDayType.value---2------>", curtteDayType.value);
weekPageRef.value.analysisWeek();
break;
case 3:
console.log("curtteDayType.value---3------>", curtteDayType.value);
dayPageRef.value.analysisDays();
break;
default:
console.log("curtteDayType.value---4------>", curtteDayType.value);
}
});
};
/**
@ 作者: 秦东
@ -299,9 +353,7 @@ const setupOrgRules = () => {
<div>
<el-text
>执行倒班制度及源点{{ teamRulerIsm.typeName }} [
{{ teamRulerIsm.begainTime }}{{ teamRulerIsm.periodName }}-{{
teamRulerIsm.rulesTime
}}]</el-text
{{ teamRulerIsm.begainTime }}]</el-text
>
<el-button type="primary" text @click="setupOrgRules">设置</el-button>
</div>

Loading…
Cancel
Save