From 7efe917a161f7c6965cfa75ac5ad7e664dcc1eb4 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 14 十一月 2025 09:59:03 +0800
Subject: [PATCH] 1.生产派工-加一个损耗率新增修改

---
 src/views/personnelManagement/scheduling/index.vue |  647 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 351 insertions(+), 296 deletions(-)

diff --git a/src/views/personnelManagement/scheduling/index.vue b/src/views/personnelManagement/scheduling/index.vue
index 8a7174d..15bf05c 100644
--- a/src/views/personnelManagement/scheduling/index.vue
+++ b/src/views/personnelManagement/scheduling/index.vue
@@ -5,43 +5,24 @@
       <el-form :inline="true" :model="filterForm" class="filter-form">
         <el-form-item label="鍛樺伐濮撳悕锛�">
           <el-input
-            v-model="filterForm.employeeName"
-            placeholder="璇疯緭鍏ュ憳宸ュ鍚�"
-            clearable
-            style="width: 150px"
-          />
-        </el-form-item>
-        <el-form-item label="鐝绫诲瀷锛�">
-          <el-select v-model="filterForm.shiftType" placeholder="璇烽�夋嫨鐝" clearable style="width: 120px">
-            <el-option label="鏃╃彮" value="鏃╃彮" />
-            <el-option label="涓彮" value="涓彮" />
-            <el-option label="鏅氱彮" value="鏅氱彮" />
-            <el-option label="澶滅彮" value="澶滅彮" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鏃ユ湡鑼冨洿锛�">
-          <el-date-picker
-            v-model="filterForm.dateRange"
-            type="daterange"
-            range-separator="鑷�"
-            start-placeholder="寮�濮嬫棩鏈�"
-            end-placeholder="缁撴潫鏃ユ湡"
-            format="YYYY-MM-DD"
-            value-format="YYYY-MM-DD"
-            style="width: 250px"
+              v-model="filterForm.staffName"
+              placeholder="璇疯緭鍏ュ憳宸ュ鍚�"
+              clearable
+              style="width: 150px"
           />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleFilter">
-            <el-icon><Search /></el-icon>
-            绛涢��
+            鎼滅储
           </el-button>
           <el-button @click="resetFilter">
-            <el-icon><Refresh /></el-icon>
             閲嶇疆
           </el-button>
+          <el-button @click="handleExport">
+            瀵煎嚭
+          </el-button>
           <el-button type="primary" @click="openScheduleDialog('add')">
-          <el-icon><Plus /></el-icon>
+          <el-icon><Plus/></el-icon>
           鏂板鎺掔彮
         </el-button>
         </el-form-item>
@@ -51,67 +32,84 @@
     <!-- 鎺掔彮琛ㄦ牸 -->
     <div class="table-section">
       <el-table
-        :data="filteredScheduleList"
-        border
-        stripe
-        style="width: 100%"
-        height="calc(100vh - 18.5em)"
-        @selection-change="handleSelectionChange"
+          :data="scheduleList"
+          border
+          :loading="tableLoading"
+          stripe
+          style="width: 100%"
+          height="calc(100vh - 18.5em)"
+          @selection-change="handleSelectionChange"
       >
-        <el-table-column type="selection" width="55" />
-        <el-table-column prop="employeeName" label="鍛樺伐濮撳悕" width="120" />
-        <el-table-column prop="employeeId" label="鍛樺伐宸ュ彿" width="100" />
-        <el-table-column prop="department" label="閮ㄩ棬" width="120" />
-        <el-table-column prop="shiftType" label="鐝绫诲瀷" width="100">
+        <el-table-column type="selection" width="55"/>
+        <el-table-column prop="staffName" label="鍛樺伐濮撳悕"/>
+        <!-- <el-table-column prop="staffNo" label="鍛樺伐宸ュ彿" width="100"/> -->
+        <!-- <el-table-column prop="department" label="閮ㄩ棬" width="120">
+          <template #default="scope">
+              {{ (department_type.find(i => i.value === String(scope.row.department)) || {}).label }}
+          </template>
+        </el-table-column> -->
+        <el-table-column prop="shiftType" label="鐝绫诲瀷" width="120">
           <template #default="scope">
             <el-tag :type="getShiftTagType(scope.row.shiftType)">
-              {{ scope.row.shiftType }}
+              {{ (shift_type.find(i => i.value === String(scope.row.shiftType)) || {}).label || '鏈煡' }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="workDate" label="宸ヤ綔鏃ユ湡" width="120" />
-        <el-table-column prop="startTime" label="寮�濮嬫椂闂�" width="100" />
-        <el-table-column prop="endTime" label="缁撴潫鏃堕棿" width="100" />
-        <el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100">
+        <!-- <el-table-column prop="workDate" label="宸ヤ綔鏃ユ湡" width="120"/> -->
+        <el-table-column prop="workStartTime" label="寮�濮嬫椂闂�"/>
+        <el-table-column prop="workEndTime" label="缁撴潫鏃堕棿"/>
+        <el-table-column prop="lunchTime" label="鍗堜紤鏃堕棿(h)">
+          <template #default="scope">
+            {{ scope.row.lunchTime }}灏忔椂
+          </template>
+        </el-table-column>
+        <!-- <el-table-column prop="workHours" label="宸ヤ綔鏃堕暱" width="100">
           <template #default="scope">
             {{ scope.row.workHours }}灏忔椂
           </template>
-        </el-table-column>
-        <el-table-column prop="status" label="鐘舵��" width="100">
+        </el-table-column> -->
+        <!-- <el-table-column prop="status" label="鐘舵��" width="100">
           <template #default="scope">
             <el-tag :type="getStatusTagType(scope.row.status)">
-              {{ scope.row.status }}
+              {{ (schedule_status.find(i => i.value === String(scope.row.status)) || {}).label }}
             </el-tag>
           </template>
-        </el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="150" />
-        <el-table-column label="鎿嶄綔" width="200" fixed="right">
+        </el-table-column> -->
+        <!-- <el-table-column prop="remark" label="澶囨敞" min-width="150"/> -->
+        <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center">
           <template #default="scope">
             <el-button
-              type="primary"
-              size="small"
-              @click="openScheduleDialog('edit', scope.row)"
+							link
+							type="primary"
+                @click="openScheduleDialog('edit', scope.row)"
             >
               缂栬緫
             </el-button>
             <el-button
-              type="danger"
-              size="small"
-              @click="handleDelete(scope.row)"
+							link
+							type="danger"
+                @click="handleDelete(scope.row)"
             >
               鍒犻櫎
             </el-button>
           </template>
         </el-table-column>
       </el-table>
+        <pagination
+            v-if="tableCount > 0"
+            :total="tableCount"
+            :page="filterForm.current"
+            :limit="filterForm.size"
+            @pagination="paginationChange"
+        />
     </div>
 
     <!-- 鎵归噺鎿嶄綔 -->
     <div class="batch-actions" v-if="selectedRows.length > 0">
       <el-button
-        type="danger"
-        @click="handleBatchDelete"
-        :disabled="selectedRows.length === 0"
+          type="danger"
+          @click="handleBatchDelete"
+          :disabled="selectedRows.length === 0"
       >
         鎵归噺鍒犻櫎 ({{ selectedRows.length }})
       </el-button>
@@ -119,118 +117,140 @@
 
     <!-- 鎺掔彮鏂板/缂栬緫瀵硅瘽妗� -->
     <el-dialog
-      v-model="scheduleDialog"
-      :title="dialogType === 'add' ? '鏂板鎺掔彮' : '缂栬緫鎺掔彮'"
-      width="700px"
-      @close="closeScheduleDialog"
+        v-model="scheduleDialog"
+        :title="dialogType === 'add' ? '鏂板鎺掔彮' : '缂栬緫鎺掔彮'"
+        width="700px"
+        @close="closeScheduleDialog"
     >
       <el-form
-        :model="scheduleForm"
-        :rules="scheduleRules"
-        ref="scheduleFormRef"
-        label-width="120px"
+          :model="scheduleForm"
+          :rules="scheduleRules"
+          ref="scheduleFormRef"
+          label-width="120px"
       >
         <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鍛樺伐濮撳悕锛�" prop="staffIds">
+          <el-select v-model="scheduleForm.staffIds" placeholder="璇烽�夋嫨鍛樺伐濮撳悕" style="width: 100%"
+                         multiple filterable collapse-tags-tooltip
+                         @change="handleSelectStaff">
+            <el-option v-for="item in personList" :label="item.nickName" :value="item.userId" :key="item.userId"/>
+          </el-select>
+        </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍛樺伐濮撳悕锛�" prop="employeeName">
-              <el-input v-model="scheduleForm.employeeName" placeholder="璇疯緭鍏ュ憳宸ュ鍚�" />
+            <el-form-item label="鍛樺伐宸ュ彿锛�" prop="staffNo">
+              <el-input :disabled="true" v-model="scheduleForm.staffNo" placeholder=""/>
             </el-form-item>
           </el-col>
+        </el-row> -->
+
+        <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍛樺伐宸ュ彿锛�" prop="employeeId">
-              <el-input v-model="scheduleForm.employeeId" placeholder="璇疯緭鍏ュ憳宸ュ伐鍙�" />
+            <el-form-item label="鐝绫诲瀷锛�" prop="shiftType">
+              <el-select v-model="scheduleForm.shiftType" placeholder="璇烽�夋嫨鐝绫诲瀷" style="width: 100%">
+                <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
-        
-        <el-row :gutter="20">
+
+        <!-- <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="閮ㄩ棬锛�" prop="department">
               <el-select v-model="scheduleForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%">
-                <el-option label="鎶�鏈儴" value="鎶�鏈儴" />
-                <el-option label="閿�鍞儴" value="閿�鍞儴" />
-                <el-option label="浜轰簨閮�" value="浜轰簨閮�" />
-                <el-option label="璐㈠姟閮�" value="璐㈠姟閮�" />
-                <el-option label="鐢熶骇閮�" value="鐢熶骇閮�" />
+                <el-option v-for="item in department_type" :label="item.label" :value="item.value" :key="item.value"/>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐝绫诲瀷锛�" prop="shiftType">
               <el-select v-model="scheduleForm.shiftType" placeholder="璇烽�夋嫨鐝" style="width: 100%">
-                <el-option label="鏃╃彮" value="鏃╃彮" />
-                <el-option label="涓彮" value="涓彮" />
-                <el-option label="鏅氱彮" value="鏅氱彮" />
-                <el-option label="澶滅彮" value="澶滅彮" />
+                <el-option v-for="item in shift_type" :label="item.label" :value="item.value" :key="item.value"/>
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row>
-        
-        <el-row :gutter="20">
+        </el-row> -->
+
+        <!-- <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="宸ヤ綔鏃ユ湡锛�" prop="workDate">
               <el-date-picker
-                v-model="scheduleForm.workDate"
-                type="date"
-                placeholder="閫夋嫨宸ヤ綔鏃ユ湡"
-                style="width: 100%"
-                format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD"
+                  v-model="scheduleForm.workDate"
+                  type="date"
+                  placeholder="閫夋嫨宸ヤ綔鏃ユ湡"
+                  style="width: 100%"
+                  format="YYYY-MM-DD"
+                  value-format="YYYY-MM-DD"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐘舵�侊細" prop="status">
               <el-select v-model="scheduleForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
-                <el-option label="宸插畨鎺�" value="宸插畨鎺�" />
-                <el-option label="宸茬‘璁�" value="宸茬‘璁�" />
-                <el-option label="宸插畬鎴�" value="宸插畬鎴�" />
-                <el-option label="宸插彇娑�" value="宸插彇娑�" />
+                <el-option v-for="item in schedule_status" :label="item.label" :value="item.value" :key="item.value"/>
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row>
-        
+        </el-row> -->
+
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="寮�濮嬫椂闂达細" prop="startTime">
+            <el-form-item label="寮�濮嬫椂闂达細" prop="workStartTime">
               <el-time-picker
-                v-model="scheduleForm.startTime"
-                placeholder="閫夋嫨寮�濮嬫椂闂�"
-                style="width: 100%"
-                format="HH:mm"
-                value-format="HH:mm"
+                  v-model="scheduleForm.workStartTime"
+                  placeholder="閫夋嫨寮�濮嬫椂闂�"
+                  style="width: 100%"
+                  format="HH:mm"
+                  value-format="YYYY-MM-DD HH:mm:ss"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="缁撴潫鏃堕棿锛�" prop="endTime">
+            <el-form-item label="缁撴潫鏃堕棿锛�" prop="workEndTime">
               <el-time-picker
-                v-model="scheduleForm.endTime"
-                placeholder="閫夋嫨缁撴潫鏃堕棿"
-                style="width: 100%"
-                format="HH:mm"
-                value-format="HH:mm"
+                  v-model="scheduleForm.workEndTime"
+                  placeholder="閫夋嫨缁撴潫鏃堕棿"
+                  style="width: 100%"
+                  format="HH:mm"
+                  value-format="YYYY-MM-DD HH:mm:ss"
               />
             </el-form-item>
           </el-col>
         </el-row>
-        
+
         <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍗堜紤鏃堕棿(h)锛�" prop="lunchTime">
+              <el-input-number
+                  v-model="scheduleForm.lunchTime"
+                  :min="0"
+                  :max="8"
+                  :step="0.5"
+                  placeholder="璇疯緭鍏ュ崍浼戞椂闂�"
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="澶囨敞锛�" prop="remark">
               <el-input
-                v-model="scheduleForm.remark"
-                type="textarea"
-                :rows="3"
-                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+                  v-model="scheduleForm.remark"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
               />
             </el-form-item>
           </el-col>
-        </el-row>
+        </el-row> -->
       </el-form>
-      
+
       <template #footer>
         <div class="dialog-footer">
           <el-button type="primary" @click="submitScheduleForm">纭</el-button>
@@ -242,10 +262,19 @@
 </template>
 
 <script setup>
-import { ref, reactive, computed, onMounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus, Download, Search, Refresh } from '@element-plus/icons-vue'
+import {ref, reactive, computed, onMounted, getCurrentInstance, watch} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {useDict} from "@/utils/dict.js"
+import {Plus, Download, Search, Refresh} from '@element-plus/icons-vue'
+import {save, del, delByIds, listPage} from "@/api/personnelManagement/scheduling.js"
+import {getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
+import dayjs from "dayjs";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import {listUser} from "@/api/system/user.js";
 
+const { proxy } = getCurrentInstance();
+
+const tableCount = ref(0)
 // 鍝嶅簲寮忔暟鎹�
 const scheduleDialog = ref(false)
 const dialogType = ref('add')
@@ -254,157 +283,140 @@
 
 // 绛涢�夎〃鍗�
 const filterForm = reactive({
-  employeeName: '',
-  shiftType: '',
-  dateRange: []
+  staffName: '',
+  current:1,
+  size: 10
 })
 
 // 鎺掔彮琛ㄥ崟
 const scheduleForm = reactive({
   id: '',
-  employeeName: '',
-  employeeId: '',
-  department: '',
+  staffIds: [],
+  // staffNo: '',
+  // department: '',
   shiftType: '',
-  workDate: '',
-  startTime: '',
-  endTime: '',
-  workHours: 0,
-  status: '宸插畨鎺�',
-  remark: ''
+  // workDate: '',
+  workStartTime: '',
+  workEndTime: '',
+  lunchTime: 3,
+  // workStartTime: '',
+  // workEndTime: '',
+  // workHours: 0,
+  // status: '',
+  // remark: ''
 })
 
 // 琛ㄥ崟楠岃瘉瑙勫垯
 const scheduleRules = reactive({
-  employeeName: [{ required: true, message: '璇疯緭鍏ュ憳宸ュ鍚�', trigger: 'blur' }],
-  employeeId: [{ required: true, message: '璇疯緭鍏ュ憳宸ュ伐鍙�', trigger: 'blur' }],
-  department: [{ required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' }],
-  shiftType: [{ required: true, message: '璇烽�夋嫨鐝绫诲瀷', trigger: 'change' }],
-  workDate: [{ required: true, message: '璇烽�夋嫨宸ヤ綔鏃ユ湡', trigger: 'change' }],
-  startTime: [{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }],
-  endTime: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }],
-  status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
+  staffIds: [{required: true, message: '璇烽�夋嫨鍛樺伐', trigger: 'change'}],
+  // department: [{required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change'}],
+  shiftType: [{required: true, message: '璇烽�夋嫨鐝绫诲瀷', trigger: 'change'}],
+  // workDate: [{required: true, message: '璇烽�夋嫨宸ヤ綔鏃ユ湡', trigger: 'change'}],
+  workStartTime: [{required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'}],
+  workEndTime: [{required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'}],
+  lunchTime: [{required: true, message: '璇疯緭鍏ュ崍浼戞椂闂�', trigger: 'blur'}],
+  // status: [{required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change'}]
 })
+const tableLoading = ref(false)
+
+//瀛楀吀
+const {department_type, schedule_status, shift_type} = useDict("department_type", "schedule_status", "shift_type")
+// 浜哄憳鍒楄〃
+const personList = ref([]);
 
 // 妯℃嫙鎺掔彮鏁版嵁
-const scheduleList = ref([
-  {
-    id: 1,
-    employeeName: '寮犳捣娲�',
-    employeeId: 'EMP001',
-    department: '鎶�鏈儴',
-    shiftType: '鏃╃彮',
-    workDate: '2024-01-15',
-    startTime: '08:00',
-    endTime: '17:00',
-    workHours: 9,
-    status: '宸插畨鎺�',
-    remark: '姝e父鎺掔彮'
-  },
-  {
-    id: 2,
-    employeeName: '鏉庤秴',
-    employeeId: 'EMP002',
-    department: '閿�鍞儴',
-    shiftType: '涓彮',
-    workDate: '2024-01-15',
-    startTime: '14:00',
-    endTime: '22:00',
-    workHours: 8,
-    status: '宸茬‘璁�',
-    remark: '瀹㈡埛浼氳'
-  },
-  {
-    id: 3,
-    employeeName: '鐜嬫澃',
-    employeeId: 'EMP003',
-    department: '鐢熶骇閮�',
-    shiftType: '鏅氱彮',
-    workDate: '2024-01-15',
-    startTime: '22:00',
-    endTime: '06:00',
-    workHours: 8,
-    status: '宸插畨鎺�',
-    remark: '澶滅彮鐢熶骇'
-  }
-])
+const scheduleList = ref([])
 
-// 璁$畻灞炴�э細绛涢�夊悗鐨勬帓鐝垪琛�
-const filteredScheduleList = computed(() => {
-  let result = scheduleList.value
 
-  if (filterForm.employeeName) {
-    result = result.filter(item => 
-      item.employeeName.includes(filterForm.employeeName)
-    )
-  }
+/**
+ * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
+ */
+const getPersonList = () => {
+	listUser().then(res => {
+		personList.value = res.rows
+	})
+};
+const paginationChange = (obj) => {
+  filterForm.current = obj.page;
+  filterForm.size = obj.limit;
+  handleFilter();
+};
 
-  if (filterForm.shiftType) {
-    result = result.filter(item => item.shiftType === filterForm.shiftType)
-  }
-
-  if (filterForm.dateRange && filterForm.dateRange.length === 2) {
-    result = result.filter(item => {
-      const workDate = new Date(item.workDate)
-      const startDate = new Date(filterForm.dateRange[0])
-      const endDate = new Date(filterForm.dateRange[1])
-      return workDate >= startDate && workDate <= endDate
-    })
-  }
-
-  return result
-})
+const handleSelectStaff = (val) => {
+  // 澶氶�夊憳宸ワ紝涓嶅啀鑷姩璁剧疆鍛樺伐宸ュ彿
+  // let obj = personList.value.find(item => item.id === val)
+  // scheduleForm.staffNo = obj.staffNo
+}
 
 // 鑾峰彇鐝鏍囩绫诲瀷
 const getShiftTagType = (shiftType) => {
-  const typeMap = {
-    '鏃╃彮': 'success',
-    '涓彮': 'warning',
-    '鏅氱彮': 'info',
-    '澶滅彮': 'danger'
-  }
+  const typeMap = Object.fromEntries(shift_type.value.map(i => [i.value, i.elTagType]))
   return typeMap[shiftType] || 'info'
 }
 
 // 鑾峰彇鐘舵�佹爣绛剧被鍨�
 const getStatusTagType = (status) => {
-  const typeMap = {
-    '宸插畨鎺�': 'info',
-    '宸茬‘璁�': 'warning',
-    '宸插畬鎴�': 'success',
-    '宸插彇娑�': 'danger'
-  }
+  const typeMap = Object.fromEntries(schedule_status.value.map(i => [i.value, i.elTagType]))
   return typeMap[status] || 'info'
 }
 
 // 绛涢��
-const handleFilter = () => {
-  // 绛涢�夐�昏緫宸插湪璁$畻灞炴�т腑瀹炵幇
+const handleFilter = async () => {
+  tableLoading.value = true
+  let searchForm = {
+    ...filterForm
+  }
+  let resp = await listPage(searchForm)
+  tableCount.value = resp.data.total
+  scheduleList.value = resp.data.records.map(it => {
+    return {
+      ...it,
+      // 淇濆瓨鍘熷鏃堕棿鏍煎紡鐢ㄤ簬缂栬緫
+      'originalWorkStartTime': it.workStartTime,
+      'originalWorkEndTime': it.workEndTime,
+      // 鏍煎紡鍖栨椂闂寸敤浜庤〃鏍兼樉绀�
+      'workStartTime': dayjs(it.workStartTime).format('HH:mm'),
+      'workEndTime': dayjs(it.workEndTime).format('HH:mm'),
+    }
+  })
+  tableLoading.value = false
+
 }
 
 // 閲嶇疆绛涢��
 const resetFilter = () => {
-  filterForm.employeeName = ''
-  filterForm.shiftType = ''
-  filterForm.dateRange = []
+  filterForm.staffName = ''
 }
 
 // 鎵撳紑鎺掔彮瀵硅瘽妗�
 const openScheduleDialog = (type, data) => {
   dialogType.value = type
   scheduleDialog.value = true
-  
+  getPersonList()
   if (type === 'edit' && data) {
-    // 缂栬緫妯″紡锛屽鍒舵暟鎹�
-    Object.assign(scheduleForm, { ...data })
-  } else {
-    // 鏂板妯″紡锛岄噸缃〃鍗�
-    Object.keys(scheduleForm).forEach(key => {
-      scheduleForm[key] = ''
+    // 缂栬緫妯″紡锛屽鍒舵暟鎹紝灏嗗憳宸D瀛楃涓茶浆鎹负鏁扮粍鏍煎紡锛屽苟澶勭悊鏃堕棿瀛楁
+    Object.assign(scheduleForm, {
+      ...data,
+		lunchTime: Number(data.lunchTime),
+      staffIds: data.staffId ? data.staffId.split(',').map(id => parseInt(id)) : [],
+      // 浣跨敤鍘熷鏃堕棿瀛楃涓诧紝鍥犱负琛ㄦ牸涓樉绀虹殑鏄牸寮忓寲鍚庣殑HH:mm
+      workStartTime: data.originalWorkStartTime || '',
+      workEndTime: data.originalWorkEndTime || ''
     })
-    scheduleForm.status = '宸插畨鎺�'
-    scheduleForm.workDate = new Date().toISOString().split('T')[0]
-  }
+  } else {
+      // 鏂板妯″紡锛岄噸缃〃鍗�
+      Object.keys(scheduleForm).forEach(key => {
+        if (key === 'staffIds') {
+          scheduleForm[key] = []
+        } else if (key === 'lunchTime') {
+          scheduleForm[key] = 3
+        } else {
+          scheduleForm[key] = ''
+        }
+      })
+      // scheduleForm.status = '宸插畨鎺�'
+      // scheduleForm.workDate = new Date().toISOString().split('T')[0]
+    }
 }
 
 // 鍏抽棴鎺掔彮瀵硅瘽妗�
@@ -415,66 +427,108 @@
 
 // 璁$畻宸ヤ綔鏃堕暱
 const calculateWorkHours = () => {
-  if (scheduleForm.startTime && scheduleForm.endTime) {
-    const start = new Date(`2000-01-01 ${scheduleForm.startTime}`)
-    const end = new Date(`2000-01-01 ${scheduleForm.endTime}`)
-    
-    if (end < start) {
-      // 璺ㄥぉ鐨勬儏鍐�
-      end.setDate(end.getDate() + 1)
+  if (!scheduleForm.workStartTime || !scheduleForm.workEndTime) {
+    return;
+  }
+
+  try {
+    // 浣跨敤dayjs姝g‘瑙f瀽鏃堕棿
+    const startDayjs = dayjs(scheduleForm.workStartTime);
+    const endDayjs = dayjs(scheduleForm.workEndTime);
+
+    if (!startDayjs.isValid() || !endDayjs.isValid()) {
+      return;
     }
-    
-    const diffMs = end - start
-    const diffHours = diffMs / (1000 * 60 * 60)
-    scheduleForm.workHours = Math.round(diffHours * 100) / 100
+
+    const startDateTime = startDayjs.toDate();
+    const endDateTime = endDayjs.toDate();
+
+    // 澶勭悊璺ㄥぉ鎯呭喌锛堢粨鏉熸椂闂存棭浜庡紑濮嬫椂闂达級
+    if (endDateTime < startDateTime) {
+      // 璺ㄥぉ锛屽皢缁撴潫鏃ユ湡鍔犱竴澶�
+      endDateTime.setDate(endDateTime.getDate() + 1);
+    }
+
+    // 璁$畻宸ヤ綔鏃堕暱锛堝皬鏃讹級
+    const diffMs = endDateTime - startDateTime;
+    const diffHours = diffMs / (1000 * 60 * 60);
+    scheduleForm.workHours = Math.round(diffHours * 100) / 100;
+  } catch (error) {
+    console.error('鏃堕棿璁$畻閿欒:', error);
   }
 }
 
+// 鐩戝惉鏃堕棿瀛楁鍙樺寲锛岃嚜鍔ㄨ绠楀伐浣滄椂闀�
+watch(
+  () => [scheduleForm.workStartTime, scheduleForm.workEndTime],
+  () => {
+    calculateWorkHours()
+  },
+  { deep: true }
+)
+
 // 鎻愪氦鎺掔彮琛ㄥ崟
-const submitScheduleForm = () => {
-  scheduleFormRef.value.validate((valid) => {
-    if (valid) {
-      // 璁$畻宸ヤ綔鏃堕暱
-      calculateWorkHours()
-      
-      if (dialogType.value === 'add') {
-        // 鏂板
-        const newSchedule = {
-          ...scheduleForm,
-          id: Date.now() // 浣跨敤鏃堕棿鎴充綔涓轰复鏃禝D
-        }
-        scheduleList.value.push(newSchedule)
-        ElMessage.success('鏂板鎺掔彮鎴愬姛')
-      } else {
-        // 缂栬緫
-        const index = scheduleList.value.findIndex(item => item.id === scheduleForm.id)
-        if (index !== -1) {
-          scheduleList.value[index] = { ...scheduleForm }
-          ElMessage.success('缂栬緫鎺掔彮鎴愬姛')
-        }
-      }
-      
-      closeScheduleDialog()
+const submitScheduleForm = async () => {
+  const valid = await scheduleFormRef.value.validate()
+  if (!valid) return
+
+  // 鐢变簬鍛樺伐鏄閫夛紝闇�瑕佷负姣忎釜閫変腑鐨勫憳宸ュ垱寤烘帓鐝褰�
+  const selectedStaffIds = scheduleForm.staffIds || []
+  
+  if (selectedStaffIds.length === 0) {
+    ElMessage.warning('璇疯嚦灏戦�夋嫨涓�涓憳宸�')
+    return
+  }
+
+  try {
+    // 鑾峰彇閫変腑鐨勫憳宸ュ鍚嶅垪琛�
+    const selectedStaffNames = selectedStaffIds.map(staffId => {
+      const staff = personList.value.find(item => item.userId === staffId)
+      return staff ? staff.nickName : ''
+    }).filter(name => name !== '')
+    
+    // 灏嗗憳宸ュ鍚嶇粍瑁呮垚閫楀彿鍒嗛殧鐨勫瓧绗︿覆
+    const staffNameString = selectedStaffNames.join(',')
+    
+    // 鍒涘缓鎺掔彮璁板綍锛屽皢鍛樺伐濮撳悕淇濆瓨涓哄瓧绗︿覆鏍煎紡
+    const newSchedule = {
+      ...scheduleForm,
+      staffName: staffNameString,
+      staffId: selectedStaffIds.join(','), // 灏嗗憳宸D涔熶繚瀛樹负閫楀彿鍒嗛殧鐨勫瓧绗︿覆
+      // 璁剧疆鍏朵粬蹇呰瀛楁鐨勯粯璁ゅ��
+      staffNo: '', // 鍙互鏍规嵁闇�瑕佷粠personList涓幏鍙�
+      department: '',
+      shiftType: scheduleForm.shiftType,
+      workDate: '',
+      status: '',
+      remark: ''
     }
-  })
+    
+    await save(newSchedule)
+    
+    ElMessage.success(`鎴愬姛涓� ${selectedStaffNames.length} 涓憳宸ュ垱寤烘帓鐝璥)
+
+    handleFilter()
+    closeScheduleDialog()
+  } catch (err) {
+    ElMessage.error('淇濆瓨澶辫触')
+  }
 }
 
 // 鍒犻櫎鎺掔彮
 const handleDelete = (row) => {
   ElMessageBox.confirm(
-    `纭畾瑕佸垹闄� ${row.employeeName} 鐨勬帓鐝褰曞悧锛焋,
-    '鍒犻櫎鎻愮ず',
-    {
-      confirmButtonText: '纭',
-      cancelButtonText: '鍙栨秷',
-      type: 'warning'
-    }
+      `纭畾瑕佸垹闄� ${row.staffName} 鐨勬帓鐝褰曞悧锛焋,
+      '鍒犻櫎鎻愮ず',
+      {
+        confirmButtonText: '纭',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }
   ).then(() => {
-    const index = scheduleList.value.findIndex(item => item.id === row.id)
-    if (index !== -1) {
-      scheduleList.value.splice(index, 1)
-      ElMessage.success('鍒犻櫎鎴愬姛')
-    }
+    del(row.id)
+    ElMessage.success('鍒犻櫎鎴愬姛')
+    handleFilter()
   }).catch(() => {
     ElMessage.info('宸插彇娑堝垹闄�')
   })
@@ -486,19 +540,18 @@
     ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑璁板綍')
     return
   }
-  
+
   ElMessageBox.confirm(
-    `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃帓鐝褰曞悧锛焋,
-    '鎵归噺鍒犻櫎鎻愮ず',
-    {
-      confirmButtonText: '纭',
-      cancelButtonText: '鍙栨秷',
-      type: 'warning'
-    }
+      `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃帓鐝褰曞悧锛焋,
+      '鎵归噺鍒犻櫎鎻愮ず',
+      {
+        confirmButtonText: '纭',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }
   ).then(() => {
-    const selectedIds = selectedRows.value.map(row => row.id)
-    scheduleList.value = scheduleList.value.filter(item => !selectedIds.includes(item.id))
-    selectedRows.value = []
+    delByIds(selectedRows.value.map(item => item.id))
+    handleFilter()
     ElMessage.success('鎵归噺鍒犻櫎鎴愬姛')
   }).catch(() => {
     ElMessage.info('宸插彇娑堝垹闄�')
@@ -510,16 +563,18 @@
   selectedRows.value = selection
 }
 
-// 鐩戝惉鏃堕棿鍙樺寲锛岃嚜鍔ㄨ绠楀伐浣滄椂闀�
-const watchTimeChange = () => {
-  if (scheduleForm.startTime && scheduleForm.endTime) {
-    calculateWorkHours()
+// 瀵煎嚭
+const handleExport = () => {
+  let searchForm = {
+    ...filterForm
   }
+  proxy.download('/staff/staffScheduling/export', {}, '浜哄憳鎺掔彮.xlsx')
 }
 
 // 鐢熷懡鍛ㄦ湡
 onMounted(() => {
   // 椤甸潰鍒濆鍖�
+  handleFilter()
 })
 </script>
 
@@ -611,15 +666,15 @@
   .scheduling-container {
     padding: 10px;
   }
-  
+
   .page-header {
     padding: 15px;
   }
-  
+
   .page-header h2 {
     font-size: 24px;
   }
-  
+
   .header-controls {
     flex-direction: column;
     gap: 10px;

--
Gitblit v1.9.3