|
|
@ -488,11 +488,14 @@ public class HaiAnAutoIssueServiceImpl implements HaiAnAutoIssueService { |
|
|
Date now = new Date(); |
|
|
Date now = new Date(); |
|
|
String errorMsg = truncate(failMessage, ERROR_MSG_MAX_LENGTH); |
|
|
String errorMsg = truncate(failMessage, ERROR_MSG_MAX_LENGTH); |
|
|
markTaskDone(task.getId(), HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL, errorMsg, now); |
|
|
markTaskDone(task.getId(), HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL, errorMsg, now); |
|
|
// 覆盖托盘remark,与calling共用haian_pallet.remark;失败必须留下可现场看见的原因 - rqrq |
|
|
|
|
|
|
|
|
// 占用备注仍写短原因,现场看托盘调用备注;失败回滚则立库去异常位也不会发出。- rqrq |
|
|
haiAnPdaAutoWarehouseMapper.updatePalletRemark( |
|
|
haiAnPdaAutoWarehouseMapper.updatePalletRemark( |
|
|
task.getSite(), task.getPalletId(), |
|
|
task.getSite(), task.getPalletId(), |
|
|
truncate(HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL + ":" + nvl(errorMsg), PALLET_REMARK_MAX_LENGTH), |
|
|
truncate(HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL + ":" + nvl(errorMsg), PALLET_REMARK_MAX_LENGTH), |
|
|
HaiAnOperatorStaticData.SYS_WMS); |
|
|
HaiAnOperatorStaticData.SYS_WMS); |
|
|
|
|
|
// 错误原因另写 error_message,可保留比备注更长的移库失败说明。0 行回滚本轮收口。- rqrq |
|
|
|
|
|
writeAutoIssuePalletError(task.getSite(), task.getPalletId(), |
|
|
|
|
|
HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL, errorMsg); |
|
|
markRfidDetailFinished(task.getTransportDetailId(), now, |
|
|
markRfidDetailFinished(task.getTransportDetailId(), now, |
|
|
HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL, errorMsg); |
|
|
HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL, errorMsg); |
|
|
notifyOutboundRfidAction(task.getSite(), task.getPalletId(), |
|
|
notifyOutboundRfidAction(task.getSite(), task.getPalletId(), |
|
|
@ -630,11 +633,13 @@ public class HaiAnAutoIssueServiceImpl implements HaiAnAutoIssueService { |
|
|
: HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL; |
|
|
: HaiAnAutoIssueStaticData.ERROR_TRANSFER_FAIL; |
|
|
// 按完整任务结果收尾并写托盘可见原因;任一阶段失败均通知type=2,失败摘要包含各阶段标签。- rqrq |
|
|
// 按完整任务结果收尾并写托盘可见原因;任一阶段失败均通知type=2,失败摘要包含各阶段标签。- rqrq |
|
|
markTaskDone(task.getId(), errorCode, errorMsg, now); |
|
|
markTaskDone(task.getId(), errorCode, errorMsg, now); |
|
|
// 将失败摘要写入本工厂托盘,失败回滚主任务收尾;已经提交的发料事实和留盘标记保留。- rqrq |
|
|
|
|
|
|
|
|
// 短原因继续写占用备注,给正在看调用备注的页面用。- rqrq |
|
|
haiAnPdaAutoWarehouseMapper.updatePalletRemark( |
|
|
haiAnPdaAutoWarehouseMapper.updatePalletRemark( |
|
|
task.getSite(), task.getPalletId(), |
|
|
task.getSite(), task.getPalletId(), |
|
|
truncate(errorCode + ":" + nvl(errorMsg), PALLET_REMARK_MAX_LENGTH), |
|
|
truncate(errorCode + ":" + nvl(errorMsg), PALLET_REMARK_MAX_LENGTH), |
|
|
HaiAnOperatorStaticData.SYS_WMS); |
|
|
HaiAnOperatorStaticData.SYS_WMS); |
|
|
|
|
|
// 标签级失败明细写入 error_message。写入失败回滚收尾,已独立提交的发料状态不重发。- rqrq |
|
|
|
|
|
writeAutoIssuePalletError(task.getSite(), task.getPalletId(), errorCode, errorMsg); |
|
|
// 完成本任务对应RFID明细并保留错误,避免重复消费回调;失败回滚收尾。- rqrq |
|
|
// 完成本任务对应RFID明细并保留错误,避免重复消费回调;失败回滚收尾。- rqrq |
|
|
markRfidDetailFinished(task.getTransportDetailId(), now, errorCode, errorMsg); |
|
|
markRfidDetailFinished(task.getTransportDetailId(), now, errorCode, errorMsg); |
|
|
// 本任务任一标签未全部成功时通知立库异常位;调用失败由原有事务恢复流程接管。- rqrq |
|
|
// 本任务任一标签未全部成功时通知立库异常位;调用失败由原有事务恢复流程接管。- rqrq |
|
|
@ -1158,6 +1163,40 @@ public class HaiAnAutoIssueServiceImpl implements HaiAnAutoIssueService { |
|
|
return value.trim(); |
|
|
return value.trim(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 自动发料失败只覆盖 error_message,不改调用标记和位置。内容是失败码加标签说明,按 VARCHAR(500) 字节截断。- rqrq |
|
|
|
|
|
*/ |
|
|
|
|
|
private void writeAutoIssuePalletError(String site, String palletId, String errorCode, String errorMsg) { |
|
|
|
|
|
String errorMessage = limitVarchar500(nvl(errorCode) + ":" + nvl(errorMsg)); |
|
|
|
|
|
// 入参 site+palletId 定位本盘。0 行说明托盘已删,抛错让本轮收口回滚,避免只通知立库却没有错误原因。- rqrq |
|
|
|
|
|
int rows = haiAnPdaAutoWarehouseMapper.updateHaiAnPalletErrorMessage( |
|
|
|
|
|
site, palletId, errorMessage, HaiAnOperatorStaticData.SYS_WMS); |
|
|
|
|
|
if (rows <= 0) { |
|
|
|
|
|
throw new RuntimeException("自动发料写入托盘错误原因失败,未命中托盘:" + palletId); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* haian_pallet.error_message 是 VARCHAR(500)。中文按 2 字节计,截断后不补省略号。- rqrq |
|
|
|
|
|
*/ |
|
|
|
|
|
private String limitVarchar500(String text) { |
|
|
|
|
|
if (!StringUtils.hasText(text)) { |
|
|
|
|
|
return ""; |
|
|
|
|
|
} |
|
|
|
|
|
int usedBytes = 0; |
|
|
|
|
|
int end = 0; |
|
|
|
|
|
while (end < text.length()) { |
|
|
|
|
|
char current = text.charAt(end); |
|
|
|
|
|
int charBytes = current <= 0x7F ? 1 : 2; |
|
|
|
|
|
if (usedBytes + charBytes > 500) { |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
usedBytes += charBytes; |
|
|
|
|
|
end++; |
|
|
|
|
|
} |
|
|
|
|
|
return text.substring(0, end); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @author rqrq |
|
|
* @author rqrq |
|
|
* @Description 按 nvarchar 的 UTF-16 容量截取错误摘要:null保留,首尾空白移除,纯空白返回空串;边界不拆代理对,避免超长或破损文本阻断收尾。 - rqrq |
|
|
* @Description 按 nvarchar 的 UTF-16 容量截取错误摘要:null保留,首尾空白移除,纯空白返回空串;边界不拆代理对,避免超长或破损文本阻断收尾。 - rqrq |
|
|
|