Bläddra i källkod

手持-任务获取-右上角增加“批量获取活动单”

zhaohuanhuan 1 år sedan
förälder
incheckning
71b608b426

+ 13 - 1
src/api/basic/index.ts

@@ -2,17 +2,29 @@
 import request from '@/utils/request'
 // @ts-ignore
 import { getOwnerTypes } from '@/types/basic'
-
+//获取货主
 export function getOwner() {
   return request({
     url: 'api/basic/owner/options',
     method: 'get',
   })
 }
+//获取承运商
 export function getCarrier() {
   return request({
     url: 'api/base/carrier/options',
     method: 'get',
   })
 }
+//获取打印机列表
+export function getPrinter() {
+  return request({
+    url: 'api/basic/express/sheetPrinter',
+    method: 'get',
+    params:{
+      server:'',
+      printer:'',
+    }
+  })
+}
 

+ 10 - 0
src/api/picking/index.ts

@@ -157,6 +157,16 @@ export function removePickingTask(params:any) {
   })
 }
 
+/**
+ * 拣货任务波次号打印
+ */
+export function printerByPick(params:any) {
+  return request({
+    url: 'api/wms/order/printerByPick',
+    method: 'post',
+    params,
+  })
+}
 
 
 

+ 55 - 0
src/components/Printer.vue

@@ -0,0 +1,55 @@
+<template>
+  <van-dialog v-model:show="printTrueFalseBy"
+              title="打印机列表"
+              :show-confirm-button="false"
+              close-on-click-overlay
+  >
+    <div style="width:100%;max-height:65vh;overflow:auto">
+      <van-radio-group v-model="print">
+        <van-cell-group inset>
+          <van-cell v-for="(item,i) in printList" :title="item.printer" clickable @click="onPrinter(item)"  >
+            <template #right-icon>
+              <van-radio :name="item.server" />
+            </template>
+          </van-cell>
+        </van-cell-group>
+      </van-radio-group>
+    </div>
+  </van-dialog>
+</template>
+<script setup>
+import { ref } from 'vue'
+import { getPrinter } from '@/api/basic/index'
+import { closeLoading, showLoading } from '@/utils/loading'
+
+const printTrueFalseBy=ref(false)
+const print=ref('')
+const printList=ref([])
+const show=(code)=>{
+  print.value=''
+  if(localStorage.getItem('PRINTER:KEY')){
+    const list=JSON.parse(localStorage.getItem('PRINTER:KEY'))
+    printList.value=list.filter(item=>item.warehouseCode===code && item.enable===true)
+    printTrueFalseBy.value=true
+    return
+  }
+  showLoading()
+  getPrinter().then(res => {
+    printList.value=res.data.filter(item=>item.warehouseCode===code)
+    localStorage.setItem('PRINTER:KEY',JSON.stringify(res.data))
+    printTrueFalseBy.value=true
+  }).finally(() => {
+    closeLoading()
+  })
+
+}
+const emit = defineEmits()
+const onPrinter=(item)=>{
+  print.value = item.server
+  printTrueFalseBy.value=false
+  emit('onPrint', item)
+}
+defineExpose({show})
+</script>
+<style scoped lang="sass">
+</style>

+ 133 - 0
src/views/outbound/picking/components/OwnerBatchTask.vue

@@ -0,0 +1,133 @@
+<template>
+  <van-dialog v-model:show="orderTrueFalseBy"
+              :show-cancel-button="true"
+              :show-confirm-button="true"
+              :close-on-click-overlay="false"
+              title="批量创建任务"
+              confirm-button-text="生成任务"
+              :beforeClose="onBuildTask"
+  >
+    <div class="order-list">
+      <van-checkbox  class="order-checkbox" v-model="isCheckAll" :indeterminate="isIndeterminate"  @change="checkAllChange">全选</van-checkbox>
+        <van-checkbox-group  v-model="checkedResult" @change="checkedChange" >
+          <van-checkbox class="order-item" v-for="(item,index) in taskList" :key="index" :name="item">
+            <div  style="display: flex;flex: 1;flex-direction: column" >
+              <div class="order-item-detail">
+                <div>{{props.ownerMap[item.customerId] || item.customerId}}</div>
+                <div>{{item.carrierName}}</div>
+                <div >{{item.residualOrderQty}}<span style="font-size: 12px">单</span></div>
+              </div>
+            </div>
+          </van-checkbox>
+        </van-checkbox-group>
+      </div>
+  </van-dialog>
+</template>
+<script setup>
+import { ref } from 'vue'
+import { showConfirmDialog, showFailToast, showToast } from 'vant'
+import { useStore } from '@/store/modules/user'
+import { toMap } from '@/utils/dataType'
+import { closeLoading, showLoading } from '@/utils/loading'
+import { createPickingTask } from '@/api/picking/index'
+import { useRouter } from 'vue-router'
+const router = useRouter()
+const orderTrueFalseBy =ref(false)
+const taskList=ref([])
+const props = defineProps({
+  ownerMap:Object,
+});
+const show=(task)=>{
+  const list=JSON.parse(task)
+  taskList.value=list.sort((a, b) => a.customerId.localeCompare(b.customerId))
+  orderTrueFalseBy.value=true
+  if(taskList.value.length<=10){
+    isCheckAll.value=true
+    checkAllChange(true)
+  }else {
+    isCheckAll.value=false
+    isIndeterminate.value=false
+    checkedResult.value=[]
+  }
+}
+// 全选
+const isCheckAll=ref(false)
+//不确定状态
+const isIndeterminate=ref(false)
+//选中数据
+const checkedResult = ref([])
+
+const checkAllChange = (val) => {
+  checkedResult.value = val ? taskList.value : []
+  isIndeterminate.value = false
+}
+const checkedChange = (value) => {
+  const checkedCount = value.length
+  isCheckAll.value = checkedCount === taskList.value.length
+  isIndeterminate.value = checkedCount > 0 && checkedCount < taskList.value.length
+}
+//确认
+const onBuildTask=(action)=>
+  new Promise((resolve) => {
+    if (action === 'confirm') {
+      if (checkedResult.value.length === 0 ||checkedResult.value.length>10) {
+        showToast('请选择数据,最多选择10条')
+        return resolve(false)
+      }
+      showConfirmDialog({
+        title: '温馨提示',
+        message: '是否生成任务?',
+        })
+        .then(() => {
+          _createPickingTask()
+        }).catch(() => {})
+    }
+    resolve(true)
+  })
+const _createPickingTask=()=>{
+  const storeUser = useStore()
+  const warehouse = storeUser.warehouse
+  const params = {
+    warehouse,
+    owners: [...new Set(checkedResult.value.map(item => item.customerId))],
+    carriers: [...new Set(checkedResult.value.map(item => item.carrier))],
+    type:'*',
+    uidMap:toMap(checkedResult.value,'uid','residualOrderQty'),
+  }
+  showLoading()
+  createPickingTask(params).then(res => {
+    closeLoading()
+    orderTrueFalseBy.value=false
+    router.push({name:'PickingList',query: { code:res.data }})
+  }).catch(err => {
+    closeLoading()
+    showFailToast({duration:5000,message:err.message})
+  })
+}
+
+defineExpose({show})
+</script>
+
+<style scoped lang="sass">
+.order-list
+
+  padding: 5px 10px
+  min-height: 20vh
+  max-height: 50vh
+  overflow: scroll
+  .order-checkbox
+    font-size: 14px
+    padding-bottom: 5px
+  .order-item
+    padding: 5px 0
+    :deep(.van-checkbox__label)
+      display: flex
+      flex: 1
+    .order-item-detail
+      font-size: 14px
+      display: flex
+      flex: 1
+      align-items: center
+      justify-content: space-between
+
+</style>

+ 21 - 6
src/views/outbound/picking/components/WaveInfo.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="wave">
-    <template  v-for="(wave,index) in binds">
+    <template  v-for="(wave,index) in bindList">
       <div class="wave-item" v-if="index < number || (index >= number && isFold)">
         <div>{{ wave.waveNo }}</div>
-        <div>格口:{{ wave.bin }},数量:{{ wave.quantity }}</div>
+        <div>波次格口:{{ props.waveNoJson[wave.waveNo] }},数量:{{ wave.quantity }}</div>
       </div>
     </template>
     <div v-if="size > number">
@@ -15,14 +15,29 @@
   </div>
 </template>
 <script setup>
-import { onMounted, ref } from 'vue'
+import { computed, onMounted, ref, watchEffect } from 'vue'
 import {  onBeforeUpdate, onUpdated } from '@vue/runtime-dom'
 
 const number=5
 const isFold=ref(false)
 const size=ref(0)
 const props = defineProps({
-  binds: Array
+  binds: Array,
+  waveNoJson:Object
+})
+const bindList = computed(() => {
+  if (!props.binds) return []
+  const mergedWave = new Map()
+  for (const item of props.binds) {
+    const existing = mergedWave.get(item.waveNo)
+    if (existing) {
+      existing.quantity += item.quantity
+    } else {
+      mergedWave.set(item.waveNo, { waveNo: item.waveNo, quantity: item.quantity })
+    }
+  }
+  const bins = Array.from(mergedWave.values());
+  return bins.sort((a, b) => a.waveNo.localeCompare(b.waveNo))
 });
 onMounted(()=>{
   _initSize()
@@ -34,8 +49,8 @@ onBeforeUpdate(()=>{
   _initSize()
 })
 const _initSize=()=> {
-  if (props.binds) {
-    size.value = props.binds ? props.binds.length : 0
+  if (bindList.value) {
+    size.value = bindList.value ? bindList.value.length : 0
   } else {
     size.value = 0
   }

+ 50 - 8
src/views/outbound/picking/list/index.vue

@@ -13,7 +13,7 @@
       </template>
       <template #right>
         <div style="color: #fff;line-height: 46px "  @click="onSelectMode({key:'picking'})">开始作业</div>
-        <div style="padding:14px 0 12px 2px" @click="onClickRight" >
+        <div style="padding:14px 0 12px 5px" @click="onClickRight" >
           <van-icon name="list-switch" size="25"   />
         </div>
       </template>
@@ -75,7 +75,7 @@
                   <van-button  v-if="item.operationTime==null && item.count==0"   size="mini" type="primary"  plain  @click="jump(item)"  :loading="jumpLoading"  loading-text="加载中...">跳过</van-button>
                 </template>
               </van-field>
-              <WaveInfo :binds="item.binds" />
+              <WaveInfo :binds="item.binds" :waveNoJson="waveNoJson" />
             </div>
           </div>
         </van-col>
@@ -102,9 +102,10 @@
     <!--    拣货任务号-->
     <picking-no-input  ref="pickingNoInputRef" @loadData="loadData" />
     <input-barcode ref="inputBarcodeRef" @setBarcode="_handlerScan" />
-    <van-floating-bubble v-if="locationList.length>0"  :gap="50" axis="xy" magnetic="x"  @click="onContainerNo(containerNo===''?2:scanType)">容器</van-floating-bubble>
+<!--    <van-floating-bubble v-if="locationList.length>0"  :gap="50" axis="xy" magnetic="x"  @click="onContainerNo(containerNo===''?2:scanType)">容器</van-floating-bubble>-->
     <lot-att ref="lotAttRef" />
     <barcode-combine ref="barcodeCombineRef" @setCombine="setCombine" :container="containerNo" :matched-sku="matchedSku" />
+    <printer ref="printerRef" @onPrint="onPrint"/>
   </div>
 </template>
 <script lang="ts" setup>
@@ -113,7 +114,7 @@ import { showConfirmDialog, showDialog, showFailToast, showNotify, showToast } f
 import { fetchPickingData, getPickingTask } from '@/views/outbound/picking/list/hooks/list'
 import { getOwnerList } from '@/hooks/basic'
 import { useRouter,useRoute } from 'vue-router'
-import { getListCombineSku, removePickingTask, setPickingDetail } from '@/api/picking'
+import { getListCombineSku, printerByPick, removePickingTask, setPickingDetail } from '@/api/picking'
 const router = useRouter()
 const route = useRoute()
 const store = useStore()
@@ -135,6 +136,7 @@ import { getCarrierList } from '@/hooks/basic/carrier'
 import { basicStore } from '@/store/modules/basic'
 import { closeLoading, showLoading } from '@/utils/loading'
 import WaveInfo from '@/views/outbound/picking/components/WaveInfo.vue'
+import Printer from '@/components/Printer.vue'
 onUnmounted(() => {
   closeListener()
 })
@@ -189,6 +191,7 @@ const onContainerNo=(type)=>{
 }
 const allQuantity=ref(0)
 //加载数据
+const waveNoJson =ref({})
 const loadData =  async (pickingCode,type) => {
   pickingNo.value=pickingCode
   //获取第一个拣货单号
@@ -201,6 +204,7 @@ const loadData =  async (pickingCode,type) => {
   taskItem.value=taskList.value
   // 对数组进行分组
   taskMap.value = {}
+  waveNoJson.value = getWave()
   taskItem.value.forEach(item => {
     if(item.operationTime){
       item.count=item.quantity
@@ -627,14 +631,13 @@ const jump=(item)=>{
   }).catch(() => {
 
   })
-
 }
 
 //切换模式
 const actions = [
   // { name: '取消任务',key:'removeTask' },
   { name: '获取任务',key:'task' },
-  // { name: '任务号作业' ,key:'picking'},
+  { name: '波次号打印' ,key:'wave'},
   { name: '检索条码' ,key:'inputBarcode'},
 ];
 const onClickLeft = () => {
@@ -645,6 +648,7 @@ const onClickRight = () => {
 }
 const pickingNoInputRef=ref(null)
 const inputBarcodeRef=ref(null)
+const printerRef=ref(null)
 const onSelectMode= async (value) => {
   if(value.key=='task'){
    await router.push({name:'PickingTask',query:{type:'picking'}})
@@ -652,6 +656,12 @@ const onSelectMode= async (value) => {
     pickingNoInputRef.value?.show()
   }else if(value.key=='inputBarcode'){
     inputBarcodeRef.value?.show()
+  }else if(value.key=='wave'){
+    if(pickingNo.value){
+      printerRef.value?.show(warehouse)
+    }else {
+      showToast('当前没有任务不支持打印')
+    }
   }else if(value.key=='removeTask'){
     if(pickingNo.value){
       if(selectTask.value.length>0){
@@ -681,9 +691,7 @@ const onSelectMode= async (value) => {
 const lotAttRef=ref(null)
 const onLotAtt=(item)=>{
   lotAttRef.value?.show(item)
-
 }
-
 //库位商品拣货完成高亮 allActive
 const allPicking = (location) => {
   const all = location.list.every(item => item.operationTime);
@@ -693,6 +701,24 @@ const allPicking = (location) => {
     return 'nextActive'
   }
 }
+//获取拣货任务里的波次号
+const getWave = () => {
+  const uniqueBinds = new Map();
+  // 去重
+  taskItem.value.forEach(item => {
+    item.binds.forEach(bind => {
+      if (!uniqueBinds.has(bind.waveNo)) {
+        uniqueBinds.set(bind.waveNo, bind);
+      }
+    });
+  });
+  //排序
+  const sortedBinds = Array.from(uniqueBinds.values())
+    .sort((a, b) => a.waveNo.localeCompare(b.waveNo))
+    .map((item, index) => ({ ...item, index: index + 1 }))
+  return toMap(sortedBinds, 'waveNo', 'index');
+};
+
 //库位商品高亮
 const activeClass=(item)=>{
   const modelLocative = locationList.value[activeIndex.value]
@@ -711,6 +737,22 @@ const activeClass=(item)=>{
   }
 
 }
+//打印
+const onPrint=(item)=>{
+  console.log(item,"item")
+  showLoading()
+  const data={
+    warehouse,
+    pickCode:pickingNo.value,
+    server:item.server,
+    printer:item.printer
+  }
+  printerByPick(data).then(res=>{
+    showToast({duration:3000,message:'打印成功,请查看~'})
+  }).finally(()=>{
+    closeLoading()
+  })
+}
 
 //刷新页面
 const loading = ref(false)

+ 3 - 0
src/views/outbound/picking/task/hooks/task.ts

@@ -5,6 +5,8 @@ import { showToast } from 'vant'
 import { getPickingTask } from '@/api/picking'
 // @ts-ignore
 import { getTimeHours } from '@/utils/date'
+// @ts-ignore
+import { closeLoading } from '@/utils/loading'
 interface pickingListResponse {
   data: any; // API 返回的数据类型
 }
@@ -14,6 +16,7 @@ export const getTaskList = (warehouse:string) => {
   // 获取拣货数据的函数
   const getTaskData = async () => {
     const { data }: pickingListResponse = await getPickingTask({ warehouse });
+    closeLoading()
     // 查询货主
       data.sort((a:any, b:any) => {
         return a.owner.localeCompare(b.owner)

+ 130 - 24
src/views/outbound/picking/task/index.vue

@@ -12,38 +12,40 @@
       </template>
       <template #right>
         <div style="color: #fff;line-height: 46px " @click="onClickRight">开始作业</div>
-        <div style="padding:14px 0 12px 2px" @click="onClickRightIcon" >
+        <div style="padding:14px 0 12px 6px" @click="onClickRightIcon" >
           <van-icon name="list-switch" size="25"   />
         </div>
       </template>
     </van-nav-bar>
     <van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
-      <table border="1" style="width: 100%;border-collapse: collapse;text-align: center;table-layout: fixed;">
+      <table border="1" style="width: 100%;border-collapse: collapse;text-align: center;table-layout: fixed;" >
         <thead>
         <tr>
+          <th style="width: 40px" v-if="modeType==='task'">
+            <van-checkbox style="justify-content: center" v-model="ownerCheckAll" :indeterminate="ownerIsIndeterminate"  @change="ownerCheckAllChange"></van-checkbox>
+          </th>
           <th style="width: 80px">货主</th>
           <th>标记</th>
-<!--          <th>省份</th>-->
           <th>承运商</th>
           <th>类型</th>
           <th>数量</th>
-          <th>操作</th>
+          <th>
+            <van-button  v-if="modeType==='task'" type="warning"  @click="queryOwnerTask()">批量</van-button>
+            <span v-else>操作</span>
+          </th>
         </tr>
         </thead>
         <tbody>
         <tr v-for="(row, rowIndex) in taskList" :key="rowIndex">
+          <td v-if="modeType==='task'">
+            <van-checkbox style="justify-content: center" v-model="row.checked" :disabled="row.disabled" @change="ownerTypeSelect" />
+          </td>
           <td style="word-wrap: break-word" v-if="isFirstInGroup(row, rowIndex)" :rowspan="getRowspan(row, rowIndex)">
             {{ ownerMap[row.owner] || row.owner }}
           </td>
           <td style="word-wrap: break-word;" >
             <div>{{ row.ruleName }}</div>
           </td>
-<!--          <td style="word-wrap: break-word;" >-->
-<!--            <div v-if="row.province">{{ row.province.split(',').slice(0, 1).join(',') }}</div>-->
-<!--            <span @click="onProvince(row)" v-if="row.ruleName && row.province">-->
-<!--              <van-icon v-if="row.province.split(',').length > 1"  name="eye-o" size="20" color="#1989fa" />-->
-<!--            </span>-->
-<!--          </td>-->
           <td style="word-wrap: break-word;">
              <div v-if="row.carrier.split(',').length" @click="onMore(row)">
                 <div v-if="row.carrier.split(',').length > 5"  >
@@ -64,6 +66,13 @@
             <van-button type="success" v-else @click="onTaskList(row,'*')">查看</van-button>
           </td>
         </tr>
+        <tr v-if="taskList.length==0">
+          <td colspan="6">
+            <van-empty :image="<string>nodataUrl" image-size="140" >
+              <van-button round type="primary" class="bottom-button" size="small" @click="loadData">刷新</van-button>
+            </van-empty>
+          </td>
+        </tr>
         </tbody>
       </table>
       <van-back-top right="80vw" bottom="10vh" />
@@ -153,14 +162,23 @@
         </div>
       </van-form>
     </van-dialog>
+    <van-action-sheet
+      v-model:show="modeTrueFalseBy"
+      :actions="actions"
+      cancel-text="取消"
+      close-on-click-action
+      @select="onSelectMode"
+    />
     <!--    拣货任务号-->
     <picking-no-input  ref="pickingNoInputRef" @loadData="loadTask" />
     <big-picking ref="bigPickingRef" :model="model" :owner-map="ownerMap" :task-detail-list="taskDetailList" :warehouse="warehouse" />
     <select-owner ref="selectOwnerRef" :taskList="allTaskList" :ownerMap="ownerMap" @queryOwner="queryOwner" />
+    <owner-batch-task ref="ownerBatchTaskRef" :ownerMap="ownerMap"  />
   </div>
 </template>
 
 <script lang="ts" setup>
+import nodataUrl from '@/assets/nodata.png'
 import { useRoute, useRouter } from 'vue-router'
 import { getTaskList } from '@/views/outbound/picking/task/hooks/task'
 import { computed, defineAsyncComponent, nextTick, ref } from 'vue'
@@ -175,6 +193,8 @@ const SelectOwner = defineAsyncComponent(() => import('@/views/outbound/picking/
 import { closeLoading, showLoading } from '@/utils/loading'
 import { getTimeHours } from '@/utils/date'
 import { fetchPickingData } from '@/views/outbound/picking/list/hooks/list'
+import { getPickingTaskDetailType } from '@/types/picking'
+import OwnerBatchTask from '@/views/outbound/picking/components/OwnerBatchTask.vue'
 const router = useRouter()
 const store = basicStore()
 const storeUser = useStore()
@@ -188,10 +208,20 @@ const offset = ref({ x: 100, y: 500 })
 const { taskList, getTaskData } = getTaskList(warehouse)
 const allTaskList=ref([])
 const ownerMap = ref({})
+const modeType=ref('')
 const loadData = async () => {
   ownerMap.value = store.ownerMap
+  modeType.value=''
   await getTaskData()
   allTaskList.value=taskList.value
+  allTaskList.value.forEach((item,i)=>{
+    item.checked=false
+    if(item.type==='*'){
+      item.disabled=false
+    }else {
+      item.disabled=true
+    }
+  })
 }
 loadData()
 const ownerTaskTitle = computed(() => {
@@ -283,6 +313,58 @@ const onTaskList=async (row:Object,type)=>{
     },100)
   }
 }
+/**
+ * 选择活动单
+ */
+const ownerCheckAll=ref(false)
+//不确定状态
+const ownerIsIndeterminate=ref(false)
+//货主订单选择列表
+const ownerCheckedResult=ref([])
+//全选/反选
+const ownerCheckAllChange=(val)=>{
+  taskList.value.forEach(item => {
+    if (!item.disabled) {
+      item.checked = val;
+    }
+  });
+  updateOwnerCheckAllStatus()
+}
+//单选
+const ownerTypeSelect=(val)=>{
+  updateOwnerCheckAllStatus()
+}
+// 更新全选框和部分选中状态
+const updateOwnerCheckAllStatus=()=>{
+  const totalItems = taskList.value.length
+  ownerCheckedResult.value = taskList.value.filter(item => item.checked)
+  // 如果所有项都被选中
+  ownerCheckAll.value = ownerCheckedResult.value.length === totalItems;
+  // 如果有部分项被选中
+  ownerIsIndeterminate.value = ownerCheckedResult.value.length > 0 && ownerCheckedResult.value.length < totalItems;
+}
+// 查看活动单列表
+const ownerBatchTaskRef=ref(null)
+const queryOwnerTask= ()=>{
+  let orderNoList = ownerCheckedResult.value.flatMap(item => item.matchedOrderNoList);
+  const params = {
+    warehouse,
+    type: '*',
+    orderNoList,
+    size:1000,
+    page:1
+  };
+  showLoading()
+  getPickingTaskDetail(<getPickingTaskDetailType>params).then(res=>{
+    if(res.data.length===0){
+      showToast({duration:5000,message:'任务已被获取,请刷新后重新查看!'})
+      return
+    }
+    ownerBatchTaskRef.value?.show(JSON.stringify(res.data))
+  }).finally(()=>{
+    closeLoading()
+  })
+}
 /**
  * 查看任务子列表
  */
@@ -354,8 +436,6 @@ const onCountTask=()=>{
     showToast({duration:5000,message:'普通/截单-单次获取任务最大数量为:60'})
     return
   }
-
-
   orderTrueFalseBy.value=false
   createPicking()
 }
@@ -443,7 +523,6 @@ const createPicking = () => {
   }).catch(err => {
     closeLoading()
     showFailToast({duration:5000,message:err.message})
-
   })
 };
 const pickingNoInputRef=ref(null)
@@ -473,21 +552,48 @@ const onMore= async (row)=>{
     // on close
   });
 }
-//查看城市
-const onProvince= async (row)=>{
-  showDialog({
-    title: `${ownerMap.value[row.owner]?ownerMap.value[row.owner]:row.owner}`+`城市规则`,
-    message: row.province,
-  }).then(() => {
-    // on close
-  });
+//切换模式
+const taskActions = [
+  { name: '查看全部任务', key: 'all' },
+  { name: '货主筛选', key: 'selectOwner' }
+];
+const defaultActions = [
+  { name: '批量获取活动单', key: 'task' },
+  { name: '货主筛选', key: 'selectOwner' }
+];
+const actions = ref(defaultActions)
+const modeTrueFalseBy = ref(false)
+
+const onClickRightIcon = () => {
+  actions.value = (modeType.value === 'task') ? taskActions : defaultActions
+  modeTrueFalseBy.value = true
+}
+
+const onSelectMode= async (value) => {
+  if (value.key == 'selectOwner') {
+    selectOwnerRef.value?.show()
+  }else if(value.key == 'task') {
+    const typeTaskList = () => {
+      const list = JSON.parse(JSON.stringify(taskList.value));
+      return list.filter(item => item.type === '*' && item.count<=10);
+    }
+    if(typeTaskList().length==0){
+      showToast({duration:3000,message:'当前活动单没有10单内的数据'})
+    }else {
+      modeType.value=value.key
+      taskList.value=typeTaskList()
+      if(typeTaskList().length<=10){
+        ownerCheckAllChange(true)
+      }
+    }
+  }else if(value.key == 'all'){
+    queryOwner(value.key)
+  }
 }
 //选择货主
 const selectOwnerRef=ref(null)
-const onClickRightIcon = () => {
-  selectOwnerRef.value?.show()
-};
 const queryOwner=(owner)=>{
+  modeType.value=''
   if(owner=='all'){
     taskList.value=allTaskList.value
   }else {

+ 18 - 2
vite.config.ts

@@ -1,6 +1,8 @@
 import { defineConfig } from 'vite'
 import vue from '@vitejs/plugin-vue'
-import legacy from '@vitejs/plugin-legacy';
+import legacy from '@vitejs/plugin-legacy'
+import * as fs from 'node:fs'
+import * as path from 'node:path'
 export default defineConfig(({ mode }) => {
   return {
   plugins: [vue(),
@@ -10,7 +12,21 @@ export default defineConfig(({ mode }) => {
         'core-js/stable',
         'regenerator-runtime/runtime',
       ],
-    })
+    }),
+    {
+      name: 'setting-txt',
+      generateBundle() {
+        const filePath = path.resolve(__dirname, 'src/static/setting.txt'); // 请确保路径正确
+        if (fs.existsSync(filePath)) {
+          let content = fs.readFileSync(filePath, 'utf-8');
+          let count = parseInt(content, 10) || 0
+          count ++
+          fs.writeFileSync(filePath, count.toString(), 'utf-8');
+        } else {
+          fs.writeFileSync(filePath, '1', 'utf-8');
+        }
+      }
+    }
   ],
   server: {
     host: '0.0.0.0', // 允许通过局域网访问