Forráskód Böngészése

更新值班管理

libushang 6 hónapja
szülő
commit
7c7e7d089f

+ 46 - 0
src/api/duty/duty.ts

@@ -0,0 +1,46 @@
+import request from '@/utils/request';
+
+// 当前值班内容
+export function dutyByDay(params) {
+  return request({
+    url: '/api/duty_management/duty/duty_by_day',
+    method: 'get',
+    params: params
+  });
+}
+
+// 新增提醒或者待办
+export function addDutyNotify(data) {
+  return request({
+    url: '/api/duty_management/duty/add_notify',
+    method: 'post',
+    data: data
+  });
+}
+
+// 交班
+export function handover(data) {
+  return request({
+    url: '/api/duty_management/duty/handover',
+    method: 'post',
+    data: data
+  });
+}
+
+// 排班表
+export function duty_book_by_area(params) {
+  return request({
+    url: '/api/duty_management/duty/duty_book_by_area',
+    method: 'get',
+    params: params
+  });
+}
+
+// 上传值班表
+export function upload_duty_book(data) {
+  return request({
+    url: '/api/duty_management/duty/upload_duty_book',
+    method: 'post',
+    data: data
+  });
+}

+ 38 - 25
src/views/duty/dutyCalendar.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="calendar-container">
-    <Calendar ref="calendarRef" :current="current" :dotDays="dutyData.dateList" @change="handleChange" />
+    <Calendar ref="calendarRef" :current="current" :dotDays="dutyData.days" @change="handleChange" @select="handleSelect" />
     <div class="duty-card">
       <div class="duty-header">当天值班:{{ parseTime(current, '{y}年{m}月{d}日') }}</div>
       <div class="duty-content">
@@ -9,35 +9,35 @@
             <i class="icon" />
             <div>带班领导</div>
           </div>
-          <div class="item-label">{{ dutyData.data1 }}</div>
+          <div class="item-label">{{ dutyData.users.user1 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>主班</div>
           </div>
-          <div class="item-label">{{ dutyData.data2 }}</div>
+          <div class="item-label">{{ dutyData.users.user2 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>副班</div>
           </div>
-          <div class="item-label">{{ dutyData.data3 }}</div>
+          <div class="item-label">{{ dutyData.users.user3 }}</div>
         </div>
         <div class="duty-item">
           <div class="item-left">
             <i class="icon" />
             <div>备班</div>
           </div>
-          <div class="item-label">{{ dutyData.data4 }}</div>
+          <div class="item-label">{{ dutyData.users.user4 }}</div>
         </div>
       </div>
     </div>
     <div class="duty-card">
       <div class="duty-header">提醒事项</div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList2" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.remainds" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -46,7 +46,7 @@
     <div class="duty-card">
       <div class="duty-header">待办事项</div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList3" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.todos" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -61,35 +61,45 @@
 <script lang="ts" setup>
 import {onMounted, ref} from "vue";
 import {parseTime} from "@/utils/ruoyi";
+import { dutyByDay } from "@/api/duty/duty";
 
 let calendarRef = ref();
 const current = ref('');
 const dutyData  = ref({
-  data1: '张珊珊1',
-  data2: '张珊珊2',
-  data3: '张珊珊3',
-  data4: '张珊珊4',
-  dateList: [
-    { date: '2024-10-19', color: '#a2d7f1' },
-    { date: '2024-10-18', color: '#ffd5d8' },
-    { date: '2024-10-17', color: '#ffefcc' },
-    { date: '2024-10-16', color: '#dfdfdf' }
+  users: {
+    user1: '',
+    user2: '',
+    user3: '',
+    user4: ''
+  },
+  days: [
+    // 不知道这个有什么用
+    //{ date: '2024-10-19', color: '#a2d7f1' },
+    //{ date: '2024-10-18', color: '#ffd5d8' },
+    //{ date: '2024-10-17', color: '#ffefcc' },
+    //{ date: '2024-10-16', color: '#dfdfdf' }
   ],
-  dataList2: [
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
+  remainds: [
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
   ],
-  dataList3: [
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
+  todos: [
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
   ]
 })
 
+const handleSelect = (date) => {
+  console.log(date.value);
+}
 const handleChange = (date) => {
   current.value = date.value;
-  console.log(current.value)
+  console.log(current.value);
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+  });
 }
 
 const initData = () => {
@@ -101,6 +111,9 @@ const handleToShiftChange = () => {
 }
 onMounted(() => {
   initData();
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+  });
 })
 </script>
 

+ 26 - 4
src/views/duty/rota.vue

@@ -42,18 +42,27 @@
 
 <script lang="ts" setup name="rota">
 import {onMounted, reactive, ref} from "vue";
+import {showConfirmDialog, showFailToast} from "vant";
 import {ArrowLeft, ArrowRight} from "@element-plus/icons-vue";
 import {ElIcon} from "element-plus";
 import dayjs from "dayjs";
 import {download2} from "@/utils/request";
 import UploadRota from "@/views/duty/uploadRota.vue";
+import {duty_book_by_area} from "@/api/duty/duty";
 
 const columns = [
-  { text: '茂名市', value: 'mm' }
+  { text: '茂名市', value: '440900' },
+  { text: '茂南区', value: '440902' },
+  { text: '电白区', value: '440904' },
+  { text: '高州市', value: '440981' },
+  { text: '化州市', value: '440982' },
+  { text: '信宜市', value: '440983' },
+  { text: '滨海新区', value: '440984' },
+  { text: '高新区', value: '440983' },
 ];
 const fieldValue = ref('茂名市');
 const queryParams = reactive({
-  area: 'mm',
+  area: '440900',
   year: dayjs().year()
 })
 const dataList = ref([]);
@@ -67,6 +76,10 @@ const nextYear = (number: number) => {
 };
 // 获取数据
 const getList = () => {
+  duty_book_by_area(queryParams).then((res)=>{
+    dataList.value = res.data;
+  })
+  /*
   dataList.value = [
     { name: '一月份排班表', name2: '一月份排班表.xlsx', time: '01-01 12:31', url: ''},
     { name: '二月份排班表', name2: '二月份排班表.xlsx', time: '01-01 12:31', url: ''},
@@ -80,11 +93,20 @@ const getList = () => {
     { name: '十月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
     { name: '十一月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
     { name: '十二月份排班表', name2: '五月份排班表.xlsx', time: '01-01 12:31', url: ''},
-  ]
+  ];
+  */
+
 }
 // 下载
 const handleDownload = (url, name) => {
-  download2(baseUrl + '/file/download/' + url, name);
+  if(url!="") {
+    showConfirmDialog({
+      title: '提示',
+      message: '是否下载排班表?',
+    }).then(() => {
+      download2(baseUrl + '/file/download/' + url, name);
+    })
+  }
 }
 // 选择区域
 const onConfirm = ({ selectedOptions }) => {

+ 63 - 16
src/views/duty/shiftChange.vue

@@ -3,10 +3,10 @@
     <div class="duty-card">
       <div class="duty-header">
         <div>提醒事项</div>
-        <div class="add-text" @click="handleShowAdd('1')">新增事项</div>
+        <div v-if="status==0" class="add-text" @click="handleShowAdd('1')">新增事项</div>
       </div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList2" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.remainds" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
@@ -15,17 +15,18 @@
     <div class="duty-card">
       <div class="duty-header">
         <div>待办事项</div>
-        <div class="add-text" @click="handleShowAdd('2')">新增事项</div>
+        <div v-if="status==0" class="add-text" @click="handleShowAdd('2')">新增事项</div>
       </div>
       <div class="duty-content">
-        <div v-for="(item, index) in dutyData.dataList3" :key="index" class="duty-item2">
+        <div v-for="(item, index) in dutyData.todos" :key="index" class="duty-item2">
           <div class="text1">{{ item.time }}</div>
           <div class="text2">{{ item.text }}</div>
         </div>
       </div>
     </div>
     <div class="footer">
-      <div class="confirm-btn" @click="handleToShiftChange">确认交班</div>
+      <div v-if="status==0" class="confirm-btn" @click="handleToShiftChange">确认交班</div>
+      <div v-if="status==1" class="confirm-btn handover_btn">已交班,交班时间:{{shift_time}}</div>
     </div>
     <van-dialog
         v-model:show="show"
@@ -41,23 +42,31 @@
 </template>
 
 <script lang="ts" setup name="shiftChange">
-import {ref} from "vue";
-import {showConfirmDialog} from "vant";
+import {onMounted, ref} from "vue";
+import {showConfirmDialog, showFailToast} from "vant";
+import {parseTime} from "@/utils/ruoyi";
+import { dutyByDay, addDutyNotify, handover } from "@/api/duty/duty";
 
 const emits = defineEmits(['confirm']);
 let show = ref(false);
+const current = ref('');
+const status = ref(0);
+const shift_time = ref('');
 let eventKey = ref('');
 let content = ref('');
 const dutyData  = ref({
-  dataList2: [
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
-    { text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
+  shift_id: 0,
+  shift_status: 0,
+  handover_time: '',
+  remainds: [
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风生成期间,请密切关注台风路径及等级变化情况3。', time: '2024-10-20 11:43:00' }
   ],
-  dataList3: [
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
-    { text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
+  todos: [
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作1。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作2。', time: '2024-10-20 11:43:00' },
+    //{ text: '台风即将登录,请通知相关单位人员下午2:00到现场开展台风联合值守工作3。', time: '2024-10-20 11:43:00' }
   ]
 });
 const handleShowAdd = (key) => {
@@ -67,8 +76,14 @@ const handleShowAdd = (key) => {
 const handleToShiftChange = () => {
   showConfirmDialog({
     title: '提示',
-    message: '是否确认交班',
+    message: '是否确认交班',
   }).then(() => {
+    handover({
+      shift_id: dutyData.value.shift_id
+    }).then((res)=>{
+      getDuytData();
+    })
+
     // on confirm
   })
 }
@@ -79,6 +94,18 @@ const handleCancel = () => {
 }
 // 新增
 const handleConfirm = () => {
+  if(content.value == '') {
+    showFailToast("请输入事项内容");
+  }
+  else {
+    addDutyNotify({
+      shift_id: dutyData.value.shift_id, 
+      notify_content: content.value, 
+      notify_type: eventKey.value}
+    ).then((res)=>{
+      getDuytData();
+    })
+  }
   // let method = eventKey.value === '1' ? 'method1' : 'method2';
   // method().then((res) => {
   //   show.value = false;
@@ -86,6 +113,22 @@ const handleConfirm = () => {
   //   emits('confirm');
   // })
 };
+
+const getDuytData = () => {
+  dutyByDay({day: current.value}).then((res)=>{
+    dutyData.value = res.data;
+    status.value = dutyData.value.shift_status;
+    shift_time.value = dutyData.value.handover_time;
+    
+    show.value = false;
+    content.value = '';
+  });
+};
+
+onMounted(()=>{
+  current.value = parseTime(new Date(), '{y}-{m}-{d}');
+  getDuytData();
+})
 </script>
 
 <style lang="scss" scoped>
@@ -166,5 +209,9 @@ const handleConfirm = () => {
     justify-content: center;
     align-items: center;
   }
+  .handover_btn {
+    background: #aaa;
+    width:330px;
+  }
 }
 </style>

+ 14 - 4
src/views/duty/uploadRota.vue

@@ -85,6 +85,7 @@ import {computed, ref} from "vue";
 import dayjs from "dayjs";
 import FileUpload from "@/components/FileUpload/index.vue";
 import {download2} from "@/utils/request";
+import { upload_duty_book } from "@/api/duty/duty";
 
 const emits = defineEmits(['update:show']);
 const props = defineProps({
@@ -97,9 +98,16 @@ const showPicker = computed( {
   set(newValue) {
     emits('update:show', newValue);
   }
-})
+});
 const columns = [
-  { text: '茂名市', value: 'mm' }
+  { text: '茂名市', value: '440900' },
+  { text: '茂南区', value: '440902' },
+  { text: '电白区', value: '440904' },
+  { text: '高州市', value: '440981' },
+  { text: '化州市', value: '440982' },
+  { text: '信宜市', value: '440983' },
+  { text: '滨海新区', value: '440984' },
+  { text: '高新区', value: '440983' },
 ];
 let showPicker2 = ref(false);
 let showPicker3 = ref(false);
@@ -137,7 +145,7 @@ const onConfirm3 = ({ selectedValues }) => {
 
 // 下载模板
 const handleDownload = () => {
-  download2(import.meta.env.VITE_BASE_API + '/file/download/' + '', '值班表模板');
+  download2(import.meta.env.VITE_BASE_API + '/file/download/' + 'duty_book.xlsx', '值班表模板.xlsx');
 }
 const validatorFile = () => {
 
@@ -162,7 +170,9 @@ const handleCancel = () => {
 }
 const onSubmit = () => {
   console.log('提交', form.value);
-  handleCancel();
+  upload_duty_book(form.value).then((res)=>{
+    handleCancel();
+  });
 }
 </script>