vue3 用法汇总(二)

1、列表中鼠标放在不同单元格显示不同的背景颜色

<el-table  
        v-resize:44 
        :data="tableData" 
        class="table marking-table"
        border 
        style='margin: 10px 0px'
        highlight-current-row 
        element-loading-text="数据正在加载中..."
        v-loading='isLoading'
        header-cell-class-name="table-header"
        :cell-style="cellStyle"
        @cell-click="cellClick"
        @selection-change="handleSelectionChange"
        @cell-mouse-enter="mouseEnter"
        @cell-mouse-leave="mouseLeave"
      >
        <el-table-column type="selection" width="55" align="center"/>
        <el-table-column  type="index" label="NO."  width='55px'/>
        <el-table-column prop="lineName" width='100px'  />
        <el-table-column  prop="plateNumber" width='140px'  />
          <!-- <template #default="scope">
            <el-tooltip placement="top" effect="dark" content="点击单元格可编辑" >
               <span>{{scope.row.plateNumber}}</span>
            </el-tooltip>
          </template>
        </el-table-column> -->
        <el-table-column  label="车组人员" align="center">
          <el-table-column prop="personList" width='260px' >
            <template #default="scope">
              <div v-for="(item, index) in scope.row.personList" :key="index">
                {{ item.personName }} - {{ item.position }} 
                <span v-if="item.contactInfo">-{{ item.contactInfo }}</span>
                <span v-else></span>
                <span v-if="item.isMaster"> - (车长)</span>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="pmPersonList" width='260px' >
            <template #default="scope">
              <div v-for="(item, index) in scope.row.pmPersonList" :key="index">
                {{ item.personName }} - {{ item.position }} 
                <span v-if="item.contactInfo">-{{ item.contactInfo }}</span>
                <span v-else></span>
                <span v-if="item.isMaster"> - (车长)</span>
              </div>
            </template>
          </el-table-column>
        </el-table-column>
        <el-table-column  prop="earlyBranch" >
          <template #default="scope">
            <div v-for="(item, index) in scope.row.earlyBranch" :key="index">
               <div> {{ item.branchName }}</div>
            </div>
            <el-tooltip ref="tooltipRef" placement="top"  v-model:visible="visible" :virtual-ref="buttonRef" virtual-triggering >
              <template #content>
                <span>点击单元格可编辑</span>
              </template>
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column  prop="lateBranch">
           <template #default="scope">
              <div v-for="(item, index) in scope.row.lateBranch" :key="index">
                {{ item.branchName }}
              </div>
          </template>
        </el-table-column>
        <el-table-column  prop="selfDevices" >
           <template #default="scope">
              <div v-for="(item, index) in scope.row.selfDevices" :key="index">
                {{ item.branchName }}
              </div>
          </template>
        </el-table-column>
        <el-table-column  prop="doorstep" >
          <template #default="scope">
              <div v-for="(item, index) in scope.row.doorstep" :key="index">
                {{ item.branchName }}
              </div>
          </template>
        </el-table-column>
        <el-table-column prop="tempBranch"  >
           <template #default="scope">
            <div v-for="(item, index) in scope.row.tempBranch" :key="index">
              {{ item.branchName }}
            </div>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="150px" align="center" >
          <template #default="scope">
            <el-button  type="primary"  icon="Stamp" circle plain  @click="handleCar(scope.row)" />
            <el-button  type="success"  :icon="Edit" circle plain @click="handleTask(scope.row)" />
            <el-popconfirm :title="`确定删除这条记录吗`" width="260px" @confirm="delSchedule(scope.row.ids)">
              <template #reference>
                <el-button type="danger" title="删除" icon="Minus" size="small" circle plain></el-button>
              </template>
            </el-popconfirm>
          </template>
        </el-table-column>
      </el-table>
  <!-- 网点调整弹出框 -->
  <branch-adjust  ref="editDialog" v-model:visible="viewState.visible" :title="viewState.title" :taskId="viewState.taskId" @close="closeEdit" />
  <!--人员调整弹出框 -->
  <person-adjust  ref="personDialog" v-model:visible="personState.visible"  @close="closePersonEdit" />

  2、具体方法实现

// 弹框调整页面
import BranchAdjust from "@/views/dispatch/components/branchAdjust.vue"
// 弹框调整页面
import PersonAdjust from "@/views/dispatch/components/personAdjust.vue"

//定义dialog中的值 const viewState = reactive({ visible: false, title: '', taskId:'' })
//人员调整的弹框参数
const personDialog = ref<any>();
// 定义人员弹框中的值
const personState = reactive({
    visible: false,
    title: '',
})
// 单元格样式修改
const cellStyle=(row:any) =>{
  if (selectRow.value === row.row && selectColumn.value === row.column) {
    //点击后的颜色
    return {'background-color':'#a0cfff','color': '#606266', 'font-weight':'bold'}
  } 
  else if (hoverRow.value === row.row &&  hoverColumn.value === row.column){
    return {'cursor':'pointer','background-color':'#a0cfff','color': '#606266'}
  }
  else {
    return {'background-color':'#fff'}
  }
}
// 将鼠标移动到单元格内,样式变化,给出可编辑提示
const hoverRow=ref();
const hoverColumn=ref();
// 控制tooltip显示隐藏
const visible = ref(false);
const buttonRef: Ref<HTMLElement | null> = ref(null);  //鼠标选中的元素
const mouseEnter=(row:any,column:any,cell:any,event:any)=>{
   if (column.property == "personList" || (column.property == "pmPersonList" && row.pmPersonList != null)
    || (column.property == "earlyBranch" && row.earlyTask != null) || (column.property == "lateBranch" && row.lateTask != null) 
    || (column.property == "selfDevices" && row.selfTask != null) || (column.property == "doorstep" && row.doorTask !=null)){
      hoverRow.value = row
      hoverColumn.value = column
    }
    if(column.property == "personList" || (column.property == "pmPersonList" && row.pmPersonList != null) 
    || (column.property == "earlyBranch" && row.earlyTask != null)||(column.property == "lateBranch" && row.lateTask != null) 
    || (column.property == "selfDevices" && row.selfTask != null) || (column.property == "doorstep" && row.doorTask !=null )){
       // 显示提示信息
       visible.value=true
       buttonRef.value = event.currentTarget
    }else{
       visible.value=false
    }
}
// 鼠标移除单元格
const mouseLeave=(row:any ,column:any)=>{
   hoverRow.value=null;
   hoverColumn.value=null;
   visible.value=false
}
const selectRow=ref();
const selectColumn=ref();
// 选中单元格
const cellClick=(row:any ,column:any) =>{
    // 当鼠标放在列上的时候显示不同的样式  
    if (column.property == "personList" ||column.property == "pmPersonList"   || 
    column.property == "earlyBranch"||column.property == "lateBranch" || column.property == "selfDevices" || column.property == "doorstep"){
      selectRow.value = row
      selectColumn.value = column
      scheduleId.value =row.id
    }
    // 如果是人员调整,直接显示之前的排班信息,只能调整人员
    if(column.property == "personList" || column.property == "pmPersonList"  ){
       // 上午
       if(column.property == "personList" && row.personList !=null  && row.pmPersonList !=null){
          personDialog.value.initData({ ...row },row.personList,"am");
          personState.visible = true
       } else if(column.property == "pmPersonList" && row.pmPersonList !=null ){
          personDialog.value.initData({ ...row },row.pmPersonList,"pm");
          personState.visible = true
       }else if(column.property == "personList" && row.personList !=null  && row.pmPersonList ==null){
          personDialog.value.initData({ ...row },row.personList,"all");
          personState.visible = true
       }
    }
    // 网点调整
    else if(column.property == "earlyBranch"||column.property == "lateBranch" || column.property == "selfDevices" || column.property == "doorstep"){
      //是ref创建的,所以得加.value,调用子组件dialog的initEditData方法
       if(column.property == "earlyBranch" && row.earlyTask != null){
          passValueChild(true, '早送任务网点',row.earlyTask)
          editDialog.value.initData([ ...row.earlyBranch ]);
       }
       else if(column.property == "lateBranch" && row.lateTask != null){
          passValueChild(true, '晚收任务网点',row.lateTask)
          editDialog.value.initData([...row.lateBranch]);
       }
       else if(column.property == "selfDevices" && row.selfTask != null){
          passValueChild(true, '自助设备点',row.selfTask)
          editDialog.value.initData([...row.selfDevices]);
       }
       else if(column.property == "doorstep" && row.doorTask != null){
          passValueChild(true, '上门收款点',row.doorTask)
          editDialog.value.initData([...row.doorstep]);
       }
    }
    else{
    }
}
//父类给子类传值
const passValueChild = (visible: any, title: any, taskId:any) => {
    //子组件中的props接收此两个值
    viewState.visible = visible
    viewState.title = title
    viewState.taskId =taskId
}

  3、组件具体内容

<!--调整网点信息-->
<template>
    <div class="edit-container" >
        <el-dialog  v-model="props.visible" :destroy-on-close="true" :title="props.title" @close="closeBranchDialog" :close-on-click-modal=false top="8vh" width="80%">
            <el-row :gutter="20">
                <!-- 显示之前的网点信息-->
                <el-col :span="18">
                    <div style="overflow:auto;height:500px;">
                        <el-table
                            size="medium"
                            :border="true"
                            :data="branchTableData"
                            :row-style="changeColor"
                            :stripe=false
                            style="width: 100%;">
                            <el-table-column  type="index" label="NO." align="center" width='55px'/>
                            <el-table-column prop="customerName" />
                            <el-table-column prop="branchName" />
                            <el-table-column prop="branchType">
                                <template #default="scope">
                                    <option-tag :optionCode='scope.row.branchType'></option-tag>
                                </template>
                            </el-table-column>
                            <el-table-column prop="businessType">
                                <template #default="scope">
                                    <option-tag :optionCode='scope.row.businessType'></option-tag>
                                </template>
                            </el-table-column>
                            <el-table-column  label="操作" width="150px">
                            <template #default="scope">
                                <el-popconfirm :title="`确定删除这条记录吗`" width="260px" @confirm="delBranch(scope.$index,scope.row)">
                                <template #reference>
                                    <el-button type="danger" title="删除" icon="Minus" size="small" circle plain></el-button>
                                </template>
                                </el-popconfirm>
                                <el-button  type="primary" title="上移" icon="ArrowUpBold" size="small"  circle plain  :disabled="scope.$index === 0" @click="moveUp(scope.$index, scope.row)" />
                                <el-button  type="success" title="下移" icon="ArrowDownBold" size="small"  circle plain :disabled="scope.$index === branchTableData.length -1 "  @click="moveDown(scope.$index, scope.row)"  />
                            </template>
                            </el-table-column>
                        </el-table>
                    </div>
                </el-col>
                <!-- 选择网点-->
                <el-col :span="6" >
                    <el-tag size="large" effect="dark" style="margin-bottom:5px;">选择网点信息</el-tag>
                    <el-form-item style="margin-bottom:3px;">
                        <base-customer-org-info-tree class="tree" @getNode="getNodeData" ref="baseTree" :checkNode="paramForm.id" style="width:100%;" :getdisAbled="getdisAbled" />
                    </el-form-item>
                    <base-branch-tree ref="branchTree" :data="branchData"  @getNode="getBranchNode" />
                </el-col>
            </el-row>
            <template #footer>
                <span class="dialog-footer">
                    <el-button @click="closeBranchDialog">取消</el-button>
                    <el-button type="primary"  @click="handleBranchConfirm"  >确定</el-button>
                </span>
            </template>
        </el-dialog>
    </div>
</template>
<script setup lang="ts">
import { reactive, ref , onMounted, toRefs, defineProps} from 'vue'
import { ElMessage } from 'element-plus'
import { SysOptionConf } from '@/api/basic/baseOptionConf/type';
import { queryOrgtypeId } from "@/api/basic/baseCustomerOrgInfo"
import { baseCustomerOrgInfo } from "@/api/basic/baseCashboxInfo/type"
import publicMethod from '@/views/basic/common/publicMethod'
import {editForm} from '@/api/basic/baseBillboxInfo/type'
import BaseBranchTree from "@/views/basic/components/baseBranchTree.vue"
import baseCustomerOrgInfoTree from "@/views/basic/components/baseCustomerOrgInfoTree.vue"
import { tableItem as baseCustomerOrgInfoTableItem } from "@/api/basic/baseCustomerOrgInfo/type"
import { tableItem as baseBranchInfoTableItem } from "@/api/basic/baseBranchInfo/type"
import { getBranchInfoById} from "@/api/basic/baseBranchInfo/index"
import publicData from '@/views/basic/common/publicData'
import { useCounterStore } from "@/store/modules/base"
// 引入请求接口
import { updateTaskInfo } from "@/api/dispatch/reality-schedule"


import useUserStore from '@/store/modules/user'
import useCommonStore from '@/store/modules/common'
let userStore = useUserStore()
const commonStore = useCommonStore()
//定义dialog中的值
const viewState = reactive({
    orgId: '',
})
//子组件用prop声明接收的参数,可以使用 defineProps() 宏来定义
const props = defineProps({
    title:{
        type:String,
        default:''
    },
    visible:{
        type:Boolean,
        default: false
    },
    taskId:{
        type:String,
        default: ''
    },
})
const businessOption =commonStore.filterOptions(publicData.businessTypeCode);
const branchTypeOption = commonStore.filterOptions(publicData.branchTypeCode);
const branchTableData=ref([])
//从父类给子组件传值,将选择的网点信息在当前页面展示
function initData(editRow:any){
    if(editRow!=""){
       branchTableData.value= editRow
    }
}
const branchData=reactive([])
//用defineEmits声明要调用父组件的方法
//这个是父组件dialog标签上的@close,而不是父组件自己定义的方法closeEdit()
const emit = defineEmits(['close'])
// 关闭弹框
function closeBranchDialog(value:number){
    branchTableData.value = {} as any
    paramForm.id =''
    branchTree.value.reFresh()
	//执行调用父组件中的dialog @close="closeEdit"的close,value传值给父类
    emit('close',value)
}
// 排序上移
const moveUp =(index:any,row:any) =>{
  if(index > 0){
    const up = branchTableData.value[index-1]
    branchTableData.value.splice(index-1,1);
    branchTableData.value.splice(index,0,up);
    selectedIndex.value = index-1;
  }else{
    ElMessage({message:'当前网点已是第一个,不可上移!',type:'warning'})
  }
}
// 排序下移
const moveDown =(index:any,row:any) =>{
  if(index + 1 === branchTableData.value.length){
    ElMessage({message:'当前网点已是最后一个,不可下移!',type:'warning'})
  }else{
    const down = branchTableData.value[index+1]
    branchTableData.value.splice(index+1,1);
    branchTableData.value.splice(index,0,down);
    selectedIndex.value = index+1;
  }
}
/**
 * 改变样式
 */
const selectedIndex=ref();
const changeColor =({ row,rowIndex }) =>{
  if(rowIndex === selectedIndex.value){
    return {'background-color':'#a0cfff', 'font-weight':'bold'}
  }
  if(rowIndex % 2 === 0){
     return {'background-color':'#fff'}
  }
  else{
    return {'background-color':'#fafafa'}
  }
}
// 删除网点
const delBranch =(index:any,row:any) =>{
  branchTableData.value.splice(index,1);
}
// 确定按钮
const handleBranchConfirm=() =>{
  // 将选中的数据保存在数据库中
  const ids=ref([])
   branchTableData.value.forEach(e => {
    ids.value.push(e.id)
   })
   let param ={
    taskId:props.taskId,
    ids:ids.value.join()
   }
   // 更新任务对应的网点信息
  updateTaskInfo(param).then(()=>{
      closeBranchDialog(1);
   })
}
const paramForm= reactive({
    id:''
})
//网点调整的弹框参数
const branchTree = ref<any>();
const getNodeData = (node: baseCustomerOrgInfoTableItem) => {
    if (node.parentId != "" && node.parentId != null) {
        paramForm.id = node.id;
        branchTree.value.reFresh(node.id)
    }
}
// 选择网点信息,添加到列表
const getBranchNode = (node: baseCustomerOrgInfoTableItem) => {
    if(node.orgType  === publicData.customerTypeBra){
        const ids = ref([])
        let branchId= node.id
        const exsitBranch =branchTableData.value.filter(i => i.id == branchId );
        if(exsitBranch.length > 0){
            ElMessage({message:'当前网点已存在!',type:'warning'})
        }else{
            ids.value.push(branchId)
            let param={
                ids: ids.value.join(),
            }
            // 调用分页查询接口
            getBranchInfoById(param).then((res:any)=>{
                let value =res[0]
                branchTableData.value.push(value);
            })
        }
    }
}
// 设置不可以选中的项目
const getdisAbled = (data: any) => {
    if (data.parentId == "" || data.parentId == null) {
        return true
    } else {
        return false
    }
}
//使用defineExpose()暴露方法,别的组件才能调用
defineExpose({
    initData
});
</script>
<style>
</style>

  4、人员调整

<!--调整车组信息-->
<template>
    <div class="edit-container" >
      <el-dialog title="车组人员调整"
      v-model="props.visible"
      @close="closePersonDialog"
      :close-on-click-modal=false
      top="8vh"
      width="80%">
      <el-row :gutter="20">
        <el-col :span="18">
          <el-tag size="large" effect="dark" style="margin:5px;">原车组信息</el-tag>
          <div class="temporary-schedule-edit-table">
            <el-table
              class="flex-table"
              size="medium"
              :border="true"
              tooltip-effect="dark"
              highlight-current-row
              :data="oriTableData"
              :header-cell-style="{background: '#F6F6F6', height: '10px'}"
              style="width: 100%;">
              <el-table-column prop="lineName"  align="center"/>
              <el-table-column prop="driverName" align="center"/>
              <el-table-column prop="escort1Name"  align="center"/>
              <el-table-column prop="escort2Name"  align="center"/>
              <el-table-column prop="carrier1Name"  align="center"/>
              <el-table-column prop="carrier2Name"  align="center"/>
              <el-table-column  label="操作" width="80px" align="center">
                <template #default="scope">
                  <el-button  type="primary" title="新增" icon="Plus" circle plain :disabled="show" @click="addTempSchedule(scope.row)"/>
                </template>
              </el-table-column>
            </el-table>
          </div>
          <el-divider/>
          <el-tag size="large" effect="dark" style="margin:5px;">调整信息</el-tag>
          <span style="float:right;margin-right:5px;">
            <span title="删除人员">
              <el-button type="danger" @click="handleCellDelete"  icon="Delete" circle/>
            </span>
          </span>
          <div class="temporary-schedule-edit-table">
            <el-table
              class="flex-table"
              size="medium"
              stripe
              border
              tooltip-effect="dark"
              highlight-current-row
              :header-cell-style="{background: '#F6F6F6', height: '10px'}"
              :data="adjustTableData"
              :cell-style="cellStyle"
              @cell-click="cellClick"
              @cell-mouse-enter="mouseEnter"
              @cell-mouse-leave="mouseLeave"
              style="width: 100%">
              <el-table-column  type="index" label="NO."  width='55px'/>
              <el-table-column prop="lineName"  align="center"/>
              <el-table-column prop="dueTime"  >
               	<template #default="scope">
                  <el-select v-model="scope.row.time"  :key="updateKey" placeholder="请选择" @change="value => {changeTime(value, scope.row);}" :disabled="selectShow"  >
                    <el-option
                      v-for="item in timeList"
                      :key="item.key"
                      :label="item.value"
                      :value="item.key">
                    </el-option>
                  </el-select>
                </template>
              </el-table-column>
             <el-table-column prop="driverName" align="center">
                <template #default="scope">
                   <el-tooltip placement="top" effect="dark" content="点击单元格可替换/删除" >
                     <p>{{scope.row.driverName}}</p>
                     <p class="temporary-schedule-edit-tel">{{scope.row.driverTel}}</p>
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column prop="escort1Name" align="center">
                <template #default="scope">
                   <el-tooltip placement="top" effect="dark" content="点击单元格可替换/删除" >
                     <p>{{scope.row.escort1Name}}</p>
                     <p class="temporary-schedule-edit-tel">{{scope.row.escort1Tel}}</p>
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column prop="escort2Name" align="center">
                <template #default="scope">
                  <el-tooltip placement="top" effect="dark" content="点击单元格可替换/删除" >
                    <p>{{scope.row.escort2Name}}</p>
                    <p class="temporary-schedule-edit-tel">{{scope.row.escort2Tel}}</p>
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column prop="carrier1Name" align="center">
                <template #default="scope">
                   <el-tooltip placement="top" effect="dark" content="点击单元格可替换/删除" >
                     <p>{{scope.row.carrier1Name}}</p>
                     <p class="temporary-schedule-edit-tel">{{scope.row.carrier1Tel}}</p>
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column prop="carrier2Name"  align="center">
                <template #default="scope">
                  <el-tooltip placement="top" effect="dark" content="点击单元格可替换/删除" >
                    <p>{{scope.row.carrier2Name}}</p>
                    <p class="temporary-schedule-edit-tel">{{scope.row.carrier2Tel}}</p>
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column  width="80px" label="操作"  align="center">
                <template #default="scope">
                  <el-popconfirm :title="`确定删除这条记录吗`" width="260px" @confirm="delTempSchedule(scope.$index,scope.row)">
                    <template #reference>
                      <el-button type="danger" title="删除" icon="Minus" size="small" circle plain></el-button>
                    </template>
                  </el-popconfirm>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </el-col>
        <el-col :span="6" >
          <div class="temporary-schedule-edit-tree" >
            <el-tag size="large" effect="dark" style="margin-bottom:5px;">选择替班人员</el-tag>
            <base-person-org-tree
              ref="personTree"
               @getNode="personData"
            />
          </div>
        </el-col>
      </el-row>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="closePersonDialog">取消</el-button>
          <el-button type="primary"  @click="handlePersonConfirm" >确定</el-button>
        </span>
      </template> 
      </el-dialog>
    </div>
</template>
<script setup lang="ts">
import { reactive, ref, onMounted,Ref,h, nextTick, createApp} from "vue"
import { ElMessage,ElMessageBox } from "element-plus";
import BasePersonOrgTree from "@/views/basic/components/basePersonOrgTree.vue" 
// 引入请求接口
import { batchUpdate, checkSelectedPerson } from "@/api/dispatch/reality-schedule"
import _ from 'lodash'

const updateKey=ref(0);
// 时间段
const timeList=[
    {
      id: "1001",
      value: "全天",
      key: "00:00-24:00"
    },
    {
      id: "1002",
      value: "上午",
      key: "00:00-12:00"
    },
    {
      id: "1003",
      value: "下午",
      key: "12:00-24:00"
    }
  ]
const changeRow = ref('')
const changeRowId = ref('')
const property = ref('')
const changeType = ref('')
const setId = ref('')
const show= ref(false)
const selectShow= ref(false)
// 排班日期
const rosteringDate= ref()
// 人员调整集合
const adjustTableData = ref<any>([])
// 弹框人员信息
const oriTableData = ref<any>([])
//接收父组件的传值
const tempIndex= ref(0)
//子组件用prop声明接收的参数,可以使用 defineProps() 宏来定义
const props = defineProps({
  visible:{
    type:Boolean,
    default: false
  },
})
// 界面初始化
function initData(editRow:any,list:any,type:string){
    if(editRow!=""){
      // 接收调整的类型
      changeType.value=type
      // 排班日期
      rosteringDate.value = editRow.rosteringDate
      adjustTableData.value=[]
      oriTableData.value=[]
      const tempData = ref<any>([])
      // 人员赋值
      list.forEach(p =>{
        if(p !=null && p.position !=null){
          // 车长
          if(p.isMaster){
            tempData.masterId = p.id
          }
          if(p.position == "驾驶员"){
            tempData.driverName = p.personName
            tempData.driverId = p.id
          }
          else if(p.position == "押运员1"){
            tempData.escort1Name = p.personName
            tempData.escort1Id = p.id
          }
          else if(p.position == "押运员2"){
            tempData.escort2Name = p.personName
            tempData.escort2Id = p.id
          }
          else if(p.position == "携款员1"){
            tempData.carrier1Name = p.personName
            tempData.carrier1Id = p.id
          }
          else if(p.position == "携款员2"){
            tempData.carrier2Name = p.personName
            tempData.carrier2Id = p.id
          }
        }
      })
      tempData.lineName =editRow.lineName
      tempData.plateNumber = editRow.plateNumber
      // 实时排班主键
      tempData.scheduleId = editRow.id
      setId.value = editRow.setId
      let ids =  editRow.ids
      let realityId = ids.split(",");
      oriTableData.value.push(_.cloneDeep(tempData));
      if (adjustTableData.value.length === 0){
        let tempRow = {...tempData}
        tempRow.id = realityId[0]
        if(type == "am"){
          tempRow.time= '00:00-12:00'
          tempRow.dueTime= ["00:00","12:00"]
          // 新增按钮不可用
          show.value = true;
          selectShow.value = true;
        }else if(type == "pm"){
          // 新增按钮不可用
          show.value = true;
          selectShow.value = true;
          tempRow.time= '12:00-24:00'
          tempRow.dueTime= ["12:00","24:00"]
          if(ids !=null && ids.length >1){
            tempRow.id =realityId[1]
          }
        } else{
          // 新增按钮可用
          show.value = false;
          selectShow.value = false;
          tempRow.time='00:00-24:00'
          tempRow.dueTime= ["00:00","24:00"]
        }
        tempRow.tempIndex= tempIndex.value
        tempIndex.value++
        adjustTableData.value.push(_.cloneDeep(tempRow))
      }
    }
}
const hoverRow=ref();
const hoverColumn=ref();
// 单元格样式修改
const cellStyle=(row:any) =>{
   if (JSON.stringify(selectRow.value) == JSON.stringify(row.row) && JSON.stringify(selectColumn.value) == JSON.stringify(row.column)) {
    //点击后的颜色
    return {'background-color':'#a0cfff','color': '#606266', 'font-weight':'bold'}
  } 
  else if (JSON.stringify(hoverRow.value) == JSON.stringify(row.row) &&  JSON.stringify(hoverColumn.value) == JSON.stringify(row.column)){
    return {'cursor':'pointer','background-color':'#a0cfff','color': '#606266'}
  }
  else {
    return {'background-color':'#fff'}
  }
}
// 将鼠标移动到单元格内,样式变化,给出可编辑提示
const mouseEnter=(row:any,column:any,cell:any,event:any)=>{
  if (column.property == "driverName" ||  column.property == "escort1Name"||  column.property == "escort2Name" || column.property == "carrier1Name" || column.property == "carrier2Name"){
    hoverRow.value = row 
    hoverColumn.value= column
  }
}
// 鼠标移除单元格
const mouseLeave=(row:any ,column:any)=>{
   hoverRow.value=null;
   hoverColumn.value=null;
}
const selectRow=ref();
const selectColumn=ref();
// 选中单元格
const cellClick=(row:any ,column:any) =>{
    changeRow.value = row
    changeRowId.value = row.tempIndex
    property.value = column.property
    // 当鼠标放在列上的时候显示不同的样式  
    if (column.property == "driverName" ||  column.property == "escort1Name"||  column.property == "escort2Name" || column.property == "carrier1Name" || column.property == "carrier2Name"){
      selectRow.value = row
      selectColumn.value = column
    }
}
// 关闭弹框
const emit = defineEmits(['close'])
function closePersonDialog(value:number){
    oriTableData.value = {} as any
	//执行调用父组件中的dialog @close="closeEdit"的close,value传值给父类
    emit('close',value)
}
// 添加调整信息
const addTempSchedule = (row:any) => {
    if (adjustTableData.value.length > 1){
      return
    }
    //判断是不是通过替班新增的
      let tempRow =  { ...row }
      tempRow.dueTime = ["00:00","24:00"]
      tempRow.time = "00:00-24:00"
      tempRow.tempIndex = tempIndex.value
      tempRow.id=""
      tempRow.setId = setId.value 
      tempRow.startTime="00:00"
      tempRow.endTime="24:00"
      tempRow.rosteringDate =rosteringDate.value
      tempIndex.value++
      adjustTableData.value.push(tempRow)
 }
const  delTempSchedule = (index:any,row:any) => {
  adjustTableData.value.splice(index,1); 
}
// 删除人员
const handleCellDelete =() =>{
  if(changeRow.value == ''){
    ElMessage({message:'请先选择需要删除的人员!',type:'error'})
  }else{
      if (property.value == 'driverName' || property.value == "escort1Name"|| property.value == "escort2Name"
      || property.value == "carrier1Name" || property.value == "carrier2Name"){
        if (workerCount(changeRow.value) >= 2){
          return
        }else{
          ElMessageBox.confirm('确定删除选中人员吗?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            let tempRow = changeRow.value
            if(property.value == "driverName"){
              tempRow.driverId = ''
              tempRow.driverName =''
            }
            else if(property.value == "escort1Name"){
              tempRow.escort1Id = ''
              tempRow.escort1Name = ''
            }
            else if(property.value == "escort2Name"){
              tempRow.escort2Id = ''
              tempRow.escort2Name = ''
            }
            else if(property.value == "carrier1Name"){
              tempRow.carrier1Id = ''
              tempRow.carrier1Name = ''
            }
            else if(property.value == "carrier2Name"){
              tempRow.carrier2Id = ''
              tempRow.carrier2Name = ''
            }
            // 更新人员
            let changeList = [];
            changeList.push(tempRow)
            batchUpdate(changeList).then((res) =>{
              ElMessage.success('删除成功!')
            })  
          }).catch(_ => { })
      }
    }
  }
}
//判断当前记录中人员个数
const workerCount=(data:any) =>{
  let count = 0
      if (data.driverId == null || data.driverId == ''){
        count++
      }
      if (data.escort1Id == null || data.escort1Id == ''){
        count++
      }
      if (data.escort2Id == null || data.escort2Id == ''){
        count++
      }
      if (data.carrier1Id == null || data.carrier1Id == ''){
        count++
      }
      if (data.carrier2Id == null || data.carrier2Id == ''){
        count++
      }
      return count
}
const personData=(data:any) =>{
  if(data.orgName == "11"){
    return 
  }else {
    if(changeRow.value == ''){
      ElMessage({message:'请先选择需要替换的人员!',type:'error'})
    }else{
      let param={
        rosteringDate: rosteringDate.value,
        id:data.id,
        startTime:"",
        endTime:""
      }
      if(changeType.value == "am"){
         param.startTime="00:00"
         param.endTime="12:00"
      } else if(changeType.value == "am"){
         param.startTime="12:00"
         param.endTime="24:00"
      }else{
         param.startTime="00:00"
         param.endTime="24:00"
      }
      checkSelectedPerson(param).then((res:any)=>{
         // 替换当前的人员信息
         let tempRow = changeRow.value
        if(property.value == "driverName"){
          tempRow.driverId = data.id
          tempRow.driverName = data.orgName
        }
        else if(property.value == "escort1Name"){
          tempRow.escort1Id = data.id
          tempRow.escort1Name = data.orgName
        }
        else if(property.value == "escort2Name"){
          tempRow.escort2Id = data.id
          tempRow.escort2Name = data.orgName
        }
        else if(property.value == "carrier1Name"){
          tempRow.carrier1Id = data.id
          tempRow.carrier1Name = data.orgName
        }
         else if(property.value == "carrier2Name"){
          tempRow.carrier2Id = data.id
          tempRow.carrier2Name = data.orgName
        }
      })
    } 
  }
}
// 人员选择确定
const handlePersonConfirm=() =>{
  let count =adjustTableData.value.length;
  if(count == 0){
    ElMessage.error("当前车组不存在人员信息!")
    return
  }else{
      // 有两条记录需要判断时间段选择的是否一致
      if(count > 1){
       let first = adjustTableData.value[0].time
       let second = adjustTableData.value[1].time
       // 两条记录的时间段不能一致
       if(first =="00:00-24:00" || second =="00:00-24:00" || first == second ){
          ElMessage.error("车组的两个时间段不能一样并且不能是全天!")
       }else{
         batchUpdate(JSON.parse(JSON.stringify(adjustTableData.value))).then((res) =>{
          closePersonDialog(1)
        })
       }
      }else{
         batchUpdate(JSON.parse(JSON.stringify(adjustTableData.value))).then((res) =>{
          closePersonDialog(1)
        })
      }
  }
}
const changeTime=(data:any,row:any) =>{
   let timeArr = data.split("-");
      if (timeArr.length > 1){
        row.dueTime[0] = timeArr[0]
        row.dueTime[1] = timeArr[1]
        row.startTime = timeArr[0]
        row.endTime = timeArr[1]
        updateKey.value++
      }
  
}
//使用defineExpose()暴露方法,别的组件才能调用
defineExpose({
    initData
});
</script>

  

posted @ 2023-11-03 10:47  flyComeOn  阅读(66)  评论(0编辑  收藏  举报