Browse Source

add:空载具出入库任务。

feature/forewarning_management
龚宝雄 1 month ago
parent
commit
a1a73e188a
  1. 2
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java
  2. 3
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/DepthPriorityHandler.java
  3. 8
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java
  4. 4
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java
  5. 155
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java
  6. 120
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java
  7. 3
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java
  8. 174
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java
  9. 166
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java
  10. 12
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java
  11. 14
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IRawAssistIStorService.java
  12. 31
      nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java

2
nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/StructattrServiceImpl.java

@ -376,7 +376,7 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
Map<String, Decisioner> decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class);
QueryWrapper<Structattr> query = new QueryWrapper<Structattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code("无锁"))
.eq("lock_type",IOSEnum.LOCK_TYPE.code("未锁定"))
.eq("stor_code", param.getStor_code())
.eq("sect_code", param.getSect_code())
.isNull("storagevehicle_code");

3
nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/DepthPriorityHandler.java

@ -10,6 +10,7 @@ import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
@ -85,7 +86,7 @@ public class DepthPriorityHandler extends Decisioner<Structattr, JSONObject> {
.in(Structattr::getRow_num, Arrays.asList(1, 4))
.eq(Structattr::getStor_code, StatusEnum.STOCK_INFO.code("料箱库"))
.eq(Structattr::getIs_used, 1)
.eq(Structattr::getLock_type, StatusEnum.LOCK.code("无锁")));
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")));
//先找2排的再找3排的
if (!list1.isEmpty()) {
List<Structattr> combinedResult = new ArrayList<>();

8
nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/controller/PdaIosInController.java

@ -63,15 +63,15 @@ public class PdaIosInController {
@PostMapping("/getSect")
@Log("获取库区")
public ResponseEntity<Object> getSect() {
return new ResponseEntity<>(pdaIosInService.getSect(), HttpStatus.OK);
public ResponseEntity<Object> getSect(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaIosInService.getSect(whereJson), HttpStatus.OK);
}
@PostMapping("/getRegion")
@Log("获取区域")
public ResponseEntity<Object> getRegion() {
return new ResponseEntity<>(pdaIosInService.getRegion(), HttpStatus.OK);
public ResponseEntity<Object> getRegion(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaIosInService.getRegion(whereJson), HttpStatus.OK);
}

4
nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/PdaIosInService.java

@ -79,7 +79,7 @@ public interface PdaIosInService {
*
* @return PdaResponse
*/
PdaResponse getSect();
PdaResponse getSect(JSONObject whereJson);
/**
@ -87,7 +87,7 @@ public interface PdaIosInService {
*
* @return PdaResponse
*/
PdaResponse getRegion();
PdaResponse getRegion(JSONObject whereJson);

155
nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosInServiceImpl.java

@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -26,6 +27,7 @@ import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseRegion;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.tasks.BackInTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
@ -57,6 +59,8 @@ import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS;
@Service
public class PdaIosInServiceImpl implements PdaIosInService {
@Autowired
private Map<String, AbstractTask> applyTaskMap;
/**
* 组盘记录mapper
*/
@ -132,7 +136,6 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Override
@Transactional
public PdaResponse groupPlate(JSONObject whereJson) {
// 物料编码
String materialId = whereJson.getString("material_id");
@ -144,7 +147,7 @@ public class PdaIosInServiceImpl implements PdaIosInService {
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById(materialId);
MdPbMeasureunit unitDao = iMdPbMeasureunitService.getById(materDao.getBase_unit_id());
// 校验
if (ObjectUtil.isEmpty(vehicleDao) || ObjectUtil.isEmpty(materDao)) {
if (ObjectUtil.isEmpty(vehicleDao) || ObjectUtil.isEmpty(materDao) || ObjectUtil.isEmpty(materDao)) {
throw new BadRequestException("载具,物料或单位信息有误!");
}
//判断该载具是否存在组盘信息
@ -169,8 +172,8 @@ public class PdaIosInServiceImpl implements PdaIosInService {
.material_id(materDao.getMaterial_code())
.storagevehicle_code(vehicleDao.getStoragevehicle_code())
.pcsn(pcsn)
.qty_unit_id(unitDao != null ? unitDao.getMeasure_unit_id() : null)
.qty_unit_name(unitDao != null ? unitDao.getUnit_name() : null)
.qty_unit_id(unitDao.getMeasure_unit_id())
.qty_unit_name(unitDao.getUnit_name())
.qty(new BigDecimal(qty))
.status(GROUP_PLATE_STATUS.code("组盘"))
.ext_code(whereJson.getString("ext_code"))
@ -210,7 +213,6 @@ public class PdaIosInServiceImpl implements PdaIosInService {
PageQuery pageQuery = new PageQuery();
pageQuery.setPage(whereJson.getInteger("page") - 1);
pageQuery.setSize(whereJson.getInteger("size"));
String search = whereJson.getString("search");
MaterialQuery materialQuery = new MaterialQuery();
if (StringUtils.isNotBlank(whereJson.getString("search"))) {
materialQuery.setSearch(whereJson.getString("search").trim().toUpperCase());
@ -219,6 +221,25 @@ public class PdaIosInServiceImpl implements PdaIosInService {
return PdaResponse.build(mapPage);
}
@Override
public PdaResponse getSect(JSONObject whereJson) {
PageQuery pageQuery = new PageQuery();
pageQuery.setPage(whereJson.getInteger("page") - 1);
pageQuery.setSize(whereJson.getInteger("size"));
IPage<SectattrDto> sectList = iSectattrService.queryAll(new HashMap(), pageQuery);
sectList.getRecords().forEach(r -> r.setSect_name(r.getStor_name() + "-" + r.getSect_name()));
return PdaResponse.requestParamOk(sectList);
}
@Override
public PdaResponse getRegion(JSONObject whereJson) {
PageQuery pageQuery = new PageQuery();
pageQuery.setPage(whereJson.getInteger("page") - 1);
pageQuery.setSize(whereJson.getInteger("size"));
IPage<SchBaseRegion> regionList = iSchBaseRegionService.queryAll(new HashMap(), pageQuery);
return PdaResponse.requestParamOk(regionList.getRecords());
}
@Override
public PdaResponse getVehicleMaterial(JSONObject whereJson) {
whereJson.put("status", GROUP_PLATE_STATUS.code("组盘"));
@ -246,26 +267,6 @@ public class PdaIosInServiceImpl implements PdaIosInService {
return PdaResponse.requestParamOk(list);
}
@Override
public PdaResponse getSect() {
PageQuery page = new PageQuery();
page.setSize(100);
page.setPage(0);
IPage<SectattrDto> sectList = iSectattrService.queryAll(new HashMap(), page);
List<SectattrDto> result = sectList.getRecords();
result.forEach(r -> r.setSect_name(r.getStor_name() + "-" + r.getSect_name()));
result.sort(Comparator.comparing(SectattrDto::getSect_name));
return PdaResponse.requestParamOk(result);
}
@Override
public PdaResponse getRegion() {
PageQuery page = new PageQuery();
page.setSize(100);
page.setPage(0);
IPage<SchBaseRegion> regionList = iSchBaseRegionService.queryAll(new HashMap(), page);
return PdaResponse.requestParamOk(regionList.getRecords());
}
/**
@ -280,70 +281,110 @@ public class PdaIosInServiceImpl implements PdaIosInService {
@Override
@Transactional
public PdaResponse confirmReturnMaterial(JSONObject whereJson) {
// 生成回库任务
whereJson.put("config_code", IOSConstant.BACK_IN_TASK);
whereJson.put("vehicle_code", whereJson.getString("vehicle_code"));
whereJson.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
//入库分配
divStructNoBills(whereJson);
//更新组盘表状态
mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
return PdaResponse.requestOk();
}
/**
* 不含单据入库业务
*/
private void divStructNoBills(JSONObject whereJson) {
//校验载具
MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getByCode(whereJson.getString("vehicle_code"));
if (ObjectUtil.isEmpty(vehicleDao)) {
throw new BadRequestException("不存在该载具号信息,请检查");
}
// 查询仓库
//校验仓库
BsrealStorattr storeDao = iSrealStorattrService.getById(whereJson.getString("stor_id"));
if (ObjectUtil.isEmpty(storeDao)) {
throw new BadRequestException("该库区未找到对应仓库信息,请检查");
}
//分配仓位
JSONObject params = new JSONObject();
params.put("storagevehicle_code", vehicleDao.getStoragevehicle_code());
params.put("ioType", StatusEnum.STRATEGY_TYPE.code("入库"));
params.put("sect_code", whereJson.getString("sect_code"));
params.put("storagevehicle_code", vehicleDao.getStoragevehicle_code());
params.put("stor_code", storeDao.getStor_code());
params.put("sect_code", whereJson.getString("sect_code"));
params.put("material_code", whereJson.getString("material_code"));
params.put("qty", whereJson.getString("qty"));
params.put("pcsn", whereJson.getString("pcsn"));
Structattr attrDao = iRawAssistIStorService.divBackStruct(params);
Structattr attrDao = iRawAssistIStorService.getStructattr(whereJson);
//确定起点
SchBasePoint schBasePoint = iSchBasePointService.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.getString("vehicle_code")));
if (ObjectUtil.isEmpty(schBasePoint)) {
throw new BadRequestException("未找到载具所在的点位信息,请检查");
}
// 生成回库任务
JSONObject task = new JSONObject();
task.put("config_code", IOSConstant.BACK_IN_TASK);
task.put("point_code1", schBasePoint.getPoint_code());
task.put("point_code2", attrDao.getStruct_code());
task.put("vehicle_code", whereJson.getString("vehicle_code"));
task.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
String task_id = backInTask.create(task);
// 更新终点锁定状态
attrDao.setLock_type(IOSEnum.LOCK_TYPE.code("入库锁"));
attrDao.setTaskdtl_id(task_id);
iStructattrService.updateById(attrDao);
whereJson.put("point_code1", schBasePoint.getPoint_code());
//确定终点
whereJson.put("point_code2", attrDao.getStruct_code());
//创建任务
String taskId = applyTaskMap.get(whereJson.getString("config_code")).create(whereJson);
// 更新起点绑定id
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.set(SchBasePoint::getIos_id, null)
.eq(SchBasePoint::getPoint_code, schBasePoint.getPoint_code())
);
return PdaResponse.requestOk();
// 更新终点锁定状态
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", attrDao.getStruct_code());
lock_map.put("inv_id", null);
lock_map.put("inv_code", null);
lock_map.put("inv_type", null);
lock_map.put("taskdtl_id", taskId);
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
}
@Override
@Transactional
public PdaResponse confirmIn(JSONObject whereJson) {
//获取起点
SchBasePoint schBasePoint = iSchBasePointService
.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.getString("vehicle_code")));
whereJson.put("point_code", schBasePoint.getPoint_code());
// 预组织出入库单据实体
Map<String, Object> jsonMst = organizeInsertData(whereJson);
// 调用服务新增出入库单
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst);
// 预组织出入库单据明细的分配数据
whereJson.put("iostorinv_id", iostorinv_id);
Map<String, Object> jsonDtl = organizeDivData(whereJson);
// 调用分配,默认自动分配库位
iRawAssistIStorService.divStruct(new JSONObject(jsonDtl));
// 下发任务
sendTask(whereJson);
//物料组盘入库
if (StringUtils.isBlank(whereJson.getString("is_empty_vehicle"))) {
//获取起点
SchBasePoint schBasePoint = iSchBasePointService
.getOne(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getVehicle_code, whereJson.getString("vehicle_code")));
whereJson.put("point_code", schBasePoint.getPoint_code());
// 预组织出入库单据实体
Map<String, Object> jsonMst = organizeInsertData(whereJson);
// 调用服务新增出入库单
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst);
// 预组织出入库单据明细的分配数据
whereJson.put("iostorinv_id", iostorinv_id);
Map<String, Object> jsonDtl = organizeDivData(whereJson);
// 调用分配,默认自动分配库位
iRawAssistIStorService.divStruct(new JSONObject(jsonDtl));
// 下发任务
sendTask(whereJson);
//更新组盘表状态
mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
} else {
//空载具入库
whereJson.put("qty", 1);
//组盘
groupPlate(whereJson);
// 生成空载具入库任务
whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK);
whereJson.put("vehicle_code", whereJson.getString("vehicle_code"));
whereJson.put("Priority", TaskEnum.ACS_PRIORITY.code("1"));
//入库分配
divStructNoBills(whereJson);
}
return PdaResponse.requestOk();
}

120
nladmin-system/nlsso-server/src/main/java/org/nl/wms/pda/ios_manage/service/impl/PdaIosOutServiceImpl.java

@ -16,20 +16,24 @@ import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.StructattrVechielDto;
import org.nl.wms.basedata_manage.service.dao.*;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.pda.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask;
import org.nl.wms.sch_manage.service.util.tasks.StOutTask;
import org.nl.wms.sch_manage.service.util.tasks.VehicleOutTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IRawAssistIStorService;
@ -49,6 +53,9 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS;
@ -62,17 +69,29 @@ import static org.nl.wms.warehouse_management.enums.IOSEnum.GROUP_PLATE_STATUS;
*/
@Service
public class PdaIosOutServiceImpl implements PdaIosOutService {
@Autowired
private Map<String, AbstractTask> applyTaskMap;
/**
* 组盘记录mapper
*/
@Autowired
private MdPbGroupplateMapper mdPbGroupplateMapper;
/**
* 库区服务
*/
@Autowired
private ISectattrService iSectattrService;
/**
* 出入库单主表
*/
@Resource
private IOStorInvMapper ioStorInvMapper;
/**
* 仓库服务
*/
@Autowired
private IBsrealStorattrService iSrealStorattrService;
/**
* 基础物料服务
@ -212,28 +231,85 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
}
/**
* 空载具出库
* 1:托盘2料箱
*/
@Override
@Transactional
public PdaResponse vehicleOutConfirm(JSONObject whereJson) {
//锁定货位
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", whereJson.getString("struct_code"));
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
//创建任务
JSONObject taskForm = new JSONObject();
taskForm.put("task_type", "STOutTask");
taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
taskForm.put("PickingLocation", whereJson.getString("struct_code"));
taskForm.put("PlacedLocation", whereJson.getString("siteCode"));
taskForm.put("vehicle_code", whereJson.getString("storagevehicle_code"));
StOutTask stOutTask = SpringContextHolder.getBean("STOutTask");
stOutTask.create(taskForm);
iStructattrService.updateStatusByCode("0", lock_map);
long qty = 1L;
//空料箱出库
if (StringUtils.isNotBlank(whereJson.getString("qty"))) {
qty = whereJson.getLongValue("qty");
if (qty > 6) {
throw new BadRequestException("请输入小于7以内的载具数量");
}
whereJson.put("material_id", "2");
whereJson.put("material_code", "2");
} else {
//空托盘出库
whereJson.put("material_id", "1");
whereJson.put("material_code", "1");
}
Sectattr sectattr = iSectattrService.getById(new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getSect_id, whereJson.getString("sect_id"))
.eq(Sectattr::getIs_used, BaseDataEnum.IS_YES_NOT.code("是"))
);
if (ObjectUtil.isEmpty(sectattr)) {
throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!");
}
BsrealStorattr storeDao = iSrealStorattrService.getById(sectattr.getStor_id());
whereJson.put("stor_code", storeDao.getStor_code());
whereJson.put("sect_code", sectattr.getSect_code());
StrategyStructParam strategyStructParam = StrategyStructParam.builder()
.ioType(whereJson.getString(StatusEnum.STRATEGY_TYPE.code("出库")))
.sect_code(whereJson.getString("sect_code"))
.stor_code(whereJson.getString("stor_code"))
.material_code(whereJson.getString("material_id"))
.material_code(whereJson.getString("material_code"))
.qty(BigDecimal.valueOf(qty))
.build();
List<StrategyStructMaterialVO> structList = iStructattrService.outBoundSectDiv(strategyStructParam);
if (CollectionUtils.isEmpty(structList)) {
throw new BadRequestException("无可用库存!");
}
structList.forEach(r -> {
//创建任务
JSONObject taskForm = new JSONObject();
taskForm.put("task_type", IOSConstant.VEHICLE_OUT_TASK);
taskForm.put("config_code", IOSConstant.VEHICLE_IN_TASK);
taskForm.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
taskForm.put("PickingLocation", r.getStruct_code());
taskForm.put("PlacedLocation", whereJson.getString("siteCode"));
taskForm.put("vehicle_code", r.getStoragevehicle_code());
VehicleOutTask VehicleOutTask = SpringContextHolder.getBean("VehicleOutTask");
applyTaskMap.get(IOSConstant.VEHICLE_IN_TASK).create(whereJson);
VehicleOutTask.create(taskForm);
});
//更新组盘记录表
mdPbGroupplateMapper.update(new GroupPlate(), new LambdaUpdateWrapper<>(GroupPlate.class)
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
.eq(GroupPlate::getGroup_id, whereJson.getString("group_id"))
Set<String> vehicleCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStoragevehicle_code)
.collect(Collectors.toSet());
mdPbGroupplateMapper.update(
new GroupPlate(),
new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库"))
.in(GroupPlate::getStoragevehicle_code, vehicleCodeSet)
);
//锁定仓位
Set<String> structCodeSet = structList.stream()
.map(StrategyStructMaterialVO::getStruct_code)
.collect(Collectors.toSet());
iStructattrService.update(
new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getInv_id, null)
.set(Structattr::getInv_code, null)
.set(Structattr::getInv_type, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))
.in(Structattr::getStruct_code, structCodeSet)
);
return PdaResponse.requestOk();
}
@ -392,7 +468,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
if (ObjectUtil.isEmpty(schBasePoint)) {
throw new BadRequestException("未找到载具所在的点位信息,请检查");
}
// 生成回库任务
// 生成转运任务
JSONObject task = new JSONObject();
task.put("config_code", IOSConstant.PDA_POINT_TASK);
task.put("point_code1", schBasePoint.getPoint_code());

3
nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/enums/StatusEnum.java

@ -71,7 +71,8 @@ public enum StatusEnum {
/**
* 点位锁类型
*/
LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null, "空出锁", "70", null)),
//LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null, "空出锁", "70", null)),
STRATEGY_TYPE(ForkMap.of("入库", "1", null, "出库", "2", null, "出入库", "3", null)),

174
nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleInTask.java

@ -0,0 +1,174 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author: gbx
* @Description: 空载具入库任务
* @Date: 2025/7/3
*/
@Component(value = "VehicleInTask")
@TaskType("VehicleInTask")
public class VehicleInTask extends AbstractTask {
/**
* 任务服务类
*/
@Autowired
private ISchBaseTaskService taskService;
/**
* 点位服务
*/
@Autowired
private ISchBasePointService iSchBasePointService;
/**
* 仓位服务
*/
@Autowired
private IStructattrService iStructattrService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(json.getString("config_code"));
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type("1");
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
// 更新明细状态
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (Integer.parseInt(taskObj.getTask_status()) > Integer.parseInt(TaskStatus.CREATE.getCode())) {
throw new BadRequestException("只能取消生成中的任务!");
}
this.cancelTask(taskObj);
}
@Override
public void backMes(String task_code) {
}
@Transactional
public void finishTask(SchBaseTask taskObj) {
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getTaskdtl_id, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新起点
iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIos_id, null)
);
// 更新任务
taskObj.setRemark("已完成");
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskService.updateById(taskObj);
}
@Transactional
public void cancelTask(SchBaseTask taskObj) {
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getTaskdtl_id, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
);
// 更新任务
taskObj.setRemark("已取消");
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskService.updateById(taskObj);
}
}

166
nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/VehicleOutTask.java

@ -0,0 +1,166 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IOutBillService;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @Author: gbx
* @Description: 空载具出库任务
* @Date: 2025/7/3
*/
@Component(value = "VehicleOutTask")
@TaskType("VehicleOutTask")
public class VehicleOutTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
@Resource
private IOutBillService outBillService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("PickingLocation"));
task.setPoint_code2(json.getString("PlacedLocation"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
if (taskDao.getPoint_code2().contains("-")) {
acsTaskDto.setNext_device_code(taskDao.getPoint_code2().replace('-', '_'));
}
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type("1");
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) {
throw new BadRequestException("任务状态必须为生成才能取消任务");
}
this.cancelTask(taskObj);
}
@Override
public void backMes(String task_code) {
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj) {
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
outBillService.taskFinish(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) {
// 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code("是"))
.set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode())
.set(SchBaseTask::getRemark,"已取消")
.eq(SchBaseTask::getTask_id,taskObj.getTask_id())
);
//分配表清除任务
ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id,null)
.set(IOStorInvDis::getPoint_code,null)
.set(IOStorInvDis::getIs_issued,0)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成"))
.eq(IOStorInvDis::getTask_id,taskObj.getTask_id())
);
// 更新任务状态
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark("已取消");
taskService.updateById(taskObj);
}
}

12
nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/enums/IOSConstant.java

@ -66,4 +66,16 @@ public class IOSConstant {
* 手持定点任务
*/
public final static String PDA_POINT_TASK = "PdaPointTask";
/**
* 空载具入库任务
*/
public final static String VEHICLE_IN_TASK = "VehicleInTask";
/**
* 空载具出库任务
*/
public final static String VEHICLE_OUT_TASK = "VehicleOutTask";
}

14
nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/IRawAssistIStorService.java

@ -40,17 +40,7 @@ public interface IRawAssistIStorService extends IService<IOStorInv> {
void divStruct(JSONObject whereJson);
/**
* 根据库区策略获取仓位
* storagevehicle_code 载具号
* ioType 出入库类型
* sect_code 库区编码
* stor_code 仓库编码
* material_code 物料编码
* qty 计划数量
* pcsn 批次号
*/
Structattr divBackStruct(JSONObject whereJson);
void unDivStruct(Map whereJson);
@ -65,4 +55,6 @@ public interface IRawAssistIStorService extends IService<IOStorInv> {
Structattr autoDis(JSONObject whereJson);
List<IOStorInvDisDto> getInBillTaskDtl(Map whereJson);
Structattr getStructattr(JSONObject param);
}

31
nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_management/service/impl/RawAssistIStorServiceImpl.java

@ -428,7 +428,6 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
/**
* 根据库区策略获取仓位
* storagevehicle_code 载具号
* ioType 出入库类型
* sect_code 库区编码
* stor_code 仓库编码
@ -437,34 +436,6 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
* pcsn 批次号
*/
@Override
public Structattr divBackStruct(JSONObject whereJson) {
Structattr structattr = getStructattr(whereJson);
//锁定货位
JSONObject lock_map = new JSONObject();
lock_map.put("struct_code", structattr.getStruct_code());
lock_map.put("inv_id", null);
lock_map.put("inv_code", null);
lock_map.put("inv_type", null);
lock_map.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
iStructattrService.updateStatusByCode("0", lock_map);
//更新组盘表状态
mdPbGroupplateService.update(new LambdaUpdateWrapper<GroupPlate>()
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
return structattr;
}
/**
* 根据库区策略获取仓位
* ioType 出入库类型
* sect_code 库区编码
* stor_code 仓库编码
* material_code 物料编码
* qty 计划数量
* pcsn 批次号
*/
public Structattr getStructattr(JSONObject param) {
List<Structattr> structattrs = iStructattrService.inBoundSectDiv(
StrategyStructParam.builder()
@ -475,12 +446,10 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
.qty(new BigDecimal(param.getString("qty")))
.pcsn(param.getString("pcsn"))
.build());
if (CollectionUtils.isEmpty(structattrs)) {
throw new BadRequestException("无可用货位");
}
return structattrs.get(0);
}

Loading…
Cancel
Save