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
|
||||
@@ -16,4 +16,9 @@ public class EXTConstant {
|
||||
* 物料同步ERP接口地址
|
||||
*/
|
||||
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 org.nl.common.exception.BadRequestException;
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.nl.system.enums.SysParamConstant;
|
||||
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.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -28,7 +29,7 @@ public class WmsToErpServiceImpl implements WmsToErpService {
|
||||
log.info("uploadErp回传接口输入参数为:-------------------" + whereJson.toString());
|
||||
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;
|
||||
|
||||
try {
|
||||
@@ -56,7 +57,7 @@ public class WmsToErpServiceImpl implements WmsToErpService {
|
||||
log.info("materialSync物料同步接口输入参数为:-------------------" + whereJson.toString());
|
||||
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;
|
||||
|
||||
try {
|
||||
|
||||
@@ -16,14 +16,35 @@ public class AcsResponse extends BaseResponse {
|
||||
private JSONArray errArr = 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();
|
||||
result.setCode(HttpStatus.HTTP_BAD_REQUEST);
|
||||
result.setMessage(message);
|
||||
result.setResponseDate(DateUtil.now());
|
||||
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() {
|
||||
AcsResponse result = new AcsResponse();
|
||||
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);
|
||||
}
|
||||
|
||||
@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
|
||||
*/
|
||||
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;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
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.IStructattrService;
|
||||
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.util.PdaResponse;
|
||||
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.SchBaseTask;
|
||||
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.warehouse_management.enums.IOSConstant;
|
||||
import org.nl.wms.warehouse_management.enums.IOSEnum;
|
||||
@@ -55,6 +61,12 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
|
||||
@Autowired
|
||||
private PdaPointTask pdaPointTask;
|
||||
|
||||
/**
|
||||
* 任务工厂服务
|
||||
*/
|
||||
@Autowired
|
||||
private TaskFactory taskFactory;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public PdaResponse pointTask(JSONObject whereJson) {
|
||||
@@ -71,6 +83,42 @@ public class PdaSchTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
|
||||
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 {
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
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.metadata.IPage;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
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);
|
||||
|
||||
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>
|
||||
ORDER BY t.create_time DESC
|
||||
</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>
|
||||
|
||||
@@ -1,44 +1,47 @@
|
||||
package org.nl.wms.sch_manage.service.util;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.http.HttpStatus;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.SneakyThrows;
|
||||
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.sch_manage.enums.TaskStatus;
|
||||
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.SchBaseTaskconfig;
|
||||
import org.nl.wms.warehouse_management.enums.IOSConstant;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Liuxy
|
||||
* @version 1.0
|
||||
* @date 2025年05月19日
|
||||
* @desc 任务抽象父类,申请任务的相关率先判断以及生成,接着到子类执行任务的创建,最后统一通过定时任务去下发到ACS
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public abstract class AbstractTask {
|
||||
@Autowired
|
||||
|
||||
/**
|
||||
* 任务服务
|
||||
*/
|
||||
@Autowired
|
||||
private ISchBaseTaskService taskService;
|
||||
|
||||
/**
|
||||
* wms调用acs接口服务
|
||||
*/
|
||||
@Autowired
|
||||
private ISchBaseTaskconfigService taskConfigService;
|
||||
/* @Autowired
|
||||
private ISchBasePointService pointService;
|
||||
@Autowired
|
||||
private WmsToAcsService wmsToAcsService;*/
|
||||
private WmsToAcsService wmsToAcsService;
|
||||
|
||||
/**
|
||||
* 任务创建
|
||||
@@ -48,55 +51,59 @@ public abstract class AbstractTask {
|
||||
|
||||
/**
|
||||
* 下发acs前参数整理
|
||||
* @param 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) {
|
||||
Assert.notNull(task);
|
||||
List<SchBaseTask> taskList = new ArrayList<>();
|
||||
taskList.add(task);
|
||||
return this.renotifyAcs(taskList);
|
||||
public void schedule() {
|
||||
this.autoTask();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return WCS的任务集合
|
||||
* @discription 重新下发给wcs任务
|
||||
* @author ldjun
|
||||
* @created 2020年6月12日 下午5:52:28
|
||||
* 查询所有任务并整理好参数
|
||||
*/
|
||||
public void autoTask() {
|
||||
// 查询未执行下发的任务
|
||||
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
|
||||
protected AcsResponse renotifyAcs(List<SchBaseTask> taskList) {
|
||||
protected AcsResponse renotifyAcs(List<AcsTaskDto> taskDtoList) {
|
||||
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 {
|
||||
// 创建下发对象
|
||||
// TODO resultForAcs = wmsToAcsService.renotifyAcs(list);
|
||||
resultForAcs = wmsToAcsService.renotifyAcs(taskDtoList);
|
||||
} catch (Exception e) {
|
||||
log.error("任务下发异常: {}", e.getMessage());
|
||||
resultForAcs.setResponseDate(DateUtil.now());
|
||||
@@ -105,7 +112,16 @@ public abstract class AbstractTask {
|
||||
}
|
||||
// 如果下发完毕,就修改状态
|
||||
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();
|
||||
for (SchBaseTask schBaseTask : taskList) {
|
||||
schBaseTask.setTask_status(TaskStatus.ISSUED.getCode());
|
||||
@@ -126,87 +142,31 @@ public abstract class AbstractTask {
|
||||
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会出现自动注入类出现问题
|
||||
*
|
||||
* @param task_code
|
||||
* @param status
|
||||
* @param task_code r任务号
|
||||
* @param 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);
|
||||
|
||||
/**
|
||||
* 取消任务,货物搬回原点
|
||||
*
|
||||
* @param task_code
|
||||
* @param task_code 任务号
|
||||
*/
|
||||
public abstract void cancel(String task_code);
|
||||
|
||||
/**
|
||||
* 申请任务
|
||||
*
|
||||
* @param param
|
||||
* @throws BadRequestException
|
||||
* 回传mes
|
||||
* @param task_code 任务号
|
||||
*/
|
||||
public void apply(JSONObject param) throws BadRequestException {
|
||||
}
|
||||
|
||||
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"/>
|
||||
<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">
|
||||
<!--日志文件输出的文件名-->
|
||||
<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>
|
||||
<!--单个日志最大容量 至少10MB才能看得出来-->
|
||||
@@ -23,6 +23,6 @@
|
||||
</appender>
|
||||
<!-- 打印sql -->
|
||||
<logger name="org.nl.wms.ext.service.impl.ErpToWmsServiceImpl" level="info" additivity="false">
|
||||
<appender-ref ref="FILE_ERPTOWMS"/>
|
||||
<appender-ref ref="FILE_SENDTASK"/>
|
||||
</logger>
|
||||
</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