From 426f307e9671ae076d99f0a7b9227fc4a6d60fda Mon Sep 17 00:00:00 2001
From: 王佳豪 <g675230687@126.com>
Date: 星期二, 23 三月 2021 10:36:38 +0800
Subject: [PATCH] 1.0.3 erp出库-发货通知功能完成

---
 src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java |    8 
 src/main/java/com/zy/asrs/service/OutStockService.java                |    9 
 src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java       |  182 ++++++++++++++++++
 src/main/java/com/zy/asrs/entity/param/StockOutParam.java             |   11 +
 src/main/java/com/zy/asrs/mapper/OutStockMapper.java                  |    5 
 src/main/webapp/views/pakStore/outStockDetail.html                    |  159 +++++++++++++++
 src/main/java/com/zy/asrs/controller/OutStockController.java          |   33 +++
 src/main/webapp/static/js/pakStore/outStock.js                        |   61 ++++-
 src/main/resources/mapper/OutStockMapper.xml                          |   73 ++++++
 src/main/webapp/views/pakStore/outStock.html                          |   10 
 10 files changed, 520 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OutStockController.java b/src/main/java/com/zy/asrs/controller/OutStockController.java
index 147213a..7d982c9 100644
--- a/src/main/java/com/zy/asrs/controller/OutStockController.java
+++ b/src/main/java/com/zy/asrs/controller/OutStockController.java
@@ -4,14 +4,19 @@
 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
@@ -19,7 +24,16 @@
 
     @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,
@@ -27,4 +41,23 @@
                           @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/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/OutStockMapper.java b/src/main/java/com/zy/asrs/mapper/OutStockMapper.java
index 789894e..60d596d 100644
--- a/src/main/java/com/zy/asrs/mapper/OutStockMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/OutStockMapper.java
@@ -1,6 +1,7 @@
 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;
@@ -14,4 +15,8 @@
     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/OutStockService.java b/src/main/java/com/zy/asrs/service/OutStockService.java
index 611ac95..4876502 100644
--- a/src/main/java/com/zy/asrs/service/OutStockService.java
+++ b/src/main/java/com/zy/asrs/service/OutStockService.java
@@ -2,6 +2,8 @@
 
 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;
@@ -10,4 +12,11 @@
 
 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/OutStockServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
index 55965d5..81bf09b 100644
--- a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
@@ -1,18 +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.OutStockService;
+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/common/service/erp/entity/OutStockBillEntry.java b/src/main/java/com/zy/common/service/erp/entity/OutStockBillEntry.java
index 1f358df..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
@@ -11,6 +11,8 @@
  */
 @Data
 public class OutStockBillEntry {
+    /* 璁㈠崟鐘舵�侊紝鍑哄簱涓垨宸插嚭搴� */
+    private Integer workRecord;
     /*鍗曟嵁缂栧彿-OutStockBill琛ㄦ暟鎹� */
     private String FBillNo;
     /*鍦板潃-OutStockBill琛ㄦ暟鎹�*/
@@ -93,7 +95,7 @@
     private Integer FSourceTranType;
 
     private Integer FSourceInterId;
-
+    /*鐢熶骇鍗曞彿*/
     private String FSourceBillNo;
 
     private Integer FContractInterID;
@@ -129,8 +131,8 @@
     private String Fmodel;
 
     private String Fname;
-
-    private String Fnumber;
+    /*鐗╂枡缂栫爜(浜у搧浠g爜)*/
+    private String FNumber;
 
     private String FBarCode;
 
diff --git a/src/main/resources/mapper/OutStockMapper.xml b/src/main/resources/mapper/OutStockMapper.xml
index d4c259a..8b61c42 100644
--- a/src/main/resources/mapper/OutStockMapper.xml
+++ b/src/main/resources/mapper/OutStockMapper.xml
@@ -2,7 +2,7 @@
 <!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"/>
@@ -13,8 +13,34 @@
         <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">
@@ -27,11 +53,15 @@
         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, b.FBillNo, b.FAdd
+        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
-        <include refid="stockOutCondition"></include>
-        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+        <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">
@@ -41,4 +71,39 @@
         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/js/pakStore/outStock.js b/src/main/webapp/static/js/pakStore/outStock.js
index 556ff58..0725dfd 100644
--- a/src/main/webapp/static/js/pakStore/outStock.js
+++ b/src/main/webapp/static/js/pakStore/outStock.js
@@ -1,11 +1,13 @@
 var pageCurr;
 var tableMerge;
+var orderData;
+var outStockDetail;
 
 function getCol() {
     var cols = [];
     cols.push(
         {field: 'fbillNo', merge: true, align: 'center', title: '鍗曟嵁缂栧彿'}
-        , {field: 'fadd', align: 'center', title: '鍦板潃'}
+        , {field: 'fnumber', align: 'center', title: '鐗╂枡缂栧彿'}
         , {field: 'fentryID', align: 'center', title: '鍒嗗綍鍙�'}
         , {field: 'forderInterID', align: 'center', title: '閿�鍞鍗曞崟鍙�'}
         , {field: 'fauxQty', align: 'center', title: '鏁伴噺'}
@@ -13,7 +15,8 @@
         , {field: 'fauxPrice', align: 'center', title: '鍗曚环'}
         , {field: 'fdate', align: 'center', title: '鏃ユ湡'}
         , {field: 'fnote', align: 'center', title: '澶囨敞'}
-        , {fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80}
+        , {field: 'fadd', align: 'center', title: '鍦板潃'}
+        , {fixed: 'right', merge: ['fbillNo'], title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 80}
     );
     return cols;
 }
@@ -25,13 +28,13 @@
     var layDate = layui.laydate;
     var form = layui.form;
     var upload = layui.upload;
-    tableMerge = layui.tableMerge
+    tableMerge = layui.tableMerge;
 
     // 鏁版嵁娓叉煋
     tableIns = table.render({
         elem: '#salesOrder',
         headers: {token: localStorage.getItem('token')},
-        url: baseUrl+'/outStock/query/list',
+        url: baseUrl + '/outStock/query/list',
         page: true,
         limit: 16,
         limits: [16, 50, 100, 200, 500],
@@ -54,12 +57,12 @@
         response: {
             statusCode: 200
         },
-        done: function(res, curr, count) {
+        done: function (res, curr, count) {
             if (res.code === 403) {
-                top.location.href = baseUrl+"/";
+                top.location.href = baseUrl + "/";
             }
-            pageCurr=curr;
-            tableMerge.render(this)
+            pageCurr = curr;
+            layui.tableMerge.render(this);
         }
     });
 
@@ -83,7 +86,33 @@
         , 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) {
@@ -102,21 +131,17 @@
                 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);
             tableMerge.render(this);
         }
     });
 }
 
+/* 鍏抽棴鏄庣粏 */
+function closeDetail(msg) {
+    layer.close(outStockDetail);
+    layer.msg(msg);
+}
+
 /* 鐩戝惉鍥炶溅浜嬩欢 */
 $('body').keydown(function () {
     if (event.keyCode === 13) {
diff --git a/src/main/webapp/views/pakStore/outStock.html b/src/main/webapp/views/pakStore/outStock.html
index 9d040ee..c58e3df 100644
--- a/src/main/webapp/views/pakStore/outStock.html
+++ b/src/main/webapp/views/pakStore/outStock.html
@@ -41,15 +41,15 @@
     <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="condition" placeholder="璇疯緭鍏ュ崟鎹紪鍙�" autocomplete="off">
+                <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 class="layui-input-inline">-->
+        <!--<input class="layui-input layui-laydate-range" name="orderTime" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">-->
+        <!--</div>-->
         <!--</div>-->
 
 
@@ -69,7 +69,7 @@
 </div>
 
 <script type="text/html" id="operate">
-    <button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="btnPrint">鎿嶄綔</button>
+    <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>
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

--
Gitblit v1.9.1