lll
liukangdong
2024-09-25 b44b5aa1dda1d9196416cbf84e610cfd1f5b1c82
lll
已添加3个文件
已删除1个文件
已修改15个文件
734 ■■■■ 文件已修改
admin/src/api/platform/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/images/bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/images/ic_google@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/images/login_img.jpg 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/images/login_img@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/router/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 325 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/components/PlatformSign.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/components/WaybillDetail.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/queueUp.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformRecord.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformStatic.vue 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/driver.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/taskConfirm.vue 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/taskDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js
@@ -97,10 +97,18 @@
export function platformJobPage(data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/page', data)
}
// 月台作业统计 分页列表
export function platformWorkReportPage(data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformWorkReportPage', data)
}
// 月台调度作业任务 删除
export function platformJobDel(id) {
  return request.get('/visitsAdmin/cloudService/business/platformJob/delete?id=' + id)
}
// 月台运单详情
export function platformWmsJobDetail(id) {
  return request.get('/visitsAdmin/cloudService/business/platformWmsJob/' + id)
}
// 月台调度作业任务 签到
export function platformJobSign(data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/signIn', data)
admin/src/assets/images/bg@2x.png
admin/src/assets/images/ic_google@2x.png
admin/src/assets/images/login_img.jpg
Binary files differ
admin/src/assets/images/login_img@2x.png
admin/src/router/index.js
@@ -67,6 +67,10 @@
    next()
    return
  }
  if (to.name === 'login') {
   next()
   return
  }
  getUserInfo()
    .then(userInfo => {
      // 如果用户不存在权限
admin/src/views/login.vue
@@ -1,21 +1,54 @@
<template>
  <div class="wrap">
    <div class="introduce">
      <h2>{{title}}</h2>
      <h3></h3>
    </div>
    <div class="login">
      <h1>系统登录&nbsp;/&nbsp;LOGIN IN</h1>
      <div class="info-input">
        <el-input v-model="username" placeholder="请输入用户名" prefix-icon="el-icon-user-solid" maxlength="50" v-trim/>
        <el-input v-model="password" placeholder="请输入密码" type="password" prefix-icon="eva-icon-password" maxlength="30" show-password/>
        <div class="captcha-input">
          <el-input v-model="captcha.value" placeholder="图片验证码" prefix-icon="eva-icon-shield" maxlength="4" @keypress.enter.native="login"/>
          <img v-if="!captcha.loading" :src="captcha.uri" @click="refreshCaptcha">
          <span v-else><i class="el-icon-loading"></i></span>
    <img src="@/assets/images/bg@2x.png" class="main_bg" alt="">
    <div class="login_wrap">
      <div class="login_img">
        <div class="h3">智慧物流园区安消一体化系统</div>
      </div>
      <div class="form_wrap">
        <!-- <div class="tabs">
          <div class="tab active">
            <div class="name">帐号登录</div>
            <div class="icon"></div>
          </div>
          <div class="tab">
            <div class="name">手机登录</div>
            <div class="icon"></div>
          </div>
        </div> -->
        <div class="df_ac">
          <div class="label">帐号</div>
          <div class="line">
            <el-input v-model="username" placeholder="请输入帐号" maxlength="50" v-trim />
          </div>
        </div>
        <div class="df_ac">
          <div class="label">密码</div>
          <div class="line">
            <el-input v-model="password" placeholder="请输入密码" type="password" maxlength="30" show-password />
          </div>
        </div>
        <div class="df_ac">
          <div class="label">验证码</div>
          <div class="line">
            <el-input v-model="captcha.value" placeholder="请输入验证码" maxlength="4" @keypress.enter.native="login" />
            <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha">
            <span v-else><i class="el-icon-loading"></i></span>
          </div>
        </div>
        <el-button :loading="loading" type="primary" class="login_btn"
          @click.native.prevent="login">立即登录</el-button>
        <div class="btn_wrap">
          <el-checkbox v-model="isRemPsd">
            <span style="font-size: 13px; font-weight: 400" class="placeholder9">记住密码</span>
          </el-checkbox>
        </div>
        <div class="google">
          <img src="@/assets/images/ic_google@2x.png" class="img" alt="">
          <span class="placeholder6">本系统推荐使用GOOGLE浏览器</span>
        </div>
      </div>
      <el-button :loading="loading" @click="login">登&nbsp;&nbsp;录</el-button>
    </div>
  </div>
</template>
@@ -23,14 +56,14 @@
<script>
import { mapMutations } from 'vuex'
import { getCaptcha, loginByPassword } from '@/api/system/common'
import Cookies from "js-cookie";
import Cookies from "js-cookie"
export default {
  name: 'Login',
  data () {
  data() {
    return {
      loading: false,
      title: process.env.VUE_APP_TITLE,
      isRemPsd: false,
      username: '',
      password: '',
      // 验证码
@@ -42,10 +75,17 @@
      }
    }
  },
  mounted() {
    this.username = localStorage.getItem('username') || ''
    this.password = localStorage.getItem('password') || ''
    const isRemPsd = localStorage.getItem('isRemPsd') || false
    this.isRemPsd = JSON.parse(isRemPsd)
    this.refreshCaptcha()
  },
  methods: {
    ...mapMutations(['setUserInfo']),
    // 登录
    login () {
    login() {
      if (this.loading) {
        return
      }
@@ -61,8 +101,17 @@
      })
        .then((res) => {
          // window.location.href = process.env.VUE_APP_CONTEXT_PATH
          Cookies.set('dm_user_token',res)
          window.location.reload()
          if (this.isRemPsd) {
            localStorage.setItem('username', this.username.trim())
            localStorage.setItem('password', this.password.trim())
            localStorage.setItem('isRemPsd', this.isRemPsd)
          } else {
            localStorage.removeItem('username')
            localStorage.removeItem('password')
            localStorage.removeItem('isRemPsd')
          }
          Cookies.set('dm_user_token', res)
          this.$router.push('index')
        })
        .catch(e => {
          this.refreshCaptcha()
@@ -73,7 +122,7 @@
        })
    },
    // 刷新验证码
    refreshCaptcha () {
    refreshCaptcha() {
      this.captcha.loading = true
      getCaptcha()
        .then(data => {
@@ -90,7 +139,7 @@
        })
    },
    // 登录前验证
    __check () {
    __check() {
      if (this.username.trim() === '') {
        this.$tip.error('请输入用户名')
        return false
@@ -106,47 +155,218 @@
      return true
    }
  },
  created () {
    this.refreshCaptcha()
  }
}
</script>
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
div {
  box-sizing: border-box;
}
$input-gap: 30px;
.wrap {
  display: flex;
  width: 100%;
  height: 100vh;
  background-image: url("../assets/images/login.jpg");
  background-repeat: no-repeat;
  background-size: auto 180%;
  background-clip: content-box;
  background-position: center;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  // 左边介绍
  .introduce {
    padding-left: 10%;
  .main_bg {
    position: absolute;
    width: 100%;
    height: 100%;
    left: 0;
    top: 0;
    z-index: -1;
  }
  .login_wrap {
    width: 1000px;
    height: 600px;
    box-sizing: border-box;
    color: #fff;
    background: rgba(0, 0, 0, 0.4);
    background: #ffffff;
    box-shadow: 0px 20px 60px 0px rgba(0, 0, 0, 0.11);
    display: flex;
    flex-direction: column;
    justify-content: center;
    h2 {
      font-size:34px;
      font-style: italic;
      font-weight: 900;
      margin-top: 50px;
    .login_img {
      width: 500px;
      height: 600px;
      background: url("../assets/images/login_img@2x.png");
      background-size: 100% 100%;
      padding-left: 40px;
      padding-top: 80px;
      .h3 {
        font-size: 28px;
        font-weight: 700;
        color: #fff;
        margin-bottom: 26px;
      }
      .text {
        font-size: 18px;
        color: #fff;
      }
    }
    h3 {
      font-size: 49px;
      font-weight: 300;
      margin: 25px 0;
    .form_wrap {
      flex: 1;
      height: 100%;
      background-color: #fff;
      box-sizing: border-box;
      /* padding: 50px 80px 20px; */
      padding: 80px 80px 20px;
      position: relative;
      .tabs {
        display: flex;
        justify-content: space-evenly;
        font-size: 20px;
        color: #666666;
        margin-bottom: 30px;
        .tab {
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;
          .icon {
            width: 36px;
            height: 4px;
            background: #fff;
            border-radius: 2px;
            margin-top: 8px;
          }
        }
        .active {
          font-weight: 500;
          font-size: 24px;
          color: #222222;
          .icon {
            background: #207FF7;
          }
        }
      }
      .df_ac {
        flex-direction: column;
        align-items: flex-start;
      }
      .title {
        font-size: 24px;
        margin-top: 70px;
        margin-bottom: 48px;
        text-align: center;
      }
      .label {
        color: #222222;
        margin-bottom: 18px;
        font-size: 14px;
        margin-right: 12px;
        width: 42px;
      }
      &.ey {
        .label {
          width: 135px;
        }
      }
      .line {
        margin-bottom: 17px;
        display: flex;
        width: 100%;
        .el-input {
          height: 40px;
          // font-size: 14px;
          ::v-deep .el-input__inner {
            height: 40px !important;
          }
        }
        .code_image {
          width: 100px;
          margin-left: 10px;
        }
      }
      .forget {
        justify-content: space-between;
        width: 100%;
        .text {
          cursor: pointer;
        }
      }
      .login_btn {
        width: 100%;
        height: 40px;
        background: $primary-color;
        box-shadow: 0px 2px 8px 0px rgba(67, 94, 190, 0.15);
        border-radius: 2px;
        margin: 0 auto;
        font-weight: 500;
        font-size: 16px;
      }
      .google {
        position: absolute;
        left: 50%;
        transform: translate(-50%, 0);
        bottom: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        font-size: 12px;
        .img {
          margin-right: 5px;
          width: 18px;
        }
      }
      .btn_wrap {
        margin-top: 20px;
      }
      .agreement {
        text-align: center;
      }
      .google {
        position: absolute;
        left: 50%;
        transform: translate(-50%, 0);
        bottom: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        font-size: 12px;
        .img {
          margin-right: 5px;
          width: 18px;
        }
      }
    }
  }
  // 右边登录
  .login {
    height: 100%;
@@ -161,40 +381,50 @@
    flex-direction: column;
    justify-content: center;
    box-sizing: border-box;
    h1 {
      font-size: 28px;
      font-weight: 500;
    }
    .info-input {
      margin-top: $input-gap;
      margin-bottom: 60px;
      /deep/ .el-input {
        margin-top: 30px;
        .el-input__inner {
          height: 50px;
          background: #F9F9F9;
          border: 1px solid transparent;
          &:focus {
            border: 1px solid $primary-color;
          }
        }
      }
    }
    // 验证码输入
    .captcha-input {
      display: flex;
      margin-top: $input-gap;
      height: 50px;
      .el-input {
        width: 100%;
        margin-top: 0;
      }
      span, img {
      span,
      img {
        width: 45%;
        height: 100%;
        flex-shrink: 0;
        margin-left: 16px;
      }
      span {
        display: flex;
        align-items: center;
@@ -203,6 +433,7 @@
        border-radius: 8px;
      }
    }
    .el-button {
      height: 50px;
      width: 100%;
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -49,7 +49,7 @@
    <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    <!--  -->
    <!--  -->
    <DriverDetail v-if="isShowDriver" ref="DriverDetailRef" />
    <WaybillDetailRef v-if="isShowDetail" ref="WaybillDetailRef" />
  </div>
</template>
@@ -58,7 +58,7 @@
import QueryForm from '@/components/common/QueryForm'
import { platformJobPage, platformJobExport, platformJobDel } from '@/api'
import { statusMap } from '../config'
import DriverDetail from "@/views/task/driverDetail"
import WaybillDetailRef from "../components/WaybillDetail.vue"
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadFaceImg from '@/components/common/UploadFaceImg'
import { Message } from 'element-ui'
@@ -67,14 +67,14 @@
  components: {
    Pagination,
    QueryForm,
    DriverDetail,
    WaybillDetailRef,
    GlobalWindow,
    UploadFaceImg
  },
  data() {
    return {
      statusMap,
      isShowDriver: false,
      isShowDetail: false,
      exLoading: false,
      loading: false,
      pagination: {
@@ -198,12 +198,11 @@
      this.getList()
    },
    handleDetail(row) {
      this.isShowDriver = true
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.DriverDetailRef.id = row.id
        this.$refs.DriverDetailRef.type = 6
        this.$refs.DriverDetailRef.getDetail()
        this.$refs.DriverDetailRef.isShowModal = true
        this.$refs.WaybillDetailRef.isShowModal = true
        this.$refs.WaybillDetailRef.id = row.id
        this.$refs.WaybillDetailRef.getDetail()
      })
    },
    handleSizeChange(capacity) {
admin/src/views/platform/components/PlatformSign.vue
@@ -45,7 +45,7 @@
            </div>
          </div>
          <div class="footer df_sb">
            <div v-if="item.type != 4" class="detail">运单详情</div>
            <div @click="handleDetail(item)" v-if="item.type != 4" class="detail">运单详情</div>
            <div v-else></div>
            <el-button type="primary" @click="handleCall(item)">签到</el-button>
          </div>
@@ -54,24 +54,28 @@
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination">
      </pagination>
    </div>
    <WaybillDetailRef v-if="isShowDetail" ref="WaybillDetailRef" />
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import Pagination from '@/components/common/Pagination'
import WaybillDetailRef from "./WaybillDetail.vue"
import { platformJobPage, platformJobSign } from '@/api'
import { statusMap } from '../config'
import { Message } from 'element-ui'
export default {
  components: {
    GlobalWindow,
    Pagination
    Pagination,
    WaybillDetailRef
  },
  data() {
    return {
      statusMap,
      isShowModal: false,
      isShowDetail: false,
      subLoading: false,
      pagination: {
        total: 0,
@@ -102,6 +106,14 @@
      }).then(res => {
        this.dataList = res.records
        this.pagination.total = res.total
      })
    },
    handleDetail(row) {
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.WaybillDetailRef.isShowModal = true
        this.$refs.WaybillDetailRef.id = row.id
        this.$refs.WaybillDetailRef.getDetail()
      })
    },
    reset() {
@@ -214,6 +226,7 @@
      .footer {
        .detail {
          color: $primaryColor;
          cursor: pointer;
        }
      }
    }
admin/src/views/platform/components/WaybillDetail.vue
@@ -1,39 +1,38 @@
<template>
  <GlobalWindow
    title="运单详情"
    center
    :visible.sync="isShowModal"
    width="420px"
    :confirm-working="subLoading"
    @confirm="isShowDetail = false"
  >
  <GlobalWindow title="运单详情" center :visible.sync="isShowModal" width="600px" :confirm-working="subLoading"
    @confirm="isShowModal = false">
    <div class="detail_modal">
      <div class="head">
        <div class="plate">皖A12122</div>
        <div class="plate" v-if="info.plateNumber">
          <span>{{ info.plateNumber.slice(0, 1) }}</span>
          <span>{{ info.plateNumber.slice(1, 2) }}</span>
          <span>·</span>
          <span>{{ info.plateNumber.slice(2) }}</span>
        </div>
        <div class="list">
          <div class="item">
            <span>运输单号:</span>
            <span>22222</span>
            <span>{{ info.carryBillCode }}</span>
          </div>
          <div class="item">
            <span>总运输量:</span>
            <span>22222</span>
            <span>{{ info.ioQty }}万支</span>
          </div>
          <div class="item">
            <span>驾驶员:</span>
            <span>22222</span>
            <span>{{ info.driverName }} {{ info.driverPhone }}</span>
          </div>
        </div>
      </div>
      <div class="title">合同列表</div>
      <div class="content">
        <div class="item">
          <div class="contract">合同号:1292992</div>
          <div class="placeholder6">收货地:address</div>
        <div class="item" v-for="item in info.wmsJobContractVOList">
          <div class="contract">合同号:{{ item.contractCode }}</div>
          <div class="placeholder6">收货地:{{ item.address }}</div>
          <div class="list">
            <div class="line">
              <div class="left"><span>物料名称:</span><span>黄山</span></div>
              <div class="right"><span>数量:</span><span>100</span></div>
            <div class="line" v-for="line in item.platformWmsDetailList">
              <div class="left"><span>物料名称:</span><span>{{ line.materialName }}</span></div>
              <div class="right"><span>数量:</span><span>{{ line.ioQty }}万支</span></div>
            </div>
          </div>
        </div>
@@ -44,7 +43,7 @@
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import { getPlatform, PlatformEdit, PlatformDel } from '@/api'
import { platformWmsJobDetail } from '@/api'
export default {
  components: {
    GlobalWindow
@@ -53,23 +52,16 @@
    return {
      isShowModal: false,
      subLoading: false,
      param: {}
      info: {},
      id: ''
    }
  },
  methods: {
    handleSub() {
      const { param } = this
      this.subLoading = true
      PlatformEdit({
        ...param
      }).then(res => {
        this.subLoading = false
        this.isShowEdit = false
        this.$tip.success('提交成功')
        this.getList()
      }, () => {
        this.subLoading = false
    getDetail() {
      const { id } = this
      platformWmsJobDetail(id).then(res => {
        this.info = res
      })
    }
  }
@@ -79,31 +71,51 @@
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.detail_modal {
  font-size: 12px;
  color: #282828;
  .head {
    background: rgba(39, 155, 170, 0.05);
    border-radius: 4px;
    border: 1px solid #dfe2e8;
    padding: 16px;
    .plate {
      width: 90px;
      text-align: center;
      display: flex;
      font-weight: 600;
      height: 30px;
      line-height: 30px;
      font-size: 15px;
      color: #111111;
      padding: 4px 5px;
      font-weight: 700;
      border: 1px solid #279baa;
      background-color: #fff;
      border-radius: 4px;
      border: 1px solid $primaryColor;
      padding-right: 4px;
      width:106px;
      span {
        &:nth-of-type(1) {
          background: $primaryColor;
          padding: 0 8px;
          color: #fff;
        }
        &:nth-of-type(2) {
          padding-left: 4px;
        }
      }
    }
    .list {
      display: flex;
      flex-wrap: wrap;
      margin-top: 16px;
      .item {
        width: 50%;
        margin-bottom: 8px;
        span {
          &:nth-child(1) {
            color: #666666;
@@ -112,35 +124,43 @@
      }
    }
  }
  .title {
    margin: 16px 0;
    font-weight: 500;
    font-size: 16px;
    color: #222222;
  }
  .content {
    .item {
      border-radius: 4px;
      border: 1px solid #dfe2e8;
      padding: 16px;
      margin-bottom: 10px;
      .list {
        background: #f7f7f7;
        border-radius: 4px;
        padding: 12px 16px;
        margin-top: 10px;
      }
      .contract {
        font-weight: 500;
        font-size: 15px;
        color: #279baa;
        margin-bottom: 4px;
      }
      .line {
        display: flex;
        margin-bottom: 8px;
        &:nth-last-child(1) {
          margin: 0;
        }
        div {
          span {
            &:nth-child(1) {
@@ -148,9 +168,11 @@
            }
          }
        }
        .left {
          flex: 6;
        }
        .right {
          flex: 4;
        }
admin/src/views/platform/index.vue
@@ -94,7 +94,7 @@
            </div>
            <div class="line">
              <div v-if="task.type != 4" class="left">
                <span class="primaryColor pointer" @click="handleDetail">运单详情</span>
                <span class="primaryColor pointer" @click="handleDetail(task)">运单详情</span>
              </div>
              <div v-else></div>
              <div class="right">
@@ -320,10 +320,12 @@
        this.$refs.PlatformQueuingRef.title = item.name
      })
    },
    handleDetail() {
    handleDetail(row) {
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.WaybillDetailRef.isShowModal = true
        this.$refs.WaybillDetailRef.id = row.id
        this.$refs.WaybillDetailRef.getDetail()
      })
    },
    getList() {
@@ -483,14 +485,12 @@
              border-radius: 4px;
              border: 1px solid $primaryColor;
              padding-right: 4px;
              span {
                &:nth-of-type(1) {
                  background: $primaryColor;
                  padding: 0 8px;
                  color: #fff;
                }
                &:nth-of-type(2) {
                  padding-left: 4px;
                }
admin/src/views/platform/queueUp.vue
@@ -43,9 +43,9 @@
        </template>
      </el-table-column>
      <el-table-column prop="signDate" label="签到时间" min-width="150" />
      <el-table-column label="操作" width="100" fixed="right">
      <el-table-column label="操作" align="center" width="100" fixed="right">
        <template slot-scope="{ row }">
          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:company:update']">运单详情</el-button>
          <el-button v-if="row.type != 4" type="text" @click="handleDetail(row)" v-permissions="['business:company:update']">运单详情</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -169,6 +169,8 @@
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.WaybillDetailRef.isShowModal = true
        this.$refs.WaybillDetailRef.id = row.id
        this.$refs.WaybillDetailRef.getDetail()
      })
    },
  }
admin/src/views/statistics/platformRecord.vue
@@ -55,6 +55,7 @@
            filed: 'platformGroupId',
            type: 'select',
            label: '月台组',
            placeholder: '全部月台组',
            options: []
          },
          {
@@ -92,6 +93,7 @@
            label: i.name
          }
        })
        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '全部月台组' })
      })
    },
    getList(page) {
admin/src/views/statistics/platformStatic.vue
@@ -1,108 +1,138 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
      <template #fastdate>
        <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="6">近7天</el-radio-button>
          <el-radio-button label="29">近30天</el-radio-button>
        </el-radio-group>
      </template>
    </QueryForm>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="月台名称"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="月台组"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="停靠次数(次)"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="工作时长"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="月台使用率"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column prop="name" label="月台名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="groupName" label="月台组" min-width="100" show-overflow-tooltip />
      <el-table-column prop="stopCount" label="停靠次数(次)" min-width="100" show-overflow-tooltip />
      <el-table-column prop="workCountTime" label="工作时长" min-width="100" show-overflow-tooltip />
      <el-table-column prop="useRata" label="月台使用率" min-width="100" show-overflow-tooltip />
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
    <!-- <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" /> -->
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import dayjs from 'dayjs'
import { platformWorkReportPage, getPlatformGroupList } from '@/api'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
  data() {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      filters: {
        fastdate: 0,
        selDate: []
      },
      list: [],
      total: 0,
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            filed: 'name',
            type: 'input',
            label: '月台名称'
          },
          {
            filed: 'bbb',
            filed: 'groupId',
            type: 'select',
            label: '月台组',
            placeholder: '全部月台组',
            options: []
          },
          {
            type: 'slot',
            filed: 'fastdate',
            label: ''
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '选择时间'
            clearable: false,
            label: '日期'
          }
        ],
        online: true
      }
    }
  },
  created() {
    this.changeRadio('0')
    this.getList()
  },
  methods: {
    handleSub () {
    changeRadio(day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')]
      this.$set(this.filters, 'selDate', arr)
      this.getList()
    },
    handleSub() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    getGroupList() {
      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
        this.queryFormConfig.formItems[1].options = res.map(i => {
          return {
            value: i.id,
            label: i.name
          }
        })
        // this.queryFormConfig.formItems[1].options.unshift({ value: '', label: '全部月台组' })
      })
    },
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      platformWorkReportPage({
        ...filters,
        queryDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
        queryDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
      }).then(res => {
        this.loading = false
        this.list = res || []
        this.list.forEach(item => {
          item.useRata = item.useRata + '%'
          item.workCountTime = item.workCountTime + '时'
          // item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒')
        })
      }, () => {
        this.loading = false
      })
    },
    clear() {
      this.filters = {
        fastdate: 0,
        selDate: []
      }
      this.changeRadio('0')
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style>
</style>
<style></style>
h5/api/driver.js
@@ -112,4 +112,12 @@
    method: 'post',
    data
  })
}
//  wms运单详情
export const wmsJobDetail = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/wmsJobDetail',
    method: 'get',
    data
  })
}
h5/manifest.json
@@ -92,7 +92,7 @@
                "/admin_interface" : {
                    // 这个字段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://172.20.10.7:10010", // 代理服务器域名或IP地址
                    "target" : "http://192.168.0.103:10010", // 代理服务器域名或IP地址
                    "target" : "http://192.168.0.100:10010", // 代理服务器域名或IP地址
                    // "target" : "http://10.50.250.178:8088/gateway_interface", // 代理服务器域名或IP地址
                    "changeOrigin" : true, // 允许跨域 
                    "pathRewrite" : {
h5/pages/driver/taskConfirm.vue
@@ -18,8 +18,8 @@
            </view>
            <view class="line">
                <view class="label">运输单号</view>
                <view class="value" @click="showDetail = true">
                    <text class="waybill_num">{{ param.contractNum }}</text>
                <view class="value" @click="wmsDetail">
                    <text class="waybill_num">{{ param.billCode }}</text>
                    <text class="btn">运单详情</text>
                </view>
            </view>
@@ -59,49 +59,45 @@
        <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 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">2222</view>
                        <view class="value">{{ wmsInfo.carryBillCode }}</view>
                    </view>
                    <view class="line">
                        <view class="label">驾驶员</view>
                        <view class="value">2222</view>
                        <view class="value">{{ wmsInfo.driverName }} {{ wmsInfo.driverPhone }}</view>
                    </view>
                    <view class="line">
                        <view class="label">总运输量</view>
                        <view class="value">2222</view>
                        <view class="value">{{ wmsInfo.ioQty }}万支</view>
                    </view>
                    <view class="line">
                        <view class="label">运输公司</view>
                        <view class="value">2222</view>
                        <view class="value">{{ wmsInfo.carrierName }}</view>
                    </view>
                </view>
                <view class="separate"></view>
                <view class="contract_list">
                    <view class="title">合同号:111</view>
                    <view class="address">aadd</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="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 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>
@@ -115,7 +111,7 @@
<script>
import keyboardInput from '@/components/keyboard-input/keyboard-input.vue';
import { driverTaskJobDetail, driverConfirmTask } from '@/api';
import { driverTaskJobDetail, driverConfirmTask, wmsJobDetail } from '@/api';
import dayjs from 'dayjs'
export default {
    components: {
@@ -124,6 +120,7 @@
    data() {
        return {
            param: {},
            wmsInfo: {},
            showDate: false,
            showDetail: false,
            minDate: '',
@@ -155,6 +152,13 @@
            }).then(ress => {
                this.param = { ...ress.data, carCodeBack: '' };
            });
        },
        wmsDetail() {
            const { param } = this
            wmsJobDetail({ id: param.id }).then(res => {
                this.wmsInfo = res.data
                this.showDetail = true
            })
        },
        dateEnter(e) {
            setTimeout(() => {
@@ -435,26 +439,29 @@
    }
    .id_card {
        border-radius: 8rpx;
        display: flex;
        font-weight: 600;
        height: 60rpx;
        line-height: 60rpx;
        font-weight: 600;
        font-size: 36rpx;
        font-size: 32rpx;
        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;
        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;
            }
        }
    }
}
h5/pages/driver/taskDetail.vue
@@ -27,7 +27,7 @@
                <view class="line">
                  <view class="label">运输单号</view>
                  <view class="value" @click="showDetail = true">
                    <text class="waybill_num">{{param.code}}</text>
                    <text class="waybill_num">{{param.billCode}}</text>
                    <text class="btn">运单详情</text>
                  </view>
                </view>
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.139: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,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了