wms-serve-mule/src/main/java/com/wms/controller/TaskController.java

1326 lines
70 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.wms.controller;
import com.alibaba.fastjson2.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wms.constants.enums.*;
import com.wms.entity.app.*;
import com.wms.entity.app.wcs.*;
import com.wms.entity.page.PageDomain;
import com.wms.mapper.StockMapper;
import com.wms.mapper.TaskMapper;
import com.wms.entity.page.TableRequest;
import com.wms.entity.page.TableResponse;
import com.wms.entity.table.*;
import com.wms.constants.WmsConstants;
import com.wms.utils.storage.LocationUtils;
import com.wms.service.*;
import com.wms.utils.HttpUtils;
import com.wms.mapper.LocationMapper;
import com.wms.utils.StringUtils;
import com.wms.utils.WmsUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import java.util.*;
/**
* WMS任务控制类
*
* @author 梁州
* @date 2023/2/14
*/
@Controller
@CrossOrigin
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@RequestMapping(value = "/wms/task")
public class TaskController extends BaseController {
/**
* 任务服务
*/
private final TaskService taskService;
/**
* 任务 Mapper
*/
private final TaskMapper taskMapper;
/**
* 库存 Mapper
*/
private final StockMapper stockMapper;
/**
* 库存服务
*/
private final StockService stockService;
/**
* 库位操作类
*/
private final LocationUtils locationUtils;
/**
* 零件
*/
private final PartInfoService partInfoService;
/**
* 库位服务
*/
private final LocationService locationService;
/**
* 任务记录服务
*/
private final TaskRecordService taskRecordService;
/**
* 站台服务
*/
private final StandService standService;
/**
* 载具服务
*/
private final VehicleService vehicleService;
/**
* 请求头部信息
*/
private final HttpServletRequest servletRequest;
/**
* 订单入库 Mapper
*/
private final com.wms.mapper.AppOrderInMapper appOrderInMapper;
/**
* 库位 Mapper
*/
private final LocationMapper locationMapper;
/**
* 创建入库任务(人工入库)
*
* @param taskInRequestEntityList 入库任务
* @return 结果
*/
@PostMapping("/sendGoodsInTask")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String receiveGoodsInTask(@RequestBody List<TaskInRequestEntity> taskInRequestEntityList) {
logger.info("接收到入库任务:{}ip地址{}", JSON.toJSONString(taskInRequestEntityList), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 根据ip获得站台信息
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() < 1) {// 请求的地址不是站台电脑
logger.error("请用站台电脑下发任务");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("请用站台电脑下发任务");
return JSON.toJSONString(rsp);
}
// 同一次请求为同一载具任务,为同一任务组
String taskGroupId = WmsUtils.generateUUIDString();
// 下一个库位
Location nextLocation = new Location();
// 当前载具
String currentVehicleNo = taskInRequestEntityList.get(0).getVehicleNo();
// 入库设备号
int currentSelEquip = 0;
// 查询当前载具库存信息
Vehicle vehicleQuery = new Vehicle();
vehicleQuery.setVehicleId(currentVehicleNo);
List<Vehicle> existVehicles = vehicleService.selVehicles(vehicleQuery);
if (existVehicles.size() > 0 && Objects.equals(existVehicles.get(0).getVehicleStatus(), VehicleStatus.ON.getCode())) {
logger.error("载具{}已经在库存中,请勿重复入库!", currentVehicleNo);
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("该托盘已经在库存中,请勿重复入库!");
return JSON.toJSONString(rsp);
}
Task taskQuery = new Task();
taskQuery.setVehicleNo(currentVehicleNo);
List<Task> sameVehicleTasks = taskService.selTasks(taskQuery);
if (sameVehicleTasks.size() > 0) {
logger.error("载具{}存在其他任务,请勿重复入库!", currentVehicleNo);
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("该载具存在其他任务,请勿重复入库!");
return JSON.toJSONString(rsp);
}
if (existVehicles.size() > 0) {
nextLocation = locationService.selLocations(new Location(existVehicles.get(0).getCurrentLocation())).get(0);
}
for (TaskInRequestEntity taskInRequestEntity : taskInRequestEntityList) {// 循环生成入库任务
// 生成任务
Task task_new = new Task();
// 保存必要的物料信息
task_new.setTaskId(WmsUtils.generateId("RK"));
// 设置发送给WCS的任务信息
task_new.setTaskType(TaskType.IN.getCode());
task_new.setTaskStatus(WmsTaskStatus.NEW.getCode());
task_new.setTaskGroup(taskGroupId);
// 查找库位时过滤掉不可用堆垛机
Stand standQuery1 = new Stand();
standQuery1.setStandType(3);
standQuery1.setIsLock(0);
standQuery1.setStandStatus(0);
List<Stand> availableEquips = standService.selStands(standQuery1);
if (availableEquips.size() < 1) {// 没有可用堆垛机,请稍后重试
logger.error("当前库无可用堆垛机,请稍后重试!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前库无可用堆垛机,请稍后重试!");
return JSON.toJSONString(rsp);
}
// 找到占用库位数量最少的堆垛机
int occupyLocationsNum = 1000000;
for (Stand availableEquip : availableEquips) {
Location locationQuery1 = new Location();
locationQuery1.setEquipmentId(availableEquip.getEquipmentId());
locationQuery1.setLocationStatus(LocationStatus.OCCUPY.getCode());
List<Location> locations1 = locationService.selLocations(locationQuery1);
if (locations1.size() < occupyLocationsNum) {// 当前最小
occupyLocationsNum = locations1.size();
currentSelEquip = availableEquip.getEquipmentId();
}
}
//查找到对应的入库站台
Stand standQuery2 = new Stand();
standQuery2.setAllowIn(1);
standQuery2.setAllowOut(0);
standQuery2.setEquipmentId(currentSelEquip);
standQuery2.setIsLock(0);
standQuery2.setStandStatus(0);
standQuery2.setStandType(1);
List<Stand> availableStands = standService.selStands(standQuery2);
if (availableStands.size() < 1) {
logger.error("当前堆垛机无可用入库站台,请稍后重试!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前堆垛机无可用入库站台,请稍后重试!");
return JSON.toJSONString(rsp);
}
task_new.setOrigin(availableStands.get(0).getStandId());
// 查找下一个可用库位
if (StringUtils.isEmpty(nextLocation.getLocationId())) {
List<Location> nextLocations = locationService.selNextLocation(new Location(currentSelEquip));
if (nextLocations.size() < 1) {
logger.error("入库错误:没有可用储存位");
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("入库错误:没有可用储存位");
return JSON.toJSONString(rsp);
}
nextLocation = nextLocations.get(0);
}
nextLocation.setLocationStatus(LocationStatus.OCCUPY.getCode());
nextLocation.setVehicleId(taskInRequestEntity.getVehicleNo());
task_new.setDestination(nextLocation.getLocationId());
task_new.setWeight(taskInRequestEntity.getWeight() == null ? 0 : taskInRequestEntity.getWeight());
task_new.setVehicleNo(taskInRequestEntity.getVehicleNo());
task_new.setCreateTime(new Date());
task_new.setUserName(taskInRequestEntity.getUserName());
task_new.setGoodsId(taskInRequestEntity.getGoodsId());
if (!taskInRequestEntity.getGoodsId().equals(WmsConstants.EMPTY_STOCK_GOODS_ID)) {
// 查询物料信息后设定
PartInfo partInfo = partInfoService.selPartByPartNo(taskInRequestEntity.getGoodsId());
task_new.setGoodsName(partInfo.getItemDesc());
if (Double.parseDouble(partInfo.getSLED()) > 0) {
task_new.setProductionDate(taskInRequestEntity.getProductionDate());
task_new.setExpirationDate(WmsUtils.calculationMonth(taskInRequestEntity.getProductionDate(), (int) (12 * Double.parseDouble(partInfo.getSLED()))));
}
}
task_new.setOperateNum(taskInRequestEntity.getGoodsNum());
task_new.setTotalNum(0);
task_new.setTaskPriority(1);
// 插入入库任务
taskService.addTask(task_new);
}
// 锁定库位
locationService.modifyLocation(nextLocation);
// 添加载具/更新载具
if (existVehicles.size() == 0) {
Vehicle newVehicle = new Vehicle();
newVehicle.setVehicleId(currentVehicleNo);
newVehicle.setVehicleStatus(VehicleStatus.IN.getCode());// 入库中
newVehicle.setCurrentLocation(nextLocation.getLocationId());
if (Objects.equals(taskInRequestEntityList.get(0).getIsEmpty(), "0")) {
newVehicle.setIsEmpty(1);
} else {
newVehicle.setIsEmpty(0);
}
vehicleService.addVehicle(newVehicle);
} else {
Vehicle oldVehicle = existVehicles.get(0);
oldVehicle.setVehicleStatus(VehicleStatus.IN.getCode());//
oldVehicle.setCurrentLocation(nextLocation.getLocationId());
if (Objects.equals(taskInRequestEntityList.get(0).getIsEmpty(), "0")) {
oldVehicle.setIsEmpty(1);
} else {
oldVehicle.setIsEmpty(0);
}
vehicleService.modifyVehicle(oldVehicle);
}
// 返回成功
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("创建入库任务成功");
return JSON.toJSONString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage(e.getMessage());
return JSON.toJSONString(rsp);
}
}
/**
* 出库---根据零件号出库
* @param taskOutRequest 请求
* @return 结果
*/
@PostMapping("/sendGoodsOutTask")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String receiveGoodsOutTask(@RequestBody TaskOutRequestEntity taskOutRequest) {
logger.info("接收到出库请求:{}ip地址{}", JSON.toJSONString(taskOutRequest), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
StringBuilder returnMessage = new StringBuilder();
try {
// 根据ip获得站台信息
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() < 1) {// 请求的地址不是站台电脑
logger.error("请用站台电脑下发任务");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("请用站台电脑下发任务");
return JSON.toJSONString(rsp);
}
// 判断物料编号和数量有没有输入
if (taskOutRequest== null || StringUtils.isEmpty(taskOutRequest.getGoodsId()) || taskOutRequest.getNeedNum() == null || taskOutRequest.getNeedNum() == 0) {
logger.error("物料号和数量必须输入,请确认!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("物料号和数量必须输入,请确认!");
return JSON.toJSONString(rsp);
}
// 查找库存
Stock stockQuery = new Stock();
stockQuery.setGoodsId(taskOutRequest.getGoodsId());
stockQuery.setVehicleId(taskOutRequest.getVehicleNo());
stockQuery.setStockStatus(StockStatus.OK.getCode());
List<Stock> needStocks = stockService.selStocks(stockQuery);
if (needStocks.size() == 0) {// 没有库存
logger.error("选择的库存不存在,无法出库!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("选择的库存不存在,无法出库!");
return JSON.toJSONString(rsp);
}
int needNum = taskOutRequest.getNeedNum();
Location currentLocation;
for (Stock needStock : needStocks) {
if (needNum > 0 && needStock.getRemainNum() > 0) {// 还有需求数量
Task tempTask = new Task();
tempTask.setTaskId(WmsUtils.generateId("CK"));
tempTask.setTaskType(TaskType.OUT.getCode());
tempTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempTask.setTaskGroup(WmsUtils.generateUUIDString());
tempTask.setTaskPriority(1);
tempTask.setPickStand(stands.get(0).getStandId());
tempTask.setVehicleNo(needStock.getVehicleId());
tempTask.setUserName(taskOutRequest.getUserName());
tempTask.setGoodsId(needStock.getGoodsId());
tempTask.setGoodsName(needStock.getGoodsName());
tempTask.setCreateTime(new Date());
tempTask.setProductionDate(needStock.getProductionDate());
tempTask.setExpirationDate(needStock.getExpirationDate());
tempTask.setTotalNum(needStock.getRealNum());
tempTask.setOrigin(needStock.getLocationId());
//查找到对应的出库
currentLocation = locationService.selLocations(new Location(needStock.getLocationId())).get(0);
Stand standQuery2 = new Stand();
standQuery2.setAllowIn(0);
standQuery2.setAllowOut(1);
standQuery2.setEquipmentId(currentLocation.getEquipmentId());
standQuery2.setIsLock(0);
standQuery2.setStandStatus(0);
standQuery2.setStandType(1);
List<Stand> availableStands = standService.selStands(standQuery2);
if (availableStands.size() < 1) {
logger.error("当前库存的出库站台不可用!");
// 返回错误信息
returnMessage.append("当前库存所在载具").append(currentLocation.getVehicleId()).append("的出库站台不可用!\n");
}
tempTask.setDestination(availableStands.get(0).getStandId());
if (needNum <= needStock.getRemainNum()) {// 数量足够
tempTask.setOperateNum(needNum);
needNum = 0;
needStock.setRemainNum(needStock.getRemainNum() - needNum);
} else {
tempTask.setOperateNum(needStock.getRemainNum());
needNum -= needStock.getRemainNum();
needStock.setRemainNum(0);
}
// 添加任务
taskService.addTask(tempTask);
logger.info("添加任务成功,{}", JSON.toJSONString(tempTask));
// 更新库存
needStock.setStockStatus(StockStatus.OUT.getCode());
stockService.modifyStock(needStock);
logger.info("更新库存信息成功,{}", JSON.toJSONString(needStock));
// 更新载具信息
Vehicle currentVehicle = vehicleService.selVehicleById(needStock.getVehicleId());
if (currentVehicle == null) {
currentVehicle = new Vehicle();
currentVehicle.setVehicleId(needStock.getVehicleId());
currentVehicle.setIsEmpty(0);
currentVehicle.setCurrentLocation(needStock.getLocationId());
currentVehicle.setVehicleStatus(VehicleStatus.OUT.getCode());
vehicleService.addVehicle(currentVehicle);
} else {
currentVehicle.setVehicleStatus(VehicleStatus.OUT.getCode());
vehicleService.modifyVehicle(currentVehicle);
}
logger.info("更新载具信息,{}", JSON.toJSONString(currentVehicle));
// 将当前载具的其他库存也设置为相同状态
Stock stockQuery2 = new Stock();
stockQuery2.setVehicleId(needStock.getVehicleId());
List<Stock> sameVehicleStocks = stockService.selStocks(stockQuery2);
for (Stock sameVehicleStock : sameVehicleStocks) {
if (!Objects.equals(sameVehicleStock.getStockId(), needStock.getStockId())) {
sameVehicleStock.setStockStatus(StockStatus.OUT.getCode());
stockService.modifyStock(sameVehicleStock);
}
}
logger.info("更新载具中其他库存信息,{}", needStock.getVehicleId());
}
}
if (needNum > 0) {// 库存不足的情况下
returnMessage.append("当前可用数量不足,已将能够出库的库存出库。\n");
}
logger.info("下发出库任务成功");
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage(String.valueOf(returnMessage));
return JSON.toJSONString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("创建出库任务发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage(e.getMessage());
return JSON.toJSONString(rsp);
}
}
/**
* 出库---根据料箱号出
* @param taskOutRequest 请求
* @return 结果
*/
@PostMapping("/vehicleOut")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String selectVehicleOut(@RequestBody TaskOutRequestEntity taskOutRequest) {
logger.info("接收到出箱请求:{}ip地址{}", JSON.toJSONString(taskOutRequest), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 根据ip获得站台信息
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() < 1) {// 请求的地址不是站台电脑
logger.error("请用站台电脑下发任务");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("请用站台电脑下发任务");
return JSON.toJSONString(rsp);
}
// 判断物料编号和数量有没有输入
if (taskOutRequest== null || StringUtils.isEmpty(taskOutRequest.getVehicleNo())) {
logger.error("箱号必须输入,请确认!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("箱号必须输入,请确认!");
return JSON.toJSONString(rsp);
}
Vehicle vehicle = vehicleService.selVehicleById(taskOutRequest.getVehicleNo());
if (vehicle == null || !Objects.equals(vehicle.getVehicleStatus(), VehicleStatus.ON.getCode())) {
logger.error("当前箱子不可用,请确认!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前箱子不可用,请确认!");
return JSON.toJSONString(rsp);
}
int needNum = taskOutRequest.getNeedNum();
// 生成任务
Task tempTask = new Task();
tempTask.setVehicleNo(taskOutRequest.getVehicleNo());
tempTask.setTaskId(WmsUtils.generateId("RKCK"));
tempTask.setTaskGroup(WmsUtils.generateUUIDString());
tempTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempTask.setTaskType(TaskType.OUT.getCode());
tempTask.setOperateNum(0);
tempTask.setCreateTime(new Date());
tempTask.setGoodsId(WmsConstants.EMPTY_STOCK_GOODS_ID);
tempTask.setUserName(taskOutRequest.getUserName());
tempTask.setPickStand(stands.get(0).getStandId());
tempTask.setTaskPriority(1);
tempTask.setWeight((double) 0);
tempTask.setOrigin(vehicle.getCurrentLocation());
//查找到对应的出库站台
Location currentLocation = locationService.selLocations(new Location(vehicle.getCurrentLocation())).get(0);
Stand standQuery2 = new Stand();
standQuery2.setAllowIn(0);
standQuery2.setAllowOut(1);
standQuery2.setEquipmentId(currentLocation.getEquipmentId());
standQuery2.setIsLock(0);
standQuery2.setStandStatus(0);
standQuery2.setStandType(1);
List<Stand> availableStands = standService.selStands(standQuery2);
if (availableStands.size() < 1) {
logger.error("当前箱子的出库站台不可用!");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前箱子的出库站台不可用!");
return JSON.toJSONString(rsp);
}
tempTask.setDestination(availableStands.get(0).getStandId());
taskService.addTask(tempTask);
logger.info("下发出箱任务成功");
// 更新料箱状态
vehicle.setVehicleStatus(VehicleStatus.OUT.getCode());
vehicleService.modifyVehicle(vehicle);
logger.info("更新料箱状态成功");
// 该箱子上的库存状态变更
Stock stockQuery = new Stock();
stockQuery.setVehicleId(taskOutRequest.getVehicleNo());
List<Stock> stocks = stockService.selStocks(stockQuery);
for (Stock tempStock : stocks) {
if (needNum <= 0){
break;
}
tempStock.setStockStatus(StockStatus.OUT.getCode());
needNum = needNum - tempStock.getRealNum();
stockService.modifyStock(tempStock);
}
// for (Stock tempStock : stocks){
// if (!Objects.equals(tempStock.getStockStatus(), StockStatus.OUT.getCode())){
// //生成回库任务
// String vehicleNo = taskOutRequest.getVehicleNo(); // 载具号
// /* 查找一个空库位 */
// Location emptyLocation = new Location();
// emptyLocation.setLocationStatus(LocationStatus.EMPTY.getCode());
// emptyLocation.setAreaId(1);
// List<Location> emptyLocations = locationMapper.selLocations(emptyLocation);
// if(emptyLocations == null) {
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("库位查找失败,网络连接异常,请稍后再试");
// return JSON.toJSONString(rsp);
// }
// if(emptyLocations.isEmpty()){
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("没有可用库位");
// return JSON.toJSONString(rsp);
// }
// Location emptyLocationItem = locationUtils.checkCanUse(emptyLocations);
// if(emptyLocationItem == null) {
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("没有可用库位或者库位存在干涉,请稍后再试");
// return JSON.toJSONString(rsp);
// }
// // 该空库位可用,生成一个入库任务,并将库存表更新库位
// // 更新库位表,占掉库位
// Location updateLocation = new Location();
// updateLocation.setLocationId(emptyLocationItem.getLocationId());
// updateLocation.setLocationStatus(LocationStatus.OCCUPY.getCode());
// updateLocation.setVehicleId(taskOutRequest.getVehicleNo());
// locationMapper.modifyLocation(updateLocation); // 占掉库位
// // ---- 更新库存中库位
// stockMapper.updateLocationIdWithBetchNo(taskOutRequest.getVehicleNo(), emptyLocationItem.getLocationId()); // 绑定载具和库位
// // 更新入库单
// appOrderInMapper.updateStatusWithVehicleNo(vehicleNo, OrderInStatusEnum.IN.getCode()); // 更新入库单为入库中
// // 添加入库任务
// Task task = new Task();
// task.setTaskId(UUID.randomUUID().toString());
// task.setTaskType(TaskType.IN.getCode());
// task.setTaskStatus(WmsTaskStatus.NEW.getCode());
// task.setTaskGroup(UUID.randomUUID().toString());
// task.setOrigin(tempTask.getDestination());
// task.setDestination(emptyLocationItem.getLocationId());
// task.setPickStand("");
// task.setWeight(0.0);
// task.setVehicleNo(taskOutRequest.getVehicleNo());
// task.setCreateTime(new Date());
// task.setUserName("wcs");
// task.setGoodsId(vehicleNo);
// task.setGoodsName("");
// task.setOperateNum(0);
// task.setTotalNum(0);
// task.setTaskPriority(1);
// int addTask = taskMapper.addTask(task);
// if(addTask > 0) {
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("存在入库任务,申请成功!");
// return JSON.toJSONString(rsp);
// }
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("添加入库任务失败,网络连接异常,请稍后再试");
// return JSON.toJSONString(rsp);
// }
// }
logger.info("更新库存状态成功");
logger.info("下发出库任务成功");
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("箱号" + taskOutRequest.getVehicleNo() + "生成出库任务成功");
return JSON.toJSONString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("创建出库任务发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage(e.getMessage());
return JSON.toJSONString(rsp);
}
}
/**
* 盘点出库
*
* @param request 请求
* @return 结果
*/
@PostMapping("/sendInventoryTask")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String sendInventoryTask(@RequestBody InventoryTask request) {
// TODO 盘点优化
logger.info("接收到盘库请求:{}ip地址{}", JSON.toJSONString(request), HttpUtils.getIpAddr(servletRequest));
ResponseEntity rsp = new ResponseEntity();
try {
// 根据ip获得站台信息
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() < 1) {// 请求的地址不是站台电脑
logger.error("请用站台电脑下发盘库任务");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("请用站台电脑下发盘库任务");
return JSON.toJSONString(rsp);
}
// 判断零件号是否输入
if (StringUtils.isEmpty(request.getGoodsId())) {
logger.error("未选择盘点零件");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("请选择盘点零件");
return JSON.toJSONString(rsp);
}
// 判断当前零件是否有其他任务
Task taskQuery2 = new Task();
taskQuery2.setGoodsId(request.getGoodsId());
taskQuery2.setVehicleNo(request.getVehicleId());
List<Task> sameGoodsTasks = taskService.selTasks(taskQuery2);
if (sameGoodsTasks.size() > 0) {
logger.error("当前零件存在其他任务");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前零件存在其他任务,请勿执行盘点");
return JSON.toJSONString(rsp);
}
// 判断库存中是否有此物料
Stock stockQuery1 = new Stock();
stockQuery1.setGoodsId(request.getGoodsId());
stockQuery1.setVehicleId(request.getVehicleId());
stockQuery1.setStockStatus(StockStatus.OK.getCode());
List<Stock> detailStocks = stockService.selStocks(stockQuery1);
List<Stock> summaryStocks = stockService.selStocksByGoodsId(stockQuery1);
if (detailStocks.size() == 0) {// 当前零件无库存
logger.error("当前零件无库存");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前零件无库存");
return JSON.toJSONString(rsp);
}
if (summaryStocks.size() == 0) {
logger.error("当前零件无库存");
// 返回错误
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("当前零件无库存");
return JSON.toJSONString(rsp);
}
for (Stock tempDetailStock : detailStocks) {
// 根据库存生成任务
// 生成出库任务
Task task = new Task();
// 任务编号
task.setTaskId(WmsUtils.generateId("PDCK"));
//task.setTaskId(UUID);
// 任务类型
task.setTaskType(TaskType.INVENTORY.getCode());
// 起点
task.setOrigin(tempDetailStock.getLocationId());
// 查找对应库位对应的站台
Location locationQuery = new Location();
locationQuery.setLocationId(tempDetailStock.getLocationId());
Location currentLocation = locationService.selLocations(locationQuery).get(0);
Stand standQuery = new Stand();
standQuery.setEquipmentId(currentLocation.getEquipmentId());
standQuery.setAllowIn(0);
standQuery.setAllowOut(1);
standQuery.setStandType(1);
Stand targetStand = standService.selStands(standQuery).get(0);
task.setDestination(targetStand.getStandId());
task.setPickStand(stands.get(0).getStandId());
// 重量
// 查找零件数据,然后计算重量
PartInfo partInfo = partInfoService.selPartByPartNo(tempDetailStock.getGoodsId());
task.setWeight(partInfo.getPartWeight() * tempDetailStock.getRealNum());// 重量
// 载具编号
task.setVehicleNo(tempDetailStock.getVehicleId());
// 尺寸
task.setVehicleSize(1);
task.setCreateTime(new Date());
// 用户名
task.setUserName(request.getUserName());
task.setGoodsId(tempDetailStock.getGoodsId());
task.setGoodsName(tempDetailStock.getGoodsName());
task.setProductionDate(tempDetailStock.getProductionDate());
task.setExpirationDate(tempDetailStock.getExpirationDate());
task.setOperateNum(0);
task.setTotalNum(tempDetailStock.getRealNum());
task.setTaskPriority(2);
tempDetailStock.setIsInventory(1);
tempDetailStock.setInventoryTaskId(task.getTaskId());
task.setTaskStatus(WmsTaskStatus.NEW.getCode());// 新建出库任务
task.setTaskGroup(WmsUtils.generateUUIDString());// group
taskService.addTask(task);
// 将库存设定为盘点出库状态
tempDetailStock.setStockStatus(StockStatus.OUT.getCode());
stockService.modifyStock(tempDetailStock);
// 将这个托盘上的其他库存都设定为盘点出库状态
List<Stock> sameVehicleStock = stockService.selStocks(new Stock(tempDetailStock.getVehicleId()));
for (Stock tempStock : sameVehicleStock) {
if (Objects.equals(tempStock.getStockId(), tempDetailStock.getStockId())) {
continue;
}
tempStock.setStockStatus(StockStatus.OUT.getCode());
stockService.modifyStock(tempStock);
}
// 将当前的载具设置为出库中
Vehicle currentVehicle = vehicleService.selVehicleById(tempDetailStock.getVehicleId());
currentVehicle.setVehicleStatus(VehicleStatus.OUT.getCode());
vehicleService.modifyVehicle(currentVehicle);
}
logger.info("创建盘点任务成功,零件号:{}", request.getGoodsId());
// 返回成功
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("创建盘库任务成功");
rsp.setReturnData(summaryStocks.size() > 0 ? summaryStocks.get(0) : new Stock());
return JSON.toJSONString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("创建盘库任务发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage(e.getMessage());
return JSON.toJSONString(rsp);
}
}
/**
* 接收WCS发送的任务结果
*
* @param wmsReceiveTaskResultEntity 请求
* @return 响应结果
*/
@PostMapping("/sendTaskResult")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String receiveTaskResult(@RequestBody WmsReceiveTaskResultEntity wmsReceiveTaskResultEntity) {
logger.info("接收到任务反馈:{}ip地址{}", wmsReceiveTaskResultEntity.toLoggerString(), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 获取任务号
String taskId = wmsReceiveTaskResultEntity.getTaskId();
Integer result = wmsReceiveTaskResultEntity.getTaskStatus();
String vehicleNo = wmsReceiveTaskResultEntity.getVehicleNo();
// 查找对应任务
Task taskForQuery = new Task();
taskForQuery.setTaskGroup(taskId);
List<Task> tasks = taskService.selTasks(taskForQuery);
if (tasks.size() < 1) {
logger.error("任务号不正确");
// 返回失败
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("任务号不正确");
return JSON.toJSONString(rsp);
}
// 设定任务类型
Integer taskType = tasks.get(0).getTaskType();
if (result.compareTo(WcsTaskStatus.FINISH.getCode()) == 0) {// 任务完成
// 回原库位
if (taskType.compareTo(TaskType.IN.getCode()) == 0) {// 入库任务
logger.info("入库任务完成,开始处理");
// 更新载具信息
Vehicle currentVehicle = vehicleService.selVehicleById(vehicleNo);
currentVehicle.setVehicleStatus(2);// 在库中
currentVehicle.setCurrentLocation(wmsReceiveTaskResultEntity.getDestination());
vehicleService.modifyVehicle(currentVehicle);
// 添加库存
for (Task task : tasks) {
if (!Objects.equals(task.getTaskType(), TaskType.IN.getCode())) {
continue;
}
if (task.getTaskId().startsWith("HK")) {// 回库的库存
// 查询是不是回库的库存
Stock stockQuery1 = new Stock();
stockQuery1.setVehicleId(vehicleNo);
stockQuery1.setGoodsId(task.getGoodsId());
List<Stock> backStocks = stockService.selStocks(stockQuery1);
for (Stock tempBackStock : backStocks) {
tempBackStock.setLocationId(task.getDestination());
tempBackStock.setStockStatus(StockStatus.OK.getCode());
tempBackStock.setLastUpdateTime(new Date());
stockService.modifyStock(tempBackStock);
logger.info("更新回库库存");
}
} else if (task.getTaskId().startsWith("RK")) {// 新增库存
if (!task.getGoodsId().equals(WmsConstants.EMPTY_STOCK_GOODS_ID)) {// 空箱入库的情况下不生成库存
Stock exsitStockQuery = new Stock();
exsitStockQuery.setVehicleId(vehicleNo);
exsitStockQuery.setGoodsId(task.getGoodsId());
List<Stock> exsitStocks = stockService.selStocks(exsitStockQuery);
if (exsitStocks.size() > 0) {// 说明该箱子上已有该零件
// 直接添加数量
Stock exsitStock = exsitStocks.get(0);
exsitStock.setRemainNum(exsitStock.getRemainNum() + task.getOperateNum());
exsitStock.setRealNum(exsitStock.getRealNum() + task.getOperateNum());
exsitStock.setStockStatus(StockStatus.OK.getCode());
exsitStock.setLocationId(task.getDestination());
stockService.modifyStock(exsitStock);
logger.info("已有库存增加数量成功:{}", JSON.toJSONString(exsitStock));
} else {
Stock stockTemp = new Stock();
stockTemp.setStockId(WmsUtils.generateId("ST"));
stockTemp.setLocationId(task.getDestination());
stockTemp.setVehicleId(vehicleNo);
stockTemp.setGoodsId(task.getGoodsId());
// 查询物料信息后设定
PartInfo partInfo = partInfoService.selPartByPartNo(task.getGoodsId());
stockTemp.setGoodsName(partInfo.getItemDesc());
if (Double.parseDouble(partInfo.getSLED()) > 0) {
stockTemp.setProductionDate(task.getProductionDate());
stockTemp.setShelfLife(Double.parseDouble(partInfo.getSLED()));
stockTemp.setExpirationDate(task.getExpirationDate());
}
stockTemp.setAvailableNum(task.getOperateNum());
stockTemp.setRemainNum(task.getOperateNum());
stockTemp.setRealNum(task.getOperateNum());
stockTemp.setProviderId(partInfo.getVendorId());
stockTemp.setProviderName(partInfo.getVendorNameCN());
stockTemp.setStockStatus(StockStatus.OK.getCode());
stockTemp.setGoodsStatus(GoodsStatus.OK.getCode());
stockTemp.setCreateTime(new Date());
stockTemp.setLastUpdateTime(new Date());
stockTemp.setIsInventory(0);
stockTemp.setCurrentLocation(task.getDestination());
logger.info("生成新库存:{}", JSON.toJSONString(stockTemp));
stockService.addStock(stockTemp);
}
}
}
// 查看当前料箱上还有没有其他料
logger.info("更新料箱上其他库存");
Stock stockQuery3 = new Stock();
stockQuery3.setVehicleId(vehicleNo);
List<Stock> backStocks3 = stockService.selStocks(stockQuery3);
for (Stock tempBackStock3 : backStocks3) {
if (Objects.equals(tempBackStock3.getGoodsId(), task.getGoodsId())) {
continue;
}
if (tempBackStock3.getRealNum() <= 0) {// 无库存
stockService.deleteStock(tempBackStock3.getStockId());
} else {
tempBackStock3.setLocationId(task.getDestination());
tempBackStock3.setStockStatus(StockStatus.OK.getCode());
stockService.modifyStock(tempBackStock3);
}
}
}
// 对完成的入库任务进行处理
for (Task task : tasks) {
// 入库任务完成,先添加任务记录,然后删除任务。
task.setTaskStatus(WmsTaskStatus.FINISH.getCode());
task.setFinishTime(new Date());
taskRecordService.addTask(task);
taskService.deleteTask(task.getTaskId());
}
} else if (taskType.compareTo(TaskType.OUT.getCode()) == 0) {// 出库任务
logger.info("出库任务完成,开始处理");
// 更改载具位置为站台
Vehicle vehicle = vehicleService.selVehicleById(vehicleNo);
vehicleService.modifyVehicle(vehicle);
// 更新库存当前位置----根据载具号查询到库存,该载具上的所有库存做统一处理。
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(vehicleNo);
List<Stock> tempStockList1 = stockService.selStocks(stockQueryParam1);
for (Stock temp : tempStockList1) {
temp.setStockStatus(StockStatus.TRANS.getCode());
temp.setCurrentLocation(wmsReceiveTaskResultEntity.getDestination());
temp.setLastUpdateTime(new Date());
stockService.modifyStock(temp);
}
for (Task task : tasks) {
if (!Objects.equals(task.getTaskType(), TaskType.OUT.getCode())) {
continue;
}
if (task.getGoodsId().equals(WmsConstants.EMPTY_STOCK_GOODS_ID)) {
task.setTaskStatus(WmsTaskStatus.FINISH.getCode());// 出库完成状态
task.setFinishTime(new Date());
taskRecordService.addTask(task);
taskService.deleteTask(task.getTaskId());
} else {
task.setTaskStatus(WmsTaskStatus.OUT_SUCCESS.getCode());// 出库完成状态
taskService.executeTask(task);
}
}
} else if (taskType.compareTo(TaskType.INVENTORY.getCode()) == 0) {// 盘点任务
logger.info("盘点任务完成,开始处理");
// 更改载具位置为站台
Vehicle vehicle = vehicleService.selVehicleById(vehicleNo);
vehicleService.modifyVehicle(vehicle);
// 更新库存当前位置----根据载具号查询到库存,该载具上的所有库存做统一处理。
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(vehicleNo);
List<Stock> tempStockList1 = stockService.selStocks(stockQueryParam1);
for (Stock temp : tempStockList1) {
temp.setStockStatus(StockStatus.TRANS.getCode());
temp.setCurrentLocation(wmsReceiveTaskResultEntity.getDestination());
temp.setLastUpdateTime(new Date());
stockService.modifyStock(temp);
}
for (Task task : tasks) {
if (!Objects.equals(task.getTaskType(), TaskType.INVENTORY.getCode())) {
continue;
}
task.setTaskStatus(WmsTaskStatus.OUT_SUCCESS.getCode());// 出库完成状态
taskService.executeTask(task);
}
}
} else if (result.compareTo(WcsTaskStatus.RUN.getCode()) == 0) {// 任务开始执行
logger.info("任务开始执行");
for (Task task : tasks) {
task.setTaskStatus(WmsTaskStatus.RUN.getCode());// 任务开始执行
taskService.executeTask(task);
}
} else if (result.compareTo(WcsTaskStatus.EXCEPTION.getCode()) == 0) {// 任务开始执行
logger.info("任务发生异常");
for (Task task : tasks) {
task.setTaskStatus(WmsTaskStatus.EXCEPTION.getCode());// 任务开始执行
taskService.executeTask(task);
}
} else if (result.compareTo(WcsTaskStatus.CANCEL.getCode()) == 0) {
if (taskType.compareTo(TaskType.IN.getCode()) == 0) {// 入库任务取消
logger.info("入库任务取消,开始处理");
for (Task tempInTask : tasks) {
if (tempInTask.getTaskId().startsWith("HK")) {// 回库任务,需要删除库存
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(vehicleNo);
stockQueryParam1.setGoodsId(tempInTask.getGoodsId());
List<Stock> tempStockList1 = stockService.selStocks(stockQueryParam1);
for (Stock temp : tempStockList1) {
stockService.deleteStock(temp.getStockId());
}
}
}
} else if (taskType.compareTo(TaskType.OUT.getCode()) == 0) {// 出库任务取消
logger.info("出库任务取消,开始处理");
// 更改载具位置为站台
logger.info("更新载具为在库中");
Vehicle vehicle = vehicleService.selVehicleById(vehicleNo);
vehicle.setVehicleStatus(VehicleStatus.ON.getCode());
vehicleService.modifyVehicle(vehicle);
// 更新库存当前位置----根据载具号查询到库存,该载具上的所有库存做统一处理。
logger.info("更新库存为正常状态");
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(vehicleNo);
List<Stock> tempStockList1 = stockService.selStocks(stockQueryParam1);
for (Stock temp : tempStockList1) {
temp.setStockStatus(StockStatus.OK.getCode());
stockService.modifyStock(temp);
}
} else if (taskType.compareTo(TaskType.INVENTORY.getCode()) == 0) {// 盘点任务取消
logger.info("盘点任务取消,开始处理");
// 更改载具位置为站台
logger.info("更新载具为在库中");
Vehicle vehicle = vehicleService.selVehicleById(vehicleNo);
vehicle.setVehicleStatus(VehicleStatus.ON.getCode());
vehicleService.modifyVehicle(vehicle);
// 更新库存当前位置----根据载具号查询到库存,该载具上的所有库存做统一处理。
logger.info("更新库存为正常状态");
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(vehicleNo);
List<Stock> tempStockList1 = stockService.selStocks(stockQueryParam1);
for (Stock temp : tempStockList1) {
temp.setStockStatus(StockStatus.OK.getCode());
stockService.modifyStock(temp);
}
}
// 更新任务状态
logger.info("删除取消的任务,并添加任务记录");
for (Task task : tasks) {
task.setTaskStatus(WmsTaskStatus.CANCEL.getCode());// 任务开始执行
task.setFinishTime(new Date());
taskService.deleteTask(task.getTaskId());
taskRecordService.addTask(task);
}
}
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常");
// 返回失败
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("发生异常,请尝试重新发送一次");
return JSON.toJSONString(rsp);
}
logger.info("获取任务反馈处理成功");
// 返回失败
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("任务处理成功");
return JSON.toJSONString(rsp);
}
/**
* WCS向WMS上报箱子到达拣货口
* @param pickTask 拣选任务
* @return 结果
*/
@PostMapping("/boxArrive")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String boxArrive(@RequestBody PickTaskResponse pickTask) {
logger.info("接收到WCS向WMS上报箱子到达拣货点{}", JSON.toJSONString(pickTask));
ResponseEntity response = new ResponseEntity();
try {
// 根据载具号加拣选点位找到对应的任务----出库任务/盘点任务
Task taskQueryParam1 = new Task();
taskQueryParam1.setVehicleNo(pickTask.getVehicleNo());
taskQueryParam1.setTaskStatus(WmsTaskStatus.OUT_SUCCESS.getCode());
List<Task> tasks = taskService.selTasks(taskQueryParam1);
if (tasks.size() < 1) {
logger.error("当前反馈的箱号{}不存在可以操作的任务", pickTask.getVehicleNo());
// 返回失败
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前反馈的箱号没有对应的任务");
return JSON.toJSONString(response);
}
// 更新当前载具的当前位置为拣选站台
Vehicle vehicle = vehicleService.selVehicleById(pickTask.getVehicleNo());
if (vehicle == null) {
logger.error("没查询到对应载具{}", pickTask.getVehicleNo());
// 返回失败
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("没查询到对应载具信息");
return JSON.toJSONString(response);
}
vehicleService.modifyVehicle(vehicle);
// 更新库存位置
Stock stockQueryParam1 = new Stock();
stockQueryParam1.setVehicleId(pickTask.getVehicleNo());
List<Stock> stocks = stockService.selStocks(stockQueryParam1);
if (stocks.size() < 1) {
logger.error("载具{}没查询到对应库存", pickTask.getVehicleNo());
// 返回失败
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("反馈的载具没查询到对应库存");
return JSON.toJSONString(response);
}
for (Stock tempStock : stocks) {
tempStock.setStockStatus(StockStatus.PICKING.getCode());
tempStock.setCurrentLocation(pickTask.getPickStand());
stockService.modifyStock(tempStock);
}
// 更新任务状态
for (Task tempTaskForPicking : tasks) {
if (Objects.equals(tempTaskForPicking.getTaskType(), TaskType.OUT.getCode())) {
// 更新任务状态
tempTaskForPicking.setTaskStatus(WmsTaskStatus.PICKING.getCode());
taskService.executeTask(tempTaskForPicking);
} else if (Objects.equals(tempTaskForPicking.getTaskType(), TaskType.INVENTORY.getCode())) {// 盘点出库
// 更新任务状态
tempTaskForPicking.setTaskStatus(WmsTaskStatus.INVENTORY.getCode());
taskService.executeTask(tempTaskForPicking);
}
}
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常:{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("发生异常");
return JSON.toJSONString(response);
}
logger.info("处理成功");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("成功");
return JSON.toJSONString(response);
}
/**
* 当前箱子请求回库
*
* @param request 请求
* @return 结果
*/
@PostMapping("/finishPicking")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String finishPicking(@RequestBody FinishPickTaskRequest request) {
logger.info("确认拣货完成:{}", JSON.toJSONString(request));
ResponseEntity response = new ResponseEntity();
try {
if (StringUtils.isEmpty(request.getTaskId())) {//
logger.error("任务号为空");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("任务号为空");
return JSON.toJSONString(response);
}
// 将当前任务信息更新
Task taskQuery1 = new Task();
taskQuery1.setTaskId(request.getTaskId());
List<Task> tasks1 = taskService.selTasks(taskQuery1);
if (tasks1.size() < 1) {
logger.error("数据库中查询不到当前正在执行的任务:{}", request.getTaskId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("数据库中查询不到当前正在执行的任务");
return JSON.toJSONString(response);
}
Task currentTask = tasks1.get(0);
currentTask.setTaskStatus(WmsTaskStatus.FINISH.getCode());
if (request.getPickNum() != null) {
currentTask.setOperateNum(request.getPickNum());
}
if (Objects.equals(currentTask.getTaskType(), TaskType.INVENTORY.getCode())) {// 盘点任务
currentTask.setOperateNum(currentTask.getTotalNum() - request.getRealNum());
}
currentTask.setFinishTime(new Date());
taskRecordService.addTask(currentTask);
taskService.deleteTask(currentTask.getTaskId());
// 根据这个任务的数据来更新库存
Stock stockQuery1 = new Stock();
stockQuery1.setVehicleId(currentTask.getVehicleNo());
stockQuery1.setGoodsId(currentTask.getGoodsId());
List<Stock> stocks = stockService.selStocks(stockQuery1);
if (stocks.size() < 1) {
logger.error("查询不到对应库存");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询不到对应库存");
return JSON.toJSONString(response);
}
Stock currentStock = stocks.get(0);
if (request.getRealNum() != null) {
currentStock.setRealNum(request.getRealNum());
if (Objects.equals(currentTask.getTaskType(), TaskType.INVENTORY.getCode())) {
currentStock.setRemainNum(currentStock.getRealNum());
currentStock.setAvailableNum(currentStock.getRealNum());
}
} else {
currentStock.setRealNum(currentStock.getRealNum() - currentTask.getOperateNum());
}
// 判断当前任务的载具号是否还有其他任务
Task taskQuery2 = new Task();
taskQuery2.setVehicleNo(request.getVehicleNo());
taskQuery2.setTaskType(TaskType.OUT.getCode());
List<Task> sameVehicleTasks = taskService.selTasks(taskQuery2);
if (sameVehicleTasks.size() > 0) {// 存在其他任务
logger.info("当前载具还有其他任务");
// 库存只更新
stockService.modifyStock(currentStock);
} else {
// 标记当前箱子入库中
// 标记当前载具为空箱
Vehicle currentVehicle = vehicleService.selVehicleById(currentTask.getVehicleNo());
currentVehicle.setVehicleStatus(VehicleStatus.IN.getCode());
vehicleService.modifyVehicle(currentVehicle);
//查找到对应的入库站台
Stand standQuery2 = new Stand();
standQuery2.setAllowIn(1);
standQuery2.setAllowOut(0);
standQuery2.setStandType(1);
// 判断库存是否为0
if (currentStock.getRealNum() <= 0) {// 库存为0
logger.info("拣货后库存为0空箱回库");
// 删除当前库存
stockService.deleteStock(currentStock.getStockId());
// 根据这个任务的数据来更新库存
Stock stockQuery2 = new Stock();
stockQuery2.setVehicleId(currentTask.getVehicleNo());
List<Stock> stocks2 = stockService.selStocks(stockQuery2);
// 判断当前载具上是否还有其他库存
if (stocks2.size() == 0) {// 当前载具是空托
// 标记当前载具为空箱
currentVehicle.setIsEmpty(1);
vehicleService.modifyVehicle(currentVehicle);
} else {// 更新载具上其他库存为回库状态
for (Stock tempSameVehicleStock : stocks2) {
tempSameVehicleStock.setStockStatus(StockStatus.BACKING.getCode());
stockService.modifyStock(tempSameVehicleStock);
}
}
// 生成空托回库任务---回到原来位置
Task emptyBackTask = new Task();
emptyBackTask.setTaskId(WmsUtils.generateId("HK"));
emptyBackTask.setTaskType(TaskType.IN.getCode());
emptyBackTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
emptyBackTask.setTaskGroup(WmsUtils.generateUUIDString());
emptyBackTask.setDestination(currentStock.getLocationId());
// 根据库位查找站台
Location currentLocation = locationService.selLocations(new Location(currentStock.getLocationId())).get(0);
standQuery2.setEquipmentId(currentLocation.getEquipmentId());
List<Stand> availableStands = standService.selStands(standQuery2);
emptyBackTask.setOrigin(availableStands.get(0).getStandId());
emptyBackTask.setWeight((double) 0);
emptyBackTask.setVehicleNo(currentTask.getVehicleNo());
emptyBackTask.setVehicleSize(0);
emptyBackTask.setCreateTime(new Date());
emptyBackTask.setUserName(currentTask.getUserName());
emptyBackTask.setGoodsId(WmsConstants.EMPTY_STOCK_GOODS_ID);
emptyBackTask.setTaskPriority(1);
taskService.addTask(emptyBackTask);
} else {
logger.info("拣货后库存不为0回库");
// 更新库存
currentStock.setRemainNum(currentStock.getRealNum());
stockService.modifyStock(currentStock);
// 设置当前载具的其他库存也为回库中
Stock stockQuery2 = new Stock();
stockQuery2.setVehicleId(currentTask.getVehicleNo());
List<Stock> stocks2 = stockService.selStocks(stockQuery2);
for (Stock sameVehicleStock : stocks2) {
sameVehicleStock.setStockStatus(StockStatus.BACKING.getCode());
stockService.modifyStock(sameVehicleStock);
}
// 生成入库任务
Task backTask = new Task();
backTask.setTaskId(WmsUtils.generateId("HK"));
backTask.setTaskType(TaskType.IN.getCode());
backTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
backTask.setTaskGroup(WmsUtils.generateUUIDString());
backTask.setDestination(currentStock.getLocationId());
// 根据库位查找站台
Location currentLocation = locationService.selLocations(new Location(currentStock.getLocationId())).get(0);
standQuery2.setEquipmentId(currentLocation.getEquipmentId());
List<Stand> availableStands = standService.selStands(standQuery2);
backTask.setOrigin(availableStands.get(0).getStandId());
backTask.setWeight((double) 0);
backTask.setVehicleNo(currentTask.getVehicleNo());
backTask.setVehicleSize(0);
backTask.setCreateTime(new Date());
backTask.setUserName(currentTask.getUserName());
backTask.setGoodsId(currentStock.getGoodsId());
backTask.setGoodsName(currentStock.getGoodsName());
backTask.setProductionDate(currentStock.getProductionDate());
backTask.setExpirationDate(currentStock.getExpirationDate());
backTask.setOperateNum(currentStock.getRealNum());
backTask.setTotalNum(currentStock.getRealNum());
backTask.setTaskPriority(1);
taskService.addTask(backTask);
}
}
logger.info("物料回库成功");
response.setCode(0);
response.setMessage("成功");
return JSON.toJSONString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常:{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("发生异常");
return JSON.toJSONString(response);
}
}
/**
* 查找所有任务
*/
@PostMapping("/getTasks")
@ResponseBody
public String getTasks(@RequestBody TableRequest<Task, String> tableRequest) {
TableResponse tblResp = new TableResponse();
// 解析请求数据
if (tableRequest == null || tableRequest.getPage() == null) {
tblResp.setCode(ResponseCode.ERROR.getCode());
tblResp.setMessage("请求数据为空,无法处理!");
logger.error("请求数据为空,无法处理!");
return JSON.toJSONString(tblResp);
}
// 处理分页信息
PageDomain pageRequest = tableRequest.getPage();
String[] orderByArr = {"task_id", "task_type", "task_status", "goods_id", "goods_name", "task_priority", "expiration_date", "create_time"};
String orderByStr;
if (StringUtils.isNotEmpty(pageRequest.getOrderByColumn()) && Arrays.asList(orderByArr).contains(StringUtils.toUnderScoreCase(pageRequest.getOrderByColumn()))) {
orderByStr = pageRequest.getOrderBy();
} else {
// 默认排序
orderByStr = "";
}
Task taskQuery = new Task();
taskQuery.setTaskType(tableRequest.getParam().getTaskType());
taskQuery.setGoodsId(tableRequest.getParam().getGoodsId());
taskQuery.setVehicleNo(tableRequest.getParam().getVehicleNo());
// 查找对应站台
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() > 0 && (Objects.equals(taskQuery.getTaskType(), TaskType.OUT.getCode()) || Objects.equals(taskQuery.getTaskType(), TaskType.INVENTORY.getCode()))) {
taskQuery.setPickStand(stands.get(0).getStandId());
}
PageHelper.startPage(pageRequest.getPageNum(), pageRequest.getPageSize(), orderByStr);
List<Task> tasks = taskService.selTaskList(taskQuery);
PageInfo<Task> taskPageInfo = new PageInfo<>(tasks);
tblResp.setCode(ResponseCode.OK.getCode());
tblResp.setMessage("查询任务成功!");
tblResp.setRows(taskPageInfo.getList());
tblResp.setTotal(taskPageInfo.getTotal());
return JSON.toJSONString(tblResp);
}
/**
* 根据参数查询wms任务
*/
@PostMapping("/getTaskByTask")
@ResponseBody
public String getTaskByTask(@RequestBody Task request) {
ResponseEntity response = new ResponseEntity();
if (request == null) {
logger.error("请求参数为空");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求参数为空");
return JSON.toJSONString(response);
}
List<Stand> stands = standService.selStands(new Stand(2, HttpUtils.getIpAddr(servletRequest), 0));
if (stands.size() > 0) {
request.setPickStand(stands.get(0).getStandId());
} else {
request.setPickStand("other");
}
List<Task> tasks = taskService.selTasks(request);
response.setCode(ResponseCode.OK.getCode());
response.setMessage("成功");
response.setReturnData(tasks.size() > 0 ? tasks.get(0) : null);
return JSON.toJSONString(response);
}
}