src/main/java/com/zy/asrs/controller/MobileController.java
@@ -59,6 +59,8 @@ private CommonService commonService; @Autowired private MatService matService; @Autowired private BomMatService bomMatService; // 商品上架 @RequestMapping("/mat/onSale/auth") @@ -111,6 +113,46 @@ return R.ok("组托成功"); } @RequestMapping("/comb/auth2") @ManagerAuth(memo = "组托") public R comb2(@RequestBody CombParam combParam){ mobileService.comb2(combParam, getUserId()); return R.ok("组托成功"); } @RequestMapping("/comb/checkBom") @ManagerAuth(memo = "校验Bom") public R checkBom(@RequestBody CheckBom checkBom){ BomMat bomMat = new BomMat(); // 没有输入bom号正常组托 if (Cools.isEmpty(checkBom.getBomCode())) { return R.ok(); } if (Cools.isEmpty(checkBom.getMatnr())) { return R.ok().add(bomMat); } else { // 检查是否在bom清单内 bomMat = bomMatService.selectOne(new EntityWrapper<BomMat>().eq("unit_num", checkBom.getBomCode()).eq("element_num", checkBom.getMatnr())); if (Cools.isEmpty(bomMat)) { throw new CoolException("当前物料" + checkBom.getMatnr() + "不在Bom清单内"); } else { // 检查库存中是否有当前bom的物料 Double bomQyt = locDetlService.getBomQyt(checkBom.getBomCode(), checkBom.getMatnr()); if (!Cools.isEmpty(bomQyt)) { bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQyt); } Double bomQty = wrkDetlService.getBomQty(checkBom.getBomCode(), checkBom.getMatnr()); if (!Cools.isEmpty(bomQty)) { bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQty); } // 检查工作档中是否有当前bom的物料 } } return R.ok().add(bomMat); } @RequestMapping("/pack/get/auth") @ManagerAuth public R packGet(@RequestParam String barcode){ src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -158,6 +158,10 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value= "bom号") @TableField("bom_code") private String bomCode; public String getLocNo$(){ LocMastService service = SpringUtils.getBean(LocMastService.class); LocMast locMast = service.selectById(this.locNo); src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -160,6 +160,10 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value= "bom号") @TableField("bom_code") private String bomCode; public String getBeBatch$(){ if (null == this.beBatch){ return null; } switch (this.beBatch){ src/main/java/com/zy/asrs/entity/WaitPakinLog.java
@@ -152,6 +152,10 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value= "bom号") @TableField("bom_code") private String bomCode; public String getBeBatch$(){ if (null == this.beBatch){ return null; } switch (this.beBatch){ src/main/java/com/zy/asrs/entity/WrkDetl.java
@@ -270,6 +270,10 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value= "bom号") @TableField("bom_code") private String bomCode; public String getIoTime$(){ if (Cools.isEmpty(this.ioTime)){ return ""; src/main/java/com/zy/asrs/entity/WrkDetlLog.java
@@ -271,6 +271,10 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value= "bom号") @TableField("bom_code") private String bomCode; public String getIoTime$(){ if (Cools.isEmpty(this.ioTime)){ return ""; src/main/java/com/zy/asrs/entity/param/CheckBom.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class CheckBom { // bom号 private String bomCode; // 物料号 private String matnr; } src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -10,6 +10,9 @@ @Data public class CombParam { // bom号 private String bomCode; // 单据编号 private String orderNo; src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -67,4 +67,5 @@ Double selectLocDetlSumQty(String locNo); Double getBomQyt(String bomCode,String matnr); } src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
@@ -23,4 +23,6 @@ int updateInspect( @Param("wrkNo")Integer wrkNo, @Param("matnr")String matnr, @Param("batch")String batch); List<WrkDetl> selectPakoutQuery(@Param("staNo")Integer staNo, @Param("matnr")String matnr); Double getBomQty(String bomCode,String matnr); } src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -55,4 +55,6 @@ List<LocDetl> unreason(); Double getLocDetlSumQty(String locNo); Double getBomQyt(String bomCode,String matnr); } src/main/java/com/zy/asrs/service/MobileService.java
@@ -5,6 +5,7 @@ import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.LocDetl; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.param.CheckBom; import com.zy.asrs.entity.param.CombParam; import com.zy.asrs.entity.param.MobileAdjustParam; import com.zy.asrs.entity.param.OffSaleParam; @@ -19,6 +20,16 @@ void comb(CombParam param, Long userId); /** * 组托 */ void comb2(CombParam param, Long userId); /** * 校验bom */ R checkBom(CheckBom param, Long userId); /** * 上架 */ void onSale(CombParam param); src/main/java/com/zy/asrs/service/WrkDetlService.java
@@ -23,4 +23,6 @@ List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr); Double getBomQty(String bomCode,String matnr); } src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -116,4 +116,9 @@ public Double getLocDetlSumQty(String locNo) { return this.baseMapper.selectLocDetlSumQty(locNo); } @Override public Double getBomQyt(String bomCode,String matnr) { return this.baseMapper.getBomQyt(bomCode,matnr); } } src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -10,6 +10,7 @@ import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.CheckBom; import com.zy.asrs.entity.param.CombParam; import com.zy.asrs.entity.param.MobileAdjustParam; import com.zy.asrs.entity.param.OffSaleParam; @@ -78,6 +79,9 @@ private DocTypeService docTypeService; @Autowired private MatV2Service matV2Service; @Autowired private BomMatService bomMatService; @Override @Transactional public void comb(CombParam param, Long userId) { @@ -220,6 +224,178 @@ } @Override @Transactional public void comb2(CombParam param, Long userId) { if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) { throw new CoolException(BaseRes.PARAM); } if(param.getCombMats().stream().anyMatch(obj -> obj.getAnfme() == null)){ throw new CoolException("入库物料数量不能为空"); } // 判断是否有相同条码的数据 if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>(). eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) { throw new CoolException(param.getBarcode() + "数据正在进行入库"); } int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode())); WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode()); if (wrkMast != null && wrkMast.getIoType() < 100){ throw new CoolException("工作档/库存条码数据已存在===>>" + param.getBarcode()); } if (countLoc > 0 ) { throw new CoolException("工作档/库存条码数据已存在===>>" + param.getBarcode()); } //设置非null批号, for (CombParam.CombMat combMat : param.getCombMats()) { if (combMat.getBatch() == null){ combMat.setBatch(""); } } Date now = new Date(); // 无单组托 if (Cools.isEmpty(param.getCombMats().get(0).getOrderNo())) { // 生成入库通知档 List<DetlDto> detlDtos = new ArrayList<>(); param.getCombMats().forEach(elem -> { DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme()); if (DetlDto.has(detlDtos, detlDto)) { DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch()); assert one != null; one.setAnfme(one.getAnfme() + detlDto.getAnfme()); } else { detlDtos.add(detlDto); } }); for (DetlDto detlDto : detlDtos) { Mat mat = matService.selectByMatnr(detlDto.getMatnr()); WaitPakin waitPakin = new WaitPakin(); if (Cools.isEmpty(mat)) { MatV2 matV2 = matV2Service.selectOne(new EntityWrapper<MatV2>().eq("matnr", detlDto.getMatnr())); if(Cools.isEmpty(matV2)){ throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); } waitPakin.sync(matV2); waitPakin.setBrand("组件"); } else { waitPakin.sync(mat); } // 校验是否为bom入库 bom入库的数量不能超过库存原有数量 if (!Cools.isEmpty(param.getBomCode())) { BomMat bomMat = bomMatService.selectOne(new EntityWrapper<BomMat>().eq("unit_num", param.getBomCode()).eq("element_num", detlDto.getMatnr())); Double bomQyt = locDetlService.getBomQyt(param.getBomCode(), detlDto.getMatnr()); if (!Cools.isEmpty(bomQyt)) { bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQyt); } Double bomQty = wrkDetlService.getBomQty(param.getBomCode(), detlDto.getMatnr()); if (!Cools.isEmpty(bomQty)) { bomMat.setZpalletAnfme(bomMat.getZpalletAnfme() - bomQty); } if (bomMat.getZpalletAnfme() == 0.0D) { throw new CoolException(detlDto.getMatnr() + "当前物料已入最大数量"); } else { if (bomMat.getZpalletAnfme() < detlDto.getAnfme()) { throw new CoolException(detlDto.getMatnr() + "当前物料最多可入" + bomMat.getZpalletAnfme() + "件"); } } } waitPakin.setBatch(detlDto.getBatch()); waitPakin.setZpallet(param.getBarcode()); // 托盘码 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAnfme(detlDto.getAnfme()); // 数量 waitPakin.setStatus("Y"); // 状态 waitPakin.setAppeUser(userId); waitPakin.setBomCode(param.getBomCode()); waitPakin.setAppeTime(now); waitPakin.setModiUser(userId); waitPakin.setModiTime(now); if (!waitPakinService.insert(waitPakin)) { throw new CoolException("保存入库通知档失败"); } } // 关联组托 } else { for (CombParam.CombMat combMat : param.getCombMats()) { // 生成入库通知档 Order order = orderService.selectByNo(combMat.getOrderNo()); //判断订单类型是否是入库 DocType docType=docTypeService.selectById(order.getDocType()); if(docType.getPakin()!=1 || docType.getStatus()!=1){ throw new CoolException("订单为出库订单,不能组托!"); } if (order.getSettle() > 2) { throw new CoolException("单据编号已过期"); } OrderDetl orderDetl = orderDetlService.selectItem(combMat.getOrderNo(), combMat.getMatnr(), combMat.getBatch()); if (orderDetl == null) { throw new CoolException("找不到组托的单据明细"); } //订单数-工作中的数量-组托数量 if ( orderDetl.getAnfme() - orderDetl.getWorkQty() - combMat.getAnfme()<0) { throw new CoolException("组托数量已超出订单需求量,请检查是否有其他的组托已完成"); } // 修改订单作业数量 if (!orderDetlService.increaseWorkQty(order.getId(), combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme())) { throw new CoolException("修改单据作业数量失败"); } Mat mat = matService.selectByMatnr(combMat.getMatnr()); if (Cools.isEmpty(mat)) { throw new CoolException(combMat.getMatnr() + "商品档案不存在"); } WaitPakin waitPakin = new WaitPakin(); waitPakin.sync(mat); waitPakin.setOrderNo(order.getOrderNo()); // 单据编号 waitPakin.setBatch(combMat.getBatch()); // 序列码 waitPakin.setZpallet(param.getBarcode()); // 托盘码 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAnfme(combMat.getAnfme()); // 数量 waitPakin.setStatus("Y"); // 状态 waitPakin.setAppeUser(userId); waitPakin.setAppeTime(now); waitPakin.setBomCode(param.getBomCode()); waitPakin.setModiUser(userId); waitPakin.setModiTime(now); if (!waitPakinService.insert(waitPakin)) { throw new CoolException("保存入库通知档失败"); } // DetlDto detlDto = new DetlDto(combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme()); // if (DetlDto.has(detlDtos, detlDto)) { // DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch()); // assert one != null; // one.setAnfme(one.getAnfme() + detlDto.getAnfme()); // } else { // } orderService.updateSettle(order.getId(), 2L, userId); } } } @Override @Transactional public R checkBom(CheckBom param, Long userId) { return R.ok(); } // 商品上架 @Override public void onSale(CombParam param) { src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -835,7 +835,6 @@ locDetl.sync(mat); locDetl.setZpallet(zpallet); locDetl.setBatch(adjust.getBatch()); locDetl.setBarcode(locDetls.get(0).getBarcode()); locDetl.setLocNo(locMast.getLocNo()); locDetl.setAnfme(adjust.getCount()); // 数量 locDetl.setModiUser(userId); // 操作人员信息 src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
@@ -111,4 +111,9 @@ public List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr) { return this.baseMapper.selectPakoutQuery(staNo, matnr); } @Override public Double getBomQty(String bomCode,String matnr) { return this.baseMapper.getBomQty(bomCode,matnr); } } src/main/resources/mapper/LocDetlMapper.xml
@@ -327,5 +327,12 @@ where loc_no=#{locNo} </select> <select id="getBomQyt" resultType="double"> select SUM(anfme) anfme from asr_loc_detl where bom_code = #{bomCode} and matnr = #{matnr} </select> </mapper> src/main/resources/mapper/WaitPakinMapper.xml
@@ -47,6 +47,7 @@ <result column="appe_time" property="appeTime" /> <result column="appe_user" property="appeUser" /> <result column="memo" property="memo" /> <result column="bom_code" property="bomCode" /> </resultMap> </mapper> src/main/resources/mapper/WrkDetlMapper.xml
@@ -45,6 +45,7 @@ <result column="appe_user" property="appeUser" /> <result column="appe_time" property="appeTime" /> <result column="memo" property="memo" /> <result column="bom_code" property="bomCode" /> </resultMap> <sql id="batchSeq"> @@ -108,4 +109,11 @@ and awd.matnr + '-' + awd.batch = #{matnr} </select> <select id="getBomQty" resultType="double"> select SUM(anfme) anfme from asr_wrk_detl where bom_code = #{bomCode} and matnr = #{matnr} </select> </mapper> src/main/webapp/static/image/logo1.png
src/main/webapp/static/image/logo2.png
src/main/webapp/views/index.html
@@ -26,7 +26,7 @@ <!-- 头部 --> <div class="layui-header"> <div class="layui-logo"> <img src="../static/image/logo.png" style="display: inline-block; width: 40%;height: auto"> <img src="../static/image/logo2.png" style="display: inline-block; width: 40%;height: auto"> <!-- <span style="margin-top: 0; letter-spacing: 10px">中扬立库</span>--> <!-- <img src="../static/image/logo.svg"/>--> <!-- <cite>中扬 - Zoneyung</cite>--> src/main/webapp/views/login.html
@@ -53,7 +53,7 @@ z-index: 100; top: 22px; left: 20px;"> <img src="../static/image/logo.png" alt="" style="width: 20%"> <img src="../static/image/logo2.png" alt="" style="width: 20%"> </div> <div class="p-sketch-outline"> <h2 class="p-sketch-outline__title">Automatic Storage and Retrieval System</h2> @@ -67,8 +67,8 @@ <div id="sidebar"> <div class="login-contain"> <div class="login-box"> <img src="../static/image/logo.png" alt="" style="width: 80%"> <span class="login100-form-title p-t-20 p-b-45">中扬立库</span> <img src="../static/image/logo1.png" alt="" style="width: 80%"> <!--<span class="login100-form-title p-t-20 p-b-45">中扬立库</span>--> <span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">WMS</span> <div class="wrap-input100 validate-input m-b-10" data-validate="请输入用户名"> <input id="username" class="input100" type="text" name="username" placeholder="username" autocomplete="off">