add:新增2楼业务逻辑;

This commit is contained in:
2026-06-09 16:59:12 +08:00
parent 84b2eb0d99
commit fdd29d87b8
18 changed files with 399 additions and 204 deletions

View File

@@ -57,6 +57,10 @@ public class MaterialbaseController {
return new ResponseEntity<>(HttpStatus.CREATED);
}
/**
* 数据初始化
*/
@PostMapping("/excelImport")
public ResponseEntity<Object> excelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
RedissonUtils.lock(() -> {

View File

@@ -1,5 +1,6 @@
package org.nl.wms.basedata_manage.service.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -129,4 +130,16 @@ public class MdPbStoragevehicleinfo implements Serializable {
*/
private String ext_id;
/**
* 外部标识
*/
@TableField(exist = false)
private String vehicle_code;
/**
* 外部标识
*/
@TableField(exist = false)
private BigDecimal num;
}

View File

@@ -16,6 +16,6 @@
sect.sect_code LIKE CONCAT('%', #{params.stor_code}, '%')
</if>
</where>
ORDER BY sect.update_time Desc
ORDER BY sect.create_time
</select>
</mapper>

View File

@@ -115,7 +115,7 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
}
String regionCode = MapUtil.getStr(whereJson, "region");
if (ObjectUtil.isNotEmpty(regionCode)) {
queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode);
queryWrapper.apply("FIND_IN_SET({0}, ext_id)", regionCode);
}
queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time);
IPage<MdMeMaterialbase> result = this.baseMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()),
@@ -262,9 +262,9 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
/**
* 库存导入
*/
@Override
//@Override
@Transactional
public void excelImport(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
public void excelImport121(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
Integer in = 1;
try {
String currentUserId = SecurityUtils.getCurrentUserId();
@@ -590,7 +590,7 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
*/
@Transactional
//@Override
public void excelImport98(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
public void excelImport123(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
try {
InputStream inputStream = file.getInputStream();
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
@@ -630,12 +630,12 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
dao.setStruct_code(m1);
dao.setStruct_name(struct_name);
dao.setSimple_name(struct_name);
dao.setSect_id("1582991348217286656");
dao.setSect_code("GW01");
dao.setSect_name("高位库区01");
dao.setStor_id("1582991156504039424");
dao.setStor_code("GW");
dao.setStor_name("高位库");
dao.setSect_id("1940512379800899585");
dao.setSect_code("GW02");
dao.setSect_name("2F-高位库区01");
dao.setStor_id("2063805001079328768");
dao.setStor_code("2F-GW");
dao.setStor_name("2F-高位库");
dao.setStor_type("Normal");
dao.setWidth(m4);
dao.setHeight(m3);
@@ -732,7 +732,8 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
*/
@Transactional
public void excelImport9(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
@Override
public void excelImport(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
try {
InputStream inputStream = file.getInputStream();
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
@@ -741,12 +742,16 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
List<SchBasePoint> insertList = new ArrayList<>();
for (int i = 1; i < read.size(); i++) {
List<Object> list = read.get(i);
//仓位
String m1 = String.valueOf(list.get(0));
String m2 = String.valueOf(list.get(1));
String m3 = String.valueOf(list.get(2));
String m4 = String.valueOf(list.get(3));
String m5 = String.valueOf(list.get(4));
String m6 = String.valueOf(list.get(5));
String m7 =null;
if (ObjectUtil.isNotEmpty(list.get(6))) {
m7 = String.valueOf(list.get(6));
}
SchBasePoint dao = new SchBasePoint();
dao.setPoint_code(m1);
dao.setPoint_name(m2);
@@ -768,6 +773,8 @@ public class MdMeMaterialbaseServiceImpl extends ServiceImpl<MdMeMaterialbaseMap
dao.setIn_empty_seq(0);
dao.setOut_empty_seq(0);
dao.setParent_point_code("0");
dao.setWorkshop_code(m6);
dao.setRemark(m7);
dao.setCreate_id("1");
dao.setCreate_name("admin");
dao.setCreate_time(DateUtil.now());

View File

@@ -19,6 +19,8 @@ import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleinfoMappe
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -38,9 +40,8 @@ public class MdPbStoragevehicleinfoServiceImpl extends ServiceImpl<MdPbStorageve
public IPage<MdPbStoragevehicleinfo> queryAll(Map whereJson, PageQuery page) {
// 查询条件
LambdaQueryWrapper<MdPbStoragevehicleinfo> queryWrapper = new QueryWrapper<MdPbStoragevehicleinfo>().lambda();
String search = MapUtil.getStr(whereJson, "vehicle_code");
String search = MapUtil.getStr(whereJson, "storagevehicle_code");
String storagevehicle_type = MapUtil.getStr(whereJson, "storagevehicle_type");
if (ObjectUtil.isNotEmpty(search)) {
queryWrapper.likeRight(MdPbStoragevehicleinfo::getStoragevehicle_code, search)
.or(item -> item.likeRight(MdPbStoragevehicleinfo::getStoragevehicle_name, search));
@@ -50,7 +51,6 @@ public class MdPbStoragevehicleinfoServiceImpl extends ServiceImpl<MdPbStorageve
}
queryWrapper.eq(MdPbStoragevehicleinfo::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""));
queryWrapper.orderByDesc(MdPbStoragevehicleinfo::getUpdate_time);
return this.baseMapper.selectPage(new Page<>(page.getPage() + 1, page.getSize()),
queryWrapper
);
@@ -59,24 +59,78 @@ public class MdPbStoragevehicleinfoServiceImpl extends ServiceImpl<MdPbStorageve
@Override
@Transactional
public void create(MdPbStoragevehicleinfo dto) {
// 根据载具编码查询是否有相同载具编码的载具
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = this.baseMapper.selectOne(
new QueryWrapper<MdPbStoragevehicleinfo>().lambda()
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, dto.getStoragevehicle_code())
);
if (ObjectUtil.isNotEmpty(mdPbStoragevehicleinfo)) {
throw new BadRequestException("当前载具编码已存在【"+dto.getStoragevehicle_code()+"");
// 提取载具编码中的数字部分并进行批量创建
String storagevehicleCode = dto.getStoragevehicle_code();
BigDecimal occupystructQty = dto.getNum();
// 验证占仓位数是否在合理范围内
if (ObjectUtil.isEmpty(occupystructQty) || occupystructQty.compareTo(BigDecimal.ZERO) <= 0) {
throw new BadRequestException("占仓位数必须大于0");
}
// 新增
dto.setStoragevehicle_id(IdUtil.getStringId());
dto.setCreate_id(SecurityUtils.getCurrentUserId());
dto.setCreate_name(SecurityUtils.getCurrentNickName());
dto.setCreate_time(DateUtil.now());
dto.setUpdate_optid(SecurityUtils.getCurrentUserId());
dto.setUpdate_optname(SecurityUtils.getCurrentNickName());
dto.setUpdate_time(DateUtil.now());
this.save(dto);
if (occupystructQty.compareTo(new BigDecimal(500)) > 0) {
throw new BadRequestException("占仓位数最大为500");
}
// 提取载具编码中的最后一个数字
String prefix = "";
int lastNumber = 0;
int numberLength = 0;
// 从后往前提取数字部分
for (int i = storagevehicleCode.length() - 1; i >= 0; i--) {
char c = storagevehicleCode.charAt(i);
if (Character.isDigit(c)) {
numberLength++;
} else {
prefix = storagevehicleCode.substring(0, i + 1);
lastNumber = Integer.parseInt(storagevehicleCode.substring(i + 1));
break;
}
}
// 如果整个字符串都是数字
if (numberLength == storagevehicleCode.length()) {
prefix = "";
lastNumber = Integer.parseInt(storagevehicleCode);
}
// 格式化数字的模板(保持原有的位数)
String numberFormat = "%0" + numberLength + "d";
// 批量创建载具
List<MdPbStoragevehicleinfo> batchList = new ArrayList<>();
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
for (int i = 0; i < occupystructQty.intValue(); i++) {
int currentNumber = lastNumber + i;
String newCode = prefix + String.format(numberFormat, currentNumber);
// 检查新生成的编码是否已存在,如果存在则跳过
MdPbStoragevehicleinfo existingVehicle = this.baseMapper.selectOne(
new QueryWrapper<MdPbStoragevehicleinfo>().lambda()
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, newCode)
);
if (ObjectUtil.isNotEmpty(existingVehicle)) {
continue;
}
// 创建新的载具对象
MdPbStoragevehicleinfo newVehicle = new MdPbStoragevehicleinfo();
newVehicle.setStoragevehicle_id(IdUtil.getStringId());
newVehicle.setStoragevehicle_code(newCode);
newVehicle.setStoragevehicle_name(dto.getStoragevehicle_name());
newVehicle.setStoragevehicle_type(dto.getStoragevehicle_type());
newVehicle.setOccupystruct_qty(dto.getOccupystruct_qty());
newVehicle.setOverstruct_type(dto.getOverstruct_type());
newVehicle.setVehicle_width(dto.getVehicle_width());
newVehicle.setVehicle_long(dto.getVehicle_long());
newVehicle.setVehicle_height(dto.getVehicle_height());
newVehicle.setWeigth(dto.getWeigth());
newVehicle.setIs_used(dto.getIs_used());
newVehicle.setIs_delete("0");
newVehicle.setCreate_id(currentUserId);
newVehicle.setCreate_name(nickName);
newVehicle.setCreate_time(now);
newVehicle.setUpdate_optid(currentUserId);
newVehicle.setUpdate_optname(nickName);
newVehicle.setUpdate_time(now);
batchList.add(newVehicle);
}
// 批量保存
this.saveBatch(batchList);
}
@Override

View File

@@ -270,9 +270,7 @@ public class SectattrServiceImpl extends ServiceImpl<SectattrMapper, Sectattr> i
@Override
@Transactional(rollbackFor = Exception.class)
public void changeActive(JSONObject json) {
String stor_id = json.getString("stor_id");
BsrealStorattr bsrealStorattr = iBsrealStorattrService.list(new LambdaQueryWrapper<>(BsrealStorattr.class)
.eq(BsrealStorattr::getStor_id,stor_id)
.eq(BsrealStorattr::getIs_used,BaseDataEnum.IS_YES_NOT.code("")))

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSON;
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 lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -21,6 +22,7 @@ import org.nl.wms.gateway.dto.InteracteDto;
import org.nl.wms.gateway.dto.RcsResponse;
import org.nl.wms.gateway.service.IGateWayService;
import org.nl.wms.pda.ios_manage.service.impl.PdaIosInServiceImpl;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -184,6 +186,12 @@ public class GateWayServiceImpl implements IGateWayService {
try {
if (tryLock) {
SchBaseTask taskObj = iSchBaseTaskService.getByCode(orderId);
if (taskObj == null) {
RcsResponse.requestOk();
}
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode()) || taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
RcsResponse.requestOk();
}
// rcs反馈的任务类型
String rcsTaskStatus = param.getStatus().toString();
ResultAcsStatus rcsStatusEnum = ResultAcsStatus.fromCode(rcsTaskStatus);

View File

@@ -276,6 +276,10 @@ public class PdaIosInServiceImpl implements PdaIosInService {
if ((!vehicleDao.getStoragevehicle_code().contains("T") && dataArray.size() > 1) || ObjectUtils.isEmpty(dataArray)) {
throw new BadRequestException("请检查是否选中物料或一个载具只能存放一个物料。");
}
//tofix 临时处理方案,后续要移除
if (vehicleDao.getStoragevehicle_code().contains("T")&& dataArray.size() > 1) {
throw new BadRequestException("暂不支持混料组盘!");
}
//校验qty
boolean qtyIsEmpty = dataArray.stream()
.anyMatch(r -> {
@@ -442,7 +446,7 @@ public class PdaIosInServiceImpl implements PdaIosInService {
}
String regionCode = MapUtil.getStr(whereJson, "region");
if (ObjectUtil.isNotEmpty(regionCode)) {
queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode);
queryWrapper.apply("FIND_IN_SET({0}, ext_id)", regionCode);
}
queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time);
Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()),
@@ -468,7 +472,7 @@ public class PdaIosInServiceImpl implements PdaIosInService {
IPage<SchBaseRegion> regionList = iSchBaseRegionService.queryAll(whereJson, pageQuery);
List<SelectItemVo> selectList = new ArrayList<>();
String regionCode = "YZHJ01";
String regionName = "预装线货架区";
String regionName = "3F-预装线货架区";
if (ObjectUtil.isNotEmpty(whereJson.getString("storagevehicle_code"))) {
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>().eq(SchBaseTask::getVehicle_code, whereJson.getString("storagevehicle_code")).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50"));
if (ObjectUtil.isNotEmpty(taskList)) {

View File

@@ -503,7 +503,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
}
String regionCode = MapUtil.getStr(whereJson, "region");
if (ObjectUtil.isNotEmpty(regionCode)) {
queryWrapper.eq(MdMeMaterialbase::getExt_id, regionCode);
queryWrapper.apply("FIND_IN_SET({0}, ext_id)", regionCode);
}
queryWrapper.orderByDesc(MdMeMaterialbase::getUpdate_time);
Page mapPage = mdMeMaterialbaseMapper.selectPage(new Page<>(pageQuery.getPage(), pageQuery.getSize()),
@@ -857,6 +857,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
String regionCode = whereJson.getString("region_code");
String vehicleCode = whereJson.getString("storagevehicle_code");
String isCheckIvt = whereJson.getString("isCheckIvt");
boolean isEmptyVehicle = false;
//校验起点
SchBasePoint point = iSchBasePointService.getOne(
new LambdaQueryWrapper<SchBasePoint>()
@@ -872,36 +873,25 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
if (StringUtils.isBlank(regionCode) && StringUtils.isBlank(pointCode2)) {
throw new BadRequestException("目标站点或区域请二选一!");
}
//库存校验
if (whereJson.getString("isCheckIvt").equals(BaseDataEnum.IS_YES_NOT.code("")) & !startPointCode.contains("A")) {
SchBasePoint vehiclePoint = iSchBasePointService.getOne(
new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getVehicle_code, vehicleCode)
);
if (ObjectUtil.isEmpty(vehiclePoint)) {
throw new BadRequestException("该点位不存在物料信息,请检查组盘信息");
}
//自动解绑/绑定
iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class)
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"))
.eq(SchBasePoint::getPoint_code, vehiclePoint.getPoint_code())
);
iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class)
.set(SchBasePoint::getVehicle_code, vehicleCode)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"))
.eq(SchBasePoint::getPoint_code, startPointCode)
);
SpringContextHolder.getBean(SysNoticeServiceImpl.class).createNotice(DateUtil.now() + ",手持端操作通知:生成点对点任务,站点:" + vehiclePoint.getPoint_code() + "强制解绑载具:" + vehicleCode+",重新绑定到站点:"+startPointCode, "操作信息", NoticeTypeEnum.NOTIFICATION.getCode());
//站点组盘校验
SchBasePoint vehiclePoint = iSchBasePointService.getOne(
new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getVehicle_code, vehicleCode)
);
if (vehiclePoint == null) {
isEmptyVehicle = true;
}
//只有空载具才会自动回原来区域
int has = iMdPbGroupplateService.count(new LambdaUpdateWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, vehicleCode)
.lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
if (has > 0) {
isCheckIvt = "0";
//tofix 临时处理方案,后续要移除
if ("1F-XHQY01".equals(point.getRegion_code()) || "1F-XHQY01".equals(regionCode)) {
throw new BadRequestException("暂不支持一楼业务!");
}
//非5线都需要组盘校验且自动绑定其他站点的物料组盘信息
if (isCheckIvt.equals(BaseDataEnum.IS_YES_NOT.code("")) && !point.getRegion_code().equals(StatusEnum.REGION_INFO.code("商用线5号线"))) {
if (vehiclePoint == null) {
throw new BadRequestException("该点位不存在物料信息,请检查组盘信息");
}
//重新绑定载具到新点位
changePointVehicle(startPointCode, vehicleCode, vehiclePoint);
}
//终点为站点
if (StringUtils.isNotBlank(pointCode2)) {
@@ -917,65 +907,30 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
}
endPointCode = pointCode2;
} else {
if ("1".equals(isCheckIvt)) {
//终点为区域
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>().eq(SchBaseTask::getVehicle_code, vehicleCode).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50"));
if (ObjectUtil.isNotEmpty(taskList)) {
//去除相同区域转运
taskList = taskList.stream()
.filter(task -> {
String pointCodeStart = task.getPoint_code1();
String pointCodeEnd = task.getPoint_code2();
return StringUtils.isNotBlank(pointCodeStart) &&
StringUtils.isNotBlank(pointCodeEnd) &&
pointCodeStart.charAt(0) != pointCodeEnd.charAt(0);
})
.collect(Collectors.toList());
//提取与起点相同的终点任务的区域
taskList = taskList.stream()
.filter(task -> {
String pointCodeStart = point.getPoint_code();
String pointCodeEnd = task.getPoint_code2();
return StringUtils.isNotBlank(pointCodeStart) &&
StringUtils.isNotBlank(pointCodeEnd) &&
pointCodeStart.charAt(0) == pointCodeEnd.charAt(0);
})
.collect(Collectors.toList());
//获取区域
if (ObjectUtil.isNotEmpty(taskList)) {
List<SchBasePoint> schBasePointList = iSchBasePointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, taskList.get(0).getPoint_code1()).eq(SchBasePoint::getIs_used, true));
regionCode = schBasePointList.get(0).getRegion_code();
}
}
//终点为区域
//只有空载具才符合自动回空载具
int has = iMdPbGroupplateService.count(new LambdaUpdateWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, vehicleCode)
.lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
if (has > 0) {
//有组盘信息,不是空载具
isCheckIvt = "0";
}
//默认开启物料校验,可以根据组盘信息是否出库与上一次区域,自动回空
if (isCheckIvt.equals(BaseDataEnum.IS_YES_NOT.code(""))) {
//获取该托盘最后一个区域
regionCode = getLastRegionCode(regionCode, vehicleCode, point.getPoint_code());
}
//69线物料分区逻辑根据物料重新分配区域
if (regionCode.contains("LJX")) {
//根据组盘物料获取区域
regionCode = queryRegionByMaterial(regionCode,vehicleCode);
}
//获取终点
endPointCode = iSchBasePointService.getPointCode(regionCode);
endPointCode = iSchBasePointService.getPointCode(regionCode, isEmptyVehicle);
//特殊区域无空位分配到入线边仓分配库位
if (StringUtils.isBlank(endPointCode)) {
//无空位分配到入线边仓分配库位
if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区")) || regionCode.equals(StatusEnum.REGION_INFO.code("TGCK01")) || regionCode.equals(StatusEnum.REGION_INFO.code("两器仓"))) {
JSONArray dataArray = new JSONArray();
JSONObject item = new JSONObject();
item.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架"));
item.put("qty", 1);
dataArray.add(item);
whereJson.put("data", dataArray);
whereJson.put("stor_code", StatusEnum.STORE_INFO.code("料架线边库"));
whereJson.put("sect_code", "XB01");
whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架"));
whereJson.put("qty", 1);
whereJson.put("site_code", startPointCode);
whereJson.put("vehicle_code", vehicleCode);
whereJson.put("is_auto_confirm", startPointCode);
//组盘
SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson);
//生成空载具入库任务
whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK);
//入库分配
SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson);
return PdaResponse.requestOk();
} else {
throw new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!");
}
return getPdaResponse(whereJson, startPointCode, regionCode, vehicleCode);
}
}
//生成转运任务
@@ -998,5 +953,123 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
return PdaResponse.requestOk();
}
private void changePointVehicle(String startPointCode, String vehicleCode, SchBasePoint vehiclePoint) {
//自动解绑/绑定
iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class)
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"))
.eq(SchBasePoint::getPoint_code, vehiclePoint.getPoint_code())
);
iSchBasePointService.update(new SchBasePoint(), new LambdaUpdateWrapper<>(SchBasePoint.class)
.set(SchBasePoint::getVehicle_code, vehicleCode)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"))
.eq(SchBasePoint::getPoint_code, startPointCode)
);
SpringContextHolder.getBean(SysNoticeServiceImpl.class).createNotice(DateUtil.now() + ",手持端操作通知:生成点对点任务,站点:" + vehiclePoint.getPoint_code() + "强制解绑载具:" + vehicleCode + ",重新绑定到站点:" + startPointCode, "操作信息", NoticeTypeEnum.NOTIFICATION.getCode());
}
/**
* 69线物料分区逻辑根据物料重新分配区域
*/
private String queryRegionByMaterial(String defaultRegionCode, String vehicleCode) {
// 1. 查询载具下未出库的组盘信息
List<GroupPlate> groupPlateList = iMdPbGroupplateService.list(
new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, vehicleCode)
.lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库"))
);
if (CollectionUtils.isEmpty(groupPlateList)) {
return defaultRegionCode;
}
// 2. 取第一个组盘的物料ID
String materialId = groupPlateList.get(0).getMaterial_id();
if (StringUtils.isBlank(materialId)) {
return defaultRegionCode;
}
// 3. 查询物料信息
MdMeMaterialbase material = iMdMeMaterialbaseService.getOne(
new LambdaQueryWrapper<MdMeMaterialbase>()
.eq(MdMeMaterialbase::getMaterial_id, materialId)
);
if (material == null || StringUtils.isBlank(material.getExt_id())) {
return defaultRegionCode;
}
// 4. 获取有效区域列表trim后过滤空串
String[] allowedRegions = material.getExt_id().split(",");
List<String> regionList = Arrays.stream(allowedRegions)
.map(String::trim)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
if (regionList.isEmpty()) {
return defaultRegionCode;
}
// 5. 优先返回匹配 defaultRegionCode 的区域(来自列表),否则返回第一个区域
return regionList.stream()
.filter(r -> r.contains(defaultRegionCode.substring(0,3)))
.findFirst()
.orElse(defaultRegionCode);
}
private PdaResponse getPdaResponse(JSONObject whereJson, String startPointCode, String regionCode, String vehicleCode) {
if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区")) || regionCode.equals(StatusEnum.REGION_INFO.code("TGCK01")) || regionCode.equals(StatusEnum.REGION_INFO.code("两器仓"))) {
JSONArray dataArray = new JSONArray();
JSONObject item = new JSONObject();
item.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架"));
item.put("qty", 1);
dataArray.add(item);
whereJson.put("data", dataArray);
whereJson.put("stor_code", StatusEnum.STORE_INFO.code("料架线边库"));
whereJson.put("sect_code", "XB01");
whereJson.put("material_id", StatusEnum.VEHICLE_TYPE.code("空货架"));
whereJson.put("qty", 1);
whereJson.put("site_code", startPointCode);
whereJson.put("vehicle_code", vehicleCode);
whereJson.put("is_auto_confirm", startPointCode);
//组盘
SpringContextHolder.getBean(PdaIosInServiceImpl.class).groupPlate(whereJson);
//生成空载具入库任务
whereJson.put("config_code", IOSConstant.VEHICLE_IN_TASK);
//入库分配
SpringContextHolder.getBean(PdaIosInServiceImpl.class).divStructNoBills(whereJson);
return PdaResponse.requestOk();
} else {
throw new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!");
}
}
private String getLastRegionCode(String regionCode, String vehicleCode, String pointCode) {
//终点为区域
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>().eq(SchBaseTask::getVehicle_code, vehicleCode).lt(SchBaseTask::getTask_status, TaskStatus.UNFINISHED.getCode()).orderByDesc(SchBaseTask::getCreate_time).last("LIMIT 50"));
if (ObjectUtil.isNotEmpty(taskList)) {
//去除相同区域转运
taskList = taskList.stream()
.filter(task -> {
String pointCodeStart = task.getPoint_code1();
String pointCodeEnd = task.getPoint_code2();
return StringUtils.isNotBlank(pointCodeStart) &&
StringUtils.isNotBlank(pointCodeEnd) &&
pointCodeStart.charAt(0) != pointCodeEnd.charAt(0);
})
.collect(Collectors.toList());
//提取与起点相同的终点任务的区域
taskList = taskList.stream()
.filter(task -> {
String pointCodeEnd = task.getPoint_code2();
return StringUtils.isNotBlank(pointCode) &&
StringUtils.isNotBlank(pointCodeEnd) &&
pointCode.charAt(0) == pointCodeEnd.charAt(0);
})
.collect(Collectors.toList());
//获取区域
if (ObjectUtil.isNotEmpty(taskList)) {
List<SchBasePoint> schBasePointList = iSchBasePointService.list(new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getPoint_code, taskList.get(0).getPoint_code1()).eq(SchBasePoint::getIs_used, true));
regionCode = schBasePointList.get(0).getRegion_code();
}
}
return regionCode;
}
}

View File

@@ -66,7 +66,7 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
/**
* 获取区域可用入库点位
*/
String getPointCode(String regionCode);
String getPointCode(String regionCode,boolean isEmptyVehicle);
/**

View File

@@ -42,7 +42,7 @@ public class SchBasePoint implements Serializable {
private String can_material_type;
// 允许的载具类型,0空载具1托盘2料箱3货架
private String can_vehicle_type;

View File

@@ -49,7 +49,7 @@
) gro ON p.vehicle_code = gro.storagevehicle_code AND gro.rn = 1
LEFT JOIN md_me_materialbase mater ON mater.material_id = gro.material_id
<where>
<if test="whereJson.workshop_code != null and workshop_code != ''">
<if test="whereJson.workshop_code != null and whereJson.workshop_code != ''">
p.workshop_code = #{whereJson.workshop_code}
</if>
<if test="whereJson.blurry != null">

View File

@@ -235,10 +235,11 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
/**
* 获取区域可用入库点位
* isEmptyVehicle 是否空载具
*/
@Override
public String getPointCode(String regionCode) {
String pointCode = "";
public String getPointCode(String regionCode, boolean isEmptyVehicle) {
String pointCode;
List<SchBasePoint> pointList;
if (regionCode.equals(StatusEnum.REGION_INFO.code("CTU出库点"))) {
LambdaQueryWrapper<SchBasePoint> queryWrapper = new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getIs_used, true);
@@ -251,12 +252,38 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
IOSEnum.LOCK_TYPE.code("未锁定"),
StatusEnum.SORT_TYPE.code("升序"), null, null, "true", false);
}
if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!");
}
//该区域只流入空载具
if (regionCode.equals(StatusEnum.REGION_INFO.code("预装线货架区"))) {
//可放空料架位置
pointCode = pointList.stream()
.filter(r -> StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))
.findFirst()
.orElseThrow(() -> new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!"))
.orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!"))
.getPoint_code();
} else if (isEmptyVehicle) {
LambdaQueryWrapper<SchBasePoint> queryWrapper = new LambdaQueryWrapper<SchBasePoint>().eq(SchBasePoint::getIs_used, true);
queryWrapper.eq(SchBasePoint::getRegion_code, regionCode).eq(SchBasePoint::getCan_vehicle_type, StatusEnum.VEHICLE_TYPE.code("空载具"));
int count = this.count(queryWrapper);
//有规定放空载具的区域
if (count > 0) {
pointCode = pointList.stream()
.filter(r -> StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))
.findFirst()
.orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!"))
.getPoint_code();
} else {
pointCode = pointList.stream()
.findFirst()
.orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!"))
.getPoint_code();
}
} else {
pointCode = pointList.stream()
.filter(r -> !StatusEnum.VEHICLE_TYPE.code("空载具").equals(r.getCan_vehicle_type()))
.findFirst()
.orElseThrow(() -> new BadRequestException("货位已满,无空闲货位,请及时取走该区域的物料!"))
.getPoint_code();
}
// else if ((regionCode.equals(StatusEnum.REGION_INFO.code("预装托盘暂存区")))) {
@@ -287,13 +314,6 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
// if (StringUtils.isBlank(pointCode)) {
// throw new BadRequestException("该暂存区暂无空闲货位,请检查暂存区是否存在同一列有物料阻挡未取走!");
// }}
else {
//默认升序
pointCode = pointList.stream()
.findFirst()
.orElseThrow(() -> new BadRequestException("该区域暂无空闲货位,请及时取走该区域的物料!"))
.getPoint_code();
}
return pointCode;
}

View File

@@ -96,6 +96,7 @@ public abstract class AbstractTask {
.eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code())
.lt(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
if (CollectionUtils.isEmpty(groupPlateList)) {
task.setExt_group_data("此任务为空载具搬运");
return;
}
// 确定用于构建扩展信息的 GroupPlate 记录
@@ -110,6 +111,7 @@ public abstract class AbstractTask {
}
MdMeMaterialbase material = iMdMeMaterialbaseService.getById(targetPlate.getMaterial_id());
if (material == null) {
task.setExt_group_data("此任务为空载具搬运");
return;
}
// 获取数量

View File

@@ -1007,7 +1007,7 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv>
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>().eq(SchBaseTask::getVehicle_code, ioStorInvDis.getStoragevehicle_code()).lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()));
if (ObjectUtil.isEmpty(taskList)) {
//获取终点
String pointCode = iSchBasePointService.getPointCode(regionCode);
String pointCode = iSchBasePointService.getPointCode(regionCode,false);
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("task_type", "STOutTask");

View File

@@ -395,6 +395,10 @@ public class UpdateIvtUtils {
public Sectattr checkVehicleType(String sectId, String vehicleCode) {
//查询载具
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getOne(new QueryWrapper<MdPbStoragevehicleinfo>().lambda().eq(MdPbStoragevehicleinfo::getStoragevehicle_code, vehicleCode));
if (ObjectUtil.isEmpty(mdPbStoragevehicleinfo)) {
log.error("载具【" + vehicleCode + "】不存在!");
throw new BadRequestException("载具【" + vehicleCode + "】不存在!");
}
String vehicleType = mdPbStoragevehicleinfo.getStoragevehicle_type();
// 查询库区
Sectattr sectDao = iSectattrService.getById(sectId);