Browse Source

更新在线点名

libushang 7 months ago
parent
commit
a7ba232f72

+ 39 - 3
src/api/onlineRollCall/index.ts

@@ -8,10 +8,37 @@ export function getPhoneList() {
     });
 }
 
-// 新建
-export function createCall(data) {
+// 按县区查看
+export function dept_by_key(params) {
     return request({
-        url: '/api/online_roll_call/call/create',
+        url: '/api/online_roll_call/call/dept_by_key',
+        method: 'get',
+        params: params
+    });
+}
+
+// 一键点名全市至区县
+export function create_by_city_to_area(data) {
+    return request({
+        url: '/api/online_roll_call/call/create_by_city_to_area',
+        method: 'post',
+        data: data
+    });
+}
+
+// 一键点名全市至镇街
+export function create_by_city_to_district(data) {
+    return request({
+        url: '/api/online_roll_call/call/create_by_city_to_district',
+        method: 'post',
+        data: data
+    });
+}
+
+// 新建点名(分区/县点名)
+export function create_by_dept_ids(data) {
+    return request({
+        url: '/api/online_roll_call/call/create_by_dept_ids',
         method: 'post',
         data: data
     });
@@ -51,4 +78,13 @@ export function hasMyCall(data) {
         method: 'post',
         data: data
     });
+}
+
+// 详情
+export function getCallList(params) {
+    return request({
+        url: '/api/online_roll_call/call/list',
+        method: 'get',
+        params: params
+    });
 }

+ 26 - 2
src/views/onlineRollCall/index.vue

@@ -12,6 +12,8 @@
 <script lang="ts" setup name="onlineRollCall">
 import {reactive} from "vue";
 import {useRouter} from "vue-router";
+import {showConfirmDialog, showToast} from 'vant';
+import {create_by_city_to_area, create_by_city_to_district} from "@/api/onlineRollCall";
 
 const router = useRouter();
 const menuData = reactive([
@@ -22,8 +24,30 @@ const menuData = reactive([
   { name: '点名应答记录', key: '5', img: 'icon3' }
 ])
 const handleClick = (key: string) => {
-  if (['1', '2'].includes(key)) {
-
+  if (key === '1') {
+    showConfirmDialog({
+      title: '提示',
+      message: '确认一键点名全市至区县?'
+    })
+    .then(() => {
+      create_by_city_to_area({}).then((res) => {
+        showToast({type: 'success', message: res.msg, onClose:()=>{
+          router.push({ name : 'RollCallDetails', query: { id: res.data }})
+        }});
+      })
+    })
+  } else if (key === '2') {
+    showConfirmDialog({
+      title: '提示',
+      message: '确认一键点名全市至镇街?'
+    })
+    .then(() => {
+      create_by_city_to_district({}).then((res) => {
+        showToast({type: 'success', message: res.msg, onClose:()=>{
+          router.push({ name : 'RollCallDetails', query: { id: res.data }})
+        }});
+      })
+    })
   } else if (key === '3') {
     router.push({ name : 'DistrictCountyRollCall'});
   } else if (key === '4') {

+ 68 - 48
src/views/onlineRollCall/rollCallDetails.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="container">
-    <div v-if="detailsData.status === '1'" class="box">
+    <div v-if="detailsData.call_status === 1" class="box">
       <div class="box-item1">
         <i class="icon"/>
         <div class="box-right">
@@ -24,36 +24,36 @@
         <i class="icon"/>
         <div class="box-right">
           <div class="time2">开始点名时间</div>
-          <div class="time2">{{ parseTime(detailsData.time1, '{y}-{m}-{d}') }}</div>
-          <div class="time2">{{ parseTime(detailsData.time1, '{h}:{i}:{s}') }}</div>
+          <div class="time2">{{ parseTime(detailsData.begin_time, '{y}-{m}-{d}') }}</div>
+          <div class="time2">{{ parseTime(detailsData.begin_time, '{h}:{i}:{s}') }}</div>
         </div>
       </div>
       <div class="box-item5">
         <i class="icon"/>
         <div class="box-right">
           <div class="time2">结束点名时间</div>
-          <div class="time2">{{ parseTime(detailsData.time2, '{y}-{m}-{d}') }}</div>
-          <div class="time2">{{ parseTime(detailsData.time2, '{h}:{i}:{s}') }}</div>
+          <div class="time2">{{ parseTime(detailsData.end_time, '{y}-{m}-{d}') }}</div>
+          <div class="time2">{{ parseTime(detailsData.end_time, '{h}:{i}:{s}') }}</div>
         </div>
       </div>
     </div>
-    <div v-if="detailsData.status === '1'" class="box2">
+    <div v-if="detailsData.call_status === 1" class="box2">
       <div class="card bg1">
         <div class="text1">本次点名时间</div>
-        <div class="text2">{{ parseTime(detailsData.time1, '{y}-{m}-{d}') }}</div>
-        <div class="text2">{{ parseTime(detailsData.time1, '{h}:{i}:{s}') }}</div>
+        <div class="text2">{{ parseTime(detailsData.begin_time, '{y}-{m}-{d}') }}</div>
+        <div class="text2">{{ parseTime(detailsData.begin_time, '{h}:{i}:{s}') }}</div>
       </div>
       <div class="card bg2">
         <div class="text1">已应答镇/街</div>
         <div class="line">
-          <div class="text3">{{ detailsData.data1 }}</div>
+          <div class="text3">{{ detailsData.ack_count }}</div>
           <div class="text1">个</div>
         </div>
       </div>
       <div class="card bg3">
         <div class="text1">未应答镇/街</div>
         <div class="line">
-          <div class="text4">{{ detailsData.data2 }}</div>
+          <div class="text4">{{ detailsData.unack_count }}</div>
           <div class="text1">个</div>
         </div>
       </div>
@@ -61,39 +61,39 @@
     <div v-else class="box2">
       <div class="card bg1">
         <div class="text1">点名时间时长</div>
-        <div class="text5">{{ detailsData.durationTime }}</div>
+        <div class="text5">{{ detailsData.duration_time }}</div>
       </div>
       <div class="card bg2">
         <div class="text1">已应答镇/街</div>
         <div class="line">
-          <div class="text3">{{ detailsData.data1 }}</div>
+          <div class="text3">{{ detailsData.ack_count }}</div>
           <div class="text1">个</div>
         </div>
       </div>
       <div class="card bg3">
         <div class="text1">未应答镇/街</div>
         <div class="line">
-          <div class="text4">{{ detailsData.data2 }}</div>
+          <div class="text4">{{ detailsData.unack_count }}</div>
           <div class="text1">个</div>
         </div>
       </div>
     </div>
     <div class="custom-list">
-      <div v-for="(item, index) in detailsData.dataList" :key="index" class="item">
+      <div v-for="(item, index) in detailsData.items" :key="index" class="item">
         <div class="item-header">
-          <div class="text1">{{ item.data1 }}</div>
-          <div :class="getClass(item.status)">{{ item.status }}</div>
+          <div class="text1">{{ item.dept_name }}</div>
+          <div :class="getClass(item.ack_status_text)">{{ item.ack_status_text }}</div>
         </div>
         <div class="item-middle">
           <i class="icon-phone" />
           <div class="item-right">
-            <div class="text2">值班领导:{{ item.data2 }}</div>
-            <div class="text3">值班员:{{ item.data2 }}</div>
+            <div class="text2">值班领导:{{ item.onduty_leader }}</div>
+            <div class="text3">值班员:{{ item.onduty_user }}</div>
           </div>
         </div>
         <div class="item-bottom">
-          <div class="btn">视频</div>
-          <div class="btn">电话</div>
+          <div class="btn" @click="handleVideo(item.video_url)">视频</div>
+          <div class="btn" @click="handleCall(item.call_url)">电话</div>
         </div>
       </div>
     </div>
@@ -104,43 +104,49 @@
 import {useRoute} from "vue-router";
 import {onMounted, onUnmounted, ref} from "vue";
 import {parseTime} from "../../utils/ruoyi";
-import {showConfirmDialog} from "vant";
+import {showConfirmDialog, showToast, showSuccessToast} from "vant";
+import {getCallDetail, endCall} from "@/api/onlineRollCall";
 
 const route = useRoute();
 let id = ref();
 
 let detailsData = ref({
-  time1: '',
-  time2: '',
-  durationTime: '',
-  data1: '',
-  data2: '',
-  data3: '',
+  begin_time: '',
+  end_time: '',
+  duration_time: '',
+  ack_count: 0,
+  unack_count: 0,
   // 状态 0 结束 1开始
-  status: '',
-  dataList: []
+  call_status: 0,
+  items: []
 });
 let durationTime = ref('');
 let timer;
 const initData = () => {
+  /*
   detailsData.value = {
-    time1: '2024-10-22 12:36:09',
-    time2: '2024-10-23 12:36:09',
-    durationTime: '24:00:00',
-    data1: '10',
-    data2: '10',
-    status: '1',
-    dataList: [
-      {data1: '水东街道1', status: '未应答', data2: '谭景津', data3: '谭大大'},
-      {data1: '水东街道2', status: '呼叫中', data2: '谭景津', data3: '谭大大'},
-      {data1: '水东街道3', status: '已接通', data2: '谭景津', data3: '谭大大'},
-      {data1: '水东街道4', status: '未应答', data2: '谭景津', data3: '谭大大'},
-      {data1: '水东街道5', status: '未应答', data2: '谭景津', data3: '谭大大'},
+    begin_time: '2024-10-22 12:36:09',
+    end_time: '2024-10-23 12:36:09',
+    duration_time: '24:00:00',
+    ack_count: 10,
+    unack_count: 10,
+    call_status: 1,
+    items: [
+      {dept_name: '水东街道1', ack_status: 0, onduty_leader: '谭景津', onduty_user: '谭大大'},
+      {dept_name: '水东街道2', ack_status: 2, onduty_leader: '谭景津', onduty_user: '谭大大'},
+      {dept_name: '水东街道3', ack_status: 1, onduty_leader: '谭景津', onduty_user: '谭大大'},
+      {dept_name: '水东街道4', ack_status: 0, onduty_leader: '谭景津', onduty_user: '谭大大'},
+      {dept_name: '水东街道5', ack_status: 0, onduty_leader: '谭景津', onduty_user: '谭大大'},
     ]
   }
-  if (!timer && detailsData.value.status !== '0') {
-    timer = setInterval(calculateDuration, 1000)
-  }
+  */
+  getCallDetail({call_id: id.value}).then((res)=>{
+    detailsData.value = res.data;
+    if (!timer && detailsData.value.call_status === 1) {
+      timer = setInterval(calculateDuration, 1000)
+    }
+    console.log(detailsData.value.begin_time)
+  })
 };
 const getClass = (value) => {
   let res = '';
@@ -155,7 +161,8 @@ const getClass = (value) => {
 };
 const calculateDuration = () => {
   // 将起始时间字符串转换为日期对象
-  const startTime = new Date(detailsData.value.time1);
+  const startTime = new Date(detailsData.value.begin_time);
+  
 
   // 获取当前时间作为结束时间
   const endTime = new Date();
@@ -175,7 +182,6 @@ const calculateDuration = () => {
 
   // 格式化时间为 HH:MM:SS
   const formattedDuration = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
-
   // 返回格式化的持续时间
   durationTime.value = formattedDuration;
 };
@@ -183,15 +189,29 @@ const calculateDuration = () => {
 const handleEnd = () => {
   showConfirmDialog({
     title: '提示',
-    message: '是否确定结束点名?',
+    message: '是否确定结束点名 ?',
   }).then(() => {
-    console.log('结束');
+    endCall({call_id: id.value}).then((res)=>{
+      showToast({type: 'success', message: res.msg, onClose:()=>{
+        initData();
+        }});
+    })
   });
 };
+
+const handleVideo = (url) => {
+  showToast("对接融合通信后发起视频 video:"+url);
+}
+
+const handleCall = (url) => {
+  showToast("对接融合通信后发起电话 tel:"+url);
+}
+
 onMounted(() => {
   id.value = route.query.id;
   initData();
 })
+
 onUnmounted(() => {
   if (!!timer) {
     clearInterval(timer)

+ 48 - 13
src/views/onlineRollCall/rollCallRecord.vue

@@ -23,11 +23,11 @@
         <div class="data-box1">
           <div class="data-item">
             <i class="icon1" />
-            <div class="text1">点名开始时间:{{ item.time1 }}</div>
+            <div class="text1">点名开始时间:{{ item.begin_time }}</div>
           </div>
           <div class="data-item">
             <i class="icon2" />
-            <div class="text1">点名结束时间:{{item.time2}}</div>
+            <div class="text1">点名结束时间:{{item.end_time || "未结束"}}</div>
           </div>
         </div>
         <div class="btn" @click="handleToDetails(item.id)">查看详情</div>
@@ -35,15 +35,15 @@
       <div class="line2">
         <div class="data-item1">
           <div class="text1">点名时长</div>
-          <div class="text2">{{ item.time3 }}</div>
+          <div class="text2">{{ item.duration_time }}</div>
         </div>
         <div class="data-item2">
           <div class="text1">已应答</div>
-          <div class="text2">{{ item.data1 }}</div>
+          <div class="text2">{{ item.ack_count }}</div>
         </div>
         <div class="data-item3">
           <div class="text1">未应答</div>
-          <div class="text2">{{ item.data2 }}</div>
+          <div class="text2">{{ item.unack_count }}</div>
         </div>
       </div>
     </div>
@@ -53,18 +53,23 @@
 </template>
 
 <script lang="ts" setup name="rollCallRecord">
-import {onMounted, onUnmounted, reactive, ref} from "vue";
+import {onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
 import closeImg from "@/assets/images/close.png";
 import searchImg from "@/assets/images/search.png";
 import {parseTime} from "@/utils/ruoyi";
 import {useRouter} from "vue-router";
+import {getCallList} from "@/api/onlineRollCall";
 
 const router = useRouter();
-const queryParams = reactive({
-  page: 0,
-  page_size: 15,
-  dateRange: []
+const data = reactive({
+  queryParams: {
+    page: 0,
+    page_size: 10,
+    begin_date: '',
+    end_date: ''
+  }
 });
+const {queryParams} = toRefs(data);
 const total = ref(0);
 const loading = ref(false);
 const error = ref(false);
@@ -77,12 +82,15 @@ const onConfirm = (data) => {
   show.value = false;
   const startDate = parseTime(data[0], '{y}-{m}-{d}');
   const endDate = parseTime(data[1], '{y}-{m}-{d}');
-  queryParams.dateRange = [startDate, endDate];
+  queryParams.value.begin_date = startDate;
+  queryParams.value.end_date = endDate;
   dateRangeText.value = startDate + '至' + endDate;
   getList();
 }
 const handleClear = () => {
-  queryParams.dateRange = [];
+  queryParams.value.page = 0;
+  queryParams.value.begin_date = '';
+  queryParams.value.end_date = '';
   dateRangeText.value = '';
   getList();
 }
@@ -114,10 +122,36 @@ const calculateDuration = (startTimeStr) => {
 };
 const updateTime = () => {
   dataList.value.forEach((item) => {
-    item.time3 = calculateDuration(item.time1);
+    if(item.call_status == 1)
+      item.duration_time = calculateDuration(item.begin_time);
+    else
+      item.duration_time = item.duration_time;
   })
 }
 const getList = () => {
+  queryParams.value.page++;
+  getCallList(queryParams.value)
+      .then((res) => {
+        var items = res.data || [];
+        total.value = res.total;
+        if (queryParams.value.page == 1) {
+          dataList.value = [];
+        }
+        items.forEach(val => {
+          dataList.value.push(val)
+        });
+        if (queryParams.value.page_size * queryParams.value.page >= total.value) {
+          finished.value = true;
+        } else {
+          finished.value = false;
+        }
+      }).catch(() => {
+    error.value = true;
+    finished.value = false;
+  }).finally(() => {
+    loading.value = false;
+  });
+  /*
   dataList.value = [
     { id: 1, time1: '2024-10-22 11:10:08', time2: '2024-10-22 12:00:00', time3: '00:01:06', data1: 23, data2: 12 },
     { id: 2, time1: '2024-10-22 11:10:08', time2: '2024-10-22 12:00:00', time3: '00:01:06', data1: 23, data2: 12 },
@@ -130,6 +164,7 @@ const getList = () => {
   loading.value = false;
   finished.value = true;
   total.value = 7;
+  */
   if (!timer) {
     timer = setInterval(updateTime, 1000)
   }

+ 18 - 5
src/views/onlineRollCall/spotCheckUnits.vue

@@ -36,8 +36,8 @@ import {onMounted, reactive, ref, watch} from "vue";
 import {useRoute, useRouter} from "vue-router";
 import searchImg from "@/assets/images/search.png";
 import closeImg from "@/assets/images/close.png";
-import {getPhoneList} from "@/api/onlineRollCall";
-import {showFailToast} from "vant";
+import {dept_by_key, create_by_dept_ids} from "@/api/onlineRollCall";
+import {showFailToast, showToast, showConfirmDialog} from "vant";
 
 const route = useRoute();
 const router = useRouter();
@@ -61,7 +61,7 @@ let treeRef = ref();
 let treeData = ref([]);
 let checkData = ref([]);
 const getList = () => {
-  getPhoneList().then((res) => {
+  dept_by_key({"area_name": key.value, "keyword": keyword.value}).then((res) => {
     treeData.value = res.data;
   })
 }
@@ -76,11 +76,13 @@ const handleCheckChange = () => {
   const data = [];
   const treeData = treeRef.value.getCheckedNodes(false, false);
   treeData.forEach((item) => {
+    data.push(item.id);
+    /*
     if (!item.deptType) {
       if (!data.some((obj) => obj.id === item.id)) {
         data.push(item);
       }
-    }
+    }*/
   });
   checkData.value = data;
 };
@@ -92,7 +94,18 @@ const handleCancel = () => {
 }
 const handleConfirm = () => {
   if (checkData.value.length > 0) {
-    router.push({ name : 'RollCallDetails', query: { id: 'test' }})
+    showConfirmDialog({
+      title: '提示',
+      message: '确认点名?'
+    })
+    .then(() => {
+      create_by_dept_ids({depts: checkData.value, remark:''}).then((res) => {
+        showToast({type: 'success', message: res.msg, onClose:()=>{
+          router.push({ name : 'RollCallDetails', query: { id: res.data }})
+        }});
+      })
+    })
+    // router.push({ name : 'RollCallDetails', query: { id: 'test' }})
   } else {
     showFailToast('请先选择点名单位')
   }