package com.huaheng.pc.receipt.receiptContainerHeader.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.huaheng.common.constant.QuantityConstant; import com.huaheng.common.exception.service.ServiceException; import com.huaheng.common.utils.StringUtils; import com.huaheng.common.utils.Wrappers; import com.huaheng.common.utils.security.ShiroUtils; import com.huaheng.framework.web.domain.AjaxResult; import com.huaheng.framework.web.service.ConfigService; import com.huaheng.mobile.receipt.ReceiptBill; import com.huaheng.pc.config.company.domain.CompanyU8; import com.huaheng.pc.config.company.service.CompanyU8Service; import com.huaheng.pc.config.configValue.domain.ConfigValue; import com.huaheng.pc.config.configValue.mapper.ConfigValueMapper; import com.huaheng.pc.config.container.domain.Container; import com.huaheng.pc.config.container.service.ContainerService; import com.huaheng.pc.config.containerCapacity.domain.ContainerCapacity; import com.huaheng.pc.config.containerCapacity.service.ContainerCapacityService; import com.huaheng.pc.config.location.domain.Location; import com.huaheng.pc.config.location.service.LocationService; import com.huaheng.pc.config.material.domain.Material; import com.huaheng.pc.config.material.service.MaterialService; import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference; import com.huaheng.pc.config.receiptPreference.mapper.ReceiptPreferenceMapper; import com.huaheng.pc.config.zone.domain.Zone; import com.huaheng.pc.config.zone.service.ZoneService; import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail; import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService; import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail; import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService; import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader; import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView; import com.huaheng.pc.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper; import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService; import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader; import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService; import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader; import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService; import com.huaheng.pc.srm.service.FinishedProductService; import com.huaheng.pc.task.taskDetail.domain.TaskDetail; import com.huaheng.pc.task.taskDetail.service.TaskDetailService; import com.huaheng.pc.task.taskHeader.domain.TaskHeader; import com.huaheng.pc.task.taskHeader.service.TaskHeaderService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.MessageFormat; import java.util.*; /** * @author huaheng */ @Service public class ReceiptContainerHeaderAGVService extends ServiceImpl<ReceiptContainerHeaderMapper, ReceiptContainerHeader>{ @Resource private ReceiptContainerHeaderMapper receiptContainerHeaderMapper; @Resource private ReceiptContainerDetailService receiptContainerDetailService; @Resource private ReceiptDetailService receiptDetailService; @Resource private ContainerService containerService; @Resource private ZoneService zoneService; @Resource private TaskHeaderService taskHeaderService; @Resource private TaskDetailService taskDetailService; @Resource private ReceiptHeaderService receiptHeaderService; @Resource private CompanyU8Service companyU8Service; @Resource private MaterialService materialService; @Resource private InventoryDetailService inventoryDetailService; @Resource private FinishedProductService finishedProductService; @Resource private ContainerCapacityService containerCapacityService; @Transactional public AjaxResult<List<Map<String, Object>>> scanAGVReceipt(String receiptCode) { List<Map<String, Object>> detail = receiptContainerHeaderMapper.getAGVDetail(receiptCode, ShiroUtils.getWarehouseCode()); return AjaxResult.success(detail); } @Transactional public AjaxResult<List<Map<String, Object>>> getAGVReceiptInfoByBill(String receiptCode) { List<Map<String, Object>> detail = receiptContainerHeaderMapper.getAGVReceiptInfoByBill(receiptCode, ShiroUtils.getWarehouseCode()); return AjaxResult.success(detail); } /**入库组盘保存收货信息*/ @Transactional public AjaxResult<Map<String, String>> save(ReceiptContainerView record) { //取出入库详单对应的物料编码和物料库区 /*生成组盘明细前校验组盘明细里已有的组盘数量,已组盘数量加正在组盘的数量不能大于入库单明细条的数量 */ record.setTaskType((short)200); ReceiptDetail rc=new ReceiptDetail(); rc.setReceiptCode(record.getReceiptCode()); rc.setWarehouseCode(ShiroUtils.getWarehouseCode()); rc.setId(record.getReceiptDetailId()); rc=receiptDetailService.selectFirstEntity(rc); record.setMaterialCode(rc.getMaterialCode()); //找到库位的的库区 Container container=containerService.getContainerByCode(record.getContainerCode()); if(container ==null){ throw new ServiceException("系统没有此容器"); } if(!ShiroUtils.getCompanyCodeList().contains(container.getCompanyCode())){ throw new ServiceException("该操作员没有此容器的操作权限"); } if(StringUtils.isEmpty(record.getLocationCode())){ record.setLocationCode(container.getLocationCode()); } switch (container.getContainerType()){ case "A": record.setZoneCode("AGV"); break; case "D": record.setZoneCode("PK"); break; case "C": record.setZoneCode("XC"); break; case "L": case "M": record.setZoneCode("LK"); break; case "Q": record.setZoneCode("QG"); break; default: record.setZoneCode("XN"); break; } if(record.getZoneCode()==null){ throw new ServiceException("此单据没有分配库区,请分配库区"); } if((record.getZoneCode().equals("LK") || record.getZoneCode().equals("XC") ) && StringUtils.isEmpty(record.getLocationCode())){ record.setTaskType((short)100); } LambdaQueryWrapper<ReceiptContainerDetail> lambdaDetails = Wrappers.lambdaQuery(); lambdaDetails.eq(ReceiptContainerDetail::getReceiptCode, record.getReceiptCode()); lambdaDetails.eq(ReceiptContainerDetail::getReceiptDetailId, rc.getId()); lambdaDetails.eq(ReceiptContainerDetail::getMaterialCode,record.getMaterialCode()); List<ReceiptContainerDetail> rcdlist = receiptContainerDetailService.list(lambdaDetails); BigDecimal sum =BigDecimal.ZERO; for(ReceiptContainerDetail item:rcdlist){ sum = sum.add(item.getQty()); } //sum2不能大于qty BigDecimal sum2 = sum.add(record.getQty()); int s = sum2.compareTo(rc.getQty()); if(s == 1){ throw new ServiceException("子单据组盘的总数量不能超过单据数量,请检查入库详单数量和已组盘的数量!"); } checkContainer(record);//检查容器 //autoLocationCode(record);//自动分配库位 ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderAdd(record,container); ReceiptDetail receiptDetail = receiptDetailQtyAdd(record.getReceiptDetailId(), record.getQty()); ReceiptContainerDetail receiptContainerDetail=receiptContainerDetailAdd(receiptContainerHeader.getId(), receiptDetail, record); receiptStatusUpdate(receiptDetail.getReceiptId(), 200); return AjaxResult.success(ReturnValue(record.getReceiptDetailId(), receiptDetail)); } public void receiptStatusUpdate(Integer receiptId, Integer status){ ReceiptHeader receiptHeader=receiptHeaderService.getById(receiptId); LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery(); lambdaDetails.eq(ReceiptDetail::getReceiptId, receiptId); lambdaDetails.last("limit 1"); lambdaDetails.orderByDesc(ReceiptDetail::getProcessStamp); ReceiptDetail receiptDetail = receiptDetailService.getOne(lambdaDetails); if(receiptDetail!=null){ receiptHeader.setFirstStatus(status); receiptHeader.setLastStatus(Integer.valueOf(receiptDetail.getProcessStamp())); receiptHeaderService.updateById(receiptHeader); } } public AjaxResult checkContainer(ReceiptContainerView record) { if (StringUtils.isEmpty(record.getContainerCode())) { throw new ServiceException("容器不能为空"); } Container container = containerService.getContainerByCode(record.getContainerCode()); if(container == null){ return AjaxResult.error(record.getContainerCode()+"容器编码错误"); } if(record.getTaskType().intValue() == 100){ if (StringUtils.isNotEmpty(container.getLocationCode())) { throw new ServiceException("容器已经在货架" + container.getLocationCode() + "上!"); } } if(record.getTaskType().intValue() == 200) { if (StringUtils.isEmpty(container.getLocationCode())) { throw new ServiceException("容器不在货架" + container.getLocationCode() + "上!"); } } LambdaQueryWrapper<TaskHeader> lambda = Wrappers.lambdaQuery(); lambda.eq(TaskHeader::getContainerCode,container.getCode()); lambda.in(TaskHeader::getStatus,10,20,30); lambda.last("limit 1"); TaskHeader taskHeader=taskHeaderService.getOne(lambda); if(taskHeader!=null){ throw new ServiceException("该容器已有任务,且已下发"); } LambdaQueryWrapper<TaskHeader> tasklambda = Wrappers.lambdaQuery(); tasklambda.eq(TaskHeader::getContainerCode,container.getCode()); tasklambda.eq(TaskHeader::getStatus,1); tasklambda.last("limit 1"); TaskHeader condition=taskHeaderService.getOne(tasklambda); if(condition!=null && condition.getTaskType().intValue()>200){ throw new ServiceException("该容器已有其他任务,无法组盘"); } LambdaQueryWrapper<TaskHeader> tasklambda1 = Wrappers.lambdaQuery(); tasklambda1.eq(TaskHeader::getContainerCode,container.getCode()); tasklambda1.eq(TaskHeader::getStatus,100); tasklambda1.last("limit 1"); TaskHeader task1=taskHeaderService.getOne(tasklambda1); if(task1!= null && !task1.getCreatedBy().equals(ShiroUtils.getLoginName())){ throw new ServiceException("该容器已被其他操作员使用"); } //容器和物料库位类型进行匹配 LambdaQueryWrapper<Zone> zonelambda = Wrappers.lambdaQuery(); zonelambda.eq(Zone::getCode,container.getCode()); zonelambda.last("limit 1"); Zone zo = zoneService.getOne(zonelambda); //地面库区可以放任意物料,不校验 if(StringUtils.isNotEmpty(record.getZoneCode())){ if(container.getContainerType().equals("D") && zo.getLocationType().equals("PK")){ return AjaxResult.success(""); }else if(container.getContainerType().equals("M") && zo.getLocationType().equals("LK")){ return AjaxResult.success(""); }else if(container.getContainerType().equals("L") && zo.getLocationType().equals("LK")){ return AjaxResult.success(""); }else if(container.getContainerType().equals("C") && zo.getLocationType().equals("XC")){ return AjaxResult.success(""); } else if(container.getContainerType().equals("A") && zo.getLocationType().equals("AGV")){ return AjaxResult.success(""); }else if(container.getContainerType().equals("Q") && zo.getLocationType().equals("QG")){ return AjaxResult.success(""); }else if(container.getContainerType().equals("X") && zo.getLocationType().equals("XN")){ return AjaxResult.success(""); }else{ throw new ServiceException("物料不适用与该容器托盘!请更换容器托盘"); } } return AjaxResult.success(""); } /** * 增加组盘表头记录 * @param record 组盘信息实体 */ private ReceiptContainerHeader receiptContainerHeaderAdd(ReceiptContainerView record,Container container) { //从主单获取单号 ReceiptHeader receiptHeader=new ReceiptHeader(); receiptHeader.setCode(record.getReceiptCode()); receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader); //根据托盘查询组盘表头记录 LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery(); lambda.eq(ReceiptContainerHeader::getCompanyCode,record.getContainerCode()); lambda.lt(ReceiptContainerHeader::getStatus,20); List<ReceiptContainerHeader> list = this.list(lambda); ReceiptContainerHeader receiptContainerHeader=new ReceiptContainerHeader(); if (list.size() < 1) { ReceiptDetail receiptDetail = receiptDetailService.getById(record.getReceiptDetailId()); if(receiptDetail == null){ throw new ServiceException("id为"+record.getReceiptDetailId()+"入库单明细不存在"); } if(receiptHeader.getReceiptType().equals("SI") && StringUtils.isNotEmpty(receiptDetail.getReferLineNum())){ CompanyU8 companyWu = new CompanyU8(); companyWu.setCompanyCode(receiptHeader.getCompanyCode()); companyWu = companyU8Service.getByCode(companyWu); if(companyWu == null){ throw new ServiceException("入库单对应的U8账套不存在"); } Map detailMap = new HashMap(); detailMap.put("MODID",receiptDetail.getReferLineNum()); detailMap.put("iQuantity",receiptDetail.getQty()); detailMap.put("itemcode",receiptDetail.getMaterialCode()); List<Map> maps = new ArrayList<>(); maps.add(detailMap); Map<String,Object> map = new HashMap(); map.put("CompanyCode",companyWu.getUCompanyCode()); map.put("details",maps); AjaxResult ajaxResult = finishedProductService.checkMesReceipt(map); if(ajaxResult.hasErr()){ throw new ServiceException(ajaxResult.getMsg()); } } if (!container.getCompanyCode().equals(receiptDetail.getCompanyCode())) { throw new ServiceException("容器货主属性和单据不一致,请换容器"); } /*if(StringUtils.isNotEmpty(receiptDetail.getUWarehouseCode()) && StringUtils.isNotEmpty(container.getuWarehouseCode())) { if (!container.getUWarehouseCode().equals(receiptDetail.getUWarehouseCode())) { throw new ServiceException("容器仓库属性和单据不一致,请换容器"); } }*/ receiptContainerHeader.setContainerCode(record.getContainerCode()); receiptContainerHeader.setStatus(0); receiptContainerHeader.setTaskType(record.getTaskType().intValue()); receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode()); //赋值u8仓库 receiptContainerHeader.setCompanyCode(receiptDetail.getCompanyCode()); receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName()); receiptContainerHeader.setToLocation(record.getLocationCode()); // receiptContainerHeader.setZoneCode(record.getZoneCode()); this.save(receiptContainerHeader); }else { return list.get(0); } return receiptContainerHeader; } /** * 增加入库明细的收货数量 * @param receiptDetailId * @param Qty * @return */ public ReceiptDetail receiptDetailQtyAdd(Integer receiptDetailId, BigDecimal Qty) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.setId(receiptDetailId); receiptDetail = receiptDetailService.selectFirstEntity(receiptDetail); // 将入库单明细的收货数量 + 保存的数量,然后在存入明细表 receiptDetail.setTaskQty(receiptDetail.getTaskQty().add(Qty)); receiptDetail.setStatus((short) 200); if (receiptDetail.getTaskQty().compareTo(receiptDetail.getQty()) > 0){ throw new ServiceException("收货数大于待收数量!"); } receiptDetailService.updateById(receiptDetail); return receiptDetail; } /** * 增加组盘明细记录 * @param receiptContainerHeaderId * @param receiptDetail * @param record */ private ReceiptContainerDetail receiptContainerDetailAdd(Integer receiptContainerHeaderId, ReceiptDetail receiptDetail, ReceiptContainerView record) { int flag =1; // 根据表头ID和入库单明细ID找组盘明细 ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail(); receiptContainerDetail.setReceiptContainerId(receiptContainerHeaderId); receiptContainerDetail.setReceiptDetailId(record.getReceiptDetailId()); receiptContainerDetail = receiptContainerDetailService.selectFirstEntity(receiptContainerDetail); ReceiptHeader receiptHeader =new ReceiptHeader(); receiptHeader.setCode(record.getReceiptCode()); receiptHeader =receiptHeaderService.selectFirstEntity(receiptHeader); //查看组盘头状态,如果状态在10到20,则生成任务明细或修改任务明细的数量 ReceiptContainerHeader receiptContainerHeader = this.getById(receiptContainerHeaderId); TaskHeader task = new TaskHeader(); if(receiptContainerHeader.getStatus()>=10 && receiptContainerHeader.getStatus()< 20) { LambdaQueryWrapper<TaskHeader> tasklambda1 = Wrappers.lambdaQuery(); tasklambda1.eq(TaskHeader::getAllocationHeadId,receiptContainerHeaderId); tasklambda1.eq(TaskHeader::getWarehouseCode,receiptContainerHeader.getWarehouseCode()); tasklambda1.in(TaskHeader::getTaskType,100,200); tasklambda1.last("limit 1"); task=taskHeaderService.getOne(tasklambda1); if (task == null) { throw new ServiceException("任务主表不存在"); } } if (receiptContainerDetail == null) { Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode()); receiptContainerDetail = new ReceiptContainerDetail(); receiptContainerDetail.setReceiptContainerId(receiptContainerHeaderId); receiptContainerDetail.setReceiptCode(receiptHeader.getReferCode()); receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode()); receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId()); receiptContainerDetail.setReceiptDetailId(record.getReceiptDetailId()); receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode()); receiptContainerDetail.setMaterialName(material.getName()); receiptContainerDetail.setMaterialSpec(material.getSpec()); BigDecimal num=new BigDecimal(0); num=record.getQty(); //物料库区为AGV的需要考虑是否满盘 if(StringUtils.isNotEmpty(receiptDetail.getZoneCode()) && receiptDetail.getZoneCode().equals("AGV")){ //查出与容器和物料对应的库存 InventoryDetail inventory=new InventoryDetail(); LambdaQueryWrapper<InventoryDetail> invlambda= Wrappers.lambdaQuery(); invlambda.eq(InventoryDetail::getMaterialCode,receiptDetail.getMaterialCode()); invlambda.eq(InventoryDetail::getContainerCode,record.getContainerCode()); invlambda.last("limit 1"); inventory=inventoryDetailService.getOne(invlambda); //查看容器与物料对应的满盘度 ContainerCapacity containerCapacity=new ContainerCapacity(); // containerCapacity.setCode("AGV"); containerCapacity.setMaterialCode(record.getMaterialCode()); containerCapacity.setWarehouseCode(ShiroUtils.getWarehouseCode()); LambdaQueryWrapper<ContainerCapacity> capacitylambda= Wrappers.lambdaQuery(); capacitylambda.eq(ContainerCapacity::getWarehouseCode,ShiroUtils.getWarehouseCode()); capacitylambda.eq(ContainerCapacity::getMaterialCode,record.getMaterialCode()); capacitylambda.last("limit 1"); containerCapacity=containerCapacityService.getOne(capacitylambda); num=containerCapacity.getUph(); String qty=null; //如果没有库存 if(inventory==null){ //物料满盘度大于单据数量时,组盘数量为单据数量,否则为满盘数量 if(num.intValue()-record.getQty().intValue()>=0){ num=record.getQty(); } }else { //容器剩余数量大于单据数量时,组盘数量单据数量,否则为剩余数量 if(num.intValue()-inventory.getQty().intValue()-record.getQty().intValue()>0){ num=record.getQty(); }else { throw new ServiceException("收货数量大于容器剩余数量,请调低收获数量!"); } } } receiptContainerDetail.setQty(num); receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName()); receiptContainerDetail.setProjectNo(receiptDetail.getProjectNo()); receiptContainerDetailService.save(receiptContainerDetail); //生成任务明细 if(task !=null && StringUtils.isNotEmpty(task.getWarehouseCode())){ TaskDetail taskDetail =new TaskDetail(); taskDetail.setTaskId(task.getId()); taskDetail.setWarehouseId(task.getWarehouseId()); taskDetail.setWarehouseCode(task.getWarehouseCode()); taskDetail.setCompanyId(task.getCompanyId()); taskDetail.setCompanyCode(task.getCompanyCode()); // taskDetail.setZoneCode(receiptContainerHeader.getZoneCode()); taskDetail.setMaterialCode(receiptContainerDetail.getMaterialCode()); taskDetail.setMaterialName(receiptContainerDetail.getMaterialName()); taskDetail.setAllocationId(receiptContainerDetail.getId()); taskDetail.setBillId(receiptContainerDetail.getReceiptId()); taskDetail.setBillDetailId(receiptContainerDetail.getReceiptDetailId()); taskDetail.setBillCode(receiptContainerDetail.getReceiptCode()); taskDetail.setReferenceCode(receiptDetail.getReferCode()); taskDetail.setGoodsShelfNo(task.getGoodsShelfNo()); // taskDetail.setSourceCode(receiptContainerDetail.getSourceCode()); taskDetail.setQty(receiptContainerDetail.getQty()); taskDetail.setContainerCode(task.getContainerCode()); taskDetail.setToLocation(task.getToLocation()); taskDetail.setFromLocation(task.getFromLocation()); taskDetail.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT); taskDetail.setStatus(task.getStatus()); taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName()); taskDetail.setProjectNo(receiptContainerDetail.getProjectNo()); if(!taskDetailService.save(taskDetail)){ throw new ServiceException("新建任务明细失败,sql错误"); } } } else { receiptContainerDetail.setQty(receiptContainerDetail.getQty().add(record.getQty())); receiptContainerDetailService.updateById(receiptContainerDetail); //修改任务明细 if(task !=null && StringUtils.isNotEmpty(task.getWarehouseCode())){ TaskDetail taskDetail =new TaskDetail(); taskDetail.setAllocationId(receiptContainerDetail.getId()); taskDetail.setTaskId(task.getId()); LambdaQueryWrapper<TaskDetail> tasklambda1 = Wrappers.lambdaQuery(); tasklambda1.eq(TaskDetail::getAllocationId,receiptContainerDetail.getId()); tasklambda1.eq(TaskDetail::getTaskId,task.getId()); tasklambda1.last("limit 1"); taskDetail =taskDetailService.getOne(tasklambda1); if(taskDetail == null){ throw new ServiceException("找不到对应的任务明细"); } taskDetail.setQty(taskDetail.getQty().add(record.getQty())); if(!taskDetailService.updateById(taskDetail)){ throw new ServiceException("修改任务明细失败,sql错误"); } } } return receiptContainerDetail; } /** * 返回客户端的键值对 * @param receiptDetailId * @param receiptDetail * @return */ public Map<String, String> ReturnValue(Integer receiptDetailId, ReceiptDetail receiptDetail) { Map<String, String> returnValue = new HashMap<>(); returnValue.put("id", receiptDetailId.toString()); returnValue.put("receiptId", receiptDetail.getReceiptId().toString()); returnValue.put("materialCode", receiptDetail.getMaterialCode()); returnValue.put("qtyCompleted", receiptDetail.getTaskQty().toString()); return returnValue; } }