|
@@ -1,39 +1,10 @@
|
|
<template>
|
|
<template>
|
|
<el-dialog v-model="visible" :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" :close-on-press-escape="false">
|
|
<el-dialog v-model="visible" :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" :close-on-press-escape="false">
|
|
<el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
|
|
<el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
|
|
- <el-form-item label="排班表名称" prop="scheduleName">
|
|
|
|
- <el-input v-model="dataForm.scheduleName" placeholder="排班表名称"></el-input>
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="排班开始日期" prop="periodStart">
|
|
|
|
- <el-date-picker
|
|
|
|
- v-model="dataForm.periodStart"
|
|
|
|
- type="date"
|
|
|
|
- placeholder="选择开始日期"
|
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
|
- style="width: 100%;"
|
|
|
|
- ></el-date-picker>
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="排班结束日期" prop="periodEnd">
|
|
|
|
- <el-date-picker
|
|
|
|
- v-model="dataForm.periodEnd"
|
|
|
|
- type="date"
|
|
|
|
- placeholder="选择结束日期"
|
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
|
- style="width: 100%;"
|
|
|
|
- ></el-date-picker>
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="上传文件" prop="filePath">
|
|
|
|
- <el-upload
|
|
|
|
- class="avatar-uploader"
|
|
|
|
- :action="action"
|
|
|
|
- :headers="headers"
|
|
|
|
- :show-file-list="false"
|
|
|
|
- :on-success="handleAvatarSuccess"
|
|
|
|
- :before-upload="beforeAvatarUpload"
|
|
|
|
- >
|
|
|
|
- <img v-if="imageUrl" :src="imageUrl" class="avatar" />
|
|
|
|
- <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
|
|
|
- </el-upload>
|
|
|
|
|
|
+ <el-form-item label="员工姓名" prop="employeeIds">
|
|
|
|
+ <el-select v-model="dataForm.employeeIds" placeholder="员工姓名" multiple collapse-tags collapse-tags-tooltip>
|
|
|
|
+ <el-option v-for="item in employeeOptions" :key="item.id" :label="item.name" :value="item.id" ></el-option>
|
|
|
|
+ </el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="是否确认" prop="status">
|
|
<el-form-item label="是否确认" prop="status">
|
|
<el-select v-model="dataForm.status" placeholder="是否确认">
|
|
<el-select v-model="dataForm.status" placeholder="是否确认">
|
|
@@ -52,95 +23,85 @@
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
-import app from "@/constants/app";
|
|
|
|
-import { getToken } from "@/utils/cache";
|
|
|
|
|
|
+
|
|
import { reactive, ref } from "vue";
|
|
import { reactive, ref } from "vue";
|
|
import baseService from "@/service/baseService";
|
|
import baseService from "@/service/baseService";
|
|
import { ElMessage } from "element-plus";
|
|
import { ElMessage } from "element-plus";
|
|
-import { Plus } from '@element-plus/icons-vue'
|
|
|
|
-import { parseTime } from '@/utils/ruoyi'
|
|
|
|
-import type { UploadProps } from 'element-plus'
|
|
|
|
|
|
+
|
|
const emit = defineEmits(["refreshDataList"]);
|
|
const emit = defineEmits(["refreshDataList"]);
|
|
import useView from "@/hooks/useView";
|
|
import useView from "@/hooks/useView";
|
|
const state = reactive({ ...useView({}) });
|
|
const state = reactive({ ...useView({}) });
|
|
-const action = `${app.api}/sys/oss/upload`;
|
|
|
|
-const headers = {token: getToken() }
|
|
|
|
-const imageUrl = ref('');
|
|
|
|
|
|
+
|
|
const visible = ref(false);
|
|
const visible = ref(false);
|
|
const dataFormRef = ref();
|
|
const dataFormRef = ref();
|
|
|
|
|
|
const dataForm = reactive({
|
|
const dataForm = reactive({
|
|
- id: '', scheduleName: '', periodStart: '', periodEnd: '', filePath: '', status: '', creator: '', createDate: '', updater: '', updateDate: '', remark: ''});
|
|
|
|
|
|
+ id: '',yearMonth: '', scheduleDate:'', employeeIds: [] as string[], employeeNames:'', employeeId: 0, employeeName: '', filePath: '', status: '', creator: '', createDate: '', updater: '', updateDate: '', remark: ''});
|
|
|
|
|
|
const rules = ref({
|
|
const rules = ref({
|
|
- scheduleName: [
|
|
|
|
- { required: true, message: '必填项不能为空', trigger: 'blur' }
|
|
|
|
- ],
|
|
|
|
- periodStart: [
|
|
|
|
- { required: true, message: '必填项不能为空', trigger: 'blur' }
|
|
|
|
- ],
|
|
|
|
- periodEnd: [
|
|
|
|
- { required: true, message: '必填项不能为空', trigger: 'blur' }
|
|
|
|
- ],
|
|
|
|
|
|
+ employeeIds: [
|
|
|
|
+ { required: true, type: 'array', min: 1, message: '请选择至少一名员工', trigger: 'change' }
|
|
|
|
+ ],
|
|
status: [
|
|
status: [
|
|
{ required: true, message: '必填项不能为空', trigger: 'blur' }
|
|
{ required: true, message: '必填项不能为空', trigger: 'blur' }
|
|
]
|
|
]
|
|
});
|
|
});
|
|
|
|
|
|
-const init = (id?: number) => {
|
|
|
|
|
|
+const props = defineProps<{ defaultDate?: string }>();
|
|
|
|
+
|
|
|
|
+const multipleDates = ref<string[]>([]);
|
|
|
|
+const init = (id?: number, date?: string, dates?: string[]) => {
|
|
visible.value = true;
|
|
visible.value = true;
|
|
dataForm.id = "";
|
|
dataForm.id = "";
|
|
-
|
|
|
|
- // 重置表单数据
|
|
|
|
|
|
+ dataForm.scheduleDate = date || '';
|
|
|
|
+
|
|
if (dataFormRef.value) {
|
|
if (dataFormRef.value) {
|
|
dataFormRef.value.resetFields();
|
|
dataFormRef.value.resetFields();
|
|
- imageUrl.value = '';
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ fetchEmployeeOptions();
|
|
|
|
+ multipleDates.value = dates || [];
|
|
if (id) {
|
|
if (id) {
|
|
getInfo(id);
|
|
getInfo(id);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
-const handleAvatarSuccess: UploadProps['onSuccess'] = (
|
|
|
|
- response,
|
|
|
|
- uploadFile
|
|
|
|
-) => {
|
|
|
|
- if(response.code!==0) return ElMessage.error(response.msg);
|
|
|
|
- imageUrl.value = response?.data?.src;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
|
|
|
|
- if (!['image/jpeg','image/png','image/jpp'].includes(rawFile.type)) {
|
|
|
|
- ElMessage.error('请上传jpg/png格式的图片!')
|
|
|
|
- return false
|
|
|
|
- } else if (rawFile.size / 1024 / 1024 > 10) {
|
|
|
|
- ElMessage.error('图片大小不能超过10MB!')
|
|
|
|
- return false
|
|
|
|
- }
|
|
|
|
- return true
|
|
|
|
-}
|
|
|
|
|
|
+const employeeOptions = ref<{ id: string; name: string }[]>([]);
|
|
|
|
+
|
|
|
|
+// 获取员工数据
|
|
|
|
+const fetchEmployeeOptions = async () => {
|
|
|
|
+ const res = await baseService.get("/emergency/employee/page");
|
|
|
|
+ employeeOptions.value = res.data.list || [];
|
|
|
|
+};
|
|
|
|
|
|
// 获取信息
|
|
// 获取信息
|
|
const getInfo = (id: number) => {
|
|
const getInfo = (id: number) => {
|
|
baseService.get("/emergency/schedule/" + id).then((res) => {
|
|
baseService.get("/emergency/schedule/" + id).then((res) => {
|
|
Object.assign(dataForm, res.data);
|
|
Object.assign(dataForm, res.data);
|
|
dataForm.status = dataForm.status + '';
|
|
dataForm.status = dataForm.status + '';
|
|
- imageUrl.value = dataForm.filePath;
|
|
|
|
});
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
-// 表单提交
|
|
|
|
const dataFormSubmitHandle = () => {
|
|
const dataFormSubmitHandle = () => {
|
|
dataFormRef.value.validate((valid: boolean) => {
|
|
dataFormRef.value.validate((valid: boolean) => {
|
|
if (!valid) {
|
|
if (!valid) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if(!imageUrl.value) return ElMessage.error('请上传图片');
|
|
|
|
- dataForm.periodStart = dataForm.periodStart ? parseTime(new Date(dataForm.periodStart), '{yy}-{mm}-{dd}') : null;
|
|
|
|
- dataForm.periodEnd = dataForm.periodEnd ? parseTime(new Date(dataForm.periodEnd), '{yy}-{mm}-{dd} ') : null;
|
|
|
|
- dataForm.filePath = imageUrl.value;
|
|
|
|
- (!dataForm.id ? baseService.post : baseService.put)("/emergency/schedule", dataForm).then((res) => {
|
|
|
|
|
|
+
|
|
|
|
+ const baseDate = dataForm.scheduleDate || multipleDates.value[0] || '';
|
|
|
|
+ const yearMonth = baseDate.slice(0, 7);
|
|
|
|
+ const dates = multipleDates.value.length > 0 ? multipleDates.value : [dataForm.scheduleDate];
|
|
|
|
+ const scheduleDTOs = dates.map(date => ({
|
|
|
|
+ scheduleDate: date,
|
|
|
|
+ employeeIds: dataForm.employeeIds,
|
|
|
|
+ }));
|
|
|
|
+
|
|
|
|
+ const payload = {
|
|
|
|
+ yearMonth,
|
|
|
|
+ scheduleDTOs,
|
|
|
|
+ remark: dataForm.remark
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ baseService.post("/emergency/schedule/batch", payload).then((res) => {
|
|
ElMessage.success({
|
|
ElMessage.success({
|
|
message: '成功',
|
|
message: '成功',
|
|
duration: 500,
|
|
duration: 500,
|
|
@@ -153,37 +114,8 @@ const dataFormSubmitHandle = () => {
|
|
});
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+
|
|
defineExpose({
|
|
defineExpose({
|
|
init
|
|
init
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
-<style scoped>
|
|
|
|
-.avatar-uploader .avatar {
|
|
|
|
- width: 178px;
|
|
|
|
- height: 178px;
|
|
|
|
- display: block;
|
|
|
|
-}
|
|
|
|
-</style>
|
|
|
|
-
|
|
|
|
-<style>
|
|
|
|
-.avatar-uploader .el-upload {
|
|
|
|
- border: 1px dashed var(--el-border-color);
|
|
|
|
- border-radius: 6px;
|
|
|
|
- cursor: pointer;
|
|
|
|
- position: relative;
|
|
|
|
- overflow: hidden;
|
|
|
|
- transition: var(--el-transition-duration-fast);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.avatar-uploader .el-upload:hover {
|
|
|
|
- border-color: var(--el-color-primary);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-.el-icon.avatar-uploader-icon {
|
|
|
|
- font-size: 28px;
|
|
|
|
- color: #8c939d;
|
|
|
|
- width: 178px;
|
|
|
|
- height: 178px;
|
|
|
|
- text-align: center;
|
|
|
|
-}
|
|
|
|
-</style>
|
|
|