From 5d67dd3dcc7dabd829d6bc47203e5dd6589b4a45 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 06 十二月 2024 10:10:47 +0800
Subject: [PATCH] #增加cache

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlLogController.java                 |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java                                  |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java                                     |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserLoginController.java                 |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/DataChangeInterceptor.java              |  108 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java                         |    7 
 zy-asrs-wms/src/main/resources/mapper/asrs/CacheStatisticsMapper.xml                                 |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java                       |   72 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java                       |   10 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletRequest.java          |  110 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/OperationRecordController.java           |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlController.java                   |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderTypeController.java                   |    4 
 zy-asrs-admin/src/views/system/cacheStatistics/edit.vue                                              |  202 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/CacheStatisticsMapper.java                     |   12 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java                         |    4 
 zy-asrs-wms/src/main/resources/sql/menu/cacheStatistics.sql                                          |    9 
 zy-asrs-wms/pom.xml                                                                                  |   14 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderSettleController.java                 |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/ZpalletBarcodeController.java              |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/SecurityConfig.java                        |    6 
 zy-asrs-admin/src/views/system/cacheStatistics/index.vue                                             |  241 +++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/CacheStatisticsController.java             |  102 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldController.java              |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldLogController.java           |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java                       |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java                                           |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/WebkitParseUtils.java                                |   96 ++
 zy-asrs-wms/src/main/resources/application.yml                                                       |   11 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkInController.java       |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/RoleController.java                      |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlFieldLogController.java            |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheStatisticsServiceImpl.java          |   12 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserController.java                      |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlLogController.java                |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/HostController.java                      |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewInOutController.java        |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewStayTimeController.java     |    3 
 zy-asrs-admin/src/views/loc/stockTransfer/index.vue                                                  |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/RedisUtil.java                                       |  666 +++++++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java                     |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletResponse.java         |   49 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/MenuController.java                      |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountInController.java  |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaTypeController.java                 |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TagController.java                         |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountOutController.java |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/CacheStatisticsService.java                   |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/CacheHitDto.java                             |   16 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderLogController.java                    |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/constant/RedisConstants.java                        |   20 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/annotation/CacheData.java                           |   16 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CacheFilter.java                           |  202 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/EncryptUtils.java                                    |   27 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WaitPakinLogController.java                |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaController.java                     |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/LanguageController.java                  |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/DeptController.java                      |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/RedisConfig.java                             |   98 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkOutController.java      |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/EChartController.java                      |    7 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheStatistics.java                           |  219 +++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskLogController.java                     |    4 
 63 files changed, 2,487 insertions(+), 11 deletions(-)

diff --git a/zy-asrs-admin/src/views/loc/stockTransfer/index.vue b/zy-asrs-admin/src/views/loc/stockTransfer/index.vue
index 328494c..29cb07d 100644
--- a/zy-asrs-admin/src/views/loc/stockTransfer/index.vue
+++ b/zy-asrs-admin/src/views/loc/stockTransfer/index.vue
@@ -208,6 +208,8 @@
 
     postForm('/api/loc/search/like/locNo', {
         locNo: sourceLocNo.value,
+        test: "123",
+        quer: ""
     }).then(resp => {
         let result = resp.data;
         if (result.code == 200) {
diff --git a/zy-asrs-admin/src/views/system/cacheStatistics/edit.vue b/zy-asrs-admin/src/views/system/cacheStatistics/edit.vue
new file mode 100644
index 0000000..a54410b
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/cacheStatistics/edit.vue
@@ -0,0 +1,202 @@
+<script setup>
+import { ref, nextTick } from 'vue';
+import { get, post, postBlob, postForm } from '@/utils/request.js'
+import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
+
+const formTable = ref(null);
+const submitButton = ref(null);
+const isSave = ref(true);
+const open = ref(false);
+const initFormData = {}
+let formData = ref(initFormData);
+
+const emit = defineEmits(['tableReload'])
+
+const handleOk = (e) => {
+    nextTick(() => {
+        setTimeout(() => {
+            submitButton.value.$el.click();
+        }, 100);
+    });
+};
+
+const onFinish = values => {
+    // console.log('Success:', values);
+    open.value = false;
+    post(isSave.value ? '/api/cacheStatistics/save' : '/api/cacheStatistics/update', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(isSave.value ? formatMessage('page.add.success', '鏂板鎴愬姛') : formatMessage('page.update.success', '鏇存柊鎴愬姛'));
+        } else {
+            message.error(result.msg);
+        }
+        emit('tableReload', 'reload')
+        nextTick(() => {
+            formTable.value.resetFields()
+        })
+    })
+};
+const onFinishFailed = errorInfo => {
+    console.log('Failed:', errorInfo);
+};
+
+const userQueryList = ref(null); 
+userQuery();
+function userQuery() { 
+    postForm('/api/user/query', {}).then(resp => { 
+        let result = resp.data;
+        userQueryList.value = result.data;
+    })
+}
+
+
+defineExpose({
+    open,
+    formData,
+    initFormData,
+    isSave,
+})
+
+</script>
+
+<script>
+export default {
+    name: '绯荤粺缂撳瓨缁熻-edit'
+}
+</script>
+
+<template>
+    <div>
+        <a-modal v-model:open="open"
+            :title="isSave ? formatMessage('page.add', '娣诲姞') : formatMessage('page.edit', '缂栬緫')" @ok="handleOk"
+            style="width: 600px;">
+            <a-form :model="formData" ref="formTable" name="formTable" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
+                style="display: flex;justify-content: space-between;flex-wrap: wrap;" autocomplete="off"
+                @finish="onFinish" @finishFailed="onFinishFailed">
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.ymd', '缁熻鏃堕棿') " 
+                      name="ymd" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.ymd" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.cache_key', '缂撳瓨璺緞') " 
+                      name="cacheKey" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.cacheKey" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.hit', '鍛戒腑娆℃暟') " 
+                      name="hit" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.hit" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.miss', '鏈懡涓鏁�') " 
+                      name="miss" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.miss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.status', '鐘舵��') " 
+                      name="status" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.status" 
+                        :options="[
+                                { label: '姝e父', value: 1 },
+                                { label: '绂佺敤', value: 0 },
+                            ]"
+                        >
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.create_time', '娣诲姞鏃堕棿') " 
+                      name="createTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.createTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.create_by', '娣诲姞浜哄憳') " 
+                      name="createBy" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.createBy" 
+                        :placeholder="formatMessage('common.select', '璇烽�夋嫨')" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="userQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.update_time', '淇敼鏃堕棿') " 
+                      name="updateTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.updateTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.update_by', '淇敼浜哄憳') " 
+                      name="updateBy" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.updateBy" 
+                        :placeholder="formatMessage('common.select', '璇烽�夋嫨')" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="userQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.sys_cache_statistics.memo', '澶囨敞') " 
+                      name="memo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.memo" 
+                     /> 
+                        </a-form-item>
+
+                <a-form-item>
+                    <a-button type="primary" html-type="submit" ref="submitButton"
+                        style="visibility: hidden;">Submit</a-button>
+                </a-form-item>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/cacheStatistics/index.vue b/zy-asrs-admin/src/views/system/cacheStatistics/index.vue
new file mode 100644
index 0000000..28c71f9
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/cacheStatistics/index.vue
@@ -0,0 +1,241 @@
+<script setup>
+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 { logout } from '@/config.js';
+import EditView from './edit.vue'
+import { formatMessage } from '@/utils/localeUtils.js';
+import useTableSearch from '@/utils/tableUtils.jsx';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-cacheStatistics';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+
+let tableData = ref([]);
+getPage();
+
+const {
+  getColumnSearchProps,
+  handleResizeColumn,
+} = useTableSearch();
+
+const columns = [
+        {
+            title: formatMessage('db.sys_cache_statistics.ymd', '缁熻鏃堕棿'),
+            dataIndex: 'ymd',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('ymd'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.cache_key', '缂撳瓨璺緞'),
+            dataIndex: 'cacheKey',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('cacheKey'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.hit', '鍛戒腑娆℃暟'),
+            dataIndex: 'hit',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('hit'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.miss', '鏈懡涓鏁�'),
+            dataIndex: 'miss',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('miss'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.status', '鐘舵��'),
+            dataIndex: 'status$',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('status$'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.create_time', '娣诲姞鏃堕棿'),
+            dataIndex: 'createTime$',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('createTime$'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.create_by', '娣诲姞浜哄憳'),
+            dataIndex: 'createBy$',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('createBy$'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.update_time', '淇敼鏃堕棿'),
+            dataIndex: 'updateTime$',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('updateTime$'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.update_by', '淇敼浜哄憳'),
+            dataIndex: 'updateBy$',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('updateBy$'),
+        },
+        {
+            title: formatMessage('db.sys_cache_statistics.memo', '澶囨敞'),
+            dataIndex: 'memo',
+            width: 140,
+            ellipsis: true,
+            ...getColumnSearchProps('memo'),
+        },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 140,
+    fixed: 'right',
+  },
+];
+
+const hasSelected = computed(() => state.selectedRowKeys.length > 0);
+const start = () => {
+  state.loading = true;
+  // ajax request after empty completing
+  setTimeout(() => {
+    state.loading = false;
+    state.selectedRowKeys = [];
+  }, 1000);
+};
+const onSelectChange = selectedRowKeys => {
+  // console.log('selectedRowKeys changed: ', selectedRowKeys);
+  state.selectedRowKeys = selectedRowKeys;
+};
+
+function getPage() {
+  state.loading = true;
+  post('/api/cacheStatistics/page', {
+    current: currentPage,
+    pageSize: pageSize,
+    condition: searchInput.value
+  }).then((resp) => {
+    let result = resp.data;
+    if (result.code == 200) {
+      let data = result.data;
+      tableData.value = data;
+
+      state.loading = false;
+    } else if (result.code === 401) {
+      message.error(result.msg);
+      logout()
+    } else {
+      message.error(result.msg);
+    }
+  })
+}
+
+const handleEdit = (item) => {
+  editChild.value.open = true;
+  editChild.value.formData = item == null ? editChild.value.initFormData : JSON.parse(JSON.stringify(item));
+  editChild.value.isSave = item == null;
+}
+
+const handleDel = (rows) => {
+  Modal.confirm({
+    title: formatMessage('page.delete', '鍒犻櫎'),
+    content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
+    maskClosable: true,
+    onOk: async () => {
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/cacheStatistics/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
+    },
+  });
+}
+
+const handleExport = async (intl) => {
+  postBlob('/api/cacheStatistics/export', {}).then(result => {
+    const blob = new Blob([result.data], { type: 'application/vnd.ms-excel' });
+    window.location.href = window.URL.createObjectURL(blob);
+    return true;
+  })
+};
+
+const onSearch = () => {
+  // console.log('search');
+  getPage()
+}
+
+const onPageChange = (page, size) => {
+  currentPage = page;
+  pageSize = size;
+  getPage();
+}
+
+function handleTableReload(value) {
+  getPage()
+}
+
+</script>
+
+<script>
+export default {
+  name: '绯荤粺缂撳瓨缁熻'
+}
+</script>
+
+<template>
+  <div>
+    <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="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" @resizeColumn="handleResizeColumn" :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>
+  </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-wms/pom.xml b/zy-asrs-wms/pom.xml
index de2fc7f..c30ffae 100644
--- a/zy-asrs-wms/pom.xml
+++ b/zy-asrs-wms/pom.xml
@@ -72,6 +72,20 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.8.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/CacheStatisticsController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/CacheStatisticsController.java
new file mode 100644
index 0000000..043c5f6
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/CacheStatisticsController.java
@@ -0,0 +1,102 @@
+package com.zy.asrs.wms.asrs.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.OperationLog;
+import com.zy.asrs.wms.common.domain.BaseParam;
+import com.zy.asrs.wms.common.domain.KeyValVo;
+import com.zy.asrs.wms.common.domain.PageParam;
+import com.zy.asrs.wms.asrs.entity.CacheStatistics;
+import com.zy.asrs.wms.asrs.service.CacheStatisticsService;
+import com.zy.asrs.wms.system.controller.BaseController;
+import com.zy.asrs.wms.utils.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class CacheStatisticsController extends BaseController {
+
+    @Autowired
+    private CacheStatisticsService cacheStatisticsService;
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:list')")
+    @PostMapping("/cacheStatistics/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<CacheStatistics, BaseParam> pageParam = new PageParam<>(baseParam, CacheStatistics.class);
+        return R.ok().add(cacheStatisticsService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:list')")
+    @PostMapping("/cacheStatistics/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(cacheStatisticsService.list());
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:list')")
+    @GetMapping("/cacheStatistics/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(cacheStatisticsService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:save')")
+    @OperationLog("娣诲姞绯荤粺缂撳瓨缁熻")
+    @PostMapping("/cacheStatistics/save")
+    public R save(@RequestBody CacheStatistics cacheStatistics) {
+        if (!cacheStatisticsService.save(cacheStatistics)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:update')")
+    @OperationLog("淇敼绯荤粺缂撳瓨缁熻")
+    @PostMapping("/cacheStatistics/update")
+    public R update(@RequestBody CacheStatistics cacheStatistics) {
+        if (!cacheStatisticsService.updateById(cacheStatistics)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:remove')")
+    @OperationLog("鍒犻櫎绯荤粺缂撳瓨缁熻")
+    @PostMapping("/cacheStatistics/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!cacheStatisticsService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:list')")
+    @PostMapping("/cacheStatistics/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<CacheStatistics> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(CacheStatistics::getId, condition);
+        }
+        cacheStatisticsService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:cacheStatistics:list')")
+    @PostMapping("/cacheStatistics/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(cacheStatisticsService.list(), CacheStatistics.class), response);
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/EChartController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/EChartController.java
index 6aee8d7..2a6cdc4 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/EChartController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/EChartController.java
@@ -15,6 +15,7 @@
 import com.zy.asrs.wms.asrs.service.MatService;
 import com.zy.asrs.wms.asrs.service.TaskDetlLogService;
 import com.zy.asrs.wms.asrs.service.TaskLogService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.system.controller.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -40,6 +41,7 @@
     private MatService matService;
 
     @PostMapping("/charts/loc/use")
+    @CacheData(tableName = {"man_loc"})
     public R locUse(){
         List<EChartPieBean> list = new ArrayList<>();
 
@@ -71,6 +73,7 @@
     }
 
     @PostMapping("/charts/loc/line")
+    @CacheData(tableName = {"man_task_log"})
     public R locIoLineCharts(){
         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
         Calendar calendar = Calendar.getInstance();
@@ -123,6 +126,7 @@
     }
 
     @PostMapping("/charts/information")
+    @CacheData(tableName = {"man_mat", "man_task", "man_task_log"})
     public R information() {
         HashMap<String, Object> data = new HashMap<>();
         long matCount = matService.count();
@@ -132,7 +136,7 @@
 
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         ViewInOut viewInOut = viewInOutMapper.selectOne(new LambdaQueryWrapper<ViewInOut>().eq(ViewInOut::getYmd, format.format(new Date())).orderByDesc(ViewInOut::getYmd).last("limit 0,1"));
-        if(viewInOut != null) {
+        if (viewInOut != null) {
             inQty = viewInOut.getInQty();
             outQty = viewInOut.getOutQty();
             totalQty = viewInOut.getTotalQty();
@@ -146,6 +150,7 @@
     }
 
     @PostMapping("/charts/information/top")
+    @CacheData(tableName = {"man_task_detl_log"})
     public R informationTop() {
         List<InformationTop> topIn = taskDetlLogService.getInformationTopIn(10);
         List<InformationTop> topOut = taskDetlLogService.getInformationTopOut(10);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaController.java
index 8f51429..0a0ae51 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locArea:list')")
     @PostMapping("/locArea/page")
+    @CacheData(tableName = {"man_loc_area"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<LocArea, BaseParam> pageParam = new PageParam<>(baseParam, LocArea.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:locArea:list')")
     @PostMapping("/locArea/list")
+    @CacheData(tableName = {"man_loc_area"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(locAreaService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:locArea:list')")
     @GetMapping("/locArea/{id}")
+    @CacheData(tableName = {"man_loc_area"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(locAreaService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaTypeController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaTypeController.java
index c82fea4..44728d8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaTypeController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocAreaTypeController.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.Tag;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -33,6 +34,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locAreaType:list')")
     @PostMapping("/locAreaType/page")
+    @CacheData(tableName = {"man_loc_area_type"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<LocAreaType, BaseParam> pageParam = new PageParam<>(baseParam, LocAreaType.class);
@@ -41,6 +43,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locAreaType:list')")
     @PostMapping("/locAreaType/tree")
+    @CacheData(tableName = {"man_loc_area_type"})
     public R tree(@RequestBody Map<String, Object> map) {
         List<LocAreaType> locAreaTypeList = locAreaTypeService.list(new LambdaQueryWrapper<LocAreaType>().orderByAsc(LocAreaType::getSort));
         List<LocAreaType> treeData = Utils.toTreeData(locAreaTypeList, 0L, LocAreaType::getParentId, LocAreaType::getId, LocAreaType::setChildren);
@@ -53,12 +56,14 @@
 
     @PreAuthorize("hasAuthority('asrs:locAreaType:list')")
     @PostMapping("/locAreaType/list")
+    @CacheData(tableName = {"man_loc_area_type"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(locAreaTypeService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:locAreaType:list')")
     @GetMapping("/locAreaType/{id}")
+    @CacheData(tableName = {"man_loc_area_type"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(locAreaTypeService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
index fba74c9..a649c11 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocController.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.wms.asrs.entity.LocDetl;
 import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
 import com.zy.asrs.wms.asrs.service.LocDetlService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -33,6 +34,7 @@
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @PostMapping("/loc/page")
+    @CacheData(tableName = {"man_loc"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Loc, BaseParam> pageParam = new PageParam<>(baseParam, Loc.class);
@@ -41,18 +43,21 @@
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @PostMapping("/loc/list")
+    @CacheData(tableName = {"man_loc"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(locService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @GetMapping("/loc/{id}")
+    @CacheData(tableName = {"man_loc"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(locService.getById(id));
     }
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @PostMapping("/loc/search/locNo")
+    @CacheData(tableName = {"man_loc"})
     public R get(@RequestParam("locNo") String locNo) {
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, locNo));
         if(loc == null) {
@@ -69,6 +74,7 @@
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @PostMapping("/loc/search/like/locNo")
+    @CacheData(tableName = {"man_loc"})
     public R search(@RequestParam("locNo") String locNo) {
         if (Cools.isEmpty(locNo)) {
             return R.ok().add(new ArrayList<>());
@@ -80,6 +86,7 @@
 
     @PreAuthorize("hasAuthority('asrs:loc:list')")
     @PostMapping("/loc/search/empty/locNo")
+    @CacheData(tableName = {"man_loc"})
     public R searchEmpty(@RequestParam("locNo") String locNo) {
         if (Cools.isEmpty(locNo)) {
             return R.ok().add(locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.O.val())));
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
index 0033028..1516ea1 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
@@ -14,6 +14,7 @@
 import com.zy.asrs.wms.asrs.service.LocDetlFieldService;
 import com.zy.asrs.wms.asrs.service.LocService;
 import com.zy.asrs.wms.asrs.service.MatFieldService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -43,6 +44,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @PostMapping("/locDetl/page")
+    @CacheData(tableName = {"man_loc_detl"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewLocDetl, BaseParam> pageParam = new PageParam<>(baseParam, ViewLocDetl.class);
@@ -52,6 +54,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @PostMapping("/locDetl/outPage")
+    @CacheData(tableName = {"man_loc_detl"})
     public R outPage(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewLocDetl, BaseParam> pageParam = new PageParam<>(baseParam, ViewLocDetl.class);
@@ -68,6 +71,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @PostMapping("/locDetl/list")
+    @CacheData(tableName = {"man_loc_detl"})
     public R list(@RequestBody Map<String, Object> map) {
         List<LocDetl> list = locDetlService.getLocDetlList(map);
         return R.ok().add(list);
@@ -75,6 +79,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @PostMapping("/locDetl/listByIds")
+    @CacheData(tableName = {"man_loc_detl"})
     public R listByIds(@RequestBody List<Long> ids) {
         List<LocDetl> list = locDetlService.listByIds(ids);
         List<LocDetl> locDetls = locDetlService.parseLocDetl(list);
@@ -83,6 +88,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @GetMapping("/locDetl/locId/{locId}")
+    @CacheData(tableName = {"man_loc_detl"})
     public R list(@PathVariable("locId") Long locId) {
         List<LocDetl> list = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, locId));
         List<LocDetl> locDetls = locDetlService.parseLocDetl(list);
@@ -91,6 +97,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @GetMapping("/locDetl/locNo/{locNo}")
+    @CacheData(tableName = {"man_loc_detl"})
     public R list(@PathVariable("locNo") String locNo) {
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, locNo));
         if (loc == null) {
@@ -103,6 +110,7 @@
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @GetMapping("/locDetl/{id}")
+    @CacheData(tableName = {"man_loc_detl"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(locDetlService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java
index b11d721..682c7c2 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java
@@ -15,6 +15,7 @@
 import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.asrs.service.MatFieldValueService;
 import com.zy.asrs.wms.asrs.service.TagService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -47,6 +48,7 @@
 
     @PreAuthorize("hasAuthority('asrs:mat:list')")
     @PostMapping("/mat/page")
+    @CacheData(tableName = {"man_mat"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Mat, BaseParam> pageParam = new PageParam<>(baseParam, Mat.class);
@@ -67,12 +69,14 @@
 
     @PreAuthorize("hasAuthority('asrs:mat:list')")
     @PostMapping("/mat/list")
+    @CacheData(tableName = {"man_mat"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(matService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:mat:list')")
     @GetMapping("/mat/{id}")
+    @CacheData(tableName = {"man_mat"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(matService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
index 0e7df22..296c619 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
@@ -14,6 +14,7 @@
 import com.zy.asrs.wms.asrs.entity.template.OrderTemplate;
 import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.asrs.service.OrderTypeService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -45,6 +46,7 @@
 
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/page")
+    @CacheData(tableName = {"man_order"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Order, BaseParam> pageParam = new PageParam<>(baseParam, Order.class);
@@ -53,6 +55,7 @@
 
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/in/page")
+    @CacheData(tableName = {"man_order", "man_order_type"})
     public R pageIn(@RequestBody Map<String, Object> map) {
         String condition = map.getOrDefault("condition", "").toString();
         BaseParam baseParam = buildParam(map, BaseParam.class);
@@ -75,7 +78,7 @@
         }
 
         Object paramObj = map.get("_param");
-        if(paramObj != null) {
+        if (paramObj != null) {
             Map param = (Map) paramObj;
             for (Object value : param.entrySet()) {
                 Map.Entry entry = (Map.Entry) value;
@@ -91,6 +94,7 @@
 
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/out/page")
+    @CacheData(tableName = {"man_order", "man_order_type"})
     public R pageOut(@RequestBody Map<String, Object> map) {
         String condition = map.getOrDefault("condition", "").toString();
         BaseParam baseParam = buildParam(map, BaseParam.class);
@@ -133,12 +137,14 @@
 
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/list")
+    @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"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlController.java
index fd2a8d0..56c7285 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetl:list')")
     @PostMapping("/orderDetl/page")
+    @CacheData(tableName = {"man_order_detl"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderDetl, BaseParam> pageParam = new PageParam<>(baseParam, OrderDetl.class);
@@ -39,18 +41,21 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetl:list')")
     @PostMapping("/orderDetl/list")
+    @CacheData(tableName = {"man_order_detl"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderDetlService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderDetl:list')")
     @GetMapping("/orderDetl/orderId/{orderId}")
+    @CacheData(tableName = {"man_order_detl", "man_order_detl_field"})
     public R list(@PathVariable("orderId") Long orderId) {
         return R.ok().add(orderDetlService.getOrderDetlByOrderId(orderId));
     }
 
     @PreAuthorize("hasAuthority('asrs:orderDetl:list')")
     @GetMapping("/orderDetl/{id}")
+    @CacheData(tableName = {"man_order_detl"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderDetlService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldController.java
index 1ee9cc9..f6262e4 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlField:list')")
     @PostMapping("/orderDetlField/page")
+    @CacheData(tableName = {"man_order_detl_field"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderDetlField, BaseParam> pageParam = new PageParam<>(baseParam, OrderDetlField.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlField:list')")
     @PostMapping("/orderDetlField/list")
+    @CacheData(tableName = {"man_order_detl_field"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderDetlFieldService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderDetlField:list')")
     @GetMapping("/orderDetlField/{id}")
+    @CacheData(tableName = {"man_order_detl_field"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderDetlFieldService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldLogController.java
index 9f8fb99..93de688 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlFieldLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlFieldLog:list')")
     @PostMapping("/orderDetlFieldLog/page")
+    @CacheData(tableName = {"man_order_detl_field_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderDetlFieldLog, BaseParam> pageParam = new PageParam<>(baseParam, OrderDetlFieldLog.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlFieldLog:list')")
     @PostMapping("/orderDetlFieldLog/list")
+    @CacheData(tableName = {"man_order_detl_field_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderDetlFieldLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderDetlFieldLog:list')")
     @GetMapping("/orderDetlFieldLog/{id}")
+    @CacheData(tableName = {"man_order_detl_field_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderDetlFieldLogService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlLogController.java
index 7f193c6..e5a7d89 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderDetlLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlLog:list')")
     @PostMapping("/orderDetlLog/page")
+    @CacheData(tableName = {"man_order_detl_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderDetlLog, BaseParam> pageParam = new PageParam<>(baseParam, OrderDetlLog.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderDetlLog:list')")
     @PostMapping("/orderDetlLog/list")
+    @CacheData(tableName = {"man_order_detl_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderDetlLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderDetl:list')")
     @GetMapping("/orderDetlLog/orderId/{orderId}")
+    @CacheData(tableName = {"man_order_detl_log"})
     public R list(@PathVariable("orderId") Long orderId) {
         return R.ok().add(orderDetlLogService.getOrderDetlByOrderId(orderId));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderLogController.java
index d346b63..fcd3611 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderLogController.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.OrderType;
 import com.zy.asrs.wms.asrs.service.OrderTypeService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -37,6 +38,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderLog:list')")
     @PostMapping("/orderLog/page")
+    @CacheData(tableName = {"man_order_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderLog, BaseParam> pageParam = new PageParam<>(baseParam, OrderLog.class);
@@ -45,6 +47,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderLog:list')")
     @PostMapping("/orderLog/in/page")
+    @CacheData(tableName = {"man_order_log", "man_order_type"})
     public R pageIn(@RequestBody Map<String, Object> map) {
         String condition = map.getOrDefault("condition", "").toString();
         BaseParam baseParam = buildParam(map, BaseParam.class);
@@ -67,7 +70,7 @@
         }
 
         Object paramObj = map.get("_param");
-        if(paramObj != null) {
+        if (paramObj != null) {
             Map param = (Map) paramObj;
             for (Object value : param.entrySet()) {
                 Map.Entry entry = (Map.Entry) value;
@@ -83,6 +86,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderLog:list')")
     @PostMapping("/orderLog/out/page")
+    @CacheData(tableName = {"man_order_log", "man_order_type"})
     public R pageOut(@RequestBody Map<String, Object> map) {
         String condition = map.getOrDefault("condition", "").toString();
         BaseParam baseParam = buildParam(map, BaseParam.class);
@@ -121,12 +125,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderLog:list')")
     @PostMapping("/orderLog/list")
+    @CacheData(tableName = {"man_order_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderLog:list')")
     @GetMapping("/orderLog/{id}")
+    @CacheData(tableName = {"man_order_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderLogService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderSettleController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderSettleController.java
index a17fab7..1b9e85b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderSettleController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderSettleController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderSettle:list')")
     @PostMapping("/orderSettle/page")
+    @CacheData(tableName = {"man_order_settle"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderSettle, BaseParam> pageParam = new PageParam<>(baseParam, OrderSettle.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderSettle:list')")
     @PostMapping("/orderSettle/list")
+    @CacheData(tableName = {"man_order_settle"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderSettleService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderSettle:list')")
     @GetMapping("/orderSettle/{id}")
+    @CacheData(tableName = {"man_order_settle"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderSettleService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderTypeController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderTypeController.java
index 9f71240..9347edf 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderTypeController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderTypeController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:orderType:list')")
     @PostMapping("/orderType/page")
+    @CacheData(tableName = {"man_order_type"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OrderType, BaseParam> pageParam = new PageParam<>(baseParam, OrderType.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:orderType:list')")
     @PostMapping("/orderType/list")
+    @CacheData(tableName = {"man_order_type"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(orderTypeService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:orderType:list')")
     @GetMapping("/orderType/{id}")
+    @CacheData(tableName = {"man_order_type"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(orderTypeService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TagController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TagController.java
index 604ddf7..c58fff5 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TagController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TagController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -32,6 +33,7 @@
 
     @PreAuthorize("hasAuthority('asrs:tag:list')")
     @PostMapping("/tag/page")
+    @CacheData(tableName = {"man_tag"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Tag, BaseParam> pageParam = new PageParam<>(baseParam, Tag.class);
@@ -40,6 +42,7 @@
 
     @PreAuthorize("hasAuthority('asrs:tag:list')")
     @PostMapping("/tag/tree")
+    @CacheData(tableName = {"man_tag"})
     public R tree(@RequestBody Map<String, Object> map) {
         List<Tag> tagList = tagService.list(new LambdaQueryWrapper<Tag>().orderByAsc(Tag::getSort));
         List<Tag> treeData = Utils.toTreeData(tagList, 0L, Tag::getParentId, Tag::getId, Tag::setChildren);
@@ -52,12 +55,14 @@
 
     @PreAuthorize("hasAuthority('asrs:tag:list')")
     @PostMapping("/tag/list")
+    @CacheData(tableName = {"man_tag"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(tagService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:tag:list')")
     @GetMapping("/tag/{id}")
+    @CacheData(tableName = {"man_tag"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(tagService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlFieldLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlFieldLogController.java
index 5d66a5d..305c145 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlFieldLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlFieldLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:taskDetlFieldLog:list')")
     @PostMapping("/taskDetlFieldLog/page")
+    @CacheData(tableName = {"man_task_detl_field_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<TaskDetlFieldLog, BaseParam> pageParam = new PageParam<>(baseParam, TaskDetlFieldLog.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:taskDetlFieldLog:list')")
     @PostMapping("/taskDetlFieldLog/list")
+    @CacheData(tableName = {"man_task_detl_field_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(taskDetlFieldLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:taskDetlFieldLog:list')")
     @GetMapping("/taskDetlFieldLog/{id}")
+    @CacheData(tableName = {"man_task_detl_field_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(taskDetlFieldLogService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlLogController.java
index 52455de..a44d302 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskDetlLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:taskDetlLog:list')")
     @PostMapping("/taskDetlLog/page")
+    @CacheData(tableName = {"man_task_detl_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<TaskDetlLog, BaseParam> pageParam = new PageParam<>(baseParam, TaskDetlLog.class);
@@ -39,18 +41,21 @@
 
     @PreAuthorize("hasAuthority('asrs:taskDetlLog:list')")
     @PostMapping("/taskDetlLog/list")
+    @CacheData(tableName = {"man_task_detl_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(taskDetlLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:taskDetlLog:list')")
     @GetMapping("/taskDetlLog/{id}")
+    @CacheData(tableName = {"man_task_detl_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(taskDetlLogService.getById(id));
     }
 
     @PreAuthorize("hasAuthority('asrs:taskDetlLog:list')")
     @GetMapping("/taskDetlLog/taskId/{id}")
+    @CacheData(tableName = {"man_task_detl_log"})
     public R getByTaskId(@PathVariable("id") Long id) {
         return R.ok().add(taskDetlLogService.getTaskDetlLogByTaskId(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskLogController.java
index b61e229..b75f326 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/TaskLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:taskLog:list')")
     @PostMapping("/taskLog/page")
+    @CacheData(tableName = {"man_task_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<TaskLog, BaseParam> pageParam = new PageParam<>(baseParam, TaskLog.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:taskLog:list')")
     @PostMapping("/taskLog/list")
+    @CacheData(tableName = {"man_task_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(taskLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:taskLog:list')")
     @GetMapping("/taskLog/{id}")
+    @CacheData(tableName = {"man_task_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(taskLogService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WaitPakinLogController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WaitPakinLogController.java
index 7778f14..d6585e8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WaitPakinLogController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/WaitPakinLogController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:waitPakinLog:list')")
     @PostMapping("/waitPakinLog/page")
+    @CacheData(tableName = {"man_wait_pakin_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<WaitPakinLog, BaseParam> pageParam = new PageParam<>(baseParam, WaitPakinLog.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:waitPakinLog:list')")
     @PostMapping("/waitPakinLog/list")
+    @CacheData(tableName = {"man_wait_pakin_log"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(waitPakinLogService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:waitPakinLog:list')")
     @GetMapping("/waitPakinLog/{id}")
+    @CacheData(tableName = {"man_wait_pakin_log"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(waitPakinLogService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/ZpalletBarcodeController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/ZpalletBarcodeController.java
index 9711793..fead071 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/ZpalletBarcodeController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/ZpalletBarcodeController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -31,6 +32,7 @@
 
     @PreAuthorize("hasAuthority('asrs:zpalletBarcode:list')")
     @PostMapping("/zpalletBarcode/page")
+    @CacheData(tableName = {"man_zpallet_barcode","loc_detl"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ZpalletBarcode, BaseParam> pageParam = new PageParam<>(baseParam, ZpalletBarcode.class);
@@ -39,12 +41,14 @@
 
     @PreAuthorize("hasAuthority('asrs:zpalletBarcode:list')")
     @PostMapping("/zpalletBarcode/list")
+    @CacheData(tableName = {"man_zpallet_barcode"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(zpalletBarcodeService.list());
     }
 
     @PreAuthorize("hasAuthority('asrs:zpalletBarcode:list')")
     @GetMapping("/zpalletBarcode/{id}")
+    @CacheData(tableName = {"man_zpallet_barcode"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(zpalletBarcodeService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewInOutController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewInOutController.java
index dd302f3..049b5b0 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewInOutController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewInOutController.java
@@ -4,6 +4,7 @@
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.statistics.ViewInOut;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewInOutMapper;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -27,6 +28,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewInOut:list')")
     @PostMapping("/viewInOut/page")
+    @CacheData(tableName = {"view_in_out", "man_task", "man_task_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewInOut, BaseParam> pageParam = new PageParam<>(baseParam, ViewInOut.class);
@@ -37,6 +39,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewInOut:list')")
     @PostMapping("/viewInOut/export")
+    @CacheData(tableName = {"view_in_out", "man_task", "man_task_log"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewInOut> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewInOutMapper.selectList(wrapper), ViewInOut.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewStayTimeController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewStayTimeController.java
index 9bced7d..e0927f0 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewStayTimeController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewStayTimeController.java
@@ -4,6 +4,7 @@
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.statistics.ViewStayTime;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewStayTimeMapper;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -24,6 +25,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewStayTime:list')")
     @PostMapping("/viewStayTime/page")
+    @CacheData(tableName = {"view_stay_time", "man_loc_detl", "man_loc"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewStayTime, BaseParam> pageParam = new PageParam<>(baseParam, ViewStayTime.class);
@@ -34,6 +36,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewStayTime:list')")
     @PostMapping("/viewStayTime/export")
+    @CacheData(tableName = {"view_stay_time", "man_loc_detl", "man_loc"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewStayTime> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewStayTimeMapper.selectList(wrapper), ViewStayTime.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountInController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountInController.java
index b6386d0..afa390b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountInController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountInController.java
@@ -4,6 +4,7 @@
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.statistics.ViewWorkCountIn;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewWorkCountInMapper;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -27,6 +28,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkCountIn:list')")
     @PostMapping("/viewWorkCountIn/page")
+    @CacheData(tableName = {"view_work_count_in", "man_task_log", "man_task_detl_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewWorkCountIn, BaseParam> pageParam = new PageParam<>(baseParam, ViewWorkCountIn.class);
@@ -37,6 +39,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkCountIn:list')")
     @PostMapping("/viewWorkCountIn/export")
+    @CacheData(tableName = {"view_work_count_in", "man_task_log", "man_task_detl_log"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewWorkCountIn> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewWorkCountInMapper.selectList(wrapper), ViewWorkCountIn.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountOutController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountOutController.java
index cf61d11..e470d0a 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountOutController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkCountOutController.java
@@ -6,6 +6,7 @@
 import com.zy.asrs.wms.asrs.entity.statistics.ViewWorkCountOut;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewWorkCountInMapper;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewWorkCountOutMapper;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -29,6 +30,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkCountOut:list')")
     @PostMapping("/viewWorkCountOut/page")
+    @CacheData(tableName = {"view_work_count_out", "man_task_log", "man_task_detl_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewWorkCountOut, BaseParam> pageParam = new PageParam<>(baseParam, ViewWorkCountOut.class);
@@ -39,6 +41,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkCountOut:list')")
     @PostMapping("/viewWorkCountOut/export")
+    @CacheData(tableName = {"view_work_count_out", "man_task_log", "man_task_detl_log"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewWorkCountOut> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewWorkCountOutMapper.selectList(wrapper), ViewWorkCountOut.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkInController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkInController.java
index 4d967a0..0495da9 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkInController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkInController.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.wms.asrs.entity.statistics.ViewWorkIn;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewWorkInMapper;
 import com.zy.asrs.wms.asrs.service.TaskDetlFieldLogService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -33,6 +34,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkIn:list')")
     @PostMapping("/viewWorkIn/page")
+    @CacheData(tableName = {"view_work_in", "man_task_log", "man_task_detl_log", "man_task_detl_field_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewWorkIn, BaseParam> pageParam = new PageParam<>(baseParam, ViewWorkIn.class);
@@ -48,6 +50,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkIn:list')")
     @PostMapping("/viewWorkIn/export")
+    @CacheData(tableName = {"view_work_in", "man_task_log", "man_task_detl_log"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewWorkIn> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewWorkInMapper.selectList(wrapper), ViewWorkIn.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkOutController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkOutController.java
index 1c3cb56..234821c 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkOutController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/statistics/ViewWorkOutController.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.wms.asrs.entity.statistics.ViewWorkOut;
 import com.zy.asrs.wms.asrs.mapper.statistics.ViewWorkOutMapper;
 import com.zy.asrs.wms.asrs.service.TaskDetlFieldLogService;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.PageParam;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -33,6 +34,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkOut:list')")
     @PostMapping("/viewWorkOut/page")
+    @CacheData(tableName = {"view_work_out", "man_task_log", "man_task_detl_log", "man_task_detl_field_log"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<ViewWorkOut, BaseParam> pageParam = new PageParam<>(baseParam, ViewWorkOut.class);
@@ -48,6 +50,7 @@
 
     @PreAuthorize("hasAuthority('asrs:viewWorkOut:list')")
     @PostMapping("/viewWorkOut/export")
+    @CacheData(tableName = {"view_work_out", "man_task_log", "man_task_detl_log"})
     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
         QueryWrapper<ViewWorkOut> wrapper = new QueryWrapper<>();
         ExcelUtil.build(ExcelUtil.create(viewWorkOutMapper.selectList(wrapper), ViewWorkOut.class), response);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheStatistics.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheStatistics.java
new file mode 100644
index 0000000..b97092a
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/CacheStatistics.java
@@ -0,0 +1,219 @@
+package com.zy.asrs.wms.asrs.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.zy.asrs.wms.system.entity.Host;
+import com.zy.asrs.wms.system.entity.User;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wms.system.service.UserService;
+import com.zy.asrs.wms.system.service.HostService;
+import com.zy.asrs.common.utils.Synchro;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("sys_cache_statistics")
+public class CacheStatistics implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缁熻鏃堕棿
+     */
+    @ApiModelProperty(value= "缁熻鏃堕棿")
+    private String ymd;
+
+    /**
+     * 缂撳瓨璺緞
+     */
+    @ApiModelProperty(value= "缂撳瓨璺緞")
+    private String cacheKey;
+
+    /**
+     * 鍛戒腑娆℃暟
+     */
+    @ApiModelProperty(value= "鍛戒腑娆℃暟")
+    private Integer hit;
+
+    /**
+     * 鏈懡涓鏁�
+     */
+    @ApiModelProperty(value= "鏈懡涓鏁�")
+    private Integer miss;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @ApiModelProperty(value= "鎵�灞炴満鏋�")
+    private Long hostId;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public CacheStatistics() {}
+
+    public CacheStatistics(String ymd,String cacheKey,Integer hit,Integer miss,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.ymd = ymd;
+        this.cacheKey = cacheKey;
+        this.hit = hit;
+        this.miss = miss;
+        this.hostId = hostId;
+        this.status = status;
+        this.deleted = deleted;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    CacheStatistics cacheStatistics = new CacheStatistics(
+//            null,    // 缁熻鏃堕棿
+//            null,    // 缂撳瓨璺緞
+//            null,    // 鍛戒腑娆℃暟
+//            null,    // 鏈懡涓鏁�
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 鐘舵��
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.getById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getDeleted$(){
+        if (null == this.deleted){ return null; }
+        switch (this.deleted){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.deleted);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java
index a8e961d..f159f5b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java
@@ -75,7 +75,7 @@
      * 瀛楁绫诲瀷 0: 鐗╂枡  1: 搴撳瓨
      */
     @ApiModelProperty(value= "瀛楁绫诲瀷 0: 鐗╂枡  1: 搴撳瓨")
-    @TableField("`field_type`")
+    @TableField("field_type")
     private Integer fieldType;
 
     /**
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/CacheStatisticsMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/CacheStatisticsMapper.java
new file mode 100644
index 0000000..d384bb1
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/CacheStatisticsMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.zy.asrs.wms.asrs.entity.CacheStatistics;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface CacheStatisticsMapper extends BaseMapper<CacheStatistics> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/CacheStatisticsService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/CacheStatisticsService.java
new file mode 100644
index 0000000..4e54bc8
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/CacheStatisticsService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wms.asrs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wms.asrs.entity.CacheStatistics;
+
+public interface CacheStatisticsService extends IService<CacheStatistics> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheStatisticsServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheStatisticsServiceImpl.java
new file mode 100644
index 0000000..8ef1fff
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheStatisticsServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.service.impl;
+
+import com.zy.asrs.wms.asrs.mapper.CacheStatisticsMapper;
+import com.zy.asrs.wms.asrs.entity.CacheStatistics;
+import com.zy.asrs.wms.asrs.service.CacheStatisticsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("cacheStatisticsService")
+public class CacheStatisticsServiceImpl extends ServiceImpl<CacheStatisticsMapper, CacheStatistics> implements CacheStatisticsService {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java
new file mode 100644
index 0000000..2dd0ccf
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/CacheStatisticsTimer.java
@@ -0,0 +1,72 @@
+package com.zy.asrs.wms.asrs.timer;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.wms.asrs.entity.CacheStatistics;
+import com.zy.asrs.wms.asrs.service.CacheStatisticsService;
+import com.zy.asrs.wms.common.constant.RedisConstants;
+import com.zy.asrs.wms.common.domain.CacheHitDto;
+import com.zy.asrs.wms.utils.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Set;
+
+@Component
+public class CacheStatisticsTimer {
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private CacheStatisticsService cacheStatisticsService;
+
+    /**
+     * 灏嗙紦瀛樼粺璁′繚瀛樿嚦鏁版嵁搴�
+     * 姣�30鍒嗛挓鎵弿涓�娆�
+     */
+    @Scheduled(cron = "0 30 * * * ? ")
+    public void run() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String now = format.format(new Date());
+        Set<String> keys = redisUtil.searchRedisKeys(RedisConstants.STATISTICS_CACHE_DATA);
+        for (String key : keys) {
+            if(key.contains(now)){
+                continue;
+            }
+
+            try {
+                String[] split = key.split(":");
+                String ymd = split[1];
+                String cacheKey = split[2];
+                Object object = redisUtil.get(key);
+                if(object == null){
+                    continue;
+                }
+
+                CacheHitDto cacheHitDto = JSON.parseObject(object.toString(), CacheHitDto.class);
+                CacheStatistics cacheStatistics = cacheStatisticsService.getOne(new LambdaQueryWrapper<CacheStatistics>().eq(CacheStatistics::getYmd, ymd).eq(CacheStatistics::getCacheKey, cacheKey));
+                if (cacheStatistics == null) {
+                    cacheStatistics = new CacheStatistics();
+                    cacheStatistics.setYmd(ymd);
+                    cacheStatistics.setCacheKey(cacheKey);
+                    cacheStatistics.setHit(0);
+                    cacheStatistics.setMiss(0);
+                    cacheStatisticsService.save(cacheStatistics);
+                }
+
+                cacheStatistics.setHit(cacheStatistics.getHit() + cacheHitDto.getHit());
+                cacheStatistics.setMiss(cacheStatistics.getMiss() + cacheHitDto.getMiss());
+                cacheStatisticsService.updateById(cacheStatistics);
+
+                redisUtil.del(key);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/annotation/CacheData.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/annotation/CacheData.java
new file mode 100644
index 0000000..b411359
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/annotation/CacheData.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.wms.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface CacheData {
+
+    String[] tableName() default {};
+
+    boolean cache() default true;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
index 7a5bf23..a586e2d 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/MybatisPlusConfig.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import com.zy.asrs.wms.common.interceptor.DataChangeInterceptor;
 import com.zy.asrs.wms.system.entity.User;
 import com.zy.asrs.wms.system.entity.UserLogin;
 import net.sf.jsqlparser.expression.Expression;
@@ -15,7 +16,6 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
-
 import java.util.Arrays;
 
 /**
@@ -54,7 +54,8 @@
                         "man_task_sts",
                         "man_task_type",
                         "man_order_settle",
-                        "view_man_loc_detl_field"
+                        "view_man_loc_detl_field",
+                        "sys_cache_statistics"
                 ).contains(tableName);
             }
 
@@ -97,4 +98,9 @@
         return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
     }
 
+    @Bean
+    public DataChangeInterceptor sqlStatementInterceptor() {
+        return new DataChangeInterceptor();
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/RedisConfig.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/RedisConfig.java
new file mode 100644
index 0000000..b75e59e
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/config/RedisConfig.java
@@ -0,0 +1,98 @@
+package com.zy.asrs.wms.common.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * Redis閰嶇疆绫�
+ * Created by vincent on 2019-12-23
+ */
+@Configuration
+//@EnableCaching // 寮�鍚暟鎹紦瀛樻満鍒�
+public class RedisConfig extends CachingConfigurerSupport {
+
+
+    /**
+     * RedisTemplate鐩稿叧閰嶇疆
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 閰嶇疆杩炴帴宸ュ巶
+        template.setConnectionFactory(factory);
+
+        //浣跨敤Jackson2JsonRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨剉alue鍊硷紙榛樿浣跨敤JDK鐨勫簭鍒楀寲鏂瑰紡锛�
+        Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+
+        ObjectMapper om = new ObjectMapper();
+        // 鎸囧畾瑕佸簭鍒楀寲鐨勫煙锛宖ield,get鍜宻et,浠ュ強淇グ绗﹁寖鍥达紝ANY鏄兘鏈夊寘鎷琾rivate鍜宲ublic
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 鎸囧畾搴忓垪鍖栬緭鍏ョ殑绫诲瀷锛岀被蹇呴』鏄潪final淇グ鐨勶紝final淇グ鐨勭被锛屾瘮濡係tring,Integer绛変細璺戝嚭寮傚父
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jacksonSerializer.setObjectMapper(om);
+
+        // 鍊奸噰鐢╦son搴忓垪鍖�
+        template.setValueSerializer(jacksonSerializer);
+        //浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊�
+        template.setKeySerializer(new StringRedisSerializer());
+
+        // 璁剧疆hash key 鍜寁alue搴忓垪鍖栨ā寮�
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSerializer);
+        template.afterPropertiesSet();
+
+        return template;
+    }
+
+
+    /**
+     * 瀵箁edis瀛楃涓茬被鍨嬫暟鎹搷浣�
+     */
+    @Bean
+    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForValue();
+    }
+
+    /**
+     * 瀵筯ash绫诲瀷鐨勬暟鎹搷浣�
+     */
+    @Bean
+    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+
+    /**
+     * 瀵归摼琛ㄧ被鍨嬬殑鏁版嵁鎿嶄綔
+     */
+    @Bean
+    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForList();
+    }
+
+    /**
+     * 瀵规棤搴忛泦鍚堢被鍨嬬殑鏁版嵁鎿嶄綔
+     */
+    @Bean
+    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForSet();
+    }
+
+    /**
+     * 瀵规湁搴忛泦鍚堢被鍨嬬殑鏁版嵁鎿嶄綔
+     */
+    @Bean
+    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForZSet();
+    }
+
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/constant/RedisConstants.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/constant/RedisConstants.java
new file mode 100644
index 0000000..2aa6fae
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/constant/RedisConstants.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.wms.common.constant;
+
+public class RedisConstants {
+
+    public static final String CACHE_DATA = "CACHE_DATA";
+
+    public static final String STATISTICS_CACHE_DATA = "STATISTICS_CACHE_DATA";
+
+    public static String getCacheKey(String prefix, String[] tables, String uri, String md5, Long roleId) {
+        String tablesStr = "";
+        if (tables != null) {
+            tablesStr = String.join(";", tables);
+        }
+
+        String roleKey = "roleId:" + roleId.toString();
+        String key = prefix + ":" + roleKey + ":" + tablesStr + ":" + uri + ":" + md5;
+        return key;
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/CacheHitDto.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/CacheHitDto.java
new file mode 100644
index 0000000..206f6b6
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/CacheHitDto.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.wms.common.domain;
+
+import lombok.Data;
+
+@Data
+public class CacheHitDto {
+
+    private Integer hit;
+
+    private Integer miss;
+
+    public CacheHitDto(Integer hit, Integer miss) {
+        this.hit = hit;
+        this.miss = miss;
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/DataChangeInterceptor.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/DataChangeInterceptor.java
new file mode 100644
index 0000000..da14f60
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/interceptor/DataChangeInterceptor.java
@@ -0,0 +1,108 @@
+package com.zy.asrs.wms.common.interceptor;
+
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wms.common.constant.RedisConstants;
+import com.zy.asrs.wms.utils.RedisUtil;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.plugin.*;
+import java.sql.Connection;
+import java.util.Properties;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Intercepts({
+        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
+})
+public class DataChangeInterceptor implements Interceptor {
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
+        String sql = statementHandler.getBoundSql().getSql();
+        if (sql != null) {
+            String trimmedSql = sql.trim().toUpperCase();
+//            System.out.println("SQL: " + sql);
+            if (trimmedSql.startsWith("INSERT")) {
+                clearRedisCache(trimmedSql);
+            } else if (trimmedSql.startsWith("UPDATE")) {
+                clearRedisCache(trimmedSql);
+            } else if (trimmedSql.startsWith("DELETE")) {
+                clearRedisCache(trimmedSql);
+            }
+        }
+
+        // 鏍规嵁闇�瑕佽繘琛孲QL瑙f瀽
+        return invocation.proceed();
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {}
+
+    public static String extractTableName(String sql) {
+        if (sql == null || sql.trim().isEmpty()) {
+            return "鏃犳晥鐨凷QL璇彞";
+        }
+
+        String trimmedSql = sql.trim().toUpperCase();
+        String tableName = "";
+
+        // 瀹氫箟姝e垯琛ㄨ揪寮�
+        Pattern insertPattern = Pattern.compile("INSERT INTO (\\S+)", Pattern.CASE_INSENSITIVE);
+        Pattern updatePattern = Pattern.compile("UPDATE (\\S+)", Pattern.CASE_INSENSITIVE);
+        Pattern deletePattern = Pattern.compile("DELETE FROM (\\S+)", Pattern.CASE_INSENSITIVE);
+
+        Matcher matcher;
+
+        // 妫�鏌NSERT璇彞
+        matcher = insertPattern.matcher(trimmedSql);
+        if (matcher.find()) {
+            tableName = matcher.group(1);
+        } else {
+            // 妫�鏌PDATE璇彞
+            matcher = updatePattern.matcher(trimmedSql);
+            if (matcher.find()) {
+                tableName = matcher.group(1);
+            } else {
+                // 妫�鏌ELETE璇彞
+                matcher = deletePattern.matcher(trimmedSql);
+                if (matcher.find()) {
+                    tableName = matcher.group(1);
+                }
+            }
+        }
+
+        if (tableName.isEmpty()) {
+            return null;
+        }
+
+        return tableName;
+    }
+
+    private void clearRedisCache(String sql) {
+        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
+        if (redisUtil == null) {
+            return;
+        }
+
+        String tableName = extractTableName(sql);
+        if (tableName == null) {
+            return;
+        }
+
+        tableName = tableName.toLowerCase();
+
+        Set<String> keys = redisUtil.searchRedisKeys(tableName);
+        for (String key : keys) {
+            if (!key.startsWith(RedisConstants.CACHE_DATA)) {
+                continue;
+            }
+            redisUtil.del(key);
+        }
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CacheFilter.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CacheFilter.java
new file mode 100644
index 0000000..fa4baaf
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CacheFilter.java
@@ -0,0 +1,202 @@
+package com.zy.asrs.wms.common.security;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
+import com.zy.asrs.wms.common.constant.Constants;
+import com.zy.asrs.wms.common.constant.RedisConstants;
+import com.zy.asrs.wms.common.domain.CacheHitDto;
+import com.zy.asrs.wms.system.entity.User;
+import com.zy.asrs.wms.system.entity.UserLogin;
+import com.zy.asrs.wms.system.service.UserService;
+import com.zy.asrs.wms.utils.EncryptUtils;
+import com.zy.asrs.wms.utils.HttpUtils;
+import com.zy.asrs.wms.utils.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerExecutionChain;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class CacheFilter extends OncePerRequestFilter {
+
+    @Value("${system.enableCache}")
+    private Boolean enableCache;
+    @Autowired
+    private RequestMappingHandlerMapping handlerMapping;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private UserService userService;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
+        // 鑾峰彇褰撳墠璇锋眰鐨勫鐞嗗櫒鏂规硶
+        HandlerExecutionChain handlerChain;
+        try {
+            handlerChain = handlerMapping.getHandler(request);
+            if (handlerChain != null) {
+                Object handler = handlerChain.getHandler();
+                if (handler instanceof HandlerMethod) {
+                    HandlerMethod handlerMethod = (HandlerMethod) handler;
+                    Method method = handlerMethod.getMethod();
+                    if (method.isAnnotationPresent(CacheData.class)) {
+                        CacheData cacheData = method.getAnnotation(CacheData.class);
+                        if (enableCache && cacheData.cache()) {
+                            // 鍒涘缓涓�涓寘瑁呰姹備綋鐨� HttpServletRequestWrapper
+                            CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request);
+                            // 鍒涘缓涓�涓寘瑁呭搷搴斾綋鐨� HttpServletResponseWrapper
+                            CachedBodyHttpServletResponse cachedBodyHttpServletResponse = new CachedBodyHttpServletResponse(response);
+                            String requestParamCode = getRequestParamCode(cachedBodyHttpServletRequest);
+
+                            User user = getUser();
+                            ArrayList<Long> roleIds = new ArrayList<>();
+                            if (user == null) {
+                                roleIds.add(0L);
+                            }else {
+                                roleIds.addAll(Arrays.asList(user.getUserRoleIds()));
+                            }
+
+                            Object object = null;
+                            for (Long roleId : roleIds) {
+                                Object obj = redisUtil.get(RedisConstants.getCacheKey(RedisConstants.CACHE_DATA, cacheData.tableName(), request.getRequestURI(), requestParamCode, roleId));
+                                if(obj != null){
+                                    object = obj;
+                                    break;
+                                }
+                            }
+
+                            if (object == null) {
+                                chain.doFilter(cachedBodyHttpServletRequest, cachedBodyHttpServletResponse);
+
+                                // 鑾峰彇鍝嶅簲鍐呭
+                                byte[] responseContent = cachedBodyHttpServletResponse.getContent();
+                                String responseBody = new String(responseContent);
+
+                                JSONObject result = JSON.parseObject(responseBody);
+                                if (Integer.parseInt(result.get("code").toString()) == 200) {
+                                    for (Long roleId : roleIds) {
+                                        redisUtil.set(RedisConstants.getCacheKey(RedisConstants.CACHE_DATA, cacheData.tableName(), request.getRequestURI(), requestParamCode, roleId), responseBody, 60 * 60 * 24);
+                                    }
+                                }
+
+                                // 灏嗗搷搴斿唴瀹瑰啓鍥炲師濮嬬殑 HttpServletResponse
+                                response.getOutputStream().write(responseContent);
+                                response.setContentLength(responseContent.length);
+                            }else {
+                                // 灏嗗搷搴斿唴瀹瑰啓鍥炲師濮嬬殑 HttpServletResponse
+                                byte[] responseContent = object.toString().getBytes();
+                                response.setContentType("application/json;charset=UTF-8");
+                                response.getOutputStream().write(responseContent);
+                                response.setContentLength(responseContent.length);
+                            }
+
+                            statisticsCacheHitCount(object, cacheData.tableName(), request.getRequestURI());
+                            return;
+                        }
+                    }
+                }
+            }
+
+            chain.doFilter(request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+            HttpUtils.responseError(response, Constants.BAD_CREDENTIALS_CODE, Constants.BAD_CREDENTIALS_MSG,
+                    e.toString());
+            return;
+        }
+    }
+
+    private String getRequestParamCode(CachedBodyHttpServletRequest request) throws IOException {
+        // 鑾峰彇璇锋眰鏂规硶
+        String requestMethod = request.getMethod();
+        String md5 = "";
+        // 妫�鏌ヨ姹傛柟娉曞苟澶勭悊
+        if ("POST".equalsIgnoreCase(requestMethod)) {
+            // 妫�鏌ユ槸鍚︿负 form-data 绫诲瀷
+            String contentType = request.getContentType();
+            if (contentType != null && (contentType.startsWith("application/x-www-form-urlencoded") || contentType.startsWith("multipart/form-data"))) {
+                // 澶勭悊 form-data 鍙傛暟
+                Map<String, String[]> parameterMap = request.getParameterMap();
+                String jsonString = JSON.toJSONString(parameterMap);
+                md5 = EncryptUtils.md5(jsonString);
+            } else {
+                // 璇诲彇璇锋眰浣撲腑鐨� JSON 鏁版嵁
+                String jsonRequestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
+                md5 = EncryptUtils.md5(jsonRequestBody);
+            }
+        } else if ("GET".equalsIgnoreCase(requestMethod)) {
+            Map<String, String[]> map = request.getParameterMap();
+            String jsonString = JSON.toJSONString(map);
+            md5 = EncryptUtils.md5(jsonString);
+        }
+        return md5;
+    }
+
+    private User getUser() {
+        try {
+            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+            if (authentication != null) {
+                Object object = authentication.getPrincipal();
+                if (object instanceof User) {
+                    return (User) object;
+                }
+                if(object instanceof UserLogin) {
+                    UserLogin userLogin = (UserLogin) object;
+                    User user = userService.superGetById(userLogin.getUserId());
+                    return user;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        return null;
+    }
+
+    private void statisticsCacheHitCount(Object object, String[] tableNames, String requestURI) {
+        statisticsCacheSaveRedis(object, requestURI);
+        for (String tableName : tableNames) {
+            statisticsCacheSaveRedis(object, tableName);
+        }
+    }
+
+    private void statisticsCacheSaveRedis(Object object, String key) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String now = format.format(new Date());
+
+        String urlKey = RedisConstants.STATISTICS_CACHE_DATA + ":" + now + ":" + key;
+        Object urlCache = redisUtil.get(urlKey);
+        CacheHitDto cacheHitDto = new CacheHitDto(0, 0);
+        if (urlCache != null) {
+            cacheHitDto = JSON.parseObject(urlCache.toString(), CacheHitDto.class);
+        }
+
+        if (object == null) {
+            cacheHitDto.setMiss(cacheHitDto.getMiss() + 1);
+        }else {
+            cacheHitDto.setHit(cacheHitDto.getHit() + 1);
+        }
+
+        redisUtil.set(urlKey, JSON.toJSONString(cacheHitDto));
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletRequest.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletRequest.java
new file mode 100644
index 0000000..ff328b7
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletRequest.java
@@ -0,0 +1,110 @@
+package com.zy.asrs.wms.common.security;
+
+import com.alibaba.fastjson.JSON;
+import com.zy.asrs.wms.utils.EncryptUtils;
+import com.zy.asrs.wms.utils.WebkitParseUtils;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
+    private final byte[] cachedBody;
+    private final Map<String, String[]> parameterMap;
+
+    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
+        super(request);
+        String requestMethod = request.getMethod();
+        if ("GET".equalsIgnoreCase(requestMethod)) {
+            Map<String, String[]> map = request.getParameterMap();
+            String jsonString = JSON.toJSONString(map);
+            this.cachedBody = jsonString.getBytes();
+            this.parameterMap = map;
+        }else {
+            // 璇诲彇璇锋眰浣撳苟缂撳瓨
+            InputStream inputStream = request.getInputStream();
+            // 鏂规硶鏉ヨ鍙栨墍鏈夊瓧鑺�
+            this.cachedBody = readBytesFromInputStream(inputStream);
+
+            this.parameterMap = new HashMap<>();
+            // 璇诲彇骞惰В鏋愯〃鍗曟暟鎹�
+            parseRequestParameters();
+        }
+    }
+
+    private byte[] readBytesFromInputStream(InputStream inputStream) throws IOException {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int bytesRead;
+        while ((bytesRead = inputStream.read(buffer)) != -1) {
+            byteArrayOutputStream.write(buffer, 0, bytesRead);
+        }
+        return byteArrayOutputStream.toByteArray();
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        return new CachedBodyServletInputStream(cachedBody);
+    }
+
+    @Override
+    public BufferedReader getReader() {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+
+    @Override
+    public String getParameter(String name) {
+        String[] values = parameterMap.get(name);
+        return (values != null && values.length > 0) ? values[0] : null;
+    }
+
+    @Override
+    public Map<String, String[]> getParameterMap() {
+        return parameterMap;
+    }
+
+    @Override
+    public String[] getParameterValues(String name) {
+        return parameterMap.get(name);
+    }
+
+    private static class CachedBodyServletInputStream extends ServletInputStream {
+        private final ByteArrayInputStream inputStream;
+
+        public CachedBodyServletInputStream(byte[] cachedBody) {
+            this.inputStream = new ByteArrayInputStream(cachedBody);
+        }
+
+        @Override
+        public boolean isFinished() {
+            return inputStream.available() == 0;
+        }
+
+        @Override
+        public boolean isReady() {
+            return true;
+        }
+
+        @Override
+        public void setReadListener(ReadListener listener) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int read() {
+            return inputStream.read();
+        }
+    }
+
+    private void parseRequestParameters() {
+        String string = new String(cachedBody);
+        HashMap<String, Object> formData = WebkitParseUtils.getFormData(string);
+        for (Map.Entry<String, Object> entry : formData.entrySet()) {
+            parameterMap.put(entry.getKey(), new String[]{entry.getValue().toString()});
+        }
+    }
+}
+
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletResponse.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletResponse.java
new file mode 100644
index 0000000..45e4135
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/CachedBodyHttpServletResponse.java
@@ -0,0 +1,49 @@
+package com.zy.asrs.wms.common.security;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+
+public class CachedBodyHttpServletResponse extends HttpServletResponseWrapper {
+    private final ByteArrayOutputStream cachedBody;
+    private final PrintWriter writer;
+
+    public CachedBodyHttpServletResponse(HttpServletResponse response) {
+        super(response);
+        this.cachedBody = new ByteArrayOutputStream();
+        this.writer = new PrintWriter(cachedBody);
+    }
+
+    @Override
+    public PrintWriter getWriter() {
+        return writer;
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() {
+        return new ServletOutputStream() {
+            @Override
+            public void write(int b) {
+                cachedBody.write(b);
+            }
+
+            @Override
+            public boolean isReady() {
+                return true;
+            }
+
+            @Override
+            public void setWriteListener(WriteListener writeListener) {
+
+            }
+        };
+    }
+
+    public byte[] getContent() {
+        writer.flush();
+        return cachedBody.toByteArray();
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/SecurityConfig.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/SecurityConfig.java
index 1358a55..0e0a588 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/SecurityConfig.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/security/SecurityConfig.java
@@ -16,6 +16,7 @@
 import org.springframework.security.web.AuthenticationEntryPoint;
 import org.springframework.security.web.access.AccessDeniedHandler;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -52,6 +53,8 @@
     private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
     @Resource
     private JwtAuthenticationFilter jwtAuthenticationFilter;
+    @Resource
+    private CacheFilter cacheFilter;
 
     @Override
     protected void configure(HttpSecurity http) throws Exception {
@@ -82,7 +85,8 @@
                 .accessDeniedHandler(jwtAccessDeniedHandler)
                 .authenticationEntryPoint(jwtAuthenticationEntryPoint)
                 .and()
-                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
+                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
+                .addFilterBefore(cacheFilter, BasicAuthenticationFilter.class);
     }
 
     @Bean
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/DeptController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/DeptController.java
index 612a72e..dd700f1 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/DeptController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/DeptController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -29,6 +30,7 @@
 
     @PreAuthorize("hasAuthority('system:dept:list')")
     @PostMapping("/dept/page")
+    @CacheData(tableName = {"sys_dept"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Dept, BaseParam> pageParam = new PageParam<>(baseParam, Dept.class);
@@ -37,12 +39,14 @@
 
     @PreAuthorize("hasAuthority('system:dept:list')")
     @PostMapping("/dept/list")
+    @CacheData(tableName = {"sys_dept"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(deptService.list());
     }
 
     @PreAuthorize("hasAuthority('system:dept:list')")
     @PostMapping("/dept/tree")
+    @CacheData(tableName = {"sys_dept"})
     public R tree(@RequestBody Map<String, Object> map) {
 //        PageParam<Dept, BaseParam> param = new PageParam<>(buildParam(map, BaseParam.class), Dept.class);
 //        QueryWrapper<Dept> wrapper = param.buildWrapper(true, queryWrapper -> queryWrapper.orderByAsc("sort"));
@@ -57,6 +61,7 @@
 
     @PreAuthorize("hasAuthority('system:dept:list')")
     @GetMapping("/dept/{id}")
+    @CacheData(tableName = {"sys_dept"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(deptService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/HostController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/HostController.java
index d30538e..2223a0c 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/HostController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/HostController.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -39,6 +40,7 @@
 
     @PreAuthorize("hasAuthority('system:host:list')")
     @PostMapping("/host/page")
+    @CacheData(tableName = {"sys_host"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Host, BaseParam> pageParam = new PageParam<>(baseParam, Host.class);
@@ -47,12 +49,14 @@
 
     @PreAuthorize("hasAuthority('system:host:list')")
     @PostMapping("/host/list")
+    @CacheData(tableName = {"sys_host"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(hostService.list());
     }
 
     @PreAuthorize("hasAuthority('system:host:list')")
     @GetMapping("/host/{id}")
+    @CacheData(tableName = {"sys_host"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(hostService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/LanguageController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/LanguageController.java
index 7d5d162..3b9c1da 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/LanguageController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/LanguageController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -28,6 +29,7 @@
 
     @PreAuthorize("hasAuthority('system:language:list')")
     @PostMapping("/language/page")
+    @CacheData(tableName = {"sys_language"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Language, BaseParam> pageParam = new PageParam<>(baseParam, Language.class);
@@ -36,11 +38,13 @@
 
     @PreAuthorize("hasAuthority('system:language:list')")
     @PostMapping("/language/list")
+    @CacheData(tableName = {"sys_language"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(languageService.list());
     }
 
     @PostMapping("/language/json")
+    @CacheData(tableName = {"sys_language"})
     public R json(@RequestBody Map<String, Object> map) {
         LambdaQueryWrapper<Language> wrapper = new LambdaQueryWrapper<>();
         if(map.containsKey("locale")){
@@ -56,6 +60,7 @@
 
     @PreAuthorize("hasAuthority('system:language:list')")
     @GetMapping("/language/{id}")
+    @CacheData(tableName = {"sys_language"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(languageService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/MenuController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/MenuController.java
index 75af03f..b063b5d 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/MenuController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/MenuController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -29,6 +30,7 @@
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @PostMapping("/menu/page")
+    @CacheData(tableName = {"sys_menu"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Menu, BaseParam> pageParam = new PageParam<>(baseParam, Menu.class);
@@ -37,12 +39,14 @@
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @PostMapping("/menu/list")
+    @CacheData(tableName = {"sys_menu"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(menuService.list());
     }
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @PostMapping("/menu/tree")
+    @CacheData(tableName = {"sys_menu"})
     public R tree(@RequestBody Map<String, Object> map) {
 //        PageParam<Menu, BaseParam> param = new PageParam<>(buildParam(map, BaseParam.class), Menu.class);
 //        QueryWrapper<Menu> wrapper = param.buildWrapper(true, queryWrapper -> queryWrapper.orderByAsc("sort"));
@@ -59,6 +63,7 @@
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @GetMapping("/menu/get/route")
+    @CacheData(tableName = {"sys_menu"})
     public R getByRoute(@RequestParam("route") String route) {
         Menu menu = menuService.getOne(new LambdaQueryWrapper<Menu>().eq(Menu::getRoute, route).eq(Menu::getStatus, 1).last("limit 1"));
         if (menu == null) {
@@ -69,6 +74,7 @@
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @GetMapping("/menu/{id}")
+    @CacheData(tableName = {"sys_menu"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(menuService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/OperationRecordController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/OperationRecordController.java
index b2acae5..5c73cf1 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/OperationRecordController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/OperationRecordController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -30,6 +31,7 @@
 
     @PreAuthorize("hasAuthority('system:operationRecord:list')")
     @PostMapping("/operationRecord/page")
+    @CacheData(tableName = {"sys_operation_record"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<OperationRecord, BaseParam> pageParam = new PageParam<>(baseParam, OperationRecord.class);
@@ -38,12 +40,14 @@
 
     @PreAuthorize("hasAuthority('system:operationRecord:list')")
     @PostMapping("/operationRecord/list")
+    @CacheData(tableName = {"sys_operation_record"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(operationRecordService.list());
     }
 
     @PreAuthorize("hasAuthority('system:operationRecord:list')")
     @GetMapping("/operationRecord/{id}")
+    @CacheData(tableName = {"sys_operation_record"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(operationRecordService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/RoleController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/RoleController.java
index 726f3e9..b369601 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/RoleController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/RoleController.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -40,6 +41,7 @@
 
     @PreAuthorize("hasAuthority('system:role:list')")
     @PostMapping("/role/page")
+    @CacheData(tableName = {"sys_role"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Role, BaseParam> pageParam = new PageParam<>(baseParam, Role.class);
@@ -48,12 +50,14 @@
 
     @PreAuthorize("hasAuthority('system:role:list')")
     @PostMapping("/role/list")
+    @CacheData(tableName = {"sys_role"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(roleService.list());
     }
 
     @PreAuthorize("hasAuthority('system:role:list')")
     @GetMapping("/role/{id}")
+    @CacheData(tableName = {"sys_role"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(roleService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserController.java
index 3ab59ae..342bcd3 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserController.java
@@ -5,6 +5,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -39,6 +40,7 @@
 
     @PreAuthorize("hasAuthority('system:user:list')")
     @PostMapping("/user/page")
+    @CacheData(tableName = {"sys_user"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<User, BaseParam> pageParam = new PageParam<>(baseParam, User.class);
@@ -47,6 +49,7 @@
 
     @PreAuthorize("hasAuthority('system:user:list')")
     @PostMapping("/user/page1")
+    @CacheData(tableName = {"sys_user"})
     public R page1(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<User, BaseParam> pageParam = new PageParam<>(baseParam, User.class);
@@ -55,12 +58,14 @@
 
     @PreAuthorize("hasAuthority('system:user:list')")
     @PostMapping("/user/list")
+    @CacheData(tableName = {"sys_user"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(userService.list());
     }
 
     @PreAuthorize("hasAuthority('system:user:list')")
     @GetMapping("/user/{id}")
+    @CacheData(tableName = {"sys_user"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(userService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserLoginController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserLoginController.java
index 8a235c6..1516deb 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserLoginController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/UserLoginController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.common.annotation.CacheData;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -30,6 +31,7 @@
 
     @PreAuthorize("hasAuthority('system:userLogin:list')")
     @PostMapping("/userLogin/page")
+    @CacheData(tableName = {"sys_user_login"})
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<UserLogin, BaseParam> pageParam = new PageParam<>(baseParam, UserLogin.class);
@@ -38,12 +40,14 @@
 
     @PreAuthorize("hasAuthority('system:userLogin:list')")
     @PostMapping("/userLogin/list")
+    @CacheData(tableName = {"sys_user_login"})
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(userLoginService.list());
     }
 
     @PreAuthorize("hasAuthority('system:userLogin:list')")
     @GetMapping("/userLogin/{id}")
+    @CacheData(tableName = {"sys_user_login"})
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(userLoginService.getById(id));
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
index 2cbf817..ed655bb 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
@@ -22,8 +22,8 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="man_platform_detl_log";
-        generator.tableName="闆嗚揣鍖哄煙搴撳瓨鍘嗗彶";
+        generator.table="sys_cache_statistics";
+        generator.tableName="绯荤粺缂撳瓨缁熻";
         generator.rootPackagePath="com.zy.asrs.wms";
         generator.packagePath="com.zy.asrs.wms.asrs";
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/EncryptUtils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/EncryptUtils.java
new file mode 100644
index 0000000..f403c98
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/EncryptUtils.java
@@ -0,0 +1,27 @@
+package com.zy.asrs.wms.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+
+public class EncryptUtils {
+
+    public static String md5(String plainString) {
+        String cipherString = null;
+        try {
+            // 鑾峰彇瀹炰緥
+            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+            // 璁$畻鎽樿
+            byte[] cipherBytes = messageDigest.digest(plainString.getBytes(StandardCharsets.UTF_8));
+            // 杈撳嚭涓�16杩涘埗瀛楃涓�
+            StringBuilder sb = new StringBuilder();
+            for (byte b : cipherBytes) {
+                sb.append(String.format("%02x", b));
+            }
+            cipherString = sb.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return cipherString;
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/RedisUtil.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/RedisUtil.java
new file mode 100644
index 0000000..a532f7c
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/RedisUtil.java
@@ -0,0 +1,666 @@
+package com.zy.asrs.wms.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redisTemplate灏佽
+ *
+ */
+@Component
+public class RedisUtil {
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    public RedisTemplate getRedisTemplate() {
+        return redisTemplate;
+    }
+
+    public RedisUtil(RedisTemplate redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * 鎸囧畾缂撳瓨澶辨晥鏃堕棿
+     *
+     * @param key  閿�
+     * @param time 鏃堕棿(绉�)
+     * @return
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁key 鑾峰彇杩囨湡鏃堕棿
+     *
+     * @param key 閿� 涓嶈兘涓簄ull
+     * @return 鏃堕棿(绉�) 杩斿洖0浠h〃涓烘案涔呮湁鏁�
+     */
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 鍒ゆ柇key鏄惁瀛樺湪
+     *
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎缂撳瓨
+     *
+     * @param key 鍙互浼犱竴涓�� 鎴栧涓�
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    //============================ String =============================
+
+    /**
+     * 鏅�氱紦瀛樿幏鍙�
+     *
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 鑾峰彇鍏ㄩ儴鏁版嵁
+     * @return
+     */
+    public HashMap<Object, Object> getRedis() {
+        Set<String> keys = redisTemplate.keys("*");
+        HashMap<Object, Object> map = new HashMap<>();
+        for (String key : keys) {
+            Object value = redisTemplate.opsForValue().get(key);
+            map.put(key, value);
+        }
+
+        return map;//杩斿洖鍏ㄩ儴鏁版嵁闆嗗悎
+    }
+
+    /**
+     * 妯$硦鏌ヨ鏁版嵁
+     */
+    public HashMap<Object, Object> searchRedis(String data) {
+        Set<String> keys = redisTemplate.keys("*" + data + "*");
+        HashMap<Object, Object> map = new HashMap<>();
+        for (String key : keys) {
+            Object value = redisTemplate.opsForValue().get(key);
+            map.put(key, value);
+        }
+        return map;
+    }
+
+    /**
+     * 妯$硦鏌ヨ鏁版嵁
+     */
+    public Set<String> searchRedisKeys(String data) {
+        Set<String> keys = redisTemplate.keys("*" + data + "*");
+        return keys;
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏�
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true鎴愬姛 false澶辫触
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            long start = System.currentTimeMillis();
+            while (System.currentTimeMillis() - start < 10000) {//鏈夋晥鏈�10s
+                Object o = redisTemplate.opsForValue().get(key);
+                if (o == null) {
+                    continue;
+                }
+
+                if (o.equals(value)) {
+                    break;
+                }
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏�-寮傛
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true鎴愬姛 false澶辫触
+     */
+    public boolean setAsync(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏ュ苟璁剧疆鏃堕棿
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) time瑕佸ぇ浜�0 濡傛灉time灏忎簬绛変簬0 灏嗚缃棤闄愭湡
+     * @return true鎴愬姛 false 澶辫触
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 閫掑
+     *
+     * @param key   閿�
+     * @param delta 瑕佸鍔犲嚑(澶т簬0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 閫掑噺
+     *
+     * @param key   閿�
+     * @param delta 瑕佸噺灏戝嚑(灏忎簬0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑噺鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    //================================ Hash =================================
+
+    /**
+     * HashGet
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return 鍊�
+     */
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 鑾峰彇hashKey瀵瑰簲鐨勬墍鏈夐敭鍊�
+     *
+     * @param key 閿�
+     * @return 瀵瑰簲鐨勫涓敭鍊�
+     */
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 閿�
+     * @param map 瀵瑰簲澶氫釜閿��
+     * @return true 鎴愬姛 false 澶辫触
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 骞惰缃椂闂�
+     *
+     * @param key  閿�
+     * @param map  瀵瑰簲澶氫釜閿��
+     * @param time 鏃堕棿(绉�)
+     * @return true鎴愬姛 false澶辫触
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)  娉ㄦ剰:濡傛灉宸插瓨鍦ㄧ殑hash琛ㄦ湁鏃堕棿,杩欓噷灏嗕細鏇挎崲鍘熸湁鐨勬椂闂�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎hash琛ㄤ腑鐨勫��
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 鍙互浣垮涓� 涓嶈兘涓簄ull
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 鍒ゆ柇hash琛ㄤ腑鏄惁鏈夎椤圭殑鍊�
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash閫掑 濡傛灉涓嶅瓨鍦�,灏变細鍒涘缓涓�涓� 骞舵妸鏂板鍚庣殑鍊艰繑鍥�
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸鍔犲嚑(澶т簬0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash閫掑噺
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸噺灏戣(灏忎簬0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    //============================ set =============================
+
+    /**
+     * 鏍规嵁key鑾峰彇Set涓殑鎵�鏈夊��
+     *
+     * @param key 閿�
+     * @return
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鏍规嵁value浠庝竴涓猻et涓煡璇�,鏄惁瀛樺湪
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏嗘暟鎹斁鍏et缂撳瓨
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 灏唖et鏁版嵁鏀惧叆缂撳瓨
+     *
+     * @param key    閿�
+     * @param time   鏃堕棿(绉�)
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 鑾峰彇set缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     * @return
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 绉婚櫎鍊间负value鐨�
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    //===============================list=================================
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勫唴瀹�
+     *
+     * @param key   閿�
+     * @param start 寮�濮�
+     * @param end   缁撴潫  0 鍒� -1浠h〃鎵�鏈夊��
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     * @return
+     */
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 閫氳繃绱㈠紩 鑾峰彇list涓殑鍊�
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩  index>=0鏃讹紝 0 琛ㄥご锛�1 绗簩涓厓绱狅紝渚濇绫绘帹锛沬ndex<0鏃讹紝-1锛岃〃灏撅紝-2鍊掓暟绗簩涓厓绱狅紝渚濇绫绘帹
+     * @return
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁绱㈠紩淇敼list涓殑鏌愭潯鏁版嵁
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 绉婚櫎N涓�间负value
+     *
+     * @param key   閿�
+     * @param count 绉婚櫎澶氬皯涓�
+     * @param value 鍊�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 妯$硦鏌ヨ鑾峰彇key鍊�
+     *
+     * @param pattern
+     * @return
+     */
+    public Set keys(String pattern) {
+        return redisTemplate.keys(pattern);
+    }
+
+    /**
+     * 浣跨敤Redis鐨勬秷鎭槦鍒�
+     *
+     * @param channel
+     * @param message 娑堟伅鍐呭
+     */
+    public void convertAndSend(String channel, Object message) {
+        redisTemplate.convertAndSend(channel, message);
+    }
+
+
+}
+
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
index 5d947dd..c94a23f 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
@@ -353,7 +353,7 @@
                 sb.append(c);
             }
 
-            return sb.toString();
+            return "`" + sb.toString() + "`";
         }
     }
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/WebkitParseUtils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/WebkitParseUtils.java
new file mode 100644
index 0000000..2ea5a33
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/WebkitParseUtils.java
@@ -0,0 +1,96 @@
+package com.zy.asrs.wms.utils;
+
+import com.alibaba.fastjson.JSON;
+
+import java.util.HashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WebkitParseUtils {
+
+    private static final Pattern BOUNDARY_PATTERN = Pattern.compile("--WebKitFormBoundary([A-Za-z0-9+/]+)");
+    private static final Pattern NAME_PATTERN = Pattern.compile("Content-Disposition: form-data; name=\"([^\"]+)\"");
+    private static final Pattern VALUE_PATTERN = Pattern.compile("Content-Disposition: form-data; name=\"[^\"]+\"\\s*\\n\\s*\\n\\s*([^\\n]+)");
+
+    // 瑙f瀽WebKitFormBoundary瀛楃涓叉暟鎹�
+    public static String parseBoundary(String input) {
+        Matcher matcher = BOUNDARY_PATTERN.matcher(input);
+        if (matcher.find()) {
+            return matcher.group(1); // 杩斿洖鎹曡幏鐨勫瓧绗︿覆
+        }
+        return null; // 濡傛灉娌℃湁鍖归厤锛屽垯杩斿洖null
+    }
+
+    // 瑙f瀽鎵�鏈塶ame鐨勫��
+    public static List<String> parseNames(String input) {
+        List<String> names = new ArrayList<>();
+        Matcher matcher = NAME_PATTERN.matcher(input);
+        while (matcher.find()) {
+            names.add(matcher.group(1)); // 娣诲姞鎹曡幏鍒扮殑name鍊煎埌鍒楄〃
+        }
+        return names; // 杩斿洖鎵�鏈夊尮閰嶅埌鐨刵ame鍊�
+    }
+
+    // 瑙f瀽鎵�鏈夊�奸儴鍒�
+    public static List<String> parseValues(String input) {
+        List<String> values = new ArrayList<>();
+        Matcher matcher = VALUE_PATTERN.matcher(input);
+        while (matcher.find()) {
+            String trim = matcher.group(1).trim();
+            Matcher matcher2 = BOUNDARY_PATTERN.matcher(trim);
+            if(matcher2.find()) {
+                trim = "";
+            }
+            values.add(trim); // 娣诲姞鎹曡幏鍒扮殑鍊煎埌鍒楄〃锛屽苟鍘绘帀鍓嶅悗鐨勭┖鐧�
+        }
+        return values; // 杩斿洖鎵�鏈夊尮閰嶅埌鐨勫��
+    }
+
+    public static HashMap<String, Object> getFormData(String input) {
+//        // 瑙f瀽WebKitFormBoundary瀛楃涓�
+//        String boundary = parseBoundary(input);
+//        System.out.println("瑙f瀽鍑虹殑WebKitFormBoundary瀛楃涓叉槸: " + boundary);
+
+        // 瑙f瀽鎵�鏈塶ame鐨勫��
+        List<String> nameValues = parseNames(input);
+//        System.out.println("瑙f瀽鍑虹殑鎵�鏈塶ame鍊兼槸: " + nameValues);
+
+        // 瑙f瀽鎵�鏈夊��
+        List<String> values = parseValues(input);
+//        System.out.println("瑙f瀽鍑虹殑鎵�鏈夊�兼槸: " + values);
+
+        HashMap<String, Object> map = new HashMap<>();
+        for (int i = 0; i < nameValues.size(); i++) {
+            String key = nameValues.get(i);
+            // 纭繚鍗充娇鍊间负绌轰篃鑳芥甯稿瓨鍏ap
+            String value = i < values.size() ? values.get(i) : "";
+            map.put(key, value);
+        }
+
+//        System.out.println(JSON.toJSONString(map));
+        return map;
+    }
+
+    public static void main(String[] args) {
+        String input = "------WebKitFormBoundarySOfEJLg0rR0hf3mm\n" +
+                "Content-Disposition: form-data; name=\"locNo\"\n" +
+                "\n" +
+                "1\n" +
+                "------WebKitFormBoundarySOfEJLg0rR0hf3mm\n" +
+                "Content-Disposition: form-data; name=\"test\"\n" +
+                "\n" +
+                "123\n" +
+                "------WebKitFormBoundarySOfEJLg0rR0hf3mm\n" +
+                "Content-Disposition: form-data; name=\"quer\"\n" +
+                "\n" +
+                "111\n" +
+                "------WebKitFormBoundarySOfEJLg0rR0hf3mm--";
+
+        getFormData(input);
+
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/resources/application.yml b/zy-asrs-wms/src/main/resources/application.yml
index ac88949..2961220 100644
--- a/zy-asrs-wms/src/main/resources/application.yml
+++ b/zy-asrs-wms/src/main/resources/application.yml
@@ -26,6 +26,11 @@
     multipart:
       maxFileSize: 100MB
       maxRequestSize: 100MB
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    database: 6
+  #    password: 123456
 
 mybatis-plus:
   mapper-locations: classpath:mapper/*/*.xml
@@ -58,4 +63,8 @@
   publicAlias: publicCert
   storePass: public_zhongyang_123456789
   licensePath: license.lic
-  publicKeysStorePath: publicCerts.keystore
\ No newline at end of file
+  publicKeysStorePath: publicCerts.keystore
+
+#鎺ュ彛缂撳瓨
+system:
+  enableCache: true
\ No newline at end of file
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/CacheStatisticsMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/CacheStatisticsMapper.xml
new file mode 100644
index 0000000..8ff556b
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/CacheStatisticsMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wms.asrs.mapper.CacheStatisticsMapper">
+
+</mapper>
diff --git a/zy-asrs-wms/src/main/resources/sql/menu/cacheStatistics.sql b/zy-asrs-wms/src/main/resources/sql/menu/cacheStatistics.sql
new file mode 100644
index 0000000..78b8ff0
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/sql/menu/cacheStatistics.sql
@@ -0,0 +1,9 @@
+-- save cacheStatistics record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '绯荤粺缂撳瓨缁熻绠$悊', '0', '/asrs/cacheStatistics', '/asrs/cacheStatistics', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ绯荤粺缂撳瓨缁熻', '', '1', 'asrs:cacheStatistics:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞绯荤粺缂撳瓨缁熻', '', '1', 'asrs:cacheStatistics:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼绯荤粺缂撳瓨缁熻', '', '1', 'asrs:cacheStatistics:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎绯荤粺缂撳瓨缁熻', '', '1', 'asrs:cacheStatistics:remove', '3', '1', '1');
+

--
Gitblit v1.9.1