From 91f2cd5b0f832091f654cce926585d2f05cad114 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <xltys1995>
Date: 星期四, 08 四月 2021 23:22:32 +0800
Subject: [PATCH] Merge branches 'dev' and 'master' of https://gitee.com/luxiaotao1123/xtywms into master

---
 src/main/java/com/zy/asrs/entity/param/CombParam.java                        |   11 
 src/main/resources/mapper/LocAreaMapper.xml                                  |   30 
 src/main/webapp/views/pda/stockIn.html                                       |   16 
 src/main/resources/mapper/LocDetlMapper.xml                                  |    5 
 src/main/webapp/static/js/locNormal/locNormalIn.js                           |  248 ++
 src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcel.java         |  185 +
 src/main/webapp/static/layuiadmin/modules/tableMerge.js                      |   75 
 src/main/webapp/static/js/locArea/locArea.js                                 |  475 ++++
 src/main/webapp/static/js/locNormal/addLocNormal.js                          |   83 
 src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java             |   75 
 src/main/java/com/zy/asrs/controller/LocNormalController.java                |  212 +
 src/main/webapp/static/js/locNormal/locNormal.js                             |  360 +++
 src/main/webapp/views/locArea/locArea.html                                   |   62 
 src/main/java/com/zy/asrs/mapper/LocNormalMapper.java                        |   40 
 src/main/java/locArea.sql                                                    |   20 
 src/main/webapp/views/pda/stockOut.html                                      |   50 
 src/main/java/com/zy/asrs/controller/OutStockController.java                 |   63 
 src/main/webapp/static/js/common.js                                          |   26 
 src/main/java/com/zy/asrs/entity/LocArea.java                                |  256 ++
 src/main/java/com/zy/asrs/entity/CombBillQueryVo.java                        |   11 
 src/main/java/com/zy/asrs/service/LocDetlService.java                        |    2 
 src/main/java/com/zy/common/service/erp/task/ErpScheduler.java               |   25 
 src/main/java/com/zy/asrs/mapper/OutStockMapper.java                         |   22 
 src/main/java/com/zy/asrs/service/LocNormalService.java                      |   31 
 src/main/webapp/views/pakStore/outStock.html                                 |   85 
 src/main/webapp/views/pda/locDetlIframe.html                                 |   40 
 src/main/java/com/zy/asrs/entity/param/LocNormalParam.java                   |   17 
 src/main/webapp/views/pda/matQuery.html                                      |   59 
 src/main/webapp/views/waitPakinLog/waitPakinLog.html                         |    5 
 src/main/webapp/static/js/locMatStatus/locMatStatus.js                       |    2 
 src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java              |  198 +
 src/main/java/com/zy/asrs/entity/LocDetl.java                                |    6 
 src/main/java/com/zy/asrs/service/impl/LocAreaServiceImpl.java               |   18 
 src/main/java/com/zy/asrs/entity/LocNormal.java                              |  122 +
 src/main/webapp/views/locMatStatus/locMatStatus.html                         |    1 
 src/main/webapp/static/js/salesOrder/salsesOrder.js                          |  144 +
 src/main/webapp/static/js/waitPakinLog/waitPakinLog.js                       |    2 
 src/main/java/com/zy/asrs/service/OutStockService.java                       |   22 
 src/main/java/com/zy/asrs/utils/VersionUtils.java                            |    4 
 src/main/webapp/views/locNormal/addLocNormal.html                            |  108 
 src/main/java/com/zy/common/web/BaseController.java                          |    8 
 src/main/webapp/views/pakStore/locDetlQuery.html                             |   14 
 src/main/webapp/views/pakStore/outStockDetail.html                           |  159 +
 src/main/webapp/views/pda/comb.html                                          |   13 
 src/main/webapp/views/locArea/locArea_detail.html                            |   83 
 src/main/java/com/zy/asrs/controller/LocAreaController.java                  |  142 +
 src/main/webapp/views/pda/locNormalMove.html                                 |  225 +
 src/main/webapp/views/index.html                                             |  440 +-
 src/main/java/com/zy/asrs/mapper/LocAreaMapper.java                          |   15 
 src/main/java/com/zy/asrs/entity/param/StockOutParam.java                    |   11 
 src/main/webapp/views/pda/locNormalIn.html                                   |  296 ++
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java                |   22 
 version/version/wjh.sql                                                      |  330 ++
 src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcelListener.java |   93 
 src/main/java/com/zy/common/service/erp/entity/OutStockBill.java             |  114 
 src/main/resources/mapper/OutStockMapper.xml                                 |  109 
 src/main/webapp/static/js/pakStore/pakStore.js                               |   10 
 src/main/webapp/views/pda/combPro.html                                       |  193 +
 src/main/webapp/views/pda/index.html                                         |  104 
 src/main/java/com/zy/common/service/erp/ErpService.java                      |  141 +
 src/main/java/com/zy/asrs/controller/LocDetlController.java                  |   17 
 src/main/resources/mapper/LocNormalMapper.xml                                |  119 +
 src/main/webapp/views/locNormal/locNormal.html                               |  189 +
 src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java               |    4 
 src/main/webapp/static/js/pakStore/outStock.js                               |  150 +
 src/main/java/com/zy/asrs/controller/MobileController.java                   |   23 
 src/main/webapp/static/js/cool.js                                            |   35 
 src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java        |  133 +
 /dev/null                                                                    |    3 
 src/main/webapp/static/css/pda.css                                           |    7 
 src/main/webapp/views/salesOrder/salesOrder.html                             |   93 
 src/main/java/com/zy/asrs/service/LocAreaService.java                        |   10 
 src/main/webapp/views/pda/locNormalOut.html                                  |  422 +++
 src/main/webapp/views/locNormal/locNormalIn.html                             |  129 +
 74 files changed, 6,703 insertions(+), 369 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocAreaController.java b/src/main/java/com/zy/asrs/controller/LocAreaController.java
new file mode 100644
index 0000000..c2bd1fa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/LocAreaController.java
@@ -0,0 +1,142 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+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.common.DateUtils;
+import com.zy.asrs.entity.LocArea;
+import com.zy.asrs.service.LocAreaService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.controller.AbstractBaseController;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class LocAreaController extends BaseController {
+
+    @Autowired
+    private LocAreaService locAreaService;
+
+    @RequestMapping(value = "/locArea/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(locAreaService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/locArea/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 Map<String, Object> param){
+        EntityWrapper<LocArea> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(locAreaService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private void convert(Map<String, Object> map, EntityWrapper 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 = "/locArea/add/auth")
+    @ManagerAuth
+    public R add(LocArea locArea) {
+        Long createUser = getUserId();
+        Date createTime = new Date();
+        locArea.setCreateBy(createUser);
+        locArea.setCreateTime(createTime);
+        locAreaService.insert(locArea);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/locArea/update/auth")
+	@ManagerAuth
+    public R update(LocArea locArea){
+        if (Cools.isEmpty(locArea) || null==locArea.getId()){
+            return R.error();
+        }
+        Long modiUser = getUserId();
+        Date modiTime = new Date();
+        locArea.setUpdateBy(modiUser);
+        locArea.setUpdateTime(modiTime);
+        locAreaService.updateById(locArea);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locArea/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam String param){
+        List<LocArea> list = JSONArray.parseArray(param, LocArea.class);
+        if (Cools.isEmpty(list)){
+            return R.error();
+        }
+        for (LocArea entity : list){
+            locAreaService.delete(new EntityWrapper<>(entity));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locArea/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<LocArea> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("locArea"));
+        convert(map, wrapper);
+        List<LocArea> list = locAreaService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/locAreaQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<LocArea> wrapper = new EntityWrapper<>();
+        wrapper.like("uuid", condition);
+        Page<LocArea> page = locAreaService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (LocArea locArea : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", locArea.getId());
+            map.put("value", locArea.getUuid());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/locArea/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<LocArea> wrapper = new EntityWrapper<LocArea>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != locAreaService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(LocArea.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locArea/queryAll/auth")
+    @ManagerAuth
+    public R queryAll(String areaType) {
+        List<LocArea> result = locAreaService.queryAllLocArea(areaType);
+        return R.ok(result);
+    }
+}
diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index 020b83c..7a45480 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -68,6 +68,14 @@
                 param.remove("modi_time");
             }
         }
+        /* 閫氱煡鍗曞彿涓虹┖锛屽垹闄ゅ叆鍙傞�氱煡鍗曞彿supplier */
+        if (Cools.isEmpty(param.get("supplier"))) {
+            param.remove("supplier");
+        }
+        /* 鐢熶骇鍗曞彿涓虹┖锛屽垹闄ょ敓浜у崟鍙穡arehouse */
+        if (Cools.isEmpty(param.get("warehouse"))) {
+            param.remove("warehouse");
+        }
         return R.ok(locDetlService.getStockOut(toPage(curr, limit, param, LocDetl.class)));
     }
 
@@ -79,8 +87,13 @@
                   @RequestParam(required = false)String orderByType,
                   @RequestParam(required = false)String condition,
                   @RequestParam Map<String, Object> param){
+
         excludeTrash(param);
         EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
+        if ("0".equals(param.get("mat_status"))) {
+            wrapper.isNull("mat_status");
+            param.remove("mat_status");
+        }
         convert(param, wrapper);
         allLike(LocDetl.class, param.keySet(), wrapper, condition);
         if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
@@ -185,7 +198,7 @@
      */
     @RequestMapping(value = "/locDetl/getAllLocDetlData")
     @ManagerAuth
-    public List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String matStatusFlag) {
-       return locDetlService.getAllLocDetlData(loc_no, matnr, matStatusFlag);
+    public List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String mat_status) {
+       return locDetlService.getAllLocDetlData(loc_no, matnr, mat_status);
     }
 }
diff --git a/src/main/java/com/zy/asrs/controller/LocNormalController.java b/src/main/java/com/zy/asrs/controller/LocNormalController.java
new file mode 100644
index 0000000..cb1c130
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/LocNormalController.java
@@ -0,0 +1,212 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.excel.EasyExcel;
+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.sun.org.apache.bcel.internal.generic.NEW;
+import com.zy.asrs.entity.LocNormal;
+import com.zy.asrs.entity.param.LocNormalParam;
+import com.zy.asrs.service.LocNormalService;
+import com.zy.common.utils.excel.locNomal.LocNormalExcel;
+import com.zy.common.utils.excel.locNomal.LocNormalExcelListener;
+import com.zy.common.utils.excel.matcode.MatCodeExcel;
+import com.zy.common.utils.excel.matcode.MatCodeExcelListener;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static jdk.nashorn.api.scripting.ScriptUtils.convert;
+
+@RestController
+public class LocNormalController extends BaseController {
+    @Autowired
+    private LocNormalService locNormalService;
+
+    @RequestMapping(value = "/locNomal/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) {
+        excludeTrash(param);
+        EntityWrapper<LocNormal> wrapper = new EntityWrapper<>();
+        convert(param, wrapper);
+        allLike(LocNormal.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)) {
+            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+        }
+        if (Cools.isEmpty(param.get("state"))) {
+            wrapper.in("state", "1,2");
+        }
+        return R.ok(locNormalService.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(), String.valueOf(entry.getValue()));
+            }
+        }
+    }
+
+    @RequestMapping(value = "/locNomal/add/auth")
+    @ManagerAuth
+    public R add(LocNormal locNormalList) {
+        // 鎻掑叆鍒涘缓淇℃伅
+        locNormalList.setModiUser(getUserId());
+        locNormalList.setModiTime(new Date());
+        locNormalList.setAppeUser(getUserId());
+        locNormalList.setAppeTime(new Date());
+        // 榛樿鏂板涓哄凡鍏ュ簱
+        locNormalList.setState("1");
+        locNormalService.insert(locNormalList);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/matnr/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<LocNormal> wrapper = new EntityWrapper<LocNormal>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != locNormalService.selectOne(wrapper)) {
+            return R.parse(BaseRes.REPEAT).add(getComment(LocNormal.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locNormal/update/auth")
+    @ManagerAuth
+    public void updateLocNormal(LocNormal param) {
+        Long modiUser = getUserId();
+        Date modiTime = new Date();
+        locNormalService.updateLocNormal(param.getMatnr(), param.getAnfme(), modiUser, modiTime, param.getId());
+    }
+
+    @RequestMapping(value = "/locNormal/outLoc/auth")
+    @ManagerAuth
+    public void outLocNormal(LocNormal param) {
+        Long modiUser = getUserId();
+        Date modiTime = new Date();
+        locNormalService.outLocNormal(param.getMatnr(), modiUser, modiTime, param.getId());
+    }
+
+    @RequestMapping(value = "/locNormal/removeLoc/auth")
+    @ManagerAuth
+    public void removeLoc(LocNormal param) {
+        Long modiUser = getUserId();
+        Date modiTime = new Date();
+        locNormalService.removeLocNormal(param.getMatnr(), modiUser, modiTime, param.getId());
+    }
+
+    /* 瀵煎叆 */
+    @RequestMapping(value = "/locNormal/import/auth")
+    @ManagerAuth(memo = "骞充粨绠$悊瀵煎叆")
+    @Transactional
+    public R locNormalImport(MultipartFile file) throws IOException, InterruptedException {
+        LocNormalExcelListener listener = new LocNormalExcelListener(getUserId());
+        EasyExcel.read(file.getInputStream(), LocNormalExcel.class, listener).sheet().doRead();
+        return R.ok("鎴愬姛瀵煎叆" + listener.getTotal() + "鏉$墿鏂欎俊鎭�");
+    }
+
+    /* 骞充粨鍏ュ簱 */
+    @RequestMapping(value = "/locNormal/in")
+    @ManagerAuth(memo = "骞充粨鍏ュ簱")
+    @Transactional
+    public R locNormalIn(@RequestBody LocNormalParam param) {
+        Long userId = getUserId();
+        Date timeNow = new Date();
+        for (Integer i = 0; i < param.getNormalList().size(); i++) {
+            param.getNormalList().get(i).setAppeUser(userId);
+            param.getNormalList().get(i).setAppeTime(timeNow);
+        }
+        locNormalService.locNormalIn(param.getNormalList());
+        return R.ok();
+    }
+
+    /* pda鍏ュ簱 */
+    @RequestMapping(value = "/locNormal/pda/in")
+    @ManagerAuth(memo = "骞充粨绠$悊pda鍏ュ簱")
+    @Transactional
+    public R locNormalPdaIn(@RequestBody LocNormalParam param) {
+        Long userId = getUserId();
+        Date timeNow = new Date();
+        for (Integer i = 0; i < param.getNormalList().size(); i++) {
+            param.getNormalList().get(i).setAppeUser(userId);
+            param.getNormalList().get(i).setAppeTime(timeNow);
+        }
+        locNormalService.pdaLocNormalIn(param.getNormalList());
+        return R.ok();
+    }
+
+    /* pda鍑哄簱鏌ヨ */
+    @RequestMapping(value = "/locNormal/pda/out/query")
+    @ManagerAuth(memo = "pda鍑哄簱鏌ヨ")
+    @Transactional
+    public R locNormalPdaOutQuery(String matnr, String warehouse, String billNo) {
+        List<LocNormal> list = new ArrayList<>();
+        list  = locNormalService.pdaLocNormalQuery(matnr, warehouse, billNo);
+        return R.ok(list);
+    }
+
+    @RequestMapping(value = "/locNormal/pda/out")
+    @ManagerAuth(memo = "pda鍑哄簱")
+    @Transactional
+    public R locNormalPdaOut(@RequestBody LocNormalParam param) {
+        Long userId = getUserId();
+        Date timeNow = new Date();
+        List<LocNormal> list = param.getNormalList();
+        for (Integer i = 0; i < list.size(); i++) {
+            list.get(i).setModiUser(userId);
+            list.get(i).setModiTime(timeNow);
+        }
+        locNormalService.pdaLocNormalOut(list);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/locNormal/pda/warehouseQuery")
+    @ManagerAuth(memo = "pda鏍规嵁搴撳尯鏌ヨ鐗╂枡娓呭崟")
+    @Transactional
+    public R locNormalPdaWarehouseQuery(String warehouse, String matnr) {
+        List<LocNormal> list = locNormalService.pdaLocNormalWarehouseQuery(warehouse, matnr);
+        return R.ok(list);
+    }
+
+    @RequestMapping(value = "/locNormal/pda/move")
+    @ManagerAuth(memo = "pda绉诲簱")
+    @Transactional
+    public R LocNormalPdaMove(@RequestBody LocNormalParam param) {
+        Long userId = getUserId();
+        Date timeNow = new Date();
+        List<LocNormal> list = param.getNormalList();
+        for (Integer i = 0; i < list.size(); i++) {
+            list.get(i).setModiUser(userId);
+            list.get(i).setModiTime(timeNow);
+        }
+        locNormalService.pdaLocNormalMove(list);
+        return R.ok();
+    }
+}
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index 222e296..c56e2b5 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -69,7 +69,9 @@
     @RequestMapping("/locDetl")
     @ManagerAuth
     public R getLocDetl(@RequestParam(required = false)String locNo,
-                        @RequestParam(required = false)String matNo){
+                        @RequestParam(required = false)String matNo,
+                        @RequestParam(required = false)String supplier
+                        ){
         if (!Cools.isEmpty(locNo)) {
             LocMast locMast = locMastService.selectById(locNo);
             if (null == locMast || !"F".equals(locMast.getLocSts())) {
@@ -102,6 +104,20 @@
             });
             return R.ok().add(res);
         }
+        if (!Cools.isEmpty(supplier)) {
+            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
+                    .eq("supplier", supplier).orderBy("appe_time", false));
+            List<MobileLocDetlVo> res = new ArrayList<>();
+            locDetls.forEach(locDetl -> {
+                MobileLocDetlVo vo = new MobileLocDetlVo();
+                vo.setLocNo(locDetl.getLocNo());
+                vo.setMatnr(locDetl.getMatnr());
+                vo.setMaktx(locDetl.getMaktx());
+                vo.setCount(locDetl.getAnfme());
+                res.add(vo);
+            });
+            return R.ok().add(res);
+        }
         return R.parse(BaseRes.PARAM);
     }
 
@@ -119,6 +135,11 @@
                 vo.setMatNo(waitPakin.getMatnr());
                 vo.setMatName(waitPakin.getMaktx());
                 vo.setCount(waitPakin.getAnfme());
+                vo.setMnemonic(waitPakin.getMnemonic());
+                vo.setSupplier(waitPakin.getSupplier());
+                vo.setAltme(waitPakin.getAltme());
+                vo.setType(waitPakin.getType());
+                vo.setLgnum(waitPakin.getLgnum());
                 vos.add(vo);
             }
         }
diff --git a/src/main/java/com/zy/asrs/controller/OutStockController.java b/src/main/java/com/zy/asrs/controller/OutStockController.java
new file mode 100644
index 0000000..7d982c9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/OutStockController.java
@@ -0,0 +1,63 @@
+package com.zy.asrs.controller;
+
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.service.OutStockService;
+import com.zy.asrs.service.WorkService;
+import com.zy.common.service.erp.entity.OutStockBillEntry;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class OutStockController extends BaseController {
+
+    @Autowired
+    private OutStockService outStockService;
+    @Autowired
+    private WorkService workService;
+
+    /**
+     *
+     * @param curr
+     * @param limit
+     * @param param
+     * @return
+     */
+    @RequestMapping(value = "/outStock/query/list")
+    @ManagerAuth
+    public R outStockQueryList(@RequestParam(defaultValue = "1")Integer curr,
+                          @RequestParam(defaultValue = "10")Integer limit,
+                          @RequestParam Map<String, Object> param){
+        return R.ok(outStockService.queryOutStock(toPage(curr, limit, param, OutStockBillEntry.class)));
+    }
+
+    /**
+     * 妫�绱㈢鍚堥�氱煡鍗曠殑搴撳瓨鐗╂枡
+     * @param fbillNo
+     * @return
+     */
+    @RequestMapping(value = "/outStock/query/locList")
+    @ManagerAuth
+    public R queryMatWithLoc(String fbillNo) {
+        List<LocDetl> list = outStockService.queryMatWithLoc(fbillNo);
+        return R.ok(list);
+    }
+
+    @RequestMapping(value = "/plate/outStock/start")
+    @ManagerAuth(memo = "鍑哄簱浣滀笟")
+    public R fullStoreTakeStart(@RequestBody StockOutParam param) {
+        outStockService.startupFullTakeStore(param, getUserId());
+        return R.ok("鍑哄簱鍚姩鎴愬姛");
+    }
+}
diff --git a/src/main/java/com/zy/asrs/entity/CombBillQueryVo.java b/src/main/java/com/zy/asrs/entity/CombBillQueryVo.java
index 5b01716..d27cd69 100644
--- a/src/main/java/com/zy/asrs/entity/CombBillQueryVo.java
+++ b/src/main/java/com/zy/asrs/entity/CombBillQueryVo.java
@@ -14,4 +14,15 @@
 
     private Double count;
 
+    private String warehouse;
+
+    private String mnemonic;
+
+    private String supplier;
+
+    private String lgnum;
+
+    private String type;
+
+    private String altme;
 }
diff --git a/src/main/java/com/zy/asrs/entity/LocArea.java b/src/main/java/com/zy/asrs/entity/LocArea.java
new file mode 100644
index 0000000..6c74f61
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/LocArea.java
@@ -0,0 +1,256 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import com.core.common.SpringUtils;
+import com.baomidou.mybatisplus.annotations.TableField;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import com.core.common.SpringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import com.baomidou.mybatisplus.annotations.TableName;
+
+import java.io.Serializable;
+
+@TableName("asr_loc_area")
+public class LocArea implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 搴撳尯缂栧彿
+     */
+    @ApiModelProperty(value = "搴撳尯缂栧彿")
+    private String uuid;
+
+    /**
+     * 搴撳尯鍚嶇О
+     */
+    @ApiModelProperty(value = "搴撳尯鍚嶇О")
+    private String name;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value = "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value = "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value = "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value = "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value = "澶囨敞")
+    private String memo;
+
+    /**
+     * 搴撳尯绫诲瀷
+     */
+    @ApiModelProperty(value = "搴撳尯绫诲瀷")
+    @TableField("area_type")
+    private String areaType;
+
+    public LocArea() {
+    }
+
+    public LocArea(String uuid, String name, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo, String areaType) {
+        this.uuid = uuid;
+        this.name = name;
+        this.status = status;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+        this.areaType = areaType;
+    }
+
+//    LocArea locArea = new LocArea(
+//            null,    // 搴撳尯缂栧彿
+//            null,    // 搴撳尯鍚嶇О
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public String getStatus$() {
+        if (null == this.status) {
+            return null;
+        }
+        switch (this.status) {
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Long getCreateBy() {
+        return createBy;
+    }
+
+    public String getCreateBy$() {
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)) {
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public String getCreateTime$() {
+        if (Cools.isEmpty(this.createTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public String getUpdateBy$() {
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)) {
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public String getUpdateTime$() {
+        if (Cools.isEmpty(this.updateTime)) {
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+
+    public String getAreaType() {
+        return areaType;
+    }
+
+    public void setAreaType(String areaType) {
+        this.areaType = areaType;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocDetl.java b/src/main/java/com/zy/asrs/entity/LocDetl.java
index 77279ea..1c860bc 100644
--- a/src/main/java/com/zy/asrs/entity/LocDetl.java
+++ b/src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -87,12 +87,6 @@
     @TableField("mat_status")
     private String matStatus;
 
-    /**
-     * 鐗╂枡鐘舵�佹壒閲忎慨鏀规爣璇�
-     */
-    @TableField(exist = false)
-    private String matStatusFlag;
-
     public String getLocNo$(){
         LocMastService service = SpringUtils.getBean(LocMastService.class);
         LocMast locMast = service.selectById(this.locNo);
diff --git a/src/main/java/com/zy/asrs/entity/LocNormal.java b/src/main/java/com/zy/asrs/entity/LocNormal.java
new file mode 100644
index 0000000..453c3a6
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/LocNormal.java
@@ -0,0 +1,122 @@
+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.zy.asrs.service.LocMastService;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_loc_normal")
+public class LocNormal implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "鑷ID")
+    private Integer id;
+
+    @ApiModelProperty(value= "鐗╂枡")
+    @TableId(value = "matnr", type = IdType.INPUT)
+    private String matnr;
+
+    @ApiModelProperty(value= "鐗╂枡鎻忚堪")
+    private String maktx;
+
+    @ApiModelProperty(value= "瑙勬牸")
+    private String lgnum;
+
+    @ApiModelProperty(value= "鐗╂枡绫诲埆")
+    private String type;
+
+    @ApiModelProperty(value= "鍔╄鐮�")
+    private String mnemonic;
+
+    @ApiModelProperty(value= "閫氱煡鍗曞彿")
+    private String supplier;
+
+    @ApiModelProperty(value= "浠撳簱")
+    private String warehouse;
+
+    @ApiModelProperty(value= "鍝佺墝")
+    private String brand;
+
+    @ApiModelProperty(value= "鏁伴噺")
+    private BigDecimal anfme;
+
+    @ApiModelProperty(value= "鍗曚綅")
+    private String altme;
+
+    @ApiModelProperty(value= "鐢ㄦ埛ID")
+    private String bname;
+
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private Long modiUser;
+
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    private Date modiTime;
+
+    @ApiModelProperty(value= "鍒涘缓鑰�")
+    @TableField("appe_user")
+    private Long appeUser;
+
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    private Date appeTime;
+
+    @ApiModelProperty(value= "鐗╂枡鍑哄叆搴撶姸鎬�")
+    @TableField("state")
+    private String state;
+
+    @TableField(exist = false)
+    private BigDecimal anfmeOut;
+
+    public String getModiUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.modiUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        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.getUsername());
+        }
+        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/entity/param/CombParam.java b/src/main/java/com/zy/asrs/entity/param/CombParam.java
index 3847ad6..86d30fa 100644
--- a/src/main/java/com/zy/asrs/entity/param/CombParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -15,8 +15,19 @@
     // 鎴愬搧鐮�
     private String productCode;
 
+    // 鐢熶骇鍗曞彿
+    private String warehouse;
+
     private String billNo;
 
+    public String getWarehouse() {
+        return warehouse;
+    }
+
+    public void setWarehouse(String warehouse) {
+        this.warehouse = warehouse;
+    }
+
     public static class CombMat {
 
         // 鐗╂枡缂栧彿
diff --git a/src/main/java/com/zy/asrs/entity/param/LocNormalParam.java b/src/main/java/com/zy/asrs/entity/param/LocNormalParam.java
new file mode 100644
index 0000000..69df344
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/LocNormalParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.param;
+
+import com.zy.asrs.entity.LocNormal;
+
+import java.util.List;
+
+public class LocNormalParam {
+    private List<LocNormal> normalList;
+
+    public List<LocNormal> getNormalList() {
+        return normalList;
+    }
+
+    public void setNormalList(List<LocNormal> normalList) {
+        this.normalList = normalList;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
index f55851b..49a3b16 100644
--- a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -7,6 +7,9 @@
  */
 public class StockOutParam {
 
+    // 鍗曟嵁缂栧彿
+    private String fbillNo;
+
     // 鍑虹珯鍙�
     private Integer outSite;
 
@@ -29,6 +32,14 @@
         this.locDetls = locDetls;
     }
 
+    public String getFbillNo() {
+        return fbillNo;
+    }
+
+    public void setFbillNo(String fbillNo) {
+        this.fbillNo = fbillNo;
+    }
+
     public static class LocDetl {
 
         // 搴撲綅鍙�
diff --git a/src/main/java/com/zy/asrs/mapper/LocAreaMapper.java b/src/main/java/com/zy/asrs/mapper/LocAreaMapper.java
new file mode 100644
index 0000000..9b05106
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/LocAreaMapper.java
@@ -0,0 +1,15 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.LocArea;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface LocAreaMapper extends BaseMapper<LocArea> {
+    List<LocArea> queryAllLocArea(@Param("areaType") String areaType);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocNormalMapper.java b/src/main/java/com/zy/asrs/mapper/LocNormalMapper.java
new file mode 100644
index 0000000..b88ca82
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/LocNormalMapper.java
@@ -0,0 +1,40 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.LocNormal;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface LocNormalMapper extends BaseMapper<LocNormal> {
+    List<LocNormal> getLocNormalData();
+
+    public void updateLocNormal(@Param("matnr") String matnr,@Param("anfme") BigDecimal anfme, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime, @Param("id") Integer id);
+
+    public void outLocNormal(@Param("matnr") String matnr, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime, @Param("id") Integer id);
+
+    public void removeLocNormal(@Param("matnr") String matnr, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime, @Param("id") Integer id);
+
+    public void locNormalIn(List<LocNormal> list);
+
+    public void pdaLocNormalIn(List<LocNormal> list);
+
+    public List<LocNormal> pdaLocNormalQuery(@Param("matnr") String matnr, @Param("warehouse") String warehouse, @Param("billNo") String billNo);
+
+    public void pdaLocNormalOut1(@Param("id") Integer id,@Param("matnr") String matnr, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime, @Param("warehouse") String warehouse);
+
+    public void pdaLocNormalOut2(@Param("id") Integer id,@Param("matnr") String matnr,@Param("anfme") BigDecimal anfme, @Param("modiUser") Long modiUser, @Param("modiTime") Date modiTime, @Param("warehouse") String warehouse);
+
+    public List<LocNormal> pdaLocNormalWarehouseQuery(@Param("warehouse") String warehouse, @Param("matnr") String matnr);
+
+    public void pdaLocNormalMove(List<LocNormal> list);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/OutStockMapper.java b/src/main/java/com/zy/asrs/mapper/OutStockMapper.java
new file mode 100644
index 0000000..60d596d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/OutStockMapper.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.common.service.erp.entity.OutStockBillEntry;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface OutStockMapper extends BaseMapper<OutStockBillEntry> {
+    List<OutStockBillEntry> queryOutStock(Map<String, Object> map);
+
+    Integer queryOutStockCount(Map<String, Object> map);
+
+    List<LocDetl> queryMatWithLoc(String matnr);
+
+    List<OutStockBillEntry> queryMatnrWithBillNo(String fbillNo);
+}
diff --git a/src/main/java/com/zy/asrs/service/LocAreaService.java b/src/main/java/com/zy/asrs/service/LocAreaService.java
new file mode 100644
index 0000000..3ef3ce2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/LocAreaService.java
@@ -0,0 +1,10 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.LocArea;
+import com.baomidou.mybatisplus.service.IService;
+
+import java.util.List;
+
+public interface LocAreaService extends IService<LocArea> {
+    List<LocArea> queryAllLocArea (String areaType);
+}
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index cd6a205..617f320 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -30,5 +30,5 @@
      * @param matnr
      * @return
      */
-    List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String matStatusFlag);
+    List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String mat_status);
 }
diff --git a/src/main/java/com/zy/asrs/service/LocNormalService.java b/src/main/java/com/zy/asrs/service/LocNormalService.java
new file mode 100644
index 0000000..16a5b0b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/LocNormalService.java
@@ -0,0 +1,31 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.LocNormal;
+import io.swagger.models.auth.In;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface LocNormalService extends IService<LocNormal> {
+  List<LocNormal> getLocNormalData();
+
+  public void updateLocNormal(String matnr, BigDecimal anfme, Long modiUser, Date modiTime, Integer id);
+
+  public void outLocNormal(String matnr, Long modiUser, Date modiTime, Integer id);
+
+  public void removeLocNormal(String matnr, Long modiUser, Date modiTime, Integer id);
+
+  public void locNormalIn(List<LocNormal> list);
+
+  public void pdaLocNormalIn(List<LocNormal> list);
+
+  public List<LocNormal> pdaLocNormalQuery(String matnr, String warehouse, String billNo);
+
+  public void pdaLocNormalOut(List<LocNormal> list);
+
+  public List<LocNormal> pdaLocNormalWarehouseQuery(String warehouse, String matnr);
+
+  public void pdaLocNormalMove(List<LocNormal> list);
+}
diff --git a/src/main/java/com/zy/asrs/service/OutStockService.java b/src/main/java/com/zy/asrs/service/OutStockService.java
new file mode 100644
index 0000000..4876502
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/OutStockService.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.common.service.erp.entity.OutStockBillEntry;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface OutStockService extends IService<OutStockBillEntry> {
+    Page<OutStockBillEntry> queryOutStock(Page<OutStockBillEntry> page);
+
+    List<LocDetl> queryMatWithLoc(String matnr);
+
+    /**
+     * 鍑哄簱浣滀笟
+     */
+    void startupFullTakeStore(StockOutParam param, Long userId);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocAreaServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocAreaServiceImpl.java
new file mode 100644
index 0000000..f1c551a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/LocAreaServiceImpl.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.LocAreaMapper;
+import com.zy.asrs.entity.LocArea;
+import com.zy.asrs.service.LocAreaService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service("locAreaService")
+public class LocAreaServiceImpl extends ServiceImpl<LocAreaMapper, LocArea> implements LocAreaService {
+
+    @Override
+    public List<LocArea> queryAllLocArea(String areaType) {
+       return baseMapper.queryAllLocArea(areaType);
+    }
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index 7bdc702..f78510a 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -41,10 +41,10 @@
     }
 
     @Override
-    public List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String matStatusFlag) {
+    public List<LocDetl> getAllLocDetlData(String loc_no, String matnr, String mat_status) {
         List<LocDetl> allLocDetlData = baseMapper.getAllLocDetlData(loc_no, matnr);
         for (int i = 0; i < allLocDetlData.size(); i++) {
-            allLocDetlData.get(i).setMatStatusFlag(matStatusFlag);
+            allLocDetlData.get(i).setMatStatus(mat_status);
         }
         baseMapper.updateMatStatus(allLocDetlData);
         return baseMapper.getAllLocDetlData(loc_no, matnr);
diff --git a/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
new file mode 100644
index 0000000..4d32ff0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
@@ -0,0 +1,75 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.LocNormal;
+import com.zy.asrs.mapper.LocNormalMapper;
+import com.zy.asrs.service.LocNormalService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Service("locNormalService")
+public class LocNormalServiceImpl extends ServiceImpl<LocNormalMapper, LocNormal> implements LocNormalService {
+
+    @Override
+    public List<LocNormal> getLocNormalData() {
+        return baseMapper.getLocNormalData();
+    }
+
+    @Override
+    public void updateLocNormal(String matnr, BigDecimal anfme, Long modiUser, Date modiTime, Integer id) {
+        baseMapper.updateLocNormal(matnr, anfme, modiUser, modiTime, id);
+    }
+
+    @Override
+    public void outLocNormal(String matnr, Long modiUser, Date modiTime, Integer id) {
+        baseMapper.outLocNormal(matnr, modiUser, modiTime, id);
+    }
+
+    @Override
+    public void removeLocNormal(String matnr, Long modiUser, Date modiTime, Integer id) {
+        baseMapper.removeLocNormal(matnr, modiUser, modiTime, id);
+    }
+
+    @Override
+    public void locNormalIn(List<LocNormal> list) {
+        baseMapper.locNormalIn(list);
+    }
+
+    @Override
+    public void pdaLocNormalIn(List<LocNormal> list) {
+        baseMapper.pdaLocNormalIn(list);
+    }
+
+    @Override
+    public List<LocNormal> pdaLocNormalQuery(String matnr, String warehouse, String billNo) {
+       return baseMapper.pdaLocNormalQuery(matnr, warehouse, billNo);
+    }
+
+    @Override
+    public void pdaLocNormalOut(List<LocNormal> list) {
+        for (Integer i = 0; i < list.size(); i++) {
+            if (list.get(i).getAnfme().equals(list.get(i).getAnfmeOut())) {
+                baseMapper.pdaLocNormalOut1(list.get(i).getId(), list.get(i).getMatnr(), list.get(i).getModiUser(), list.get(i).getModiTime(), list.get(i).getWarehouse());
+            }
+            if (list.get(i).getAnfmeOut().compareTo(list.get(i).getAnfme()) == -1) {
+                BigDecimal diff = (list.get(i).getAnfme()).subtract(list.get(i).getAnfmeOut());
+                baseMapper.pdaLocNormalOut2(list.get(i).getId(), list.get(i).getMatnr(), diff, list.get(i).getModiUser(), list.get(i).getModiTime(), list.get(i).getWarehouse());
+            }
+        }
+    }
+
+    @Override
+    public List<LocNormal> pdaLocNormalWarehouseQuery(String warehouse, String matnr) {
+        return baseMapper.pdaLocNormalWarehouseQuery(warehouse, matnr);
+    }
+
+    @Override
+    public void pdaLocNormalMove(List<LocNormal> list) {
+        baseMapper.pdaLocNormalMove(list);
+    }
+}
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 d099d1a..43e74c4 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -99,10 +99,10 @@
                         .eq("matnr", combMat.getMatNo())
                         .isNull("zpallet"));
                 if (one == null) {
-                    throw new CoolException("閫氱煡鍗曚笉瀛樺湪"+combMat.getMatNo()+"鏁版嵁锛�");
+                    throw new CoolException("閫氱煡鍗曚笉瀛樺湪" + combMat.getMatNo() + "鏁版嵁锛�");
                 }
                 if (combMat.getCount() > one.getAnfme()) {
-                    throw new CoolException(combMat.getMatNo()+"鐗╂枡鏁伴噺涓嶈冻锛�");
+                    throw new CoolException(combMat.getMatNo() + "鐗╂枡鏁伴噺涓嶈冻锛�");
                 }
                 MatCode matCode = matCodeService.selectById(combMat.getMatNo());
                 if (Cools.isEmpty(matCode)) {
@@ -123,12 +123,20 @@
                     waitPakinService.delete(new EntityWrapper<WaitPakin>()
                             .eq("supplier", param.getBillNo())
                             .eq("matnr", combMat.getMatNo())
+                            .eq("warehouse", param.getWarehouse())
                             .isNull("zpallet"));
                 } else {
-                    Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
-                            .eq("supplier", param.getBillNo())
-                            .eq("matnr", combMat.getMatNo())
-                            .isNull("zpallet");
+                    Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>();
+                    if ("".equals(param.getWarehouse())) {
+                        wrapper.eq("supplier", param.getBillNo())
+                                .eq("matnr", combMat.getMatNo())
+                                .isNull("zpallet");
+                    } else {
+                        wrapper.eq("supplier", param.getBillNo())
+                                .eq("matnr", combMat.getMatNo())
+                                .eq("warehouse", param.getWarehouse())
+                                .isNull("zpallet");
+                    }
                     WaitPakin pakin = new WaitPakin();
                     pakin.setAnfme(one.getAnfme() - waitPakin.getAnfme());
                     if (!waitPakinService.update(pakin, wrapper)) {
@@ -141,8 +149,6 @@
 
 
         }
-
-
 
 
     }
diff --git a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
new file mode 100644
index 0000000..81bf09b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
@@ -0,0 +1,198 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.mapper.OutStockMapper;
+import com.zy.asrs.service.*;
+import com.zy.asrs.utils.VersionUtils;
+import com.zy.common.model.LocDetlDto;
+import com.zy.common.model.OutLocDto;
+import com.zy.common.service.CommonService;
+import com.zy.common.service.erp.entity.OutStockBillEntry;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service("outStockService")
+public class OutStockServiceImpl extends ServiceImpl<OutStockMapper, OutStockBillEntry> implements OutStockService{
+    // 宸ヤ綔鍙风敓鎴愯鍒欓粯璁ょ被鍨�
+    private static final int DEFAULT_WORK_NO_TYPE = 0;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private BasDevpService basDevpService;
+    @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private LocMastService locMastService;
+    @Autowired
+    private StaDescService staDescService;
+    @Autowired
+    private CommonService commonService;
+    @Autowired
+    private WrkDetlService wrkDetlService;
+
+    @Override
+    public Page<OutStockBillEntry> queryOutStock(Page<OutStockBillEntry> page) {
+        page.setRecords(baseMapper.queryOutStock(page.getCondition()));
+        page.setTotal(baseMapper.queryOutStockCount(page.getCondition()));
+        return page;
+    }
+
+    @Override
+    public List<LocDetl> queryMatWithLoc(String fbillNo) {
+        List<OutStockBillEntry> matList = baseMapper.queryMatnrWithBillNo(fbillNo);
+        List<LocDetl> tempLocList = new ArrayList<LocDetl>();
+        List<LocDetl> locList = new ArrayList<LocDetl>();
+        for (Integer i = 0; i < matList.size(); i++) {
+            /*鑷姩鏍规嵁鐗╂枡缂栫爜閫夊彇鏈�浼樺嚭璐ч『搴忥紙鍏堣繘鍏堝嚭锛岄潬澶栬揣鐗╁厛鍑猴級*/
+            tempLocList = baseMapper.queryMatWithLoc(matList.get(i).getFNumber());
+            BigDecimal needNum = matList.get(i).getFAuxQty();
+            BigDecimal locNum = BigDecimal.ZERO;
+            if (tempLocList.size() > 0) {
+                for (Integer j = 0; j < tempLocList.size(); j ++) {
+                    locNum = locNum.add(new BigDecimal(tempLocList.get(j).getAnfme()));
+                    /* 璁$畻闇�瑕佺殑鏁伴噺锛岀鍚堟暟閲忓悗缁撴潫寰幆 */
+                    if (needNum.compareTo(locNum) == 1) {
+                        locList.add(tempLocList.get(j));
+                    } else {
+                        locList.add(tempLocList.get(j));
+                        break;
+                    }
+                }
+            }
+        }
+        return locList;
+    }
+
+    @Override
+    @Transactional
+    public void startupFullTakeStore(StockOutParam param, Long userId) {
+        // 鐩爣绔欑偣鐘舵�佹娴�
+        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
+        // 鑾峰彇搴撲綅鏄庣粏
+        List<LocDetlDto> locDetlDtos = new ArrayList<>();
+        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
+            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
+                LocDetl sqlParam = new LocDetl();
+                sqlParam.setLocNo(paramLocDetl.getLocNo());
+                sqlParam.setMatnr(paramLocDetl.getMatnr());
+                LocDetl one = locDetlService.selectOne(new EntityWrapper<>(sqlParam));
+                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
+            }
+        }
+        if (!locDetlDtos.isEmpty()) {
+            // 鍚姩鍑哄簱寮�濮� 101.鍑哄簱
+            stockOut(staNo, locDetlDtos, null, userId, param.getFbillNo());
+        } else {
+            throw new CoolException("搴撲綅鐗╂枡涓嶅瓨鍦�");
+        }
+    }
+
+//    @Override
+    @Transactional
+    public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, Integer ioType, Long userId, String fbillNo) {
+        // 鍚堝苟鍚岀被椤�
+        Set<String> locNos = new HashSet<>();
+        locDetlDtos.forEach(dto -> locNos.add(dto.getLocDetl().getLocNo()));
+        List<OutLocDto> dtos = new ArrayList<>();
+        for (String locNo : locNos) {
+            List<LocDetlDto> list = new ArrayList<>();
+            Iterator<LocDetlDto> iterator = locDetlDtos.iterator();
+            while (iterator.hasNext()) {
+                LocDetlDto dto = iterator.next();
+                if (locNo.equals(dto.getLocDetl().getLocNo())) {
+                    list.add(dto);
+                    iterator.remove();
+                }
+            }
+            dtos.add(new OutLocDto(locNo, list));
+        }
+        // 鐢熸垚宸ヤ綔妗�
+        for (OutLocDto dto : dtos) {
+            // 鍒ゆ柇鍏ュ嚭搴撶被鍨嬶細101.鍏ㄦ澘鍑哄簱 or 103.鎷f枡鍑哄簱
+            if (ioType == null) {
+                ioType = dto.isAll() ? 101 : 103;
+            }
+            // 鑾峰彇搴撲綅
+            LocMast locMast = locMastService.selectById(dto.getLocNo());
+            // 鑾峰彇璺緞
+            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
+                    .eq("type_no", ioType)
+                    .eq("stn_no", staNo.getDevNo())
+                    .eq("crn_no", locMast.getCrnNo());
+            StaDesc staDesc = staDescService.selectOne(wrapper);
+            if (Cools.isEmpty(staDesc)) {
+                throw new CoolException("鍑哄簱璺緞涓嶅瓨鍦�");
+            }
+            // 鐢熸垚宸ヤ綔鍙�
+            int workNo = commonService.getWorkNo(DEFAULT_WORK_NO_TYPE);
+            // 鐢熸垚宸ヤ綔妗�
+            WrkMast wrkMast = new WrkMast();
+            wrkMast.setWrkNo(workNo);
+            wrkMast.setIoTime(new Date());
+            wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+            wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬�
+            wrkMast.setIoPri(13D); // 浼樺厛绾э細13
+            wrkMast.setCrnNo(locMast.getCrnNo());
+            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 婧愮珯
+            wrkMast.setStaNo(staDesc.getStnNo()); // 鐩爣绔�
+            wrkMast.setSourceLocNo(dto.getLocNo()); // 婧愬簱浣�
+            wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
+            wrkMast.setPicking("N"); // 鎷f枡
+            wrkMast.setExitMk("N"); // 閫�鍑�
+            wrkMast.setEmptyMk("N"); // 绌烘澘
+            wrkMast.setLinkMis("N");
+            wrkMast.setAppeUser(userId); // 鎿嶄綔浜哄憳鏁版嵁
+            wrkMast.setAppeTime(new Date());
+            wrkMast.setModiUser(userId);
+            wrkMast.setModiTime(new Date());
+            if (!wrkMastService.insert(wrkMast)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細"+dto.getLocNo());
+            }
+            // 鐢熸垚宸ヤ綔妗f槑缁�
+            for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
+                // 鍑哄簱鏃讹紝鏁伴噺涓�0鐨勭洿鎺ュ拷鐣�
+                if (detlDto.getCount()==null || detlDto.getCount() <= 0.0D) {continue;}
+                WrkDetl wrkDetl = new WrkDetl();
+                wrkDetl.setWrkNo(workNo);
+                wrkDetl.setIoTime(new Date());
+                Double anfme = ioType==101?detlDto.getLocDetl().getAnfme():detlDto.getCount();
+                wrkDetl.setAnfme(anfme); // 鏁伴噺
+                VersionUtils.setWrkDetl(wrkDetl, detlDto.getLocDetl()); // 鐗堟湰鎺у埗
+                wrkDetl.setAppeTime(new Date());
+                wrkDetl.setAppeUser(userId);
+                wrkDetl.setModiTime(new Date());
+                wrkDetl.setModiUser(userId);
+                wrkDetl.setWarehouse(fbillNo);
+                if (!wrkDetlService.insert(wrkDetl)) {
+                    throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                }
+            }
+            // 淇敼搴撲綅鐘舵��:   F.鍦ㄥ簱 ====>>> R.鍑哄簱棰勭害/P.鎷f枡/鐩樼偣/骞舵澘鍑哄簱涓�
+            locMast = locMastService.selectById(dto.getLocNo());
+            if (locMast.getLocSts().equals("F")) {
+                locMast.setLocSts(ioType==101?"R":"P");
+                locMast.setModiUser(userId);
+                locMast.setModiTime(new Date());
+                if (!locMastService.updateById(locMast)) {
+                    throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細"+dto.getLocNo());
+                }
+            } else {
+                throw new CoolException(dto.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+            }
+        }
+        // todo:luxiaotao
+        // 鍚屼竴鍒楃殑鍚屾椂鍑哄簱锛屽垯浼樺厛鍑烘祬搴撲綅
+    }
+}
diff --git a/src/main/java/com/zy/asrs/utils/VersionUtils.java b/src/main/java/com/zy/asrs/utils/VersionUtils.java
index d6a6f70..dadccf3 100644
--- a/src/main/java/com/zy/asrs/utils/VersionUtils.java
+++ b/src/main/java/com/zy/asrs/utils/VersionUtils.java
@@ -79,8 +79,8 @@
     public static void setMatCode(MatCode matCode, M_item item) {
         matCode.setMatNo(item.getMnumber()); // 鐗╂枡缂栧彿
         matCode.setMatName(item.getMname()); // 鐗╂枡鎻忚堪
-        matCode.setStr2(item.getMmodel()); // 鐗╂枡绫诲埆
-        matCode.setStr2(item.getMtypename());
+        matCode.setStr3(item.getMmodel()); // 鐗╂枡绫诲埆
+        matCode.setStr2(item.getMtypename()); // 瑙勬牸鍨嬪彿
     }
 
     // excel ----------------------------------------------------------------------
diff --git a/src/main/java/com/zy/common/service/erp/ErpService.java b/src/main/java/com/zy/common/service/erp/ErpService.java
index 0d0adc0..612fc92 100644
--- a/src/main/java/com/zy/common/service/erp/ErpService.java
+++ b/src/main/java/com/zy/common/service/erp/ErpService.java
@@ -281,8 +281,147 @@
         return erpSqlServer.update(sql) > 0;
     }
 
+    public boolean syncOutStock() {
+        return erpSqlServer.update("MERGE INTO xtyasrs.dbo.OutStockBill AS a \n" +
+                "USING (SELECT * FROM  xtyasrs_dual.dbo.OutStockBill c)\n" +
+                "AS b\n" +
+                " ON a.FInterID = b.FInterID\n" +
+                "WHEN MATCHED THEN\n" +
+                "UPDATE SET \n" +
+                "FBrNo = b.FBrNo,\n" +
+                "FInterID = b.FInterID,\n" +
+                "FBillNo = b.FBillNo,\n" +
+                "FTranType = b.FTranType,\n" +
+                "FSalType = b.FSalType,\n" +
+                "FCustID = b.FCustID,\n" +
+                "FDate = b.FDate,\n" +
+                "FStockID = b.FStockID,\n" +
+                "FAdd = b.FAdd,\n" +
+                "FNote = b.FNote,\n" +
+                "FEmpID = b.FEmpID,\n" +
+                "FCheckerID = b.FCheckerID,\n" +
+                "FBillerID = b.FBillerID,\n" +
+                "FManagerID = b.FManagerID,\n" +
+                "FClosed = b.FClosed,\n" +
+                "FInvoiceClosed = b.FInvoiceClosed,\n" +
+                "FBClosed = b.FBClosed,\n" +
+                "FDeptID = b.FDeptID,\n" +
+                "FSettleID = b.FSettleID,\n" +
+                "FTranStatus = b.FTranStatus,\n" +
+                "FExchangeRate = b.FExchangeRate,\n" +
+                "FCurrencyID = b.FCurrencyID,\n" +
+                "FStatus = b.FStatus,\n" +
+                "FCancellation = b.FCancellation,\n" +
+                "FMultiCheckLevel1 = b.FMultiCheckLevel1,\n" +
+                "FMultiCheckLevel2 = b.FMultiCheckLevel2,\n" +
+                "FMultiCheckLevel3 = b.FMultiCheckLevel3,\n" +
+                "FMultiCheckLevel4 = b.FMultiCheckLevel4,\n" +
+                "FMultiCheckLevel5 = b.FMultiCheckLevel5,\n" +
+                "FMultiCheckLevel6 = b.FMultiCheckLevel6,\n" +
+                "FMultiCheckDate1 = b.FMultiCheckDate1,\n" +
+                "FMultiCheckDate2 = b.FMultiCheckDate2,\n" +
+                "FMultiCheckDate3 = b.FMultiCheckDate3,\n" +
+                "FMultiCheckDate4 = b.FMultiCheckDate4,\n" +
+                "FMultiCheckDate5 = b.FMultiCheckDate5,\n" +
+                "FMultiCheckDate6 = b.FMultiCheckDate6,\n" +
+                "FCurCheckLevel = b.FCurCheckLevel,\n" +
+                "FRelateBrID = b.FRelateBrID,\n" +
+                "FCheckDate = b.FCheckDate,\n" +
+                "FExplanation = b.FExplanation,\n" +
+                "FFetchAdd = b.FFetchAdd,\n" +
+                "FSelTranType = b.FSelTranType,\n" +
+                "FChildren = b.FChildren,\n" +
+                "FBrID = b.FBrID,\n" +
+                "FAreaPS = b.FAreaPS,\n" +
+                "FPOOrdBillNo = b.FPOOrdBillNo,\n" +
+                "FManageType = b.FManageType,\n" +
+                "FPrintCount = b.FPrintCount,\n" +
+                "Fflag_rw = b.Fflag_rw,\n" +
+                "Fflag_finish = b.Fflag_finish,\n" +
+                "FWeiOrder = b.FWeiOrder,\n" +
+                "FWeiOpenID = b.FWeiOpenID,\n" +
+                "FOrderBillNo = b.FOrderBillNo,\n" +
+                "FWLNumber = b.FWLNumber,\n" +
+                "FWLCompany = b.FWLCompany,\n" +
+                "FReturnFundType = b.FReturnFundType\n" +
+                "WHEN NOT MATCHED  THEN\n" +
+                "\tINSERT (FBrNo, FInterID, FBillNo, FTranType, FSalType, FCustID, FDate, FStockID, FAdd, FNote, FEmpID, FCheckerID, FBillerID, FManagerID, FClosed, FInvoiceClosed, FBClosed, FDeptID, FSettleID, FTranStatus, FExchangeRate, FCurrencyID, FStatus, FCancellation, FMultiCheckLevel1, FMultiCheckLevel2, FMultiCheckLevel3, FMultiCheckLevel4, FMultiCheckLevel5, FMultiCheckLevel6, FMultiCheckDate1, FMultiCheckDate2, FMultiCheckDate3, FMultiCheckDate4, FMultiCheckDate5, FMultiCheckDate6, FCurCheckLevel, FRelateBrID, FCheckDate, FExplanation, FFetchAdd, FSelTranType, FChildren, FBrID, FAreaPS, FPOOrdBillNo, FManageType, FPrintCount, Fflag_rw, Fflag_finish, FWeiOrder, FWeiOpenID, FOrderBillNo, FWLNumber, FWLCompany, FReturnFundType) \n" +
+                "\tVALUES (b.FBrNo, b.FInterID, b.FBillNo, FTranType, FSalType, FCustID, FDate, FStockID, FAdd, FNote, FEmpID, FCheckerID, FBillerID, FManagerID, FClosed, FInvoiceClosed, FBClosed, FDeptID, FSettleID, FTranStatus, FExchangeRate, FCurrencyID, FStatus, FCancellation, FMultiCheckLevel1, FMultiCheckLevel2, FMultiCheckLevel3, FMultiCheckLevel4, FMultiCheckLevel5, FMultiCheckLevel6, FMultiCheckDate1, FMultiCheckDate2, FMultiCheckDate3, FMultiCheckDate4, FMultiCheckDate5, FMultiCheckDate6, FCurCheckLevel, FRelateBrID, FCheckDate, FExplanation, FFetchAdd, FSelTranType, FChildren, FBrID, FAreaPS, FPOOrdBillNo, FManageType, FPrintCount, Fflag_rw, Fflag_finish, FWeiOrder, FWeiOpenID, FOrderBillNo, FWLNumber, FWLCompany, FReturnFundType);")> 0;
+    }
 
-
+    public boolean syncOutStockDetail() {
+        return erpSqlServer.update("MERGE INTO xtyasrs.dbo.OutStockBillEntry AS a \n" +
+                "USING (SELECT * FROM  xtyasrs_dual.dbo.OutStockBillEntry c)\n" +
+                "AS b\n" +
+                " ON (a.FInterID = b.FInterID and a.FEntryID = b.FEntryID)\n" +
+                "WHEN MATCHED THEN\n" +
+                "UPDATE SET\n" +
+                "FBrNo = b.FBrNo,\n" +
+                "FInterID = b.FInterID,\n" +
+                "FEntryID = b.FEntryID,\n" +
+                "FDetailID = b.FDetailID,\n" +
+                "FItemID = b.FItemID,\n" +
+                "FQty = b.FQty,\n" +
+                "FCommitQty = b.FCommitQty,\n" +
+                "FPrice = b.FPrice,\n" +
+                "FAmount = b.FAmount,\n" +
+                "FOrderInterID = b.FOrderInterID,\n" +
+                "FDate = b.FDate,\n" +
+                "FNote = b.FNote,\n" +
+                "FInvoiceQty = b.FInvoiceQty,\n" +
+                "FBCommitQty = b.FBCommitQty,\n" +
+                "FUnitID = b.FUnitID,\n" +
+                "FAuxBCommitQty = b.FAuxBCommitQty,\n" +
+                "FAuxCommitQty = b.FAuxCommitQty,\n" +
+                "FAuxInvoiceQty = b.FAuxInvoiceQty,\n" +
+                "FAuxPrice = b.FAuxPrice,\n" +
+                "FAuxQty = b.FAuxQty,\n" +
+                "FSourceEntryID = b.FSourceEntryID,\n" +
+                "FMapNumber = b.FMapNumber,\n" +
+                "FMapName = b.FMapName,\n" +
+                "FAuxPropID = b.FAuxPropID,\n" +
+                "FBatchNo = b.FBatchNo,\n" +
+                "FCheckDate = b.FCheckDate,\n" +
+                "FExplanation = b.FExplanation,\n" +
+                "FFetchAdd = b.FFetchAdd,\n" +
+                "FFetchDate = b.FFetchDate,\n" +
+                "FMultiCheckDate1 = b.FMultiCheckDate1,\n" +
+                "FMultiCheckDate2 = b.FMultiCheckDate2,\n" +
+                "FMultiCheckDate3 = b.FMultiCheckDate3,\n" +
+                "FMultiCheckDate4 = b.FMultiCheckDate4,\n" +
+                "FMultiCheckDate5 = b.FMultiCheckDate5,\n" +
+                "FMultiCheckDate6 = b.FMultiCheckDate6,\n" +
+                "FSecCoefficient = b.FSecCoefficient,\n" +
+                "FSecQty = b.FSecQty,\n" +
+                "FSecCommitQty = b.FSecCommitQty,\n" +
+                "FSourceTranType = b.FSourceTranType,\n" +
+                "FSourceInterId = b.FSourceInterId,\n" +
+                "FSourceBillNo = b.FSourceBillNo,\n" +
+                "FContractInterID = b.FContractInterID,\n" +
+                "FContractEntryID = b.FContractEntryID,\n" +
+                "FContractBillNo = b.FContractBillNo,\n" +
+                "FOrderEntryID = b.FOrderEntryID,\n" +
+                "FOrderBillNo = b.FOrderBillNo,\n" +
+                "FStockID = b.FStockID,\n" +
+                "FBackQty = b.FBackQty,\n" +
+                "FAuxBackQty = b.FAuxBackQty,\n" +
+                "FSecBackQty = b.FSecBackQty,\n" +
+                "FStdAmount = b.FStdAmount,\n" +
+                "FPlanMode = b.FPlanMode,\n" +
+                "FMTONo = b.FMTONo,\n" +
+                "FStockQtyOnlyForShow = b.FStockQtyOnlyForShow,\n" +
+                "FComplexQty = b.FComplexQty,\n" +
+                "Fmodel = b.Fmodel,\n" +
+                "Fname = b.Fname,\n" +
+                "Fnumber = b.Fnumber,\n" +
+                "FBarCode = b.FBarCode,\n" +
+                "FBTPLCommitQty = b.FBTPLCommitQty,\n" +
+                "FTPLCommitQty = b.FTPLCommitQty,\n" +
+                "fsecinvoiceqty = b.fsecinvoiceqty\n" +
+                "WHEN NOT MATCHED  THEN\n" +
+                "\tINSERT (FBrNo, FInterID, FEntryID, FDetailID, FItemID, FQty, FCommitQty, FPrice, FAmount, FOrderInterID, FDate, FNote, FInvoiceQty, FBCommitQty, FUnitID, FAuxBCommitQty, FAuxCommitQty, FAuxInvoiceQty, FAuxPrice, FAuxQty, FSourceEntryID, FMapNumber, FMapName, FAuxPropID, FBatchNo, FCheckDate, FExplanation, FFetchAdd, FFetchDate, FMultiCheckDate1, FMultiCheckDate2, FMultiCheckDate3, FMultiCheckDate4, FMultiCheckDate5, FMultiCheckDate6, FSecCoefficient, FSecQty, FSecCommitQty, FSourceTranType, FSourceInterId, FSourceBillNo, FContractInterID, FContractEntryID, FContractBillNo, FOrderEntryID, FOrderBillNo, FStockID, FBackQty, FAuxBackQty, FSecBackQty, FStdAmount, FPlanMode, FMTONo, FStockQtyOnlyForShow, FComplexQty, Fmodel, Fname, Fnumber, FBarCode, FBTPLCommitQty, FTPLCommitQty, fsecinvoiceqty) \n" +
+                "\tVALUES (b.FBrNo, b.FInterID, b.FEntryID, b.FDetailID, b.FItemID, b.FQty, b.FCommitQty, b.FPrice, b.FAmount, b.FOrderInterID, b.FDate, b.FNote, b.FInvoiceQty, b.FBCommitQty, b.FUnitID, b.FAuxBCommitQty, b.FAuxCommitQty, b.FAuxInvoiceQty, b.FAuxPrice, b.FAuxQty, b.FSourceEntryID, b.FMapNumber, b.FMapName, b.FAuxPropID, b.FBatchNo, b.FCheckDate, b.FExplanation, b.FFetchAdd, b.FFetchDate, b.FMultiCheckDate1, b.FMultiCheckDate2, b.FMultiCheckDate3, b.FMultiCheckDate4, b.FMultiCheckDate5, b.FMultiCheckDate6, b.FSecCoefficient, b.FSecQty, b.FSecCommitQty, b.FSourceTranType, b.FSourceInterId, b.FSourceBillNo, b.FContractInterID, b.FContractEntryID, b.FContractBillNo, b.FOrderEntryID, b.FOrderBillNo, b.FStockID, b.FBackQty, b.FAuxBackQty, b.FSecBackQty, b.FStdAmount, b.FPlanMode, b.FMTONo, b.FStockQtyOnlyForShow, b.FComplexQty, b.Fmodel, b.Fname, b.Fnumber, b.FBarCode, b.FBTPLCommitQty, b.FTPLCommitQty, b.fsecinvoiceqty);")> 0;
+    }
 
 
 
diff --git a/src/main/java/com/zy/common/service/erp/entity/OutStockBill.java b/src/main/java/com/zy/common/service/erp/entity/OutStockBill.java
index 4dbc159..04e32a9 100644
--- a/src/main/java/com/zy/common/service/erp/entity/OutStockBill.java
+++ b/src/main/java/com/zy/common/service/erp/entity/OutStockBill.java
@@ -1,6 +1,9 @@
 package com.zy.common.service.erp.entity;
 
+import io.swagger.models.auth.In;
 import lombok.Data;
+
+import java.util.Date;
 
 /**
  * 鍑哄簱琛ㄥご
@@ -8,4 +11,115 @@
  */
 @Data
 public class OutStockBill {
+    private String FBrNo;
+    /*閫氱煡鍗曞唴鐮�*/
+    private Integer FInterID;
+    /*鍗曟嵁缂栧彿*/
+    private String FBillNo;
+    /*鍗曟嵁绫诲瀷*/
+    private Integer FTranType;
+    /*閿�鍞柟寮�*/
+    private Integer FSalType;
+    /*璐揣鍗曚綅*/
+    private Integer FCustID;
+    /*鏃ユ湡*/
+    private Date FDate;
+    /*鏀惰揣浠撳簱*/
+    private Integer FStockID;
+    /*鍦板潃*/
+    private String FAdd;
+    /*閫�鏂欏師鍥�*/
+    private String FNote;
+    /*涓氬姟鍛�*/
+    private Integer FEmpID;
+    /*瀹℃牳浜�*/
+    private Integer FCheckerID;
+    /*鍒跺崟*/
+    private Integer FBillerID;
+    /*涓荤*/
+    private Integer FManagerID;
+
+    private Integer FClosed;
+
+    private Short FInvoiceClosed;
+
+    private Short FBClosed;
+    /*閮ㄩ棬*/
+    private Integer FDeptID;
+    /*缁撶畻鏂瑰紡*/
+    private Integer FSettleID;
+    /*浼犺緭鐘舵��*/
+    private Integer FTranStatus;
+    /*姹囩巼*/
+    private Double FExchangeRate;
+    /*甯佸埆*/
+    private Integer FCurrencyID;
+    /*鐘舵��*/
+    private Short FStatus;
+    /*浣滃簾*/
+    private Long FCancellation;
+    /*涓�瀹�*/
+    private Integer FMultiCheckLevel1;
+    /*浜屽*/
+    private Integer FMultiCheckLevel2;
+    /*涓夊*/
+    private Integer FMultiCheckLevel3;
+    /*鍥涘*/
+    private Integer FMultiCheckLevel4;
+    /*浜斿*/
+    private Integer FMultiCheckLevel5;
+    /*鍏*/
+    private Integer FMultiCheckLevel6;
+    /*涓�绾у鏍告棩鏈�*/
+    private Date FMultiCheckDate1;
+    /*浜岀骇瀹℃牳鏃ユ湡*/
+    private Date FMultiCheckDate2;
+    /*涓夌骇瀹℃牳鏃ユ湡*/
+    private Date FMultiCheckDate3;
+    /*鍥涚骇瀹℃牳鏃ユ湡*/
+    private Date FMultiCheckDate4;
+    /*浜旂骇瀹℃牳鏃ユ湡*/
+    private Date FMultiCheckDate5;
+    /*鍏骇瀹℃牳鏃ユ湡*/
+    private Date FMultiCheckDate6;
+
+    private Integer FCurCheckLevel;
+    /*璁㈣揣鏈烘瀯*/
+    private Integer FRelateBrID;
+    /*瀹℃牳鏃ユ湡*/
+    private Date FCheckDate;
+
+    private String FExplanation;
+
+    private String FFetchAdd;
+
+    private Integer FSelTranType;
+
+    private Integer FChildren;
+
+    private Integer FBrID;
+
+    private Integer FAreaPS;
+
+    private String FPOOrdBillNo;
+
+    private Integer FManageType;
+
+    private Short FPrintCount;
+
+    private Integer Fflag_rw;
+
+    private Integer Fflag_finish;
+
+    private String FWeiOrder;
+
+    private String FWeiOpenID;
+
+    private String FOrderBillNo;
+
+    private String FWLNumber;
+
+    private String FWLCompany;
+
+    private String FReturnFundType;
 }
diff --git a/src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java b/src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java
index 673546d..12c8218 100644
--- a/src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java
+++ b/src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java
@@ -2,10 +2,143 @@
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 鍑哄簱琛ㄤ綋
  * Created by vincent on 2020/11/27
  */
 @Data
 public class OutStockBillEntry {
+    /* 璁㈠崟鐘舵�侊紝鍑哄簱涓垨宸插嚭搴� */
+    private Integer workRecord;
+    /*鍗曟嵁缂栧彿-OutStockBill琛ㄦ暟鎹� */
+    private String FBillNo;
+    /*鍦板潃-OutStockBill琛ㄦ暟鎹�*/
+    private String FAdd;
+
+    private String FBrNo;
+    /*閫氱煡鍗曞唴鐮�*/
+    private Integer FInterID;
+    /*鍒嗗綍鍙�*/
+    private Integer FEntryID;
+    /*浜у搧浠g爜鍐呯爜*/
+    private Integer FItemID;
+    /*鍩烘湰鍗曚綅鏁伴噺*/
+    private BigDecimal FQty;
+    /*鍙戣揣鏁伴噺*/
+    private BigDecimal FCommitQty;
+    /*鍗曚环*/
+    private BigDecimal FPrice;
+    /*閲戦*/
+    private BigDecimal FAmount;
+    /*閿�鍞鍗曞崟鍙�*/
+    private Integer FOrderInterID;
+    /*鏃ユ湡*/
+    private Date FDate;
+    /*澶囨敞*/
+    private String FNote;
+    /*寮�绁ㄦ暟閲�*/
+    private BigDecimal FInvoiceQty;
+    /*閫�璐ф暟閲�*/
+    private BigDecimal FBCommitQty;
+    /*璁¢噺鍗曚綅*/
+    private BigDecimal FUnitID;
+    /*杈呭姪閫�璐ф暟閲�*/
+    private BigDecimal FAuxBCommitQty;
+    /*杈呭姪鍙戣揣鏁伴噺*/
+    private BigDecimal FAuxCommitQty;
+    /*杈呭姪寮�绁ㄦ暟閲�*/
+    private BigDecimal FAuxInvoiceQty;
+    /*鍗曚环*/
+    private BigDecimal FAuxPrice;
+    /*鏁伴噺*/
+    private BigDecimal FAuxQty;
+    /*婧愬崟琛屽彿*/
+    private Integer FSourceEntryID;
+    /*瀵瑰簲浠g爜*/
+    private String FMapNumber;
+    /*瀵瑰簲鍚嶇О*/
+    private String FMapName;
+
+    private Integer FAuxPropID;
+
+    private String FBatchNo;
+
+    private Date FCheckDate;
+
+    private String FExplanation;
+
+    private String FFetchAdd;
+
+    private Date FFetchDate;
+
+    private Date FMultiCheckDate1;
+
+    private Date FMultiCheckDate2;
+
+    private Date FMultiCheckDate3;
+
+    private Date FMultiCheckDate4;
+
+    private Date FMultiCheckDate5;
+
+    private Date FMultiCheckDate6;
+
+    private BigDecimal FSecCoefficient;
+
+    private BigDecimal FSecQty;
+
+    private BigDecimal FSecCommitQty;
+
+    private Integer FSourceTranType;
+
+    private Integer FSourceInterId;
+    /*鐢熶骇鍗曞彿*/
+    private String FSourceBillNo;
+
+    private Integer FContractInterID;
+
+    private Integer FContractEntryID;
+
+    private String FContractBillNo;
+
+    private Integer FOrderEntryID;
+
+    private String FOrderBillNo;
+
+    private Integer FStockID;
+
+    private BigDecimal FBackQty;
+
+    private BigDecimal FAuxBackQty;
+
+    private BigDecimal FSecBackQty;
+
+    private BigDecimal FStdAmount;
+
+    private Integer FPlanMode;
+
+    private String FMTONo;
+
+    private Integer FDetailID;
+
+    private BigDecimal FStockQtyOnlyForShow;
+
+    private String FComplexQty;
+
+    private String Fmodel;
+
+    private String Fname;
+    /*鐗╂枡缂栫爜(浜у搧浠g爜)*/
+    private String FNumber;
+
+    private String FBarCode;
+
+    private String FBTPLCommitQty;
+
+    private String FTPLCommitQty;
+
+    private String fsecinvoiceqty;
 }
diff --git a/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java b/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
index de22ee3..c69f735 100644
--- a/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
+++ b/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
@@ -187,6 +187,31 @@
         }
     }
 
+    /**
+     * 鎴愬搧鍑哄簱-鍙戣揣閫氱煡鍗曡〃澶�
+     */
+    @Scheduled(cron = "0/30 * * * * ? ")
+    public void syncOutStock(){
+        boolean result = erpService.syncOutStock();
+        if (result) {
+//            System.out.format("%s\33[%d;%dm%s%n", "", 32, 3, "==========OutStockBill琛ㄥ悓姝ユ垚鍔�==========");
+        } else {
+            System.out.format("%s\33[%d;%dm%s%n", "", 31, 3, "==========OutStockBill琛ㄥ悓姝ュけ璐�==========");
+        }
+    }
+
+    /**
+     * 鎴愬搧鍑哄簱-鍙戣揣閫氱煡鍗曡〃浣�
+     */
+    @Scheduled(cron = "0/30 * * * * ? ")
+    public void syncOutStockDetail(){
+        boolean result = erpService.syncOutStockDetail();
+        if (result) {
+//            System.out.format("%s\33[%d;%dm%s%n", "", 32, 3, "==========OutStockBillEntry琛ㄥ悓姝ユ垚鍔�==========");
+        } else {
+            System.out.format("%s\33[%d;%dm%s%n", "", 31, 3, "==========OutStockBillEntry琛ㄥ悓姝ュけ璐�==========");
+        }
+    }
 
     /**
      * 鍘熸潗鏂欏嚭搴�
diff --git a/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcel.java b/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcel.java
new file mode 100644
index 0000000..d93043d
--- /dev/null
+++ b/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcel.java
@@ -0,0 +1,185 @@
+package com.zy.common.utils.excel.locNomal;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ExcelIgnoreUnannotated
+public class LocNormalExcel {
+    @ExcelProperty(index = 0)
+    private String matnr;
+    @ExcelProperty(index = 1)
+    private String maktx;
+    @ExcelProperty(index = 2)
+    private String lgnum;
+    @ExcelProperty(index = 3)
+    private String type;
+    @ExcelProperty(index = 4)
+    private String mnemonic;
+    @ExcelProperty(index = 5)
+    private String supplier;
+    @ExcelProperty(index = 6)
+    private String warehouse;
+    @ExcelProperty(index = 7)
+    private String brand;
+    @ExcelProperty(index = 8)
+    private BigDecimal anfme;
+    @ExcelProperty(index = 9)
+    private String altme;
+    @ExcelProperty(index = 10)
+    private String bname;
+    @ExcelProperty(index = 11)
+    private String memo;
+
+    private Long appeUser;
+
+    private Date appeTime;
+    @ExcelProperty(index = 12)
+    private String state;
+
+    public LocNormalExcel() {
+
+    }
+
+    public LocNormalExcel(String matnr, String maktx, String lgnum, String type, String mnemonic, String supplier, String warehouse, String brand, BigDecimal anfme, String altme, String bname, String memo, Long appeUser, Date appeTime,String state) {
+        this.matnr = matnr;
+        this.maktx = maktx;
+        this.lgnum = lgnum;
+        this.type = type;
+        this.mnemonic = mnemonic;
+        this.supplier = supplier;
+        this.warehouse = warehouse;
+        this.brand = brand;
+        this.anfme = anfme;
+        this.altme = altme;
+        this.bname = bname;
+        this.memo = memo;
+        this.appeUser = appeUser;
+        this.appeTime = appeTime;
+        this.state = state;
+    }
+
+    public String getMatnr() {
+        return matnr;
+    }
+
+    public void setMatnr(String matnr) {
+        this.matnr = matnr;
+    }
+
+    public String getMaktx() {
+        return maktx;
+    }
+
+    public void setMaktx(String maktx) {
+        this.maktx = maktx;
+    }
+
+    public String getLgnum() {
+        return lgnum;
+    }
+
+    public void setLgnum(String lgnum) {
+        this.lgnum = lgnum;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getMnemonic() {
+        return mnemonic;
+    }
+
+    public void setMnemonic(String mnemonic) {
+        this.mnemonic = mnemonic;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getWarehouse() {
+        return warehouse;
+    }
+
+    public void setWarehouse(String warehouse) {
+        this.warehouse = warehouse;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public BigDecimal getAnfme() {
+        return anfme;
+    }
+
+    public void setAnfme(BigDecimal anfme) {
+        this.anfme = anfme;
+    }
+
+    public String getAltme() {
+        return altme;
+    }
+
+    public void setAltme(String altme) {
+        this.altme = altme;
+    }
+
+    public String getBname() {
+        return bname;
+    }
+
+    public void setBname(String bname) {
+        this.bname = bname;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public Long getAppeUser() {
+        return appeUser;
+    }
+
+    public void setAppeUser(Long appeUser) {
+        this.appeUser = appeUser;
+    }
+
+    public Date getAppeTime() {
+        return appeTime;
+    }
+
+    public void setAppeTime(Date appeTime) {
+        this.appeTime = appeTime;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+}
diff --git a/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcelListener.java b/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcelListener.java
new file mode 100644
index 0000000..5ab8b78
--- /dev/null
+++ b/src/main/java/com/zy/common/utils/excel/locNomal/LocNormalExcelListener.java
@@ -0,0 +1,93 @@
+package com.zy.common.utils.excel.locNomal;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.core.common.SpringUtils;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.LocNormal;
+import com.zy.asrs.entity.MatCode;
+import com.zy.asrs.service.LocNormalService;
+import com.zy.asrs.service.MatCodeService;
+import com.zy.asrs.utils.VersionUtils;
+import com.zy.common.utils.excel.matcode.MatCodeExcel;
+import com.zy.common.utils.excel.matcode.MatCodeExcelListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class LocNormalExcelListener extends AnalysisEventListener<LocNormalExcel> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MatCodeExcelListener.class);
+
+    private int total = 0;
+    private Long userId;
+
+    public LocNormalExcelListener(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 姣忛殧5鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 50;
+
+    private final List<LocNormal> list = new ArrayList<>();
+
+    /**
+     * 杩欓噷浼氫竴琛岃鐨勮繑鍥炲ご
+     */
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+    }
+
+
+    /**
+     * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     */
+    @Override
+    public void invoke(LocNormalExcel data, AnalysisContext ctx) {
+        LocNormalService locNormalService = SpringUtils.getBean(LocNormalService.class);
+        if (locNormalService.selectById(data.getMatnr()) == null) {
+            LocNormal locNormal = new LocNormal();
+            // 鎻掑叆
+            locNormal.setMatnr(data.getMatnr());
+            locNormal.setMaktx(data.getMaktx());
+            locNormal.setLgnum(data.getLgnum());
+            locNormal.setType(data.getType());
+            locNormal.setMnemonic(data.getMnemonic());
+            locNormal.setSupplier(data.getSupplier());
+            locNormal.setWarehouse(data.getWarehouse());
+            locNormal.setBrand(data.getBrand());
+            locNormal.setAnfme(data.getAnfme());
+            locNormal.setAltme(data.getAltme());
+            locNormal.setBname(data.getBname());
+            locNormal.setMemo(data.getMemo());
+            locNormal.setState(data.getState());
+
+            locNormal.setModiTime(new Date());
+            locNormal.setModiUser(this.userId);
+            locNormal.setAppeTime(new Date());
+            locNormal.setAppeUser(this.userId);
+            if (!locNormalService.insert(locNormal)) {
+                throw new CoolException("瀵煎叆鏁版嵁寮傚父");
+            }
+            total ++;
+        }
+    }
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡璋冪敤
+     * 閫傚悎浜嬪姟
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext ctx) {
+        LOGGER.info("鏂板{}鏉$墿鏂欎俊鎭紒", total);
+    }
+
+    public int getTotal() {
+        return total;
+    }
+}
diff --git a/src/main/java/com/zy/common/web/BaseController.java b/src/main/java/com/zy/common/web/BaseController.java
index ecc7e80..468d7bb 100644
--- a/src/main/java/com/zy/common/web/BaseController.java
+++ b/src/main/java/com/zy/common/web/BaseController.java
@@ -17,6 +17,8 @@
 import java.lang.reflect.Modifier;
 import java.util.*;
 
+import static sun.security.krb5.internal.crypto.Nonce.value;
+
 /**
  * Created by vincent on 2019-09-09
  */
@@ -113,7 +115,11 @@
             }
             String column = null;
             if (field.isAnnotationPresent(TableField.class)) {
-                column = field.getAnnotation(TableField.class).value();
+                TableField annotation = field.getAnnotation(TableField.class);
+                if (!annotation.exist()) {
+                   continue;
+                }
+                column = annotation.value();
             }
             if (Cools.isEmpty(column)) {
                 column = field.getName();
diff --git a/src/main/java/locArea.sql b/src/main/java/locArea.sql
new file mode 100644
index 0000000..b07c33b
--- /dev/null
+++ b/src/main/java/locArea.sql
@@ -0,0 +1,20 @@
+-- save locArea record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea/locArea.html', 'locArea绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#btn-export', '瀵煎嚭', '', '3', '4', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'locArea#btn-into', '瀵煎叆', '', '3', '5', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea/locArea.html', N'骞充粨', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#view', N'鏌ヨ', '20385', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#btn-add', N'鏂板', '20385', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#btn-edit', N'缂栬緫', '20385', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#btn-delete', N'鍒犻櫎', '20385', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#btn-export', N'瀵煎嚭', '20385', '3', '4', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'locArea#btn-into', N'瀵煎叆', '20385', '3', '5', '1');
diff --git a/src/main/resources/mapper/LocAreaMapper.xml b/src/main/resources/mapper/LocAreaMapper.xml
new file mode 100644
index 0000000..d0599c1
--- /dev/null
+++ b/src/main/resources/mapper/LocAreaMapper.xml
@@ -0,0 +1,30 @@
+<?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.LocAreaMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.LocArea">
+        <id column="id" property="id"/>
+        <result column="uuid" property="uuid"/>
+        <result column="name" property="name"/>
+        <result column="status" property="status"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="memo" property="memo"/>
+
+    </resultMap>
+
+
+    <select id="queryAllLocArea" resultMap="BaseResultMap">
+        <choose>
+            <when test="areaType == 1">
+                select * from asr_loc_area where area_type = '1'
+            </when>
+            <otherwise>
+                select * from asr_loc_area where area_type != '1' or area_type is null
+            </otherwise>
+        </choose>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 9548d3b..8b9de7e 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -53,6 +53,9 @@
         <if test="supplier!=null and supplier!=null">
             and a.supplier like '%' + #{supplier} + '%'
         </if>
+        <if test="warehouse!=null and warehouse!=null">
+            and a.warehouse like '%' + #{warehouse} + '%'
+        </if>
     </sql>
 
     <select id="getStockOutPage" resultMap="BaseResultMap">
@@ -95,7 +98,7 @@
         BEGIN
         <foreach collection="list" item="item" index="index">
             update dbo.asr_loc_detl
-            set mat_status = #{item.matStatusFlag,jdbcType=VARCHAR}
+            set mat_status = #{item.matStatus,jdbcType=VARCHAR}
             where 1 = 1
             <if test="item.locNo!=null and item.locNo!='' ">
                 and loc_no = #{item.locNo,jdbcType=VARCHAR}
diff --git a/src/main/resources/mapper/LocNormalMapper.xml b/src/main/resources/mapper/LocNormalMapper.xml
new file mode 100644
index 0000000..83fc826
--- /dev/null
+++ b/src/main/resources/mapper/LocNormalMapper.xml
@@ -0,0 +1,119 @@
+<?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.LocNormalMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.LocNormal">
+        <result column="matnr" property="matnr"/>
+        <result column="maktx" property="maktx"/>
+        <result column="lgnum" property="lgnum"/>
+        <result column="type" property="type"/>
+        <result column="mnemonic" property="mnemonic"/>
+        <result column="supplier" property="supplier"/>
+        <result column="warehouse" property="warehouse"/>
+        <result column="brand" property="brand"/>
+        <result column="anfme" property="anfme"/>
+        <result column="bname" property="bname"/>
+        <result column="memo" property="memo"/>
+        <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="state" property="state"/>
+    </resultMap>
+
+    <select id="getLocNormalData" resultMap="BaseResultMap">
+      select * from asr_loc_normal
+    </select>
+
+    <!-- 鏇存柊骞充粨鐗╂枡鐨勬暟閲� -->
+    <update id="updateLocNormal">
+        update asr_loc_normal set anfme = #{anfme,jdbcType=DECIMAL},
+        modi_user = #{modiUser, jdbcType=DECIMAL}, modi_time = #{modiTime, jdbcType=TIMESTAMP}
+        where matnr = #{matnr,jdbcType=VARCHAR} and id = #{id, jdbcType=DECIMAL}
+    </update>
+
+    <update id="outLocNormal">
+        update asr_loc_normal set state = '2',modi_user = #{modiUser, jdbcType=DECIMAL},
+        modi_time = #{modiTime, jdbcType=TIMESTAMP} where matnr = #{matnr,jdbcType=VARCHAR} and id = #{id, jdbcType=DECIMAL}
+    </update>
+
+    <update id="removeLocNormal">
+        update asr_loc_normal set state = '3',modi_user = #{modiUser, jdbcType=DECIMAL},
+        modi_time = #{modiTime, jdbcType=TIMESTAMP} where matnr = #{matnr,jdbcType=VARCHAR} and id = #{id, jdbcType=DECIMAL}
+    </update>
+
+    <insert id="locNormalIn">
+        BEGIN
+        <foreach collection="list" item="item" index="index">
+            INSERT INTO asr_loc_normal (matnr, maktx, anfme, altme, lgnum, type, supplier, brand, warehouse, state,
+            appe_user, appe_time)
+            VALUES (#{item.matnr,jdbcType=VARCHAR}, #{item.maktx,jdbcType=VARCHAR}, #{item.anfme,jdbcType=DECIMAL},
+            #{item.altme,jdbcType=VARCHAR},#{item.lgnum, jdbcType=VARCHAR}, #{item.type, jdbcType=VARCHAR},
+            #{item.supplier, jdbcType=VARCHAR},#{item.brand, jdbcType=VARCHAR},
+            #{item.warehouse,jdbcType=VARCHAR}, '1', #{item.appeUser,jdbcType=DECIMAL},
+            #{item.appeTime,jdbcType=TIMESTAMP})
+        </foreach>
+        END;
+    </insert>
+
+    <insert id="pdaLocNormalIn">
+        BEGIN
+        <foreach collection="list" item="item" index="index">
+            INSERT INTO asr_loc_normal (matnr, maktx, anfme, mnemonic, supplier, warehouse, state, lgnum, type, altme,
+            appe_user, appe_time)
+            VALUES (#{item.matnr,jdbcType=VARCHAR}, #{item.maktx,jdbcType=VARCHAR}, #{item.anfme,jdbcType=DECIMAL},
+            #{item.mnemonic, jdbcType=VARCHAR}, #{item.supplier, jdbcType=VARCHAR},
+            #{item.warehouse,jdbcType=VARCHAR}, '1',
+            #{item.lgnum, jdbcType=VARCHAR}, #{item.type, jdbcType=VARCHAR},
+            #{item.altme, jdbcType=VARCHAR},
+            #{item.appeUser,jdbcType=DECIMAL},#{item.appeTime,jdbcType=TIMESTAMP})
+        </foreach>
+        END;
+    </insert>
+
+    <select id="pdaLocNormalQuery" resultMap="BaseResultMap">
+        select id, matnr,maktx, warehouse,anfme from asr_loc_normal
+        where 1 = 1
+        <if test="warehouse != null and warehouse != ''">
+            and warehouse = #{warehouse,jdbcType=VARCHAR}
+        </if>
+        <if test="matnr != null and matnr != ''">
+            and matnr =#{matnr,jdbcType=VARCHAR}
+        </if>
+        <if test="billNo != null and billNo != ''">
+            and supplier = #{billNo, jdbcType=VARCHAR}
+        </if>
+        and state = '1' COLLATE Chinese_PRC_CS_AS
+    </select>
+
+    <update id="pdaLocNormalOut1">
+        update asr_loc_normal set state = '2',modi_user = #{modiUser, jdbcType=DECIMAL},modi_time = #{modiTime, jdbcType=TIMESTAMP}
+        where matnr = #{matnr,jdbcType=VARCHAR} and warehouse = #{warehouse,jdbcType=VARCHAR} and id = #{id,jdbcType=DECIMAL}
+    </update>
+
+    <update id="pdaLocNormalOut2">
+        update asr_loc_normal set anfme = #{anfme, jdbcType=DECIMAL},modi_user = #{modiUser, jdbcType=DECIMAL},modi_time = #{modiTime, jdbcType=TIMESTAMP}
+        where matnr = #{matnr,jdbcType=VARCHAR} and warehouse = #{warehouse,jdbcType=VARCHAR} and id = #{id,jdbcType=DECIMAL}
+    </update>
+
+    <select id="pdaLocNormalWarehouseQuery" resultMap="BaseResultMap">
+        select id,matnr, maktx, warehouse from asr_loc_normal
+        where warehouse = #{warehouse, jdbcType=VARCHAR}
+        and state = '1'
+        <if test="matnr != ''">
+            and matnr = #{matnr, jdbcType=VARCHAR}
+        </if>
+        COLLATE Chinese_PRC_CS_AS
+    </select>
+
+    <update id="pdaLocNormalMove">
+        BEGIN
+        <foreach collection="list" item="item" index="index">
+            update asr_loc_normal set warehouse = #{item.warehouse,jdbcType=VARCHAR},
+            modi_user = #{item.modiUser, jdbcType=DECIMAL},modi_time = #{item.modiTime, jdbcType=TIMESTAMP}
+            where id = #{item.id,jdbcType=DECIMAL}
+        </foreach>
+        END;
+    </update>
+</mapper>
diff --git a/src/main/resources/mapper/OutStockMapper.xml b/src/main/resources/mapper/OutStockMapper.xml
new file mode 100644
index 0000000..8b61c42
--- /dev/null
+++ b/src/main/resources/mapper/OutStockMapper.xml
@@ -0,0 +1,109 @@
+<?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.OutStockMapper">
+
+    <!-- OutStockBillEntry鏄犲皠缁撴灉 -->
+    <resultMap id="OutStockResultMap" type="com.zy.common.service.erp.entity.OutStockBillEntry">
+        <result column="FBrNo" property="FBrNo"/>
+        <result column="FInterID" property="FInterID"/>
+        <result column="FEntryID" property="FEntryID"/>
+        <result column="FOrderInterID" property="FOrderInterID"/>
+        <result column="FAuxQty" property="FAuxQty"/>
+        <result column="FCommitQty" property="FCommitQty"/>
+        <result column="FAuxPrice" property="FAuxPrice"/>
+        <result column="FDate" property="FDate"/>
+        <result column="FNote" property="FNote"/>
+        <result column="Fnumber" property="FNumber"/>
+        <result column="FSourceBillNo" property="FSourceBillNo"/>
+        <result column="FBillNo" property="FBillNo"/>
+        <result column="FAdd" property="FAdd"/>
+        <result column="workRecord" property="workRecord"/>
+    </resultMap>
+
+    <!-- asr_loc_detl鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.LocDetl">
+        <result column="loc_no" property="locNo" />
+        <result column="matnr" property="matnr" />
+        <result column="maktx" property="maktx" />
+        <result column="lgnum" property="lgnum" />
+        <result column="type" property="type" />
+        <result column="mnemonic" property="mnemonic" />
+        <result column="supplier" property="supplier" />
+        <result column="warehouse" property="warehouse" />
+        <result column="brand" property="brand" />
+        <result column="anfme" property="anfme" />
+        <result column="altme" property="altme" />
+        <result column="zpallet" property="zpallet" />
+        <result column="bname" property="bname" />
+        <result column="memo" property="memo" />
+        <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="mat_status" property="matStatus" />
+    </resultMap>
+
+    <sql id="stockOutCondition">
+        <if test="FBillNo!=null and FBillNo!='' ">
+            and b.FBillNo like '%' + #{FBillNo} + '%'
+        </if>
+    </sql>
+
+    <select id="queryOutStock" resultMap="OutStockResultMap">
+        select * from
+        (
+        select ROW_NUMBER() over (order by a.FInterID,a.FEntryID) as row,a.FBrNo,a.FInterID,a.FEntryID,
+        a.FOrderInterID,a.FAuxQty,a.FCommitQty,a.FAuxPrice,a.FDate,a.FNote, a.Fnumber, a.FSourceBillNo, b.FBillNo,
+        b.FAdd,
+        ((select COUNT(*) from asr_wrk_detl where warehouse = b.FBillNo and matnr = a.Fnumber) + (select COUNT(*) from asr_wrk_detl_log where warehouse = b.FBillNo and matnr = a.Fnumber)) as workRecord
+        from OutStockBillEntry a left join OutStockBill b on a.FInterID = b.FInterID
+        where 1=1
+        <if test="FBillNo!=null and FBillNo!='' ">
+            and b.FBillNo = #{FBillNo}
+        </if>
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize}) and workRecord = 0
+    </select>
+
+    <select id="queryOutStockCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        select
+        count(1)
+        from OutStockBillEntry a
+        left join OutStockBill b on a.FInterID = b.FInterID
+        where 1=1
+    </select>
+
+    <select id="queryMatnrWithBillNo" resultMap="OutStockResultMap">
+        select * from (select ROW_NUMBER() over (order by a.FInterID,a.FEntryID) as row,a.FBrNo,a.FInterID,a.FEntryID,
+        a.FOrderInterID,a.FAuxQty,a.FCommitQty,a.FAuxPrice,a.FDate,a.FNote, a.Fnumber, a.FSourceBillNo, b.FBillNo,
+        b.FAdd,
+        ((select COUNT(*) from asr_wrk_detl where warehouse = b.FBillNo and matnr = a.Fnumber) + (select COUNT(*) from asr_wrk_detl_log where warehouse = b.FBillNo and matnr = a.Fnumber)) as workRecord
+        from OutStockBillEntry a left join OutStockBill b on a.FInterID = b.FInterID
+        where b.FBillNo = #{FBillNo}) t where t.workRecord = 0
+    </select>
+
+    <select id="queryMatWithLoc" resultMap="BaseResultMap">
+        select * from asr_loc_detl a left join asr_loc_mast b on a.loc_no = b.loc_no
+        where 1=1
+        and b.loc_sts = 'F'
+        and a.matnr = #{matnr}
+        order by
+        DATEPART(yyyy,a.modi_time),DATEPART(mm,a.modi_time),DATEPART(dd,a.modi_time)
+        desc,
+        case
+        when (left(a.loc_no, 2) = '01') then 0
+        when (left(a.loc_no, 2) = '02') then 1
+        when (left(a.loc_no, 2) = '03') then 1
+        when (left(a.loc_no, 2) = '04') then 0
+        when (left(a.loc_no, 2) = '05') then 0
+        when (left(a.loc_no, 2) = '06') then 1
+        when (left(a.loc_no, 2) = '07') then 1
+        when (left(a.loc_no, 2) = '08') then 0
+        when (left(a.loc_no, 2) = '09') then 0
+        when (left(a.loc_no, 2) = '10') then 1
+        when (left(a.loc_no, 2) = '11') then 1
+        when (left(a.loc_no, 2) = '12') then 0
+        else 0
+        end
+        desc
+    </select>
+</mapper>
diff --git a/src/main/webapp/static/css/pda.css b/src/main/webapp/static/css/pda.css
index 5a9609e..105cf36 100644
--- a/src/main/webapp/static/css/pda.css
+++ b/src/main/webapp/static/css/pda.css
@@ -31,7 +31,12 @@
     line-height: 30px;
 }
 #code {
-    width: 75%;
+    width: 70%;
+    height: 40px;
+    margin-right: 0;
+}
+#uuid {
+    width: 65%;
     height: 40px;
     margin-right: 0;
 }
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 50956f9..3004a23 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -7,6 +7,17 @@
 // 璇︽儏绐楀彛-瀹藉害
 var detailWidth = '90%';
 
+function getQueryVariable(variable)
+{
+    var query = window.location.search.substring(1);
+    var vars = query.split("&");
+    for (var i=0;i<vars.length;i++) {
+        var pair = vars[i].split("=");
+        if(pair[0] == variable){return pair[1];}
+    }
+    return(false);
+}
+
 // 闈炵┖鍒ゆ柇
 function isEmpty(obj){
     return typeof obj == "undefined" || obj == null || obj === "";
@@ -208,11 +219,22 @@
     ,{field: 'lgnum', align: 'center',title: '瑙勬牸'}
     ,{field: 'type', align: 'center',title: '鐗╂枡绫诲埆'}
     ,{field: 'mnemonic', align: 'center',title: '鍗曟嵁缂栧彿', hide: true}
-    ,{field: 'supplier', align: 'center',title: '閫氱煡鍗曞彿'}
-    // ,{field: 'warehouse', align: 'center',title: '浠撳簱'}
+    ,{field: 'supplier', align: 'center',title: '閫氱煡鍗曞彿', hide: true}
+    ,{field: 'warehouse', align: 'center',title: '鐢熶骇鍗曞彿'}
     // ,{field: 'brand', align: 'center',title: '鍝佺墝'}
     ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
     // ,{field: 'altme', align: 'center',title: '鍗曚綅'}
     ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
 ]
 
+var locNormalCols = [
+    {field: 'matnr', align: 'center',title: '鐗╂枡缂栫爜'}
+    ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О', width: 400}
+    ,{field: 'lgnum', align: 'center',title: '瑙勬牸'}
+    ,{field: 'type', align: 'center',title: '鐗╂枡绫诲埆'}
+    ,{field: 'mnemonic', align: 'center',title: '鍗曟嵁缂栧彿', hide: true}
+    ,{field: 'supplier', align: 'center',title: '閫氱煡鍗曞彿'}
+    // ,{field: 'warehouse', align: 'center',title: '搴撳尯'}
+    ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
+    ,{field: 'altme', align: 'center',title: '鍗曚綅'}
+]
diff --git a/src/main/webapp/static/js/cool.js b/src/main/webapp/static/js/cool.js
index d817c09..d4828b5 100644
--- a/src/main/webapp/static/js/cool.js
+++ b/src/main/webapp/static/js/cool.js
@@ -150,4 +150,39 @@
             }
         }
     });
+}
+
+var tips2;
+// 鏄惁瀛樺湪鏍¢獙
+function exist(id, domain, dom) {
+    var param = {
+        key: id,
+        val: $('#'+ (dom ? dom : id)).val()
+    };
+    $.ajax({
+        url: baseUrl+"/"+domain+"/check/column/auth",
+        headers: {'token': localStorage.getItem('token')},
+        data: JSON.stringify(param),
+        dataType:'json',
+        contentType:'application/json;charset=UTF-8',
+        method: 'POST',
+        success: function (res) {
+            if (res.code === 200) {
+                tips2 = layer.tips(
+                    "<span style='color:red;'>涓嶅瓨鍦�</span>",
+                    '#'+(dom ? dom : id),
+                    {
+                        // tipsMore: true,
+                        tips: [3,'#fff'],
+                        time:0
+                        ,area: 'auto'
+                        ,maxWidth:500
+                    });
+            } else if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            } else if (res.code === 407) {
+                layer.close(tips2);
+            }
+        }
+    });
 }
\ No newline at end of file
diff --git a/src/main/webapp/static/js/locArea/locArea.js b/src/main/webapp/static/js/locArea/locArea.js
new file mode 100644
index 0000000..63ad46b
--- /dev/null
+++ b/src/main/webapp/static/js/locArea/locArea.js
@@ -0,0 +1,475 @@
+var pageCurr;
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locArea',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/locArea/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'uuid', align: 'center',title: '搴撳尯缂栧彿'}
+            ,{field: 'name', align: 'center',title: '搴撳尯鍚嶇О'}
+            ,{field: 'status$', align: 'center',title: '鐘舵��'}
+            // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳',event: 'createBy', style: 'cursor:pointer', hide: true}
+            ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            // ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳',event: 'updateBy', style: 'cursor:pointer', hide: true}
+            ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
+            ,{field: 'memo', align: 'center',title: '澶囨敞'}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+        ]],
+        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();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locMast)', 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
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(locArea)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                layer.open({
+                    type: 2,
+                    title: '鏂板',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    content: 'locArea_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-edit', index).hide();
+                    	clearFormVal(layer.getChildFrame('#detail', index));
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                    }
+                });
+                break;
+            case 'deleteData':
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍒犻櫎'+(data.length===1?'姝�':data.length)+'鏉℃暟鎹悧', function(){
+                        $.ajax({
+                            url: baseUrl+"/locArea/delete/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {param: JSON.stringify(data)},
+                            method: 'POST',
+                            traditional:true,
+                            success: function (res) {
+                                if (res.code === 200){
+                                    layer.closeAll();
+                                    tableReload(false);
+                                } else if (res.code === 403){
+                                    top.location.href = baseUrl+"/";
+                                } else {
+                                    layer.msg(res.msg)
+                                }
+                            }
+                        })
+                    });
+                }
+                break;
+            case 'exportData':
+                layer.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 = {
+                        'locArea': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/locArea/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)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(locArea)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            // 璇︽儏
+            case 'detail':
+                layer.open({
+                    type: 2,
+                    title: '璇︽儏',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: true,
+                    content: 'locArea_detail.html',
+                    success: function(layero, index){
+                        setFormVal(layer.getChildFrame('#detail', index), data, true);
+                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                        layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                    }
+                });
+                break;
+            // 缂栬緫
+            case 'edit':
+                layer.open({
+                    type: 2,
+                    title: '淇敼',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    content: 'locArea_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-save', index).hide();
+                        setFormVal(layer.getChildFrame('#detail', index), data, false);
+                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), false);
+                        top.convertDisabled(layer.getChildFrame('#id', index), true);
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                    }
+                });
+                break;
+            case 'createBy':
+                var param = top.reObject(data).createBy;
+                if (param === undefined) {
+                    layer.msg("鏃犳暟鎹�");
+                } else {
+                   layer.open({
+                       type: 2,
+                       title: '娣诲姞浜哄憳璇︽儏',
+                       maxmin: true,
+                       area: [top.detailWidth, top.detailHeight],
+                       shadeClose: true,
+                       content: '../user/user_detail.html',
+                       success: function(layero, index){
+                           $.ajax({
+                               url: "baseUrl+/user/"+ param +"/auth",
+                               headers: {'token': localStorage.getItem('token')},
+                               method: 'GET',
+                               success: function (res) {
+                                   if (res.code === 200){
+                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
+                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                                       layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                                   } else if (res.code === 403){
+                                       top.location.href = baseUrl+"/";
+                                   }else {
+                                       layer.msg(res.msg)
+                                   }
+                               }
+                           })
+                       }
+                   });
+                }
+                break;
+            case 'updateBy':
+                var param = top.reObject(data).updateBy;
+                if (param === undefined) {
+                    layer.msg("鏃犳暟鎹�");
+                } else {
+                   layer.open({
+                       type: 2,
+                       title: '淇敼浜哄憳璇︽儏',
+                       maxmin: true,
+                       area: [top.detailWidth, top.detailHeight],
+                       shadeClose: true,
+                       content: '../user/user_detail.html',
+                       success: function(layero, index){
+                           $.ajax({
+                               url: "baseUrl+/user/"+ param +"/auth",
+                               headers: {'token': localStorage.getItem('token')},
+                               method: 'GET',
+                               success: function (res) {
+                                   if (res.code === 200){
+                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
+                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                                       layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                                   } else if (res.code === 403){
+                                       top.location.href = baseUrl+"/";
+                                   }else {
+                                       layer.msg(res.msg)
+                                   }
+                               }
+                           })
+                       }
+                   });
+                }
+                break;
+
+        }
+    });
+
+    // 鏁版嵁淇濆瓨鍔ㄤ綔
+    form.on('submit(save)', function () {
+        if (banMsg != null){
+            layer.msg(banMsg);
+            return;
+        }
+        method("add");
+    });
+
+    // 鏁版嵁淇敼鍔ㄤ綔
+    form.on('submit(edit)', function () {
+        method("update")
+    });
+
+    function method(name){
+        var uuid = $('#uuid').val();
+        var areaName = $('#name').val();
+        if (uuid === '' || !uuid) {
+            layer.msg('璇疯緭鍏ュ簱鍖虹紪鍙�');
+            return;
+        }
+        if (areaName === '' || !areaName) {
+            layer.msg('璇疯緭鍏ュ簱鍖哄悕绉�');
+            return;
+        }
+
+        var data = {
+            id: $('#id').val(),
+            uuid: $('#uuid').val(),
+            name: $('#name').val(),
+            status: $('#status').val(),
+            createBy: $('#createBy').val(),
+            createTime: top.strToDate($('#createTime\\$').val()),
+            updateBy: $('#updateBy').val(),
+            updateTime: top.strToDate($('#updateTime\\$').val()),
+            memo: $('#memo').val(),
+            areaType: $('#areaType').val() === "" ? null : $('#areaType').val(),
+        };
+        var index = layer.load(1, {
+            shade: [0.5,'#000'] //0.1閫忔槑搴︾殑鑳屾櫙
+        });
+        $.ajax({
+            url: baseUrl+"/locArea/"+name+"/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(data),
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    parent.layer.closeAll();
+                    parent.$(".layui-laypage-btn")[0].click();
+                    $("#data-detail :input").each(function () {
+                        $(this).val("");
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+                layer.close(index);
+            }
+        })
+    }
+
+    // 澶嶉�夋浜嬩欢
+    form.on('checkbox(detailCheckbox)', function (data) {
+        var el = data.elem;
+        if (el.checked) {
+            $(el).val('Y');
+        } else {
+            $(el).val('N');
+        }
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#createTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#updateTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(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;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+        }
+    });
+}
+
+function setFormVal(el, data, showImg) {
+    for (var val in data) {
+        var find = el.find(":input[id='" + val + "']");
+        if (find[0]!=null){
+            if (find[0].type === 'checkbox'){
+                if (data[val]==='Y'){
+                    find.attr("checked","checked");
+                    find.val('Y');
+                } else {
+                    find.remove("checked");
+                    find.val('N');
+                }
+                continue;
+            }
+        }
+        find.val(data[val]);
+        if (showImg){
+            var next = find.next();
+            if (next.get(0)){
+                if (next.get(0).localName === "img") {
+                    find.hide();
+                    next.attr("src", data[val]);
+                    next.show();
+                }
+            }
+        }
+    }
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.8);
+    }
+    layer.style(index, {
+//        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/locMatStatus/locMatStatus.js b/src/main/webapp/static/js/locMatStatus/locMatStatus.js
index 434c70a..f6c67f4 100644
--- a/src/main/webapp/static/js/locMatStatus/locMatStatus.js
+++ b/src/main/webapp/static/js/locMatStatus/locMatStatus.js
@@ -560,7 +560,7 @@
             }
             // 鏇存柊鐗╂枡鐘舵��
             $.ajax({
-                url: baseUrl+"/locDetl/getAllLocDetlData?loc_no=" + param.loc_no + "&matnr=" + param.matnr + "&matStatusFlag=" + param.matStatusFlag,
+                url: baseUrl+"/locDetl/getAllLocDetlData?loc_no=" + param.loc_no + "&matnr=" + param.matnr + "&mat_status=" + param.matStatusFlag,
                 headers: {'token': localStorage.getItem('token')},
                 // data: JSON.stringify(param),
                 dataType:'json',
diff --git a/src/main/webapp/static/js/locNormal/addLocNormal.js b/src/main/webapp/static/js/locNormal/addLocNormal.js
new file mode 100644
index 0000000..e6db8bf
--- /dev/null
+++ b/src/main/webapp/static/js/locNormal/addLocNormal.js
@@ -0,0 +1,83 @@
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click', '#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+layui.use(['table', 'laydate', 'form', 'upload'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var upload = layui.upload;
+    var form = layui.form;
+
+    // 鑾峰彇浠撳簱涓嬫媺
+    $.ajax({
+        url: baseUrl+"/locArea/queryAll/auth",
+        headers: {'token': localStorage.getItem('token')},
+        // data: top.reObject(data),
+        method: 'POST',
+        success: function (res) {
+            var html = "";
+                if (res.data && res.data.length > 0) {
+                html += res.data.map(function (item) {
+                    return "<Option value="+item.id+">"+item.name+"</Option>";
+                });
+            }
+            $('#warehouse').append(html);
+            form.render('select');
+        },
+    });
+
+    // 鏁版嵁淇濆瓨鍔ㄤ綔
+    form.on('submit(save)', function () {
+        if (banMsg != null) {
+            layer.msg(banMsg);
+            return;
+        }
+        // 鏁伴噺杈撳叆鏍¢獙
+        var reg=/^\d{1,}$/
+        var pattern=new RegExp(reg);
+        var anfme = $('#anfme').val();
+        if (!pattern.test(anfme)) {
+            layer.msg("璇疯緭鍏ユ纭殑鏁伴噺");
+            return;
+        }
+        // loading鍔犺浇鏁堟灉
+        var loadingIndex = layer.load(1, {
+            shade: [0.5,'#000']
+        });
+        // 琛ㄥ崟鍏ュ弬
+        var data = {
+            matnr: $('#matnr').val(),
+            maktx: $('#maktx').val(),
+            lgnum: $('#lgnum').val(),
+            type: $('#type').val(),
+            mnemonic: $('#mnemonic').val(),
+            supplier: $('#supplier').val(),
+            warehouse: $('#warehouse').val(),
+            brand: $('#brand').val(),
+            anfme: $('#anfme').val(),
+            altme: $('#altme').val(),
+        };
+        // 璇锋眰淇濆瓨鎺ュ彛
+        $.ajax({
+            url: baseUrl+"/locNomal/add/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(data),
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    parent.layer.closeAll();
+                    parent.tableReload();
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg);
+                }
+                // 鍏抽棴loading鍔犺浇鏁堟灉
+                layer.close(loadingIndex);
+            },
+        });
+    });
+});
\ No newline at end of file
diff --git a/src/main/webapp/static/js/locNormal/locNormal.js b/src/main/webapp/static/js/locNormal/locNormal.js
new file mode 100644
index 0000000..c331026
--- /dev/null
+++ b/src/main/webapp/static/js/locNormal/locNormal.js
@@ -0,0 +1,360 @@
+var pageCurr;
+var locNormalList = [];
+var locArea = [];
+
+function getCol() {
+    var cols = [];
+    cols.push(
+        {field: 'anfme', align: 'center', title: '鏁伴噺', sort: true, edit: 'text'}
+    )
+    cols.push.apply(cols, locNormalCols);
+    cols.push(
+        {field: 'warehouse', align: 'center', title: '搴撳尯'}
+        , {field: 'state', align: 'center', title: '鍑哄叆搴撶姸鎬�', templet: '#locNormalState'}
+        , {field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
+        , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true}
+        , {field: 'appeTime$', align: 'center', title: '鍒涘缓鏃堕棿', hide: true}
+        , {field: '', align: 'center', title: '鎿嶄綔', width: 135, fixed: 'right', templet: '#operate'}
+    );
+    return cols;
+}
+
+// 鑾峰彇浠撳簱涓嬫媺
+$.ajax({
+    url: baseUrl+"/locArea/queryAll/auth",
+    headers: {'token': localStorage.getItem('token')},
+    // data: top.reObject(data),
+    method: 'POST',
+    success: function (res) {
+        if (res.data && res.data.length > 0) {
+            locArea = res.data;
+        }
+    },
+});
+
+// 搴撳尯涓嬫媺
+// 鑾峰彇浠撳簱涓嬫媺
+$.ajax({
+    url: baseUrl + "/locArea/queryAll/auth",
+    headers: {'token': localStorage.getItem('token')},
+    method: 'POST',
+    success: function (res) {
+        if (res.code === 200) {
+            var html = "";
+            if (res.data && res.data.length > 0) {
+                html += res.data.map(function (item) {
+                    return "<Option value=" + item.uuid + ">" + item.name + "</Option>";
+                });
+            }
+            $('#putSiteSelect').append(html);
+        } else if (res.code === 403) {
+            top.location.href = baseUrl + "/";
+        } else {
+            layer.msg(res.msg)
+        }
+    }
+})
+
+layui.use(['table', 'laydate', 'form', 'upload'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var upload = layui.upload;
+
+    // 瀵煎叆excel
+    var uploader = upload.render({
+        elem: '#uploadEx'
+        , url: baseUrl + '/locNormal/import/auth'
+        , headers: {token: localStorage.getItem('token')}
+        , accept: 'file'
+        , exts: 'xls|excel|xlsx'
+        , auto: false
+        , bindAction: '#uploadDo'
+        , before: function (obj) {
+            layer.closeAll();
+            layer.load(1, {shade: [0.1, '#fff']});
+        }
+        , choose: function (obj) {
+            $('#uploadDesc').hide();
+            $('#uploadDemoView').show();
+            obj.preview(function (index, file, result) {
+                $('#fileMame').html(file.name);
+            });
+        }
+        , done: function (res) {
+            limit();
+            $('#uploadDesc').show();
+            $('#uploadDemoView').hide();
+            $('#fileMame').html("");
+            layer.closeAll('loading');
+            layer.msg(res.msg);
+            tableReload(false);
+        }
+        , error: function (index, upload) {
+            layer.closeAll('loading');
+        }
+    });
+
+    /* 瀵煎叆 */
+    table.on('toolbar(locNormal)', function (obj) {
+        switch (obj.event) {
+            // 瀵煎叆
+            case 'intoData':
+                layer.open({
+                    type: 1,
+                    title: '鏁版嵁瀵煎叆',
+                    shadeClose: true,
+                    content: $('#importDataDiv'),
+                    success: function (layero, index) {
+                        uploader.reload();
+                    },
+                    end: function () {
+                        $('#uploadDesc').show();
+                        $('#uploadDemoView').hide();
+                        $('#fileMame').html("");
+                    }
+                });
+                break;
+        }
+    });
+
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locNormal',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl + '/locNomal/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            // 瑙f瀽搴撳尯鍚嶇О
+            var records = res.data.records;
+            records.map(function (item) {
+                locArea.map(function (d) {
+                    if (d.uuid == item.warehouse) {
+                        item.warehouse = d.name;
+                    }
+                })
+            });
+            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();
+            // 褰撳墠鍒嗛〉鏁版嵁瀛樺偍
+            locNormalList = res.data;
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locNormal)', 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
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                }
+                pageCurr = curr;
+                limit();
+                // 褰撳墠鍒嗛〉鏁版嵁瀛樺偍
+                locNormalList = res.data;
+            }
+        });
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(locNormal)', function (obj) {
+        var count = obj.value;
+        var matnr = obj.data.matnr;
+        var id = obj.data.id;
+
+        if (isNaN(count)) {
+            layer.msg("璇疯緭鍏ユ暟瀛�");
+            // 鏁版嵁閲嶈浇
+            tableIns.reload({
+                data: locNormalList, done: function (res) {
+                    limit();
+                }
+            });
+        } else {
+            if (count > 0) {
+                for (var i = 0; i < locNormalList.length; i++) {
+                    if (locNormalList[i]["matnr"] === matnr) {
+                        locNormalList[i]["anfme"] = count;
+                    }
+                }
+            } else {
+                layer.msg("鏁伴噺蹇呴』澶т簬闆�");
+            }
+        }
+        // 璇锋眰鏇存柊鎺ュ彛瀹屾垚鏁伴噺鐨勬洿鏂�
+        const param = {
+            matnr: matnr,
+            anfme: count,
+            id: id,
+        }
+        $.ajax({
+            url: baseUrl + "/locNormal/update/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(param),
+            method: 'POST',
+            success: function (res) {
+            },
+        });
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(locNormal)', function (obj) {
+        var data = obj.data;
+        var param = {
+            matnr: data.matnr,
+            id: data.id,
+        }
+        switch (obj.event) {
+            case 'outLocNormal':
+                layer.confirm('纭畾瑕佸嚭搴揫'+data.matnr+']鍚楋紵', {
+                    btn: ['纭畾', '鍙栨秷'] //鍙互鏃犻檺涓寜閽�
+                }, function(index, layero){
+                    //纭畾鍥炶皟-鍑哄簱
+                    $.ajax({
+                        url: baseUrl + "/locNormal/outLoc/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: top.reObject(param),
+                        method: 'POST',
+                        success: function (res) {
+                            tableReload(false);
+                            layer.closeAll();
+                            layer.msg("鍑哄簱鎴愬姛");
+                        },
+                    });
+                }, function(index){
+                    //鎸夐挳銆愭寜閽簩銆戠殑鍥炶皟
+                });
+                break;
+            case 'removeLocNormal':
+                // 绉婚櫎
+                layer.confirm('纭畾瑕佺Щ闄'+data.matnr+']鍚楋紵', {
+                    btn: ['纭畾', '鍙栨秷'] //鍙互鏃犻檺涓寜閽�
+                }, function(index, layero){
+                    //纭畾鍥炶皟-绉婚櫎
+                    $.ajax({
+                        url: baseUrl + "/locNormal/removeLoc/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: top.reObject(param),
+                        method: 'POST',
+                        success: function (res) {
+                            tableReload(false);
+                            layer.closeAll();
+                            layer.msg("绉婚櫎鎴愬姛");
+                        },
+                    });
+                }, function(index){
+                    //鎸夐挳銆愭寜閽簩銆戠殑鍥炶皟
+                });
+                break;
+        }
+    });
+
+
+});
+
+/* 琛ㄦ牸鏁版嵁閲嶈浇 */
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function () {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            }
+            pageCurr = curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr - 1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+            // 褰撳墠鍒嗛〉鏁版嵁瀛樺偍
+            locNormalList = res.data;
+        }
+    });
+}
+
+/* 鐩戝惉鍥炶溅浜嬩欢 */
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
+
+// 鎻愬彇鐗╂枡
+var addLocNormalIdx;
+
+function addLocNormal() {
+    addLocNormalIdx = layer.open({
+        type: 2,
+        title: '鏂板',
+        maxmin: true,
+        area: [top.detailWidth, '550px'],
+        shadeClose: true,
+        content: 'addLocNormal.html',
+        success: function (layero, index) {
+        }
+    });
+}
+
+
diff --git a/src/main/webapp/static/js/locNormal/locNormalIn.js b/src/main/webapp/static/js/locNormal/locNormalIn.js
new file mode 100644
index 0000000..a6d0d45
--- /dev/null
+++ b/src/main/webapp/static/js/locNormal/locNormalIn.js
@@ -0,0 +1,248 @@
+var initCountVal = 0;
+var matCodeData = [];
+var index = 0;
+
+function getCol() {
+    var cols = [
+        // {type: 'checkbox', fixed: 'left'},
+        {
+            fixed: 'left',
+            field: 'anfme',
+            title: '鏁伴噺(蹇呭~)',
+            align: 'center',
+            edit: 'text',
+            width: 120,
+            style: 'color: blue;font-weight: bold'
+        }
+    ];
+    locNormalCols.map(function (item) {
+        if (item.field === 'supplier') {
+            item.edit = 'text';
+        }
+    })
+    cols.push.apply(cols, locNormalCols);
+    // cols.push({field: 'matStatus', title: '鐗╂枡鐘舵��', align: 'center', width: 120, templet: '#matStatus'});
+    cols.push({fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 80});
+    return cols;
+}
+
+layui.use(['table', 'laydate', 'form'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        data: [],
+        even: true,
+        limit: 500,
+        cellMinWidth: 50,
+        toolbar: '#toolbar',
+        cols: [getCol()],
+        done: function (res, curr, count) {
+            $('td[data-field=count] div').html(initCountVal);
+            setMatCodeData(res.data);
+            limit();
+            getInBound();
+        }
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(chooseData)', function (obj) {
+        if (obj.field === 'anfme') {
+            updateMatCodeData(obj.data.matnr, Number(obj.value), obj.data.index);
+        }
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        var data = checkStatus.data;
+        switch (obj.event) {
+            case 'comb':
+                // 鍒ゆ柇鏄惁瀛樺湪鐗╂枡
+                if (matCodeData.length === 0) {
+                    layer.msg("璇峰厛娣诲姞鐗╂枡");
+                    return;
+                }
+                // 鍒ゆ柇鐗╂枡鏁伴噺鏄惁瀛樺湪寮傚父
+                for (var i = 0; i < matCodeData.length; i++) {
+                    if (isNaN(matCodeData[i].anfme)) {
+                        layer.msg("璇疯緭鍏ユ暟瀛�");
+                        return;
+                    }
+                    if (matCodeData[i].anfme === 0) {
+                        layer.msg("鏁伴噺涓嶈兘涓洪浂");
+                        return;
+                    }
+                }
+                // 鍒ゆ柇搴撳尯鏄惁涓虹┖
+                var warehouse = $('#putSiteSelect').val();
+                if (!warehouse || warehouse === '') {
+                    layer.msg("璇烽�夋嫨搴撳尯");
+                    return;
+                }
+                // 鍏ュ簱鏁版嵁璧嬪�煎簱鍖�
+                matCodeData.map(function (item) {
+                    item.warehouse = warehouse;
+                });
+                // 璇锋眰鎺ュ彛杩涜骞充粨鍏ュ簱
+                $.ajax({
+                    url: baseUrl + "/locNormal/in",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: JSON.stringify({
+                        normalList: matCodeData,
+                    }),
+                    contentType: 'application/json;charset=UTF-8',
+                    method: 'POST',
+                    async: false,
+                    success: function (res) {
+                        if (res.code === 200) {
+                            layer.msg("鍏ュ簱鍚姩鎴愬姛");
+                            matCodeData = [];
+                            tableIns.reload({
+                                data: matCodeData, done: function (res) {
+                                    limit();
+                                    getInBound();
+                                }
+                            });
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl + "/";
+                        } else {
+                            layer.msg(res.msg)
+                        }
+                    }
+                })
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(chooseData)', function (obj) {
+        var data = obj.data;
+        switch (obj.event) {
+            case 'remove':
+                for (var i = matCodeData.length - 1; i >= 0; i--) {
+                    if (matCodeData[i].matnr === data.matnr && matCodeData[i].index === data.index) {
+                        matCodeData.splice(i, 1);
+                    }
+                }
+                tableIns.reload({
+                    data: matCodeData,
+                });
+                break;
+        }
+    });
+
+    function setMatCodeData(data) {
+        matCodeData = data;
+        for (var i = 0; i < matCodeData.length; i++) {
+            matCodeData[i]["count"] = initCountVal;
+        }
+    }
+
+    function updateMatCodeData(matnr, count, index) {
+        if (isNaN(count)) {
+            layer.msg("璇疯緭鍏ユ暟瀛�");
+        } else {
+            if (count > 0) {
+                for (var i = 0; i < matCodeData.length; i++) {
+                    if (matCodeData[i]["matnr"] === matnr && matCodeData[i]["index"] === index) {
+                        matCodeData[i]["anfme"] = count;
+                    }
+                }
+            } else {
+                layer.msg("鏁伴噺蹇呴』澶т簬闆�");
+            }
+        }
+
+        tableIns.reload({
+            data: matCodeData,
+        });
+    }
+
+    // 鑾峰彇鍙敤鍏ュ簱绔欑偣
+    function getInBound() {
+        // 鑾峰彇浠撳簱涓嬫媺
+        $.ajax({
+            url: baseUrl + "/locArea/queryAll/auth",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var html = "";
+                    if (res.data && res.data.length > 0) {
+                        html += res.data.map(function (item) {
+                            return "<Option value=" + item.uuid + ">" + item.name + "</Option>";
+                        });
+                    }
+                    $('#putSiteSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+
+
+});
+
+// 鎻愬彇鐗╂枡
+var matCodeLayerIdx;
+function getMat() {
+    matCodeLayerIdx = layer.open({
+        type: 2,
+        title: '鎻愬彇鐗╂枡',
+        maxmin: true,
+        area: [top.detailWidth, top.detailHeight],
+        shadeClose: true,
+        content: '../pakStore/matQuery.html',
+        success: function (layero, index) {
+        }
+    });
+}
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(data) {
+    // 鏁版嵁鏍煎紡杞崲
+    var newData = [];
+    data.map(function (item) {
+        newData.push({
+            matnr: item.matNo,
+            maktx: item.matName,
+            lgnum: item.str3,
+            type: item.str2,
+            supplier: item.str6,
+            warehouse: item.str7,
+            brand: item.str8,
+            altme: item.str1,
+            state: 1, // 鍏ュ簱鐘舵��
+            anfme: 0,
+            index: index,
+        });
+    });
+    index++;
+
+    for (var i = 0; i < newData.length; i++) {
+        let pass = false;
+        for (var j = 0; j < matCodeData.length; j++) {
+            if (newData[i].matnr === matCodeData[j].matNo) {
+                pass = true;
+                break;
+            }
+        }
+        if (pass) {
+            newData.splice(i--, 1);
+        } else {
+            newData[i]["count"] = initCountVal;
+        }
+    }
+    matCodeData.push.apply(matCodeData, newData);
+    tableIns.reload({data: matCodeData});
+    layer.close(matCodeLayerIdx);
+}
\ No newline at end of file
diff --git a/src/main/webapp/static/js/pakStore/outStock.js b/src/main/webapp/static/js/pakStore/outStock.js
new file mode 100644
index 0000000..0725dfd
--- /dev/null
+++ b/src/main/webapp/static/js/pakStore/outStock.js
@@ -0,0 +1,150 @@
+var pageCurr;
+var tableMerge;
+var orderData;
+var outStockDetail;
+
+function getCol() {
+    var cols = [];
+    cols.push(
+        {field: 'fbillNo', merge: true, align: 'center', title: '鍗曟嵁缂栧彿'}
+        , {field: 'fnumber', align: 'center', title: '鐗╂枡缂栧彿'}
+        , {field: 'fentryID', align: 'center', title: '鍒嗗綍鍙�'}
+        , {field: 'forderInterID', align: 'center', title: '閿�鍞鍗曞崟鍙�'}
+        , {field: 'fauxQty', align: 'center', title: '鏁伴噺'}
+        , {field: 'fcommitQty', align: 'center', title: '鍙戣揣鏁伴噺'}
+        , {field: 'fauxPrice', align: 'center', title: '鍗曚环'}
+        , {field: 'fdate', align: 'center', title: '鏃ユ湡'}
+        , {field: 'fnote', align: 'center', title: '澶囨敞'}
+        , {field: 'fadd', align: 'center', title: '鍦板潃'}
+        , {fixed: 'right', merge: ['fbillNo'], title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 80}
+    );
+    return cols;
+}
+
+layui.use(['table', 'laydate', 'form', 'upload'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var upload = layui.upload;
+    tableMerge = layui.tableMerge;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#salesOrder',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl + '/outStock/query/list',
+        page: true,
+        limit: 16,
+        limits: [16, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        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;
+            layui.tableMerge.render(this);
+        }
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '.layui-laydate-range'
+        , type: 'datetime'
+        , range: true
+    });
+
+    table.on('tool(salesOrder)', function (obj) {
+        var data = obj.data; //鑾峰緱褰撳墠琛屾暟鎹�
+        var layEvent = obj.event; //鑾峰緱 lay-event 瀵瑰簲鐨勫�硷紙涔熷彲浠ユ槸琛ㄥご鐨� event 鍙傛暟瀵瑰簲鐨勫�硷級
+        orderData = data;
+        // 濡傛灉鏄偣鍑绘搷浣滄寜閽�
+        if (layEvent == 'btnOut') {
+            outStockDetail = layer.open(
+                {
+                    type: 2,
+                    title: '閫夋嫨鍑哄簱-鍗曟嵁缂栧彿[' + orderData.fbillNo + ']',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'outStockDetail.html',
+                    success: function (layero, index) {
+
+                    }
+                }
+            );
+        }
+    });
+});
+
+function getOrderData() {
+    return orderData;
+}
+
+/* 琛ㄦ牸鏁版嵁閲嶈浇 */
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function () {
+        searchData[this.name] = this.value;
+    });
+
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            }
+            pageCurr = curr;
+            tableMerge.render(this);
+        }
+    });
+}
+
+/* 鍏抽棴鏄庣粏 */
+function closeDetail(msg) {
+    layer.close(outStockDetail);
+    layer.msg(msg);
+}
+
+/* 鐩戝惉鍥炶溅浜嬩欢 */
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/pakStore/pakStore.js b/src/main/webapp/static/js/pakStore/pakStore.js
index e7d15a4..bc8b53c 100644
--- a/src/main/webapp/static/js/pakStore/pakStore.js
+++ b/src/main/webapp/static/js/pakStore/pakStore.js
@@ -14,6 +14,12 @@
             style: 'color: blue;font-weight: bold'
         }
     ];
+    matCols.map(function (item) {
+        if (item.field === 'str6') {
+            item.edit = 'text';
+            item.style = 'color: blue;font-weight: bold';
+        }
+    })
     cols.push.apply(cols, matCols);
     cols.push({field: 'matStatus', title: '鐗╂枡鐘舵��', align: 'center', width: 120, templet: '#matStatus'});
     cols.push({fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 80});
@@ -45,7 +51,9 @@
 
     // 椤甸潰淇敼
     table.on('edit(chooseData)', function (obj) {
-        updateMatCodeData(obj.data.matNo, Number(obj.value));
+        if (obj.field === 'count') {
+            updateMatCodeData(obj.data.matNo, Number(obj.value));
+        }
     });
 
     // 鐩戝惉澶村伐鍏锋爮浜嬩欢
diff --git a/src/main/webapp/static/js/salesOrder/salsesOrder.js b/src/main/webapp/static/js/salesOrder/salsesOrder.js
new file mode 100644
index 0000000..df18260
--- /dev/null
+++ b/src/main/webapp/static/js/salesOrder/salsesOrder.js
@@ -0,0 +1,144 @@
+var pageCurr;
+
+function getCol() {
+    var cols = [];
+    cols.push(
+        {field: 'orderCode', align: 'center', title: '璁㈠崟缂栧彿'}
+        , {field: 'orderDate', align: 'center', title: '璁㈠崟鏃ユ湡'}
+        , {field: 'invCode', align: 'center', title: '鐗╂枡缂栫爜'}
+        , {field: 'invName', align: 'center', title: '鐗╂枡鍚嶇О'}
+        , {field: 'invStd', align: 'center', title: '瑙勬牸鍨嬪彿'}
+        , {field: 'invUnit', align: 'center', title: '鍗曚綅'}
+        , {field: 'orderQty', align: 'center', title: '璁㈠崟鏁伴噺'}
+        , {field: 'izMrp', align: 'center', title: '鏄惁mrp璁$畻', hide: true}
+        , {field: 'productQty', align: 'center', title: '鐢熶骇浠诲姟鍗曟暟閲�'}
+        , {field: 'izReceive', align: 'center', title: '鏄惁鏀舵枡', hide: true}
+        , {field: 'inQty', align: 'center', title: '浜ф垚鍝佸叆搴撴暟閲�'}
+        , {field: 'outQty', align: 'center', title: '鍙戣揣鏁伴噺'}
+        , {fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80}
+    );
+    return cols;
+}
+
+layui.use(['table', 'laydate', 'form', 'upload'], function () {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var upload = layui.upload;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#salesOrder',
+        headers: {token: localStorage.getItem('token')},
+        // url: baseUrl+'/matCode/list/auth',
+        data: [
+            {
+                "orderCode": 20210315000001,
+                "orderDate": "2021-03-26 13:40",
+                "invCode": "CPXXX00123",
+                "invName": "鍏板崥鍩哄凹鎺堟潈鍎跨杞�",
+                "invStd": "21脳25",
+                "invUnit": "杈�",
+                "orderQty": 300,
+                "izMrp": "鍚�",
+                "productQty": 150,
+                "izReceive": "鏄�",
+                "inQty": 50,
+                "outQty": 0,
+            }
+        ],
+        page: true,
+        limit: 16,
+        limits: [16, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        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;
+        }
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '.layui-laydate-range'
+        , type: 'datetime'
+        , range: true
+    });
+});
+
+/* 琛ㄦ牸鏁版嵁閲嶈浇 */
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function () {
+        searchData[this.name] = this.value;
+    });
+
+    console.log('鎼滅储鍐呭', searchData);
+
+    // (child ? parent.tableIns : tableIns).reload({
+    //     where: searchData,
+    //     page: {
+    //         curr: pageCurr
+    //     },
+    //     done: function (res, curr, count) {
+    //         if (res.code === 403) {
+    //             top.location.href = baseUrl + "/";
+    //         }
+    //         pageCurr = curr;
+    //         if (res.data.length === 0 && count !== 0) {
+    //             tableIns.reload({
+    //                 where: searchData,
+    //                 page: {
+    //                     curr: pageCurr - 1
+    //                 }
+    //             });
+    //             pageCurr -= 1;
+    //         }
+    //         limit(child);
+    //         // 褰撳墠鍒嗛〉鏁版嵁瀛樺偍
+    //         locNormalList = res.data;
+    //     }
+    // });
+}
+
+/* 鐩戝惉鍥炶溅浜嬩欢 */
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/waitPakinLog/waitPakinLog.js b/src/main/webapp/static/js/waitPakinLog/waitPakinLog.js
index 54fc129..a0131e9 100644
--- a/src/main/webapp/static/js/waitPakinLog/waitPakinLog.js
+++ b/src/main/webapp/static/js/waitPakinLog/waitPakinLog.js
@@ -10,7 +10,7 @@
                 return html;
             }}
         ,{field: 'ioStatus', align: 'center',title: '鍏ュ嚭鐘舵��', templet:function(row){
-                var html = "<input value='ioStatus' type='checkbox' lay-skin='switch' lay-text='杩愯涓瓅寰呭鐞�' lay-filter='tableCheckbox' disabled='disabled' table-index='"+row.LAY_TABLE_INDEX+"'";
+                var html = "<input value='ioStatus' type='checkbox' lay-skin='switch' lay-text='宸插鐞唡寰呭鐞�' lay-filter='tableCheckbox' disabled='disabled' table-index='"+row.LAY_TABLE_INDEX+"'";
                 if(row.ioStatus === 'Y'){html += " checked ";}
                 html += ">";
                 return html;
diff --git a/src/main/webapp/static/layuiadmin/modules/tableMerge.js b/src/main/webapp/static/layuiadmin/modules/tableMerge.js
new file mode 100644
index 0000000..4d26b3c
--- /dev/null
+++ b/src/main/webapp/static/layuiadmin/modules/tableMerge.js
@@ -0,0 +1,75 @@
+/**
+ * Created by YujieYang.
+ * @name:  瀛愯〃鏍兼墿灞�
+ * @author: 鏉ㄧ帀鏉�
+ * @version 1.0
+ */
+layui.define(['table'], function (exports) {
+
+    var $ = layui.jquery;
+
+    // 灏佽鏂规硶
+    var mod = {
+        /**
+         * 娓叉煋鍏ュ彛
+         * @param myTable
+         */
+        render: function (myTable) {
+            var tableBox = $(myTable.elem).next().children('.layui-table-box'),
+                $main = $(tableBox.children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+                $fixLeft = $(tableBox.children('.layui-table-fixed-l').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+                $fixRight = $(tableBox.children('.layui-table-fixed-r').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+                cols = myTable.cols[0], mergeRecord = {};
+
+            for (let i = 0; i < cols.length; i++) {
+                var item3 = cols[i], field=item3.field;
+                if (item3.merge) {
+                    var mergeField = [field];
+                    if (item3.merge !== true) {
+                        if (typeof item3.merge == 'string') {
+                            mergeField = [item3.merge]
+                        } else {
+                            mergeField = item3.merge
+                        }
+                    }
+                    mergeRecord[i] = {mergeField: mergeField, rowspan:1}
+                }
+            }
+
+            $main.each(function (i) {
+
+                for (var item in mergeRecord) {
+                    if (i==$main.length-1 || isMaster(i, item)) {
+                        $(this).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+                        $fixLeft.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+                        $fixRight.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+                        mergeRecord[item].rowspan = 1;
+                    } else {
+                        $(this).children('[data-key$="-'+item+'"]').remove();
+                        $fixLeft.eq(i).children('[data-key$="-'+item+'"]').remove();
+                        $fixRight.eq(i).children('[data-key$="-'+item+'"]').remove();
+                        mergeRecord[item].rowspan +=1;
+                    }
+                }
+            })
+
+            function isMaster (index, item) {
+                var mergeField = mergeRecord[item].mergeField;
+                var dataLength = layui.table.cache[myTable.id].length;
+                for (var i=0; i<mergeField.length; i++) {
+
+                    if (layui.table.cache[myTable.id][dataLength-2-index][mergeField[i]]
+                        !== layui.table.cache[myTable.id][dataLength-1-index][mergeField[i]]) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+        }
+    };
+
+    // 杈撳嚭
+    exports('tableMerge', mod);
+});
+
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index f2224b0..1fb28a6 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -1,240 +1,248 @@
 <!DOCTYPE html>
 <html>
 <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.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="icon" type="image/x-icon" href="../static/image/log.png" />
-  <link rel="stylesheet" href="../static/layuiadmin/layui/css/layui.css" media="all">
-  <link rel="stylesheet" href="../static/layuiadmin/style/admin.css" media="all">
-  <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
-  <script type="text/javascript" src="../static/js/common.js"></script>
-  <script type="text/javascript" src="../static/layuiadmin/layui/layui.js"></script>
-  <style>
-    .layui-layout-admin .layui-footer {
-      box-sizing: border-box;
-      background-color: #fff;
-      z-index: 999;
-      height: 30px;
-      padding: 0;
-      font-size: 13px;
-      margin: 0;
-      line-height: 30px;
-    }
-    .layui-layout-admin .layui-footer a {
-      color: #3573ab;
-      font-weight: bold
-    }
+    <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.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="icon" type="image/x-icon" href="../static/image/log.png"/>
+    <link rel="stylesheet" href="../static/layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../static/layuiadmin/style/admin.css" media="all">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/layuiadmin/layui/layui.js"></script>
+    <style>
+        .layui-layout-admin .layui-footer {
+            box-sizing: border-box;
+            background-color: #fff;
+            z-index: 999;
+            height: 30px;
+            padding: 0;
+            font-size: 13px;
+            margin: 0;
+            line-height: 30px;
+        }
 
-    .layui-layout-admin .layui-logo {
-      letter-spacing: 2px;
-      font-size: 22px;
-      height: 110px;
-      padding: 20px 10px;
-      font-weight: bolder;
-      /*color: #2c7dc2;*/
-      color: #f3f3f3;
-      text-align: center;
-      line-height: 40px;
-    }
-    .layadmin-side-shrink .layui-layout-admin .layui-logo {
-      background-image: none;
-    }
-    .layui-side-menu .layui-nav {
-      margin-top: 110px;
-    }
-  </style>
+        .layui-layout-admin .layui-footer a {
+            color: #3573ab;
+            font-weight: bold
+        }
+
+        .layui-layout-admin .layui-logo {
+            letter-spacing: 2px;
+            font-size: 22px;
+            height: 110px;
+            padding: 20px 10px;
+            font-weight: bolder;
+            /*color: #2c7dc2;*/
+            color: #f3f3f3;
+            text-align: center;
+            line-height: 40px;
+        }
+
+        .layadmin-side-shrink .layui-layout-admin .layui-logo {
+            background-image: none;
+        }
+
+        .layui-side-menu .layui-nav {
+            margin-top: 110px;
+        }
+    </style>
 </head>
 <body class="layui-layout-body">
 
-  <div id="LAY_app">
+<div id="LAY_app">
     <div class="layui-layout layui-layout-admin">
-      <div class="layui-header">
-        <!-- 澶撮儴鍖哄煙 -->
-        <ul id="cool-header-left" class="layui-nav layui-layout-left">
-          <li class="layui-nav-item layadmin-flexible" lay-unselect>
-            <a href="javascript:;" layadmin-event="flexible" title="渚ц竟浼哥缉">
-              <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
-            </a>
-          </li>
-          <!--<li class="layui-nav-item layui-hide-xs" lay-unselect>-->
-            <!--<a lay-href="report/viewLocMap.html?resourceId=10286" title="Map">-->
-              <!--<i class="layui-icon layui-icon-website"></i>-->
-            <!--</a>-->
-          <!--</li>-->
-          <li class="layui-nav-item" lay-unselect>
-            <a href="javascript:;" layadmin-event="refresh" title="鍒锋柊">
-              <i class="layui-icon layui-icon-refresh-3"></i>
-            </a>
-          </li>
-          <!--<li class="layui-nav-item layui-hide-xs" lay-unselect>-->
-            <!--<input type="text" placeholder="鎼滅储..." autocomplete="off" class="layui-input layui-input-search" layadmin-event="serach" lay-action="template/search.html?keywords=">-->
-          <!--</li>-->
-        </ul>
-        <ul id="cool-header-right" class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
-          
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="theme">
-              <i class="layui-icon layui-icon-theme"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a id="activation-icon" href="javascript:;" layadmin-event="note">
-              <i class="layui-icon layui-icon-note"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="fullscreen">
-              <i class="layui-icon layui-icon-screen-full"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item" lay-unselect>
-            <a href="javascript:;">
-              <cite id="person-username">绠$悊鍛�</cite>
-            </a>
-            <dl class="layui-nav-child">
-              <dd><a lay-href="detail.html">鍩烘湰璧勬枡</a></dd>
-              <!--<dd><a lay-href="set/user/password.html">淇敼瀵嗙爜</a></dd>-->
-              <hr>
-              <dd style="text-align: center;"><a id="logout" href="/">閫�鍑�</a></dd>
-            </dl>
-          </li>
-        </ul>
-      </div>
-      
-      <!-- 渚ц竟鑿滃崟 -->
-      <div class="layui-side layui-side-menu">
-        <div class="layui-side-scroll">
-          <div class="layui-logo" lay-href="home/console.html">
-            <img src="../static/image/logo.png" style="display: inline-block; width: 90%;height: auto">
-            <span style="margin-top: 0">涓壃绔嬪簱</span>
-          </div>
+        <div class="layui-header">
+            <!-- 澶撮儴鍖哄煙 -->
+            <ul id="cool-header-left" class="layui-nav layui-layout-left">
+                <li class="layui-nav-item layadmin-flexible" lay-unselect>
+                    <a href="javascript:;" layadmin-event="flexible" title="渚ц竟浼哥缉">
+                        <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
+                    </a>
+                </li>
+                <!--<li class="layui-nav-item layui-hide-xs" lay-unselect>-->
+                <!--<a lay-href="report/viewLocMap.html?resourceId=10286" title="Map">-->
+                <!--<i class="layui-icon layui-icon-website"></i>-->
+                <!--</a>-->
+                <!--</li>-->
+                <li class="layui-nav-item" lay-unselect>
+                    <a href="javascript:;" layadmin-event="refresh" title="鍒锋柊">
+                        <i class="layui-icon layui-icon-refresh-3"></i>
+                    </a>
+                </li>
+                <!--<li class="layui-nav-item layui-hide-xs" lay-unselect>-->
+                <!--<input type="text" placeholder="鎼滅储..." autocomplete="off" class="layui-input layui-input-search" layadmin-event="serach" lay-action="template/search.html?keywords=">-->
+                <!--</li>-->
+            </ul>
+            <ul id="cool-header-right" class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
 
-          <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">
-          </ul>
+                <li class="layui-nav-item layui-hide-xs" lay-unselect>
+                    <a href="javascript:;" layadmin-event="theme">
+                        <i class="layui-icon layui-icon-theme"></i>
+                    </a>
+                </li>
+                <li class="layui-nav-item layui-hide-xs" lay-unselect>
+                    <a id="activation-icon" href="javascript:;" layadmin-event="note">
+                        <i class="layui-icon layui-icon-note"></i>
+                    </a>
+                </li>
+                <li class="layui-nav-item layui-hide-xs" lay-unselect>
+                    <a href="javascript:;" layadmin-event="fullscreen">
+                        <i class="layui-icon layui-icon-screen-full"></i>
+                    </a>
+                </li>
+                <li class="layui-nav-item" lay-unselect>
+                    <a href="javascript:;">
+                        <cite id="person-username">绠$悊鍛�</cite>
+                    </a>
+                    <dl class="layui-nav-child">
+                        <dd><a lay-href="detail.html">鍩烘湰璧勬枡</a></dd>
+                        <!--<dd><a lay-href="set/user/password.html">淇敼瀵嗙爜</a></dd>-->
+                        <hr>
+                        <dd style="text-align: center;"><a id="logout" href="/">閫�鍑�</a></dd>
+                    </dl>
+                </li>
+            </ul>
         </div>
-      </div>
-      <!-- 椤甸潰鏍囩 -->
-      <div class="layadmin-pagetabs" id="LAY_app_tabs">
-        <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
-        <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
-        <div class="layui-icon layadmin-tabs-control layui-icon-down">
-          <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
-            <li class="layui-nav-item" lay-unselect>
-              <a href="javascript:;"></a>
-              <dl class="layui-nav-child layui-anim-fadein">
-                <dd layadmin-event="closeThisTabs"><a href="javascript:;">鍏抽棴褰撳墠鏍囩椤�</a></dd>
-                <dd layadmin-event="closeOtherTabs"><a href="javascript:;">鍏抽棴鍏跺畠鏍囩椤�</a></dd>
-                <dd layadmin-event="closeAllTabs"><a href="javascript:;">鍏抽棴鍏ㄩ儴鏍囩椤�</a></dd>
-              </dl>
-            </li>
-          </ul>
-        </div>
-        <div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
-          <ul class="layui-tab-title" id="LAY_app_tabsheader">
-            <li lay-id="home/console.html" lay-attr="home/console.html" class="layui-this"><i class="layui-icon layui-icon-home"></i></li>
-          </ul>
-        </div>
-      </div>
 
-      <!-- 涓讳綋鍐呭 -->
-      <div class="layui-body" id="LAY_app_body">
-        <div class="layadmin-tabsbody-item layui-show">
-          <iframe src="home/console.html" frameborder="0" class="layadmin-iframe"></iframe>
-        </div>
-      </div>
+        <!-- 渚ц竟鑿滃崟 -->
+        <div class="layui-side layui-side-menu">
+            <div class="layui-side-scroll">
+                <div class="layui-logo" lay-href="home/console.html">
+                    <img src="../static/image/logo.png" style="display: inline-block; width: 90%;height: auto">
+                    <span style="margin-top: 0">涓壃绔嬪簱</span>
+                </div>
 
-      <div class="layui-footer">
-        Copyright 漏 2015 All Rights Reserved. <a href="http://www.zoneyung.com" target="_blank">娴欐睙涓壃绔嬪簱鎶�鏈湁闄愬叕鍙�</a>  淇濈暀鎵�鏈夋潈鍒�
-      </div>
-      <!-- 杈呭姪鍏冪礌锛屼竴鑸敤浜庣Щ鍔ㄨ澶囦笅閬僵 -->
-      <div class="layadmin-body-shade" layadmin-event="shade"></div>
+                <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu"
+                    lay-filter="layadmin-system-side-menu">
+                </ul>
+            </div>
+        </div>
+        <!-- 椤甸潰鏍囩 -->
+        <div class="layadmin-pagetabs" id="LAY_app_tabs">
+            <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
+            <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
+            <div class="layui-icon layadmin-tabs-control layui-icon-down">
+                <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
+                    <li class="layui-nav-item" lay-unselect>
+                        <a href="javascript:;"></a>
+                        <dl class="layui-nav-child layui-anim-fadein">
+                            <dd layadmin-event="closeThisTabs"><a href="javascript:;">鍏抽棴褰撳墠鏍囩椤�</a></dd>
+                            <dd layadmin-event="closeOtherTabs"><a href="javascript:;">鍏抽棴鍏跺畠鏍囩椤�</a></dd>
+                            <dd layadmin-event="closeAllTabs"><a href="javascript:;">鍏抽棴鍏ㄩ儴鏍囩椤�</a></dd>
+                        </dl>
+                    </li>
+                </ul>
+            </div>
+            <div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
+                <ul class="layui-tab-title" id="LAY_app_tabsheader">
+                    <li lay-id="home/console.html" lay-attr="home/console.html" class="layui-this"><i
+                            class="layui-icon layui-icon-home"></i></li>
+                </ul>
+            </div>
+        </div>
+
+        <!-- 涓讳綋鍐呭 -->
+        <div class="layui-body" id="LAY_app_body">
+            <div class="layadmin-tabsbody-item layui-show">
+                <iframe src="home/console.html" frameborder="0" class="layadmin-iframe"></iframe>
+            </div>
+        </div>
+
+        <div class="layui-footer">
+            Copyright 漏 2015 All Rights Reserved. <a href="http://www.zoneyung.com" target="_blank">娴欐睙涓壃绔嬪簱鎶�鏈湁闄愬叕鍙�</a>
+            淇濈暀鎵�鏈夋潈鍒�
+        </div>
+        <!-- 杈呭姪鍏冪礌锛屼竴鑸敤浜庣Щ鍔ㄨ澶囦笅閬僵 -->
+        <div class="layadmin-body-shade" layadmin-event="shade"></div>
     </div>
-  </div>
+</div>
 
-  <script>
-  layui.config({
-    base: '../static/layuiadmin/' //闈欐�佽祫婧愭墍鍦ㄨ矾寰�
-  }).extend({
-    index: 'lib/index' //涓诲叆鍙fā鍧�
-  }).use(['index','element'], function () {
-      var element = layui.element;
-      var $ = layui.jquery;
+<script>
+    layui.config({
+        base: '../static/layuiadmin/' //闈欐�佽祫婧愭墍鍦ㄨ矾寰�
+    }).extend({
+        index: 'lib/index', //涓诲叆鍙fā鍧�
+        tableMerge: 'tableMerge',
+    }).use(['index', 'element', 'tableMerge'], function () {
+        var element = layui.element;
+        var $ = layui.jquery;
 
-      // 鏇挎崲閫�鍑烘寜閽彉閲�
-      var logout = document.getElementById('logout');
-      var url = logout.getAttribute('href');
-      logout.setAttribute('href', baseUrl + url);
+        // 鏇挎崲閫�鍑烘寜閽彉閲�
+        var logout = document.getElementById('logout');
+        var url = logout.getAttribute('href');
+        logout.setAttribute('href', baseUrl + url);
 
-      $('#person-username').text(localStorage.getItem('username'));
+        $('#person-username').text(localStorage.getItem('username'));
 
-      $(function () {
-          if ("" === localStorage.getItem('token')){
-              top.location.href = baseUrl+"/login";
-          }
-
-          // 婵�娲荤爜楠岃瘉
-          $.ajax({
-            url: baseUrl+"/system/activation/auth",
-            dataType:'json',
-            method: 'GET',
-            async: false,
-            success: function (res) {
-              if (res.code === 200) {
-                $("#activation-icon").hide();
-              } else {
-                $("#activation-icon").click();
-              }
+        $(function () {
+            if ("" === localStorage.getItem('token')) {
+                top.location.href = baseUrl + "/login";
             }
-          });
 
-          getMenu()
-
-          // 娉ㄩ攢
-          $(document).on('click','#logout',function () {
-              localStorage.removeItem("token");
-          });
-
-      });
-
-      // 鍔犺浇鑿滃崟
-      function getMenu() {
-        $.ajax({
-          url: baseUrl+ "/menu/auth",
-          headers: {'token': localStorage.getItem('token')},
-          method: 'POST',
-          success: function (res) {
-            if (res.code === 200){
-              var menuHtml = "";
-              if (res.data != null){
-                for (var i = 0; i < res.data.length; i++) {
-                  menuHtml += '<li data-name="' + res.data[i].menuCode +'" class="layui-nav-item">\n';
-                  menuHtml += '<a href="javascript:;" lay-tips=' +res.data[i].menu+ ' lay-direction="2">\n';
-                  menuHtml += '<i class="layui-icon '+ res.data[i].menuIcon +'"></i>\n';
-                  menuHtml += ' <cite>' +res.data[i].menu+ '</cite>\n';
-                  menuHtml += '</a>\n';
-                  menuHtml += '<dl class="layui-nav-child">\n';
-                  for (var j = 0; j < res.data[i].subMenu.length; j++) {
-                    menuHtml += '<dd><a lay-href="' +res.data[i].subMenu[j].code+ '?resourceId='+ res.data[i].subMenu[j].id + '">' + res.data[i].subMenu[j].name + '</a></dd>\n';
-                  }
-                  menuHtml += '</dl>\n';
-                  menuHtml += '</li>\n';
+            // 婵�娲荤爜楠岃瘉
+            $.ajax({
+                url: baseUrl + "/system/activation/auth",
+                dataType: 'json',
+                method: 'GET',
+                async: false,
+                success: function (res) {
+                    if (res.code === 200) {
+                        $("#activation-icon").hide();
+                    } else {
+                        $("#activation-icon").click();
+                    }
                 }
-              }
-              $('#LAY-system-side-menu').append(menuHtml);
-              element.init();
-            } else if (res.code === 403){
-              top.location.href = baseUrl+"/login";
-            }else {
-              layer.alert(res.msg)
-            }
-          }
+            });
+
+            getMenu()
+
+            // 娉ㄩ攢
+            $(document).on('click', '#logout', function () {
+                localStorage.removeItem("token");
+            });
+
         });
-      }
-  });
-  </script>
+
+        // 鍔犺浇鑿滃崟
+        function getMenu() {
+            $.ajax({
+                url: baseUrl + "/menu/auth",
+                headers: {'token': localStorage.getItem('token')},
+                method: 'POST',
+                success: function (res) {
+                    if (res.code === 200) {
+                        var menuHtml = "";
+                        if (res.data != null) {
+                            for (var i = 0; i < res.data.length; i++) {
+                                menuHtml += '<li data-name="' + res.data[i].menuCode + '" class="layui-nav-item">\n';
+                                menuHtml += '<a href="javascript:;" lay-tips=' + res.data[i].menu + ' lay-direction="2">\n';
+                                menuHtml += '<i class="layui-icon ' + res.data[i].menuIcon + '"></i>\n';
+                                menuHtml += ' <cite>' + res.data[i].menu + '</cite>\n';
+                                menuHtml += '</a>\n';
+                                menuHtml += '<dl class="layui-nav-child">\n';
+                                for (var j = 0; j < res.data[i].subMenu.length; j++) {
+                                    menuHtml += '<dd><a lay-href="' + res.data[i].subMenu[j].code + '?resourceId=' + res.data[i].subMenu[j].id + '">' + res.data[i].subMenu[j].name + '</a></dd>\n';
+                                }
+                                menuHtml += '</dl>\n';
+                                menuHtml += '</li>\n';
+                            }
+                        }
+                        $('#LAY-system-side-menu').append(menuHtml);
+                        element.init();
+                    } else if (res.code === 403) {
+                        top.location.href = baseUrl + "/login";
+                    } else {
+                        layer.alert(res.msg)
+                    }
+                }
+            });
+        }
+    });
+</script>
 </body>
 </html>
 
diff --git a/src/main/webapp/views/locArea/locArea.html b/src/main/webapp/views/locArea/locArea.html
new file mode 100644
index 0000000..e7e1624
--- /dev/null
+++ b/src/main/webapp/views/locArea/locArea.html
@@ -0,0 +1,62 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="uuid" placeholder="搴撳尯缂栧彿" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="name" placeholder="搴撳尯鍚嶇О" autocomplete="off">
+        </div>
+    </div>
+
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+    </div>
+</div>
+
+<!-- 琛ㄦ牸 -->
+<div class="layui-form">
+    <table class="layui-hide" id="locArea" lay-filter="locArea"></table>
+</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" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">璇︽儏</a>
+    <a class="layui-btn layui-btn-xs btn-edit" lay-event="edit">缂栬緫</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/locArea/locArea.js" charset="utf-8"></script>
+
+<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/locArea/locArea_detail.html b/src/main/webapp/views/locArea/locArea_detail.html
new file mode 100644
index 0000000..658c9db
--- /dev/null
+++ b/src/main/webapp/views/locArea/locArea_detail.html
@@ -0,0 +1,83 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 璇︽儏 -->
+<div id="data-detail" class="layer_self_wrap">
+    <form id="detail" class="layui-form">
+        <div class="layui-inline"  style="width:31%; display: none">
+            <label class="layui-form-label">ID锛�</label>
+            <div class="layui-input-inline">
+                <input id="id" class="layui-input" type="text" lay-verify="number" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">搴撳尯缂栧彿锛�</label>
+            <div class="layui-input-inline">
+                <input id="uuid" class="layui-input" onkeyup="check(this.id, 'locArea')" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">搴撳尯鍚嶇О锛�</label>
+            <div class="layui-input-inline">
+                <input id="name" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">鐘躲��銆�鎬侊細</label>
+            <div class="layui-input-inline">
+                <select id="status">
+                    <option value="" style="display: none"></option>
+                    <option value="1">姝e父</option>
+                    <option value="0">绂佺敤</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">搴撳尯绫诲瀷锛�</label>
+            <div class="layui-input-inline">
+                <select id="areaType">
+                    <option value="0">鏃�</option>
+                    <option value="1">鏉愭枡浠撳簱</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">澶囥��銆�娉細</label>
+            <div class="layui-input-inline">
+                <input id="memo" class="layui-input" type="text">
+            </div>
+        </div>
+
+
+        <hr class="layui-bg-gray">
+
+        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
+            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">淇濆瓨</div>
+            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">淇敼</div>
+            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">鍏抽棴</div>
+        </div>
+
+        <div id="prompt">
+            娓╅Θ鎻愮ず锛氳浠旂粏濉啓鐩稿叧淇℃伅锛�<span class="extrude"><span class="not-null">*</span> 涓哄繀濉�夐」銆�</span>
+        </div>
+    </form>
+</div>
+</body>
+<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/locArea/locArea.js" charset="utf-8"></script>
+</html>
+
diff --git a/src/main/webapp/views/locMatStatus/locMatStatus.html b/src/main/webapp/views/locMatStatus/locMatStatus.html
index d59ed96..74074af 100644
--- a/src/main/webapp/views/locMatStatus/locMatStatus.html
+++ b/src/main/webapp/views/locMatStatus/locMatStatus.html
@@ -27,6 +27,7 @@
     <div class="layui-inline">
         <select id="matStatusSelect" name="mat_status">
             <option value="">璇烽�夋嫨鐗╂枡鐘舵��</option>
+            <option value="0">寰呮</option>
             <option value="1">鑹搧</option>
             <option value="2">涓嶈壇鍝�</option>
         </select>
diff --git a/src/main/webapp/views/locNormal/addLocNormal.html b/src/main/webapp/views/locNormal/addLocNormal.html
new file mode 100644
index 0000000..c994d2d
--- /dev/null
+++ b/src/main/webapp/views/locNormal/addLocNormal.html
@@ -0,0 +1,108 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<style>
+</style>
+<body>
+
+<!-- 璇︽儏 -->
+<div id="data-detail" class="layer_self_wrap">
+    <form id="detail" class="layui-form">
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label"><span class="not-null">*</span>鐗╂枡缂栫爜锛�</label>
+            <div class="layui-input-inline">
+                <input id="matnr" class="layui-input" type="text" onkeyup="check(this.id, 'matnr')"
+                       lay-verify="required" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">鐗╂枡鍚嶇О锛�</label>
+            <div class="layui-input-inline">
+                <input id="maktx" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">瑙勬牸锛�</label>
+            <div class="layui-input-inline">
+                <input id="lgnum" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">绫诲埆锛�</label>
+            <div class="layui-input-inline">
+                <input id="type" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">鍗曟嵁缂栧彿锛�</label>
+            <div class="layui-input-inline">
+                <input id="mnemonic" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">閫氱煡鍗曞彿锛�</label>
+            <div class="layui-input-inline">
+                <input id="supplier" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">搴撳尯锛�</label>
+            <div class="layui-input-inline">
+                <select id="warehouse">
+                    <option value="" style="display: none"></option>
+                    <option value="">璇烽�夋嫨搴撳尯</option>
+                </select>
+            </div>
+        </div>
+
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">鍝佺墝锛�</label>
+            <div class="layui-input-inline">
+                <input id="brand" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">鏁伴噺锛�</label>
+            <div class="layui-input-inline">
+                <input id="anfme" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline" style="width:31%;">
+            <label class="layui-form-label">鍗曚綅锛�</label>
+            <div class="layui-input-inline">
+                <input id="altme" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+
+        <hr class="layui-bg-gray">
+
+        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
+            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit
+                 lay-filter="save">淇濆瓨
+            </div>
+            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">鍏抽棴</div>
+        </div>
+
+        <div id="prompt">
+            娓╅Θ鎻愮ず锛氳浠旂粏濉啓鐩稿叧淇℃伅锛�<span class="extrude"><span class="not-null">*</span> 涓哄繀濉�夐」銆�</span>
+        </div>
+    </form>
+</div>
+</body>
+<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/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/locNormal/addLocNormal.js" charset="utf-8"></script>
+</html>
+
diff --git a/src/main/webapp/views/locNormal/locNormal.html b/src/main/webapp/views/locNormal/locNormal.html
new file mode 100644
index 0000000..ff56feb
--- /dev/null
+++ b/src/main/webapp/views/locNormal/locNormal.html
@@ -0,0 +1,189 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <link rel="stylesheet" href="../../static/css/print.css" media="all">
+</head>
+<style>
+    #search-box {
+        padding: 30px 30px 10px 30px;
+    }
+
+    #search-box .layui-inline {
+        margin-right: 5px;
+    }
+
+    #data-search-btn {
+        margin-top: 10px;
+    }
+
+    #data-search-btn.layui-btn-container .layui-btn {
+        margin-right: 20px;
+    }
+
+    .btn-print {
+        display: none;
+    }
+
+    #btn-print-batch {
+        display: none;
+    }
+
+    .layui-btn-danger {
+        background-color: lightsalmon;
+        color: #333;
+    }
+
+    /* ------------------------- 鎵撳嵃琛ㄦ牸 -----------------------  */
+    .template-preview {
+        height: 200px;
+        display: inline-block;
+    }
+
+    .contain {
+    }
+
+    .contain td {
+        border: 1px solid #000;
+        /*line-height: 46px;*/
+    }
+
+    .function-area {
+        padding: 15px 0 20px 40px;
+    }
+
+    .function-btn {
+        font-size: 16px;
+        padding: 1px 1px 1px 1px;
+        width: 120px;
+        height: 40px;
+        border-color: #2b425b;
+        border-radius: 4px;
+        border-width: 1px;
+        background: none;
+        border-style: solid;
+        transition: 0.4s;
+        cursor: pointer;
+    }
+
+    .function-btn:hover {
+        background-color: #2b425b;
+        color: #fff;
+    }
+
+</style>
+<body>
+<div>
+    <!-- 鎼滅储鏍� -->
+    <div id="search-box" class="layui-form layui-card-header">
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡缂栫爜" autocomplete="off">
+            </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" style="width: 150px">
+            <select id="matStatusSelect" name="state">
+                <option value="">鍑哄叆搴撶姸鎬�</option>
+                <option value="1">宸插叆搴�</option>
+                <option value="2">宸插嚭搴�</option>
+            </select>
+        </div>
+        <div class="layui-inline" style="width: 150px">
+            <select id="putSiteSelect" name="warehouse">
+                <option value="">璇烽�夋嫨搴撳尯</option>
+            </select>
+        </div>
+
+        <!-- 寰呮坊鍔� -->
+        <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储
+            </button>
+            <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆
+            </button>
+        </div>
+    </div>
+
+    <!-- 鍔熻兘鍖� -->
+    <!--<div class="function-area">-->
+        <!--<button id="mat-query" class="function-btn" onclick="addLocNormal()">鏂板搴撳瓨</button>-->
+    <!--</div>-->
+
+
+    <!-- 琛ㄦ牸 -->
+    <div class="layui-form">
+        <table class="layui-hide" id="locNormal" lay-filter="locNormal"></table>
+    </div>
+    <script type="text/html" id="toolbar">
+        <div class="layui-btn-container">
+            <button class="layui-btn layui-btn-sm" id="btn-locNormal-into" lay-event="intoData">瀵煎叆</button>
+        </div>
+    </script>
+
+    <!-- 瀵煎叆鎿嶄綔寮圭獥 -->
+    <div id="importDataDiv" style="display: none;padding: 20px 40px">
+        <div class="layui-upload-drag" id="uploadEx"
+             style="width: 200px; font-size: x-small; padding: 10px; text-align: center; box-sizing: border-box">
+            <div id="uploadDesc" style="display: inline-block; ">
+                <i class="layui-icon">顧�</i>
+                <p>鐐瑰嚮娣诲姞锛屾垨灏嗘枃浠舵嫋鎷藉埌姝ゅ</p>
+            </div>
+            <div id="uploadDemoView" style="display: none">
+                <img src="../../static/image/Excel.png" alt="涓婁紶鎴愬姛鍚庢覆鏌�" style="max-width: 196px; padding: 20px 0 10px 0">
+                <span id="fileMame" style="display: block; font-size: small; color: #333"></span>
+            </div>
+        </div>
+        <div style="text-align: center; margin-top: 20px">
+            <button class="layui-btn layui-btn-radius" id="uploadDo">寮�濮嬪鍏�</button>
+        </div>
+    </div>
+
+    <!-- 琛ㄦ牸鑷畾涔夊垪 -->
+    <script type="text/html" id="locNormalState">
+        {{#  if(d.state === '1'){ }}
+        <span style="color: green">宸插叆搴�</span>
+        {{# } else if(d.state === '2'){ }}
+        <span style="color: red">宸插嚭搴�</span>
+        {{#  } else { }}
+        {{#  } }}
+    </script>
+    <script type="text/html" id="locArea">
+        {{
+        locArea.map(function(item){
+        if (d.warehouse == item.uuid) {
+        return item.name;
+        }
+        });
+        }}
+    </script>
+    <script type="text/html" id="operate">
+        {{#  if(d.state === '1'){ }}
+        <button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="outLocNormal">鍑哄簱</button>
+        {{#  } else { }}
+        <button class="layui-btn layui-btn-xs layui-btn-disabled">鍑哄簱</button>
+        {{#  } }}
+        <button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="removeLocNormal">绉婚櫎</button>
+    </script>
+
+
+</div>
+
+<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/handlebars/handlebars-v4.5.3.js"></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/locNormal/locNormal.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/locNormal/locNormalIn.html b/src/main/webapp/views/locNormal/locNormalIn.html
new file mode 100644
index 0000000..65c0c15
--- /dev/null
+++ b/src/main/webapp/views/locNormal/locNormalIn.html
@@ -0,0 +1,129 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 1px 1px 1px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 3px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        .layui-layer-page .layui-layer-content {
+            position: relative;
+            overflow: visible !important;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-locIn {
+            margin-left: 60px;
+        }
+    </style>
+</head>
+<body>
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn" onclick="getMat()">鏂板</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container" style="margin-bottom: 8px">
+                <!-- 1.閫夋嫨鍏ュ簱鍙� -->
+                <span id="staNoSpan">搴撳尯锛�</span>
+                <select id="putSiteSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨搴撳尯</option>
+                </select>
+                <!-- 2.鍚姩鍑哄簱 -->
+                <button class="layui-btn layui-btn-normal layui-btn-lg" id="btn-locIn" lay-event="comb">鍚姩鍏ュ簱</button>
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<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/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/locNormal/locNormalIn.js" charset="utf-8"></script>
+
+<script type="text/template" id="putSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+<script type="text/html" id="matStatus">
+    {{ d.matStatus == '1' ? '<span style="color: green">鑹搧</span>' : '<span style="color: red">涓嶈壇鍝�</span>' }}
+</script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/pakStore/locDetlQuery.html b/src/main/webapp/views/pakStore/locDetlQuery.html
index 2c632b4..db7949d 100644
--- a/src/main/webapp/views/pakStore/locDetlQuery.html
+++ b/src/main/webapp/views/pakStore/locDetlQuery.html
@@ -69,15 +69,21 @@
                 <input class="layui-input" type="text" name="lgnum" placeholder="瑙勬牸" autocomplete="off">
             </div>
         </div>
-        <div class="layui-inline">
+        <!-- 鏃ユ湡鑼冨洿 -->
+        <div class="layui-inline" style="width: 300px;">
+            <div class="layui-input-inline">
+                <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+            </div>
+        </div>
+        <br />
+        <div class="layui-inline" style="margin-left: 30px">
             <div class="layui-input-inline">
                 <input class="layui-input" type="text" name="supplier" placeholder="閫氱煡鍗曞彿" autocomplete="off">
             </div>
         </div>
-        <!-- 鏃ユ湡鑼冨洿 -->
-        <div class="layui-inline" style="width: 300px;margin-left: 30px">
+        <div class="layui-inline">
             <div class="layui-input-inline">
-                <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                <input class="layui-input" type="text" name="warehouse" placeholder="鐢熶骇鍗曞彿" autocomplete="off">
             </div>
         </div>
         <!-- 寰呮坊鍔� -->
diff --git a/src/main/webapp/views/pakStore/outStock.html b/src/main/webapp/views/pakStore/outStock.html
new file mode 100644
index 0000000..c58e3df
--- /dev/null
+++ b/src/main/webapp/views/pakStore/outStock.html
@@ -0,0 +1,85 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <link rel="stylesheet" href="../../static/css/print.css" media="all">
+</head>
+<style>
+    #search-box {
+        padding: 30px 30px 10px 30px;
+    }
+
+    #search-box .layui-inline {
+        margin-right: 5px;
+    }
+
+    #data-search-btn {
+        margin-top: 10px;
+    }
+
+    #data-search-btn.layui-btn-container .layui-btn {
+        margin-right: 20px;
+    }
+
+    .contain td {
+        border: 1px solid #000;
+        /*line-height: 46px;*/
+    }
+
+</style>
+<body>
+
+<div>
+    <!-- 鎼滅储鏍� -->
+    <div id="search-box" class="layui-form layui-card-header">
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="FBillNo" placeholder="璇疯緭鍏ュ崟鎹紪鍙�" autocomplete="off">
+            </div>
+        </div>
+
+        <!--&lt;!&ndash; 鏃ユ湡鑼冨洿 &ndash;&gt;-->
+        <!--<div class="layui-inline" style="width: 300px">-->
+        <!--<div class="layui-input-inline">-->
+        <!--<input class="layui-input layui-laydate-range" name="orderTime" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">-->
+        <!--</div>-->
+        <!--</div>-->
+
+
+        <div id="data-search-btn" class="layui-btn-container layui-form-item">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储
+            </button>
+            <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆
+            </button>
+        </div>
+    </div>
+
+    <!-- 琛ㄦ牸 -->
+    <div class="layui-form">
+        <table class="layui-hide" id="salesOrder" lay-filter="salesOrder"></table>
+    </div>
+
+</div>
+
+<script type="text/html" id="operate">
+    <button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="btnOut">鍑哄簱</button>
+</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/handlebars/handlebars-v4.5.3.js"></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/layuiadmin/modules/tableMerge.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/pakStore/outStock.js"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/pakStore/outStockDetail.html b/src/main/webapp/views/pakStore/outStockDetail.html
new file mode 100644
index 0000000..c526c29
--- /dev/null
+++ b/src/main/webapp/views/pakStore/outStockDetail.html
@@ -0,0 +1,159 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <link rel="stylesheet" href="../../static/css/print.css" media="all">
+
+</head>
+<body>
+<div>
+    <div class="layui-form" style="padding: 8px">
+        <span id="staNoSpan">鍑哄簱鍙o細</span>
+        <div style="display: inline-block; width: 200px">
+            <select id="staNoSelect" lay-verify="required">
+                <option value="">璇烽�夋嫨绔欑偣</option>
+            </select>
+        </div>
+        <button class="layui-btn layui-btn-sm" style="display: inline-block" id="btn-outbound" lay-event="outbound"
+                onclick="outbound()">鍚姩鍑哄簱
+        </button>
+    </div>
+    <table class="layui-hide" id="stockOut" lay-filter="stockOut"></table>
+</div>
+
+<script type="text/template" id="takeSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{siteId}}">{{desc}}</option>
+    {{/each}}
+</script>
+
+</body>
+<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/handlebars/handlebars-v4.5.3.js"></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>
+    var orderData = parent.getOrderData();
+    var locData = [];
+    var form;
+
+
+    function getCol() {
+        var cols = [
+            {field: '', align: 'center', title: '', width: 50, type: 'numbers'}
+            , {field: 'locNo$', align: 'center', title: '搴撲綅鍙�'}
+        ];
+        cols.push.apply(cols, detlCols);
+        cols.push({field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
+            , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true})
+        return cols;
+    }
+
+    layui.use(['table', 'laydate', 'form'], function () {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var layDate = layui.laydate;
+        form = layui.form;
+        // 鏁版嵁娓叉煋
+        locDetlTableIns = table.render({
+            elem: '#stockOut',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl + '/outStock/query/locList?fbillNo=' + orderData.fbillNo,
+            page: true,
+            limit: 9999,
+            limits: [9999],
+            even: true,
+//            cellMinWidth: 50,
+            cols: [getCol()],
+            request: {
+                pageName: 'curr',
+                pageSize: 'limit'
+            },
+            parseData: function (res) {
+                return {
+                    'data': res.data,
+                    'code': res.code,
+                }
+            },
+            response: {
+                statusCode: 200
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                }
+                locData = res.data;
+            }
+        });
+
+        $.ajax({
+            url: baseUrl + "/available/take/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    var tpl = $("#takeSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#staNoSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    /* 鍚姩鍑哄簱 */
+    function outbound() {
+        if (locData.length == 0) {
+            layer.msg('璇峰厛娣诲姞搴撲綅鐗╂枡');
+            return;
+        } else {
+            var staNo = $("#staNoSelect").val();
+            if (staNo === "" || staNo === null){
+                layer.msg("璇烽�夋嫨鍑哄簱鍙�");
+                return;
+            }
+            var locDetls = [];
+            locData.forEach(function(elem) {
+                locDetls.push({locNo: elem.locNo, matnr: elem.matnr, count: elem.anfme});
+            });
+            let param = {
+                outSite: staNo,
+                locDetls: locDetls,
+                fbillNo: orderData.fbillNo,
+            }
+
+            $.ajax({
+                url: baseUrl+"/plate/outStock/start",
+                headers: {'token': localStorage.getItem('token')},
+                data: JSON.stringify(param),
+                contentType:'application/json;charset=UTF-8',
+                method: 'POST',
+                success: function (res) {
+                    if (res.code === 200){
+                        parent.closeDetail(res.msg);
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg)
+                    }
+                }
+            });
+        }
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/comb.html b/src/main/webapp/views/pda/comb.html
index 9cc59d2..0369016 100644
--- a/src/main/webapp/views/pda/comb.html
+++ b/src/main/webapp/views/pda/comb.html
@@ -19,7 +19,7 @@
 <!-- 澶撮儴 -->
 <header>
     <div class="layui-input-inline">
-        <label class="layui-form-label">鏉$爜</label>
+        <label class="layui-form-label">鎵樼洏鐮�</label>
         <input class="layui-input" type="number" id="code" onkeyup="findCode(this)" oninput="if(value.length>8)value=value.slice(0,8)" placeholder="鎵爜 / 杈撳叆" autocomplete="off">
     </div>
     <div style="margin: 5px 5px">
@@ -36,6 +36,7 @@
     <div class="layui-btn-container">
         <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
         <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()" style="margin-left: 20px">缁勬墭</button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" style="margin-left: 20px">杩斿洖</button>
         <span id="tips"></span>
     </div>
 </footer>
@@ -51,11 +52,13 @@
         tableIns = table.render({
             elem: '#chooseData',
             data: [],
+            width: 320,
             limit: 500,
             cellMinWidth: 50,
             cols: [[
-                {fixed: 'left', align: 'center', field: 'count', title: '鏁伴噺', style:'color: blue', width:50},
                 {field: 'matNo', align: 'center', title: '鐗╂枡缂栫爜'},
+                {field: 'mnemonic', align: 'center', title: '鐢熶骇鍗曞彿'},
+                {field: 'count', align: 'center', title: '鏁伴噺', style:'color: blue', width:50},
                 {field: 'matName', align: 'center', title: '鐗╂枡鍚嶇О'}
             ]],
             done: function (res, curr, count) {
@@ -79,7 +82,7 @@
             type: 2,
             title: '鎻愬彇鐗╂枡',
             shade: [0.3,'#000'],
-            area: ['90%', '80%'],
+            area: ['90%', '90%'],
             content: 'matQuery.html',
             success: function(layero, index){
                 $('.layui-layer-title').css('font-size', '16px');
@@ -181,5 +184,9 @@
             $("#code").focus();
         }
     }
+
+    function back() {
+        parent.backIndex();
+    }
 </script>
 </html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/combPro.html b/src/main/webapp/views/pda/combPro.html
index 6963fb2..909d15d 100644
--- a/src/main/webapp/views/pda/combPro.html
+++ b/src/main/webapp/views/pda/combPro.html
@@ -18,11 +18,13 @@
             display: inline-block;
             width: 120px;
         }
+
         .number-tool:after {
             clear: both;
             content: "";
             display: table;
         }
+
         .number-tool button {
             background-color: #fff;
             margin-top: 3px;
@@ -32,6 +34,7 @@
             width: 25px;
             border: 1px solid #777777;
         }
+
         .number-tool input {
             text-align: center;
             height: 30px;
@@ -40,28 +43,48 @@
             width: 50px;
             padding: 0;
         }
+
         #confirm {
             margin: 10px 10px;
             padding: 5px 20px;
             font-weight: 600;
         }
+
         #remove {
             margin: 10px 10px;
             padding: 5px 20px;
             color: darkred;
+        }
+
+        .form-box span {
+            font-size: 16px;
+            display: inline-block;
+            text-align: right;
+        }
+
+        .form-box input {
+            width: 165px;
+            padding-left: 5px;
+            height: 30px;
+            border: 1px solid #777777;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
         }
     </style>
 </head>
 <body>
 <!-- 澶撮儴 -->
 <header>
-    <div class="layui-input-inline">
-        <label class="layui-form-label">鏉$爜</label>
-        <input class="layui-input" type="number" id="code" onkeyup="findCode(this)" oninput="if(value.length>8)value=value.slice(0,8)" placeholder="鎵爜 / 杈撳叆" autocomplete="off">
-    </div>
     <div class="layui-input-inline" style="margin-top: 5px">
-        <label class="layui-form-label">鍗曞彿</label>
-        <input class="layui-input" id="billNo" onkeyup="find(this)" placeholder="鎵爜 / 杈撳叆" autocomplete="off" style="width: 75%; height: 40px; margin-right: 0;">
+        <label class="layui-form-label" style="margin-left: 16px">鍗曞彿</label>
+        <input class="layui-input" id="billNo" oninput="find(this)" placeholder="鎵爜 / 杈撳叆" autocomplete="off"
+               style="width: 175px; height: 40px; margin-right: 0;">
+    </div>
+    <div class="layui-input-inline">
+        <label class="layui-form-label">鎵樼洏鐮�</label>
+        <input class="layui-input" style="width: 175px;" type="number" id="code" onkeyup="findCode(this)"
+               oninput="if(value.length>8)value=value.slice(0,8)" placeholder="鎵爜 / 杈撳叆" autocomplete="off">
     </div>
 </header>
 
@@ -73,36 +96,77 @@
 <footer>
     <div class="layui-btn-container">
         <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
-        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()" style="margin-left: 20px">缁勬墭</button>
+        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()"
+                style="margin-left: 20px">缁勬墭
+        </button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()"
+                style="margin-left: 20px">杩斿洖
+        </button>
         <span id="tips"></span>
     </div>
 </footer>
 
 <!-- 淇敼鏁伴噺寮圭獥 -->
 <div id="modify" style="display: none; text-align: center;padding-top: 10px">
-    <div class="form-item">
-        <span>鐗╂枡</span>
-        <input id="matNo" type="text" disabled="disabled" style="width: 70%">
-    </div>
-    <div class="form-item">
-        <span>鍚嶇О</span>
-        <input id="matName" type="text" disabled="disabled" style="width: 70%">
+    <div class="form-box">
+        <div class="form-item">
+            <table style="display: inline">
+                <tr>
+                    <td>
+                        <span style="width: 35px; margin-right: 5px">鐗╂枡</span>
+                    </td>
+                    <td style="text-align: left">
+                        <input id="matNo" type="text" disabled="disabled">
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="form-item">
+            <table style="display: inline">
+                <tr>
+                    <td style="vertical-align: top">
+                        <span style="width: 35px; margin-right: 5px">鍚嶇О</span>
+                    </td>
+                    <td style="text-align: left">
+                    <textarea rows="3" style="resize: none; width: 165px" id="matName" type="text" disabled="disabled"
+                              readonly="readonly"></textarea>
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="form-item">
+            <table style="display: inline">
+                <tr>
+                    <td>
+                        <span style="width: 35px; margin-right: 5px">鍗曞彿</span>
+                    </td>
+                    <td style="text-align: left">
+                        <input id="mnemonic" type="text" disabled="disabled">
+                    </td>
+                </tr>
+            </table>
+        </div>
     </div>
     <div class="form-item" style="margin-top: 5px">
         <span style="vertical-align: middle">鏁伴噺</span>
         <div class="number-tool" style="vertical-align: middle">
-            <button onclick="reduce()">-</button><input id="count" type="number"><button onclick="add()">+</button>
+            <button onclick="reduce()">-</button>
+            <input id="count" type="number">
+            <button onclick="add()">+</button>
         </div>
     </div>
     <button id="remove" onclick="remove()">绉婚櫎</button>
     <button id="confirm" onclick="confirm()">淇濆瓨</button>
 </div>
+
 </body>
 <script>
-    window.onload = function(){document.getElementById("code").focus();}
+    window.onload = function () {
+        document.getElementById("billNo").focus();
+    }
     var tableIns;
     var countLayer;
-    layui.use(['table','laydate', 'form'], function() {
+    layui.use(['table', 'laydate', 'form'], function () {
         var table = layui.table;
         var $ = layui.jquery;
         var layer = layui.layer;
@@ -111,19 +175,28 @@
         tableIns = table.render({
             elem: '#chooseData',
             data: [],
+            width: 320,
             limit: 500,
             cellMinWidth: 50,
             cols: [[
-                {fixed: 'left', align: 'center', field: 'count', title: '鏁伴噺', event: 'modify', style:'cursor: pointer;color: blue', width:50},
-                {field: 'matNo', align: 'center', title: '鐗╂枡缂栫爜'},
-                {field: 'matName', align: 'center', title: '鐗╂枡鍚嶇О'}
+                {field: 'matNo', align: 'center', title: '鐗╂枡缂栫爜',event: 'modify',},
+                {field: 'mnemonic', align: 'center', title: '鐢熶骇鍗曞彿',event: 'modify',},
+                {
+                    align: 'center',
+                    field: 'count',
+                    title: '鏁伴噺',
+                    event: 'modify',
+                    style: 'cursor: pointer;color: blue',
+                    width: 50
+                },
+                {field: 'matName', align: 'center', title: '鐗╂枡鍚嶇О',event: 'modify',}
             ]],
             done: function (res, curr, count) {
             }
         });
 
         // 鐩戝惉琛屽伐鍏蜂簨浠�
-        table.on('tool(chooseData)', function(obj) {
+        table.on('tool(chooseData)', function (obj) {
             var data = obj.data;
             switch (obj.event) {
                 case 'modify':
@@ -132,12 +205,13 @@
                         offset: '20px',
                         title: '淇敼鏁伴噺',
                         shadeClose: true,
-                        area: ['80%', '200px'],
+                        area: ['80%', '300px'],
                         content: $("#modify"),
                         success: function (layero, index) {
                             $('#matNo').val(data.matNo);
                             $('#matName').val(data.matName);
                             $('#count').val(data.count);
+                            $('#mnemonic').val(data.mnemonic);
                             maxCount = data.count;
                         }
                     });
@@ -148,20 +222,21 @@
     });
 
     function findCode(el) {
-        if (el.value.length === 7) {
-            $('#billNo').focus();
-        }
+//        if (el.value.length === 7) {
+//            $('#code').focus();
+//        }
     }
 
     // 娣诲姞琛ㄦ牸鏁版嵁
     var matData = [];
+
     function addTableData(data) {
-        for (var i=0;i<data.length;i++) {
+        for (var i = 0; i < data.length; i++) {
             var toPush = true;
-            for (var j=0;j<matData.length;j++){
-                if (data[i].matNo === matData[j].matNo) {
+            for (var j = 0; j < matData.length; j++) {
+                if (data[i].matNo === matData[j].matNo && data[i].mnemonic === matData[j].mnemonic) {
                     matData[j].count = Number(matData[j].count) + Number(data[i].count);
-                    toPush  = false;
+                    toPush = false;
                 }
             }
             if (toPush) {
@@ -169,21 +244,28 @@
             }
         }
         tableIns.reload({data: matData});
-        $("#comb-btn").focus();
+//        $("#comb-btn").focus();
     }
 
 
     /**
      * 鏍规嵁閫氱煡鍗曞彿鏌ヨ鐗╂枡璇︽儏
      */
-    function find(el){
+    function find(el) {
         if (isEmpty(el.value)) {
             return;
         }
-        var billNo = el.value.split(",")[0].split("=")[1];
+        var billNo = el.value;
+        if (billNo.indexOf('=') > -1) {
+            billNo = billNo.split(",")[0].split("=")[1];
+        }
         if (isEmpty(billNo)) {
             return;
         }
+        // 璧嬪�煎墠娓呯┖琛ㄦ牸
+        matData = [];
+        tableIns.reload({data: matData});
+
         $.ajax({
             url: baseUrl + "/mobile/bill/query/auth",
             headers: {'token': localStorage.getItem('token')},
@@ -202,19 +284,21 @@
                     tips(res.msg, true)
                 }
             }
-        })
+        });
     }
 
     /*************************************  鏁伴噺  ****************************************/
     var countDom = $('#count');
     var minCount = 1;
     var maxCount = 1;
+
     function add() {
         if (countDom.val() >= maxCount) {
             return;
         }
         countDom.val(Number(countDom.val()) + 1);
     }
+
     function reduce() {
         if (countDom.val() <= minCount) {
             return;
@@ -223,11 +307,12 @@
     }
 
     // 淇敼鏁伴噺
-    function confirm(){
+    function confirm() {
         var matNo = $('#matNo').val();
         var count = $('#count').val();
-        for (var j=0;j<matData.length;j++){
-            if (matNo === matData[j].matNo) {
+        var mnemonic = $("#mnemonic").val() === '' ? null : $("#mnemonic").val();
+        for (var j = 0; j < matData.length; j++) {
+            if (matNo === matData[j].matNo && mnemonic === matData[j].mnemonic) {
                 if (count > maxCount || count < minCount) {
                     tips("鏁伴噺涓嶈兘瓒呰繃鑼冨洿", true);
                     return;
@@ -243,8 +328,9 @@
     // 绉婚櫎鐗╂枡
     function remove() {
         var matNo = $('#matNo').val();
-        for (var j=0;j<matData.length;j++){
-            if (matNo === matData[j].matNo) {
+        var mnemonic = $("#mnemonic").val() === '' ? null : $("#mnemonic").val();
+        for (var j = 0; j < matData.length; j++) {
+            if (matNo === matData[j].matNo && mnemonic === matData[j].mnemonic) {
                 matData.splice(j, 1);
             }
         }
@@ -252,23 +338,6 @@
         layer.close(countLayer);
         tips("绉婚櫎鎴愬姛");
     }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 
     // 閲嶇疆
@@ -296,15 +365,17 @@
             return;
         }
         var billNo = $('#billNo').val();
+        var mnemonic = $('#mnemonic').val();
         $.ajax({
-            url: baseUrl+"/mobile/comb/auth",
+            url: baseUrl + "/mobile/comb/auth",
             headers: {'token': localStorage.getItem('token')},
             data: JSON.stringify({
                 barcode: barcode,
                 combMats: matData,
-                billNo: billNo
+                billNo: billNo,
+                mnemonic: mnemonic,
             }),
-            contentType:'application/json;charset=UTF-8',
+            contentType: 'application/json;charset=UTF-8',
             method: 'POST',
             async: false,
             success: function (res) {
@@ -326,7 +397,7 @@
      * @param warn true锛氱孩鑹插瓧浣�
      */
     function tips(msg, warn) {
-        layer.msg(msg, {icon: warn?2:1})
+        layer.msg(msg, {icon: warn ? 2 : 1})
     }
 
     document.onkeyup = function (e) {
@@ -341,5 +412,9 @@
             $("#code").focus();
         }
     }
+
+    function back() {
+        parent.backIndex();
+    }
 </script>
 </html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/index.html b/src/main/webapp/views/pda/index.html
index f015b95..fe264b2 100644
--- a/src/main/webapp/views/pda/index.html
+++ b/src/main/webapp/views/pda/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
@@ -13,10 +13,12 @@
             -webkit-box-sizing: border-box;
             -moz-box-sizing: border-box;
         }
+
         html {
             height: 100%;
             /*line-height: 1.5;*/
         }
+
         body {
             height: 100%;
             /*overflow: hidden;*/
@@ -30,12 +32,14 @@
             position: fixed;
             width: 100%;
             overflow: hidden;
-            box-shadow: 0 1px 2px 0 rgba(0,0,0,.1)
+            box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1)
         }
+
         .nav li {
             float: left;
             border-right: 1px solid #f1f1f1; /*todo*/
         }
+
         .nav li a {
             font-size: 20px;
             letter-spacing: 1px;
@@ -47,48 +51,114 @@
             /*-webkit-transform:scale(1.5);*/
             /*-moz-transform:scale(1.5);*/
         }
+
         .nav li a:hover {
             color: #000;
         }
+
         .nav-unselect {
-            color: #666;
+            color: blue;
         }
+
         .nav-select {
-            background-color: #f1f1f1;  /*todo*/
-            color: #000;
+            background-color: #f1f1f1; /*todo*/
+            color: blue;
         }
 
         /* 涓讳綋 */
         #content {
-            padding-top: 32px;
+            /*padding-top: 32px;*/
             width: 100%;
             height: 100%;
         }
+
         iframe {
             border-width: 0;
+        }
+
+        td {
+            color: white;
+            background-image: linear-gradient(to top, #09203f 0%, #537895 100%);
+            /*background-color: rgba(204,204,204,.6);*/
+            border-radius: 8px;
+            text-align: center;
+            vertical-align: middle;
+            height: 80px;
+            font-size: 24px;
+        }
+        .nav-font-size {
+            font-size: 18px;
         }
     </style>
 </head>
 <body>
 
-<!-- 瀵艰埅鏍� -->
-<ul class="nav">
-    <li><a id="comb" onclick="nav(this.id)" class="nav-select" href="#">缁勬墭</a></li>
-    <li><a id="combPro" onclick="nav(this.id)" class="nav-unselect" href="#">鍏宠仈缁勬墭</a></li>
-    <li><a id="stockIn" onclick="nav(this.id)" class="nav-unselect" href="#">鍏ュ簱</a></li>
-    <li><a id="stockOut" onclick="nav(this.id)" class="nav-unselect" href="#">鍑哄簱</a></li>
-</ul>
+<!-- 瀵艰埅鑿滃崟 -->
+<table id="navList" style="width: 100%; border-color: #e6e6e6;" border="0" cellspacing="2">
+    <tr>
+        <td>
+            <div id="comb" onclick="nav(this.id)" class="nav-font-size">绔嬪簱缁勬墭鍏ュ簱</div>
+        </td>
+        <td>
+            <div id="combPro" onclick="nav(this.id)" style="font-size: 15px">绔嬪簱浠诲姟鍗曞叆搴�</div>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            <div id="stockIn" onclick="nav(this.id)" class="nav-font-size">绔嬪簱閰嶄欢鍏ュ簱</div>
+        </td>
+        <td>
+            <div id="stockOut" onclick="nav(this.id)" class="nav-font-size">绔嬪簱閰嶄欢鍑哄簱</div>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            <div id="locNormalIn1" onclick="nav(this.id)" class="nav-font-size">骞充粨鏉愭枡鍏ュ簱</div>
+        </td>
+        <td>
+            <div id="locNormalOut1" onclick="nav(this.id)" class="nav-font-size">骞充粨鏉愭枡鍑哄簱</div>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            <div id="locNormalIn" onclick="nav(this.id)" class="nav-font-size">骞充粨鎴愬搧鍏ュ簱</div>
+        </td>
+        <td>
+            <div id="locNormalOut" onclick="nav(this.id)" class="nav-font-size">骞充粨鎴愬搧鍑哄簱</div>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            <div id="locNormalMove" onclick="nav(this.id)" class="nav-font-size">骞充粨鎴愬搧绉诲簱</div>
+        </td>
+    </tr>
+</table>
 
 <!-- 涓讳綋鍐呭 -->
-<iframe id="content" src="comb.html"></iframe>
+<iframe id="content" src=""></iframe>
+
 
 </body>
 <script>
     // 瀵艰埅鏍�
     function nav(id) {
-        $('.nav-select').attr("class", "nav-unselect");
-        $('#'+id).attr("class", "nav-select");
-        $('#content').attr("src", id+".html");
+//        $('.nav-select').attr("class", "nav-unselect");
+//        $('#' + id).attr("class", "nav-select");
+
+        if (id === 'locNormalIn1') {
+            $('#content').attr("src", "locNormalIn.html?areaType=1");
+        } else if (id === 'locNormalOut1') {
+            $('#content').attr("src", "locNormalOut.html?areaType=1");
+        } else {
+            $('#content').attr("src", id + ".html");
+        }
+        $('#navList').css('display', 'none');
+        $('#content').css('display', 'block');
+    }
+
+    function backIndex() {
+        $('#navList').css('display', 'inline-table');
+        $('#content').css('display', 'none');
     }
 </script>
 </html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/locDetlIframe.html b/src/main/webapp/views/pda/locDetlIframe.html
index 7d0cbaf..3edf80b 100644
--- a/src/main/webapp/views/pda/locDetlIframe.html
+++ b/src/main/webapp/views/pda/locDetlIframe.html
@@ -24,11 +24,9 @@
         .form-box span {
             display: inline-block;
             text-align: right;
-            width: 70px;
         }
         .form-box input {
-            width: 120px;
-            margin-left: 10px;
+            width: 160px;
             padding-left: 5px;
             height: 30px;
             border: 1px solid #777777;
@@ -75,16 +73,40 @@
 <body>
 <div class="form-box">
     <div class="form-item">
-        <span>搴撲綅鍙�</span>
-        <input id="locNo" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td>
+                    <span style="width: 35px; margin-right: 5px">搴撲綅</span>
+                </td>
+                <td style="text-align: left">
+                    <input id="locNo" type="text" disabled="disabled">
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
-        <span>鐗╂枡缂栫爜</span>
-        <input id="matnr" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td>
+                    <span style="width: 35px; margin-right: 5px">缂栫爜</span>
+                </td>
+                <td style="text-align: left">
+                    <input id="matnr" type="text" disabled="disabled">
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
-        <span>鐗╂枡鍚嶇О</span>
-        <input id="maktx" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td style="vertical-align: top">
+                    <span style="width: 35px; margin-right: 5px">鍚嶇О</span>
+                </td>
+                <td style="text-align: left">
+                    <textarea rows="4" style="width: 165px; resize: none" id="maktx" type="text" disabled="disabled" readonly="readonly"></textarea>
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
         <span style="vertical-align: middle">鏁伴噺</span>
diff --git a/src/main/webapp/views/pda/locNormalIn.html b/src/main/webapp/views/pda/locNormalIn.html
new file mode 100644
index 0000000..4b50791
--- /dev/null
+++ b/src/main/webapp/views/pda/locNormalIn.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
+    <title>骞充粨鍏ュ簱</title>
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/pda.css" media="all">
+
+    <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/handlebars/handlebars-v4.5.3.js"></script>
+    <style>
+
+    </style>
+</head>
+<body>
+<!-- 澶撮儴 -->
+<header class="layui-form">
+    <div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">鍗曞彿</label>
+            <div class="layui-input-inline" style="width: 175px">
+                <input id="billNo" class="layui-input" autocomplete="off" oninput="find(this)">
+            </div>
+        </div>
+    </div>
+    <div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">搴撳尯</label>
+            <div class="layui-input-inline" style="width: 175px">
+                <select id="uuid">
+                    <option value="">璇烽�夋嫨</option>
+                </select>
+            </div>
+        </div>
+    </div>
+
+    <div style="margin: 5px 5px">
+        <button id="mat-btn" type="button" class="layui-btn layui-btn-normal" onclick="getMat()"><i
+                class="layui-icon">+</i>鎻愬彇
+        </button>
+    </div>
+</header>
+
+<!-- 涓讳綋 -->
+<main>
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</main>
+<!-- 灏鹃儴 -->
+<footer>
+    <div class="layui-btn-container">
+        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
+        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="comb()"
+                style="margin-left: 20px">鍏ュ簱
+        </button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()"
+                style="margin-left: 20px">杩斿洖
+        </button>
+        <span id="tips"></span>
+    </div>
+</footer>
+</body>
+<script>
+    var tableIns;
+    layui.use(['table', 'laydate', 'form'], function () {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var form = layui.form;
+
+        document.getElementById("billNo").focus();
+
+        tableIns = table.render({
+            elem: '#chooseData',
+            data: [],
+            width: 320,
+            limit: 500,
+            cellMinWidth: 50,
+            cols: [[
+                {field: 'matNo', align: 'center', title: '鐗╂枡缂栫爜'},
+                {field: 'mnemonic', align: 'center', title: '鐢熶骇鍗曞彿'},
+                { field: 'count', align: 'center', title: '鏁伴噺', style: 'color: blue', width: 50},
+                {field: 'matName', align: 'center', title: '鐗╂枡鍚嶇О'},
+
+            ]],
+            done: function (res, curr, count) {
+            }
+        });
+
+        var areaType = getQueryVariable('areaType');
+        // 鑾峰彇浠撳簱涓嬫媺
+        $.ajax({
+            url: baseUrl + "/locArea/queryAll/auth?areaType=" + (areaType ? areaType : ""),
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var html = "";
+                    if (res.data && res.data.length > 0) {
+                        html += res.data.map(function (item) {
+                            return "<Option value=" + item.uuid + ">" + item.name + "</Option>";
+                        });
+                    }
+                    $('#uuid').append(html);
+                    layui.form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    window.onload = function () {
+        document.getElementById("uuid").focus();
+    }
+
+    var matCodeLayerIdx;
+
+    function getMat() {
+        matCodeLayerIdx = layer.open({
+            type: 2,
+            title: '鎻愬彇鐗╂枡',
+            shade: [0.3, '#000'],
+            area: ['90%', '90%'],
+            content: 'matQuery.html',
+            success: function (layero, index) {
+                $('.layui-layer-title').css('font-size', '16px');
+            },
+            end: function () {
+                $('#mat-btn').focus();
+            }
+        });
+    }
+
+    // 娣诲姞琛ㄦ牸鏁版嵁
+    var matData = [];
+
+    function addTableData(data) {
+        if (isEmpty(data.matName)) {
+            tips("鎻愬彇澶辫触", true);
+            return;
+        }
+        let toPush = true;
+        for (var j = 0; j < matData.length; j++) {
+            if (data.matNo === matData[j].matNo) {
+                matData[j].count = Number(matData[j].count) + Number(data.count);
+                toPush = false;
+            }
+        }
+        if (toPush) {
+            matData.push(data);
+        }
+        tips("鎻愬彇鎴愬姛");
+        tableIns.reload({data: matData});
+    }
+
+    // 缁勬墭
+    function comb() {
+        let barcode = $('#uuid').val();
+        console.log('barcode', barcode);
+        if (isEmpty(barcode)) {
+            tips("璇烽�夋嫨搴撳尯", true);
+            document.getElementById("uuid").focus();
+            return;
+        }
+        if (matData.length === 0) {
+            tips("璇锋彁鍙栫墿鏂�", true);
+            return;
+        }
+
+        // 鏋勯�犲钩浠撳叆搴撴暟鎹�
+        var data = []
+        matData.map(function (item) {
+            data.push({
+                matnr: item.matNo,
+                maktx: item.matName,
+                anfme: item.count,
+                warehouse: barcode,
+                mnemonic: item.mnemonic,
+                supplier: item.supplier,
+                lgnum: item.lgnum,
+                type: item.type,
+                altme: item.altme,
+            });
+        });
+
+        // 璇锋眰淇濆瓨鎺ュ彛
+        $.ajax({
+            url: baseUrl + "/locNormal/pda/in",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                normalList: data,
+            }),
+            contentType: 'application/json;charset=UTF-8',
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    reset(true);
+                    tips("缁勬墭鎴愬姛")
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            },
+        });
+    }
+
+    /**
+     * 鏍规嵁閫氱煡鍗曞彿鏌ヨ鐗╂枡璇︽儏
+     */
+    function find(el) {
+        var billNo = el.value;
+        if (isEmpty(billNo)) {
+            return;
+        }
+        if (billNo.indexOf('=') > -1) {
+            billNo = billNo.split(",")[0].split("=")[1];
+        }
+        // 璧嬪�煎墠娓呯┖琛ㄦ牸
+        matData = [];
+        tableIns.reload({data: matData});
+
+        $.ajax({
+            url: baseUrl + "/mobile/bill/query/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: {
+                billNo: billNo
+            },
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    if (res.data != null) {
+                        console.log('鍗曞彿鏁版嵁', res.data);
+                        var data = res.data;
+                        if (data.length > 0) {
+                            for (var i = 0; i < data.length; i++) {
+                                addTableData(data[i]);
+                            }
+                        }
+                    }
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            }
+        });
+    }
+
+    /**
+     * 鎻愮ず淇℃伅
+     * @param msg 鎻愮ず鍐呭
+     * @param warn true锛氱孩鑹插瓧浣�
+     */
+    function tips(msg, warn) {
+        // var tips = $('#tips');
+        // tips.html(msg);
+        // tips.css("color", warn?"red":'#666');
+        layer.msg(msg, {icon: warn ? 2 : 1})
+    }
+
+    document.onkeyup = function (e) {
+        if (window.event)//濡傛灉window.event瀵硅薄瀛樺湪锛屽氨浠ユ浜嬩欢瀵硅薄涓哄噯
+            e = window.event;
+        var key = e.charCode || e.keyCode;
+        if (key === 115) {
+            $("#comb-btn").focus();
+            comb();
+        } else if (key === 113) {
+            $("#uuid").val("");
+            $("#uuid").focus();
+        }
+    }
+
+    function back() {
+        parent.backIndex();
+    }
+
+    // 閲嶇疆
+    function reset() {
+        matData = [];
+        tableIns.reload({data: matData});
+        layer.closeAll();
+        $("#billNo").val("");
+        $("#uuid").val("");
+        layui.form.render('select');
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/locNormalMove.html b/src/main/webapp/views/pda/locNormalMove.html
new file mode 100644
index 0000000..383e33f
--- /dev/null
+++ b/src/main/webapp/views/pda/locNormalMove.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>骞充粨绉诲簱</title>
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/pda.css" media="all">
+    <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/handlebars/handlebars-v4.5.3.js"></script>
+</head>
+<body>
+<!-- 澶撮儴 -->
+<header class="layui-form">
+    <div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">鐗╂枡缂栫爜</label>
+            <input class="layui-input" id="matnr" onkeyup="find()" placeholder="鎵爜 / 杈撳叆"
+                   autocomplete="off" style="width: 60%">
+        </div>
+    </div>
+    <div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label" style="margin-left: 16px">婧愬簱鍖�</label>
+            <!--<input class="layui-input" id="warehouse1" onkeyup="find(true)" placeholder="鎵爜 / 杈撳叆"-->
+                   <!--autocomplete="off" style="width: 60%">-->
+            <div class="layui-input-inline" style="width: 180px">
+                <select id="warehouse1" lay-filter="warehouse1">
+                    <option value="">璇烽�夋嫨</option>
+                </select>
+            </div>
+        </div>
+    </div>
+    <div>
+        <div class="layui-input-inline">
+            <label class="layui-form-label">鐩爣搴撳尯</label>
+            <!--<input class="layui-input" id="warehouse2" placeholder="鎵爜 / 杈撳叆"-->
+                   <!--autocomplete="off" style="width: 60%" onkeyup="exist('uuid', 'locArea', 'warehouse2')">-->
+            <div class="layui-input-inline" style="width: 180px">
+                <select id="warehouse2">
+                    <option value="">璇烽�夋嫨</option>
+                </select>
+            </div>
+        </div>
+    </div>
+</header>
+
+<!-- 涓讳綋 -->
+<main>
+    <table class="layui-table" id="locNormalMove" lay-filter="locNormalMove"></table>
+</main>
+
+<!-- 灏鹃儴 -->
+<footer>
+    <div class="layui-btn-container">
+        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
+        <button type="button" id="comb-btn" class="layui-btn layui-btn-normal " onclick="move()"
+                style="margin-left: 20px">杞Щ
+        </button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()"
+                style="margin-left: 20px">杩斿洖
+        </button>
+        <span id="tips"></span>
+    </div>
+</footer>
+
+</body>
+<script>
+    var tableIns;
+    layui.use(['table', 'laydate', 'form'], function () {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var form = layui.form;
+
+        tableIns = table.render({
+            id: 'locNormalMove',
+            elem: '#locNormalMove',
+            data: [],
+            limit: 500,
+            cellMinWidth: 50,
+            cols: [[
+                {field: 'matnr', align: 'center', title: '缂栫爜', event: 'detail', width: 80},
+                {field: 'maktx', align: 'center', title: '鍚嶇О', event: 'detail'},
+                {field: 'warehouse', align: 'center', title: '搴撳尯', event: 'detail', width: 50},
+                {type: 'checkbox', fixed: 'right', width: 30},
+            ]],
+            done: function (res, curr, count) {
+            }
+        });
+
+        form.on('select(warehouse1)', function (data) {
+            var val = data.value;
+            find(true);
+        });
+
+        // 鑾峰彇浠撳簱涓嬫媺
+        $.ajax({
+            url: baseUrl + "/locArea/queryAll/auth",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var html = "";
+                    if (res.data && res.data.length > 0) {
+                        html += res.data.map(function (item) {
+                            return "<Option value=" + item.uuid + ">" + item.name + "</Option>";
+                        });
+                    }
+                    $('#warehouse1').append(html);
+                    $('#warehouse2').append(html);
+                    layui.form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    /* 搴撳瓨杞Щ */
+    move = () => {
+        // 鍒ゆ柇鐩爣搴撳尯鏄惁涓虹┖
+        var warehouse1 = $("#warehouse1").val();
+        var warehouse2 = $("#warehouse2").val();
+        if (!warehouse2 || warehouse2 == '') {
+            layer.msg("璇风‘瀹氱洰鏍囧簱鍖�");
+            return;
+        }
+        if (warehouse1 == warehouse2) {
+            layer.msg("鐩爣搴撳尯鍜屾簮搴撳尯涓嶈兘涓�鑷�");
+            return;
+        }
+        // 鍒ゆ柇鍕鹃�夋暟鎹槸鍚︿负绌�
+        var table = layui.table;
+        var checkStatus = table.checkStatus('locNormalMove');
+        var data = checkStatus.data;
+        if (data.length == 0) {
+            layer.msg("璇烽�夋嫨鐗╂枡");
+            return;
+        }
+        // 澶勭悊鍕鹃�夋暟鎹慨鏀箇arehouse涓虹洰鏍囧簱鍖�
+        data.map(function (item) {
+            item.warehouse = warehouse2;
+        });
+        // 璇锋眰绉诲簱鎺ュ彛锛岄�変腑鐨勭墿鏂欑殑warehouse鏇存柊涓虹洰鏍囧簱鍖�
+        $.ajax({
+            url: baseUrl + "/locNormal/pda/move",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                normalList: data,
+            }),
+            contentType: 'application/json;charset=UTF-8',
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    tips("绉诲簱鎴愬姛")
+                    reset();
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            },
+        });
+    }
+
+    /* 鏍规嵁搴撳尯鍙锋绱㈢墿鏂欎俊鎭� */
+    find = (flag) => {
+        if (flag) {
+            exist('uuid', 'locArea', 'warehouse1');
+        }
+        var warehouse = $("#warehouse1").val();
+        var matnr = $("#matnr").val();
+        // 鏌ヨ鎺ュ彛
+        $.ajax({
+            url: baseUrl + "/locNormal/pda/warehouseQuery?warehouse=" + warehouse + "&matnr=" + matnr,
+            headers: {'token': localStorage.getItem('token')},
+            method: 'GET',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    tableIns.reload({
+                        data: res.data,
+                    });
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            },
+        });
+    }
+
+    window.onload = function () {
+        document.getElementById("matnr").focus();
+    }
+
+    function back() {
+        parent.backIndex();
+    }
+
+    /**
+     * 鎻愮ず淇℃伅
+     * @param msg 鎻愮ず鍐呭
+     * @param warn true锛氱孩鑹插瓧浣�
+     */
+    function tips(msg, warn) {
+        layer.msg(msg, {icon: warn ? 2 : 1})
+    }
+
+    function reset() {
+        $('#warehouse1').val("");
+        $('#warehouse2').val("");
+        $('#matnr').val("");
+        layui.form.render('select');
+        tableIns.reload({data: []});
+        layer.closeAll();
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/locNormalOut.html b/src/main/webapp/views/pda/locNormalOut.html
new file mode 100644
index 0000000..9879238
--- /dev/null
+++ b/src/main/webapp/views/pda/locNormalOut.html
@@ -0,0 +1,422 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>骞充粨鍑哄簱</title>
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/pda.css" media="all">
+    <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/handlebars/handlebars-v4.5.3.js"></script>
+</head>
+<style>
+    .form-box span {
+        font-size: 16px;
+        display: inline-block;
+        text-align: right;
+    }
+    .form-box input {
+        width: 165px;
+        padding-left: 5px;
+        height: 30px;
+        border: 1px solid #777777;
+        overflow:hidden;
+        white-space:nowrap;
+        text-overflow:ellipsis;
+    }
+    .number-tool {
+        margin-left: 10px;
+        padding: 1px 0 1px 5px;
+        display: inline-block;
+        width: 120px;
+    }
+
+    .number-tool:after {
+        clear: both;
+        content: "";
+        display: table;
+    }
+
+    .number-tool button {
+        background-color: #fff;
+        margin-top: 3px;
+        font-size: 16px;
+        height: 25px;
+        float: left;
+        width: 25px;
+        border: 1px solid #777777;
+    }
+
+    .number-tool input {
+        text-align: center;
+        height: 30px;
+        float: left;
+        margin: 0 5px;
+        width: 50px;
+        padding: 0;
+    }
+</style>
+<body>
+
+<header class="layui-form">
+    <div class="layui-input-inline">
+        <label class="layui-form-label" style="margin-left: 32px">鍗曞彿</label>
+        <div class="layui-input-inline">
+            <input id="billNo" class="layui-input" autocomplete="off" oninput="findCode(this, 'billNo')"
+                   style="width: 175px">
+        </div>
+    </div>
+    <div class="layui-input-inline">
+        <label class="layui-form-label">鐗╂枡缂栫爜</label>
+        <input class="layui-input" id="matnr" onkeyup="findCode(this, 'matnr')" placeholder="鎵爜 / 杈撳叆"
+               style="width: 175px"
+               autocomplete="off">
+    </div>
+    <div class="layui-input-inline">
+        <label class="layui-form-label" style="margin-left: 28px;">搴撳尯</label>
+        <div class="layui-input-inline" style="margin-left: 5px;width: 175px">
+            <select id="uuid" lay-filter="uuid">
+                <option value="">璇烽�夋嫨</option>
+            </select>
+        </div>
+    </div>
+</header>
+
+<main>
+    <table class="layui-table" id="locNormalOut" lay-filter="locNormalOut"></table>
+</main>
+
+<footer>
+    <div class="layui-btn-container">
+        <button type="button" id="reset-btn" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
+        <button type="button" id="out-btn" class="layui-btn layui-btn-normal " onclick="locNormalOut()"
+                style="margin-left: 20px">鍑哄簱
+        </button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()"
+                style="margin-left: 20px">杩斿洖
+        </button>
+        <span id="tips"></span>
+    </div>
+</footer>
+
+<!-- 淇敼鏁伴噺寮圭獥 -->
+<div id="modify" style="display: none; padding-top: 10px; text-align: center;">
+    <div class="form-box">
+        <div class="form-item">
+            <table style="display: inline">
+                <tr>
+                    <td>
+                        <span style="width: 35px; margin-right: 5px">缂栫爜</span>
+                    </td>
+                    <td style="text-align: left">
+                        <input id="matnr2" type="text" disabled="disabled">
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="form-item">
+            <table style="display: inline">
+                <tr>
+                    <td style="vertical-align: top">
+                        <span style="width: 35px; margin-right: 5px">鍚嶇О</span>
+                    </td>
+                    <td style="text-align: left">
+                    <textarea rows="3" style="resize: none; width: 165px" id="maktx2" type="text" disabled="disabled"
+                              readonly="readonly"></textarea>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+    <input id="index" type="text" disabled="disabled" style="display: none;">
+    <div class="form-item" style="margin-top: 5px; margin-bottom: 8px;">
+        <span style="vertical-align: middle">鏁伴噺</span>
+        <div class="number-tool" style="vertical-align: middle">
+            <button onclick="reduce()">-</button>
+            <input id="anfme2" type="number" onchange="fix(this)">
+            <button onclick="add()">+</button>
+        </div>
+    </div>
+    <button id="remove" onclick="remove()">绉婚櫎</button>
+    <button id="confirm" onclick="confirm()">淇濆瓨</button>
+</div>
+
+</body>
+<script>
+    var countLayer;
+    // 褰撳墠鐐瑰嚮鐗╂枡鐨勬渶澶ф暟閲�
+    var maxCount;
+    // 琛ㄦ牸鏁版嵁
+    var normalOutList = [];
+    window.onload = function () {
+        document.getElementById("billNo").focus();
+    }
+
+    /**
+     * 鎻愮ず淇℃伅
+     * @param msg 鎻愮ず鍐呭
+     * @param warn true锛氱孩鑹插瓧浣�
+     */
+    function tips(msg, warn) {
+        layer.msg(msg, {icon: warn ? 2 : 1})
+    }
+
+    function back() {
+        parent.backIndex();
+    }
+
+    var tableIns;
+    layui.use(['table', 'laydate', 'form'], function () {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var form = layui.form;
+
+        tableIns = table.render({
+            id: 'locNormalOut',
+            elem: '#locNormalOut',
+            data: [],
+            limit: 500,
+            cellMinWidth: 50,
+            cols: [[
+                {field: 'matnr', align: 'center', title: '缂栫爜', event: 'detail', width: 80},
+                {field: 'maktx', align: 'center', title: '鍚嶇О', event: 'detail'},
+                {field: 'warehouse', align: 'center', title: '搴撳尯', event: 'detail', width: 50},
+                {
+                    field: 'anfmeOut',
+                    align: 'center',
+                    title: '鏁伴噺',
+                    event: 'detail',
+                    style: 'color: blue',
+                    event: 'modify',
+                    style: 'cursor: pointer;color: blue',
+                    width: 50
+                },
+                {type: 'checkbox', fixed: 'right', width: 30},
+            ]],
+            done: function (res, curr, count) {
+            }
+        });
+
+
+        // 鐩戝惉琛屽伐鍏蜂簨浠�
+        table.on('tool(locNormalOut)', function (obj) {
+            var data = obj.data;
+            switch (obj.event) {
+                case 'modify':
+                    countLayer = layer.open({
+                        type: 1,
+                        offset: '20px',
+                        title: '淇敼鏁伴噺',
+                        shadeClose: true,
+                        area: ['80%', '240px'],
+                        content: $("#modify"),
+                        success: function (layero, index) {
+                            $('#matnr2').val(data.matnr);
+                            $('#maktx2').val(data.maktx);
+                            $('#index').val(data.id);
+                            $('#anfme2').val(0);
+                            maxCount = data.anfme;
+                        }
+                    });
+                    break;
+            }
+        });
+
+        form.on('select(uuid)', function (data) {
+            var val = data.value;
+            findCode(this, 'uuid');
+        });
+
+        var areaType = getQueryVariable('areaType');
+        // 鑾峰彇浠撳簱涓嬫媺
+        $.ajax({
+            url: baseUrl + "/locArea/queryAll/auth?areaType=" + (areaType ? areaType : ""),
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var html = "";
+                    if (res.data && res.data.length > 0) {
+                        html += res.data.map(function (item) {
+                            return "<Option value=" + item.uuid + ">" + item.name + "</Option>";
+                        });
+                    }
+                    $('#uuid').append(html);
+                    layui.form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        });
+    });
+
+    var warehouseBar;
+    var matnrBar;
+    var billNo;
+
+    /* 鎵爜銆佽緭鍏ュ簱鍖哄拰鐗╂枡缂栫爜 */
+    function findCode(el, type) {
+        warehouseBar = $('#uuid').val();
+        billNo = $("#billNo").val();
+        if (billNo && billNo != '' && billNo.indexOf('=') > -1) {
+            billNo = billNo.split(",")[0].split("=")[1];
+        }
+        switch (type) {
+            case 'uuid':
+//                exist('uuid', 'locArea');
+                break;
+            case 'matnr':
+                matnrBar = el.value;
+                break;
+            default:
+                break;
+        }
+
+        // 鍒ゆ柇搴撳尯鎴栬�呯墿鏂欑紪鐮侀兘涓嶄负绌�
+//        if (!warehouseBar || !matnrBar) {
+//            return;
+//        }
+
+        $.ajax({
+            url: baseUrl + "/locNormal/pda/out/query?matnr=" + (matnrBar ? matnrBar : "") + "&warehouse=" + (warehouseBar ? warehouseBar : "") + "&billNo=" + (billNo ? billNo : ""),
+            headers: {'token': localStorage.getItem('token')},
+//            contentType: 'application/json;charset=UTF-8',
+            method: 'GET',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    if (res.data && res.data.length > 0) {
+                        res.data.map(function (item) {
+                            // 榛樿璧嬪��0寮�濮�
+                            item.anfmeOut = 0;
+                        });
+                    }
+                    tableIns.reload({
+                        data: res.data,
+                    });
+                    normalOutList = res.data;
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            },
+        });
+    }
+
+    /* 淇敼鏁伴噺 */
+    var countDom = $('#anfme2');
+
+    function add() {
+        if (countDom.val() >= maxCount) {
+            return;
+        }
+        countDom.val(Number(countDom.val()) + 1);
+    }
+
+    function reduce() {
+        if (countDom.val() <= 0) {
+            return;
+        }
+        countDom.val(Number(countDom.val()) - 1);
+    }
+
+    function fix(e) {
+        if (Number(e.value) > maxCount) {
+            countDom.val(maxCount);
+        }
+    }
+
+    function remove() {
+        var matnr = $('#matnr2').val();
+        var index = $('#index').val();
+        for (var j = 0; j < normalOutList.length; j++) {
+            if (matnr === normalOutList[j].matnr && index == normalOutList[j].id) {
+                normalOutList.splice(j, 1);
+            }
+        }
+        tableIns.reload({data: normalOutList});
+        layer.close(countLayer);
+        tips("绉婚櫎鎴愬姛");
+    }
+
+    // 淇敼鏁伴噺
+    function confirm() {
+        var matnr = $('#matnr2').val();
+        var count = $('#anfme2').val();
+        var index = $('#index').val();
+        for (var j = 0; j < normalOutList.length; j++) {
+            if (matnr === normalOutList[j].matnr && index == normalOutList[j].id) {
+                if (count > maxCount || count < 0) {
+                    tips("鏁伴噺涓嶈兘瓒呰繃鑼冨洿", true);
+                    return;
+                }
+                normalOutList[j].anfmeOut = Number(count);
+            }
+        }
+        tableIns.reload({data: normalOutList});
+        layer.close(countLayer);
+        tips("淇敼鎴愬姛");
+    }
+
+    /* 骞充粨鍑哄簱 */
+    function locNormalOut() {
+        // 璋冪敤鍑哄簱鎺ュ彛锛屽鏋滄暟閲忎笉鏄叏閮ㄥ垯杩涜update鏇存柊anfme瀛楁锛屽鏋滄槸鍏ㄩ儴鏁伴噺鍒欑洿鎺pdate鏇存柊state瀛楁1鈫�2
+        var table = layui.table;
+        var checkStatus = table.checkStatus('locNormalOut');
+        var data = checkStatus.data;
+        if (data.length == 0) {
+            layer.msg("璇烽�夋嫨鐗╂枡!");
+            return;
+        }
+        // 搴撳尯璧嬪��
+        var warehouse = $('#uuid').val();
+        data.map(function (item) {
+            item.warehouse = warehouse;
+        });
+        // 鍑哄簱鎺ュ彛
+        $.ajax({
+            url: baseUrl + "/locNormal/pda/out",
+            headers: {'token': localStorage.getItem('token')},
+            data: JSON.stringify({
+                normalList: data,
+            }),
+            contentType: 'application/json;charset=UTF-8',
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200) {
+                    layer.msg("鍑哄簱鎴愬姛");
+                    $("#matnr").val(null);
+                    $("#billNo").val(null);
+                    warehouseBar = null;
+                    matnrBar = null;
+                    normalOutList = [];
+                    tableIns.reload({
+                        data: normalOutList,
+                    })
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/pda";
+                } else {
+                    tips(res.msg, true)
+                }
+            },
+        });
+    }
+
+    function reset() {
+        $("#uuid").val(null);
+        $("#matnr").val(null);
+        $("#billNo").val(null);
+        layui.form.render('select');
+        normalOutList = [];
+        tableIns.reload({data: normalOutList});
+        layer.closeAll();
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/pda/matQuery.html b/src/main/webapp/views/pda/matQuery.html
index 445781e..6292268 100644
--- a/src/main/webapp/views/pda/matQuery.html
+++ b/src/main/webapp/views/pda/matQuery.html
@@ -26,11 +26,9 @@
             font-size: 16px;
             display: inline-block;
             text-align: right;
-            width: 70px;
         }
         .form-box input {
-            width: 120px;
-            margin-left: 10px;
+            width: 160px;
             padding-left: 5px;
             height: 30px;
             border: 1px solid #777777;
@@ -77,21 +75,57 @@
 
 <div class="form-box">
     <div class="form-item">
-        <span>鐗╂枡缂栫爜</span>
-        <input id="matNo" type="text" placeholder="鎵爜 / 杈撳叆" onkeyup="find(this)" autocomplete="off">
+        <table style="display: inline">
+            <tr>
+                <td>
+                    <span style="width: 35px; margin-right: 5px">缂栫爜</span>
+                </td>
+                <td style="text-align: left">
+                    <input id="matNo" type="text" placeholder="鎵爜 / 杈撳叆" onkeyup="find(this)" autocomplete="off">
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
-        <span>鐗╂枡鍚嶇О</span>
-        <input id="matName" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td style="vertical-align: top">
+                    <span style="width: 35px; margin-right: 5px">鍚嶇О</span>
+                </td>
+                <td style="text-align: left">
+                    <textarea rows="4" style="width: 165px; resize: none" id="matName" type="text" disabled="disabled" readonly="readonly"></textarea>
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
-        <span>鐗╂枡瑙勬牸</span>
-        <input id="str2" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td>
+                    <span style="width: 35px; margin-right: 5px">瑙勬牸</span>
+                </td>
+                <td style="text-align: left">
+                    <input id="str2" type="text" disabled="disabled">
+                </td>
+            </tr>
+        </table>
     </div>
     <div class="form-item">
-        <span>鍗曚綅</span>
-        <input id="str1" type="text" disabled="disabled">
+        <table style="display: inline">
+            <tr>
+                <td>
+                    <span style="width: 35px; margin-right: 5px">鍗曞彿</span>
+                </td>
+                <td style="text-align: left">
+                    <input id="mnemonic" type="text" autocomplete="off">
+                </td>
+            </tr>
+        </table>
     </div>
+    <!--<div class="form-item">-->
+        <!--<span>鍗曚綅</span>-->
+        <!--<input id="str1" type="text" disabled="disabled">-->
+    <!--</div>-->
     <div class="form-item">
         <span style="vertical-align: middle">鏁伴噺</span>
         <div class="number-tool" style="vertical-align: middle">
@@ -146,7 +180,8 @@
         var data = {
             matNo: $('#matNo').val(),
             matName: $('#matName').val(),
-            count: countDom.val()
+            count: countDom.val(),
+            mnemonic: $("#mnemonic").val()
         };
         parent.addTableData(data);
         parent.layer.close(parent.matCodeLayerIdx);
diff --git a/src/main/webapp/views/pda/stockIn.html b/src/main/webapp/views/pda/stockIn.html
index 07c06b4..6700d99 100644
--- a/src/main/webapp/views/pda/stockIn.html
+++ b/src/main/webapp/views/pda/stockIn.html
@@ -71,7 +71,7 @@
 <!-- 澶撮儴 -->
 <header>
     <div class="layui-input-inline">
-        <label class="layui-form-label">鏉$爜</label>
+        <label class="layui-form-label">鎵樼洏鐮�</label>
         <input class="layui-input" type="number" id="code" onkeyup="findCode(this)" oninput="if(value.length>8)value=value.slice(0,8)" placeholder="鎵爜 / 杈撳叆" autocomplete="off">
     </div>
     <div style="margin: 5px 5px" class="layui-form">
@@ -91,7 +91,10 @@
     <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
 </main>
 <!-- 灏鹃儴 -->
-<footer>
+<footer style="margin-top: -5px">
+    <div class="layui-btn-container" style="text-align: center; margin-bottom: 8px">
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" >杩斿洖</button>
+    </div>
     <div class="layui-btn-container">
         <button type="button" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
         <button id="empty-pakin" type="button" class="layui-btn layui-btn-normal" onclick="emptyPakIn()" style="margin-left: 15px">绌烘澘鍏ュ簱</button>
@@ -119,8 +122,9 @@
             limit: 500,
             cellMinWidth: 50,
             cols: [[
-                {fixed: 'left', align: 'center', field: 'count', title: '鏁伴噺', style:'color: blue', width:50},
                 {field: 'matNo', align: 'center', title: '鐗╂枡缂栫爜'},
+                {field: 'mnemonic', align: 'center', title: '鐢熶骇鍗曞彿'},
+                {field: 'count', align: 'center', title: '鏁伴噺', style:'color: blue', width:50},
                 {field: 'matName', align: 'center', title: '鐗╂枡鍚嶇О'}
             ]],
             done: function (res, curr, count) {
@@ -167,7 +171,7 @@
             type: 2,
             title: '鐗╂枡',
             shade: [0.3,'#000'],
-            area: ['90%', '80%'],
+            area: ['90%', '90%'],
             content: 'matQuery.html',
             success: function(layero, index){
                 $('.layui-layer-title').css('font-size', '16px');
@@ -316,6 +320,10 @@
             $("#code").focus();
         }
     }
+
+    function back() {
+        parent.backIndex();
+    }
 </script>
 <script type="text/template" id="putSiteSelectTemplate">
     {{#each data}}
diff --git a/src/main/webapp/views/pda/stockOut.html b/src/main/webapp/views/pda/stockOut.html
index 2e59ec2..1b09851 100644
--- a/src/main/webapp/views/pda/stockOut.html
+++ b/src/main/webapp/views/pda/stockOut.html
@@ -24,17 +24,23 @@
 <!-- 澶撮儴 -->
 <header class="layui-form">
     <div class="layui-input-inline">
-        <label class="layui-form-label">搴撲綅</label>
+        <label class="layui-form-label">鍗曞彿</label>
         <div class="layui-input-block">
-            <input class="layui-input" type="number" id="locNo" onkeyup="findByLocNo(this)" autocomplete="off">
+            <input class="layui-input" type="text" id="billNo" onkeyup="findByBillNo(this)" autocomplete="off">
         </div>
-
     </div>
     <div class="layui-input-inline">
         <label class="layui-form-label">鐗╂枡</label>
         <div class="layui-input-block">
             <input class="layui-input" type="text" id="matNo" onkeyup="findByMatNo(this)" autocomplete="off">
         </div>
+    </div>
+    <div class="layui-input-inline">
+        <label class="layui-form-label">搴撲綅</label>
+        <div class="layui-input-block">
+            <input class="layui-input" type="number" id="locNo" onkeyup="findByLocNo(this)" autocomplete="off">
+        </div>
+
     </div>
     <div class="layui-input-inline">
         <label class="layui-form-label">鍑哄簱鍙�</label>
@@ -54,6 +60,7 @@
     <div class="layui-btn-container">
         <button id="reset" type="button" class="layui-btn layui-btn-primary" onclick="reset()">閲嶇疆</button>
         <button id="pakOut" type="button" class="layui-btn layui-btn-normal" onclick="pakOut()" style="margin-left: 20px">鍑哄簱</button>
+        <button type="button" id="retrun-btn" class="layui-btn layui-btn-primary " onclick="back()" style="margin-left: 20px">杩斿洖</button>
         <span id="tips"></span>
     </div>
 </footer>
@@ -61,7 +68,7 @@
 <script>
 
     window.onload = function(){
-        document.getElementById("locNo").focus();
+        document.getElementById("billNo").focus();
         getOutBound();
     }
 
@@ -86,13 +93,29 @@
         $("#locNo").val("");
         find(null, el.value);
     }
-    function find(locNo, matNo) {
+
+    /**
+     * 鏍规嵁閫氱煡鍗曞彿鏌ユ壘搴撳瓨鏄庣粏
+     * */
+    function findByBillNo(el) {
+        if (isEmpty(el.value)) {
+            return;
+        }
+
+        find(null, null, el.value);
+    }
+
+    function find(locNo, matNo, billNo) {
+        if (billNo.indexOf('=') > -1) {
+            billNo = billNo.split(",")[0].split("=")[1];
+        }
         $.ajax({
             url: baseUrl + "/mobile/locDetl",
             headers: {'token': localStorage.getItem('token')},
             data: {
                 locNo: locNo,
-                matNo: matNo
+                matNo: matNo,
+                supplier: billNo,
             },
             method: 'POST',
             success: function (res) {
@@ -101,7 +124,7 @@
                         locDetlData = res.data;
                         tableIns.reload({data: locDetlData});
                     }
-                    $('#pakOut').focus();
+//                    $('#pakOut').focus();
                 } else if (res.code === 403) {
                     top.location.href = baseUrl + "/pda";
                 } else {
@@ -128,11 +151,11 @@
             limit: 500,
             cellMinWidth: 50,
             cols: [[
-                {type: 'checkbox', fixed: 'left', width:30},
-                {field: 'count', align: 'center', title: '鏁伴噺', event: 'detail', style:'color: blue', width:50},
                 {field: 'matnr', align: 'center', title: '缂栫爜', event: 'detail'},
                 {field: 'maktx', align: 'center', title: '鍚嶇О', event: 'detail'},
-                {field: 'locNo', align: 'center', title: '搴撲綅', event: 'detail'}
+                {field: 'locNo', align: 'center', title: '搴撲綅', event: 'detail'},
+                {field: 'count', align: 'center', title: '鏁伴噺', event: 'detail', style:'color: blue', width:50},
+                {type: 'checkbox', fixed: 'right', width:30},
             ]],
             done: function (res, curr, count) {
             }
@@ -148,7 +171,7 @@
                         type: 2,
                         title: '搴撳瓨鏄庣粏',
                         shade: [0.3,'#000'],
-                        area: ['90%', '70%'],
+                        area: ['90%', '75%'],
                         content: 'locDetlIframe.html',
                         success: function(layero, index){
                             // 璁剧疆寮圭獥鏍峰紡
@@ -252,6 +275,7 @@
     function reset() {
         $("#matNo").val("");
         $("#locNo").val("");
+        $("#billNo").val("");
         locDetlData = [];
         tableIns.reload({data: locDetlData});
         $('#staNoSelect').val("");
@@ -279,6 +303,10 @@
             $("#locNo").focus();
         }
     }
+
+    function back() {
+        parent.backIndex();
+    }
 </script>
 <script type="text/template" id="takeSiteSelectTemplate">
     {{#each data}}
diff --git a/src/main/webapp/views/salesOrder/salesOrder.html b/src/main/webapp/views/salesOrder/salesOrder.html
new file mode 100644
index 0000000..c82aa43
--- /dev/null
+++ b/src/main/webapp/views/salesOrder/salesOrder.html
@@ -0,0 +1,93 @@
+<!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/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <link rel="stylesheet" href="../../static/css/print.css" media="all">
+</head>
+<style>
+    #search-box {
+        padding: 30px 30px 10px 30px;
+    }
+
+    #search-box .layui-inline {
+        margin-right: 5px;
+    }
+
+    #data-search-btn {
+        margin-top: 10px;
+    }
+
+    #data-search-btn.layui-btn-container .layui-btn {
+        margin-right: 20px;
+    }
+
+    .contain td {
+        border: 1px solid #000;
+        /*line-height: 46px;*/
+    }
+
+</style>
+<body>
+
+<div>
+    <!-- 鎼滅储鏍� -->
+    <div id="search-box" class="layui-form layui-card-header">
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="orderCode" placeholder="璁㈠崟鍙�" autocomplete="off">
+            </div>
+        </div>
+
+        <!-- 鏃ユ湡鑼冨洿 -->
+        <div class="layui-inline" style="width: 300px">
+            <div class="layui-input-inline">
+                <input class="layui-input layui-laydate-range" name="orderTime" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+            </div>
+        </div>
+
+        <!--<div class="layui-inline" style="width: 150px">-->
+            <!--<select id="orderState" name="orderState">-->
+                <!--<option value="">璁㈠崟鐘舵��</option>-->
+                <!--<option value="1">鍒濆</option>-->
+                <!--<option value="2">鎵ц涓�</option>-->
+                <!--<option value="3">缁撴潫</option>-->
+            <!--</select>-->
+        <!--</div>-->
+
+
+        <div id="data-search-btn" class="layui-btn-container layui-form-item">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储
+            </button>
+            <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆
+            </button>
+        </div>
+    </div>
+
+    <!-- 琛ㄦ牸 -->
+    <div class="layui-form">
+        <table class="layui-hide" id="salesOrder" lay-filter="salesOrder"></table>
+    </div>
+
+</div>
+
+<script type="text/html" id="operate">
+    <button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="btnPrint">璐ㄦ</button>
+</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/handlebars/handlebars-v4.5.3.js"></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/salesOrder/salsesOrder.js"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/waitPakinLog/waitPakinLog.html b/src/main/webapp/views/waitPakinLog/waitPakinLog.html
index 72b13f8..b72679a 100644
--- a/src/main/webapp/views/waitPakinLog/waitPakinLog.html
+++ b/src/main/webapp/views/waitPakinLog/waitPakinLog.html
@@ -16,6 +16,11 @@
 <div id="search-box" class="layui-form layui-card-header">
     <div class="layui-inline">
         <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="zpallet" placeholder="鎵樼洏鐮�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
             <input class="layui-input" type="text" name="pakin_id" placeholder="鍏ュ簱閫氱煡鍙�" autocomplete="off">
         </div>
     </div>
diff --git a/version/v1.0.1/wjh.sql b/version/v1.0.1/wjh.sql
deleted file mode 100644
index aa7e690..0000000
--- a/version/v1.0.1/wjh.sql
+++ /dev/null
@@ -1,3 +0,0 @@
---琛ㄧ粨鏋勫彉鏇�
-alter table dbo.asr_loc_detl add mat_status varchar(10);
-alter table dbo.asr_wrk_detl add mat_status varchar(10);
\ No newline at end of file
diff --git a/version/version/wjh.sql b/version/version/wjh.sql
new file mode 100644
index 0000000..54f844b
--- /dev/null
+++ b/version/version/wjh.sql
@@ -0,0 +1,330 @@
+/* v1.0.1  */
+--琛ㄧ粨鏋勫彉鏇�
+alter table dbo.asr_loc_detl add mat_status varchar(10);
+alter table dbo.asr_wrk_detl add mat_status varchar(10);
+/* v1.0.2 2021.03.05 */
+--琛ㄧ粨鏋勫彉鏇�
+CREATE TABLE [dbo].[asr_loc_normal](
+	[matnr] [varchar](50) NOT NULL,
+	[maktx] [nvarchar](50) NULL,
+	[lgnum] [varchar](255) NULL,
+	[type] [varchar](50) NULL,
+	[mnemonic] [varchar](255) NULL,
+	[supplier] [varchar](255) NULL,
+	[warehouse] [varchar](255) NULL,
+	[brand] [varchar](255) NULL,
+	[anfme] [decimal](24, 9) NULL,
+	[altme] [nvarchar](50) NULL,
+	[bname] [nvarchar](50) NULL,
+	[memo] [varchar](600) NULL,
+	[modi_user] [bigint] NULL,
+	[modi_time] [datetime] NULL,
+	[appe_user] [bigint] NULL,
+	[appe_time] [datetime] NULL,
+	[state] [varchar](10) NULL
+) ON [PRIMARY]
+
+CREATE TABLE [dbo].[asr_loc_area](
+	[id] [bigint] IDENTITY(1,1) NOT NULL,
+	[uuid] [varchar](50) NULL,
+	[name] [varchar](255) NULL,
+	[status] [int] NULL,
+	[create_by] [bigint] NULL,
+	[create_time] [datetime] NULL,
+	[update_by] [bigint] NULL,
+	[update_time] [datetime] NULL,
+	[memo] [varchar](255) NULL
+) ON [PRIMARY]
+
+/* v1.0.3 2021.03.11 */
+--琛ㄧ粨鏋勫彉鏇�
+alter table asr_loc_normal add id int identity(1,1)
+
+/* v1.0.4 2021.03.17 */
+USE [xtyasrs]
+GO
+/****** Object:  Table [dbo].[OutStockbill]    Script Date: 2021/3/17 10:18:26 ******/
+SET ANSI_NULLS ON
+GO
+SET QUOTED_IDENTIFIER ON
+GO
+SET ANSI_PADDING ON
+GO
+CREATE TABLE [dbo].[OutStockbill](
+	[FBrNo] [varchar](10) NOT NULL,
+	[FInterID] [int] NOT NULL,
+	[FBillNo] [nvarchar](255) NOT NULL,
+	[FTranType] [smallint] NULL,
+	[FSalType] [int] NULL,
+	[FCustID] [int] NULL,
+	[FDate] [datetime] NULL,
+	[FStockID] [int] NULL,
+	[FAdd] [char](255) NULL,
+	[FNote] [char](255) NULL,
+	[FEmpID] [int] NULL,
+	[FCheckerID] [int] NULL,
+	[FBillerID] [int] NULL,
+	[FManagerID] [int] NULL,
+	[FClosed] [int] NOT NULL,
+	[FInvoiceClosed] [smallint] NULL,
+	[FBClosed] [smallint] NOT NULL,
+	[FDeptID] [int] NULL,
+	[FSettleID] [int] NULL,
+	[FTranStatus] [int] NOT NULL,
+	[FExchangeRate] [float] NULL,
+	[FCurrencyID] [int] NULL,
+	[FStatus] [smallint] NOT NULL,
+	[FCancellation] [bit] NOT NULL,
+	[FMultiCheckLevel1] [int] NULL,
+	[FMultiCheckLevel2] [int] NULL,
+	[FMultiCheckLevel3] [int] NULL,
+	[FMultiCheckLevel4] [int] NULL,
+	[FMultiCheckLevel5] [int] NULL,
+	[FMultiCheckLevel6] [int] NULL,
+	[FMultiCheckDate1] [datetime] NULL,
+	[FMultiCheckDate2] [datetime] NULL,
+	[FMultiCheckDate3] [datetime] NULL,
+	[FMultiCheckDate4] [datetime] NULL,
+	[FMultiCheckDate5] [datetime] NULL,
+	[FMultiCheckDate6] [datetime] NULL,
+	[FCurCheckLevel] [int] NULL,
+	[FRelateBrID] [int] NULL,
+	[FCheckDate] [datetime] NULL,
+	[FExplanation] [nvarchar](255) NOT NULL,
+	[FFetchAdd] [nvarchar](255) NOT NULL,
+	[FSelTranType] [int] NOT NULL,
+	[FChildren] [int] NOT NULL,
+	[FBrID] [int] NULL,
+	[FAreaPS] [int] NOT NULL,
+	[FPOOrdBillNo] [nvarchar](255) NULL,
+	[FManageType] [int] NULL,
+	[FPrintCount] [smallint] NULL,
+	[Fflag_rw] [int] NULL,
+	[Fflag_finish] [int] NULL
+) ON [PRIMARY]
+SET ANSI_PADDING OFF
+ALTER TABLE [dbo].[OutStockbill] ADD [FWeiOrder] [varchar](255) NOT NULL
+ALTER TABLE [dbo].[OutStockbill] ADD [FWeiOpenID] [nvarchar](255) NOT NULL
+ALTER TABLE [dbo].[OutStockbill] ADD [FOrderBillNo] [nvarchar](255) NOT NULL
+SET ANSI_PADDING ON
+ALTER TABLE [dbo].[OutStockbill] ADD [FWLNumber] [varchar](255) NULL
+ALTER TABLE [dbo].[OutStockbill] ADD [FWLCompany] [varchar](255) NULL
+SET ANSI_PADDING OFF
+ALTER TABLE [dbo].[OutStockbill] ADD [FReturnFundType] [varchar](255) NOT NULL
+ CONSTRAINT [pk_OutStockbill_1__16] PRIMARY KEY CLUSTERED
+(
+	[FBrNo] ASC,
+	[FInterID] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+
+GO
+SET ANSI_PADDING OFF
+GO
+/****** Object:  Table [dbo].[OutStockbillEntry]    Script Date: 2021/3/17 10:18:26 ******/
+SET ANSI_NULLS ON
+GO
+SET QUOTED_IDENTIFIER ON
+GO
+SET ANSI_PADDING ON
+GO
+CREATE TABLE [dbo].[OutStockbillEntry](
+	[FBrNo] [varchar](10) NOT NULL,
+	[FInterID] [int] NOT NULL,
+	[FEntryID] [int] NOT NULL,
+	[FItemID] [int] NULL,
+	[FQty] [decimal](28, 10) NOT NULL,
+	[FCommitQty] [decimal](28, 10) NOT NULL,
+	[FPrice] [decimal](28, 10) NOT NULL,
+	[FAmount] [decimal](20, 2) NOT NULL,
+	[FOrderInterID] [int] NOT NULL,
+	[FDate] [datetime] NULL,
+	[FNote] [varchar](1024) NULL,
+	[FInvoiceQty] [decimal](28, 10) NOT NULL,
+	[FBCommitQty] [decimal](28, 10) NOT NULL,
+	[FUnitID] [int] NOT NULL,
+	[FAuxBCommitQty] [decimal](28, 10) NOT NULL,
+	[FAuxCommitQty] [decimal](28, 10) NOT NULL,
+	[FAuxInvoiceQty] [decimal](28, 10) NOT NULL,
+	[FAuxPrice] [decimal](28, 10) NOT NULL,
+	[FAuxQty] [decimal](28, 10) NOT NULL,
+	[FSourceEntryID] [int] NOT NULL,
+	[FMapNumber] [varchar](80) NOT NULL,
+	[FMapName] [nvarchar](256) NULL,
+	[FAuxPropID] [int] NOT NULL,
+	[FBatchNo] [nvarchar](255) NOT NULL,
+	[FCheckDate] [datetime] NULL,
+	[FExplanation] [nvarchar](255) NOT NULL,
+	[FFetchAdd] [nvarchar](255) NOT NULL,
+	[FFetchDate] [datetime] NULL,
+	[FMultiCheckDate1] [datetime] NULL,
+	[FMultiCheckDate2] [datetime] NULL,
+	[FMultiCheckDate3] [datetime] NULL,
+	[FMultiCheckDate4] [datetime] NULL,
+	[FMultiCheckDate5] [datetime] NULL,
+	[FMultiCheckDate6] [datetime] NULL,
+	[FSecCoefficient] [decimal](28, 10) NOT NULL,
+	[FSecQty] [decimal](28, 10) NOT NULL,
+	[FSecCommitQty] [decimal](28, 10) NOT NULL,
+	[FSourceTranType] [int] NOT NULL,
+	[FSourceInterId] [int] NOT NULL,
+	[FSourceBillNo] [nvarchar](255) NOT NULL,
+	[FContractInterID] [int] NOT NULL,
+	[FContractEntryID] [int] NOT NULL,
+	[FContractBillNo] [nvarchar](255) NOT NULL,
+	[FOrderEntryID] [int] NOT NULL,
+	[FOrderBillNo] [nvarchar](255) NOT NULL,
+	[FStockID] [int] NOT NULL,
+	[FBackQty] [decimal](28, 10) NOT NULL,
+	[FAuxBackQty] [decimal](28, 10) NOT NULL,
+	[FSecBackQty] [decimal](28, 10) NOT NULL,
+	[FStdAmount] [decimal](23, 10) NOT NULL,
+	[FPlanMode] [int] NOT NULL,
+	[FMTONo] [nvarchar](50) NOT NULL,
+	[FDetailID] [int] NOT NULL,
+	[FStockQtyOnlyForShow] [decimal](23, 10) NOT NULL,
+	[FComplexQty] [varchar](255) NULL,
+	[Fmodel] [varchar](80) NULL,
+	[Fname] [varchar](80) NULL,
+	[Fnumber] [varchar](80) NULL
+) ON [PRIMARY]
+SET ANSI_PADDING OFF
+ALTER TABLE [dbo].[OutStockbillEntry] ADD [FBarCode] [varchar](100) NOT NULL
+ALTER TABLE [dbo].[OutStockbillEntry] ADD [FBTPLCommitQty] [decimal](28, 10) NOT NULL
+ALTER TABLE [dbo].[OutStockbillEntry] ADD [FTPLCommitQty] [decimal](28, 10) NOT NULL
+ALTER TABLE [dbo].[OutStockbillEntry] ADD [fsecinvoiceqty] [decimal](23, 10) NULL
+ CONSTRAINT [pk_OutStockbillEntry_1__16] PRIMARY KEY CLUSTERED
+(
+	[FBrNo] ASC,
+	[FInterID] ASC,
+	[FEntryID] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+
+GO
+SET ANSI_PADDING OFF
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FClosed]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FInvoiceClosed]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FBClosed]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((-1)) FOR [FSettleID]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FTranStatus]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FStatus]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FCancellation]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  CONSTRAINT [DF__OutStockbill__FConsig]  DEFAULT ((0)) FOR [FRelateBrID]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FExplanation]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FFetchAdd]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FSelTranType]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FChildren]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ((0)) FOR [FAreaPS]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FWeiOrder]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FWeiOpenID]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FOrderBillNo]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FWLNumber]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FWLCompany]
+GO
+ALTER TABLE [dbo].[OutStockbill] ADD  DEFAULT ('') FOR [FReturnFundType]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FPrice]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAmount]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  CONSTRAINT [DF_OutStockbillEntry_FOrderInterID]  DEFAULT ((0)) FOR [FOrderInterID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FInvoiceQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FBCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FUnitID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxBCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxInvoiceQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxPrice]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  CONSTRAINT [DF__SEOutStoc__FSour__558158D4]  DEFAULT ((0)) FOR [FSourceEntryID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FMapNumber]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  CONSTRAINT [DF__SEOutStoc__FMapN__5769A146]  DEFAULT ('') FOR [FMapName]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxPropID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FBatchNo]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FExplanation]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FFetchAdd]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSecCoefficient]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSecQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSecCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSourceTranType]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSourceInterId]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FSourceBillNo]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FContractInterID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FContractEntryID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FContractBillNo]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FOrderEntryID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FOrderBillNo]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FStockID]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FBackQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FAuxBackQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FSecBackQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FStdAmount]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((14036)) FOR [FPlanMode]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FMTONo]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('0') FOR [FStockQtyOnlyForShow]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ('') FOR [FBarCode]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FBTPLCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [FTPLCommitQty]
+GO
+ALTER TABLE [dbo].[OutStockbillEntry] ADD  DEFAULT ((0)) FOR [fsecinvoiceqty]
+GO
+/* v1.0.5 2021.03.24 */
+alter table asr_loc_area add area_type varchar(10);
\ No newline at end of file

--
Gitblit v1.9.1