|
|
@@ -10,7 +10,7 @@
|
|
|
>
|
|
|
<template #right>
|
|
|
<div style="color: #fff" @click="onClickRight">开始作业</div>
|
|
|
- <van-icon name="search" size="20" @click="onClickRight" />
|
|
|
+ <van-icon name="list-switch" size="25" @click="onClickRightIcon" />
|
|
|
</template>
|
|
|
</van-nav-bar>
|
|
|
<van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
|
|
|
@@ -36,7 +36,8 @@
|
|
|
<td>{{ row.count }}</td>
|
|
|
<td>
|
|
|
<van-button type="primary" v-if="row.type=='Y'|| row.type=='N'" @click="onCreateTask(row)">获取</van-button>
|
|
|
- <van-button type="success" v-else @click="onTaskList(row)">查看</van-button>
|
|
|
+ <van-button type="success" v-else-if="row.type=='M'" @click="onTaskList(row,'M')">查看</van-button>
|
|
|
+ <van-button type="success" v-else @click="onTaskList(row,'*')">查看</van-button>
|
|
|
</td>
|
|
|
</tr>
|
|
|
</tbody>
|
|
|
@@ -45,32 +46,31 @@
|
|
|
</van-pull-refresh>
|
|
|
<van-dialog v-model:show="orderTrueFalseBy"
|
|
|
:title="model.type=='*'?'攒单任务':'订单列表'"
|
|
|
- :show-cancel-button="model.type!='*'"
|
|
|
- :show-confirm-button="model.type!='*'"
|
|
|
+ show-cancel-button
|
|
|
confirm-button-text="生成任务"
|
|
|
- close-on-click-overlay
|
|
|
:beforeClose="onBuildTask"
|
|
|
>
|
|
|
- <div v-if="model.type!='*'">
|
|
|
- <van-checkbox class="order-checkbox" v-model="isCheckAll" :indeterminate="isIndeterminate" @change="checkAllChange">全选</van-checkbox>
|
|
|
+ <div>
|
|
|
+ <van-checkbox class="order-checkbox" v-model="isCheckAll" :indeterminate="isIndeterminate" @change="checkAllChange">全选</van-checkbox>
|
|
|
</div>
|
|
|
<div class="order-list">
|
|
|
- <div v-if="model.type=='*'">
|
|
|
- <van-cell v-for="(item,index) in taskDetailList" class="order-cell" center
|
|
|
- is-link value="获取" @click="onSubCreateTask(item)" >
|
|
|
- <template #title>
|
|
|
- <div style="display: flex;justify-content: space-between">
|
|
|
- <div>{{item.carrierName}}</div>
|
|
|
- <div>{{item.residualOrderQty}}单</div>
|
|
|
- <div>{{item.itemQty}}件</div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </van-cell>
|
|
|
- </div>
|
|
|
- <div v-else>
|
|
|
- <van-checkbox-group v-model="checkedResult" @change="checkedResultChange">
|
|
|
+ <div >
|
|
|
+ <van-checkbox-group v-model="checkedResult" @change="checkedResultChange" >
|
|
|
<van-checkbox class="order-item" v-for="(item,index) in taskDetailList" :key="index" :name="item">
|
|
|
- 订单号:{{ item.orderNo }}
|
|
|
+ <div v-if="model.type=='*'" class="order-item-detail">
|
|
|
+ <div class="">{{item.carrierName}}</div>
|
|
|
+ <div class="">{{item.residualOrderQty}}<span style="font-size: 12px">单</span></div>
|
|
|
+ <div @click.stop class="">
|
|
|
+ <van-stepper v-model="item.taskCount" :min="1" :max="item.residualOrderQty" input-width="50px" theme="round" button-size="30" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else >
|
|
|
+ <div class="order-item-detail">
|
|
|
+ <div><span style="font-size: 12px">订单号:</span>{{ item.orderNo }}</div>
|
|
|
+ <div>{{item.itemQty}}<span style="font-size: 12px">件</span></div>
|
|
|
+ </div>
|
|
|
+ <div class="order-item-detail" v-if="item.remark!=='' && item.remark!=null"><van-notice-bar :background="'none'" style="font-size: 12px" :speed="50" :text="item.remark" /></div>
|
|
|
+ </div>
|
|
|
</van-checkbox>
|
|
|
</van-checkbox-group>
|
|
|
</div>
|
|
|
@@ -101,12 +101,14 @@
|
|
|
<div class="tips-item" v-if="model.warehouseAttribute">属性仓:{{model.warehouseAttribute}}</div>
|
|
|
<div class="tips-item" v-if="model.issuePartyName">店铺:{{model.issuePartyName}}</div>
|
|
|
<div class="tips-item" v-if="model.ruleName">规则:{{model.ruleName}}</div>
|
|
|
- <div class="tips-item" v-if="model.remark">备注:{{model.remark}}</div>
|
|
|
+ <div class="tips-item" v-if="model.remark" style="color: orangered">备注:{{model.remark}}</div>
|
|
|
</div>
|
|
|
</van-form>
|
|
|
</van-dialog>
|
|
|
<!-- 拣货任务号-->
|
|
|
<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" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -120,6 +122,11 @@ import { createPickingTask, getPickingTaskDetail } from '@/api/picking'
|
|
|
import { useStore } from '@/store/modules/user'
|
|
|
import { back } from '@/utils/android'
|
|
|
import PickingNoInput from '@/views/outbound/components/PickingNoInput.vue'
|
|
|
+import BigPicking from '@/views/outbound/components/BigPicking.vue'
|
|
|
+import SelectOwner from '@/views/outbound/components/SelectOwner.vue'
|
|
|
+import { closeLoading, showLoading } from '@/utils/loading'
|
|
|
+import { toMap } from '@/utils/dataType'
|
|
|
+
|
|
|
const router = useRouter()
|
|
|
const store = basicStore()
|
|
|
const storeUser = useStore()
|
|
|
@@ -131,50 +138,73 @@ const orderTrueFalseBy = ref(false) //订单子任务
|
|
|
const createTaskTrueFalseBy = ref(false)//生成数量
|
|
|
const offset = ref({ x: 100, y: 500 })
|
|
|
const { taskList, getTaskData } = getTaskList(warehouse)
|
|
|
+const allTaskList=ref([])
|
|
|
const ownerMap = ref({})
|
|
|
const loadData = async () => {
|
|
|
ownerMap.value = store.ownerMap
|
|
|
await getTaskData()
|
|
|
+ allTaskList.value=taskList.value
|
|
|
}
|
|
|
loadData()
|
|
|
/**
|
|
|
* 获取任务列表
|
|
|
*/
|
|
|
+//不确定状态
|
|
|
+const isIndeterminate=ref(false)
|
|
|
+//是否全选
|
|
|
const isCheckAll = ref(false)
|
|
|
+//选中数据
|
|
|
const checkedResult = ref([])
|
|
|
-const isIndeterminate = ref(false)
|
|
|
+// 主数据
|
|
|
const model=ref({})
|
|
|
+// 子任务数据
|
|
|
const subModel=ref({})
|
|
|
+//获取数量
|
|
|
const modelCount = computed(() => subModel.value.residualOrderQty?subModel.value.residualOrderQty:model.value.count)
|
|
|
+//详情
|
|
|
const taskDetailList=ref([])
|
|
|
-const onTaskList=async (row:Object)=>{
|
|
|
+//大件单
|
|
|
+const bigPickingRef=ref(null)
|
|
|
+const onTaskList=async (row:Object,type)=>{
|
|
|
model.value=row
|
|
|
const params = {
|
|
|
warehouse,
|
|
|
- ownerList:row.owner.split(','),
|
|
|
- carrierList:row.carrier ? row.carrier.split(',') : [],
|
|
|
type:row.type,
|
|
|
orderNoList:row.matchedOrderNoList
|
|
|
}
|
|
|
+ showLoading()
|
|
|
const { data }: pickingListResponse = await getPickingTaskDetail(params)
|
|
|
+ closeLoading()
|
|
|
+ if(model.value.type==='*'){
|
|
|
+ data.forEach((item,index)=>{
|
|
|
+ item.taskCount=item.residualOrderQty
|
|
|
+ })
|
|
|
+ }
|
|
|
taskDetailList.value=data
|
|
|
- isIndeterminate.value=false
|
|
|
- if(data.length==1){
|
|
|
- checkedResult.value=data
|
|
|
- }else {
|
|
|
- checkedResult.value=[]
|
|
|
+ if(type=='M'){
|
|
|
+ setTimeout(()=>{
|
|
|
+ bigPickingRef.value?.show()
|
|
|
+ },100)
|
|
|
+ }else{
|
|
|
+ if(data.length==1){
|
|
|
+ isCheckAll.value=true
|
|
|
+ checkedResult.value=data
|
|
|
+ isIndeterminate.value=true
|
|
|
+ }else {
|
|
|
+ checkedResult.value=[]
|
|
|
+ isIndeterminate.value=false
|
|
|
+ }
|
|
|
+ setTimeout(()=>{
|
|
|
+ orderTrueFalseBy.value = true
|
|
|
+ },100)
|
|
|
}
|
|
|
- setTimeout(()=>{
|
|
|
- orderTrueFalseBy.value = true
|
|
|
- },100)
|
|
|
-
|
|
|
}
|
|
|
/**
|
|
|
* 查看任务子列表
|
|
|
*/
|
|
|
const checkAllChange = (val: boolean) => {
|
|
|
checkedResult.value = val ? taskDetailList.value : []
|
|
|
- isIndeterminate.value = false
|
|
|
+ isIndeterminate.value=false
|
|
|
}
|
|
|
|
|
|
const checkedResultChange = (value: string[]) => {
|
|
|
@@ -246,15 +276,19 @@ const countRefFocus=()=>{
|
|
|
}
|
|
|
const createPicking = () => {
|
|
|
const splitStringIfExists = value => (typeof value === 'string' && value.trim() !== '') ? value.split(',') : undefined;
|
|
|
-
|
|
|
let carriers = [];
|
|
|
let orderNoList = [];
|
|
|
let counts: number = count.value;
|
|
|
+ let uidMap={};
|
|
|
|
|
|
if (['S', 'U', 'M'].includes(model.value.type)) {
|
|
|
orderNoList = checkedResult.value.map(item => item.orderNo);
|
|
|
carriers = [...new Set(checkedResult.value.map(item => item.carrier))];
|
|
|
- counts = orderNoList.length;
|
|
|
+ counts = orderNoList.length
|
|
|
+ }else if(model.value.type=='*'){
|
|
|
+ orderNoList=model.value.matchedOrderNoList
|
|
|
+ uidMap=toMap(checkedResult.value,'uid','taskCount')
|
|
|
+ carriers = [...new Set(checkedResult.value.map(item => item.carrier))];
|
|
|
} else {
|
|
|
orderNoList=model.value.matchedOrderNoList
|
|
|
carriers = subModel.value.carrier
|
|
|
@@ -269,16 +303,35 @@ const createPicking = () => {
|
|
|
uid: subModel.value.uid || undefined,
|
|
|
orderNoList,
|
|
|
count: counts,
|
|
|
- };
|
|
|
+ uidMap:Object.keys(uidMap).length !== 0?uidMap:undefined,
|
|
|
+ }
|
|
|
+ showLoading()
|
|
|
createPickingTask(params).then(data => {
|
|
|
+ closeLoading()
|
|
|
router.push('/picking')
|
|
|
loadData()
|
|
|
+ }).catch(error => {
|
|
|
+ closeLoading()
|
|
|
})
|
|
|
};
|
|
|
const pickingNoInputRef=ref(null)
|
|
|
const onClickRight = () => {
|
|
|
pickingNoInputRef.value?.show()
|
|
|
};
|
|
|
+//选择货主
|
|
|
+const selectOwnerRef=ref(null)
|
|
|
+const onClickRightIcon = () => {
|
|
|
+ selectOwnerRef.value?.show()
|
|
|
+};
|
|
|
+const queryOwner=(owner)=>{
|
|
|
+ if(owner=='all'){
|
|
|
+ taskList.value=allTaskList.value
|
|
|
+ }else {
|
|
|
+ taskList.value = allTaskList.value.filter(item => item.owner === owner)
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
const loadTask=(code)=>{
|
|
|
router.push({name:'PickingList',query: { code }})
|
|
|
}
|
|
|
@@ -324,17 +377,20 @@ const onRefresh = () => {
|
|
|
::v-deep .van-field__control
|
|
|
font-size: 20px
|
|
|
.order-checkbox
|
|
|
- padding: 0 20px
|
|
|
+ padding: 0 10px
|
|
|
background: #fff
|
|
|
.order-list
|
|
|
- padding: 5px 20px
|
|
|
+ padding: 5px 10px
|
|
|
min-height: 20vh
|
|
|
max-height: 50vh
|
|
|
overflow: scroll
|
|
|
.order-item
|
|
|
padding: 5px 0
|
|
|
- .order-cell
|
|
|
- padding: 5px 0
|
|
|
+ .order-item-detail
|
|
|
+ width: 260px
|
|
|
+ display: flex
|
|
|
+ align-items: center
|
|
|
+ justify-content: space-between
|
|
|
.all-count
|
|
|
font-size: 12px
|
|
|
color: #0077ff
|