package com.vincent.rsf.server.api.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.entity.params.PdaGeneralParam; import com.vincent.rsf.server.api.service.AgvService; import com.vincent.rsf.server.api.service.InBoundService; import com.vincent.rsf.server.api.utils.LocUtils; import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.utils.LocManageUtil; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * PDA入库操作Service实现类 */ @Slf4j @Service public class InBoundServiceImpl implements InBoundService { @Autowired private DeviceSiteService deviceSiteService; @Autowired private DeviceBindService deviceBindService; @Autowired private WarehouseAreasService warehouseAreasService; @Autowired private BasContainerService basContainerService; @Autowired private BasStationService basStationService; @Autowired private LocService locService; @Autowired private TaskService taskService; private BasStation checkStaStatus(String barcode, String sta) { if (Cools.isEmpty(barcode)) { throw new CoolException("容器码不能为空"); } if (Cools.isEmpty(sta)) { throw new CoolException("接驳位不能为空"); } BasStation isBarcodeSta = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getBarcode, barcode) , false ); if (!Cools.isEmpty(isBarcodeSta)) { throw new CoolException("该条码已被" + isBarcodeSta.getStationName() + "站绑定"); } BasStation basStation = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, sta) ); if (Cools.isEmpty(basStation)) { throw new CoolException("未找到站点信息"); } if (!basStation.getUseStatus().equals("O")) { throw new CoolException("站点状态不为空闲"); } if (!Cools.isEmpty(basStation.getContainerType())) { List longs1 = JSONObject.parseArray(basStation.getContainerType(), Long.class); List containers = basContainerService.list( new LambdaQueryWrapper() .in(BasContainer::getContainerType, longs1) ); boolean matches = false; for (BasContainer container : containers) { String codeType = container.getCodeType(); // 获取正则表达式 if (barcode.matches(codeType)) { // 判断条码是否符合这个正则 matches = true; break; // 找到匹配的就退出循环 } } // boolean matches = containers.stream() // .map(BasContainer::getCodeType) // .anyMatch(codeType -> barcode.matches(codeType)); if (!matches) { throw new CoolException("条码与站点不匹配"); } } else { throw new CoolException("数据异常:验证基础信息"); } return basStation; } private BasStation checkStaStatus(String barcode, String sta,String area) { if (Cools.isEmpty(barcode)) { throw new CoolException("容器码不能为空"); } if (Cools.isEmpty(sta)) { throw new CoolException("接驳位不能为空"); } BasStation isBarcodeSta = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getBarcode, barcode) , false ); if (!Cools.isEmpty(isBarcodeSta)) { throw new CoolException("该条码已被" + isBarcodeSta.getStationName() + "站绑定"); } BasStation basStation = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, sta) ); if (Cools.isEmpty(basStation)) { throw new CoolException("未找到站点信息"); } if (!basStation.getUseStatus().equals("O")) { throw new CoolException("站点状态不为空闲"); } List areaList = JSONObject.parseArray(basStation.getCrossZoneArea(), String.class); if (!areaList.contains(area)) { throw new CoolException("当前站点不支持目标库区"); } if (!Cools.isEmpty(basStation.getContainerType())) { List longs1 = JSONObject.parseArray(basStation.getContainerType(), Long.class); List containers = basContainerService.list( new LambdaQueryWrapper() .in(BasContainer::getContainerType, longs1) ); boolean matches = false; boolean matches2 = true; for (BasContainer container : containers) { String codeType = container.getCodeType(); // 获取正则表达式 if (barcode.matches(codeType)) { // 判断条码是否符合这个正则 List areaList2 = JSONObject.parseArray(container.getAreas(), String.class); if (!areaList2.contains(area)) { matches2 = false; continue; } matches = true; break; // 找到匹配的就退出循环 } } // boolean matches = containers.stream() // .map(BasContainer::getCodeType) // .anyMatch(codeType -> barcode.matches(codeType)); if (!matches2) { throw new CoolException("查询到的容器不支持目标库区"); } if (!matches) { throw new CoolException("条码与站点不匹配"); } } else { throw new CoolException("数据异常:验证基础信息"); } return basStation; } @Override @Transactional(rollbackFor = Exception.class) public synchronized R generateTasks(PdaGeneralParam param, Long loginUserId) { DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper().eq(DeviceSite::getSite,param.getTransferStationNo()).orderByDesc(DeviceSite::getId),false); if (Objects.isNull(deviceSite)) { throw new CoolException("站点不存在!!"); } DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(deviceSite.getSite())); if (Cools.isEmpty(deviceBind)) { throw new CoolException("库位规则未知"); } WarehouseAreas warehouseArea = warehouseAreasService.getById(deviceBind.getTypeId()); if (Cools.isEmpty(warehouseArea)) { throw new CoolException("未找到所属库区信息"); } // BasContainer container = basContainerService.getOne(new LambdaUpdateWrapper() // .eq(BasContainer::getCode, param.getContainerNo())); // if (Objects.isNull(container)) { // throw new CoolException("容器未维护入库,请维护后再操作!!"); // } //验证基础信息 checkStaStatus(param.getContainerNo(), param.getTransferStationNo()); /**获取库位*/ String targetLoc = LocManageUtil.getTargetLoc(warehouseArea.getId(), null); if (Cools.isEmpty(targetLoc)) { throw new CoolException("该站点对应库区未找到库位"); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码错误:请确认编码「SYS_TASK_CODE」是否已生成!!"); } Task task = new Task(); task.setTaskCode(ruleCode) .setTaskStatus(TaskStsType.GENERATE_IN.id) .setTaskType(TaskType.TASK_TYPE_EMPITY_IN.type) .setWarehType(WarehType.WAREHOUSE_TYPE_AGV.val)//lsh待修改 .setTargLoc(targetLoc) .setOrgSite(deviceSite.getSite()) .setBarcode(param.getContainerNo()) .setTargSite(deviceSite.getDeviceSite()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId); if (!taskService.save(task)) { throw new CoolException("任务保存失败!!"); } BasStation station = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, deviceSite.getSite())); if (Objects.isNull(station) || !station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { throw new CoolException("站点不存在或站点不处于空库状态!!"); } station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } if (!locService.update(new LambdaUpdateWrapper().eq(Loc::getCode, task.getTargLoc()) .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, param.getContainerNo()))) { throw new CoolException("库位预约失败!!"); } return R.ok("任务生成完毕!"); } }