现场调试更改

This commit is contained in:
lsymicc
2026-09-12 09:26:24 +08:00
parent abeb081825
commit 8ddae081cd
29 changed files with 2579 additions and 146 deletions

View File

@@ -10,10 +10,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.log.domain.RequestLog;
import com.ruoyi.log.service.IRequestLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/wmsService/wcs")
@@ -37,6 +36,19 @@ public class WcsServiceController extends BaseController {
return ajaxResult;
}
/**
* 手动指定货位出库
*/
@PostMapping("/stockoutByManual")
public AjaxResult stockoutByManual(@RequestBody Map<String, String> params) {
AjaxResult ajaxResult = apiWcsService.stockoutByManual(params);
RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(params), "创建入库任务请求", ajaxResult);
requestLogService.insertRequestLog(requestLog);
return ajaxResult;
}
/**
* 请求补码作业
*/

View File

@@ -15,7 +15,7 @@ public interface IApiWcsService {
* 呼叫可用容器出库
* @return
*/
public AjaxResult callContainerOut(String cargoAreaId, Integer type);
public AjaxResult callContainerOut(Map<String, Object> params);
/**
* 响应wcs请求-下发入库任务

View File

@@ -21,6 +21,7 @@ import com.ruoyi.bas.stock.service.IBasStockInfoService;
import com.ruoyi.bas.stock.service.IBasStockService;
import com.ruoyi.common.*;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.in.bind.domain.InTrayMsg;
import com.ruoyi.in.bind.service.IInTrayMsgService;
@@ -38,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.*;
@@ -85,26 +87,29 @@ public class ApiWcsService implements IApiWcsService {
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult callContainerOut(String cargoAreaId, Integer type){
public AjaxResult callContainerOut(Map<String, Object> params){
String cargoAreaId = (String) params.get("cargoAreaId");
int type = Convert.toInt(params.get("palletType"), 0);
//获取立库区域和托盘类型
List<BasCargoSpace> basCargoSpaces = basCargoSpaceService.selectAllBasCargoSpaceForStockout(
List<BasCargoSpace> basCargoSpaceEmptyTray = basCargoSpaceService.selectBasCargoSpaceListForEmptyTray(
new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
);
// List<BasCargoSpace> basCargoSpaceContainer = basCargoSpaceService.selectBasCargoSpaceListForContainer(
// new BasCargoSpace().builder().cargoAreaId(cargoAreaId).theType(type).build()
// );
List<BasStock> stocks = basStockService.selectBasStockList(
new BasStock().builder().productId("KTP0001").stockStatus("1").build()
);
if (stocks.isEmpty()) {
if (basCargoSpaceEmptyTray.isEmpty()) {
log.info("【呼叫容器】空容器呼叫失败,无可用的空容器库存");
//todo 此处可查存放库存较少的托盘出库
}else{
BasStock stock = stocks.get(0);
//要执行容器出库的货位
BasCargoSpace cargoSpaceCurrent = basCargoSpaceEmptyTray.get(0);
//检查出库货位是否触发移库作业 - 双伸货位出库查询单伸是否有货
BasCargoSpace cargoSpaceCurrent = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId());//要出库的货位
if (cargoSpaceCurrent.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y)){//是否处于双伸位
BasCargoSpace cargoSpaceInSide = basCargoSpaceService.selectAnotherBasCargoSpaceBySameGroup(cargoSpaceCurrent);//获取【要出库货位】对应的【单伸货位】
//如果外侧有货,先执行移库
@@ -159,9 +164,14 @@ public class ApiWcsService implements IApiWcsService {
"【空托出库-移库】推送成功,作业号:{},托盘条码:{},移库货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId()
);
//更新库存表货位【占用】状态
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(cargoSpaceCurrent.getTrayCode());
if (!stocks.isEmpty()){
for (BasStock stock : stocks) {
//更新库存表货位【占用】状态
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
}
//更新货位表【预占用】状态
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpaceInSide.getCargoSpaceId(),cargoSpaceInSide.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
@@ -174,34 +184,40 @@ public class ApiWcsService implements IApiWcsService {
}
if (basCargoSpaces.stream().anyMatch(s -> s.getCargoSpaceId().equals(stock.getCargoSpaceId()))) {
//生成空托出库作业
if (mydoJobService.selectMydoJobByTrayCode(stock.getTrayCode()) == null) {
//库存号 - 用于获取托盘号
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByStockId(stock.getStockId());
//作业号
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET);
//判断托盘【未满】或【空】区分任务类型
int taskType = TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY;
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
.taskNo(taskNo)
.inOrOut(taskType)
.trayCode(stockInfo.getTrayCode())
.status(TaskStatusEnum.READY.getCode())
.cargoSpaceId(stock.getCargoSpaceId())
.trayType(type)
.executionPhase("0")
.warehouseId("01")
.build();
mydoJobService.insertMydoJob(mydoJob);
//生成容器出库作业
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpaceCurrent.getTrayCode());
if (ObjUtil.isNull(job)) {
//库存号 - 用于判断容器是【空托】或者【带货托盘】
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(cargoSpaceCurrent.getTrayCode());
//判断托盘【未满】或【空】区分任务类型
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET);
int taskType = TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY;
if (stockInfo.getEmptyStatus() > 0){
taskType = TaskType.TASKTYPE_STOCKOUT_CONTAINER;
}
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
.taskNo(taskNo)
.inOrOut(taskType)
.trayCode(cargoSpaceCurrent.getTrayCode())
.status(TaskStatusEnum.READY.getCode())
.cargoSpaceId(cargoSpaceCurrent.getCargoSpaceId())
.trayType(type)
.executionPhase("0")
.warehouseId("01")
.build();
mydoJobService.insertMydoJob(mydoJob);
}
return AjaxResult.success();
}
return AjaxResult.success();
return AjaxResult.error();
}
@@ -245,27 +261,16 @@ public class ApiWcsService implements IApiWcsService {
return AjaxResult.error("未找到该托盘的绑定信息,请确认是否有绑定操作");
}
//--------------------------- 入库货位分配 ---------------------------
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
BasCargoSpace cargoParam;
if (wcsStockinReiceive.getHeight() == 1){
//低货位380H - 不限制高度
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
}else{
//高货位510H - 只能放指定层高的货位
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
}
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
if (cargoParam == null) {
log.warn("【货位分配】该类型托盘立库中无可用货位");
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
}
//检查当前条码是否已经生成作业
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
String jobId;
String taskNo;
int taskType;
String instockinId;
String instockinDetailId;
BasCargoSpace basCargoSpace;
//>>>判断入库类型
if (trayMsgs.stream().anyMatch(s -> s.getProductId().equals(ProductType.EMPTY_TRAY))){
@@ -288,11 +293,25 @@ public class ApiWcsService implements IApiWcsService {
}
//检查当前条码是否已经生成作业
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode());
if (ObjUtil.isEmpty(mydoJob)) {
//--------------------------- 入库货位分配 ---------------------------
//区分高矮货,只能在堆垛机上获取货物高度,高货位可放全部高度的托盘
BasCargoSpace cargoParam;
if (wcsStockinReiceive.getHeight() == 1){
//低货位380H - 不限制高度
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).build();
}else{
//高货位510H - 只能放指定层高的货位
cargoParam = new BasCargoSpace().builder().theType(type).cargoAreaId(wcsStockinReiceive.getCargoAreaId()).theHeight(wcsStockinReiceive.getHeight()).build();
}
BasCargoSpace cargoStockin = basCargoSpaceService.selectBasCargoSpaceForStockin(cargoParam);
basCargoSpace = cargoStockin;
if (cargoParam == null) {
log.warn("【货位分配】该类型托盘立库中无可用货位");
return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位");
}
//>>>生成wms的入库主作业
MydoJob mydoJobNew = new MydoJob().builder()
.jobId(jobId)
@@ -314,6 +333,7 @@ public class ApiWcsService implements IApiWcsService {
log.info("【wms生成入库】<空托入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJobNew.getJobId() ,mydoJobNew.getTaskNo() ,mydoJobNew.getTrayCode(), cargoStockin.getCargoSpaceId());
}else{
log.info("【提示】<常规入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode());
basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
}
//>>>根据绑定物料信息条数循环生成子作业,单条绑定信息对应一条子任务
@@ -347,7 +367,6 @@ public class ApiWcsService implements IApiWcsService {
.build();
mydoJobDetailService.insertMydoJobDetail(detail);
}
}else {
instockinId = trayMsg.getStockinId();
instockinDetailId = trayMsg.getStockinDetailId() + sum;
@@ -368,7 +387,7 @@ public class ApiWcsService implements IApiWcsService {
.stockinId(instockinId)
.stockinDetailId(instockinDetailId)
.status(0)
.trayType(cargoStockin.getTheType())
.trayType(type)
.build();
mydoJobDetailService.insertMydoJobDetail(detail);
}
@@ -378,8 +397,8 @@ public class ApiWcsService implements IApiWcsService {
}
//货位状态更新为【入库预占用】
cargoStockin.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
basCargoSpaceService.updateBasCargoSpace(cargoStockin);
basCargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
//返回wcs的响应信息
WcsStockinResponse response = new WcsStockinResponse()
@@ -389,10 +408,10 @@ public class ApiWcsService implements IApiWcsService {
.taskNo(taskNo)
.taskType(taskType)
.trayCode(wcsStockinReiceive.getTrayCode())
.cargoSpaceId(cargoStockin.getCargoSpaceId())
.cargoSpaceId(basCargoSpace.getCargoSpaceId())
.build();
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, cargoStockin.getCargoSpaceId());
log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",jobId ,taskNo, basCargoSpace.getCargoSpaceId());
return AjaxResult.success(response);
@@ -401,28 +420,31 @@ public class ApiWcsService implements IApiWcsService {
/**
* 指定货位出库
* @param cargoSpaceId
* @param params
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult stockoutByManual(String cargoSpaceId){
public AjaxResult stockoutByManual(Map<String, String> params){
String cargoSpaceId = params.get("cargoSpaceId");
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
if (ObjUtil.isNull(cargoSpace)){
log.warn("【操作失败】找不到该货位,可能是货位信息错误,请联系管理员,货位号:", cargoSpaceId);
log.warn("【操作失败】找不到该货位,可能是货位异常或参数错误,请联系管理员,货位号:", cargoSpaceId);
return AjaxResult.error("找不到该货位信息");
}
if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
}
// if (!cargoSpace.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){
// log.warn("【操作失败】该货位已被其它任务预占用,请等待任务执行完成后重试,货位号:", cargoSpaceId);
// return AjaxResult.error("该货位已被其它任务预占用,请等待任务执行完成后重试");
// }
MydoJob job = mydoJobService.selectMydoJobByTrayCode(cargoSpace.getTrayCode());
if (ObjUtil.isNull(job)){
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET);
int taskType = TaskType.TASKTYPE_STOCKIN_EMPTY_TRAY;
String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_MANUAL);
String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT);
int taskType = TaskType.TASKTYPE_STOCKOUT_MANUAL;
MydoJob mydoJob = new MydoJob().builder()
.jobId(jobId)
@@ -441,7 +463,7 @@ public class ApiWcsService implements IApiWcsService {
.build();
mydoJobService.insertMydoJob(mydoJob);
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
log.info("【wms生成出库】<指定货位出库>作业,作业号:{},任务号:{},托盘号:{},出库货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), cargoSpaceId);
List<BasStock> stocks = basStockService.selectBasStockList(
new BasStock().builder().cargoSpaceId(cargoSpaceId).build()

View File

@@ -29,6 +29,22 @@ public interface BasCargoSpaceMapper
*/
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 带货容器
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
/**
* 新增货位信息
*
@@ -66,6 +82,7 @@ public interface BasCargoSpaceMapper
* @return
*/
List<BasCargoSpaceStatus> selectBasCargoSpaceListByGroupByStatus(BasCargoSpace basCargoSpace);
/**
* 查询排列表
* @param basCargoSpace

View File

@@ -29,6 +29,24 @@ public interface IBasCargoSpaceService
public List<BasCargoSpace> selectBasCargoSpaceList(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace);
/**
* 查询货位信息列表 - 非空载货托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息集合
*/
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace);
/**
* 新增货位信息
*

View File

@@ -46,6 +46,30 @@ public class BasCargoSpaceServiceImpl implements IBasCargoSpaceService
return basCargoSpaceMapper.selectBasCargoSpaceList(basCargoSpace);
}
/**
* 查询货位信息列表 - 空托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息
*/
@Override
public List<BasCargoSpace> selectBasCargoSpaceListForEmptyTray(BasCargoSpace basCargoSpace)
{
return basCargoSpaceMapper.selectBasCargoSpaceListForEmptyTray(basCargoSpace);
}
/**
* 查询货位信息列表 - 非空载货托盘
*
* @param basCargoSpace 货位信息
* @return 货位信息
*/
@Override
public List<BasCargoSpace> selectBasCargoSpaceListForContainer(BasCargoSpace basCargoSpace)
{
return basCargoSpaceMapper.selectBasCargoSpaceListForContainer(basCargoSpace);
}
/**
* 新增货位信息
*

View File

@@ -29,6 +29,15 @@ public interface BasStockMapper
public List<BasStock> selectBasStockList(BasStock basStock);
/**
* 查询库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
/**
* 查询指定物料的所有库存信息
* @param productId

View File

@@ -56,6 +56,14 @@ public interface IBasStockService
*/
public List<BasStock> selectBasStockList(BasStock basStock);
/**
* 查询空托盘库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock);
/**
* 新增库存信息

View File

@@ -91,6 +91,17 @@ public class BasStockServiceImpl implements IBasStockService
return basStockMapper.selectBasStockList(basStock);
}
/**
* 查询空托盘库存信息列表
*
* @param basStock 库存信息
* @return 库存信息集合
*/
@Override
public List<BasStock> selectBasStockListForEmptyTray(BasStock basStock){
return basStockMapper.selectBasStockListForEmptyTray(basStock);
}
/**
* 新增库存信息
*

View File

@@ -38,6 +38,11 @@ public class JobIdType {
*/
public static final String MYDOJOB_STOCKOUT = "CK";
/**
* 指定货位出库任务
*/
public static final String MYDOJOB_STOCKOUT_MANUAL = "ZC";
/**
* 移库任务
*/

View File

@@ -465,7 +465,8 @@ public class MydoJobServiceImpl implements IMydoJobService
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT || type == TaskType.TASKTYPE_STOCKOUT_PICKING || type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
if (type == TaskType.TASKTYPE_STOCKOUT ||
type == TaskType.TASKTYPE_STOCKOUT_PICKING){
//子任务
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
@@ -494,7 +495,6 @@ public class MydoJobServiceImpl implements IMydoJobService
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
log.info("【账务处理】移除库存信息,更新单据出库分配数量,作业号:{},库存编号:{},辊号:{}", jobId, detail.getStockinDetailId(), detail.getRollerNumber());
}
}
@@ -507,12 +507,6 @@ public class MydoJobServiceImpl implements IMydoJobService
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
// mydoJobMapper.updateMydoJob(mydoJob);
// deleteMydoJobByJobId(jobId);
//
// //2.并移除所有子作业
// mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
// mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
@@ -520,6 +514,7 @@ public class MydoJobServiceImpl implements IMydoJobService
}
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 移库任务 <<<<<<<<<<<<<<<<<<<<<<<<
@@ -561,6 +556,37 @@ public class MydoJobServiceImpl implements IMydoJobService
return AjaxResult.success();
}
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>> 手动指定货位出库 <<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT_MANUAL){
//--------------------处理库存信息--------------------
//移除指定辊号的库存明细
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
log.info("【账务处理-手动出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
mydoJobMapper.updateMydoJob(mydoJob);
deleteMydoJobByJobId(jobId);
//2.并移除所有子作业
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理-手动出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();
}
return AjaxResult.error();
}
@@ -581,13 +607,6 @@ public class MydoJobServiceImpl implements IMydoJobService
log.warn("【任务完成】查不到该作业,请检查作业状态,作业号:" + jobId);
return AjaxResult.error("查不到该作业,请检查作业状态");
}
//子任务
// List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);
// if (details.isEmpty()){
// log.warn("【任务完成】查不到该作业对应的子单明细,请检查子单状态,任务号:" + jobId);
// return AjaxResult.error("查不到该作业对应的子单明细,请检查子单状态");
// }
//--------------------处理库存信息--------------------
//>>>>>>>>>>>>>>>>>>>>>>> 空托入库 <<<<<<<<<<<<<<<<<<<<<<<<
@@ -640,7 +659,6 @@ public class MydoJobServiceImpl implements IMydoJobService
);
log.info("【账务处理-空托盘】新增库存明细,作业号:{},库存编号:{},托盘号:{}", jobId, stockId, mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
@@ -659,7 +677,80 @@ public class MydoJobServiceImpl implements IMydoJobService
//3.移除当前托盘的绑定信息
inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode());
log.info("【账务处理-空托盘】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
log.info("【账务处理-载货容器出库】移除任务数据,生成历史记录,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();
}
//>>>>>>>>>>>>>>>>>>>>>>>带货托盘出库<<<<<<<<<<<<<<<<<<<<<<<<
if (type == TaskType.TASKTYPE_STOCKOUT_CONTAINER){
//>>>>>>>>>>>>>>>>>>>>>>> 生成回流 <<<<<<<<<<<<<<<<<<<<<<<<
//获取托盘剩余库存
String trayCode = mydoJob.getTrayCode();
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(trayCode);
int trayType = getTrayTypeByTrayCode(trayCode);
//空托盘回流
if (stocks.isEmpty()){
inTrayMsgService.insertInTrayMsg(
new InTrayMsg().builder()
.trayCode(trayCode)
.quantity(BigDecimal.ONE)
.productId(ProductType.EMPTY_TRAY)
.warehouseId("01")
.rollerNumber(ProductType.EMPTY_TRAY)
.trayType(trayType)
.status(1)
.createTime(DateUtil.date())
.build()
);
log.info("【非空容器绑定回流】<非空容器入库>生成绑定信息成功,托盘号:{}", trayCode);
}else{
for (BasStock stock : stocks){
inTrayMsgService.insertInTrayMsg(
new InTrayMsg().builder()
.trayCode(trayCode)
.quantity(stock.getQuantity())
.warehouseId("01")
.rollerNumber(stock.getRollerNumber())
.trayType(trayType)
.status(2)
.createTime(DateUtil.date())
.build()
);
basStockService.deleteBasStockByRollerNumber(stock.getRollerNumber());
log.info("【非空容器绑定回流】<非空容器入库>移除当前版辊库存明细,生成绑定信息成功,托盘号:{},辊号:{}", trayCode, stock.getRollerNumber());
}
basStockInfoService.deleteBasStockInfoByTrayCode(trayCode);
log.info("【非空容器绑定回流】<非空容器入库>移除主表库存信息,托盘号:{}}", trayCode);
}
//--------------------处理库存信息--------------------
//移除指定辊号的库存明细
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
//--------------------更新货位状态--------------------
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId());
basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
log.info("【账务处理-载货容器出库】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
//--------------------处理任务表和子任务表--------------------
//1.更新任务主表状态并移除作业
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
mydoJobMapper.updateMydoJob(mydoJob);
deleteMydoJobByJobId(jobId);
//2.并移除所有子作业
mydoJobDetailService.insertMydoJobDetailsForJobFinish(jobId);
mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId);
log.info("【账务处理-载货容器出库】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
return AjaxResult.success();

View File

@@ -316,13 +316,13 @@ public class PdaController extends BaseController {
/**
* 呼叫空托出库
* @param palletType 托盘类型
* @param params 货位区域,托盘类型
* @return
*/
@PostMapping("/callStockOutForContainer")
@PreAuthorize("@ss.hasPermi('out:bound:task:info')")
public AjaxResult callStockOutForEmptyPallet(String cargoAreaId, Integer palletType) {
return pdaService.callContainerStockOut(cargoAreaId, palletType);
public AjaxResult callStockOutForEmptyPallet(@RequestBody Map<String, Object> params) {
return pdaService.callContainerStockOut(params);
}

View File

@@ -130,10 +130,10 @@ public interface IPdaService {
/**
* 呼叫空托盘出库
* @param palletType 托盘类型
* @param params 托盘类型
* @return
*/
AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType);
AjaxResult callContainerStockOut(Map<String, Object> params);
/**

View File

@@ -489,10 +489,9 @@ public class PdaServiceImpl implements IPdaService {
}
@Override
public AjaxResult callContainerStockOut(String cargoAreaId, Integer palletType){
return apiWcsService.callContainerOut(cargoAreaId, palletType);
public AjaxResult callContainerStockOut(Map<String, Object> params){
return apiWcsService.callContainerOut(params);
}
@@ -638,8 +637,6 @@ public class PdaServiceImpl implements IPdaService {
}
//移除剩余库存 - 生成回流任务和任务明细绑定信息
return AjaxResult.success("确认成功");

View File

@@ -55,6 +55,7 @@ public class MydoJobHandler {
@Autowired
IInTrayMsgService intrayMsgService;
private static final int TIMEINTERVAL_DEFAULT = 1000;
private static final int TIMEINTERVAL_2000 = 2000;
private static final int TIMEINTERVAL_5000 = 5000;
@@ -104,6 +105,9 @@ public class MydoJobHandler {
basStockInfoService.updateBasStockInfo(stockInfo);
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info(
"【账务处理-移库】任务作废,更新库存和货位信息,作业号:{},托盘号:{},源位置:{},目标位置:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId(), mydoJob.getTargetCargoSpaceId()
);
@@ -120,12 +124,19 @@ public class MydoJobHandler {
for (MydoJobDetail mydoJobDetail : details){
//还原子单数量
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(mydoJobDetail.getRollerNumber());
inStockinDetail.setScanNum(BigDecimal.ZERO);
inStockinDetail.setAssignNum(BigDecimal.ZERO);
inStockinDetail.setStatus(0);
inStockinDetailService.updateInStockinDetail(inStockinDetail);
if (ObjUtil.isNotNull(inStockinDetail)){
inStockinDetail.setScanNum(BigDecimal.ZERO);
inStockinDetail.setAssignNum(BigDecimal.ZERO);
inStockinDetail.setStatus(0);
inStockinDetailService.updateInStockinDetail(inStockinDetail);
}
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
// apiWcsService.cancelWcsMydojob()
log.info("【账务处理-入库】任务作废,更新货位信息,作业号:{}", mydoJob.getJobId());
return;
}
@@ -143,12 +154,17 @@ public class MydoJobHandler {
for (MydoJobDetail mydoJobDetail : details){
//还原子单数量
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByRollerNumber(mydoJobDetail.getRollerNumber());
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
outStockoutDetail.setStatus(0);
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
if(ObjUtil.isNotNull(outStockoutDetail)){
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
outStockoutDetail.setStatus(0);
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
}
}
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
log.info("【账务处理-出库】任务作废,更新货位和库存信息,作业号:{}", mydoJob.getJobId());
}

View File

@@ -68,7 +68,55 @@ public class RequestWcsHandler {
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
if (ajaxResult.isSuccess()){
log.info("【推送出库】<容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
log.info("【推送出库】<空容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
mydoJobService.updateMydoJob(mydoJob);
//更新库存状态【占用中】
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
//更新货位状态【出库预占用】
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
}
}
}
/**
* 推送wcs带货容器出库作业
*/
@Scheduled(fixedRate = TIMEINTERVAL_2000)
public void sendWcsContainerTask(){
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
new MydoJob().builder()
.inOrOut(TaskType.TASKTYPE_STOCKOUT_CONTAINER)
.status(TaskStatusEnum.READY.getCode())
.build()
);
if (mydoJobs.isEmpty()) return;
for (MydoJob mydoJob : mydoJobs) {
//初始化参数
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("reqCode", UUID.randomUUID().toString());//请求码
paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号
paramMap.put("taskNo", mydoJob.getTaskNo());//容器编号
paramMap.put("jobId", mydoJob.getJobId());
paramMap.put("inOrOut", mydoJob.getInOrOut());
paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());
AjaxResult ajaxResult = apiWcsService.sendEmptyTrayOutMydoJob(paramMap);
if (ajaxResult.isSuccess()){
log.info("【推送出库】<带货容器>出库,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
mydoJobService.updateMydoJob(mydoJob);
@@ -121,9 +169,11 @@ public class RequestWcsHandler {
//更新库存状态【占用中】
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
if (!stocks.isEmpty()){
for (BasStock stock : stocks) {
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
basStockService.updateBasStock(stock);
}
}
//更新货位状态【出库预占用】

View File

@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="roadwayId != null and roadwayId != ''"> and roadway_id = #{roadwayId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theType != null and theType != ''"> and the_type = #{theType}</if>
@@ -64,6 +65,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where>
order by cargo_space_id asc
</select>
<select id="selectBasCargoSpaceListForEmptyTray" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
bs.product_id, bs.stock_status
from bas_cargo_space bcs
inner join bas_stock_detail bs on bs.cargo_space_id = bcs.cargo_space_id and bs.product_id = 'KTP0001' and bs.stock_status = '1'
where
bcs.cargo_area_id = #{cargoAreaId}
and bcs.the_type = #{theType}
and bcs.status = '2'
and bcs.locked = 'N'
order by bcs.iss_double asc, bcs.cargo_space_id asc
</select>
<select id="selectBasCargoSpaceListForContainer" parameterType="BasCargoSpace" resultMap="BasCargoSpaceResult">
select bcs.cargo_space_id, bcs.warehouse_id, bcs.roadway_id, bcs.cargo_area_id, bcs.the_type, bcs.the_type_name,
bcs.cargo_space_name, bcs.the_platoon, bcs.the_column, bcs.the_floor, bcs.status, bcs.locked, bcs.tray_code,
bcs.iss_double, bcs.group_coding_no, bcs.group_coding, bcs.cargo_space_logo, bcs.this_cargo_area,
bcs.dept_id, bcs.dept_name, bcs.the_weight, bcs.the_height,
bs.empty_status
from bas_cargo_space bcs
inner join bas_stock bs on bs.cargo_space_id = bcs.cargo_space_id
where
bcs.cargo_area_id = #{cargoAreaId}
and bcs.the_type = #{theType}
and bcs.status = '2'
and bcs.locked = 'N'
order by bcs.iss_double asc, bcs.cargo_space_id asc, bs.empty_status asc
</select>
<select id="selectBasCargoSpaceByCargoSpaceId" parameterType="String" resultMap="BasCargoSpaceResult">
<include refid="selectBasCargoSpaceVo"/>
@@ -106,6 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVoTop1"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -134,6 +168,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -162,6 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVoTop1"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>
@@ -190,6 +226,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectBasCargoSpaceVo"/>
<where>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and cargo_space_id = #{cargoSpaceId}</if>
<if test="cargoAreaId != null and cargoAreaId != ''"> and cargo_area_id = #{cargoAreaId}</if>
<if test="theTypeName != null and theTypeName != ''"> and the_type_name like concat('%', #{theTypeName}, '%')</if>
<if test="cargoSpaceName != null and cargoSpaceName != ''"> and cargo_space_name like concat('%', #{cargoSpaceName}, '%')</if>

View File

@@ -74,6 +74,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="supplierName != null and supplierName != ''"> and bs.supplier_name like concat('%', #{supplierName}, '%')</if>
${params.warehouseScope}
</select>
<select id="selectBasStockListForEmptyTray" parameterType="BasStock" resultMap="BasStockResult">
select bs.stock_id, bs.stock_detail_id, bs.cargo_space_id, bs.stock_status, bs.product_status,
bs.lot_no, bs.in_date, bs.back_date, bs.product_id, bs.product_name,bs.roller_number,
bs.quantity, bs.job_id, bs.job_detail_id, bs.tray_code, bs.out_quantity,
bs.stockin_detail_id, bs.stockin_id, bs.in_type, bs.warehouse_id, bs.warehouse_name,
bs.user_id, bs.user_name, bs.dept_id, bs.dept_name, bs.supplier_id, bs.supplier_name, bcs.iss_double, bcs.cargo_area_id, bcs.the_type
from bas_stock_detail bs
left join bas_cargo_space bcs on bs.cargo_space_id = bcs.cargo_space_id
where
bcs.status = '2' and
bs.product_id = 'KTP0001' and
bs.stock_status = '1'
<if test="cargoSpaceId != null and cargoSpaceId != ''"> and bs.cargo_space_id = #{cargoSpaceId}</if>
<if test="productStatus != null and productStatus != ''"> and bs.product_status = #{productStatus}</if>
<if test="lotNo != null and lotNo != ''"> and bs.lot_no = #{lotNo}</if>
<if test="params.beginInDate != null and params.beginInDate != '' and params.endInDate != null and params.endInDate != ''"> and bs.in_date between #{params.beginInDate} and #{params.endInDate}</if>
<if test="params.beginBackDate != null and params.beginBackDate != '' and params.endBackDate != null and params.endBackDate != ''"> and bs.back_date between #{params.beginBackDate} and #{params.endBackDate}</if>
<if test="productName != null and productName != ''"> and bs.product_name like concat('%', #{productName}, '%')</if>
<if test="rollerNumber != null and rollerNumber != ''"> and bs.roller_number like concat('%', #{rollerNumber}, '%')</if>
<if test="quantity != null "> and bs.quantity = #{quantity}</if>
<if test="jobId != null and jobId != ''"> and bs.job_id = #{jobId}</if>
<if test="jobDetailId != null and jobDetailId != ''"> and bs.job_detail_id = #{jobDetailId}</if>
<if test="trayCode != null and trayCode != ''"> and bs.tray_code = #{trayCode}</if>
<if test="outQuantity != null "> and bs.out_quantity = #{outQuantity}</if>
<if test="stockinDetailId != null and stockinDetailId != ''"> and bs.stockin_detail_id = #{stockinDetailId}</if>
<if test="stockinId != null and stockinId != ''"> and bs.stockin_id = #{stockinId}</if>
<if test="inType != null and inType != ''"> and bs.in_type = #{inType}</if>
<if test="warehouseName != null and warehouseName != ''"> and bs.warehouse_name like concat('%', #{warehouseName}, '%')</if>
<if test="userName != null and userName != ''"> and bs.user_name like concat('%', #{userName}, '%')</if>
<if test="deptName != null and deptName != ''"> and bs.dept_name like concat('%', #{deptName}, '%')</if>
<if test="supplierName != null and supplierName != ''"> and bs.supplier_name like concat('%', #{supplierName}, '%')</if>
ORDER BY bcs.iss_double asc, bcs.cargo_space_id asc
</select>
<select id="selectBasStockByStockId" parameterType="String" resultMap="BasStockResult">
<include refid="selectBasStockVo"/>