Răsfoiți Sursa

车辆排班对接

liwei19941102 2 ani în urmă
părinte
comite
55d2a42505

+ 2 - 2
src/assets/json/table.json

@@ -5,7 +5,7 @@
 		"text": "管理",
 		"func": "updateObj"
 	}, {
-		"type": "primary",
+		"type": "danger",
 		"text": "删除",
 		"func": "deleteObj"
 	}],
@@ -38,7 +38,7 @@
 		"text": "管理",
 		"func": "updateObj"
 	}, {
-		"type": "primary",
+		"type": "danger",
 		"text": "删除",
 		"func": "deleteObj"
 	}],

+ 26 - 3
src/components/Public/table.vue

@@ -16,6 +16,13 @@
                 </span>
             </template>
 
+            <template #default="scope" v-if="item.isTemplateJsonFormat">
+                <span>
+                    {{ getJsonDataFormat(item.func,scope.row, item.pprop, item.prop) }}
+                    <!-- {{ eval(item.prop)}} -->
+                </span>
+            </template>
+
             <template #default="scope" v-if="item.isTemplateTag">
                 <div style="display: flex;flex-direction: row;">
                     <dict-tag :options="energy_type" :value="getObjectData(scope.row.ext1, 'energyType')" />
@@ -60,7 +67,7 @@ const props = defineProps({
 
 const buttons = ref([
     { type: 'primary', text: '管理', func: "handleUpdate" },
-    { type: 'primary', text: '删除' },
+    { type: 'danger', text: '删除' },
 ])
 
 const emit = defineEmits(['childToParent', "childFormat"]);
@@ -82,6 +89,23 @@ const getData = (str, data, prop, pprop) => {
     return value
 }
 
+const getJsonDataFormat = (str, data, prop, pprop) =>{
+    let value = "";
+    let obj = {
+        func: str,
+        data: data,
+        prop: prop,
+        pprop:pprop,
+    }
+    console.log(obj)
+    emit('childFormat', {
+        data: obj, fn: (i) => {
+            value = i
+        }
+    })
+    return value
+}
+
 const getObjectData = (data, prop) => {
     var obj = JSON.parse(data);
     return eval("obj." + prop)
@@ -93,7 +117,6 @@ const getJsonData = (data, pprop, prop) => {
 }
 
 const setDataList = (data) => {
-    console.log(data)
     tableData.value = data
 }
 
@@ -120,6 +143,6 @@ defineExpose({
 })
 
 onMounted(() => {
-    console.log(props.showButton)
+
 });
 </script>

+ 1 - 1
src/views/car/examine/inout.vue

@@ -7,7 +7,7 @@
                     <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
                         <el-form-item label="时间" prop="carNum">
                             <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts"
-                                range-separator="To" start-placeholder="Start date" end-placeholder="End date" />
+                                range-separator="To" start-placeholder="开始时间" end-placeholder="结束时间" />
                         </el-form-item>
                         <el-form-item label="网格" prop="carNum">
                             <el-input v-model="queryParams.carNum" placeholder="请输入车牌号" clearable style="width: 160px"

+ 2 - 2
src/views/car/warring/index.vue

@@ -15,7 +15,7 @@
                         </el-form-item> -->
                         <el-form-item label="时间" prop="carNum">
                             <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts"
-                                range-separator="至" start-placeholder="Start date" end-placeholder="End date" />
+                                range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
                         </el-form-item>
                     </el-form>
                 </div>
@@ -181,7 +181,7 @@ const getList = async () => {
     }
     var buttons = [
         { type: 'primary', text: '核销', func: "goAdd" },
-        { type: 'primary', text: '删除', func: "goAdd" },
+        { type: 'danger', text: '删除', func: "goAdd" },
     ]
     table.value.setDataList(res.rows);
     table.value.setButton(buttons);

+ 54 - 22
src/views/car/work/addCarWork.vue

@@ -26,7 +26,7 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-input v-model="initFormData.carNum" placeholder="请输入作业名称" />
+                                <el-input v-model="form.name" placeholder="请输入作业名称" />
                             </div>
                         </el-descriptions-item>
                         <el-descriptions-item>
@@ -37,9 +37,9 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-select v-model="value" class="m-2" placeholder="Select" style="width: 240px">
-                                    <el-option v-for="item in options" :key="item.value" :label="item.label"
-                                        :value="item.value" />
+                                <el-select v-model="extObj.type" class="m-2" placeholder="请选择作业类型" style="width: 240px">
+                                    <el-option v-for="item in workTypeList" :key="item.dictValue" :label="item.dictLabel"
+                                        :value="item.dictValue" />
                                 </el-select>
                             </div>
                         </el-descriptions-item>
@@ -51,10 +51,7 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-select v-model="value" class="m-2" placeholder="Select" style="width: 240px">
-                                    <el-option v-for="item in options" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
+                                <el-input v-model="extObj.wangge" placeholder="请输入网格" />
                             </div>
                         </el-descriptions-item>
 
@@ -68,7 +65,8 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-select v-model="carObj" value-key="id" class="m-2" placeholder="Select" style="width: 240px">
+                                <el-select v-model="carObj" value-key="id" class="m-2" placeholder="请选择车辆"
+                                    style="width: 240px">
                                     <el-option v-for="item in carInfoList" :key="item.id" :label="item.carNum"
                                         :value="item" />
                                 </el-select>
@@ -82,9 +80,9 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-select v-model="driver" value-key="id" class="m-2" placeholder="Select" style="width: 240px">
-                                    <el-option v-for="item in sjList" :key="item.id" :label="item.nickName"
-                                        :value="item" />
+                                <el-select v-model="form.driverInfo" class="m-2" placeholder="请选择司机" style="width: 240px">
+                                    <el-option v-for="item in sjList" :key="item.userId" :label="item.nickName"
+                                        :value="item.userId" />
                                 </el-select>
                             </div>
                         </el-descriptions-item>
@@ -96,9 +94,10 @@
                                 </div>
                             </template>
                             <div class="content-w">
-                                <el-select v-model="ck" value-key="id" class="m-2" placeholder="Select" style="width: 240px">
-                                    <el-option v-for="item in ckList" :key="item.id" :label="item.nickName"
-                                        :value="item" />
+                                <el-select v-model="form.attendantInfo" class="m-2" placeholder="请选择跟车人员"
+                                    style="width: 240px">
+                                    <el-option v-for="item in ckList" :key="item.userId" :label="item.nickName"
+                                        :value="item.userId" />
                                 </el-select>
                             </div>
                         </el-descriptions-item>
@@ -126,7 +125,7 @@
                             :hollow="activity.hollow">
                             <!-- {{ activity.content }} -->
                             <div style="display: flex;flex-direction: column;" v-show="!activity.isadd">
-                                <div>{{ activity.content }}</div>
+                                <div v-if="activity.rank == 1 || activity.rank == 999">{{ activity.content }}</div>
                                 <div v-if="activity.data != null">{{ activity.data.dictLabel }}</div>
                                 <div v-if="activity.timeObj != null">{{ activity.timeObj.startTime }}-{{
                             activity.timeObj.endTime }}</div>
@@ -180,6 +179,7 @@ import { CarInfoVO, CarInfoQuery, CarInfoForm } from '@/api/carInfo/types';
 import tableElm from "@/components/Public/table.vue";
 import mapDiv from "@/components/Map/index.vue"
 import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role";
+import { getDicts } from '@/api/system/dict/data'
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -198,14 +198,21 @@ const siteId = ref(0);
 const timeId = ref(0);
 const timeData = ref();
 const carInfoList = ref<CarInfoVO[]>([])
+const type = ref(null)
+const workTypeList = ref([])
 
 const queryFormRef = ref<ElFormInstance>();
 const carPathFormRef = ref<ElFormInstance>();
+const extObj = ref({
+    type:null,
+    wangge:null
+})
 
 const sjList = ref([])
 const driver = ref(null)
 const ckList = ref([])
 const ck = ref(null)
+const wangge = ref(null)
 
 
 
@@ -338,20 +345,44 @@ const columns = ref([
 
 const table = ref(tableElm)
 
-const submit = () => {
+const submit = async() => {
     console.log(carObj.value);
-    console.log(driver.value);
-    console.log(ck.value)
+    var dataList = [];
+    for(var index in activities.value){
+         if(!activities.value[index].isadd){
+            dataList.push(activities.value[index]);
+         }
+    }
+    form.value.stationList = JSON.stringify(dataList);
+    form.value.ext2 = JSON.stringify(extObj.value)
+    form.value.ext1 = JSON.stringify(carObj.value);
+    console.log(form.value);
+    if (form.value.id) {
+        await updateCarPath(form.value).finally(() => buttonLoading.value = false);
+    } else {
+        await addCarPath(form.value).finally(() => buttonLoading.value = false);
+    }
+    proxy?.$modal.msgSuccess("修改成功");
+    dialog.visible = false;
 }
 
+
+const getDictsData = (param, obj) => {
+  getDicts(param).then(res => {
+    obj.value = res.data;
+  })
+}
+
+
 const getUserList = async () => {
     loading.value = true;
-    const res = await allocatedUserList({pageSize:1000,roleId:'1763484881548447746'});
+    const res = await allocatedUserList({ pageSize: 1000, roleId: '1763484881548447746' });
     sjList.value = res.rows
+    console.log(sjList.value)
     loading.value = true;
-    const ckres = await allocatedUserList({pageSize:1000,roleId:'1763484977044361217'});
+    const ckres = await allocatedUserList({ pageSize: 1000, roleId: '1763484977044361217' });
     ckList.value = ckres.rows
-    console.log(res)
+    console.log(ckList.value)
 }
 
 const addSite = () => {
@@ -394,6 +425,7 @@ const getcarInfoList = async () => {
 }
 
 onMounted(() => {
+    getDictsData('work_type', workTypeList);
     getcarInfoList();
     getUserList();
 });

+ 125 - 49
src/views/car/work/carWork.vue

@@ -1,46 +1,49 @@
 <template>
-    <div class="p-2">
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-            :leave-active-class="proxy?.animate.searchAnimate.leave">
-            <div class="search" v-show="showSearch" style="display: flex;flex-direction: row;">
-                <div style="width: 85%;">
-                    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
-                        <el-form-item label="车牌号" prop="carNum">
-                            <el-input v-model="queryParams.carNum" placeholder="请输入车牌号" clearable style="width: 160px"
-                                @keyup.enter="handleQuery" />
-                        </el-form-item>
-                        <el-form-item label="站点" prop="carNum">
-                            <el-input v-model="queryParams.carNum" placeholder="请输入车牌号" clearable style="width: 160px"
-                                @keyup.enter="handleQuery" />
-                        </el-form-item>
-                        <el-form-item label="时间" prop="carNum">
-                            <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts"
-                                range-separator="To" start-placeholder="Start date" end-placeholder="End date" />
-                        </el-form-item>
-                    </el-form>
-                </div>
-                <div style="width: 15%;">
-                    <el-form-item>
-                        <el-button type="primary" @click="goadd">新增</el-button>
-                        <el-button type="primary" @click="resetQuery">查询</el-button>
-                    </el-form-item>
-                </div>
-            </div>
-        </transition>
-        <el-card shadow="never">
-
-            <tableElm :columns="columns" ref="table"></tableElm>
-
-            <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
-                v-model:limit="queryParams.pageSize" @pagination="getList" />
-        </el-card>
-    </div>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div class="search" v-show="showSearch" style="display: flex;flex-direction: row;">
+        <div style="width: 85%;">
+          <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
+            <el-form-item label="车牌号" prop="carNum">
+              <el-input v-model="queryParams.carNum" placeholder="请输入车牌号" clearable style="width: 160px"
+                @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="站点" prop="carNum">
+              <el-input v-model="queryParams.carNum" placeholder="请输入车牌号" clearable style="width: 160px"
+                @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="时间" prop="carNum">
+              <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts" range-separator="To"
+                start-placeholder="开始时间" end-placeholder="结束时间" />
+            </el-form-item>
+          </el-form>
+        </div>
+        <div style="width: 15%;">
+          <el-form-item>
+            <el-button type="primary" @click="goadd">新增</el-button>
+            <el-button type="primary" @click="resetQuery">查询</el-button>
+          </el-form-item>
+        </div>
+      </div>
+    </transition>
+    <el-card shadow="never">
+
+      <tableElm @childFormat="childFormat" :columns="columns" ref="table"></tableElm>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+  </div>
 </template>
 
 <script setup name="CarPath" lang="ts">
+import api from "@/api/system/user"
+import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
 import { listCarPath, getCarPath, delCarPath, addCarPath, updateCarPath } from '@/api/carPath';
 import { CarPathVO, CarPathQuery, CarPathForm } from '@/api/carPath/types';
 import tableElm from "@/components/Public/table.vue";
+import { getDicts } from '@/api/system/dict/data'
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -48,6 +51,7 @@ const route = useRoute();
 const router = useRouter();
 
 const carPathList = ref<CarPathVO[]>([]);
+const userList = ref<UserVO[]>();
 const buttonLoading = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
@@ -55,6 +59,7 @@ const ids = ref<Array<string | number>>([]);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
+const workTypeList = ref([])
 
 const queryFormRef = ref<ElFormInstance>();
 const carPathFormRef = ref<ElFormInstance>();
@@ -76,7 +81,7 @@ const initFormData: CarPathForm = {
   ext2: undefined
 }
 const data = reactive<PageData<CarPathForm, CarPathQuery>>({
-  form: {...initFormData},
+  form: { ...initFormData },
   queryParams: {
     pageNum: 1,
     pageSize: 10,
@@ -122,13 +127,13 @@ const data = reactive<PageData<CarPathForm, CarPathQuery>>({
 });
 
 const columns = ref([
-    // {label: '上层位置', prop: 'v', visible: true},
-    { label: '车牌', prop: 'carNum',pprop:"ext1",visible: true, isTemplate: false,isTemplateJson:true },
-    { label: '作业名称', prop: 'name', pprop: "ext1", visible: true, isTemplate: false },
-    { label: '作业类型', prop: 'ext2', pprop: "ext1", visible: true, isTemplate: false,},
-    { label: '网格', prop: 'wangge', pprop: "ext1", visible: true, isTemplate: false, },
-    { label: '跟车人员', prop: 'gpeople', pprop: "ext1", visible: true, isTemplate: false,  },
-    { label: '驾驶员、联系方式', prop: 'people', pprop: "ext1", visible: true, isTemplate: false, },
+  // {label: '上层位置', prop: 'v', visible: true},
+  { label: '车牌', prop: 'carNum', pprop: "ext1", visible: true, isTemplate: false, isTemplateJson: true },
+  { label: '作业名称', prop: 'name', pprop: "ext1", visible: true, isTemplate: false },
+  { label: '作业类型', prop: 'type', pprop: "ext2", func: "getWorkType", visible: true, isTemplate: false, isTemplateJsonFormat: true },
+  { label: '网格', prop: 'wangge', pprop: "ext2", visible: true, isTemplate: false, isTemplateJson: true},
+  { label: '跟车人员', prop: 'attendantInfo', visible: true, isTemplate: true, func: "getattend" },
+  { label: '驾驶员、联系方式', prop: 'driverInfo', visible: true, isTemplate: true, func: "getDriverTable" },
 ])
 
 const { queryParams, form, rules } = toRefs(data);
@@ -144,15 +149,76 @@ const getList = async () => {
   loading.value = false;
 }
 
+const getWorkType = (value) => {
+  for (var index in workTypeList.value) {
+    if (workTypeList.value[index].dictValue == value) {
+      console.log(workTypeList.value[index].dictLabel)
+      return workTypeList.value[index].dictLabel
+    }
+  }
+}
+
+const getDictsData = (param, obj) => {
+  getDicts(param).then(res => {
+    obj.value = res.data;
+  })
+}
+
+
+
+const childFormat = ({ data, fn }) => {
+  if (data.pprop != null) {
+    var ext = data.data[data.prop]
+    if (ext != null) {
+      var obj = JSON.parse(ext);
+      var value = obj[data.pprop]
+      var data = eval(data.func + "(value)")
+      fn(data)
+    }
+  } else {
+    var value = data.data[data.prop]
+    var data = eval(data.func + "(value)")
+    fn(data)
+  }
+
+  //   return data
+}
+
+
+const getattend = (value) =>{
+      for(var index in userList.value){
+                if(userList.value[index].userId == value){
+                      return userList.value[index].nickName;
+                }
+      }
+}
+
+const getDriverTable = (value) =>{
+      for(var index in userList.value){
+                if(userList.value[index].userId == value){
+                      return userList.value[index].nickName + "("+userList.value[index].phonenumber+")";
+                }
+      }
+}
+
 /** 取消按钮 */
 const cancel = () => {
   reset();
   dialog.visible = false;
 }
 
+const getUserList = async () => {
+  api.listUser({ pageSize: 1000 }).then(res => {
+    console.log(res.rows)
+    userList.value = res.rows;
+    console.log(userList.value)
+  });
+
+}
+
 /** 表单重置 */
 const reset = () => {
-  form.value = {...initFormData};
+  form.value = { ...initFormData };
   carPathFormRef.value?.resetFields();
 }
 
@@ -168,6 +234,7 @@ const resetQuery = () => {
   handleQuery();
 }
 
+
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: CarPathVO[]) => {
   ids.value = selection.map(item => item.id);
@@ -198,9 +265,9 @@ const submitForm = () => {
     if (valid) {
       buttonLoading.value = true;
       if (form.value.id) {
-        await updateCarPath(form.value).finally(() =>  buttonLoading.value = false);
+        await updateCarPath(form.value).finally(() => buttonLoading.value = false);
       } else {
-        await addCarPath(form.value).finally(() =>  buttonLoading.value = false);
+        await addCarPath(form.value).finally(() => buttonLoading.value = false);
       }
       proxy?.$modal.msgSuccess("修改成功");
       dialog.visible = false;
@@ -227,10 +294,19 @@ const handleExport = () => {
 
 
 const goadd = () => {
-    router.push("/car/work/addWork")
+  router.push("/car/work/addWork")
 }
 
-onMounted(() => {
+const initData = async () => {
+  await getDictsData('work_type', workTypeList);
+  await getUserList();
   getList();
+}
+
+onMounted(() => {
+  initData()
 });
+
+
+
 </script>

+ 1 - 1
src/views/car/work/index.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="p-2">
         <el-tabs type="card" class="demo-tabs" active-name="1">
-            <el-tab-pane label="车辆作业" name="1">
+            <el-tab-pane label="车辆路线" name="1">
                   <carWork></carWork>
             </el-tab-pane>
             <el-tab-pane label="车辆排班" name="2">

+ 1 - 1
src/views/car/work/peopleLeave.vue

@@ -7,7 +7,7 @@
                     <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
                         <el-form-item label="时间" prop="carNum">
                             <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts"
-                                range-separator="To" start-placeholder="Start date" end-placeholder="End date" />
+                                range-separator="To" start-placeholder="开始时间" end-placeholder="结束时间" />
                         </el-form-item>
                         <el-form-item label="状态" prop="carNum">
                             <el-select v-model="value" class="m-2" placeholder="Select" style="width: 240px">

+ 303 - 201
src/views/car/work/schedule.vue

@@ -1,57 +1,93 @@
 <template>
-    <div style="display: flex;flex-direction: row;" class="custom-calendar">
-        <el-card shadow="never" style="width: 30%;">
-            <el-calendar style="font-size: 10px;">
-                <template slot="dateCell" #date-cell="{ data }">
-                    <p :class="data.isSelected ? 'is-selected' : ''">
-                        {{ data.day.split('-').slice(1)[1] }}
-                        <!-- {{ data.isSelected ? '✔️' : '' }} -->
-                    </p>
-                    <div></div>
-                </template>
-            </el-calendar>
-            <div>注:</div>
-            <div style="display: flex;flex-direction: row;margin-top: 5px;">
-                <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #FFC55F;"></div>
-                <div
-                    style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
-                    存在未设置完成的</div>
-            </div>
-            <div style="display: flex;flex-direction: row;margin-top: 5px;">
-                <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #FF8784;"></div>
-                <div
-                    style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
-                    未排班</div>
-            </div>
-            <div style="display: flex;flex-direction: row;margin-top: 5px;">
-                <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #538FFF;"></div>
-                <div
-                    style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
-                    已排班</div>
-            </div>
-        </el-card>
-        <el-card shadow="never" style="width: 68%;margin-left: 1%;">
-
-            <tableElm :columns="columns" ref="table"></tableElm>
-
-            <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
-                v-model:limit="queryParams.pageSize" @pagination="getList" />
-        </el-card>
-    </div>
+  <div style="display: flex;flex-direction: row;" class="custom-calendar">
+    <el-card shadow="never" style="width: 30%;">
+      <el-calendar v-model="selectDate" style="font-size: 10px;">
+        <template slot="dateCell" #date-cell="{ data }">
+          <div>
+            <p :class="data.isSelected ? 'is-selected' : ''">
+              {{ data.day.split('-').slice(1)[1] }}
+              <!-- {{ data.isSelected ? '✔️' : '' }} -->
+            </p>
+            <div></div>
+          </div>
+        </template>
+      </el-calendar>
+      <div>注:</div>
+      <div style="display: flex;flex-direction: row;margin-top: 5px;">
+        <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #FFC55F;"></div>
+        <div
+          style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
+          存在未设置完成的</div>
+      </div>
+      <div style="display: flex;flex-direction: row;margin-top: 5px;">
+        <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #FF8784;"></div>
+        <div
+          style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
+          未排班</div>
+      </div>
+      <div style="display: flex;flex-direction: row;margin-top: 5px;">
+        <div style="width: 18.17px;height: 18.17px;border-radius: 9.5px;opacity: 1;background: #538FFF;"></div>
+        <div
+          style="font-family: Poppins;font-size: 13px;font-weight: normal;line-height: 16px;letter-spacing: 0px;color: #9CB2CD;margin-left: 10px;">
+          已排班</div>
+      </div>
+      <div style="text-align: center;margin-top: 2vh;"><el-button type="primary" text
+          @click="addSchedule">新增排班</el-button>
+      </div>
+    </el-card>
+    <el-card shadow="never" style="width: 68%;margin-left: 1%;">
+
+      <tableElm @childFormat="childFormat" :columns="columns" ref="table"></tableElm>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="carInfoFormRef" :model="dateObj" :rules="rules" label-width="80px">
+        <el-form-item label="路线">
+          <el-select v-model="line" placeholder="请选择路线" style="width: 240px" @change="changeSelect">
+            <el-option v-for="item in carPathList" :key="item.id" :label="item.name" :value="item.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="司机">
+          <el-select v-model="formParams.driverInfo" placeholder="请选择司机" style="width: 240px">
+            <el-option v-for="item in sjList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="跟车人员">
+          <el-select v-model="formParams.attendantInfo" placeholder="请选择跟车人员" style="width: 240px">
+            <el-option v-for="item in ckList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitSchedule">确 定</el-button>
+          <el-button @click="dialog.visible = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
 </template>
 
-<script setup name="CarInfo" lang="ts">
+
+<script setup name="CarSchedule" lang="ts">
+import api from "@/api/system/user"
+import { listCarSchedule, getCarSchedule, delCarSchedule, addCarSchedule, updateCarSchedule } from '@/api/carSchedule';
+import { CarScheduleVO, CarScheduleQuery, CarScheduleForm } from '@/api/carSchedule/types';
+import { listCarPath, getCarPath, delCarPath, addCarPath, updateCarPath } from '@/api/carPath';
 import { listCarInfo, getCarInfo, delCarInfo, addCarInfo, updateCarInfo } from '@/api/carInfo';
 import { CarInfoVO, CarInfoQuery, CarInfoForm } from '@/api/carInfo/types';
 import tableElm from "@/components/Public/table.vue";
+import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role";
 import { useRoute, useRouter } from "vue-router";
-
-const route = useRoute();
-const router = useRouter();
+import moment from 'moment';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
-const carInfoList = ref<CarInfoVO[]>([]);
+const carScheduleList = ref<CarScheduleVO[]>([]);
 const buttonLoading = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
@@ -59,223 +95,289 @@ const ids = ref<Array<string | number>>([]);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
-const value2 = ref('')
+const sjList = ref([]);
+const ckList = ref([]);
+const carPathList = ref([]);
+const line = ref(null);
+const carPathObj = ref(null)
 
 const queryFormRef = ref<ElFormInstance>();
-const carInfoFormRef = ref<ElFormInstance>();
-
+const carScheduleFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
+  visible: false,
+  title: ''
 });
 
+const initFormData: CarScheduleForm = {
+  id: undefined,
+  pathInfo: undefined,
+  scheduleDate: undefined,
+  carNum: undefined
+}
+
+const selectDate = ref<Date>(null)
+
+const stopWatch = watch(selectDate, (newVal, oldVal) => {
+  initList(newVal)
+})
+
 const table = ref(tableElm)
 
-const times = ref([""])
+const formParams = ref({
+  driverInfo: null,
+  attendantInfo: null
+});
+
+const data = reactive<PageData<CarScheduleForm, CarScheduleQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    pathInfo: undefined,
+    scheduleDate: undefined,
+    carNum: undefined,
+    params: {
+    }
+  },
+  rules: {
+    id: [
+      { required: true, message: "编号不能为空", trigger: "blur" }
+    ],
+    pathInfo: [
+      { required: true, message: "路线信息不能为空", trigger: "blur" }
+    ],
+    scheduleDate: [
+      { required: true, message: "排班时间即路线开始时间不能为空", trigger: "blur" }
+    ],
+    carNum: [
+      { required: true, message: "车牌不能为空", trigger: "blur" }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
 
 const columns = ref([
-    // {label: '上层位置', prop: 'v', visible: true},
-    { label: '车牌号', prop: 'carNum', visible: true, isTemplate: false },
-    { label: '作业时间', prop: 'workTime', visible: true, isTemplate: false, },
-    { label: '跟车人员', prop: 'gpeople', pprop: "ext1", visible: true, isTemplate: false, },
-    { label: '驾驶员、联系方式', prop: 'people', pprop: "ext1", visible: true, isTemplate: false, },
+  // {label: '上层位置', prop: 'v', visible: true},
+  { label: '车牌号', prop: 'carNum', visible: true, isTemplate: false },
+  { label: '作业时间', prop: 'scheduleDate', visible: true, isTemplate: false, },
+  { label: '跟车人员', prop: 'attendantInfo', pprop: "pathInfo", visible: true, isTemplateJsonFormat: true, func: "getattend" },
+  { label: '驾驶员、联系方式', prop: 'driverInfo', pprop: "pathInfo", visible: true, isTemplateJsonFormat: true, func: "getDriverTable" },
 ])
 
-const initFormData: CarInfoForm = {
-    id: undefined,
-    carNum: undefined,
-    carType: undefined,
-    deviceInfos: undefined,
-    repairInfo: undefined,
-    maintenanceInfo: undefined,
-    insuranceInfo: undefined,
-    inspectionInfo: undefined,
-    trafficAccidentInfo: undefined,
-    violationInfo: undefined,
-    changeInfo: undefined,
-    ext1: undefined,
-    ext2: undefined
+const addSchedule = () => {
+  dialog.visible = true
+}
+
+const getUserList = async () => {
+  loading.value = true;
+  const res = await allocatedUserList({ pageSize: 1000, roleId: '1763484881548447746' });
+  sjList.value = res.rows
+  console.log(sjList.value)
+  loading.value = true;
+  const ckres = await allocatedUserList({ pageSize: 1000, roleId: '1763484977044361217' });
+  ckList.value = ckres.rows
+  console.log(ckList.value)
 }
-const data = reactive<PageData<CarInfoForm, CarInfoQuery>>({
-    form: { ...initFormData },
-    queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        carNum: undefined,
-        carType: undefined,
-        deviceInfos: undefined,
-        repairInfo: undefined,
-        maintenanceInfo: undefined,
-        insuranceInfo: undefined,
-        inspectionInfo: undefined,
-        trafficAccidentInfo: undefined,
-        violationInfo: undefined,
-        changeInfo: undefined,
-        ext1: undefined,
-        ext2: undefined,
-        params: {
-        }
-    },
-    rules: {
-        id: [
-            { required: true, message: "编号不能为空", trigger: "blur" }
-        ],
-        carNum: [
-            { required: true, message: "车牌号不能为空", trigger: "blur" }
-        ],
-        carType: [
-            { required: true, message: "车类型不能为空", trigger: "change" }
-        ],
-        deviceInfos: [
-            { required: true, message: "所有车载设备信息不能为空", trigger: "blur" }
-        ],
-        repairInfo: [
-            { required: true, message: "维修信息不能为空", trigger: "blur" }
-        ],
-        maintenanceInfo: [
-            { required: true, message: "保养信息不能为空", trigger: "blur" }
-        ],
-        insuranceInfo: [
-            { required: true, message: "保险信息不能为空", trigger: "blur" }
-        ],
-        inspectionInfo: [
-            { required: true, message: "年检信息不能为空", trigger: "blur" }
-        ],
-        trafficAccidentInfo: [
-            { required: true, message: "交通事故信息不能为空", trigger: "blur" }
-        ],
-        violationInfo: [
-            { required: true, message: "违章信息不能为空", trigger: "blur" }
-        ],
-        changeInfo: [
-            { required: true, message: "车辆变更信息不能为空", trigger: "blur" }
-        ],
-        ext1: [
-            { required: true, message: "扩展1不能为空", trigger: "blur" }
-        ],
-        ext2: [
-            { required: true, message: "扩展2不能为空", trigger: "blur" }
-        ]
+
+const getattend = (value) => {
+  for (var index in ckList.value) {
+    if (ckList.value[index].userId == value) {
+      return ckList.value[index].nickName;
     }
-});
+  }
+}
 
-const { queryParams, form, rules } = toRefs(data);
+const getDriverTable = (value) => {
+  for (var index in sjList.value) {
+    if (sjList.value[index].userId == value) {
+      return sjList.value[index].nickName + "(" + sjList.value[index].phonenumber + ")";
+    }
+  }
+}
 
-const goadd = () => {
-    router.push("/car/work/addWork")
+const childFormat = ({ data, fn }) => {
+   console.log(data)
+  if (data.pprop != null) {
+    var ext = data.data[data.prop]
+    if (ext != null) {
+      var obj = JSON.parse(ext);
+      var value = obj[data.pprop]
+      var data = eval(data.func + "(value)")
+      fn(data)
+    }
+  } else {
+    var value = data.data[data.prop]
+    var data = eval(data.func + "(value)")
+    fn(data)
+  }
+  //   return data
 }
 
-/** 查询车辆信息列表 */
+
+/** 查询车及人员排班列表 */
 const getList = async () => {
-    // loading.value = true;
-    // const res = await listCarInfo(queryParams.value);
-    var res = {
-        rows: [
-            {
-                carNum: '苏A69213',
-                workTime: "2024-11-11 12:00:00",
-                workName: "运输钢铁",
-                type: "大件运输",
-                wangge: "仙林",
-                gpeople: "陈武",
-                people: "刘晨(13898219932)"
-
-            }
-        ],
-        total: 12
+  loading.value = true;
+  const res = await listCarSchedule(queryParams.value);
+  carScheduleList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+const changeSelect = (val) => {
+  for (var index in carPathList.value) {
+    if (val == carPathList.value[index].id) {
+      carPathObj.value = carPathList.value[index]
+      formParams.value.driverInfo = carPathList.value[index].driverInfo
+      formParams.value.attendantInfo = carPathList.value[index].attendantInfo
     }
-    table.value.setDataList(res.rows);
-    total.value = res.total;
-    loading.value = false;
+  }
 }
 
 /** 取消按钮 */
 const cancel = () => {
-    reset();
-    dialog.visible = false;
+  reset();
+  dialog.visible = false;
 }
 
 /** 表单重置 */
 const reset = () => {
-    form.value = { ...initFormData };
-    carInfoFormRef.value?.resetFields();
+  form.value = { ...initFormData };
+  carScheduleFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
 const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
+  queryParams.value.pageNum = 1;
+  getList();
 }
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value?.resetFields();
-    handleQuery();
+  queryFormRef.value?.resetFields();
+  handleQuery();
 }
 
 /** 多选框选中数据 */
-const handleSelectionChange = (selection: CarInfoVO[]) => {
-    ids.value = selection.map(item => item.id);
-    single.value = selection.length != 1;
-    multiple.value = !selection.length;
+const handleSelectionChange = (selection: CarScheduleVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
 }
 
 /** 新增按钮操作 */
 const handleAdd = () => {
-    reset();
-    dialog.visible = true;
-    dialog.title = "添加车辆信息";
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加车及人员排班";
 }
 
 /** 修改按钮操作 */
-const handleUpdate = async (row?: CarInfoVO) => {
-    reset();
-    const _id = row?.id || ids.value[0]
-    const res = await getCarInfo(_id);
-    Object.assign(form.value, res.data);
-    dialog.visible = true;
-    dialog.title = "修改车辆信息";
+const handleUpdate = async (row?: CarScheduleVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getCarSchedule(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改车及人员排班";
 }
 
 /** 提交按钮 */
 const submitForm = () => {
-    carInfoFormRef.value?.validate(async (valid: boolean) => {
-        if (valid) {
-            buttonLoading.value = true;
-            if (form.value.id) {
-                await updateCarInfo(form.value).finally(() => buttonLoading.value = false);
-            } else {
-                await addCarInfo(form.value).finally(() => buttonLoading.value = false);
-            }
-            proxy?.$modal.msgSuccess("修改成功");
-            dialog.visible = false;
-            await getList();
-        }
-    });
+  carScheduleFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateCarSchedule(form.value).finally(() => buttonLoading.value = false);
+      } else {
+        await addCarSchedule(form.value).finally(() => buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("修改成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
 }
 
 /** 删除按钮操作 */
-const handleDelete = async (row?: CarInfoVO) => {
-    const _ids = row?.id || ids.value;
-    await proxy?.$modal.confirm('是否确认删除车辆信息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
-    await delCarInfo(_ids);
-    proxy?.$modal.msgSuccess("删除成功");
-    await getList();
+const handleDelete = async (row?: CarScheduleVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除车及人员排班编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delCarSchedule(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
 }
 
 /** 导出按钮操作 */
 const handleExport = () => {
-    proxy?.download('system/carInfo/export', {
-        ...queryParams.value
-    }, `carInfo_${new Date().getTime()}.xlsx`)
+  proxy?.download('system/carSchedule/export', {
+    ...queryParams.value
+  }, `carSchedule_${new Date().getTime()}.xlsx`)
 }
 
+const submitSchedule = async () => {
+  console.log(selectDate.value)
+  var dataList = [];
+  var stationList = JSON.parse(carPathObj.value.stationList)
+  for (var index in stationList) {
+    var obj = {};
+    obj.order = Number(index) + 1
+    obj.location = stationList[index].data.dictValue
+    obj.planInTime = stationList[index].timeObj.startTime + ":00"
+    obj.planOutTime = stationList[index].timeObj.endTime + ":00"
+    obj.stationName = stationList[index].data.dictLabel
+    dataList.push(obj)
+    if (index == 0) {
+      console.log(stationList[index].timeObj.startTime + ":00");
+      var date = moment(selectDate.value).format('YYYY-MM-DD') + ' ' + stationList[index].timeObj.startTime + ":00";
+      form.value.scheduleDate = date;
+    }
+  }
+  var lineobj = formParams.value
+  lineobj.pathLine = dataList
+  form.value.carNum = JSON.parse(carPathObj.value.ext1).carNum
+  form.value.pathInfo = JSON.stringify(lineobj);
+  if (form.value.id) {
+    await updateCarSchedule(form.value).finally(() => buttonLoading.value = false);
+  } else {
+    await addCarSchedule(form.value).finally(() => buttonLoading.value = false);
+  }
+  proxy?.$modal.msgSuccess("修改成功");
+  dialog.visible = false;
+  await getList();
+}
+
+const initData = async () => {
+  getUserList();
+  const res = await listCarPath({ pageSize: 1000 });
+  carPathList.value = res.rows
+}
+
+const initList = (val) => {
+  console.log(val)
+  queryParams.value.params.scheduleDate = moment(val).format('YYYY-MM-DD');
+  listCarSchedule(queryParams.value).then(res => {
+    console.log(res)
+    table.value.setDataList(res.rows);
+    total.value = res.total;
+  })
+}
+
+// const initList = (data) =>{
+//   console.log(data)
+//   var date = data.day;
+//   selectDate.value = data.date;
+//   console.log(selectDate.value)
+// }
+
 onMounted(() => {
-    getList();
+  initData()
 });
 </script>
-<style lang="scss" scoped>::v-deep .el-calendar-table .el-calendar-day {
-    height: 40px;
+<style lang="scss" scoped>
+::v-deep .el-calendar-table .el-calendar-day {
+  height: 40px;
 
-}</style>
+}
+</style>

+ 1 - 1
src/views/yunying/scheduling/index.vue

@@ -23,7 +23,7 @@
                         </el-form-item>
                         <el-form-item label="时间" prop="carNum">
                             <el-date-picker v-model="value2" type="datetimerange" :shortcuts="shortcuts"
-                                range-separator="至" start-placeholder="Start date" end-placeholder="End date" />
+                                range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
                         </el-form-item>
                     </el-form>
                 </div>