From d1511d2d12b4223882fcfdabd3ba6b59c038edc4 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 08 一月 2025 21:29:46 +0800
Subject: [PATCH] #拣货单功能开发

---
 zy-asrs-admin/src/views/out/flat/index.vue                                                |  142 ++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java                  |   25 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java              |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java                    |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java           |   39 +++
 zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml                        |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java                 |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java        |  106 +++++++-
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java        |   47 +++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/PageRequest.java              |   23 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java         |   13 
 zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml                            |    1 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetDetlService.java          |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java                      |   15 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java     |   60 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/PickSheetDetlDto.java           |   14 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java                      |  192 ++++++++++---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetDetlServiceImpl.java |   12 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/PageResult.java              |   13 +
 19 files changed, 636 insertions(+), 94 deletions(-)

diff --git a/zy-asrs-admin/src/views/out/flat/index.vue b/zy-asrs-admin/src/views/out/flat/index.vue
new file mode 100644
index 0000000..9018f2e
--- /dev/null
+++ b/zy-asrs-admin/src/views/out/flat/index.vue
@@ -0,0 +1,142 @@
+<template>
+    <a-table :columns="columns" :data-source="datasource" bordered>
+        <template #bodyCell="{column, record}">
+            <template v-if="column.key === 'operate'">
+                <a-button @click="viewDetail(record)" type="link">
+                    {{ "鏌ョ湅鏄庣粏" }}
+                </a-button>
+                <a-button @click="showDeleteConfirm(record)" danger type="link">{{"鍒犻櫎"}}</a-button>
+            </template>
+            <template v-if="column.key === 'status'">
+               <a-tag :color="record.status === 1 ? 'green' : 'volcano'">
+                   {{record.status === 1 ? "姝e父" : "绂佺敤"}}
+               </a-tag>
+            </template>
+        </template>
+    </a-table>
+    <a-modal ref="sheetDetl" v-model:open="show" :width="'80%'" title="鎷h揣鍗曟槑缁�" @ok="handleOk">
+        <a-table :columns="childNodes" :data-source="childList">
+            <template #bodyCell="{column, record}">
+                <template v-if="column.key === 'status'">
+                    <a-tag :color="record.status === 1 ? 'green' : 'volcano'">
+                        {{record.status === 1 ? "姝e父" : "绂佺敤"}}
+                    </a-tag>
+                </template>
+            </template>
+        </a-table>
+    </a-modal>
+</template>
+
+<script>
+    import {post, get} from "@/utils/request.js";
+    import {message, Modal} from "ant-design-vue";
+    import { createVNode } from 'vue';
+    import {formatMessage} from "@/utils/localeUtils.js";
+    import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
+
+    export default {
+        name: "out-stock-flat",
+        data() {
+            return {
+                columns: [
+                    {key: 'number', title: '搴忓彿', dataIndex: 'number'},
+                    {key: 'pickNo', title: '鍗曞彿', dataIndex: 'pickNo'},
+                    {key: 'waveNo', title: '娉㈡鍙�', dataIndex: 'waveNo'},
+                    {key: 'anfme', title: '鏁伴噺', dataIndex: 'anfme'},
+                    {key: 'status', title: '鍗曟嵁鐘舵��', dataIndex: 'status'},
+                    {key: 'memo', title: '澶囨敞', dataIndex: ''},
+                    {key: 'createdTime', title: '鍒涘缓鏃堕棿', dataIndex: 'createdTime'},
+                    {key: 'updatedTime', title: '淇敼鏃堕棿', dataIndex: 'updatedTime'},
+                    {key: 'operate', title: '鎿嶄綔', dataIndex: 'operate'}
+                ],
+                childNodes: [
+                    {key: 'number', title: '搴忓彿', dataIndex: 'number'},
+                    {key: 'maktx', title: '鐗╂枡鍚嶇О', dataIndex: 'maktx'},
+                    {key: 'matnr', title: '鐗╂枡缂栫爜', dataIndex: 'matnr'},
+                    {key: 'batch', title: '鎵瑰彿', dataIndex: 'batch'},
+                    {key: 'locNo', title: '搴撲綅', dataIndex: 'locNo'},
+                    {key: 'barcode', title: '鎷栫洏鐮�', dataIndex: 'barcode'},
+                    {key: 'anfme', title: '鏁伴噺', dataIndex: 'anfme'},
+                    {key: 'memo', title: '澶囨敞', dataIndex: ''},
+                    {key: 'status', title: '鍗曟嵁鐘舵��', dataIndex: 'status'},
+                    // {key: 'operate', title: '鎿嶄綔', dataIndex: 'operate'}
+                ],
+                datasource: [],
+                childList:[],
+                show: false,
+            }
+        },
+
+        mounted() {
+            //鑾峰彇鎷h揣鍗曟暟鎹簮
+            this.getOutFlatSheet();
+        },
+
+        methods: {
+             showDeleteConfirm(record){
+                 let that = this
+                Modal.confirm({
+                    title: '鏄惁纭鍒犻櫎褰撳墠鎷h揣鍗�',
+                    icon: createVNode(ExclamationCircleOutlined),
+                    content: '杩炲悓鏄庣粏涓�璧峰垹闄�',
+                    okText: '纭',
+                    okType: 'danger',
+                    cancelText: '鍙栨秷',
+                    onOk() {
+                        that.removeRow(record)
+                    },
+                    onCancel() {
+                        console.log('Cancel');
+                    },
+                });
+            },
+
+            //鍒犻櫎褰撳墠琛�
+            removeRow(record) {
+                let that = this
+                get('/api/pick/flat/remove/' + record.id).then((resp)=>{
+                    let result = resp.data;
+                    if (result.code == 200) {
+                        that.getOutFlatSheet()
+                        message.success(formatMessage('page.delete.success', '鍒犻櫎鎴愬姛'));
+                    } else {
+                        message.error(result.msg);
+                    }
+                })
+            },
+            //鏌ョ湅鏄庣粏
+            viewDetail(record) {
+                this.show = !this.show
+                this.getSheetDetl(record)
+            },
+            getOutFlatSheet() {
+                let that = this
+                post('/api/pick/flat/page',{page: {currnt: 1, size: 10}}).then((resp) => {
+                    let result = resp.data;
+                    if (result.code == 200) {
+                        // message.success(formatMessage('page.add.success', '鎴愬姛'));
+                        that.datasource = result.data
+                    } else {
+                        message.error(result.msg);
+                    }
+                })
+            },
+            getSheetDetl(record) {
+              let that = this
+                post('/api/pick/flat/detl/page',{page: {currnt: 1, size: 10}, params: {pickId: record.id}}).then((resp) => {
+                    let result = resp.data;
+                    if (result.code == 200) {
+                        // message.success(formatMessage('page.add.success', '鎴愬姛'));
+                        that.childList = result.data
+                    } else {
+                        message.error(result.msg);
+                    }
+                })
+            },
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/PageResult.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/PageResult.java
new file mode 100644
index 0000000..6fbdb10
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/PageResult.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.framework.common;
+
+import lombok.Data;
+
+public class PageResult<T> extends R {
+
+    //鎬绘暟
+    Integer total;
+
+    public PageResult (String msg, Integer code, T data) {
+        super(code, msg);
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
index cc07a96..00bfa11 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
@@ -1,6 +1,9 @@
 package com.zy.asrs.wms.asrs.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.common.domain.CodeRes;
 import com.zy.asrs.common.domain.enums.LoginSystemType;
 import com.zy.asrs.framework.annotations.ManagerAuth;
@@ -10,11 +13,14 @@
 import com.zy.asrs.wms.asrs.entity.Order;
 import com.zy.asrs.wms.asrs.entity.WaitPakin;
 import com.zy.asrs.wms.asrs.entity.dto.OrderInfoDto;
+import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
 import com.zy.asrs.wms.asrs.service.MobileService;
 import com.zy.asrs.wms.asrs.service.OrderService;
 import com.zy.asrs.wms.asrs.service.WaitPakinService;
+import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.system.controller.BaseController;
 import com.zy.asrs.wms.system.entity.Host;
 import com.zy.asrs.wms.system.entity.User;
@@ -178,4 +184,37 @@
         }
     }
 
+    /**
+     * 鑾峰彇鎷h揣鏄庣粏
+     * @return
+     */
+    @GetMapping("/pick/detl/{code}")
+    public R pickDetlByPickNo(@PathVariable String code) {
+        if (StringUtil.isNullOrEmpty(code)) {
+            return R.error("鎷h揣鍗曟嵁缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+        PickSheetDetlDto pickSheetDetls =  mobileService.outFlatSheet(code);
+
+        return R.ok(pickSheetDetls);
+    }
+
+    /**
+     * 鎷h揣鍗曠‘璁ゅ嚭搴�
+     * @param code
+     * @return
+     */
+    @GetMapping("/pick/confirm/{code}")
+    public R confirmOutFlatSheet(@PathVariable String code) {
+        if (StringUtil.isNullOrEmpty(code)) {
+            return R.error("鎷h揣鍗曟嵁缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+        if (!mobileService.confirmFlatSheet(code)) {
+            return R.error("鍑哄簱澶辫触锛侊紒");
+        }
+        return R.ok("鍑哄簱鎴愬姛锛侊紒");
+    }
+
+
+
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java
index 33d7a25..66012e8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java
@@ -1,14 +1,55 @@
 package com.zy.asrs.wms.asrs.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
+import com.zy.asrs.wms.asrs.service.PickSheetService;
 import com.zy.asrs.wms.system.controller.BaseController;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
-@RequestMapping("/pick")
+@RequestMapping("/api")
 @RestController
 public class PickSheetController extends BaseController {
 
+    @Autowired
+    private PickSheetService pickSheetService;
 
+    /**
+     * 骞充粨鍑哄簱鎷h揣鍗�
+     * @return
+     */
+    @PostMapping("/pick/flat/page")
+    public R getOutFlatSheet(@RequestBody PageRequest params) {
+        IPage page = pickSheetService.getOutFlatSheet(params);
+        return R.ok(page.getRecords());
+    }
 
+    /**
+     * 鑾峰彇鎷h揣鍗曟槑缁�
+     * @param pageRequest
+     * @return
+     */
+    @PostMapping("/pick/flat/detl/page")
+    public R getSheetDetl(@RequestBody PageRequest pageRequest) {
+        IPage page = pickSheetService.getSheetDetl(pageRequest);
+        return R.ok(page.getRecords());
+    }
+
+    /**
+     * 鑾峰彇鎷h揣鍗曟槑缁�
+     * @param id
+     * @return
+     */
+    @GetMapping("/pick/flat/remove/{id}")
+    public R getRemoveSheet(@PathVariable String id) {
+        int result = pickSheetService.removePickSheet(Long.valueOf(id));
+        if (result > 0) {
+            return R.ok("鍒犻櫎鎴愬姛锛侊紒");
+        } else {
+            return R.error("鍒犻櫎澶辫触锛侊紒");
+        }
+    }
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java
index 1a46193..d48e3b6 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java
@@ -3,16 +3,25 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * man_pick_sheet
  */
 @Data
+@Accessors(chain = true)
+@TableName("man_pick_sheet")
 public class PickSheet implements Serializable {
     /**
      * 涓婚敭
      */
+    @TableId
     private Long id;
 
     /**
@@ -33,7 +42,7 @@
     /**
      * 鏁伴噺
      */
-    private BigDecimal anfme;
+    private Double anfme;
 
     /**
      * 澶囨敞
@@ -43,11 +52,15 @@
     /**
      * 鍒涘缓鏃堕棿
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createdTime;
 
     /**
      * 淇敼鏃堕棿
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updatedTime;
 
     private Long hostId;
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java
index dd69932..1e392d8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java
@@ -3,32 +3,30 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * man_pick_sheet_detl
  */
 @Data
+@Accessors(chain = true)
+@TableName("man_pick_sheet_detl")
 public class PickSheetDetl implements Serializable {
     /**
      * 涓婚敭
      */
+    @TableId
     private Long id;
 
     /**
      * 鎷h揣鍗曟爣璇�
      */
     private Long pickId;
-
-    /**
-     * 璁㈠崟鏍囪瘑
-     */
-    private Long orderId;
-
-    /**
-     * 璁㈠崟鏄庣粏鏍囪瘑
-     */
-    private Long orderDetlId;
 
     /**
      * 鐗╂枡涓婚敭鏍囪瘑
@@ -39,6 +37,11 @@
      * 搴撲綅涓婚敭鏍囪瘑
      */
     private Long locId;
+
+    /**
+     * 搴撲綅鏄庣粏ID
+     */
+    private Long locDetlId;
 
     /**
      * 鐗╂枡鍚嶇О
@@ -53,7 +56,7 @@
     /**
      * 鎵瑰彿
      */
-    private Long batch;
+    private String batch;
 
     /**
      * 鏁伴噺
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/PickSheetDetlDto.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/PickSheetDetlDto.java
new file mode 100644
index 0000000..5ebd60a
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/PickSheetDetlDto.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.wms.asrs.entity.dto;
+
+import com.zy.asrs.wms.asrs.entity.PickSheet;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class PickSheetDetlDto extends PickSheet implements Serializable {
+
+    private List<PickSheetDetl> pickSheetDetlList;
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/PageRequest.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/PageRequest.java
new file mode 100644
index 0000000..0e64938
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/PageRequest.java
@@ -0,0 +1,23 @@
+package com.zy.asrs.wms.asrs.entity.param;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sun.xml.internal.ws.model.WrapperParameter;
+import lombok.Data;
+
+import java.sql.Wrapper;
+import java.util.Map;
+
+@Data
+public class PageRequest{
+
+    //璇锋眰鍙傛暟鎷兼帴
+    private QueryWrapper queryWrapper;
+
+    Map<String, Object> params;
+    /**
+     * 鍒嗛〉锛� pageSize = 10 ,page = 1
+     */
+    Page page;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
index 8d3b95f..6a4b7d9 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.wms.asrs.manage;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.dto.*;
@@ -14,10 +15,13 @@
 import com.zy.asrs.wms.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -63,6 +67,12 @@
     private CacheSiteService cacheSiteService;
     @Autowired
     private WaveSeedService waveSeedService;
+    @Autowired
+    private PickSheetService pickSheetService;
+    @Autowired
+    private PickSheetDetlService pickSheetDetlService;
+    @Autowired
+    private MatService matService;
 
     /**
      * 鍑哄簱
@@ -82,7 +92,7 @@
             long taskType = locDto.getAll() ? 101L : 103L;
 
             Loc loc = locService.getById(locDto.getLocId());
-            if(loc == null) {
+            if (loc == null) {
                 throw new CoolException("搴撲綅涓嶅瓨鍦�");
             }
 
@@ -105,7 +115,7 @@
             // 宸ヤ綔妗f槑缁嗕繚瀛�
             for (OutDetlDto detl : locDto.getDetls()) {
                 LocDetl locDetl = locDetlService.getById(detl.getDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -132,7 +142,7 @@
                     taskDetlField.sync(locDetlField);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -142,7 +152,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
         }
@@ -195,7 +205,9 @@
         //鑾峰彇TCU绗﹀悎鏉′欢搴撲綅
         for (OrderDetl orderDetl : orderDetls) {
             double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D);
-            if (issued <= 0.0D) { continue; }
+            if (issued <= 0.0D) {
+                continue;
+            }
             List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
             orderDetlLocMap.put(orderDetl.getId(), locDetls);
             for (LocDetl locDetl : locDetls) {
@@ -207,7 +219,7 @@
                     outDetlDto.setOrderDetlId(orderDetl.getId());
                     detlDtos.add(outDetlDto);
                     issued = issued - outDetlDto.getAnfme();
-                }else {
+                } else {
                     break;
                 }
             }
@@ -220,7 +232,7 @@
             if (dtos == null) {
                 dtos = new ArrayList<>();
                 dtos.add(detlDto);
-            }else {
+            } else {
                 dtos.add(detlDto);
             }
             map.put(locDetl.getLocId(), dtos);
@@ -329,11 +341,11 @@
                 continue;
             }
 
-            if(detlMap.containsKey(previewDto.getLocDetlId())) {
+            if (detlMap.containsKey(previewDto.getLocDetlId())) {
                 List<OrderOutBatchPreviewDto> previewDtos = detlMap.get(previewDto.getLocDetlId());
                 previewDtos.add(previewDto);
                 detlMap.put(previewDto.getLocDetlId(), previewDtos);
-            }else {
+            } else {
                 List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>();
                 previewDtos.add(previewDto);
                 detlMap.put(previewDto.getLocDetlId(), previewDtos);
@@ -361,11 +373,11 @@
         HashMap<Long, List<OrderOutBatchPreviewDto>> map = new HashMap<>();
 
         for (OrderOutBatchPreviewDto previewDto : dtos) {
-            if(map.containsKey(previewDto.getLocId())) {
+            if (map.containsKey(previewDto.getLocId())) {
                 List<OrderOutBatchPreviewDto> previewDtos = map.get(previewDto.getLocId());
                 previewDtos.add(previewDto);
                 map.put(previewDto.getLocId(), previewDtos);
-            }else {
+            } else {
                 List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>();
                 previewDtos.add(previewDto);
                 map.put(previewDto.getLocId(), previewDtos);
@@ -411,12 +423,12 @@
 
             for (OrderOutBatchPreviewDto dto : previewDtos) {
                 LocDetl locDetl = locDetlService.getById(dto.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
                 OrderDetl orderDetl = orderDetlService.getById(dto.getOrderDetlId());
-                if(orderDetl == null) {
+                if (orderDetl == null) {
                     throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                 }
                 orderUtils.updateWorkQty(dto.getOrderDetlId(), dto.getAnfme());
@@ -442,7 +454,7 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -452,7 +464,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
 
@@ -477,7 +489,7 @@
         }
 
         List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getOrderId, orderIds));
-        if(orderDetls.isEmpty()){
+        if (orderDetls.isEmpty()) {
             throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
         }
         orderDetls = orderDetlService.parseDetl(orderDetls);
@@ -490,7 +502,7 @@
                 Double anfme = locDetlStockMap.get(matUniqueKey);
                 anfme += issued;
                 locDetlStockMap.put(matUniqueKey, anfme);
-            }else {
+            } else {
                 locDetlStockMap.put(matUniqueKey, issued);
             }
         }
@@ -534,7 +546,7 @@
             dto.setFieldParams(fieldParams);
         }
 
-        FieldSortParam sortParam = new FieldSortParam("anfme","desc");
+        FieldSortParam sortParam = new FieldSortParam("anfme", "desc");
         List<FieldSortParam> sortParams = new ArrayList<>();
         sortParams.add(sortParam);
 
@@ -600,9 +612,11 @@
         for (MergePreviewDto dto : param) {
             Double anfme = dto.getAnfme() - dto.getWorkQty();
             //鍑忓幓骞冲簱鏁伴噺鍚庯紝灏忎簬绛変簬0锛岃烦鍑哄鐞�
-            if (anfme <= 0) {continue;}
+            if (anfme <= 0) {
+                continue;
+            }
             List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams);
-            if(locDetls.isEmpty()){
+            if (locDetls.isEmpty()) {
                 MergePreviewResultDto resultDto = new MergePreviewResultDto();
                 resultDto.sync(dto);
                 resultDto.setLocs(new ArrayList<>());
@@ -673,7 +687,7 @@
 
     @Transactional(rollbackFor = Exception.class)
     public void orderOutMerge(OrderOutMergeParamDto dto) {
-        if(dto == null){
+        if (dto == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
 
@@ -723,7 +737,7 @@
                 List<OrderDetl> detls = detlMap.get(matUniqueKey);
                 detls.add(orderDetl);
                 detlMap.put(matUniqueKey, detls);
-            }else {
+            } else {
                 List<OrderDetl> detls = new ArrayList<>();
                 detls.add(orderDetl);
                 detlMap.put(matUniqueKey, detls);
@@ -757,7 +771,7 @@
                     orderOutMergeDto.setAnfme(issued);
                     updateWorkQty = issued;
                     requireAnfme -= issued;
-                }else {
+                } else {
                     orderOutMergeDto.setAnfme(requireAnfme);
                     updateWorkQty = requireAnfme;
                     requireAnfme -= requireAnfme;
@@ -777,7 +791,7 @@
             List<OrderOutMergeDto> list = null;
             if (map.containsKey(orderOutMergeDto.getLocId())) {
                 list = map.get(orderOutMergeDto.getLocId());
-            }else {
+            } else {
                 list = new ArrayList<>();
             }
             list.add(orderOutMergeDto);
@@ -823,12 +837,12 @@
 
             for (OrderOutMergeDto merge : list) {
                 LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
                 OrderDetl orderDetl = orderDetlService.getById(merge.getOrderDetlId());
-                if(orderDetl == null) {
+                if (orderDetl == null) {
                     throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -853,7 +867,7 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -865,7 +879,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
 
@@ -883,11 +897,12 @@
      * 4. 鐢熸垚鍑哄簱鍗昉DA绔紝缁熶竴鍑哄簱鎵e噺搴撳瓨
      * 5. 鐢熸垚鎷h揣鍗曞巻鍙叉。锛屽嚭搴撳崟鎹姞鍏ュ巻鍙叉。锛屽垹闄ゅ師鍗曟嵁
      * 6. 鍒犻櫎娉㈡鍒楄〃鏁版嵁
+     *
      * @param dto
      */
     @Transactional(rollbackFor = Exception.class)
     public void orderOutMergeWave(OrderOutMergeParamDto dto) {
-        if(dto == null){
+        if (dto == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
 
@@ -903,7 +918,6 @@
         /**
          * 娉㈡鍚堝苟鍑哄簱
          * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴�
-         * 2. 鏍规嵁鍗曞簱鍗曟嵁绫诲瀷
          * 2. 骞冲簱鐢熸垚鎷h揣鍗�
          * 3. TCU搴撶敓鎴愪换鍔″崟
          */
@@ -917,17 +931,25 @@
         }
     }
 
-    private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam>  mergeParams, Wave wave) {
+    /**
+     * 1. 鍒ゆ柇褰撴尝娆″強搴撲綅鏄庣粏鏄惁瀛樺湪
+     * 2. 缁勫悎key-value(list)褰㈠紡鏁版嵁
+     *
+     * @param mergeParams
+     * @param wave
+     * @return
+     */
+    private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam> mergeParams, Wave wave) {
         HashMap<String, Double> stockMap = new HashMap<>();
         for (OrderOutMergeParam param : mergeParams) {
             String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams());
             WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId()));
-            if(waveDetl == null){
+            if (waveDetl == null) {
                 throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
             }
-
+            //鑾峰彇褰撳墠闇�瑕佹墽琛屾暟閲�
             double issued = Optional.of(waveDetl.getAnfme() - waveDetl.getWorkQty()).orElse(0.0D);
-            if(!stockMap.containsKey(matUniqueKey)){
+            if (!stockMap.containsKey(matUniqueKey)) {
                 stockMap.put(matUniqueKey, issued);
             }
         }
@@ -935,33 +957,35 @@
         HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>();
         for (OrderOutMergeParam param : mergeParams) {
             LocDetl locDetl = locDetlService.getById(param.getLocDetlId());
-            if(locDetl == null) {
+            if (locDetl == null) {
                 continue;
             }
-
-            if (locDetl.getAnfme() - param.getAnfme() < 0) {
+            //搴撲綅鏁伴噺灏忎簬鍑哄簱鏁伴噺 //鏂板workQty鐢ㄤ簬骞冲簱閿佸簱瀛�
+            if (locDetl.getAnfme() - locDetl.getWorkQty() - param.getAnfme() < 0) {
                 continue;
             }
 
             OrderOutMergeDto orderOutMergeDto = new OrderOutMergeDto();
             orderOutMergeDto.sync(param);
-
+            //fixme 纭stockMap鏄惁鏈夌敤锛屾澶勫叆鍊煎悗鍗存病鏈変娇鐢�
             String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams());
             Double issued = stockMap.get(matUniqueKey);
             if (issued - orderOutMergeDto.getAnfme() < 0) {
                 orderOutMergeDto.setAnfme(issued);
                 issued = 0D;
-            }else {
+            } else {
                 issued -= orderOutMergeDto.getAnfme();
             }
-            stockMap.put(matUniqueKey, issued);
 
+            stockMap.put(matUniqueKey, issued);
+            //鏍规嵁搴撲綅鍋氬垎绫伙紝鍙娇鐢╯tream().groupby
             List<OrderOutMergeDto> list = null;
             if (map.containsKey(orderOutMergeDto.getLocId())) {
                 list = map.get(orderOutMergeDto.getLocId());
-            }else {
+            } else {
                 list = new ArrayList<>();
             }
+
             list.add(orderOutMergeDto);
             map.put(orderOutMergeDto.getLocId(), list);
         }
@@ -975,6 +999,7 @@
 
     /**
      * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷e崟鍙奣UC浠诲姟妗�
+     *
      * @param dto
      * @param wave
      */
@@ -999,12 +1024,12 @@
                 tucOrders.addAll(listMap.get(key));
             }
         });
-        if (flatOrders.isEmpty()) {
+        if (!flatOrders.isEmpty()) {
             //骞冲簱鍑哄簱
             outStockByFlat(flatOrders, wave);
         }
 
-        if (tucOrders.isEmpty()) {
+        if (!tucOrders.isEmpty()) {
             //TUC鍑哄簱
             outStockByTUC(tucOrders, wave);
         }
@@ -1018,12 +1043,15 @@
      * @param tucOrders
      * @param wave
      */
-    private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {
-        Map<Long, List<OrderOutMergeDto>>  map = checkLoc(tucOrders, wave);
-
+    private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {//123
+        Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave);
+        if (!Objects.isNull(map)) {
+            return;
+        }
         for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) {
             Long locId = entry.getKey();
             List<OrderOutMergeDto> list = entry.getValue();
+            //鍒ゆ柇鏄惁鍏ㄤ粨鍑哄簱
             Boolean all = outUtils.isAllForMerge(locId, list);
             OrderOutMergeDto param = list.get(0);
             Long operationPortId = param.getOperationPort();
@@ -1041,7 +1069,7 @@
             if (operationPort == null) {
                 throw new CoolException("浣滀笟鍙d笉瀛樺湪");
             }
-
+            //101 鍏ㄦ嫋鍑哄簱   103 鎷h揣鍑哄簱
             long taskType = all ? 101L : 103L;
 
             Task task = new Task();
@@ -1059,7 +1087,7 @@
 
             for (OrderOutMergeDto merge : list) {
                 LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -1085,7 +1113,7 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -1106,7 +1134,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
         }
@@ -1114,18 +1142,80 @@
 
     /**
      * 骞冲簱鍑哄簱--鐢熸垚鍑哄簱鎷h揣鍗�
+     * 1. 鍒ゆ柇褰撳墠搴撲綅鏄惁瀛樺湪
+     * 2. 涓�寮犲崟鎹竴涓尝娆�
+     * 3. 涓�涓尝娆″鏉¤鍗�
+     * 4. 涓�涓簱浣嶅彲澶氭潯鏄庣粏
+     * 5. 鎷h揣鍗曞畬鎴愬悗锛岄噴鏀惧簱浣嶆槑缁嗛攣瀹氭暟閲�
      *
      * @param flatOrders
      * @param wave
      */
     private void outStockByFlat(List<OrderOutMergeParam> flatOrders, Wave wave) {
+        //鏍¢獙搴撳瓨鏁伴噺
         Map<Long, List<OrderOutMergeDto>> map = checkLoc(flatOrders, wave);
+        //鐢熸垚鎷h揣鍗�
+        PickSheet pickSheet = new PickSheet();
+        //娉㈡鏁伴噺姹囨��
+        double sum = flatOrders.stream().mapToDouble(OrderOutMergeParam::getAnfme).sum();
+        //鐢熸垚鎷h揣鍗曞彿
+        String pickNo = generatePickNO();
+        pickSheet.setId(null)
+                .setPickNo(pickNo)
+                .setMemo(wave.getMemo())
+                .setAnfme(sum)
+                .setWaveId(wave.getId())
+                .setWaveNo(wave.getWaveNo());
 
+        if (!pickSheetService.save(pickSheet)) {
+            throw new CoolException("鎷h揣鍗曞啓鍏ュけ璐ワ紒锛�");
+        }
 
+        //鏍规嵁搴撲綅ID鍒嗙粍
+        Map<Long, List<OrderOutMergeParam>> listMap = flatOrders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId));
+        //鐢熸垚鎷h揣鏄庣粏
+        listMap.keySet().forEach(key -> {
+            Loc curLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key));
+            if (Objects.isNull(curLoc)) {
+                throw new CoolException("涓婚敭." + key + "鐨勫簱浣嶄笉瀛樺湪锛侊紒");
+            }
+            listMap.get(key).forEach(outOder -> {
+                //鑾峰彇搴撲綅鏄庣粏淇℃伅
+                LocDetl locDetl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, outOder.getLocDetlId()));
+                PickSheetDetl sheetDetl = new PickSheetDetl();
+                BeanUtils.copyProperties(outOder, sheetDetl);
+                //鑾峰彇鐗╂枡淇℃伅
+                Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, outOder.getMatnr()));
+                //鎷h揣鍗曟槑缁�
+                sheetDetl.setBarcode(curLoc.getBarcode())
+                        .setPickId(pickSheet.getId())
+                        .setAnfme(BigDecimal.valueOf(outOder.getAnfme()))
+                        .setLocDetlId(locDetl.getId())
+                        .setMaktx(mat.getMaktx())
+                        .setMatId(mat.getId());
+                if (!pickSheetDetlService.save(sheetDetl)) {
+                    throw new CoolException("鎷h揣鏄庣粏鍒楁柊澶辫触");
+                }
+                //閿佸畾搴撳瓨閲�
+                locDetl.setWorkQty(locDetl.getWorkQty() + outOder.getAnfme());
 
+            });
+
+        });
 
     }
 
+    /**
+     * 鐢熸垚鎷h揣鍗曞彿
+     *
+     * @return
+     */
+    private String generatePickNO() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        String format = simpleDateFormat.format(new Date());
+        Random random = new Random();
+        return "PN" + format + random.nextInt(10000);
+    }
 
     @Transactional(rollbackFor = Exception.class)
     public void generateWave(GenerateWaveParam param) {
@@ -1277,7 +1367,7 @@
                     order.setWaveId(null);
                     order.setWaveNo(null);
                     order.setHasWave(0);
-                    if(order.getOrderSettle().equals(OrderSettleType.WAVE.val())){
+                    if (order.getOrderSettle().equals(OrderSettleType.WAVE.val())) {
                         order.setOrderSettle(OrderSettleType.WAIT.val());
                     }
                     if (!orderService.updateById(order)) {
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java
index 5dd548f..9d8da1e 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java
@@ -1,21 +1,12 @@
 package com.zy.asrs.wms.asrs.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.stereotype.Repository;
 
 @Mapper
 @Repository
-public interface ManPickSheetDetlMapper {
-    int deleteByPrimaryKey(Long id);
+public interface ManPickSheetDetlMapper extends BaseMapper<PickSheetDetl> {
 
-    int insert(PickSheetDetl record);
-
-    int insertSelective(PickSheetDetl record);
-
-    PickSheetDetl selectByPrimaryKey(Long id);
-
-    int updateByPrimaryKeySelective(PickSheetDetl record);
-
-    int updateByPrimaryKey(PickSheetDetl record);
 }
\ No newline at end of file
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
index 4c2d52c..6b9ac89 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
@@ -1,7 +1,11 @@
 package com.zy.asrs.wms.asrs.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zy.asrs.wms.asrs.entity.Loc;
+import com.zy.asrs.wms.asrs.entity.PickSheet;
+import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
 import com.zy.asrs.wms.system.entity.Host;
 
@@ -15,4 +19,8 @@
     List<Host> getHosts();
 
     boolean pakinToStock(PakinOnShelvesParams shelvesParams);
+
+    PickSheetDetlDto outFlatSheet(String code);
+
+    boolean confirmFlatSheet(String code);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetDetlService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetDetlService.java
new file mode 100644
index 0000000..488fbb1
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetDetlService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wms.asrs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+
+public interface PickSheetDetlService extends IService<PickSheetDetl> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java
index 59e5aba..1b3c766 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java
@@ -1,8 +1,16 @@
 package com.zy.asrs.wms.asrs.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zy.asrs.wms.asrs.entity.PickSheet;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
 
 public interface PickSheetService extends IService<PickSheet> {
 
+    IPage<PickSheet> getOutFlatSheet(PageRequest params);
+
+    IPage<PickSheetDetl> getSheetDetl(PageRequest pageRequest);
+
+    int removePickSheet(Long id);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
index b110fa7..0c66545 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -1,12 +1,17 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
+import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
 import com.zy.asrs.wms.asrs.entity.enums.*;
 import com.zy.asrs.wms.asrs.entity.enums.OrderType;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
 import com.zy.asrs.wms.asrs.service.*;
 import com.zy.asrs.wms.system.entity.Host;
@@ -16,10 +21,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -45,7 +48,10 @@
     private LocAreaService locAreaService;
     @Autowired
     private LocAreaTypeService locAreaTypeService;
-
+    @Autowired
+    private PickSheetService pickSheetService;
+    @Autowired
+    private PickSheetDetlService pickSheetDetlService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -133,7 +139,8 @@
             LocDetl locDetl = new LocDetl();
             locDetl.setAnfme(pakin.getAnfme());
             locDetl.setBatch(pakin.getBatch());
-            locDetl.setMatId(pakin.getMatnrId$());;
+            locDetl.setMatId(pakin.getMatnrId$());
+            ;
             locDetl.setCreateTime(new Date());
             locDetl.setOrderNo(pakin.getOrderNo());
             locDetl.setLocNo(loc.getLocNo());
@@ -178,15 +185,84 @@
         return true;
     }
 
-//    /**
-//     * 鑾峰彇褰撳墠搴撲綅鏄惁瀛樺湪
-//     * @param shelvesParams
-//     * @return
-//     */
-//    @Override
-//    public Loc selectPakinLocs(PakinOnShelvesParams shelvesParams) {
-//        return locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, shelvesParams.getLoc()));
-//    }
+    @Override
+    public PickSheetDetlDto outFlatSheet(String code) {
+        PickSheetDetlDto pickDetlDto = new PickSheetDetlDto();
+        PickSheet pickSheet = pickSheetService.getOne(new LambdaQueryWrapper<PickSheet>()
+                .eq(PickSheet::getPickNo, code)
+                .eq(PickSheet::getDeleted, 0)
+                .eq(PickSheet::getStatus, 1)
+        );
+        BeanUtils.copyProperties(pickSheet, pickDetlDto);
+        if (Objects.isNull(pickDetlDto)) {
+            throw new CoolException("瀵硅薄澶嶅埗澶辫触锛侊紒");
+        }
+        List<PickSheetDetl> sheetDetls = pickSheetDetlService.list(new LambdaQueryWrapper<PickSheetDetl>()
+                .eq(PickSheetDetl::getPickId, pickSheet.getId())
+                .eq(PickSheetDetl::getStatus, 1)
+                .eq(PickSheetDetl::getDeleted, 0));
+        pickDetlDto.setPickSheetDetlList(sheetDetls);
+        return pickDetlDto;
+    }
 
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean confirmFlatSheet(String code) {
+        PickSheet pickSheet = pickSheetService.getOne(new LambdaQueryWrapper<PickSheet>().eq(PickSheet::getPickNo, code));
+        if (pickSheet.getStatus() == 1) {
+            //鐘舵�佷慨鏀逛负锛� 宸茶浆鍘嗗彶妗�
+            pickSheet.setStatus(3);
+            if (!pickSheetService.updateById(pickSheet)) {
+                throw new CoolException("杞巻鍙叉。澶辫触锛侊紒");
+            } else{
+                if (!pickSheetDetlService.update(new LambdaUpdateWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, pickSheet.getId()).set(PickSheetDetl::getStatus, 3))) {
+                    throw new CoolException("鎷h揣鍗曟槑缁嗚浆鍘嗗彶妗eけ璐ワ紒锛�");
+                }
+            }
+        } else {
+            throw new CoolException("璇峰嬁鎿嶄綔鍘嗗彶妗f暟鎹紒锛�");
+        }
+        List<PickSheetDetl> sheetDetls = pickSheetDetlService.list(new LambdaQueryWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, pickSheet.getId()));
+        Map<Long, List<PickSheetDetl>> listMap = sheetDetls.stream().collect(Collectors.groupingBy(PickSheetDetl::getLocId));
+        listMap.keySet().forEach(key -> {
+            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key));
+            listMap.get(key).forEach(pickDetl -> {
+                LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, pickDetl.getLocDetlId()));
+                if (Objects.isNull(detl)) {
+                    throw new CoolException("鏁版嵁閿欒锛侊紒");
+                }
+                //鏇存柊閿佸畾搴撳瓨
+                BigDecimal workQty = BigDecimal.valueOf(detl.getAnfme()).subtract(pickDetl.getAnfme());
+                detl.setWorkQty(workQty.doubleValue());
+                //璁$畻缁撴灉灏忎簬绛変簬闆讹紝绉诲嚭搴撳瓨鏄庣粏
+                BigDecimal qty = BigDecimal.valueOf(detl.getAnfme()).subtract(pickDetl.getAnfme());
+                detl.setAnfme(qty.doubleValue());
+                if (qty.compareTo(new BigDecimal("0.00")) <= 0) {
+                    detl.setDeleted(1);
+                    if (!locDetlService.removeById(detl)) {
+                        throw new CoolException("搴撳瓨鏄庣粏鍒犻櫎澶辫触锛侊紒");
+                    }
+                } else { //缁撴灉澶т簬闆讹紝鏇存柊搴撳瓨鏄庣粏
+                    if (!locDetlService.updateById(detl)) {
+                        throw new CoolException("搴撳瓨鏄庣粏鏇存柊澶辫触锛侊紒");
+                    }
+                }
+            });
+            /**鏄庣粏鏇存柊瀹屾垚鍚庯紝鍒ゆ柇鏄惁涓虹┖锛屼负绌烘洿鏂颁富鍗曠姸鎬佷负绌哄簱锛屾嫋鐩樼爜娓呯┖锛屼笉涓虹┖涓嶅仛鏇存柊**/
+            List<LocDetl> list = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, loc.getId()).eq(LocDetl::getDeleted, 0));
+            if (list.isEmpty()) {
+                boolean update = locService.update(new LambdaUpdateWrapper<Loc>()
+                        .eq(Loc::getId, loc.getId())
+                        .set(Loc::getBarcode, null)
+                        .set(Loc::getUpdateTime, new Date())
+                        .set(Loc::getLocStsId, LocStsType.O.val()));
+                if (update) {
+                    throw new CoolException("搴撳瓨鏇存柊澶辫触锛侊紒 ");
+                }
+            }
+        });
+        return true;
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetDetlServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetDetlServiceImpl.java
new file mode 100644
index 0000000..73ae30c
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetDetlServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+import com.zy.asrs.wms.asrs.mapper.ManPickSheetDetlMapper;
+import com.zy.asrs.wms.asrs.service.PickSheetDetlService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PickSheetDetlServiceImpl extends ServiceImpl<ManPickSheetDetlMapper, PickSheetDetl> implements PickSheetDetlService {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java
index 11d1800..5f2a4cf 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java
@@ -1,12 +1,72 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zy.asrs.wms.asrs.entity.PickSheet;
+import com.zy.asrs.wms.asrs.entity.PickSheetDetl;
+import com.zy.asrs.wms.asrs.entity.param.PageRequest;
+import com.zy.asrs.wms.asrs.mapper.ManPickSheetDetlMapper;
 import com.zy.asrs.wms.asrs.mapper.ManPickSheetMapper;
 import com.zy.asrs.wms.asrs.service.PickSheetService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
 
 @Service
 public class PickSheetServiceImpl extends ServiceImpl<ManPickSheetMapper, PickSheet> implements PickSheetService {
 
+    @Autowired
+    private ManPickSheetDetlMapper pickSheetDetlMapper;
+
+    /**
+     * 鑾峰彇鎷h揣鍗曞垪琛�
+     * @param params
+     * @return
+     */
+    @Override
+    public IPage<PickSheet> getOutFlatSheet(PageRequest params) {
+        LambdaQueryWrapper<PickSheet> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(PickSheet::getDeleted, 0).eq(PickSheet::getStatus, 1);
+        if (!Objects.isNull(params.getParams())) {
+            lambdaQueryWrapper.eq(!Objects.isNull(params.getParams().get("pickNo")),PickSheet::getPickNo, params.getParams().get("pickNo"))
+                    .eq(!Objects.isNull(params.getParams().get("id")), PickSheet::getId, params.getParams().get("id"))
+                    .eq(!Objects.isNull(params.getParams().get("waveNo")), PickSheet::getWaveNo, params.getParams().get("waveNo"));
+        }
+        return this.baseMapper.selectMapsPage(params.getPage(), lambdaQueryWrapper);
+    }
+
+    /**
+     * 鑾峰彇鎷h揣鍗曟槑缁�
+     * @param pageRequest
+     * @return
+     */
+    @Override
+    public IPage<PickSheetDetl> getSheetDetl(PageRequest pageRequest) {
+        LambdaQueryWrapper<PickSheetDetl> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(PickSheetDetl::getDeleted, 0).eq(PickSheetDetl::getStatus, 1);
+        if (!Objects.isNull(pageRequest.getParams())) {
+            lambdaQueryWrapper.eq(!Objects.isNull(pageRequest.getParams().get("maktx")),PickSheetDetl::getMaktx, pageRequest.getParams().get("maktx"))
+                    .eq(!Objects.isNull(pageRequest.getParams().get("batch")), PickSheetDetl::getBatch, pageRequest.getParams().get("batch"))
+                    .eq(!Objects.isNull(pageRequest.getParams().get("mantr")), PickSheetDetl::getMatnr, pageRequest.getParams().get("mantr"))
+                    .eq(!Objects.isNull(pageRequest.getParams().get("locNo")), PickSheetDetl::getLocNo, pageRequest.getParams().get("locNo"))
+                    .eq(!Objects.isNull(pageRequest.getParams().get("pickId")), PickSheetDetl::getPickId, pageRequest.getParams().get("pickId"))
+                    .eq(!Objects.isNull(pageRequest.getParams().get("barcode")), PickSheetDetl::getBarcode, pageRequest.getParams().get("barcode"));
+        }
+        return pickSheetDetlMapper.selectMapsPage(pageRequest.getPage(), lambdaQueryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removePickSheet(Long id) {
+        if (this.update(new LambdaUpdateWrapper<PickSheet>().eq(PickSheet::getId, id).set(PickSheet::getDeleted, 1))) {
+            return pickSheetDetlMapper.update(new LambdaUpdateWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, id).set(PickSheetDetl::getDeleted, 1));
+        }
+        return 0;
+    }
+
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java
index 1617c79..9145e52 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java
@@ -1,6 +1,8 @@
 package com.zy.asrs.wms.common.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.Data;
 
 import java.io.Serializable;
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml
index 1506ddd..2b964bb 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml
@@ -4,8 +4,6 @@
   <resultMap id="BaseResultMap" type="com.zy.asrs.wms.asrs.entity.PickSheetDetl">
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="pick_id" jdbcType="BIGINT" property="pickId" />
-    <result column="order_id" jdbcType="BIGINT" property="orderId" />
-    <result column="order_detl_id" jdbcType="BIGINT" property="orderDetlId" />
     <result column="mat_id" jdbcType="BIGINT" property="matId" />
     <result column="loc_id" jdbcType="BIGINT" property="locId" />
     <result column="maktx" jdbcType="VARCHAR" property="maktx" />
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml
index c5d442c..ea7001b 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml
@@ -21,4 +21,5 @@
     created_by, updated_by, `status`, deleted
   </sql>
 
+
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1