#
wang..123
2022-03-15 41ce33ca359ca6f78fa76a5352d76447424158e1
#
9个文件已添加
7个文件已修改
1390 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OutStockController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutStockDanController.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocNormalService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OutStockDanService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocNormalServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/erp/ErpService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OutStockDanMapper.xml 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/outStockDan/outStockDan.js 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/outStockDan/outStockDan.html 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/outStockDan/outStockDetail1.html 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/outStockDan/outStockNormalDetail1.html 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
src/main/java/com/zy/asrs/controller/OutStockDanController.java
New file
@@ -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("出库数量大于通知档数量[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出库通知档明细出库数量
            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("更新出库通知档明细失败[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("平仓出库成功");
    }
}
src/main/java/com/zy/asrs/mapper/OutStockDanMapper.java
New file
@@ -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);
}
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);
}
src/main/java/com/zy/asrs/service/OutStockDanService.java
New file
@@ -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);
}
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();
src/main/java/com/zy/asrs/service/impl/OutStockDanServiceImpl.java
New file
@@ -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() + "]");
                }
            }
        }
        //判断出库数量是否大于通知档数量
        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("出库数量大于通知档数量[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.拣料出库
            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"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            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("保存工作档失败,出库库位号:"+dto.getLocNo());
            }
            // 生成工作档明细
            for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
                // 如果为捡料出库需要判断托盘码是否为空
                if (ioType == 103) {
                    String zpallet = detlDto.getLocDetl().getZpallet();
                    if (Cools.isEmpty(zpallet)) {
                        throw new CoolException("拣料出库必须含有托盘码");
                    }
                }
                // 出库时,数量为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("保存工作档明细失败");
                }
                //更新出库通知档Famount字段,防止重复下发任务 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("更新出库通知档明细FAmount失败[FInterID="+FInterI+",Fnumber="+detlDto.getLocDetl().getMatnr()+"]");
                }
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            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
        // 同一列的同时出库,则优先出浅库位
    }
}
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);
                    }
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());
                            }
                        }
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);
                        }
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
src/main/resources/mapper/OutStockDanMapper.xml
New file
@@ -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>
src/main/webapp/static/js/outStockDan/outStockDan.js
New file
@@ -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();
    }
});
src/main/webapp/views/outStockDan/outStockDan.html
New file
@@ -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>
src/main/webapp/views/outStockDan/outStockDetail1.html
New file
@@ -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">出库口:</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>
src/main/webapp/views/outStockDan/outStockNormalDetail1.html
New file
@@ -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>