MrShi
昨天 108019e27e8958dbf474b8b9bea3fb5fbf7198d9
页面
已添加16个文件
已删除59个文件
已修改8个文件
9876 ■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/driver.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/orderManagement.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCityPriceRuleWindow.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDispatch.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDriverApproval.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDriverDetail.vue 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaOrderDetail.vue 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/driverList.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/driverVerification.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/orderManagement.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/sysParams.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/main.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages.json 154 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/balance-details/balance-details.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/demand-hall/demand-hall.vue 867 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/freight-order/freight-order.vue 824 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/freight/freight.vue 1029 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/itinerary/itinerary.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/login/login.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/message/message.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/order-details/order-details.vue 1702 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/order-food/order-food.vue 791 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/packaging-worker/packaging-worker.vue 751 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/rich-text-page/rich-text-page.vue 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/seleCity/seleCity.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/sorting/sorting.vue 688 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/success/success.vue 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/pages/using-workers/using-workers.vue 706 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ar_address@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/default_login@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/home_ar_next@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/home_ic_location@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_agree@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_call@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_camera@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_change@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_close@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_delete1@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_delete@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_fail@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_huakuai@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_jingguo@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_kefu.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_location@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_money@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_notagree@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_pass@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_pingjia@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_qidian@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_renzhengzhong@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_search@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_success@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_time@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_tip@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/ic_zhongdian@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/img@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_home@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_home_sel@2x (1).png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_home_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_mine@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_mine_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_order@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_order_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_wode@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_wode_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_xiaoxi@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_xiaoxi_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_xingcheng@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/nav_xingcheng_sel@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/order_ic_location@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/icon/order_ic_time@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/bg_green@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/bg_renzheng_gongcan@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/bg_renzheng_huoyun@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/bg_renzheng_yonggong@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/btn.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/btn_guohui@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/btn_renxiang@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/image/share@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/static/share.png 补丁 | 查看 | 原始文档 | blame | 历史
small-program/utils/shareMixin.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -1,4 +1,4 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://192.168.1.44:10010'
VUE_APP_API_URL  = 'http://192.168.1.4:10010'
# VUE_APP_API_URL = 'https://jinkuai.832smartfarm.com/jinkuai_admin'
admin/src/api/business/driver.js
@@ -1,24 +1,30 @@
import request from '../../utils/request'
export function fetchList (data) {
  return request.post('/business/driver/page', data, {
  return request.post('/business/driverInfo/page', data, {
    trim: true
  })
}
export function getById (id) {
  return request.get(`/business/driver/${id}`)
  return request.get(`/business/driverInfo/detail/${id}`)
}
export function updateStatus (data) {
  return request.post('/business/driver/updateStatus', data, {
  return request.post('/business/driverInfo/updateStatus', data, {
    trim: true
  })
}
export function exportExcel (data) {
  return request.post('/business/driver/exportExcel', data, {
  return request.post('/business/driverInfo/exportExcel', data, {
    download: true,
    trim: true
  })
}
export function audit (data) {
  return request.post('/business/driverInfo/audit', data, {
    trim: true
  })
}
admin/src/api/business/orderManagement.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
import request from '../../utils/request'
export function fetchList (data) {
  return request.post('/business/orders/page', data, {
    trim: true
  })
}
export function getById (id) {
  return request.get(`/business/orders/detail/${id}`)
}
export function exportExcel (data) {
  return request.post('/business/orders/exportExcel', data, {
    download: true,
    trim: true
  })
}
admin/src/components/business/OperaCityPriceRuleWindow.vue
@@ -179,13 +179,11 @@
          this.$tip.apiFailed(e)
        })
    },
    // æŸ¥è¯¢å¼‚地寄送规则列表
    // æŸ¥è¯¢é¢„计时效
    fetchEstimatedDelivery () {
      estimatedDelivery(this.form.cityId)
        .then(data => {
          this.timeTableData = [
            data
          ]
          this.timeTableData = data
        })
        .catch(e => {
          this.$tip.apiFailed(e)
@@ -223,13 +221,13 @@
      Promise.all([
        batchSave({ cityId: this.form.cityId, items: this.jiudiTableData }),
        batchSaveRemoteDelivery({ cityId: this.form.cityId, items: this.remoteTableData }),
        batchSaveEstimatedDelivery({ cityId: this.form.cityId, ...this.timeTableData[0] }),
        batchSaveEstimatedDelivery({ cityId: this.form.cityId, items: this.timeTableData }),
        batchSaveStoreDeposit({ cityId: this.form.cityId, items: this.storeDepositData }),
        batchSaveRevenueShare({ cityId: this.form.cityId, items: this.shareTableData })
      ])
        .then(() => {
          this.visible = false
          this.$tip.apiSuccess('保存成功')
          // this.$tip.apiSuccess('保存成功')
          this.$emit('success')
        })
        .catch(e => {
admin/src/components/business/OperaDispatch.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
<template>
  <GlobalWindow
    title="手动派单"
    :visible.sync="visible"
    width="700px"
    @confirm="handleConfirm"
    @close="handleClose"
  >
    <div class="dispatch-info">
      <div class="info-row">
        <div class="info-item">
          <span class="label">订单编号:</span>
          <span class="value">{{ orderInfo.orderNo }}</span>
        </div>
        <div class="info-item">
          <span class="label">实付金额:</span>
          <span class="value">Â¥{{ (orderInfo.payAmount / 100).toFixed(2) }}</span>
        </div>
        <div class="info-item">
          <span class="label">配送方式:</span>
          <span class="value">
            <span v-if="orderInfo.deliveryType === 1">普通配送</span>
            <span v-else-if="orderInfo.deliveryType === 2">急速达</span>
            <span v-else-if="orderInfo.deliveryType === 3">异地寄送</span>
            <span v-else>-</span>
          </span>
        </div>
      </div>
    </div>
    <el-table :data="orderInfo.goodsList" stripe class="goods-table">
      <el-table-column prop="goodsName" label="物品名称" min-width="100px"></el-table-column>
      <el-table-column prop="goodsSize" label="物品尺寸" min-width="80px"></el-table-column>
      <el-table-column label="配送价(元)" min-width="100px">
        <template slot-scope="{row}">Â¥{{ (row.deliveryPrice / 100).toFixed(2) }}</template>
      </el-table-column>
      <el-table-column prop="quantity" label="数量" min-width="60px"></el-table-column>
      <el-table-column label="小计(元)" min-width="100px">
        <template slot-scope="{row}">Â¥{{ ((row.deliveryPrice * row.quantity) / 100).toFixed(2) }}</template>
      </el-table-column>
    </el-table>
    <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="dispatch-form">
      <el-form-item label="配送司机" prop="driverId">
        <el-select v-model="form.driverId" placeholder="请选择配送司机" style="width: 100%">
          <el-option label="司机A" :value="1"></el-option>
          <el-option label="司机B" :value="2"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="加急费" prop="urgentFee">
        <el-input-number v-model="form.urgentFee" :min="0" :precision="2" controls-position="right" style="width: 100%"></el-input-number>
      </el-form-item>
      <el-form-item label="备注说明" prop="remark">
        <el-input type="textarea" v-model="form.remark" placeholder="请输入备注说明" :rows="3"></el-input>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
export default {
  name: 'OperaDispatch',
  components: { GlobalWindow },
  data () {
    return {
      visible: false,
      orderInfo: {
        orderNo: '',
        payAmount: 0,
        deliveryType: '',
        goodsList: []
      },
      form: {
        driverId: '',
        urgentFee: 0,
        remark: ''
      },
      rules: {
        driverId: [{ required: true, message: '请选择配送司机', trigger: 'change' }]
      }
    }
  },
  methods: {
    open (row) {
      this.orderInfo = {
        orderNo: row.orderNo,
        payAmount: row.payAmount || 0,
        deliveryType: row.deliveryType || '',
        goodsList: row.goodsList || []
      }
      this.form = {
        driverId: '',
        urgentFee: 0,
        remark: ''
      }
      this.visible = true
    },
    handleClose () {
      this.visible = false
    },
    handleConfirm () {
      this.$refs.form.validate(valid => {
        if (!valid) return
        this.$emit('confirm', {
          orderId: this.orderInfo.id,
          ...this.form
        })
        this.visible = false
      })
    }
  }
}
</script>
<style scoped>
.dispatch-info {
  margin-bottom: 20px;
}
.info-row {
  display: flex;
  gap: 30px;
  padding: 15px;
  background: #f5f7fa;
  border-radius: 4px;
}
.info-item {
  display: flex;
  font-size: 14px;
}
.info-item .label {
  color: #909399;
}
.info-item .value {
  color: #606266;
}
.goods-table {
  margin-bottom: 20px;
}
.dispatch-form {
  margin-top: 20px;
}
</style>
admin/src/components/business/OperaDriverApproval.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    width="900px"
    :withFooter="false"
  >
    <div class="driver-approval">
      <div class="section">
        <div class="section-header">
          <span class="section-title">司机信息</span>
          <el-tag type="success" v-if="detailInfo.auditStatus">已授权手机号</el-tag>
          <el-tag type="warning" v-else>未授权手机号</el-tag>
          <div class="approval-status">
            <el-tag v-if="detailInfo.auditStatus === 0" type="warning" class="status-tag">待审核</el-tag>
            <el-tag v-else-if="detailInfo.auditStatus === 1" type="success" class="status-tag">审批通过</el-tag>
            <el-tag v-else-if="detailInfo.auditStatus === 2" type="danger" class="status-tag">审批驳回</el-tag>
          </div>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">司机姓名:</span>
            <span class="value">{{ detailInfo.name || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">授权手机号:</span>
            <span class="value">{{ detailInfo.telephone || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">身份证号:</span>
            <span class="value">{{ detailInfo.idcard || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">婚姻情况:</span>
            <span class="value" v-if="detailInfo.maritalStatus === 3">丧偶</span>
            <span class="value" v-else-if="detailInfo.maritalStatus === 2">离异</span>
            <span class="value" v-else-if="detailInfo.maritalStatus === 1">已婚</span>
            <span class="value" v-else-if="detailInfo.maritalStatus === 0">未婚</span>
            <span class="value" v-else>-</span>
          </div>
          <div class="info-item">
            <span class="label">性别:</span>
            <span class="value">{{ detailInfo.gender === 1 ? '男' : detailInfo.gender === 2 ? '女' : '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">现居住地址:</span>
            <span class="value">{{ detailInfo.livePlace || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">评级:</span>
            <span class="value">{{ detailInfo.driverLevel || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">状态:</span>
            <span class="value">{{ detailInfo.status === 0 ? '启用' : '禁用' }}</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">车辆信息</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">车牌号:</span>
            <span class="value">{{ detailInfo.carCode || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">车辆类型:</span>
            <span class="value">{{ detailInfo.carTypeName || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">车辆颜色:</span>
            <span class="value">{{ detailInfo.carColor || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">驾驶证有效期:</span>
            <span class="value">{{ detailInfo.cardStartDate || '-' }} è‡³ {{ detailInfo.cardEndDate || '-' }}</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">附件材料</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">身份证正面:</span>
            <el-image
              v-if="detailInfo.idcardImg"
              style="width: 80px; height: 80px"
              :src="detailInfo.imgPrefix + detailInfo.idcardImg"
              :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImg]"
              fit="cover"
            ></el-image>
            <span v-else>-</span>
          </div>
          <div class="info-item">
            <span class="label">身份证反面:</span>
            <el-image
              v-if="detailInfo.idcardImgBack"
              style="width: 80px; height: 80px"
              :src="detailInfo.imgPrefix + detailInfo.idcardImgBack"
              :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImgBack]"
              fit="cover"
            ></el-image>
            <span v-else>-</span>
          </div>
          <div class="info-item full-width">
            <span class="label">车辆照片:</span>
            <span v-if="!detailInfo.carImgList">-</span>
            <div v-else class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.carImgList"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img.fileurlFull"
                :preview-src-list="detailInfo.carImgList.map(item => item.fileurlFull)"
                fit="cover"
              ></el-image>
            </div>
          </div>
          <div class="info-item full-width">
            <span class="label">驾驶证照片:</span>
            <span v-if="!detailInfo.licenseImgList">-</span>
            <div v-else class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.licenseImgList"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img.fileurlFull"
                :preview-src-list="detailInfo.licenseImgList.map(item => item.fileurlFull)"
                fit="cover"
              ></el-image>
            </div>
          </div>
          <div class="info-item full-width">
            <span class="label">其它材料:</span>
            <span v-if="!detailInfo.otherImgList">-</span>
            <div v-else class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.otherImgList"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img.fileurlFull"
                :preview-src-list="detailInfo.otherImgList.map(item => item.fileurlFull)"
                fit="cover"
              ></el-image>
            </div>
          </div>
        </div>
      </div>
      <div class="approval-form" v-if="detailInfo.auditStatus === 0">
        <el-form ref="approvalForm" :model="approvalForm" :rules="approvalRules">
          <el-form-item label="审批结果" prop="auditStatus">
            <el-radio-group v-model="approvalForm.auditStatus">
              <el-radio :label="0">通过</el-radio>
              <el-radio :label="1">拒绝</el-radio>
            </el-radio-group>
          </el-form-item>
          <el-form-item label="司机评级" prop="driverLevel">
            <el-select v-model="approvalForm.driverLevel" placeholder="请选择司机评级" style="width: 300px">
              <el-option label="S" :value="5"></el-option>
              <el-option label="A" :value="4"></el-option>
              <el-option label="B" :value="3"></el-option>
              <el-option label="C" :value="2"></el-option>
              <el-option label="D" :value="1"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="审批意见" prop="auditRemark">
            <el-input
              type="textarea"
              v-model="approvalForm.auditRemark"
              placeholder="请输入审批意见"
              :rows="3"
              style="width: 400px"
            ></el-input>
          </el-form-item>
        </el-form>
        <div class="approval-buttons">
          <el-button @click="close">取消</el-button>
          <el-button type="primary" @click="handleConfirm" :loading="isWorking">确定</el-button>
        </div>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import { getById, audit } from '@/api/business/driver'
export default {
  name: 'OperaDriverApproval',
  components: { GlobalWindow },
  data () {
    return {
      title: '司机审核',
      visible: false,
      isWorking: false,
      detailInfo: {},
      approvalForm: {
        id: null,
        auditStatus: 0,
        driverLevel: '',
        auditRemark: ''
      },
      approvalRules: {
        auditStatus: [{ required: true, message: '请选择审批结果', trigger: 'change' }],
        driverLevel: [{ required: true, message: '请选择司机评级', trigger: 'change' }],
        auditRemark: [{ required: true, message: '请输入审批意见', trigger: 'blur' }]
      }
    }
  },
  methods: {
    open (title, row) {
      this.title = title
      this.approvalForm = {
        id: row.id,
        auditStatus: 1,
        driverLevel: '',
        auditRemark: ''
      }
      this.$nextTick(() => {
        this.$refs.approvalForm && this.$refs.approvalForm.clearValidate()
      })
      getById(row.id).then(res => {
        this.detailInfo = res
        this.visible = true
      }).catch(e => {
        this.$tip.apiFailed(e)
      })
    },
    close () {
      this.visible = false
    },
    handleConfirm () {
      this.$refs.approvalForm.validate(valid => {
        if (!valid) return
        if (this.approvalForm.status === 2 && !this.approvalForm.remark) {
          this.$message.warning('请输入审批意见')
          return
        }
        this.isWorking = true
        audit({
          id: this.approvalForm.id,
          auditStatus: this.approvalForm.auditStatus,
          driverLevel: this.approvalForm.driverLevel,
          auditRemark: this.approvalForm.auditRemark
        }).then(res => {
          this.$tip.apiSuccess(res || '审核成功')
          this.$emit('success', this.approvalForm)
          this.visible = false
        }).catch(e => {
          this.$tip.apiFailed(e)
        }).finally(() => {
          this.isWorking = false
        })
      })
    }
  }
}
</script>
<style scoped>
.driver-approval {
}
.section {
  margin-bottom: 25px;
}
.section-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 15px;
  flex-wrap: wrap;
}
.section-title {
  font-size: 16px;
  font-weight: bold;
  color: #303133;
  padding-left: 10px;
  border-left: 4px solid #2E68EC;
}
.approval-status {
  margin-left: auto;
}
.status-tag {
  font-size: 14px;
  padding: 4px 12px;
}
.info-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  padding: 0 10px;
}
.info-item {
  display: flex;
  font-size: 14px;
}
.info-item.full-width {
  grid-column: span 2;
}
.info-item .label {
  color: #909399;
  min-width: 110px;
}
.info-item .value {
  color: #606266;
  word-break: break-all;
}
.image-list {
  display: flex;
  flex-wrap: wrap;
}
.approval-form {
  padding: 20px;
  background: #f5f7fa;
  border-top: 1px solid #eee;
}
.approval-form /deep/ .el-form-item {
  margin-bottom: 15px;
}
.approval-form /deep/ .el-form-item:last-child {
  margin-bottom: 0;
}
.approval-buttons {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 15px;
}
</style>
admin/src/components/business/OperaDriverDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,363 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    width="900px"
    :withFooter="false"
  >
    <div class="driver-detail">
      <el-tabs v-model="activeTab">
        <el-tab-pane label="基本信息" name="basic"></el-tab-pane>
        <el-tab-pane label="司机业务" name="business"></el-tab-pane>
      </el-tabs>
      <div v-show="activeTab === 'basic'" class="tab-content">
        <div class="section">
          <div class="section-header">
            <span class="section-title">司机信息</span>
            <el-tag type="success" v-if="detailInfo.auditStatus">已授权手机号</el-tag>
            <el-tag type="warning" v-else>未授权手机号</el-tag>
          </div>
          <div class="info-grid">
            <div class="info-item">
              <span class="label">司机姓名:</span>
              <span class="value">{{ detailInfo.name || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">授权手机号:</span>
              <span class="value">{{ detailInfo.telephone || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">身份证号:</span>
              <span class="value">{{ detailInfo.idcard || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">婚姻情况:</span>
              <span class="value" v-if="detailInfo.maritalStatus === 3">丧偶</span>
              <span class="value" v-else-if="detailInfo.maritalStatus === 2">离异</span>
              <span class="value" v-else-if="detailInfo.maritalStatus === 1">已婚</span>
              <span class="value" v-else-if="detailInfo.maritalStatus === 0">未婚</span>
            </div>
            <div class="info-item">
              <span class="label">性别:</span>
              <span class="value">{{ detailInfo.gender === 1 ? '男' : detailInfo.gender === 2 ? '女' : '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">现居住地址:</span>
              <span class="value">{{ detailInfo.livePlace || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">评级:</span>
              <span class="value">{{ detailInfo.driverLevel || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">状态:</span>
              <span class="value">{{ detailInfo.status === 0 ? '启用' : '禁用' }}</span>
            </div>
          </div>
        </div>
        <div class="section">
          <div class="section-header">
            <span class="section-title">车辆信息</span>
          </div>
          <div class="info-grid">
            <div class="info-item">
              <span class="label">车牌号:</span>
              <span class="value">{{ detailInfo.carCode || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">车辆类型:</span>
              <span class="value">{{ detailInfo.carTypeName || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">车辆颜色:</span>
              <span class="value">{{ detailInfo.carColor || '-' }}</span>
            </div>
            <div class="info-item">
              <span class="label">驾驶证有效期:</span>
              <span class="value">{{ detailInfo.cardStartDate || '-' }} è‡³ {{ detailInfo.cardEndDate || '-' }}</span>
            </div>
          </div>
        </div>
        <div class="section">
          <div class="section-header">
            <span class="section-title">附件材料</span>
          </div>
          <div class="info-grid">
            <div class="info-item">
              <span class="label">身份证正面:</span>
              <el-image
                v-if="detailInfo.idcardImg"
                style="width: 80px; height: 80px"
                :src="detailInfo.imgPrefix + detailInfo.idcardImg"
                :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImg]"
                fit="cover"
              ></el-image>
              <span v-else>-</span>
            </div>
            <div class="info-item">
              <span class="label">身份证反面:</span>
              <el-image
                v-if="detailInfo.idcardImgBack"
                style="width: 80px; height: 80px"
                :src="detailInfo.imgPrefix + detailInfo.idcardImgBack"
                :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImgBack]"
                fit="cover"
              ></el-image>
              <span v-else>-</span>
            </div>
            <div class="info-item full-width">
              <span class="label">车辆照片:</span>
              <span v-if="!detailInfo.carImgList">-</span>
              <div v-else class="image-list">
                <el-image
                  v-for="(img, index) in detailInfo.carImgList"
                  :key="index"
                  style="width: 80px; height: 80px; margin-right: 10px"
                  :src="img.fileurlFull"
                  :preview-src-list="detailInfo.carImgList.map(item => item.fileurlFull)"
                  fit="cover"
                ></el-image>
              </div>
            </div>
            <div class="info-item full-width">
              <span class="label">驾驶证照片:</span>
              <span v-if="!detailInfo.licenseImgList">-</span>
              <div v-else class="image-list">
                <el-image
                  v-for="(img, index) in detailInfo.licenseImgList"
                  :key="index"
                  style="width: 80px; height: 80px; margin-right: 10px"
                  :src="img.fileurlFull"
                  :preview-src-list="detailInfo.licenseImgList.map(item => item.fileurlFull)"
                  fit="cover"
                ></el-image>
              </div>
            </div>
            <div class="info-item full-width">
              <span class="label">其它材料:</span>
              <span v-if="!detailInfo.otherImgList">-</span>
              <div v-else class="image-list">
                <el-image
                  v-for="(img, index) in detailInfo.otherImgList"
                  :key="index"
                  style="width: 80px; height: 80px; margin-right: 10px"
                  :src="img.fileurlFull"
                  :preview-src-list="detailInfo.otherImgList.map(item => item.fileurlFull)"
                  fit="cover"
                ></el-image>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div v-show="activeTab === 'business'" class="tab-content">
        <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
          <el-form-item label="订单编号" prop="orderNo">
            <el-input v-model="searchForm.orderNo" clearable placeholder="请输入订单编号"></el-input>
          </el-form-item>
          <el-form-item label="物品信息" prop="goodsInfo">
            <el-input v-model="searchForm.goodsInfo" clearable placeholder="请输入物品信息"></el-input>
          </el-form-item>
          <el-form-item label="创建时间" prop="createTime">
            <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd"
                            range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="handleDateChange" />
          </el-form-item>
          <el-form-item label="订单状态" prop="orderStatus">
            <el-select v-model="searchForm.orderStatus" clearable placeholder="请选择订单状态">
              <el-option label="待取件" :value="1"></el-option>
              <el-option label="配送中" :value="2"></el-option>
              <el-option label="已完成" :value="3"></el-option>
              <el-option label="已取消" :value="4"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="结算状态" prop="settleStatus">
            <el-select v-model="searchForm.settleStatus" clearable placeholder="请选择结算状态">
              <el-option label="未结算" :value="0"></el-option>
              <el-option label="已结算" :value="1"></el-option>
            </el-select>
          </el-form-item>
          <section>
            <el-button type="primary" @click="searchBusiness">搜索</el-button>
            <el-button @click="resetBusiness">重置</el-button>
          </section>
        </el-form>
        <div class="statistics">
          <span>订单数:{{ statistics.orderCount }}</span>
          <span>订单总价:¥{{ (statistics.orderAmount / 100).toFixed(2) }}</span>
          <span>结算总价:¥{{ (statistics.settleAmount / 100).toFixed(2) }}</span>
        </div>
        <el-table :data="businessData.list" stripe>
          <el-table-column prop="orderNo" label="订单编号" min-width="150px"></el-table-column>
          <el-table-column prop="goodsInfo" label="物品信息" min-width="120px"></el-table-column>
          <el-table-column prop="type" label="类型" min-width="80px"></el-table-column>
          <el-table-column prop="level" label="订单级别" min-width="80px"></el-table-column>
          <el-table-column label="物品保费(元)" min-width="120px">
            <template slot-scope="{row}">Â¥{{ (row.insuranceAmount / 100).toFixed(2) }}</template>
          </el-table-column>
          <el-table-column label="基础服务费(元)" min-width="120px">
            <template slot-scope="{row}">Â¥{{ (row.serviceAmount / 100).toFixed(2) }}</template>
          </el-table-column>
          <el-table-column label="订单状态" min-width="100px">
            <template slot-scope="{row}">
              <span v-if="row.orderStatus === 1">待取件</span>
              <span v-else-if="row.orderStatus === 2">配送中</span>
              <span v-else-if="row.orderStatus === 3">已完成</span>
              <span v-else-if="row.orderStatus === 4">已取消</span>
              <span v-else>-</span>
            </template>
          </el-table-column>
          <el-table-column label="结算状态" min-width="100px">
            <template slot-scope="{row}">
              <span :style="{ color: row.settleStatus === 1 ? '#67c23a' : '#e6a23c' }">
                {{ row.settleStatus === 1 ? '已结算' : '未结算' }}
              </span>
            </template>
          </el-table-column>
        </el-table>
        <pagination
          @size-change="handleBusinessSizeChange"
          @current-change="handleBusinessPageChange"
          :pagination="businessData.pagination"
        ></pagination>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import Pagination from '@/components/common/Pagination'
import { getById } from '@/api/business/driver'
export default {
  name: 'OperaDriverDetail',
  components: { GlobalWindow, Pagination },
  data () {
    return {
      title: '司机详情',
      visible: false,
      activeTab: 'basic',
      detailInfo: {},
      searchForm: {
        orderNo: '',
        goodsInfo: '',
        createTime: '',
        startTime: '',
        endTime: '',
        orderStatus: '',
        settleStatus: ''
      },
      statistics: {
        orderCount: 0,
        orderAmount: 0,
        settleAmount: 0
      },
      businessData: {
        list: [],
        pagination: { page: 1, size: 10, total: 0 }
      }
    }
  },
  methods: {
    open (title, row) {
      this.title = title
      this.activeTab = 'basic'
      getById(row.id).then(res => {
        this.detailInfo = res
        this.visible = true
      }).catch(e => {
        this.$tip.apiFailed(e)
      })
    },
    searchBusiness () {
    },
    resetBusiness () {
      this.searchForm = {
        orderNo: '',
        goodsInfo: '',
        createTime: '',
        startTime: '',
        endTime: '',
        orderStatus: '',
        settleStatus: ''
      }
      this.searchBusiness()
    },
    handleDateChange (val) {
      this.searchForm.startTime = val ? val[0] : ''
      this.searchForm.endTime = val ? val[1] : ''
    },
    handleBusinessSizeChange () {
    },
    handleBusinessPageChange () {
    }
  }
}
</script>
<style scoped>
.driver-detail {
  width: 100%;
}
.tab-content {
  margin-top: 20px;
}
.section {
  margin-bottom: 25px;
}
.section-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 15px;
}
.section-title {
  font-size: 16px;
  font-weight: bold;
  color: #303133;
  padding-left: 10px;
  border-left: 4px solid #2E68EC;
}
.info-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  padding: 0 10px;
}
.info-item {
  display: flex;
  font-size: 14px;
}
.info-item.full-width {
  grid-column: span 2;
}
.info-item .label {
  color: #909399;
  min-width: 110px;
}
.info-item .value {
  color: #606266;
  word-break: break-all;
}
.image-list {
  display: flex;
  flex-wrap: wrap;
}
.statistics {
  display: flex;
  gap: 40px;
  padding: 15px;
  background: #f5f7fa;
  border-radius: 4px;
  margin-bottom: 15px;
  font-size: 14px;
  color: #606266;
  margin: 20px 0;
}
</style>
admin/src/components/business/OperaOrderDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,399 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    width="900px"
    :withFooter="false"
  >
    <div class="order-detail" v-if="detailInfo">
      <div class="section">
        <div class="section-header">
          <span class="section-title">订单详情</span>
          <el-tag v-if="detailInfo.status === 1" type="warning">待取件</el-tag>
          <el-tag v-else-if="detailInfo.status === 2" type="primary">配送中</el-tag>
          <el-tag v-else-if="detailInfo.status === 3" type="success">已完成</el-tag>
          <el-tag v-else-if="detailInfo.status === 4" type="info">已取消</el-tag>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">订单编号:</span>
            <span class="value">{{ detailInfo.order.code || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">创建时间:</span>
            <span class="value">{{ detailInfo.order.createTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">订单类型:</span>
            <span class="value">
              <span v-if="detailInfo.order.type === 0">就地存取</span>
              <span v-else-if="detailInfo.order.type === 1">异地存取</span>
              <span v-else>-</span>
            </span>
          </div>
          <div class="info-item">
            <span class="label">支付时间:</span>
            <span class="value">{{ detailInfo.order.payTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">支付方式:</span>
            <span class="value">
              <span>微信支付</span>
            </span>
          </div>
          <div class="info-item">
            <span class="label">实付金额:</span>
            <span class="value">
              <span>Â¥{{ (detailInfo.order.payAmount / 100).toFixed(2) }}</span>
            </span>
          </div>
          <div class="info-item">
            <span class="label">订单级别:</span>
            <span class="value">{{ detailInfo.order.orderLevel || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">预计到店时间:</span>
            <span class="value">{{ detailInfo.order.expectedDepositTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">预计取件时间:</span>
            <span class="value">{{ detailInfo.order.expectedTakeTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">订单总价:</span>
            <span class="value">Â¥{{ (detailInfo.order.totalAmount / 100).toFixed(2) }}</span>
          </div>
          <div class="info-item">
            <span class="label">保价金额:</span>
            <span class="value">Â¥{{ (detailInfo.order.declaredAmount / 100).toFixed(2) }}</span>
          </div>
          <div class="info-item">
            <span class="label">物品保费:</span>
            <span class="value">Â¥{{ (detailInfo.order.declaredFee / 100).toFixed(2) }}</span>
          </div>
          <div class="info-item">
            <span class="label">预计寄存天数/配送里程:</span>
            <span class="value">{{ detailInfo.order.estimatedDepositDays || '-' }}天/{{ detailInfo.order.distance || '-' }}公里</span>
          </div>
          <div class="info-item full-width">
            <span class="label">客户备注:</span>
            <span class="value">{{ detailInfo.order.remark || '-' }}</span>
          </div>
          <div class="info-item full-width">
            <span class="label">物品拍照:</span>
            <div v-if="detailInfo.depositImages && detailInfo.depositImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.depositImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.depositImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">会员信息</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">姓名:</span>
            <span class="value">{{ detailInfo.memberName || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">手机号码:</span>
            <span class="value">{{ detailInfo.memberPhone || '-' }}</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">配送信息</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">收件人:</span>
            <span class="value">{{ detailInfo.order.takeUser || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">收件人电话:</span>
            <span class="value">{{ detailInfo.order.takePhone || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">寄件地址:</span>
            <span class="value">{{ detailInfo.order.depositLocation || '' }}{{ detailInfo.order.depositLocationRemark || '' }}</span>
          </div>
          <div class="info-item">
            <span class="label">收件地址:</span>
            <span class="value">{{ detailInfo.order.takeLocation || '' }}{{ detailInfo.order.takeLocationRemark || '' }}</span>
          </div>
          <div class="info-item">
            <span class="label">是否收件服务点:</span>
            <span class="value">{{ detailInfo.order.takeShopId ? '是' : '否' }}</span>
          </div>
          <div class="info-item">
            <span class="label">配送司机:</span>
            <span class="value">{{ detailInfo.driverName || '-' }}</span>
          </div>
          <div class="info-item full-width">
            <span class="label">门店收件拍照:</span>
            <div v-if="detailInfo.storeInImages && detailInfo.storeInImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.storeInImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.storeInImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
          <div class="info-item full-width">
            <span class="label">司机取件拍照:</span>
            <div v-if="detailInfo.driverTakeImages && detailInfo.driverTakeImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.driverTakeImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.driverTakeImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
          <div class="info-item full-width">
            <span class="label">司机送达拍照/门店入库拍照:</span>
            <div v-if="detailInfo.driverDoneImages && detailInfo.driverDoneImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.driverDoneImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.driverDoneImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
          <div class="info-item full-width">
            <span class="label">门店出库拍照:</span>
            <div v-if="detailInfo.storeOutImages && detailInfo.storeOutImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.storeOutImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.storeOutImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">取消信息</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">取消操作人:</span>
            <span class="value">{{ detailInfo.platformUserName || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">取消时间:</span>
            <span class="value">{{ detailInfo.order.cancelTime || '-' }}</span>
          </div>
        </div>
      </div>
      <div class="section" v-if="detailInfo.ordersRefund">
        <div class="section-header">
          <span class="section-title">退款信息</span>
        </div>
        <div class="info-grid">
          <div class="info-item">
            <span class="label">退款理由:</span>
            <span class="value">{{ detailInfo.ordersRefund.cancelInfo || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">退款申请时间:</span>
            <span class="value">{{ detailInfo.ordersRefund.createTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">退款金额:</span>
            <span class="value">{{ detailInfo.ordersRefund.createTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">退款处理时间:</span>
            <span class="value">{{ detailInfo.ordersRefund.refundTime || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">退款方式:</span>
            <span class="value" v-if="detailInfo.ordersRefund.type === 0">未存件直接取消</span>
            <span class="value" v-else-if="detailInfo.ordersRefund.type === 1">平台直接取消</span>
            <span class="value" v-else-if="detailInfo.ordersRefund.type === 2">已存件申请取消</span>
          </div>
          <div class="info-item">
            <span class="label">退款备注:</span>
            <span class="value">{{ detailInfo.ordersRefund.remark || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">操作人:</span>
            <span class="value">{{ detailInfo.platformUserName || '-' }}</span>
          </div>
          <div class="info-item">
            <span class="label">操作时间:</span>
            <span class="value">{{ detailInfo.ordersRefund.updateTime || '-' }}</span>
          </div>
          <div class="info-item full-width">
            <span class="label">门店退款拍照:</span>
            <div v-if="detailInfo.refundTakeImages && detailInfo.refundTakeImages.length" class="image-list">
              <el-image
                v-for="(img, index) in detailInfo.refundTakeImages"
                :key="index"
                style="width: 80px; height: 80px; margin-right: 10px"
                :src="img"
                :preview-src-list="detailInfo.refundTakeImages"
                fit="cover"
              ></el-image>
            </div>
            <span v-else>-</span>
          </div>
        </div>
      </div>
      <div class="section">
        <div class="section-header">
          <span class="section-title">物品信息</span>
        </div>
        <el-table :data="detailInfo.detailList" stripe class="goods-table">
          <el-table-column prop="typeName" label="物品名称" min-width="80px"></el-table-column>
          <el-table-column prop="luggageName" label="物品尺寸" min-width="80px"></el-table-column>
          <el-table-column label="单价(元)" min-width="100px">
            <template slot-scope="{row}">
              Â¥{{ (row.unitPriceYuan / 100).toFixed(2) }}
            </template>
          </el-table-column>
          <el-table-column prop="num" label="数量" min-width="60px"></el-table-column>
          <el-table-column label="小计(元)" min-width="100px">
            <template slot-scope="{row}">
              Â¥{{ (row.subtotal / 100).toFixed(2) }}
            </template>
          </el-table-column>
        </el-table>
        <div class="price-summary">
          <span>基础服务费:¥{{ (detailInfo.order.price / 100).toFixed(2) }}</span>
          <span>物品保费:¥{{ (detailInfo.order.declaredFee / 100).toFixed(2) }}</span>
          <span>订单总价:¥{{ (detailInfo.order.totalAmount / 100).toFixed(2) }}</span>
          <span>实际支付:¥{{ (detailInfo.order.payAmount / 100).toFixed(2) }}</span>
          <span>退款金额:¥{{ (detailInfo.order.refundAmount / 100).toFixed(2) }}</span>
          <span>超时金额:¥{{ (detailInfo.order.overdueAmount / 100).toFixed(2) }}</span>
          <span>异常金额:¥{{ (detailInfo.order.exceptionAmount / 100).toFixed(2) }}</span>
        </div>
      </div>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import { getById } from '@/api/business/orderManagement'
export default {
  name: 'OperaOrderDetail',
  components: { GlobalWindow },
  data () {
    return {
      title: '订单详情',
      visible: false,
      detailInfo: null
    }
  },
  methods: {
    open (row) {
      this.title = '订单详情'
      getById(row.id).then(res => {
        console.log(res)
        this.detailInfo = res
        this.visible = true
      }).catch(e => {
        this.$tip.apiFailed(e)
      })
    }
  }
}
</script>
<style scoped>
.order-detail {
}
.section {
  margin-bottom: 25px;
}
.section-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 15px;
}
.section-title {
  font-size: 16px;
  font-weight: bold;
  color: #303133;
  padding-left: 10px;
  border-left: 4px solid #2E68EC;
}
.info-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 15px;
  padding: 0 10px;
}
.info-item {
  display: flex;
  font-size: 14px;
}
.info-item.full-width {
  grid-column: span 2;
}
.info-item .label {
  color: #909399;
  min-width: 140px;
}
.info-item .value {
  color: #606266;
  word-break: break-all;
}
.image-list {
  display: flex;
  flex-wrap: wrap;
}
.goods-table {
  margin-bottom: 15px;
}
.price-summary {
  display: flex;
  flex-wrap: wrap;
  gap: 11px;
  padding: 15px;
  background: #f5f7fa;
  border-radius: 4px;
  font-size: 14px;
  color: #606266;
}
</style>
admin/src/views/business/driverList.vue
@@ -1,5 +1,5 @@
<template>
  <TableLayout :permissions="['business:driver:query']">
  <TableLayout :permissions="['business:driverInfo: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" clearable placeholder="请输入司机姓名/手机号" @keypress.enter.native="search"></el-input>
@@ -9,8 +9,8 @@
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" clearable placeholder="请选择状态" @change="search">
          <el-option label="禁用" :value="0"></el-option>
          <el-option label="启用" :value="1"></el-option>
          <el-option label="禁用" :value="1"></el-option>
          <el-option label="启用" :value="0"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="性别" prop="sex">
@@ -26,7 +26,7 @@
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
        <el-button :loading="isWorking.export" @click="handleExport">导出</el-button>
        <el-button :loading="isWorking.export" @click="exportExcel">导出</el-button>
      </section>
    </el-form>
    <template v-slot:table-wrap>
@@ -36,17 +36,16 @@
        :data="tableData.list"
        stripe
      >
        <el-table-column prop="nickName" label="用户昵称" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="司机姓名" min-width="100px"></el-table-column>
        <el-table-column label="性别" min-width="60px">
          <template slot-scope="{row}">{{ row.sex === 1 ? '男' : row.sex === 2 ? '女' : '-' }}</template>
          <template slot-scope="{row}">{{ row.gender === 1 ? '男' : row.gender === 2 ? '女' : '-' }}</template>
        </el-table-column>
        <el-table-column prop="phone" label="注册手机号" min-width="120px"></el-table-column>
        <el-table-column prop="idCard" label="身份证号" min-width="160px"></el-table-column>
        <el-table-column prop="telephone" label="注册手机号" min-width="120px"></el-table-column>
        <el-table-column prop="idcard" label="身份证号" min-width="160px"></el-table-column>
        <el-table-column label="账户余额" min-width="100px">
          <template slot-scope="{row}">Â¥{{ (row.amount / 100).toFixed(2) }}</template>
          <template slot-scope="{row}">Â¥{{ (row.memberAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column prop="carNo" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="160px"></el-table-column>
        <el-table-column label="状态" min-width="80px">
          <template slot-scope="{row}">
@@ -55,8 +54,8 @@
              v-model="row.status"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="1"
              :inactive-value="0"
              :active-value="0"
              :inactive-value="1"
            ></el-switch>
          </template>
        </el-table-column>
@@ -72,6 +71,7 @@
        :pagination="tableData.pagination"
      ></pagination>
    </template>
    <OperaDriverDetail ref="operaDriverDetail" />
  </TableLayout>
</template>
@@ -79,12 +79,13 @@
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { fetchList, updateStatus, exportExcel } from '@/api/business/driver'
import OperaDriverDetail from '@/components/business/OperaDriverDetail'
import { updateStatus, exportExcel } from '@/api/business/driver'
export default {
  name: 'DriverList',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  components: { TableLayout, Pagination, OperaDriverDetail },
  data () {
    return {
      searchForm: {
@@ -94,7 +95,8 @@
        sex: '',
        createTime: '',
        startTime: '',
        endTime: ''
        endTime: '',
        auditStatus: 1
      }
    }
  },
@@ -106,21 +108,6 @@
    this.search()
  },
  methods: {
    loadTableData (resolve) {
      this.isWorking.search = true
      fetchList(this.getTableParams())
        .then(data => {
          this.tableData.list = data.list || []
          this.tableData.pagination.total = data.total || 0
          if (resolve) resolve(data)
        })
        .catch(e => {
          this.$tip.apiFailed(e, '加载失败')
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    handleDateChange (val) {
      this.searchForm.startTime = val ? val[0] : ''
      this.searchForm.endTime = val ? val[1] : ''
@@ -139,6 +126,7 @@
      this.search()
    },
    handleDetail (row) {
      this.$refs.operaDriverDetail.open('司机详情', row)
    },
    handleStatusChange (val, row) {
      updateStatus({ id: row.id, status: val }).then(res => {
admin/src/views/business/driverVerification.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
<template>
  <TableLayout :permissions="['business:driverInfo: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" clearable placeholder="请输入司机姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="车牌号" prop="carNo">
        <el-input v-model="searchForm.carNo" clearable placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="审核状态" prop="auditStatus">
        <el-select v-model="searchForm.auditStatus" clearable placeholder="请选择状态" @change="search">
          <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="createTime">
        <el-date-picker type="daterange" v-model="searchForm.createTime" clearable value-format="yyyy-MM-dd"
                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="handleDateChange" />
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
        <el-button :loading="isWorking.export" @click="exportExcel">导出</el-button>
      </section>
    </el-form>
    <template v-slot:table-wrap>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
      >
        <el-table-column prop="name" label="司机姓名" min-width="100px"></el-table-column>
        <el-table-column label="性别" min-width="60px">
          <template slot-scope="{row}">{{ row.gender === 1 ? '男' : row.gender === 2 ? '女' : '-' }}</template>
        </el-table-column>
        <el-table-column prop="telephone" label="注册手机号" min-width="120px"></el-table-column>
        <el-table-column prop="idcard" label="身份证号" min-width="160px"></el-table-column>
        <el-table-column label="婚姻状况" min-width="100px">
          <template slot-scope="{row}">{{ row.maritalStatus === 0 ? '未婚' : row.maritalStatus === 1 ? '已婚' : row.maritalStatus === 2 ? '离异' : '丧偶' }}</template>
        </el-table-column>
        <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="160px"></el-table-column>
        <el-table-column label="审核状态">
          <template slot-scope="{row}">
            <span style="color: #e6a23c;" v-if="row.auditStatus === 0">待审批</span>
            <span style="color: #13ce66;" v-else-if="row.auditStatus === 1">审批通过</span>
            <span style="color: #ff4949;" v-else>审批驳回</span>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="80px">
          <template slot-scope="{row}">
            <el-switch
              @change="handleStatusChange($event, row)"
              v-model="row.status"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="0"
              :inactive-value="1"
            ></el-switch>
          </template>
        </el-table-column>
        <el-table-column label="操作" min-width="100" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleDetail(row)">详情</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      ></pagination>
    </template>
    <OperaDriverApproval ref="operaDriverApproval" @success="handleApprovalSuccess" />
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDriverApproval from '@/components/business/OperaDriverApproval'
import { updateStatus, exportExcel } from '@/api/business/driver'
export default {
  name: 'DriverVerification',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDriverApproval },
  data () {
    return {
      searchForm: {
        keyword: '',
        carNo: '',
        auditStatus: '',
        sex: '',
        createTime: '',
        startTime: '',
        endTime: ''
      }
    }
  },
  created () {
    this.config({
      api: '/business/driver',
      'field.id': 'id'
    })
    this.search()
  },
  methods: {
    handleDateChange (val) {
      this.searchForm.startTime = val ? val[0] : ''
      this.searchForm.endTime = val ? val[1] : ''
      this.search()
    },
    reset () {
      this.searchForm = {
        keyword: '',
        carNo: '',
        status: '',
        sex: '',
        createTime: '',
        startTime: '',
        endTime: ''
      }
      this.search()
    },
    handleDetail (row) {
      this.$refs.operaDriverApproval.open('司机审核', row)
    },
    handleApprovalSuccess (data) {
      this.$tip.apiSuccess('审核提交成功')
      this.search()
    },
    handleStatusChange (val, row) {
      updateStatus({ id: row.id, status: val }).then(res => {
        this.$tip.apiSuccess(res || '修改成功')
      }).catch(e => {
        row.status = val === 1 ? 0 : 1
        this.$tip.apiFailed(e)
      })
    },
    handleExport () {
      this.isWorking.export = true
      exportExcel(this.getTableParams())
        .then(res => {
          this.download(res)
          this.$tip.apiSuccess('导出成功')
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking.export = false
        })
    }
  }
}
</script>
admin/src/views/business/orderManagement.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
<template>
  <TableLayout :permissions="['business:orders:query']">
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="订单编号" prop="code">
        <el-input v-model="searchForm.code" clearable placeholder="请输入订单编号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="物品信息" prop="goodsInfo">
        <el-input v-model="searchForm.goodsInfo" clearable placeholder="请输入物品信息" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createTime1">
        <el-date-picker type="daterange" v-model="searchForm.createTime1" clearable value-format="yyyy-MM-dd"
                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" @change="handleDateChange" />
      </el-form-item>
      <el-form-item label="寄件门店" prop="depositShopName">
        <el-input v-model="searchForm.depositShopName" clearable placeholder="请输入寄件门店" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="收件门店" prop="takeShopName">
        <el-input v-model="searchForm.takeShopName" clearable placeholder="请输入收件门店" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="类型" prop="type">
        <el-select v-model="searchForm.type" clearable placeholder="请选择类型" @change="search">
          <el-option label="就地存取" :value="0"></el-option>
          <el-option label="异地存取" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="订单状态" prop="status">
        <el-select v-model="searchForm.status" clearable placeholder="请选择订单状态" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="待支付" :value="0"></el-option>
          <el-option label="待寄存" :value="1"></el-option>
          <el-option label="已寄存" :value="2"></el-option>
          <el-option label="已接单" :value="3"></el-option>
          <el-option label="派送中" :value="4"></el-option>
          <el-option label="已到店/已送达" :value="5"></el-option>
          <el-option label="存在逾期" :value="6"></el-option>
          <el-option label="已完成" :value="7"></el-option>
          <el-option label="订单关闭(退款)" :value="96"></el-option>
          <el-option label="取消逾期" :value="97"></el-option>
          <el-option label="取消中" :value="98"></el-option>
          <el-option label="已取消" :value="99"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="结算状态" prop="settlementStatus">
        <el-select v-model="searchForm.settlementStatus" clearable placeholder="请选择结算状态" @change="search">
          <el-option label="待结算" :value="0"></el-option>
          <el-option label="已结算" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
        <el-button :loading="isWorking.export" @click="exportExcel">导出</el-button>
      </section>
    </el-form>
    <template v-slot:table-wrap>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
      >
        <el-table-column prop="code" label="订单编号" min-width="150px">
          <template slot-scope="{row}">
            <span class="order-no" @click="handleOrderDetail(row)">{{ row.code }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="goodsInfo" label="物品信息" min-width="120px"></el-table-column>
        <el-table-column label="类型" min-width="80px">
          <template slot-scope="{row}">
            <span v-if="row.type === 0">就地存取</span>
            <span v-else-if="row.type === 1">异地存取</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column prop="orderLevel" label="订单级别" min-width="80px"></el-table-column>
        <el-table-column label="物品保费(元)" min-width="120px">
          <template slot-scope="{row}">Â¥{{ (row.declaredFee / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="基础服务费(元)" min-width="120px">
          <template slot-scope="{row}">Â¥{{ (row.price / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="订单总价(元)" min-width="120px">
          <template slot-scope="{row}">Â¥{{ (row.totalAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="实付现金(元)" min-width="120px">
          <template slot-scope="{row}">Â¥{{ (row.payAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="退款金额(元)" min-width="120px">
          <template slot-scope="{row}">Â¥{{ (row.refundAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="超时金额" min-width="100px">
          <template slot-scope="{row}">Â¥{{ (row.overdueAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="异常金额" min-width="100px">
          <template slot-scope="{row}">Â¥{{ (row.exceptionAmount / 100).toFixed(2) }}</template>
        </el-table-column>
        <el-table-column label="结算状态" min-width="100px">
          <template slot-scope="{row}">
            <span :style="{ color: row.settlementStatus === 1 ? '#67c23a' : '#e6a23c' }">
              {{ row.settlementStatus === 1 ? '已结算' : '未结算' }}
            </span>
          </template>
        </el-table-column>
        <el-table-column label="操作" min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="handleDispatch(row)">手动派单</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      ></pagination>
    </template>
    <OperaDispatch ref="operaDispatch" />
    <OperaOrderDetail ref="operaOrderDetail" />
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDispatch from '@/components/business/OperaDispatch'
import OperaOrderDetail from '@/components/business/OperaOrderDetail'
export default {
  name: 'OrderManagement',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDispatch, OperaOrderDetail },
  data () {
    return {
      searchForm: {
        code: '',
        goodsInfo: '',
        createTime1: '',
        createStartTime: '',
        createEndTime: '',
        depositShopName: '',
        takeShopName: '',
        type: '',
        status: '',
        settlementStatus: ''
      }
    }
  },
  created () {
    this.config({
      api: '/business/orderManagement',
      'field.id': 'id'
    })
    this.search()
  },
  methods: {
    handleDateChange (val) {
      this.searchForm.createStartTime = val ? val[0] : ''
      this.searchForm.createEndTime = val ? val[1] : ''
      this.search()
    },
    reset () {
      this.searchForm = {
        orderNo: '',
        goodsInfo: '',
        createTime1: '',
        createStartTime: '',
        createEndTime: '',
        sendShopName: '',
        receiveShopName: '',
        type: '',
        orderStatus: '',
        settleStatus: ''
      }
      this.search()
    },
    handleDispatch (row) {
      this.$refs.operaDispatch.open(row)
    },
    handleOrderDetail (row) {
      this.$refs.operaOrderDetail.open(row)
    }
  }
}
</script>
<style scoped>
.order-no {
  color: #2E68EC;
  text-decoration: underline;
  cursor: pointer;
}
</style>
admin/src/views/business/sysParams.vue
@@ -7,12 +7,19 @@
        <div class="form-item">
          <span class="label">司机每日可取消订单次数为</span>
          <el-input-number v-model="form.driverDailyCancelLimit" :min="0" controls-position="right"></el-input-number>
          <span class="desc">次,超过次数后,今日不可抢单</span>
          <span class="label">次,超过次数后,今日不可抢单</span>
        </div>
        <div class="form-item">
          <span class="label">司机最大同时进行中订单数量为</span>
          <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number>
          <span class="desc">个,超过该数量不允许抢单<span class="red">(即订单状态=待取件/配送中)</span></span>
          <span class="label">个,超过该数量不允许抢单<span class="red">(即订单状态=待取件/配送中)</span></span>
        </div>
        <div class="form-item">
          <span class="label">客户下单后每隔</span>
          <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number>
          <span class="label">分钟未有司机抢单,系统推送平台管理员</span>
          <el-input-number v-model="form.orderAcceptLimit" :min="0" controls-position="right"></el-input-number>
          <span class="label">提醒加急派单处理。</span>
        </div>
      </div>
@@ -21,7 +28,7 @@
        <div class="form-item">
          <span class="label">超时</span>
          <el-input-number v-model="form.autoCancelTime" :min="0" controls-position="right"></el-input-number>
          <span class="desc">分钟未支付,订单自动取消</span>
          <span class="label">分钟未支付,订单自动取消</span>
        </div>
        <div class="form-item">
          <span class="label">急速达订单计价系数</span>
@@ -40,12 +47,12 @@
        <div class="form-item">
          <span class="label">订单送达后默认</span>
          <el-input-number v-model="form.autoConfirmReceipt" :min="0" controls-position="right"></el-input-number>
          <span class="desc">天后自动确认收货<span class="red">(仅限收件地址不是服务点的情况)</span></span>
          <span class="label">天后自动确认收货<span class="red">(仅限收件地址不是服务点的情况)</span></span>
        </div>
        <div class="form-item">
          <span class="label">订单完成后</span>
          <el-input-number v-model="form.settlementDate" :min="0" controls-position="right"></el-input-number>
          <span class="desc">天后系统结算订单,并给与参与角色按比例分成</span>
          <span class="label">天后系统结算订单,并给与参与角色按比例分成</span>
        </div>
      </div>
small-program/main.js
@@ -14,13 +14,9 @@
    Vue.prototype.$isResolve = resolve;
})
// Vue.prototype.$baseUrl = 'http://192.168.1.54:10011/'
// Vue.prototype.$baseUrl = 'http://192.168.1.54:10011/'
// Vue.prototype.$baseUrl = 'https://test.doumee.cn/jinkuai_web/'
Vue.prototype.$baseUrl = 'https://jinkuai.832smartfarm.com/jinkuai_web/'
import shareMixin from '@/utils/shareMixin'
Vue.mixin(shareMixin)
const app = new Vue({
    store,
    ...App
small-program/pages.json
@@ -11,13 +11,6 @@
            }
        },
        {
            "path": "pages/demand-hall/demand-hall",
            "style": {
                "navigationBarTitleText": "我的订单",
                "navigationStyle": "custom"
            }
        },
        {
            "path": "pages/mine/mine",
            "style": {
                "navigationBarTitleText": "我的",
@@ -25,137 +18,18 @@
            }
        },
        {
            "path": "pages/seleCity/seleCity",
            "path": "pages/itinerary/itinerary",
            "style": {
                "navigationBarTitleText": "城市选择"
                "navigationBarTitleText": ""
            }
        },
        {
            "path" : "pages/using-workers/using-workers",
            "style" :
            {
                "navigationBarTitleText" : "采摘工"
            }
        },
        {
            "path" : "pages/sorting/sorting",
            "style" :
            {
                "navigationBarTitleText" : "分拣工"
            }
        },
        {
            "path" : "pages/packaging-worker/packaging-worker",
            "style" :
            {
                "navigationBarTitleText" : "包装工"
            }
        },
        {
            "path" : "pages/success/success",
            "style" :
            {
                "navigationBarTitleText" : "发单成功"
            }
        },
        {
            "path" : "pages/freight/freight",
            "style" :
            {
                "navigationBarTitleText" : "运货"
            }
        },
        {
            "path" : "pages/order-details/order-details",
            "style" :
            {
                "navigationBarTitleText" : "订单详情"
            }
        },
        {
            "path" : "pages/freight-order/freight-order",
            "style" :
            {
                "navigationBarTitleText" : "订单详情"
            }
        },
        {
            "path" : "pages/order-food/order-food",
            "style" :
            {
                "navigationBarTitleText" : "订单详情"
            }
        },
        {
            "path" : "pages/login/login",
            "style" :
            {
                "navigationBarTitleText" : "登录页"
            }
        },
        {
            "path" : "pages/balance-details/balance-details",
            "style" :
            {
                "navigationBarTitleText" : "余额明细"
            }
        },
        {
            "path" : "pages/rich-text-page/rich-text-page",
            "style" :
            {
                "navigationBarTitleText" : "富文本页面"
            "path": "pages/message/message",
            "style": {
                "navigationBarTitleText": "消息"
            }
        }
    ],
    "subPackages": [{
        "root": "packageA", // åˆ†åŒ…的根目录
        "name": "packageA", // åˆ†åŒ…的根目录
        "pages":[
            {
                "path" : "pages/withdrawal/withdrawal",
                "style" :
                {
                    "navigationBarTitleText" : "提现"
                }
            },
            {
                "path" : "pages/withdrawal-successful/withdrawal-successful",
                "style" :
                {
                    "navigationBarTitleText" : "提现成功"
                }
            },
            {
                "path" : "pages/set-up/set-up",
                "style" :
                {
                    "navigationBarTitleText" : "设置"
                }
            },
             {
                "path" : "pages/employment-certification/employment-certification",
                "style" :
                {
                    "navigationBarTitleText" : "用工认证"
                }
            },
            {
                "path" : "pages/certification-results/certification-results",
                "style" :
                {
                    "navigationBarTitleText" : "认证结果"
                }
            }
        ]
    }],
    "preloadRule":{
        "pages/mine/mine":{
            "network": "all",
            "packages": ["packageA"]
        }
    },
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "",
@@ -170,15 +44,21 @@
        "list": [
            {
                "pagePath": "pages/index/index",
                "iconPath": "static/icon/nav_home_sel@2x (1).png",
                "iconPath": "static/icon/nav_home@2x.png",
                "selectedIconPath": "static/icon/nav_home_sel@2x.png",
                "text": "首页"
            },
            {
                "pagePath": "pages/demand-hall/demand-hall",
                "iconPath": "static/icon/nav_order@2x.png",
                "selectedIconPath": "static/icon/nav_order_sel@2x.png",
                "text": "订单"
                "pagePath": "pages/itinerary/itinerary",
                "iconPath": "static/icon/nav_xingcheng@2x.png",
                "selectedIconPath": "static/icon/nav_xingcheng_sel@2x.png",
                "text": "行程"
            },
            {
                "pagePath": "pages/message/message",
                "iconPath": "static/icon/nav_xiaoxi@2x.png",
                "selectedIconPath": "static/icon/nav_xiaoxi_sel@2x.png",
                "text": "消息"
            },
            {
                "pagePath": "pages/mine/mine",
small-program/pages/balance-details/balance-details.vue
ÎļþÒÑɾ³ý
small-program/pages/demand-hall/demand-hall.vue
ÎļþÒÑɾ³ý
small-program/pages/freight-order/freight-order.vue
ÎļþÒÑɾ³ý
small-program/pages/freight/freight.vue
ÎļþÒÑɾ³ý
small-program/pages/itinerary/itinerary.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<template>
    <view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            };
        }
    }
</script>
<style lang="scss">
</style>
small-program/pages/login/login.vue
ÎļþÒÑɾ³ý
small-program/pages/message/message.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<template>
    <view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            };
        }
    }
</script>
<style lang="scss">
</style>
small-program/pages/order-details/order-details.vue
ÎļþÒÑɾ³ý
small-program/pages/order-food/order-food.vue
ÎļþÒÑɾ³ý
small-program/pages/packaging-worker/packaging-worker.vue
ÎļþÒÑɾ³ý
small-program/pages/rich-text-page/rich-text-page.vue
ÎļþÒÑɾ³ý
small-program/pages/seleCity/seleCity.vue
ÎļþÒÑɾ³ý
small-program/pages/sorting/sorting.vue
ÎļþÒÑɾ³ý
small-program/pages/success/success.vue
ÎļþÒÑɾ³ý
small-program/pages/using-workers/using-workers.vue
ÎļþÒÑɾ³ý
small-program/static/icon/ar_address@2x.png
Binary files differ
small-program/static/icon/default_login@2x.png
Binary files differ
small-program/static/icon/home_ar_next@2x.png
Binary files differ
small-program/static/icon/home_ic_location@2x.png
Binary files differ
small-program/static/icon/ic_agree@2x.png
Binary files differ
small-program/static/icon/ic_call@2x.png
Binary files differ
small-program/static/icon/ic_camera@2x.png
Binary files differ
small-program/static/icon/ic_change@2x.png
Binary files differ
small-program/static/icon/ic_close@2x.png
Binary files differ
small-program/static/icon/ic_delete1@2x.png
Binary files differ
small-program/static/icon/ic_delete@2x.png
Binary files differ
small-program/static/icon/ic_fail@2x.png
Binary files differ
small-program/static/icon/ic_huakuai@2x.png
Binary files differ
small-program/static/icon/ic_jingguo@2x.png
Binary files differ
small-program/static/icon/ic_kefu.png
Binary files differ
small-program/static/icon/ic_location@2x.png
Binary files differ
small-program/static/icon/ic_money@2x.png
Binary files differ
small-program/static/icon/ic_notagree@2x.png
Binary files differ
small-program/static/icon/ic_pass@2x.png
Binary files differ
small-program/static/icon/ic_pingjia@2x.png
Binary files differ
small-program/static/icon/ic_qidian@2x.png
Binary files differ
small-program/static/icon/ic_renzhengzhong@2x.png
Binary files differ
small-program/static/icon/ic_search@2x.png
Binary files differ
small-program/static/icon/ic_success@2x.png
Binary files differ
small-program/static/icon/ic_time@2x.png
Binary files differ
small-program/static/icon/ic_tip@2x.png
Binary files differ
small-program/static/icon/ic_zhongdian@2x.png
Binary files differ
small-program/static/icon/img@2x.png
Binary files differ
small-program/static/icon/nav_home@2x.png
small-program/static/icon/nav_home_sel@2x (1).png
Binary files differ
small-program/static/icon/nav_home_sel@2x.png

small-program/static/icon/nav_mine@2x.png
Binary files differ
small-program/static/icon/nav_mine_sel@2x.png
Binary files differ
small-program/static/icon/nav_order@2x.png
Binary files differ
small-program/static/icon/nav_order_sel@2x.png
Binary files differ
small-program/static/icon/nav_wode@2x.png
small-program/static/icon/nav_wode_sel@2x.png
small-program/static/icon/nav_xiaoxi@2x.png
small-program/static/icon/nav_xiaoxi_sel@2x.png
small-program/static/icon/nav_xingcheng@2x.png
small-program/static/icon/nav_xingcheng_sel@2x.png
small-program/static/icon/order_ic_location@2x.png
Binary files differ
small-program/static/icon/order_ic_time@2x.png
Binary files differ
small-program/static/image/bg_green@2x.png
Binary files differ
small-program/static/image/bg_renzheng_gongcan@2x.png
Binary files differ
small-program/static/image/bg_renzheng_huoyun@2x.png
Binary files differ
small-program/static/image/bg_renzheng_yonggong@2x.png
Binary files differ
small-program/static/image/btn.png
Binary files differ
small-program/static/image/btn_guohui@2x.png
Binary files differ
small-program/static/image/btn_renxiang@2x.png
Binary files differ
small-program/static/image/share@2x.png
Binary files differ
small-program/static/logo.png
Binary files differ
small-program/static/share.png
Binary files differ
small-program/utils/shareMixin.js
ÎļþÒÑɾ³ý