fix
This commit is contained in:
@@ -0,0 +1,62 @@
|
|||||||
|
package org.nl.acs.device_driver.basedriver.standard_inspect_site;
|
||||||
|
|
||||||
|
import org.nl.acs.device.device_driver.standard_inspect.ItemDto;
|
||||||
|
import org.nl.acs.device.domain.Device;
|
||||||
|
import org.nl.acs.device_driver.DeviceDriver;
|
||||||
|
import org.nl.acs.device_driver.defination.OpcDeviceDriverDefination;
|
||||||
|
import org.nl.acs.device.enums.DeviceType;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测站点驱动定义
|
||||||
|
* 说明:该站点为普通带光电检测站点
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class StandardInspectSiteDefination implements OpcDeviceDriverDefination {
|
||||||
|
@Override
|
||||||
|
public String getDriverCode() {
|
||||||
|
return "standard_inspect_site";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDriverName() {
|
||||||
|
return "标准版-检测站点";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDriverDescription() {
|
||||||
|
return "标准版-检测站点";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DeviceDriver getDriverInstance(Device device) {
|
||||||
|
return (new StandardInspectSiteDeviceDriver()).setDevice(device).setDriverDefination(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends DeviceDriver> getDeviceDriverType() {
|
||||||
|
return StandardInspectSiteDeviceDriver.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DeviceType> getFitDeviceTypes() {
|
||||||
|
List<DeviceType> types = new LinkedList();
|
||||||
|
types.add(DeviceType.conveyor);
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ItemDto> getReadableItemDtos() {
|
||||||
|
return ItemProtocol.getReadableItemDtos();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ItemDto> getWriteableItemDtos() {
|
||||||
|
return ItemProtocol.getWriteableItemDtos();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,479 @@
|
|||||||
|
package org.nl.acs.device_driver.basedriver.standard_inspect_site;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.acs.device.domain.Device;
|
||||||
|
import org.nl.acs.device.service.DeviceService;
|
||||||
|
import org.nl.acs.device_driver.DeviceDriver;
|
||||||
|
import org.nl.acs.device_driver.RequestMethodEnum;
|
||||||
|
import org.nl.acs.device_driver.RouteableDeviceDriver;
|
||||||
|
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
|
||||||
|
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
|
||||||
|
import org.nl.acs.ext.wms.data.feedBackTaskStatus.FeedBackTaskStatusRequest;
|
||||||
|
import org.nl.acs.ext.wms.service.AcsToWmsService;
|
||||||
|
import org.nl.acs.instruction.domain.Instruction;
|
||||||
|
import org.nl.acs.instruction.service.InstructionService;
|
||||||
|
import org.nl.acs.monitor.DeviceStageMonitor;
|
||||||
|
import org.nl.acs.opc.DeviceAppService;
|
||||||
|
import org.nl.acs.opc.DeviceAppServiceImpl;
|
||||||
|
import org.nl.acs.opc.WcsConfig;
|
||||||
|
import org.nl.acs.route.service.RouteLineService;
|
||||||
|
import org.nl.acs.route.service.dto.RouteLineDto;
|
||||||
|
import org.nl.acs.task.domain.Task;
|
||||||
|
import org.nl.acs.task.service.TaskService;
|
||||||
|
import org.nl.acs.task.service.dto.TaskDto;
|
||||||
|
import org.nl.acs.task.service.mapper.TaskMapper;
|
||||||
|
import org.nl.acs.utils.ConvertUtil;
|
||||||
|
import org.nl.common.utils.CodeUtil;
|
||||||
|
import org.nl.config.SpringContextHolder;
|
||||||
|
import org.openscada.opc.lib.da.Server;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测站点驱动
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Data
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver , DeviceStageMonitor {
|
||||||
|
protected ItemProtocol itemProtocol = new ItemProtocol(this);
|
||||||
|
|
||||||
|
InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl");
|
||||||
|
|
||||||
|
DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl");
|
||||||
|
|
||||||
|
RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl");
|
||||||
|
|
||||||
|
TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl");
|
||||||
|
|
||||||
|
TaskMapper taskMapper;
|
||||||
|
|
||||||
|
AcsToWmsService acsToWmsService=SpringContextHolder.getBean("acsToWmsServiceImpl");
|
||||||
|
|
||||||
|
String container;
|
||||||
|
String container_type_desc;
|
||||||
|
String last_container_type_desc;
|
||||||
|
String last_container;
|
||||||
|
//放货准备锁
|
||||||
|
String putReadyLock = null;
|
||||||
|
//有货标记
|
||||||
|
protected boolean has_goods_tag = false;
|
||||||
|
|
||||||
|
private Date time = new Date();
|
||||||
|
|
||||||
|
int mode = 0;
|
||||||
|
int error = 0;
|
||||||
|
int move = 0;
|
||||||
|
int task = 0;
|
||||||
|
int action = 0;
|
||||||
|
int last_mode = 0;
|
||||||
|
int last_error = 0;
|
||||||
|
int last_move = 0;
|
||||||
|
int last_task = 0;
|
||||||
|
Boolean isonline = true;
|
||||||
|
int hasGoods = 0;
|
||||||
|
String message = null;
|
||||||
|
Boolean iserror = false;
|
||||||
|
|
||||||
|
int io_action = 0;
|
||||||
|
int last_io_action = 0;
|
||||||
|
int material_type = 0;
|
||||||
|
int last_material_type = 0;
|
||||||
|
int barcode = 0;
|
||||||
|
int last_barcode =0;
|
||||||
|
|
||||||
|
|
||||||
|
boolean hasVehicle = false;
|
||||||
|
boolean isReady = false;
|
||||||
|
protected int instruction_num = 0;
|
||||||
|
protected int instruction_num_truth = 0;
|
||||||
|
boolean isFold = false;
|
||||||
|
private String assemble_check_tag;
|
||||||
|
|
||||||
|
protected String current_stage_instruction_message;
|
||||||
|
protected String last_stage_instruction_message;
|
||||||
|
Integer heartbeat_tag;
|
||||||
|
private Date instruction_require_time = new Date();
|
||||||
|
private Date instruction_finished_time = new Date();
|
||||||
|
|
||||||
|
private int instruction_require_time_out;
|
||||||
|
boolean requireSucess = false;
|
||||||
|
|
||||||
|
private int instruction_finished_time_out;
|
||||||
|
|
||||||
|
int branchProtocol = 0;
|
||||||
|
//备注
|
||||||
|
String remark;
|
||||||
|
//数量
|
||||||
|
String qty;
|
||||||
|
//物料
|
||||||
|
String material;
|
||||||
|
//批次
|
||||||
|
String batch;
|
||||||
|
//当前指令
|
||||||
|
Instruction inst = null;
|
||||||
|
//上次指令
|
||||||
|
Instruction last_inst = null;
|
||||||
|
|
||||||
|
//触摸屏手动触发任务
|
||||||
|
private Boolean is_has_task = false;
|
||||||
|
|
||||||
|
//满盅入库请求标记
|
||||||
|
boolean Sucess = false;
|
||||||
|
|
||||||
|
//暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域
|
||||||
|
int flag;
|
||||||
|
|
||||||
|
String devicecode;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Device getDevice() {
|
||||||
|
return this.device;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
String message = null;
|
||||||
|
try {
|
||||||
|
devicecode = this.getDeviceCode();
|
||||||
|
mode = this.itemProtocol.getMode();
|
||||||
|
error = this.itemProtocol.getError();
|
||||||
|
move = this.itemProtocol.getMove();
|
||||||
|
hasGoods = this.itemProtocol.getMove();
|
||||||
|
action = this.itemProtocol.getAction();
|
||||||
|
material_type = this.itemProtocol.getMaterialType();
|
||||||
|
barcode=this.itemProtocol.getBarcode();
|
||||||
|
if (mode != last_mode) {
|
||||||
|
this.setRequireSucess(false);
|
||||||
|
if(mode==2){
|
||||||
|
this.writing(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (move != last_move) {
|
||||||
|
}
|
||||||
|
if (error != last_error) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception var17) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.itemProtocol.getIsonline()) {
|
||||||
|
this.setIsonline(false);
|
||||||
|
this.setIserror(true);
|
||||||
|
message = "信号量同步异常";
|
||||||
|
//未联机
|
||||||
|
} else if (mode == 0) {
|
||||||
|
this.setIsonline(false);
|
||||||
|
this.setIserror(true);
|
||||||
|
message = "未联机";
|
||||||
|
//有报警
|
||||||
|
} else if (error != 0) {
|
||||||
|
this.setIsonline(false);
|
||||||
|
this.setIserror(true);
|
||||||
|
message = "有报警";
|
||||||
|
//无报警
|
||||||
|
} else {
|
||||||
|
this.setIsonline(true);
|
||||||
|
this.setIserror(false);
|
||||||
|
message = "";
|
||||||
|
Instruction instruction = null;
|
||||||
|
List toInstructions;
|
||||||
|
switch (mode) {
|
||||||
|
case 1:
|
||||||
|
log.debug("设备运转模式:等待工作");
|
||||||
|
return;
|
||||||
|
case 2:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
//叫料
|
||||||
|
if (move==0 && !requireSucess){
|
||||||
|
apply(4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
//满料出库
|
||||||
|
if(move==1 && !requireSucess){
|
||||||
|
apply(5);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
//申请空盘
|
||||||
|
if (move==0 && !requireSucess){
|
||||||
|
apply(6);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
//空托盘出库
|
||||||
|
if(move==1 && !requireSucess){
|
||||||
|
apply(7);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (flag) {
|
||||||
|
//取货完成
|
||||||
|
case 1:
|
||||||
|
writing(2);
|
||||||
|
return;
|
||||||
|
//放货完成
|
||||||
|
case 2:
|
||||||
|
writing(3);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
last_mode = mode;
|
||||||
|
last_error = error;
|
||||||
|
last_move = move;
|
||||||
|
last_task = task;
|
||||||
|
last_material_type = material_type;
|
||||||
|
last_barcode=barcode;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean exe_error() {
|
||||||
|
if (this.error == 0) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
log.debug("设备报警");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void thingToNothing() {
|
||||||
|
log.debug("从有货到无货 清理数据");
|
||||||
|
this.set_last_container(container, container_type_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set_last_container(String barcode, String type_desc) {
|
||||||
|
this.set_last_container(barcode);
|
||||||
|
this.set_last_container_type_desc(type_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set_last_container(String barcode) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set_last_container_type_desc(String type) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exe_business() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executing(Instruction instruction) {
|
||||||
|
this.executing(1, instruction, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void executing(int command, Instruction instruction, String appendMessage) {
|
||||||
|
String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_command;
|
||||||
|
String to_target = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_target;
|
||||||
|
String to_task = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_task;
|
||||||
|
if (appendMessage == null) {
|
||||||
|
appendMessage = "";
|
||||||
|
}
|
||||||
|
if (instruction != null) {
|
||||||
|
instruction_num = Integer.parseInt(instruction.getInstruction_code());
|
||||||
|
}
|
||||||
|
//String opcservcerid = this.getDevice().getOpc_server_id();
|
||||||
|
//Server server = ReadUtil.getServer(opcservcerid);
|
||||||
|
Map<String, Object> itemMap = new HashMap<String, Object>();
|
||||||
|
itemMap.put(to_command, 1);
|
||||||
|
itemMap.put(to_task, instruction_num);
|
||||||
|
this.control(itemMap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void executing(Server server, Map<String, Object> itemMap) {
|
||||||
|
this.control(itemMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writing(int command) {
|
||||||
|
String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_command;
|
||||||
|
|
||||||
|
//String opcservcerid = this.getDevice().getOpc_server_id();
|
||||||
|
//Server server = ReadUtil.getServer(opcservcerid);
|
||||||
|
Map<String, Object> itemMap = new HashMap<String, Object>();
|
||||||
|
itemMap.put(to_command, command);
|
||||||
|
this.control(itemMap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writing(int type, int command) {
|
||||||
|
String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_command;
|
||||||
|
String to_target = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_target;
|
||||||
|
String to_task = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||||
|
+ "." + ItemProtocol.item_to_task;
|
||||||
|
//String opcservcerid = this.getDevice().getOpc_server_id();
|
||||||
|
//Server server = ReadUtil.getServer(opcservcerid);
|
||||||
|
Map<String, Object> itemMap = new HashMap<String, Object>();
|
||||||
|
if (type == 1) {
|
||||||
|
itemMap.put(to_command, command);
|
||||||
|
} else if (type == 2) {
|
||||||
|
itemMap.put(to_target, command);
|
||||||
|
|
||||||
|
} else if (type == 3) {
|
||||||
|
itemMap.put(to_task, command);
|
||||||
|
}
|
||||||
|
this.control(itemMap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean instruction_require(String container_code) {
|
||||||
|
return instruction_require(container_code, WcsConfig.task_container_type_default_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求指令
|
||||||
|
*
|
||||||
|
* @param container_code
|
||||||
|
* @param container_type
|
||||||
|
*/
|
||||||
|
public synchronized boolean instruction_require(String container_code, String container_type) {
|
||||||
|
Date date = new Date();
|
||||||
|
if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) {
|
||||||
|
log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.instruction_require_time = date;
|
||||||
|
TaskDto dto = new TaskDto();
|
||||||
|
String now = DateUtil.now();
|
||||||
|
dto.setTask_id(IdUtil.simpleUUID());
|
||||||
|
dto.setCreate_by(this.getDevice().getDevice_code());
|
||||||
|
dto.setUpdate_by(this.getDevice().getDevice_code());
|
||||||
|
dto.setStart_point_code(this.getDevice().getDevice_code());
|
||||||
|
dto.setVehicle_code(container_code);
|
||||||
|
dto.setVehicle_type(container_type);
|
||||||
|
|
||||||
|
String taskcode = CodeUtil.getNewCode("TASK_NO");
|
||||||
|
dto.setTask_code("-" + taskcode);
|
||||||
|
dto.setTask_status("0");
|
||||||
|
dto.setPriority("101");
|
||||||
|
RouteLineDto jo = routelineserver.findByCode(this.getDevice().getDevice_code());
|
||||||
|
String next_device_codecode = jo.getNext_device_code();
|
||||||
|
if (StrUtil.isEmpty(next_device_codecode)) {
|
||||||
|
throw new RuntimeException("该设备未找到对应路由");
|
||||||
|
}
|
||||||
|
dto.setNext_point_code(next_device_codecode);
|
||||||
|
dto.setUpdate_time(now);
|
||||||
|
dto.setCreate_time(now);
|
||||||
|
|
||||||
|
// WQLObject wo = WQLObject.getWQLObject("acs_task");
|
||||||
|
// JSONObject json = (JSONObject) JSONObject.toJSON(dto);
|
||||||
|
//
|
||||||
|
// wo.insert(json);
|
||||||
|
|
||||||
|
Task entity = ConvertUtil.convert(dto, Task.class);
|
||||||
|
taskMapper.insert(entity);
|
||||||
|
requireSucess = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject getDeviceStatusName() {
|
||||||
|
JSONObject jo = new JSONObject();
|
||||||
|
String mode = "";
|
||||||
|
String action = "";
|
||||||
|
String move = "";
|
||||||
|
if (this.getMode() == 0) {
|
||||||
|
mode = "未联机";
|
||||||
|
} else if (this.getMode() == 1) {
|
||||||
|
mode = "单机";
|
||||||
|
} else if (this.getMode() == 2) {
|
||||||
|
mode = "联机";
|
||||||
|
} else if (this.getMode() == 3) {
|
||||||
|
mode = "运行中";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.getMove() == 0) {
|
||||||
|
move = "无货";
|
||||||
|
jo.put("hasGoods", false);
|
||||||
|
} else if (this.getMove() == 1) {
|
||||||
|
move = "有货";
|
||||||
|
jo.put("hasGoods", true);
|
||||||
|
} else if (this.getMove() == 2) {
|
||||||
|
move = "有托盘有货";
|
||||||
|
jo.put("hasGoods", true);
|
||||||
|
}
|
||||||
|
jo.put("device_name", this.getDevice().getDevice_name());
|
||||||
|
jo.put("mode", mode);
|
||||||
|
jo.put("move", move);
|
||||||
|
jo.put("action", action);
|
||||||
|
jo.put("isOnline", this.getIsonline());
|
||||||
|
jo.put("error", this.getError());
|
||||||
|
jo.put("isError", this.getIserror());
|
||||||
|
jo.put("task", this.getTask());
|
||||||
|
return jo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDeviceStatus(JSONObject data) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lms申请任务
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
*/
|
||||||
|
public synchronized boolean apply(Integer type) {
|
||||||
|
Date date = new Date();
|
||||||
|
if (date.getTime() - this.time.getTime() < (long) this.instruction_require_time_out) {
|
||||||
|
log.trace("触发时间因为小于{}毫秒,而被无视", this.time);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
this.time = date;
|
||||||
|
FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
|
||||||
|
request.setDevice_code(devicecode);
|
||||||
|
request.setMaterial_type(String.valueOf(material_type));
|
||||||
|
request.setVehicle_code(String.valueOf(barcode));
|
||||||
|
if (devicecode.startsWith("TBX")&&type==5&&barcode>0) {
|
||||||
|
//满架下料
|
||||||
|
request.setRequest_medthod_code(RequestMethodEnum.apply_mjxl.getCode());
|
||||||
|
request.setRequest_medthod_name(RequestMethodEnum.apply_mjxl.getName());
|
||||||
|
}else if (devicecode.startsWith("TBX")&&type==6) {
|
||||||
|
//补空架
|
||||||
|
request.setRequest_medthod_code(RequestMethodEnum.apply_tbxbkj.getCode());
|
||||||
|
request.setRequest_medthod_name(RequestMethodEnum.apply_tbxbkj.getName());
|
||||||
|
}else if (type==7) {
|
||||||
|
//空托盘出库,包片机和销售出库空位都可以
|
||||||
|
request.setRequest_medthod_code(RequestMethodEnum.apply_kghjrk.getCode());
|
||||||
|
request.setRequest_medthod_name(RequestMethodEnum.apply_kghjrk.getName());
|
||||||
|
}else if(devicecode.startsWith("BP")&&material_type>0){
|
||||||
|
request.setRequest_medthod_code(RequestMethodEnum.apply_bpsl.getCode());
|
||||||
|
request.setRequest_medthod_name(RequestMethodEnum.apply_bpsl.getName());
|
||||||
|
}
|
||||||
|
String resp = acsToWmsService.applyTask(request);
|
||||||
|
JSONObject res_jo = JSONObject.parseObject(resp);
|
||||||
|
if (StrUtil.equals(res_jo.getString("code"), "200")) {
|
||||||
|
this.writing(type);
|
||||||
|
this.setRequireSucess(true);
|
||||||
|
log.info("acs申请任务", this.devicecode, "满盅入库任务申请成功!");
|
||||||
|
}else{
|
||||||
|
this.writing(99);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
package org.nl.acs.device_driver.basedriver.standard_inspect_site;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nl.acs.device.device_driver.standard_inspect.ItemDto;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Data
|
||||||
|
public class ItemProtocol {
|
||||||
|
|
||||||
|
public static String item_heartbeat = "heartbeat";
|
||||||
|
public static String item_mode = "mode";
|
||||||
|
public static String item_move = "move";
|
||||||
|
public static String item_action = "action";
|
||||||
|
public static String item_error = "error";
|
||||||
|
public static String item_to_command = "to_command";
|
||||||
|
public static String item_to_target = "to_target";
|
||||||
|
public static String item_to_task = "to_task";
|
||||||
|
public static String item_weight = "weight";
|
||||||
|
public static String item_material_type = "material_type";
|
||||||
|
public static String item_barcode = "barcode";
|
||||||
|
|
||||||
|
private StandardInspectSiteDeviceDriver driver;
|
||||||
|
|
||||||
|
public ItemProtocol(StandardInspectSiteDeviceDriver driver) {
|
||||||
|
this.driver = driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHeartbeat() {
|
||||||
|
return this.getOpcIntegerValue(item_heartbeat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMode() {
|
||||||
|
return this.getOpcIntegerValue(item_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMove() {
|
||||||
|
return this.getOpcIntegerValue(item_move);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAction() {
|
||||||
|
return this.getOpcIntegerValue(item_action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getError() {
|
||||||
|
return this.getOpcIntegerValue(item_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getMaterialType() {
|
||||||
|
return this.getOpcIntegerValue(item_material_type);
|
||||||
|
}
|
||||||
|
public int getBarcode() {
|
||||||
|
return this.getOpcIntegerValue(item_barcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getToCommand() {
|
||||||
|
return this.getOpcIntegerValue(item_to_command);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getToTarget() {
|
||||||
|
return this.getOpcIntegerValue(item_to_target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getToTask() {
|
||||||
|
return this.getOpcIntegerValue(item_to_task);
|
||||||
|
}
|
||||||
|
|
||||||
|
//是否有货
|
||||||
|
public int hasGoods(int move) {
|
||||||
|
return move;
|
||||||
|
}
|
||||||
|
|
||||||
|
Boolean isonline;
|
||||||
|
|
||||||
|
public int getOpcIntegerValue(String protocol) {
|
||||||
|
Integer value = this.driver.getIntegeregerValue(protocol);
|
||||||
|
if (value == null) {
|
||||||
|
// log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!");
|
||||||
|
setIsonline(false);
|
||||||
|
} else {
|
||||||
|
setIsonline(true);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ItemDto> getReadableItemDtos() {
|
||||||
|
ArrayList list = new ArrayList();
|
||||||
|
list.add(new ItemDto(item_heartbeat, "心跳", "DB600.B0"));
|
||||||
|
list.add(new ItemDto(item_mode, "工作状态", "DB600.B2", Boolean.valueOf(true)));
|
||||||
|
list.add(new ItemDto(item_move, "光电开关信号", "DB600.B3"));
|
||||||
|
list.add(new ItemDto(item_action, "取放信号", "DB600.B4"));
|
||||||
|
list.add(new ItemDto(item_material_type, "物料类型", "DB600.D6"));
|
||||||
|
list.add(new ItemDto(item_error, "报警信号", "DB600.B7"));
|
||||||
|
list.add(new ItemDto(item_barcode, "条码", "DB600.D8"));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ItemDto> getWriteableItemDtos() {
|
||||||
|
ArrayList list = new ArrayList();
|
||||||
|
list.add(new ItemDto(item_to_command, "作业命令", "DB601.W2", Boolean.valueOf(true)));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
package org.nl.wms.sch.task_manage.task.tasks;
|
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.nl.common.exception.BadRequestException;
|
|
||||||
import org.nl.config.MapOf;
|
|
||||||
import org.nl.wms.ext.service.WmsToAcsService;
|
|
||||||
import org.nl.wms.ext.service.dto.to.BaseResponse;
|
|
||||||
import org.nl.wms.pdm.service.IPdmBdWorkorderService;
|
|
||||||
import org.nl.wms.pdm.service.dao.PdmBdWorkorder;
|
|
||||||
import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService;
|
|
||||||
import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup;
|
|
||||||
import org.nl.wms.sch.point.service.ISchBasePointService;
|
|
||||||
import org.nl.wms.sch.point.service.dao.SchBasePoint;
|
|
||||||
import org.nl.wms.sch.task.service.ISchBaseTaskService;
|
|
||||||
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
|
|
||||||
import org.nl.wms.sch.task.service.dao.SchBaseTask;
|
|
||||||
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
|
|
||||||
import org.nl.wms.sch.task_manage.AbstractTask;
|
|
||||||
import org.nl.wms.sch.task_manage.GeneralDefinition;
|
|
||||||
import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum;
|
|
||||||
import org.nl.wms.sch.task_manage.enums.GroupStatusEnum;
|
|
||||||
import org.nl.wms.sch.task_manage.task.TaskType;
|
|
||||||
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
|
|
||||||
import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper;
|
|
||||||
import org.nl.wms.util.PointUtils;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: psh
|
|
||||||
* @Description: 销售出库
|
|
||||||
* @Date: 2023/9/28
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
@TaskType("XSCKTask")
|
|
||||||
@Lazy
|
|
||||||
public class XSCKTask extends AbstractTask {
|
|
||||||
private static String TASK_CONFIG_CODE = "XSCKTask";
|
|
||||||
/**
|
|
||||||
* 入口
|
|
||||||
*/
|
|
||||||
private static String ENTRANCE = "1";
|
|
||||||
@Autowired
|
|
||||||
private ISchBasePointService pointService;
|
|
||||||
@Autowired
|
|
||||||
private ISchBaseTaskService taskService;
|
|
||||||
@Autowired
|
|
||||||
private ISchBaseTaskconfigService taskConfigService;
|
|
||||||
@Autowired
|
|
||||||
private IPdmBdWorkorderService workorderService;
|
|
||||||
@Autowired
|
|
||||||
private ISchBaseVehiclematerialgroupService vehiclematerialgroupService;
|
|
||||||
@Autowired
|
|
||||||
private PointMapper pointMapper;
|
|
||||||
@Autowired
|
|
||||||
private WmsToAcsService wmsToAcsService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
// @Transactional(rollbackFor = Exception.class)
|
|
||||||
protected void create() throws BadRequestException {
|
|
||||||
// 获取任务
|
|
||||||
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
|
|
||||||
// 配置信息
|
|
||||||
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
|
|
||||||
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
|
|
||||||
for (SchBaseTask task : tasks) {
|
|
||||||
// 找起点
|
|
||||||
SchBasePoint nextPoint = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
|
|
||||||
.eq(SchBasePoint::getPoint_code, task.getPoint_code2()));
|
|
||||||
String extGroupData = task.getExt_group_data();
|
|
||||||
JSONObject jsonObject = JSONObject.parseObject(extGroupData);
|
|
||||||
String materialType = jsonObject.getString("material_type");
|
|
||||||
SchBasePoint point = findNextPoint(nextPoint,jsonObject);
|
|
||||||
if (ObjectUtil.isEmpty(point)) {
|
|
||||||
task.setRemark("未找到所需点位!");
|
|
||||||
taskService.update(task);
|
|
||||||
// 消息通知
|
|
||||||
log.info("销售出库未找到当前符合条件的点位materialType:{},", materialType);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 设置起点并修改创建成功状态
|
|
||||||
// 取料先去等待点
|
|
||||||
task.setPoint_code1(point.getStart_wait_point());
|
|
||||||
task.setTask_status(TaskStatus.CREATED.getCode());
|
|
||||||
task.setRemark("");
|
|
||||||
taskService.update(task);
|
|
||||||
|
|
||||||
//发起任务时先把点位占用,防止发起重复任务
|
|
||||||
point.setIng_task_code(task.getTask_code());
|
|
||||||
point.setVehicle_qty(point.getVehicle_qty() - 1);
|
|
||||||
point.setVehicle_type(materialType);
|
|
||||||
pointService.update(point);
|
|
||||||
|
|
||||||
//下发
|
|
||||||
this.renotifyAcs(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断目标点位
|
|
||||||
* 从10-1查找可以物料一致且有货的点位
|
|
||||||
*
|
|
||||||
* @param extGroupData
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private SchBasePoint findNextPoint(SchBasePoint nextPoint,JSONObject extGroupData) {
|
|
||||||
String regionCode = null;
|
|
||||||
String materialType = extGroupData.getString("material_type");
|
|
||||||
if ("XSQ1".equals(nextPoint.getRegion_code())) {
|
|
||||||
//XSQ1找A区 边负极板HCQ03 负极板HCQ02
|
|
||||||
if("3".equals(materialType)) {
|
|
||||||
regionCode = "HCQ3";
|
|
||||||
}else if("2".equals(materialType)){
|
|
||||||
regionCode = "HCQ2";
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ("XSQ2".equals(nextPoint.getRegion_code())) {
|
|
||||||
//XSQ2找B区
|
|
||||||
regionCode = "HCQ2";
|
|
||||||
}
|
|
||||||
List<SchBasePoint> schBasePointList = pointMapper.findPointByRegion(regionCode,"2");
|
|
||||||
for(int i=schBasePointList.size()-1;i>=0;i--){
|
|
||||||
SchBasePoint schBasePoint=schBasePointList.get(i);
|
|
||||||
if (!"1".equals(schBasePoint.getPoint_type())&&schBasePoint.getVehicle_qty()!=0
|
|
||||||
&&ObjectUtil.isEmpty(schBasePoint.getIng_task_code())
|
|
||||||
&&(ObjectUtil.isEmpty(schBasePoint.getVehicle_type())||materialType.equals(schBasePoint.getVehicle_type()))){
|
|
||||||
log.info("销售出库任务找到当前符合条件的缓存区位置{}",schBasePoint.getPoint_code());
|
|
||||||
return schBasePoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 1.取货完毕后起点减少最后一份组盘,并且该组盘视为已结束
|
|
||||||
* 2.销售出库LMS不记录点位信息,由人工对组盘进行操作
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
// @Transactional(rollbackFor = Exception.class)
|
|
||||||
protected void updateStatus(String task_code, TaskStatus status) {
|
|
||||||
// 校验任务
|
|
||||||
SchBaseTask taskObj = taskService.getById(task_code);
|
|
||||||
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
|
|
||||||
throw new BadRequestException("该任务已完成!");
|
|
||||||
}
|
|
||||||
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
|
|
||||||
throw new BadRequestException("该任务已取消!");
|
|
||||||
}
|
|
||||||
String startPoint = taskObj.getPoint_code1(); // 获取起点
|
|
||||||
String endPoint = taskObj.getPoint_code2(); // 获取终点
|
|
||||||
SchBasePoint startPointObj = pointService.getById(startPoint);
|
|
||||||
SchBasePoint endPointObj = pointService.getById(endPoint);
|
|
||||||
// 根据传来的类型去对任务进行操作
|
|
||||||
if (status.equals(TaskStatus.EXECUTING)) { // 执行中
|
|
||||||
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
|
|
||||||
taskObj.setRemark("执行中");
|
|
||||||
}
|
|
||||||
if (status.equals(TaskStatus.FINISHED)) { // 完成
|
|
||||||
List<String> vehicleCodeList = Arrays.stream(startPointObj.getVehicle_code().split(",")).collect(Collectors.toList());
|
|
||||||
String vehicleCode=vehicleCodeList.get(vehicleCodeList.size()-1);
|
|
||||||
SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper<SchBaseVehiclematerialgroup>()
|
|
||||||
.eq(SchBaseVehiclematerialgroup::getVehicle_code, vehicleCode)
|
|
||||||
.eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status,
|
|
||||||
GroupBindMaterialStatusEnum.BOUND.getValue()));
|
|
||||||
if (ObjectUtil.isEmpty(one)) {
|
|
||||||
throw new BadRequestException(vehicleCode + " => " + startPointObj.getVehicle_type() + "的组盘信息未找到");
|
|
||||||
}
|
|
||||||
one.setTask_code(taskObj.getTask_code());
|
|
||||||
one.setPoint_code(endPointObj.getPoint_code()); // 当前位置
|
|
||||||
one.setPoint_name(endPointObj.getPoint_name());
|
|
||||||
one.setMove_way(one.getMove_way()==null?"":(one.getMove_way() + " -> ") + endPointObj.getPoint_code());
|
|
||||||
one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue());
|
|
||||||
one.setUpdate_id(GeneralDefinition.ACS_ID);
|
|
||||||
one.setUpdate_name(GeneralDefinition.ACS_NAME);
|
|
||||||
one.setUpdate_time(DateUtil.now());
|
|
||||||
vehiclematerialgroupService.updateById(one);
|
|
||||||
// 起点清空
|
|
||||||
if (vehicleCodeList.size()==1) {
|
|
||||||
startPointObj.setVehicle_code("");
|
|
||||||
}else{
|
|
||||||
StringBuilder vehicle_code=new StringBuilder();
|
|
||||||
for(int i=0;i<=vehicleCodeList.size()-2;i++){
|
|
||||||
vehicle_code.append(vehicleCodeList.get(i)).append(',');
|
|
||||||
}
|
|
||||||
startPointObj.setVehicle_code(vehicle_code.toString());
|
|
||||||
}
|
|
||||||
startPointObj.setIng_task_code("");
|
|
||||||
startPointObj.setUpdate_time(DateUtil.now());
|
|
||||||
pointService.updateById(startPointObj);
|
|
||||||
//销售出库完毕后,整排打上记号只允许销售出库
|
|
||||||
pointMapper.updatePointType(endPointObj.getPoint_code().substring(0,endPointObj.getPoint_code().length()-2),"2");
|
|
||||||
// 任务完成
|
|
||||||
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
|
|
||||||
taskObj.setGroup_id(one.getGroup_id());
|
|
||||||
taskObj.setRemark("任务完成");
|
|
||||||
}
|
|
||||||
if (status.equals(TaskStatus.CANCELED)) { // 取消
|
|
||||||
// 终点解锁
|
|
||||||
if (ObjectUtil.isNotEmpty(endPointObj)) {
|
|
||||||
endPointObj.setIng_task_code("");
|
|
||||||
pointService.update(endPointObj);
|
|
||||||
}
|
|
||||||
// 起点解锁
|
|
||||||
if (ObjectUtil.isNotEmpty(startPointObj)) {
|
|
||||||
startPointObj.setIng_task_code("");
|
|
||||||
startPointObj.setVehicle_qty(startPointObj.getVehicle_qty()+1);
|
|
||||||
pointService.update(endPointObj);
|
|
||||||
}
|
|
||||||
taskObj.setRemark("任务取消");
|
|
||||||
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
|
|
||||||
}
|
|
||||||
taskService.update(taskObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void forceFinish(String task_code) {
|
|
||||||
this.updateStatus(task_code, TaskStatus.FINISHED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cancel(String task_code) {
|
|
||||||
this.updateStatus(task_code, TaskStatus.CANCELED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) {
|
|
||||||
// 重算最优点
|
|
||||||
SchBasePoint nextPoint=pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
|
|
||||||
.eq(SchBasePoint::getPoint_code, schBaseTask.getPoint_code2()));
|
|
||||||
SchBasePoint point = this.findNextPoint(nextPoint,JSONObject.parseObject(schBaseTask.getExt_group_data()));
|
|
||||||
// 设置起点并修改创建成功状态
|
|
||||||
schBaseTask.setPoint_code1(point.getPoint_code());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user