zy-asrs-admin/src/assets/main.css
@@ -3,29 +3,35 @@ .main { height: 100vh; overflow: hidden; overflow-y: scroll; } .main .main-sider { overflow-x: hidden; overflow-y: scroll; .main-sider { min-height: 100vh; /*overflow-y: scroll;*/ user-select: none; } .sider-style { min-height: 100vh; background: #01101E; } .main .main-sider::-webkit-scrollbar { .main-sider::-webkit-scrollbar { width: 5px !important; } .main .main-sider::-webkit-scrollbar-track { .main-sider::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 10px; } .main .main-sider::-webkit-scrollbar-thumb { .main-sider::-webkit-scrollbar-thumb { background: #888; border-radius: 10px; } .main .main-sider::-webkit-scrollbar-thumb:hover { .main-sider::-webkit-scrollbar-thumb:hover { background: #555; } @@ -215,9 +221,9 @@ } .content-view { margin: 45px 16px; margin-top: 60px; padding: 24px; margin: 10px 10px 20px; overflow: hidden; overflow-y: scroll; background: #fff; min-height: 280px; } zy-asrs-admin/src/components/order/order/orderOut.vue
@@ -52,16 +52,16 @@ { title: formatMessage('db.man_order.order_no', '订单编号'), dataIndex: 'orderNo', width: 140, width: 160, ellipsis: true, ...getColumnSearchProps('orderNo'), }, { title: formatMessage('db.man_order.order_time', '单据日期'), dataIndex: 'orderTime', width: 140, title: formatMessage('db.man_order.wave_no', '波次编号'), dataIndex: 'waveNo', width: 160, ellipsis: true, ...getColumnSearchProps('orderTime'), ...getColumnSearchProps('waveNo'), }, { title: formatMessage('db.man_order.order_type', '单据类型'), @@ -80,25 +80,25 @@ { title: formatMessage('db.man_order.ioPri', '优先级'), dataIndex: 'ioPri', width: 140, width: 100, ellipsis: true, ...getColumnSearchProps('ioPri'), }, { title: formatMessage('db.man_order.wave_no', '波次编号'), dataIndex: 'waveNo', width: 140, ellipsis: true, ...getColumnSearchProps('waveNo'), }, { title: formatMessage('db.man_order.status', '状态'), dataIndex: 'status$', width: 140, width: 80, ellipsis: true, ...getColumnSearchProps('status$'), }, { title: formatMessage('db.man_order.order_time', '单据日期'), dataIndex: 'orderTime', width: 160, ellipsis: true, ...getColumnSearchProps('orderTime'), }, { title: formatMessage('db.man_order.create_time', '添加时间'), dataIndex: 'createTime$', width: 140, zy-asrs-admin/src/views/IndexView.vue
@@ -226,130 +226,138 @@ </script> <template> <a-layout class="main"> <a-layout-sider class="main-sider" v-model:collapsed="collapsed" :trigger="null" collapsible theme="dark"> <div class="logo" /> <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" @select="menuSelect" theme="dark" mode="inline"> <div> <a-menu-item key="/" name="主页"> <HomeOutlined /> {{ formatMessage('common.home', '主页') }} </a-menu-item> </div> <a-flex gap="middle" horizontal> <div class="sider-style"> <a-layout-sider class="main-sider" v-model:collapsed="collapsed" :trigger="null" collapsible theme="dark"> <div class="logo" /> <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" @select="menuSelect" theme="dark" mode="inline" > <div> <a-menu-item key="/" name="主页"> <HomeOutlined /> {{ formatMessage('common.home', '主页') }} </a-menu-item> </div> <div v-for="(item, index) in menuCache" :key="index"> <a-sub-menu :key="item.route" v-if="item.type == 0"> <template #title> <div v-for="(item, index) in menuCache" :key="index"> <a-sub-menu :key="item.route" v-if="item.type == 0"> <template #title> <span> <component :is="components[ref(item.icon).value]" /> {{ formatMessage(item.languageId, item.name) }} </span> </template> <div v-for="(child, idx) in item.children"> <a-menu-item v-if="child.status == 1" :key="child.route" :name="child.name" :languageId="child.languageId"> {{ formatMessage(child.languageId, child.name) }} </a-menu-item> </div> </a-sub-menu> </div> </a-menu> </a-layout-sider> <a-layout> <a-layout-header style="background: #fff; padding: 0;"> <div class="header-top"> <div class="header-top-left"> <MenuUnfoldOutlined v-if="collapsed" class="trigger triggerLarge" @click="() => (collapsed = !collapsed)" /> <MenuFoldOutlined v-else class="trigger" @click="() => (collapsed = !collapsed)" /> <RedoOutlined class="trigger" @click="windowReload()" /> </template> <div v-for="(child, idx) in item.children"> <a-menu-item v-if="child.status == 1" :key="child.route" :name="child.name" :languageId="child.languageId"> {{ formatMessage(child.languageId, child.name) }} </a-menu-item> </div> </a-sub-menu> </div> <div class="header-top-right"> <div class="trigger" style="color: red;" v-if="licenseDays <= 30"> 许可证有效期:{{ licenseDays }}天 </a-menu> </a-layout-sider> </div> <a-layout class="main"> <a-layout> <a-layout-header style="background: #fff; padding: 0;"> <div class="header-top"> <div class="header-top-left"> <MenuUnfoldOutlined v-if="collapsed" class="trigger triggerLarge" @click="() => (collapsed = !collapsed)" /> <MenuFoldOutlined v-else class="trigger" @click="() => (collapsed = !collapsed)" /> <RedoOutlined class="trigger" @click="windowReload()" /> </div> <div class="trigger" v-if="globalState.currentHost"> <a-dropdown> <div> <ApartmentOutlined /> {{ globalState.currentHost?.name }} </div> <template #overlay> <a-menu> <a-menu-item v-for="(item, index) in hostList" :key="index" @click="switchHost(item)" :class="globalState.currentHost?.id == item.id ? 'active' : ''">{{ item.name }}</a-menu-item> </a-menu> </template> </a-dropdown> </div> <div class="trigger"> <a-dropdown> <div> <TranslationOutlined /> {{ globalState.localeList[globalState.locale]?.desc }} </div> <template #overlay> <a-menu> <div v-for="(item, key) in globalState.localeList" :key="key"> <a-menu-item @click="switchLocale(key)" :class="globalState.locale == key ? 'active' : ''">{{ item.desc }}</a-menu-item> </div> </a-menu> </template> </a-dropdown> </div> <div> <a-dropdown> <a class="header-user" @click.prevent> <UserOutlined /> <span>{{ globalState.user.username }}</span> </a> <template #overlay> <a-menu @click="logout"> <a-menu-item key="logout">{{ formatMessage('common.account.logout', '退出') }}</a-menu-item> </a-menu> </template> </a-dropdown> </div> </div> </div> </a-layout-header> <a-layout-content class="content-view"> <div class="tabs-fixed"> <div class="tabs-arrow-left" @click="handleScroll('left')"> <CaretLeftOutlined /> </div> <div class="tabs-content" ref="tabsContent"> <div class="tabs-content-item"> <div v-for="(item, index) in routerCacheList" :key="index" @click="switchTabs(item)" class="tabs-item" :class="currentCache == item.name ? 'tabs-item-active' : ''"> <div :class="currentCache == item.name ? '' : 'tabs-item-reload-none'" @click="reloadTabs" @click.stop> <RedoOutlined /> </div> <div>{{ formatMessage(item.languageId, item.name) }}</div> <div @click="closeTabs(item)" @click.stop> <CloseOutlined /> </div> <div class="header-top-right"> <div class="trigger" style="color: red;" v-if="licenseDays <= 30"> 许可证有效期:{{ licenseDays }}天 </div> <div class="trigger" v-if="globalState.currentHost"> <a-dropdown> <div> <ApartmentOutlined /> {{ globalState.currentHost?.name }} </div> <template #overlay> <a-menu> <a-menu-item v-for="(item, index) in hostList" :key="index" @click="switchHost(item)" :class="globalState.currentHost?.id == item.id ? 'active' : ''">{{ item.name }}</a-menu-item> </a-menu> </template> </a-dropdown> </div> <div class="trigger"> <a-dropdown> <div> <TranslationOutlined /> {{ globalState.localeList[globalState.locale]?.desc }} </div> <template #overlay> <a-menu> <div v-for="(item, key) in globalState.localeList" :key="key"> <a-menu-item @click="switchLocale(key)" :class="globalState.locale == key ? 'active' : ''">{{ item.desc }}</a-menu-item> </div> </a-menu> </template> </a-dropdown> </div> <div> <a-dropdown> <a class="header-user" @click.prevent> <UserOutlined /> <span>{{ globalState.user.username }}</span> </a> <template #overlay> <a-menu @click="logout"> <a-menu-item key="logout">{{ formatMessage('common.account.logout', '退出') }}</a-menu-item> </a-menu> </template> </a-dropdown> </div> </div> </div> </a-layout-header> <a-layout-content class="content-view"> <div class="tabs-fixed"> <div class="tabs-arrow-left" @click="handleScroll('left')"> <CaretLeftOutlined /> </div> <div class="tabs-arrow-right" @click="handleScroll('right')"> <CaretRightOutlined /> <div class="tabs-content" ref="tabsContent"> <div class="tabs-content-item"> <div v-for="(item, index) in routerCacheList" :key="index" @click="switchTabs(item)" class="tabs-item" :class="currentCache == item.name ? 'tabs-item-active' : ''"> <div :class="currentCache == item.name ? '' : 'tabs-item-reload-none'" @click="reloadTabs" @click.stop> <RedoOutlined /> </div> <div>{{ formatMessage(item.languageId, item.name) }}</div> <div @click="closeTabs(item)" @click.stop> <CloseOutlined /> </div> </div> </div> </div> <div class="tabs-arrow-right" @click="handleScroll('right')"> <CaretRightOutlined /> </div> </div> </div> <router-view v-slot="{ Component, route }" v-if="isRouterAlive"> <keep-alive :include="routerCache"> <component :is="Component" @pageReload="reloadTabs" /> </keep-alive> </router-view> </a-layout-content> <router-view v-slot="{ Component, route }" v-if="isRouterAlive"> <keep-alive :include="routerCache"> <component :is="Component" @pageReload="reloadTabs" /> </keep-alive> </router-view> </a-layout-content> </a-layout> </a-layout> </a-layout> <AiView /> </a-flex> <!--<AiView />--> </template> <style scoped></style> <style scoped> .ant-layout-sider ant-layout-sider-dark main-sider { min-height: 100vh; background: #01101E; } </style> zy-asrs-admin/src/views/base/locTypeBind/index.vue
@@ -2,7 +2,7 @@ import { getCurrentInstance, ref, computed, reactive } from 'vue'; import { useRouter } from "vue-router"; import { get, post, postBlob } from '@/utils/request.js' import { message, Modal } from 'ant-design-vue'; import { message, Modal, Col, Divider, Row, Flex } from 'ant-design-vue'; import { logout } from '@/config.js'; import EditView from './edit.vue' import InitView from './init.vue' @@ -257,47 +257,50 @@ </script> <template> <div style="display: flex;"> <a-card :title="formatMessage('db.man_loc_area_type.type_id', '库位类型')" style="flex: 3;margin-right: 30px;"> <a-input v-model:value="searchLocType" @change="handleLocAreaTypeDept" :placeholder="formatMessage('page.input', '请输入')" style="margin-bottom: 8px" /> <a-tree v-model:expandedKeys="locTypeExpandedKeys" @select="handleLocTypeSelected" :tree-data="locTypeData" blockNode> <template #title="{ name }"> <span>{{ name }}</span> </template> </a-tree> </a-card> <a-card style="flex: 10;"> <InitView ref="initChild" @tableReload="handleTableReload" /> <EditView ref="editChild" @tableReload="handleTableReload" /> <div class="table-header"> <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '请输入')" style="width: 200px;" @search="onSearch" /> <div class="table-header-right"> <a-button @click="handleInit(null)" type="primary">{{ formatMessage('page.init', '初始化') }}</a-button> <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '添加') }}</a-button> <a-button @click="handleExport">{{ formatMessage('page.export', '导出') }}</a-button> </div> </div> <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }" :data-source="tableData.records" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id" :pagination="{ total: tableData.total, onChange: onPageChange }" :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns" :loading="state.loading"> <template #bodyCell="{ column, text, record }"> <template v-if="column.dataIndex === 'oper'"> <div style="display: flex;justify-content: space-evenly;"> <a-button type="link" primary @click="handleEdit(record)">{{ formatMessage('page.edit', '编辑') }}</a-button> <a-button type="link" danger @click="handleDel([record])">{{ formatMessage('page.delete', '删除') }}</a-button> </div> <Row> <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="searchLocType" @change="handleLocAreaTypeDept" :placeholder="formatMessage('page.input', '请输入')" style="margin-bottom: 8px" /> <a-tree v-model:expandedKeys="locTypeExpandedKeys" @select="handleLocTypeSelected" :tree-data="locTypeData" blockNode> <template #title="{ name }"> <span>{{ name }}</span> </template> </template> </a-table> </a-card> </div> </a-tree> </a-card> </Col> <Col :span="19"> <a-card style="flex: 10;"> <InitView ref="initChild" @tableReload="handleTableReload" /> <EditView ref="editChild" @tableReload="handleTableReload" /> <div class="table-header"> <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '请输入')" style="width: 200px;" @search="onSearch" /> <div class="table-header-right"> <a-button @click="handleInit(null)" type="primary">{{ formatMessage('page.init', '初始化') }}</a-button> <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '添加') }}</a-button> <a-button @click="handleExport">{{ formatMessage('page.export', '导出') }}</a-button> </div> </div> <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }" :data-source="tableData.records" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id" :pagination="{ total: tableData.total, onChange: onPageChange }" :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns" :loading="state.loading"> <template #bodyCell="{ column, text, record }"> <template v-if="column.dataIndex === 'oper'"> <div style="display: flex;justify-content: space-evenly;"> <a-button type="link" primary @click="handleEdit(record)">{{ formatMessage('page.edit', '编辑') }}</a-button> <a-button type="link" danger @click="handleDel([record])">{{ formatMessage('page.delete', '删除') }}</a-button> </div> </template> </template> </a-table> </a-card> </Col> </Row> </template> <style></style> zy-asrs-admin/src/views/out/wave/index.vue
@@ -41,10 +41,12 @@ let tableDataColSpan = [] const customColSpanProps = (index) => { let count = tableDataColSpan[index]; if (count == null) { console.log(index + ' ----=====-->' + count) if (count == null || count == undefined) { count = 0; } return { console.log(' ----=====-->' + count) return { rowSpan: count, }; } @@ -150,13 +152,11 @@ let colSpan = [] data.forEach((item) => { let count = 0; item.waveDetlList.forEach((detl) => { detl.waveStatus = item.waveStatus; detl.waveStatus$ = item.waveStatus$; detl.waveType = item.waveType; detl.waveType$ = item.waveType$; count++; tmp.push(detl) }) @@ -166,10 +166,11 @@ }) tableDataColSpan = colSpan; console.log('=========>'); console.log(tmp) console.log(tableDataColSpan); tableData.value = tmp; state.loading = false; } else if (result.code === 401) { message.error(result.msg); logout() zy-asrs-admin/src/views/task/task/index.vue
@@ -44,14 +44,14 @@ { title: formatMessage('db.man_task.task_no', '任务编号'), dataIndex: 'taskNo', width: 140, width: 120, ellipsis: true, ...getColumnSearchProps('taskNo'), }, { title: formatMessage('db.man_task.task_sts', '任务状态'), dataIndex: 'taskSts$', width: 140, width: 200, ellipsis: true, ...getColumnSearchProps('taskSts$'), }, @@ -65,7 +65,7 @@ { title: formatMessage('db.man_task.io_pri', '优先级'), dataIndex: 'ioPri', width: 140, width: 120, ellipsis: true, ...getColumnSearchProps('ioPri'), }, zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/Constant.java
File was deleted zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java
New file @@ -0,0 +1,25 @@ package com.zy.asrs.wms.apis.wcs.entity.domain; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @ConfigurationProperties(prefix = "rcs") @Component public class SystemProperties { /***RCS基础API HOST*/ private String baseHost; /***RRCS上报任务状态*/ private String issueTaskOfEvent; /**RCS通知传输线流动*/ private String conveyorStart; private static String HOST = "http://localhost:8080"; public static String ISSUE_TASK_OF_EVENT = HOST + "/task/create"; public static String CONVEYOR_START = HOST + "/conveyor/moveContainer"; } zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java
@@ -1,39 +1,20 @@ package com.zy.asrs.wms.apis.wcs.schedule; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.apis.wcs.entity.domain.Constant; import com.zy.asrs.wms.apis.wcs.entity.request.ConveyorStarParam; import com.zy.asrs.wms.apis.wcs.entity.request.PublishTasksParam; import com.zy.asrs.wms.apis.wcs.entity.request.TaskDescribe; import com.zy.asrs.wms.apis.wcs.entity.request.TaskParam; import com.zy.asrs.wms.apis.wcs.entity.response.CommonReponse; import com.zy.asrs.wms.asrs.entity.Task; import com.zy.asrs.wms.asrs.entity.enums.TaskStsType; import com.zy.asrs.wms.asrs.service.TaskService; import com.zy.asrs.wms.asrs.service.WorkService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -54,45 +35,45 @@ /*** * 入库任务---通知ESS输送线流动 */ // @Scheduled(cron = "0/3 * * * * ? ") @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void conveyorStart() { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getTaskSts, TaskStsType.WCS_CONTAINER_RECEIVE.id).eq(Task::getStatus, 0)); .eq(Task::getTaskSts, TaskStsType.WCS_CONTAINER_RECEIVE.id).eq(Task::getStatus, 1)); tasks.forEach(task -> { try { ConveyorStarParam conveyorStarParam = new ConveyorStarParam(); conveyorStarParam.setSlotCode(task.getOriginLoc()) .setContainerCode(task.getBarcode()); //调用三方接口,将任务推送至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) { // ConveyorStarParam conveyorStarParam = new ConveyorStarParam(); // conveyorStarParam.setSlotCode(task.getOriginLoc()) // .setContainerCode(task.getBarcode()); // //调用三方接口,将任务推送至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) { taskService.update(new LambdaUpdateWrapper<Task>() .eq(Task::getId, task.getId()) .set(Task::getTaskType, TaskStsType.WCS_CONVEYOR_START.id)); log.info(task.getTaskNo() + "下发流动通知" + commonReponse.getMsg()); } else { throw new CoolException("下发流动通知失败!!"); } } .set(Task::getTaskSts, TaskStsType.WCS_CONVEYOR_START.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, 1).eq(Task::getId, task.getId())); // taskService.update(new LambdaUpdateWrapper<Task>().set(Task::getStatus, 0).eq(Task::getId, task.getId())); } }); @@ -100,129 +81,127 @@ /*** * 入库任务---每隔3秒,刷新当前通知档列表,下发待入库订单至ESS * 入库任务---下发入库任务 * 每隔3秒,刷新当前通知档列表,下发待入库订单至ESS * 查询当前任务列表, */ // @Scheduled(cron = "0/3 * * * * ? ") @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void waitPakinSchedule() { //获取当前任务档中,所有为待入库状态的任务档,按时间升序排列 List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getTaskType, 1) .eq(Task::getTaskSts, TaskStsType.GENERATE_IN)) // .eq(Task::getTaskType, 1) .eq(Task::getTaskSts, TaskStsType.GENERATE_IN.id)) .stream().sorted(Comparator.comparing(Task::getTaskSts)) .collect(Collectors.toList()); // 数据组装 PublishTasksParam tasksParam = new PublishTasksParam(); //TODO 确认是否需要单任务多容器码的需求,目前系统都是单容器码生成单任务,多任务明细(物料混装) tasks.forEach(task -> { List<TaskParam> params = new ArrayList<>(); TaskParam param = new TaskParam(); //设置容器编码 param.setTaskCode(task.getTaskNo()); List<TaskDescribe> taskDescribes = new ArrayList<>(); TaskDescribe describe = new TaskDescribe(); //设置目标库位,站点 describe.setContainerCode(task.getBarcode()) .setToLocationCode(task.getTargetLoc()) .setToStationCode(task.getTargetSite()); taskDescribes.add(describe); param.setTaskDescribe(taskDescribes); params.add(param); tasksParam.setTasks(params); }); tasksParam.setTaskType("putaway"); // TODO 多任务多订单,统一调度,是否会出现部分成功,部分失败的情况 //调用三方接口,将任务推送至ESS平台 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // 设置请求参数 params.add("params", JSONObject.toJSONString(tasksParam)); log.info("请求地址:{},请求参数:{}", Constant.ISSUE_TASK_OF_EVENT, JSONObject.toJSONString(tasksParam)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); HttpEntity httpEntity = new HttpEntity<>(params, headers); // 请求 ResponseEntity<String> exchange = restTemplate.exchange(Constant.ISSUE_TASK_OF_EVENT, HttpMethod.POST, httpEntity, String.class); log.info("下发任务 返回结果:{}", exchange); if (exchange.getBody() == null) { throw new CoolException("下发任务失败!!"); } else { CommonReponse reponse = (CommonReponse) JSON.parse(exchange.getBody()); if (reponse.getCode() == 0) { // PublishTasksParam tasksParam = new PublishTasksParam(); // //TODO 确认是否需要单任务多容器码的需求,目前系统都是单容器码生成单任务,多任务明细(物料混装) // tasks.forEach(task -> { // List<TaskParam> params = new ArrayList<>(); // TaskParam param = new TaskParam(); // //设置容器编码 // param.setTaskCode(task.getTaskNo()); // List<TaskDescribe> taskDescribes = new ArrayList<>(); // TaskDescribe describe = new TaskDescribe(); // //设置目标库位,站点 // describe.setContainerCode(task.getBarcode()) // .setToLocationCode(task.getTargetLoc()) // .setToStationCode(task.getTargetSite()); // taskDescribes.add(describe); // param.setTaskDescribe(taskDescribes); // params.add(param); // tasksParam.setTasks(params); // }); // // tasksParam.setTaskType("putaway"); // // TODO 多任务多订单,统一调度,是否会出现部分成功,部分失败的情况 // //调用三方接口,将任务推送至ESS平台 // MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // // 设置请求参数 // params.add("params", JSONObject.toJSONString(tasksParam)); // log.info("请求地址:{},请求参数:{}", Constant.ISSUE_TASK_OF_EVENT, JSONObject.toJSONString(tasksParam)); // HttpHeaders headers = new HttpHeaders(); // headers.add("Content-Type", "application/json"); // HttpEntity httpEntity = new HttpEntity<>(params, headers); // // 请求 // ResponseEntity<String> exchange = restTemplate.exchange(Constant.ISSUE_TASK_OF_EVENT, HttpMethod.POST, httpEntity, String.class); // log.info("下发任务 返回结果:{}", exchange); // if (exchange.getBody() == null) { // throw new CoolException("下发任务失败!!"); // } else { // CommonReponse reponse = (CommonReponse) JSON.parse(exchange.getBody()); // if (reponse.getCode() == 0) { //请求成功后,统一修改所有任务档状态为入库执行中。 tasks.forEach(task -> { taskService.update(new LambdaUpdateWrapper<Task>() .set(Task::getTaskSts, TaskStsType.WCS_EXECUTE_IN.id) .eq(Task::getBarcode, task.getBarcode())); }); } else { // TODO 请求失败需确认是否存在部分成功的情况,部分成功需要单独刷新成功的任务档状态 throw new CoolException(reponse.getMsg()); } } // } else { // // TODO 请求失败需确认是否存在部分成功的情况,部分成功需要单独刷新成功的任务档状态 // throw new CoolException(reponse.getMsg()); // } // } } /** * 出库任务--- 每隔3秒,获取当前出库任务列表状态为WCS_EXECUTE_OUT_ARRIVED的任务,并通知ESS流动输送线 * */ // @Scheduled(cron = "0/3 * * * * ? ") * 出库任务---通知容器流动 * 每隔3秒,获取当前出库任务列表状态为WCS_EXECUTE_OUT_ARRIVED的任务,并通知ESS流动输送线 */ @Scheduled(cron = "0/5 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void conveyorToNotify() { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_ARRIVED.id).eq(Task::getStatus, 0)); 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) { //流动通知下发完成后,修改任务状态为输送线流动中。。 if (task.getTaskType() == 101) { taskService.update(new LambdaUpdateWrapper<Task>() .eq(Task::getId, task.getId()) .set(Task::getTaskType, TaskStsType.COMPLETE_OUT.id)); } else { taskService.update(new LambdaUpdateWrapper<Task>() .eq(Task::getId, task.getId()) .set(Task::getTaskType, TaskStsType.WCS_EXECUTE_OUT_CONVEYOR.id)); } .eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_ARRIVED.id).eq(Task::getStatus, 1)); 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, 1) .set(Task::getUpdateTime, new Date()) .eq(Task::getId, task.getId())); } // 还需要再修改 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) { //流动通知下发完成后,修改任务状态为输送线流动中。。 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())); // } }); } @@ -233,64 +212,64 @@ * //TODO 1. 正常出库后,清除任务, * //TODO 2. 出库后还有库存,需要添加容器回库操作 */ //@Scheduled(cron = "0/3 * * * * ? ") @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void waveToTask() { //获取当前任务档中,所有为待出库状态的任务档,按时间升序排列 List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getTaskType, 101) //TODO 如何确认是101,还是103 .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT)) .ge(Task::getTaskType, 101) //TODO 如何确认是101,还是103 .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT.id)) .stream().sorted(Comparator.comparing(Task::getTaskSts)) .collect(Collectors.toList()); // 数据组装 PublishTasksParam tasksParam = new PublishTasksParam(); //TODO 确认是否需要单任务多容器码的需求,目前系统都是单容器码生成单任务,多任务明细(物料混装) tasks.forEach(task -> { List<TaskParam> params = new ArrayList<>(); TaskParam param = new TaskParam(); //设置容器编码 param.setTaskCode(task.getTaskNo()); List<TaskDescribe> taskDescribes = new ArrayList<>(); TaskDescribe describe = new TaskDescribe(); //设置目标库位,站点 describe.setContainerCode(task.getBarcode()) .setToLocationCode(task.getTargetLoc()) .setToStationCode(task.getTargetSite()); taskDescribes.add(describe); param.setTaskDescribe(taskDescribes); params.add(param); tasksParam.setTasks(params); }); tasksParam.setTaskType("carry"); // TODO 多任务多订单,统一调度,是否会出现部分成功,部分失败的情况 //调用三方接口,将任务推送至ESS平台 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // 设置请求参数 params.add("params", JSONObject.toJSONString(tasksParam)); log.info("请求地址:{},请求参数:{}", Constant.ISSUE_TASK_OF_EVENT, JSONObject.toJSONString(tasksParam)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); HttpEntity httpEntity = new HttpEntity<>(params, headers); // 请求 ResponseEntity<String> exchange = restTemplate.exchange(Constant.ISSUE_TASK_OF_EVENT, HttpMethod.POST, httpEntity, String.class); log.info("下发任务 返回结果:{}", exchange); if (exchange.getBody() == null) { throw new CoolException("下发任务失败!!"); } else { CommonReponse reponse = (CommonReponse) JSON.parse(exchange.getBody()); if (reponse.getCode() == 0) { // PublishTasksParam tasksParam = new PublishTasksParam(); // //TODO 确认是否需要单任务多容器码的需求,目前系统都是单容器码生成单任务,多任务明细(物料混装) // tasks.forEach(task -> { // List<TaskParam> params = new ArrayList<>(); // TaskParam param = new TaskParam(); // //设置容器编码 // param.setTaskCode(task.getTaskNo()); // List<TaskDescribe> taskDescribes = new ArrayList<>(); // TaskDescribe describe = new TaskDescribe(); // //设置目标库位,站点 // describe.setContainerCode(task.getBarcode()) // .setToLocationCode(task.getTargetLoc()) // .setToStationCode(task.getTargetSite()); // taskDescribes.add(describe); // param.setTaskDescribe(taskDescribes); // params.add(param); // tasksParam.setTasks(params); // }); // // tasksParam.setTaskType("carry"); // // TODO 多任务多订单,统一调度,是否会出现部分成功,部分失败的情况 // //调用三方接口,将任务推送至ESS平台 // MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); // // 设置请求参数 // params.add("params", JSONObject.toJSONString(tasksParam)); // log.info("请求地址:{},请求参数:{}", Constant.ISSUE_TASK_OF_EVENT, JSONObject.toJSONString(tasksParam)); // HttpHeaders headers = new HttpHeaders(); // headers.add("Content-Type", "application/json"); // HttpEntity httpEntity = new HttpEntity<>(params, headers); // // 请求 // ResponseEntity<String> exchange = restTemplate.exchange(Constant.ISSUE_TASK_OF_EVENT, HttpMethod.POST, httpEntity, String.class); // log.info("下发任务 返回结果:{}", exchange); // if (exchange.getBody() == null) { // throw new CoolException("下发任务失败!!"); // } else { // CommonReponse reponse = (CommonReponse) JSON.parse(exchange.getBody()); // if (reponse.getCode() == 0) { //请求成功后,统一修改所有任务档状态为入库执行中。 tasks.forEach(task -> { taskService.update(new LambdaUpdateWrapper<Task>() .set(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id) .eq(Task::getBarcode, task.getBarcode())); .eq(Task::getId, task.getId())); }); } else { // TODO 请求失败需确认是否存在部分成功的情况,部分成功需要单独刷新成功的任务档状态 throw new CoolException(reponse.getMsg()); } } // } else { // // TODO 请求失败需确认是否存在部分成功的情况,部分成功需要单独刷新成功的任务档状态 // throw new CoolException(reponse.getMsg()); // } // } } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java
@@ -63,10 +63,11 @@ .set(Task::getOriginLoc, arrivedParam.getSlotCode()) .eq(Task::getBarcode, arrivedParam.getContainerCode())); } else { taskService.update(new LambdaUpdateWrapper<Task>() boolean update = taskService.update(new LambdaUpdateWrapper<Task>() .set(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_ARRIVED.id) .set(Task::getOriginLoc, arrivedParam.getSlotCode()) .eq(Task::getBarcode, arrivedParam.getContainerCode())); } return R.success("success"); @@ -75,17 +76,15 @@ @Override @Transactional(rollbackFor = Exception.class) public void receiveTaskStatus(TasksStatusCallbackParam callbackParam, String stockType) { Long type = 100L; List<Task> list = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getBarcode, callbackParam.getContainerCode()) .ge(Task::getTaskType, type) .eq(Task::getTaskNo, callbackParam.getTaskCode())); if (!Collections.isEmpty(list)) { list.forEach(task -> { TaskStsType taskStsType = null; if (stockType.equals("inStock")) { //入库任务 if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_LOAD.event)) { //上报取箱状态 if (task.getTaskSts() == TaskStsType.WCS_CONTAINER_RECEIVE.id) { if (task.getTaskSts() == TaskStsType.WCS_CONVEYOR_START.id) { taskStsType = TaskStsType.WCS_TOTE_LOAD; } else { String errMsg = "任务编号:" + task.getTaskNo() + "状态为不匹配," + "不能执行:" + TaskStsType.WCS_TOTE_LOAD.desc + "任务"; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
@@ -88,6 +88,7 @@ } } } wrapper.orderByDesc("create_time"); return R.ok().add(orderService.page(pageParam, wrapper)); } @@ -131,20 +132,20 @@ } } } wrapper.orderByDesc("create_time"); return R.ok().add(orderService.page(pageParam, wrapper)); } @PreAuthorize("hasAuthority('asrs:order:list')") @PostMapping("/order/list") @CacheData(tableName = {"man_order"}) // @CacheData(tableName = {"man_order"}) public R list(@RequestBody Map<String, Object> map) { return R.ok().add(orderService.list()); } @PreAuthorize("hasAuthority('asrs:order:list')") @GetMapping("/order/{id}") @CacheData(tableName = {"man_order"}) // @CacheData(tableName = {"man_order"}) public R get(@PathVariable("id") Long id) { return R.ok().add(orderService.getById(id)); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheSite.java
@@ -8,6 +8,7 @@ import com.zy.asrs.wms.asrs.service.OrderService; import com.zy.asrs.wms.system.entity.Host; import com.zy.asrs.wms.system.entity.User; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -27,6 +28,7 @@ @Data @TableName("man_cache_site") @Accessors(chain = true) public class CacheSite implements Serializable { private static final long serialVersionUID = 1L; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Order.java
@@ -5,6 +5,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.zy.asrs.wms.asrs.service.OrderSettleService; import com.zy.asrs.wms.asrs.service.OrderTypeService; import com.zy.asrs.wms.system.entity.Host; @@ -48,6 +49,8 @@ * 单据日期 */ @ApiModelProperty(value= "单据日期") @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd") private String orderTime; /** zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/TaskStsType.java
@@ -2,41 +2,41 @@ public enum TaskStsType { GENERATE_IN(1L, "生成入库任务"), WCS_EXECUTE_IN(2L, "入库执行中"), WCS_CONTAINER_RECEIVE(3L, "容器到达扫描区"), GENERATE_IN(1L, "创建入库任务"), WCS_EXECUTE_IN(2L, "RCS任务已下发"), WCS_CONTAINER_RECEIVE(3L, "RCS容器到达"), WCS_CONVEYOR_START(14L, "通知容器流动"), WCS_CONVEYOR_START(4L, "RCS容器流动任务已下发"), WCS_TOTE_LOAD(4L, "机器人取箱"), WCS_TOTE_LOAD(5L, "RCS取箱完成"), WCS_TOTE_UNLOAD(5L, "机器人放箱"), WCS_TOTE_UNLOAD(6L, "RCS放箱完成"), WCS_PUTAWAY_SUCESS(10L, "任务成功"), WCS_PUTAWAY_SUCESS(7L, "RCS任务完成"), WCS_PUTAWAY_FAILED(11L, "任务失败"), WCS_PUTAWAY_CANCEL(12L, "任务取消"), WCS_PUTAWAY_SUSPEND(13L, "入库任务挂起"), // WCS_PUTAWAY_FAILED(11L, "任务失败"), // // WCS_PUTAWAY_CANCEL(12L, "任务取消"), // // WCS_PUTAWAY_SUSPEND(13L, "入库任务挂起"), COMPLETE_IN(99L, "入库完成"), UPDATED_IN(100L, "库存更新完成"), GENERATE_OUT(101L, "生成出库任务"), GENERATE_OUT(101L, "创建出库任务"), WCS_EXECUTE_OUT(102L, "出库执行中"), WCS_EXECUTE_OUT(102L, "RCS出库任务已下发"), WCS_EXECUTE_OUT_TOTE_LOAD(113L, "机器人取箱"), WCS_EXECUTE_OUT_TOTE_LOAD(103L, "RCS取箱完成"), WCS_EXECUTE_OUT_TOTE_UNLOAD(114L, "机器人放箱"), WCS_EXECUTE_OUT_TOTE_UNLOAD(104L, "RCS放箱完成"), WCS_EXECUTE_OUT_TASK_DONE(115L, "任务状态回调完成"), WCS_EXECUTE_OUT_TASK_DONE(105L, "RCS任务完成"), WCS_EXECUTE_OUT_ARRIVED(116L, "容器到达扫码区"), WCS_EXECUTE_OUT_ARRIVED(106L, "RCS容器已到达"), WCS_EXECUTE_OUT_CONVEYOR(117L, "通知容器流动"), WCS_EXECUTE_OUT_CONVEYOR(107L, "RCS容器流动任务已下发"), WAVE_SEED(198L, "播种中"), COMPLETE_OUT(199L, "出库完成"), zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -932,7 +932,7 @@ //TODO 确认后,需将注释打开 String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField()); // WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, waveId)); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, waveId)); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, waveId), false); if (waveDetl == null) { throw new CoolException("波次数据不存在"); } @@ -965,7 +965,7 @@ } } @Transactional @Transactional(rollbackFor = Exception.class) public void generateWave(GenerateWaveParam param) { if (param == null) { throw new CoolException("参数不能为空"); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -34,7 +34,13 @@ ArrayList<WaitPakin> waitPakins = new ArrayList<>(); ordersParam.getOrderDetls().forEach(orderdetl -> { WaitPakin waitPakin = new WaitPakin(); waitPakin.setBatch(orderdetl.getBatch()).setAnfme(orderdetl.getMergeNum()).setBarcode(ordersParam.getMergeNo()).setMatnr(orderdetl.getMatnr()).setDetlId(orderdetl.getDetlId()).setIoStatus(0).setOrderNo(orderdetl.getOrderNo()).setOrderId(orderdetl.getOrderId()).setStatus(1); waitPakin.setBatch(orderdetl.getBatch()) .setAnfme(orderdetl.getMergeNum()) .setBarcode(ordersParam.getMergeNo()) .setMatnr(orderdetl.getMatnr()) .setDetlId(orderdetl.getDetlId()) .setIoStatus(0) .setOrderNo(orderdetl.getOrderNo()).setOrderId(orderdetl.getOrderId()).setStatus(1); waitPakins.add(waitPakin); }); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -622,6 +622,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public boolean pickTask(Long taskId) { Task task = taskService.getById(taskId); if(task == null){ @@ -669,8 +670,8 @@ if(loc == null) { throw new CoolException("没有空库位"); } task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务 //102拣料此处需修改为WCS_CONTAINER_RECEIVE,定时任务查询后,自动下发入库任务至ESS task.setTaskSts(TaskStsType.WCS_CONTAINER_RECEIVE.id);//1.生成入库任务 task.setTaskType(taskType); task.setTargetLoc(loc.getLocNo()); task.setUpdateTime(new Date()); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java
@@ -27,7 +27,7 @@ * 将缓存统计保存至数据库 * 每30分钟扫描一次 */ // @Scheduled(cron = "0 30 * * * ? ") @Scheduled(cron = "0 30 * * * ? ") public void run() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String now = format.format(new Date()); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/OrderTimer.java
@@ -31,8 +31,8 @@ @Autowired private OrderDetlFieldLogService orderDetlFieldLogService; // @Scheduled(cron = "0/3 * * * * ? ") @Transactional @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void orderToHistory() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java
@@ -45,7 +45,7 @@ private WaveService waveService; @Scheduled(cron = "0/30 * * * * ? ") @Transactional @Transactional(rollbackFor = Exception.class) public void inExecute() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { @@ -157,8 +157,8 @@ } } // @Scheduled(cron = "0/3 * * * * ? ") @Transactional @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void outExecute() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -1,6 +1,7 @@ package com.zy.asrs.wms.asrs.timer; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.zy.asrs.framework.exception.CoolException; @@ -8,6 +9,7 @@ import com.zy.asrs.wms.asrs.entity.enums.LocStsType; import com.zy.asrs.wms.asrs.entity.enums.TaskStsType; import com.zy.asrs.wms.asrs.service.*; import io.jsonwebtoken.lang.Collections; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -15,8 +17,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Component @@ -58,9 +63,12 @@ @Autowired private OrderDetlService orderDetlService; @Autowired private CacheSiteService cacheSiteService; @Scheduled(cron = "0/30 * * * * ? ") @Transactional @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void inExecute() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { @@ -100,8 +108,8 @@ } } // @Scheduled(cron = "0/3 * * * * ? ") @Transactional @Scheduled(cron = "0/10 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void outExecute() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { @@ -113,7 +121,7 @@ for (Task task : list) { //同步数据 switch (task.getTaskType().intValue()) { case 101://出库 case 101://出库xx executeTask101(task); break; case 103://拣料 @@ -122,13 +130,24 @@ default: throw new CoolException("未知任务类型"); } task.setTaskSts(TaskStsType.UPDATED_OUT.id);//200.库存更新完成 if (!taskService.updateById(task)) { throw new CoolException("库存更新失败"); } else { //CacheSite 释放已被占用的通道 List<TaskDetl> detls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId())); if (!Collections.isEmpty(detls)) { List<Long> waveIds = detls.stream().map(TaskDetl::getWaveId).collect(Collectors.toList()); List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().in(Order::getWaveId, waveIds)); List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); cacheSiteService.update(new LambdaUpdateWrapper<CacheSite>() .in(CacheSite::getOrderId, orderIds) .set(CacheSite::getSiteStatus, 0) .set(CacheSite::getOrderId, null) .set(CacheSite::getOrderNo, null)); } } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @@ -140,8 +159,9 @@ //入库 private void executeTask1(Task task) { Long hostId = task.getHostId(); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId)); //fixme 暂时关闭HOSTID // 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) { log.info("库位不存在" + "=======>" + task.getTargetLoc()); throw new CoolException("库位不存在"); @@ -177,9 +197,10 @@ if (!locDetlService.save(locDetl)) { throw new CoolException("插入库存明细失败"); } //fixme 暂时关闭HOSTID,后续打开机构ID //添加库存明细扩展字段 List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId)); // List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId)); List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId())); for (TaskDetlField detlField : detlFields) { LocDetlField locDetlField = new LocDetlField(); locDetlField.setDetlId(locDetl.getId()); @@ -192,9 +213,10 @@ } } } //fixme 暂时关闭HOSTID,后续打开机构ID //组托通知档转历史档 List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, task.getBarcode()).eq(WaitPakin::getHostId, hostId)); // List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, task.getBarcode()).eq(WaitPakin::getHostId, hostId)); List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, task.getBarcode())); if (waitPakins.isEmpty()) { throw new CoolException("组托通知档不存在"); } @@ -295,8 +317,9 @@ //拣料再入库 private void executeTask53(Task task) { Long hostId = task.getHostId(); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId)); //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) { throw new CoolException("库位不存在"); } @@ -338,7 +361,9 @@ } //添加库存明细扩展字段 List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId)); //fixme 注释 // List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()).eq(TaskDetlField::getHostId, hostId)); List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId())); for (TaskDetlField detlField : detlFields) { LocDetlField locDetlField = new LocDetlField(); locDetlField.setDetlId(locDetl.getId()); @@ -356,7 +381,8 @@ //出库 private void executeTask101(Task task) { Long hostId = task.getHostId(); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId)); // Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId)); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc())); if (loc == null) { throw new CoolException("库位不存在"); } @@ -391,7 +417,9 @@ //拣料出库 private void executeTask103(Task task) { Long hostId = task.getHostId(); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId)); //FIXME 暂时注释HOSTID筛选条件 // Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()).eq(Loc::getHostId, hostId)); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc())); if (loc == null) { throw new CoolException("库位不存在"); } @@ -408,6 +436,7 @@ if (!locService.updateById(loc)) { throw new CoolException("库位状态更新失败"); } List<LocDetl> detlList = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, loc.getId()).eq(LocDetl::getHostId, hostId)); //删除库存明细 for (LocDetl locDetl : detlList) { zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -45,8 +45,8 @@ @Autowired private DictService dictService; // @Scheduled(cron = "0/3 * * * * ? ") @Transactional @Scheduled(cron = "0/3 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void taskWave() { InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); try { zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
@@ -51,7 +51,7 @@ List<Loc> locs = new ArrayList<>(); List<Map<String, Object>> list = viewTaskDetlMapper.getList(mat.getMatnr(), batch, uniqueFields); for (Map<String, Object> map : list) { Task task = taskService.getById(map.get("taskId").toString()); Task task = taskService.getById(map.get("task_id").toString()); if (task == null) { continue; } @@ -73,7 +73,7 @@ List<Loc> locs2 = new ArrayList<>(); List<Map<String, Object>> list2 = viewLocDetlMapper.getList(mat.getMatnr(), batch, uniqueFields, null); for (Map<String, Object> map : list2) { Loc one = locService.getById(map.get("locId").toString()); Loc one = locService.getById(map.get("loc_id").toString()); if (one == null) { continue; } zy-asrs-wms/src/main/resources/application.yml
@@ -37,7 +37,7 @@ # global-config: # field-strategy: 0 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: true global-config: @@ -67,4 +67,13 @@ #接口缓存 system: enableCache: true enableCache: false rcs: #RCS基础API HOST baseHost: http://localhost:8080 #RCS上报任务状态 issueTaskOfEvent: /task/create #RCS通知传输线流动 conveyorStart: /conveyor/moveContainer zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -26,12 +26,12 @@ <select id="getList" resultType="map"> select * from view_man_loc_detl ld where matnr = #{matnr} <if test="batch!=null"> <if test="batch!=null and batch != ''"> and batch = #{batch} </if> <if test="param!=null and param.size()>0"> <foreach item="item" collection="param" index="index"> <if test="item.value!=null"> <if test="item.value !=null and item.value != ''" > and ${item.name} = #{item.value} </if> </foreach> zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml
@@ -5,12 +5,12 @@ <select id="getList" resultType="map"> select * from view_man_task_detl td where matnr = #{matnr} <if test="batch!=null"> <if test="batch!=null and batch!=''"> and batch = #{batch} </if> <if test="param!=null and param.size()>0"> <foreach item="item" collection="param" index="index"> <if test="item.value!=null"> <if test="item.value!=null and item.value != ''"> and ${item.name} = #{item.value} </if> </foreach>