add:手持任务操作
This commit is contained in:
@@ -0,0 +1,25 @@
|
|||||||
|
package org.nl.system.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Liuyx
|
||||||
|
* @date 2025年06月03日
|
||||||
|
* @desc 系统参数常量
|
||||||
|
*/
|
||||||
|
public class SysParamConstant {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否连接ACS
|
||||||
|
*/
|
||||||
|
public final static String IS_CONNECT_ACS = "is_connect_acs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ACS系统IP
|
||||||
|
*/
|
||||||
|
public final static String ACS_URL = "acs_url";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ERP系统IP
|
||||||
|
*/
|
||||||
|
public final static String ERP_URL = "erp_url";
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.nl.wms.ext.enuums;
|
package org.nl.wms.ext.enums;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Liuyx
|
* @author Liuyx
|
||||||
@@ -16,4 +16,9 @@ public class EXTConstant {
|
|||||||
* 物料同步ERP接口地址
|
* 物料同步ERP接口地址
|
||||||
*/
|
*/
|
||||||
public final static String MATERIAL_SYNC_ERP_API = "CamstarApi/MomRollBakeInBound";
|
public final static String MATERIAL_SYNC_ERP_API = "CamstarApi/MomRollBakeInBound";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ACS下发任务接口地址
|
||||||
|
*/
|
||||||
|
public final static String SEND_TASK_ACS_API = "api/wms/task";
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package org.nl.wms.ext.service;
|
||||||
|
|
||||||
|
|
||||||
|
import org.nl.wms.ext.service.util.AcsResponse;
|
||||||
|
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* WMS调用ACS 服务类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author Liuxy
|
||||||
|
* @since 2025-06-09
|
||||||
|
*/
|
||||||
|
public interface WmsToAcsService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下发任务
|
||||||
|
* @param list 任务集合
|
||||||
|
* @return AcsResponse
|
||||||
|
*/
|
||||||
|
AcsResponse renotifyAcs(List<AcsTaskDto> list);
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package org.nl.wms.ext.service.impl;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.wms.ext.enums.EXTConstant;
|
||||||
|
import org.nl.wms.ext.service.WmsToAcsService;
|
||||||
|
import org.nl.wms.ext.service.util.AcsResponse;
|
||||||
|
import org.nl.wms.ext.util.AcsUtil;
|
||||||
|
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* WMS调用ACS 实现类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author Liuxy
|
||||||
|
* @since 2025-06-09
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class WmsToAcsServiceImpl implements WmsToAcsService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AcsResponse renotifyAcs(List<AcsTaskDto> list) {
|
||||||
|
return AcsUtil.notifyAcs(EXTConstant.SEND_TASK_ACS_API, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,8 +5,9 @@ import com.alibaba.fastjson.JSONObject;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nl.common.exception.BadRequestException;
|
import org.nl.common.exception.BadRequestException;
|
||||||
import org.nl.config.SpringContextHolder;
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.nl.system.enums.SysParamConstant;
|
||||||
import org.nl.system.service.param.impl.SysParamServiceImpl;
|
import org.nl.system.service.param.impl.SysParamServiceImpl;
|
||||||
import org.nl.wms.ext.enuums.EXTConstant;
|
import org.nl.wms.ext.enums.EXTConstant;
|
||||||
import org.nl.wms.ext.service.WmsToErpService;
|
import org.nl.wms.ext.service.WmsToErpService;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -28,7 +29,7 @@ public class WmsToErpServiceImpl implements WmsToErpService {
|
|||||||
log.info("uploadErp回传接口输入参数为:-------------------" + whereJson.toString());
|
log.info("uploadErp回传接口输入参数为:-------------------" + whereJson.toString());
|
||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
|
|
||||||
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("ERP_URL").getValue();
|
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ERP_URL).getValue();
|
||||||
url = url + EXTConstant.UPLOAD_ERP_API;
|
url = url + EXTConstant.UPLOAD_ERP_API;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -56,7 +57,7 @@ public class WmsToErpServiceImpl implements WmsToErpService {
|
|||||||
log.info("materialSync物料同步接口输入参数为:-------------------" + whereJson.toString());
|
log.info("materialSync物料同步接口输入参数为:-------------------" + whereJson.toString());
|
||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
|
|
||||||
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("ERP_URL").getValue();
|
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ERP_URL).getValue();
|
||||||
url = url + EXTConstant.MATERIAL_SYNC_ERP_API;
|
url = url + EXTConstant.MATERIAL_SYNC_ERP_API;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -16,14 +16,35 @@ public class AcsResponse extends BaseResponse {
|
|||||||
private JSONArray errArr = new JSONArray();
|
private JSONArray errArr = new JSONArray();
|
||||||
private JSONArray data = new JSONArray();
|
private JSONArray data = new JSONArray();
|
||||||
|
|
||||||
public static AcsResponse requestRefuse(String message) {
|
/**
|
||||||
|
* 请求失败
|
||||||
|
* @param message 错误信息
|
||||||
|
* @return AcsResponse
|
||||||
|
*/
|
||||||
|
public static AcsResponse requestError(String message) {
|
||||||
AcsResponse result = new AcsResponse();
|
AcsResponse result = new AcsResponse();
|
||||||
result.setCode(HttpStatus.HTTP_BAD_REQUEST);
|
result.setCode(HttpStatus.HTTP_BAD_REQUEST);
|
||||||
result.setMessage(message);
|
result.setMessage(message);
|
||||||
result.setResponseDate(DateUtil.now());
|
result.setResponseDate(DateUtil.now());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 请求成功带信息
|
||||||
|
* @param message 信息
|
||||||
|
* @return AcsResponse
|
||||||
|
*/
|
||||||
|
public static AcsResponse requestOkMessage(String message) {
|
||||||
|
AcsResponse result = new AcsResponse();
|
||||||
|
result.setCode(HttpStatus.HTTP_OK);
|
||||||
|
result.setMessage(message);
|
||||||
|
result.setResponseDate(DateUtil.now());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求成功
|
||||||
|
* @return AcsResponse
|
||||||
|
*/
|
||||||
public static AcsResponse requestOk() {
|
public static AcsResponse requestOk() {
|
||||||
AcsResponse result = new AcsResponse();
|
AcsResponse result = new AcsResponse();
|
||||||
result.setCode(HttpStatus.HTTP_OK);
|
result.setCode(HttpStatus.HTTP_OK);
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package org.nl.wms.ext.util;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.nl.system.enums.SysParamConstant;
|
||||||
|
import org.nl.system.service.param.dao.Param;
|
||||||
|
import org.nl.system.service.param.impl.SysParamServiceImpl;
|
||||||
|
import org.nl.wms.ext.service.util.AcsResponse;
|
||||||
|
import org.nl.wms.warehouse_management.enums.IOSConstant;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* ACS工具类
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author Liuxy
|
||||||
|
* @since 2025-06-09
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class AcsUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下发任务
|
||||||
|
* @param api acs地址
|
||||||
|
* @param param 下发参数
|
||||||
|
* @return AcsResponse
|
||||||
|
*/
|
||||||
|
public static <T> AcsResponse notifyAcs(String api, T param) {
|
||||||
|
log.info("下发ACS任务的输入参数为:-------------------" + param.toString());
|
||||||
|
// 返回参数
|
||||||
|
AcsResponse resultAcs;
|
||||||
|
// 系统参数类
|
||||||
|
SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class);
|
||||||
|
//判断是否连接ACS系统
|
||||||
|
Param isConnectAcs = sysParamService.findByCode(SysParamConstant.IS_CONNECT_ACS);
|
||||||
|
if (ObjectUtil.isEmpty(isConnectAcs)) {
|
||||||
|
return AcsResponse.requestError("系统参数表中:" + SysParamConstant.IS_CONNECT_ACS + "不存在");
|
||||||
|
}
|
||||||
|
if (isConnectAcs.getValue().equals(IOSConstant.IS_DELETE_NO)) {
|
||||||
|
return AcsResponse.requestOkMessage("下发成功,未连接ACS系统!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//ACS地址
|
||||||
|
Param acsUrlParam = sysParamService.findByCode(SysParamConstant.ACS_URL);
|
||||||
|
if (ObjectUtil.isEmpty(acsUrlParam)) {
|
||||||
|
return AcsResponse.requestError("系统参数表中:" + SysParamConstant.ACS_URL + "不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
String url = acsUrlParam.getValue() + api;
|
||||||
|
try {
|
||||||
|
String resultMsg = HttpRequest.post(url)
|
||||||
|
.body(String.valueOf(param))
|
||||||
|
.execute().body();
|
||||||
|
// 格式转换
|
||||||
|
JSONObject result = JSONObject.parseObject(resultMsg);
|
||||||
|
resultAcs = JSONObject.toJavaObject(result, AcsResponse.class);
|
||||||
|
|
||||||
|
log.info("下发ACS任务的输出参数为:-------------------" + resultMsg);
|
||||||
|
} catch (Exception e) {
|
||||||
|
//网络不通
|
||||||
|
String msg = e.getMessage();
|
||||||
|
log.error("连接失败:{}", msg);
|
||||||
|
return AcsResponse.requestError("网络不通,操作失败!");
|
||||||
|
}
|
||||||
|
return resultAcs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -39,4 +39,25 @@ public class PdaSchTaskController {
|
|||||||
return new ResponseEntity<>(pdaSchTaskService.pointTask(whereJson), HttpStatus.OK);
|
return new ResponseEntity<>(pdaSchTaskService.pointTask(whereJson), HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/queryTask")
|
||||||
|
@Log("查询未完成的任务")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> queryTask(@RequestBody JSONObject whereJson) {
|
||||||
|
return new ResponseEntity<>(pdaSchTaskService.queryTask(whereJson), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/againTask")
|
||||||
|
@Log("重新下发")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> againTask(@RequestBody JSONObject whereJson) {
|
||||||
|
return new ResponseEntity<>(pdaSchTaskService.againTask(whereJson), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/forceConfirm")
|
||||||
|
@Log("强制确认")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> forceConfirm(@RequestBody JSONObject whereJson) {
|
||||||
|
return new ResponseEntity<>(pdaSchTaskService.forceConfirm(whereJson), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,4 +26,39 @@ public interface PdaSchTaskService extends IService<SchBaseTask> {
|
|||||||
* @return PdaResponse
|
* @return PdaResponse
|
||||||
*/
|
*/
|
||||||
PdaResponse pointTask(JSONObject whereJson);
|
PdaResponse pointTask(JSONObject whereJson);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询未完成的任务
|
||||||
|
* @param whereJson {
|
||||||
|
* task_code: 任务号、载具号、点位号
|
||||||
|
* }
|
||||||
|
* @return PdaResponse
|
||||||
|
*/
|
||||||
|
PdaResponse queryTask(JSONObject whereJson);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新下发
|
||||||
|
* @param whereJson {
|
||||||
|
* task_code:任务号
|
||||||
|
* vehicle_code:载具号
|
||||||
|
* point_code1:起点
|
||||||
|
* point_code2:终点
|
||||||
|
* task_status:状态
|
||||||
|
* }
|
||||||
|
* @return PdaResponse
|
||||||
|
*/
|
||||||
|
PdaResponse againTask(JSONObject whereJson);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 强制确认
|
||||||
|
* @param whereJson {
|
||||||
|
* task_code:任务号
|
||||||
|
* vehicle_code:载具号
|
||||||
|
* point_code1:起点
|
||||||
|
* point_code2:终点
|
||||||
|
* task_status:状态
|
||||||
|
* }
|
||||||
|
* @return PdaResponse
|
||||||
|
*/
|
||||||
|
PdaResponse forceConfirm(JSONObject whereJson);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package org.nl.wms.pda.sch_manage.service.impl;
|
package org.nl.wms.pda.sch_manage.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.http.HttpStatus;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.nl.common.exception.BadRequestException;
|
||||||
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
|
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
|
||||||
import org.nl.wms.basedata_manage.service.IStructattrService;
|
import org.nl.wms.basedata_manage.service.IStructattrService;
|
||||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||||
|
import org.nl.wms.ext.service.util.AcsResponse;
|
||||||
import org.nl.wms.pda.sch_manage.service.PdaSchTaskService;
|
import org.nl.wms.pda.sch_manage.service.PdaSchTaskService;
|
||||||
import org.nl.wms.pda.util.PdaResponse;
|
import org.nl.wms.pda.util.PdaResponse;
|
||||||
import org.nl.wms.sch_manage.enums.TaskEnum;
|
import org.nl.wms.sch_manage.enums.TaskEnum;
|
||||||
@@ -13,6 +17,8 @@ import org.nl.wms.sch_manage.service.ISchBasePointService;
|
|||||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
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.SchBaseTask;
|
||||||
import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper;
|
import org.nl.wms.sch_manage.service.dao.mapper.SchBaseTaskMapper;
|
||||||
|
import org.nl.wms.sch_manage.service.util.AbstractTask;
|
||||||
|
import org.nl.wms.sch_manage.service.util.TaskFactory;
|
||||||
import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask;
|
import org.nl.wms.sch_manage.service.util.tasks.PdaPointTask;
|
||||||
import org.nl.wms.warehouse_management.enums.IOSConstant;
|
import org.nl.wms.warehouse_management.enums.IOSConstant;
|
||||||
import org.nl.wms.warehouse_management.enums.IOSEnum;
|
import org.nl.wms.warehouse_management.enums.IOSEnum;
|
||||||
@@ -55,6 +61,12 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PdaPointTask pdaPointTask;
|
private PdaPointTask pdaPointTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务工厂服务
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private TaskFactory taskFactory;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public PdaResponse pointTask(JSONObject whereJson) {
|
public PdaResponse pointTask(JSONObject whereJson) {
|
||||||
@@ -71,6 +83,42 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
|
|||||||
return PdaResponse.requestOk();
|
return PdaResponse.requestOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PdaResponse queryTask(JSONObject whereJson) {
|
||||||
|
return PdaResponse.requestParamOk(this.baseMapper.queryPdaTask(whereJson));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public PdaResponse againTask(JSONObject whereJson) {
|
||||||
|
// 查询当前任务
|
||||||
|
SchBaseTask taskDao = this.getOne(
|
||||||
|
new QueryWrapper<SchBaseTask>().lambda()
|
||||||
|
.eq(SchBaseTask::getTask_code, whereJson.getString("task_code"))
|
||||||
|
);
|
||||||
|
// 根据任务配置编码获取所属任务类抽象类
|
||||||
|
AbstractTask task = taskFactory.getTask(taskDao.getConfig_code());
|
||||||
|
AcsResponse acsResponse = task.sendTaskOne(taskDao.getTask_id());
|
||||||
|
if (acsResponse.getCode() != HttpStatus.HTTP_OK) {
|
||||||
|
throw new BadRequestException(acsResponse.getMessage());
|
||||||
|
}
|
||||||
|
return PdaResponse.requestOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public PdaResponse forceConfirm(JSONObject whereJson) {
|
||||||
|
// 查询当前任务
|
||||||
|
SchBaseTask taskDao = this.getOne(
|
||||||
|
new QueryWrapper<SchBaseTask>().lambda()
|
||||||
|
.eq(SchBaseTask::getTask_code, whereJson.getString("task_code"))
|
||||||
|
);
|
||||||
|
// 根据任务配置编码获取所属任务类抽象类
|
||||||
|
AbstractTask task = taskFactory.getTask(taskDao.getConfig_code());
|
||||||
|
task.forceFinish(taskDao.getTask_code());
|
||||||
|
return PdaResponse.requestOk();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验起点终点载具
|
* 校验起点终点载具
|
||||||
* @param whereJson {
|
* @param whereJson {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package org.nl.wms.sch_manage.service.dao.mapper;
|
package org.nl.wms.sch_manage.service.dao.mapper;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||||
import org.nl.wms.sch_manage.service.dto.SchBaseTaskQuery;
|
import org.nl.wms.sch_manage.service.dto.SchBaseTaskQuery;
|
||||||
|
|
||||||
@@ -21,4 +23,12 @@ public interface SchBaseTaskMapper extends BaseMapper<SchBaseTask> {
|
|||||||
int getCarryingByDevice(String deviceCode, String taskConfig);
|
int getCarryingByDevice(String deviceCode, String taskConfig);
|
||||||
|
|
||||||
IPage<SchBaseTask> selectPageLeftJoin(IPage<SchBaseTask> pages, SchBaseTaskQuery whereJson, List<String> collect);
|
IPage<SchBaseTask> selectPageLeftJoin(IPage<SchBaseTask> pages, SchBaseTaskQuery whereJson, List<String> collect);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手持查询任务
|
||||||
|
* @param whereJson {
|
||||||
|
* task_code: 任务号、载具号、点位号
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
List<JSONObject> queryPdaTask(@Param("param") JSONObject whereJson);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,4 +73,33 @@
|
|||||||
</where>
|
</where>
|
||||||
ORDER BY t.create_time DESC
|
ORDER BY t.create_time DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="queryPdaTask" resultType="com.alibaba.fastjson.JSONObject">
|
||||||
|
SELECT
|
||||||
|
task_id,
|
||||||
|
task_code,
|
||||||
|
vehicle_code,
|
||||||
|
point_code1,
|
||||||
|
point_code2,
|
||||||
|
(CASE task_status
|
||||||
|
WHEN '0' THEN '生成'
|
||||||
|
WHEN '1' THEN '申请'
|
||||||
|
WHEN '2' THEN '创建完成'
|
||||||
|
WHEN '3' THEN '下发'
|
||||||
|
WHEN '4' THEN '执行中'
|
||||||
|
END) AS task_status
|
||||||
|
FROM
|
||||||
|
sch_base_task
|
||||||
|
<where>
|
||||||
|
is_delete = '0'
|
||||||
|
AND task_status IN ('0','1','2','3','4')
|
||||||
|
<if test="param.task_code != null and param.task_code != ''">
|
||||||
|
AND
|
||||||
|
(task_code = #{param.task_code} or
|
||||||
|
vehicle_code = #{param.task_code} or
|
||||||
|
point_code1 = #{param.task_code} or
|
||||||
|
point_code2 = #{param.task_code})
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -1,44 +1,47 @@
|
|||||||
package org.nl.wms.sch_manage.service.util;
|
package org.nl.wms.sch_manage.service.util;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.http.HttpStatus;
|
import cn.hutool.http.HttpStatus;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nl.common.exception.BadRequestException;
|
import org.nl.wms.ext.service.WmsToAcsService;
|
||||||
import org.nl.wms.ext.service.util.AcsResponse;
|
import org.nl.wms.ext.service.util.AcsResponse;
|
||||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||||
import org.nl.wms.sch_manage.service.ISchBaseTaskconfigService;
|
|
||||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||||
import org.nl.wms.sch_manage.service.dao.SchBaseTaskconfig;
|
import org.nl.wms.warehouse_management.enums.IOSConstant;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Liuxy
|
* @author Liuxy
|
||||||
* @version 1.0
|
|
||||||
* @date 2025年05月19日
|
* @date 2025年05月19日
|
||||||
* @desc 任务抽象父类,申请任务的相关率先判断以及生成,接着到子类执行任务的创建,最后统一通过定时任务去下发到ACS
|
* @desc 任务抽象父类,申请任务的相关率先判断以及生成,接着到子类执行任务的创建,最后统一通过定时任务去下发到ACS
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public abstract class AbstractTask {
|
public abstract class AbstractTask {
|
||||||
@Autowired
|
|
||||||
|
/**
|
||||||
|
* 任务服务
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
private ISchBaseTaskService taskService;
|
private ISchBaseTaskService taskService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wms调用acs接口服务
|
||||||
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISchBaseTaskconfigService taskConfigService;
|
private WmsToAcsService wmsToAcsService;
|
||||||
/* @Autowired
|
|
||||||
private ISchBasePointService pointService;
|
|
||||||
@Autowired
|
|
||||||
private WmsToAcsService wmsToAcsService;*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 任务创建
|
* 任务创建
|
||||||
@@ -48,55 +51,59 @@ public abstract class AbstractTask {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 下发acs前参数整理
|
* 下发acs前参数整理
|
||||||
* @param taskId
|
*
|
||||||
*/
|
*/
|
||||||
public abstract AcsTaskDto sendAcsParam(String taskId);
|
public abstract AcsTaskDto sendAcsParam(String taskId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return WCS的任务集合
|
* 定时任务
|
||||||
* @discription 重新下发给wcs任务
|
|
||||||
* @author ldjun
|
|
||||||
* @created 2020年6月12日 下午5:52:28
|
|
||||||
*/
|
*/
|
||||||
protected AcsResponse renotifyAcs(SchBaseTask task) {
|
public void schedule() {
|
||||||
Assert.notNull(task);
|
this.autoTask();
|
||||||
List<SchBaseTask> taskList = new ArrayList<>();
|
|
||||||
taskList.add(task);
|
|
||||||
return this.renotifyAcs(taskList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return WCS的任务集合
|
* 查询所有任务并整理好参数
|
||||||
* @discription 重新下发给wcs任务
|
*/
|
||||||
* @author ldjun
|
public void autoTask() {
|
||||||
* @created 2020年6月12日 下午5:52:28
|
// 查询未执行下发的任务
|
||||||
|
List<SchBaseTask> taskList = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
||||||
|
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||||
|
.eq(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode()));
|
||||||
|
if (ObjectUtil.isEmpty(taskList)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 整理下发acs参数
|
||||||
|
List<AcsTaskDto> taskDtoList = new ArrayList<>();
|
||||||
|
for (SchBaseTask taskDao : taskList) {
|
||||||
|
AcsTaskDto acsTaskDto = this.sendAcsParam(taskDao.getTask_id());
|
||||||
|
taskDtoList.add(acsTaskDto);
|
||||||
|
}
|
||||||
|
// 下发
|
||||||
|
this.renotifyAcs(taskDtoList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下发当前任务
|
||||||
|
* @param task_id 任务标识
|
||||||
|
*/
|
||||||
|
public AcsResponse sendTaskOne(String task_id) {
|
||||||
|
List<AcsTaskDto> taskDtoList = new ArrayList<>();
|
||||||
|
taskDtoList.add(this.sendAcsParam(task_id));
|
||||||
|
return this.renotifyAcs(taskDtoList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下发任务
|
||||||
|
* @param taskDtoList 任务集合
|
||||||
|
* @return AcsResponse
|
||||||
*/
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
protected AcsResponse renotifyAcs(List<SchBaseTask> taskList) {
|
protected AcsResponse renotifyAcs(List<AcsTaskDto> taskDtoList) {
|
||||||
AcsResponse resultForAcs = AcsResponse.requestOk();
|
AcsResponse resultForAcs = AcsResponse.requestOk();
|
||||||
//1、获取任务
|
|
||||||
//2、根据任务配置补全任务
|
|
||||||
//3、下发
|
|
||||||
List<AcsTaskDto> list = new ArrayList<>();
|
|
||||||
for (SchBaseTask task : taskList) {
|
|
||||||
AcsTaskDto taskDto = new AcsTaskDto();
|
|
||||||
String responseParam = task.getResponse_param();
|
|
||||||
if (ObjectUtil.isNotEmpty(responseParam)) {
|
|
||||||
JSONObject jsonObject = JSONObject.parseObject(responseParam);
|
|
||||||
taskDto.setDirection(jsonObject.getString("direction"));
|
|
||||||
taskDto.setPut_device_code(jsonObject.getString("fmj_device"));
|
|
||||||
}
|
|
||||||
taskDto.setExt_task_uuid(task.getTask_id());
|
|
||||||
taskDto.setTask_code(task.getTask_code());
|
|
||||||
taskDto.setRoute_plan_code("normal");
|
|
||||||
taskDto.setVehicle_code(task.getVehicle_code());
|
|
||||||
taskDto.setVehicle_code2(task.getVehicle_code2());
|
|
||||||
this.setTask(task.getConfig_code(), taskDto);
|
|
||||||
list.add(taskDto);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
// 创建下发对象
|
// 创建下发对象
|
||||||
// TODO resultForAcs = wmsToAcsService.renotifyAcs(list);
|
resultForAcs = wmsToAcsService.renotifyAcs(taskDtoList);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("任务下发异常: {}", e.getMessage());
|
log.error("任务下发异常: {}", e.getMessage());
|
||||||
resultForAcs.setResponseDate(DateUtil.now());
|
resultForAcs.setResponseDate(DateUtil.now());
|
||||||
@@ -105,7 +112,16 @@ public abstract class AbstractTask {
|
|||||||
}
|
}
|
||||||
// 如果下发完毕,就修改状态
|
// 如果下发完毕,就修改状态
|
||||||
if (resultForAcs.getCode() == HttpStatus.HTTP_OK) {
|
if (resultForAcs.getCode() == HttpStatus.HTTP_OK) {
|
||||||
// 解析
|
// 查询所有任务
|
||||||
|
List<SchBaseTask> taskList = taskService.list(
|
||||||
|
new QueryWrapper<SchBaseTask>().lambda()
|
||||||
|
.in(SchBaseTask::getTask_code, taskDtoList.stream()
|
||||||
|
.map(AcsTaskDto::getTask_code)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// 解析并备注
|
||||||
JSONArray errArr = resultForAcs.getErrArr();
|
JSONArray errArr = resultForAcs.getErrArr();
|
||||||
for (SchBaseTask schBaseTask : taskList) {
|
for (SchBaseTask schBaseTask : taskList) {
|
||||||
schBaseTask.setTask_status(TaskStatus.ISSUED.getCode());
|
schBaseTask.setTask_status(TaskStatus.ISSUED.getCode());
|
||||||
@@ -126,87 +142,31 @@ public abstract class AbstractTask {
|
|||||||
return resultForAcs;
|
return resultForAcs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private AcsTaskDto setTask(String configCode, AcsTaskDto taskDto) {
|
|
||||||
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
|
|
||||||
.eq(SchBaseTaskconfig::getConfig_code, configCode));
|
|
||||||
taskDto.setPriority(taskConfig.getPriority());
|
|
||||||
taskDto.setTask_type(taskConfig.getAcs_task_type());
|
|
||||||
taskDto.setRoute_plan_code(taskConfig.getRoute_plan_code());
|
|
||||||
return taskDto;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 定时任务
|
|
||||||
*/
|
|
||||||
public void schedule() {
|
|
||||||
this.autoCreate();
|
|
||||||
// 下发
|
|
||||||
this.getAllFinishTask();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getAllFinishTask() {
|
|
||||||
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
|
||||||
.eq(SchBaseTask::getTask_status, TaskStatus.CREATED.getCode()));
|
|
||||||
if (ObjectUtil.isEmpty(list)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 下发
|
|
||||||
this.renotifyAcs(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateTaskStatus(String taskCode, TaskStatus status) {
|
|
||||||
this.updateStatus(taskCode, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自动生成任务
|
|
||||||
*/
|
|
||||||
protected void autoCreate() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 以下改为public会出现自动注入类出现问题
|
* 以下改为public会出现自动注入类出现问题
|
||||||
*
|
*
|
||||||
* @param task_code
|
* @param task_code r任务号
|
||||||
* @param status
|
* @param status 状态码
|
||||||
*/
|
*/
|
||||||
protected abstract void updateStatus(String task_code, TaskStatus status);
|
protected abstract void updateStatus(String task_code, TaskStatus status);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 首先组盘在下发任务
|
|
||||||
*
|
|
||||||
* @param param 具体参数
|
|
||||||
*/
|
|
||||||
public String setGroupPlate(JSONObject param) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 强制结束完成任务
|
* 强制结束完成任务
|
||||||
*
|
* @param task_code 任务号
|
||||||
* @param task_code
|
|
||||||
*/
|
*/
|
||||||
public abstract void forceFinish(String task_code);
|
public abstract void forceFinish(String task_code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取消任务,货物搬回原点
|
* 取消任务,货物搬回原点
|
||||||
*
|
* @param task_code 任务号
|
||||||
* @param task_code
|
|
||||||
*/
|
*/
|
||||||
public abstract void cancel(String task_code);
|
public abstract void cancel(String task_code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 申请任务
|
* 回传mes
|
||||||
*
|
* @param task_code 任务号
|
||||||
* @param param
|
|
||||||
* @throws BadRequestException
|
|
||||||
*/
|
*/
|
||||||
public void apply(JSONObject param) throws BadRequestException {
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void backMes(String task_code);
|
public abstract void backMes(String task_code);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package org.nl.wms.sch_manage.service.util;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.reflections.Reflections;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 任务自动下发
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author Liuxy
|
||||||
|
* @since 2025-06-09
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@Order(value = 1)
|
||||||
|
public class AutoSendTask {
|
||||||
|
private static Set<Class<? extends AbstractTask>> subTypes = null;
|
||||||
|
// 类加载时候执行扫描
|
||||||
|
static {
|
||||||
|
Reflections reflections = new Reflections("org.nl.wms.sch_manage.service.util.tasks");
|
||||||
|
subTypes = reflections.getSubTypesOf(AbstractTask.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public void run() {
|
||||||
|
log.debug("定时任务AutoCreateTask开始执行:");
|
||||||
|
this.doExecute();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要按照任务配置类型并行执行
|
||||||
|
*/
|
||||||
|
private void doExecute() {
|
||||||
|
subTypes.forEach(clz -> {
|
||||||
|
// 调用AbstractAcsTask类的每个子类的schedule()方法
|
||||||
|
try {
|
||||||
|
Object obj = SpringContextHolder.getBean(clz);
|
||||||
|
Method m = obj.getClass().getMethod("schedule");
|
||||||
|
m.invoke(obj);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
log.info("定时器执行失败:{}", e.getTargetException().getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
log.info("定时器执行失败:{}", e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
||||||
<property name="LOG_HOME" value="${logPath}"/>
|
<property name="LOG_HOME" value="${logPath}"/>
|
||||||
<!-- 按照每天生成日志文件 -->
|
<!-- 按照每天生成日志文件 -->
|
||||||
<appender name="FILE_ERPTOWMS" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="FILE_SENDTASK" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
<!--日志文件输出的文件名-->
|
<!--日志文件输出的文件名-->
|
||||||
<FileNamePattern>${LOG_HOME}/ErpToWms/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
<FileNamePattern>${LOG_HOME}/SendAcsTask/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||||
<!--日志文件保留天数-->
|
<!--日志文件保留天数-->
|
||||||
<maxHistory>15</maxHistory>
|
<maxHistory>15</maxHistory>
|
||||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||||
@@ -23,6 +23,6 @@
|
|||||||
</appender>
|
</appender>
|
||||||
<!-- 打印sql -->
|
<!-- 打印sql -->
|
||||||
<logger name="org.nl.wms.ext.service.impl.ErpToWmsServiceImpl" level="info" additivity="false">
|
<logger name="org.nl.wms.ext.service.impl.ErpToWmsServiceImpl" level="info" additivity="false">
|
||||||
<appender-ref ref="FILE_ERPTOWMS"/>
|
<appender-ref ref="FILE_SENDTASK"/>
|
||||||
</logger>
|
</logger>
|
||||||
</included>
|
</included>
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<included>
|
||||||
|
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
|
||||||
|
<property name="LOG_HOME" value="${logPath}"/>
|
||||||
|
<!-- 按照每天生成日志文件 -->
|
||||||
|
<appender name="FILE_ERPTOWMS" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<!--日志文件输出的文件名-->
|
||||||
|
<FileNamePattern>${LOG_HOME}/ErpToWms/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
|
||||||
|
<!--日志文件保留天数-->
|
||||||
|
<maxHistory>15</maxHistory>
|
||||||
|
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||||
|
<maxFileSize>200MB</maxFileSize>
|
||||||
|
<!--所有日志最多占多大容量-->
|
||||||
|
<totalSizeCap>2GB</totalSizeCap>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||||
|
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||||
|
<charset>${log.charset}</charset>
|
||||||
|
</encoder>
|
||||||
|
|
||||||
|
</appender>
|
||||||
|
<!-- 打印sql -->
|
||||||
|
<logger name="org.nl.wms.ext.util.AcsUtil" level="info" additivity="false">
|
||||||
|
<appender-ref ref="FILE_ERPTOWMS"/>
|
||||||
|
</logger>
|
||||||
|
</included>
|
||||||
Reference in New Issue
Block a user