feat:绕过开合盖任务、AGV扫码失败的手动放行

This commit is contained in:
2026-02-11 15:40:25 +08:00
parent 2e62f0f862
commit 87d8abca35
20 changed files with 584 additions and 27 deletions

View File

@@ -31,4 +31,6 @@ public interface WmsToAcsService {
* @return
*/
AcsResponse getPointStatus(JSONArray whereJson);
AcsResponse agvReleased(JSONArray paramArr);
}

View File

@@ -33,4 +33,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
public AcsResponse getPointStatus(JSONArray whereJson) {
return AcsUtil.notifyAcs(EXTConstant.QUERY_DEVICE_INFO_API, whereJson);
}
@Override
public AcsResponse agvReleased(JSONArray paramArr) {
String api = "api/wms/agvReleased";
return AcsUtil.notifyAcs(api, paramArr);
}
}

View File

@@ -50,6 +50,12 @@ public class PdaJBController {
public ResponseEntity<Object> downMaterial(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaJBService.downMaterial(whereJson), HttpStatus.OK);
}
@PostMapping("/downMaterial2")
@Log("解包下料2-不经过开盒盖")
@SaIgnore
public ResponseEntity<Object> downMaterial2(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaJBService.downMaterial2(whereJson), HttpStatus.OK);
}
@PostMapping("/checkStruct")
@Log("检测站点")
@SaIgnore

View File

@@ -59,5 +59,11 @@ public class PdaSchTaskController {
public ResponseEntity<Object> forceConfirm(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaSchTaskService.forceConfirm(whereJson), HttpStatus.OK);
}
@PostMapping("/agvReleased")
@Log("放行")
@SaIgnore
public ResponseEntity<Object> agvReleased(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaSchTaskService.agvReleased(whereJson), HttpStatus.OK);
}
}

View File

@@ -66,4 +66,6 @@ public interface PdaJBService {
PdaResponse vehicleList(JSONObject param);
PdaResponse groupAndBind(JSONObject param);
PdaResponse downMaterial2(JSONObject whereJson);
}

View File

@@ -61,4 +61,6 @@ public interface PdaSchTaskService extends IService<SchBaseTask> {
* @return PdaResponse
*/
PdaResponse forceConfirm(JSONObject whereJson);
PdaResponse agvReleased(JSONObject whereJson);
}

View File

@@ -376,7 +376,100 @@ public class PdaJBServiceImpl implements PdaJBService {
Dict dict = dictService.getDictByCodeAndValue("storagevehicle_type", workorder.getVehicle_type());
Sectattr sect = sectattrService.findByCode(dict.getPara1());
// 组装插入主表明细表的数据
Map<String, Object> insertInvObj = buildInsertData(ltCode, workorder, materialbase, groupPlate, sect);
Map<String, Object> insertInvObj = buildInsertData(ltCode, workorder, materialbase, groupPlate, sect, IOSEnum.BILL_TYPE.code("解包入库"));
String invId = inBillService.insertDtl(insertInvObj);
// 组织数据,调用分配货位
JSONObject divObj = buildDivStructData(sect, invId);
inBillService.divStruct(divObj);
// 一键设置,创建任务
// 组建参数
Map<String, Object> jsonMst = buildTaskData(pointCode, workorderId, invId);
inBillService.divPoint(jsonMst);
// 工单完成
workorder.setWorkorder_status("5");
workorder.setRealproduceend_date(DateUtil.now());
workorderService.updateById(workorder);
} else {
throw new BadRequestException("速度太快啦,稍后再试...");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
return PdaResponse.requestOk();
}
@SneakyThrows
@Override
public PdaResponse downMaterial2(JSONObject whereJson) {
// 用任务组的方式下发任务2条任务
MDC.put(TagNameEnum.TAG_NAME.getTag(), TagNameEnum.PDA_JB_DOWN_MATERIAL.getTag());
log.info("解包直接下料,请求参数:{}", whereJson);
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
// workorder_id、area、point_code、weight、tp_code、lt_code
String area = whereJson.getString("area");
// 设备
String pointCode = whereJson.getString("point_code");
RLock lock = redissonClient.getLock(pointCode);
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
BigDecimal weight = whereJson.getBigDecimal("weight");
String tpCode = whereJson.getString("tp_code");
String ltCode = whereJson.getString("lt_code");
String workorderId = whereJson.getString("workorder_id");
// todo: 存在任务就不继续
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, false)
.eq(SchBaseTask::getConfig_code, "JbDownAgvTask")
.and(ll -> ll.like(SchBaseTask::getPoint_code1, pointCode).or()
.like(SchBaseTask::getPoint_code2, pointCode).or()
.like(SchBaseTask::getPoint_code3, pointCode).or()
.like(SchBaseTask::getPoint_code4, pointCode).or()));
if (list.size() > 0) {
throw new BadRequestException(pointCode + " 该点位已存在任务!");
}
PdmBdWorkorder workorder = workorderService.getById(workorderId);
if (ObjectUtil.isEmpty(workorder)) {
throw new BadRequestException("工单不存在!");
}
// 物料
MdMeMaterialbase materialbase = materialbaseService.getById(workorder.getMaterial_id());
if (ObjectUtil.isEmpty(materialbase)) {
throw new BadRequestException("物料【" + workorder.getMaterial_id() + "】不存在!");
}
JSONObject extData = JSONObject.parseObject(workorder.getExt_data());
// 0、创建组盘
GroupPlate groupPlate = new GroupPlate();
groupPlate.setGroup_id(IdUtil.getStringId());
groupPlate.setStoragevehicle_code(ltCode);
// 料桶类型根据工单,工单是根据点位
groupPlate.setStoragevehicle_type(workorder.getVehicle_type());
groupPlate.setMaterial_id(materialbase.getMaterial_id());
groupPlate.setQty(weight);
groupPlate.setQty_unit_id("11");
groupPlate.setQty_unit_name("kg");
groupPlate.setFrozen_qty(BigDecimal.ZERO);
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
groupPlate.setCreate_id(currentUserId);
groupPlate.setCreate_name(nickName);
groupPlate.setCreate_time(now);
groupPlate.setPcsn(extData.getString("pcsn"));
groupPlate.setSupp_code(extData.getString("supp_code"));
groupPlate.setSupp_name(extData.getString("supp_name"));
groupplateService.save(groupPlate);
Dict dict = dictService.getDictByCodeAndValue("storagevehicle_type", workorder.getVehicle_type());
Sectattr sect = sectattrService.findByCode(dict.getPara1());
// 组装插入主表明细表的数据
Map<String, Object> insertInvObj = buildInsertData(ltCode, workorder, materialbase, groupPlate, sect, IOSEnum.BILL_TYPE.code("解包直接入库"));
String invId = inBillService.insertDtl(insertInvObj);
// 组织数据,调用分配货位
@@ -980,7 +1073,8 @@ public class PdaJBServiceImpl implements PdaJBService {
return divObj;
}
public static Map<String, Object> buildInsertData(String ltCode, PdmBdWorkorder workorder, MdMeMaterialbase materialbase, GroupPlate groupPlate, Sectattr sect) {
public static Map<String, Object> buildInsertData(String ltCode, PdmBdWorkorder workorder
, MdMeMaterialbase materialbase, GroupPlate groupPlate, Sectattr sect, String billType) {
Map<String, Object> insertInvObj = new HashMap();
ArrayList<HashMap> tableData = new ArrayList<>();
HashMap<String, Object> table = new HashMap<>();
@@ -989,7 +1083,7 @@ public class PdaJBServiceImpl implements PdaJBService {
insertInvObj.put("bill_status", "10");
insertInvObj.put("total_qty", workorder.getPlan_weight());
insertInvObj.put("detail_count", 1);
insertInvObj.put("bill_type", "0011");
insertInvObj.put("bill_type", billType);
insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
insertInvObj.put("tableData", tableData);
table.put("group_id", groupPlate.getGroup_id());

View File

@@ -1,7 +1,9 @@
package org.nl.wms.pda_manage.sch_manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -11,11 +13,13 @@ import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.ext_manage.service.WmsToAcsService;
import org.nl.wms.ext_manage.service.util.AcsResponse;
import org.nl.wms.pda_manage.sch_manage.service.PdaSchTaskService;
import org.nl.wms.pda_manage.util.PdaResponse;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper;
@@ -76,6 +80,10 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
*/
@Autowired
private TaskFactory taskFactory;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private WmsToAcsService wmsToAcsService;
@Override
@Transactional
@@ -150,6 +158,32 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
return PdaResponse.requestOk();
}
@Override
public PdaResponse agvReleased(JSONObject whereJson) {
String taskId = whereJson.getString("task_id");
if (ObjectUtil.isEmpty(taskId)) {
throw new BadRequestException("任务id不能为空!");
}
SchBaseTask baseTask = taskService.getById(taskId);
if (ObjectUtil.isEmpty(baseTask)) {
throw new BadRequestException("找不到【" + taskId + "】对应的任务!");
}
// todo: 判断任务是否需要, 任务类型为定义,等需要的适合加上
//下发ACS执行取满放空的AGV动作
JSONArray paramArr = new JSONArray();
JSONObject param = new JSONObject();
param.put("device_code", baseTask.getCar_no());
param.put("task_code", baseTask.getTask_code());
param.put("agvReleased", true);
paramArr.add(param);
AcsResponse acsResponse = wmsToAcsService.agvReleased(paramArr);
if (!(acsResponse.getStatus() == 200)) {
throw new BadRequestException("操作失败:" + acsResponse.getErrArr());
}
return PdaResponse.requestOk();
}
/**
* 校验起点终点载具
* @param whereJson {

View File

@@ -9,6 +9,7 @@
LEFT JOIN md_me_materialbase mm ON mm.material_id = o.material_id
WHERE o.workorder_status = #{workorder_status}
AND o.point_code = #{pointCode}
ORDER BY o.update_time
</select>
<select id="getNoTaskEmptyBarrelStructs" resultType="org.nl.wms.basedata_manage.service.dao.Structattr">

View File

@@ -88,6 +88,8 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
// 点位编码和点位名称为父点位
entity.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setWorkorder_code(CodeUtil.getNewCode("PDM_SHIFTORDER"));
entity.setPlanproducestart_date(DateUtil.now());
entity.setPlanproduceend_date(DateUtil.now());
entity.setCreate_id(currentUserId);
entity.setCreate_name(nickName);
entity.setCreate_time(now);

View File

@@ -27,9 +27,21 @@ public enum StatusEnum {
/**
* 出入库单据类型退货出库
*/
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10", "inStorageTask", "调拨入库", "11", "inStorageTask", "退货入库", "12", "inStorageTask", "拣选回库",
"13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask","来料入库",
"1013", "inStorageTask", "解包退回", "0012", "inStorageTask" , "解包入库", "0011", "inStorageTask", "余料入库", "0014", "inStorageTask", "空桶入库", "0015", "inStorageTask")),
IOBILL_TYPE_IN(ForkMap.of(
"生产入库", "10", "inStorageTask"
, "调拨入库", "11", "inStorageTask"
, "退货入库", "12", "inStorageTask"
, "拣选回库", "13", "inStorageTask"
, "盘点入库", "14", "inStorageTask"
, "托盘入库", "30", "inStorageTask"
, "二楼CTU入库", "80", "inStorageTask"
, "来料入库", "1013", "inStorageTask"
, "解包退回", "0012", "inStorageTask"
, "解包入库", "0011", "inStorageTask"
, "余料入库", "0014", "inStorageTask"
, "空桶入库", "0015", "inStorageTask"
, "解包直接入库", "0016", "inStorageTask"
)),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask",
"拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask",
"退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运",

View File

@@ -10,6 +10,8 @@ import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.pm_manage.service.dao.PdmBdWorkorder;
import org.nl.wms.sch_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
@@ -52,6 +54,8 @@ public class JbDownAgvTask extends AbstractTask {
private ISchBasePointService pointService;
@Resource
private ISchBaseTaskconfigService taskconfigService;
@Resource
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
@Override
public String create(JSONObject param) {
// 改造:多条任务
@@ -82,7 +86,7 @@ public class JbDownAgvTask extends AbstractTask {
}
taskService.saveBatch(batchTask);
return batchTask.get(2).getTask_id();
return batchTask.get(batchTask.size() - 1).getTask_id();
}
@Override
@@ -170,6 +174,10 @@ public class JbDownAgvTask extends AbstractTask {
SchBasePoint jbjPoint = pointService.getById(taskObj.getPoint_code1());
SchBasePoint mhcPoint = pointService.getById(taskObj.getPoint_code2());
SchBasePoint khcPoint = pointService.getById(taskObj.getPoint_code3());
MdPbStoragevehicleinfo storagevehicleinfo = storagevehicleinfoService.getByCode(taskObj.getVehicle_code());
if (ObjectUtil.isEmpty(storagevehicleinfo)) {
throw new BadRequestException(taskObj.getVehicle_code() + "的托盘信息不存在!");
}
// 空缓存点清空
khcPoint.setPoint_status("1");
khcPoint.setVehicle_code(null);
@@ -182,7 +190,7 @@ public class JbDownAgvTask extends AbstractTask {
mhcPoint.setUpdate_time(DateUtil.now());
// 对接位设置空桶
jbjPoint.setPoint_status("2");
jbjPoint.setVehicle_type(taskObj.getVehicle_type());
jbjPoint.setVehicle_type(storagevehicleinfo.getStoragevehicle_type());
jbjPoint.setVehicle_code(taskObj.getVehicle_code());
jbjPoint.setUpdate_time(DateUtil.now());
pointService.updateBatchById(Arrays.asList(jbjPoint, khcPoint, mhcPoint));

View File

@@ -0,0 +1,234 @@
package org.nl.wms.sch_manage.service.util.tasks.jb;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
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.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.sch_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.ISchBaseTaskconfigService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskUtils;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 解包下料(绕过解包机)
* @Author: lyd
* @Date: 2025/7/24
*/
@Slf4j
@Component("JbDownAgvTwoTask")
public class JbDownAgvTwoTask extends AbstractTask {
@Resource
private ISchBaseTaskService taskService;
@Resource
private IInBillService inBillService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Resource
private ISchBasePointService pointService;
@Resource
private ISchBaseTaskconfigService taskconfigService;
@Resource
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
@Override
public String create(JSONObject param) {
// 改造:多条任务
JSONArray tasks = param.getJSONArray("tasks");
List<SchBaseTask> batchTask = new ArrayList<>();
for (int i = 0; i < tasks.size(); i++) {
JSONObject json = tasks.getJSONObject(i);
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATED.getCode());
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setPoint_code3(json.getString("point_code3"));
task.setPoint_code4(json.getString("point_code4"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_code2(json.getString("vehicle_code2"));
task.setGroup_id(json.getString("group_id"));
task.setTask_group_id(json.getString("task_group_id"));
task.setTask_group_seq(json.getBigDecimal("task_group_seq"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
batchTask.add(task);
}
taskService.saveBatch(batchTask);
return batchTask.get(2).getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
SchBaseTaskconfig taskconfig = taskconfigService.getTaskByConfigCode(taskDao.getConfig_code());
JSONObject object = JSONObject.parseObject(taskDao.getRequest_param());
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setStart_device_code2(taskDao.getPoint_code3());
acsTaskDto.setNext_device_code2(taskDao.getPoint_code4());
acsTaskDto.setTask_group_id(taskDao.getTask_group_id());
acsTaskDto.setTask_group_seq(taskDao.getTask_group_seq());
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setAgv_system_type(taskconfig.getAcs_task_type());
acsTaskDto.setTask_type(taskconfig.getTask_type());
acsTaskDto.setTruss_type(object.getString("truss_type"));
acsTaskDto.setInteraction_json(new JSONObject().fluentPut("have_lid", object.getString("have_lid")));
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 取消任务
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark("已取消");
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
//分配表清除任务
ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id,null)
.set(IOStorInvDis::getPoint_code,null)
.set(IOStorInvDis::getIs_issued,0)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成"))
.eq(IOStorInvDis::getTask_id,taskObj.getTask_id())
);
}
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 任务完成
taskObj.setRemark("该任务已完成,等待最后一条任务完成!");
MdPbStoragevehicleinfo storagevehicleinfo = storagevehicleinfoService.getByCode(taskObj.getVehicle_code());
if (ObjectUtil.isEmpty(storagevehicleinfo)) {
throw new BadRequestException(taskObj.getVehicle_code() + "的托盘信息不存在!");
}
if ("1".equals(taskObj.getTask_group_seq().toString())) {
SchBasePoint khcPoint = pointService.getById(taskObj.getPoint_code2());
SchBasePoint jbjPoint = pointService.getById(taskObj.getPoint_code3());
SchBasePoint mhcPoint = pointService.getById(taskObj.getPoint_code4());
// 空缓存点
khcPoint.setPoint_status("2");
khcPoint.setVehicle_code(taskObj.getVehicle_code());
khcPoint.setVehicle_type(storagevehicleinfo.getStoragevehicle_type());
khcPoint.setUpdate_time(DateUtil.now());
// 满缓存点设置值
mhcPoint.setPoint_status("3");
mhcPoint.setVehicle_code(taskObj.getVehicle_code2());
mhcPoint.setVehicle_type(storagevehicleinfo.getStoragevehicle_type());
mhcPoint.setUpdate_time(DateUtil.now());
// 对接位设置空桶
jbjPoint.setPoint_status("1");
jbjPoint.setVehicle_type(null);
jbjPoint.setVehicle_code(null);
jbjPoint.setUpdate_time(DateUtil.now());
pointService.updateBatchById(Arrays.asList(jbjPoint, khcPoint, mhcPoint));
}
if ("2".equals(taskObj.getTask_group_seq().toString())) {
SchBasePoint khcPoint = pointService.getById(taskObj.getPoint_code1());
SchBasePoint jbjPoint = pointService.getById(taskObj.getPoint_code2());
SchBasePoint mhcPoint = pointService.getById(taskObj.getPoint_code3());
// 空缓存点清空
khcPoint.setPoint_status("1");
khcPoint.setVehicle_code(null);
khcPoint.setVehicle_type(null);
khcPoint.setUpdate_time(DateUtil.now());
// 满缓存点设置值
mhcPoint.setPoint_status("1");
mhcPoint.setVehicle_code(null);
mhcPoint.setVehicle_type(null);
mhcPoint.setUpdate_time(DateUtil.now());
// 对接位设置空桶
jbjPoint.setPoint_status("2");
jbjPoint.setVehicle_type(storagevehicleinfo.getStoragevehicle_type());
jbjPoint.setVehicle_code(taskObj.getVehicle_code());
jbjPoint.setUpdate_time(DateUtil.now());
pointService.updateBatchById(Arrays.asList(jbjPoint, khcPoint, mhcPoint));
// 出库完成
inBillService.taskFinish(taskObj);
}
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void backMes(String task_code) {
}
}

View File

@@ -28,7 +28,7 @@ public enum IOSEnum {
BILL_STATUS(MapOf.of("生成", "10", "分配中", "20", "分配完", "30", "完成", "99")),
// 入库业务类型
BILL_TYPE(MapOf.of("生产入库", "0001", "手工入库", "0009", "手工出库", "1009", "解包出库", "1012")),
BILL_TYPE(MapOf.of("生产入库", "0001", "手工入库", "0009", "解包入库", "0011", "解包直接入库", "0016", "手工出库", "1009", "解包出库", "1012")),
//入库分配明细状态
INBILL_DIS_STATUS(MapOf.of("未生成", "00", "生成", "01", "执行中", "02", "完成", "99")),

View File

@@ -36,6 +36,7 @@ import org.nl.wms.sch_manage.service.util.tasks.BackInTask;
import org.nl.wms.sch_manage.service.util.tasks.StInTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTwoTask;
import org.nl.wms.sch_manage.service.util.tasks.zw.InBillTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
@@ -102,6 +103,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
@Resource
private BackInTask backInTask;
@Resource
private JbDownAgvTwoTask jbDownAgvTwoTask;
@Override
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page) {
@@ -759,6 +762,74 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownAgvTask.create(requestTaskParam);
} else if (StatusEnum.IOBILL_TYPE_IN.code("解包直接入库").equals(invObj.getBill_type())) {
// 创建任务
String structCode = map.get("struct_code");
if (ObjectUtil.isEmpty(structCode)) {
throw new BadRequestException("仓位未分配!");
}
// 获取组盘信息
GroupPlate groupPlate = mdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, ioStorInvDis.getStoragevehicle_code())
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
Structattr inStruct = iStructattrService.findByCode(structCode);
// 解包入库 (创建3条任务并且为一组)
SchBasePoint rkPoint = pointService.getById(point_code);
// 父点位
SchBasePoint parentPoint = pointService.getById(rkPoint.getParent_point_code());
// 2、创建任务4条任务、优先级需要获取所有的任务中的最小值并且-1默认8
// 获取工单对应的区域的出入点
SchBasePoint intoPoint = pointService.getNotTaskByDeviceAndType(parentPoint.getPoint_code(), "2");
SchBasePoint emptyPoint = pointService.getNotTaskByDeviceAndType(parentPoint.getPoint_code(), "5");
SchBasePoint fullPoint = pointService.getNotTaskByDeviceAndType(parentPoint.getPoint_code(), "6");
// 创建任务1
String taskGroupId = IdUtil.getStringId();
JSONObject task1 = new JSONObject();
task1.put("task_type", "JbDownAgvTask");
task1.put("group_id", groupPlate.getGroup_id());
task1.put("workorder_id", whereJson.get("workorder_id"));
task1.put("task_group_id", taskGroupId);
task1.put("task_group_seq", 1);
task1.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task1.put("point_code1", structCode);
task1.put("point_code2", emptyPoint.getPoint_code());
task1.put("point_code3", intoPoint.getPoint_code());
task1.put("point_code4", fullPoint.getPoint_code());
task1.put("truss_type", "3");
task1.put("have_lid", "1");
task1.put("vehicle_type", inStruct.getStoragevehicle_type());
task1.put("seq", 1);
// 空托盘
task1.put("vehicle_code", inStruct.getStoragevehicle_code());
// 入库的满托盘
task1.put("vehicle_code2", map.get("storagevehicle_code"));
// 创建任务2
JSONObject task2 = new JSONObject();
task2.put("task_type", "JbDownAgvTask");
task2.put("group_id", groupPlate.getGroup_id());
task2.put("task_group_id", taskGroupId);
task2.put("task_group_seq", 2);
task2.put("workorder_id", whereJson.get("workorder_id"));
task2.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task2.put("point_code1", emptyPoint.getPoint_code());
task2.put("point_code2", intoPoint.getPoint_code());
task2.put("point_code3", fullPoint.getPoint_code());
task2.put("point_code4", structCode);
task2.put("truss_type", "3");
task2.put("have_lid", "0");
task2.put("seq", 2);
// 空托盘
task2.put("vehicle_code", inStruct.getStoragevehicle_code());
task2.put("vehicle_type", inStruct.getStoragevehicle_type());
// 入库的满托盘
task2.put("vehicle_code2", map.get("storagevehicle_code"));
List<JSONObject> jsonObjects = Arrays.asList(task1, task2);
JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownAgvTwoTask.create(requestTaskParam);
} else if (StatusEnum.IOBILL_TYPE_IN.code("解包退回").equals(invObj.getBill_type())) {
// 解包退料入库
String structCode = map.get("struct_code");