4 changed files with 652 additions and 247 deletions
@ -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()); |
|
||||
} |
|
||||
} |
|
Loading…
Reference in new issue