| | |
| | | .tabs-fixed {
|
| | | width: 100%;
|
| | | position: relative;
|
| | | top: -64px;
|
| | | left: -24px;
|
| | | /*top: -64px;*/
|
| | | /*left: -24px;*/
|
| | | padding: 10px;
|
| | | display: flex;
|
| | | }
|
| | |
|
| | |
| | | <div ref="pixiView">
|
| | |
|
| | | </div>
|
| | |
|
| | | <!--输出操作和FPS-->
|
| | | <div style="position: absolute;top: 0px;right: 10px;user-select: none;">
|
| | | <div>FPS:{{ mapFps }}</div>
|
| | | <a-button @click="drawerOper = true">操作</a-button>
|
| | | </div>
|
| | |
|
| | | <!--输出操作和FPS-->
|
| | | <div style="position: absolute;bottom: 20px;left: 20px;user-select: none;">
|
| | | <a-button type="dashed" @click="containerAppViewCenter">
|
| | |
| | | {
|
| | | title: formatMessage('db.man_order_detl.batch', '批号'),
|
| | | dataIndex: 'batch',
|
| | | width: 110,
|
| | | width: 140,
|
| | | ellipsis: true,
|
| | | ...getColumnSearchProps('batch'),
|
| | | customCell: (_, index) => {
|
| | |
| | | <script setup>
|
| | | import { nextTick, ref, inject, onMounted } from 'vue';
|
| | | import { nextTick, ref, inject, onMounted, h, reactive } from 'vue';
|
| | | import { useRouter } from "vue-router";
|
| | | import { get, post, postForm } from '@/utils/request.js'
|
| | | import { logout } from '@/config.js';
|
| | | import * as Icons from "@ant-design/icons-vue";
|
| | | import { message } from 'ant-design-vue';
|
| | | // import type { MenuMode, MenuTheme } from 'ant-design-vue';
|
| | | // import { ItemType } from 'ant-design-vue';
|
| | |
|
| | | import {
|
| | | MenuUnfoldOutlined,
|
| | | MenuFoldOutlined,
|
| | |
| | | ...Icons,
|
| | | };
|
| | |
|
| | |
|
| | |
|
| | | onMounted(() => {
|
| | | let name = router.currentRoute.value.name;
|
| | | let path = router.currentRoute.value.path;
|
| | |
| | | }
|
| | | })
|
| | |
|
| | |
|
| | | const state = reactive({
|
| | | rootSubmenuKeys: [],
|
| | | openKeys: ["/"],
|
| | | selectedKeys: [],
|
| | | });
|
| | |
|
| | | getMenu()
|
| | | function getMenu() {
|
| | | get('/api/auth/menu', {}).then((result) => {
|
| | | menuCache.value = result.data.data;
|
| | | let routes = menuCache.value.map(item =>{
|
| | | return item.route
|
| | | })
|
| | | routes.unshift('/')
|
| | | state.rootSubmenuKeys = routes
|
| | | console.log(state.rootSubmenuKeys)
|
| | | })
|
| | | }
|
| | |
|
| | |
| | | selectedKeys.value = [item.key]
|
| | |
|
| | | // open menu
|
| | | let arr = item.key.split("/");
|
| | | let key = '/' + arr[1];
|
| | | openKeys.value = [key]
|
| | | // let arr = item.key.split("/");
|
| | | // let key = '/' + arr[1];
|
| | | // openKeys.value = [key]
|
| | | }
|
| | |
|
| | | const switchLocale = async (locale) => {
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | const onOpenChange = (openKeys) => {
|
| | | const latestOpenKey = openKeys.find(
|
| | | (key) => state.openKeys.indexOf(key) === -1
|
| | | );
|
| | | if (state.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
|
| | | state.openKeys = openKeys
|
| | | } else {
|
| | | state.openKeys = latestOpenKey ? [latestOpenKey] : [];
|
| | | }
|
| | | console.log(state.openKeys)
|
| | | }
|
| | |
|
| | |
|
| | | </script>
|
| | |
|
| | | <template>
|
| | |
| | | <div class="sider-style">
|
| | | <a-layout-sider class="main-sider" v-model:collapsed="collapsed" :trigger="null" theme="dark">
|
| | | <div class="logo" />
|
| | | <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" @select="menuSelect" theme="dark"
|
| | | mode="inline" >
|
| | | <a-menu v-model:openKeys="state.openKeys" v-model:selectedKeys="state.selectedKeys" @select="menuSelect" theme="dark"
|
| | | mode="inline" @openChange="onOpenChange">
|
| | | <div>
|
| | | <a-menu-item key="/" name="主页">
|
| | | <HomeOutlined /> {{ formatMessage('common.home', '主页') }}
|
| | |
| | | </script>
|
| | |
|
| | | <template>
|
| | | <div style="display: flex;">
|
| | | <a-row>
|
| | | <a-col :span="5">
|
| | | <a-card :title="formatMessage('db.man_loc_area_type.type_id', '库区类型')" style="flex: 3;margin-right: 30px;">
|
| | | <a-input v-model:value="searchLocAreaType" @change="handleLocAreaTypeDept" :placeholder="formatMessage('page.input', '请输入')"
|
| | | style="margin-bottom: 8px" />
|
| | |
| | | </template>
|
| | | </a-tree>
|
| | | </a-card>
|
| | |
|
| | | </a-col>
|
| | | <a-col :span="19">
|
| | | <a-card style="flex: 10;">
|
| | | <EditView ref="editChild" @tableReload="handleTableReload" />
|
| | | <div class="table-header">
|
| | |
| | | </template>
|
| | | </a-table>
|
| | | </a-card>
|
| | | </div>
|
| | | </a-col>
|
| | | </a-row>
|
| | | </template>
|
| | |
|
| | | <style></style>
|
| | |
| | | {
|
| | | title: formatMessage('db.man_wait_pakin.matnr', '商品编号'),
|
| | | dataIndex: 'matnr',
|
| | | width: 140,
|
| | | width: 180,
|
| | | ellipsis: true,
|
| | | ...getColumnSearchProps('matnr'),
|
| | | },
|
| | |
| | | import io.netty.util.internal.StringUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | @Slf4j |
| | | @RestController |
| | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 容器流动通知 |
| | | * @param code 容器编码 |
| | | * @return |
| | | */ |
| | | @GetMapping("/container/converyor/{code}") |
| | | public R containerConveyor(@PathVariable String code) { |
| | | if (StringUtil.isNullOrEmpty(code)) { |
| | | return R.error("容器编码不能为空!!!"); |
| | | } |
| | | |
| | | return wcsApiService.containerConveryor(code); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | */ |
| | | private String batch; |
| | | |
| | | /** |
| | | * 库存 |
| | | */ |
| | | private Integer stock; |
| | | |
| | | } |
| | |
| | | import org.springframework.transaction.annotation.Transactional;
|
| | | import org.springframework.web.client.RestTemplate;
|
| | |
|
| | | import java.util.Collection;
|
| | | import java.util.Collections;
|
| | | import java.util.Comparator;
|
| | | import java.util.List;
|
| | | import java.util.stream.Collectors;
|
| | |
| | | * 出库任务---通知容器流动
|
| | | * 每隔3秒,获取当前出库任务列表状态为COMPLETE_OUT的任务,并通知ESS流动输送线
|
| | | */
|
| | | @Scheduled(cron = "0/5 * * * * ? ")
|
| | | // @Scheduled(cron = "0/5 * * * * ? ")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public void conveyorToNotify() {
|
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
|
| | |
| | | // CommonReponse commonReponse = JSON.toJavaObject(JSON.parseObject(exchange.getBody()), CommonReponse.class);
|
| | | // if (commonReponse.getCode() == 0) {
|
| | | //流动通知下发完成后,修改任务状态为输送线流动中。。
|
| | | taskService.update(new LambdaUpdateWrapper<Task>()
|
| | | .eq(Task::getId, task.getId())
|
| | | .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id));
|
| | | // taskService.update(new LambdaUpdateWrapper<Task>()
|
| | | // .eq(Task::getId, task.getId())
|
| | | // .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id));
|
| | |
|
| | | // log.info(task.getTaskNo() + "下发流动通知" + commonReponse.getMsg());
|
| | | // } else {
|
| | |
| | | //获取当前任务档中,所有为待出库状态的任务档,按时间升序排列
|
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
|
| | | .ge(Task::getTaskType, 101) //TODO 如何确认是101,还是103
|
| | | .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT.id))
|
| | | .stream().sorted(Comparator.comparing(Task::getTaskSts))
|
| | | .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT.id));
|
| | | if (tasks.isEmpty()) {
|
| | | return;
|
| | | }
|
| | | tasks.stream().sorted(Comparator.comparing(Task::getTaskSts))
|
| | | .collect(Collectors.toList());
|
| | |
|
| | | // 数据组装
|
| | |
| | | import com.zy.asrs.wms.apis.wcs.entity.response.SowSeeds; |
| | | import com.zy.asrs.wms.apis.wcs.services.WaveManagentService; |
| | | import com.zy.asrs.wms.asrs.entity.Task; |
| | | import com.zy.asrs.wms.asrs.entity.enums.TaskStsType; |
| | | import com.zy.asrs.wms.asrs.entity.param.WaveSeedReviewParam; |
| | | import com.zy.asrs.wms.asrs.service.TaskService; |
| | | import com.zy.asrs.wms.asrs.service.WaveSeedService; |
| | |
| | | |
| | | @Override |
| | | public R getTask() { |
| | | List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().ge(Task::getTaskType, 101)); |
| | | List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id)); |
| | | return R.ok(list); |
| | | } |
| | | |
| | |
| | | import org.springframework.stereotype.Service;
|
| | | import org.springframework.transaction.annotation.Transactional;
|
| | |
|
| | | import java.util.Date;
|
| | | import java.util.List;
|
| | |
|
| | | @Slf4j
|
| | |
| | | .set(Task::getOriginLoc, arrivedParam.getSlotCode())
|
| | | .eq(Task::getBarcode, arrivedParam.getContainerCode()));
|
| | | } else {
|
| | | //容器到达时更新任务状态为:入库完成,定时任务根据状态码更新库存
|
| | | //当状态为入库完成时,更新库存信息
|
| | | // boolean update = taskService.update(new LambdaUpdateWrapper<Task>()
|
| | | // .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id)
|
| | | // .set(Task::getOriginLoc, arrivedParam.getSlotCode())
|
| | | // .eq(Task::getBarcode, arrivedParam.getContainerCode()));
|
| | | //fixme 容器到达状态更改为播种中...
|
| | | boolean update = taskService.update(new LambdaUpdateWrapper<Task>()
|
| | | .set(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_ARRIVED.id)
|
| | | .set(Task::getTaskSts, TaskStsType.WAVE_SEED.id)
|
| | | .set(Task::getOriginLoc, arrivedParam.getSlotCode())
|
| | | .eq(Task::getBarcode, arrivedParam.getContainerCode()));
|
| | |
|
| | |
| | | }
|
| | | } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event)) { //上报完成状态
|
| | | if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD.id || task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id) {
|
| | | //出库任务完成,修改状态为播种中,定时任务生成播种波次
|
| | | taskStsType = TaskStsType.WAVE_SEED;
|
| | | //出库任务完成,修改状态为容器到达,定时任务生成播种波次
|
| | | taskStsType = TaskStsType.WCS_EXECUTE_OUT_TASK_DONE;
|
| | | } else {
|
| | | String errMsg = "任务编号:" + task.getTaskNo() + "状态为不匹配," + "不能执行:" + TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.desc + "任务";
|
| | | log.error(errMsg);
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 容器流动通知
|
| | | * @param code
|
| | | * @return
|
| | | */
|
| | | @Override
|
| | | public R containerConveryor(String code) {
|
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code));
|
| | | if (tasks.isEmpty()) {
|
| | | return R.error("容器码任务不存在!!");
|
| | | } else if (tasks.size() > 1){
|
| | | return R.error("容器码任务错误!!");
|
| | | }
|
| | | tasks.forEach(task -> {
|
| | | // try {
|
| | | // ConveyorStarParam conveyorStarParam = new ConveyorStarParam();
|
| | | // conveyorStarParam.setSlotCode(task.getOriginLoc())
|
| | | // .setContainerCode(task.getBarcode());
|
| | | // if (task.getTaskType() == 101) { //任务类型为101全盘出库,直接取下容器,传200
|
| | | // conveyorStarParam.setDirection("200");
|
| | | // } else if (task.getTaskType() == 103) { //如果为任务类型为103,需走回库操作,传100
|
| | | // conveyorStarParam.setDirection("100");
|
| | | // }
|
| | | // //调用三方接口,将任务推送至ESS平台
|
| | | // MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
|
| | | // // 设置请求参数
|
| | | // params.add("params", JSONObject.toJSONString(conveyorStarParam));
|
| | | // log.info("请求地址:{},请求参数:{}", Constant.CONVEYOR_START, JSONObject.toJSONString(conveyorStarParam));
|
| | | // HttpHeaders headers = new HttpHeaders();
|
| | | // headers.add("Content-Type", "application/json");
|
| | | // HttpEntity httpEntity = new HttpEntity<>(params, headers);
|
| | | // // 请求
|
| | | // ResponseEntity<String> exchange = restTemplate.exchange(Constant.CONVEYOR_START, HttpMethod.POST, httpEntity, String.class);
|
| | | // log.info("下发流动通知 返回结果:{}", exchange);
|
| | | // if (exchange.getBody() == null) {
|
| | | // throw new CoolException("下发流动通知失败!!");
|
| | | // } else {
|
| | | // CommonReponse commonReponse = JSON.toJavaObject(JSON.parseObject(exchange.getBody()), CommonReponse.class);
|
| | | // if (commonReponse.getCode() == 0) {
|
| | | //流动通知下发完成后,修改任务状态为输送线流动中。。
|
| | | //TODO 判断任务是否为103拣料出库,103拣料流动后修改为4(RCS容器流动任务已下发)
|
| | | if (task.getTaskType() == 103) {
|
| | | workService.pickTask(task.getId());
|
| | | // taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()).set(Task::getTaskSts, TaskStsType.WCS_CONVEYOR_START))
|
| | | } else {
|
| | | taskService.update(new LambdaUpdateWrapper<Task>()
|
| | | .eq(Task::getId, task.getId())
|
| | | .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id));
|
| | | }
|
| | | // log.info(task.getTaskNo() + "下发流动通知" + commonReponse.getMsg());
|
| | | // } else {
|
| | | // throw new CoolException("下发流动通知失败!!");
|
| | | // }
|
| | | // }
|
| | | // } catch (Exception ex) {
|
| | | // log.error(ex.getMessage());
|
| | | // } finally {
|
| | | // //如果异常修改禁用状态
|
| | | // taskService.update(new LambdaUpdateWrapper<Task>().set(Task::getStatus, 0)
|
| | | // .set(Task::getUpdateTime, new Date())
|
| | | // .eq(Task::getId, task.getId()));
|
| | | // }
|
| | | });
|
| | | return R.ok();
|
| | | }
|
| | |
|
| | | }
|
| | |
| | |
|
| | | void receiveTaskStatus(TasksStatusCallbackParam callbackParam, String stockType, Long hostId);
|
| | |
|
| | | R containerConveryor(String code);
|
| | | }
|
| | |
| | | import com.zy.asrs.framework.common.Cools;
|
| | | import com.zy.asrs.framework.common.R;
|
| | | import com.zy.asrs.wms.asrs.entity.Order;
|
| | | import com.zy.asrs.wms.asrs.entity.WaitPakin;
|
| | | import com.zy.asrs.wms.asrs.entity.dto.OrderInfoDto;
|
| | | import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
|
| | | import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
|
| | | import com.zy.asrs.wms.asrs.service.MobileService;
|
| | | import com.zy.asrs.wms.asrs.service.OrderService;
|
| | | import com.zy.asrs.wms.asrs.service.WaitPakinService;
|
| | | import com.zy.asrs.wms.system.controller.BaseController;
|
| | | import com.zy.asrs.wms.system.entity.Host;
|
| | | import com.zy.asrs.wms.system.entity.User;
|
| | |
| | | import org.springframework.beans.factory.annotation.Autowired;
|
| | | import org.springframework.beans.factory.annotation.Value;
|
| | | import org.springframework.web.bind.annotation.*;
|
| | | import sun.nio.ch.IOStatus;
|
| | |
|
| | | import java.util.*;
|
| | |
|
| | |
| | | private OrderService orderService;
|
| | | @Autowired
|
| | | private MobileService mobileService;
|
| | | @Autowired
|
| | | private WaitPakinService waitPakinService;
|
| | |
|
| | | /**
|
| | | * 获取用户机构
|
| | |
| | | }
|
| | | Order order = orderService.selectByBarcode(barcode.get("barcode"));
|
| | |
|
| | | if (!(order.getOrderType() == 1)) {
|
| | | return R.error("非入库订单, 不可操作!!");
|
| | | }
|
| | | // if (order.getOrderSettle() > 2) {
|
| | | // return R.error("单据当前状态不可做入库操作!!");
|
| | | // }
|
| | | List<OrderInfoDto> orders = orderService.getDetlForOrderId(order.getId());
|
| | |
|
| | | return R.ok(orders);
|
| | | }
|
| | |
|
| | | /**
|
| | | * PDA扫码入库
|
| | | * 1. 绑定库位号与拖盘码
|
| | | * 2. 库位置为在库状态
|
| | | * @return
|
| | | */
|
| | | @PostMapping("matnr/in/barcode")
|
| | | public R pakinToStock(@RequestBody PakinOnShelvesParams shelvesParams) {
|
| | | if (StringUtil.isNullOrEmpty(shelvesParams.getBarcode())) {
|
| | | return R.error("拖盘码不能为空!!");
|
| | | }
|
| | | if (StringUtil.isNullOrEmpty(shelvesParams.getLoc())) {
|
| | | return R.error("库位不能为空!!");
|
| | | }
|
| | | //TODO 绑定库位,添加库位明细
|
| | |
|
| | | return R.ok();
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取拖码盘绑定商品
|
| | | * @return
|
| | | */
|
| | | @GetMapping("barcode/matnr/{code}")
|
| | | public R getAllGoods(@PathVariable String code) {
|
| | | if (!StringUtil.isNullOrEmpty(code)) {
|
| | | return R.error("托盘码不能为空!!");
|
| | | }
|
| | | List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, code).eq(WaitPakin::getIoStatus, 0));
|
| | |
|
| | | return R.ok(waitPakins);
|
| | | }
|
| | |
|
| | |
|
| | |
| | | QueryWrapper<Order> wrapper = new QueryWrapper<>();
|
| | |
|
| | | ArrayList<Long> types = new ArrayList<>();
|
| | | for (OrderType orderType : orderTypeService.list(new LambdaQueryWrapper<OrderType>().eq(OrderType::getType, 1))) {
|
| | | for (OrderType orderType : orderTypeService.list(new LambdaQueryWrapper<OrderType>().in(OrderType::getType, 1))) {
|
| | | types.add(orderType.getId());
|
| | | }
|
| | |
|
| | |
| | | import org.springframework.web.bind.annotation.*;
|
| | |
|
| | | import javax.servlet.http.HttpServletResponse;
|
| | | import java.util.ArrayList;
|
| | | import java.util.Arrays;
|
| | | import java.util.List;
|
| | | import java.util.Map;
|
| | | import java.util.*;
|
| | |
|
| | | @RestController
|
| | | @RequestMapping("/api")
|
| | |
| | | return R.ok().add(vos);
|
| | | }
|
| | |
|
| | |
|
| | | // @PreAuthorize("hasAuthority('asrs:orderType:list')")
|
| | | // @PostMapping("/orderType/all/list")
|
| | | // public R query(@RequestBody HashMap<String, Object> params) {
|
| | | // List<KeyValVo> vos = new ArrayList<>();
|
| | | // List<Integer> types = (List<Integer>) params.get("type");
|
| | | // String condition = (String) params.get("condition");
|
| | | // List<OrderType> orderTypes = orderTypeService.list(new LambdaQueryWrapper<OrderType>().like(!Cools.isEmpty(condition), OrderType::getName, condition).in(!types.isEmpty(), OrderType::getType, types));
|
| | | // orderTypes.forEach(item -> {
|
| | | // vos.add(new KeyValVo(item.getId(), item.getName()));
|
| | | // });
|
| | | //
|
| | | // return R.ok().add(vos);
|
| | | // }
|
| | |
|
| | | @PreAuthorize("hasAuthority('asrs:orderType:list')")
|
| | | @PostMapping("/orderType/export")
|
| | | public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
|
New file |
| | |
| | | package com.zy.asrs.wms.asrs.entity.enums; |
| | | |
| | | /** |
| | | * 订单入库类型 |
| | | */ |
| | | public enum OrderType { |
| | | //UTC 入库单 |
| | | UTC_IN_ORDER(1L, "手动入库单"), |
| | | //UTC 出库单 |
| | | UTC_OUT_ORDER(2L, "手动出库单"), |
| | | //平库入库单 |
| | | PK_IN_ORDER(3L, "平库入库单") |
| | | |
| | | ; |
| | | public Long id; |
| | | public String desc; |
| | | |
| | | OrderType(Long id, String desc) { |
| | | this.id = id; |
| | | this.desc = desc; |
| | | } |
| | | } |
| | |
| | |
|
| | | WCS_EXECUTE_OUT_CONVEYOR(107L, "RCS容器流动任务已下发"),
|
| | |
|
| | | GENERATE_WAVE_SEED(197L, "等待容器到达"),
|
| | | WAVE_SEED(198L, "播种中"),
|
| | |
|
| | | COMPLETE_OUT(199L, "出库完成"),
|
| | | UPDATED_OUT(200L, "库存更新完成"),
|
| | | ;
|
New file |
| | |
| | | package com.zy.asrs.wms.asrs.entity.param; |
| | | |
| | | import lombok.Data; |
| | | import lombok.experimental.Accessors; |
| | | |
| | | |
| | | /** |
| | | * 组拖上架请求参数 |
| | | */ |
| | | @Data |
| | | @Accessors(chain = true) |
| | | public class PakinOnShelvesParams { |
| | | /** |
| | | * 拖盘码 |
| | | */ |
| | | private String barcode; |
| | | /** |
| | | * 库位 |
| | | */ |
| | | private String loc; |
| | | } |
| | |
| | | import org.springframework.stereotype.Service;
|
| | |
|
| | | import java.util.*;
|
| | | import java.util.stream.Collectors;
|
| | |
|
| | | @Service("cacheSiteService")
|
| | | public class CacheSiteServiceImpl extends ServiceImpl<CacheSiteMapper, CacheSite> implements CacheSiteService {
|
| | |
| | |
|
| | | HashMap<Long, Double> stockMap = new HashMap<>();
|
| | | List<WaveSeed> waveSeeds = waveSeedService.list(new LambdaQueryWrapper<WaveSeed>().eq(WaveSeed::getOrderId, orderId));
|
| | | //fixme 校验当前订单是否完成播种,需要获取当前波次所有任务中A物料的执行数量是否等于订单的总量-已完成数量(anfme - qty) 或者 任务中已执行数量是否等订单中的执行数量 workQty = workQty
|
| | | List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
|
| | | //获取订单A所有明细物料
|
| | | // if (orderDetls.isEmpty()) {
|
| | | // throw new CoolException("订单明细不存在!!");
|
| | | // }
|
| | | // List<Long> matnrs = orderDetls.stream().map(OrderDetl::getMatId).collect(Collectors.toList());
|
| | | // orderDetls.forEach(orderDetl -> {
|
| | | //
|
| | | // });
|
| | | // List<WaveSeed> waveSeeds = waveSeedService.list(new LambdaQueryWrapper<WaveSeed>().eq(WaveSeed::getWaveId, order.getWaveId()));
|
| | | for (WaveSeed waveSeed : waveSeeds) {
|
| | | Double anfme = stockMap.get(waveSeed.getOrderDetlId());
|
| | | if (anfme == null) {
|
| | |
| | | stockMap.put(waveSeed.getOrderDetlId(), anfme);
|
| | | }
|
| | |
|
| | | List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
|
| | | // List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
|
| | | boolean check = true;
|
| | | for (OrderDetl orderDetl : orderDetls) {
|
| | | Double anfme = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
|
| | |
| | | package com.zy.asrs.wms.asrs.service.impl;
|
| | |
|
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
| | | import com.zy.asrs.framework.exception.CoolException;
|
| | | import com.zy.asrs.wms.asrs.entity.Order;
|
| | | import com.zy.asrs.wms.asrs.entity.WaitPakin;
|
| | | import com.zy.asrs.wms.asrs.entity.enums.LocTypeHeightType;
|
| | | import com.zy.asrs.wms.asrs.entity.enums.OrderType;
|
| | | import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
|
| | | import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
|
| | | import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
|
| | | import com.zy.asrs.wms.asrs.service.MobileService;
|
| | | import com.zy.asrs.wms.asrs.service.OrderService;
|
| | | import com.zy.asrs.wms.asrs.service.WaitPakinService;
|
| | | import com.zy.asrs.wms.asrs.service.WorkService;
|
| | | import com.zy.asrs.wms.system.entity.Host;
|
| | |
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | | import java.util.Objects;
|
| | |
|
| | | @Service
|
| | | public class MobileServiceImpl implements MobileService {
|
| | |
| | | @Autowired
|
| | | private HostService hostService;
|
| | |
|
| | | @Autowired
|
| | | private OrderService orderService;
|
| | |
|
| | |
|
| | | @Override
|
| | | @Transactional
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public boolean batchMergeOrders(BatchMergeOrdersParam ordersParam) {
|
| | | Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, ordersParam.getOrderNo()));
|
| | | if (Objects.isNull(order)) {
|
| | | throw new CoolException("订单不存在!!");
|
| | | }
|
| | |
|
| | | ArrayList<WaitPakin> waitPakins = new ArrayList<>();
|
| | | ordersParam.getOrderDetls().forEach(orderdetl -> {
|
| | |
| | | waitPakins.add(waitPakin);
|
| | | });
|
| | |
|
| | | /*** 项目下发流程 * 1. PDA组拖通知档* 2. 生成任务档* 3. 通过定时任务下发至ESS** */
|
| | | //组拖通知档
|
| | | waitPakins.forEach(pakin -> {
|
| | | waitPakinService.comb(pakin);
|
| | | });
|
| | |
|
| | | // UTC入库单据(非平库入库单据)
|
| | | if (order.getOrderType() != OrderType.PK_IN_ORDER.id) {
|
| | | /*** 项目下发流程 * 1. PDA组拖通知档* 2. 生成任务档* 3. 通过定时任务下发至ESS** */
|
| | | //生成任务档
|
| | | GeneratePakInParam generatePakInParam = new GeneratePakInParam();
|
| | | //当前没有起始站点,默认101, 高低位默认传低库位
|
| | |
| | | if (workService.generatePakIn(generatePakInParam)) {
|
| | | return true;
|
| | | }
|
| | | } else {
|
| | | //fixme 平库是否需要预约入库
|
| | | }
|
| | | return false;
|
| | | }
|
| | |
|
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
| | | import org.springframework.beans.factory.annotation.Autowired;
|
| | | import org.springframework.stereotype.Service;
|
| | | import org.springframework.transaction.annotation.Transactional;
|
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.Date;
|
| | |
| | | private WaveDetlLogService waveDetlLogService;
|
| | |
|
| | | @Override
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public void shipped(PlatformShippedParam param) {
|
| | | if (param == null) {
|
| | | throw new CoolException("参数不能为空");
|
| | |
| | | }
|
| | |
|
| | | @Override
|
| | | @Transactional
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public boolean comb(WaitPakin waitPakin) {
|
| | | //组托规则校验
|
| | | waitPakinRuleService.rule(waitPakin);
|
| | |
| | | }
|
| | |
|
| | | @Override
|
| | | @Transactional
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public boolean generatePakIn(GeneratePakInParam param) {
|
| | | List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode()));
|
| | | if (param.getTaskType() != 10 && waitPakins.isEmpty()) {
|
| | |
| | | }
|
| | |
|
| | | Task task = new Task();
|
| | | task.setTaskNo(this.generateTaskNo(taskType.getId()));//任务号
|
| | | task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务
|
| | | task.setTaskType(taskType.getId());//任务类型
|
| | | task.setIoPri(this.generateIoPri(taskType.getId()));//优先级
|
| | | //任务号
|
| | | task.setTaskNo(this.generateTaskNo(taskType.getId()));
|
| | | //1.生成入库任务
|
| | | task.setTaskSts(TaskStsType.GENERATE_IN.id);
|
| | | //任务类型
|
| | | task.setTaskType(taskType.getId());
|
| | | //优先级
|
| | | task.setIoPri(this.generateIoPri(taskType.getId()));
|
| | | task.setOriginLoc(null);
|
| | | task.setTargetLoc(loc.getLocNo());
|
| | | task.setOriginSite(param.getOriginSite());
|
| | | task.setTargetSite(null);
|
| | | task.setBarcode(param.getBarcode());//托盘码
|
| | | //托盘码
|
| | | task.setBarcode(param.getBarcode());
|
| | | boolean taskSave = taskService.save(task);
|
| | | if (!taskSave) {
|
| | | throw new CoolException("任务生成失败");
|
| | |
| | | TaskDetl taskDetl = new TaskDetl();
|
| | | taskDetl.setTaskId(task.getId());
|
| | | taskDetl.setTaskNo(task.getTaskNo());
|
| | | taskDetl.setAnfme(waitPakin.getAnfme());//数量
|
| | | taskDetl.setStock(0D);//库存
|
| | | taskDetl.setBatch(waitPakin.getDetl$().getBatch());//批号
|
| | | //数量
|
| | | taskDetl.setAnfme(waitPakin.getAnfme());
|
| | | //库存
|
| | | taskDetl.setStock(0D);
|
| | | //批号
|
| | | taskDetl.setBatch(waitPakin.getDetl$().getBatch());
|
| | | taskDetl.setBarcode(waitPakin.getBarcode());
|
| | | taskDetl.setOrderId(waitPakin.getOrderId());
|
| | | taskDetl.setOrderNo(waitPakin.getOrderNo());
|
| | |
| | | throw new CoolException("任务类型不可拣料");
|
| | | }
|
| | |
|
| | | if (task.getTaskSts() != 200) {
|
| | | if (task.getTaskSts() != 198) {
|
| | | throw new CoolException("当前状态不可拣料");
|
| | | }
|
| | |
|
| | |
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * 1. 定时拉取需要执行回库任务列表数据,
|
| | | * 2. 删除原始库位明细,原始库位状态置成O.空库
|
| | | * 3.
|
| | | */
|
| | | @Scheduled(cron = "0/3 * * * * ? ")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public void rollbackStock() {
|
| | | //获取需要执行回库的任务,更新库存信息
|
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskType, 53).eq(Task::getTaskSts, TaskStsType.WCS_CONVEYOR_START.id));
|
| | | if (tasks.isEmpty()) {
|
| | | return;
|
| | | }
|
| | | tasks.forEach(task -> {
|
| | | //删除原始库位明细,状态置为O.空库
|
| | | executeTask103(task);
|
| | | });
|
| | | //todo 需添加一个任务状态或临时状态,否则会一直轮循,程序报错(库位状态不处于R.出库预约)
|
| | | }
|
| | |
|
| | |
|
| | | @Scheduled(cron = "0/10 * * * * ? ")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public void outExecute() {
|
| | |
| | |
|
| | | }
|
| | |
|
| | | /**
|
| | | * 拣料再入库,根据任务目标库位,生成新库存信息
|
| | | * @param task
|
| | | */
|
| | | //拣料再入库
|
| | | private void executeTask53(Task task) {
|
| | | Long hostId = task.getHostId();
|
| | | //fixme
|
| | | //fixme 将任务当前
|
| | | // Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId));
|
| | | Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()));
|
| | | if (loc == null) {
|
| | |
| | | import org.springframework.transaction.annotation.Transactional;
|
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.Date;
|
| | | import java.util.List;
|
| | | import java.util.Optional;
|
| | | import java.util.*;
|
| | |
|
| | | @Component
|
| | | public class TaskWaveTimer {
|
| | |
| | | }
|
| | | //查询状态为容器到达状态所有任务单据
|
| | | // List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
|
| | | List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_ARRIVED.id));
|
| | | List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id));
|
| | | HashSet<String> sycMatnrs = new HashSet<>();
|
| | | if (taskList.isEmpty()) {
|
| | | // throw new CoolException("没有可播种任务!!");
|
| | | } else {
|
| | |
| | | for (TaskDetl taskDetl : taskDetls) {
|
| | | //分配订单
|
| | | Long waveId = taskDetl.getWaveId();
|
| | | //同一个物料只添加一次播种任务
|
| | | if(sycMatnrs.contains(taskDetl.getMatnr())) {
|
| | | continue;
|
| | | }
|
| | | sycMatnrs.add(taskDetl.getMatnr());
|
| | |
|
| | | List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId));
|
| | | if (list.isEmpty()) {
|
| | | continue;
|
| | |
| | | waveSeed.setOrderDetlId(orderDetl.getId());
|
| | | waveSeed.setWaveId(taskDetl.getWaveId()).setWaveNo(taskDetl.getWaveNo());
|
| | | waveSeed.setTaskDetlId(taskDetl.getId());
|
| | | //fixme 确认是否使用订单明细数量
|
| | | //为满足当前需求,经确认,改成订单数量
|
| | | waveSeed.setAnfme(orderDetl.getAnfme());
|
| | | waveSeed.setWorkQty(0D);
|
| | | waveSeed.setMatnr(taskDetl.getMatnr());
|
| | |
| | | if (!waveSeedService.save(waveSeed)) {
|
| | | throw new CoolException("波次播种创建失败");
|
| | | }
|
| | |
|
| | | cacheSite.setOrderId(orderDetl.getOrderId());
|
| | | cacheSite.setOrderNo(orderDetl.getOrderNo());
|
| | | cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
|
| | |
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | task.setTaskSts(TaskStsType.WAVE_SEED.id);
|
| | | task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.id);
|
| | | task.setUpdateTime(new Date());
|
| | | if (!taskService.updateById(task)) {
|
| | | throw new CoolException("任务更新失败");
|
| | |
| | | validation-timeout: 3000
|
| | | connection-test-query: select 1
|
| | | driver-class-name: com.mysql.cj.jdbc.Driver
|
| | | url: jdbc:mysql://127.0.0.1:3306/wms_dev?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
| | | # url: jdbc:mysql://127.0.0.1:3306/wms_dev_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
| | | url: jdbc:mysql://127.0.0.1:3306/wms_dev_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
| | | username: root
|
| | | password: 34821015
|
| | | # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
|