package com.ruoyi.pda.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace; import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService; import com.ruoyi.bas.containerDetails.domain.BasContainerDetails; import com.ruoyi.bas.containerDetails.service.IBasContainerDetailsService; import com.ruoyi.check.commit.domain.CheckCommitRecord; import com.ruoyi.check.commit.service.ICheckCommitRecordService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.job.mydojob.domain.MydoJob; import com.ruoyi.job.mydojob.service.IMydoJobService; import com.ruoyi.job.mydojobdetail.domain.MydoJobDetail; import com.ruoyi.job.mydojobdetail.service.IMydoJobDetailService; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.in.stockin.service.IInStockinService; import com.ruoyi.in.stockindetail.domain.InStockinDetail; import com.ruoyi.in.stockindetail.service.IInStockinDetailService; import com.ruoyi.out.outStockout.domain.OutStockout; import com.ruoyi.out.outStockout.service.IOutStockoutService; import com.ruoyi.out.outStockoutDetail.domain.OutStockoutDetail; import com.ruoyi.out.outStockoutDetail.service.IOutStockoutDetailService; import com.ruoyi.pda.domain.TrayCodeMakeSure; import com.ruoyi.pda.domain.TrayCodeMsg; import com.ruoyi.pda.mapper.PdaMapper; import com.ruoyi.pda.trayMsg.domain.TrayMsg; import com.ruoyi.pda.trayMsg.service.ITrayMsgService; import com.ruoyi.system.service.ISysRoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @Service public class PdaServiceImp implements PdaService { @Autowired private PdaMapper pdaMapper; @Autowired private IBasCargoSpaceService basCargoSpaceService; @Autowired private IMydoJobDetailService mydoJobDetailService; ; @Autowired private IMydoJobService mydoJobService; ; @Autowired ISysRoleService sysRoleService; @Autowired IInStockinDetailService inStockinDetailService; @Autowired ITrayMsgService trayMsgService; @Autowired private IBasContainerDetailsService basContainerDetailsService; @Autowired private ICheckCommitRecordService checkCommitRecordService; @Autowired private IOutStockoutService outStockoutService; @Autowired private IOutStockoutDetailService outStockoutDetailService; /** * 空托盘入库 * * @param trayCodeMsg * @return */ @Override public AjaxResult emptyTrayIn(TrayCodeMsg trayCodeMsg) { HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMsg.getTrayCode()); map.put("v_warehouse_id", trayCodeMsg.getWarehouseId()); map.put("v_quantity", "1"); map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId()); pdaMapper.emptyTrayIn(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.error(map.get("v_resultmsg").toString()); } } /** * 空料箱入库 * * @param trayCodeMsg * @return */ @Override public AjaxResult emptyBoxIn(TrayCodeMsg trayCodeMsg) { HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMsg.getTrayCode()); map.put("v_warehouse_id", trayCodeMsg.getWarehouseId()); map.put("v_entrance_id", trayCodeMsg.getEntranceId()); pdaMapper.emptyBoxIn(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.error(map.get("v_resultmsg").toString()); } } @Override public AjaxResult emptyTrayOut(TrayCodeMsg trayCodeMsg) { HashMap map = new HashMap<>(); map.put("v_warehouse_id", trayCodeMsg.getWarehouseId()); map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId()); map.put("v_exit_id", trayCodeMsg.getExitId()); pdaMapper.emptyTrayOut(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } @Override public AjaxResult emptyBoxOut(TrayCodeMsg trayCodeMsg) { HashMap map = new HashMap<>(); map.put("v_warehouse_id", trayCodeMsg.getWarehouseId()); map.put("v_exit_id", trayCodeMsg.getExitId()); pdaMapper.emptyBoxOut(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } @Override public AjaxResult bindTrayMsg(TrayCodeMsg trayCodeMsg) { //判断用户的仓库权限 InStockinDetail inStockinDetail1 = new InStockinDetail(); inStockinDetail1.setStockinDetailId(trayCodeMsg.getStockinDetailId()); InStockinDetail inStockinDetail = inStockinDetailService.selectStockinByDetailById(inStockinDetail1); if (inStockinDetail == null) { return AjaxResult.warn("此用户无权限操作该仓库物料,或物料不存在"); } //判断与已绑定物料是否为同一仓库 TrayMsg trayMsg = new TrayMsg(); trayMsg.setTrayCode(trayCodeMsg.getTrayCode()); List trayMsgs = trayMsgService.selectTrayMsgList(trayMsg); if (trayMsgs.size() > 0) { // InStockinDetail inStockinDetail = inStockinDetailService.selectStockinByDetailById(trayCodeMsg.getStockinDetailId()); if (!trayMsgs.get(0).getWarehouseId().equals(inStockinDetail.getWarehouseId())) { return AjaxResult.warn("同一托盘不能绑定不同仓库的物料"); } } HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMsg.getTrayCode()); map.put("v_stockin_detail_id", trayCodeMsg.getStockinDetailId()); map.put("v_quantity", Integer.parseInt(trayCodeMsg.getInQuantity())); pdaMapper.bindTrayMsg(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } @Override public AjaxResult addInJob(TrayCodeMsg trayCodeMsg) { HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMsg.getTrayCode()); // map.put("v_warehouse_id", trayCodeMsg.getWarehouseId()); map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId()); pdaMapper.addInJob(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult outMakeSure(TrayCodeMakeSure trayCodeMakeSure) { List mydoJobDetailList = trayCodeMakeSure.getMydoJobDetailList(); if(CollUtil.isEmpty(mydoJobDetailList)){ return AjaxResult.warn("拣选的物料不能为空"); } //判断任务是否存在 MydoJob mydoJobParam = new MydoJob(); mydoJobParam.setTrayCode(trayCodeMakeSure.getTrayCode()); List mydoJobList = mydoJobService.selectMydoJobList(mydoJobParam); if (CollUtil.isEmpty(mydoJobList)) { return AjaxResult.warn("任务不存在"); } MydoJobDetail mydoJobDetailParam = new MydoJobDetail(); mydoJobDetailParam.setJobId(mydoJobList.get(0).getJobId()); List mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam); if (CollUtil.isEmpty(mydoJobDetails)) { return AjaxResult.warn("子任务不存在"); } //获取单据类型 OutStockout outStockoutParam = new OutStockout(); outStockoutParam.setStockoutId(mydoJobDetails.get(0).getInOrOutId()); List outStockouts = outStockoutService.selectOutStockoutList(outStockoutParam); if (CollUtil.isEmpty(outStockouts)) { return AjaxResult.warn("单据不存在"); } String billType = outStockouts.get(0).getOutType(); switch (billType) { case "1": //销售单据 return handleOutType1(trayCodeMakeSure,mydoJobDetailList,mydoJobList.get(0)); case "2": //退货单据 不绑定容器 return handleOutType2(trayCodeMakeSure,mydoJobDetailList,mydoJobList.get(0)); default: return AjaxResult.warn("单据类型错误"); } } /** * 处理退货出库 * @param trayCodeMakeSure * @param mydoJobDetailList * @param mydoJob * @return */ private AjaxResult handleOutType2(TrayCodeMakeSure trayCodeMakeSure,List mydoJobDetailList,MydoJob mydoJob) { //修改拣选数量 for (MydoJobDetail mydoJobDetail : mydoJobDetailList) { MydoJobDetail mydoJobDetailOld = mydoJobDetailService.selectMydoJobDetailByJobDetailId(mydoJobDetail.getJobDetailId()); BigDecimal oldPickQuantity = Convert.toBigDecimal(mydoJobDetailOld.getPickQuantity()); BigDecimal newPickQuantity = Convert.toBigDecimal(mydoJobDetail.getPickQuantity()); mydoJobDetailOld.setPickQuantity(oldPickQuantity.add(newPickQuantity).toString()); mydoJobDetailService.updateMydoJobDetail(mydoJobDetailOld); } //判断拣选数量是否等于出库数量 MydoJobDetail mydoJobDetailParam = new MydoJobDetail(); mydoJobDetailParam.setJobId(mydoJob.getJobId()); List currentMydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam); boolean flag = currentMydoJobDetails.stream().allMatch(mydoJobDetail -> mydoJobDetail.getPickQuantity().equals(mydoJobDetail.getOutQuantity())); if (flag) { HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMakeSure.getTrayCode()); map.put("v_type", "1"); pdaMapper.outMakeSure(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } else { return AjaxResult.warn("拣选完成"); } } /** * 处理正常出库 * @param trayCodeMakeSure * @param mydoJobDetailList * @param mydoJob * @return */ private AjaxResult handleOutType1(TrayCodeMakeSure trayCodeMakeSure,List mydoJobDetailList,MydoJob mydoJob) { for (MydoJobDetail mydoJobDetail : mydoJobDetailList) { //修改拣选数量 MydoJobDetail mydoJobDetailOld = mydoJobDetailService.selectMydoJobDetailByJobDetailId(mydoJobDetail.getJobDetailId()); BigDecimal oldPickQuantity = Convert.toBigDecimal(mydoJobDetailOld.getPickQuantity()); BigDecimal newPickQuantity = Convert.toBigDecimal(mydoJobDetail.getPickQuantity()); mydoJobDetailOld.setPickQuantity(oldPickQuantity.add(newPickQuantity).toString()); mydoJobDetailService.updateMydoJobDetail(mydoJobDetailOld); //绑定容器 BasContainerDetails basContainerDetailsParam = new BasContainerDetails(); basContainerDetailsParam.setContainerId(trayCodeMakeSure.getContainerCode()); basContainerDetailsParam.setProductId(mydoJobDetailOld.getProductId()); List basContainerDetails = basContainerDetailsService.selectBasContainerDetailsList(basContainerDetailsParam); if (CollUtil.isNotEmpty(basContainerDetails)){ BasContainerDetails oldBasContainerDetails = basContainerDetails.get(0); oldBasContainerDetails.setQuantity(oldBasContainerDetails.getQuantity()+Convert.toLong(mydoJobDetail.getPickQuantity())); basContainerDetailsService.updateBasContainerDetails(oldBasContainerDetails); }else { BasContainerDetails newBasContainerDetails = new BasContainerDetails(); newBasContainerDetails.setContainerId(trayCodeMakeSure.getContainerCode()); newBasContainerDetails.setProductId(mydoJobDetail.getProductId()); newBasContainerDetails.setQuantity(Convert.toLong(mydoJobDetail.getPickQuantity())); basContainerDetailsService.insertBasContainerDetails(newBasContainerDetails); } } //判断拣选数量是否等于出库数量 MydoJobDetail mydoJobDetailParam = new MydoJobDetail(); mydoJobDetailParam.setJobId(mydoJob.getJobId()); List currentMydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam); boolean flag = currentMydoJobDetails.stream().allMatch(mydoJobDetail -> mydoJobDetail.getPickQuantity().equals(mydoJobDetail.getOutQuantity())); if (flag) { HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMakeSure.getTrayCode()); map.put("v_type", "1"); pdaMapper.outMakeSure(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { return AjaxResult.success(map.get("v_resultmsg").toString()); } else { return AjaxResult.warn(map.get("v_resultmsg").toString()); } } else { return AjaxResult.warn("拣选完成"); } } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult checkMakeSure(TrayCodeMakeSure trayCodeMakeSure) { List mydoJobDetailList = trayCodeMakeSure.getMydoJobDetailList(); if(CollUtil.isNotEmpty(mydoJobDetailList)){ boolean flag = mydoJobDetailList.stream().anyMatch(x -> StrUtil.isEmpty(x.getStockId()) && "0".equals(x.getInQuantity())); if (flag){ return AjaxResult.warn("新增库存,存在为0的数量"); } for (MydoJobDetail mydoJobDetail : mydoJobDetailList) { CheckCommitRecord checkCommitRecord = new CheckCommitRecord(); checkCommitRecord.setQuantity(mydoJobDetail.getInQuantity()); checkCommitRecord.setTrayCode(trayCodeMakeSure.getTrayCode()); checkCommitRecord.setStockId(mydoJobDetail.getStockId()); checkCommitRecord.setSpare1(mydoJobDetail.getInOrOutDId()); checkCommitRecord.setSpare2(mydoJobDetail.getProductId()); checkCommitRecordService.insertCheckCommitRecord(checkCommitRecord); } } HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMakeSure.getTrayCode()); pdaMapper.checkMakeSure(map); String result = map.get("v_result").toString(); if("10".equals(result)){ return AjaxResult.success(map.get("v_resultmsg").toString()); }else{ return AjaxResult.warn(map.get("v_resultmsg").toString()); } } @Override public AjaxResult outException(TrayCodeMakeSure trayCodeMakeSure) { //判断任务是否存在 MydoJob mydoJobParam = new MydoJob(); mydoJobParam.setTrayCode(trayCodeMakeSure.getTrayCode()); List mydoJobList = mydoJobService.selectMydoJobList(mydoJobParam); if (CollUtil.isEmpty(mydoJobList)) { return AjaxResult.warn("任务不存在"); } MydoJob mydoJob = mydoJobList.get(0); //判断拣选数量 MydoJobDetail param = new MydoJobDetail(); param.setJobId(mydoJob.getJobId()); List mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(param); String stockOutId = ""; for (MydoJobDetail mydoJobDetail : mydoJobDetails) { //修改单据实际分配数量 BigDecimal pickQuantity = Convert.toBigDecimal(mydoJobDetail.getPickQuantity()); OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByStockoutDetailId(mydoJobDetail.getInOrOutDId()); outStockoutDetail.setAllotQuantity(pickQuantity); stockOutId = outStockoutDetail.getStockoutId(); outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail); } //生成回流任务,返回原库位,标记货位为异常待盘点状态 HashMap map = new HashMap<>(); map.put("v_tray_code", trayCodeMakeSure.getTrayCode()); map.put("v_type", "2"); pdaMapper.outMakeSure(map); String result = map.get("v_result").toString(); if ("10".equals(result)) { //自动分配 return outStockoutService.autoAllot(stockOutId); } else { throw new RuntimeException(map.get("v_resultmsg").toString()); } } }