#问题修复
1. 列表字段空间调整
2. 地址链接放至配置文件中
3. 定时任务执行完成后,状态修改补上
4. 修改状态时,需校验上一步状态是否对应
5. 下发任务完成后,查看是否修改状态为2
7. 任务状态列表,数据显示不全问题修复
8. 波次列表,表格合并问题导致多订单出库问题
24个文件已修改
1个文件已添加
1个文件已删除
969 ■■■■ 已修改文件
zy-asrs-admin/src/assets/main.css 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/components/order/order/orderOut.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/IndexView.vue 230 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/locTypeBind/index.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/out/wave/index.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/task/task/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/Constant.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java 365 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheSite.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Order.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/TaskStsType.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/OrderTimer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskLogTimer.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/application.yml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/ViewTaskDetlMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>