fix: 供给线、油漆线上料与mes对接

This commit is contained in:
2023-07-05 16:37:08 +08:00
parent a3191d28a0
commit b71d83c8ff
11 changed files with 108 additions and 47 deletions

View File

@@ -221,6 +221,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("vehicle_type", vehicle_type);
param.put("vehicle_code", vehicle_code);
param.put("task_code", whereJson.getString("task_code"));
param.put("workorder_code", whereJson.getString("workorder_code"));
GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class);
String task_id = taskBean.createTask(param); // 创建任务

View File

@@ -3,6 +3,7 @@ package org.nl.wms.ext.mes.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -38,6 +39,7 @@ public class MesToWmsServiceImpl implements MesToWmsService {
WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder");
WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device");
WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase");
WQLObject workOrderCacheTab = WQLObject.getWQLObject("PDM_BI_WorkOrderCache");
if (ObjectUtil.isEmpty(param)) {
throw new BadRequestException("工单不能为空");
}
@@ -67,7 +69,7 @@ public class MesToWmsServiceImpl implements MesToWmsService {
orderWS.put("realproduceend_date", DateUtil.now());
workOrderTab.update(orderWS);
}
if (ObjectUtil.isNotEmpty(orderKX)) {
if (ObjectUtil.isNotEmpty(orderKX)) { // 存在,就关闭
orderKX.put("order_status", "5");
orderKX.put("update_time", DateUtil.now());
orderKX.put("realproduceend_date", DateUtil.now());
@@ -95,8 +97,19 @@ public class MesToWmsServiceImpl implements MesToWmsService {
param.put("device_id", "1654663328972279808");
param.put("device_code", deviceCodeKS);
workOrderTab.insert(param);
} else {
// 有的话就暂存起来
param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr());
param.put("device_id", "1607915553220071424");
param.put("device_code", deviceCodeWX);
param.put("update_time", DateUtil.now());
workOrderCacheTab.insert(param);
param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr());
param.put("device_id", "1654663328972279808");
param.put("device_code", deviceCodeKS);
workOrderCacheTab.insert(param);
}
} else {
} else { // 不是油漆线直接存入
param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr());
param.put("device_id", deviceCode.getString("device_id"));
param.put("device_code", deviceCode.getString("device_code"));

View File

@@ -38,7 +38,7 @@ public class WmsToMesServiceImpl implements WmsToMesService {
public void taskFeedback(JSONObject param, String finterfaceid) {
JSONObject feedback = MesUtil.taskFeedback(param, finterfaceid);
if (!feedback.getString("code").equals("200")) {
//????
taskFeedback(param, finterfaceid);
}
}

View File

@@ -383,29 +383,30 @@ public class WorkorderServiceImpl implements WorkordeService {
@Override
@Transactional(rollbackFor = Exception.class)
public void finish(JSONObject param) {
WQLObject workorderTab = WQLObject.getWQLObject("pdm_bd_workorder");
WQLObject workOrderCacheTab = WQLObject.getWQLObject("PDM_BI_WorkOrderCache");
Long currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
JSONObject row = param.getJSONObject("row");
String workorder_id = row.getString("workorder_id");
WQLObject wo = WQLObject.getWQLObject("PDM_BD_WORKORDER");
JSONObject produceorderMap = new JSONObject();
produceorderMap.put("workorder_id",workorder_id);
produceorderMap.put("order_status","5");
produceorderMap.put("update_optid", currentUserId);
produceorderMap.put("device_id", null);
produceorderMap.put("update_optname", nickName);
produceorderMap.put("update_time", now);
produceorderMap.put("realproduceend_date", now);
wo.update(produceorderMap);
//wms向acs发送请求 工单强制完成
// TODO
JSONArray array = new JSONArray();
JSONObject map = new JSONObject();
map.put("ext_order_id",workorder_id);
map.put("type","3");
array.add(map);
wmsToAcsService.orderStatusUpdate(array);
String deviceCode = row.getString("device_code");
row.put("realproduceend_date", now);
row.put("update_optid", currentUserId);
row.put("update_optname", nickName);
row.put("update_time", now);
row.put("order_status", "5");
workorderTab.update(row);
if (deviceCode.equals("YQX01WX") || deviceCode.equals("YQX01KS")) {
JSONObject jsonObject = workOrderCacheTab.query("device_code = '" + deviceCode + "'", "update_time").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonObject)) {
// 找不到就推出
return;
}
// 油漆线特殊处理: 工单完成并把这个设备的工单换成暂存表的工单
workorderTab.insert(jsonObject);
// 加入后工单要去掉
workOrderCacheTab.delete(jsonObject);
}
}
@Override

View File

@@ -30,8 +30,10 @@ import java.util.Map;
public class MesUtil {
public static JSONObject taskFeedback(JSONObject param, String finterfaceid) {
MDC.put("log_file_type", "WMS任务完成反馈给MES");
String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址
// String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址
String endpointUrl = "http://192.168.4.111:8080/mes/services/HtWebService"; // 替换为实际的 WebService 地址
JSONObject result = new JSONObject();
JSONObject resObj = new JSONObject();
Map<String, String> stringMap = new HashMap<>();
try {
// 创建 HttpClient
@@ -73,14 +75,19 @@ public class MesUtil {
stringMap = parseXml2Map(String.valueOf(responseContent), new HashMap<>());
log.info("Response Code: " + statusCode);
log.info("Response Body: " + stringMap);
if (statusCode == 200) {
String s = stringMap.get("Body.postResponse.return");
resObj = JSON.parseObject(s);
if (resObj.getString("ErrorCode").equals("0")) {
result.put("code", 200);
result.put("message", "操作成功!");
} else {
result.put("code", resObj.getString("ErrorCode"));
result.put("message", resObj.getString("ErrorMessage"));
}
} catch (Exception e) {
log.error(e.getMessage());
result.put("code", 400);
result.put("message", stringMap.get("ErrorMessage"));
result.put("message", resObj.get("ErrorMessage"));
}
MDC.remove("log_file_type");
return result;

View File

@@ -41,9 +41,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask {
private final String THIS_CLASS = DPJCallVehicleTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
/*
* 下发给ACS时需要特殊处理
*/
/** 下发给ACS时需要特殊处理*/
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
@@ -150,7 +148,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask {
.addParamMap(query)
.process()
.getResultJSONArray(0);
PointUpdateUtil.updatePoint(array);
// PointUpdateUtil.updatePoint(array);
// 选择一个空位
JSONObject endPoint = WQL.getWO("DPJ_AUTOTASK")
@@ -210,7 +208,12 @@ public class DPJCallVehicleTask extends AbstractAcsTask {
.addParamMap(MapOf.of("flag", "4", "block_num", emptyPoint.getString("block_num"),
"row_num", emptyPoint.getString("row_num"))).process()
.uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("叠盘架呼叫空托判断等待点异常!");
if (ObjectUtil.isEmpty(waitPoint)) {
taskObj.put("remark", "叠盘架呼叫空托判断等待点异常");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
throw new BadRequestException("叠盘架呼叫空托判断等待点异常!");
}
// 2.2、判断等待点
if (!waitPoint.getString("waitcol").equals(emptyPoint.getString("col_num"))) {
// 获取等待点
@@ -221,7 +224,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask {
"AND is_delete = '0' " +
"AND lock_type = '1'").uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoints)) {
taskObj.put("remark", "等待点已被占用");
taskObj.put("remark", "等待点[" + waitPoints.getString("point_code") + "]已被占用");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;

View File

@@ -78,6 +78,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
if (StrUtil.equals(status, "2")) {
//完成后
// 通知mes
feedback.put("fscanserialid001", taskObj.getString("task_code"));
feedback.put("flocationid979number", taskObj.getString("point_code1"));
feedback.put("flpn979", material_point.getString("vehicle_code"));
feedback.put("fstoragequantity979", material_point.getString("ivt_qty"));
wmsToMesService.taskFeedback(feedback, "WM_INV_MOVE_P011_AGV02");
// 物料点位解锁 并设置空位
material_point.put("lock_type", "1");
material_point.put("point_status", "1");
@@ -94,13 +100,6 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
if (ObjectUtil.isEmpty(material_point)) return;
// 通知mes
feedback.put("fscanserialid001", taskObj.getString("task_code"));
feedback.put("flocationid979number", taskObj.getString("point_code1"));
feedback.put("flpn979", taskObj.getString("vehicle_code"));
feedback.put("fstoragequantity979", taskObj.getString("material_qty"));
wmsToMesService.taskFeedback(feedback, "WM_INV_MOVE_P011_AGV02");
//区域出入表【st_ivt_regionIO】
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
JSONObject regionIoObj = new JSONObject();
@@ -129,7 +128,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
@Override
public void findStartPoint() {
MDC.put("log_file_type", "YqxCallMaterial");
MDC.put("log_file_type", "油漆线叫料");
// 到养生A区找起点根据物料、载具类型去查找均在工单中
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
@@ -194,10 +193,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
log.info("等待点搬运物料");
taskObj.put("point_code1", materialPoint.getString("point_code"));
taskObj.put("material_qty", materialPoint.getString("ivt_qty"));
taskObj.put("vehicle_code", materialPoint.getString("vehicle_code"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "2");
taskObj.put("remark", "等待点搬运物料");
taskObj.put("update_time", DateUtil.now());
log.info("任务信息:{}", taskObj);
taskTab.update(taskObj);
} else {
log.info("养生A区无所需物料");
@@ -336,10 +337,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
if (ObjectUtil.isEmpty(materialPoint)) {
throw new BadRequestException("养生A区暂无所需物料!"); // 此时车会停止
}
log.info("追加任务物料点:{}", materialPoint);
String pointCode = materialPoint.getString("point_code");
// 修改任务
hcTask.put("point_code1", pointCode);
hcTask.put("material_qty", materialPoint.getString("ivt_qty"));
hcTask.put("vehicle_code", materialPoint.getString("vehicle_code"));
hcTask.put("remark", "养生A区" + pointCode);
taskTab.update(hcTask);
// 锁住点位

View File

@@ -17,6 +17,7 @@ import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.sch.tasks.RegionTypeEnum;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -123,6 +124,8 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
@Override
@Transactional(rollbackFor = Exception.class)
public String createTask(JSONObject form) {
MDC.put("log_file_type", "油漆线呼叫空载具");
log.info("请求参数: {}", form);
/*
* 1.先生成确定起点的任务
* 2.通过findNextPoint()找终点
@@ -135,16 +138,16 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
String point_code1 = form.getString("point_code1");
String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code");
JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
String vehicleType = workOrderObj.getString("vehicle_type");
log.info("目前工单请求的载具类型: {}", vehicleType);
if (ObjectUtil.isEmpty(vehicleType)) throw new BadRequestException("载具类型不能为空");
JSONObject jsonObject = pointTab.query("region_code = 'YQQY01' and point_type = '2' and can_vehicle_type = '" + vehicleType + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jsonObject)) throw new BadRequestException("找不到油漆线托盘下料起点");
String startPointCode = jsonObject.getString("point_code");
log.info("找到起点的位置:{}", startPointCode);
//任务表【SCH_BASE_Task】
//判断当前点是否有未完成的任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" +
@@ -167,6 +170,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
.build();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
log.info("任务创建成功->id: {}", dto.getTask_id());
// this.findNextPoint();
this.immediateNotifyAcs();
return String.valueOf(dto.getTask_id());
@@ -253,10 +257,12 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
String end_code = "";
String vehicle_type = param.getString("vehicle_type");
log.info("载具类型:{}", vehicle_type);
// 1.找到对应类型的叠盘架
JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonDpjEnd)) {
log.info("找到对应类型的叠盘架: {}", jsonDpjEnd.getString("point_code"));
// 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量
double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty"));
@@ -268,6 +274,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
if (ObjectUtil.isNotEmpty(jsonZcwEnd)) {
end_code = jsonZcwEnd.getString("point_code");
log.info("找到叠盘架缓存位:{}", end_code);
} else {
// 为空就去养生A区的等待位
// JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0);
@@ -286,6 +293,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
if (is_point) {
end_code = endPointCode;
}
log.info("找到养生A区: {}", end_code);
}
}
} else {
@@ -293,6 +301,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonZcwEnd)) {
end_code = jsonZcwEnd.getString("point_code");
log.info("叠盘架没有空位去找叠盘暂存位:{}", end_code);
} else {
// 为空就去养生A区的等待位
// JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0);
@@ -312,8 +321,10 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
if (is_point) {
end_code = endPointCode;
}
log.info("去养生A区{}", end_code);
}
}
log.info("找到终点:{}", end_code);
return end_code;
}
@@ -323,6 +334,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
* @return
*/
public String goToYSAQ(String vehicle_type) {
log.info("载具类型:{}", vehicle_type);
String endPointCode = null;
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表
// 先找看看有没有放过托盘的
@@ -331,6 +343,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
" AND point_status = '2' AND is_used = '1' AND is_delete = '0'","block_num, row_num, in_empty_seq")
.uniqueResult(0);
if (ObjectUtil.isNotEmpty(emptyObj)) {
log.info("找到之前放过空载具的位置:{}", emptyObj);
// 如果存在则往下继续放
Integer block_num = emptyObj.getInteger("block_num");
Integer col_num = emptyObj.getInteger("col_num"); // 列
@@ -352,6 +365,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask {
"and point_status = '1'", "block_num, row_num, in_empty_seq desc").uniqueResult(0);
endPointCode = endPointObj.getString("point_code");
}
log.info("找到的终点:{}", endPointCode);
return endPointCode;
}

View File

@@ -328,14 +328,17 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
//点位基础表【SCH_BASE_Point】
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device");
//任务表【SCH_BASE_Task】
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
String point_code1 = whereJson.getString("point_code1");
String device = null;
// mes点位不同要重新寻找
JSONObject djwPoint = pointTab.query("mes_device_code = '" + point_code1 + "' AND is_used = '1'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(djwPoint)) {
point_code1 = djwPoint.getString("point_code");
device = djwPoint.getString("device_code");
}
String vehicle_code = whereJson.getString("vehicle_code");
String qty = whereJson.getString("qty");
@@ -343,17 +346,30 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) {
task_code = whereJson.getString("task_code");
}
JSONObject workOrderObj = new JSONObject();
String workorderCode = whereJson.getString("workorder_code");
// 如果是acs自己玩就没有带工单编号
if (ObjectUtil.isEmpty(workorderCode)) {
String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code");
workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
} else {
workOrderObj = workOrderTab.query("workorder_code = '" + workorderCode + "'").uniqueResult(0);
}
if (ObjectUtil.isEmpty(workOrderObj)) {
throw new BadRequestException("该设备当前未生产或者已删除");
}
if (ObjectUtil.isNotEmpty(device) && !workOrderObj.getString("device_code").equals(device)) {
JSONObject jsonObject = deviceTab.query("device_code = '" + device + "'").uniqueResult(0);
// 工单不符合,工单切换设备
workOrderObj.put("device_code", jsonObject.getString("device_code"));
workOrderObj.put("device_id", jsonObject.getString("device_id"));
workOrderTab.update(workOrderObj);
}
//判断当前点是否有未完成的任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务");
String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code");
JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(task_code)

View File

@@ -128,6 +128,8 @@ public class HtSendMaterialTask extends AbstractAcsTask {
@Override
@Transactional(rollbackFor = Exception.class)
public String createTask(JSONObject form) {
MDC.put("log_file_type", "一楼货梯口送料");
log.info("传来的数据:{}", form);
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject vehicleInfoTab = WQLObject.getWQLObject("md_pb_vehicle");
String startPointCode = form.getString("point_code1");
@@ -159,6 +161,7 @@ public class HtSendMaterialTask extends AbstractAcsTask {
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
this.immediateNotifyAcs();
MDC.remove("log_file_type");
return String.valueOf(dto.getTask_id());
}