| | |
| | | */ |
| | | @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); |
| | | } |
| | | |
| New file |
| | |
| | | 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("平仓出库成功"); |
| | | } |
| | | } |
| New file |
| | |
| | | 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); |
| | | } |
| | |
| | | |
| | | public void pdaLocNormalMove(List<LocNormal> list); |
| | | |
| | | public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic); |
| | | public List<LocNormal> queryLocNorlMatnr(String fbillNo, String mnemonic,String matnr); |
| | | |
| | | |
| | | } |
| New file |
| | |
| | | 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); |
| | | } |
| | |
| | | } |
| | | |
| | | @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(); |
| New file |
| | |
| | | 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 |
| | | // 同一列的同时出库,则优先出浅库位 |
| | | } |
| | | |
| | | } |
| | |
| | | } |
| | | 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); |
| | | } |
| | |
| | | private OutStockService outStockService; |
| | | @Autowired |
| | | private JdbcTemplate jdbcTemplate; |
| | | @Autowired |
| | | private OutStockDanService outStockDanService; |
| | | |
| | | @Transactional |
| | | public ReturnT<Exception> start(WrkMast wrkMast) { |
| | |
| | | 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()); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | 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); |
| | | } |
| | |
| | | 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 |
| New file |
| | |
| | | <?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> |
| New file |
| | |
| | | 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(); |
| | | } |
| | | }); |
| New file |
| | |
| | | <!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> |
| | | |
| | | <!--<!– 日期范围 –>--> |
| | | <!--<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> |
| | | |
| New file |
| | |
| | | <!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> |
| New file |
| | |
| | | <!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> |