zhaohuanhuan 1 год назад
Родитель
Сommit
8c548e4e97

+ 33 - 4
src/api/picking/index.ts

@@ -1,7 +1,7 @@
 // @ts-ignore
 import request from '@/utils/request'
 // @ts-ignore
-import { getPickingDetailType, getPickingFirstType, getPickingTaskType, getPickingTaskDetailType, createPickingTaskType, getBigPickingListType, getListCombineSkuType, getBigPickingTaskDetailType, } from '@/types/picking'
+import { getPickingDetailType, getPickingFirstType, getPickingTaskType, getPickingTaskDetailType, createPickingTaskType, getBigPickingListType, getListCombineSkuType, getBigPickingTaskDetailType, getPickingDetailsByAisleType, updatePickingDetailOperatorType, } from '@/types/picking'
 /**
  * 获取拣货列表
  * @param params
@@ -49,9 +49,6 @@ export function createPickingTask(data: createPickingTaskType) {
   })
 }
 
-
-
-
 /**
  * 获取首个拣货任务号
  * @param params
@@ -170,3 +167,35 @@ export function printerByPick(params:any) {
 
 
 
+/**
+ * 巷道模式,获取站点任务
+ */
+export function getStationAisleTask(params:getPickingTaskType) {
+  return request({
+    url: 'api/wms/wave/allocate/aisle/task',
+    method: 'get',
+    params,
+  })
+}
+/**
+ * 巷道模式,获取站点任务
+ */
+export function getPickingDetailsByAisle(params:getPickingDetailsByAisleType) {
+  return request({
+    url: 'api/wms/picking/detail/aisle',
+    method: 'get',
+    params,
+  })
+}
+/**
+ * 巷道模式,修改拣货单明细操作人
+ */
+export function updatePickingDetailOperator(params:updatePickingDetailOperatorType) {
+  return request({
+    url: 'api/wms/picking/update/operator',
+    method: 'post',
+    params,
+  })
+}
+
+

+ 6 - 0
src/router/index.ts

@@ -21,6 +21,11 @@ const routes: RouteRecordRaw[] = [
     name: 'PickingTask',
     component: () => import('@/views/outbound/picking/task/index.vue')
   },
+  {
+    path: '/picking-aisle',
+    name: 'PickingAisle',
+    component: () => import('@/views/outbound/pickingAisle/site/index.vue')
+  },
   {
     path: '/blind-receiving',
     name: 'BlindReceiving',
@@ -31,6 +36,7 @@ const routes: RouteRecordRaw[] = [
     name: 'BlindTask',
     component: () => import('@/views/inbound/blindCollection/task/index.vue')
   },
+
 ];
 
 // 创建路由实例

+ 15 - 4
src/types/picking.ts

@@ -73,6 +73,8 @@ export interface getPickingFirstType {
 export interface getPickingDetailType {
   warehouse: string;
   code: string;
+  mode?: string;
+  aisle?: string;
 }
 /**
  * 获取组合商品
@@ -124,10 +126,19 @@ export interface setPickingDetailType {
 export interface getBigPickingListType {
   warehouse: string;
   orderNo: string;
-  type: string;
+  type?: string;
   owner: string;
-  status:number;
-  size: number;
-  page: number;
+  status?:number;
+  size?: number;
+  page?: number;
+}
+export interface getPickingDetailsByAisleType {
+  warehouse: string;
+  pickingCode: string;
+}
+export interface updatePickingDetailOperatorType {
+  warehouse: string;
+  pickingCode: string;
+  aisle: string;
 }
 

+ 2 - 0
src/views/index.vue

@@ -3,7 +3,9 @@
     <van-image class="image" :src="imageUrl" ></van-image>
     <div class="name" >{{userInfo.username}}</div>
     <div class="home" @click="onRouter('picking')">进入拣货</div>
+    <div class="home" @click="onRouter('picking-aisle')">进入巷道拣货</div>
     <div class="home" @click="onRouter('blind-receiving')">进入盲收</div>
+
   </div>
 </template>
 <script setup>

+ 4 - 2
src/views/outbound/picking/list/hooks/list.ts

@@ -23,7 +23,7 @@ export const  fetchPickingData= async(warehouse: string)=> {
       pickingCode
     }
 }
-export const getPickingTask = async (warehouse: string,pickingCode:any) => {
+export const getPickingTask = async (warehouse: string,pickingCode:any,mode:any,aisle:any) => {
   const taskList = ref<any>([]); // 用于存储拣货详情
   const expectedQuantity=ref(0)
      // 获取拣货数据的函数
@@ -31,7 +31,9 @@ export const getPickingTask = async (warehouse: string,pickingCode:any) => {
       // 获取拣货详情
       const { data: pickingDetails }: PickingDetailResponse = await getPickingDetail({
         warehouse,
-        code: pickingCode
+        code: pickingCode,
+        mode:mode || 'OWNER',
+        aisle
       });
       closeLoading()
       // 更新拣货详情

+ 21 - 5
src/views/outbound/picking/list/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="container">
     <van-nav-bar
-      title="拣货任务"
+      :title="route.query.aisle?'拣货任务'+'-'+route.query.aisle+'巷道':'拣货任务'"
       left-arrow
       fixed
       placeholder
@@ -82,7 +82,7 @@
       </van-row>
      </div>
       <div v-if="locationList.length==0" >
-        <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;">
           <van-empty
             image-size="100"
             description="暂无拣货数据"
@@ -192,10 +192,12 @@ const onContainerNo=(type)=>{
 const allQuantity=ref(0)
 //加载数据
 const waveNoJson =ref({})
+const mode=ref(route.query.mode)
+const aisle=ref(route.query.aisle)
 const loadData =  async (pickingCode,type) => {
   pickingNo.value=pickingCode
   //获取第一个拣货单号
-  const { taskList,expectedQuantity }=await getPickingTask(warehouse,pickingCode)
+  const { taskList,expectedQuantity }=await getPickingTask(warehouse,pickingCode,mode.value,aisle.value)
   if(taskList.value.length==0){
     return
   }
@@ -593,7 +595,12 @@ const _setPickingDetail=(params,type)=>{
         theme: 'round-button',
       }).then(() => {
           result()
+        if(route.query.aisle) {
+          router.push({ name: 'PickingAisle' })
+        }else {
           getPickingCode()
+        }
+
       })
     }
   }).catch((err)=> {
@@ -643,7 +650,12 @@ const actions = [
   { name: '检索条码' ,key:'inputBarcode'},
 ];
 const onClickLeft = () => {
-  router.push({name:'PickingTask'})
+
+  if(route.query.aisle){
+    router.push({name:'PickingAisle'})
+  }else {
+    router.push({name:'PickingTask'})
+  }
 };
 const onClickRight = () => {
   modeTrueFalseBy.value=true
@@ -653,7 +665,11 @@ const inputBarcodeRef=ref(null)
 const printerRef=ref(null)
 const onSelectMode= async (value) => {
   if(value.key=='task'){
-   await router.push({name:'PickingTask',query:{type:'picking'}})
+    if(route.query.aisle){
+      await router.push({name:'PickingAisle'})
+    }else {
+      await router.push({name:'PickingTask',query:{type:'picking'}})
+    }
   }else if(value.key=='picking'){
     pickingNoInputRef.value?.show()
   }else if(value.key=='inputBarcode'){

+ 179 - 0
src/views/outbound/pickingAisle/site/index.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="container">
+    <van-nav-bar
+      title="站点任务"
+      left-arrow
+      fixed
+      placeholder
+    >
+      <template #left>
+        <van-icon name="arrow-left" size="25" @click="goBack" />
+        <div style="color: #fff;height: 46px;padding-right:20px;line-height: 46px">返回</div>
+      </template>
+      <template #right>
+<!--        <div style="color: #fff;line-height: 46px ">开始作业</div>-->
+      </template>
+    </van-nav-bar>
+    <van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
+      <div v-if="siteTaskList.length>0" class="site-task">
+      <van-collapse v-model="activeSite" ref="siteTaskRef" >
+        <van-collapse-item :name="i" v-for="(item,i) in siteTaskList">
+          <template #title>
+            <div class="sit-task-title">
+              分拨站:{{item.deviceCode}}
+            </div>
+            <div style="display: flex;justify-content: space-between;">
+              <div>巷道任务总数:<span class="sit-task-title" style="color: #0077ff">{{item.totalTaskQty}}</span></div>
+              <div>剩余巷道任务:<span class="sit-task-title" style="color: #0077ff">{{item.remainingTaskQty}}</span></div>
+            </div>
+          </template>
+          <template #value>
+            详情
+          </template>
+          <div v-if="item.task.length>0" class="site-task-table">
+            <table class="task-table-box" >
+              <thead>
+              <tr>
+                <th style="min-width: 40px">巷道</th>
+                <th style="min-width: 40px">库位数</th>
+                <th style="min-width: 40px">商品数</th>
+                <th style="min-width: 40px">状态</th>
+                <th style="min-width: 40px">操作</th>
+              </tr>
+              </thead>
+              <tbody>
+              <tr v-if="item.task.length>0" v-for="(items,index) in item.task" :key="index" >
+                <td>{{ items.aisle }}</td>
+                <td>{{ items.locationQty }}</td>
+                <td>{{ items.quantity }}</td>
+                <td>{{typeMap[items.status] || items.status }}</td>
+                <td>
+                  <van-button  size="mini" type="primary" @click="onCreateTask(items)">获取任务</van-button>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+          <div v-else>
+            <van-empty image-size="70" style="padding:0 !important;"  :description="'暂无数据'" ></van-empty>
+          </div>
+        </van-collapse-item>
+      </van-collapse>
+      </div>
+      <div v-else style="background: #fff">
+        <van-empty :image="nodataUrl" image-size="160" >
+          <van-button round type="primary" class="bottom-button" size="small" @click="loadData">刷新</van-button>
+        </van-empty>
+      </div>
+    </van-pull-refresh>
+
+
+  </div>
+</template>
+<script setup>
+import { getPickingDetailsByAisle, getStationAisleTask, updatePickingDetailOperator } from '@/api/picking/index'
+import { useStore } from '@/store/modules/user'
+import { getHeader, goBack } from '@/utils/android'
+import { useRouter } from 'vue-router'
+import { ref } from 'vue'
+import { showToast } from 'vant'
+import { closeLoading, showLoading } from '@/utils/loading'
+import nodataUrl from '@/assets/nodata.png'
+const router = useRouter()
+try {
+  getHeader()
+} catch (error) {
+  router.push('/login')
+}
+const store = useStore()
+const value = ref('')
+const warehouse = store.warehouse
+const siteTaskList = ref([])
+const siteTaskRef = ref(null)
+const activeSite = ref([])
+const typeMap={
+  CREATE:"未拣",
+  COMPLETE:"完成",
+  RUNNING:"拣货中"
+}
+const loadData = async () => {
+  showLoading()
+  try {
+    const res = await getStationAisleTask({ warehouse });
+    const taskDetailsPromises = res.data.map(async (item) => {
+      const data = await getPickingDetailsByAisle({ warehouse, pickingCode: item.taskCode })
+      item.task =data.data
+      return item
+    });
+    siteTaskList.value =await Promise.all(taskDetailsPromises)
+    if(res.data.length===1){
+      setTimeout(() => {
+        siteTaskRef.value?.toggleAll(true);
+      }, 200);
+    }
+  } catch (error) {
+    console.error('获取数据失败', error);
+  } finally {
+    closeLoading();
+  }
+};
+
+loadData()
+
+//获取拣货任务
+const onCreateTask= async (item)=>{
+  console.log(item)
+  showLoading()
+  const params={warehouse,pickingCode:item.code,aisle:item.aisle}
+  updatePickingDetailOperator(params).then(res=>{
+    router.push({name:'PickingList',query:{code:item.code,mode:'AISLE',aisle:item.aisle}})
+    closeLoading()
+  }).catch(err=>{
+    closeLoading()
+  })
+}
+/**
+ * 下拉刷新
+ */
+const loading = ref(false)
+const onRefresh = () => {
+  setTimeout(() => {
+    loadData()
+    showToast('刷新成功')
+    loading.value = false
+  }, 1000)
+}
+
+window.onRefresh=loadData
+
+</script>
+<style scoped lang="sass">
+.site-task
+  ::v-deep(.van-collapse-item__content)
+    padding: 0
+  ::v-deep(.van-cell__title)
+    flex: 80% 0
+  ::v-deep(.van-cell__value)
+    flex: 0 20%
+  .sit-task-title
+    font-size: 15px
+    text-align: left
+    font-weight: 500
+  .site-task-table
+    width: 100%
+    overflow-y: auto
+    .task-table,.task-table-bin,.task-table-box
+      width: 100%
+      table-layout: fixed
+      border-collapse: collapse
+      font-size: 15px
+    .task-table th,.task-table-bin th,.task-table td,.task-table-bin td,.task-table-box th,.task-table-box td
+      text-align: center
+      border: 1px solid #ccc
+      word-wrap: break-word
+      word-break: break-all
+    .task-table thead,.task-table-bin thead,.task-table-box thead
+      position: sticky
+      top: 0
+      font-size: 15px
+</style>