doum
4 小时以前 610392fca3aca1bd4e3d94bff398ba738a51d625
支付宝支付dddadd
已删除9个文件
已修改4个文件
1190 ■■■■ 文件已修改
admin/src/components/business/OperaAppversionWindow.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDriverEditWindow.vue 625 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/appversion.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/driverList.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/pages/delivery-order-detail/delivery-order-detail.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/shop/pages/order-details/order-details.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/shop/pages/wallet/wallet.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.wxml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.wxss 493 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/project.private.config.json 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/shop/pages/order-details/order-details.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
small-program/unpackage/dist/dev/mp-weixin/shop/pages/wallet/wallet.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaAppversionWindow.vue
@@ -7,11 +7,14 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="版本名称" prop="versionNum">
        <el-input v-model="form.title"  placeholder="请输入版本名称" v-trim/>
      </el-form-item>
      <el-form-item label="版本号" prop="versionNum">
        <el-input v-model="form.versionNum" type="number" placeholder="请输入版本号" v-trim/>
      </el-form-item>
      <el-form-item label="版本名称" prop="versionInfo">
        <el-input v-model="form.versionInfo" placeholder="请输入版本号" v-trim/>
      <el-form-item label="版本号显示名称" prop="versionInfo">
        <el-input v-model="form.versionInfo" placeholder="版本号显示名称" v-trim/>
      </el-form-item>
      <el-form-item label="安装包" prop="fileUrl">
        <div style="width: 100%; height: 1px;"></div>
@@ -50,15 +53,16 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
export default {
  name: 'OperaJkVersionWindow',
  name: 'OperaAppversionWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload',
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/business/appVersion/uploadFile',
      // è¡¨å•数据
      form: {
        id: null,
        title: '',
        versionInfo: '',
        fileUrl: '',
        content: '',
@@ -69,11 +73,14 @@
      },
      // éªŒè¯è§„则
      rules: {
        title: [
          { required: true, message: '请输入版本名称', trigger: 'blur' }
        ],
        versionNum: [
          { required: true, message: '请输入版本号', trigger: 'blur' }
        ],
        versionInfo: [
          { required: true, message: '请输入版本名称', trigger: 'blur' }
          { required: true, message: '请输入版本号显示名称', trigger: 'blur' }
        ],
        fileUrl: [
          { required: true, message: '请上传安装包', trigger: 'blur' }
admin/src/components/business/OperaDriverEditWindow.vue
@@ -1,341 +1,270 @@
<template>
  <GlobalWindow
    title="编辑门店"
    :visible.sync="visible"
    width="600px"
    :confirm-working="isWorking.save"
    @confirm="handleConfirm"
      :title="title"
      :visible.sync="visible"
      width="900px"
      :withFooter="false"
  >
    <el-form ref="form" :model="form" :rules="rules">
      <div class="form-section">
        <h4 class="section-title">账号信息</h4>
        <el-form-item label="注册手机号" prop="telephone">
          <el-input v-model="form.telephone" disabled></el-input>
        </el-form-item>
        <div class="password-tip">默认密码默认为:【手机号后六位+@123456",如后六位为981923,默认密码:981923@123456</div>
      </div>
      <div class="form-section">
        <h4 class="section-title">基本信息</h4>
        <el-form-item label="门店名称" prop="name">
          <el-input v-model="form.name" placeholder="请输入门店名称"></el-input>
        </el-form-item>
        <el-form-item label="门店类型" prop="companyType">
          <el-radio-group v-model="form.companyType" disabled>
            <el-radio :label="1">企业</el-radio>
            <el-radio :label="0">个人</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="联系人" prop="linkName">
          <el-input v-model="form.linkName" placeholder="请输入联系人"></el-input>
        </el-form-item>
        <el-form-item label="联系电话" prop="linkPhone">
          <el-input v-model="form.linkPhone" placeholder="请输入联系电话"></el-input>
        </el-form-item>
        <el-form-item label="身份证号" prop="idcard">
          <el-input v-model="form.idcard" placeholder="请输入身份证号"></el-input>
        </el-form-item>
        <el-form-item label="所在省市区" prop="areaCode">
          <el-cascader v-model="form.areaCode" :options="areaOptions" placeholder="请选择省市区"></el-cascader>
        </el-form-item>
        <el-form-item label="门店地址" prop="address">
          <el-input v-model="form.address" placeholder="请输入门店地址"></el-input>
        </el-form-item>
        <el-form-item label="经纬度" prop="longitude">
          <div class="longitude-latitude">
            <el-input v-model="form.longitude" placeholder="经度" style="width: 150px;"></el-input>
            <span class="separator">-</span>
            <el-input v-model="form.latitude" placeholder="纬度" style="width: 150px;"></el-input>
            <el-button type="primary" @click="openMapSelector">选择</el-button>
    <div class="driver-approval">
      <div class="section">
        <div class="section-header">
          <span class="section-title">司机信息</span>
          <div class="approval-status">
            <el-tag v-if="detailInfo.auditStatus === 0" type="warning" class="status-tag">待审核</el-tag>
          </div>
        </el-form-item>
        </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"  v-if="detailInfo.auditStatus === 3 || detailInfo.auditStatus === 1" >
            <span class="label">评级:</span>
            <span class="value" v-if="detailInfo.driverLevel ==5">S</span>
            <span class="value" v-else-if="detailInfo.driverLevel ==4">A</span>
            <span class="value" v-else-if="detailInfo.driverLevel ==3">B</span>
            <span class="value" v-else-if="detailInfo.driverLevel ==2">C</span>
            <span class="value" v-else-if="detailInfo.driverLevel ==1">D</span>
            <span class="value" v-else>-</span>
          </div>
          <div class="info-item">
            <span class="label">状态:</span>
            <span class="value">{{ detailInfo.status === 0 ? '启用' : '禁用' }}</span>
          </div>
        </div>
      </div>
      <div class="form-section">
        <el-tabs v-model="qualificationTab">
          <el-tab-pane v-if="form.companyType === 1" label="主体资质(企业)" name="enterprise">
            <el-form-item label="法人姓名" prop="legalPersonName">
              <el-input v-model="form.legalPersonName" placeholder="请输入法人姓名"></el-input>
            </el-form-item>
            <el-form-item label="法人手机号" prop="legalPersonPhone">
              <el-input v-model="form.legalPersonPhone" placeholder="请输入法人手机号"></el-input>
            </el-form-item>
            <el-form-item label="法人身份证号" prop="legalPersonCard">
              <el-input v-model="form.legalPersonCard" placeholder="请输入法人身份证号"></el-input>
            </el-form-item>
            <el-form-item label="法人身份证正面" prop="idcardImg">
              <UploadImages
                :fileList="form.idcardImg"
                :uploadData="{ folder: 'shop' }"
                @getFileList="e => form.idcardImg.push(e)"
                @deleteRow="index => form.idcardImg.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="法人身份证反面" prop="idcardImgBack">
              <UploadImages
                :fileList="form.idcardImgBack"
                :uploadData="{ folder: 'shop' }"
                @getFileList="e => form.idcardImgBack.push(e)"
                @deleteRow="index => form.idcardImgBack.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="营业执照" prop="businessImg">
              <UploadImages
                :fileList="form.businessImg"
                :uploadData="{ folder: 'shop' }"
                @getFileList="e => form.businessImg.push(e)"
                @deleteRow="index => form.businessImg.splice(index, 1)" />
            </el-form-item>
          </el-tab-pane>
          <el-tab-pane v-if="form.companyType === 0" label="主体资质(个人)" name="personal">
            <el-form-item label="身份证正面" prop="idcardImg">
              <UploadImages
                :fileList="form.idcardImg"
                :uploadData="{ folder: 'shop' }"
                @getFileList="e => form.idcardImg.push(e)"
                @deleteRow="index => form.idcardImg.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="身份证反面" prop="idcardImgBack">
              <UploadImages
                :fileList="form.idcardImgBack"
                :uploadData="{ folder: 'shop' }"
                @getFileList="e => form.idcardImgBack.push(e)"
                @deleteRow="index => form.idcardImgBack.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="有效劳动合同" prop="laborContractImgs">
              <UploadImages
                :fileList="form.laborContractImgs"
                :uploadData="{ folder: 'shop' }"
                :maxCount="3"
                @getFileList="e => form.laborContractImgs.push(e)"
                @deleteRow="index => form.laborContractImgs.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="社保缴纳证明" prop="socialSecurityImgs">
              <UploadImages
                :fileList="form.socialSecurityImgs"
                :uploadData="{ folder: 'shop' }"
                :maxCount="3"
                @getFileList="e => form.socialSecurityImgs.push(e)"
                @deleteRow="index => form.socialSecurityImgs.splice(index, 1)" />
            </el-form-item>
          </el-tab-pane>
          <el-tab-pane label="门店照片及其他材料" name="photos">
            <el-form-item label="门店门头照" prop="storeFrontImgs">
              <UploadImages
                :fileList="form.storeFrontImgs"
                :uploadData="{ folder: 'shop' }"
                :maxCount="3"
                @getFileList="e => form.storeFrontImgs.push(e)"
                @deleteRow="index => form.storeFrontImgs.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="门店内部照片" prop="storeInteriorImgs">
              <UploadImages
                :fileList="form.storeInteriorImgs"
                :uploadData="{ folder: 'shop' }"
                :maxCount="3"
                @getFileList="e => form.storeInteriorImgs.push(e)"
                @deleteRow="index => form.storeInteriorImgs.splice(index, 1)" />
            </el-form-item>
            <el-form-item label="其它材料" prop="otherMaterialImgs">
              <UploadImages
                :fileList="form.otherMaterialImgs"
                :uploadData="{ folder: 'shop' }"
                :maxCount="3"
                @getFileList="e => form.otherMaterialImgs.push(e)"
                @deleteRow="index => form.otherMaterialImgs.splice(index, 1)" />
            </el-form-item>
          </el-tab-pane>
        </el-tabs>
      <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>
    </el-form>
      <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="approvalForm.auditStatus ===0?approvalRules:approvalRules1">
          <el-form-item label="审批结果" prop="auditStatus">
            <el-radio-group v-model="approvalForm.auditStatus" @change="changeRadio">
              <el-radio :label="0">通过</el-radio>
              <el-radio :label="1">拒绝</el-radio>
            </el-radio-group>
          </el-form-item>
          <el-form-item label="司机评级" prop="driverLevel" v-if="approvalForm.auditStatus ===0">
            <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 BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadImages from '@/components/common/uploadImages'
import { detail, updateById } from '@/api/business/shopInfo'
import { listByParentId } from '@/api/business/areas'
import { getById, audit } from '@/api/business/driver'
export default {
  name: 'OperaShopEditWindow',
  extends: BaseOpera,
  components: { GlobalWindow, UploadImages },
  name: 'OperaDriverApproval',
  components: { GlobalWindow },
  data () {
    return {
      form: {
      title: '司机审核',
      visible: false,
      isWorking: false,
      detailInfo: {},
      approvalForm: {
        id: null,
        telephone: '',
        name: '',
        companyType: 1,
        linkName: '',
        linkPhone: '',
        idcard: '',
        areaCode: [],
        provinceId: '',
        cityId: '',
        areaId: '',
        address: '',
        longitude: '',
        latitude: '',
        legalPersonName: '',
        legalPersonPhone: '',
        legalPersonCard: '',
        idcardImg: '',
        idcardImgBack: '',
        businessLicenseImg: '',
        laborContractImgs: '',
        socialSecurityImgs: '',
        storeFrontImgs: '',
        storeInteriorImgs: '',
        otherMaterialImgs: ''
        auditStatus: 0,
        driverLevel: '',
        auditRemark: ''
      },
      rules: {
        name: [{ required: true, message: '请输入门店名称', trigger: 'blur' }],
        companyType: [{ required: true, message: '请选择门店类型', trigger: 'change' }],
        linkName: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
        linkPhone: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
        idcard: [{ required: true, message: '请输入身份证号', trigger: 'blur' }],
        areaCode: [{ required: true, message: '请选择省市区', trigger: 'change' }],
        address: [{ required: true, message: '请输入门店地址', trigger: 'blur' }],
        longitude: [{ required: true, message: '请选择经纬度', trigger: 'blur' }],
        legalPersonName: [{ required: true, message: '请输入法人姓名', trigger: 'blur' }],
        legalPersonPhone: [{ required: true, message: '请输入法人手机号', trigger: 'blur' }],
        legalPersonCard: [{ required: true, message: '请输入法人身份证号', trigger: 'blur' }],
        businessImg: [{ required: true, message: '请输入营业执照', trigger: 'blur' }],
        idcardImg: [{ required: true, message: '请输入身份证正面', trigger: 'blur' }],
        idcardImgBack: [{ required: true, message: '请输入身份证反面', trigger: 'blur' }],
        laborContractImgs: [{ required: true, message: '请输入有效劳动合同', trigger: 'blur' }],
        socialSecurityImgs: [{ required: true, message: '请输入社保缴纳证明', trigger: 'blur' }],
        storeFrontImgs: [{ required: true, message: '请输入门店门头照', trigger: 'blur' }],
        storeInteriorImgs: [{ required: true, message: '请输入门店内部照片', trigger: 'blur' }]
        // otherMaterialImgs: [{ required: true, message: '请输入其它材料', trigger: 'blur' }]
      approvalRules: {
        auditStatus: [{ required: true, message: '请选择审批结果', trigger: 'change' }],
        driverLevel: [{ required: true, message: '请选择司机评级', trigger: 'change' }]
      },
      qualificationTab: 'enterprise',
      areaOptions: [],
      isWorking: {
        save: false
      approvalRules1: {
        auditStatus: [{ required: true, message: '请选择审批结果', trigger: 'change' }],
        auditRemark: [{ required: true, message: '请输入审批意见', trigger: 'blur' }]
      }
    }
  },
  created () {
    this.config({
      api: '/business/shopInfo',
      'field.id': 'id'
    })
    this.loadAreaOptions()
  },
  methods: {
    changeRadio(){
      this.$refs.approvalForm.clearValidate()
    },
    open (title, row) {
      this.isWorking.save = false
      detail(row.id)
        .then(res => {
          this.form = {
            id: res.id,
            telephone: res.telephone || '',
            name: res.name || '',
            companyType: res.companyType ?? 1,
            linkName: res.linkName || '',
            linkPhone: res.linkPhone || '',
            idcard: res.idcard || '',
            areaCode: res.provinceId ? [res.provinceId, res.cityId, res.areaId] : [],
            provinceId: res.provinceId || '',
            cityId: res.cityId || '',
            areaId: res.areaId || '',
            address: res.address || '',
            longitude: res.longitude || '',
            latitude: res.latitude || '',
            legalPersonName: res.legalPersonName || '',
            legalPersonPhone: res.legalPersonPhone || '',
            legalPersonCard: res.legalPersonCard || '',
            businessImg: res.companyType === 1 ? [{ fileurl: res.businessImg, url: res.imgPrefix + res.businessImg }] : [],
            idcardImg: [{ fileurl: res.idcardImg, url: res.imgPrefix + res.idcardImg }],
            idcardImgBack: [{ fileurl: res.idcardImgBack, url: res.imgPrefix + res.idcardImgBack }],
            laborContractImgs: res.laborContractImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
            socialSecurityImgs: res.socialSecurityImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
            storeFrontImgs: res.storeFrontImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
            storeInteriorImgs: res.storeInteriorImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
            otherMaterialImgs: res.otherMaterialImgs ? res.otherMaterialImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })) : []
          }
          this.qualificationTab = res.companyType === 1 ? 'enterprise' : 'personal'
          this.title = title
          this.visible = true
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    },
    loadAreaOptions () {
      listByParentId({ })
        .then(data => {
          this.areaOptions = this.formatAreaData(data)
          console.log(this.areaOptions)
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
    },
    formatAreaData (data) {
      const map = {}
      const result = []
      data.forEach(item => {
        map[item.id] = { value: item.id, label: item.name, children: [] }
      })
      data.forEach(item => {
        if (item.type === 0) {
          result.push(map[item.id])
        } else if (item.type === 1 && item.parentId && map[item.parentId]) {
          map[item.parentId].children.push(map[item.id])
        } else if (item.type === 2 && item.parentId && map[item.parentId]) {
          map[item.parentId].children.push(map[item.id])
        }
      })
      const clearEmptyChildren = (nodes) => {
        nodes.forEach(node => {
          if (node.children.length === 0) {
            node.children = null
          } else {
            clearEmptyChildren(node.children)
          }
        })
      this.title = title
      this.approvalForm = {
        id: row.id,
        auditStatus: 0,
        driverLevel: '',
        auditRemark: ''
      }
      clearEmptyChildren(result)
      return result
      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)
      })
    },
    openMapSelector () {
      window.open('https://lbs.qq.com/getPoint/', '_blank')
    close () {
      this.visible = false
    },
    handleConfirm () {
      this.$refs.form.validate(valid => {
      this.$refs.approvalForm.validate(valid => {
        if (!valid) return
        this.isWorking.save = true
        const imageFields = ['laborContractImgs', 'socialSecurityImgs', 'storeFrontImgs', 'storeInteriorImgs', 'otherMaterialImgs']
        const singleImageFields = ['businessImg', 'idcardImg', 'idcardImgBack']
        const data = { ...this.form }
        singleImageFields.forEach(field => {
          if (data[field] && Array.isArray(data[field])) {
            data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item).join(',')
          }
        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
        })
        imageFields.forEach(field => {
          if (data[field] && Array.isArray(data[field])) {
            data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item)
          }
        })
        data.provinceId = this.form.areaCode[0] || ''
        data.cityId = this.form.areaCode[1] || ''
        data.areaId = this.form.areaCode[2] || ''
        delete data.areaCode
        updateById(data)
          .then(res => {
            this.$tip.apiSuccess(res || '保存成功')
            this.visible = false
            this.$emit('success')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking.save = false
          })
      })
    }
  }
@@ -343,32 +272,82 @@
</script>
<style scoped>
.form-section {
  margin-bottom: 20px;
.driver-approval {
}
.section {
  margin-bottom: 25px;
}
.checkinfo {
  align-items:start   !important;
  display: flex !important;
  flex-direction: column   !important;
  background-color: rgb(254 242 242);
  min-height: 100px;
  margin-bottom: 30px;
  padding: 20px;
}
.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;
  margin-bottom: 15px;
  padding-left: 10px;
  border-left: 4px solid #2E68EC;
}
.password-tip {
  color: #909399;
  font-size: 12px;
  margin: -10px 0 15px 0;
.approval-status {
  margin-left: auto;
}
.longitude-latitude {
.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;
  align-items: center;
  gap: 10px;
  font-size: 14px;
}
.longitude-latitude .separator {
.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;
}
.inline-form /deep/ .el-form-item {
  display: block;
  margin-right: 0;
.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/views/business/appversion.vue
@@ -1,5 +1,5 @@
<template>
  <TableLayout :permissions="['business:appversion:query']">
  <TableLayout :permissions="['business:appVersion:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="版本号" prop="versionInfo">
@@ -19,8 +19,8 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:appversion:create', 'business:appversion:delete']">
        <li><el-button type="primary" @click="$refs.operaAppversionWindow.open('新建版本')" icon="el-icon-plus" v-permissions="['business:appversion:create']">新建</el-button></li>
      <ul class="toolbar" v-permissions="['business:appVersion:create', 'business:appVersion:delete']">
        <li><el-button type="primary" @click="$refs.operaAppversionWindow.open('新建版本')" icon="el-icon-plus" v-permissions="['business:appVersion:create']">新建</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
@@ -28,8 +28,9 @@
        :data="tableData.list"
        stripe
      >
        <el-table-column prop="title" label="版本名称" min-width="100px"></el-table-column>
        <el-table-column prop="versionNum" label="版本号" min-width="100px"></el-table-column>
        <el-table-column prop="versionInfo" label="版本名称" min-width="100px"></el-table-column>
        <el-table-column prop="versionInfo" label="版本号显示名称" min-width="100px"></el-table-column>
        <el-table-column label="平台类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type === 0">Android</span>
@@ -49,17 +50,16 @@
            <span v-if="row.isForce === 1">是</span>
          </template>
        </el-table-column>
        <el-table-column prop="createUserName" label="创建者" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="updateTime" label="最近更新时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:appversion:update', 'business:appversion:delete'])"
          v-if="containPermissions(['business:appVersion:update', 'business:appVersion:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaAppversionWindow.open('编辑版本', row)" icon="el-icon-edit" v-permissions="['business:appversion:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:appversion:delete']">删除</el-button>
            <el-button type="text" @click="$refs.operaAppversionWindow.open('编辑版本', row)" icon="el-icon-edit" v-permissions="['business:appVersion:update']">编辑</el-button>
            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:appVersion:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -81,7 +81,7 @@
import Pagination from '@/components/common/Pagination'
import OperaAppversionWindow from '@/components/business/OperaAppversionWindow'
export default {
  name: 'JkVersion',
  name: 'appversion',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaAppversionWindow },
  data () {
admin/src/views/business/driverList.vue
@@ -61,7 +61,8 @@
        </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>
            <el-button type="text" @click="handleEdit(row)">编辑</el-button>
            <el-button type="text"   @click="handleDetail(row)">司机详情</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -72,6 +73,7 @@
      ></pagination>
    </template>
    <OperaDriverDetail ref="operaDriverDetail" />
    <OperaDriverEditWindow ref="operaDriverEditWindow" @success="handlePageChange" />
  </TableLayout>
</template>
@@ -80,12 +82,13 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaDriverDetail from '@/components/business/OperaDriverDetail'
import OperaDriverEditWindow from '@/components/business/OperaDriverEditWindow'
import { updateStatus, exportExcel } from '@/api/business/driver'
export default {
  name: 'DriverList',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaDriverDetail },
  components: { TableLayout, Pagination, OperaDriverDetail, OperaDriverEditWindow },
  data () {
    return {
      searchForm: {
@@ -108,6 +111,9 @@
    this.search()
  },
  methods: {
    handleEdit (row) {
      this.$refs.operaDriverEditWindow.open('编辑门店', row)
    },
    handleDateChange (val) {
      this.searchForm.startTime = val ? val[0] : ''
      this.searchForm.endTime = val ? val[1] : ''
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/pages/delivery-order-detail/delivery-order-detail.js.map
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/shop/pages/order-details/order-details.js.map
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/.sourcemap/mp-weixin/shop/pages/wallet/wallet.js.map
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.js
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.wxml
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/pages/delivery-order-detail/delivery-order-detail.wxss
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/project.private.config.json
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/shop/pages/order-details/order-details.js
ÎļþÒÑɾ³ý
small-program/unpackage/dist/dev/mp-weixin/shop/pages/wallet/wallet.js
ÎļþÒÑɾ³ý