From 41ce33ca359ca6f78fa76a5352d76447424158e1 Mon Sep 17 00:00:00 2001
From: wang..123 <brook_w@163.com>
Date: 星期二, 15 三月 2022 10:56:31 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/OutStockDanService.java          |   26 +
 src/main/java/com/zy/common/service/erp/ErpService.java            |    4 
 src/main/webapp/views/outStockDan/outStockDan.html                 |   89 +++
 src/main/java/com/zy/asrs/controller/OutStockDanController.java    |  188 +++++++
 src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java         |    6 
 src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java            |   25 +
 src/main/java/com/zy/asrs/service/LocNormalService.java            |    2 
 src/main/webapp/views/outStockDan/outStockDetail1.html             |  226 +++++++++
 src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java   |    8 
 src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java    |    2 
 src/main/resources/mapper/OutStockDanMapper.xml                    |  130 +++++
 src/main/webapp/static/js/outStockDan/outStockDan.js               |  168 +++++++
 src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java |  306 ++++++++++++
 src/main/java/com/zy/asrs/controller/OutStockController.java       |    4 
 src/main/webapp/views/outStockDan/outStockNormalDetail1.html       |  204 ++++++++
 src/main/resources/application.yml                                 |    2 
 16 files changed, 1,379 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OutStockController.java b/src/main/java/com/zy/asrs/controller/OutStockController.java
index dc270c8..b9b6c03 100644
--- a/src/main/java/com/zy/asrs/controller/OutStockController.java
+++ b/src/main/java/com/zy/asrs/controller/OutStockController.java
@@ -95,8 +95,8 @@
      */
     @RequestMapping(value = "/outStock/query/locNormalList")
     @ManagerAuth
-    public R queryMatWithLocNormal(String fbillNo, String mnemonic) {
-        List<LocNormal> list = locNormalService.queryLocNorlMatnr(fbillNo, mnemonic);
+    public R queryMatWithLocNormal(String fbillNo, String mnemonic,String matnr) {
+        List<LocNormal> list = locNormalService.queryLocNorlMatnr(fbillNo, mnemonic,matnr);
         return R.ok(list);
     }
 
diff --git a/src/main/java/com/zy/asrs/controller/OutStockDanController.java b/src/main/java/com/zy/asrs/controller/OutStockDanController.java
new file mode 100644
index 0000000..a25db26
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/OutStockDanController.java
@@ -0,0 +1,188 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocNormal;
+import com.zy.asrs.entity.LocNormalLog;
+import com.zy.asrs.entity.param.LocNormalStockOutParam;
+import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.service.LocNormalLogService;
+import com.zy.asrs.service.LocNormalService;
+import com.zy.asrs.service.OutStockDanService;
+import com.zy.asrs.service.WorkService;
+import com.zy.asrs.utils.VersionUtils;
+import com.zy.common.service.erp.ErpService;
+import com.zy.common.service.erp.entity.OutStockBillEntry;
+import com.zy.common.web.BaseController;
+import lombok.extern.slf4j.Slf4j;
+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 java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+public class OutStockDanController extends BaseController {
+
+
+    @Autowired
+    private OutStockDanService outStockDanService;
+    @Autowired
+    private WorkService workService;
+    @Autowired
+    private LocNormalService locNormalService;
+    @Autowired
+    private ErpService erpService;
+    @Autowired
+    private LocNormalLogService locNormalLogService;
+
+
+    /**
+     *
+     * @param curr
+     * @param limit
+     * @param param
+     * @return
+     */
+    @RequestMapping(value = "/outStock/query/list1")
+    @ManagerAuth
+    public R outStockQueryList(@RequestParam(defaultValue = "1")Integer curr,
+                               @RequestParam(defaultValue = "10")Integer limit,
+                               @RequestParam Map<String, Object> param){
+        return R.ok(outStockDanService.queryOutStock(toPage(curr, limit, param, OutStockBillEntry.class)));
+    }
+
+    /**
+     * 妫�绱㈢鍚堥�氱煡鍗曠殑绔嬪簱搴撳瓨鐗╂枡
+     * @param fbillNo
+     * @return
+     */
+    @RequestMapping(value = "/outStock/query/locList1")
+    @ManagerAuth
+    public R queryMatWithLoc(String fbillNo,String matnr,String mnemonic) {
+        List<LocDetl> list = outStockDanService.queryMatWithLoc(fbillNo,matnr,mnemonic);
+        return R.ok(list);
+    }
+
+    @RequestMapping(value = "/plate/outStock/start1")
+    @ManagerAuth(memo = "鍑哄簱浣滀笟")
+    public R fullStoreTakeStart(@RequestBody StockOutParam param) {
+        outStockDanService.startupFullTakeStore(param, getUserId());
+        return R.ok("鍑哄簱鍚姩鎴愬姛");
+    }
+
+    /**
+     * 妫�绱㈢鍚堥�氱煡鍗曠殑骞充粨搴撳瓨鐗╂枡
+     * @param fbillNo
+     * @return
+     */
+    @RequestMapping(value = "/outStock/query/locNormalList1")
+    @ManagerAuth
+    public R queryMatWithLocNormal(String fbillNo, String mnemonic,String matnr) {
+        List<LocNormal> list = locNormalService.queryLocNorlMatnr(fbillNo, mnemonic,matnr);
+        return R.ok(list);
+    }
+
+
+    /**
+     * 骞充粨瀵规帴erp鍑哄簱
+     * @param
+     * @return
+     */
+    @RequestMapping(value = "/outStock/locNormal1")
+    @ManagerAuth
+    @Transactional
+    public R outStockLocNormal(@RequestBody LocNormalStockOutParam param) {
+        Long modiUser = getUserId();
+        Date modiTime = new Date();
+
+        Integer FInterI = outStockDanService.queryOutStockFInterID(param.getSupplier()); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
+        List<OutStockBillEntry>  entryList = outStockDanService.selectList(new EntityWrapper<OutStockBillEntry>().eq("FInterID",FInterI));
+        for(OutStockBillEntry one : entryList){
+            String Fnumber = one.getFnumber();
+            BigDecimal qty = new BigDecimal(0);
+            for (LocNormal locNormals:param.getList()) {
+                if(locNormals.getMatnr().equals(Fnumber)){
+                    qty = qty.add(locNormals.getAnfme());
+                }
+            }
+            if(qty.compareTo(one.getFQty()) == 1){
+                return R.error("鍑哄簱鏁伴噺澶т簬閫氱煡妗f暟閲廩FInterID=" + FInterI + ",Fnumber=" + Fnumber + "]");
+            }
+        }
+
+        for (LocNormal locNormals:param.getList()) {
+            LocNormal locNormal = locNormalService.selectOne(new EntityWrapper<LocNormal>().eq("id", locNormals.getId()));
+            if (!Cools.isEmpty(locNormal)) {
+                if (locNormal.getAnfme().compareTo(locNormals.getAnfme()) == 1) {
+                    LocNormal logLocNormal = new LocNormal();
+                    logLocNormal.setAnfme(locNormals.getAnfme());
+                    logLocNormal.setMatnr(locNormal.getMatnr());
+                    logLocNormal.setMaktx(locNormal.getMaktx());
+                    logLocNormal.setLgnum(locNormal.getLgnum());
+                    logLocNormal.setType(locNormal.getType());
+                    logLocNormal.setMnemonic(locNormal.getMnemonic());
+                    logLocNormal.setSupplier(locNormal.getSupplier());
+                    logLocNormal.setWarehouse(locNormal.getWarehouse());
+                    logLocNormal.setWarehouseName(locNormal.getWarehouseName());
+                    logLocNormal.setBrand(locNormal.getBrand());
+                    logLocNormal.setAltme(locNormal.getAltme());
+                    logLocNormal.setBname(locNormal.getBname());
+                    logLocNormal.setMemo(locNormal.getMemo());
+                    logLocNormal.setState("2");
+                    // 鐢熸垚鍑哄簱璁板綍
+//                    locNormalService.insert(logLocNormal);
+                    // 鏇存柊鍘熷厛骞充粨璁板綍
+                    locNormalService.updateLocNormal(locNormal.getMatnr(), locNormal.getAnfme().subtract(locNormals.getAnfme()), modiUser, modiTime, locNormal.getId());
+                    // 鐢熸垚骞充粨鍑哄叆搴撹褰�
+                    LocNormalLog locLog = new LocNormalLog();
+                    VersionUtils.setLocNormalLog(locLog, locNormals);
+                    locLog.setAnfme(locNormals.getAnfme().doubleValue());
+                    locLog.setIoType(2);
+                    locLog.setCreateTime(new Date());
+                    locLog.setCreateUser(modiUser);
+                    if (!locNormalLogService.insert(locLog)) {
+                        String logStr = JSON.toJSONString(locLog);
+                        log.info("骞充粨鍑哄簱璁板綍鎻掑叆澶辫触,鏁版嵁:" + logStr);
+                    }
+                } else {
+                    // 鎶婂搴旂墿鏂欏钩浠撳簱瀛樺嚭搴�
+                    locNormalService.outLocNormal(locNormals.getMatnr(), modiUser, modiTime, locNormals.getId());
+                }
+            }
+
+//            Integer FInterI = outStockDanService.queryOutStockFInterID(param.getSupplier()); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
+
+            //鏇存柊ASRS鍑哄簱閫氱煡妗f槑缁嗗嚭搴撴暟閲�
+            Wrapper wrapper = new EntityWrapper<OutStockBillEntry>().eq("FInterID",FInterI).eq("Fnumber",locNormals.getMatnr());
+            OutStockBillEntry outStockBillEntry = outStockDanService.selectOne(wrapper);
+            outStockBillEntry.setFAuxCommitQty(outStockBillEntry.getFAuxCommitQty().add(locNormals.getAnfme()));
+            outStockBillEntry.setFAmount(outStockBillEntry.getFAmount().add(locNormals.getAnfme()));  //鍊熺敤famount瀛楁锛屾帶鍒朵笅鍙戝嚭搴撲换鍔℃暟閲�
+            outStockBillEntry.setFAuxQty(outStockBillEntry.getFAuxQty().subtract(locNormals.getAnfme()));
+            if(!outStockDanService.update(outStockBillEntry,wrapper)){
+                throw new CoolException("鏇存柊鍑哄簱閫氱煡妗f槑缁嗗け璐FInterID="+FInterI+",Fnumber="+locNormals.getMatnr()+"]");
+            }
+
+            // erp涓棿琛ㄦ洿鏂版暟鎹�
+            if (!erpService.incrementCPakOut(FInterI, locNormals.getMatnr(), locNormals.getAnfme().doubleValue(), param.getSupplier())) {
+                log.error("鏇存柊ERP鎴愬搧鍑哄簱鏁版嵁[matnr={},FBillNo={}]澶辫触", locNormals.getMatnr(), param.getSupplier());
+                throw new CoolException("鏇存柊ERP鎴愬搧鍑哄簱鏁版嵁[matnr=" + locNormals.getMatnr() + ",FBillNo=" + param.getSupplier() + "]澶辫触");
+            }
+
+        }
+        return R.ok("骞充粨鍑哄簱鎴愬姛");
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java b/src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java
new file mode 100644
index 0000000..87d0345
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java
@@ -0,0 +1,25 @@
+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.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+@Mapper
+@Repository
+public interface OutStockDanMapper extends BaseMapper<OutStockBillEntry> {
+
+    List<OutStockBillEntry> queryOutStock(Map<String, Object> map);
+
+    Integer queryOutStockCount(Map<String, Object> map);
+
+    List<LocDetl> queryMatWithLoc(String matnr,@Param("mnemonic") String mnemonic);
+
+    List<OutStockBillEntry> queryMatnrWithBillNo(@Param("FBillNo") String fbillNo);
+
+    Integer queryOutStockFInterID(String supplier);
+}
diff --git a/src/main/java/com/zy/asrs/service/LocNormalService.java b/src/main/java/com/zy/asrs/service/LocNormalService.java
index 958cf45..58b8f76 100644
--- a/src/main/java/com/zy/asrs/service/LocNormalService.java
+++ b/src/main/java/com/zy/asrs/service/LocNormalService.java
@@ -38,7 +38,7 @@
 
   public void pdaLocNormalMove(List<LocNormal> list);
 
-  public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic);
+  public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic,String matnr);
 
 
 }
diff --git a/src/main/java/com/zy/asrs/service/OutStockDanService.java b/src/main/java/com/zy/asrs/service/OutStockDanService.java
new file mode 100644
index 0000000..da589b3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/OutStockDanService.java
@@ -0,0 +1,26 @@
+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 org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface OutStockDanService extends IService<OutStockBillEntry> {
+
+    Page<OutStockBillEntry> queryOutStock(Page<OutStockBillEntry> page);
+
+    List<LocDetl> queryMatWithLoc(String fbillNo,String matnr,String mnemonic);
+
+    Integer queryOutStockFInterID(String supplier);
+
+    boolean incrementCPakOut(Integer FInterID, String Fnumber, Double increment, String FBillNo);
+
+    /**
+     * 鍑哄簱浣滀笟
+     */
+    void startupFullTakeStore(StockOutParam param, Long userId);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
index 956cba2..9438b0d 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java
@@ -510,12 +510,16 @@
     }
 
     @Override
-    public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic) {
+    public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic,String matnr) {
         List<OutStockBillEntry> matList = outStockMapper.queryMatnrWithBillNo(fbillNo);
         List<LocNormal> locNormal = new ArrayList<>();
         List<LocNormal> locNormalResult = new ArrayList<>();
         for (Integer i = 0; i < matList.size(); i++) {
-            locNormal = baseMapper.queryLocNorlMatnr(matList.get(i).getFnumber(), mnemonic) ;
+            if(matList.get(i).getFnumber().equals(matnr)){
+                locNormal = baseMapper.queryLocNorlMatnr(matnr, mnemonic);
+            }else {
+                continue;
+            }
             if (locNormal.size() > 0) {
                 for (LocNormal e:locNormal) {
                     LocNormal obj = new LocNormal();
diff --git a/src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java
new file mode 100644
index 0000000..31d53df
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java
@@ -0,0 +1,306 @@
+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.OutStockDanMapper;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.util.*;
+
+@Slf4j
+@Service("outStockDanService")
+public class OutStockDanServiceImpl extends ServiceImpl<OutStockDanMapper, OutStockBillEntry> implements OutStockDanService {
+
+    // 宸ヤ綔鍙风敓鎴愯鍒欓粯璁ょ被鍨�
+    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;
+    @Autowired
+    private LocNormalService locNormalService;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private OutStockDanService outStockDanService;
+
+    @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,String matnr,String mnemonic) {
+
+        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++) {
+            /*鑷姩鏍规嵁鐗╂枡缂栫爜閫夊彇鏈�浼樺嚭璐ч『搴忥紙鍏堣繘鍏堝嚭锛岄潬澶栬揣鐗╁厛鍑猴級*/
+            if(matList.get(i).getFnumber().equals(matnr)){
+                tempLocList = baseMapper.queryMatWithLoc(matList.get(i).getFnumber(),mnemonic);
+            }else {
+                continue;
+            }
+            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;
+//                    }
+                    locList.add(tempLocList.get(j));
+                }
+            }
+        }
+        return locList;
+    }
+
+    @Override
+    public Integer queryOutStockFInterID(String supplier) {
+        return baseMapper.queryOutStockFInterID(supplier);
+    }
+
+    /* 鎴愬搧澧為噺鍑哄簱 */
+    @Override
+    public boolean incrementCPakOut(Integer FInterID, String Fnumber, Double increment, String FBillNo) {
+        String sql = "update OutStockbillEntry set FAuxCommitQty = (FAuxCommitQty + {0,number,#}) where 1=1 and Fnumber = ''{1}'' and FInterID = {2,number,#}";
+        sql = MessageFormat.format(sql, increment, Fnumber, FInterID);
+        if (jdbcTemplate.update(sql) > 0) {
+            sql = "select * from OutStockbillEntry where 1=1 and Fnumber = ''{0}'' and FInterID = {1,number,#}";
+            sql = MessageFormat.format(sql, Fnumber, FInterID);
+            List<OutStockBillEntry> select = this.selectList(new EntityWrapper<OutStockBillEntry>().eq("Fnumber", Fnumber).eq("FInterID", FInterID));
+            OutStockBillEntry outStockBillEntry = select.get(0);
+            boolean complete = false;
+            if (outStockBillEntry.getFQty().compareTo(BigDecimal.ZERO) == 1) {
+                if (outStockBillEntry.getFAuxCommitQty().compareTo(outStockBillEntry.getFQty()) > -1) {
+                    complete = true;
+                }
+            } else {
+                if (outStockBillEntry.getFAuxCommitQty().compareTo(outStockBillEntry.getFAuxQty()) > -1) {
+                    complete = true;
+                }
+            }
+            if (complete) {
+                List<OutStockBillEntry> select1 = this.selectList(new EntityWrapper<OutStockBillEntry>().eq("FInterID", FInterID));
+                if(select1.size()<=1){
+                    if (!completeCPakOut(FBillNo) )  {
+                        log.error("{}鍑哄簱鍗曟爣璁板畬鎴愬け璐�", FBillNo);
+                    }
+                }
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /* 鎴愬搧鍑哄簱鍗曟爣璁板畬鎴� */
+    private boolean completeCPakOut(String FBillNo){
+        String sql = "update OutStockbill set Fflag_finish = 1 where FBillNo = ''{0}''";
+        sql = MessageFormat.format(sql, FBillNo);
+        return jdbcTemplate.update(sql) > 0;
+    }
+
+    @Override
+    @Transactional
+    public void startupFullTakeStore(StockOutParam param, Long userId) {
+        //鍒ゆ柇鍑哄簱鐔熺粌鏄惁澶т簬搴撳瓨鏁伴噺
+        for (StockOutParam.LocDetl detl : param.getLocDetls()) {
+//            LocDetl locDetl = locDetlService.selectById(detl.getLocNo());
+            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",detl.getLocNo()));
+            if(locDetl != null){
+                if(detl.getCount() > locDetl.getAnfme()){
+                    throw new CoolException("鍑哄簱鏁伴噺瓒呰繃浜嗗簱瀛樻暟閲廩locNo=" + detl.getLocNo() + "]");
+                }
+            }
+        }
+        //鍒ゆ柇鍑哄簱鏁伴噺鏄惁澶т簬閫氱煡妗f暟閲�
+        Integer FInterI = outStockDanService.queryOutStockFInterID(param.getFbillNo()); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
+        List<OutStockBillEntry>  entryList = outStockDanService.selectList(new EntityWrapper<OutStockBillEntry>().eq("FInterID",FInterI));
+        for(OutStockBillEntry one : entryList){
+            String Fnumber = one.getFnumber();
+            BigDecimal qty = new BigDecimal(0);
+            for (StockOutParam.LocDetl detl : param.getLocDetls()) {
+                if(detl.getMatnr().equals(Fnumber)){
+                    qty = qty.add(BigDecimal.valueOf(detl.getCount()));
+                }
+            }
+            if(qty.compareTo(one.getFQty()) == 1){
+                throw new CoolException("鍑哄簱鏁伴噺澶т簬閫氱煡妗f暟閲廩FInterID=" + FInterI + ",Fnumber=" + Fnumber + "]");
+            }
+        }
+        // 鐩爣绔欑偣鐘舵�佹娴�
+        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.setBarcode(locMast.getBarcode()); // 鏉$爜
+            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()) {
+                // 濡傛灉涓烘崱鏂欏嚭搴撻渶瑕佸垽鏂墭鐩樼爜鏄惁涓虹┖
+                if (ioType == 103) {
+                    String zpallet = detlDto.getLocDetl().getZpallet();
+                    if (Cools.isEmpty(zpallet)) {
+                        throw new CoolException("鎷f枡鍑哄簱蹇呴』鍚湁鎵樼洏鐮�");
+                    }
+                }
+                // 鍑哄簱鏃讹紝鏁伴噺涓�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.setSupplier(fbillNo);
+                wrkDetl.setMemo(detlDto.getLocDetl().getMemo());
+                if (!wrkDetlService.insert(wrkDetl)) {
+                    throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                }
+
+                //鏇存柊鍑哄簱閫氱煡妗amount瀛楁锛岄槻姝㈤噸澶嶄笅鍙戜换鍔� 2021-09-28 TQS ADD
+                Integer FInterI = outStockDanService.queryOutStockFInterID(fbillNo); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
+                Wrapper wrapper1 = new EntityWrapper<OutStockBillEntry>().eq("FInterID",FInterI).eq("Fnumber",detlDto.getLocDetl().getMatnr());
+                OutStockBillEntry outStockBillEntry = outStockDanService.selectOne(wrapper1);
+                outStockBillEntry.setFAmount(outStockBillEntry.getFAmount().add(BigDecimal.valueOf(anfme)));  //鍊熺敤famount瀛楁锛屾帶鍒朵笅鍙戝嚭搴撲换鍔℃暟閲�
+                outStockBillEntry.setFAuxQty(outStockBillEntry.getFAuxQty().subtract(BigDecimal.valueOf(anfme)));
+                if(!outStockDanService.update(outStockBillEntry,wrapper1)){
+                    throw new CoolException("鏇存柊鍑哄簱閫氱煡妗f槑缁咶Amount澶辫触[FInterID="+FInterI+",Fnumber="+detlDto.getLocDetl().getMatnr()+"]");
+                }
+            }
+            // 淇敼搴撲綅鐘舵��:   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() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+            }
+            ioType=null;
+        }
+        // todo:luxiaotao
+        // 鍚屼竴鍒楃殑鍚屾椂鍑哄簱锛屽垯浼樺厛鍑烘祬搴撲綅
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
index 3eff23f..6bc6046 100644
--- a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
@@ -113,7 +113,7 @@
             }
             if (complete) {
                 List<OutStockBillEntry> select1 = this.selectList(new EntityWrapper<OutStockBillEntry>().eq("FInterID", FInterID));
-               if(select1.size()==1){
+               if(select1.size()<=1){
                     if (!completeCPakOut(FBillNo) )  {
                         log.error("{}鍑哄簱鍗曟爣璁板畬鎴愬け璐�", FBillNo);
                     }
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
index bd7f28d..4a04fc8 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -48,6 +48,8 @@
     private OutStockService outStockService;
     @Autowired
     private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private  OutStockDanService outStockDanService;
 
     @Transactional
     public ReturnT<Exception> start(WrkMast wrkMast) {
@@ -85,12 +87,12 @@
                 List<WrkDetl> wrkDetls = wrkDetlService.selectList(wrapper.eq("wrk_no", wrkMast.getWrkNo()).and().isNotNull("supplier"));
                 for (WrkDetl wrkDetl: wrkDetls) {
                     if (!Cools.isEmpty(wrkDetl)) {
-                        Integer FInterI = outStockService.queryOutStockFInterID(wrkDetl.getSupplier()); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
+                        Integer FInterI = outStockDanService.queryOutStockFInterID(wrkDetl.getSupplier()); // 鑾峰彇鍑哄簱鍗曚富琛ㄤ富閿�
                         if (!Cools.isEmpty(FInterI)) {
                             if (!erpService.incrementCPakOut(FInterI, wrkDetl.getMatnr(),  wrkDetl.getAnfme(), wrkDetl.getSupplier())) {
                                 exceptionHandle("[xtyasrs_dual]鏇存柊ERP鎴愬搧鍑哄簱鏁版嵁[matnr={0},FBillNo={1}]澶辫触", wrkDetl.getMatnr(),wrkDetl.getSupplier());
                             }
-                            if (!outStockService.incrementCPakOut(FInterI, wrkDetl.getMatnr(),  wrkDetl.getAnfme(), wrkDetl.getSupplier())) {
+                            if (!outStockDanService.incrementCPakOut(FInterI, wrkDetl.getMatnr(),  wrkDetl.getAnfme(), wrkDetl.getSupplier())) {
                                 exceptionHandle("[xtyasrs]鏇存柊ERP鎴愬搧鍑哄簱鏁版嵁[matnr={0},FBillNo={1}]澶辫触", wrkDetl.getMatnr(),wrkDetl.getSupplier());
                             }
                         }
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 bdb282e..9f3803f 100644
--- a/src/main/java/com/zy/common/service/erp/ErpService.java
+++ b/src/main/java/com/zy/common/service/erp/ErpService.java
@@ -452,10 +452,10 @@
                     }
                 }
                 if (complete) {
-                    sql = "select * from OutStockbillEntry where 1=1 and FInterID = {1,number,#} and FAuxCommitQty != FQty";
+                    sql = "select * from OutStockbillEntry where 1=1 and FInterID = {1,number,#}";
                     sql = MessageFormat.format(sql, Fnumber, FInterID);
                     List<OutStockBillEntry> select1 = erpSqlServer.select(sql, OutStockBillEntry.class);
-                    if(select1.size()<1){
+                    if(select1.size()<=1){
                         if (!completeCPakOut(FBillNo) ) {
                             log.error("{}鍑哄簱鍗曟爣璁板畬鎴愬け璐�", FBillNo);
                         }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index e44999a..2b912a0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -45,7 +45,7 @@
 erp:
   db:
     driver_class_name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    ur: jdbc:sqlserver://192.168.0.253:1433;databasename=xtyasrs_dual
+    ur: jdbc:sqlserver://localhost:1433;databasename=xtyasrs_dual
     #    ur: jdbc:sqlserver://192.168.4.208:1433;databasename=xtyasrs_dual
     username: sa
     password: sa@123
diff --git a/src/main/resources/mapper/OutStockDanMapper.xml b/src/main/resources/mapper/OutStockDanMapper.xml
new file mode 100644
index 0000000..1e28c93
--- /dev/null
+++ b/src/main/resources/mapper/OutStockDanMapper.xml
@@ -0,0 +1,130 @@
+<?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.OutStockDanMapper">
+
+    <!-- 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="Fname" property="Fname" />
+        <result column="Fmodel" property="Fmodel" />
+        <result column="Fflag_finish" property="FflagFinish" />
+    </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,b.Fflag_finish, a.Fname, a.Fmodel
+        from OutStockBillEntry a left join OutStockBill b on a.FInterID = b.FInterID
+        where 1=1
+        and b.Fflag_finish != 1 and a.FQty > a.FAmount
+        <if test="FSourceBillNo!=null and FSourceBillNo!='' ">
+            and a.FSourceBillNo = #{FSourceBillNo}
+        </if>
+        <if test="FBillNo != null and FBillNo != ''">
+            and b.FBillNo = #{FBillNo}
+        </if>
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    </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
+        and b.Fflag_finish != 1 and a.FQty > a.FAmount
+        <if test="FSourceBillNo!=null and FSourceBillNo!='' ">
+            and a.FSourceBillNo = #{FSourceBillNo}
+        </if>
+        <if test="FBillNo != null and FBillNo != ''">
+            and b.FBillNo = #{FBillNo}
+        </if>
+    </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
+        from OutStockBillEntry a left join OutStockBill b on a.FInterID = b.FInterID
+        where b.FBillNo = #{FBillNo}
+        ) t where 1 = 1
+    </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}
+        <if test="mnemonic != null and mnemonic != ''">
+            and a.mnemonic = #{mnemonic}
+        </if>
+        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>
+
+    <select id="queryOutStockFInterID" resultType="integer">
+        select FInterID from OutStockBill where FBillNo = #{supplier}
+    </select>
+</mapper>
diff --git a/src/main/webapp/static/js/outStockDan/outStockDan.js b/src/main/webapp/static/js/outStockDan/outStockDan.js
new file mode 100644
index 0000000..5fa7dc0
--- /dev/null
+++ b/src/main/webapp/static/js/outStockDan/outStockDan.js
@@ -0,0 +1,168 @@
+var pageCurr;
+var tableMerge;
+var orderData;
+var outStockDetail;
+
+function getCol() {
+    var cols = [];
+    cols.push(
+        {field: 'fbillNo',  align: 'center', title: '鍗曟嵁缂栧彿', width: 150}
+        , {field: 'fsourceBillNo', align: 'center', title: '鐢熶骇鍗曞彿', width: 150}
+        , {field: 'fnumber', align: 'center', title: '鐗╂枡缂栧彿', width: 140}
+        , {field: 'fname', align: 'center', title: '鐗╂枡鍚嶇О'}
+        , {field: 'fmodel', align: 'center', title: '瑙勬牸', width: 200}
+        , {field: 'fentryID', align: 'center', title: '鍒嗗綍鍙�', width: 80}
+        , {field: 'forderInterID', align: 'center', title: '鍗曟嵁缂栧彿', hide: true}
+        , {field: 'fauxQty', align: 'center', title: '鏁伴噺', width: 100}
+        // , {field: 'fcommitQty', align: 'center', title: '鍙戣揣鏁伴噺'}
+        , {field: 'fauxPrice', align: 'center', title: '鍗曚环', width: 100}
+        , {field: 'fdate', align: 'center', title: '鏃ユ湡', hide: true}
+        , {field: 'fnote', align: 'center', title: '澶囨敞', hide: true}
+        , {field: 'fadd', align: 'center', title: '鍦板潃', hide: true}
+        , { title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 160}
+    );
+    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/list1',
+        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: 'outStockDetail1.html',
+                    success: function (layero, index) {
+
+                    }
+                }
+            );
+        }
+        if (layEvent == 'btnNormalOut') {
+            outStockDetail = layer.open(
+                {
+                    type: 2,
+                    title: '骞充粨鍑哄簱-鍗曟嵁缂栧彿[' + orderData.fbillNo + ']',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'outStockNormalDetail1.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/views/outStockDan/outStockDan.html b/src/main/webapp/views/outStockDan/outStockDan.html
new file mode 100644
index 0000000..ae4531d
--- /dev/null
+++ b/src/main/webapp/views/outStockDan/outStockDan.html
@@ -0,0 +1,89 @@
+<!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 class="layui-input-inline">
+                <input class="layui-input" type="text" name="FSourceBillNo" 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>
+    <button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="btnNormalOut">鍑哄钩搴�</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/outStockDan/outStockDan.js"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/outStockDan/outStockDetail1.html b/src/main/webapp/views/outStockDan/outStockDetail1.html
new file mode 100644
index 0000000..d63b1a0
--- /dev/null
+++ b/src/main/webapp/views/outStockDan/outStockDetail1.html
@@ -0,0 +1,226 @@
+<!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 style="padding-top: 8px; padding-left: 8px">
+    <div class="layui-form-item">
+        <div class="layui-input-inline">
+            <input id="mnemonic" placeholder="璇疯緭鍏ョ敓浜у崟鍙�" class="layui-input" lay-verify="mnemonic" autocomplete="off">
+        </div>
+        <div id="data-search-btn" style="display: inline-block; margin: 0" class="layui-btn-container layui-form-item">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit onclick="onSearch1()">鎼滅储</button>
+            <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit onclick="reload1()">閲嶇疆</button>
+        </div>
+    </div>
+
+</div>
+
+<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;
+    var table;
+    var totalQty = parent.getOrderData().fauxQty;
+
+    function getCol() {
+        var cols = [
+            {type: 'checkbox'}
+            ,{field: '', align: 'center', title: '', width: 50, type: 'numbers'}
+            , {field: 'locNo$', align: 'center', title: '搴撲綅鍙�'}
+            , {field: 'matnr', align: 'center',title: '鐗╂枡缂栫爜'}
+            ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О', width: 500}
+            ,{field: 'lgnum', align: 'center',title: '瑙勬牸'}
+            ,{field: 'type', align: 'center',title: '鐗╂枡绫诲埆'}
+            ,{field: 'mnemonic', align: 'center',title: '鐢熶骇鍗曞彿'}
+            ,{field: 'supplier', align: 'center',title: '閫氱煡鍗曞彿'}
+            ,{field: 'anfme', align: 'center',title: '鏁伴噺', edit: 'text', style: 'color: blue; font-weight: bold'}
+            // ,{field: 'altme', align: 'center',title: '鍗曚綅'}
+            ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
+        ];
+        cols.push({field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
+            , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true})
+        return cols;
+    }
+
+    layui.use(['table', 'laydate', 'form'], function () {
+        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/locList1?fbillNo=' + orderData.fbillNo+'&matnr='+orderData.fnumber,
+            // data:{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() {
+        debugger
+        var checkStatus = table.checkStatus('stockOut');
+        var data = checkStatus.data;
+
+        if (data.length == 0) {
+            layer.msg('璇峰厛娣诲姞搴撲綅鐗╂枡');
+            return;
+        } else {
+            var staNo = $("#staNoSelect").val();
+            if (staNo === "" || staNo === null){
+                layer.msg("璇烽�夋嫨鍑哄簱鍙�");
+                return;
+            }
+            var locDetls = [];
+            var outQty=0;
+            data.forEach(function(elem) {
+                if (elem.anfme > 0) {
+                    locDetls.push({locNo: elem.locNo, matnr: elem.matnr, count: elem.anfme});
+                }
+                outQty = outQty + parseInt(elem.anfme);
+            });
+            if(outQty > totalQty){
+                layer.msg("閫夋嫨鍑哄簱鏁伴噺瓒呰繃浜嗛�氱煡鍑哄簱閲�");
+                return;
+            }
+            var obj = {
+                locDetls: locDetls,
+                outSite: staNo,
+                fbillNo: orderData.fbillNo,
+            }
+            // let param = {
+            //     outSite: staNo,
+            //     locDetls: locDetls,
+            //     fbillNo: orderData.fbillNo,
+            // }
+                
+            // 璋冪敤鍑哄簱鎺ュ彛
+            $.ajax({
+                url: baseUrl+"/plate/outStock/start1",
+                headers: {'token': localStorage.getItem('token')},
+                data: JSON.stringify(obj),
+                contentType:'application/json;charset=UTF-8',
+                method: 'POST',
+                success: function (res) {
+                    if (res.code === 200){
+                        parent.closeDetail(res.msg);
+                        parent.tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg)
+                    }
+                }
+            });
+        }
+    }
+    function onSearch1() {
+        var mnemonic = $("#mnemonic").val();
+        locDetlTableIns.reload({
+            where: {
+                mnemonic: mnemonic,
+            }
+        });
+    }
+
+    function reload1() {
+        var mnemonic = ""
+        $("#mnemonic").val(mnemonic);
+        locDetlTableIns.reload({
+            where: {
+                mnemonic: mnemonic,
+            }
+        });
+    }
+    $('body').keydown(function () {
+        if (event.keyCode === 13) {
+            onSearch1();
+        }
+    });
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/outStockDan/outStockNormalDetail1.html b/src/main/webapp/views/outStockDan/outStockNormalDetail1.html
new file mode 100644
index 0000000..86ae3b8
--- /dev/null
+++ b/src/main/webapp/views/outStockDan/outStockNormalDetail1.html
@@ -0,0 +1,204 @@
+<!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 style="padding-top: 8px; padding-left: 8px">
+        <div class="layui-form-item">
+            <div class="layui-input-inline">
+                <input id="mnemonic" placeholder="璇疯緭鍏ョ敓浜у崟鍙�" class="layui-input" lay-verify="mnemonic" autocomplete="off">
+            </div>
+            <div id="data-search-btn" style="display: inline-block; margin: 0" class="layui-btn-container layui-form-item">
+                <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit onclick="onSearch()">鎼滅储</button>
+                <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit onclick="reload()">閲嶇疆</button>
+            </div>
+        </div>
+
+    </div>
+    <div class="layui-form" style="padding-top: 8px; padding-left: 8px">
+        <button style="margin-bottom: 0px" class="layui-btn layui-btn-sm layui-form-item" style="display: inline-block"
+                id="outbound" lay-submit
+                lay-event="outbound" onclick="outbound()">鍚姩鍑哄簱
+        </button>
+    </div>
+    <table class="layui-hide" id="stockOut" lay-filter="stockOut" style="margin-top: 0px"></table>
+</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/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 table;
+    var sourceData = [];
+
+    function getCol() {
+        var cols = [
+            {type: 'checkbox'}
+            , {field: 'warehouseName', align: 'center', title: '搴撳尯鍚嶇О'}
+            , {field: 'warehouse', align: 'center', title: '搴撲綅缂栧彿'}
+            , {field: 'anfme', align: 'center', title: '鏁伴噺', edit: 'text'}
+        ];
+        cols.push.apply(cols, locNormalCols);
+        cols.push({field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
+            , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true})
+        return cols;
+    }
+
+    layui.use(['table', 'laydate', 'form'], function () {
+        table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var layDate = layui.laydate;
+        var form = layui.form;
+        // 鏁版嵁娓叉煋
+        locDetlTableIns = table.render({
+            elem: '#stockOut',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl + '/outStock/query/locNormalList1?fbillNo=' + orderData.fbillNo+'&matnr='+orderData.fnumber,
+            //+'&mnemonic='+orderData.fsourceBillNo
+            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 + "/";
+                }
+                if (res.code === 200) {
+                    locData = res.data;
+                    sourceData = [];
+                    if (res.data && res.data.length > 0) {
+                        res.data.map(function (item) {
+                            var obj = {
+                                anfme: item.anfme,
+                                id: item.id,
+                                matnr: item.matnr,
+                                supplier: item.supplier,
+                                mnemonic: item.mnemonic,
+                                warehouse: item.warehouse,
+                                warehouseName: item.warehouseName,
+                                maktx: item.maktx,
+                                lgnum: item.lgnum,
+                                type: item.type,
+                            }
+                            sourceData.push(obj);
+                        });
+                    }
+                }
+            }
+        });
+
+        // 椤甸潰淇敼
+        table.on('edit(stockOut)', function (obj) {
+            if (obj.field === 'anfme') {
+                if (isNaN(obj.value)) {
+                    layer.msg("璇疯緭鍏ユ暟瀛�");
+                    locDetlTableIns.reload();
+                }
+                // 鍗曞厓鏍肩紪杈戜箣鍓嶇殑鍊艰繘琛屾瘮杈�
+                for (var i = 0; i < sourceData.length; i++) {
+                    if (obj.data.id == sourceData[i].id) {
+                        if (Number(obj.value) > sourceData[i].anfme) {
+                            layer.msg("鏁伴噺涓嶅彲澶т簬搴撳瓨閲�");
+                            locDetlTableIns.reload();
+                        }
+                    }
+                }
+                if (obj.value <= 0) {
+                    layer.msg("鏁伴噺涓嶅彲灏忎簬绛変簬闆�");
+                    locDetlTableIns.reload();
+                }
+            }
+        });
+    });
+
+    /* 鍚姩鍑哄簱 */
+    function outbound() {
+        var checkStatus = table.checkStatus('stockOut');
+        var checkData = checkStatus.data;
+        var obj = {
+            list: checkData,
+            supplier: orderData.fbillNo,
+        }
+        if (checkData.length > 0) {
+            $.ajax({
+                url: baseUrl + "/outStock/locNormal1",
+                headers: {'token': localStorage.getItem('token')},
+                contentType: 'application/json;charset=UTF-8',
+                data: JSON.stringify(obj),
+                method: 'POST',
+                traditional: true,
+                success: function (res) {
+                    if (res.code === 200) {
+                        parent.closeDetail(res.msg);
+                        parent.tableReload();
+                    } else if (res.code === 403) {
+                        top.location.href = baseUrl + "/";
+                    } else {
+                        layer.msg(res.msg)
+                    }
+                }
+            })
+        } else {
+            layer.msg("璇烽�夋嫨闇�瑕佸嚭搴撶墿鏂�");
+            return;
+        }
+    }
+
+    function onSearch() {
+        var mnemonic = $("#mnemonic").val();
+        locDetlTableIns.reload({
+            where: {
+                mnemonic: mnemonic,
+            }
+        });
+    }
+
+    function reload() {
+        var mnemonic = ""
+        $("#mnemonic").val(mnemonic);
+        locDetlTableIns.reload({
+            where: {
+                mnemonic: mnemonic,
+            }
+        });
+    }
+
+    $('body').keydown(function () {
+        if (event.keyCode === 13) {
+            onSearch();
+        }
+    });
+</script>
+</html>
\ No newline at end of file

--
Gitblit v1.9.1