zy-acs-cv/src/main/java/com/zy/asrs/controller/vo/ApplyInDto.java
New file @@ -0,0 +1,18 @@ package com.zy.asrs.controller.vo; import lombok.Data; /** * Created by vincent on 2023/6/12 */ @Data public class ApplyInDto { private String staNo; private String barcode; } zy-acs-cv/src/main/java/com/zy/asrs/controller/vo/ApplyInRepsonseDto.java
New file @@ -0,0 +1,17 @@ package com.zy.asrs.controller.vo; import lombok.Data; /** * Created by vincent on 2023/6/12 */ @Data public class ApplyInRepsonseDto { private String loc; private String taskNo; private String batchNo; } zy-acs-cv/src/main/java/com/zy/asrs/controller/vo/TaskDto.java
@@ -10,6 +10,8 @@ private String taskNo; private String batchNo; private String memo; private String oriLoc; zy-acs-cv/src/main/java/com/zy/asrs/entity/Job.java
@@ -27,14 +27,33 @@ /** * 任务号 */ @TableField("seq_num") private String seqNum; @TableField("task_no") private String taskNo; /** * 批次号 */ @TableField("batch_no") private String batchNo; /** * 站点号 */ @TableField("sta_no") private String staNo; /** * 库位号 */ @TableField("loc") private String loc; /** * 工作号,系统自己维护 */ @TableField("job_no") private Integer jobNo; /** * 工作状态 @@ -44,8 +63,8 @@ /** * 入库时间 */ @TableField("in_time") private Date inTime; @TableField("wms_time") private Date wmsTime; /** * 发生任务时间 */ zy-acs-cv/src/main/java/com/zy/asrs/mapper/JobMapper.java
@@ -13,7 +13,7 @@ public interface JobMapper extends BaseMapper<Job> { Job getJobBySeqNum(@Param("seqNum") String seqNum); Job getJobByTaskNo(@Param("seqNum") String seqNum); Job getJobByJobNo(@Param("workNo") Integer workNo); zy-acs-cv/src/main/java/com/zy/asrs/service/WmsMainService.java
New file @@ -0,0 +1,23 @@ package com.zy.asrs.service; import com.zy.asrs.controller.vo.ApplyInDto; import com.zy.asrs.controller.vo.ApplyInRepsonseDto; import com.zy.asrs.controller.vo.OpenBusSubmitParam; /** * 立体仓库WCS系统主流程业务接口 * Created by vincent on 2020/8/6 */ public interface WmsMainService { /** * 检查站点状态 * * @param applyInDto 站点编号 * @return 库位信息 */ ApplyInRepsonseDto getLocOfWms(ApplyInDto applyInDto); } zy-acs-cv/src/main/java/com/zy/asrs/service/impl/CtuMainServiceImpl.java
@@ -3,8 +3,11 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.controller.requestParam.StationRequestParam; import com.zy.asrs.controller.vo.ApplyInDto; import com.zy.asrs.controller.vo.ApplyInRepsonseDto; import com.zy.asrs.controller.vo.OpenBusSubmitParam; import com.zy.asrs.controller.vo.StationStatus; import com.zy.asrs.service.CtuMainService; @@ -24,7 +27,7 @@ * Created by vincent on 2020/8/6 */ @Slf4j @Service("ctuMainService") @Service @Transactional @Data public class CtuMainServiceImpl implements CtuMainService { @@ -107,8 +110,8 @@ } log.info("未返回站点状态:{}", staNo); } else { log.error("调用下发任务接口报错,响应码:{},响应内容:{}", jsonObject.getInteger("code"), response); throw new CoolException("调用下发任务接口报错,响应码:" + jsonObject.getInteger("code")); log.error("调用下发任务接口报错,响应码:{},响应内容:{}", jsonObject.getInteger(code), response); throw new CoolException("调用下发任务接口报错,响应码:" + jsonObject.getInteger(code)); } } catch (CoolException e) { log.error("调用站点状态接口异常", e); @@ -118,4 +121,7 @@ } return null; } } zy-acs-cv/src/main/java/com/zy/asrs/service/impl/JobServiceImpl.java
@@ -22,7 +22,7 @@ @Override public Job getJobBySeqNum(String seqNum) { return baseMapper.getJobBySeqNum(seqNum); return baseMapper.getJobByTaskNo(seqNum); } @Override zy-acs-cv/src/main/java/com/zy/asrs/service/impl/WmsMainServiceImpl.java
New file @@ -0,0 +1,87 @@ package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.core.exception.CoolException; import com.zy.asrs.controller.requestParam.StationRequestParam; import com.zy.asrs.controller.vo.ApplyInDto; import com.zy.asrs.controller.vo.ApplyInRepsonseDto; import com.zy.asrs.controller.vo.OpenBusSubmitParam; import com.zy.asrs.controller.vo.StationStatus; import com.zy.asrs.service.CtuMainService; import com.zy.asrs.service.WmsMainService; import com.zy.common.utils.HttpHandler; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * 立体仓库WCS系统主流程业务 * Created by vincent on 2020/8/6 */ @Slf4j @Service @Transactional @Data public class WmsMainServiceImpl implements WmsMainService { @Value("${ctu.url}") private String wmsUrl; @Value("${ctu.sendTask}") private String apply; private String code ="code"; private String dataCode ="data"; private Integer codeValue =200; private Integer timeout = 1200; /** * 检查站点状态 * * @param applyInDto 站点编号 * @return 库位信息 */ public ApplyInRepsonseDto getLocOfWms(ApplyInDto applyInDto) { String response = ""; try { response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath(apply) .setTimeout(timeout, TimeUnit.SECONDS) .setJson(JSON.toJSONString(applyInDto)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger(code).equals(codeValue)) { log.info("WMS返回数据:{}", response); JSONArray data = jsonObject.getJSONArray(dataCode); return JSONObject.parseObject(data.toString(), ApplyInRepsonseDto.class); } else { log.error("调用下发任务接口报错,响应码:{},响应内容:{}", jsonObject.getInteger(code), response); throw new CoolException("调用下发任务接口报错,响应码:" + jsonObject.getInteger(code)); } } catch (CoolException e) { log.error("调用站点状态接口异常", e); throw e; } catch (Exception e) { log.error("检查站点状态失败,条码编号:{},站点:{}", applyInDto.getBarcode(),applyInDto.getStaNo(), e); } return null; } } zy-acs-cv/src/main/java/com/zy/core/enums/ConveyorStateType.java
@@ -1,13 +1,17 @@ package com.zy.core.enums; public enum ConveyorStateType { //出库设备上走 OUTBOUND, //模拟用户 FAKEUSER, //入库申请 APPLYLOC, //入库设备上走 INBOUND, FAKEWMS, FAKETASK, //清除输送线上的信号 CLEARSIGNAL, //发送任务给RCS SENDTASK; zy-acs-cv/src/main/java/com/zy/core/operation/handler/AppleLocOperationHandler.java
New file @@ -0,0 +1,108 @@ package com.zy.core.operation.handler; import com.core.exception.CoolException; import com.zy.asrs.controller.vo.ApplyInDto; import com.zy.asrs.controller.vo.ApplyInRepsonseDto; import com.zy.asrs.entity.Job; import com.zy.asrs.service.CtuMainService; import com.zy.asrs.service.JobService; import com.zy.asrs.service.WmsMainService; import com.zy.asrs.service.WrkLastnoService; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.ConveyorStateType; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.operation.OperationHandler; import com.zy.core.properties.CtuOperationConfig; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.SiemensDevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.Date; /** * 入库 */ @Slf4j @Component public class AppleLocOperationHandler implements OperationHandler { @Autowired private SlaveProperties slaveProperties; @Autowired private WrkLastnoService wrkLastnoService; @Autowired private WmsMainService wmsMainService; @Autowired private JobService jobService; @Override public ConveyorStateType getType() { return ConveyorStateType.APPLYLOC; } @Override public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getInSta()) { // 根据输送线plc遍历 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, devp.getId()); if (staProtocol == null) { return; } else { staProtocol = staProtocol.clone(); } // 判断是否满足条件 if (!staProtocol.isLoading()) { return; } if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) { Job job = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), 2); if (job != null) { ApplyInDto applyInDto=new ApplyInDto(); applyInDto.setStaNo(inSta.getStaNo()+""); applyInDto.setBarcode(barcodeThread.getBarcode()); //TODO ApplyInRepsonseDto locOfWms =new ApplyInRepsonseDto(); locOfWms.setTaskNo(System.currentTimeMillis()+""); locOfWms.setBatchNo(System.currentTimeMillis()+""); //ApplyInRepsonseDto locOfWms = wmsMainService.getLocOfWms(applyInDto); if (locOfWms != null) { job.setLoc(locOfWms.getLoc()); job.setTaskNo(locOfWms.getTaskNo()); job.setBatchNo(locOfWms.getBatchNo()); job.setStaNo(inSta.getTargetSta()+""); job.setJobSts(4); job.setWmsTime(new Date()); jobService.updateById(job); }else { log.info("WMS未返回库位信息,{}",applyInDto); } } } } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } zy-acs-cv/src/main/java/com/zy/core/operation/handler/ClearOperationHandler.java
@@ -48,7 +48,7 @@ } @Override public void execute(CtuOperationConfig config) { public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { @@ -68,7 +68,7 @@ } if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) { Job job = jobService.getJobByJobNo(staProtocol.getWorkNo()); if (job != null && job.getJobSts() >= 5) { if (job != null && job.getJobSts() >= 6) { String s = ctuMainService.checkStationStatus(takeSta.getStaNo()); staProtocol.setWorkNo(0); staProtocol.setStaNo(0); zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeUserOperationHandler.java
@@ -46,7 +46,7 @@ } @Override public void execute(CtuOperationConfig config) { public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeWmsOperationHandler.java
File was deleted zy-acs-cv/src/main/java/com/zy/core/operation/handler/InOperationHandler.java
@@ -50,7 +50,7 @@ } @Override public void execute(CtuOperationConfig config) { public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { @@ -71,20 +71,19 @@ if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) { //StaProtocol targetStaProtocol = devpThread.getStation().get(inSta.getTargetSta()); //if (targetStaProtocol.getWorkNo() == 0 && targetStaProtocol.isAutoing() && !targetStaProtocol.isLoading()) { Job job = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), 2); Job job = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), 4); if (job != null) { Integer workNo = staProtocol.getWorkNo(); Integer targetSta = inSta.getTargetSta(); staProtocol.setWorkNo(0); staProtocol.setStaNo(0); MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); Thread.sleep(1500L); // staProtocol.setWorkNo(0); // staProtocol.setStaNo(0); // MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); // Thread.sleep(1500L); staProtocol.setWorkNo(workNo); staProtocol.setStaNo(targetSta); boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); if (result) { job.setJobSts(4); job.setInTime(new Date()); job.setJobSts(5); if (!jobService.updateById(job)) { throw new CoolException("更新输送线任务失败," + " - " + staProtocol.getWorkNo()); } zy-acs-cv/src/main/java/com/zy/core/operation/handler/OutOperationHandler.java
@@ -49,7 +49,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void execute(CtuOperationConfig config) { public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { @@ -78,7 +78,7 @@ staProtocol.setWorkNo(workNo); staProtocol.setStaNo(releaseSta.getTargetSta()); Job job = new Job(); job.setSeqNum(seqNum); job.setTaskNo(seqNum); job.setJobNo(workNo); job.setJobSts(2); if (!jobService.insert(job)) { zy-acs-cv/src/main/java/com/zy/core/operation/handler/SendTaskOperationHandler.java
@@ -1,6 +1,11 @@ package com.zy.core.operation.handler; import com.core.common.Cools; import com.core.common.DateUtils; import com.zy.asrs.controller.vo.OpenBusSubmitParam; import com.zy.asrs.controller.vo.TaskDto; import com.zy.asrs.entity.Job; import com.zy.asrs.service.CtuMainService; import com.zy.asrs.service.JobService; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.ConveyorStateType; @@ -15,6 +20,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 发送任务给RCS @@ -31,13 +40,16 @@ private JobService jobService; @Autowired private CtuMainService ctuMainService; @Override public ConveyorStateType getType() { return ConveyorStateType.SENDTASK; } @Override public void execute(CtuOperationConfig config) { public synchronized void execute(CtuOperationConfig config) { try { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { @@ -57,9 +69,27 @@ } if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) { Job job = jobService.getJobByJobNo(staProtocol.getWorkNo()); if (job != null && job.getJobSts() == 4) { job.setJobSts(5); if (job != null && job.getJobSts() == 5) { OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam(); openBusSubmitParam.setBatchNo(DateUtils.convert(new Date())); List<TaskDto> taskList = new ArrayList<>(); TaskDto taskDto = new TaskDto(); taskDto.setTaskNo(job.getTaskNo()); taskDto.setBatchNo(job.getBatchNo()); taskDto.setOriSta(job.getStaNo()); taskDto.setDestLoc(job.getLoc()); //TODO taskDto.setPriority(9527); taskList.add(taskDto); openBusSubmitParam.setTasks(taskList); if (ctuMainService.sendTask(openBusSubmitParam)) { job.setJobSts(7); job.setRcsTime(new Date()); jobService.updateById(job); log.info("任务发送给RCS成功," + job.getTaskNo() + " - " + job.getJobNo()); } else { log.info("任务发送给RCS失败," + job.getTaskNo() + " - " + job.getJobNo()); } } } } zy-acs-cv/src/main/resources/application.yml
@@ -30,10 +30,10 @@ max-retries: 3 retry-delay: 500 - type: FAKEUSER mark: 30 mark: 20 max-retries: 2 retry-delay: 300 - type: FAKEWMS - type: APPLYLOC mark: 30 max-retries: 2 retry-delay: 300 @@ -42,7 +42,7 @@ max-retries: 3 retry-delay: 500 - type: CLEARSIGNAL mark: 60 mark: 50 max-retries: 2 retry-delay: 300 - type: SENDTASK zy-acs-cv/src/main/resources/mapper/JobMapper.xml
@@ -5,10 +5,13 @@ <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.Job"> <id column="id" property="id"/> <result column="seq_num" property="seqNum"/> <result column="task_no" property="taskNo"/> <result column="batch_no" property="batchNo"/> <result column="loc" property="loc"/> <result column="sta_no" property="staNo"/> <result column="job_no" property="jobNo"/> <result column="job_sts" property="jobSts"/> <result column="in_time" property="inTime"/> <result column="wms_time" property="wmsTime"/> <result column="rcs_time" property="rcsTime"/> <result column="status" property="status"/> <result column="deleted" property="deleted"/> @@ -20,10 +23,10 @@ <result column="memo" property="memo"/> </resultMap> <select id="getJobBySeqNum" resultMap="BaseResultMap"> <select id="getJobByTaskNo" resultMap="BaseResultMap"> select * from cv_job where seq_num = #{seqNum} where task_no = #{seqNum} </select>