Blame view

src/main/java/com/huaheng/api/wcs/controller/EmptyContainerController.java 13.2 KB
游杰 authored
1
2
3
package com.huaheng.api.wcs.controller;
游杰 authored
4
import com.alibaba.fastjson.JSONArray;
游杰 authored
5
6
7
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.wcs.domain.ManyEmptyDomain;
8
9
import com.huaheng.api.wcs.domain.WcsTask;
import com.huaheng.api.wcs.service.taskAssignService.TaskAssignService;
游杰 authored
10
11
12
13
14
import com.huaheng.api.wcs.service.warecellAllocation.LocationAllocationService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
游杰 authored
15
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
游杰 authored
16
17
18
19
20
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.constant.BusinessType;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
游杰 authored
21
import com.huaheng.pc.config.address.service.AddressService;
游杰 authored
22
23
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
24
25
import com.huaheng.pc.config.containerType.domain.ContainerType;
import com.huaheng.pc.config.containerType.service.ContainerTypeService;
26
27
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
游杰 authored
28
29
30
31
32
33
34
35
import com.huaheng.pc.config.locationHigh.domain.LocationHigh;
import com.huaheng.pc.config.locationHigh.service.LocationHighService;
import com.huaheng.pc.config.locationType.domain.LocationType;
import com.huaheng.pc.config.locationType.service.LocationTypeService;
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.config.zone.service.ZoneService;
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
游杰 authored
36
37
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
游杰 authored
38
import com.huaheng.pc.task.taskHeader.service.WorkTaskService;
hh authored
39
//import com.sun.javafx.tk.Toolkit;
游杰 authored
40
import org.apache.shiro.authz.annotation.RequiresPermissions;
游杰 authored
41
import org.springframework.beans.factory.annotation.Autowired;
游杰 authored
42
43
44
45
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
游杰 authored
46
import java.util.ArrayList;
游杰 authored
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/API/WMS/v2")
public class EmptyContainerController extends BaseController {

    @Resource
    private WorkTaskService workTaskService;
    @Resource
    private LocationAllocationService allocationService;
    @Resource
    private ConfigService configService;
    @Resource
    private ZoneService zoneService;
    @Resource
64
65
    private LocationService locationService;
    @Resource
游杰 authored
66
67
68
69
70
    private LocationTypeService locationTypeService;
    @Resource
    private LocationHighService locationHighService;
    @Resource
    private ContainerService containerService;
71
72
    @Resource
    private ContainerTypeService containerTypeService;
游杰 authored
73
74
75
76
    @Autowired
    private AddressService addressService;
    @Resource
    private TaskHeaderService taskHeaderService;
77
78
    @Resource
    private TaskAssignService taskAssignService;
游杰 authored
79
80
81
    @Resource
    private InventoryHeaderService inventoryHeaderService;
游杰 authored
82
    /**
游杰 authored
83
     * 生成空托盘组入库任务
84
     *
游杰 authored
85
86
87
88
89
90
     * @return
     */
    @PostMapping("/manyEmptyIn")
    @Log(title = "任务-任务管理", operating = "生成空托盘组入库任务", action = BusinessType.INSERT)
    @ResponseBody
    @Transactional
91
    @ApiLogger(apiName = "manyEmptyIn", from = "ROBOT")
游杰 authored
92
    public AjaxResult manyEmptyIn(@RequestBody ManyEmptyDomain manyEmptyDomain) {
游杰 authored
93
94
95
96
97
98
99
100
101
102
103
104
105
        AjaxResult ajaxResult = handleMultiProcess(new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = innerManyEmptyIn(manyEmptyDomain);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    /**
     * 生成空托盘组出库任务
106
     *
游杰 authored
107
108
109
110
111
112
     * @return
     */
    @PostMapping("/manyEmptyOut")
    @Log(title = "任务-任务管理", operating = "生成空托盘组出库任务", action = BusinessType.INSERT)
    @ResponseBody
    @Transactional
113
    @ApiLogger(apiName = "manyEmptyOut", from = "ROBOT")
游杰 authored
114
115
116
117
118
119
120
121
122
123
124
125
    public AjaxResult manyEmptyOut(@RequestBody ManyEmptyDomain manyEmptyDomain) {
        AjaxResult ajaxResult = handleMultiProcess(new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = innerManyEmptyOut(manyEmptyDomain);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    private AjaxResult innerManyEmptyIn(@RequestBody ManyEmptyDomain manyEmptyDomain) {
126
        if (manyEmptyDomain == null) {
游杰 authored
127
128
129
            throw new ServiceException("空托盘组参数不对!");
        }
        String containerCode = manyEmptyDomain.getContainerCode();
游杰 authored
130
        String warehouseCode = manyEmptyDomain.getWarehouseCode();
游杰 authored
131
132
        String area = manyEmptyDomain.getArea();
        String roadWay = manyEmptyDomain.getRoadWay();
游杰 authored
133
        List<String> roadWays = new ArrayList<>();
134
        String[] str = roadWay.split(",");
肖超群 authored
135
        roadWays = Arrays.asList(str);
游杰 authored
136
137
138
139
140
141
142
143
144
        String value = configService.getKey(QuantityConstant.RULE_ALLOCATION);
        String height = manyEmptyDomain.getHeight();
        if (StringUtils.isEmpty(value)) {
            return AjaxResult.error("未绑定定位规则");
        }
        int allocationRule = Integer.parseInt(value);
        LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
        zoneLambdaQueryWrapper.eq(Zone::getArea, area);
        Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
145
        if (zone == null) {
游杰 authored
146
147
            return AjaxResult.error("分配库位时,没有找到库区");
        }
游杰 authored
148
149
150
151
152
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode)
                .eq(TaskHeader::getWarehouseCode, warehouseCode)
                .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
153
        if (taskHeader != null) {
游杰 authored
154
155
            return AjaxResult.success("已经生成空托盘组任务");
        }
游杰 authored
156
157
158
159
160
        //查询满足条件的库位类型
        LambdaQueryWrapper<LocationType> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(LocationType::getZoneCode, zone.getCode())
                .eq(LocationType::getWarehouseCode, warehouseCode);
        List<LocationType> locationTypeList = locationTypeService.list(lambdaQueryWrapper);
161
        if (locationTypeList == null) {
游杰 authored
162
163
164
165
            return AjaxResult.error("分配库位时,没有找到库位类型");
        }
        List<String> locationTypeCodeList = locationTypeList.stream().
                map(t -> t.getCode()).collect(Collectors.toList());
游杰 authored
166
        int highHeight = Float.valueOf(height).intValue();
游杰 authored
167
        LambdaQueryWrapper<LocationHigh> locationHighLambdaQueryWrapper = Wrappers.lambdaQuery();
游杰 authored
168
        locationHighLambdaQueryWrapper.eq(LocationHigh::getHighLevel, highHeight)
游杰 authored
169
170
171
172
                .in(LocationHigh::getLocationTypeCode, locationTypeCodeList);
        LocationHigh locationHigh = locationHighService.getOne(locationHighLambdaQueryWrapper);
        int high = locationHigh.getHigh();
        String locationCode = allocationService.allocation(allocationRule, locationTypeCodeList, high, area,
173
                roadWays, warehouseCode, containerCode, null, 3, 1);
174
        if (locationCode == null) {
游杰 authored
175
176
177
178
179
            return AjaxResult.error("分配库位时,没有找到库位");
        }
        return workTaskService.createManyEmptyIn(containerCode, locationCode, warehouseCode);
    }
游杰 authored
180
181

    private AjaxResult innerManyEmptyOut(ManyEmptyDomain manyEmptyDomain) {
182
        if (manyEmptyDomain == null) {
游杰 authored
183
184
            throw new ServiceException("空托盘组参数不对!");
        }
游杰 authored
185
        String warehouseCode = manyEmptyDomain.getWarehouseCode();
186
        String area = manyEmptyDomain.getArea();
游杰 authored
187
        String port = manyEmptyDomain.getPort();
188
189
190
191
192
        LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
        containerLambdaQueryWrapper.eq(Container::getStatus, QuantityConstant.STATUS_CONTAINER_MANY)
                .eq(Container::getWarehouseCode, warehouseCode);
        List<Container> containerList = containerService.list(containerLambdaQueryWrapper);
        List<Container> removeContainerList = new ArrayList<>();
193
194
        if (containerList != null && containerList.size() > 0) {
            for (Container container : containerList) {
195
196
                String locationCode = container.getLocationCode();
                Location location = locationService.getLocationByCode(locationCode, warehouseCode);
197
                if (!location.getArea().equals(area)) {
198
199
200
201
202
203
204
205
206
207
                    removeContainerList.add(container);
                }
            }
        }
        LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
        zoneLambdaQueryWrapper.eq(Zone::getArea, area);
        Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                .eq(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT)
游杰 authored
208
                .eq(TaskHeader::getPort, port)
209
210
                .eq(TaskHeader::getZoneCode, zone.getCode());
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
211
        if (taskHeader != null) {
212
213
214
215
216
217
218
219
220
            WcsTask wcsTask = new WcsTask();
            wcsTask.setTaskType(taskHeader.getTaskType());
            wcsTask.setTaskNo(String.valueOf(taskHeader.getId()));
            wcsTask.setContainerCode(taskHeader.getContainerCode());
            wcsTask.setWarehouseCode(warehouseCode);
            wcsTask.setFromLocationCode(taskHeader.getFromLocation());
            wcsTask.setPlatform(QuantityConstant.PLATFORM_WMS);
            wcsTask.setPriority(1000);
            wcsTask.setTaskStatus(taskHeader.getStatus());
游杰 authored
221
            wcsTask.setToPort(port);
222
223
224
225
            wcsTask = taskAssignService.switchTaskTypeToWcs(wcsTask);
            return AjaxResult.success(wcsTask);
        }
        containerList.removeAll(removeContainerList);
226
        if (!(containerList != null && containerList.size() > 0)) {
游杰 authored
227
            return AjaxResult.error("没有找到合适的空托盘组!");
游杰 authored
228
        }
229
        String containerCode = containerList.get(0).getCode();
游杰 authored
230
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
231
        if (container == null) {
游杰 authored
232
233
            throw new ServiceException("没有找到托盘“");
        }
234
        return workTaskService.createManyEmptyOut(containerCode, warehouseCode, port);
游杰 authored
235
    }
游杰 authored
236
237
238

    /**
     * 生成空托出库任务
239
     *
游杰 authored
240
241
242
243
244
     * @return
     */
    @PostMapping("/wcsCallEmptyOut")
    @Log(title = "任务-任务管理", operating = "生成空托出库任务", action = BusinessType.INSERT)
    @ResponseBody
245
    @ApiLogger(apiName = "生成空托出库任务", from = "WCS")
游杰 authored
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
    public AjaxResult wcsCallEmptyOut(@RequestBody ManyEmptyDomain manyEmptyDomain) {
        AjaxResult ajaxResult = handleMultiProcess(new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = innerWcsCallEmptyOut(manyEmptyDomain);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    private AjaxResult innerWcsCallEmptyOut(ManyEmptyDomain manyEmptyDomain) {
        String warehouseCode = manyEmptyDomain.getWarehouseCode();
        String area = manyEmptyDomain.getArea();
        String port = manyEmptyDomain.getPort();
261
        if (warehouseCode == null) {
游杰 authored
262
263
            return AjaxResult.error("warehouseCode 不能为空");
        }
264
        if (area == null) {
游杰 authored
265
266
            return AjaxResult.error("area 不能为空");
        }
267
        if (port == null) {
游杰 authored
268
269
270
271
272
273
            return AjaxResult.error("port 不能为空");
        }
        LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
        zoneLambdaQueryWrapper.eq(Zone::getWarehouseCode, warehouseCode)
                .eq(Zone::getArea, area);
        Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
274
        if (zone == null) {
游杰 authored
275
276
277
278
            return AjaxResult.error("area不正确,没有找到对应区域");
        }
        String zoneCode = zone.getCode();
        List<Location> list = containerService.getEmptyContainerInLocation(zoneCode,
279
280
                "", "", warehouseCode);
        if (list == null || list.size() <= 0) {
游杰 authored
281
282
283
284
285
286
287
            return AjaxResult.error("没有找到空托盘");
        }
        Location location = list.get(0);
        String containerCode = location.getContainerCode();
        String locationCode = location.getCode();
        return inventoryHeaderService.createEmptyOut(containerCode, locationCode, port, warehouseCode);
    }
游杰 authored
288
}