|
|
@ -1,6 +1,7 @@ |
|
|
|
package org.nl.wms.sch.task_manage.task.tasks.ghs; |
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
import cn.hutool.core.lang.Assert; |
|
|
|
import cn.hutool.core.util.IdUtil; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
@ -8,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.nl.common.exception.BadRequestException; |
|
|
|
import org.nl.config.MapOf; |
|
|
|
import org.nl.wms.database.material.service.dao.MdBaseMaterial; |
|
|
|
import org.nl.wms.ext.service.WmsToAcsService; |
|
|
|
import org.nl.wms.pdm.service.IPdmBdWorkorderService; |
|
|
|
import org.nl.wms.pdm.service.dao.PdmBdWorkorder; |
|
|
|
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; |
|
|
@ -19,12 +22,16 @@ import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; |
|
|
|
import org.nl.wms.sch.task.service.dao.SchBaseTask; |
|
|
|
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; |
|
|
|
import org.nl.wms.sch.task_manage.AbstractTask; |
|
|
|
import org.nl.wms.sch.task_manage.GeneralDefinition; |
|
|
|
import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; |
|
|
|
import org.nl.wms.sch.task_manage.enums.GroupStatusEnum; |
|
|
|
import org.nl.wms.sch.task_manage.enums.PointStatusEnum; |
|
|
|
import org.nl.wms.sch.task_manage.enums.WorkOrderStatusEnum; |
|
|
|
import org.nl.wms.sch.task_manage.task.TaskType; |
|
|
|
import org.nl.wms.sch.task_manage.task.core.TaskStatus; |
|
|
|
import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; |
|
|
|
import org.nl.wms.util.PointUtils; |
|
|
|
import org.nl.wms.util.TaskUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
@ -58,83 +65,141 @@ public class GHSFMTask extends AbstractTask { |
|
|
|
@Autowired |
|
|
|
private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; |
|
|
|
@Autowired |
|
|
|
private PointMapper yzMapper; |
|
|
|
private PointMapper pointMapper; |
|
|
|
@Autowired |
|
|
|
private WmsToAcsService wmsToAcsService; |
|
|
|
|
|
|
|
/** |
|
|
|
* 1.扫描每个允许放货的固化室01和06位置是否满足三列均已放满,开始下一层判断 |
|
|
|
* 2.如果当列1-5或6-10总15个位置已经放满,则进行下一层判断 |
|
|
|
* 3.如果该固化室30个位置全部放满,则通知acs告知固化室开始固化 |
|
|
|
* 4.如果内部2-5或7-10仍有空列,则生成1-(2-5),6-(7-10)的任务,优先级为8最高 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
// @Transactional(rollbackFor = Exception.class)
|
|
|
|
protected void create() throws BadRequestException { |
|
|
|
// 获取任务
|
|
|
|
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
|
|
|
// 配置信息
|
|
|
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
|
|
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
|
|
|
for (SchBaseTask task : tasks) { |
|
|
|
List<String> nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")).collect(Collectors.toList()); |
|
|
|
// 找终点
|
|
|
|
String extGroupData = task.getExt_group_data(); |
|
|
|
JSONObject jsonObject = JSONObject.parseObject(extGroupData); |
|
|
|
SchBasePoint point = findNextPoint(nextRegionStr, jsonObject); |
|
|
|
if (ObjectUtil.isEmpty(point)) { |
|
|
|
task.setRemark("未找到所需点位!"); |
|
|
|
taskService.update(task); |
|
|
|
// 消息通知
|
|
|
|
List<SchBasePoint> schBasePointList = pointMapper.findPointByRegion("GHS","2"); |
|
|
|
for (SchBasePoint schBasePoint : schBasePointList) { |
|
|
|
if (!schBasePoint.getPoint_code().endsWith("01") && |
|
|
|
!schBasePoint.getPoint_code().endsWith("06")) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
// 设置终点并修改创建成功状态
|
|
|
|
task.setPoint_code2(point.getPoint_code()); |
|
|
|
task.setTask_status(TaskStatus.CREATED.getCode()); |
|
|
|
task.setRemark(""); |
|
|
|
taskService.update(task); |
|
|
|
|
|
|
|
point.setIng_task_code(task.getTask_code()); |
|
|
|
pointService.update(point); |
|
|
|
if (schBasePoint.getVehicle_qty()==3&&ObjectUtil.isEmpty(schBasePoint.getIng_task_code())) { |
|
|
|
log.info("固化室对接位{}已经放满,开始进行后续判断",schBasePoint.getPoint_code()); |
|
|
|
String first=schBasePoint.getPoint_code().substring(0,schBasePoint.getPoint_code().length()-2); |
|
|
|
String last=schBasePoint.getPoint_code().substring(schBasePoint.getPoint_code().length()-1); |
|
|
|
String middle=schBasePoint.getPoint_code().substring(schBasePoint.getPoint_code().length()-4,schBasePoint.getPoint_code().length()-2); |
|
|
|
boolean flag=false; |
|
|
|
String pointCode=null; |
|
|
|
//倒叙检查是否有符合要求的终点
|
|
|
|
for(int i=4;i>0;i--){ |
|
|
|
pointCode=first+ String.format("%02d",Integer.valueOf(last)+i); |
|
|
|
for(SchBasePoint schBasePoint1 : schBasePointList){ |
|
|
|
if (schBasePoint1.getPoint_code().equals(pointCode) |
|
|
|
&&schBasePoint1.getVehicle_qty()==0&&ObjectUtil.isEmpty(schBasePoint1.getIng_task_code())){ |
|
|
|
log.info("找到当前列内部存在空位{}",pointCode); |
|
|
|
flag=true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if(flag){ |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (flag){ |
|
|
|
//生成任务并下发
|
|
|
|
this.createTask(schBasePoint,pointCode); |
|
|
|
}else{ |
|
|
|
//如果当列均已放满,检查隔壁列是否已全部放满
|
|
|
|
if("1".equals(last)){ |
|
|
|
last="6"; |
|
|
|
} |
|
|
|
for(int i=0;i<=4;i++){ |
|
|
|
pointCode=first+ String.format("%02d",Integer.valueOf(last)+i); |
|
|
|
for(SchBasePoint schBasePoint1 : schBasePointList){ |
|
|
|
if (schBasePoint1.getPoint_code().equals(pointCode) |
|
|
|
&&(schBasePoint1.getVehicle_qty()!=3||ObjectUtil.isNotEmpty(schBasePoint1.getIng_task_code()))){ |
|
|
|
log.info("检查当前固化室{}隔壁列,找到当前列内部存在空位{},不发送固化请求",schBasePoint.getPoint_code(),pointCode); |
|
|
|
flag=true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//下发
|
|
|
|
// this.renotifyAcs(task);
|
|
|
|
} |
|
|
|
if(!flag){ |
|
|
|
//通知acs已经放满,固化室可以进行固化
|
|
|
|
String device_code="ZDM"+middle; |
|
|
|
log.info("当前固化室已经全部放满,通知固化室的自动门{}开始固化",device_code); |
|
|
|
JSONObject map = new JSONObject(); |
|
|
|
map.put("device_code",device_code); |
|
|
|
map.put("type","1"); |
|
|
|
wmsToAcsService.notifyAcs(map); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 判断是否加急:是->入窑口,否->双层缓存线 |
|
|
|
* 创建任务并下发 |
|
|
|
* |
|
|
|
* @param nextRegionStr |
|
|
|
* @param extGroupData |
|
|
|
* @param schBasePoint |
|
|
|
* @param endPoint |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
private SchBasePoint findNextPoint(List<String> nextRegionStr, JSONObject extGroupData) { |
|
|
|
// 需要获取nextRegionStr
|
|
|
|
if (nextRegionStr.size() < 2) { |
|
|
|
throw new BadRequestException("压制送料任务的配置文件有错!"); |
|
|
|
} |
|
|
|
String regionCode = nextRegionStr.get(0); |
|
|
|
// 当前设备的工单
|
|
|
|
String workorderCode = extGroupData.getString("workorder_code"); |
|
|
|
PdmBdWorkorder one = ObjectUtil.isNotEmpty(workorderCode) |
|
|
|
? workorderService.getOne(new LambdaQueryWrapper<PdmBdWorkorder>() |
|
|
|
.eq(PdmBdWorkorder::getWorkorder_code, workorderCode)) |
|
|
|
: null; |
|
|
|
if (one == null) { |
|
|
|
throw new BadRequestException("压制机的工单不能为空!"); |
|
|
|
} |
|
|
|
// 判断是否加急,加急则去窑口,不加急就是去双层缓存输送线
|
|
|
|
if (one.getIs_urgent()) { |
|
|
|
regionCode = nextRegionStr.get(1); // 去窑区
|
|
|
|
} |
|
|
|
List<SchBasePoint> pointForYZSL = yzMapper.findPointForYZSL(new JSONObject( |
|
|
|
MapOf.of("regionCode", regionCode, "pointType", ENTRANCE))); |
|
|
|
return ObjectUtil.isNotEmpty(pointForYZSL) ? pointForYZSL.get(0) : null; |
|
|
|
// ??
|
|
|
|
// LambdaQueryWrapper<SchBasePoint> lam = new LambdaQueryWrapper<>();
|
|
|
|
// lam.eq(SchBasePoint::getRegion_code, regionCode)
|
|
|
|
// .eq(SchBasePoint::getPoint_type, ENTRANCE)
|
|
|
|
// .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住
|
|
|
|
// .or()
|
|
|
|
// .eq(SchBasePoint::getIng_task_code, ""))
|
|
|
|
// .eq(SchBasePoint::getIs_used, true);
|
|
|
|
// List<SchBasePoint> schBasePoints = pointService.list(lam);
|
|
|
|
// return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null;
|
|
|
|
private void createTask(SchBasePoint schBasePoint,String endPoint) { |
|
|
|
// 申请任务
|
|
|
|
SchBaseTask task = new SchBaseTask(); // 任务实体
|
|
|
|
String apply_point_code =schBasePoint.getPoint_code(); // 请求点
|
|
|
|
String config_code = "GHSFMTask"; |
|
|
|
// 1、校验数据
|
|
|
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
|
|
|
.eq(SchBaseTaskconfig::getConfig_code, config_code)); |
|
|
|
Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!"); |
|
|
|
// 最大任务数
|
|
|
|
Integer tcmn = taskConfig.getTask_create_max_num(); |
|
|
|
// 获取执行中的任务
|
|
|
|
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( |
|
|
|
taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); |
|
|
|
|
|
|
|
Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, |
|
|
|
"该点位申请的任务未完成数已超过上限,无法申请任务"); |
|
|
|
// 获取对接位点位对象
|
|
|
|
SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>() |
|
|
|
.eq(SchBasePoint::getPoint_code, apply_point_code)); |
|
|
|
// 校验是否需要自动agv
|
|
|
|
if (!pointObj.getIs_auto()) { |
|
|
|
// 如果不需要自动,则不创建任务
|
|
|
|
return; |
|
|
|
} |
|
|
|
// 2、创建申请任务
|
|
|
|
task.setConfig_code(config_code); |
|
|
|
task.setCreate_mode(GeneralDefinition.ACS_CREATION); |
|
|
|
task.setVehicle_code(schBasePoint.getVehicle_code()); |
|
|
|
task.setVehicle_qty(schBasePoint.getVehicle_qty()); |
|
|
|
task.setTask_status(TaskStatus.APPLY.getCode()); |
|
|
|
task.setWorkshop_code(taskConfig.getWorkshop_code()); // 车间编码
|
|
|
|
task.setPoint_code2(endPoint); |
|
|
|
task.setTask_status(TaskStatus.CREATED.getCode()); |
|
|
|
task.setRemark(""); |
|
|
|
// 设置起/终点
|
|
|
|
this.setTaskPoint(taskConfig, task, apply_point_code); |
|
|
|
taskService.create(task); |
|
|
|
|
|
|
|
//下发
|
|
|
|
this.renotifyAcs(task); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 修改任务状态 |
|
|
|
* 1.任务完成时,无需再次组盘,将点位表起点货位三个组盘信息移动到终点 |
|
|
|
* 2.组盘表中三个点位增加移动动作,并且修改当前点位到目标地点 |
|
|
|
* 3. |
|
|
|
* |
|
|
|
* @param task_code |
|
|
|
* @param status |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
// @Transactional(rollbackFor = Exception.class)
|
|
|
|
protected void updateStatus(String task_code, TaskStatus status) { |
|
|
@ -146,18 +211,6 @@ public class GHSFMTask extends AbstractTask { |
|
|
|
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { |
|
|
|
throw new BadRequestException("该任务已取消!"); |
|
|
|
} |
|
|
|
// 获取参数
|
|
|
|
JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) |
|
|
|
? JSONObject.parseObject(taskObj.getExt_group_data()) |
|
|
|
: null; |
|
|
|
// 载具编码:没有就创建一个
|
|
|
|
String vehicle_code = ObjectUtil.isNotEmpty(taskObj.getVehicle_code()) |
|
|
|
? taskObj.getVehicle_code() |
|
|
|
: IdUtil.getSnowflake(1, 1).nextIdStr(); |
|
|
|
PdmBdWorkorder workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) |
|
|
|
? workorderService.getOne(new LambdaQueryWrapper<PdmBdWorkorder>() |
|
|
|
.eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) |
|
|
|
: null; |
|
|
|
String startPoint = taskObj.getPoint_code1(); // 获取起点
|
|
|
|
String endPoint = taskObj.getPoint_code2(); // 获取终点
|
|
|
|
SchBasePoint startPointObj = pointService.getById(startPoint); |
|
|
@ -168,46 +221,41 @@ public class GHSFMTask extends AbstractTask { |
|
|
|
taskObj.setRemark("执行中"); |
|
|
|
} |
|
|
|
if (status.equals(TaskStatus.FINISHED)) { // 完成
|
|
|
|
StringBuilder group_id= new StringBuilder(); |
|
|
|
// 终点解锁
|
|
|
|
endPointObj.setIng_task_code(""); |
|
|
|
endPointObj.setVehicle_code(startPointObj.getVehicle_code()); |
|
|
|
endPointObj.setVehicle_type(startPointObj.getVehicle_type()); |
|
|
|
endPointObj.setVehicle_code(startPointObj.getVehicle_code()); |
|
|
|
endPointObj.setVehicle_qty(startPointObj.getVehicle_qty()); |
|
|
|
endPointObj.setUpdate_time(DateUtil.now()); |
|
|
|
pointService.update(endPointObj); |
|
|
|
List<String> vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList()); |
|
|
|
for(String vehicleCode:vehicleCodeList) { |
|
|
|
SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper<SchBaseVehiclematerialgroup>() |
|
|
|
.eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode) |
|
|
|
.eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, |
|
|
|
GroupBindMaterialStatusEnum.BOUND.getValue())); |
|
|
|
if (ObjectUtil.isEmpty(one)) { |
|
|
|
throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到"); |
|
|
|
} |
|
|
|
one.setTask_code(taskObj.getTask_code()); |
|
|
|
one.setPoint_code(endPointObj.getPoint_code()); // 当前位置
|
|
|
|
one.setPoint_name(endPointObj.getPoint_name()); |
|
|
|
one.setMove_way(one.getMove_way() + " -> " + endPointObj.getPoint_code()); |
|
|
|
one.setUpdate_id(GeneralDefinition.ACS_ID); |
|
|
|
one.setUpdate_name(GeneralDefinition.ACS_NAME); |
|
|
|
one.setUpdate_time(DateUtil.now()); |
|
|
|
vehiclematerialgroupService.updateById(one); |
|
|
|
group_id.append(one.getGroup_id()).append(','); |
|
|
|
} |
|
|
|
// 起点清空
|
|
|
|
if (ObjectUtil.isNotEmpty(startPointObj)) { |
|
|
|
PointUtils.clearPoint(startPointObj); |
|
|
|
} |
|
|
|
// 终点解锁
|
|
|
|
endPointObj.setIng_task_code(""); |
|
|
|
pointService.update(endPointObj); |
|
|
|
// 要把数据存到组盘表 -> 改造公共方法,返回id
|
|
|
|
SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); |
|
|
|
groupEntity.setGroup_id(IdUtil.getSnowflake(1,1).nextIdStr()); |
|
|
|
groupEntity.setCreate_id("2"); |
|
|
|
groupEntity.setCreate_name("ACS"); |
|
|
|
groupEntity.setCreate_time(DateUtil.now()); |
|
|
|
groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) |
|
|
|
? workorderCode.getMaterial_id() |
|
|
|
: ""); |
|
|
|
groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) |
|
|
|
? workorderCode.getStanding_time() |
|
|
|
: 0); |
|
|
|
groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) |
|
|
|
? extGroupData.getBigDecimal("material_qty") |
|
|
|
: BigDecimal.valueOf(0)); |
|
|
|
groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) |
|
|
|
? workorderCode.getWorkorder_code() |
|
|
|
: ""); |
|
|
|
groupEntity.setVehicle_code(vehicle_code); |
|
|
|
groupEntity.setVehicle_type(taskObj.getVehicle_type()); |
|
|
|
groupEntity.setPoint_code(startPoint); |
|
|
|
groupEntity.setPoint_name(startPointObj.getPoint_name()); |
|
|
|
groupEntity.setPcsn( DateUtil.format(DateUtil.date(), "yyyyMMdd")); |
|
|
|
groupEntity.setInstorage_time(DateUtil.now()); |
|
|
|
groupEntity.setTask_code(taskObj.getTask_code()); |
|
|
|
groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定
|
|
|
|
groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。
|
|
|
|
groupEntity.setIs_delete(false); |
|
|
|
vehiclematerialgroupService.save(groupEntity); |
|
|
|
|
|
|
|
// 任务完成
|
|
|
|
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); |
|
|
|
taskObj.setGroup_id(groupEntity.getGroup_id()); |
|
|
|
taskObj.setGroup_id(group_id.toString()); |
|
|
|
taskObj.setRemark("任务完成"); |
|
|
|
} |
|
|
|
if (status.equals(TaskStatus.CANCELED)) { // 取消
|
|
|
|