doum
2025-09-15 82735e4d46ac7b9969facef2acc8f8e793b68f71
small-program/pages/index/index.vue
@@ -1,7 +1,11 @@
<template>
   <view class="index">
      <!-- 接单方 -->
      <view class="index-j" v-if="typeViewId === 1">
      <view class="index-j" v-if="userInfo && userInfo.useIdentity === 1">
         <view class="kefubtn" @click="contactPhone()">
            <image style="width: 36rpx;height: 36rpx" src="/static/icon/ic_kefu.png" mode="widthFix"></image>
            <text>客服</text>
         </view>
         <view class="index-j-head">
            <view :style="{ width: '100%', height: statusbarHeight + 'px' }"></view>
            <view class="index-c-title" :style="{ height: navHeight + 'px' }">
@@ -11,77 +15,97 @@
         <view class="search" :style="{ top: statusbarHeight + navHeight + 'px' }">
            <view class="index-j-cate">
               <view class="index-j-cate-item" v-for="(item, index) in searchType" :key="index" @click="clickCate(item.id)">
                  <text :style="{ color: typeVal === item.id ? '##222222' : '' }">{{item.name}}</text>
                  <text :style="{ color: typeVal === item.id ? '#222222' : '', fontSize: typeVal === item.id ? '36rpx' : '', fontWeight: typeVal === item.id ? '600' : '' }">{{item.name}}</text>
                  <view class="index-j-cate-item-x" v-if="typeVal === item.id"></view>
               </view>
            </view>
            <view class="index-j-search">
               <view class="index-j-search-item active">最新发布</view>
               <view class="index-j-search-item">距离优先</view>
               <view class="index-j-search-item">价格从高到低</view>
               <view :class="sortType === item.id ? 'index-j-search-item active' : 'index-j-search-item'" v-for="(item, index) in sortList" :key="index" @click="clickSort(item.id)">{{item.name}}</view>
            </view>
         </view>
         <view class="index-j-list">
            <view class="index-list-item" v-for="(item, index) in orderList" :key="index">
               <view class="index-list-item-head">
                  <view class="index-list-item-head-l">
                     <view class="xoam"></view>
                     <text v-if="item.type === 0 && item.workType === 0">用工单 - 采摘工</text>
                     <text v-else-if="item.type === 0 && item.workType === 1">用工单 - 分拣工</text>
                     <text v-else-if="item.type === 0 && item.workType === 2">用工单 - 包装工</text>
                     <text v-else-if="item.type === 1">运货单-{{item.categoryName}}-{{item.carUnit}}</text>
                     <text v-else-if="item.type === 2">订餐单</text>
            <view class="index-list-item" v-if="orderList && orderList.length" v-for="(item, index) in orderList" :key="index">
               <view  @click="goOrderDetail(item.id)">
                  <view class="index-list-item-head" >
                     <view class="index-list-item-head-l">
                        <view class="xoam"></view>
                        <text v-if="item.type === 0 && item.workType === 0">用工单 - 采摘工</text>
                        <text v-else-if="item.type === 0 && item.workType === 1">用工单 - 分拣工</text>
                        <text v-else-if="item.type === 0 && item.workType === 2">用工单 - 包装工</text>
                        <text v-else-if="item.type === 1">运货单-{{item.categoryName}}</text>
                        <text v-else-if="item.type === 2">订餐单</text>
                     </view>
                     <view class="index-list-item-head-r">{{item.distance}}km</view>
                  </view>
                  <view class="index-list-item-head-r">距离 {{item.distance}}km</view>
               </view>
               <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 0">
                  {{item.categoryName}}|{{item.priceNum1}}斤
               </view>
               <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 1">
                  {{item.categoryName}}|{{item.priceNum1}}斤
               </view>
               <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 2">
                  {{item.categoryName}}|{{item.priceNum1}}斤
               </view>
               <view class="index-list-item-info" v-if="item.type === 1">
                  {{item.categoryName}}|{{item.priceNum1}}斤
               </view>
               <view class="index-list-item-info" v-if="item.type === 2">
                  {{item.wayInfoCopy}}
               </view>
               <view class="index-list-item-dz">
                  <image src="/static/icon/order_ic_location@2x.png" mode="widthFix"></image>
                  <text>{{item.location}}</text>
               </view>
               <view class="index-list-item-dz">
                  <image src="/static/icon/order_ic_time@2x.png" mode="widthFix"></image>
                  <text>{{item.startDate}} 至 {{item.endDate}}({{item.priceNum1}}天)</text>
               </view>
               <view class="index-list-item-price">
                  <text>预估:</text>
                  <text>¥{{item.estimatedAccount / 100}}</text>
                  <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 0">
                     {{item.categoryName}}|{{item.priceNum1}}斤
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 1">
                     {{item.categoryName}}|{{item.priceNum2}}人
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 2&& item.carType === 0">
                     {{item.categoryName}}|{{item.priceNum1}}天 |{{item.priceNum2}}人
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 2&& item.carType === 1">
                     {{item.categoryName}}|{{item.priceNum1}}小时 |{{item.priceNum2}}人
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 0 && item.workType === 2&& item.carType === 2">
                     {{item.categoryName}}|{{item.priceNum1}}斤
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 1">
                     {{item.carUnit}} | {{item.transportTypeName}} | {{item.transportNum}}{{item.transportUnit}}|用车{{item.priceNum1}}{{item.carType === 0?"天":"次"}}
                  </view>
                  <view class="index-list-item-info" v-if="item.type === 2">
                     {{item.wayInfoCopy}}
                  </view>
                  <view class="address" v-if="item.type === 1">
                     <view class="address-xian"></view>
                     <view class="address-row" v-if="item.wayInfo" v-for="(address, i) in item.wayInfo" :key="i">
                        <image src="/static/icon/ic_qidian@2x.png" mode="widthFix" v-if="i === 0"></image>
                        <image src="/static/icon/ic_jingguo@2x.png" mode="widthFix" v-else-if="i !== 0 && i !== item.wayInfo.length - 1"></image>
                        <image src="/static/icon/ic_zhongdian@2x.png" mode="widthFix" v-else-if="i === item.wayInfo.length - 1"></image>
                        <text>{{address.location}}</text>
                     </view>
                  </view>
                  <template v-if="[0, 2].includes(item.type)">
                     <view class="index-list-item-dz">
                        <image src="/static/icon/order_ic_location@2x.png" mode="widthFix"></image>
                        <text>{{item.location}}</text>
                     </view>
                     <view class="index-list-item-dz">
                        <image src="/static/icon/order_ic_time@2x.png" mode="widthFix"></image>
                        <text>{{item.startDate}} 至 {{item.endDate}}({{item.totalDays}}天)</text>
                     </view>
                  </template>
                  <view class="index-list-item-price">
                     <text>预估:</text>
                     <text>¥{{item.estimatedAccount / 100}}</text>
                  </view>
               </view>
               <view class="eidt">
                  <sunui-mverify @change="mverify($event, item.id)"></sunui-mverify>
                  <!-- <sunui-mverify @change="getaccept($event, item.id, index)"></sunui-mverify> -->
                  <view class="eidt-btn" @click="show1 = true, orderId = item.id">抢单</view>
               </view>
            </view>
            <view v-if="orderList && orderList.length&& !next" class="more">已加载全部</view>
            <view v-if="(!orderList || !orderList.length)&& !next"  class="more">暂无订单哦</view>
         </view>
      </view>
      
      <!-- 发单方 -->
      <view class="index-c" v-if="typeViewId === 0">
      <!-- 发单方  -->
      <view class="index-c" v-if="!isLogin || !userInfo || userInfo.useIdentity === 0">
         <view :style="{ width: '100%', height: statusbarHeight + 'px' }"></view>
         <view class="index-c-title" :style="{ height: navHeight + 'px' }" @click="selectAddress">
         <view class="index-c-title" :style="{ height: navHeight + 'px' }" @click="selectAddress(-1)">
            <text class="index-c-title-logo">近快</text>
            <image class="dingwei" src="/static/icon/home_ic_location@2x.png" mode="widthFix"></image>
            <text>西湖国际广场</text>
            <text>{{location.address || address || '获取地址失败'}}</text>
            <image class="qu" src="/static/icon/home_ar_next@2x.png" mode="widthFix"></image>
         </view>
         
         <view class="index-c-cate">
            <view
               v-if="type"
               :class="typeId === item.id ? 'index-c-cate-item active' : 'index-c-cate-item'"
               v-for="(item, index) in type"
               :key="index"
@@ -105,16 +129,17 @@
                  <view class="list-item-row">
                     <view class="list-item-row-label">用餐时间<b>*</b></view>
                     <view class="list-item-row-radio">
                        <view class="radio-item" v-for="(item, index) in orderFood" :key="index">
                        <view class="radio-item" v-if="orderFood" v-for="(item, index) in orderFood" :key="index">
                           <view class="radio-item-label">{{item.name}}</view>
                           <view class="radio-item-list">
                              <view class="radio-item-list-l">
                                 <view :class="child.active ? 'radio-item-list-item active' : 'radio-item-list-item'" v-for="(child, childIndex) in item.list" :key="childIndex" @click="selectMenu(index, childIndex)">{{child.price}}元</view>
                                 <view v-if="item.list" :class="child.active ? 'radio-item-list-item active' : 'radio-item-list-item'" v-for="(child, childIndex) in item.list" :key="childIndex" @click="selectMenu(index, childIndex)">{{child.price||0}}元</view>
                              </view>
                              <view class="radio-item-list-data">
                                 <text>份数:</text>
                                 <input type="number" v-model="item.num" placeholder="请输入">
                                 <text style="flex-shrink: 0;">份数:</text>
                                 <input type="digit" v-model="item.num" placeholder="请输入">
                                 <text style="color: #999999;">份</text>
                                 <view class="radio-item-list-data-btn" @click="clear(index)">取消</view>
                              </view>
                           </view>
                        </view>
@@ -133,29 +158,30 @@
                        <input type="text" v-model="form.locationRemark" placeholder="请输入" />
                     </view>
                  </view>
                  <view class="list-item-row" v-if="viewStatus">
                  <view class="list-item-row"  >
                     <view class="list-item-row-label">需求补充</view>
                     <view class="list-item-row-val">
                        <textarea v-model="form.supplement" cols="30" rows="10" placeholder="请输入" maxlength="200"></textarea>
                     </view>
                  </view>
                  <view class="list-item-row" v-if="viewStatus">
                  <view class="list-item-row"  >
                     <view class="list-item-row-label">图片</view>
                     <view class="list-item-row-upload">
                        <view class="upload-item" v-for="(item, index) in form.multifileList" :key="index">
                        <view class="upload-item" v-if=" form.multifileList" v-for="(item, index) in form.multifileList" :key="index" @click="preview(index, form.multifileList)">
                           <image :src="item.url" mode="widthFix"></image>
                           <image class="upload-item-dele" @click="form.multifileList.splice(index, 1)" src="/static/icon/ic_delete1@2x.png" mode="widthFix"></image>
                           <image class="upload-item-dele" @click.stop="form.multifileList.splice(index, 1)" src="/static/icon/ic_delete1@2x.png" mode="widthFix"></image>
                        </view>
                        <view class="upload-item" @click="uploadImg">
                           <u-icon name="plus" color="#999999" size="24"></u-icon>
                           <text>点击上传</text>
                        </view>
                        <view style="width: 208rpx; height: 0;"></view>
                     </view>
                  </view>
                  <view class="list-item-zk" @click="viewStatus = !viewStatus">
                  <!-- <view class="list-item-zk" @click="viewStatus = !viewStatus">
                     <text>{{viewStatus ? '收起' : '补充需求'}}</text>
                     <u-icon :name="viewStatus ? 'arrow-up' : 'arrow-down'" color="#00BC12" size="16"></u-icon>
                  </view>
                  </view> -->
               </view>
               <view class="list-item">
                  <view class="list-item-label">联系人信息</view>
@@ -183,8 +209,8 @@
                  </view>
               </view>
               <view class="box-hz-btn" :style="{ backgroundImage: 'url(' + btn + ')' }">
                  <view class="box-hz-btn-kf">客服</view>
                  <view class="box-hz-btn-next" @click="submit">下一步</view>
                  <view class="box-hz-btn-kf" @click="contactPhone()">客服</view>
                  <view class="box-hz-btn-next" @click="submit">立即下单</view>
               </view>
            </view>
         </template>
@@ -195,7 +221,7 @@
               <!-- 用工 -->
               <template v-if="typeId === 0">
                  <view class="box-hz-cate">
                     <view :class="form.workType === item.id ? 'box-hz-cate-item active' : 'box-hz-cate-item'" v-for="(item, index) in typeWork" :key="index" @click="clickTypeWork(item.id)">
                     <view v-if="typeWork" :class="form.workType === item.id ? 'box-hz-cate-item active' : 'box-hz-cate-item'" v-for="(item, index) in typeWork" :key="index" @click="clickTypeWork(item.id)">
                        <text>{{item.name}}</text>
                        <view class="box-hz-cate-item-x" v-if="form.workType === item.id"></view>
                     </view>
@@ -213,10 +239,10 @@
                     </view>
                     <view class="box-hz-list-item" @click="selectAddress(1)">
                        <view class="box-hz-list-item-label"><text>用工地点:</text></view>
                        <view :class="form.location ? 'box-hz-list-item-val active' :'box-hz-list-item-val'">
                        <view :class="form.address ? 'box-hz-list-item-val active' :'box-hz-list-item-val'">
                           <view class="box-hz-list-item-val-left">
                              <image class="icon" src="/static/icon/ic_location@2x.png" mode="widthFix"></image>
                              <text>{{form.location ? form.location : '请选择用工地点'}}</text>
                              <text>{{form.address ? form.address : '请选择用工地点'}}</text>
                           </view>
                           <u-icon name="arrow-right" color="#111111" size="16"></u-icon>
                        </view>
@@ -226,12 +252,13 @@
               
               <!-- 运货 -->
               <template v-if="typeId === 1">
                  <view class="box-hz-cate">
                     <view :class="form.categoryId === item.id ? 'box-hz-cate-item active' : 'box-hz-cate-item'" v-for="(item, index) in car" :key="index" @click="clickCar(item)">
                  <scroll-view class="nav-scroll" scroll-x="true">
                     <view v-if="car" :class="form.categoryId === item.id ? 'nav-item active' : 'nav-item'" v-for="(item, index) in car" :key="index" @click="clickCar(item)">
                        <text>{{item.name}}</text>
                        <view class="box-hz-cate-item-x" v-if="form.categoryId === item.id"></view>
                        <view class="nav-item-x" v-if="form.categoryId === item.id"></view>
                     </view>
                  </view>
                  </scroll-view>
                  <view class="box-hz-car">
                     <view class="box-hz-car-image">
                        <image :src="carImage" mode="widthFix"></image>
@@ -246,14 +273,14 @@
                        <view :class="form.startDate ? 'box-hz-list-item-val active' : 'box-hz-list-item-val'">
                           <view class="box-hz-list-item-val-left">
                              <image class="icon" src="/static/icon/ic_time@2x.png" mode="widthFix"></image>
                              <text>{{ form.startDate ? form.startDate + ' 至 ' + form.endDate : '请选择用工时间'}}</text>
                              <text>{{ form.startDate ? form.startDate + ' 至 ' + form.endDate : '请选择用车时间'}}</text>
                           </view>
                           <u-icon name="arrow-right" color="#111111" size="16"></u-icon>
                        </view>
                     </view>
                     <view class="box-hz-list-item">
                        <view class="box-hz-list-item-label">
                           <text>用车时间:</text>
                           <text>用车地点:</text>
                           <text @click="addAddr">+增加途经点</text>
                        </view>
                        <view class="item-d">
@@ -266,7 +293,7 @@
                                 <u-icon name="arrow-right" color="#111111" size="16"></u-icon>
                              </view>
                           </view>
                           <view class="item-d-row" v-for="(item, index) in form.wayInfoDTOList" :key="index" @click="selectAddress(4, index)">
                           <view class="item-d-row" v-if="form.wayInfoDTOList" v-for="(item, index) in form.wayInfoDTOList" :key="index" @click="selectAddress(4, index)">
                              <view class="item-d-row-icon">
                                 <image src="/static/icon/ic_jingguo@2x.png" mode="widthFix"></image>
                              </view>
@@ -291,45 +318,99 @@
                     </view>
                  </view>
               </template>
               <view class="box-hz-btn" :style="{ backgroundImage: 'url(' + btn + ')' }">
                  <view class="box-hz-btn-kf">客服</view>
                  <view class="box-hz-btn-next" @click="jump()">下一步</view>
                  <view class="box-hz-btn-kf"  @click="contactPhone()" >客服</view>
                  <view class="box-hz-btn-next"  @click="jump()" v-if="typeId  == 2">立即下单</view>
                  <view class="box-hz-btn-next"  @click="jump()" v-if="typeId !== 2">下一步</view>
               </view>
            </view>
         </view>
      </view>
      
      <!-- 选择日期范围 -->
      <u-calendar :show="show" color="#00BC12" mode="range" @close="show = false" @confirm="confirmDate"></u-calendar>
      <u-calendar :show="show" color="#00BC12" :allowSameDay="true" mode="range" @close="show = false" @confirm="confirmDate"></u-calendar>
      <u-popup :show="showPhone" round="15" mode="bottom" :safeAreaInsetBottom="true"  @close="contactPhone()" :closeable="true" :closeOnClickOverlay="true">
         <view class="phone">
            <view class="phone-head">
               <view></view>
               <text>联系客服</text>
            </view>
            <view class="phone-item">
               <view>
                  <image style="width: 36rpx;height: 36rpx" src="/static/icon/ic_kefu.png" mode="widthFix"></image>
                  <button open-type="contact" plain="true" bindcontact="handleContact">在线客服</button>
               </view>
                <view class="line" v-if="serverPhone && serverPhone.length"></view>
            </view>
             <view class="phone-item" v-if="serverPhone" v-for="(item,index) in serverPhone"  :key="item" @click="contactPhoneDo(item)">
                <view>
                  <image src="/static/icon/ic_call@2x.png" mode="widthFix"></image>
                  <text>{{item}}</text>
               </view>
                <view class="line" v-if="index<serverPhone.length-1"></view>
             </view>
             <view style="width: 100%; height: 30rpx;"></view>
            <!-- <view class="phone-botton"  @click="contactPhone()" >关闭</view> -->
         </view>
      </u-popup>
      <u-modal
         title="温馨提示"
         :show="show1"
         closeOnClickOverlay
         showCancelButton
      >
         <view class="slot-content">
            是否确认抢单?
         </view>
         <view slot="confirmButton" style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
            <view class="btn1" @click="show1 = false">取消</view>
            <view class="btn2" @click="getaccept1">确认</view>
         </view>
      </u-modal>
      <u-modal
         title="支付未成功"
         :show="show2"
         closeOnClickOverlay
         showCancelButton
      >
         <view class="slot-content">
            请确认是否取消支付或查看订单继续支付?
         </view>
         <view slot="confirmButton" style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
            <view class="btn1" @click="show2 = false;payOrderId=null">取消支付</view>
            <view class="btn2" @click="goOrderDetail(payOrderId)">查看订单</view>
         </view>
      </u-modal>
   </view>
</template>
<script>
   import { mapState } from 'vuex'
   import sunuiMverify from '@/components/sunui-mverify/sunui-mverify.vue';
   var QQMapWX = require('@/utils/qqmap-wx-jssdk.js');
   export default {
      components: { sunuiMverify },
      computed: {
         ...mapState(['navHeight', 'statusbarHeight','userInfo','token','openid']),
         ...mapState(['navHeight', 'statusbarHeight','userInfo','token','openid', 'latitude', 'longitude','address']),
         totalPrice() {
            return this.form.estimatedAccount / 100
         }
      },
      onShow(options) {
         this.typeViewId = 0
         if(this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}'){
            this.isLogin = true
         }
         if (this.userInfo && this.userInfo.useIdentity == 1) {
            this.typeViewId = 1
         }
      },
      data() {
         return {
            showPhone:false,
            serverPhone:[],
            show: false,
            isLogin: false,
            typeId: 0,
            qqmapsdk: null,
            location:{
               latitude:null,
               longitude:null,
               address:null,
            },
            type: [
               { name: '用工', id: 0 },
               { name: '运货', id: 1 },
@@ -346,6 +427,11 @@
               { name: '分拣工', id: 1 },
               { name: '包装工', id: 2 }
            ],
            sortList: [
               { name: '最新发布', id: 0 },
               { name: '距离优先', id: 1 },
               { name: '价格从高到低', id: 2 }
            ],
            car: [],
            btn: require('@/static/image/btn.png'),
            typeViewId: 0,
@@ -353,7 +439,7 @@
            carRemark: '',
            
            orderFood: [],
            viewStatus: false,
            viewStatus: true,
            
            form: {
               startDate: '',
@@ -373,45 +459,95 @@
               linkName: '',
               linkPhone: '',
               estimatedAccount: '',
               price: ''
               price: '',
               address: ''
            },
            sortType: 0,
            orderList: [],
            typeVal: '',
            page: 1
            page: 1,
            next: true,
            isOnce: true,
            show1: false,
            show2: false,
            orderId: null,
            payOrderId:null
         }
      },
      onLoad() {
      async onLoad() {
         await this.$onLaunched;
         console.log('2')
         // if (this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}' && this.userInfo.useIdentity === 1) {
         //    this.getOrderList()
         // }
         this.getCategoryLists()
         this.getOrderList()
         this.form.linkPhone = this.userInfo.telephone
         this.getDictInfo()
         if (this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}') {
            this.form.linkPhone = this.userInfo.telephone || ''
            this.form.linkName = this.userInfo.name || ''
         }
         this.qqmapsdk = new QQMapWX({
            key: '4PXBZ-JLBC7-LCLXG-P2SZX-C4HYE-LDBLQ'
         });
         uni.$on('clear', (data) => {
            this.form.startDate = ''
            this.form.endDate = ''
            this.form.latitude = ''
            this.form.longitude = ''
            this.form.location = ''
            this.form.locationEnd = ''
            this.form.wayInfoDTOList = []
            this.form.workType = 0
            this.form.days = ''
            this.form.locationRemark = ''
            this.form.supplement = ''
            this.form.multifileList = []
            this.form.estimatedAccount = ''
            this.form.price = ''
            this.form.address = ''
            this.clearAll()
         })
         // 刷新首页数据
         uni.$on('refresh', () => {
            this.getCategoryLists()
            this.getDictInfo()
            if (this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}') {
               this.form.linkPhone = this.userInfo.telephone
            }
         })
      },
      async onShow(options) {
         await this.$onLaunched;
         if(this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}') {
            console.log('已登陆')
            this.isLogin = true
            // this.typeViewId = this.userInfo.useIdentity
            // !this.isOnce &&
            if (this.userInfo.useIdentity === 1) {
               console.log('已登陆111')
               this.page = 1
               this.next = true
               this.orderList = []
               this.getOrderList()
            }
         } else {
            this.isLogin = false
            console.log('未登陆')
         }
         // this.payOrderId=null
      },
      watch: {
         typeId: {
            handler(news, old) {
               this.form = {
                  startDate: '',
                  endDate: '',
                  latitude: '',
                  longitude: '',
                  location: '',
                  locationEnd: '',
                  wayInfoDTOList: [],
                  workType: 0,
                  categoryId: '',
                  categoryName: '',
                  days: '',
                  locationRemark: '',
                  supplement: '',
                  multifileList: [],
                  linkName: '',
                  linkPhone: '',
                  estimatedAccount: '',
                  price: ''
               }
               this.viewStatus = false
               this.carImage = ''
               this.carRemark = ''
               this.clearFormParam()
            }
         },
         orderFood: {
@@ -429,53 +565,203 @@
                     price += num * item.num
                  }
               })
               console.log("========================",price)
               this.form.price = price
            }
         },
         'form.price': {
            handler(news, old) {
               if (news > 0) {
               console.log(news,"==========",old)
               if (news != old) {
                  this.getPrice()
               }
            }
         }
      },
      onReachBottom() {
         if (this.token && this.token != '' && this.userInfo && JSON.stringify(this.userInfo) != '{}' && this.userInfo.useIdentity === 1) {
            this.getOrderList()
         }
      },
      methods: {
         preview(current, arr) {
            let urls = arr.map(item => item.url || item.fileurlFull)
            uni.previewImage({ current, urls })
         },
         goOrderDetail(id){
            uni.navigateTo({
               url: '/pages/order-details/order-details?id='+id
            })
            var that =this
            setTimeout(function(){
               that.orderId=null
               that.payOrderId=null
               that.show2=false
            },1000)
         },
         clearFormParam(){
            this.form.startDate = ''
            this.form.address = ''
            this.form.endDate = ''
            this.form.latitude = ''
            this.form.longitude = ''
            this.form.location = ''
            this.form.locationEnd = ''
            this.form.wayInfoDTOList = []
            this.form.workType = 0
            this.form.days = ''
            this.form.locationRemark = ''
            this.form.supplement = ''
            this.form.multifileList = []
            this.form.estimatedAccount = ''
            this.form.price = ''
            this.viewStatus = false
            this.clearAll()
         },
         clear(index) {
            this.orderFood[index].num = ''
            this.orderFood[index].list.forEach(item => {
               item.active = false
            })
         },
         clearAll() {
            this.orderFood.forEach(p=>{
               p.num=null
               p.list.forEach(item => {
                  item.active = false
               })
            })
         },
         getDictInfo(){
            var that = this;
            this.$u.api.getPlatformAboutUs({}).then(res =>{
                 that.serverPhone = (res.data.serverPhone||'').split(",")
            })
         },
         contactPhone(){
             this.showPhone = !this.showPhone
             console.log("==================================",this.showPhone)
         },
         contactPhoneDo(phone){
            if(phone !=null && phone!=''){
               uni.makePhoneCall({
                  phoneNumber: phone
               })
            }
         },
         // 手动接单
         getaccept() {
            var that = this;
            that.$u.api.accept({ orderId: this.orderId })
               .then(res1 => {
                  if (res1.code === 200) {
                     uni.showToast({ title: '抢单成功!', icon: 'success', duration: 2000 })
                     setTimeout(() => {
                        that.page = 1
                        that.next = true
                        that.orderList = []
                        that.getOrderList()
                        that.goOrderDetail(that.orderId)
                     }, 2000)
                  }
               })
         },
         getaccept1() {
            var that = this;
            this.show1 = false
            uni.requestSubscribeMessage({
               tmplIds: ['AA97cHjvlPiNO4viMkVe4JifCf9TD5b5Eb7s6El3VS8','3YSC7gouRlSjHXz4CrWOGFzPmGwEBtFj4snwdfMvKHk','tDpYImlrdv-0d3euTrHbYZ1cEZvjVHTNlqHvV0tpLHg'],
               success(res) {
                  that.getaccept()
               },
               fail(err) {
                  that.getaccept()
               }
            })
         },
         clickSort(id) {
            this.sortType = id
            this.page = 1
            this.next = true
            this.orderList = []
            this.getOrderList()
         },
         clickCate(id) {
            this.typeVal = id
            this.page = 1
            this.list = []
            this.next = true
            this.orderList = []
            this.getOrderList()
         },
         // 订单分页
         getOrderList() {
            if (!this.next) return;
            this.$u.api.orderPage({
               capacity: 10,
               page: this.page,
               model: {
                  queryMyOrderType: 2,
                  type: this.typeVal
                  type: this.typeVal,
                  sortType: this.sortType,
                  queryLat: uni.getStorageSync('address').latitude,
                  queryLgt: uni.getStorageSync('address').longitude
               }
            }).then(res => {
               if (res.code !== 200) return;
               this.isOnce = false
               res.data.records.forEach(item => {
                  // 订餐单
                  if (item.type === 2) {
                     item.wayInfoCopy = JSON.parse(item.wayInfo).map(item => {
                        return `${item.name}${item.price / 100}元(${item.num}份)`
                     }).join(' | ')
                  // 运货
                  } else if (item.type === 1) {
                     item.wayInfo = JSON.parse(item.wayInfo)
                  }
               })
               console.log(res.data.records)
               this.orderList = [...this.orderList, ...res.data.records]
               if (this.orderList.length === res.data.total) {
                  this.next = false
               } else {
                  this.page += 1
               }
            })
         },
         // 提交订单
         submit() {
            var that = this
            this.payOrderId=null
            if (!this.form.startDate) {
               return uni.showToast({ title: '请选择用餐时间', icon: 'none' })
            }
            let cateringDTOList = []
            let valid = true
            let msg ='请选择'
            that.orderFood.forEach(item => {
               item.list.forEach(child => {
                  if (child.active) {
                     // (Number(child.price) * Number(item.num))
                     if( !item.num){
                        msg =msg +'【'+item.name+'】';
                        valid =false
                     }
                     cateringDTOList.push({
                        id:item.id,
                        name: item.name,
                        num: item.num,
                        price: child.price * 100
                     })
                  }
               })
            })
            if(!valid){
               return uni.showToast({ title: msg+'用餐份数', icon: 'none' })
            }
            if (this.form.price === 0) {
               return uni.showToast({ title: '请选择用餐时间', icon: 'none' })
            if (cateringDTOList.length === 0) {
               return uni.showToast({ title: '请选择用餐标准', icon: 'none' })
            }
            if (!this.form.address) {
               return uni.showToast({ title: '请选择用餐地点', icon: 'none' })
@@ -483,74 +769,74 @@
            if (!this.form.linkPhone) {
               return uni.showToast({ title: '请输入联系电话', icon: 'none' })
            }
            let cateringDTOList = []
            this.orderFood.forEach(item => {
               item.list.forEach(child => {
                  if (child.active) {
                     cateringDTOList.push({
                        name: item.name,
                        num: item.num,
                        price: (Number(child.price) * Number(item.num)) * 100
                     })
                  }
               })
            })
            this.$u.api.release({
               ...this.form,
               type: 2,
               price: Number(this.form.price) * 100,
               priceNum1: this.form.days,
               location: this.form.address,
               lat: this.form.latitude,
               lgt: this.form.longitude,
               cateringDTOList
            }).then(res => {
               if (res.code == 200) {
                  wx.requestPayment({
                     timeStamp: res.data.object.timeStamp,
                     nonceStr: res.data.object.nonceStr,
                     package: res.data.object.packageVal,
                     signType: res.data.object.signType,
                     paySign: res.data.object.paySign,
                     success (res1) {
                        if (res1.errMsg = 'requestPayment:ok') {
                           uni.showToast({ title: '支付成功', icon: 'success', duration: 2000 });
                           setTimeout(() => {
                              uni.navigateTo({
                                 url: `/pages/success/success?orderId=${res.data.id}`
                              })
                           }, 1500)
                        }
                     },
                     fail(err) {
                        console.log(err)
            uni.requestSubscribeMessage({
               tmplIds: ['oVjOBLcHxIlGzOMJsdInmgI5CHGXh-UTvMzQqfFOnIg','AA97cHjvlPiNO4viMkVe4JifCf9TD5b5Eb7s6El3VS8'],
               success(res) {
                  that.$u.api.release({
                     ...that.form,
                     type: 2,
                     price: Number(that.form.price) * 100,
                     priceNum1: that.form.days,
                     location: that.form.address,
                     lat: that.form.latitude,
                     lgt: that.form.longitude,
                     cateringDTOList
                  }).then(res => {
                     if (res.code == 200) {
                        that.clearFormParam();
                        wx.requestPayment({
                           timeStamp: res.data.object.timeStamp,
                           nonceStr: res.data.object.nonceStr,
                           package: res.data.object.packageVal,
                           signType: res.data.object.signType,
                           paySign: res.data.object.paySign,
                           success (res1) {
                              if (res1.errMsg = 'requestPayment:ok') {
                                 uni.showToast({ title: '支付成功', icon: 'success', duration: 2000 });
                                 setTimeout(() => {
                                    uni.navigateTo({
                                       url: `/pages/success/success?orderId=${res.data.id}`
                                    })
                                 }, 1500)
                              }
                           },
                           fail(err) {
                              that.payOrderId = res.data.id
                              that.show2=true
                              console.log("=====================",    res.data.id,that.payOrderId,err)
                           }
                        })
                     }
                  })
                  console.log(cateringDTOList)
               },
               fail(err) {
                  console.log(err)
               }
            })
            console.log(cateringDTOList)
         },
         uploadImg() {
            uni.chooseImage({
               success: (chooseImageRes) => {
                  const tempFilePaths = chooseImageRes.tempFilePaths;
                  uni.uploadFile({
                     url: this.$baseUrl + '/web/public/upload',
                     filePath: tempFilePaths[0],
                     name: 'file',
                     formData: {
                        'folder': 'orders'
                     },
                     success: (uploadFileRes) => {
                        const res = JSON.parse(uploadFileRes.data)
                        this.form.multifileList.push({
                           fileurl: res.data.imgaddr,
                           name: res.data.originname,
                           url: res.data.url,
                           type: 0
                        })
                     }
                  });
                  for (let i = 0; i < chooseImageRes.tempFilePaths.length; i++) {
                     uni.uploadFile({
                        url: this.$baseUrl + '/web/public/upload',
                        filePath: chooseImageRes.tempFilePaths[i],
                        name: 'file',
                        formData: {
                           'folder': 'orders'
                        },
                        success: (uploadFileRes) => {
                           const res = JSON.parse(uploadFileRes.data)
                           this.form.multifileList.push({
                              fileurl: res.data.imgaddr,
                              name: res.data.originname,
                              url: res.data.url,
                              type: 0
                           })
                        }
                     });
                  }
               }
            });
         },
@@ -563,8 +849,12 @@
                  priceNum1: that.form.days,
                  type: 2
               }).then(res => {
                  that.form.estimatedAccount = res.data
                  if (res.code === 200) {
                     that.form.estimatedAccount = res.data
                  }
               })
            }else{
               that.form.estimatedAccount = 0
            }
         },
         addAddr() {
@@ -577,7 +867,10 @@
         confirmDate(e) {
            this.form.startDate = e[0]
            this.form.endDate = e[e.length - 1]
            this.form.days = e.length;
            let time = this.form.startDate == this.form.endDate ? 1 : 0
            this.form.days = e.length - time;
            this.show = false
            if (this.typeId === 2) {
               this.getPrice()
@@ -585,25 +878,43 @@
         },
         selectAddress(type, index) {
            uni.chooseLocation({
               success: (res) => {
               success: (res) => {
                  console.log("==================",res)
                  if ([1,2].includes(type)) {
                     this.form.latitude = res.latitude
                     this.form.longitude = res.longitude
                     this.form.address = res.address
                     this.form.address = res.name ||res.address
                  } else if (type === 3) {
                     this.form.locationEnd = res.address
                     this.form.locationEnd = res.name ||res.address
                     this.form.latEnd = res.latitude
                     this.form.lgtEnd = res.longitude
                  } else if (type === 4) {
                     this.form.wayInfoDTOList[0].lat = res.latitude
                     this.form.wayInfoDTOList[0].lgt = res.longitude
                     this.form.wayInfoDTOList[0].location = res.address
                  }
                     this.form.wayInfoDTOList[index].lat = res.latitude
                     this.form.wayInfoDTOList[index].lgt = res.longitude
                     this.form.wayInfoDTOList[index].location = res.name||  res.address
                  }else if (type == -1) {
                     console.log(res)
                     this.location.latitude = res.latitude
                     this.location.longitude = res.longitude
                     this.location.address =res.name ||  res.address
                  }
               }
            });
         },
         clickType(e) {
            if (!this.token) {
               uni.navigateTo({
                  url: '/pages/login/login'
               })
               return
            }
            this.typeId = e
            if (e === 2) {
               this.form.categoryId = this.car[0].id
               this.form.categoryName = this.car[0].name
               this.carRemark = this.car[0].remark
               this.carImage = this.car[0].iconFull
            }
         },
         clickTypeWork(e) {
            this.form.workType = e
@@ -636,17 +947,17 @@
               // 采摘工
               if (this.form.workType === 0) {
                  uni.navigateTo({
                     url: `/pages/using-workers/using-workers?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.location}&workType=${form.workType}`
                     url: `/pages/using-workers/using-workers?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.address}&workType=${form.workType}`
                  })
               // 分拣工
               } else if (this.form.workType === 1) {
                  uni.navigateTo({
                     url: `/pages/sorting/sorting?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.location}&workType=${form.workType}`
                     url: `/pages/sorting/sorting?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.address}&workType=${form.workType}`
                  })
               // 包装工
               } else if (this.form.workType === 2) {
                  uni.navigateTo({
                     url: `/pages/packaging-worker/packaging-worker?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.location}&workType=${form.workType}`
                     url: `/pages/packaging-worker/packaging-worker?days=${form.days}&startDate=${form.startDate}&endDate=${form.endDate}&latitude=${form.latitude}&longitude=${form.longitude}&address=${form.address}&workType=${form.workType}`
                  })
               }
            // 运货
@@ -682,9 +993,6 @@
               })
            }
         },
         mverify(e, id){
            console.log('验证结果:', e, id);
         },
         // 选择套餐
         selectMenu(a, b) {
            this.orderFood.forEach((item, index) => {
@@ -698,24 +1006,28 @@
         getCategoryLists() {
            this.$u.api.getCategoryList({ type: 1 })
               .then(res => {
                  this.car = res.data
                  this.form.categoryId = res.data[0].id
                  this.form.categoryName = res.data[0].name
                  this.carRemark = res.data[0].remark
                  this.carImage = res.data[0].iconFull
                  if (res.code === 200) {
                     this.car = res.data
                     this.form.categoryId = res.data[0].id
                     this.form.categoryName = res.data[0].name
                     this.carRemark = res.data[0].remark
                     this.carImage = res.data[0].iconFull
                  }
               })
            this.$u.api.getCategoryList({ type: 2 })
               .then(res => {
                  res.data.forEach(item => {
                     item.num = ''
                     item.list = item.detailList.map(child => {
                        return {
                           active: false,
                           price: child
                        }
                  if (res.code === 200) {
                     res.data.forEach(item => {
                        item.num = ''
                        item.list = item.detailList.map(child => {
                           return {
                              active: false,
                              price: child
                           }
                        })
                     })
                  })
                  this.orderFood = res.data
                     this.orderFood = res.data
                  }
               })
         }
      }
@@ -731,7 +1043,64 @@
<style lang="scss" scoped>
   .index {
      width: 100%;
      .slot-content {
         width: 100%;
         text-align: center;
         font-weight: 400;
         font-size: 30rpx;
         color: #333333;
         margin: 30rpx 0;
      }
      .btn1 {
         width: 264rpx;
         height: 88rpx;
         line-height: 88rpx;
         text-align: center;
         font-weight: 400;
         font-size: 32rpx;
         color: #666666;
         border-radius: 44rpx;
         border: 1rpx solid #B2B2B2;
      }
      .btn2 {
         width: 264rpx;
         height: 88rpx;
         line-height: 88rpx;
         text-align: center;
         font-weight: 500;
         font-size: 32rpx;
         color: #FFFFFF;
         background: #00BC12;
         border-radius: 44rpx;
      }
      .index-j {
         .kefubtn{
            background-color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            position: fixed;
            bottom: 100rpx;
            flex-direction: column;
            right:30rpx;
            height: 88rpx;
            width: 88rpx;
            border: 1rpx solid #f2f2f2;
            border-radius: 50%;
            image{
               width: 36rpx;
               width: 36rpx;
            }
            text{
               width: 44rpx;
               height: 32rpx;
               font-weight: 400;
               font-size: 22rpx;
               color: #222222;
               line-height: 32rpx;
               text-align: center;
            }
         }
         width: 100%;
         .index-j-head {
            width: 100%;
@@ -819,6 +1188,13 @@
            width: 100%;
            padding: 24rpx 30rpx;
            box-sizing: border-box;
            .more{
               width: 100%;
               margin-top: 40rpx;
               text-align: center;
               font-size: 24rpx;
               color: #666666;
            }
            .index-list-item {
               width: 100%;
               padding: 30rpx;
@@ -837,6 +1213,17 @@
                  display: flex;
                  align-items: center;
                  justify-content: center;
                  .eidt-btn {
                     width: 100%;
                     height: 88rpx;
                     line-height: 88rpx;
                     text-align: center;
                     background: #00BC12;
                     border-radius: 44rpx;
                     font-weight: 500;
                     font-size: 32rpx;
                     color: #FFFFFF;
                  }
                  // background: #00BC12;
                  // border-radius: 50rpx;
                  // text {
@@ -983,7 +1370,7 @@
            padding: 0 30rpx;
            box-sizing: border-box;
            display: flex;
            align-items: center;
            align-items: center;
            .index-c-title-logo {
               font-weight: bold;
               font-size: 40rpx;
@@ -1000,6 +1387,10 @@
               font-size: 32rpx;
               color: #ffffff;
               margin-right: 12rpx;
               max-width: 280rpx;
               white-space: nowrap;
               overflow: hidden;
               text-overflow: ellipsis;
            }
            .qu {
               width: 22rpx;
@@ -1098,12 +1489,16 @@
                     padding: 30rpx 0;
                     box-sizing: border-box;
                     flex-direction: column;
                     border-bottom: 1rpx solid #E5E5E5;
                     // border-bottom: 1rpx solid #E5E5E5;
                     .radio-item {
                        width: 100%;
                        display: flex;
                        align-items: self-end;
                        align-items: flex-start;
                        margin-bottom: 30rpx;
                        border-bottom: 1rpx solid #E5E5E5;
                        &:last-child {
                           border: none;
                        }
                        &:last-child {
                           margin: 0 !important;
                        }
@@ -1156,6 +1551,19 @@
                              align-items: center;
                              justify-content: flex-end;
                              margin-top: 42rpx;
                              margin-bottom: 34rpx;
                              .radio-item-list-data-btn {
                                 width: 110rpx;
                                 height: 64rpx;
                                 line-height: 64rpx;
                                 margin-left: 20rpx;
                                 font-weight: 400;
                                 font-size: 24rpx;
                                 color: #666666;
                                 text-align: center;
                                 border: 1rpx solid #B2B2B2;
                                 border-radius: 34rpx;
                              }
                              text {
                                 font-weight: 400;
                                 font-size: 30rpx;
@@ -1181,19 +1589,19 @@
                     width: 100%;
                     display: flex;
                     align-items: center;
                     justify-content: space-between;
                     flex-wrap: wrap;
                     padding: 30rpx 0;
                     box-sizing: border-box;
                     .upload-item {
                        width: 156rpx;
                        height: 156rpx;
                        width: 208rpx;
                        height: 208rpx;
                        display: flex;
                        align-items: center;
                        flex-direction: column;
                        justify-content: center;
                        background: #F8F9FB;
                        border-radius: 8rpx;
                        margin-right: 20rpx;
                        border: 2rpx solid #EEEEEE;
                        position: relative;
                        &:last-child {
@@ -1431,6 +1839,44 @@
                     margin-top: 30rpx;
                  }
               }
               .nav-scroll {
                   white-space: nowrap; /* 防止导航项换行 */
                  margin-bottom: 50rpx;
                  height: 66rpx;
                   overflow: auto; /* 允许滚动条出现 */
                  .nav-item {
                    display: inline-block; /* 使导航项水平排列 */
                    margin-right: 60rpx;
                    position: relative;
                    text {
                       font-weight: 400;
                       font-size: 30rpx;
                       color: #666666;
                    }
                    .nav-item-x {
                       width: 40rpx;
                       height: 6rpx;
                       position: absolute;
                       bottom: -10rpx;
                       left: 50%;
                       transform: translate(-50%, 0);
                       background: #FF5A40;
                       border-radius: 3rpx;
                    }
                    // padding: 10px 20px; /* 设置内边距 */
                    // margin-right: 10px; /* 设置右边距 */
                    // background-color: #f0f0f0; /* 设置背景色 */
                    // border: 1px solid #ddd; /* 设置边框 */
                    // border-radius: 5px; /* 设置圆角 */
                 }
                 .active {
                    text {
                       font-weight: 600 !important;
                       font-size: 32rpx !important;
                       color: #222222 !important;
                    }
                 }
               }
               .box-hz-cate {
                  width: 100%;
                  display: flex;
@@ -1563,7 +2009,7 @@
                              flex-shrink: 0;
                           }
                           text {
                              flex: 1;
                              width: 470rpx;
                              overflow: hidden;
                              text-overflow: ellipsis;
                              white-space: nowrap;
@@ -1618,5 +2064,68 @@
            }
         }
      }
      .phone {
         width: 100%;
         padding-top: 40rpx;
         box-sizing: border-box;
         .phone-botton {
            width: 100%;
            height: 88rpx;
            line-height: 88rpx;
            text-align: center;
            font-weight: 500;
            font-size: 32rpx;
            color: #FFFFFF;
            background: #00BC12;
            border-radius: 44rpx;
            margin-top: 60rpx;
         }
         .phone-head {
            width: 100%;
            text-align: center;
            justify-content: space-between;
            margin-bottom: 40rpx;
            text {
               font-weight: 800;
               font-size: 32rpx;
               color: #222222;
            }
         }
         .phone-item {
            width: 100%;
            text-align: center;
            display: flex;
            justify-content: center;
            flex-direction: column;
            // border-bottom: 1rpx solid #eeeeee;
            line-height: 78rpx;
            button{
               border: 1rpx white solid;
               display: inline;
               width: 300rpx;
               font-weight: 500;
               font-size: 32rpx;
               line-height: 32rpx;
               color: #222222;
            }
            image{
               width: 28rpx;
               height: 28rpx;
               margin-right: 30rpx;
            }
            .line{
               width: 100%;
               height: 1rpx;
               background-color: #f2f2f2
            }
            text {
               font-weight: 500;
               font-size: 28rpx;
               line-height: 28rpx;
               color: #222222;
            }
         }
      }
   }
</style>