AcsServiceImpl.java
10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
package com.huaheng.api.acs.service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.api.acs.domain.AgvTask;
import com.huaheng.api.acs.domain.StateInfoUploadModel;
import com.huaheng.api.acs.mapper.AcsMapper;
import com.huaheng.common.constant.HttpConstant;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.pointPosition.domain.PointPosition;
import com.huaheng.pc.config.pointPosition.service.PointPositionService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
/**
* @ClassName AcsServiceImpl
* @Description TODO
* @Author Administrator
* @Date 2019/12/2615:38
*/
@Service
public class AcsServiceImpl extends ServiceImpl<AcsMapper,AgvTask> implements AcsService {
// public static final int STATUS_TASK_CARRY=100; 搬运任务
// public static final int STATUS_TASK_WALK=200; 行走任务
// public static final int STATUS_TASK_PICKUP=300;取货任务
// public static final int STATUS_TASK_Release=400;放货任务
// public static final String STATUS_POSITION_EMPTY="empty";
// public static final String STATUS_POSITION_SOME="some";
// public static final String STATUS_POSITION_FULL="full";
// public static final String STATUS_POSITION_LOCK="lock";
@Resource
private ConfigService configService;
@Resource
private AddressService addressService;
@Resource
private PointPositionService pointPositionService;
@Resource
private TaskHeaderService taskHeaderService;
@Resource
private ContainerService containerService;
//AGV信息上传
@Override
public AjaxResult StateInfoUpload(StateInfoUploadModel model) {
return null;
}
//AGV信息回传
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult TaskConfirm(AgvTask agvTask) { return null;}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult createAGVTask(AgvTask agvTask) {
//校验请求参数
checkAgvTaskPosition(agvTask);
//校验托盘是否存在任务及是否锁定
checkContainerAndPositionStatus(agvTask);
agvTask.setStatus(QuantityConstant.TASK_STATUS_BUILD);
agvTask.setCreatedBy(ShiroUtils.getLoginName());
agvTask.setCreatedTime(new Date());
agvTask.setUpdated(new Date());
agvTask.setUpdatedBy(ShiroUtils.getLoginName());
if (save(agvTask)) {
pointPositionService.updateStatus(agvTask.getFromPort(), QuantityConstant.STATUS_POSITION_LOCK, agvTask.getWarehouseCode());
pointPositionService.updateStatus(agvTask.getToPort(), QuantityConstant.STATUS_POSITION_LOCK, agvTask.getWarehouseCode());
} else {
throw new ServiceException("AGV创建任务失败");
}
return AjaxResult.success("执行生成任务成功", agvTask);
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult sendTaskToAGV(Integer[] AgvTaskIds) {
AgvTask task = null;
for (Integer taskId : AgvTaskIds) {
task = getById(taskId);
if (task.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
}
// 给AGV传递任务
AjaxResult ajaxResult = agvTaskAssign(task);
if (ajaxResult != null && ajaxResult.hasErr()) {
return AjaxResult.error(ajaxResult.getMsg());
}
//修改任务头表
task.setId(taskId);
task.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
task.setUpdated(new Date());
task.setUpdatedBy(ShiroUtils.getLoginName());
saveOrUpdate(task);
}
return AjaxResult.success("执行下发任务成功", task);
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult agvTaskAssign(AgvTask agvTask) {
//1、判断agvHeader是否为空
if (agvTask == null) {
return AjaxResult.error("Agv任务为空");
}
//2、判断必填字段是否满足
if (agvTask.getId() == null) {
return AjaxResult.error("Agv任务号Id为空");
}
if (agvTask.getTaskType() == null) {
return AjaxResult.error("Agv任务类型为空");
}
String containerCode = agvTask.getContainerCode();
if (StringUtils.isEmpty(containerCode)) {
return AjaxResult.error("Agv任务中容器为空");
}
String warehouseCode = agvTask.getWarehouseCode();
//3、转换实体,初始化Agv任务实体
agvTask.setTaskNo(String.valueOf(agvTask.getId()));
//4、发送数据
String value = configService.getKey(QuantityConstant.RULE_CONNECT_AGV);
int connectAGV = Integer.parseInt(value);
AjaxResult ajaxResult =new AjaxResult();
if (connectAGV == QuantityConstant.RULE_AGV_CONNECT) {
String url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN, warehouseCode, "1");
String JsonParam = JSON.toJSONString(agvTask);
System.out.println(JsonParam);
String result = HttpUtils.bodypost(url, JsonParam, warehouseCode);
if (StringUtils.isEmpty(result)) {
throw new ServiceException("接口地址错误或返回为空");
}
ajaxResult = JSON.parseObject(result, AjaxResult.class);
if (ajaxResult.getCode() != HttpConstant.OK) {
return AjaxResult.error(ajaxResult.getMsg());
}
}
return AjaxResult.success(agvTask);
}
//检查托盘和点位是否存在未完成的任务
private void checkContainerAndPositionStatus(AgvTask agvTask){
TaskHeader containerLKTaskStatus = taskHeaderService.getOne(new LambdaQueryWrapper<TaskHeader>()
.eq(TaskHeader::getContainerCode, agvTask.getContainerCode())
.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED));
AgvTask containerAgvTaskStatus = getOne(new LambdaQueryWrapper<AgvTask>()
.eq(AgvTask::getContainerCode, agvTask.getContainerCode())
.eq(AgvTask::getStatus, QuantityConstant.TASK_STATUS_COMPLETED));
if (StringUtils.isNotNull(containerLKTaskStatus)&&StringUtils.isNotNull(containerAgvTaskStatus)) {
throw new ServiceException("托盘"+agvTask.getContainerCode()+"存在未完成的任务");
}
Container containerStatus = containerService.getContainerByCode(agvTask.getContainerCode());
if(StringUtils.isNull(containerStatus)){
throw new ServiceException("托盘"+agvTask.getContainerCode()+"不存在");
}
if(QuantityConstant.STATUS_CONTAINER_LOCK.equals(containerStatus.getStatus())){
throw new ServiceException("托盘"+agvTask.getContainerCode()+"已锁定");
}
PointPosition pointPosition = pointPositionService.getOne(new LambdaQueryWrapper<PointPosition>()
.eq(PointPosition::getContainCode, agvTask.getContainerCode())
.eq(PointPosition::getStatus, QuantityConstant.STATUS_CONTAINER_LOCK));
if (pointPosition != null) {
throw new ServiceException("点位"+pointPosition.getPositionName()+"已锁定,托盘在此位置不能生成任务");
}
}
//根据任务类型检验参数
private void checkAgvTaskPosition(AgvTask agvTask){
if (StringUtils.isNull(agvTask)) {
throw new ServiceException("任务数据为空,请重新下发");
}
if (StringUtils.isEmpty(agvTask.getContainerCode())) {
throw new ServiceException("托盘为空");
}
if (StringUtils.isNull(agvTask.getTaskType())) {
throw new ServiceException("任务类型无");
}
int taskType = agvTask.getTaskType().intValue();
PointPosition sourcePosition = pointPositionService.getPositionByCode(agvTask.getFromPort(), agvTask.getWarehouseCode());
PointPosition desPosition = pointPositionService.getPositionByCode(agvTask.getToPort(), agvTask.getWarehouseCode());
if (taskType == QuantityConstant.STATUS_TASK_CARRY || taskType == QuantityConstant.STATUS_TASK_WALK
|| taskType == QuantityConstant.STATUS_TASK_PICKUP) {
if (StringUtils.isEmpty(agvTask.getFromPort())) {
throw new ServiceException("源点位为空");
}
if (StringUtils.isNull(sourcePosition)) {
throw new ServiceException("源点位:" + sourcePosition + "未找到");
}
if(sourcePosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
throw new ServiceException("源点位:" + sourcePosition + "禁用");
}
}
if (taskType == QuantityConstant.STATUS_TASK_CARRY || taskType == QuantityConstant.STATUS_TASK_WALK
|| taskType == QuantityConstant.STATUS_TASK_RELEASE) {
if (StringUtils.isEmpty(agvTask.getToPort())) {
throw new ServiceException("目标点位为空");
}
if (StringUtils.isNull(desPosition)) {
throw new ServiceException("目标点位:" + desPosition + "未找到");
}
if(desPosition.getStatus().equals(QuantityConstant.STATUS_POSITION_LOCK)){
throw new ServiceException("目标点位:" + sourcePosition + "禁用");
}
if (QuantityConstant.STATUS_CONTAINER_FULL.equals(desPosition.getStatus())) {
throw new ServiceException("目标点位:" + desPosition + "已满");
}
}
}
}