modified: 分切下料、分切上料、烘箱、内包间套轴、废箔、取样业务

This commit is contained in:
2024-08-27 15:07:09 +08:00
parent 0cee2b7f37
commit fb1749396f
45 changed files with 1090 additions and 100 deletions

View File

@@ -47,6 +47,18 @@ public class AcsToWmsController {
public ResponseEntity<Object> outHotTaskApply(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(acsToWmsService.outHotTaskApply(whereJson), HttpStatus.OK);
}
@PostMapping("/applyOvenGantryTask")
@Log(value = "申请出烘箱任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
@SaIgnore
public ResponseEntity<Object> applyOvenGantryTask(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(acsToWmsService.applyOvenGantryTask(whereJson), HttpStatus.OK);
}
@PostMapping("/applyNewPoint")
@Log(value = "管芯库满入空出申请新点位", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
@SaIgnore
public ResponseEntity<Object> applyNewPoint(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(acsToWmsService.applyNewPoint(whereJson), HttpStatus.OK);
}
@PostMapping("/receiveWasteFoilWeight")
@Log(value = "废箔重量反馈", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
@SaIgnore

View File

@@ -132,4 +132,18 @@ public interface AcsToWmsService {
* @return
*/
JSONObject receiveWasteFoilWeight(JSONObject whereJson);
/**
* ACS申请入烘箱
* @param param
* @return
*/
JSONObject applyOvenGantryTask(JSONObject param);
/**
* 管芯库满入空出
* @param param
* @return
*/
JSONObject applyNewPoint(JSONObject param);
}

View File

@@ -2,7 +2,6 @@ package org.nl.wms.ext.acs.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.ext.acs.service.dto.to.wms.AcsResponse;
import org.nl.wms.sch.task_manage.AcsTaskDto;
import java.util.List;
@@ -40,7 +39,7 @@ public interface WmsToAcsService {
*/
JSONObject canFinishPreviousTask(JSONArray param);
/**
* 通知ACS可以完成任务
* 管芯入库
* @param param /
* @return /
*/

View File

@@ -11,6 +11,7 @@ import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskFactory;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.service.BakingOperationService;
import org.nl.wms.sch.task_manage.service.NbjOperationService;
import org.nl.wms.sch.task_manage.service.OtherOperationService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
@@ -35,6 +36,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
private BakingOperationService bakingOperationService;
@Autowired
private OtherOperationService otherOperationService;
@Autowired
private NbjOperationService nbjOperationService;
@Override
public Map<String, Object> receiveTaskStatusAcs(String string) throws InterruptedException {
log.info("acs向lms反馈任务状态请求参数--------------------------------------" + string);
@@ -175,4 +178,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
public JSONObject receiveWasteFoilWeight(JSONObject whereJson) {
return otherOperationService.acsRequestWasteFoilWeight(whereJson);
}
@Override
public JSONObject applyOvenGantryTask(JSONObject param) {
return bakingOperationService.acsRequestInHotTask(param);
}
@Override
public JSONObject applyNewPoint(JSONObject param) {
return nbjOperationService.tubeExceptionHandling(param);
}
}

View File

@@ -37,7 +37,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
@Override
public JSONObject updateTask(JSONArray arr) {
String api = "api/wms/updateTask";
return AcsUtil.notifyAcs(api, arr);
return AcsUtil.notifyAcs4(api, arr);
}
@Override

View File

@@ -36,13 +36,19 @@ public class SlitterPdaController {
return new ResponseEntity<>(slitterPdaService.queryOrderInfo(whereJson), HttpStatus.OK);
}
@PostMapping("/sendSlitterRoll")
@Log("母卷送回 - 分切复烤")
public ResponseEntity<Object> sendSlitterRoll(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(slitterPdaService.sendSlitterRoll(whereJson), HttpStatus.OK);
}
@PostMapping("/callSlitterRoll")
@Log("呼叫母卷")
@Log("呼叫母卷 - 分切上料")
public ResponseEntity<Object> callSlitterRoll(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(slitterPdaService.callSlitterRoll(whereJson), HttpStatus.OK);
}
@PostMapping("/allowCoiling")
@Log("允许上卷")
@Log("允许上卷 - 确认上料")
public ResponseEntity<Object> allowCoiling(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(slitterPdaService.allowCoiling(whereJson), HttpStatus.OK);
}
@@ -56,4 +62,10 @@ public class SlitterPdaController {
public ResponseEntity<Object> slitterDown(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(slitterPdaService.slitterDown(whereJson), HttpStatus.OK);
}
@PostMapping("/querySlitterDeviceSubVolumeInfos")
@Log("查询手持查询设备对应的子卷数据")
@SaIgnore
public ResponseEntity<Object> querySlitterDeviceSubVolumeInfos(@RequestBody JSONObject param) {
return new ResponseEntity<>(slitterPdaService.querySlitterDeviceSubVolumeInfos(param), HttpStatus.OK);
}
}

View File

@@ -42,4 +42,19 @@ public interface SlitterPdaService {
* @return /
*/
JSONObject slitterDown(JSONObject param);
/**
* 母卷送回-分切复烤
* @see org.nl.wms.sch.task_manage.tasks.slitter.SlitterInHotAGVTask
* @param param /
* @return /
*/
JSONObject sendSlitterRoll(JSONObject param);
/**
* 查询手持查询设备对应的子卷数据
* @param param /
* @return /
*/
JSONObject querySlitterDeviceSubVolumeInfos(JSONObject param);
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.ext.acs.service.WmsToAcsService;
@@ -12,6 +13,8 @@ import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.bi.service.IpdmBiSlittingproductionplanService;
import org.nl.wms.pdm.ivt.bcut.service.IBstIvtCutpointivtService;
import org.nl.wms.pdm.ivt.bcut.service.dao.BstIvtCutpointivt;
import org.nl.wms.pdm.ivt.cut.service.dao.StIvtCutpointivt;
import org.nl.wms.pdm.ivt.cut.service.IstIvtCutpointivtService;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
@@ -19,6 +22,7 @@ import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask;
import org.nl.wms.sch.task_manage.tasks.slitter.SlitterDownAGVTask;
import org.nl.wms.sch.task_manage.tasks.slitter.SlitterInHotAGVTask;
import org.nl.wms.sch.task_manage.tasks.slitter.SlitterSendRollAGVTask;
import org.nl.wms.sch.task_manage.tasks.slitter.SlitterUpTrussTask;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,14 +55,17 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
@Autowired
private IstIvtCutpointivtService cutpointivtService;
@Autowired
private IBstIvtCutpointivtService bstIvtCutpointivtService;
@Autowired
private IpdmBiSlittingproductionplanService slittingproductionplanService;
@Autowired
private SlitterDownAGVTask slitterDownAGVTask;
@Autowired
private SlitterInHotAGVTask slitterInHotAGVTask;
@Override
public JSONObject queryOrderInfo(JSONObject param) {
List<PdmBiRawfoilworkorder> orders = rawfoilworkorderService.getAllUsedRawPlanOnZc();
JSONObject result = new JSONObject();
result.put("data", orders);
result.put("data", rawfoilworkorderService.getAllUsedRawPlanOnZc());
result.put("message", "操作成功!");
return result;
}
@@ -70,19 +77,24 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
String workorderId = param.getString("workorder_id");
// 分切机满料位
String pointCode = param.getString("point_code");
String vehicleCode = param.getString("vehicle_code");
String zcPoint = param.getString("zc_point");
Assert.notBlank(workorderId, "请选择母卷!");
Assert.notBlank(pointCode, "点位不能为空!");
// 校验桁架任务
Boolean isTask = taskService.checkHaveTaskByPoints(
Stream.of(zcPoint, pointCode).collect(Collectors.toList()));
// 判断是否呼叫过任务
List<SchBaseTask> schBaseTasks = taskService.checkHaveTask(pointCode);
if (schBaseTasks.size() > 0) {
if (isTask) {
throw new BadRequestException("点位[" + pointCode + "]已经创建过任务!");
}
StIvtCutpointivt cutPoint = cutpointivtService.getOneByCode(pointCode);
param.put("config_code", "SlitterUpTrussTask");
param.put("device_code", pointCode);
param.put("create_mode", GeneralDefinition.PDA_CREATION);
// 判断空轴位状态
// 标记一下, 0: 只做呼叫母卷1呼叫母卷还要送空辊
param.put("is_flag", ObjectUtil.isEmpty(vehicleCode) ? "0" : "1");
param.put("is_flag", "01".equals(cutPoint.getEmpty_point_status()) ? "0" : "1");
param.put("vehicle_code", cutPoint.getEmpty_vehicle_code());
slitterUpTrussTask.apply(param);
JSONObject result = new JSONObject();
result.put("message", "操作成功!");
@@ -91,7 +103,7 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
@Override
public JSONObject allowCoiling(JSONObject param) {
log.info("手持分切准备就绪, {}", param);
log.info("手持分切确认上料, {}", param);
// point_code
String pointCode = param.getString("point_code");
// 获取对应任务
@@ -120,19 +132,21 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
@Override
public JSONObject vehicleReturn(JSONObject param) {
log.info("手持空轴送回, {}", param);
// param: point_code, vehicle_code
// param: point_code
String pointCode = param.getString("point_code");
String vehicleCode = param.getString("vehicle_code");
Assert.notBlank(vehicleCode, "载具编码不能为空!");
StIvtCutpointivt cutPoint = cutpointivtService.getByFullCode(pointCode, false);
if ("01".equals(cutPoint.getEmpty_point_status())) {
throw new BadRequestException("系统识别到分切上料位[ " + pointCode + " ]无空轴!");
}
// 校验是否有任务
List<SchBaseTask> schBaseTasks = taskService.checkHaveTask(cutPoint.getEmpty_point_code());
if (schBaseTasks.size() > 0) {
throw new BadRequestException("点位[" + pointCode + "]已经存在任务!");
}
// todo: 载具类型没有获取
param.put("device_code", cutPoint.getEmpty_point_code());
param.put("config_code", "SlitterSendRollAGVTask");
// 最后一趟送回去的才需要清
param.put("is_flag", "1");
param.put("create_mode", GeneralDefinition.PDA_CREATION);
slitterSendRollAGVTask.apply(param);
JSONObject result = new JSONObject();
@@ -177,4 +191,114 @@ public class SlitterPdaServiceImpl implements SlitterPdaService {
result.put("message", "分切机" + deviceCode + "下卷成功!");
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject sendSlitterRoll(JSONObject param) {
log.info("手持母卷复烤, {}", param);
// param: point_code
String pointCode = param.getString("point_code");
// 判断是否存在任务
List<SchBaseTask> unFinishTasks = taskService.checkHaveTask(pointCode);
// 判断是否存在对应的桁架任务
List<SchBaseTask> unFinishRelatedTasks = taskService.checkHaveRelatedTaskInRequestParam(pointCode);
if (unFinishTasks.size() > 0 || unFinishRelatedTasks.size() > 0) {
throw new BadRequestException("点位[" + pointCode + "]已经存在任务!");
}
StIvtCutpointivt cutPoint = cutpointivtService.getOneByCode(pointCode);
if ("01".equals(cutPoint.getFull_point_status())
|| ObjectUtil.isEmpty(cutPoint.getContainer_name())) {
throw new BadRequestException("点位[" + pointCode + "]系统检测空位!");
}
// 获取生箔工单
PdmBiRawfoilworkorder rawOrder = rawfoilworkorderService.getByContainerName(cutPoint.getContainer_name());
// 组织请求任务参数
JSONObject taskParam = new JSONObject();
taskParam.put("device_code", pointCode);
taskParam.put("config_code", "SlitterInHotAGVTask");
// todo: 流转单号暂时当作母卷号
taskParam.put("order_code", rawOrder.getContainer_name());
taskParam.put("create_mode", GeneralDefinition.PDA_CREATION);
slitterInHotAGVTask.apply(taskParam);
JSONObject result = new JSONObject();
result.put("message", "母卷回库任务创建成功!");
return result;
}
@Override
public JSONObject querySlitterDeviceSubVolumeInfos(JSONObject param) {
JSONObject res = new JSONObject();
JSONObject data = new JSONObject();
res.put("status", cn.hutool.http.HttpStatus.HTTP_OK);
res.put("data", data);
// param: device_code
String device_code = param.getString("point_code");
String msg = "";
StIvtCutpointivt deviceCode = cutpointivtService.getPintByExtCode(device_code, false);
String upQzzno = deviceCode.getUp_qzzno();
String downQzzno = deviceCode.getDown_qzzno();
if (ObjectUtil.isNotEmpty(upQzzno)) {
List<PdmBiSlittingproductionplan> byQzzNo = slittingproductionplanService.getByQzzNoByStatus(upQzzno, "05");
if (byQzzNo.size() == 0) {
msg = "上轴对应的数据不存在!";
} else {
String collect = byQzzNo
.stream()
.map(PdmBiSlittingproductionplan::getContainer_name)
.collect(Collectors.joining(","));
data.put("up", collect);
}
} else {
msg = "上轴无子卷信息!";
}
if (ObjectUtil.isNotEmpty(downQzzno)) {
List<PdmBiSlittingproductionplan> byQzzNo = slittingproductionplanService.getByQzzNoByStatus(downQzzno, "05");
if (byQzzNo.size() == 0) {
msg = msg + "下轴对应的数据不存在!";
} else {
String collect = byQzzNo
.stream()
.map(PdmBiSlittingproductionplan::getContainer_name)
.collect(Collectors.joining(","));
data.put("down", collect);
}
} else {
msg = msg + "下轴无子卷信息!";
}
// 获取当前分切机的下一组分切计划(最多四条分切计划)
// hint: 获取到的分切可能是不同组的但具有一定时间顺序, 可能是以前的脏数据
List<PdmBiSlittingproductionplan> timePlans = slittingproductionplanService.list(
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getResource_name, deviceCode.getExt_code())
.eq(PdmBiSlittingproductionplan::getStatus, "03")
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
.orderByAsc(PdmBiSlittingproductionplan::getUpdate_time));
log.info("获取下一组分切计划:{}", timePlans);
if (timePlans.size() > 0) {
// 寻找备好轴的对接点位
List<BstIvtCutpointivt> cutPointList = bstIvtCutpointivtService.getReadyShaftPoint(deviceCode.getExt_code());
if (cutPointList.size() == 0) {
msg = msg + "没有套好轴的位置!";
} else {
// 找到该分切计划的点位
BstIvtCutpointivt newCutPoint = cutPointList.get(0);
List<String> qzzNos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2())
.filter(value -> value != null && !value.isEmpty())
.collect(Collectors.toList());
List<PdmBiSlittingproductionplan> nextPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.in(PdmBiSlittingproductionplan::getQzzno, qzzNos)
.eq(PdmBiSlittingproductionplan::getStatus, "03")
.eq(PdmBiSlittingproductionplan::getIs_delete, "0"));
String collect = nextPlans.stream()
.map(PdmBiSlittingproductionplan::getContainer_name)
.filter(ObjectUtil::isNotEmpty)
.collect(Collectors.joining(","));
msg = msg + "下一趟子卷号[" + collect + "]准备的气胀轴位置[" + newCutPoint.getPoint_code() + "]";
}
} else {
msg = msg + " 没有套好轴的下一趟分切计划!";
}
data.put("msg", msg);
return res;
}
}

View File

@@ -0,0 +1,4 @@
/**
* 手持相关包
*/
package org.nl.wms.pda;

View File

@@ -65,8 +65,9 @@ public class NbjPdaController {
@PostMapping("/doBindingGx")
@Log("套轴绑定-绑定管芯")
public ResponseEntity<Object> doBindingGx(@RequestBody JSONObject param) {
return new ResponseEntity<>(nbjPdaService.doBindingGx(param), HttpStatus.OK);
return new ResponseEntity<>(nbjPdaService.doBindingGxV2(param), HttpStatus.OK);
}
@PostMapping("/getSlitterDeviceBox")
@Log(value = "套轴绑定-分切机设备下拉框", isAddLogTable=false)
public ResponseEntity<Object> getSlitterDeviceBox() {

View File

@@ -30,6 +30,11 @@ public class OtherPdaController {
public ResponseEntity<Object> startMoveWasteFoilV2(@RequestBody JSONObject param) {
return new ResponseEntity<>(otherPdaService.startMoveWasteFoilV2(param), HttpStatus.OK);
}
@PostMapping("/resumeMoveWasteFoil/v2")
@Log("继续/结束搬运废箔信息")
public ResponseEntity<Object> resumeMoveWasteFoilV2(@RequestBody JSONObject param) {
return new ResponseEntity<>(otherPdaService.resumeMoveWasteFoilV2(param), HttpStatus.OK);
}
@PostMapping("/startMoveWasteFoil")
@Log("开始搬运废箔信息")
public ResponseEntity<Object> startMoveWasteFoil(@RequestBody JSONObject param) {
@@ -45,6 +50,11 @@ public class OtherPdaController {
public ResponseEntity<Object> callAgvToSampling(@RequestBody JSONObject param) {
return new ResponseEntity<>(otherPdaService.callAgvToSampling(param), HttpStatus.OK);
}
@PostMapping("/callAgvToSamplingVerify")
@Log("取样确认")
public ResponseEntity<Object> callAgvToSamplingVerify(@RequestBody JSONObject param) {
return new ResponseEntity<>(otherPdaService.callAgvToSamplingVerify(param), HttpStatus.OK);
}
@PostMapping("/onlyCallRollTruss")
@Log("呼叫出辊-桁架任务完成不做AGV")
public ResponseEntity<Object> onlyCallRollTruss(@RequestBody JSONObject param) {

View File

@@ -71,4 +71,11 @@ public interface NbjPdaService {
* @return /
*/
JSONObject doSendShaft(JSONObject param);
/**
* 套轴绑定-绑定管芯
* @param param /
* @return /
*/
JSONObject doBindingGxV2(JSONObject param);
}

View File

@@ -14,6 +14,14 @@ public interface OtherPdaService {
* @return /
*/
JSONObject startMoveWasteFoilV2(JSONObject param);
/**
* 继续/结束搬运废箔信息
* @param param /
* @return /
*/
JSONObject resumeMoveWasteFoilV2(JSONObject param);
/**
* 开始搬运废箔
* @param param /
@@ -48,4 +56,11 @@ public interface OtherPdaService {
* @return /
*/
JSONObject onlySendRollTruss(JSONObject param);
/**
* 取样送样确认
* @param param /
* @return /
*/
JSONObject callAgvToSamplingVerify(JSONObject param);
}

View File

@@ -151,17 +151,16 @@ public class GxPdaServiceImpl implements GxPdaService {
throw new BadRequestException("一次性最多只能入5个管芯");
}
// 找管芯库中的空位。
List<SchBasePoint> allGxPoints = pointService.getPointByConditions("A1", "A1-GXK",
"3", "1", null, true);
List<SchBasePoint> allGxPoints = pointService.getGxPointNotLock();
if (allGxPoints.size() < gxNumber) {
log.warn("管芯库不够存放,只够存放{}个管芯", allGxPoints.size());
}
gxNumber = Math.min(gxNumber, allGxPoints.size());
int actualQuantity = Math.min(gxNumber, allGxPoints.size());
// 更新点位信息
List<SchBasePoint> updatePoint = new ArrayList<>();
for (int i = 0; i < gxNumber; i++) {
for (int i = 0; i < actualQuantity; i++) {
SchBasePoint point = allGxPoints.get(i);
point.setPoint_status("2");
point.setLock_type("2");
point.setVehicle_code(materialCode);
point.setRemark(materialSpec);
updatePoint.add(point);
@@ -172,10 +171,11 @@ public class GxPdaServiceImpl implements GxPdaService {
JSONObject acs = new JSONObject();
acs.put("product_area", URLEnum.ACS_URL_A1.getProduct_area());
acs.put("device_code", gxRks.get(0).getPoint_code());
for (int i = 0; i < gxNumber; i++) {
acs.put("num", gxNumber);
for (int i = 0; i < actualQuantity; i++) {
// 查找点位最终一次性发给ACS
acs.put("to_barcode" + (i + 1), materialCode);
acs.put("to_target" + (i + 1), allGxPoints.get(i).getPoint_code());
acs.put("barcode" + (i + 1), materialCode);
acs.put("target" + (i + 1), allGxPoints.get(i).getPoint_code());
acsArray.add(acs);
}
// 调用ACS

View File

@@ -148,13 +148,14 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Override
public JSONObject doSubVolumeBindingWeight(JSONObject param) {
log.info("子卷绑定重量 - {}", param);
// vehicle_code, weight
String vehicleCode = param.getString("vehicle_code");
// container_name, weight
String containerName = param.getString("container_name");
String weight = param.getString("weight");
PdmBiSlittingproductionplan plan = slittingproductionplanService.getByTubeCode(vehicleCode);
PdmBiSlittingproductionplan plan = slittingproductionplanService.getByContainerName(containerName);
if (ObjectUtil.isEmpty(plan)) {
throw new BadRequestException("分切计划不存在!");
throw new BadRequestException("子卷号[ " + containerName + " ]分切计划不存在!");
}
log.info("更新子卷:{} - 重量:{}", containerName, weight);
plan.setWeight(weight);
plan.setUpdate_time(DateUtil.now());
plan.setUpdate_optid(SecurityUtils.getCurrentUserId());
@@ -168,8 +169,8 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Override
public List<PdmBiSlittingproductionplan> getSlitterNeedShaftPlans(@RequestBody JSONObject param) {
String pointCode = param.getString("point_code");
// 获取所有状态是01的分切计划
String pointCode = param.getString("device");
// 获取所有状态是01的分切计划 device
List<PdmBiSlittingproductionplan> list = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getStatus, "01")
.eq(PdmBiSlittingproductionplan::getIs_child_tz_ok, "0")
@@ -180,6 +181,49 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject doBindingGxV2(JSONObject param) {
log.info("手持绑定管芯 - {}", param);
// param: point_coderow
String pointCode = param.getString("point_code");
BstIvtCutpointivt tzzcPoint = bstIvtCutpointivtService.getPintByTrussCode(pointCode, false);
JSONArray rows = param.getJSONArray("row");
List<String> orderIds = rows.stream()
.map(o -> ((JSONObject) o))
.map(o -> o.getString("workorder_id"))
.collect(Collectors.toList());
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByIds(orderIds);
// 当前套轴的分切计划
PdmBiSlittingproductionplan demoPlan = plans.get(0);
String resourceName = demoPlan.getResource_name();
// 生成虚拟气胀轴编码
String qzzNo = TaskUtils.createVirtualQzzNo(resourceName, "yyMMddHHmmss", demoPlan);
for (PdmBiSlittingproductionplan plan : plans) {
plan.setQzzno(qzzNo);
plan.setIs_child_tz_ok("1");
TaskUtils.updateOptMessageBySlitterPlan(plan);
}
// 批量更新
slittingproductionplanService.updateBatchById(plans);
// 点位更新数据
if (tzzcPoint.getTruss_point_code1().equals(pointCode)) {
// 上轴
tzzcPoint.setQzz_no1(qzzNo);
} else {
// 下轴
tzzcPoint.setQzz_no2(qzzNo);
}
tzzcPoint.setPoint_status("2");
setBCutUpdateByPC(tzzcPoint);
bstIvtCutpointivtService.updateById(tzzcPoint);
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "管芯绑定成功!");
return result;
}
@Override
@Deprecated
@Transactional(rollbackFor = Exception.class)
public JSONObject doBindingGx(JSONObject param) {
log.info("手持绑定管芯 - {}", param);
// param: point_code, vehicle_codeworkorder_idrow
@@ -316,11 +360,11 @@ public class NbjPdaServiceImpl implements NbjPdaService {
PdmBiSlittingproductionplan currentUpPlan = plans.stream()
.filter(p -> "1".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
.orElse(new PdmBiSlittingproductionplan());
PdmBiSlittingproductionplan currentDownPlan = plans.stream()
.filter(p -> "2".equals(p.getUp_or_down()))
.findFirst()
.orElse(null);
.orElse(new PdmBiSlittingproductionplan());
PdmBiSlittingproductionplan demoPlan = plans.get(0);
StIvtCutpointivt endPoint = stIvtCutpointivtService.getPintByExtCode(demoPlan.getResource_name(), false);
taskParam.put("point_code2", endPoint.getPoint_code());

View File

@@ -1,5 +1,7 @@
package org.nl.wms.pda.st.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -8,14 +10,18 @@ import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.pda.st.service.OtherPdaService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.tasks.other.CallToSamplingAGVTask;
import org.nl.wms.sch.task_manage.tasks.other.SendWasteFoilAGVTask;
import org.nl.wms.sch.task_manage.tasks.other.WasteFoilAGVTask;
import org.nl.wms.sch.task_manage.tasks.raw.RawCallRollTrussTask;
import org.nl.wms.sch.task_manage.tasks.slitter.SlitterSendRollTrussTask;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@@ -43,16 +49,109 @@ public class OtherPdaServiceImpl implements OtherPdaService {
private SlitterSendRollTrussTask slitterSendRollTrussTask;
@Autowired
private WmsToAcsService wmsToAcsService;
@Autowired
private SendWasteFoilAGVTask sendWasteFoilAGVTask;
@Autowired
private ISchBasePointService pointService;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject startMoveWasteFoilV2(JSONObject param) {
// 点击开始,都将废箔任务创建单条任务存储到任务表中,
// 在通过定时任务,确保只有一条执行中/终点不是废箔终点的任务
log.info("手持开始搬运废箔 - {}", param);
return null;
// 只做保存任务
// point_code
String pointCode = param.getString("point_code");
List<SchBaseTask> schBaseTasks = taskService.checkHaveTask(pointCode);
if (schBaseTasks.size() > 0) {
throw new BadRequestException("点位[" + pointCode + "]已经存在任务!");
}
JSONObject taskParam = new JSONObject();
taskParam.put("point_code2", pointCode);
taskParam.put("index_task", 1);
taskParam.put("config_code", "SendWasteFoilAGVTask");
taskParam.put("create_mode", GeneralDefinition.PDA_CREATION);
taskParam.put("task_status", TaskStatus.SURE_END.getCode());
sendWasteFoilAGVTask.createTask(taskParam);
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "废箔开始搬运请求成功!");
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject resumeMoveWasteFoilV2(JSONObject param) {
log.info("继续/结束搬运废箔 - {}", param);
// 当前的点位是放好废箔的点位 参数flag:1-确认2-结束 point_code
String flag = param.getString("flag");
// 判断是否能够搬运
String pointCode = param.getString("point_code");
// 校验是否二次创建任务
List<SchBaseTask> schBaseTasks = taskService.checkHaveTask(pointCode);
if (schBaseTasks.size() > 0) {
throw new BadRequestException("点位[" + pointCode + "]已经存在任务!");
}
// 查找执行中的任务
SchBaseTask task = taskService.getOne(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getPoint_code2, pointCode)
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()));
if (ObjectUtil.isEmpty(task)) {
throw new BadRequestException("点位[" + pointCode + "]上一个任务不存在!");
}
JSONObject upTaskRequestObj = JSONObject.parseObject(task.getRequest_param());
// 获取下一条的任务
List<SchBaseTask> waitTask = taskService.getTaskByConfigAndStatus(task.getConfig_code(), TaskStatus.SURE_END.getCode());
if (waitTask.size() == 0 || "2".equals(flag)) {
// 最后一条任务, 创建去终点的任务
// 获取一个废箔位置
List<SchBasePoint> fbPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-FB",
"2", null, null, null);
if (CollectionUtil.isEmpty(fbPoints)) {
throw new BadRequestException("找不到废箔点位,请稍后再试!");
}
JSONObject taskParam = new JSONObject();
taskParam.put("point_code1", pointCode);
taskParam.put("point_code2", fbPoints.get(0).getPoint_code());
taskParam.put("config_code", "SendWasteFoilAGVTask");
taskParam.put("create_mode", GeneralDefinition.PDA_CREATION);
taskParam.put("remark", "废箔回去");
taskParam.put("index_task", upTaskRequestObj.getInteger("index_task") + 1);
taskParam.put("carNo", task.getCar_no());
taskParam.put("task_status", TaskStatus.START_AND_POINT.getCode());
sendWasteFoilAGVTask.createTask(taskParam);
} else {
// 获取其中一条任务设置起点
SchBaseTask nextTask = waitTask.get(0);
JSONObject requestObj = JSONObject.parseObject(nextTask.getRequest_param());
requestObj.put("up_task_code", task.getTask_code());
requestObj.put("index_task", upTaskRequestObj.getInteger("index_task") + 1);
nextTask.setCar_no(task.getCar_no());
nextTask.setPoint_code1(task.getPoint_code2());
nextTask.setRequest_param(requestObj.toJSONString());
nextTask.setTask_status(TaskStatus.START_AND_POINT.getCode());
TaskUtils.setUpdateByDefault(nextTask);
taskService.updateById(nextTask);
}
// 通知ACS完成上一个任务
JSONArray acs = new JSONArray();
JSONObject acsParam = new JSONObject();
acsParam.put("task_code", task.getTask_code());
acsParam.put("product_area", task.getProduct_area());
acs.add(acsParam);
log.info("通知ACS完成上一个任务的参数 - {}", acs);
JSONObject jsonObject = wmsToAcsService.canFinishPreviousTask(acs);
log.info("通知ACS完成上一个任务的反馈 - {}", jsonObject);
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "废箔继续搬运请求成功!");
return result;
}
@Override
@Deprecated
@Transactional(rollbackFor = Exception.class)
public JSONObject startMoveWasteFoil(JSONObject param) {
log.info("手持开始搬运废箔 - {}", param);
// row
@@ -78,6 +177,7 @@ public class OtherPdaServiceImpl implements OtherPdaService {
}
@Override
@Deprecated
@Transactional(rollbackFor = Exception.class)
public JSONObject resumeMoveWasteFoil(JSONObject param) {
log.info("继续/结束搬运废箔 - {}", param);
@@ -194,4 +294,37 @@ public class OtherPdaServiceImpl implements OtherPdaService {
result.put("message", "收卷辊入库任务请求成功!");
return result;
}
@Override
public JSONObject callAgvToSamplingVerify(JSONObject param) {
log.info("取样/放样确认 - {}", param);
// 放货1 取货2 flag, startPoint, endPoint
String flag = param.getString("flag");
String startPoint = param.getString("startPoint");
String endPoint = param.getString("endPoint");
JSONArray acs = new JSONArray();
JSONObject acsParam = new JSONObject();
SchBaseTask task;
if ("1".equals(flag)) {
Assert.notBlank(startPoint, "起点不能为空!");
// 获取这个任务
task = taskService.getTaskByPointCodeX(startPoint, null, null, null);
acsParam.put("device_code", startPoint);
acsParam.put("option", "2");
} else {
Assert.notBlank(endPoint, "终点不能为空!");
task = taskService.getTaskByPointCodeX(null, endPoint, null, null);
acsParam.put("device_code", endPoint);
acsParam.put("option", "3");
}
acsParam.put("task_code", task.getTask_code());
acsParam.put("product_area", task.getProduct_area());
acs.add(acsParam);
JSONObject jsonObject = wmsToAcsService.updateTask(acs);
log.info("取样下发ACS执行AGV动作请求参数{},返回结果:{}", acs, jsonObject);
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "取样确认请求成功!");
return result;
}
}

View File

@@ -7,6 +7,7 @@ import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.pdm.bi.dto.PdmBiSlittingproductionplanParam;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -116,6 +117,27 @@ public interface IpdmBiSlittingproductionplanService extends IService<PdmBiSlitt
* @return /
*/
List<PdmBiSlittingproductionplan> getByQzzNos(List<String> qzzNo);
/**
* 获取id对应的分切计划
* @param ids /
* @return /
*/
List<PdmBiSlittingproductionplan> getByIds(Collection<String> ids);
/**
* 获取分切计划
* @param qzzno 气胀轴
* @param status 状态
* @return /
*/
List<PdmBiSlittingproductionplan> getByQzzNoByStatus(String qzzno, String status);
/**
* 根据子卷获取分切
* @param containerName 子卷
* @return /
*/
PdmBiSlittingproductionplan getByContainerName(String containerName);
}

View File

@@ -266,5 +266,27 @@ public class PdmBiSlittingproductionplanServiceImpl extends ServiceImpl<PdmBiSli
return pdmBiSlittingproductionplanMapper.selectList(lam);
}
@Override
public List<PdmBiSlittingproductionplan> getByIds(Collection<String> ids) {
LambdaQueryWrapper<PdmBiSlittingproductionplan> lam = new QueryWrapper<PdmBiSlittingproductionplan>().lambda();
lam.in(PdmBiSlittingproductionplan::getWorkorder_id, ids);
return list(lam);
}
@Override
public List<PdmBiSlittingproductionplan> getByQzzNoByStatus(String qzzNo, String status) {
LambdaQueryWrapper<PdmBiSlittingproductionplan> lam = new QueryWrapper<PdmBiSlittingproductionplan>().lambda();
lam.eq(PdmBiSlittingproductionplan::getQzzno, qzzNo)
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
.eq(PdmBiSlittingproductionplan::getStatus, status);
return pdmBiSlittingproductionplanMapper.selectList(lam);
}
@Override
public PdmBiSlittingproductionplan getByContainerName(String containerName) {
LambdaQueryWrapper<PdmBiSlittingproductionplan> lam = new QueryWrapper<PdmBiSlittingproductionplan>().lambda();
lam.eq(PdmBiSlittingproductionplan::getContainer_name, containerName)
.eq(PdmBiSlittingproductionplan::getIs_delete, IOSEnum.IS_NOTANDYES.code(""));
return pdmBiSlittingproductionplanMapper.selectOne(lam);
}
}

View File

@@ -129,4 +129,11 @@ public interface IBstIvtCutpointivtService extends IService<BstIvtCutpointivt> {
* @return /
*/
BstIvtCutpointivt getSleeveShaftOkNotTaskPoint(String resourceName);
/**
* 获取准备好的点
* @param code /
* @return /
*/
List<BstIvtCutpointivt> getReadyShaftPoint(String code);
}

View File

@@ -25,4 +25,6 @@ public interface BstIvtCutpointivtMapper extends BaseMapper<BstIvtCutpointivt> {
List<BstIvtCutpointivt> getAreaNotTaskPointByStatusNotCheckPickUpCompleted(String type, String pointStatus, String area, String sort);
BstIvtCutpointivt getSleeveShaftOkNotTaskPoint(String resourceName);
List<BstIvtCutpointivt> getReadyShaftPoint(String code);
}

View File

@@ -156,4 +156,14 @@
AND pp.resource_name = #{resourceName}
ORDER BY bic.update_time LIMIT 1
</select>
<select id="getReadyShaftPoint" resultType="org.nl.wms.pdm.ivt.bcut.service.dao.BstIvtCutpointivt">
SELECT
bsp.*
FROM
`bst_ivt_cutpointivt` bsp
LEFT JOIN pdm_bi_slittingproductionplan p ON p.is_delete = '0' AND p.`status` = '03' AND (p.qzzno = bsp.qzz_no1 OR p.qzzno = bsp.qzz_no2)
WHERE bsp.point_type = '3' AND bsp.point_status = '2' AND p.workorder_id IS NOT NULL
AND p.resource_name = #{extCode} AND bsp.is_used = '1' AND IFNULL(p.qzzno, '') <![CDATA[ <> ]]> ''
ORDER BY bsp.update_time
</select>
</mapper>

View File

@@ -149,4 +149,9 @@ public class BstIvtCutpointivtServiceImpl extends ServiceImpl<BstIvtCutpointivtM
public BstIvtCutpointivt getSleeveShaftOkNotTaskPoint(String resourceName) {
return bstIvtCutpointivtMapper.getSleeveShaftOkNotTaskPoint(resourceName);
}
@Override
public List<BstIvtCutpointivt> getReadyShaftPoint(String code) {
return bstIvtCutpointivtMapper.getReadyShaftPoint(code);
}
}

View File

@@ -0,0 +1,53 @@
package org.nl.wms.quartz;
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @Author: lyd
* @Description: 从废箔起点开始
* @Date: 2024/8/27
*/
@Slf4j
@Component
public class AutoSendWasteFoilAGVTask {
public static final String TASK_CODE = "SendWasteFoilAGVTask";
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBasePointService pointService;
public void run() {
log.info("查找废箔起点任务开始执行...");
// 获取下一条的任务
List<SchBaseTask> waitTask = taskService.getTaskByConfigAndStatus(TASK_CODE, TaskStatus.SURE_END.getCode());
if (taskService.checkAllWaiteByWasteFoil()) {
log.info("没有搬运中的废箔,执行创建从废箔起点到废箔终点的任务!");
// 都是等待状态的任务
SchBaseTask task = waitTask.get(0);
// 查找废箔起点
List<SchBasePoint> fbPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-FB",
"2", "2", null, null);
if (CollectionUtil.isEmpty(fbPoints)) {
log.error("找不到废箔点位 - {}", task);
return;
}
SchBasePoint point = fbPoints.get(0);
task.setPoint_code1(point.getPoint_code());
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
TaskUtils.setUpdateByDefault(task);
taskService.updateById(task);
}
}
}

View File

@@ -118,4 +118,10 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
* @return
*/
List<SchBasePoint> getWindRollConformRawNotTaskPoints(String code);
/**
* 获取管芯无锁位置
* @return
*/
List<SchBasePoint> getGxPointNotLock();
}

View File

@@ -44,4 +44,10 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
* @return /
*/
List<SchBasePoint> getWindRollConformRawNotTaskPoints(String code);
/**
* 获取无锁点位
* @return
*/
List<SchBasePoint> getGxPointNotLock();
}

View File

@@ -80,4 +80,13 @@
ORDER BY
p.update_time
</select>
<select id="getGxPointNotLock" resultType="org.nl.wms.sch.point.service.dao.SchBasePoint">
SELECT
p.*
FROM
`sch_base_point` p
WHERE p.region_code = 'A1-GXK' AND p.point_status = '1' AND p.point_type = '3' AND p.is_used = TRUE
AND p.lock_type = '1'
ORDER BY p.update_time
</select>
</mapper>

View File

@@ -242,4 +242,9 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
return pointMapper.getWindRollConformRawNotTaskPoints(code);
}
@Override
public List<SchBasePoint> getGxPointNotLock() {
return pointMapper.getGxPointNotLock();
}
}

View File

@@ -145,4 +145,25 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
* @return /
*/
List<SchBaseTask> getWasteFoilTask(String code);
/**
* 判断是否存在任务
* @param collect 点位集合
* @return /
*/
Boolean checkHaveTaskByPoints(List<String> collect);
/**
* 获取同配置、状态的任务
* @param configCode 配置
* @param status 状态
* @return /
*/
List<SchBaseTask> getTaskByConfigAndStatus(String configCode, String status);
/**
* 判断废箔是否都是等待的任务
* @return /
*/
boolean checkAllWaiteByWasteFoil();
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.task.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
@@ -31,6 +32,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@@ -272,7 +274,9 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
.eq(ObjectUtil.isNotEmpty(p2), SchBaseTask::getPoint_code2, p2)
.eq(ObjectUtil.isNotEmpty(p3), SchBaseTask::getPoint_code3, p3)
.eq(ObjectUtil.isNotEmpty(p4), SchBaseTask::getPoint_code4, p4)
.lt(SchBaseTask::getTask_status, "07");
.gt(SchBaseTask::getTask_status, TaskStatus.SURE_END.getCode())
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, "0");
return getOne(lam, false);
}
@@ -281,4 +285,41 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
return schBaseTaskMapper.getWasteFoilTask(code);
}
@Override
public Boolean checkHaveTaskByPoints(List<String> collect) {
if (CollectionUtil.isEmpty(collect)) {
return true;
}
LambdaQueryWrapper<SchBaseTask> lam = new QueryWrapper<SchBaseTask>().lambda();
lam.eq(SchBaseTask::getIs_delete, "0")
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()).and(la -> la.in(SchBaseTask::getPoint_code1, collect).or()
.in(SchBaseTask::getPoint_code2, collect).or()
.in(SchBaseTask::getPoint_code3, collect).or()
.in(SchBaseTask::getPoint_code4, collect));
List<SchBaseTask> list = list(lam);
return list.size() > 0;
}
@Override
public List<SchBaseTask> getTaskByConfigAndStatus(String configCode, String status) {
LambdaQueryWrapper<SchBaseTask> lam = new QueryWrapper<SchBaseTask>().lambda();
lam.eq(SchBaseTask::getConfig_code, configCode)
.eq(SchBaseTask::getTask_status, status)
.eq(SchBaseTask::getIs_delete, "0")
.orderByAsc(SchBaseTask::getCreate_time);
return list(lam);
}
@Override
public boolean checkAllWaiteByWasteFoil() {
LambdaQueryWrapper<SchBaseTask> lam = new QueryWrapper<SchBaseTask>().lambda();
lam.eq(SchBaseTask::getConfig_code, "SendWasteFoilAGVTask")
.gt(SchBaseTask::getTask_status, TaskStatus.SURE_END.getCode())
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, "0")
.orderByAsc(SchBaseTask::getCreate_time);
List<SchBaseTask> list = list(lam);
return list.size() == 0;
}
}

View File

@@ -112,6 +112,7 @@ public abstract class AbstractTask {
taskDto.setVehicle_code(task.getVehicle_code());
taskDto.setVehicle_code2(task.getVehicle_code2());
taskDto.setProduct_area(task.getProduct_area());
taskDto.setCar_no(task.getCar_no());
// 如果各类方法对返回参数有不同可以通过调用子类实现的deliveryBeforeProcessing方法来完成赋值
// 也可以是统一封装到参数值中。
this.deliveryBeforeProcessing(task, taskDto);

View File

@@ -130,6 +130,11 @@ public class AcsTaskDto {
*/
private String direction;
/**
* 车号
*/
private String car_no;
/**
* 扩展属性
*/

View File

@@ -14,4 +14,11 @@ public interface BakingOperationService {
* @return /
*/
JSONObject acsRequestOutHotTask(JSONObject param);
/**
* ACS请求入烘箱
* @param param /
* @return /
*/
JSONObject acsRequestInHotTask(JSONObject param);
}

View File

@@ -1,11 +1,18 @@
package org.nl.wms.sch.task_manage.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.service.BakingOperationService;
import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask;
import org.nl.wms.sch.task_manage.tasks.hot.OutHotTrussTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -25,6 +32,10 @@ public class BakingOperationServiceImpl implements BakingOperationService {
private ISchBaseTaskService taskService;
@Autowired
private OutHotTrussTask outHotTrussTask;
@Autowired
private IpdmBiRawfoilworkorderService rawfoilworkorderService;
@Autowired
private InHotTrussTask inHotTrussTask;
@Override
public JSONObject acsRequestOutHotTask(JSONObject param) {
log.info("acs请求出烘箱{}", param);
@@ -43,4 +54,48 @@ public class BakingOperationServiceImpl implements BakingOperationService {
result.put("data", new JSONObject());
return result;
}
@Override
public JSONObject acsRequestInHotTask(JSONObject param) {
log.info("acs请求入烘箱{}", param);
// 任务完成将工单对应的状态设置04, 维护重量信息。触发烘箱桁架任务
// param: task_code
String taskCode = param.getString("task_code");
Assert.notBlank(taskCode, "任务编码不能为空!");
SchBaseTask taskObj = taskService.getByCode(taskCode);
JSONObject taskParam = new JSONObject();
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String orderCode = requestObj.getString("order_code");
if (ObjectUtil.isNotEmpty(orderCode)) {
rawfoilworkorderService.update(new LambdaUpdateWrapper<PdmBiRawfoilworkorder>()
.set(PdmBiRawfoilworkorder::getStatus, "04")
.eq(PdmBiRawfoilworkorder::getContainer_name, orderCode));
log.info("工单修改完毕 - 母卷号 - {}", orderCode);
}
// 烘箱暂存位
String hxPointCode = "";
// 获取点位
if (ObjectUtil.isEmpty(taskObj.getPoint_code3())) {
// 取满任务
hxPointCode = taskObj.getPoint_code2();
} else {
// 取满放空任务
hxPointCode = taskObj.getPoint_code4();
}
log.info("开始创建桁架任务入烘箱....");
taskParam.put("order_code", orderCode);
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("device_code", hxPointCode);
taskParam.put("config_code", "InHotTrussTask");
taskParam.put("create_mode", GeneralDefinition.ACS_CREATION);
// 满卷的收卷辊编码放在AGV任务的载具2上
taskParam.put("vehicle_code", taskObj.getVehicle_code2());
inHotTrussTask.apply(taskParam);
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "任务创建成功!");
result.put("data", new JSONObject());
return result;
}
}

View File

@@ -2,15 +2,19 @@ package org.nl.wms.sch.task_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.service.NbjOperationService;
import org.nl.wms.util.TaskUtils;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -32,14 +36,17 @@ import static org.nl.wms.util.PointUtils.clearPoint;
public class NbjOperationServiceImpl implements NbjOperationService {
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject tubeExceptionHandling(JSONObject param) {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.ERROR_GX_IN_OUT.getTag());
log.info("ACS请求满入/空出异常处理 - {}", param);
// type: 1满入2空出、device_code: 异常点位
// type: 1满入2空出、target: 异常点位、barcode条码、task_code: 任务编码
String type = param.getString("type");
String deviceCode = param.getString("device_code");
String deviceCode = param.getString("target");
String vehicleCode = param.getString("barcode");
Assert.notBlank(type, "类型不能为空!");
Assert.notBlank(deviceCode, "点位不能为空!");
SchBasePoint exceptionPoint = pointService.getById(deviceCode);
@@ -48,15 +55,25 @@ public class NbjOperationServiceImpl implements NbjOperationService {
// 满入: 把点位禁用,重新分配点位
exceptionPoint.setIs_used(false);
exceptionPoint.setUpdate_time(DateUtil.now());
allGxPoints = pointService.getPointByConditions("A1", "A1-GXK",
"2", "1", null, true);
// 找管芯库中的空位。
allGxPoints = pointService.getGxPointNotLock();
log.info("满入禁用点位");
pointService.updateById(exceptionPoint);
} else {
// 空出: 根据点位的载具类型查找相同位置
String vehicleType = exceptionPoint.getVehicle_type();
allGxPoints = pointService.getPointByConditions("A1", "A1-GXK",
"2", "2", vehicleType, true);
String taskCode = param.getString("task_code");
SchBaseTask task = taskService.getByCode(taskCode);
if (ObjectUtil.isEmpty(task)) {
throw new BadRequestException("任务[ {" + taskCode + "} ]不存在!");
}
// 空出: 根据点位的载具类型查找相同位置: 应该查找没有任务的点位
allGxPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-GXK",
"3", "2", null, vehicleCode);
if (allGxPoints.size() > 0) {
task.setPoint_code3(allGxPoints.get(0).getPoint_code());
task.setRemark("重新分配货位");
TaskUtils.setUpdateByDefault(task);
taskService.updateById(task);
}
}
if (allGxPoints.size() == 0) {
throw new BadRequestException("重新分配货位失败!");

View File

@@ -16,6 +16,7 @@ import org.nl.wms.sch.task_manage.service.OtherOperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
@@ -34,6 +35,7 @@ public class OtherOperationServiceImpl implements OtherOperationService {
@Autowired
private IWastefoilrecordService wastefoilrecordService;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject acsRequestWasteFoilWeight(JSONObject param) {
log.info("ACS反馈废箔重量: {}", param);
// task_code, point_code, weight
@@ -47,7 +49,7 @@ public class OtherOperationServiceImpl implements OtherOperationService {
JSONObject requestObj = JSONObject.parseObject(requestParam);
int indexTask = requestObj.getInteger("index_task");
requestObj.put("weight", weight);
if (indexTask != 0) {
if (indexTask != 1) {
// 获取上一条任务的重量
String upTaskCode = requestObj.getString("up_task_code");
SchBaseTask upTask = taskService.getByCode(upTaskCode);

View File

@@ -59,6 +59,7 @@ public class SendShaftAGVTask extends AbstractTask {
BstIvtCutpointivt startPoint = bcutpointivtService.getSleeveShaftOkNotTaskPoint(requestObj.getString("resource_name"));
if (ObjectUtil.isEmpty(startPoint)) {
log.warn("没有找到设备为[ {} ]套好轴的气胀轴点位信息!", requestObj.getString("resource_name"));
return;
}
List<String> collect = Stream.of(startPoint.getUp_gx1(), startPoint.getUp_gx2(), startPoint.getDown_gx1(), startPoint.getDown_gx2())
.filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());

View File

@@ -0,0 +1,125 @@
package org.nl.wms.sch.task_manage.tasks.other;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.service.OtherOperationService;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
/**
* @Author: lyd
* @Description: 废箔业务
* @Date: 2024/8/27
*/
@Slf4j
@Component(value = "SendWasteFoilAGVTask")
public class SendWasteFoilAGVTask extends AbstractTask {
private final String THIS_CLASS = SendWasteFoilAGVTask.class.getName();
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private OtherOperationService otherOperationService;
@Autowired
private ISchBasePointService pointService;
@Override
public void create() throws BadRequestException {
}
@Override
public String createTask(JSONObject form) {
String taskStatus = form.getString("task_status");
// 创建任务
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getSnowflake(1,1).nextIdStr());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setConfig_code("SendWasteFoilAGVTask");
task.setPoint_code1(form.getString("point_code1"));
task.setPoint_code2(form.getString("point_code2"));
task.setProduct_area(form.getString("product_area"));
task.setVehicle_code(form.getString("vehicle_code"));
task.setVehicle_type(form.getString("vehicle_type"));
task.setCreate_mode(form.getString("create_mode"));
task.setRemark(form.getString("remark"));
task.setCar_no(form.getString("carNo"));
task.setRequest_param(JSONObject.toJSONString(form));
task.setHandle_class(THIS_CLASS);
task.setTask_status(ObjectUtil.isEmpty(taskStatus)
? TaskStatus.START_AND_POINT.getCode()
: taskStatus);
TaskUtils.setCreateByDefault(task);
taskService.save(task);
return task.getTask_id();
}
@Override
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
// 如果是废箔起点,需要吧点位置空
String startPointCode = taskObj.getPoint_code1();
SchBasePoint startPoint = pointService.getById(startPointCode);
if ("A1-FB".equals(startPoint.getRegion_code())) {
// 清空
PointUtils.clearPoint(startPoint, taskFinishedType);
}
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
// 取消
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
public void updateStatus(JSONObject task, TaskStatus status) {
String taskCode = task.getString("task_code");
// 校验任务
SchBaseTask taskObj = taskService.getByCode(taskCode);
BigDecimal weight = task.getBigDecimal("weight");
if (ObjectUtil.isNotEmpty(weight)) {
// 调用更新重量
otherOperationService.acsRequestWasteFoilWeight(task);
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setCar_no(task.getString("car_no"));
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.sch.task_manage.tasks.other;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
@@ -12,11 +13,13 @@ import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.service.OtherOperationService;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
@@ -28,6 +31,7 @@ import static org.nl.wms.util.TaskUtils.setUpdateByPC;
* @Date: 2024/8/14
*/
@Slf4j
@Deprecated
@Component(value = "WasteFoilAGVTask")
public class WasteFoilAGVTask extends AbstractTask {
private final String THIS_CLASS = WasteFoilAGVTask.class.getName();
@@ -35,6 +39,8 @@ public class WasteFoilAGVTask extends AbstractTask {
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private OtherOperationService otherOperationService;
@Override
public void create() throws BadRequestException {
@@ -102,4 +108,29 @@ public class WasteFoilAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
public void updateStatus(JSONObject task, TaskStatus status) {
String taskCode = task.getString("task_code");
// 校验任务
SchBaseTask taskObj = taskService.getByCode(taskCode);
BigDecimal weight = task.getBigDecimal("weight");
if (ObjectUtil.isNotEmpty(weight)) {
// 调用更新重量
otherOperationService.acsRequestWasteFoilWeight(task);
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setCar_no(task.getString("car_no"));
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
}

View File

@@ -0,0 +1,10 @@
/**
* <h1>所有任务类</h1>
* <p>包括所有的任务业务,找点业务,更新任务业务</p>
* <li>hot: 烘箱相关任务</li>
* <li>nbj: 内包间相关任务</li>
* <li>other: 废箔搬运、检验搬运相关任务</li>
* <li>raw: 生箔相关任务</li>
* <li>slitter: 分切相关任务</li>
*/
package org.nl.wms.sch.task_manage.tasks;

View File

@@ -3,6 +3,7 @@ package org.nl.wms.sch.task_manage.tasks.raw;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
@@ -17,11 +18,15 @@ import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask;
import org.nl.wms.util.TaskUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
@@ -43,12 +48,13 @@ public class RawDownAGVTask extends AbstractTask {
@Autowired
private IpdmBiRawfoilworkorderService rawfoilworkorderService;
@Autowired
private InHotTrussTask inHotTrussTask;
private RedissonClient redissonClient;
@Override
public void create() throws BadRequestException {
}
@SneakyThrows
@Override
public void createCompletion(SchBaseTask task) {
String requestParam = task.getRequest_param();
@@ -59,60 +65,46 @@ public class RawDownAGVTask extends AbstractTask {
// 收卷辊库出口
String startPointCode = requestObj.getString("start_point_code");
// 查找烘箱可用的位置(没货、没锁、没任务、没禁用)
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION, "1", "1");
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
"1", "1");
if (hxPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint hxPoint = hxPoints.get(0);
if ("1".equals(flag)) {
// 创建四点任务:先到生箔位,在从生箔到烘箱对接位
task.setPoint_code1(startPointCode);
task.setPoint_code2(deviceCode);
task.setPoint_code3(deviceCode);
task.setPoint_code4(hxPoint.getPoint_code());
} else {
// 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode);
task.setPoint_code2(hxPoint.getPoint_code());
RLock lock = redissonClient.getLock(hxPoint.getPoint_code());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
if ("1".equals(flag)) {
// 创建四点任务:先去收卷辊出口在到生箔位,在从生箔到烘箱对接位
task.setPoint_code1(startPointCode);
task.setPoint_code2(deviceCode);
task.setPoint_code3(deviceCode);
task.setPoint_code4(hxPoint.getPoint_code());
} else {
// 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode);
task.setPoint_code2(hxPoint.getPoint_code());
}
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
} else {
throw new BadRequestException("系统繁忙,稍后再试!");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 任务完成将工单对应的状态设置04, 维护重量信息。触发烘箱桁架任务
JSONObject taskParam = new JSONObject();
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String orderCode = requestObj.getString("order_code");
if (ObjectUtil.isNotEmpty(orderCode)) {
rawfoilworkorderService.update(new LambdaUpdateWrapper<PdmBiRawfoilworkorder>()
.set(PdmBiRawfoilworkorder::getStatus, "04")
.eq(PdmBiRawfoilworkorder::getContainer_name, orderCode));
log.info("工单修改完毕 - 母卷号 - {}", orderCode);
}
String hxPointCode = "";
// 获取点位
if (ObjectUtil.isEmpty(taskObj.getPoint_code3())) {
// 取满任务
hxPointCode = taskObj.getPoint_code2();
} else {
// 取满放空任务
hxPointCode = taskObj.getPoint_code4();
}
log.info("开始创建桁架任务入烘箱....");
taskParam.put("order_code", orderCode);
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("device_code", hxPointCode);
taskParam.put("config_code", "InHotTrussTask");
// 满卷的收卷辊编码放在AGV任务的载具2上
taskParam.put("vehicle_code", taskObj.getVehicle_code2());
inHotTrussTask.apply(taskParam);
// update: 任务完成创建桁架任务改成等待AGV申请
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
@@ -130,4 +122,35 @@ public class RawDownAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
public void updateStatus(JSONObject task, TaskStatus status) {
String taskCode = task.getString("task_code");
// 校验任务
SchBaseTask taskObj = taskService.getByCode(taskCode);
BigDecimal weight = task.getBigDecimal("weight");
if (ObjectUtil.isNotEmpty(weight)) {
// 更新生箔重量
JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param());
String orderCode = requestObj.getString("order_code");
PdmBiRawfoilworkorder rawOrder = rawfoilworkorderService.getByContainerName(orderCode);
rawOrder.setProductin_qty(weight);
TaskUtils.setRawOrderCreateByDefault(rawOrder);
rawfoilworkorderService.getById(rawOrder);
log.info("ACS请求更新生箔母卷: [{}]重量: [{}]", orderCode, weight);
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setCar_no(task.getString("car_no"));
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan;
@@ -60,6 +61,7 @@ public class SlitterDownAGVTask extends AbstractTask {
}
@SneakyThrows
@Override
public void createCompletion(SchBaseTask task) {
// 分切下料,子卷信息在请求参数中
@@ -93,12 +95,7 @@ public class SlitterDownAGVTask extends AbstractTask {
}
BstIvtCutpointivt endPoint = areaEmptyNotTaskPoint.get(0);
RLock lock = redissonClient.getLock(endPoint.getPoint_code());
boolean tryLock;
try {
tryLock = lock.tryLock(0, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new BadRequestException("获取锁异常");
}
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
task.setPoint_code2(endPoint.getPoint_code());
@@ -160,7 +157,7 @@ public class SlitterDownAGVTask extends AbstractTask {
.in(PdmBiSlittingproductionplan::getQzzno, qzzNo));
}
PdmBiSlittingproductionplan demoPlan = list.get(0);
// 创建送气胀轴任务
// hint: 创建送气胀轴任务
JSONObject taskParam = new JSONObject();
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("config_code", "SendShaftAGVTask");

View File

@@ -0,0 +1,100 @@
package org.nl.wms.sch.task_manage.tasks.slitter;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.TaskUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
/**
* @Author: lyd
* @Description: 分切入烘箱任务
* @Date: 2024/8/26
*/
@Slf4j
@Component(value = "SlitterInHotAGVTask")
public class SlitterInHotAGVTask extends AbstractTask {
private final String THIS_CLASS = SlitterInHotAGVTask.class.getName();
private final static String HX_REGION = "A1-HXZC";
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private RedissonClient redissonClient;
@Override
public void create() throws BadRequestException {
}
@SneakyThrows
@Override
public void createCompletion(SchBaseTask task) {
// 查找烘箱可用的位置(没货、没任务、没禁用)
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
"1", "1");
if (hxPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint hxPoint = hxPoints.get(0);
RLock lock = redissonClient.getLock(hxPoint.getPoint_code());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
// 搬运到烘箱暂存位置
task.setPoint_code2(hxPoint.getPoint_code());
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
} else {
throw new BadRequestException("系统繁忙,稍后再试!");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// update: 任务完成创建桁架任务改成等待AGV申请
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
// 取消
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -70,10 +70,14 @@ public class SlitterSendRollAGVTask extends AbstractTask {
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
checkTaskOptionStatus(taskObj);
JSONObject requestObj = JSONObject.parseObject(taskObj.getRequest_param());
// 起点清除
String startPointCode = taskObj.getPoint_code1();
StIvtCutpointivt startPoint = cutpointivtService.getOneByCode(startPointCode);
if (ObjectUtil.isEmpty(startPoint)) {
// todo: 是否改成取货完成上报
if (ObjectUtil.isEmpty(startPoint)
&& ObjectUtil.isNotEmpty(requestObj.getString("is_flag"))
&& "1".equals(requestObj.getString("is_flag"))) {
// 如果是生箔就不做操作,只有分切上料位才需要清空数据
startPoint.setContainer_name("");
startPoint.setFull_point_status("01");

View File

@@ -101,7 +101,7 @@ public class SlitterUpAGVTask extends AbstractTask {
cutPoint.setFull_point_status("02");
cutPoint.setContainer_name(order.getContainer_name());
cutPoint.setEmpty_vehicle_code("");
cutPoint.setEmpty_point_status("01");
cutPoint.setEmpty_point_status("02");
setCutUpdateByType(cutPoint, taskFinishedType);
cutpointivtService.updateById(cutPoint);
if (ObjectUtil.isNotEmpty(taskObj.getPoint_code3())) {

View File

@@ -47,7 +47,7 @@ public class SlitterUpTrussTask extends AbstractTask {
@Override
public void createCompletion(SchBaseTask task) {
// 桁架任务,到对接位。(对接位不作更新。)
// 桁架任务,到对接位
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String pointCode = requestObj.getString("zc_point");
@@ -94,7 +94,7 @@ public class SlitterUpTrussTask extends AbstractTask {
taskParam.put("vehicle_code", taskObj.getVehicle_code());
taskParam.put("vehicle_code2", order.getWind_roll());
taskParam.put("workorder_id", workorderId);
taskParam.put("config_code", "SlitterSendRollTrussTask");
taskParam.put("config_code", "SlitterUpAGVTask");
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("create_mode", GeneralDefinition.TASK_CREATION);
slitterUpAGVTask.apply(taskParam);