ll
liukangdong
2024-09-25 b33b256a0e996df1e8ca1859ba538fe3ea085509
ll
已修改14个文件
1910 ■■■■■ 文件已修改
admin/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 460 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operationCity.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/components/PlatformQueuing.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/platform.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/queueUp.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/taskDetail.vue 1031 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/api/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/center.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/queueup.vue 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -2,6 +2,6 @@
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://localhost:10010'
VUE_APP_API_URL  = 'http://192.168.0.103:10010'
# VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
# VUE_APP_API_URL  = 'http://192.168.0.103:10010'
VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
s
admin/src/views/business/internalMember.vue
@@ -1,195 +1,187 @@
<template>
    <TableLayout1 :permissions="['business:member:query']">
        <!-- 搜索表单 -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="" prop="keyword">
                <el-input v-model="searchForm.keyword" placeholder="请输入姓名/手机号/工号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="" prop="hasFace">
                <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" clearable placeholder="是否有人脸">
                    <el-option label="无" value="0"></el-option>
                    <el-option label="有" value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="canVisit">
                <el-select v-model="searchForm.canVisit" clearable @keypress.enter.native="search" placeholder="可拜访">
                    <el-option label="是" value="1"></el-option>
                    <el-option label="否" value="0"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="status">
                <el-select v-model="searchForm.status" @keypress.enter.native="search" clearable placeholder="状态">
                    <el-option label="正常" value="0"></el-option>
                    <el-option label="禁用" value="1"></el-option>
                    <el-option label="拉黑/冻结" value="2"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="hkStatus">
                <el-select v-model="searchForm.hkStatus" @keypress.enter.native="search" clearable placeholder="海康同步状态">
                    <el-option label="待同步" value="0"></el-option>
                    <el-option label="同步成功" value="1"></el-option>
                    <el-option label="同步失败" value="2"></el-option>
                </el-select>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <template v-slot:menu>
            <div style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">企业组织架构</div>
            <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
                <Tree :list="companyTree" :defaultProps="{name: 'name', status: 'fsStatus', children: 'childList', id: 'id'}" @callback="callback" />
  <TableLayout1 :permissions="['business:member:query']">
    <!-- 搜索表单 -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="" prop="keyword">
        <el-input v-model="searchForm.keyword" placeholder="请输入姓名/手机号/工号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="" prop="hasFace">
        <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" clearable placeholder="是否有人脸">
          <el-option label="无" value="0"></el-option>
          <el-option label="有" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="" prop="canVisit">
        <el-select v-model="searchForm.canVisit" clearable @keypress.enter.native="search" placeholder="可拜访">
          <el-option label="是" value="1"></el-option>
          <el-option label="否" value="0"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="" prop="status">
        <el-select v-model="searchForm.status" @keypress.enter.native="search" clearable placeholder="状态">
          <el-option label="正常" value="0"></el-option>
          <el-option label="禁用" value="1"></el-option>
          <el-option label="拉黑/冻结" value="2"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="" prop="hkStatus">
        <el-select v-model="searchForm.hkStatus" @keypress.enter.native="search" clearable placeholder="海康同步状态">
          <el-option label="待同步" value="0"></el-option>
          <el-option label="同步成功" value="1"></el-option>
          <el-option label="同步失败" value="2"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <template v-slot:menu>
      <div
        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
        企业组织架构</div>
      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
        <Tree :list="companyTree" :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
          @callback="callback" />
      </div>
    </template>
    <!-- 表格和分页 -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:member:delete', 'business:member:create,business:empower:create']">
        <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading"
            @click="synchronous()">同步</el-button></li>
        <li><el-button type="primary"
            @click="$refs.OperaMemberWindow.open('新建员工', null, department, searchForm.companyType)" icon="el-icon-plus"
            v-permissions="['business:member:create']">新建员工</el-button></li>
        <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入', searchForm.companyType)"
            icon="el-icon-plus" v-permissions="['business:member:create']">人员导入</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:member:delete']">批量删除</el-button></li>
        <li><el-button type="primary" v-permissions="['business:empower:create']" @click="startEmpowerBatch()"
            icon="el-icon-plus">下发授权</el-button></li>
        <li style="float: right">
          <el-checkbox style="font-size: 12px" label="1" v-model="searchForm.includeChild" key="1"
            @change="search">是否包含下级组织</el-checkbox>
        </li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="姓名" min-width="110px">
          <template slot-scope="{row}">
            <span>{{ row.name }}</span>
            <span class="zhuguan" v-if="row.headStatus == 1">主管</span>
          </template>
        </el-table-column>
        <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
        <el-table-column prop="idcardDecode" label="身份证号" min-width="100px"></el-table-column>
        <el-table-column label="性别" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.sex == 1">男</span>
            <span v-if="row.sex == 2">女</span>
          </template>
        </el-table-column>
        <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.status == 0" style="color: green">正常</span>
            <span v-if="row.status == 1" style="color: red">禁用</span>
            <span v-if="row.status == 2" style="color: red">拉黑/冻结</span>
          </template>
        </el-table-column>
        <el-table-column label="部门类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.companyType == 0">相关方组织</span>
            <span v-if="row.companyType == 1">内部组织</span>
          </template>
        </el-table-column>
        <el-table-column label="在职状态">
          <template slot-scope="{row}">
            <el-switch @change="changeWorkStatus($event, row)" v-model="row.workStatus" active-color="#13ce66"
              inactive-color="#ff4949" :active-value="0" :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column label="是否可拜访">
          <template slot-scope="{row}">
            <el-switch @change="changeCanvisit($event, row)" v-model="row.canVisit" active-color="#13ce66"
              inactive-color="#ff4949" :active-value="1" :inactive-value="0">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column label="海康同步状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.hkStatus == 0" style="color: #435EBE">待同步</span>
            <span v-if="row.hkStatus == 1" style="color: green">同步成功</span>
            <span v-if="row.hkStatus == 2" style="color: red">同步失败</span>
            <span v-if="row.hkStatus == 3" style="color: red">不符合下发条件</span>
          </template>
        </el-table-column>
        <el-table-column label="是否授权" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.authStatus == 1" style="color: green">是</span>
            <span v-if="row.authStatus == 0" style="color: red">否</span>
          </template>
        </el-table-column>
        <el-table-column label="门禁角色" min-width="100px">
          <template slot-scope="{row}">
            <span>{{ (row.roleNames && row.roleNames.length) ? row.roleNames.join(',') : '-' }}</span>
          </template>
        </el-table-column>
        <el-table-column label="门禁有效期" min-width="170px">
          <template slot-scope="{row}">
            <div v-if="row.roleId != null && row.roleId != ''">
              <div v-if="!row.startTime || !row.endTime">长期有效</div>
              <div v-else>
                <span>起:{{ row.startTime }}</span><br />
                <span>止:{{ row.endTime }}</span>
              </div>
            </div>
        </template>
        <!-- 表格和分页 -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:member:delete','business:member:create,business:empower:create']">
              <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">同步</el-button></li>
              <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('新建员工',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">新建员工</el-button></li>
              <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入',searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">人员导入</el-button></li>
              <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">批量删除</el-button></li>
              <li><el-button type="primary" v-permissions="['business:empower:create']"  @click="startEmpowerBatch()"  icon="el-icon-plus">下发授权</el-button></li>
              <li style="float: right">
                <el-checkbox style="font-size: 12px"  label="1" v-model="searchForm.includeChild" key="1"  @change="search" >是否包含下级组织</el-checkbox>
              </li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="姓名" min-width="110px">
                  <template slot-scope="{row}">
                    <span>{{ row.name }}</span>
                      <span class="zhuguan" v-if="row.headStatus == 1">主管</span>
                    </template>
                </el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="idcardDecode" label="身份证号" min-width="100px"></el-table-column>
                <el-table-column label="性别" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.sex == 1">男</span>
                        <span v-if="row.sex == 2">女</span>
                    </template>
                </el-table-column>
              <el-table-column prop="companyName" label="所属部门" min-width="100px"></el-table-column>
                <el-table-column prop="status" label="状态" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.status == 0" style="color: green">正常</span>
                        <span v-if="row.status == 1" style="color: red">禁用</span>
                        <span v-if="row.status == 2" style="color: red">拉黑/冻结</span>
                    </template>
                </el-table-column>
              <el-table-column label="部门类型" min-width="100px">
                <template slot-scope="{row}">
                  <span v-if="row.companyType == 0">相关方组织</span>
                  <span v-if="row.companyType == 1">内部组织</span>
                </template>
              </el-table-column>
              <el-table-column label="在职状态">
              <template slot-scope="{row}">
                <el-switch
                    @change="changeWorkStatus($event, row)"
                    v-model="row.workStatus"
                    active-color="#13ce66"
                    inactive-color="#ff4949"
                    :active-value="0"
                    :inactive-value="1">
                </el-switch>
              </template>
            </el-table-column>
              <el-table-column label="是否可拜访">
                <template slot-scope="{row}">
                  <el-switch
                      @change="changeCanvisit($event, row)"
                      v-model="row.canVisit"
                      active-color="#13ce66"
                      inactive-color="#ff4949"
                      :active-value="1"
                      :inactive-value="0">
                  </el-switch>
                </template>
              </el-table-column>
                <el-table-column label="海康同步状态" min-width="100px">
                 <template slot-scope="{row}">
                        <span v-if="row.hkStatus == 0" style="color: #435EBE">待同步</span>
                        <span v-if="row.hkStatus == 1" style="color: green">同步成功</span>
                        <span v-if="row.hkStatus == 2" style="color: red">同步失败</span>
                        <span v-if="row.hkStatus == 3" style="color: red">不符合下发条件</span>
                </template>
                </el-table-column>
                <el-table-column label="是否授权" min-width="100px">
                  <template slot-scope="{row}">
                    <span v-if="row.authStatus == 1" style="color: green">是</span>
                    <span v-if="row.authStatus == 0" style="color: red">否</span>
                  </template>
                </el-table-column>
                <el-table-column label="门禁角色" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{(row.roleNames && row.roleNames.length) ?row.roleNames.join(','): '-'}}</span>
                    </template>
                </el-table-column>
              <el-table-column label="门禁有效期" min-width="170px">
                <template slot-scope="{row}">
                  <div v-if="row.roleId !=null && row.roleId != ''">
                    <div v-if="!row.startTime || !row.endTime">长期有效</div>
                    <div v-else>
                      <span>起:{{row.startTime}}</span><br />
                      <span>止:{{row.endTime}}</span>
                    </div>
                  </div>
                  <div v-else >-</div>
                </template>
              </el-table-column>
              <el-table-column prop="code" label="工号" min-width="100px"></el-table-column>
              <el-table-column label="卡片" min-width="80px">
                <template slot-scope="{row}">
                  <el-button @click="$refs.cardOpeningRecord.open('开卡记录', row.id)" type="text">{{row.memberCardCount || '0'}}</el-button>
                </template>
              </el-table-column>
              <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
              <el-table-column prop="editDate" label="最后操作时间" min-width="150px"></el-table-column>
                <el-table-column fixed="right" label="人脸信息" min-width="100px">
                    <template slot-scope="{row}">
                        <el-image
                            v-if="row.faceImgFull"
                            style="width: 60px; height: 60px"
                            :src="row.faceImgFull"
                            :preview-src-list="[row.faceImgFull]">
                        </el-image>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:member:update', 'business:member:delete','business:empower:create'])"
                    label="操作"
                    min-width="280"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMemberWindow.open('编辑员工信息',row,department)" v-permissions="['business:empower:update']">编辑</el-button>
                      <el-button type="text"  icon="el-icon-plus" @click="empower(row.id)" v-permissions="['business:empower:create']">重新授权</el-button>
                      <el-button type="text" :loading="heading" style="color: red" icon="el-icon-delete" @click="updateHead(row,0)" v-if="row.headStatus ==1 " v-permissions="['business:member:head']">取消主管</el-button>
                      <el-button type="text" :loading="heading"  icon="el-icon-edit" @click="updateHead(row,1)"  v-if="row.headStatus  == 0"  v-permissions="['business:member:head']">设为主管</el-button>
                        <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:member:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
            <!--    查看人员开卡记录    -->
            <cardOpeningRecord ref="cardOpeningRecord" @success="handlePageChange" />
            <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
          <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
            <OperaMemberRoleWindow ref="OperaMemberRoleWindow" @success="handlePageChange" />
        </template>
    </TableLayout1>
            <div v-else>-</div>
          </template>
        </el-table-column>
        <el-table-column prop="code" label="工号" min-width="100px"></el-table-column>
        <el-table-column label="卡片" min-width="80px">
          <template slot-scope="{row}">
            <el-button @click="$refs.cardOpeningRecord.open('开卡记录', row.id)" type="text">{{ row.memberCardCount ||
              '0'}}</el-button>
          </template>
        </el-table-column>
        <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="最后操作时间" min-width="150px"></el-table-column>
        <el-table-column fixed="right" label="人脸信息" min-width="100px">
          <template slot-scope="{row}">
            <el-image v-if="row.faceImgFull" style="width: 60px; height: 60px" :src="row.faceImgFull"
              :preview-src-list="[row.faceImgFull]">
            </el-image>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:member:update', 'business:member:delete', 'business:empower:create'])"
          label="操作" min-width="280" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMemberWindow.open('编辑员工信息', row, department)"
              v-permissions="['business:empower:update']">编辑</el-button>
            <el-button type="text" icon="el-icon-plus" @click="empower(row.id)"
              v-permissions="['business:empower:create']">重新授权</el-button>
            <el-button type="text" :loading="heading" style="color: red" icon="el-icon-delete"
              @click="updateHead(row, 0)" v-if="row.headStatus == 1"
              v-permissions="['business:member:head']">取消主管</el-button>
            <el-button type="text" :loading="heading" icon="el-icon-edit" @click="updateHead(row, 1)"
              v-if="row.headStatus == 0" v-permissions="['business:member:head']">设为主管</el-button>
            <el-button type="text" icon="el-icon-delete" @click="deleteById(row)" style="color: red"
              v-permissions="['business:member:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
      <!--    查看人员开卡记录    -->
      <cardOpeningRecord ref="cardOpeningRecord" @success="handlePageChange" />
      <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
      <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
      <OperaMemberRoleWindow ref="OperaMemberRoleWindow" @success="handlePageChange" />
    </template>
  </TableLayout1>
</template>
<script>
@@ -206,8 +198,8 @@
export default {
  name: 'internalMember',
  extends: BaseTable,
  components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow ,OperaMemberImportWindow},
  data () {
  components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow, OperaMemberImportWindow },
  data() {
    return {
      TreeList: [],
      // 搜索
@@ -219,7 +211,7 @@
        canVisit: '',
        keyword: '',
        type: 2,
        companyType:1,
        companyType: 1,
        erpOrgId: '',
        companyId: '',
        hasFace: ''
@@ -232,7 +224,7 @@
      department: []
    }
  },
  created () {
  created() {
    this.config({
      module: '人员信息表',
      api: '/business/member',
@@ -243,7 +235,7 @@
    this.getfindCompanyTreePage()
  },
  methods: {
    startEmpowerBatch () {
    startEmpowerBatch() {
      if (this.tableData.selectedRows.length === 0) {
        this.$tip.warning('请至少选择一条数据')
        return
@@ -254,9 +246,9 @@
        ids.push(item.id)
        names.push(item.name)
      })
      this.$refs.OperaMemberRoleWindow.open('内部员工下发权限', ids, names,this.searchForm.companyType)
      this.$refs.OperaMemberRoleWindow.open('内部员工下发权限', ids, names, this.searchForm.companyType)
    },
    empower (id) {
    empower(id) {
      var that = this
      this.$confirm('确定重新授权吗?', '提示', {
        confirmButtonText: '确定',
@@ -273,7 +265,7 @@
      })
    },
    // 获取组织树
    getfindCompanyTreePage () {
    getfindCompanyTreePage() {
      fetchList()
        .then(res => {
          if (res && res.length > 0) {
@@ -285,7 +277,7 @@
          }
        })
    },
    getDepartmentTree (tree) {
    getDepartmentTree(tree) {
      if (tree == null) {
        return []
      }
@@ -300,16 +292,16 @@
          newItem.children = this.getDepartmentTree(newItem.children)
        }
        if(newItem.type === this.searchForm.companyType){
        if (newItem.type === this.searchForm.companyType) {
          //newItem.disabled =false
        }else{
        } else {
          newItem.disabled = true
        }
        return newItem
      })
    },
    // 同步信息
    async synchronous () {
    async synchronous() {
      this.$dialog.actionConfirm('该操作降触发全员信息更新和重新下发!请谨慎操作', '您确认全量同步内部人员信息吗?')
        .then(() => {
          this.loading = true
@@ -325,9 +317,9 @@
              this.loading = false
            })
        })
        .catch(() => {})
        .catch(() => { })
    },
    async updateHead (row, type) {
    async updateHead(row, type) {
      this.$dialog.actionConfirm('您确认进行当前操作吗?', '部门主管设置操作提示')
        .then(() => {
          this.heading = true
@@ -342,10 +334,10 @@
            .finally(() => {
              this.heading = false
            })
            .catch(() => {})
            .catch(() => { })
        })
    },
    changeWorkStatus (e, row) {
    changeWorkStatus(e, row) {
      this.working = true
      updateWorkStatus({ id: row.id, workStatus: e })
        .then(res => {
@@ -358,9 +350,9 @@
        .finally(() => {
          this.working = false
        })
        .catch(() => {})
        .catch(() => { })
    },
    changeCanvisit (e, row) {
    changeCanvisit(e, row) {
      this.canvisiting = true
      updateCanVisit({ id: row.id, canVisit: e })
        .then(res => {
@@ -373,9 +365,9 @@
        .finally(() => {
          this.canvisiting = false
        })
        .catch(() => {})
        .catch(() => { })
    },
    callback (row) {
    callback(row) {
      console.log(row)
      this.searchForm.erpOrgId = row.erpId
      this.searchForm.companyId = row.id
@@ -386,26 +378,30 @@
</script>
<style lang="scss" scoped>
 @import '@/assets/style/variables.scss';
    .box {
        width: 100%;
        display: flex;
        align-items: center;
        .box_menu {
            width: 100px;
            height: 100%;
            flex-shrink: 0;
        }
        .box_tab {
            flex: 1;
            height: 100%;
        }
    }
    .zhuguan{
      color: $primary-color;
      border: 1px solid $primary-color;
      padding: 0px 3px;
      border-radius: 4px;
      margin-left: 6px;
    }
@import '@/assets/style/variables.scss';
.box {
  width: 100%;
  display: flex;
  align-items: center;
  .box_menu {
    width: 100px;
    height: 100%;
    flex-shrink: 0;
  }
  .box_tab {
    flex: 1;
    height: 100%;
  }
}
.zhuguan {
  color: $primary-color;
  border: 1px solid $primary-color;
  padding: 0px 3px;
  border-radius: 4px;
  margin-left: 6px;
}
</style>
admin/src/views/platform/LogisticsRecord/operationCity.vue
@@ -26,7 +26,7 @@
      <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 />
      <el-table-column prop="confirmTaskDate" label="确认时间" min-width="150" show-overflow-tooltip />
      <!-- <el-table-column prop="confirmTaskDate" label="确认时间" min-width="150" show-overflow-tooltip /> -->
      <el-table-column prop="signDate" label="签到时间" min-width="150" show-overflow-tooltip />
      <el-table-column prop="callDate" label="叫号时间" min-width="150" show-overflow-tooltip />
      <el-table-column prop="startDate" label="作业开始时间" min-width="150" show-overflow-tooltip />
admin/src/views/platform/components/PlatformQueuing.vue
@@ -96,6 +96,7 @@
          platformId: activePlat.id
        }).then(() => {
          Message.success('叫号成功')
          this.$emit('success')
          this.getList()
        })
      } else {
admin/src/views/platform/platform.vue
@@ -13,10 +13,10 @@
            </el-option>
          </el-select>
        </el-form-item>
        <section>
        <!-- <section> -->
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
        </section>
        <!-- </section> -->
      </el-form>
    </SearchFormCollapse>
    <!-- 表格和分页 -->
h5/manifest.json
@@ -92,8 +92,8 @@
                "/admin_interface" : {
                    // 这个字段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://172.20.10.7:10010", // 代理服务器域名或IP地址
                    "target" : "http://192.168.0.100:10010", // 代理服务器域名或IP地址
                    // "target" : "http://10.50.250.178:8088/gateway_interface", // 代理服务器域名或IP地址
                    // "target" : "http://192.168.0.100:10010", // 代理服务器域名或IP地址
                    "target" : "http://10.50.250.178:8088/gateway_interface", // 代理服务器域名或IP地址
                    "changeOrigin" : true, // 允许跨域 
                    "pathRewrite" : {
                        "^/admin_interface" : ""
h5/pages/driver/index.vue
@@ -40,10 +40,11 @@
                                </view>
                            </view>
                            <view class="sub">
                                <view class="time" v-if="item.arriveDate">{{ item.arriveDate.slice(5) }}</view>
                                <view class="time" v-if="item.arriveDate && item.type == 4">{{ item.arriveDate.slice(5) }}</view>
                                <view class="time" v-if="item.type != 4 && item.platformWmsJob && item.platformWmsJob.ioCreatedate">{{ item.platformWmsJob.ioCreatedate.slice(5, 19) }}</view>
                                <view v-if="item.status == 0" class="sub_btn">确认任务</view>
                                <view v-if="item.status == 1" class="sub_btn">立即签到</view>
                                <view v-if="item.status == 2" class="sub_btn">查看排队</view>
                                <view v-if="item.status == 2" class="sub_btn" @click.stop="handleQueue(item)">查看排队</view>
                            </view>
                        </view>
                    </view>
@@ -129,9 +130,11 @@
            console.log(item);
            if(status == 0){
                uni.navigateTo({url: '/pages/driver/taskConfirm?id=' + item.id});
            }else if(status == 2){
                uni.navigateTo({url:'/pages/driver/queueUp?jobId=' + item.id})
            }else{
            }
            // else if(status == 2){
            //     uni.navigateTo({url:'/pages/driver/queueUp?jobId=' + item.id})
            // }
            else{
                uni.navigateTo({url: `/pages/driver/taskDetail?id=${item.id}&status=${item.status}`});
            }
        },
@@ -317,7 +320,8 @@
                display: flex;
                justify-content: space-between;
                align-items: center;
                padding: 0 30rpx 24rpx;
                height: 68rpx;
                padding: 0 30rpx 0;
                .time {
                    font-size: 26rpx;
                    color: #999999;
h5/pages/driver/login.vue
@@ -38,7 +38,7 @@
    return {
      form: {
                username: '18056814089',
                password: '1'
                password: '123456'
      },
      isShowProtocol: false,
      countDown: 0
h5/pages/driver/queueUp.vue
@@ -68,7 +68,7 @@
      driverLineUpDetail({
        mobile: jobId ? '' : uni.getStorageSync('driverInfo').mobile,
        queryType: jobId ? 1 : 0,
        jobId: jobId
        jobId: jobId,
      }).then(res => {
        this.platformGroupList = res.data.platformGroupList
        if (res.data && res.data.platformGroupList && res.data.platformGroupList.length > 0) {
h5/pages/driver/taskDetail.vue
@@ -1,485 +1,546 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <image
        class="bg"
        src="../../static/driver/bg_renwu@2x.png"
        mode=""
      ></image>
      <view class="name" v-if="param.status == 1">请与{{ param.arriveDate.slice(0,11) }}现场签到</view>
      <view class="name" v-if="param.status == 2">前方排队:{{param.lineUpNum}}辆</view>
      <view class="name" v-if="param.status == 5">月台作业中</view>
      <view class="name" v-if="param.status == 6">作业已完成</view>
      <view class="id_card">{{ param.carCodeFront }}</view>
      <view class="status">{{statusMap[param.status]}}</view>
    </view>
    <!--  -->
    <view class="main_content">
      <view class="line">
        <view class="label">司机姓名</view>
        <view class="value">{{param.driverName}}</view>
      </view>
      <view class="line">
        <view class="label">手机号</view>
        <view class="value">{{param.drivierPhone}}</view>
      </view>
            <template v-if="param.type != 4">
                <view class="line">
                  <view class="label">运输单号</view>
                  <view class="value" @click="showDetail = true">
                    <text class="waybill_num">{{param.billCode}}</text>
                    <text class="btn">运单详情</text>
                  </view>
                </view>
                <view class="line">
                  <view class="label">作业类型</view>
                  <view class="value">市公司外协车卸货</view>
                </view>
            </template>
            <template v-else>
                <view class="line">
                  <view class="label">合同编号</view>
                  <view class="value">{{param.contractNum}}</view>
                </view>
                <view class="line">
                  <view class="label">入库类型</view>
                  <view class="value">{{param.inType == 0 ? '整托盘' : '件烟'}}</view>
                </view>
                <view class="line">
                  <view class="label">作业量</view>
                  <view class="value">{{param.totalNum}}万支</view>
                </view>
            </template>
      <view class="line">
        <view class="label">车牌照</view>
        <view class="value">前:{{param.carCodeFront}} | 后:{{param.carCodeBack}}</view>
      </view>
      <!--  -->
      <view class="line" v-if="param.status == 1">
        <view class="label">距离园区</view>
        <view class="value">
          <view class="">{{param.getDistance}}公里</view>
          <view class="btn" @click="getLocation">
                        <image class="icon mr6" src="../../static/driver/position.png"></image>
            重新定位
          </view>
        </view>
      </view>
            <view class="line" v-if="param.signDate">
              <view class="label">签到时间</view>
              <view class="value">{{param.signDate}}</view>
            </view>
            <view class="line" v-if="param.startDate">
              <view class="label">开始作业</view>
              <view class="value">{{param.startDate}}</view>
            </view>
            <view class="line" v-if="param.doneDate">
              <view class="label">作业完成</view>
              <view class="value">{{param.doneDate}}</view>
            </view>
      <view v-if="param.status == 1" class="warnning">
        <u-icon name="info-circle" color="#ED4545" class="mr12"></u-icon>
        如无法获取定位,请用微信扫描园区大屏二维
      </view>
      <!--             <view class="line">
                <view class="label">签到时间</view>
                <view class="value">2022</view>
            </view>
            <view class="line">
                <view class="label">入园时间</view>
                <view class="value">2022</view>
            </view>
            <view class="line">
                <view class="label">作业完成</view>
                <view class="value">2022</view>
            </view> -->
      <view v-if="param.status == 1" class="signIn_wrap" @click="handleSignIn">
        <image
          :src="
            param.getDistance < signDistance
              ? require('@/static/driver/btn_qiandao@2x.png')
              : require('@/static/driver/btn_qiandao_fail@2x.png')
          "
          class="img"
          mode="widthFix"
        ></image>
        <view class="handle">{{ param.getDistance > signDistance ? '无法签到' : '签到' }}</view>
        <view class="time">{{nowTime}}</view>
      </view>
    </view>
    <view class="space"></view>
    <!-- 等待叫号 -->
    <view v-if="param.status == 2" class="padding_wrap">
      <view class="btn check" @click="handleQueue">查看排队情况</view>
    </view>
    <!-- modal -->
    <u-popup
      :show="showDetail"
      :round="10"
      :safeAreaInsetBottom="true"
      closeOnClickOverlay
      :closeable="true"
      mode="bottom"
      @close="showDetail = false"
    >
      <view class="detail_modal">
        <view class="modal_title">运单详情</view>
        <view class="id_card">
          <view class="last">皖</view>
          <view class="name">AD1111</view>
        </view>
        <!--  -->
        <view class="info">
          <view class="line">
            <view class="label">运输单号</view>
            <view class="value">2222</view>
          </view>
          <view class="line">
            <view class="label">驾驶员</view>
            <view class="value">2222</view>
          </view>
          <view class="line">
            <view class="label">总运输量</view>
            <view class="value">2222</view>
          </view>
          <view class="line">
            <view class="label">运输公司</view>
            <view class="value">2222</view>
          </view>
        </view>
        <view class="separate"></view>
        <view class="contract_list">
          <view class="title">合同号:111</view>
          <view class="address">aadd</view>
          <view class="list">
            <view class="line">
              <view class="label">物料:</view>
              <view class="value">黄山黑马</view>
            </view>
            <view class="line">
              <view class="label">数量:</view>
              <view class="value">黄山黑马</view>
            </view>
            <view class="line">
              <view class="label">物料:</view>
              <view class="value">黄山黑马</view>
            </view>
            <view class="line">
              <view class="label">数量:</view>
              <view class="value">黄山黑马</view>
            </view>
          </view>
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script>
    import { driverTaskJobDetail, driverSignInTask } from '@/api';
    import { statusMap } from '@/utils/config.js';
    import dayjs from 'dayjs';
export default {
  data() {
    return {
            statusMap,
      param: {
        status: '0'
      },
            jobId: '',
            // lat: '',
            // lnt: '',
            lat: '31.783205',
            lnt: '117.262635',
            nowTime: '',
            signDistance: uni.getStorageSync('driverGuide').signDistance,
      showDetail: false,
    }
  },
    onLoad(option) {
        this.jobId = option.id
        // if(option.status && option.status == '1'){
        //     this.getLocation()
        // }else{
        //     this.getDetail()
        // }
        this.getDetail()
        setInterval(() => {
            this.nowTime = dayjs().format('HH:mm:ss')
        })
    },
  methods: {
    handleSignIn() {
            const { param, signDistance, lat, lnt, jobId } = this
            if(param.getDistance > signDistance) return
            driverSignInTask({
                jobId, lat, lnt,signType: 0
            }).then(res => {
                this.showToast('签到成功')
                this.getDetail()
            })
    },
        getDetail() {
            const { jobId, lat, lnt } = this
            driverTaskJobDetail({
                jobId: this.jobId,
                lat,
                lnt
            }).then(ress => {
                this.param = { ...ress.data }
            })
        },
    getLocation() {
            const { jobId } = this
      uni.getLocation({
        type: 'wgs84',
        success: (res) => {
                    this.lat = res.latitude
                    this.lnt = res.longitude
                    this.getDetail()
        },
                fail:(err) => {
                    this.showToast('获取定位失败')
                }
      })
    },
        handleQueue() {
            uni.navigateTo({
                url:'/pages/driver/queueUp?jobId=' + this.jobId
            })
        },
  }
}
</script>
<style lang="scss">
.main_app {
  padding: 0;
  .main_content {
    background: #ffffff;
    border-radius: 20rpx 20rpx 0rpx 0rpx;
    padding: 16rpx 30rpx;
    position: relative;
    bottom: 32rpx;
        z-index: 999;
    .line {
      padding: 24rpx 0 28rpx;
      border-bottom: 1rpx solid #e5e5e5;
      display: flex;
      .label {
        width: 150rpx;
        font-size: 30rpx;
        color: #666666;
      }
      .value {
        flex: 1;
        display: flex;
        justify-content: space-between;
        align-items: center;
        font-size: 30rpx;
        .waybill_num {
          flex: 1;
        }
        .btn {
          font-size: 28rpx;
          color: $uni-color-primary;
          display: flex;
                    align-items: center;
                    .icon{
                        width: 30rpx;
                        height: 30rpx;
                    }
        }
      }
    }
    .warnning {
      display: flex;
      color: #ed4545;
      align-items: center;
      margin: 40rpx 0;
    }
    .signIn_wrap {
      margin: 80rpx auto;
      width: 260rpx;
      height: 260rpx;
      position: relative;
      color: #fff;
      z-index: 1;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      .handle {
        font-weight: 600;
        font-size: 40rpx;
        line-height: 56rpx;
      }
      .time {
        color: rgba(255, 255, 255, 0.7);
      }
      .img {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        z-index: -1;
      }
    }
  }
  .status_wrap {
    height: 200rpx;
    width: 100%;
    padding: 30rpx;
    position: relative;
    color: #fff;
    .bg {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      z-index: -1;
    }
    .name {
      font-weight: 600;
      font-size: 40rpx;
      line-height: 56rpx;
      margin-bottom: 12rpx;
    }
    .id_card {
      color: rgba(255, 255, 255, 0.8);
    }
    .status {
      position: absolute;
      right: 0;
      top: 30rpx;
      height: 68rpx;
      line-height: 68rpx;
      background: #ffffff;
      padding: 0 24rpx;
      border-radius: 34rpx 0rpx 0rpx 34rpx;
      font-size: 26rpx;
      color: $uni-color-primary;
    }
  }
  .space {
    width: 750rpx;
    height: 200rpx;
  }
  .padding_wrap {
    position: fixed;
        z-index: 999;
    padding: 0 30rpx 64rpx;
    bottom: 0;
    left: 0;
    width: 100%;
    display: flex;
    justify-content: space-between;
    .btn {
      height: 96rpx;
      line-height: 96rpx;
      text-align: center;
      width: 100%;
      font-size: 36rpx;
      color: #333333;
      background: #ffffff;
      border-radius: 48rpx;
      border: 1rpx solid #999999;
    }
    .check {
      background: $uni-color-primary;
      border: 1rpx solid $uni-color-primary;
      color: #fff;
    }
  }
}
.detail_modal {
  padding: 36rpx 30rpx;
  .modal_title {
    font-weight: 600;
    font-size: 32rpx;
    color: #222222;
    line-height: 44rpx;
    text-align: center;
    margin-bottom: 36rpx;
  }
  .contract_list {
    .list {
      background: #f7f7f7;
      border-radius: 8rpx;
      padding: 20rpx;
      .line {
        display: flex;
        margin-bottom: 20rpx;
        &:nth-of-type(3n) {
          border-top: 1rpx solid #e5e5e5;
          padding-top: 20rpx;
        }
        .label {
          color: #666666;
          width: 86rpx;
        }
        .value {
          flex: 1;
          color: #222222;
        }
      }
    }
    .title {
      font-weight: 600;
      font-size: 30rpx;
      color: $uni-color-primary;
      margin-bottom: 12rpx;
    }
    .address {
      font-size: 26rpx;
      color: #666666;
      margin-bottom: 20rpx;
    }
  }
  .info {
    .line {
      display: flex;
      margin-bottom: 20rpx;
      .label {
        font-size: 30rpx;
        color: #666666;
        width: 150rpx;
      }
      .value {
        flex: 1;
        font-size: 30rpx;
        color: #222222;
      }
    }
  }
  .separate {
    width: 750rpx;
    height: 2rpx;
    margin: 30rpx -30rpx;
    border: 1rpx solid #e5e5e5;
  }
  .id_card {
    border-radius: 8rpx;
    display: flex;
    height: 60rpx;
    line-height: 60rpx;
    font-weight: 600;
    font-size: 36rpx;
    color: #111111;
    text-align: center;
    margin-bottom: 30rpx;
    .last {
      background: #e9f5f6;
      width: 60rpx;
      border-radius: 8rpx 0rpx 0rpx 8rpx;
      border: 1rpx solid #dfdede;
    }
    .name {
      width: 186rpx;
      border: 1rpx solid #dfdede;
    }
  }
}
</style>
<template>
    <view class="main_app">
        <view class="status_wrap">
            <image class="bg" src="../../static/driver/bg_renwu@2x.png" mode=""></image>
            <view class="name" v-if="param.status == 1">请与{{ param.arriveDate.slice(0,11) }}现场签到</view>
            <view class="name" v-if="param.status == 2">前方排队:{{param.lineUpNum}}辆</view>
            <view class="name" v-if="param.status == 3">入园等待</view>
            <view class="name" v-if="param.status == 5">月台作业中</view>
            <view class="name" v-if="param.status == 6">作业已完成</view>
            <view class="id_card">{{ param.carCodeFront }}</view>
            <view class="status">{{statusMap[param.status]}}</view>
        </view>
        <!--  -->
        <view class="main_content">
            <view class="line">
                <view class="label">司机姓名</view>
                <view class="value">{{param.driverName}}</view>
            </view>
            <view class="line">
                <view class="label">手机号</view>
                <view class="value">{{param.drivierPhone}}</view>
            </view>
            <template v-if="param.type != 4">
                <view class="line">
                    <view class="label">运输单号</view>
                    <view class="value" @click="wmsDetail">
                        <text class="waybill_num">{{param.billCode}}</text>
                        <text class="btn">运单详情</text>
                    </view>
                </view>
                <view class="line">
                    <view class="label">作业类型</view>
                    <view class="value" v-if="param.type == 0">自有车卸货</view>
                    <view class="value" v-if="param.type == 1">自有车装货</view>
                    <view class="value" v-if="param.type == 2">外协车卸货</view>
                    <view class="value" v-if="param.type == 3">外协车装货</view>
                </view>
            </template>
            <template v-else>
                <view class="line">
                    <view class="label">合同编号</view>
                    <view class="value">{{param.contractNum}}</view>
                </view>
                <view class="line">
                    <view class="label">入库类型</view>
                    <view class="value">{{param.inType == 0 ? '整托盘' : '件烟'}}</view>
                </view>
                <view class="line">
                    <view class="label">作业量</view>
                    <view class="value">{{param.totalNum}}万支</view>
                </view>
            </template>
            <view class="line">
                <view class="label">车牌照</view>
                <view class="value">前:{{param.carCodeFront}} | 后:{{param.carCodeBack}}</view>
            </view>
            <!--  -->
            <view class="line" v-if="param.status == 1">
                <view class="label">距离园区</view>
                <view class="value">
                    <view class="">{{param.getDistance}}公里</view>
                    <view class="btn" @click="getLocation">
                        <image class="icon mr6" src="../../static/driver/position.png"></image>
                        重新定位
                    </view>
                </view>
            </view>
            <view class="line" v-if="param.signDate">
                <view class="label">签到时间</view>
                <view class="value">{{param.signDate}}</view>
            </view>
            <view class="line" v-if="param.startDate">
                <view class="label">开始作业</view>
                <view class="value">{{param.startDate}}</view>
            </view>
            <view class="line" v-if="param.doneDate">
                <view class="label">作业完成</view>
                <view class="value">{{param.doneDate}}</view>
            </view>
            <view v-if="param.status == 1" class="warnning">
                <u-icon name="info-circle" color="#ED4545" class="mr12"></u-icon>
                如无法获取定位,请用微信扫描园区大屏二维
            </view>
            <!--             <view class="line">
                <view class="label">签到时间</view>
                <view class="value">2022</view>
            </view>
            <view class="line">
                <view class="label">入园时间</view>
                <view class="value">2022</view>
            </view>
            <view class="line">
                <view class="label">作业完成</view>
                <view class="value">2022</view>
            </view> -->
            <view v-if="param.status == 1" class="signIn_wrap" @click="handleSignIn">
                <image :src="
            param.getDistance < signDistance
              ? require('@/static/driver/btn_qiandao@2x.png')
              : require('@/static/driver/btn_qiandao_fail@2x.png')
          " class="img" mode="widthFix"></image>
                <view class="handle">{{ param.getDistance > signDistance ? '无法签到' : '签到' }}</view>
                <view class="time">{{nowTime}}</view>
            </view>
        </view>
        <view class="space"></view>
        <!-- 等待叫号 -->
        <view v-if="param.status == 2" class="padding_wrap">
            <view class="btn check" @click="handleQueue">查看排队情况</view>
        </view>
        <!-- modal -->
        <u-popup :show="showDetail" :round="10" :safeAreaInsetBottom="true" closeOnClickOverlay :closeable="true"
            mode="bottom" @close="showDetail = false">
            <view class="detail_modal">
                <view class="modal_title">运单详情</view>
                <view v-if="wmsInfo.plateNumber" class="id_card">
                    <text>{{ wmsInfo.plateNumber.slice(0, 1) }}</text>
                    <text>{{ wmsInfo.plateNumber.slice(1, 2) }}</text>
                    <text>·</text>
                    <text>{{ wmsInfo.plateNumber.slice(2) }}</text>
                </view>
                <!--  -->
                <view class="info">
                    <view class="line">
                        <view class="label">运输单号</view>
                        <view class="value">{{ wmsInfo.carryBillCode }}</view>
                    </view>
                    <view class="line">
                        <view class="label">驾驶员</view>
                        <view class="value">{{ wmsInfo.driverName }} {{ wmsInfo.driverPhone }}</view>
                    </view>
                    <view class="line">
                        <view class="label">总运输量</view>
                        <view class="value">{{ wmsInfo.ioQty }}万支</view>
                    </view>
                    <view class="line">
                        <view class="label">运输公司</view>
                        <view class="value">{{ wmsInfo.carrierName }}</view>
                    </view>
                </view>
                <view class="separate"></view>
                <view class="contract_list" v-for="item in wmsInfo.wmsJobContractVOList">
                    <view class="title">合同号:{{ item.contractCode }}</view>
                    <view class="address">收货地:{{ item.address }}</view>
                    <view class="list">
                        <view class="item" v-for="line in item.platformWmsDetailList">
                            <view class="line">
                                <view class="label">物料:</view>
                                <view class="value">{{ line.materialName }}</view>
                            </view>
                            <view class="line">
                                <view class="label">数量:</view>
                                <view class="value">{{ line.ioQty }}</view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    import {
        driverTaskJobDetail,
        driverSignInTask,
        wmsJobDetail
    } from '@/api';
    import {
        statusMap
    } from '@/utils/config.js';
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                statusMap,
                param: {
                    status: '0'
                },
                jobId: '',
                // lat: '',
                // lnt: '',
                lat: '31.783205',
                lnt: '117.262635',
                nowTime: '',
                wmsInfo: {},
                signDistance: uni.getStorageSync('driverGuide').signDistance,
                showDetail: false,
            }
        },
        onLoad(option) {
            this.jobId = option.id
            // if(option.status && option.status == '1'){
            //     this.getLocation()
            // }else{
            //     this.getDetail()
            // }
            this.getDetail()
            setInterval(() => {
                this.nowTime = dayjs().format('HH:mm:ss')
            })
        },
        methods: {
            handleSignIn() {
                const {
                    param,
                    signDistance,
                    lat,
                    lnt,
                    jobId
                } = this
                if (param.getDistance > signDistance) return
                driverSignInTask({
                    jobId,
                    lat,
                    lnt,
                    signType: 0
                }).then(res => {
                    this.showToast('签到成功')
                    this.getDetail()
                })
            },
            getDetail() {
                const {
                    jobId,
                    lat,
                    lnt
                } = this
                driverTaskJobDetail({
                    jobId: this.jobId,
                    lat,
                    lnt
                }).then(ress => {
                    this.param = {
                        ...ress.data
                    }
                })
            },
            wmsDetail() {
                const {
                    param
                } = this
                wmsJobDetail({
                    id: param.id
                }).then(res => {
                    this.wmsInfo = res.data
                    this.showDetail = true
                })
            },
            getLocation() {
                const {
                    jobId
                } = this
                uni.getLocation({
                    type: 'wgs84',
                    success: (res) => {
                        this.lat = res.latitude
                        this.lnt = res.longitude
                        this.getDetail()
                    },
                    fail: (err) => {
                        this.showToast('获取定位失败')
                    }
                })
            },
            handleQueue() {
                uni.navigateTo({
                    url: '/pages/driver/queueUp?jobId=' + this.jobId
                })
            },
        }
    }
</script>
<style lang="scss">
    .main_app {
        padding: 0;
        .main_content {
            background: #ffffff;
            border-radius: 20rpx 20rpx 0rpx 0rpx;
            padding: 16rpx 30rpx;
            position: relative;
            bottom: 32rpx;
            z-index: 999;
            .line {
                padding: 24rpx 0 28rpx;
                border-bottom: 1rpx solid #e5e5e5;
                display: flex;
                .label {
                    width: 150rpx;
                    font-size: 30rpx;
                    color: #666666;
                }
                .value {
                    flex: 1;
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    font-size: 30rpx;
                    .waybill_num {
                        flex: 1;
                    }
                    .btn {
                        font-size: 28rpx;
                        color: $uni-color-primary;
                        display: flex;
                        align-items: center;
                        .icon {
                            width: 30rpx;
                            height: 30rpx;
                        }
                    }
                }
            }
            .warnning {
                display: flex;
                color: #ed4545;
                align-items: center;
                margin: 40rpx 0;
            }
            .signIn_wrap {
                margin: 80rpx auto;
                width: 260rpx;
                height: 260rpx;
                position: relative;
                color: #fff;
                z-index: 1;
                display: flex;
                flex-direction: column;
                justify-content: center;
                align-items: center;
                .handle {
                    font-weight: 600;
                    font-size: 40rpx;
                    line-height: 56rpx;
                }
                .time {
                    color: rgba(255, 255, 255, 0.7);
                }
                .img {
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: 100%;
                    z-index: -1;
                }
            }
        }
        .status_wrap {
            height: 200rpx;
            width: 100%;
            padding: 30rpx;
            position: relative;
            color: #fff;
            .bg {
                width: 100%;
                height: 100%;
                position: absolute;
                top: 0;
                left: 0;
                z-index: -1;
            }
            .name {
                font-weight: 600;
                font-size: 40rpx;
                line-height: 56rpx;
                margin-bottom: 12rpx;
            }
            .id_card {
                color: rgba(255, 255, 255, 0.8);
            }
            .status {
                position: absolute;
                right: 0;
                top: 30rpx;
                height: 68rpx;
                line-height: 68rpx;
                background: #ffffff;
                padding: 0 24rpx;
                border-radius: 34rpx 0rpx 0rpx 34rpx;
                font-size: 26rpx;
                color: $uni-color-primary;
            }
        }
        .space {
            width: 750rpx;
            height: 200rpx;
        }
        .padding_wrap {
            position: fixed;
            z-index: 999;
            padding: 0 30rpx 64rpx;
            bottom: 0;
            left: 0;
            width: 100%;
            display: flex;
            justify-content: space-between;
            .btn {
                height: 96rpx;
                line-height: 96rpx;
                text-align: center;
                width: 100%;
                font-size: 36rpx;
                color: #333333;
                background: #ffffff;
                border-radius: 48rpx;
                border: 1rpx solid #999999;
            }
            .check {
                background: $uni-color-primary;
                border: 1rpx solid $uni-color-primary;
                color: #fff;
            }
        }
    }
    .detail_modal {
        padding: 36rpx 30rpx;
        .modal_title {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            line-height: 44rpx;
            text-align: center;
            margin-bottom: 36rpx;
        }
        .contract_list {
            .list {
                background: #f7f7f7;
                border-radius: 8rpx;
                padding: 20rpx;
                .line {
                    display: flex;
                    margin-bottom: 20rpx;
                    &:nth-of-type(3n) {
                        border-top: 1rpx solid #e5e5e5;
                        padding-top: 20rpx;
                    }
                    .label {
                        color: #666666;
                        width: 86rpx;
                    }
                    .value {
                        flex: 1;
                        color: #222222;
                    }
                }
            }
            .title {
                font-weight: 600;
                font-size: 30rpx;
                color: $uni-color-primary;
                margin-bottom: 12rpx;
            }
            .address {
                font-size: 26rpx;
                color: #666666;
                margin-bottom: 20rpx;
            }
        }
        .info {
            .line {
                display: flex;
                margin-bottom: 20rpx;
                .label {
                    font-size: 30rpx;
                    color: #666666;
                    width: 150rpx;
                }
                .value {
                    flex: 1;
                    font-size: 30rpx;
                    color: #222222;
                }
            }
        }
        .separate {
            width: 750rpx;
            height: 2rpx;
            margin: 30rpx -30rpx;
            border: 1rpx solid #e5e5e5;
        }
        .id_card {
            display: flex;
            font-weight: 600;
            height: 60rpx;
            line-height: 60rpx;
            font-size: 32rpx;
            color: #111111;
            border-radius: 8rpx;
            border: 1rpx solid #dfdede;
            width: 220rpx;
            margin-bottom: 15rpx;
            text {
                &:nth-of-type(1) {
                    background: #e9f5f6;
                    padding: 0 12rpx;
                }
                &:nth-of-type(2) {
                    padding-left: 10rpx;
                }
                &:nth-of-type(4) {
                    padding-right: 6rpx;
                }
            }
        }
    }
</style>
pda/api/index.js
@@ -149,4 +149,12 @@
    method: 'post',
    data
  })
}
//  wms运单详情
export const wmsJobDetail = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/pdaPlatform/wmsJobDetail',
    method: 'get',
    data
  })
}
pda/manifest.json
@@ -18,8 +18,8 @@
            "proxy": {
                "/gateway_interface": {
                    // 这个字段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://10.50.250.178:8088/gateway_interface", // 代理服务器域名或IP地址
                    "target": "http://192.168.0.100:10010", // 代理服务器域名或IP地址
                    "target" : "http://10.50.250.178:8088/gateway_interface", // 代理服务器域名或IP地址
                    // "target": "http://192.168.0.100:10010", // 代理服务器域名或IP地址
                    "changeOrigin": true, // 允许跨域 
                    "pathRewrite": {
                        "^/gateway_interface": "" // 重写地址,如果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
pda/pages/index/center.vue
@@ -6,7 +6,8 @@
            <view class="platform_list">
                <view class="item" :class="{ active: item.id === activePlatform.id }"
                    v-for="(item, index) in activePlatformGroup.platformList" :key="index" @click="platformClick(item)">
                    {{ item.name }}</view>
                    {{ item.name }}
                </view>
            </view>
            <view class="status_wrap">
                <view class="status">作业:<text>{{ platformTaskInfo.workNum }}</text></view>
@@ -26,7 +27,8 @@
                        <text>{{ item.carCodeFront.slice(2) }}</text>
                    </view>
                    <view class="status" v-if="item.status != 4 && item.status != 5" :class="{ red: item.status == 8 }">
                        {{ statusMap[item.status] }}</view>
                        {{ statusMap[item.status] }}
                    </view>
                    <view class="status" v-if="item.status == 4">叫号中 {{ item.callDateTemp }}</view>
                    <view class="status scs" v-if="item.status == 5">已作业 {{ item.startDateTemp }}</view>
                </view>
@@ -37,7 +39,7 @@
                <view class="line" v-else>
                    <text class="label">运输单号</text>
                    <text class="value">{{ item.code }}</text>
                    <text class="primaryColor" @click="handleDetail()">运单详情</text>
                    <text class="primaryColor" @click="handleDetail(item)">运单详情</text>
                </view>
                <view class="line">
                    <text class="label">驾驶员</text>
@@ -100,8 +102,8 @@
                            </view>
                            <view class="line" v-else>
                                <text class="label">运输单号</text>
                                <text class="value">{{ item.code }}</text>
                                <text class="primaryColor" @click="handleDetail()">运单详情</text>
                                <text class="value">{{ item.billCode }}</text>
                                <text class="primaryColor" @click="handleDetail(item)">运单详情</text>
                            </view>
                            <view class="line">
                                <text class="label">驾驶员</text>
@@ -124,53 +126,48 @@
            </view>
        </u-popup>
        <!-- 运单详情 -->
        <u-popup :show="showDetail" closeable safeAreaInsetTop round="10" @close="showDetail = false">
            <view class="PlatformCallModal" :style="{ height: 'calc(100vh - ' + windowTop + 'px)' }">
                <view class="title">运单详情</view>
                <view class="platform_ing" style="padding: 0">
                    <view class="head">
                        <view class="code">
                            <text>皖</text>
                            <text>AD1212</text>
                        </view>
        <u-popup :show="showDetail" :round="10" :safeAreaInsetBottom="true" closeOnClickOverlay :closeable="true"
            mode="bottom" @close="showDetail = false">
            <view class="detail_modal">
                <view class="modal_title">运单详情</view>
                <view v-if="wmsInfo.plateNumber" class="id_card">
                    <text>{{ wmsInfo.plateNumber.slice(0, 1) }}</text>
                    <text>{{ wmsInfo.plateNumber.slice(1, 2) }}</text>
                    <text>·</text>
                    <text>{{ wmsInfo.plateNumber.slice(2) }}</text>
                </view>
                <!--  -->
                <view class="info">
                    <view class="line">
                        <view class="label">运输单号</view>
                        <view class="value">{{ wmsInfo.carryBillCode }}</view>
                    </view>
                    <view class="line">
                        <text class="label">运输单号</text>
                        <text class="value">11111</text>
                        <view class="label">驾驶员</view>
                        <view class="value">{{ wmsInfo.driverName }} {{ wmsInfo.driverPhone }}</view>
                    </view>
                    <view class="line">
                        <text class="label">驾驶员</text>
                        <text class="value">11111</text>
                        <view class="label">总运输量</view>
                        <view class="value">{{ wmsInfo.ioQty }}万支</view>
                    </view>
                    <view class="line">
                        <text class="label">总运输量</text>
                        <text class="value">11111</text>
                    </view>
                    <view class="line">
                        <text class="label">运输公司</text>
                        <text class="value">11111</text>
                        <view class="label">运输公司</view>
                        <view class="value">{{ wmsInfo.carrierName }}</view>
                    </view>
                </view>
                <view class="detail_list">
                    <view class="item">
                        <view class="orderId">合同编号:{{ 111 }}</view>
                        <view class="addr">收货地:{{ 111 }}</view>
                        <view class="content">
                <view class="separate"></view>
                <view class="contract_list" v-for="item in wmsInfo.wmsJobContractVOList">
                    <view class="title">合同号:{{ item.contractCode }}</view>
                    <view class="address">收货地:{{ item.address }}</view>
                    <view class="list">
                        <view class="item" v-for="line in item.platformWmsDetailList">
                            <view class="line">
                                <view class="label">物料:</view>
                                <view class="value">黄山</view>
                                <view class="value">{{ line.materialName }}</view>
                            </view>
                            <view class="line">
                                <view class="label">数量:</view>
                                <view class="value">黄山</view>
                            </view>
                            <view class="line">
                                <view class="label">物料:</view>
                                <view class="value">黄山</view>
                            </view>
                            <view class="line">
                                <view class="label">数量:</view>
                                <view class="value">黄山</view>
                                <view class="value">{{ line.ioQty }}万支</view>
                            </view>
                        </view>
                    </view>
@@ -213,7 +210,8 @@
        finishWork,
        platformMove,
        platformErr,
        platformOverNumber
        platformOverNumber,
        wmsJobDetail
    } from '@/api'
    import {
        statusMap
@@ -245,6 +243,7 @@
                transformPlatId: '', // 转移记录月台id
                transformId: '', // 转移记录任务id
                wmsInfo: {}
            }
        },
        onLoad() {
@@ -317,8 +316,13 @@
                this.activePlatform = item
                this.getPlatformTask()
            },
            handleDetail() {
                this.showDetail = true
            handleDetail(param) {
                wmsJobDetail({
                    id: param.id
                }).then(res => {
                    this.wmsInfo = res.data
                    this.showDetail = true
                })
            },
            handleFinish(item) {
                finishWork({
@@ -362,7 +366,8 @@
                this.platformCallPage = 1
                if (callType == 1) { // 入园叫号
                    platformInPark({
                        jobId: item.id
                        jobId: item.id,
                        platformId: activePlatform.id
                    }).then(res => {
                        this.showToast('叫号成功')
                        this.getPlatformCallList()
@@ -848,4 +853,112 @@
            }
        }
    }
    .detail_modal {
        padding: 36rpx 30rpx;
        .modal_title {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            line-height: 44rpx;
            text-align: center;
            margin-bottom: 36rpx;
        }
        .contract_list {
            .list {
                background: #f7f7f7;
                border-radius: 8rpx;
                padding: 20rpx;
                .line {
                    display: flex;
                    margin-bottom: 20rpx;
                    &:nth-of-type(3n) {
                        border-top: 1rpx solid #e5e5e5;
                        padding-top: 20rpx;
                    }
                    .label {
                        color: #666666;
                        width: 92rpx;
                    }
                    .value {
                        flex: 1;
                        color: #222222;
                    }
                }
            }
            .title {
                font-weight: 600;
                font-size: 30rpx;
                color: $uni-color-primary;
                margin-bottom: 12rpx;
            }
            .address {
                font-size: 26rpx;
                color: #666666;
                margin-bottom: 20rpx;
            }
        }
        .info {
            .line {
                display: flex;
                margin-bottom: 20rpx;
                .label {
                    font-size: 30rpx;
                    color: #666666;
                    width: 150rpx;
                }
                .value {
                    flex: 1;
                    font-size: 30rpx;
                    color: #222222;
                }
            }
        }
        .separate {
            width: 750rpx;
            height: 2rpx;
            margin: 30rpx -30rpx;
            border: 1rpx solid #e5e5e5;
        }
        .id_card {
            display: flex;
            font-weight: 600;
            height: 60rpx;
            line-height: 60rpx;
            font-size: 32rpx;
            color: #111111;
            border-radius: 8rpx;
            border: 1rpx solid #dfdede;
            width: 220rpx;
            margin-bottom: 15rpx;
            text {
                &:nth-of-type(1) {
                    background: #e9f5f6;
                    padding: 0 12rpx;
                }
                &:nth-of-type(2) {
                    padding-left: 10rpx;
                }
                &:nth-of-type(4) {
                    padding-right: 6rpx;
                }
            }
        }
    }
</style>
pda/pages/index/queueup.vue
@@ -44,8 +44,8 @@
        </view>
        <view class="line" v-else>
          <text class="label">运输单号</text>
          <text class="value">{{ item.code }}</text>
          <text class="primaryColor" @click="handleDetail()">运单详情</text>
          <text class="value">{{ item.billCode }}</text>
          <text class="primaryColor" @click="handleDetail(item)">运单详情</text>
        </view>
        <view class="line">
          <text class="label">驾驶员</text>
@@ -70,7 +70,55 @@
        <text>暂无作业车辆</text>
      </view>
    </view>
    <u-picker
        <u-popup :show="showDetail" :round="10" :safeAreaInsetBottom="true" closeOnClickOverlay :closeable="true"
            mode="bottom" @close="showDetail = false">
            <view class="detail_modal">
                <view class="modal_title">运单详情</view>
                <view v-if="wmsInfo.plateNumber" class="id_card">
                    <text>{{ wmsInfo.plateNumber.slice(0, 1) }}</text>
                    <text>{{ wmsInfo.plateNumber.slice(1, 2) }}</text>
                    <text>·</text>
                    <text>{{ wmsInfo.plateNumber.slice(2) }}</text>
                </view>
                <!--  -->
                <view class="info">
                    <view class="line">
                        <view class="label">运输单号</view>
                        <view class="value">{{ wmsInfo.carryBillCode }}</view>
                    </view>
                    <view class="line">
                        <view class="label">驾驶员</view>
                        <view class="value">{{ wmsInfo.driverName }} {{ wmsInfo.driverPhone }}</view>
                    </view>
                    <view class="line">
                        <view class="label">总运输量</view>
                        <view class="value">{{ wmsInfo.ioQty }}万支</view>
                    </view>
                    <view class="line">
                        <view class="label">运输公司</view>
                        <view class="value">{{ wmsInfo.carrierName }}</view>
                    </view>
                </view>
                <view class="separate"></view>
                <view class="contract_list" v-for="item in wmsInfo.wmsJobContractVOList">
                    <view class="title">合同号:{{ item.contractCode }}</view>
                    <view class="address">收货地:{{ item.address }}</view>
                    <view class="list">
                        <view class="item" v-for="line in item.platformWmsDetailList">
                            <view class="line">
                                <view class="label">物料:</view>
                                <view class="value">{{ line.materialName }}</view>
                            </view>
                            <view class="line">
                                <view class="label">数量:</view>
                                <view class="value">{{ line.ioQty }}万支</view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </u-popup>
        <u-picker
      :show="showPlatformgroup"
      keyName="name"
      :columns="[platformGroupList]"
@@ -81,7 +129,7 @@
</template>
<script>
import { platformLineUpPage, getPlatformGroupList } from '@/api'
import { platformLineUpPage, getPlatformGroupList, wmsJobDetail } from '@/api'
export default {
  data() {
    return {
@@ -92,6 +140,7 @@
      total: 0,
      carCodeFront: '',
      platformGroup: {},
      wmsInfo: {},
      platformGroupList: [],
      platformLineUpList: []
    }
@@ -105,8 +154,11 @@
        }
    },
  methods: {
    handleDetail() {
      this.showDetail = true
    handleDetail(param) {
      wmsJobDetail({ id: param.id }).then(res => {
          this.wmsInfo = res.data
          this.showDetail = true
      })
    },
    getPlatformGroup() {
      getPlatformGroupList({
@@ -123,7 +175,7 @@
    getList() {
      const { page, capacity, platformGroup, carCodeFront } = this
      platformLineUpPage({
        capacity, page, model: { platformGroupId: platformGroup.id, callType: 2, carCodeFront }
        capacity, page, model: { platformGroupId: platformGroup.id, callType: 3, carCodeFront }
      }).then(res => {
        if (res.data) {
          this.platformLineUpList = [...this.platformLineUpList, ...res.data.records || []]
@@ -258,4 +310,111 @@
    }
  }
}
.detail_modal {
        padding: 36rpx 30rpx;
        .modal_title {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            line-height: 44rpx;
            text-align: center;
            margin-bottom: 36rpx;
        }
        .contract_list {
            .list {
                background: #f7f7f7;
                border-radius: 8rpx;
                padding: 20rpx;
                .line {
                    display: flex;
                    margin-bottom: 20rpx;
                    &:nth-of-type(3n) {
                        border-top: 1rpx solid #e5e5e5;
                        padding-top: 20rpx;
                    }
                    .label {
                        color: #666666;
                        width: 86rpx;
                    }
                    .value {
                        flex: 1;
                        color: #222222;
                    }
                }
            }
            .title {
                font-weight: 600;
                font-size: 30rpx;
                color: $uni-color-primary;
                margin-bottom: 12rpx;
            }
            .address {
                font-size: 26rpx;
                color: #666666;
                margin-bottom: 20rpx;
            }
        }
        .info {
            .line {
                display: flex;
                margin-bottom: 20rpx;
                .label {
                    font-size: 30rpx;
                    color: #666666;
                    width: 150rpx;
                }
                .value {
                    flex: 1;
                    font-size: 30rpx;
                    color: #222222;
                }
            }
        }
        .separate {
            width: 750rpx;
            height: 2rpx;
            margin: 30rpx -30rpx;
            border: 1rpx solid #e5e5e5;
        }
        .id_card {
            display: flex;
            font-weight: 600;
            height: 60rpx;
            line-height: 60rpx;
            font-size: 32rpx;
            color: #111111;
            border-radius: 8rpx;
            border: 1rpx solid #dfdede;
            width: 220rpx;
            margin-bottom: 15rpx;
            text {
                &:nth-of-type(1) {
                    background: #e9f5f6;
                    padding: 0 12rpx;
                }
                &:nth-of-type(2) {
                    padding-left: 10rpx;
                }
                &:nth-of-type(4) {
                    padding-right: 6rpx;
                }
            }
        }
    }
</style>