From 298b5c1e9aad4d64a160c35262320988671489eb Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@63.com>
Date: 星期三, 19 十月 2022 16:18:26 +0800
Subject: [PATCH] Merge branches 'bfasrs' and 'ynasrs' of http://47.97.1.152:5880/r/zy-asrs into ynasrs

---
 src/main/java/com/zy/asrs/controller/BasSteErrLogController.java    |  127 +
 src/main/java/com/zy/asrs/service/OrderService.java                 |    8 
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java                 |    1 
 src/main/java/com/zy/asrs/service/BasSteErrLogService.java          |    8 
 src/main/resources/mapper/LocMastMapper.xml                         |   37 
 src/main/java/com/zy/asrs/entity/WrkCharge.java                     |  361 ++++
 src/main/webapp/static/js/wrkMast/wrkMast.js                        |   11 
 src/main/webapp/static/js/wrkCharge/wrkCharge.js                    |  342 ++++
 src/main/java/com/zy/asrs/controller/WrkChargeController.java       |  144 +
 src/main/java/com/zy/asrs/service/OrderDetlService.java             |    3 
 src/main/java/com/zy/asrs/utils/Utils.java                          |  389 ++++
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java         |  220 ++
 src/main/java/com/zy/asrs/task/ErrorStockScheduler.java             |   18 
 src/main/java/com/zy/asrs/mapper/LocMastMapper.java                 |    2 
 src/main/resources/mapper/MatMapper.xml                             |    3 
 src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java |   12 
 src/main/java/com/zy/asrs/controller/MatController.java             |   17 
 src/main/webapp/static/js/common.js                                 |   28 
 src/main/java/com/zy/common/service/CommonService.java              |  123 +
 src/main/webapp/static/js/basSte/basSte.js                          |    1 
 src/main/java/com/zy/asrs/service/MatService.java                   |    2 
 src/main/java/com/zy/common/model/OrderMergeVo.java                 |   54 
 src/main/webapp/static/js/basSteErrLog/basSteErrLog.js              |  285 +++
 src/main/webapp/views/wrkMast/wrkMast.html                          |    5 
 src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java      |    2 
 src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java               |    4 
 src/main/java/com/zy/asrs/service/impl/WrkChargeServiceImpl.java    |   12 
 src/main/java/com/zy/common/model/LocDto.java                       |    2 
 src/main/java/com/zy/common/CodeBuilder.java                        |    4 
 src/main/resources/mapper/BasSteMapper.xml                          |    1 
 src/main/java/com/zy/asrs/service/WrkChargeService.java             |    8 
 src/main/resources/mapper/OrderDetlMapper.xml                       |   25 
 src/main/webapp/static/js/orderTable.js                             |    2 
 src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java        |   41 
 src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java      |   66 
 src/main/resources/mapper/BasSteErrLogMapper.xml                    |   32 
 src/main/java/com/zy/asrs/entity/BasSteErrLog.java                  |  316 ++++
 src/main/webapp/static/js/order/order.js                            |   54 
 src/main/webapp/views/order/out.html                                |   34 
 src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java      |    8 
 src/main/java/com/zy/common/web/BaseController.java                 |   14 
 src/main/webapp/views/mat/mat.html                                  |   78 
 src/main/java/com/zy/common/web/WcsController.java                  |   28 
 pom.xml                                                             |    2 
 src/main/java/com/zy/asrs/controller/WorkController.java            |    9 
 src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java          |    4 
 src/main/webapp/views/order/order.html                              |    7 
 src/main/java/com/zy/common/CodeRes.java                            |    3 
 src/main/webapp/static/js/order/out.js                              |  481 ++++-
 src/main/java/com/zy/asrs/entity/BasSte.java                        |   29 
 src/main/java/com/zy/asrs/mapper/MatMapper.java                     |    2 
 src/main/webapp/views/stoMan/stoQue.html                            |    5 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java       |   14 
 src/main/resources/mapper/WrkChargeMapper.xml                       |   32 
 src/main/java/com/zy/asrs/controller/OutController.java             |   99 +
 src/main/java/com/zy/asrs/service/WorkService.java                  |    8 
 src/main/java/com/zy/asrs/controller/OrderController.java           |  143 +
 src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java      |   77 
 src/main/resources/mapper/WrkMastMapper.xml                         |   22 
 src/main/webapp/views/basSte/basSte.html                            |    6 
 src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java          |   13 
 src/main/webapp/static/js/locDetl/locDetl.js                        |    2 
 src/main/java/com/zy/asrs/service/WrkMastService.java               |    6 
 src/main/java/com/zy/common/web/param/SearchLocParam.java           |    2 
 src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java            |   12 
 src/main/webapp/views/wrkCharge/wrkCharge.html                      |  301 +++
 src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java    |   10 
 src/main/java/com/zy/asrs/mapper/WrkMastMapper.java                 |   11 
 src/main/java/com/zy/asrs/mapper/WrkChargeMapper.java               |   12 
 src/main/webapp/views/basSteErrLog/basSteErrLog.html                |  254 +++
 src/main/java/com/zy/asrs/service/LocMastService.java               |    5 
 src/main/resources/application.yml                                  |   11 
 72 files changed, 4,143 insertions(+), 371 deletions(-)

diff --git a/pom.xml b/pom.xml
index 9da0a81..aafbbb1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,7 +106,7 @@
     </dependencies>
 
     <build>
-        <finalName>ynwms</finalName>
+        <finalName>bfwms</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/zy/asrs/controller/BasSteErrLogController.java b/src/main/java/com/zy/asrs/controller/BasSteErrLogController.java
new file mode 100644
index 0000000..3bc7482
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/BasSteErrLogController.java
@@ -0,0 +1,127 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.BasSteErrLog;
+import com.zy.asrs.service.BasSteErrLogService;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class BasSteErrLogController extends BaseController {
+
+    @Autowired
+    private BasSteErrLogService basSteErrLogService;
+
+    @RequestMapping(value = "/basSteErrLog/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(basSteErrLogService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/basSteErrLog/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<BasSteErrLog> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(BasSteErrLog.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(basSteErrLogService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/basSteErrLog/add/auth")
+    @ManagerAuth
+    public R add(BasSteErrLog basSteErrLog) {
+        basSteErrLogService.insert(basSteErrLog);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/basSteErrLog/update/auth")
+	@ManagerAuth
+    public R update(BasSteErrLog basSteErrLog){
+        if (Cools.isEmpty(basSteErrLog) || null==basSteErrLog.getId()){
+            return R.error();
+        }
+        basSteErrLogService.updateById(basSteErrLog);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/basSteErrLog/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            basSteErrLogService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/basSteErrLog/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<BasSteErrLog> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("basSteErrLog"));
+        convert(map, wrapper);
+        List<BasSteErrLog> list = basSteErrLogService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/basSteErrLogQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<BasSteErrLog> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<BasSteErrLog> page = basSteErrLogService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (BasSteErrLog basSteErrLog : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", basSteErrLog.getId());
+            map.put("value", basSteErrLog.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/basSteErrLog/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<BasSteErrLog> wrapper = new EntityWrapper<BasSteErrLog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != basSteErrLogService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(BasSteErrLog.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/MatController.java b/src/main/java/com/zy/asrs/controller/MatController.java
index 3e12304..66fabfa 100644
--- a/src/main/java/com/zy/asrs/controller/MatController.java
+++ b/src/main/java/com/zy/asrs/controller/MatController.java
@@ -57,12 +57,23 @@
         return R.ok().add(mats);
     }
 
+    @RequestMapping(value = "/mat/list/pda/page/auth")
+    @ManagerAuth
+    public R pdaPageList(@RequestParam(required = true)Long tagId,
+                         @RequestParam(defaultValue = "1")Integer curr,
+                         @RequestParam(defaultValue = "10")Integer limit){
+        EntityWrapper<Mat> wrapper = new EntityWrapper<>();
+        wrapper.eq("tag_id", tagId);
+        wrapper.orderBy("create_time", false);
+        return R.ok().add(matService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
     @RequestMapping(value = "/mat/search/pda/auth")
     @ManagerAuth
     public R pdaSearch(@RequestParam(required = false)String condition){
         EntityWrapper<Mat> wrapper = new EntityWrapper<>();
         if (!Cools.isEmpty(condition)) {
-            wrapper.like("matnr", condition).or().like("maktx", condition);
+            wrapper.like("matnr", condition).or().like("maktx", condition).or().like("specs", condition);
         }
         wrapper.orderBy("create_time", false);
         List<Mat> mats = matService.selectList(wrapper);
@@ -95,7 +106,9 @@
         return R.ok(matService.getPage(new Page<>(curr, limit)
                 , String.valueOf(tagId)
                 , param.get("matnr")
-                , param.get("maktx"))
+                , param.get("maktx")
+                , param.get("specs")
+                )
         );
 
     }
diff --git a/src/main/java/com/zy/asrs/controller/OrderController.java b/src/main/java/com/zy/asrs/controller/OrderController.java
index de1f495..4741832 100644
--- a/src/main/java/com/zy/asrs/controller/OrderController.java
+++ b/src/main/java/com/zy/asrs/controller/OrderController.java
@@ -13,13 +13,24 @@
 import com.zy.asrs.service.*;
 import com.zy.common.model.DetlDto;
 import com.zy.common.web.BaseController;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 
+@Slf4j
 @RestController
 public class OrderController extends BaseController {
 
@@ -39,6 +50,8 @@
     private WrkMastLogService wrkMastLogService;
     @Autowired
     private LocDetlService locDetlService;
+    @Autowired
+    private MatService matService;
 
     @RequestMapping(value = "/order/nav/list/auth")
     @ManagerAuth
@@ -391,4 +404,134 @@
         return R.ok();
     }
 
+    /*************************************** 鏁版嵁鐩稿叧 ***********************************************/
+
+    /**
+     * excel瀵煎叆
+     */
+    @PostMapping(value = "/order/excel/import/auth")
+    @ManagerAuth(memo = "閿�鍞崟Excel瀵煎叆")
+    @Transactional
+    public R cstmrExcelImport(MultipartFile file) throws IOException {
+        InputStream inStream = file.getInputStream();
+        String fileMime = file.getContentType();
+        int excelVersion = 2007;
+        if ("application/vnd.ms-excel".equals(fileMime)) {
+            excelVersion = 2003;
+        }
+        Workbook book = null;
+        try {
+            if (excelVersion == 2003) {
+                book = new HSSFWorkbook(inStream);
+            }
+            else {  // 褰� excel 鏄� 2007 鏃�
+                book = new XSSFWorkbook(inStream);
+            }
+        } catch (Exception e) {
+            log.error("fail", e);
+            return R.error("瀵煎叆鏂囦欢鏍煎紡閿欒锛岃浣跨敤xls鍚庣紑鐨勬枃浠讹紒");
+        }
+
+        Sheet sheet = book.getSheetAt(0);
+        int totalRows = sheet.getLastRowNum() + 1;    // 鎬�
+        Long userId = getUserId();
+        Date now = new Date();
+        DataFormatter dataFormatter = new DataFormatter();
+        for (int i = 1; i < totalRows; i++) {
+            Row row = sheet.getRow(i);
+            // 璁㈠崟缂栧彿
+            String uuid = dataFormatter.formatCellValue(row.getCell(0));
+            // 鍟嗗搧鍚嶇О
+            String maktx = dataFormatter.formatCellValue(row.getCell(1));
+            // 鍟嗗搧缂栫爜
+            String matnr = dataFormatter.formatCellValue(row.getCell(2));
+            // 鏁伴噺
+            Double anfme = Double.parseDouble(dataFormatter.formatCellValue(row.getCell(3)));
+            // 涓嬪崟鏃堕棿
+            String timeStr = dataFormatter.formatCellValue(row.getCell(4));
+            Date time = null;
+            try {
+                time = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss_F);
+            } catch (Exception e) {
+                throw new CoolException("绗�" + i + "琛屼笅鐨勯偅鏃堕棿瑙f瀽澶辫触锛岃閲嶆柊瀵煎叆锛�");
+            }
+            // 鍟嗗搧绯诲垪
+            String tagName = dataFormatter.formatCellValue(row.getCell(5));
+            // 瑙勬牸
+            String specs = dataFormatter.formatCellValue(row.getCell(6));
+
+            Mat mat = matService.selectByMatnr(matnr);
+            if (null == mat) {
+                throw new CoolException(matnr + "鍟嗗搧缂栫爜鐨勫晢鍝佷笉瀛樺湪锛岃閲嶆柊瀵煎叆锛�");
+            }
+
+            Order order = orderService.selectByNo(uuid);
+            if (null == order) {
+                order = new Order(
+                        String.valueOf(snowflakeIdWorker.nextId()),    // 缂栧彿[闈炵┖]
+                        uuid,    // 璁㈠崟缂栧彿
+                        timeStr,    // 鍗曟嵁鏃ユ湡
+                        14L,    // 鍗曟嵁绫诲瀷
+                        null,    // 椤圭洰缂栧彿
+                        null,    //
+                        null,    // 璋冩嫧椤圭洰缂栧彿
+                        null,    // 鍒濆绁ㄦ嵁鍙�
+                        null,    // 绁ㄦ嵁鍙�
+                        null,    // 瀹㈡埛缂栧彿
+                        null,    // 瀹㈡埛
+                        null,    // 鑱旂郴鏂瑰紡
+                        null,    // 鎿嶄綔浜哄憳
+                        null,    // 鍚堣閲戦
+                        null,    // 浼樻儬鐜�
+                        null,    // 浼樻儬閲戦
+                        null,    // 閿�鍞垨閲囪喘璐圭敤鍚堣
+                        null,    // 瀹炰粯閲戦
+                        null,    // 浠樻绫诲瀷
+                        null,    // 涓氬姟鍛�
+                        null,    // 缁撶畻澶╂暟
+                        null,    // 閭垂鏀粯绫诲瀷
+                        null,    // 閭垂
+                        null,    // 浠樻鏃堕棿
+                        null,    // 鍙戣揣鏃堕棿
+                        null,    // 鐗╂祦鍚嶇О
+                        null,    // 鐗╂祦鍗曞彿
+                        1L,    // 璁㈠崟鐘舵��
+                        1,    // 鐘舵��
+                        userId,    // 娣诲姞浜哄憳
+                        now,    // 娣诲姞鏃堕棿
+                        userId,    // 淇敼浜哄憳
+                        now,    // 淇敼鏃堕棿
+                        null    // 澶囨敞
+                );
+                if (!orderService.insert(order)) {
+                    throw new CoolException("鐢熸垚鍗曟嵁涓绘。澶辫触锛岃閲嶆柊瀵煎叆锛�");
+                }
+            }
+
+            OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), matnr, null);
+            if (orderDetl == null) {
+                orderDetl = new OrderDetl();
+                orderDetl.sync(mat);
+                orderDetl.setBatch(null);
+                orderDetl.setAnfme(anfme);
+                orderDetl.setOrderId(order.getId());
+                orderDetl.setOrderNo(order.getOrderNo());
+                orderDetl.setCreateBy(userId);
+                orderDetl.setCreateTime(now);
+                orderDetl.setUpdateBy(userId);
+                orderDetl.setUpdateTime(now);
+                orderDetl.setStatus(1);
+                orderDetl.setQty(0.0D);
+                if (!orderDetlService.insert(orderDetl)) {
+                    throw new CoolException("鐢熸垚鍗曟嵁鏄庣粏澶辫触锛岃閲嶆柊瀵煎叆锛�");
+                }
+            } else {
+                if(!orderDetlService.increaseAnfme(order.getId(), matnr, null, anfme)) {
+                    throw new CoolException("鐢熸垚鍗曟嵁鏄庣粏澶辫触锛岃閲嶆柊瀵煎叆锛�");
+                }
+            }
+        }
+        return R.ok("瀵煎叆鎴愬姛");
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/OutController.java b/src/main/java/com/zy/asrs/controller/OutController.java
index b625d86..14b79e7 100644
--- a/src/main/java/com/zy/asrs/controller/OutController.java
+++ b/src/main/java/com/zy/asrs/controller/OutController.java
@@ -1,5 +1,7 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.annotations.ManagerAuth;
 import com.core.common.BaseRes;
 import com.core.common.Cools;
@@ -8,13 +10,12 @@
 import com.zy.asrs.service.*;
 import com.zy.common.model.LocDto;
 import com.zy.common.model.OrderDto;
+import com.zy.common.model.OrderMergeVo;
 import com.zy.common.model.TaskDto;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -40,6 +41,8 @@
     private WorkService workService;
     @Autowired
     private BasDevpService basDevpService;
+    @Autowired
+    private MatService matService;
 
     @PostMapping("/out/pakout/orderDetlIds/auth")
     @ManagerAuth
@@ -67,7 +70,8 @@
                 if (issued > 0) {
                     LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                             issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
-                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
+                    int ioType = (issued >= locDetl.getAnfme() && locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo())) == 1) ? 101 : 103;
+                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
                     locDto.setStaNos(staNos);
                     locDtos.add(locDto);
                     exist.add(locDetl.getLocNo());
@@ -88,6 +92,7 @@
 
     @PostMapping("/out/pakout/auth")
     @ManagerAuth(memo = "璁㈠崟鍑哄簱")
+    @Transactional
     public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
         if (Cools.isEmpty(locDtos)) {
             return R.parse(BaseRes.PARAM);
@@ -108,14 +113,29 @@
         // 璁㈠崟棰勬牎楠�  ===>> 1.璁㈠崟鐘舵�侊紱 2.璁㈠崟甯﹀嚭鏁伴噺
         List<OrderDto> orderDtos = new ArrayList<>();
         for (LocDto locDto : locDtos) {
-            if (Cools.isEmpty(locDto.getOrderNo())) { continue; }
-            OrderDto orderDto = new OrderDto(locDto.getOrderNo(), locDto.getMatnr(), locDto.getAnfme());
-            if (OrderDto.has(orderDtos, orderDto)) {
-                OrderDto dto = OrderDto.find(orderDtos, orderDto);
-                assert dto != null;
-                dto.setAnfme(dto.getAnfme() + orderDto.getAnfme());
+            if (!isJSON(locDto.getOrderNo())) {
+                if (Cools.isEmpty(locDto.getOrderNo())) { continue; }
+                OrderDto orderDto = new OrderDto(locDto.getOrderNo(), locDto.getMatnr(), locDto.getAnfme());
+                if (OrderDto.has(orderDtos, orderDto)) {
+                    OrderDto dto = OrderDto.find(orderDtos, orderDto);
+                    assert dto != null;
+                    dto.setAnfme(dto.getAnfme() + orderDto.getAnfme());
+                } else {
+                    orderDtos.add(orderDto);
+                }
             } else {
-                orderDtos.add(orderDto);
+                // 璁㈠崟鍚堝苟鍑哄簱
+                List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
+                for (OrderDto one : orderDtoList) {
+                    OrderDto orderDto = new OrderDto(one.getOrderNo(), locDto.getMatnr(), one.getAnfme());
+                    if (OrderDto.has(orderDtos, orderDto)) {
+                        OrderDto dto = OrderDto.find(orderDtos, orderDto);
+                        assert dto != null;
+                        dto.setAnfme(dto.getAnfme() + orderDto.getAnfme());
+                    } else {
+                        orderDtos.add(orderDto);
+                    }
+                }
             }
         }
         for (OrderDto orderDto : orderDtos) {
@@ -148,12 +168,67 @@
                 taskDtos.add(taskDto);
             }
         }
+
         // -----------------------------------------------------------------------------------------------
+        List<String> excludeLocNos = taskDtos.stream().map(TaskDto::getLocNo).distinct().collect(Collectors.toList());
         for (TaskDto taskDto : taskDtos) {
             BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
             workService.stockOut(staNo, taskDto, getUserId());
+            locMastService.breakUp(taskDto.getLocNo(), excludeLocNos);
         }
         return R.ok();
     }
 
+
+    /**
+     * 鍚堝苟璁㈠崟姹囨�婚瑙�
+     */
+    @RequestMapping(value = "/order/merge/preview/auth")
+    @ManagerAuth
+    public R mergePreview(@RequestParam(value = "orderIds[]") List<Long> orderIds){
+        return R.ok().add(orderService.mergePreview(orderIds));
+    }
+
+    @PostMapping("/out/pakout/preview/merge/auth")
+    @ManagerAuth
+    public R pakoutPreviewMerge(@RequestBody List<OrderMergeVo> list) {
+        if (Cools.isEmpty(list)) {
+            return R.parse(BaseRes.PARAM);
+        }
+        Set<String> exist = new HashSet<>();
+        List<LocDto> locDtos = new ArrayList<>();
+
+        for (OrderMergeVo vo : list) {
+            double issued = Optional.of(vo.getAnfme()).orElse(0.0D);
+            if (issued <= 0.0D) { continue; }
+            List<LocDetl> locDetls = locDetlService.queryStock(vo.getMatnr(), vo.getBatch(), null, exist);
+            for (LocDetl locDetl : locDetls) {
+                if (issued > 0) {
+                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), JSON.toJSONString(vo.getOrderDtos()),
+                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
+                    int ioType = (issued >= locDetl.getAnfme() && locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo())) == 1) ? 101 : 103;
+                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
+                    locDto.setStaNos(staNos);
+                    locDtos.add(locDto);
+                    exist.add(locDetl.getLocNo());
+                    // 鍓╀綑寰呭嚭鏁伴噺閫掑噺
+                    issued = issued - locDetl.getAnfme();
+                } else {
+                    break;
+                }
+            }
+            if (issued > 0) {
+                LocDto locDto = new LocDto(null, vo.getMatnr(), vo.getMaktx(), vo.getBatch(), JSON.toJSONString(vo.getOrderDtos()), issued);
+                locDto.setLack(Boolean.TRUE);
+                locDtos.add(locDto);
+            }
+        }
+        for (LocDto locDto : locDtos) {
+            Mat mat = matService.selectByMatnr(locDto.getMatnr());
+            assert mat != null;
+            locDto.setSpecs(mat.getSpecs());
+        }
+        return R.ok().add(locDtos);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/WorkController.java b/src/main/java/com/zy/asrs/controller/WorkController.java
index eae764b..5eb4ebf 100644
--- a/src/main/java/com/zy/asrs/controller/WorkController.java
+++ b/src/main/java/com/zy/asrs/controller/WorkController.java
@@ -9,6 +9,7 @@
 import com.zy.asrs.entity.param.StockOutParam;
 import com.zy.asrs.service.BasDevpService;
 import com.zy.asrs.service.WorkService;
+import com.zy.asrs.service.WrkMastService;
 import com.zy.common.model.StartupDto;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +34,8 @@
     private WorkService workService;
     @Autowired
     private BasDevpService basDevpService;
+    @Autowired
+    private WrkMastService wrkMastService;
 
     @RequestMapping("/available/put/site")
     @ManagerAuth()
@@ -158,4 +161,10 @@
         return R.ok("浠诲姟閲嶆柊鍏ュ簱锛岀洰鏍囧簱浣嶏細" + locNo);
     }
 
+    @RequestMapping("/deal/steNo/empty")
+    @ManagerAuth(memo = "娓呴櫎灏忚溅")
+    public R dealSteNoEmpty(@RequestParam Integer wrkNo) {
+        return wrkMastService.setSteEmpty(wrkNo)?R.ok():R.error();
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/WrkChargeController.java b/src/main/java/com/zy/asrs/controller/WrkChargeController.java
new file mode 100644
index 0000000..10777cc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/WrkChargeController.java
@@ -0,0 +1,144 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.WrkCharge;
+import com.zy.asrs.service.WrkChargeService;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class WrkChargeController extends BaseController {
+
+    @Autowired
+    private WrkChargeService wrkChargeService;
+
+    @RequestMapping(value = "/wrkCharge/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(wrkChargeService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/wrkCharge/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<WrkCharge> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(WrkCharge.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
+            wrapper.orderBy("appe_time", false);
+        }
+        return R.ok(wrkChargeService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/wrkCharge/add/auth")
+    @ManagerAuth
+    public R add(WrkCharge wrkCharge) {
+        wrkChargeService.insert(wrkCharge);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/wrkCharge/update/auth")
+	@ManagerAuth
+    public R update(WrkCharge wrkCharge){
+        if (Cools.isEmpty(wrkCharge) || null==wrkCharge.getWrkNo()){
+            return R.error();
+        }
+        wrkChargeService.updateById(wrkCharge);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/wrkCharge/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Integer[] ids){
+         for (Integer id : ids){
+            wrkChargeService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/wrkCharge/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<WrkCharge> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("wrkCharge"));
+        convert(map, wrapper);
+        List<WrkCharge> list = wrkChargeService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/wrkChargeQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<WrkCharge> wrapper = new EntityWrapper<>();
+        wrapper.like("wrk_no", condition);
+        Page<WrkCharge> page = wrkChargeService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (WrkCharge wrkCharge : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", wrkCharge.getWrkNo());
+            map.put("value", wrkCharge.getWrkNo());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/wrkCharge/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<WrkCharge> wrapper = new EntityWrapper<WrkCharge>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != wrkChargeService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(WrkCharge.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/wrkCharge/truncate/charge/auth")
+    @ManagerAuth
+    public R truncateCharge() {
+        wrkChargeService.delete(new EntityWrapper<WrkCharge>().eq("memo", "charge"));
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/wrkCharge/truncate/demo/auth")
+    @ManagerAuth
+    public R truncateMemo() {
+        wrkChargeService.delete(new EntityWrapper<WrkCharge>().eq("memo", "demo"));
+        return R.ok();
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasSte.java b/src/main/java/com/zy/asrs/entity/BasSte.java
index fb54c42..cd557b1 100644
--- a/src/main/java/com/zy/asrs/entity/BasSte.java
+++ b/src/main/java/com/zy/asrs/entity/BasSte.java
@@ -1,24 +1,20 @@
 package com.zy.asrs.entity;
 
-import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
-import com.baomidou.mybatisplus.enums.IdType;
 import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
 import com.core.common.SpringUtils;
-import com.zy.system.service.UserService;
 import com.zy.system.entity.User;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import org.springframework.format.annotation.DateTimeFormat;
-import com.core.common.SpringUtils;
 import com.zy.system.service.UserService;
-import com.zy.system.entity.User;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import com.baomidou.mybatisplus.annotations.TableName;
+import org.springframework.format.annotation.DateTimeFormat;
+
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 @Data
 @TableName("asr_bas_ste")
@@ -130,7 +126,14 @@
     private String pakMk;
 
     /**
-     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     * 鏈�浣庣數閲�
+     */
+    @ApiModelProperty(value= "鏈�浣庣數閲�")
+    @TableField("charge_line")
+    private String chargeLine;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
      */
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
     private Integer status;
diff --git a/src/main/java/com/zy/asrs/entity/BasSteErrLog.java b/src/main/java/com/zy/asrs/entity/BasSteErrLog.java
new file mode 100644
index 0000000..2f53459
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasSteErrLog.java
@@ -0,0 +1,316 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.BasWrkStatusService;
+import com.zy.asrs.entity.BasWrkStatus;
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.BasWrkIotypeService;
+import com.zy.asrs.entity.BasWrkIotype;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.core.common.SpringUtils;
+import com.zy.system.service.UserService;
+import com.zy.system.entity.User;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.core.common.SpringUtils;
+import com.zy.system.service.UserService;
+import com.zy.system.entity.User;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("asr_bas_ste_err_log")
+public class BasSteErrLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 宸ヤ綔鍙�
+     */
+    @ApiModelProperty(value= "宸ヤ綔鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 鍙戠敓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍙戠敓鏃堕棿")
+    @TableField("start_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    @TableField("end_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 宸ヤ綔鐘舵��
+     */
+    @ApiModelProperty(value= "宸ヤ綔鐘舵��")
+    @TableField("wrk_sts")
+    private Long wrkSts;
+
+    /**
+     * 鍏ュ嚭搴撶被鍨�
+     */
+    @ApiModelProperty(value= "鍏ュ嚭搴撶被鍨�")
+    @TableField("io_type")
+    private Integer ioType;
+
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    @TableField("ste_no")
+    private Integer steNo;
+
+    /**
+     * plc
+     */
+    @ApiModelProperty(value= "plc")
+    @TableField("plc_no")
+    private Integer plcNo;
+
+    /**
+     * 鐩爣搴撲綅
+     */
+    @ApiModelProperty(value= "鐩爣搴撲綅")
+    @TableField("loc_no")
+    private String locNo;
+
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    @TableField("sta_no")
+    private Integer staNo;
+
+    /**
+     * 婧愮珯
+     */
+    @ApiModelProperty(value= "婧愮珯")
+    @TableField("source_sta_no")
+    private Integer sourceStaNo;
+
+    /**
+     * 婧愬簱浣�
+     */
+    @ApiModelProperty(value= "婧愬簱浣�")
+    @TableField("source_loc_no")
+    private String sourceLocNo;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    /**
+     * 寮傚父鐮�
+     */
+    @ApiModelProperty(value= "寮傚父鐮�")
+    @TableField("err_code")
+    private Integer errCode;
+
+    /**
+     * 寮傚父
+     */
+    @ApiModelProperty(value= "寮傚父")
+    private String error;
+
+    /**
+     * 寮傚父鎯呭喌 1: 鏈鐞�  2: 宸蹭慨澶�  
+     */
+    @ApiModelProperty(value= "寮傚父鎯呭喌 1: 鏈鐞�  2: 宸蹭慨澶�  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public BasSteErrLog() {}
+
+    public BasSteErrLog(String uuid,Integer wrkNo,Date startTime,Date endTime,Long wrkSts,Integer ioType,Integer steNo,Integer plcNo,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String barcode,Integer errCode,String error,Integer status,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.uuid = uuid;
+        this.wrkNo = wrkNo;
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.wrkSts = wrkSts;
+        this.ioType = ioType;
+        this.steNo = steNo;
+        this.plcNo = plcNo;
+        this.locNo = locNo;
+        this.staNo = staNo;
+        this.sourceStaNo = sourceStaNo;
+        this.sourceLocNo = sourceLocNo;
+        this.barcode = barcode;
+        this.errCode = errCode;
+        this.error = error;
+        this.status = status;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    BasSteErrLog basSteErrLog = new BasSteErrLog(
+//            null,    // 缂栧彿
+//            null,    // 宸ヤ綔鍙�
+//            null,    // 鍙戠敓鏃堕棿
+//            null,    // 缁撴潫鏃堕棿
+//            null,    // 宸ヤ綔鐘舵��
+//            null,    // 鍏ュ嚭搴撶被鍨�
+//            null,    // 绌挎杞�
+//            null,    // plc
+//            null,    // 鐩爣搴撲綅
+//            null,    // 鐩爣绔�
+//            null,    // 婧愮珯
+//            null,    // 婧愬簱浣�
+//            null,    // 鏉$爜
+//            null,    // 寮傚父鐮�
+//            null,    // 寮傚父
+//            null,    // 寮傚父鎯呭喌
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getStartTime$(){
+        if (Cools.isEmpty(this.startTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
+    }
+
+    public String getEndTime$(){
+        if (Cools.isEmpty(this.endTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
+    }
+
+    public String getWrkSts$(){
+        BasWrkStatusService service = SpringUtils.getBean(BasWrkStatusService.class);
+        BasWrkStatus basWrkStatus = service.selectById(this.wrkSts);
+        if (!Cools.isEmpty(basWrkStatus)){
+            return String.valueOf(basWrkStatus.getWrkDesc());
+        }
+        return null;
+    }
+
+    public String getIoType$(){
+        BasWrkIotypeService service = SpringUtils.getBean(BasWrkIotypeService.class);
+        BasWrkIotype basWrkIotype = service.selectById(this.ioType);
+        if (!Cools.isEmpty(basWrkIotype)){
+            return String.valueOf(basWrkIotype.getIoDesc());
+        }
+        return null;
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "鏈鐞�";
+            case 2:
+                return "宸蹭慨澶�";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/WrkCharge.java b/src/main/java/com/zy/asrs/entity/WrkCharge.java
new file mode 100644
index 0000000..287839d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/WrkCharge.java
@@ -0,0 +1,361 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.*;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_wrk_charge")
+public class WrkCharge implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 宸ヤ綔鍙�
+     */
+    @ApiModelProperty(value= "宸ヤ綔鍙�")
+    @TableId(value = "wrk_no", type = IdType.INPUT)
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 鏍囪
+     */
+    @ApiModelProperty(value= "鏍囪")
+    private String mk;
+
+    /**
+     * 宸ヤ綔鐘舵��
+     */
+    @ApiModelProperty(value= "宸ヤ綔鐘舵��")
+    @TableField("wrk_sts")
+    private Long wrkSts;
+
+    /**
+     * 鍏ュ嚭搴撶被鍨�
+     */
+    @ApiModelProperty(value= "鍏ュ嚭搴撶被鍨�")
+    @TableField("io_type")
+    private Integer ioType;
+
+    /**
+     * 鍫嗗灈鏈�
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈�")
+    @TableField("crn_no")
+    private Integer crnNo;
+
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    @TableField("ste_no")
+    private Integer steNo;
+
+    /**
+     * 宸烽亾鍙�
+     */
+    @ApiModelProperty(value= "宸烽亾鍙�")
+    @TableField("out_most")
+    private Integer outMost;
+
+    /**
+     * 浼樺厛绾�
+     */
+    @ApiModelProperty(value= "浼樺厛绾�")
+    @TableField("io_pri")
+    private Double ioPri;
+
+    /**
+     * 鐩爣搴撲綅
+     */
+    @ApiModelProperty(value= "鐩爣搴撲綅")
+    @TableField("loc_no")
+    private String locNo;
+
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    @TableField("sta_no")
+    private Integer staNo;
+
+    /**
+     * 婧愮珯
+     */
+    @ApiModelProperty(value= "婧愮珯")
+    @TableField("source_sta_no")
+    private Integer sourceStaNo;
+
+    /**
+     * 婧愬簱浣�
+     */
+    @ApiModelProperty(value= "婧愬簱浣�")
+    @TableField("source_loc_no")
+    private String sourceLocNo;
+
+    /**
+     * 绌烘澘(checkBox)
+     */
+    @ApiModelProperty(value= "绌烘澘(checkBox)")
+    @TableField("empty_mk")
+    private String emptyMk;
+
+    /**
+     * 宸ヤ綔鏃堕棿
+     */
+    @ApiModelProperty(value= "宸ヤ綔鏃堕棿")
+    @TableField("io_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date ioTime;
+
+    /**
+     * 鍫嗗灈鏈哄惎鍔ㄦ椂闂�
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈哄惎鍔ㄦ椂闂�")
+    @TableField("crn_str_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date crnStrTime;
+
+    /**
+     * 鍫嗗灈鏈哄仠姝㈡椂闂�
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈哄仠姝㈡椂闂�")
+    @TableField("crn_end_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date crnEndTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private String modiUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date modiTime;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @ApiModelProperty(value= "鍒涘缓鑰�")
+    @TableField("appe_user")
+    private String appeUser;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date appeTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    public WrkCharge() {}
+
+    public WrkCharge(Integer wrkNo,String mk,Long wrkSts,Integer ioType,Integer crnNo,Integer steNo,Integer outMost,Double ioPri,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String emptyMk,Date ioTime,Date crnStrTime,Date crnEndTime,String modiUser,Date modiTime,String appeUser,Date appeTime,String memo,String barcode) {
+        this.wrkNo = wrkNo;
+        this.mk = mk;
+        this.wrkSts = wrkSts;
+        this.ioType = ioType;
+        this.crnNo = crnNo;
+        this.steNo = steNo;
+        this.outMost = outMost;
+        this.ioPri = ioPri;
+        this.locNo = locNo;
+        this.staNo = staNo;
+        this.sourceStaNo = sourceStaNo;
+        this.sourceLocNo = sourceLocNo;
+        this.emptyMk = emptyMk;
+        this.ioTime = ioTime;
+        this.crnStrTime = crnStrTime;
+        this.crnEndTime = crnEndTime;
+        this.modiUser = modiUser;
+        this.modiTime = modiTime;
+        this.appeUser = appeUser;
+        this.appeTime = appeTime;
+        this.memo = memo;
+        this.barcode = barcode;
+    }
+
+//    WrkCharge wrkCharge = new WrkCharge(
+//            null,    // 宸ヤ綔鍙穂闈炵┖]
+//            null,    // 鏍囪
+//            null,    // 宸ヤ綔鐘舵��
+//            null,    // 鍏ュ嚭搴撶被鍨�
+//            null,    // 鍫嗗灈鏈�
+//            null,    // 绌挎杞�
+//            null,    // 宸烽亾鍙�
+//            null,    // 浼樺厛绾�
+//            null,    // 鐩爣搴撲綅
+//            null,    // 鐩爣绔�
+//            null,    // 婧愮珯
+//            null,    // 婧愬簱浣�
+//            null,    // 绌烘澘(checkBox)
+//            null,    // 宸ヤ綔鏃堕棿
+//            null,    // 鍫嗗灈鏈哄惎鍔ㄦ椂闂�
+//            null,    // 鍫嗗灈鏈哄仠姝㈡椂闂�
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 鍒涘缓鑰�
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 澶囨敞
+//            null    // 鏉$爜
+//    );
+
+    public String getWrkSts$(){
+        BasWrkStatusService service = SpringUtils.getBean(BasWrkStatusService.class);
+        BasWrkStatus basWrkStatus = service.selectById(this.wrkSts);
+        if (!Cools.isEmpty(basWrkStatus)){
+            return String.valueOf(basWrkStatus.getWrkDesc());
+        }
+        return null;
+    }
+
+    public String getIoType$(){
+        BasWrkIotypeService service = SpringUtils.getBean(BasWrkIotypeService.class);
+        BasWrkIotype basWrkIotype = service.selectById(this.ioType);
+        if (!Cools.isEmpty(basWrkIotype)){
+            return String.valueOf(basWrkIotype.getIoDesc());
+        }
+        return null;
+    }
+
+    public String getCrnNo$(){
+        BasCrnpService service = SpringUtils.getBean(BasCrnpService.class);
+        BasCrnp basCrnp = service.selectById(this.crnNo);
+        if (!Cools.isEmpty(basCrnp)){
+            return String.valueOf(basCrnp.getCrnNo());
+        }
+        return null;
+    }
+
+    public String getSteNo$(){
+        BasSteService service = SpringUtils.getBean(BasSteService.class);
+        BasSte basSte = service.selectById(this.steNo);
+        if (!Cools.isEmpty(basSte)){
+            return String.valueOf(basSte.getSteNo());
+        }
+        return null;
+    }
+
+    public String getLocNo$(){
+        LocMastService service = SpringUtils.getBean(LocMastService.class);
+        LocMast locMast = service.selectById(this.locNo);
+        if (!Cools.isEmpty(locMast)){
+            return String.valueOf(locMast.getLocNo());
+        }
+        return null;
+    }
+
+    public String getStaNo$(){
+        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
+        BasDevp basDevp = service.selectById(this.staNo);
+        if (!Cools.isEmpty(basDevp)){
+            return String.valueOf(basDevp.getDevNo());
+        }
+        return null;
+    }
+
+    public String getSourceStaNo$(){
+        BasDevpService service = SpringUtils.getBean(BasDevpService.class);
+        BasDevp basDevp = service.selectById(this.sourceStaNo);
+        if (!Cools.isEmpty(basDevp)){
+            return String.valueOf(basDevp.getDevNo());
+        }
+        return null;
+    }
+
+    public String getSourceLocNo$(){
+        LocMastService service = SpringUtils.getBean(LocMastService.class);
+        LocMast locMast = service.selectById(this.sourceLocNo);
+        if (!Cools.isEmpty(locMast)){
+            return String.valueOf(locMast.getLocNo());
+        }
+        return null;
+    }
+
+    public String getIoTime$(){
+        if (Cools.isEmpty(this.ioTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
+    }
+
+    public String getCrnStrTime$(){
+        if (Cools.isEmpty(this.crnStrTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnStrTime);
+    }
+
+    public String getCrnEndTime$(){
+        if (Cools.isEmpty(this.crnEndTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnEndTime);
+    }
+
+    public String getModiUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.modiUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+    public String getAppeUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.appeUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getAppeTime$(){
+        if (Cools.isEmpty(this.appeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java b/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java
new file mode 100644
index 0000000..c31a2be
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.BasSteErrLog;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasSteErrLogMapper extends BaseMapper<BasSteErrLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index 50b548b..a0e6b4a 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -30,7 +30,6 @@
     @Update("update asr_loc_detl set loc_no = #{newLocNo}, modi_time=getDate() where loc_no = #{oldLocNo}")
     int updateLocNo(String newLocNo, String oldLocNo);
 
-    @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE 1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end}) AND lm.loc_sts = 'F' ORDER BY lm.modi_time ASC")
     List<String> selectSameDetl(@Param("matnr") String matnr, @Param("start") Integer start, @Param("end") Integer end);
 
     @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE (1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end})  AND lm.loc_sts = 'F' AND DateDiff(dd, lm.modi_time, getdate()) = 0) ORDER BY lm.modi_time ASC")
diff --git a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
index d448c40..2e3abcf 100644
--- a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -13,7 +13,7 @@
 @Repository
 public interface LocMastMapper extends BaseMapper<LocMast> {
 
-    LocMast queryFreeLocMast(@Param("row") Integer row, @Param("rows")  List<Integer> rows, @Param("locType1") Short locType1);
+    List<LocMast> queryFreeLocMast(@Param("rows") List<Integer> rows, @Param("rowsLen") Integer rowsLen, @Param("locType1") Short locType1);
 
     @Select("select loc_no from asr_loc_mast where 1=1 and loc_sts = 'O' and crn_no = #{crnNo}")
     List<String> queryGroupEmptyStock(Integer crnNo);
diff --git a/src/main/java/com/zy/asrs/mapper/MatMapper.java b/src/main/java/com/zy/asrs/mapper/MatMapper.java
index 22e0d28..d37ee63 100644
--- a/src/main/java/com/zy/asrs/mapper/MatMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/MatMapper.java
@@ -13,7 +13,7 @@
 @Repository
 public interface MatMapper extends BaseMapper<Mat> {
 
-    List<Mat> listByPage(Page page, @Param("tagId") String tagId, @Param("matnr") Object matnr,  @Param("maktx") Object maktx);
+    List<Mat> listByPage(Page page, @Param("tagId") String tagId, @Param("matnr") Object matnr,  @Param("maktx") Object maktx,  @Param("specs") Object specs);
 
     Mat selectByMatnr(@Param("matnr")String matnr);
 
diff --git a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
index 0c3a911..901910d 100644
--- a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -23,10 +23,14 @@
 
     Integer getPakoutPageCount(Map<String, Object> map);
 
+    int increaseAnfme(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
+
     int increase(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
 
     int decrease(@Param("orderNo")String orderNo, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
 
     int modifyStatus(@Param("orderId") Long orderId, @Param("status")Integer status);
 
+    List<OrderDetl> selectRemainder(@Param("orderId") Long orderId);
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/WrkChargeMapper.java b/src/main/java/com/zy/asrs/mapper/WrkChargeMapper.java
new file mode 100644
index 0000000..88d6451
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/WrkChargeMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.WrkCharge;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface WrkChargeMapper extends BaseMapper<WrkCharge> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
index dd349bd..5766e11 100644
--- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.zy.asrs.entity.WrkMast;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -16,4 +18,13 @@
 
     List<WrkMast> selectToBeHistoryData();
 
+    WrkMast selectByLocNoOfPakin(@Param("locNo") String locNo);
+
+    WrkMast selectBySourceLocNoOfPakout(@Param("sourceLocNo") String sourceLocNo);
+
+    @Update("update asr_wrk_mast set ste_no = null where wrk_no = #{wrkNo}")
+    int setSteEmpty(Integer wrkNo);
+
+    WrkMast selectOfPick(@Param("wrkNo") Integer wrkNo, @Param("ioType") Integer ioType);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/BasSteErrLogService.java b/src/main/java/com/zy/asrs/service/BasSteErrLogService.java
new file mode 100644
index 0000000..144aa69
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasSteErrLogService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.BasSteErrLog;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface BasSteErrLogService extends IService<BasSteErrLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/LocMastService.java b/src/main/java/com/zy/asrs/service/LocMastService.java
index ce77ce6..85e64e7 100644
--- a/src/main/java/com/zy/asrs/service/LocMastService.java
+++ b/src/main/java/com/zy/asrs/service/LocMastService.java
@@ -11,7 +11,7 @@
     /**
      * 妫�绱㈠彲鐢ㄥ簱浣�
      */
-    LocMast queryFreeLocMast(Integer row, List<Integer> rows, Short locType1);
+    List<LocMast> queryFreeLocMast(List<Integer> rows, Integer rowsLen, Short locType1);
 
     /**
      * 鑾峰彇鍚岀粍璐ф灦鐨勭┖搴撲綅
@@ -42,4 +42,7 @@
     // 鍚岀粍绌洪棽搴撲綅
     LocMast findOutMost(List<String> locNos);
 
+    // 瀵瑰悓缁勮揣鐗╄繘琛岀Щ搴撴搷浣�
+    void breakUp(String locNo, List<String> excludeLocNos);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/MatService.java b/src/main/java/com/zy/asrs/service/MatService.java
index 3b4b655..6e5e119 100644
--- a/src/main/java/com/zy/asrs/service/MatService.java
+++ b/src/main/java/com/zy/asrs/service/MatService.java
@@ -6,7 +6,7 @@
 
 public interface MatService extends IService<Mat> {
 
-    Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx);
+    Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx, Object specs);
 
     Mat selectByMatnr(String matnr);
 
diff --git a/src/main/java/com/zy/asrs/service/OrderDetlService.java b/src/main/java/com/zy/asrs/service/OrderDetlService.java
index 6178f0b..73740a9 100644
--- a/src/main/java/com/zy/asrs/service/OrderDetlService.java
+++ b/src/main/java/com/zy/asrs/service/OrderDetlService.java
@@ -18,10 +18,13 @@
 
     OrderDetl findByLook(List<OrderDetl> orderDetls, Long orderId, String matnr, String batch);
 
+    boolean increaseAnfme(Long orderId, String matnr, String batch, Double qty);
+
     boolean increase(Long orderId, String matnr, String batch, Double qty);
 
     boolean decrease(String orderNo, String matnr, String batch, Double qty);
 
     boolean modifyStatus(Long orderId, Integer status);
 
+    List<OrderDetl> selectRemainder(Long orderId);
 }
diff --git a/src/main/java/com/zy/asrs/service/OrderService.java b/src/main/java/com/zy/asrs/service/OrderService.java
index d29343c..f5b50e5 100644
--- a/src/main/java/com/zy/asrs/service/OrderService.java
+++ b/src/main/java/com/zy/asrs/service/OrderService.java
@@ -1,10 +1,11 @@
 package com.zy.asrs.service;
 
-import com.zy.asrs.entity.Order;
 import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.Order;
 import com.zy.asrs.entity.OrderDetl;
 import com.zy.asrs.entity.WrkDetl;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.common.model.OrderMergeVo;
 
 import java.util.List;
 
@@ -24,4 +25,9 @@
 
     List<Order> selectComplete();
 
+    /**
+     * 璁㈠崟鍚堝苟棰勮
+     */
+    List<OrderMergeVo> mergePreview(List<Long> ids);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/WorkService.java b/src/main/java/com/zy/asrs/service/WorkService.java
index 239535b..1c30ffb 100644
--- a/src/main/java/com/zy/asrs/service/WorkService.java
+++ b/src/main/java/com/zy/asrs/service/WorkService.java
@@ -28,9 +28,6 @@
 
     /**
      * 鍑哄簱浣滀笟
-     * @param staNo 鐩爣绔欑偣
-     * @param locDetls 寰呭嚭搴撶墿鏂�
-     * @param ioType 鍏ュ嚭搴撶被鍨�
      */
     void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
 
@@ -87,4 +84,9 @@
      */
     String dealPreHaveStart(Integer wrkNo, Long userId);
 
+    /**
+     * 绌挎搴撶Щ杞�
+     */
+    void shuttleTransfer(List<String> locNos);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/WrkChargeService.java b/src/main/java/com/zy/asrs/service/WrkChargeService.java
new file mode 100644
index 0000000..43c9a52
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/WrkChargeService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.WrkCharge;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface WrkChargeService extends IService<WrkCharge> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/WrkMastService.java b/src/main/java/com/zy/asrs/service/WrkMastService.java
index ff9c2ba..de22e00 100644
--- a/src/main/java/com/zy/asrs/service/WrkMastService.java
+++ b/src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -15,10 +15,16 @@
 
     WrkMast selectByBarcode(String barcode);
 
+    Double getIoPri(Integer ioType, String locNo);
+
     /**
      * 浠庡伐浣滄。寰楀埌绔欑偣鍏ュ簱鏆傚瓨鏁�
      * @param crnNo
      * @return
      */
     int getStoreCount(Integer crnNo);
+
+    Boolean setSteEmpty(Integer wrkNo);
+
+    WrkMast selectOfPick(Integer wrkNo, Integer ioType);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
index 236a451..50180bc 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
@@ -55,7 +55,7 @@
         }
 
         if (pakin) {
-//            //TODO鎺у埗鍏ュ簱鏆傚瓨鏁帮紝闃叉涓诲共閬撳牭濉烇紝2022-5-24 ADD
+            //TODO鎺у埗鍏ュ簱鏆傚瓨鏁帮紝闃叉涓诲共閬撳牭濉烇紝2022-5-24 ADD
 //            int staNo = 0;
 //            switch (crnNo){
 //                case 1:
diff --git a/src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
index babb339..d35a6d5 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.mapper.BasDevpMapper;
 import com.zy.asrs.service.BasDevpService;
 import com.zy.asrs.service.WrkMastService;
@@ -55,8 +56,13 @@
             if(station.getLoading()==null || !station.getLoading().equals("Y")) {
                 throw new CoolException(devpNo+"绔欑偣鏃犵墿");
             }
+
             if(station.getWrkNo()!=null && station.getWrkNo()>0 && station.getWrkNo() < 9990) {
-                throw new CoolException(devpNo+"绔欑偣宸叉湁宸ヤ綔鍙�");
+                WrkMast wrkMast = wrkMastService.selectById(station.getWrkNo());
+                if (wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) {
+                    throw new CoolException(devpNo+"绔欑偣宸叉湁宸ヤ綔鍙�");
+                }
+
             }
 //            if(!station.getInEnable().equals("Y")) {
 //                throw new CoolException(devpNo+"绔欑偣涓嶆槸鍙叆鐘舵��");
diff --git a/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java
new file mode 100644
index 0000000..b5747c5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.BasSteErrLogMapper;
+import com.zy.asrs.entity.BasSteErrLog;
+import com.zy.asrs.service.BasSteErrLogService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basSteErrLogService")
+public class BasSteErrLogServiceImpl extends ServiceImpl<BasSteErrLogMapper, BasSteErrLog> implements BasSteErrLogService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
index b1f2189..2b08e21 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -7,12 +7,14 @@
 import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.RowLastnoService;
+import com.zy.asrs.service.WorkService;
 import com.zy.asrs.utils.Utils;
-import com.zy.common.service.CommonService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -21,10 +23,12 @@
 
     @Autowired
     private RowLastnoService rowLastnoService;
+    @Autowired
+    private WorkService workService;
 
     @Override
-    public LocMast queryFreeLocMast(Integer row, List<Integer> rows, Short locType1) {
-        return this.baseMapper.queryFreeLocMast(row, rows, locType1);
+    public List<LocMast> queryFreeLocMast(List<Integer> rows, Integer rowsLen, Short locType1) {
+        return this.baseMapper.queryFreeLocMast(rows, rowsLen, locType1);
     }
 
     @Override
@@ -54,17 +58,59 @@
 
     @Override
     public Boolean isOutMost(String locNo, Boolean pakin) {
-        return Integer.parseInt(locNo.substring(0, 2)) == Utils.getGroupRow(locNo, true);
+        return Integer.parseInt(locNo.substring(0, 2)) == Utils.getOutermostRow(locNo, true);
     }
 
     @Override
     public LocMast findOutMost(List<String> locNos) {
         List<Integer> rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
-        if (!rows.retainAll(CommonService.FIRST_GROUP_ROW_LIST)) {
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(1);add(2);add(3);}})) {
             locNos.sort(Comparator.comparingInt(o -> Integer.parseInt(o.substring(0, 2))));
-        } else if (!rows.retainAll(CommonService.SECOND_GROUP_ROW_LIST)) {
-            locNos.sort((o1, o2) -> Integer.parseInt(o2.substring(0, 2)) - Integer.parseInt(o1.substring(0, 2)));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
         }
+
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(8);add(9);add(10);add(11);}})) {
+            locNos.sort(Comparator.comparingInt(o -> Integer.parseInt(o.substring(0, 2))));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
+        }
+
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(15);add(16);add(17);add(18);}})) {
+            locNos.sort(Comparator.comparingInt(o -> Integer.parseInt(o.substring(0, 2))));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
+        }
+
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(4);add(5);add(6);add(7);}})) {
+            locNos.sort((o1, o2) -> Integer.parseInt(o2.substring(0, 2)) - Integer.parseInt(o1.substring(0, 2)));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
+        }
+
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(12);add(13);add(14);}})) {
+            locNos.sort((o1, o2) -> Integer.parseInt(o2.substring(0, 2)) - Integer.parseInt(o1.substring(0, 2)));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
+        }
+
+        if (!rows.retainAll(new ArrayList<Integer>() {{ add(19);add(20);add(21);}})) {
+            locNos.sort((o1, o2) -> Integer.parseInt(o2.substring(0, 2)) - Integer.parseInt(o1.substring(0, 2)));
+        } else {
+            rows = locNos.stream().map(item -> Integer.parseInt(item.substring(0, 2))).distinct().collect(Collectors.toList());
+        }
+
+//        if (!rows.retainAll(new ArrayList<Integer>() {{ add(1);add(2);add(3);}})
+//                || !rows.retainAll(new ArrayList<Integer>() {{ add(8);add(9);add(10);add(11);}})
+//                || !rows.retainAll(new ArrayList<Integer>() {{ add(15);add(16);add(17);add(18);}})
+//        ) {
+//            locNos.sort(Comparator.comparingInt(o -> Integer.parseInt(o.substring(0, 2))));
+//        } else if (!rows.retainAll(new ArrayList<Integer>() {{ add(4);add(5);add(6);add(7);}})
+//                || !rows.retainAll(new ArrayList<Integer>() {{ add(12);add(13);add(14);}})
+//                || !rows.retainAll(new ArrayList<Integer>() {{ add(19);add(20);add(21);}})
+//        ) {
+//            locNos.sort((o1, o2) -> Integer.parseInt(o2.substring(0, 2)) - Integer.parseInt(o1.substring(0, 2)));
+//        }
         for (String locNo : locNos) {
             LocMast locMast = this.selectById(locNo);
             if (locMast.getLocSts().equals("O")) {
@@ -74,4 +120,21 @@
         return null;
     }
 
+    @Override
+    public synchronized void breakUp(String locNo, List<String> excludeLocNos) {
+        List<String> groupLoc = Utils.getGroupOuterLoc(locNo);
+        Iterator<String> iterator = groupLoc.iterator();
+        while (iterator.hasNext()) {
+            String next = iterator.next();
+            LocMast locMast = this.selectById(next);
+            if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D")) {
+                if (!excludeLocNos.contains(locMast.getLocNo())) {
+                    continue;
+                }
+            }
+            iterator.remove();
+        }
+        workService.shuttleTransfer(groupLoc);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
index 8abf584..e86dce8 100644
--- a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
@@ -11,8 +11,8 @@
 public class MatServiceImpl extends ServiceImpl<MatMapper, Mat> implements MatService {
 
     @Override
-    public Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx) {
-        return page.setRecords(baseMapper.listByPage(page, tagId, matnr, maktx));
+    public Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx, Object specs) {
+        return page.setRecords(baseMapper.listByPage(page, tagId, matnr, maktx, specs));
     }
 
 
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index d8f9899..74ac54a 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -13,6 +13,8 @@
 import com.zy.asrs.entity.param.MobileAdjustParam;
 import com.zy.asrs.entity.param.OpenOrderPakinParam;
 import com.zy.asrs.service.*;
+import com.zy.asrs.task.core.ReturnT;
+import com.zy.asrs.task.handler.WorkLogHandler;
 import com.zy.asrs.utils.MatUtils;
 import com.zy.common.constant.MesConstant;
 import com.zy.common.entity.Parameter;
@@ -59,6 +61,8 @@
     private SnowflakeIdWorker snowflakeIdWorker;
     @Autowired
     private ApiLogService apiLogService;
+    @Autowired
+    private WorkLogHandler workLogHandler;
 
     @Override
     @Transactional
@@ -71,6 +75,16 @@
                 eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
             throw new CoolException(param.getBarcode() + "鏁版嵁姝e湪杩涜鍏ュ簱");
         }
+
+        // todo: 涓嶄笅绾块噸鏂板叆搴�
+        WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
+        if (wrkMast != null && wrkMast.getWrkSts() == 18) {
+            ReturnT<String> start = workLogHandler.start(wrkMast);
+            if (!start.isSuccess()) {
+                log.error("宸ヤ綔妗workNo={}]鍘嗗彶妗e鐞嗗け璐�", wrkMast.getWrkNo());
+            }
+        }
+
         Date now = new Date();
 
         // 鏃犲崟缁勬墭
diff --git a/src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
index 6b89902..806dba6 100644
--- a/src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -49,6 +49,11 @@
     }
 
     @Override
+    public boolean increaseAnfme(Long orderId, String matnr, String batch, Double qty) {
+        return this.baseMapper.increaseAnfme(orderId, matnr, batch, qty) > 0;
+    }
+
+    @Override
     public boolean increase(Long orderId, String matnr, String batch, Double qty) {
         return this.baseMapper.increase(orderId, matnr, batch, qty) > 0;
     }
@@ -68,4 +73,9 @@
         return this.baseMapper.modifyStatus(orderId, status) > 0;
     }
 
+    @Override
+    public List<OrderDetl> selectRemainder(Long orderId) {
+        return this.baseMapper.selectRemainder(orderId);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
index a32f666..c50a9df 100644
--- a/src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.service.impl;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.core.common.Cools;
 import com.core.common.DateUtils;
 import com.core.common.SnowflakeIdWorker;
@@ -11,8 +12,9 @@
 import com.zy.asrs.mapper.OrderDetlMapper;
 import com.zy.asrs.mapper.OrderMapper;
 import com.zy.asrs.service.*;
-import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.zy.common.model.DetlDto;
+import com.zy.common.model.OrderDto;
+import com.zy.common.model.OrderMergeVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,6 +38,8 @@
     private DocTypeService docTypeService;
     @Autowired
     private WrkDetlService wrkDetlService;
+    @Autowired
+    private MatService matService;
 
     @Override
     public Order selectByNo(String orderNo) {
@@ -70,10 +74,11 @@
                 break;
             }
         }
-        if (complete && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no", orderNo)) == 0) {
+        if (complete && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().like("order_no", orderNo)) == 0) {
             // 鍑哄簱璁㈠崟閲嶆柊鏁寸悊鏄庣粏
             DocType docType = docTypeService.selectById(order.getDocType());
             if (null != docType && docType.getPakout() == 1) {
+                // 閲嶇粍鏄庣粏
                 if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) {
                     throw new CoolException("閲嶆暣鍑哄簱璁㈠崟銆恛rderNo = " + order.getOrderNo() + "銆戞槑缁嗗け璐�");
                 }
@@ -165,4 +170,36 @@
         return this.baseMapper.selectComplete();
     }
 
+    @Override
+    public List<OrderMergeVo> mergePreview(List<Long> ids) {
+        List<OrderMergeVo> result = new ArrayList<>();
+        for (Long orderId : ids) {
+            Order order = this.selectById(orderId);
+            // 鑾峰彇鎵�鏈夋湭浣滀笟鐨勬槑缁�
+            List<OrderDetl> orderDetls = orderDetlService.selectRemainder(orderId);
+            for (OrderDetl orderDetl : orderDetls) {
+                Double leave = orderDetl.getAnfme() - orderDetl.getQty();
+                OrderMergeVo vo = new OrderMergeVo(orderDetl.getMatnr(), orderDetl.getBatch(), leave);
+                OrderDto orderDto = new OrderDto(orderDetl.getOrderNo(), null, leave);
+                if (OrderMergeVo.has(result, vo)) {
+                    OrderMergeVo exist = OrderMergeVo.find(result, vo.getMatnr(), vo.getBatch());
+                    assert exist != null;
+                    exist.setAnfme(exist.getAnfme() + vo.getAnfme());
+                    exist.getOrderDtos().add(orderDto);
+                } else {
+                    vo.getOrderDtos().add(orderDto);
+                    result.add(vo);
+                }
+
+            }
+        }
+        for (OrderMergeVo vo : result) {
+            Mat mat = matService.selectByMatnr(vo.getMatnr());
+            assert mat != null;
+            vo.setMaktx(mat.getMaktx());
+            vo.setSpecs(mat.getSpecs());
+        }
+        return result;
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index e49c04f..2a8104d 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.core.common.BaseRes;
@@ -19,6 +20,7 @@
 import com.zy.common.model.enums.WorkNoType;
 import com.zy.common.properties.SlaveProperties;
 import com.zy.common.service.CommonService;
+import com.zy.common.web.BaseController;
 import com.zy.common.web.WcsController;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -98,7 +100,8 @@
         wrkMast.setIoTime(new Date());
         wrkMast.setWrkSts(1L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
         wrkMast.setIoType(1); // 鍏ュ嚭搴撶姸鎬侊細1.鍏ュ簱
-        wrkMast.setIoPri(13D); // 浼樺厛绾э細13
+        Double ioPri = wrkMastService.getIoPri(1, dto.getLocNo());
+        wrkMast.setIoPri(ioPri); // 浼樺厛绾э細13
         wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), true)?1:0);;
         wrkMast.setCrnNo(dto.getCrnNo());
         wrkMast.setSourceStaNo(dto.getSourceStaNo());
@@ -196,6 +199,7 @@
             }
         }
         Integer ioType = null;
+        List<String> excludeLocNos = dtos.stream().map(OutLocDto::getLocNo).distinct().collect(Collectors.toList());
         // 鐢熸垚宸ヤ綔妗�
         for (OutLocDto dto : dtos) {
             // 濡傛灉涓烘繁搴撲綅锛屼笖瀵瑰簲娴呭簱浣嶄负X.绂佺敤锛屽垯鐣ヨ繃姝ゅ簱浣�
@@ -225,7 +229,8 @@
             wrkMast.setIoTime(now);
             wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
             wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬�
-            wrkMast.setIoPri(13D); // 浼樺厛绾э細13
+            Double ioPri = wrkMastService.getIoPri(ioType, dto.getLocNo());
+            wrkMast.setIoPri(ioPri); // 浼樺厛绾э細13
             wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), false)?1:0);;
             wrkMast.setCrnNo(locMast.getCrnNo());
             wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 婧愮珯
@@ -274,6 +279,7 @@
             } else {
                 throw new CoolException(dto.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
             }
+            locMastService.breakUp(dto.getLocNo(), excludeLocNos);
         }
     }
 
@@ -300,7 +306,8 @@
         wrkMast.setIoTime(now);
         wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
         wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬�
-        wrkMast.setIoPri(13D); // 浼樺厛绾э細13
+        Double ioPri = wrkMastService.getIoPri(ioType, taskDto.getLocNo());
+        wrkMast.setIoPri(ioPri); // 浼樺厛绾э細13
         wrkMast.setOutMost(locMastService.isOutMost(taskDto.getLocNo(), false)?1:0);;
         wrkMast.setCrnNo(locMast.getCrnNo());
         wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 婧愮珯
@@ -322,16 +329,14 @@
         // 鐢熸垚宸ヤ綔妗f槑缁�
         for (LocDto locDto : taskDto.getLocDtos()) {
             if (locDto.getAnfme()==null || locDto.getAnfme() <= 0.0D) { continue; }
-            OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
-            if (orderDetl == null) {
-                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
-            }
             LocDetl locDetl = locDetlService.selectItem(locDto.getLocNo(), locDto.getMatnr(), locDto.getBatch());
             if (locDetl == null || locDetl.getAnfme() < locDto.getAnfme()) {
                 throw new CoolException(locDto.getLocNo() + "搴撲綅涓�" + locDto.getMatnr() + "鍟嗗搧搴撳瓨涓嶈冻锛�");
             }
+            Mat mat = matService.selectByMatnr(locDto.getMatnr());
+            assert mat != null;
             WrkDetl wrkDetl = new WrkDetl();
-            wrkDetl.sync(orderDetl);
+            wrkDetl.sync(mat);
             wrkDetl.setZpallet(wrkMast.getBarcode());
             wrkDetl.setIoTime(now);
             wrkDetl.setWrkNo(workNo);
@@ -346,10 +351,29 @@
                 throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
             }
             // 淇敼璁㈠崟鏄庣粏
-            if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
-                throw new CoolException("淇敼璁㈠崟鏄庣粏鏁伴噺澶辫触");
+            if (!BaseController.isJSON(locDto.getOrderNo())) {
+                OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
+                if (orderDetl == null) {
+                    orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
+                }
+                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
+                    throw new CoolException("淇敼璁㈠崟鏄庣粏鏁伴噺澶辫触");
+                }
+                orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
+            } else {
+                // 璁㈠崟鍚堝苟鍑哄簱
+                List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
+                for (OrderDto orderDto : orderDtoList) {
+                    OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
+                    if (orderDetl == null) {
+                        orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null);
+                    }
+                    if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDto.getAnfme())) {
+                        throw new CoolException("淇敼璁㈠崟鏄庣粏鏁伴噺澶辫触");
+                    }
+                    orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
+                }
             }
-            orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
         }
         // 淇敼搴撲綅鐘舵��:   F.鍦ㄥ簱 ====>>> R.鍑哄簱棰勭害/P.鎷f枡/鐩樼偣/骞舵澘鍑哄簱涓�
         locMast = locMastService.selectById(taskDto.getLocNo());
@@ -380,7 +404,8 @@
         wrkMast.setIoTime(new Date());
         wrkMast.setWrkSts(1L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
         wrkMast.setIoType(10); // 鍏ュ嚭搴撶姸鎬侊細10.绌烘澘鍏ュ簱
-        wrkMast.setIoPri(10D); // 浼樺厛绾э細10
+        Double ioPri = wrkMastService.getIoPri(10, dto.getLocNo());
+        wrkMast.setIoPri(ioPri); // 浼樺厛绾э細10
         wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), true)?1:0);;
         wrkMast.setCrnNo(dto.getCrnNo());
         wrkMast.setSourceStaNo(dto.getSourceStaNo());
@@ -450,6 +475,9 @@
                     .eq("stn_no", param.getOutSite())
                     .eq("crn_no", locMast.getCrnNo());
             StaDesc staDesc = staDescService.selectOne(wrapper);
+            if (Cools.isEmpty(staDesc)) {
+                throw new CoolException("闈炴硶璺緞锛�");
+            }
             Integer sourceStaNo = staDesc.getCrnStn();
             if (Cools.isEmpty(sourceStaNo)) {
                 throw new CoolException("妫�绱㈡簮绔欏け璐�");
@@ -460,7 +488,8 @@
             wrkMast.setIoTime(new Date());
             wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
             wrkMast.setIoType(110); // 鍏ュ嚭搴撶姸鎬侊細 110.绌烘澘鍑哄簱
-            wrkMast.setIoPri(10D);
+            Double ioPri = wrkMastService.getIoPri(110, locNo);
+            wrkMast.setIoPri(ioPri);
             wrkMast.setSourceStaNo(sourceStaNo); // 婧愮珯
             wrkMast.setStaNo(param.getOutSite()); // 鐩爣绔�
             wrkMast.setOutMost(locMastService.isOutMost(locNo, false)?1:0);;
@@ -525,14 +554,15 @@
             throw new CoolException("鏈壘鍒板簱浣�");
         }
         if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) {
-            throw new CoolException("绉昏浆搴撲綅灞炰簬涓嶅悓鍫嗗灈鏈�");
+//            throw new CoolException("绉昏浆搴撲綅灞炰簬涓嶅悓鍫嗗灈鏈�");   todo:luxiaotao
         }
+        Date now = new Date();
         // 鑾峰彇宸ヤ綔鍙�
         int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
         // 淇濆瓨宸ヤ綔妗�
         WrkMast wrkMast = new WrkMast();
         wrkMast.setWrkNo(workNo);
-        wrkMast.setIoTime(new Date());
+        wrkMast.setIoTime(now);
         wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
         wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
         wrkMast.setIoPri(10D);
@@ -547,9 +577,9 @@
         wrkMast.setBarcode(sourceLoc.getBarcode()); // 鎵樼洏鐮�
         wrkMast.setLinkMis("N");
         wrkMast.setAppeUser(userId);
-        wrkMast.setAppeTime(new Date());
+        wrkMast.setAppeTime(now);
         wrkMast.setModiUser(userId);
-        wrkMast.setModiTime(new Date());
+        wrkMast.setModiTime(now);
         boolean res = wrkMastService.insert(wrkMast);
         if (!res) {
             throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
@@ -559,11 +589,11 @@
             WrkDetl wrkDetl = new WrkDetl();
             wrkDetl.sync(locDetl);
             wrkDetl.setWrkNo(workNo);
-            wrkDetl.setIoTime(new Date());
+            wrkDetl.setIoTime(now);
             wrkDetl.setAnfme(locDetl.getAnfme());
-            wrkDetl.setAppeTime(new Date());
+            wrkDetl.setAppeTime(now);
             wrkDetl.setAppeUser(userId);
-            wrkDetl.setModiTime(new Date());
+            wrkDetl.setModiTime(now);
             wrkDetl.setModiUser(userId);
             if (!wrkDetlService.insert(wrkDetl)) {
                 throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
@@ -573,17 +603,17 @@
         if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) {
             sourceLoc.setLocSts("R"); // R.鍑哄簱棰勭害
             sourceLoc.setModiUser(userId);
-            sourceLoc.setModiTime(new Date());
+            sourceLoc.setModiTime(now);
             if (!locMastService.updateById(sourceLoc)){
                 throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
             }
         } else {
-            throw new CoolException("婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細"+sourceLoc.getLocSts$());
+            throw new CoolException(sourceLoc.getLocNo() + "婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細"+sourceLoc.getLocSts$());
         }
         // 淇敼鐩爣搴撲綅鐘舵��
         if (loc.getLocSts().equals("O")) {
             loc.setLocSts("S"); // S.鍏ュ簱棰勭害
-            loc.setModiTime(new Date());
+            loc.setModiTime(now);
             loc.setModiUser(userId);
             if (!locMastService.updateById(loc)) {
                 throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
@@ -753,7 +783,7 @@
         String locNo = ""; // 寰呬慨鏀圭洰鏍囧簱浣�
         String locSts = ""; // 寰呬慨鏀圭洰鏍囧簱浣嶇姸鎬�
         // 鍏ュ簱鍙栨秷锛堜慨鏀圭洰鏍囧簱浣嶏級
-        if (wrkMast.getWrkSts() < 4) {
+        if (wrkMast.getWrkSts() < 9) {
             locNo = wrkMast.getLocNo();
             locSts = "O";
 
@@ -770,7 +800,7 @@
                 locMastService.updateById(locMast);
             }
         // 鍑哄簱鍙栨秷锛堜慨鏀规簮搴撲綅锛�
-        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
+        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 19) {
             locNo = wrkMast.getSourceLocNo();
             // 鍑哄簱 ===>> F.鍦ㄥ簱
             if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
@@ -798,11 +828,19 @@
         List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
         for (WrkDetl wrkDetl : wrkDetls) {
             if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
-                if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
-                    throw new CoolException("璁㈠崟鏁版嵁鍥炴粴澶辫触");
+                if (!BaseController.isJSON(wrkDetl.getOrderNo())) {
+                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
+                        throw new CoolException("璁㈠崟鏁版嵁鍥炴粴澶辫触");
+                    }
+                } else {
+                    // 璁㈠崟鍚堝苟鍑哄簱
+                    List<OrderDto> orderDtoList = JSON.parseArray(wrkDetl.getOrderNo(), OrderDto.class);
+                    for (OrderDto orderDto : orderDtoList) {
+                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderDto.getAnfme())) {
+                            throw new CoolException("璁㈠崟鏁版嵁鍥炴粴澶辫触");
+                        }
+                    }
                 }
-                // 鐢熸垚鏂扮殑鍑哄簱浣滀笟
-//                        stockOutRe(wrkMast, wrkDetls);
             }
         }
         // 鍙栨秷鎿嶄綔浜哄憳璁板綍
@@ -917,4 +955,128 @@
         return "";
     }
 
+    @Override
+    @Transactional
+    public void shuttleTransfer(List<String> locNos) {
+        if (Cools.isEmpty(locNos)) {
+            return;
+        }
+        if (true && !Cools.isEmpty(locNos)) {
+            throw new CoolException("鏆備笉鏀寔绉诲簱浠诲姟");    // todo:luxiaotao 绉诲簱寮�鍏�
+        }
+        LocMast one = locMastService.selectById(locNos.get(0));
+        List<Integer> rows = Utils.getGroupLoc(Integer.parseInt(locNos.get(0).substring(0, 2)));
+        List<LocMast> locMasts = locMastService.queryFreeLocMast(rows, rows.size(), one.getLocType1());
+        if (Cools.isEmpty(locMasts)) {
+            throw new CoolException("搴撲綅绉昏浆澶辫触锛屽凡鏃犵┖搴撲綅");
+        }
+        // 鍏ュ簱鎺掑簭 娣卞簱浣� ==> 娴呭簱浣�
+        switch (locMasts.get(0).getRow1()) {
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+            case 12:
+            case 13:
+            case 14:
+            case 19:
+            case 20:
+            case 21:
+                Collections.reverse(locMasts);
+                break;
+            default:
+                break;
+        }
+        if (locNos.size() > locMasts.size()) {
+            throw new CoolException("鏈嶅姟鍣ㄩ敊璇�");
+        }
+        Date now = new Date();
+        // 鐢熸垚绉诲簱宸ヤ綔妗�
+        Iterator<LocMast> iterator = locMasts.iterator();
+        for (String sourceLocNo : locNos) {
+
+            while (iterator.hasNext()) {
+                LocMast sourceLoc = locMastService.selectById(sourceLocNo);
+                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo));
+                if (Cools.isEmpty(sourceLoc)){
+                    throw new CoolException("鏈壘鍒板簱浣�");
+                }
+                LocMast loc = iterator.next();
+                if (Cools.isEmpty(loc)){
+                    throw new CoolException("鏈壘鍒板簱浣�");
+                }
+                if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) {
+//                    throw new CoolException("绉昏浆搴撲綅灞炰簬涓嶅悓鍫嗗灈鏈�");   todo:luxiaotao
+                }
+                // 鑾峰彇宸ヤ綔鍙�
+                int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
+                // 淇濆瓨宸ヤ綔妗�
+                WrkMast wrkMast = new WrkMast();
+                wrkMast.setWrkNo(workNo);
+                wrkMast.setIoTime(now);
+                wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+                wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
+                wrkMast.setIoPri(15D);
+                wrkMast.setOutMost(locMastService.isOutMost(loc.getLocNo(), false)?1:0);;
+                wrkMast.setCrnNo(sourceLoc.getCrnNo());
+                wrkMast.setSourceLocNo(sourceLocNo); // 婧愬簱浣�
+                wrkMast.setLocNo(loc.getLocNo()); // 鐩爣搴撲綅
+                wrkMast.setFullPlt(Cools.isEmpty(locDetls)?"N":"Y"); // 婊℃澘锛歒
+                wrkMast.setPicking("N"); // 鎷f枡
+                wrkMast.setExitMk("N"); // 閫�鍑�
+                wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D")?"Y":"N"); // 绌烘澘
+                wrkMast.setBarcode(sourceLoc.getBarcode()); // 鎵樼洏鐮�
+                wrkMast.setLinkMis("N");
+                wrkMast.setAppeUser(9527L);
+                wrkMast.setAppeTime(now);
+                wrkMast.setModiUser(9527L);
+                wrkMast.setModiTime(now);
+                boolean res = wrkMastService.insert(wrkMast);
+                if (!res) {
+                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+                }
+                // 宸ヤ綔妗f槑缁嗕繚瀛�
+                for (LocDetl locDetl : locDetls) {
+                    WrkDetl wrkDetl = new WrkDetl();
+                    wrkDetl.sync(locDetl);
+                    wrkDetl.setWrkNo(workNo);
+                    wrkDetl.setIoTime(now);
+                    wrkDetl.setAnfme(locDetl.getAnfme());
+                    wrkDetl.setAppeTime(now);
+                    wrkDetl.setAppeUser(9527L);
+                    wrkDetl.setModiTime(now);
+                    wrkDetl.setModiUser(9527L);
+                    if (!wrkDetlService.insert(wrkDetl)) {
+                        throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                    }
+                }
+                // 淇敼婧愬簱浣嶇姸鎬�
+                if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) {
+                    sourceLoc.setLocSts("R"); // R.鍑哄簱棰勭害
+                    sourceLoc.setModiUser(9527L);
+                    sourceLoc.setModiTime(now);
+                    if (!locMastService.updateById(sourceLoc)){
+                        throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
+                    }
+                } else {
+                    throw new CoolException(sourceLoc.getLocNo() + "婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細"+sourceLoc.getLocSts$());
+                }
+                // 淇敼鐩爣搴撲綅鐘舵��
+                if (loc.getLocSts().equals("O")) {
+                    loc.setLocSts("S"); // S.鍏ュ簱棰勭害
+                    loc.setModiTime(now);
+                    loc.setModiUser(9527L);
+                    if (!locMastService.updateById(loc)) {
+                        throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+                    }
+                } else {
+                    throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細"+loc.getLocSts$());
+                }
+
+                iterator.remove();
+                break;
+            }
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkChargeServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkChargeServiceImpl.java
new file mode 100644
index 0000000..3e23acc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/WrkChargeServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.WrkChargeMapper;
+import com.zy.asrs.entity.WrkCharge;
+import com.zy.asrs.service.WrkChargeService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("wrkChargeService")
+public class WrkChargeServiceImpl extends ServiceImpl<WrkChargeMapper, WrkCharge> implements WrkChargeService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
index ab394ec..12559a5 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -6,6 +6,7 @@
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.mapper.WrkMastMapper;
 import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.utils.Utils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -40,9 +41,74 @@
     }
 
     @Override
+    public synchronized Double getIoPri(Integer ioType, String locNo) {
+        Double defaultIoPri = null;
+        if (Cools.isEmpty(ioType, locNo)) {
+            return 15.0D;
+        }
+        if (ioType != 11) {
+            // 鍏ュ簱
+            if (ioType < 100) {
+                List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNo);
+                if (!Cools.isEmpty(groupOuterLoc)) {
+                    for (String outerLoc : groupOuterLoc) {
+                        WrkMast wrkMast = this.baseMapper.selectByLocNoOfPakin(outerLoc);
+                        if (wrkMast != null) {
+                            defaultIoPri = defaultIoPri == null ? wrkMast.getIoPri() + 2 : defaultIoPri + 2;
+                        }
+                    }
+                }
+                List<String> groupInsideLoc = Utils.getGroupInsideLoc(locNo);
+                if (!Cools.isEmpty(groupInsideLoc)) {
+                    for (String insideLoc : groupInsideLoc) {
+                        WrkMast wrkMast = this.baseMapper.selectByLocNoOfPakin(insideLoc);
+                        if (wrkMast != null) {
+                            defaultIoPri = defaultIoPri == null ? wrkMast.getIoPri() - 2 : defaultIoPri - 2;
+                        }
+                    }
+                }
+            // 鍑哄簱
+            } else {
+                List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNo);
+                if (!Cools.isEmpty(groupOuterLoc)) {
+                    for (String outerLoc : groupOuterLoc) {
+                        WrkMast wrkMast = this.baseMapper.selectBySourceLocNoOfPakout(outerLoc);
+                        if (wrkMast != null) {
+                            defaultIoPri = defaultIoPri == null ? wrkMast.getIoPri() - 2 : defaultIoPri - 2;
+                        }
+                    }
+                }
+                List<String> groupInsideLoc = Utils.getGroupInsideLoc(locNo);
+                if (!Cools.isEmpty(groupInsideLoc)) {
+                    for (String insideLoc : groupInsideLoc) {
+                        WrkMast wrkMast = this.baseMapper.selectBySourceLocNoOfPakout(insideLoc);
+                        if (wrkMast != null) {
+                            defaultIoPri = defaultIoPri == null ? wrkMast.getIoPri() + 2 : defaultIoPri + 2;
+                        }
+                    }
+                }
+            }
+        // 绉诲簱
+        } else {
+//            @Deprecated
+        }
+        return defaultIoPri == null ? 15.0D : defaultIoPri;
+    }
+
+    @Override
     public int getStoreCount(Integer crnNo) {
         return selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnNo)
                 .last(" and (wrk_sts in (1,2) or (wrk_sts=3 and wrk_no in (select wrk_no from asr_bas_devp)))"));
     }
 
+    @Override
+    public Boolean setSteEmpty(Integer wrkNo) {
+        return this.baseMapper.setSteEmpty(wrkNo) > 0;
+    }
+
+    @Override
+    public WrkMast selectOfPick(Integer wrkNo, Integer ioType) {
+        return this.baseMapper.selectOfPick(wrkNo, ioType);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
index 917cfc4..d674a63 100644
--- a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
+++ b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
@@ -12,6 +12,7 @@
  * Created by vincent on 2020/7/7
  */
 @Component
+//@RestController
 public class ErrorStockScheduler {
 
     private static final Logger log = LoggerFactory.getLogger(ErrorStockScheduler.class);
@@ -27,4 +28,21 @@
         }
     }
 
+//    @Autowired
+//    private BasErrLogService basErrLogService;
+//    @Autowired
+//    private BasCrnErrorMapper basCrnErrorMapper;
+//
+//    @GetMapping("/adsadwqwqewq")
+//    private void ErrorCovert(){
+//        List<BasErrLog> basErrLogs = basErrLogService.selectList(new EntityWrapper<BasErrLog>());
+//        for (BasErrLog basErrLog : basErrLogs) {
+//            if (!Cools.isEmpty(basErrLog.getErrCode())) {
+//                BasCrnError error = basCrnErrorMapper.selectById(basErrLog.getErrCode());
+//                basErrLog.setError(error==null?"鏈煡寮傚父":error.getErrName());
+//                basErrLogService.updateById(basErrLog);
+//            }
+//        }
+//    }
+
 }
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
index f5e6c6a..7600ab2 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.task.handler;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
 import com.zy.asrs.entity.WaitPakin;
@@ -8,6 +9,8 @@
 import com.zy.asrs.service.*;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.model.OrderDto;
+import com.zy.common.web.BaseController;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -115,7 +118,15 @@
             }
             // 淇敼璁㈠崟鐘舵�� 浣滀笟涓� ===>> 宸插畬鎴�
             for (WrkDetl wrkDetl : wrkDetlsKeyOrder) {
-                orderService.checkComplete(wrkDetl.getOrderNo());
+                if (!BaseController.isJSON(wrkDetl.getOrderNo())) {
+                    orderService.checkComplete(wrkDetl.getOrderNo());
+                } else {
+                    // 璁㈠崟鍚堝苟鍑哄簱
+                    List<OrderDto> orderDtoList = JSON.parseArray(wrkDetl.getOrderNo(), OrderDto.class);
+                    for (OrderDto one : orderDtoList) {
+                        orderService.checkComplete(one.getOrderNo());
+                    }
+                }
             }
         } catch (Exception e) {
             log.error("fail", e);
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index 4b053cb..89cef79 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -3,7 +3,6 @@
 import com.core.common.Arith;
 import com.core.common.Cools;
 import com.zy.common.properties.SlaveProperties;
-import com.zy.common.service.CommonService;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
@@ -162,46 +161,374 @@
 
     }
 
-    public static Integer getGroupRow(String locNo, Boolean pakin){
+    public static Integer getOutermostRow(String locNo, Boolean pakin){
         int row = getRow(locNo);
-        if (CommonService.FIRST_GROUP_ROW_LIST.contains(row)) {
-            return pakin?17:2;
+        switch (row) {
+            case 1:
+            case 2:
+            case 3:
+                return 3;
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+                return 4;
+            case 8:
+            case 9:
+            case 10:
+            case 11:
+                return 11;
+            case 12:
+            case 13:
+            case 14:
+                return 12;
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+                return 18;
+            case 19:
+            case 20:
+            case 21:
+                return 19;
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
         }
-        if (CommonService.SECOND_GROUP_ROW_LIST.contains(row)) {
-            return pakin?30:18;
+    }
+
+    public static Integer getInnermostRow(String locNo){
+        int row = getRow(locNo);
+        switch (row) {
+            case 1:
+            case 2:
+            case 3:
+                return 1;
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+                return 7;
+            case 8:
+            case 9:
+            case 10:
+            case 11:
+                return 8;
+            case 12:
+            case 13:
+            case 14:
+                return 14;
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+                return 15;
+            case 19:
+            case 20:
+            case 21:
+                return 21;
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
         }
-        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
     }
 
 
     public static List<String> getGroupLoc(String locNo){
         int row = getRow(locNo);
-        if (CommonService.FIRST_GROUP_ROW_LIST.contains(row)) {
-            List<String> result = new ArrayList<>();
-            for (Integer row0 : CommonService.FIRST_GROUP_ROW_LIST) {
-                result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
-            }
-            return result;
+        switch (row) {
+            case 1:
+            case 2:
+            case 3:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(1), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(2), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(3), 2) + locNo.substring(2));
+                }};
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(6), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(7), 2) + locNo.substring(2));
+                }};
+            case 8:
+            case 9:
+            case 10:
+            case 11:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(8), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(9), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                }};
+            case 12:
+            case 13:
+            case 14:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(12), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(13), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(14), 2) + locNo.substring(2));
+                }};
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(15), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(16), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                }};
+            case 19:
+            case 20:
+            case 21:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(19), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(20), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(21), 2) + locNo.substring(2));
+                }};
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
         }
-        if (CommonService.SECOND_GROUP_ROW_LIST.contains(row)) {
-            List<String> result = new ArrayList<>();
-            for (Integer row0 : CommonService.SECOND_GROUP_ROW_LIST) {
-                result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
-            }
-            return result;
-        }
-        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
     }
 
-    public static void main(String[] args) {
-        SlaveProperties slaveProperties = new SlaveProperties();
-        slaveProperties.setDoubleDeep(true);
-        List<Integer> list = new ArrayList<>();
-        list.add(1);list.add(4);list.add(5);list.add(8);list.add(9);list.add(12);
-        slaveProperties.setDoubleLocs(list);
-        slaveProperties.setGroupCount(4);
-        Integer deepRow = getDeepRow(slaveProperties, 6);
-        System.out.println(deepRow);
-
+    public static List<Integer> getGroupLoc(Integer row){
+        switch (row) {
+            case 1:
+            case 2:
+            case 3:
+                return new ArrayList<Integer>() {{
+                    add(1);
+                    add(2);
+                    add(3);
+                }};
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+                return new ArrayList<Integer>() {{
+                    add(4);
+                    add(5);
+                    add(6);
+                    add(7);
+                }};
+            case 8:
+            case 9:
+            case 10:
+            case 11:
+                return new ArrayList<Integer>() {{
+                    add(8);
+                    add(9);
+                    add(10);
+                    add(11);
+                }};
+            case 12:
+            case 13:
+            case 14:
+                return new ArrayList<Integer>() {{
+                    add(12);
+                    add(13);
+                    add(14);
+                }};
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+                return new ArrayList<Integer>() {{
+                    add(15);
+                    add(16);
+                    add(17);
+                    add(18);
+            }};
+            case 19:
+            case 20:
+            case 21:
+                return new ArrayList<Integer>() {{
+                    add(19);
+                    add(20);
+                    add(21);
+                }};
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+        }
     }
+
+    // 娉ㄦ剰椤哄簭
+    public static List<String> getGroupOuterLoc(String locNo){
+        int row = getRow(locNo);
+        switch (row) {
+            case 1:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(3), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(2), 2) + locNo.substring(2));
+                }};
+            case 2:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(3), 2) + locNo.substring(2));
+                }};
+            case 3:
+            case 4:
+            case 11:
+            case 12:
+            case 18:
+            case 19:
+                return new ArrayList<>();
+            case 5:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                }};
+            case 6:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                }};
+            case 7:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(6), 2) + locNo.substring(2));
+                }};
+            case 8:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(9), 2) + locNo.substring(2));
+                }};
+            case 9:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                }};
+            case 10:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                }};
+            case 13:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(12), 2) + locNo.substring(2));
+                }};
+            case 14:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(12), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(13), 2) + locNo.substring(2));
+                }};
+            case 15:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(16), 2) + locNo.substring(2));
+                }};
+            case 16:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                }};
+            case 17:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                }};
+            case 20:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(19), 2) + locNo.substring(2));
+                }};
+            case 21:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(19), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(20), 2) + locNo.substring(2));
+                }};
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+        }
+    }
+
+    // 娉ㄦ剰椤哄簭
+    public static List<String> getGroupInsideLoc(String locNo){
+        int row = getRow(locNo);
+        switch (row) {
+            case 1:
+            case 21:
+            case 14:
+            case 15:
+            case 7:
+            case 8:
+                return new ArrayList<>();
+            case 2:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(1), 2) + locNo.substring(2));
+                }};
+            case 3:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(1), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(2), 2) + locNo.substring(2));
+                }};
+            case 4:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(7), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(6), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                }};
+            case 5:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(7), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(6), 2) + locNo.substring(2));
+                }};
+            case 6:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(7), 2) + locNo.substring(2));
+                }};
+            case 9:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(8), 2) + locNo.substring(2));
+                }};
+            case 10:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(8), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(9), 2) + locNo.substring(2));
+                }};
+            case 11:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(8), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(9), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                }};
+            case 12:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(14), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(13), 2) + locNo.substring(2));
+                }};
+            case 13:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(14), 2) + locNo.substring(2));
+                }};
+            case 16:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(15), 2) + locNo.substring(2));
+                }};
+            case 17:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(15), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(16), 2) + locNo.substring(2));
+                }};
+            case 18:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(15), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(16), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                }};
+            case 19:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(21), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(20), 2) + locNo.substring(2));
+                }};
+            case 20:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(21), 2) + locNo.substring(2));
+                }};
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 7e7df4a..cde6922 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -17,10 +17,10 @@
 //        generator.table="sys_host";
         // sqlserver
         generator.sqlOsType = SqlOsType.SQL_SERVER;
-        generator.url="localhost:1433;databasename=ynasrs";
+        generator.url="10.10.10.100:1433;databasename=bfasrs";
         generator.username="sa";
         generator.password="sa@123";
-        generator.table="asr_bas_ste_opt";
+        generator.table="asr_bas_ste_err_log";
         generator.packagePath="com.zy.asrs";
         generator.build();
     }
diff --git a/src/main/java/com/zy/common/CodeRes.java b/src/main/java/com/zy/common/CodeRes.java
index df8f7ce..a69fd59 100644
--- a/src/main/java/com/zy/common/CodeRes.java
+++ b/src/main/java/com/zy/common/CodeRes.java
@@ -12,4 +12,7 @@
     String PICK_600 = "600-鎷f枡浠诲姟";
     String NO_COMB_700 = "700-璇峰厛缁勬墭";
 
+    String NONE_MAST_800 = "800-浠诲姟涓㈠け";
+    String NONE_DETL_900 = "900-浠诲姟鏄庣粏涓㈠け";
+
 }
diff --git a/src/main/java/com/zy/common/model/LocDto.java b/src/main/java/com/zy/common/model/LocDto.java
index ca099a3..59dcf61 100644
--- a/src/main/java/com/zy/common/model/LocDto.java
+++ b/src/main/java/com/zy/common/model/LocDto.java
@@ -29,6 +29,8 @@
 
     private Integer staNo;
 
+    private String specs;
+
     public LocDto() {
     }
 
diff --git a/src/main/java/com/zy/common/model/OrderMergeVo.java b/src/main/java/com/zy/common/model/OrderMergeVo.java
new file mode 100644
index 0000000..bb619d4
--- /dev/null
+++ b/src/main/java/com/zy/common/model/OrderMergeVo.java
@@ -0,0 +1,54 @@
+package com.zy.common.model;
+
+import com.core.common.Cools;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vincent on 2022/10/17
+ */
+@Data
+public class OrderMergeVo {
+
+    private String matnr;
+
+    private String maktx;
+
+    private String batch;
+
+    private String specs;
+
+    private Double anfme;
+
+    private List<OrderDto> orderDtos = new ArrayList<>();
+
+    public OrderMergeVo(String matnr, String batch, Double anfme) {
+        this.matnr = matnr;
+        this.batch = batch;
+        this.anfme = anfme;
+    }
+
+    public static boolean has(List<OrderMergeVo> detlDtos, OrderMergeVo detlDto) {
+        for (OrderMergeVo dto : detlDtos) {
+            if (dto.getMatnr().equals(detlDto.getMatnr()) && Cools.eq(dto.getBatch(), detlDto.getBatch())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static OrderMergeVo find(List<OrderMergeVo> detlDtos, String matnr, String batch) {
+        if (Cools.isEmpty(matnr)) {
+            return null;
+        }
+        for (OrderMergeVo detlDto : detlDtos) {
+            if (matnr.equals(detlDto.getMatnr()) && Cools.eq(batch, detlDto.getBatch())) {
+                return detlDto;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index f43c40b..40639a2 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -111,20 +111,21 @@
      */
     public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, List<String> matNos, LocTypeDto locTypeDto, LocTypeDto oldLocType, int times) {
         StartupDto startupDto = new StartupDto();
-        int start = 2;
-        int end = 30;
+        int start;
+        int end;
         switch (sourceStaNo) {
-            case 107:
-                whsType = 2;
-                end = 17;
+            case 103:
+                whsType = 1;
+                start = 1;
+                end = 14;
                 break;
-            case 118:
-                whsType = 3;
-                start = 18;
+            case 203:
+                whsType = 2;
+                start = 8;
+                end = 21;
                 break;
             default:
-                whsType = 1;
-                break;
+                throw new CoolException("妫�绱㈠簱浣嶅け璐ワ紝璇疯仈绯荤鐞嗗憳");
         }
         // 鐢熸垚宸ヤ綔鍙�
         int workNo = getWorkNo(0);
@@ -142,19 +143,19 @@
         // 鐩爣搴撲綅
         LocMast locMast = null;
 
-
         // 闈犺繎鎽嗘斁瑙勫垯 --- 鍚屽ぉ鍚岃鏍肩墿鏂�
-        if (!Cools.isEmpty(matNos)) {
+        if (!Cools.isEmpty(matNos) && matNos.size() == 1) {
             List<String> locNos = locDetlService.getSameDetl(matNos.get(0), start, end);
             for (String locNo : locNos) {
                 List<String> groupLoc = Utils.getGroupLoc(locNo);
-                locMast = locMastService.findOutMost(groupLoc);
-                if (null != locMast) {
+                LocMast locMast0 = locMastService.findOutMost(groupLoc);
+                if (null != locMast0) {
                     // 娴呭簱浣嶇鍚堝昂瀵告娴�
-                    if (VersionUtils.locMoveCheckLocType(locMast, locTypeDto)) {
+                    if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                         // 娴呭簱浣嶅搴斿爢鍨涙満蹇呴』鍙敤涓旀棤寮傚父
-                        if (basCrnpService.checkSiteError(locMast.getCrnNo(), true)) {
-                            crnNo = locMast.getCrnNo(); // todo:luxiaotao crn 涓嶇瓑浜巐ocMast.crnNo
+                        if (basCrnpService.checkSiteError(locMast0.getCrnNo(), true)) {
+                            crnNo = locMast0.getCrnNo();
+                            locMast = locMast0;
                             break;
                         }
                     }
@@ -164,17 +165,19 @@
 
         // 闈犺繎鎽嗘斁瑙勫垯 --- 绌烘墭
         if (staDescId == 10) {
-            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", start).le("row1", end));
+            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
+                    .eq("loc_sts", "D").ge("row1", start).le("row1", end));
             if (locMasts.size() > 0) {
                 for (LocMast loc : locMasts) {
                     List<String> groupLoc = Utils.getGroupLoc(loc.getLocNo());
-                    locMast = locMastService.findOutMost(groupLoc);
-                    if (null != locMast) {
+                    LocMast locMast0 = locMastService.findOutMost(groupLoc);
+                    if (null != locMast0) {
                         // 娴呭簱浣嶇鍚堝昂瀵告娴�
-                        if (VersionUtils.locMoveCheckLocType(locMast, locTypeDto)) {
+                        if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                             // 娴呭簱浣嶅搴斿爢鍨涙満蹇呴』鍙敤涓旀棤寮傚父
-                            if (basCrnpService.checkSiteError(locMast.getCrnNo(), true)) {
-                                crnNo = locMast.getCrnNo(); // todo:luxiaotao crn 涓嶇瓑浜巐ocMast.crnNo
+                            if (basCrnpService.checkSiteError(locMast0.getCrnNo(), true)) {
+                                crnNo = locMast0.getCrnNo();
+                                locMast = locMast0;
                                 break;
                             }
                         }
@@ -184,16 +187,55 @@
         }
 
         // 濡傛灉娌℃湁鐩歌繎鐗╂枡锛屽垯鎸夎鍒欒疆璇㈣揣鏋�
+
+        int currentRow = 1;
         if (null == locMast) {
             Shelves shelves = new Shelves(rowCount, crn_qty);
             for (int i = 0; i < shelves.group; i ++) {
+                if (i > 0) {
+                    curRow = currentRow;
+                }
                 curRow = shelves.start(curRow);
                 if (curRow < 0) {
                     throw new CoolException("妫�绱㈠簱浣嶅け璐ワ紝璇疯仈绯荤鐞嗗憳");
                 }
-                Integer crnNo1 = shelves.get(curRow) + 1;
-                if (whsType != 1) {
-                    crnNo1 = whsType;
+                currentRow = curRow;
+                int crnNo1 = shelves.get(curRow);
+                if (whsType == 1) {
+                    switch (curRow) {
+                        case 1:
+                            curRow = 1;
+                            break;
+                        case 2:
+                            curRow = 7;
+                            break;
+                        case 3:
+                            curRow = 8;
+                            break;
+                        case 4:
+                            curRow = 14;
+                            break;
+                        default:
+                            throw new CoolException("妫�绱㈠簱浣嶅け璐ワ紝璇疯仈绯荤鐞嗗憳");
+                    }
+                } else {
+                    switch (curRow) {
+                        case 1:
+                            curRow = 8;
+                            break;
+                        case 2:
+                            curRow = 14;
+                            break;
+                        case 3:
+                            curRow = 15;
+                            break;
+                        case 4:
+                            curRow = 21;
+                            break;
+                        default:
+                            throw new CoolException("妫�绱㈠簱浣嶅け璐ワ紝璇疯仈绯荤鐞嗗憳");
+                    }
+                    crnNo1 = crnNo1 + 1;
                 }
                 if (basCrnpService.checkSiteError(crnNo1, true)) {
                     crnNo = crnNo1;
@@ -223,33 +265,26 @@
         }
 
         // 鏇存柊搴撲綅鎺掑彿
-        rowLastno.setCurrentRow(curRow);
+        rowLastno.setCurrentRow(currentRow);
         rowLastnoService.updateById(rowLastno);
 
         // 寮�濮嬫煡鎵惧簱浣� ==============================>>
 
         // 1.褰撴绱㈠簱鎺掍负娴呭簱浣嶆帓鏃讹紝浼樺厛瀵绘壘褰撳墠搴撴帓鐨勬繁搴撲綅鎺�
         if (locMast == null) {
-            List<Integer> rows;
-            if (whsType == 2) {
-                rows = FIRST_GROUP_ROW_LIST;
-            } else if (whsType == 3) {
-                rows = SECOND_GROUP_ROW_LIST;
-            } else {
-                switch (curRow) {
-                    case 1:
-                        rows = FIRST_GROUP_ROW_LIST;
+            List<Integer> rows = Utils.getGroupLoc(curRow);
+
+            List<LocMast> locMasts = locMastService.queryFreeLocMast(rows, rows.size(), locTypeDto.getLocType1());
+            if (!Cools.isEmpty(locMasts)) {
+                Integer innermostRow = Utils.getInnermostRow(locMasts.get(0).getLocNo());
+                for (LocMast one : locMasts) {
+                    if (one.getRow1().equals(innermostRow)) {
+                        locMast = one;
                         break;
-                    case 2:
-                        rows = SECOND_GROUP_ROW_LIST;
-                        break;
-                    default:
-                        throw new CoolException("鍏ュ簱閫昏緫鏁呴殰銆�" + curRow + "銆�");
+                    }
                 }
             }
-
-            locMast = locMastService.queryFreeLocMast(null, rows, locTypeDto.getLocType1());
-            // 鍥犲簱浣嶇Щ杞�侀渶棰勭暀绌哄簱浣�
+            // 鍥犲簱浣嶇Щ杞�侀渶棰勭暀绌哄簱浣� todo:luxiaotao
 //            if (!locMastService.checkEmptyCount(locMast)) {
 //                locMast = null;
 //            }
diff --git a/src/main/java/com/zy/common/web/BaseController.java b/src/main/java/com/zy/common/web/BaseController.java
index 60d9fc1..01ce52c 100644
--- a/src/main/java/com/zy/common/web/BaseController.java
+++ b/src/main/java/com/zy/common/web/BaseController.java
@@ -1,5 +1,6 @@
 package com.zy.common.web;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotations.TableField;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
@@ -142,4 +143,17 @@
             wrapper.like(columns.get(i), condition);
         }
     }
+
+    public static boolean isJSON(String str) {
+        if (Cools.isEmpty(str)) {
+            return false;
+        } else {
+            try {
+                JSON.parse(str);
+                return true;
+            } catch (Exception e) {
+                return false;
+            }
+        }
+    }
 }
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index 6a19487..5cd4bcd 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -90,6 +90,11 @@
             case 10://绌烘墭鐩樺叆搴�
                 dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
                 break;
+            case 103:// 鎷f枡鍏ュ簱
+            case 104:// 骞舵澘鍏ュ簱
+            case 107:// 鐩樼偣鍏ュ簱
+                dto = pickWrkPlateIn(param.getWrkNo(), param.getIoType(), param.getSourceStaNo(), locTypeDto);
+                break;
             default:
                 break;
         }
@@ -116,7 +121,8 @@
         wrkMast.setIoTime(new Date());
         wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
         wrkMast.setIoType(1); // 鍏ュ嚭搴撶姸鎬侊細1.鍏ュ簱
-        wrkMast.setIoPri(13D); // 浼樺厛绾�
+        Double ioPri = wrkMastService.getIoPri(1, dto.getLocNo());
+        wrkMast.setIoPri(ioPri); // 浼樺厛绾�
         wrkMast.setCrnNo(dto.getCrnNo());
         wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), true)?1:0);;
         wrkMast.setSourceStaNo(dto.getSourceStaNo());
@@ -190,7 +196,8 @@
         wrkMast.setIoTime(new Date());
         wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
         wrkMast.setIoType(10); // 鍏ュ嚭搴撶姸鎬侊細10.绌烘澘鍏ュ簱
-        wrkMast.setIoPri(13D); // 浼樺厛绾�
+        Double ioPri = wrkMastService.getIoPri(10, dto.getLocNo());
+        wrkMast.setIoPri(ioPri); // 浼樺厛绾�
         wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), true)?1:0);;
         wrkMast.setCrnNo(dto.getCrnNo());
         wrkMast.setSourceStaNo(dto.getSourceStaNo());
@@ -202,6 +209,7 @@
         wrkMast.setEmptyMk("Y"); // 绌烘澘
         wrkMast.setLinkMis("Y");
         wrkMast.setBarcode(barcode);
+//        wrkMast.setSteNo(findSte(wrkMast.getLocNo()));
         wrkMast.setCtnType(sourceStaNo.getCtnType()); // 瀹瑰櫒绫诲瀷
         // 鎿嶄綔浜哄憳鏁版嵁
         wrkMast.setAppeTime(new Date());
@@ -230,4 +238,20 @@
         return dto;
     }
 
+    @Transactional
+    public StartupDto pickWrkPlateIn(Integer wrkNo, Integer ioType, Integer devpNo, LocTypeDto locTypeDto) {
+        WrkMast wrkMast = wrkMastService.selectOfPick(wrkNo, ioType);
+        if (Cools.isEmpty(wrkMast)) {
+            log.error("{}浠诲姟銆恑oType = {}銆戝凡杩囨湡!!!", wrkNo, ioType);
+            throw new CoolException(CodeRes.NONE_MAST_800);
+        }
+        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
+        if (Cools.isEmpty(wrkDetls)) {
+            throw new CoolException(CodeRes.NONE_DETL_900);
+        }
+        // 妫�绱㈠簱浣�
+        List<String> matnrList = wrkDetls.stream().map(WrkDetl::getMatnr).distinct().collect(Collectors.toList());
+        return commonService.getLocNo(1, ioType - 50, devpNo, matnrList, locTypeDto,0); // 搴撲綅鍙凤紝 鍫嗗灈鏈猴紝鐩爣绔�
+    }
+
 }
diff --git a/src/main/java/com/zy/common/web/param/SearchLocParam.java b/src/main/java/com/zy/common/web/param/SearchLocParam.java
index 1a170ce..df746f0 100644
--- a/src/main/java/com/zy/common/web/param/SearchLocParam.java
+++ b/src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -8,6 +8,8 @@
 @Data
 public class SearchLocParam {
 
+    private Integer wrkNo;
+
     private Integer ioType;
 
     private Integer sourceStaNo;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5d7c208..c2987e9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,5 +1,5 @@
 server:
-  port: 8081
+  port: 8080
   servlet:
     context-path: /@pom.build.finalName@
 
@@ -10,10 +10,11 @@
     enabled: false
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    url: jdbc:sqlserver://47.97.1.152:51433;databasename=ynasrs
-#    url: jdbc:sqlserver://localhost:1433;databasename=ynasrs
+#    url: jdbc:sqlserver://10.10.10.100:1433;databasename=bfasrs
+    url: jdbc:sqlserver://localhost:1433;databasename=bfasrs
     username: sa
-    password: Zoneyung@zy56$
+#    password: Zoneyung@zy56$
+    password: sa@123
   mvc:
     static-path-pattern: /**
   redis:
@@ -45,7 +46,7 @@
 # 涓嬩綅鏈洪厤缃�
 wcs-slave:
   # 鍙屾繁
-  doubleDeep: true
+  doubleDeep: false
   # 鍙屾繁搴撲綅鎺掑彿
   doubleLocs: 1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32,33,36,37,40,41,44,45,48
   # 涓�涓爢鍨涙満璐熻矗鐨勮揣鏋舵帓鏁�
diff --git a/src/main/resources/mapper/BasSteErrLogMapper.xml b/src/main/resources/mapper/BasSteErrLogMapper.xml
new file mode 100644
index 0000000..393f570
--- /dev/null
+++ b/src/main/resources/mapper/BasSteErrLogMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasSteErrLogMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasSteErrLog">
+        <id column="id" property="id" />
+        <result column="uuid" property="uuid" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="wrk_sts" property="wrkSts" />
+        <result column="io_type" property="ioType" />
+        <result column="ste_no" property="steNo" />
+        <result column="plc_no" property="plcNo" />
+        <result column="loc_no" property="locNo" />
+        <result column="sta_no" property="staNo" />
+        <result column="source_sta_no" property="sourceStaNo" />
+        <result column="source_loc_no" property="sourceLocNo" />
+        <result column="barcode" property="barcode" />
+        <result column="err_code" property="errCode" />
+        <result column="error" property="error" />
+        <result column="status" property="status" />
+        <result column="create_time" property="createTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="memo" property="memo" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/BasSteMapper.xml b/src/main/resources/mapper/BasSteMapper.xml
index d445c94..faad74e 100644
--- a/src/main/resources/mapper/BasSteMapper.xml
+++ b/src/main/resources/mapper/BasSteMapper.xml
@@ -19,6 +19,7 @@
         <result column="idle_loc" property="idleLoc" />
         <result column="ste_err" property="steErr" />
         <result column="pak_mk" property="pakMk" />
+        <result column="charge_line" property="chargeLine" />
         <result column="status" property="status" />
         <result column="create_by" property="createBy" />
         <result column="create_time" property="createTime" />
diff --git a/src/main/resources/mapper/LocMastMapper.xml b/src/main/resources/mapper/LocMastMapper.xml
index 2c261f9..a98b6f4 100644
--- a/src/main/resources/mapper/LocMastMapper.xml
+++ b/src/main/resources/mapper/LocMastMapper.xml
@@ -39,18 +39,39 @@
     </resultMap>
 
     <select id="queryFreeLocMast" resultMap="BaseResultMap">
-        select top 1 *
+        select
+        *
         from asr_loc_mast
-        where
-        row1 in
+        where 1=1
+        and row1 in
         <foreach item="item" collection="rows" index="index"  separator="," open="(" close=")">
             #{item}
         </foreach>
-        <if test="locType1 != null">
-            and loc_type1 = #{locType1}
-        </if>
-        and loc_sts='O'
-        order by loc_sts desc,row1 asc, lev1 asc, bay1 asc
+        and ctn_no =
+        (
+            select
+            top 1
+            ctn_no
+            from (
+                select
+                ctn_no,
+                count(1) as count
+                from asr_loc_mast
+                where 1=1
+                and row1 in
+                <foreach item="item" collection="rows" index="index"  separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+                and loc_sts = 'O'
+                <if test="locType1 != null">
+                    and loc_type1 = #{locType1}
+                </if>
+                and loc_no not in ('0100101', '0200101', '0300101', '1200701', '1300701', '1400701', '1900401', '2000401', '2100401')
+                group by ctn_no
+            ) a
+            where count = #{rowsLen}
+            order by right(ctn_no, 2) + 0 asc, left(ctn_no, 3) + 0 asc
+        )
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/MatMapper.xml b/src/main/resources/mapper/MatMapper.xml
index 5f89c82..0a13399 100644
--- a/src/main/resources/mapper/MatMapper.xml
+++ b/src/main/resources/mapper/MatMapper.xml
@@ -68,6 +68,9 @@
         <if test="maktx != null and maktx != ''">
             and mm.maktx like concat('%',#{maktx},'%')
         </if>
+        <if test="specs != null and specs != ''">
+            and mm.specs like concat('%',#{specs},'%')
+        </if>
         ORDER BY mm.create_time DESC
     </select>
 
diff --git a/src/main/resources/mapper/OrderDetlMapper.xml b/src/main/resources/mapper/OrderDetlMapper.xml
index 4fe7eea..6cab66f 100644
--- a/src/main/resources/mapper/OrderDetlMapper.xml
+++ b/src/main/resources/mapper/OrderDetlMapper.xml
@@ -126,6 +126,22 @@
         <include refid="pakOutPageCondition"></include>
     </select>
 
+    <update id="increaseAnfme">
+        update man_order_detl
+        set anfme = anfme + #{qty}
+        where 1=1
+        and order_id = #{orderId}
+        and matnr = #{matnr}
+        <choose>
+            <when test="batch != null and batch != ''">
+                and batch = #{batch}
+            </when>
+            <otherwise>
+                and (batch IS NULL OR batch = '')
+            </otherwise>
+        </choose>
+    </update>
+
     <update id="increase">
         update man_order_detl
         set qty = qty + #{qty}
@@ -165,4 +181,13 @@
         and order_id = #{orderId}
     </update>
 
+    <select id="selectRemainder" resultMap="BaseResultMap">
+        select
+        *
+        from man_order_detl
+        where 1=1
+        and anfme > qty
+        and order_id = #{orderId}
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/WrkChargeMapper.xml b/src/main/resources/mapper/WrkChargeMapper.xml
new file mode 100644
index 0000000..5499e2a
--- /dev/null
+++ b/src/main/resources/mapper/WrkChargeMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.WrkChargeMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkCharge">
+        <id column="wrk_no" property="wrkNo" />
+        <result column="mk" property="mk" />
+        <result column="wrk_sts" property="wrkSts" />
+        <result column="io_type" property="ioType" />
+        <result column="crn_no" property="crnNo" />
+        <result column="ste_no" property="steNo" />
+        <result column="out_most" property="outMost" />
+        <result column="io_pri" property="ioPri" />
+        <result column="loc_no" property="locNo" />
+        <result column="sta_no" property="staNo" />
+        <result column="source_sta_no" property="sourceStaNo" />
+        <result column="source_loc_no" property="sourceLocNo" />
+        <result column="empty_mk" property="emptyMk" />
+        <result column="io_time" property="ioTime" />
+        <result column="crn_str_time" property="crnStrTime" />
+        <result column="crn_end_time" property="crnEndTime" />
+        <result column="modi_user" property="modiUser" />
+        <result column="modi_time" property="modiTime" />
+        <result column="appe_user" property="appeUser" />
+        <result column="appe_time" property="appeTime" />
+        <result column="memo" property="memo" />
+        <result column="barcode" property="barcode" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index 89f73ec..70dd04c 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -78,4 +78,26 @@
         order by io_time,wrk_no asc
     </select>
 
+    <select id="selectByLocNoOfPakin" resultMap="BaseResultMap">
+        select top 1 *
+        from asr_wrk_mast
+        where 1=1
+        and io_type &lt; 100 and io_type != 11
+        and loc_no = #{locNo}
+        and wrk_sts &lt; 9
+    </select>
+
+    <select id="selectBySourceLocNoOfPakout" resultMap="BaseResultMap">
+        select top 1 *
+        from asr_wrk_mast
+        where 1=1
+        and io_type > 100
+        and source_loc_no = #{sourceLocNo}
+        and wrk_sts &lt; 17
+    </select>
+
+    <select id="selectOfPick" resultMap="BaseResultMap">
+        select top 1 * from asr_wrk_mast where wrk_no=#{wrkNo} and wrk_sts=17 and io_type = #{ioType}
+    </select>
+
 </mapper>
diff --git a/src/main/webapp/static/js/basSte/basSte.js b/src/main/webapp/static/js/basSte/basSte.js
index 90cc02f..9239199 100644
--- a/src/main/webapp/static/js/basSte/basSte.js
+++ b/src/main/webapp/static/js/basSte/basSte.js
@@ -38,6 +38,7 @@
             ,{field: 'hisLev', align: 'center',title: '鍘嗗彶灞�', hide: true}
             ,{field: 'idleLoc', align: 'center',title: '鏆傚瓨搴撲綅'}
             ,{field: 'steErr', align: 'center',title: '閿欒鐮�'}
+            ,{field: 'chargeLine', align: 'center',title: '鏈�浣庣數閲�%'}
             ,{field: 'pakMk', align: 'center',title: '鏍囪', hide: true}
             // ,{field: 'status$', align: 'center',title: '鐘舵��'}
             // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
diff --git a/src/main/webapp/static/js/basSteErrLog/basSteErrLog.js b/src/main/webapp/static/js/basSteErrLog/basSteErrLog.js
new file mode 100644
index 0000000..3fd6731
--- /dev/null
+++ b/src/main/webapp/static/js/basSteErrLog/basSteErrLog.js
@@ -0,0 +1,285 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#basSteErrLog',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/basSteErrLog/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+//            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
+            ,{field: 'uuid', align: 'center',title: '缂栧彿', hide: true}
+            ,{field: 'wrkNo', align: 'center',title: '宸ヤ綔鍙�'}
+            ,{field: 'startTime$', align: 'center',title: '鍙戠敓鏃堕棿'}
+            ,{field: 'endTime$', align: 'center',title: '缁撴潫鏃堕棿'}
+            ,{field: 'wrkSts$', align: 'center',title: '宸ヤ綔鐘舵��'}
+            ,{field: 'ioType$', align: 'center',title: '鍏ュ嚭搴撶被鍨�'}
+            ,{field: 'steNo', align: 'center',title: '绌挎杞�'}
+            ,{field: 'plcNo', align: 'center',title: 'plc', hide: true}
+            ,{field: 'locNo', align: 'center',title: '鐩爣搴撲綅', hide: true}
+            ,{field: 'staNo', align: 'center',title: '鐩爣绔�', hide: true}
+            ,{field: 'sourceStaNo', align: 'center',title: '婧愮珯', hide: true}
+            ,{field: 'sourceLocNo', align: 'center',title: '婧愬簱浣�', hide: true}
+            ,{field: 'barcode', align: 'center',title: '鏉$爜', hide: true}
+            ,{field: 'errCode', align: 'center',title: '寮傚父鐮�'}
+            ,{field: 'error', align: 'center',title: '寮傚父鎻忚堪'}
+            ,{field: 'status$', align: 'center',title: '寮傚父鎯呭喌'}
+            // ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
+            ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿', hide: true}
+            ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳', hide: true}
+            ,{field: 'memo', align: 'center',title: '澶囨敞', hide: true}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(basSteErrLog)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(basSteErrLog)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'basSteErrLog': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/basSteErrLog/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(basSteErrLog)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/basSteErrLog/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/basSteErrLog/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+            layDate.render({
+                elem: '#startTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['startTime\\$']:null
+            });
+            layDate.render({
+                elem: '#endTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['endTime\\$']:null
+            });
+            layDate.render({
+                elem: '#createTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['createTime\\$']:null
+            });
+            layDate.render({
+                elem: '#updateTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['updateTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 7bb6b64..fd981ae 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
-var baseUrl = "/ynwms";
+var baseUrl = "/bfwms";
 
 // 璇︽儏绐楀彛-楂樺害
 var detailHeight = '80%';
@@ -185,10 +185,10 @@
     // {field: 'id', align: 'center',title: 'ID'}
     // ,{field: 'uuid', align: 'center',title: '缂栧彿'}
     // ,{field: 'tagId$', align: 'center',title: '鎵�灞炲綊绫�'}
-    ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', width: 200}
+    ,{field: 'specs', align: 'center',title: '瑙勬牸', width: 200}
+    ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О'}
     // ,{field: 'name', align: 'center',title: '鍒悕'}
-    ,{field: 'specs', align: 'center',title: '閰嶇疆'}
-    ,{field: 'model', align: 'center',title: '浠g爜', hide: false}
+    ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
     ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
     ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
     ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
@@ -201,10 +201,10 @@
     ,{field: 'manuDate', align: 'center',title: '鐢熶骇鏃ユ湡', hide: true}
     ,{field: 'itemNum', align: 'center',title: '鍝侀」鏁�', hide: true}
     ,{field: 'safeQty', align: 'center',title: '瀹夊叏搴撳瓨閲�', hide: true}
-    ,{field: 'weight', align: 'center',title: '鍗曠鍑�閲�', hide: false}
-    ,{field: 'length', align: 'center',title: '鍗曠姣涢噸', hide: false}
-    ,{field: 'volume', align: 'center',title: '鍗曠浣撶Н', hide: false}
-    ,{field: 'threeCode', align: 'center',title: '绠卞瓙灏哄', hide: false}
+    ,{field: 'weight', align: 'center',title: '鍗曠鍑�閲�', hide: true}
+    ,{field: 'length', align: 'center',title: '鍗曠姣涢噸', hide: true}
+    ,{field: 'volume', align: 'center',title: '鍗曠浣撶Н', hide: true}
+    ,{field: 'threeCode', align: 'center',title: '绠卞瓙灏哄', hide: true}
     ,{field: 'supp', align: 'center',title: '渚涘簲鍟�', hide: true}
     ,{field: 'suppCode', align: 'center',title: '渚涘簲鍟嗙紪鐮�', hide: true}
     ,{field: 'beBatch$', align: 'center',title: '鏄惁鎵规', hide: true}
@@ -223,14 +223,14 @@
 
 var detlCols = [
     {field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿', sort:true}
+    ,{field: 'specs', align: 'center',title: '瑙勬牸'}
     ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', sort:true}
     ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: false}
     ,{field: 'batch', align: 'center',title: '搴忓垪鐮�', width: 300, sort:true}
     ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
     ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
 
-    ,{field: 'specs', align: 'center',title: '閰嶇疆'}
-    ,{field: 'model', align: 'center',title: '浠g爜', hide: false}
+    ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
     ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
     ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
     ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
@@ -243,10 +243,10 @@
     ,{field: 'manuDate', align: 'center',title: '鐢熶骇鏃ユ湡', hide: true}
     ,{field: 'itemNum', align: 'center',title: '鍝侀」鏁�', hide: true}
     ,{field: 'safeQty', align: 'center',title: '瀹夊叏搴撳瓨閲�', hide: true}
-    ,{field: 'weight', align: 'center',title: '鍗曠鍑�閲�', hide: false}
-    ,{field: 'length', align: 'center',title: '鍗曠姣涢噸', hide: false}
-    ,{field: 'volume', align: 'center',title: '鍗曠浣撶Н', hide: false}
-    ,{field: 'threeCode', align: 'center',title: '绠卞瓙灏哄', hide: false}
+    ,{field: 'weight', align: 'center',title: '鍗曠鍑�閲�', hide: true}
+    ,{field: 'length', align: 'center',title: '鍗曠姣涢噸', hide: true}
+    ,{field: 'volume', align: 'center',title: '鍗曠浣撶Н', hide: true}
+    ,{field: 'threeCode', align: 'center',title: '绠卞瓙灏哄', hide: true}
     ,{field: 'supp', align: 'center',title: '渚涘簲鍟�', hide: true}
     ,{field: 'suppCode', align: 'center',title: '渚涘簲鍟嗙紪鐮�', hide: true}
     ,{field: 'beBatch$', align: 'center',title: '鏄惁鎵规', hide: true}
diff --git a/src/main/webapp/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index 7c9a734..9ec3489 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -9,7 +9,7 @@
         ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
         ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
 
-        ,{field: 'specs', align: 'center',title: '閰嶇疆'}
+        ,{field: 'specs', align: 'center',title: '瑙勬牸'}
         ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
         ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
         ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
diff --git a/src/main/webapp/static/js/order/order.js b/src/main/webapp/static/js/order/order.js
index cc58f12..3ef4275 100644
--- a/src/main/webapp/static/js/order/order.js
+++ b/src/main/webapp/static/js/order/order.js
@@ -1,4 +1,6 @@
 var insTbCount = 0;
+var admin;
+var insTb
 layui.config({
     base: baseUrl + "/static/layui/lay/modules/"
 }).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () {
@@ -7,7 +9,7 @@
     var form = layui.form;
     var table = layui.table;
     var util = layui.util;
-    var admin = layui.admin;
+    admin = layui.admin;
     var xmSelect = layui.xmSelect;
     var layDate = layui.laydate;
     var laytpl = layui.laytpl;
@@ -34,7 +36,7 @@
     })
 
     // 娓叉煋琛ㄦ牸
-    var insTb = table.render({
+    insTb = table.render({
         elem: '#order',
         url: baseUrl+'/order/head/page/auth',
         headers: {token: localStorage.getItem('token')},
@@ -82,6 +84,11 @@
     // 娣诲姞
     $("#orderAddBtn").click(function () {
         showEditModel();
+    });
+
+    // 瀵煎叆閿�鍞崟
+    $("#importOrder").click(function () {
+        $("#importExcel").trigger("click");
     });
 
     // 宸ュ叿鏉$偣鍑讳簨浠�
@@ -527,3 +534,46 @@
         ,range: true
     });
 });
+
+function upload(obj){
+    if(!obj.files) {
+        return;
+    }
+    var file = obj.files[0];
+    admin.confirm('纭瀵煎叆 [' + file.name +'] 鏂囦欢鍚楋紵', function (index) {
+        layer.load(1, {shade: [0.1,'#fff']});
+        var url = baseUrl + "/order/excel/import/auth";
+        var form = new FormData();
+        form.append("file", file);
+        let xhr = new XMLHttpRequest();
+        xhr.open("post", url, true);
+        xhr.setRequestHeader('token', localStorage.getItem('token'));
+        xhr.onload = uploadComplete;
+        xhr.onerror =  uploadFailed;
+        xhr.onloadend = function () {
+            layer.closeAll('loading');
+        };
+        // xhr.upload.onprogress = progressFunction;
+        xhr.upload.onloadstart = function(){
+            ot = new Date().getTime();
+            oloaded = 0;
+        };
+        xhr.send(form);
+    }, function(index){
+    });
+}
+function uploadComplete(evt) {
+    let res = JSON.parse(evt.target.responseText);
+    if(res.code === 200) {
+        layer.msg(res.msg, {icon: 1});
+        insTb.reload({page: {curr: 1}});
+    } else {
+        alert(res.msg);
+        // layer.msg(res.msg, {icon: 2});
+    }
+}
+function uploadFailed(evt) {
+    let res = JSON.parse(evt.target.responseText);
+    alert(res.msg);
+    // layer.msg(res.msg, {icon: 2});
+}
diff --git a/src/main/webapp/static/js/order/out.js b/src/main/webapp/static/js/order/out.js
index 4889cf0..0687db2 100644
--- a/src/main/webapp/static/js/order/out.js
+++ b/src/main/webapp/static/js/order/out.js
@@ -88,7 +88,6 @@
 
     /* 琛ㄦ牸2澶村伐鍏锋爮鐐瑰嚮浜嬩欢 */
     table.on('toolbar(orderDetlTable)', function (obj) {
-
         var checkStatus = table.checkStatus(obj.config.id).data;
         if (obj.event === 'pakoutPreview') { // 娣诲姞
             if (checkStatus.length === 0) {
@@ -132,130 +131,8 @@
             method: 'POST',
             success: function (res) {
                 layer.close(loadIndex);
-                var tableCache;
                 if (res.code === 200){
-                    layer.open({
-                        type: 1
-                        ,title: false
-                        ,closeBtn: false
-                        ,offset: '50px'
-                        ,area: ['1200px', '700px']
-                        ,shade: 0.5
-                        ,shadeClose: false
-                        ,btn: ['绔嬪嵆鍑哄簱', '绋嶅悗澶勭悊']
-                        ,btnAlign: 'c'
-                        ,moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
-                        ,content: $('#pakoutPreviewBox').html()
-                        ,success: function(layero, index){
-                            stoPreTabIdx = table.render({
-                                elem: '#stoPreTab',
-                                data: res.data,
-                                height: 520,
-                                page: false,
-                                limit: Number.MAX_VALUE,
-                                cellMinWidth: 100,
-                                cols: [[
-                                    // {type: 'checkbox', merge: ['orderNo']},
-                                    {field: 'orderNo', title: '鍗曟嵁缂栧彿', merge: true, align: 'center'},
-                                    {field: 'title', title: '鍟嗗搧', merge: true, align: 'center', width: 350},
-                                    {field: 'batch', title: '搴忓垪鐮�', align: 'center'},
-                                    {field: 'anfme', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
-                                    {field: 'locNo', title: '璐т綅', align: 'center', width: 100, templet: '#locNoTpl'},
-                                    {field: 'staNos', align: 'center', title: '鍑哄簱绔�', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
-                                    // {type: 'checkbox', merge: ['locNo']},
-                                ]],
-                                done: function (res) {
-                                    tableMerge.render(this);
-                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
-                                    tableCache = tableData = table.cache.stoPreTab;
-                                }
-                            });
-                            // 淇敼鍑哄簱绔�
-                            form.on('select(tbBasicTbStaNos)', function (obj) {
-                                let index  = obj.othis.parents('tr').attr("data-index");
-                                let data = tableCache[index];
-                                for (let i = 0; i<tableCache.length; i++) {
-                                    if (tableCache[i].locNo === data.locNo) {
-                                        tableCache[i]['staNo'] = Number(obj.elem.value);
-                                    }
-                                }
-                                obj.othis.children().find("input").css("color", "blue");
-                                return false;
-                            });
-                            // 鎵归噺淇敼鍑哄簱绔�
-                            form.on('submit(batchModifySta)', function () {
-                                modifySta();
-                            });
-                            // 鎵归噺淇敼鍑哄簱绔� - 绔欑偣閫夋嫨
-                            function modifySta() {
-                                // 鍑哄簱绔欏彇浜ら泦
-                                let staBatchSelectVal = [];
-                                for(let i = 0; i<tableCache.length; i++) {
-                                    let staNos = tableCache[i].staNos;
-                                    if (staNos !== null) {
-                                        if (staBatchSelectVal.length === 0) {
-                                            staBatchSelectVal = staNos;
-                                        } else {
-                                            staBatchSelectVal = staBatchSelectVal.filter(val =>
-                                                {
-                                                    return new Set(staNos).has(val)
-                                                }
-                                            )
-                                        }
-                                    }
-                                }
-                                if (staBatchSelectVal.length === 0) {
-                                    layer.msg("鍑哄簱绔欐病鏈変氦闆嗭紝鏃犳硶鎵归噺淇敼", {icon: 2});
-                                    return;
-                                }
-                                admin.open({
-                                    type: 1,
-                                    area: '300px',
-                                    offset: 'auto',
-                                    title: '璇烽�夋嫨绔欑偣',
-                                    content: $('#staBatchSelectDialog').html(),
-                                    success: function (layero, ddIndex) {
-                                        // 娓叉煋涓嬫媺妗�
-                                        let template = Handlebars.compile($('#batchStaSelectTpl').html());
-                                        $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
-                                        // 纭
-                                        form.on('submit(staBatchSelectConfirm)', function (obj) {
-                                            let loadIdx = layer.load(2);
-                                            let batchSta = Number(obj.field.batchSta);
-                                            let arr = [];
-                                            for (let i = 0; i<tableCache.length; i++) {
-                                                tableCache[i]['staNo'] = batchSta;
-                                                arr.push(i);
-                                            }
-                                            stoPreTabIdx.reload({data: tableCache});
-                                            arr.forEach(item => {
-                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
-                                            });
-                                            layui.form.render('select');
-                                            arr.forEach(item => {
-                                                $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
-                                            });
-                                            layer.close(loadIdx); layer.close(ddIndex);
-                                            return false;
-                                        });
-                                        // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
-                                        $(layero).children('.layui-layer-content').css('overflow', 'visible');
-                                        layui.form.render('select');
-                                    },
-                                })
-                            }
-
-                        }
-                        ,yes: function(index, layero){
-                            //鎸夐挳銆愮珛鍗冲嚭搴撱�戠殑鍥炶皟
-                            pakout(tableCache, index);
-                        }
-                        ,btn2: function(index, layero){
-                            //鎸夐挳銆愮◢鍚庡鐞嗐�戠殑鍥炶皟
-                            layer.close(index)
-                            //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
-                        }
-                    });
+                    pakoutPreviewDialog(res.data)
                 } else if (res.code === 403){
                     top.location.href = baseUrl+"/";
                 } else {
@@ -263,6 +140,132 @@
                 }
             }
         })
+    }
+
+    function pakoutPreviewDialog(data) {
+        var tableCache;
+        layer.open({
+            type: 1
+            ,title: false
+            ,closeBtn: false
+            ,offset: '50px'
+            ,area: ['1200px', '700px']
+            ,shade: 0.5
+            ,shadeClose: false
+            ,btn: ['绔嬪嵆鍑哄簱', '绋嶅悗澶勭悊']
+            ,btnAlign: 'c'
+            ,moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
+            ,content: $('#pakoutPreviewBox').html()
+            ,success: function(layero, index){
+                stoPreTabIdx = table.render({
+                    elem: '#stoPreTab',
+                    data: data,
+                    height: 520,
+                    page: false,
+                    limit: Number.MAX_VALUE,
+                    cellMinWidth: 100,
+                    cols: [[
+                        // {type: 'checkbox', merge: ['orderNo']},
+                        {field: 'orderNo', title: '鍗曟嵁缂栧彿', merge: true, align: 'center'},
+                        {field: 'title', title: '鍟嗗搧', merge: true, align: 'center', width: 350},
+                        {field: 'batch', title: '搴忓垪鐮�', align: 'center'},
+                        {field: 'anfme', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                        {field: 'locNo', title: '璐т綅', align: 'center', width: 100, templet: '#locNoTpl'},
+                        {field: 'staNos', align: 'center', title: '鍑哄簱绔�', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
+                        // {type: 'checkbox', merge: ['locNo']},
+                    ]],
+                    done: function (res) {
+                        tableMerge.render(this);
+                        $('.layui-table-body.layui-table-main').css("overflow", "auto");
+                        tableCache = tableData = table.cache.stoPreTab;
+                    }
+                });
+                // 淇敼鍑哄簱绔�
+                form.on('select(tbBasicTbStaNos)', function (obj) {
+                    let index  = obj.othis.parents('tr').attr("data-index");
+                    let data = tableCache[index];
+                    for (let i = 0; i<tableCache.length; i++) {
+                        if (tableCache[i].locNo === data.locNo) {
+                            tableCache[i]['staNo'] = Number(obj.elem.value);
+                        }
+                    }
+                    obj.othis.children().find("input").css("color", "blue");
+                    return false;
+                });
+                // 鎵归噺淇敼鍑哄簱绔�
+                form.on('submit(batchModifySta)', function () {
+                    modifySta();
+                });
+                // 鎵归噺淇敼鍑哄簱绔� - 绔欑偣閫夋嫨
+                function modifySta() {
+                    // 鍑哄簱绔欏彇浜ら泦
+                    let staBatchSelectVal = [];
+                    for(let i = 0; i<tableCache.length; i++) {
+                        let staNos = tableCache[i].staNos;
+                        if (staNos !== null) {
+                            if (staBatchSelectVal.length === 0) {
+                                staBatchSelectVal = staNos;
+                            } else {
+                                staBatchSelectVal = staBatchSelectVal.filter(val =>
+                                    {
+                                        return new Set(staNos).has(val)
+                                    }
+                                )
+                            }
+                        }
+                    }
+                    if (staBatchSelectVal.length === 0) {
+                        layer.msg("鍑哄簱绔欐病鏈変氦闆嗭紝鏃犳硶鎵归噺淇敼", {icon: 2});
+                        return;
+                    }
+                    admin.open({
+                        type: 1,
+                        area: '300px',
+                        offset: 'auto',
+                        title: '璇烽�夋嫨绔欑偣',
+                        content: $('#staBatchSelectDialog').html(),
+                        success: function (layero, ddIndex) {
+                            // 娓叉煋涓嬫媺妗�
+                            let template = Handlebars.compile($('#batchStaSelectTpl').html());
+                            $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
+                            // 纭
+                            form.on('submit(staBatchSelectConfirm)', function (obj) {
+                                let loadIdx = layer.load(2);
+                                let batchSta = Number(obj.field.batchSta);
+                                let arr = [];
+                                for (let i = 0; i<tableCache.length; i++) {
+                                    tableCache[i]['staNo'] = batchSta;
+                                    arr.push(i);
+                                }
+                                stoPreTabIdx.reload({data: tableCache});
+                                arr.forEach(item => {
+                                    $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
+                                });
+                                layui.form.render('select');
+                                arr.forEach(item => {
+                                    $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
+                                });
+                                layer.close(loadIdx); layer.close(ddIndex);
+                                return false;
+                            });
+                            // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                            layui.form.render('select');
+                        },
+                    })
+                }
+
+            }
+            ,yes: function(index, layero){
+                //鎸夐挳銆愮珛鍗冲嚭搴撱�戠殑鍥炶皟
+                pakout(tableCache, index);
+            }
+            ,btn2: function(index, layero){
+                //鎸夐挳銆愮◢鍚庡鐞嗐�戠殑鍥炶皟
+                layer.close(index)
+                //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
+            }
+        });
     }
 
     function pakout(tableCache, layerIndex) {
@@ -333,6 +336,236 @@
 
     window.pakoutPreview = pakoutPreview;
 
+    // ----------------------------------------------------------------------------------------------------------------------------------
+
+    // 鍚堝苟鍑哄簱
+    form.on('submit(mergeOut)', function (data) {
+        let checkStatus = layui.table.checkStatus('originTable').data;
+        if (checkStatus.length < 2) {
+            layer.msg("璇疯嚦灏戦�夋嫨涓ゆ潯浠ヤ笂鍚堝苟鏁版嵁", {icon: 7});
+            return false;
+        }
+        showMerge(checkStatus.map(function (d) {
+            return d.id;
+        }));
+    });
+
+    // 璁㈠崟鍚堝苟绐楀彛
+    function showMerge(orderIds) {
+        let loadIndex = layer.load(2);
+        $.ajax({
+            url: baseUrl+"/order/merge/preview/auth",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'GET',
+            data: {
+                orderIds: orderIds
+            },
+            success: function (res) {
+                layer.close(loadIndex);
+                if (res.code === 200){
+                    layer.open({
+                        type: 1
+                        , title: false
+                        , closeBtn: false
+                        , offset: '50px'
+                        , area: ['1200px', '700px']
+                        , shade: 0.5
+                        , shadeClose: false
+                        , btn: ['纭畾', '鍙栨秷']
+                        , btnAlign: 'c'
+                        , moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
+                        , content: $('#mergeDialog').html()
+                        , success: function (layero, index) {
+                            orderMergeTabIdx = table.render({
+                                elem: '#orderMergeTab',
+                                data: res.data,
+                                height: 550,
+                                page: false,
+                                limit: Number.MAX_VALUE,
+                                cellMinWidth: 100,
+                                cols: [[
+                                    {type: 'checkbox'},
+                                    {field: 'matnr', title: '鍟嗗搧缂栫爜', align: 'center', width: 350},
+                                    {field: 'maktx', title: '鍟嗗搧鍚嶇О', align: 'center'},
+                                    {field: 'specs', title: '瑙勬牸', align: 'center'},
+                                    {field: 'batch', title: '鎵瑰彿', align: 'center'},
+                                    {field: 'anfme', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                                ]],
+                                done: function (res) {
+                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
+                                }
+                            });
+                        }
+                        , yes: function (index, layero) {
+                            //鎸夐挳銆愮‘瀹氥�戠殑鍥炶皟
+                            let checkStatus = layui.table.checkStatus('orderMergeTab').data;
+                            if (checkStatus.length < 1) {
+                                layer.msg("璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�", {icon: 7});
+                                return false;
+                            }
+                            let loadIndex = layer.load(2);
+                            $.ajax({
+                                url: baseUrl + "/out/pakout/preview/merge/auth",
+                                headers: {'token': localStorage.getItem('token')},
+                                contentType: 'application/json;charset=UTF-8',
+                                data: JSON.stringify(checkStatus),
+                                method: 'POST',
+                                success: function (res) {
+                                    layer.close(loadIndex);
+                                    if (res.code === 200){
+                                        layer.close(index)
+                                        pakoutPreviewMergeDialog(res.data)
+                                    } else if (res.code === 403){
+                                        top.location.href = baseUrl+"/";
+                                    } else {
+                                        layer.msg(res.msg, {icon: 2})
+                                    }
+                                }
+                            })
+                        }
+                        , btn2: function (index, layero) {
+                            //鎸夐挳銆愬彇娑堛�戠殑鍥炶皟
+                            layer.close(index)
+                            //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
+                        }
+                    })
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
+            }
+        })
+    }
+
+    function pakoutPreviewMergeDialog(data) {
+        var mergeTabCache;
+        layer.open({
+            type: 1
+            ,title: false
+            ,closeBtn: false
+            ,offset: '50px'
+            ,area: ['1200px', '700px']
+            ,shade: 0.5
+            ,shadeClose: false
+            ,btn: ['绔嬪嵆鍑哄簱', '绋嶅悗澶勭悊']
+            ,btnAlign: 'c'
+            ,moveType: 1 //鎷栨嫿妯″紡锛�0鎴栬��1
+            ,content: $('#pakoutPreviewMergeBox').html()
+            ,success: function(layero, index){
+                stoPreTabMergeIdx = table.render({
+                    elem: '#stoPreTabMerge',
+                    data: data,
+                    height: 520,
+                    page: false,
+                    limit: Number.MAX_VALUE,
+                    cellMinWidth: 100,
+                    cols: [[
+                        // {type: 'checkbox', merge: ['orderNo']},
+                        {field: 'title', title: '鍟嗗搧', merge: true, align: 'center', width: 350},
+                        {field: 'specs', title: '瑙勬牸', align: 'center'},
+                        {field: 'batch', title: '搴忓垪鐮�', align: 'center'},
+                        {field: 'anfme', title: '鏁伴噺', align: 'center', width: 90, style: 'font-weight: bold'},
+                        {field: 'locNo', title: '璐т綅', align: 'center', width: 100, templet: '#locNoTpl'},
+                        {field: 'staNos', align: 'center', title: '鍑哄簱绔�', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
+                        // {type: 'checkbox', merge: ['locNo']},
+                    ]],
+                    done: function (res) {
+                        tableMerge.render(this);
+                        $('.layui-table-body.layui-table-main').css("overflow", "auto");
+                        mergeTabCache = table.cache.stoPreTabMerge;
+                    }
+                });
+                // 淇敼鍑哄簱绔�
+                form.on('select(tbBasicTbStaNos)', function (obj) {
+                    let index  = obj.othis.parents('tr').attr("data-index");
+                    let data = mergeTabCache[index];
+                    for (let i = 0; i<mergeTabCache.length; i++) {
+                        if (mergeTabCache[i].locNo === data.locNo) {
+                            mergeTabCache[i]['staNo'] = Number(obj.elem.value);
+                        }
+                    }
+                    obj.othis.children().find("input").css("color", "blue");
+                    return false;
+                });
+                // 鎵归噺淇敼鍑哄簱绔�
+                form.on('submit(batchModifySta)', function () {
+                    modifySta();
+                });
+                // 鎵归噺淇敼鍑哄簱绔� - 绔欑偣閫夋嫨
+                function modifySta() {
+                    // 鍑哄簱绔欏彇浜ら泦
+                    let staBatchSelectVal = [];
+                    for(let i = 0; i<mergeTabCache.length; i++) {
+                        let staNos = mergeTabCache[i].staNos;
+                        if (staNos !== null) {
+                            if (staBatchSelectVal.length === 0) {
+                                staBatchSelectVal = staNos;
+                            } else {
+                                staBatchSelectVal = staBatchSelectVal.filter(val =>
+                                    {
+                                        return new Set(staNos).has(val)
+                                    }
+                                )
+                            }
+                        }
+                    }
+                    if (staBatchSelectVal.length === 0) {
+                        layer.msg("鍑哄簱绔欐病鏈変氦闆嗭紝鏃犳硶鎵归噺淇敼", {icon: 2});
+                        return;
+                    }
+                    admin.open({
+                        type: 1,
+                        area: '300px',
+                        offset: 'auto',
+                        title: '璇烽�夋嫨绔欑偣',
+                        content: $('#staBatchSelectDialog').html(),
+                        success: function (layero, ddIndex) {
+                            // 娓叉煋涓嬫媺妗�
+                            let template = Handlebars.compile($('#batchStaSelectTpl').html());
+                            $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
+                            // 纭
+                            form.on('submit(staBatchSelectConfirm)', function (obj) {
+                                let loadIdx = layer.load(2);
+                                let batchSta = Number(obj.field.batchSta);
+                                let arr = [];
+                                for (let i = 0; i<mergeTabCache.length; i++) {
+                                    mergeTabCache[i]['staNo'] = batchSta;
+                                    arr.push(i);
+                                }
+                                console.log(mergeTabCache)
+                                stoPreTabMergeIdx.reload({data: mergeTabCache});
+                                arr.forEach(item => {
+                                    $('div[lay-id=stoPreTabMerge] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
+                                });
+                                layui.form.render('select');
+                                arr.forEach(item => {
+                                    $('div[lay-id=stoPreTabMerge] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
+                                });
+                                layer.close(loadIdx); layer.close(ddIndex);
+                                return false;
+                            });
+                            // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                            layui.form.render('select');
+                        },
+                    })
+                }
+
+            }
+            ,yes: function(index, layero){
+                //鎸夐挳銆愮珛鍗冲嚭搴撱�戠殑鍥炶皟
+                pakout(mergeTabCache, index);
+            }
+            ,btn2: function(index, layero){
+                //鎸夐挳銆愮◢鍚庡鐞嗐�戠殑鍥炶皟
+                layer.close(index)
+                //return false 寮�鍚浠g爜鍙姝㈢偣鍑昏鎸夐挳鍏抽棴
+            }
+        });
+    }
+
+
 });
 
 function tableReload(child) {
diff --git a/src/main/webapp/static/js/orderTable.js b/src/main/webapp/static/js/orderTable.js
index 72f9075..450fd13 100644
--- a/src/main/webapp/static/js/orderTable.js
+++ b/src/main/webapp/static/js/orderTable.js
@@ -39,7 +39,7 @@
         //     '</p>'].join(''),
         defaultToolbar: [],
         cols: [[
-            // {type: 'numbers', title: '#'},
+            {type: 'checkbox'},
             {field: 'orderTime', title: '鏃ユ湡'},
             {field: 'orderNo', title: '鍗曟嵁缂栧彿', align: 'center'}
         ]],
diff --git a/src/main/webapp/static/js/wrkCharge/wrkCharge.js b/src/main/webapp/static/js/wrkCharge/wrkCharge.js
new file mode 100644
index 0000000..ccb6dc4
--- /dev/null
+++ b/src/main/webapp/static/js/wrkCharge/wrkCharge.js
@@ -0,0 +1,342 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#wrkCharge',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/wrkCharge/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'wrkNo', align: 'center',title: '宸ヤ綔鍙�'}
+            ,{align: 'center',title: '浠诲姟绫诲瀷', templet: '#memoTpl'}
+            // ,{field: 'mk', align: 'center',title: '鏍囪'}
+            ,{field: 'wrkSts$', align: 'center',title: '宸ヤ綔鐘舵��'}
+            // ,{field: 'ioType$', align: 'center',title: '鍏ュ嚭搴撶被鍨�'}
+            ,{field: 'crnNo$', align: 'center',title: '鍫嗗灈鏈�'}
+            ,{field: 'steNo$', align: 'center',title: '绌挎杞�'}
+            // ,{field: 'outMost', align: 'center',title: '宸烽亾鍙�'}
+            // ,{field: 'ioPri', align: 'center',title: '浼樺厛绾�'}
+            ,{field: 'locNo$', align: 'center',title: '鐩爣搴撲綅'}
+            // ,{field: 'staNo$', align: 'center',title: '鐩爣绔�'}
+            // ,{field: 'sourceStaNo$', align: 'center',title: '婧愮珯'}
+            ,{field: 'sourceLocNo$', align: 'center',title: '婧愬簱浣�'}
+            // ,{field: 'emptyMk', align: 'center',title: '绌烘澘(checkBox)'}
+            // ,{field: 'ioTime$', align: 'center',title: '宸ヤ綔鏃堕棿'}
+            // ,{field: 'crnStrTime$', align: 'center',title: '鍫嗗灈鏈哄惎鍔ㄦ椂闂�'}
+            // ,{field: 'crnEndTime$', align: 'center',title: '鍫嗗灈鏈哄仠姝㈡椂闂�'}
+            ,{field: 'modiUser$', align: 'center',title: '淇敼浜哄憳'}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+            // ,{field: 'appeUser$', align: 'center',title: '鍒涘缓鑰�'}
+            // ,{field: 'appeTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            ,{field: 'barcode', align: 'center',title: '鏉$爜', hide: true}
+
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(wrkCharge)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(wrkCharge)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'clearCharge':
+                layer.confirm('纭畾閲嶇疆鍏呯數浠诲姟鍚楋紵', {
+                    skin: 'layui-layer-admin',
+                    shade: .1
+                }, function (i) {
+                    layer.close(i);
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/wrkCharge/truncate/charge/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                });
+                break;
+            case 'clearMemo':
+                layer.confirm('纭畾閲嶇疆婕旂ず浠诲姟鍚楋紵', {
+                    skin: 'layui-layer-admin',
+                    shade: .1
+                }, function (i) {
+                    layer.close(i);
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/wrkCharge/truncate/demo/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                });
+                break;
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.wrkNo;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'wrkCharge': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/wrkCharge/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(wrkCharge)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.wrkNo]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/wrkCharge/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            console.log({ids: ids})
+            $.ajax({
+                url: baseUrl+"/wrkCharge/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+            layDate.render({
+                elem: '#ioTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['ioTime\\$']:null
+            });
+            layDate.render({
+                elem: '#crnStrTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['crnStrTime\\$']:null
+            });
+            layDate.render({
+                elem: '#crnEndTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['crnEndTime\\$']:null
+            });
+            layDate.render({
+                elem: '#modiTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['modiTime\\$']:null
+            });
+            layDate.render({
+                elem: '#appeTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['appeTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/static/js/wrkMast/wrkMast.js b/src/main/webapp/static/js/wrkMast/wrkMast.js
index fe33064..d10c803 100644
--- a/src/main/webapp/static/js/wrkMast/wrkMast.js
+++ b/src/main/webapp/static/js/wrkMast/wrkMast.js
@@ -30,6 +30,7 @@
             ,{field: 'staNo$', align: 'center',title: '鐩爣绔�'}
             ,{field: 'sourceLocNo$', align: 'center',title: '婧愬簱浣�'}
             ,{field: 'locNo$', align: 'center',title: '鐩爣搴撲綅'}
+            ,{field: 'steNo', align: 'center',title: '灏忚溅', width: 70}
             ,{field: 'barcode', align: 'center',title: '鏉$爜'}
             ,{field: 'preHave', align: 'center',title: '鍏堝叆鍝�', hide: true}
             ,{field: 'takeNone', align: 'center',title: '绌烘搷浣�', hide: true}
@@ -346,6 +347,16 @@
                 layer.confirm('浠诲姟鍙戦�佺┖鎿嶄綔寮傚父锛佹槸鍚︺�傘�傘�傘�傘�傘�傘�傘�傦紵', {title: '宸ヤ綔鍙凤細'+data.wrkNo, shadeClose: true}, function(){
                 });
                 break;
+            //  寮冭溅
+            case 'removeSte':
+                layer.confirm('娓呴櫎灏忚溅銆�' + data.steNo + '銆�', {title: '宸ヤ綔鍙凤細'+data.wrkNo, shadeClose: true}, function(){
+                    http.post(baseUrl+"/deal/steNo/empty", {wrkNo: data.wrkNo}, function (res) {
+                        $(".layui-laypage-btn")[0].click();
+                        layer.msg(data.wrkNo + res.msg, {icon: 1});
+                    })
+                    layer.closeAll();
+                });
+                break;
         }
     });
 
diff --git a/src/main/webapp/views/basSte/basSte.html b/src/main/webapp/views/basSte/basSte.html
index 82d6f05..0a97472 100644
--- a/src/main/webapp/views/basSte/basSte.html
+++ b/src/main/webapp/views/basSte/basSte.html
@@ -98,6 +98,12 @@
                         <input class="layui-input" name="idleLoc" placeholder="璇疯緭鍏ユ殏瀛樺簱浣�">
                     </div>
                 </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏈�浣庣數閲�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" type="number" name="chargeLine" placeholder="璇疯緭鍏ユ渶浣庣數閲�">
+                    </div>
+                </div>
 
              </div>
         </div>
diff --git a/src/main/webapp/views/basSteErrLog/basSteErrLog.html b/src/main/webapp/views/basSteErrLog/basSteErrLog.html
new file mode 100644
index 0000000..f2b5427
--- /dev/null
+++ b/src/main/webapp/views/basSteErrLog/basSteErrLog.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="wrk_no" placeholder="宸ヤ綔鍙�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="ste_no" placeholder="绌挎杞�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="status">
+                                <option value="" style="display: none"></option>
+                                <option value="1">寰呭鐞�</option>
+                                <option value="2">宸蹭慨澶�</option>
+                            </select>
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="basSteErrLog" lay-filter="basSteErrLog"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/basSteErrLog/basSteErrLog.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label">缂栧彿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="uuid" placeholder="璇疯緭鍏ョ紪鍙�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">宸ヤ綔鍙�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="wrkNo" placeholder="璇疯緭鍏ュ伐浣滃彿">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍙戠敓鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="startTime" id="startTime$" placeholder="璇疯緭鍏ュ彂鐢熸椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">缁撴潫鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="endTime" id="endTime$" placeholder="璇疯緭鍏ョ粨鏉熸椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">宸ヤ綔鐘舵��: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="wrkSts" placeholder="璇疯緭鍏ュ伐浣滅姸鎬�" style="display: none">
+                        <input id="wrkSts$" name="wrkSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ伐浣滅姸鎬�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basWrkStatusQueryBywrkSts" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basWrkStatusQueryBywrkStsSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍏ュ嚭搴撶被鍨�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="ioType" placeholder="璇疯緭鍏ュ叆鍑哄簱绫诲瀷" style="display: none">
+                        <input id="ioType$" name="ioType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ叆鍑哄簱绫诲瀷" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basWrkIotypeQueryByioType" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basWrkIotypeQueryByioTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绌挎杞�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="steNo" placeholder="璇疯緭鍏ョ┛姊溅">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">plc: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="plcNo" placeholder="璇疯緭鍏lc">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐩爣搴撲綅: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="locNo" placeholder="璇疯緭鍏ョ洰鏍囧簱浣�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐩爣绔�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="staNo" placeholder="璇疯緭鍏ョ洰鏍囩珯">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">婧愮珯: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="sourceStaNo" placeholder="璇疯緭鍏ユ簮绔�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">婧愬簱浣�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="sourceLocNo" placeholder="璇疯緭鍏ユ簮搴撲綅">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏉$爜: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="barcode" placeholder="璇疯緭鍏ユ潯鐮�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">寮傚父鐮�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="errCode" placeholder="璇疯緭鍏ュ紓甯哥爜">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">寮傚父: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="error" placeholder="璇疯緭鍏ュ紓甯�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">寮傚父鎯呭喌: </label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">璇烽�夋嫨寮傚父鎯呭喌</option>
+                            <option value="1">鏈鐞�</option>
+                            <option value="2">宸蹭慨澶�</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="createTime" id="createTime$" placeholder="璇疯緭鍏ユ坊鍔犳椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="createBy" placeholder="璇疯緭鍏ユ坊鍔犱汉鍛�" style="display: none">
+                        <input id="createBy$" name="createBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ユ坊鍔犱汉鍛�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="璇疯緭鍏ヤ慨鏀规椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="updateBy" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" style="display: none">
+                        <input id="updateBy$" name="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">澶囨敞: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="memo" placeholder="璇疯緭鍏ュ娉�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+
diff --git a/src/main/webapp/views/mat/mat.html b/src/main/webapp/views/mat/mat.html
index da02f1f..5c45008 100644
--- a/src/main/webapp/views/mat/mat.html
+++ b/src/main/webapp/views/mat/mat.html
@@ -97,8 +97,14 @@
                                 <input name="maktx" class="layui-input" placeholder="杈撳叆鍟嗗搧鍚嶇О"/>
                             </div>
                         </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">瑙勬牸:</label>
+                            <div class="layui-input-inline">
+                                <input name="specs" class="layui-input" placeholder="杈撳叆瑙勬牸"/>
+                            </div>
+                        </div>
                         <div class="layui-inline">&emsp;
-                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <button class="layui-btn icon-btn" id="search" lay-filter="search" lay-submit>
                                 <i class="layui-icon">&#xe615;</i>鎼滅储
                             </button>
                             <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
@@ -193,23 +199,9 @@
                 </div>
 
                 <div class="layui-form-item">
-                    <label class="layui-form-label">閰嶇疆</label>
+                    <label class="layui-form-label">澶囨敞</label>
                     <div class="layui-input-block">
-                        <input name="specs" placeholder="璇疯緭鍏ラ厤缃�" class="layui-input">
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label">鍗曠鍑�閲�</label>
-                    <div class="layui-input-block">
-                        <input name="weight" placeholder="璇疯緭鍏ュ崟绠卞噣閲嶆牸" class="layui-input">
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label">鍗曠浣撶Н</label>
-                    <div class="layui-input-block">
-                        <input name="volume" placeholder="璇疯緭鍏ュ崟绠变綋绉�" class="layui-input">
+                        <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input">
                     </div>
                 </div>
 
@@ -224,30 +216,9 @@
                 </div>
 
                 <div class="layui-form-item">
-                    <label class="layui-form-label">浠g爜</label>
+                    <label class="layui-form-label">瑙勬牸</label>
                     <div class="layui-input-block">
-                        <input name="model" type="number" placeholder="璇疯緭鍏ヤ唬鐮�" class="layui-input">
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label">澶囨敞</label>
-                    <div class="layui-input-block">
-                        <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input">
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label">鍗曠姣涢噸</label>
-                    <div class="layui-input-block">
-                        <input name="length" placeholder="璇疯緭鍏ュ崟绠辨瘺閲�" class="layui-input">
-                    </div>
-                </div>
-
-                <div class="layui-form-item">
-                    <label class="layui-form-label">鍗曠浣撶Н</label>
-                    <div class="layui-input-block">
-                        <input name="threeCode" placeholder="璇疯緭鍏ョ瀛愬昂瀵�" class="layui-input">
+                        <input name="specs" placeholder="璇疯緭鍏ヨ鏍�" class="layui-input">
                     </div>
                 </div>
 
@@ -290,7 +261,7 @@
                         <tr style="height: 74px">
                             <td align="center" colspan="3">鍟嗗搧</td>
                             <td align="center" colspan="5">xxxxxx-xx/xx</td>
-                            <td align="center" colspan="2">澶囨敞</td>
+                            <td align="center" colspan="2">瑙勬牸</td>
                             <td align="center" colspan="2">xx</td>
                         </tr>
                     </table>
@@ -304,7 +275,7 @@
                             <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>
                         </tr>
                         <tr style="height: 30px">
-                            <td align="center" width="20%">澶囨敞</td>
+                            <td align="center" width="20%">瑙勬牸</td>
                             <td align="center" width="80%">xxxxxxxx</td>
                         </tr>
                         <tr style="height: 75px;">
@@ -332,7 +303,7 @@
                             </td>
                         </tr>
                         <tr style="height: 74px">
-                            <td align="center" colspan="1">澶囨敞</td>
+                            <td align="center" colspan="1">瑙勬牸</td>
                             <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>
                         </tr>
                     </table>
@@ -369,8 +340,8 @@
         <tr style="height: 74px">
             <td align="center" colspan="3">鍟嗗搧</td>
             <td align="center" colspan="5" style="overflow: hidden; white-space: nowrap;text-overflow: ellipsis;">{{this.maktx}}</td>
-            <td align="center" colspan="2">澶囨敞</td>
-            <td align="center" colspan="2">{{this.memo}}</td>
+            <td align="center" colspan="2">瑙勬牸</td>
+            <td align="center" colspan="2">{{this.specs}}</td>
         </tr>
     </table>
     {{/each}}
@@ -384,8 +355,8 @@
             <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
         </tr>
         <tr style="height: 35px">
-            <td align="center" width="20%">澶囨敞</td>
-            <td align="center" width="80%">{{this.memo}}</td>
+            <td align="center" width="20%">瑙勬牸</td>
+            <td align="center" width="80%">{{this.specs}}</td>
         </tr>
         <tr style="height: 79px;">
             <td align="center" colspan="2" width="100%" style="border: none">
@@ -405,14 +376,10 @@
         <tr style="height: 74px" >
             <td align="center" scope="col" colspan="1">鍟嗗搧</td>
             <td align="center" scope="col" colspan="1" style="
-                display: inline-block;
-                line-height: 20px;
-                vertical-align: middle;
                 border: none;
                 border-top: 1px solid #000;
                 overflow: hidden;
                 text-overflow: ellipsis;
-                display: -webkit-box;
                 -webkit-line-clamp: 3;
                 -webkit-box-orient: vertical;
                     ">
@@ -426,8 +393,13 @@
             </td>
         </tr>
         <tr style="height: 74px">
-            <td align="center" colspan="1">澶囨敞</td>
-            <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.memo}}</td>
+            <td align="center" colspan="1">瑙勬牸</td>
+            <td align="center" colspan="1" style="
+                overflow:hidden;
+                text-overflow:ellipsis;
+                -webkit-line-clamp: 3;
+                -webkit-box-orient: vertical;
+            ">{{this.specs}}</td>
         </tr>
     </table>
     {{/each}}
diff --git a/src/main/webapp/views/order/order.html b/src/main/webapp/views/order/order.html
index 0c4cb7f..4690b27 100644
--- a/src/main/webapp/views/order/order.html
+++ b/src/main/webapp/views/order/order.html
@@ -80,8 +80,13 @@
                         <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit>
                             <i class="layui-icon">&#xe615;</i>鎼滅储
                         </button>
-                        <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon">&#xe654;</i>娣诲姞
+                        <button id="orderAddBtn" class="layui-btn icon-btn btn-add">
+                            <i class="layui-icon">&#xe654;</i>娣诲姞
                         </button>
+                        <button id="importOrder" class="layui-btn icon-btn btn-add">
+                            <i class="layui-icon layui-icon-upload"></i>&nbsp;瀵煎叆閿�鍞崟
+                        </button>
+                        <input style="display:none" id="importExcel" type="file" onchange="upload(this)" >
                     </div>
                 </div>
             </div>
diff --git a/src/main/webapp/views/order/out.html b/src/main/webapp/views/order/out.html
index 5e9532d..c3687e3 100644
--- a/src/main/webapp/views/order/out.html
+++ b/src/main/webapp/views/order/out.html
@@ -71,10 +71,10 @@
                 <div class="layui-card-body" style="padding: 10px;">
                     <form class="layui-form toolbar">
                         <div class="layui-form-item">
-                            <div class="layui-inline" style="max-width: 300px;">
+                            <div class="layui-inline" style="max-width: 300px;margin-bottom: 5px">
                                 <input name="orderNo" class="layui-input" placeholder="杈撳叆鍗曟嵁缂栧彿" autocomplete="off"/>
                             </div>
-                            <div class="layui-inline">
+                            <div class="layui-inline" style="margin-bottom: 5px">
                                 <button class="layui-btn icon-btn" lay-filter="originTableSearch" lay-submit>
                                     <i class="layui-icon">&#xe615;</i>鎼滅储
                                 </button>
@@ -84,6 +84,9 @@
                             </div>
                         </div>
                     </form>
+                    <button style="margin-bottom: 5px;line-height: 28px;height: 28px" class="layui-btn icon-btn layui-btn-danger" lay-filter="mergeOut" lay-submit>
+                        <i class="layui-icon">&#xe656;</i>&nbsp;鍚堝苟鍑哄簱
+                    </button>
                     <table id="originTable" lay-filter="originTable"></table>
                 </div>
             </div>
@@ -165,6 +168,33 @@
     </div>
 </script>
 
+<!-- 鍚堝苟琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="mergeDialog">
+    <div style="padding: 25px; line-height: 22px; background-color: #1E9FFF; color: #fff; font-weight: 300;">
+        <span style="font-size: large; font-weight: bold">鍚堝苟鍑哄簱</span>
+    </div>
+    <div class="layui-card">
+        <div class="layui-card-body" style="padding: 10px">
+            <table id="orderMergeTab" lay-filter="orderMergeTab"></table>
+        </div>
+    </div>
+</script>
+
+<!-- 鍑哄簱棰勮 銆愬悎骞躲�� -->
+<script type="text/html" id="pakoutPreviewMergeBox" style="display: none">
+    <div style="padding: 25px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">
+        <span style="font-size: large; font-weight: bold">鍑哄簱棰勮</span>
+    </div>
+    <div class="layui-card">
+        <div class="layui-card-body" style="padding: 10px">
+            <table id="stoPreTabMerge" lay-filter="stoPreTabMerge"></table>
+        </div>
+        <button class="layui-btn layui-btn-primary layui-border-black layui-btn-sm" lay-filter="batchModifySta" lay-submit style="display: block;float: right;margin-right: 1rem">
+            鎵归噺淇敼
+        </button>
+    </div>
+</script>
+
 <script type="text/html" id="tbBasicTbStaNos">
     <div class="ew-select-fixed">
         <select class="order-sta-select" lay-filter="tbBasicTbStaNos">
diff --git a/src/main/webapp/views/stoMan/stoQue.html b/src/main/webapp/views/stoMan/stoQue.html
index 6201b1e..9f881d3 100644
--- a/src/main/webapp/views/stoMan/stoQue.html
+++ b/src/main/webapp/views/stoMan/stoQue.html
@@ -34,6 +34,11 @@
     </div>
     <div class="layui-inline">
         <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="loc_sts" placeholder="搴撲綅鐘舵��" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
             <input class="layui-input" type="text" name="barcode" placeholder="鎵樼洏鐮�" autocomplete="off">
         </div>
     </div>
diff --git a/src/main/webapp/views/wrkCharge/wrkCharge.html b/src/main/webapp/views/wrkCharge/wrkCharge.html
new file mode 100644
index 0000000..726982c
--- /dev/null
+++ b/src/main/webapp/views/wrkCharge/wrkCharge.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="wrk_no" placeholder="浠诲姟鍙�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="ste_no" placeholder="绌挎杞�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="memo">
+                                <option value="">閫夋嫨绫诲瀷</option>
+                                <option value="charge">鍏呯數浠诲姟</option>
+                                <option value="memo">婕旂ず浠诲姟</option>
+                            </select>
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="wrkCharge" lay-filter="wrkCharge"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="memoTpl">
+    {{# if(d.memo === "charge"){ }}
+        <span name="memo" class="layui-badge layui-badge-red"  >鍏呯數浠诲姟</span>
+    {{# } }}
+    {{# if(d.memo === "memo"){ }}
+        <span name="memo" class="layui-badge layui-badge-red"  >婕旂ず浠诲姟</span>
+    {{# } }}
+</script>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-clear-charge" lay-event="clearCharge">閲嶇疆鍏呯數浠诲姟</button>
+        <button class="layui-btn layui-btn-sm " id="btn-clear-memo" lay-event="clearMemo">閲嶇疆婕旂ず浠诲姟</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/wrkCharge/wrkCharge.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">宸ヤ綔鍙�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="wrkNo" placeholder="璇疯緭鍏ュ伐浣滃彿" lay-vertype="tips" lay-verify="required">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏍囪: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="mk" placeholder="璇疯緭鍏ユ爣璁�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">宸ヤ綔鐘舵��: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="wrkSts" placeholder="璇疯緭鍏ュ伐浣滅姸鎬�" style="display: none">
+                        <input id="wrkSts$" name="wrkSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ伐浣滅姸鎬�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basWrkStatusQueryBywrkSts" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basWrkStatusQueryBywrkStsSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍏ュ嚭搴撶被鍨�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="ioType" placeholder="璇疯緭鍏ュ叆鍑哄簱绫诲瀷" style="display: none">
+                        <input id="ioType$" name="ioType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ叆鍑哄簱绫诲瀷" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basWrkIotypeQueryByioType" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basWrkIotypeQueryByioTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍫嗗灈鏈�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="crnNo" placeholder="璇疯緭鍏ュ爢鍨涙満" style="display: none">
+                        <input id="crnNo$" name="crnNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ爢鍨涙満" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basCrnpQueryBycrnNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basCrnpQueryBycrnNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绌挎杞�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="steNo" placeholder="璇疯緭鍏ョ┛姊溅" style="display: none">
+                        <input id="steNo$" name="steNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ョ┛姊溅" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basSteQueryBysteNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basSteQueryBysteNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">宸烽亾鍙�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="outMost" placeholder="璇疯緭鍏ュ贩閬撳彛">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">浼樺厛绾�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="ioPri" placeholder="璇疯緭鍏ヤ紭鍏堢骇">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐩爣搴撲綅: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="locNo" placeholder="璇疯緭鍏ョ洰鏍囧簱浣�" style="display: none">
+                        <input id="locNo$" name="locNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ョ洰鏍囧簱浣�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="locMastQueryBylocNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="locMastQueryBylocNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐩爣绔�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="staNo" placeholder="璇疯緭鍏ョ洰鏍囩珯" style="display: none">
+                        <input id="staNo$" name="staNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ョ洰鏍囩珯" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basDevpQueryBystaNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basDevpQueryBystaNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">婧愮珯: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="sourceStaNo" placeholder="璇疯緭鍏ユ簮绔�" style="display: none">
+                        <input id="sourceStaNo$" name="sourceStaNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ユ簮绔�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="basDevpQueryBysourceStaNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="basDevpQueryBysourceStaNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">婧愬簱浣�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="sourceLocNo" placeholder="璇疯緭鍏ユ簮搴撲綅" style="display: none">
+                        <input id="sourceLocNo$" name="sourceLocNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ユ簮搴撲綅" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="locMastQueryBysourceLocNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="locMastQueryBysourceLocNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绌烘澘(checkBox): </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="emptyMk" placeholder="璇疯緭鍏ョ┖鏉�(checkBox)">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">宸ヤ綔鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="ioTime" id="ioTime$" placeholder="璇疯緭鍏ュ伐浣滄椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍫嗗灈鏈哄惎鍔ㄦ椂闂�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="crnStrTime" id="crnStrTime$" placeholder="璇疯緭鍏ュ爢鍨涙満鍚姩鏃堕棿">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍫嗗灈鏈哄仠姝㈡椂闂�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="crnEndTime" id="crnEndTime$" placeholder="璇疯緭鍏ュ爢鍨涙満鍋滄鏃堕棿">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="modiUser" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" style="display: none">
+                        <input id="modiUser$" name="modiUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryBymodiUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryBymodiUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="modiTime" id="modiTime$" placeholder="璇疯緭鍏ヤ慨鏀规椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍒涘缓鑰�: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="appeUser" placeholder="璇疯緭鍏ュ垱寤鸿��" style="display: none">
+                        <input id="appeUser$" name="appeUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ュ垱寤鸿��" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryByappeUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryByappeUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="appeTime" id="appeTime$" placeholder="璇疯緭鍏ユ坊鍔犳椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">澶囨敞: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="memo" placeholder="璇疯緭鍏ュ娉�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏉$爜: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="barcode" placeholder="璇疯緭鍏ユ潯鐮�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+
diff --git a/src/main/webapp/views/wrkMast/wrkMast.html b/src/main/webapp/views/wrkMast/wrkMast.html
index 77b804b..440449f 100644
--- a/src/main/webapp/views/wrkMast/wrkMast.html
+++ b/src/main/webapp/views/wrkMast/wrkMast.html
@@ -126,7 +126,10 @@
         <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="pick">鎷�</a>
     {{# } }}
     {{#if (d.ioType === 107) { }}
-    <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="pick">鐩�</a>
+        <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="pick">鐩�</a>
+    {{# } }}
+    {{#if (d.steNo) { }}
+        <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="removeSte">寮冭溅</a>
     {{# } }}
 </script>
 

--
Gitblit v1.9.1