package com.vincent.rsf.server.api.service.impl; 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.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; @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("容器未维护入库,请维护后再操作!!"); } /**获取库位*/ String targetLoc = LocManageUtil.getTargetLoc(warehouseArea.getId(), container.getContainerType()); 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()) .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("任务生成完毕!"); } }