|
@@ -12,38 +12,40 @@
|
|
|
</template>
|
|
</template>
|
|
|
<template #right>
|
|
<template #right>
|
|
|
<div style="color: #fff;line-height: 46px " @click="onClickRight">开始作业</div>
|
|
<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" />
|
|
<van-icon name="list-switch" size="25" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</van-nav-bar>
|
|
</van-nav-bar>
|
|
|
<van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
|
|
<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>
|
|
<thead>
|
|
|
<tr>
|
|
<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 style="width: 80px">货主</th>
|
|
|
<th>标记</th>
|
|
<th>标记</th>
|
|
|
-<!-- <th>省份</th>-->
|
|
|
|
|
<th>承运商</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>
|
|
</tr>
|
|
|
</thead>
|
|
</thead>
|
|
|
<tbody>
|
|
<tbody>
|
|
|
<tr v-for="(row, rowIndex) in taskList" :key="rowIndex">
|
|
<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)">
|
|
<td style="word-wrap: break-word" v-if="isFirstInGroup(row, rowIndex)" :rowspan="getRowspan(row, rowIndex)">
|
|
|
{{ ownerMap[row.owner] || row.owner }}
|
|
{{ ownerMap[row.owner] || row.owner }}
|
|
|
</td>
|
|
</td>
|
|
|
<td style="word-wrap: break-word;" >
|
|
<td style="word-wrap: break-word;" >
|
|
|
<div>{{ row.ruleName }}</div>
|
|
<div>{{ row.ruleName }}</div>
|
|
|
</td>
|
|
</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;">
|
|
<td style="word-wrap: break-word;">
|
|
|
<div v-if="row.carrier.split(',').length" @click="onMore(row)">
|
|
<div v-if="row.carrier.split(',').length" @click="onMore(row)">
|
|
|
<div v-if="row.carrier.split(',').length > 5" >
|
|
<div v-if="row.carrier.split(',').length > 5" >
|
|
@@ -64,6 +66,13 @@
|
|
|
<van-button type="success" v-else @click="onTaskList(row,'*')">查看</van-button>
|
|
<van-button type="success" v-else @click="onTaskList(row,'*')">查看</van-button>
|
|
|
</td>
|
|
</td>
|
|
|
</tr>
|
|
</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>
|
|
</tbody>
|
|
|
</table>
|
|
</table>
|
|
|
<van-back-top right="80vw" bottom="10vh" />
|
|
<van-back-top right="80vw" bottom="10vh" />
|
|
@@ -153,14 +162,23 @@
|
|
|
</div>
|
|
</div>
|
|
|
</van-form>
|
|
</van-form>
|
|
|
</van-dialog>
|
|
</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" />
|
|
<picking-no-input ref="pickingNoInputRef" @loadData="loadTask" />
|
|
|
<big-picking ref="bigPickingRef" :model="model" :owner-map="ownerMap" :task-detail-list="taskDetailList" :warehouse="warehouse" />
|
|
<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" />
|
|
<select-owner ref="selectOwnerRef" :taskList="allTaskList" :ownerMap="ownerMap" @queryOwner="queryOwner" />
|
|
|
|
|
+ <owner-batch-task ref="ownerBatchTaskRef" :ownerMap="ownerMap" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
|
|
+import nodataUrl from '@/assets/nodata.png'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import { getTaskList } from '@/views/outbound/picking/task/hooks/task'
|
|
import { getTaskList } from '@/views/outbound/picking/task/hooks/task'
|
|
|
import { computed, defineAsyncComponent, nextTick, ref } from 'vue'
|
|
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 { closeLoading, showLoading } from '@/utils/loading'
|
|
|
import { getTimeHours } from '@/utils/date'
|
|
import { getTimeHours } from '@/utils/date'
|
|
|
import { fetchPickingData } from '@/views/outbound/picking/list/hooks/list'
|
|
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 router = useRouter()
|
|
|
const store = basicStore()
|
|
const store = basicStore()
|
|
|
const storeUser = useStore()
|
|
const storeUser = useStore()
|
|
@@ -188,10 +208,20 @@ const offset = ref({ x: 100, y: 500 })
|
|
|
const { taskList, getTaskData } = getTaskList(warehouse)
|
|
const { taskList, getTaskData } = getTaskList(warehouse)
|
|
|
const allTaskList=ref([])
|
|
const allTaskList=ref([])
|
|
|
const ownerMap = ref({})
|
|
const ownerMap = ref({})
|
|
|
|
|
+const modeType=ref('')
|
|
|
const loadData = async () => {
|
|
const loadData = async () => {
|
|
|
ownerMap.value = store.ownerMap
|
|
ownerMap.value = store.ownerMap
|
|
|
|
|
+ modeType.value=''
|
|
|
await getTaskData()
|
|
await getTaskData()
|
|
|
allTaskList.value=taskList.value
|
|
allTaskList.value=taskList.value
|
|
|
|
|
+ allTaskList.value.forEach((item,i)=>{
|
|
|
|
|
+ item.checked=false
|
|
|
|
|
+ if(item.type==='*'){
|
|
|
|
|
+ item.disabled=false
|
|
|
|
|
+ }else {
|
|
|
|
|
+ item.disabled=true
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
loadData()
|
|
loadData()
|
|
|
const ownerTaskTitle = computed(() => {
|
|
const ownerTaskTitle = computed(() => {
|
|
@@ -283,6 +313,58 @@ const onTaskList=async (row:Object,type)=>{
|
|
|
},100)
|
|
},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'})
|
|
showToast({duration:5000,message:'普通/截单-单次获取任务最大数量为:60'})
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
orderTrueFalseBy.value=false
|
|
orderTrueFalseBy.value=false
|
|
|
createPicking()
|
|
createPicking()
|
|
|
}
|
|
}
|
|
@@ -443,7 +523,6 @@ const createPicking = () => {
|
|
|
}).catch(err => {
|
|
}).catch(err => {
|
|
|
closeLoading()
|
|
closeLoading()
|
|
|
showFailToast({duration:5000,message:err.message})
|
|
showFailToast({duration:5000,message:err.message})
|
|
|
-
|
|
|
|
|
})
|
|
})
|
|
|
};
|
|
};
|
|
|
const pickingNoInputRef=ref(null)
|
|
const pickingNoInputRef=ref(null)
|
|
@@ -473,21 +552,48 @@ const onMore= async (row)=>{
|
|
|
// on close
|
|
// 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 selectOwnerRef=ref(null)
|
|
|
-const onClickRightIcon = () => {
|
|
|
|
|
- selectOwnerRef.value?.show()
|
|
|
|
|
-};
|
|
|
|
|
const queryOwner=(owner)=>{
|
|
const queryOwner=(owner)=>{
|
|
|
|
|
+ modeType.value=''
|
|
|
if(owner=='all'){
|
|
if(owner=='all'){
|
|
|
taskList.value=allTaskList.value
|
|
taskList.value=allTaskList.value
|
|
|
}else {
|
|
}else {
|