rk
2025-09-24 f3c59a17062fb0a89b5f89b7845341386952a6b1
Merge remote-tracking branch 'origin/master'
已添加3个文件
已修改19个文件
883 ■■■■■ 文件已修改
admin/public/template/member.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPlatformWindow.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/dangerStatic.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/platform.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/set/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/cars.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/snapshot.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/waybill/list.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/waybill/waybillDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/FireFighting.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/SecurityControl.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/doc/月台自动加号数据库变动脚本.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DijkstraUtil.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/GraphByMatrix.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/TspSolver.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/member.xlsx
Binary files differ
admin/src/api/platform/index.js
@@ -135,6 +135,10 @@
export function dealJobFinish (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/dealJobFinish', data)
}
// æ›´æ¢æœˆå°ç»„
export function changPlatformGroup (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/changPlatformGroup', data)
}
// æ¢å¤ä½œä¸š
export function restoreWork (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/restoreWork', data)
admin/src/components/business/OperaCarsWindow.vue
@@ -187,7 +187,7 @@
    },
    getCate () {
      fetchList({
        model: {},
        model: { type: 1 },
        capacity: 1000,
        page: 1
      }).then(res => {
admin/src/components/business/OperaPlatformWindow.vue
@@ -14,6 +14,12 @@
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="月台类型" prop="type" >
        <el-radio-group v-model="form.type" >
          <el-radio :label="0">整托盘</el-radio>
          <el-radio :label="1">散件</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="广播设备:" prop="broadcastIds">
        <el-select v-model="form.broadcastIds" multiple>
          <el-option v-for="item in broadcastList" :key="item.id" :label="item.name" :value="item.id">
@@ -29,8 +35,11 @@
      <el-form-item label="LED空闲文案:" prop="ledContent">
        <el-input type="text" v-model="form.ledContent" placeholder="请输入LED空闲文案" v-trim />
      </el-form-item>
      <el-form-item label="同时作业数量:" prop="workingNum">
        <el-input type="number" v-model="form.workingNum" placeholder="请输入同时作业数量" v-trim />
      <el-form-item label="同时叫号数量:" prop="workingNum">
        <el-input type="number" v-model="form.workingNum" placeholder="请输入同时叫号数量" v-trim />
      </el-form-item>
      <el-form-item label="同时准备数量:" prop="callReadyNum">
        <el-input type="number" v-model="form.callReadyNum" placeholder="请输入同时准备数量" v-trim />
      </el-form-item>
      <el-form-item label="月台作业效率(万支/小时):" prop="workRate">
        <el-input type="number" v-model="form.workRate" placeholder="请输入月台作业效率(万支/小时)" v-trim />
@@ -67,6 +76,7 @@
      form: {
        id: null,
        ledIds: null,
        type:0,
        broadcastIds: null,
        name: '',
        code: '',
@@ -74,6 +84,7 @@
        startTime: '',
        endTime: '',
        workingNum: 1,
        åŒæ—¶ä½œä¸šæ•°é‡: 0,
        ledContent: '',
        workRate: '',
        stayTimeoutAlarmTime: '',
@@ -82,7 +93,8 @@
      },
      // éªŒè¯è§„则
      rules: {
        workingNum: [{ required: true, validator: numRuleGtZero, message: '请输入同时作业数量,必须大于0! ', trigger: 'blur' }],
        workingNum: [{ required: true, validator: numRuleGtZero, message: '请输入同时叫号数量,必须大于0! ', trigger: 'blur' }],
        type: [{ required: true, message: '月台类型不能为空!', trigger: 'blur' }],
        sortnum: [{ required: true, message: '排序码不能为空!', trigger: 'blur' }]
      }
    }
admin/src/views/business/dangerStatic.vue
@@ -154,7 +154,7 @@
          this.yearList = res.yearList
          this.departmentList = res.departmentList.slice(0, 10)
          this.departmentList = res.departmentSortList.slice(0, 10)
          this.typeList = res.cateList || []
          this.deptList = res.departmentList || []
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -23,7 +23,12 @@
      <el-table-column prop="totalNum" label="总作业量(万支)" min-width="130" show-overflow-tooltip />
      <el-table-column prop="carCodeFront" label="车牌前照号" min-width="100" show-overflow-tooltip />
      <!-- <el-table-column prop="carCodeBack" label="车牌后照号" min-width="100" show-overflow-tooltip /> -->
      <el-table-column prop="taskOrigin" label="任务来源" min-width="100" show-overflow-tooltip />
      <el-table-column prop="origin" label="任务来源" min-width="100" show-overflow-tooltip >
        <template v-slot="scope">
          <span v-if="scope.row.origin == 1">WMS获取</span>
          <span v-else>自建任务</span>
        </template>
      </el-table-column>
      <el-table-column prop="carrierName" label="运输公司" min-width="100" show-overflow-tooltip />
      <el-table-column prop="driverName" label="司机" min-width="100" show-overflow-tooltip />
      <el-table-column prop="drivierPhone" label="司机电话" min-width="100" show-overflow-tooltip />
@@ -39,6 +44,17 @@
          <span v-if="scope.row.type == '2'">外协车卸货</span>
          <span v-if="scope.row.type == '3'">外协车装货</span>
          <span v-if="scope.row.type == '4'">市公司外协车卸货</span>
        </template>
      </el-table-column>
      <el-table-column prop="platformGroupName" label="作业月台组" min-width="150"  show-overflow-tooltip >
        <template v-slot="scope">
          <div style="display: flex;align-items: center;align-content: center;width: 100%">
          <div  style="max-width: 100px;display: inline-block;
            overflow: hidden;
            text-overflow: ellipsis;
            word-wrap: break-word;">{{scope.row.platformGroupName||'-'}}</div>
          <el-button  type="text" style="font-size: 10px;color: red;margin-top: 5px;margin-left: 10px " @click="changeGroup(scope.row)" v-if="[0,1,2].includes(scope.row.status)">更换</el-button>
          </div>
        </template>
      </el-table-column>
      <el-table-column prop="ioCreatedate" label="创建时间" min-width="150" show-overflow-tooltip />
@@ -62,20 +78,68 @@
    <!--  -->
    <!--  -->
    <WaybillDetailRef v-if="isShowDetail" ref="WaybillDetailRef" />
    <el-dialog append-to-body title="更换月台组" style="text-align: center" class="dialogCl" :visible.sync="showChangeGroup" width="480px" top="10%">
      <div class="head"  v-if="showChangeGroup && curRow">
        <div class="plate" v-if="curRow.carCodeFront">
          <span>{{ curRow.carCodeFront.slice(0, 1) }}</span>
          <span>{{ curRow.carCodeFront.slice(1, 2) }}</span>
          <span>·</span>
          <span>{{ curRow.carCodeFront.slice(2) }}</span>
        </div>
        <div class="list">
          <div class="item">
            <span>运输单号:</span>
            <span>{{ curRow.billCode }}</span>
          </div>
          <div class="item">
            <span>总运输量:</span>
            <span>{{ curRow.totalNum  }}万支</span>
          </div>
          <div class="item">
            <span>驾驶员:</span>
            <span>{{ curRow.driverName }} {{ curRow.drivierPhone }}</span>
          </div>
          <div class="item">
            <span>当前月台组:</span>
            <span>{{ curRow.platformGroupName }}</span>
          </div>
        </div>
      </div>
      <el-form :model="groupForm" ref="form"   >
        <el-form-item label="选择月台组" prop="platformGroupId" required>
          <el-select v-model="groupForm.platformGroupId" placeholder="请选择月台分组 ">
            <el-option v-for="item in rowGroupList" :key="item.id" :label="item.name" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="showChangeGroup = false">取消</el-button>
        <el-button type="primary" :loading="dealing" @click="changeGroupDo">确定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { platformJobPage, platformJobExport, platformJobDel, dealJobFinish ,updateTotalNum} from '@/api'
import {
  platformJobPage,
  platformJobExport,
  platformJobDel,
  dealJobFinish,
  updateTotalNum,
  changPlatformGroup
} from '@/api'
import { statusMap } from '../config'
import WaybillDetailRef from "../components/WaybillDetail.vue"
import WaybillDetailRef from '../components/WaybillDetail.vue'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadFaceImg from '@/components/common/UploadFaceImg'
import { Message } from 'element-ui'
import dayjs from 'dayjs'
import BaseComputHeight from "@/components/base/BaseComputHeight";
import BaseComputHeight from '@/components/base/BaseComputHeight'
import { allList } from '@/api/platform/platformGroup'
export default {
  extends: BaseComputHeight,
  components: {
@@ -87,8 +151,13 @@
  },
  data() {
    return {
      groupList: [],
      rowGroupList: [],
      dealing:false,
      statusMap,
      curRow:null,
      isShowDetail: false,
      showChangeGroup: false,
      exLoading: false,
      updateLoading: false,
      loading: false,
@@ -104,6 +173,11 @@
        createDateEnd: ''
      },
      list: [],
      groupForm:{
        id:null,
        platformGroupId:null,
        platformGroupName:null
      },
      queryFormConfig: {
        formItems: [
          {
@@ -143,7 +217,7 @@
              { value: 9, label: '已授权离园' },
              // { value: 10, label: '已离园' },
              { value: 11, label: '已过号' },
              { value: 12, label: '已取消' },
              { value: 12, label: '已取消' }
            ]
          },
          {
@@ -180,13 +254,20 @@
    this.$nextTick(() => {
      this.$refs.QueryForm.zkBtn()
    })
    this.loadGroupList()
  },
  methods: {
    loadGroupList () {
      allList({})
        .then(res => {
          this.groupList = res || []
        })
    },
    handleSelectionChange(ids) {
      this.ids = ids.map(item => item.id)
    },
    complete(ids) {
      var that = this;
      var that = this
      if (ids.length === 0) {
        return this.$message.warning('至少选择一项内容')
      }
@@ -201,7 +282,48 @@
          })
      }).catch(() => {
      });
      })
    },
    changeGroupDo () {
      var that = this
      if (!this.groupForm.id || !this.groupForm.platformGroupId) {
        return this.$message.warning('请选择月台组')
      }
      changPlatformGroup(this.groupForm)
        .then(res => {
          that.showChangeGroup=false
          that.getList()
        })
    },
    changeGroup (row) {
      this.groupForm.id = null
      this.groupForm.platformGroupName = null
      this.groupForm.platformGroupId = null
      this.rowGroupList = []
      this.curRow=null
      var type = 0
      if (row.type === 0 || row.type === 2) {
        // å®‰æ³°ç‰©æµå¸è´§
        type = 0
      } else if (row.type === 1 || row.type === 3) {
        // å®‰æ³°ç‰©æµè£…è´§
        type = 1
      } else if (row.type === 4) {
        // å¸‚公司外协车卸货
        type = 2
      } else {
        return this.$message.warning('作业任务类型有误,不支持月台组切换!')
      }
      this.curRow =row
      this.groupForm.id = row.id
      this.groupForm.platformGroupName = row.platformGroupName
      this.groupForm.platformGroupId = row.platformGroupId
      this.groupList.forEach(item => {
        if (item.type === type) {
          this.rowGroupList.push(item)
        }
      })
      this.showChangeGroup = true
    },
    changeRadio(day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
@@ -225,7 +347,7 @@
          jobType: '0'
         },
        capacity: pagination.pageSize,
        page: page || pagination.page,
        page: page || pagination.page
      }).then(res => {
        this.loading = false
        this.list = res.records || []
@@ -312,4 +434,56 @@
  color: #000000;
  margin-bottom: 15px;
}
.head {
  font-size: 12px;
  color: #282828;
  background: rgba(39, 155, 170, 0.05);
  border-radius: 4px;
  border: 1px solid #dfe2e8;
  padding: 16px;
  margin-bottom: 30px;
  .plate {
    display: flex;
    font-weight: 600;
    height: 30px;
    line-height: 30px;
    font-size: 15px;
    color: #111111;
    background-color: #fff;
    border-radius: 4px;
    border: 1px solid #2080f7;
    padding-right: 4px;
    width:120px;
    span {
      &:nth-of-type(1) {
        background: #2080f7;
        padding: 0 8px;
        color: #fff;
      }
      &:nth-of-type(2) {
        padding-left: 4px;
      }
    }
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    margin-top: 16px;
    .item {
      text-align: justify;
      width: 50%;
      margin-bottom: 8px;
      span {
        &:nth-child(1) {
          color: #666666;
        }
      }
    }
  }
}
</style>
admin/src/views/platform/platform.vue
@@ -14,6 +14,12 @@
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="" prop="type">
            <el-select v-model="searchForm.type" placeholder="请选择月台类型" @change="search" clearable>
              <el-option label="整托盘" :value="0"></el-option>
              <el-option label="散件" :value="1"></el-option>
            </el-select>
          </el-form-item>
          <!-- <section> -->
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
@@ -34,9 +40,17 @@
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="月台名称" fixed min-width="100px"></el-table-column>
        <el-table-column prop="code" label="月台编码" fixed min-width="100px"></el-table-column>
        <el-table-column prop="type" label="月台类型" min-width="100px">
          <template scope="{row}">
            <span v-if="row.type == 0" class="green">整托盘</span>
            <span v-else-if="row.type == 1" class="red">散件</span>
            <span v-else class="grey">-</span>
          </template>
        </el-table-column>
        <el-table-column prop="groupName" label="所属月台组" fixed min-width="150px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="90px"></el-table-column>
        <el-table-column prop="workingNum" label="同时叫号车辆数" min-width="120px"></el-table-column>
        <el-table-column prop="workingNum" label="同时叫号数量" min-width="120px"></el-table-column>
        <el-table-column prop="callReadyNum" label="同时准备数量" min-width="120px"></el-table-column>
        <el-table-column prop="stayTimeoutAlarmTime" label="停留超时报警时间(分钟)" min-width="180px">
          <template scope="{row}">{{ row.stayTimeoutAlarmTime ? (row.stayTimeoutAlarmTime) : '-' }}</template>
        </el-table-column>
@@ -100,6 +114,7 @@
      working1: false,
      searchForm: {
        name: '',
        type:null,
        groupId: null
      }
    }
admin/src/views/platform/set/index.vue
@@ -25,7 +25,13 @@
      </el-table-column>
      <el-table-column
        prop="workingNum"
        label="同时作业车辆数"
        label="同时叫号数量"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="callReadyNum"
        label="同时准备数量"
        min-width="100"
        show-overflow-tooltip
      />
@@ -116,10 +122,14 @@
            format="HH:mm"
          />
        </el-form-item>
        <el-form-item label="同时作业车辆数">
        <el-form-item label="同时叫号数量">
          <el-input v-model="param.workingNum" class="w300"></el-input>
          <span class="ml10">个</span>
        </el-form-item>
        <el-form-item label="同时准备数量">
          <el-input v-model="param.callReadyNum" class="w300"></el-input>
          <span class="ml10">个</span>
        </el-form-item>
        <el-form-item label="停留超时报警时间">
          <el-input
            v-model="param.alermTime"
admin/src/views/vehicle/cars.vue
@@ -198,7 +198,7 @@
    },
    getCate() {
      fetchList({
        model: {},
        model: { type: 1 },
        capacity: 1000,
        page: 1,
      }).then(res => {
h5/pages/staff/snapshot.vue
@@ -234,10 +234,10 @@
                    title: '请输入情况说明',
                    icon: 'none'
                })
                if (param.content.length < 10) return uni.showToast({
                    title: '情况说明不得小于10个字',
                    icon: 'none'
                })
                // if (param.content.length < 10) return uni.showToast({
                //     title: '情况说明不得小于10个字',
                //     icon: 'none'
                // })
                DangerCreate({
                    ...param,
h5/pages/waybill/list.vue
@@ -19,9 +19,10 @@
        <scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
            <view class="main_list">
                <view class="item" v-for="item,index in list" :key="index">
                    <view class="head">
                    <view class="head"
                    :style="{ backgroundColor: item.orderStatus === 9 ? 'linear-gradient(270deg, #FEFEFF 0%, #FEE1E1 100%)' : 'linear-gradient(270deg, #FEFEFF 0%, #E1F7FE 100%)' }">
                        <view class="code">{{item.contractNumber}}</view>
                        <view class="status">{{item.orderStatusDesc }}</view>
                        <view :class="item.orderStatus === 9 ? 'error' : 'status'">{{item.orderStatusDesc }}</view>
                    </view>
                    <view class="content">
                        <view class="line">
@@ -347,7 +348,7 @@
                    width: 690rpx;
                    height: 84rpx;
                    margin: 0 -30rpx;
                    background: linear-gradient(270deg, #FEFEFF 0%, #E1F7FE 100%);
                    // background: linear-gradient(270deg, #FEFEFF 0%, #E1F7FE 100%);
                    .code {
                        font-weight: 500;
@@ -358,6 +359,10 @@
                    .status {
                        color: $uni-color-primary;
                    }
                    .error {
                        color: #EE3821;
                    }
                }
                .content {
h5/pages/waybill/waybillDetail.vue
@@ -85,7 +85,7 @@
                            </view>
                            <view v-else class="icon_wrap"></view>
                            <view class="text" :class="{placeholder3: k==0 && i== 0}">
                                {{item.orderStatusDes}}
                                <text :style="{ color: item.orderStatus === 9 ? 'red' : '#666666'}">{{item.orderStatusDes}}</text>
                                <text v-if="item.tel">,发货仓库电话:</text>
                                <template v-if="item.tel">
                                    <text v-for="phone,p in item.tel.split(',')" @click="callPhone(phone)" class="primaryColor">{{phone}}<text v-if="p < item.tel.split(',').length - 1">,</text></text>
screen/src/views/FireFighting.vue
@@ -400,7 +400,7 @@
    grid: {
      top: '0%',
      left: '0%',
      right: '%',
      right: '0%',
      bottom: '0%',
      containLabel: true
    },
@@ -561,7 +561,12 @@
  let minNum = item.min
  let conNum = maxNum
  let acNum = item.obj.value.replaceAll('M', '')
  var data = (((acNum - minNum) / conNum) * 100).toFixed(0)
  var data = 0
  if (acNum > conNum) {
    data = 100
  } else{
    data = ((acNum / conNum) * 100).toFixed(0)
  }
  console.log('data', data)
  const option = {
@@ -1093,7 +1098,7 @@
  setInterval(() => {
    changeData8(1)
    changeData9(1)
  }, 1000 * 5)
  }, 1000 * 10)
  setTimeout(() => {
    loopFn1()
    loopFn2()
screen/src/views/SecurityControl.vue
@@ -99,7 +99,7 @@
                      <div class="safe_left_dian" :style="{ backgroundColor: item.color }"></div>
                      <div class="safe_left_name">{{item.name}}</div>
                    </div>
                    <div class="safe_num" :style="{ color: item.color }">{{item.total}}</div>
                    <div class="safe_num" :style="{ color: item.color }">{{item.value}}</div>
                  </div>
<!--                  <div class="safe_chat_info_row">-->
<!--                    <div class="safe_left">-->
@@ -312,7 +312,7 @@
              <div class="com_header">
                <div class="title">
                  <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" />
                  <div>隐患随手拍</div>
                  <div>本月隐患随手拍</div>
                </div>
                <img src="@/assets/images/task/title@2x.png" class="bg" alt="" />
              </div>
@@ -816,6 +816,7 @@
  CarList.value = []
  getEnergyCenterData().then(res => {
    if (res.code == 200) {
      totalCar.value = 0
      const result = res.data
      data.value = result
      res.data.inParkCarList.forEach(item => {
@@ -829,7 +830,7 @@
        } else if (item.name === '货运车辆') {
          CarList.value.push({ name: '货运车辆', value: item.total, color: '#01ABFE' })
        } else if (item.name === '未知车辆') {
          CarList.value.push({ name: '未知车辆', value: item.total, color: '#0028ff' })
          CarList.value.push({ name: '未知车辆', value: item.total, color: '#cccccc' })
        }
      })
      nextTick(() => {
server/doc/ÔĄ̂×Ô¶¯¼ÓºÅÊý¾Ý¿â±ä¶¯½Å±¾.md
@@ -8,13 +8,14 @@
ADD COLUMN `AUTO_CALL_END_TIME` varchar(100) NULL COMMENT '自动叫号截止时间(HH:mm)' AFTER `AUTO_CALL_START_TIME`;
ALTER TABLE `antaiwuliu`.`platform`
ADD COLUMN `TYPE` int NULL COMMENT '类型  0整托盘 1散件' AFTER `LED_CONTENT`;
ADD COLUMN `TYPE` int NULL COMMENT '类型  0整托盘 1散件' AFTER `LED_CONTENT`,
ADD COLUMN `CALL_READY_NUM` varchar(100) NULL COMMENT '同时准备作业数量' AFTER `TYPE`;
 
ALTER TABLE `antaiwuliu`.`platform_job`
ADD COLUMN `TAG_VIRTUAL` int NULL COMMENT '是否标记虚拟月台组 0否 1是' AFTER `ORIGIN`,
ADD COLUMN `TAG_VIRTUAL_TIME` datetime NULL COMMENT '标记虚拟月台组时间' AFTER `TAG_VIRTUAL`,
ADD COLUMN `TAG_VIRTUAL_USER` int NULL COMMENT '标记虚拟月台组人员编码' AFTER `TAG_VIRTUAL_TIME`,
ADD COLUMN `TAG_VIRTUAL` int NULL COMMENT '是否更换月台组 0否 1是' AFTER `ORIGIN`,
ADD COLUMN `TAG_VIRTUAL_TIME` datetime NULL COMMENT '更换月台组时间' AFTER `TAG_VIRTUAL`,
ADD COLUMN `TAG_VIRTUAL_USER` int NULL COMMENT '更换月台组人员编码' AFTER `TAG_VIRTUAL_TIME`,
ADD COLUMN `CALL_WAY` int NULL COMMENT '叫号方式  0手动叫号 1自动叫号' AFTER `TAG_VIRTUAL_USER`,
ADD COLUMN `URGE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '加急时间' AFTER `CALL_WAY`,
ADD COLUMN `URGE_USER` int NULL DEFAULT NULL COMMENT '加急人员编码' AFTER `URGE_TIME`;
server/system_service/pom.xml
@@ -335,5 +335,11 @@
            <type>pom</type>
            <scope>import</scope>
        </dependency>-->
         <dependency>
            <groupId>com.google.ortools</groupId>
            <artifactId>ortools-java</artifactId>
            <version>9.14.6206</version>
        </dependency>
    </dependencies>
</project>
server/system_service/src/main/java/com/doumee/core/utils/DijkstraUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.doumee.core.utils;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
public class DijkstraUtil {
    private Queue visited;
    int[] distance;
    public DijkstraUtil(int len) {
        // TODO Auto-generated constructor stub
        visited = new LinkedList();
        distance = new int[len];
    }
    private int getIndex(Queue q, int[] dis) {
        int k = -1;
        int min_num = Integer.MAX_VALUE;
        for (int i = 0; i < dis.length; i++) {
            if (!q.contains(i)) {
                if (dis[i] < min_num) {
                    min_num = dis[i];
                    k = i;
                }
            }
        }
        return k;
    }
    public void dijkstra(int[][] weight, Object[] str, int v) {
        HashMap path;
        path = new HashMap();
        for (int i = 0; i < str.length; i++)
            path.put(i, "");
        //初始化路径长度数组distance
        for (int i = 0; i < str.length; i++) {
            path.put(i, path.get(i) + "" + str[v]);
            if (i == v)
                distance[i] = 0;
            else if (weight[v][i] != -1) {
                distance[i] = weight[v][i];
                path.put(i, path.get(i) + "-->" + str[i]);
            } else
                distance[i] = Integer.MAX_VALUE;
        }
        visited.add(v);
        while (visited.size() < str.length) {
            int k = getIndex(visited, distance);//获取未访问点中距离源点最近的点
            visited.add(k);
            if (k != -1) {
                for (int j = 0; j < str.length; j++) {
                    //判断k点能够直接到达的点
                    if (weight[k][j] != -1) {
                        //通过遍历各点,比较是否有比当前更短的路径,有的话,则更新distance,并更新path。
                        if (distance[j] > distance[k] + weight[k][j]) {
                            distance[j] = distance[k] + weight[k][j];
                            path.put(j, path.get(k) + "-->" + str[j]);
                        }
                    }
                }
            }
        }
        for (int h = 0; h < str.length; h++) {
            System.out.printf(str[v] + "-->" + str[h] + ":" + distance[h] + " ");
            if (distance[h] == Integer.MAX_VALUE)
                System.out.print(str[v] + "-->" + str[h] + "之间没有可通行路径");
            else
                System.out.print(str[v] + "-" + str[h] + "之间有最短路径,具体路径为:" + path.get(h).toString());
            System.out.println();
        }
        visited.clear();
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       /* int[][] weight = {
                {0, 10, 12, -1, -1, -1},
                {-1, 0, -1, 16, 25, -1},
                {4, 3, 0, 12, -1, 8},
                {-1, -1, -1, 0, 7, -1},
                {-1, -1, -1, -1, 0, -1},
                {-1, -1, -1, 2, -1, 0}};
        String[] str = {"V1", "V2", "V3", "V4", "V5", "V6"};
        int len = str.length;
        DijkstraUtil dijkstra = new DijkstraUtil(len);
        //依次让各点当源点,并调用dijkstra函数
        for (int i = 0; i < str.length; i++) {
            dijkstra.dijkstra(weight, str, i);
        }*/
        int[][] weight = {
                {0, 10, 5, 7, -1},
                {-1, 0, 4, 5, 10},
                {-1, 4, 0, 6, 5},
                {-1, 5, 6, 0, 7},
                {-1, -1, -1, -1, 0}};
        String[] str = {"A", "B", "C", "D", "E"};
        DijkstraUtil dijkstra = new DijkstraUtil(str.length);
        dijkstra.dijkstra(weight, str, 0);
    }
}
server/system_service/src/main/java/com/doumee/core/utils/GraphByMatrix.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,258 @@
package com.doumee.core.utils;
import java.util.*;
/**
 * æœ€çŸ­è·¯å¾„—Dijkstra算法和Floyd算法
 * Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。
 *
 * é—®é¢˜æè¿°ï¼šåœ¨æ— å‘图 G=(V,E) ä¸­ï¼Œå‡è®¾æ¯æ¡è¾¹ E[i] çš„长度为 w[i],找到由顶点 V0 åˆ°å…¶ä½™å„点的最短路径。(单源最短路径)
 */
public class GraphByMatrix {
    public static final boolean UNDIRECTED_GRAPH = false;//无向图标志
    public static final boolean DIRECTED_GRAPH = true;//有向图标志
    public static final boolean ADJACENCY_MATRIX = true;//邻接矩阵实现
    public static final boolean ADJACENCY_LIST = false;//邻接表实现
    public static final int MAX_VALUE = Integer.MAX_VALUE;
    private boolean graphType;
    private boolean method;
    private int vertexSize;
    private int matrixMaxVertex;
    //存储所有顶点信息的一维数组
    private Object[] vertexesArray;
    //存储图中顶点之间关联关系的二维数组,及边的关系
    private int[][] edgesMatrix;
    // è®°å½•第i个节点是否被访问过
    private boolean[] visited;
    /**
     * @param graphType å›¾çš„类型:有向图/无向图
     * @param method    å›¾çš„实现方式:邻接矩阵/邻接表
     */
    public GraphByMatrix(boolean graphType, boolean method, int size) {
        this.graphType = graphType;
        this.method = method;
        this.vertexSize = 0;
        this.matrixMaxVertex = size;
        if (this.method) {
            visited = new boolean[matrixMaxVertex];
            vertexesArray = new Object[matrixMaxVertex];
            edgesMatrix = new int[matrixMaxVertex][matrixMaxVertex];
            //对数组进行初始化,顶点间没有边关联的值为Integer类型的最大值
            for (int row = 0; row < edgesMatrix.length; row++) {
                for (int column = 0; column < edgesMatrix.length; column++) {
                    edgesMatrix[row][column] = MAX_VALUE;
                }
            }
        }
    }
    /********************最短路径****************************/
    //计算一个顶点到其它一个顶点的最短距离
    public void Dijkstra(Object obj) throws Exception {
        Dijkstra(getVertexIndex(obj));
    }
    public void Dijkstra(int v0) {
        int[] dist = new int[matrixMaxVertex];
        int[] prev = new int[matrixMaxVertex];
        //初始化visited、dist和path
        for (int i = 0; i < vertexSize; i++) {
            //一开始假定取直达路径最短
            dist[i] = edgesMatrix[v0][i];
            visited[i] = false;
            //直达情况下的最后经由点就是出发点
            if (i != v0 && dist[i] < MAX_VALUE)
                prev[i] = v0;
            else
                prev[i] = -1; //无直达路径
        }
        //初始时源点v0∈visited集,表示v0 åˆ°v0的最短路径已经找到
        visited[v0] = true;
        // ä¸‹æ¥å‡è®¾ç»ç”±ä¸€ä¸ªç‚¹ä¸­è½¬åˆ°è¾¾å…¶ä½™å„点,会近些,验证之
        // å†å‡è®¾ç»ç”±ä¸¤ä¸ªç‚¹ä¸­è½¬,会更近些,验证之,.....
        // ç›´åˆ°ç©·ä¸¾å®Œæ‰€æœ‰å¯èƒ½çš„中转点
        int minDist;
        int v = 0;
        for (int i = 1; i < vertexSize; i++) {
            //挑一个距离最近经由点,下标装入 v
            minDist = MAX_VALUE;
            for (int j = 0; j < vertexSize; j++) {
                if ((!visited[j]) && dist[j] < minDist) {
                    v = j;                             // ç»ç”±é¡¶ç‚¹j中转则距离更短
                    minDist = dist[j];
                }
            }
            visited[v] = true;
            /*顶点v并入S,由v0到达v顶点的最短路径为min.
              å‡å®šç”±v0到v,再由v直达其余各点,更新当前最后一个经由点及距离*/
            for (int j = 0; j < vertexSize; j++) {
                if ((!visited[j]) && edgesMatrix[v][j] < MAX_VALUE) {
                    if (minDist + edgesMatrix[v][j] <= dist[j]) {
                        //如果多经由一个v点到达j点的 æœ€çŸ­è·¯å¾„反而要短,就更新
                        dist[j] = minDist + edgesMatrix[v][j];
                        prev[j] = v;                    //经由点的序号
                    }
                }
            }
        }
        for (int i = 1; i < matrixMaxVertex; i++) {
            System.out.println("**" + vertexesArray[v0] + "-->" +vertexesArray[i] + " çš„æœ€çŸ­è·¯å¾„是:" + dist[i]);
        }
    }
    //获取顶点值在数组里对应的索引
    private int getVertexIndex(Object obj) throws Exception {
        int index = -1;
        for (int i = 0; i < vertexSize; i++) {
            if (vertexesArray[i].equals(obj)) {
                index = i;
                break;
            }
        }
        if (index == -1) {
            throw new Exception("没有这个值!");
        }
        return index;
    }
    /**
     * å•源最短路径算法,用于计算一个节点到其他!!所有节点!!的最短路径
     */
    public void Dijkstra2(int v0) {
        // LinkedList实现了Queue接口 FIFO
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < vertexSize; i++) {
            visited[i] = false;
        }
        List<Map<String,Object>> result = new ArrayList<>();
        //这个循环是为了确保每个顶点都被遍历到
        int lastRow =0;
        for (int i = 0; i < vertexSize; i++) {
            if (!visited[i]) {
                queue.add(i);
                visited[i] = true;
                while (!queue.isEmpty()) {
                    int row = queue.remove();
                    Map<String,Object> map = new HashMap<>();
                    map.put("name", vertexesArray[row]);
                    map.put("row", row);
                    int tempDis =0;
                    if(row>0){
                        tempDis  = edgesMatrix[lastRow][row];
                        lastRow =row;
                    }
                    map.put("dis", tempDis);
                    result.add(map);
                    System.out.print(vertexesArray[row] + "-->");
                    for (int k = getMin(row); k >= 0; k = getMin(row)) {
                        if (!visited[k]) {
                            queue.add(k);
                            visited[k] = true;
                        }
                    }
                }
            }
        }
        System.out.println("");
        int totalDis =0;
        for(Map<String,Object> c :result){
            totalDis +=  (Integer) c.get("dis");
            System.out.print( c.get("name") + "--"+c.get("dis")+"-->");
        }
        System.out.println("");
        System.out.println("最短距离"+totalDis);
    }
    private int getMin( int row) {
        int minDist = MAX_VALUE;
        int index = 0;
        for (int j = 0; j < vertexSize; j++) {
            if ((!visited[j]) && edgesMatrix[row][j] < minDist) {
                minDist = edgesMatrix[row][j];
                index = j;
            }
        }
        if (index == 0) {
            return -1;
        }
        return index;
    }
    public boolean addVertex(Object val) {
        assert (val != null);
        vertexesArray[vertexSize] = val;
        vertexSize++;
        return true;
    }
    public boolean addEdge(int vnum1, int vnum2, int weight) {
        assert (vnum1 >= 0 && vnum2 >= 0 && vnum1 != vnum2 && weight >= 0);
        //有向图
        if (graphType) {
            edgesMatrix[vnum1][vnum2] = weight;
        } else {
            edgesMatrix[vnum1][vnum2] = weight;
            edgesMatrix[vnum2][vnum1] = weight;
        }
        return true;
    }
    public static void main(String[] args) throws Exception {
        GraphByMatrix graph = new GraphByMatrix(GraphByMatrix.DIRECTED_GRAPH, GraphByMatrix.ADJACENCY_MATRIX, 9);
        graph.addVertex("A");//0
        graph.addVertex("B");//1
        graph.addVertex("C");//2
        graph.addVertex("D");//3
        graph.addVertex("E");//4
        //A->B、C、D
        graph.addEdge(0, 1,10);
        graph.addEdge(0, 2,5);
        graph.addEdge(0, 3,7);
        //B->C、D、E
        graph.addEdge(1, 2,4);
        graph.addEdge(1, 3,5);
        graph.addEdge(1, 4,10);
        //C->B、D、E
        graph.addEdge(2, 1,4);
        graph.addEdge(2, 3,6);
        graph.addEdge(2, 4,5);
        //D->B、C、E
        graph.addEdge(3, 1,5);
        graph.addEdge(3, 2,6);
        graph.addEdge(3, 4,7);
        graph.Dijkstra(0);
        System.out.println();
        graph.Dijkstra("C");
        System.out.println();
        graph.Dijkstra2(0);
        System.out.println();
    }
}
server/system_service/src/main/java/com/doumee/core/utils/TspSolver.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,158 @@
package com.doumee.core.utils;
import com.google.ortools.Loader;
import com.google.ortools.constraintsolver.*;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TspSolver {
    public static void main(String[] args) throws Exception {
        // åˆå§‹åŒ–数据模型
        Loader.loadNativeLibraries();
        DataModel data = new DataModel();
        data.initDataList();//构造数据
        long start =System.currentTimeMillis();
        System.out.println("=============start=========="+start);
        //创建求解器manager对象,初始化求解器数据
        RoutingIndexManager manager =  new RoutingIndexManager(data.distanceMatrix.length, data.vehicleNumber, data.depot);
        // åˆå§‹åŒ–求解器
        RoutingModel routing = new RoutingModel(manager);
//        // æ³¨å†Œå›žè°ƒå‡½æ•°
        final int transitCallbackIndex =
                routing.registerTransitCallback((long fromIndex, long toIndex) -> {
                    int fromNode = manager.indexToNode(fromIndex);
                    int toNode = manager.indexToNode(toIndex);
                    return data.distanceMatrix[fromNode][toNode];
                });
        // å®šä¹‰å›žè°ƒå‡½æ•°è‡³æ¯æ¡è·¯çº¿
        routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
        // å¢žåŠ è·ç¦»ç»´åº¦çº¦æŸ
        routing.addDimension(transitCallbackIndex, 0, 30000,
                true,
                "Distance");
        RoutingDimension distanceDimension = routing.getMutableDimension("Distance");
        distanceDimension.setGlobalSpanCostCoefficient(100);
//        // æ·»åŠ å®¹é‡é™åˆ¶
        final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> {
            int fromNode = manager.indexToNode(fromIndex);
            return data.demands[fromNode];
        });
        routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, data.vehicleCapacities, true, "Capacity");
        Solver solver = routing.solver();
        //设置搜索方法
        RoutingSearchParameters searchParameters =
                main.defaultRoutingSearchParameters()
                        .toBuilder()
                        .setFirstSolutionStrategy(FirstSolutionStrategy.Value.PATH_CHEAPEST_ARC)
                        .build();
        // æ‰§è¡Œç®—法
        Assignment solution = routing.solveWithParameters(searchParameters);
        // æ‰“印路线
        printSolution(data, routing, manager, solution);
        long end =System.currentTimeMillis();
        System.out.println("=============end=========="+end);
        System.out.println("=============耗时=========="+(end -start)+"(ms)"+(end -start)/1000 +"s"+(end -start)/60/1000 +"m");
    }
    static void printSolution(
            DataModel data, RoutingModel routing, RoutingIndexManager manager, Assignment solution) {
        long maxRouteDistance = 0;
        for (int i = 0; i < data.vehicleNumber; ++i) {
            long index = routing.start(i);
            log.info("Route for Vehicle " + i + ":");
            long routeDistance = 0;
            int routeDemand = 0;
            String route = "";
            while (!routing.isEnd(index)) {
                route += manager.indexToNode(index) + " -> ";
                routeDemand += data.demands[manager.indexToNode(index)];
                long previousIndex = index;
                index = solution.value(routing.nextVar(index));
                routeDistance += routing.getArcCostForVehicle(previousIndex, index, i);
            }
            log.info(route + manager.indexToNode(index));
            log.info("Distance of the route: " + routeDistance + "m"+"  Capacity of the route:"+routeDemand+"/"+data.vehicleCapacities[i]);
            maxRouteDistance = Math.max(routeDistance, maxRouteDistance);
        }
        log.info("Maximum of the route distances: " + maxRouteDistance + "m");
    }
    static class DataModel {
        //距离矩阵
        public int lenght;
        //最大车辆限制
        public  int vehicleNumber;
        //起点
        public static final int depot = 0;
        //每一个点的商品的数量
        public   long[] demands;
        //车辆最大容载
        public   long[] vehicleCapacities ;
        public   long[][] distanceMatrix ;
        public   void initDataList(){
            lenght = 500;
            vehicleNumber = 8;
            demands = new long[lenght];
            vehicleCapacities =new long[vehicleNumber];
            distanceMatrix =  new long[lenght][lenght];
            int total0 =0;
            for (int i = 0; i <vehicleNumber ; i++) {
                long tem = (long) (Math.random() * 1000 + 20000);
                vehicleCapacities[i] = tem;
                total0+=tem;
                System.out.print(tem+" ,");
            }
            System.out.println( "\ntotal Capacity:"+total0+"=====================");
            long total = 0;
            for (int i = 0; i <lenght ; i++) {
                long tem =  (int)(Math.random()*100+100);
                demands[i] =tem;
                total+=tem;
                System.out.print(tem+" ,");
                for (int j = 0; j <lenght ; j++) {
                    if(i == j){
                        distanceMatrix[i][j] =0;
                    }
                    if(i<j){
                        distanceMatrix[i][j] =(int)(Math.random()*1000+1);
                        distanceMatrix[j][i] =    distanceMatrix[i][j];
                    }
                }
            }
            System.out.println( "\ntotal Demands:"+total+"=====================");
        }
       /* public final long[][] distanceMatrix = {
                {0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354, 468, 776, 662},
                {548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594, 480, 674, 1016, 868, 1210},
                {776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278, 1164, 1130, 788, 1552, 754},
                {696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514, 628, 822, 1164, 560, 1358},
                {582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400, 514, 708, 1050, 674, 1244},
                {274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 776, 662, 628, 514, 1050, 708},
                {502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1004, 890, 856, 514, 1278, 480},
                {194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468, 354, 320, 662, 742, 856},
                {308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810, 696, 662, 320, 1084, 514},
                {194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 536, 422, 388, 274, 810, 468},
                {536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878, 764, 730, 388, 1152, 354},
                {502, 594, 1278, 514, 400, 776, 1004, 468, 810, 536, 878, 0, 114, 308, 650, 274, 844},
                {388, 480, 1164, 628, 514, 662, 890, 354, 696, 422, 764, 114, 0, 194, 536, 388, 730},
                {354, 674, 1130, 822, 708, 628, 856, 320, 662, 388, 730, 308, 194, 0, 342, 422, 536},
                {468, 1016, 788, 1164, 1050, 514, 514, 662, 320, 274, 388, 650, 536, 342, 0, 764, 194},
                {776, 868, 1552, 560, 674, 1050, 1278, 742, 1084, 810, 1152, 274, 388, 422, 764, 0, 798},
                {662, 1210, 754, 1358, 1244, 708, 480, 856, 514, 468, 354, 844, 730, 536, 194, 798, 0},
        };*/
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Platform.java
@@ -94,11 +94,11 @@
    @ExcelColumn(name="工作结束时间")
    private String endTime;
    @ApiModelProperty(value = "同时作业数量", example = "1")
    @ExcelColumn(name="同时作业数量")
    @ApiModelProperty(value = "同时叫号数量", example = "1")
    @ExcelColumn(name="同时叫号数量")
    private Integer workingNum;
    @ApiModelProperty(value = "同时准备作业数量", example = "1")
    @ExcelColumn(name="同时准备作业数量")
    @ApiModelProperty(value = "同时准备叫号数量", example = "1")
    @ExcelColumn(name="同时准备叫号数量")
    private Integer callReadyNum;
    @ApiModelProperty(value = "作业超时报警时间(秒)", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformJob.java
@@ -32,7 +32,7 @@
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间",index = 12, dateFormat = "yyyy-MM-dd hh:mm:ss",width = 10)
   // @ExcelColumn(name="创建时间",index = 13, dateFormat = "yyyy-MM-dd hh:mm:ss",width = 10)
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
@@ -44,6 +44,7 @@
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "作业来源:0自建 1wms推送", example = "1")
     @ExcelColumn(name="状态",index =3,width = 6, valueMapping = "0=自建作业;1=WMS获取;")
    private Integer origin;
    @ApiModelProperty(value = "名称")
@@ -53,7 +54,7 @@
    private String remark;
    @ApiModelProperty(value = "状态 0待确认 1待签到 2等待叫号 3入园等待 4已叫号 5作业中 6作业完成 7转移中 8异常挂起 9已授权离园 10已离园 11 å·²è¿‡å·  12取消(WMS)" , example = "1")
    @ExcelColumn(name="状态",index =13,width = 6, valueMapping = "0=待确认;1=待签到;2=等待叫号;3=入园等待;4=已叫号;5=作业中;6=作业完成;7=转移中;8=异常挂起;9=已授权离园;10=已离园;11=已过号;12=取消(WMS);")
    @ExcelColumn(name="状态",index =10,width = 6, valueMapping = "0=待确认;1=待签到;2=等待叫号;3=入园等待;4=已叫号;5=作业中;6=作业完成;7=转移中;8=异常挂起;9=已授权离园;10=已离园;11=已过号;12=取消(WMS);")
    private Integer status;
    @ApiModelProperty(value = "车辆进入状态 0不在 1进入 " , example = "1")
@@ -73,18 +74,18 @@
    private Integer driverId;
    @ApiModelProperty(value = "司机姓名")
    @ExcelColumn(name="司机姓名",index = 4,width = 6)
    @ExcelColumn(name="司机姓名",index = 5,width = 6)
    private String driverName;
    @ApiModelProperty(value = "车牌号")
    private String plateNum;
    @ApiModelProperty(value = "司机手机号")
    @ExcelColumn(name="司机电话",index = 5,width = 8)
    @ExcelColumn(name="司机电话",index = 6,width = 8)
    private String drivierPhone;
    @ApiModelProperty(value = "签到时间")
    @ExcelColumn(name="签到时间",index =7,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
   // @ExcelColumn(name="签到时间",index =7,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date signDate;
    @ApiModelProperty(value = "签到方式 0app签到 1扫码签到 2后台签到", example = "1")
@@ -109,7 +110,7 @@
    private BigDecimal signDistance;
    @ApiModelProperty(value = "作业月台名称集合,多个使用英文逗号隔开")
    @ExcelColumn(name="作业月台名称",index =17 ,width = 8)
   // @ExcelColumn(name="作业月台名称",index =17 ,width = 8)
    private String platformNames;
    @ApiModelProperty(value = "作业月台编码集合,多个使用英文逗号隔开")
@@ -128,7 +129,7 @@
    private Integer inwaitUserId;
    @ApiModelProperty(value = "叫号时间")
    @ExcelColumn(name="叫号时间",index =8 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
   // @ExcelColumn(name="叫号时间",index =8 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date callDate;
    @ApiModelProperty(value = "叫号人编码", example = "1")
@@ -138,11 +139,11 @@
    private String callInfo;
    @ApiModelProperty(value = "开始作业时间")
    @ExcelColumn(name="开始作业时间",index =9 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
   // @ExcelColumn(name="开始作业时间",index =9 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date startDate;
    @ApiModelProperty(value = "作业完成时间(最终时间)")
    @ExcelColumn(name="作业完成时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
   // @ExcelColumn(name="作业完成时间",index =10 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date doneDate;
    @ApiModelProperty(value = "异常挂起时间")
@@ -196,7 +197,7 @@
    private Date inHkdate;
    @ApiModelProperty(value = "作业类型 0自有车卸货 1自有车装货 2外协车卸货 3外协车装货 4市公司外协车卸货", example = "1")
    @ExcelColumn(name="作业类型",index = 15,width = 6,valueMapping = "0=自有车卸货;1=自有车装货;2=外协车卸货;3=外协车装货;4=市公司外协车卸货")
    @ExcelColumn(name="作业类型",index = 7,width = 6,valueMapping = "0=自有车卸货;1=自有车装货;2=外协车卸货;3=外协车装货;4=市公司外协车卸货")
    private Integer type;
    @ApiModelProperty(value = "前车牌号")
@@ -204,7 +205,7 @@
    private String carCodeFront;
    @ApiModelProperty(value = "后车牌号")
    @ExcelColumn(name="后车牌号",index =3 ,width = 5)
   // @ExcelColumn(name="后车牌号",index =3 ,width = 5)
    private String carCodeBack;
    @ApiModelProperty(value = "司机所属部门编码", example = "1")
@@ -239,17 +240,17 @@
    private BigDecimal totalNum;
    @ApiModelProperty(value = "确认任务时间")
    @ExcelColumn(name="确认时间",index =6 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
   // @ExcelColumn(name="确认时间",index =6 ,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 10)
    private Date confirmTaskDate;
    @ApiModelProperty(value = "签到序号", example = "1")
    private Integer signNum;
    @ApiModelProperty(value = "是否标记虚拟月台组 0否 1是", example = "1")
    @ApiModelProperty(value = "是否更换过月台组 0否 1是", example = "1")
    private Integer  tagVirtual;
    @ApiModelProperty(value = "标记虚拟月台组时间", example = "1")
    @ApiModelProperty(value = "更换过月台组时间", example = "1")
    private Date  tagVirtualTime;
    @ApiModelProperty(value = "标记虚拟月台组人员编码", example = "1")
    @ApiModelProperty(value = "更换过月台组人员编码", example = "1")
    private Integer  tagVirtualUser;
    @ApiModelProperty(value = "叫号方式  0手动叫号 1自动叫号", example = "1")
    private Integer  callWay;
@@ -313,14 +314,14 @@
    @ApiModelProperty(value = "WMS任务时间")
    @TableField(exist = false)
    @ExcelColumn(name="WMS创建时间",index =18,width = 10)
    @ExcelColumn(name="WMS创建时间",index =9,width = 10)
    private String ioCreatedate;
    @ApiModelProperty(value = "离场下发操作人名称", example = "1")
    @TableField(exist = false)
    private String outUserName;
    @ApiModelProperty(value = "最后操作人名称", example = "1")
    @ExcelColumn(name="最后操作人名称",index = 15,width = 12)
    @ExcelColumn(name="最后操作人名称",index = 11,width = 12)
    @TableField(exist = false)
    private String editUserName;
@@ -333,7 +334,7 @@
    private Integer groupType ;
    @ApiModelProperty(value = "承运商")
    @ExcelColumn(name="运输公司",index = 16,width = 10)
    @ExcelColumn(name="运输公司",index = 4,width = 10)
    @TableField(exist = false)
    private String carrierName ;
@@ -355,7 +356,7 @@
    private Long workTime;
    @ApiModelProperty(value = "作业时长")
    @TableField(exist = false)
    @ExcelColumn(name="作业时长",index =11 ,width = 6)
   // @ExcelColumn(name="作业时长",index =11 ,width = 6)
    private String workTimeStr;
    @ApiModelProperty(value = "WMS任务信息")
@@ -413,7 +414,7 @@
    @ApiModelProperty(value = "月台组名称")
    @TableField(exist = false)
    @ExcelColumn(name="作业月台组",index =22,width = 10)
    @ExcelColumn(name="作业月台组",index = 8,width = 10)
    private String platformGroupName ;
    @ApiModelProperty(value = "月台工作时长" ,hidden = true)
@@ -433,7 +434,7 @@
    private String queryStatusForPower;
    @ApiModelProperty(value = "任务来源")
    @ExcelColumn(name="任务来源",index =14,valueMapping = "0=WMS获取;1=自主预约;")
   // @ExcelColumn(name="任务来源",index =14,valueMapping = "0=WMS获取;1=自主预约;")
    @TableField(exist = false)
    private Integer jobForm;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -2494,11 +2494,16 @@
        BeanUtils.copyProperties(model,platformJob);
        platformJob.setPlatformGroupId(param.getPlatformGroupId());
        platformJob.setEditDate(new Date());
        platformJob.setTagVirtual(Constants.ONE);
        platformJob.setTagVirtualUser(platformJob.getEditor());
        platformJob.setTagVirtualTime(platformJob.getEditDate());
        platformJob.setEditor(loginUser.getId());
       int flag =  platformJobMapper.update(null,new UpdateWrapper<PlatformJob>().lambda()
                .set(PlatformJob::getEditDate,platformJob.getEditDate())
                .set(PlatformJob::getTagVirtualTime,platformJob.getTagVirtualTime())
                .set(PlatformJob::getEditor,platformJob.getEditor())
                .set(PlatformJob::getPlatformGroupId,param.getPlatformGroupId())
                .set(PlatformJob::getTagVirtualUser,platformJob.getEditor())
                .set(PlatformJob::getPlatformId,null)//置空分配的月台信息
                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CONFIRM.getKey(),
                        Constants.PlatformJobStatus.WART_SIGN_IN.getKey(),