add:新增2楼业务逻辑;
This commit is contained in:
@@ -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(() -> {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("是")))
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -66,7 +66,7 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
|
||||
/**
|
||||
* 获取区域可用入库点位
|
||||
*/
|
||||
String getPointCode(String regionCode);
|
||||
String getPointCode(String regionCode,boolean isEmptyVehicle);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,7 +42,7 @@ public class SchBasePoint implements Serializable {
|
||||
|
||||
private String can_material_type;
|
||||
|
||||
|
||||
// 允许的载具类型,0空载具1托盘2料箱3货架
|
||||
private String can_vehicle_type;
|
||||
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
// 获取数量
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user