From 0b86f0390c17ca06758cc436596774e56687a875 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期二, 09 七月 2024 09:03:54 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java                  |  237 +++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java           |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java |   12 
 zy-asrs-admin/src/views/base/mat/index.vue                                           |  103 ++-
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java         |   68 +
 zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml                         |    5 
 zy-asrs-wms/src/main/java/matField.sql                                               |    9 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java                   |  266 ++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.java    |  102 +++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java     |  102 +++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java                       |    6 
 zy-asrs-wms/src/main/java/locDetl.sql                                                |    9 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java            |   12 
 zy-asrs-admin/src/views/config/matField/index.vue                                    |  226 +++++++
 zy-asrs-admin/src/views/config/matField/field.vue                                    |    0 
 zy-asrs-admin/src/views/loc/locDetl/index.vue                                        |  244 +++++++
 zy-asrs-admin/src/views/loc/locDetl/edit.vue                                         |  269 ++++++++
 zy-asrs-admin/src/views/base/mat/edit.vue                                            |   21 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java             |   12 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.java          |    8 
 zy-asrs-admin/src/locales/en_US.js                                                   |    7 
 zy-asrs-admin/src/views/config/matField/edit.vue                                     |  149 ++++
 zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.xml                        |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java  |   12 
 24 files changed, 1,849 insertions(+), 43 deletions(-)

diff --git a/zy-asrs-admin/src/locales/en_US.js b/zy-asrs-admin/src/locales/en_US.js
index 195ec89..036cb79 100644
--- a/zy-asrs-admin/src/locales/en_US.js
+++ b/zy-asrs-admin/src/locales/en_US.js
@@ -234,4 +234,11 @@
     'db.man_zpallet_barcode.barcodeValue':'Barcode Value',
     'db.man_zpallet_barcode.generateNum':'Generate Num',
     'db.man_zpallet_barcode.batchPrint':'Batch Print',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    'db.man_zpallet_barcode.batchPrint':'Batch Print',
 };
\ No newline at end of file
diff --git a/zy-asrs-admin/src/views/base/mat/edit.vue b/zy-asrs-admin/src/views/base/mat/edit.vue
index 2d83057..ad4cb9c 100644
--- a/zy-asrs-admin/src/views/base/mat/edit.vue
+++ b/zy-asrs-admin/src/views/base/mat/edit.vue
@@ -11,6 +11,7 @@
 const submitButton = ref(null);
 const isSave = ref(true);
 const open = ref(false);
+const extendField = ref([]);
 const initFormData = {}
 let formData = ref(initFormData);
 
@@ -58,6 +59,22 @@
         let result = resp.data;
         TagQueryTree.value = result.data;
     })
+}
+
+//鎵╁睍瀛楁
+getColumns()
+async function getColumns() {
+  let fieldResp = await post('/api/matField/list', {})
+  let fieldResult = fieldResp.data;
+  if (fieldResult.code == 200) {
+    let data = fieldResult.data;
+    extendField.value = data;
+  } else if (result.code === 401) {
+    message.error(result.msg);
+    logout()
+  } else {
+    message.error(result.msg);
+  }
 }
 
 
@@ -223,6 +240,10 @@
                     <a-input v-model:value="formData.memo" />
                 </a-form-item>
 
+                <a-form-item v-for="(item, index) in extendField" :key="index" :label="formatMessage(item.language, item.describe)" :name="item.name" style="width: 250px;">
+                    <a-input v-model:value="formData[item.name]" />
+                </a-form-item>
+
                 <a-form-item>
                     <a-button type="primary" html-type="submit" ref="submitButton"
                         style="visibility: hidden;">Submit</a-button>
diff --git a/zy-asrs-admin/src/views/base/mat/index.vue b/zy-asrs-admin/src/views/base/mat/index.vue
index 987cb16..721af7e 100644
--- a/zy-asrs-admin/src/views/base/mat/index.vue
+++ b/zy-asrs-admin/src/views/base/mat/index.vue
@@ -1,11 +1,10 @@
 <script setup>
 import { getCurrentInstance, ref, computed, reactive } from 'vue';
 import { useRouter } from "vue-router";
-import { get, post, postBlob } from '@/utils/request.js'
+import { get, post, postBlob, postForm } from '@/utils/request.js'
 import { message, Modal } from 'ant-design-vue';
 import { logout } from '@/config.js';
 import EditView from './edit.vue'
-import FieldView from './field.vue'
 import { formatMessage } from '@/utils/localeUtils.js';
 const context = getCurrentInstance()?.appContext.config.globalProperties;
 
@@ -16,12 +15,31 @@
 let pageSize = 10;
 const searchInput = ref("")
 const editChild = ref(null)
-const fieldChild = ref(null)
 
 let tableData = ref([]);
+getColumns();
 getPage();
 
-const columns = [
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+  columns: []
+});
+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;
+};
+
+state.columns = [
   {
     title: formatMessage('db.man_mat.tag_id', '鎵�灞炲綊绫�'),
     dataIndex: 'tagId$',
@@ -222,34 +240,44 @@
     ellipsis: true,
   },
 
-  {
-    title: formatMessage('common.operation', '鎿嶄綔'),
-    name: 'oper',
-    dataIndex: 'oper',
-    key: 'oper',
-    width: 140,
-  },
 ];
 
-const state = reactive({
-  selectedRowKeys: [],
-  loading: false,
-});
-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;
-};
+//鍔犺浇鎵╁睍瀛楁
+async function getColumns() {
+  let fieldResp = await post('/api/matField/list', {})
+  let fieldResult = fieldResp.data;
+  let tmp = state.columns;
+  if (fieldResult.code == 200) {
+    let data = fieldResult.data;
 
-function getPage() {
+    data.forEach((item) => {
+      tmp.push({
+        title: formatMessage(item.language, item.describe),
+        name: item.name,
+        dataIndex: item.name,
+        key: item.name,
+        width: 140,
+      })
+    })
+
+    tmp.push({
+      title: formatMessage('common.operation', '鎿嶄綔'),
+      name: 'oper',
+      dataIndex: 'oper',
+      key: 'oper',
+      width: 140,
+    })
+
+    state.columns = tmp;
+  } else if (result.code === 401) {
+    message.error(result.msg);
+    logout()
+  } else {
+    message.error(result.msg);
+  }
+}
+
+async function getPage() {
   post('/api/mat/page', {
     current: currentPage,
     pageSize: pageSize,
@@ -272,10 +300,6 @@
   editChild.value.open = true;
   editChild.value.formData = item == null ? editChild.value.initFormData : JSON.parse(JSON.stringify(item));
   editChild.value.isSave = item == null;
-}
-
-const handleField = () => {
-  fieldChild.value.open = true;
 }
 
 const handleDel = (rows) => {
@@ -326,6 +350,15 @@
   getPage()
 }
 
+const matFieldList = ref(null);
+MatFieldQuery();
+function MatFieldQuery() {
+  post('/api/matField/list', {}).then(resp => {
+    let result = resp.data;
+    matFieldList.value = result.data;
+  })
+}
+
 </script>
 
 <script>
@@ -336,21 +369,19 @@
 
 <template>
   <div>
-    <FieldView ref="fieldChild" @tableReload="handleTableReload" />
     <EditView ref="editChild" @tableReload="handleTableReload" />
     <div class="table-header">
       <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '璇疯緭鍏�')"
         style="width: 200px;" @search="onSearch" />
       <div class="table-header-right">
         <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '娣诲姞') }}</a-button>
-        <a-button @click="handleField" type="primary">{{ formatMessage('page.add.field', '娣诲姞瀛楁') }}</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">
+      :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="state.columns">
       <template #bodyCell="{ column, text, record }">
         <template v-if="column.dataIndex === 'oper'">
           <div style="display: flex;justify-content: space-evenly;">
diff --git a/zy-asrs-admin/src/views/config/matField/edit.vue b/zy-asrs-admin/src/views/config/matField/edit.vue
new file mode 100644
index 0000000..128f240
--- /dev/null
+++ b/zy-asrs-admin/src/views/config/matField/edit.vue
@@ -0,0 +1,149 @@
+<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/matField/save' : '/api/matField/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.man_mat_field.name', '瀛楁鍚�')" name="name" style="width: 250px;">
+                    <a-input v-model:value="formData.name" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_mat_field.type', '绫诲瀷')" name="type" style="width: 250px;">
+                    <a-select v-model:value="formData.type" :options="[
+                        { label: '瀛楃涓�', value: 'str' },
+                        { label: '鏁板��', value: 'num' },
+                        { label: '甯冨皵', value: 'bool' },
+                    ]">
+                    </a-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_mat_field.describe', '鎻忚堪')" name="describe"
+                    style="width: 250px;">
+                    <a-input v-model:value="formData.describe" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_mat_field.language', '鍥介檯鍖朓D')" name="language"
+                    style="width: 250px;">
+                    <a-input v-model:value="formData.language" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_mat_field.unique', '绱㈠紩')" name="unique"
+                    style="width: 250px;">
+                    <a-select v-model:value="formData.unique" :options="[
+                        { label: '鍚�', value: 0 },
+                        { label: '鏄�', value: 1 },
+                    ]">
+                    </a-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_mat_field.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.man_mat_field.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.man_mat_field.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.man_mat_field.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.man_mat_field.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.man_mat_field.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/base/mat/field.vue b/zy-asrs-admin/src/views/config/matField/field.vue
similarity index 100%
rename from zy-asrs-admin/src/views/base/mat/field.vue
rename to zy-asrs-admin/src/views/config/matField/field.vue
diff --git a/zy-asrs-admin/src/views/config/matField/index.vue b/zy-asrs-admin/src/views/config/matField/index.vue
new file mode 100644
index 0000000..d785f2d
--- /dev/null
+++ b/zy-asrs-admin/src/views/config/matField/index.vue
@@ -0,0 +1,226 @@
+<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';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-matField';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+
+let tableData = ref([]);
+getPage();
+
+const columns = [
+  {
+    title: formatMessage('db.man_mat_field.name', '瀛楁鍚�'),
+    dataIndex: 'name',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.type', '绫诲瀷'),
+    dataIndex: 'type',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.describe', '鎻忚堪'),
+    dataIndex: 'describe',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.language', '鍥介檯鍖朓D'),
+    dataIndex: 'language',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.unique', '绱㈠紩'),
+    dataIndex: 'unique$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.status', '鐘舵��'),
+    dataIndex: 'status$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.create_time', '娣诲姞鏃堕棿'),
+    dataIndex: 'createTime$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.create_by', '娣诲姞浜哄憳'),
+    dataIndex: 'createBy$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.update_time', '淇敼鏃堕棿'),
+    dataIndex: 'updateTime$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.update_by', '淇敼浜哄憳'),
+    dataIndex: 'updateBy$',
+    width: 140,
+    ellipsis: true,
+  },
+  {
+    title: formatMessage('db.man_mat_field.memo', '澶囨敞'),
+    dataIndex: 'memo',
+    width: 140,
+    ellipsis: true,
+  },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 140,
+  },
+];
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+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() {
+  post('/api/matField/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;
+    } 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/matField/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/matField/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">
+      <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-admin/src/views/loc/locDetl/edit.vue b/zy-asrs-admin/src/views/loc/locDetl/edit.vue
new file mode 100644
index 0000000..82638f3
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/locDetl/edit.vue
@@ -0,0 +1,269 @@
+<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/locDetl/save' : '/api/locDetl/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 locQueryList = ref(null); 
+locQuery();
+function locQuery() { 
+    postForm('/api/loc/query', {}).then(resp => { 
+        let result = resp.data;
+        locQueryList.value = result.data;
+    })
+}
+const matQueryList = ref(null); 
+matQuery();
+function matQuery() { 
+    postForm('/api/mat/query', {}).then(resp => { 
+        let result = resp.data;
+        matQueryList.value = result.data;
+    })
+}
+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.man_loc_detl.loc_id', '搴撲綅') " 
+                      name="locId" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.locId" 
+                        :placeholder="formatMessage('common.select', '璇烽�夋嫨')" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="locQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.loc_no', '搴撲綅鍙�') " 
+                      name="locNo" 
+                      style="width: 250px;" 
+                            :rules="[{ required: true }]"
+                            >
+                    <a-input 
+                        v-model:value="formData.locNo" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.mat_id', '鐗╂枡') " 
+                      name="matId" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.matId" 
+                        :placeholder="formatMessage('common.select', '璇烽�夋嫨')" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="matQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.matnr', '鐗╂枡鍙�') " 
+                      name="matnr" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.matnr" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.order_no', '璁㈠崟鍙�') " 
+                      name="orderNo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.orderNo" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.batch', '鎵瑰彿') " 
+                      name="batch" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.batch" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.anfme', '鏁伴噺') " 
+                      name="anfme" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.anfme" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.extend', '鎵╁睍') " 
+                      name="extend" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.extend" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      :label="formatMessage('db.man_loc_detl.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.man_loc_detl.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.man_loc_detl.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.man_loc_detl.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.man_loc_detl.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.man_loc_detl.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/loc/locDetl/index.vue b/zy-asrs-admin/src/views/loc/locDetl/index.vue
new file mode 100644
index 0000000..642d0d9
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/locDetl/index.vue
@@ -0,0 +1,244 @@
+<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';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-locDetl';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+
+let tableData = ref([]);
+getPage();
+
+const columns = [
+        {
+            title: formatMessage('db.man_loc_detl.loc_id', '搴撲綅'),
+            dataIndex: 'locId$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.loc_no', '搴撲綅鍙�'),
+            dataIndex: 'locNo',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.mat_id', '鐗╂枡'),
+            dataIndex: 'matId$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.matnr', '鐗╂枡鍙�'),
+            dataIndex: 'matnr',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.order_no', '璁㈠崟鍙�'),
+            dataIndex: 'orderNo',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.batch', '鎵瑰彿'),
+            dataIndex: 'batch',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.anfme', '鏁伴噺'),
+            dataIndex: 'anfme',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.extend', '鎵╁睍'),
+            dataIndex: 'extend',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.status', '鐘舵��'),
+            dataIndex: 'status$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.create_time', '娣诲姞鏃堕棿'),
+            dataIndex: 'createTime$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.create_by', '娣诲姞浜哄憳'),
+            dataIndex: 'createBy$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.update_time', '淇敼鏃堕棿'),
+            dataIndex: 'updateTime$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.update_by', '淇敼浜哄憳'),
+            dataIndex: 'updateBy$',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.man_loc_detl.memo', '澶囨敞'),
+            dataIndex: 'memo',
+            width: 140,
+            ellipsis: true,
+        },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 140,
+  },
+];
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+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() {
+  post('/api/locDetl/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;
+    } 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/locDetl/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/locDetl/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">
+      <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/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
new file mode 100644
index 0000000..696873e
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.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.LocDetl;
+import com.zy.asrs.wms.asrs.service.LocDetlService;
+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 LocDetlController extends BaseController {
+
+    @Autowired
+    private LocDetlService locDetlService;
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:list')")
+    @PostMapping("/locDetl/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<LocDetl, BaseParam> pageParam = new PageParam<>(baseParam, LocDetl.class);
+        return R.ok().add(locDetlService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:list')")
+    @PostMapping("/locDetl/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(locDetlService.list());
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:list')")
+    @GetMapping("/locDetl/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(locDetlService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:save')")
+    @OperationLog("娣诲姞搴撳瓨鏄庣粏")
+    @PostMapping("/locDetl/save")
+    public R save(@RequestBody LocDetl locDetl) {
+        if (!locDetlService.save(locDetl)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:update')")
+    @OperationLog("淇敼搴撳瓨鏄庣粏")
+    @PostMapping("/locDetl/update")
+    public R update(@RequestBody LocDetl locDetl) {
+        if (!locDetlService.updateById(locDetl)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:remove')")
+    @OperationLog("鍒犻櫎搴撳瓨鏄庣粏")
+    @PostMapping("/locDetl/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!locDetlService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:list')")
+    @PostMapping("/locDetl/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<LocDetl> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(LocDetl::getId, condition);
+        }
+        locDetlService.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:locDetl:list')")
+    @PostMapping("/locDetl/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(locDetlService.list(), LocDetl.class), response);
+    }
+
+}
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 34e2c0e..36e50ef 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
@@ -1,9 +1,15 @@
 package com.zy.asrs.wms.asrs.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.asrs.entity.MatField;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -17,10 +23,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/api")
@@ -28,13 +31,40 @@
 
     @Autowired
     private MatService matService;
+    @Autowired
+    private MatFieldService matFieldService;
 
     @PreAuthorize("hasAuthority('asrs:mat:list')")
     @PostMapping("/mat/page")
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Mat, BaseParam> pageParam = new PageParam<>(baseParam, Mat.class);
-        return R.ok().add(matService.page(pageParam, pageParam.buildWrapper(true)));
+        PageParam<Mat, BaseParam> page = matService.page(pageParam, pageParam.buildWrapper(true));
+
+        JSONObject data = JSON.parseObject(JSON.toJSONString(page));
+
+        ArrayList<JSONObject> list = new ArrayList<>();
+        data.put("records", list);
+        List<Mat> records = page.getRecords();
+        for (Mat record : records) {
+            JSONObject tmp = JSON.parseObject(JSON.toJSONString(record));
+            String extend = record.getExtend();
+            if (!Cools.isEmpty(extend)) {
+                List<JSONObject> matFields = JSON.parseArray(extend, JSONObject.class);
+                for (JSONObject matField : matFields) {
+                    if (matField.getString("type").equals("num")) {
+                        tmp.put(matField.getString("name"), matField.getDouble("value"));
+                    } else if (matField.getString("type").equals("bool")) {
+                        tmp.put(matField.getString("name"), matField.getBoolean("value"));
+                    }else {
+                        tmp.put(matField.getString("name"), matField.getString("value"));
+                    }
+                }
+            }
+            list.add(tmp);
+        }
+
+        return R.ok().add(data);
     }
 
     @PreAuthorize("hasAuthority('asrs:mat:list')")
@@ -52,7 +82,12 @@
     @PreAuthorize("hasAuthority('asrs:mat:save')")
     @OperationLog("娣诲姞鍟嗗搧妗f")
     @PostMapping("/mat/save")
-    public R save(@RequestBody Mat mat) {
+    public R save(@RequestBody HashMap<String,Object> param) {
+        Mat mat = JSON.parseObject(JSON.toJSONString(param), Mat.class, Feature.DisableCircularReferenceDetect);
+        //鑾峰彇鎵╁睍瀛楁
+        List<JSONObject> fields = getMatFieldList(param);
+        mat.setExtend(JSON.toJSONString(fields, SerializerFeature.DisableCircularReferenceDetect));
+
         if (!matService.save(mat)) {
             return R.error("娣诲姞澶辫触");
         }
@@ -62,7 +97,12 @@
     @PreAuthorize("hasAuthority('asrs:mat:update')")
     @OperationLog("淇敼鍟嗗搧妗f")
     @PostMapping("/mat/update")
-    public R update(@RequestBody Mat mat) {
+    public R update(@RequestBody HashMap<String,Object> param) {
+        Mat mat = JSON.parseObject(JSON.toJSONString(param), Mat.class, Feature.DisableCircularReferenceDetect);
+        //鑾峰彇鎵╁睍瀛楁
+        List<JSONObject> fields = getMatFieldList(param);
+        mat.setExtend(JSON.toJSONString(fields, SerializerFeature.DisableCircularReferenceDetect));
+
         if (!matService.updateById(mat)) {
             return R.error("淇敼澶辫触");
         }
@@ -99,4 +139,18 @@
         ExcelUtil.build(ExcelUtil.create(matService.list(), Mat.class), response);
     }
 
+    private List<JSONObject> getMatFieldList(HashMap<String, Object> param) {
+        //鑾峰彇鎵╁睍瀛楁
+        List<MatField> matFields = matFieldService.list();
+        ArrayList<JSONObject> fields = new ArrayList<>();
+        for (MatField matField : matFields) {
+            if(param.containsKey(matField.getName())){
+                JSONObject parsed = JSON.parseObject(JSON.toJSONString(matField), Feature.DisableCircularReferenceDetect);
+                parsed.put("value", param.get(matField.getName()));
+                fields.add(parsed);
+            }
+        }
+        return fields;
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.java
new file mode 100644
index 0000000..cb680b4
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.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.MatField;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
+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 MatFieldController extends BaseController {
+
+    @Autowired
+    private MatFieldService matFieldService;
+
+    @PreAuthorize("hasAuthority('asrs:matField:list')")
+    @PostMapping("/matField/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<MatField, BaseParam> pageParam = new PageParam<>(baseParam, MatField.class);
+        return R.ok().add(matFieldService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:list')")
+    @PostMapping("/matField/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(matFieldService.list());
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:list')")
+    @GetMapping("/matField/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(matFieldService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:save')")
+    @OperationLog("娣诲姞鍟嗗搧灞炴�ф墿灞�")
+    @PostMapping("/matField/save")
+    public R save(@RequestBody MatField matField) {
+        if (!matFieldService.save(matField)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:update')")
+    @OperationLog("淇敼鍟嗗搧灞炴�ф墿灞�")
+    @PostMapping("/matField/update")
+    public R update(@RequestBody MatField matField) {
+        if (!matFieldService.updateById(matField)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:remove')")
+    @OperationLog("鍒犻櫎鍟嗗搧灞炴�ф墿灞�")
+    @PostMapping("/matField/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!matFieldService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:matField:list')")
+    @PostMapping("/matField/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<MatField> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(MatField::getId, condition);
+        }
+        matFieldService.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:matField:list')")
+    @PostMapping("/matField/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(matFieldService.list(), MatField.class), response);
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
new file mode 100644
index 0000000..cef2f5a
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
@@ -0,0 +1,266 @@
+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.asrs.service.LocService;
+import com.zy.asrs.wms.asrs.service.MatService;
+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 java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_loc_detl")
+public class LocDetl implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 搴撲綅
+     */
+    @ApiModelProperty(value= "搴撲綅")
+    private Long locId;
+
+    /**
+     * 搴撲綅鍙�
+     */
+    @ApiModelProperty(value= "搴撲綅鍙�")
+    private String locNo;
+
+    /**
+     * 鐗╂枡
+     */
+    @ApiModelProperty(value= "鐗╂枡")
+    private Long matId;
+
+    /**
+     * 鐗╂枡鍙�
+     */
+    @ApiModelProperty(value= "鐗╂枡鍙�")
+    private String matnr;
+
+    /**
+     * 璁㈠崟鍙�
+     */
+    @ApiModelProperty(value= "璁㈠崟鍙�")
+    private String orderNo;
+
+    /**
+     * 鎵瑰彿
+     */
+    @ApiModelProperty(value= "鎵瑰彿")
+    private String batch;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private Double anfme;
+
+    /**
+     * 鎵╁睍
+     */
+    @ApiModelProperty(value= "鎵╁睍")
+    private String extend;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @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 LocDetl() {}
+
+    public LocDetl(Long locId,String locNo,Long matId,String matnr,String orderNo,String batch,Double anfme,String extend,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.locId = locId;
+        this.locNo = locNo;
+        this.matId = matId;
+        this.matnr = matnr;
+        this.orderNo = orderNo;
+        this.batch = batch;
+        this.anfme = anfme;
+        this.extend = extend;
+        this.hostId = hostId;
+        this.status = status;
+        this.deleted = deleted;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    LocDetl locDetl = new LocDetl(
+//            null,    // 搴撲綅
+//            null,    // 搴撲綅鍙穂闈炵┖]
+//            null,    // 鐗╂枡
+//            null,    // 鐗╂枡鍙�
+//            null,    // 璁㈠崟鍙�
+//            null,    // 鎵瑰彿
+//            null,    // 鏁伴噺
+//            null,    // 鎵╁睍
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 鐘舵��
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getLocId$(){
+        LocService service = SpringUtils.getBean(LocService.class);
+        Loc loc = service.getById(this.locId);
+        if (!Cools.isEmpty(loc)){
+            return String.valueOf(loc.getLocNo());
+        }
+        return null;
+    }
+
+    public String getMatId$(){
+        MatService service = SpringUtils.getBean(MatService.class);
+        Mat mat = service.getById(this.matId);
+        if (!Cools.isEmpty(mat)){
+            return String.valueOf(mat.getId());
+        }
+        return 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;
+    }
+
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java
index 0d7fcaf..ca2d51a 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java
@@ -252,6 +252,12 @@
     @ApiModelProperty(value= "淇濊川鏈�")
     private String deadTime;
 
+    /**
+     * 鎵╁睍瀛楁
+     */
+    @ApiModelProperty(value= "鎵╁睍瀛楁")
+    private String extend;
+
     public Mat() {}
 
     public Mat(String uuid,String flag,Integer sort,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo,Long tagId,String matnr,String maktx,String name,String specs,String model,String color,String brand,String unit,Double price,String sku,String units,String barcode,String origin,String manu,String manuDate,String itemNum,String weight,String length,String volume,String threeCode,String supp,String suppCode,String deadTime) {
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
new file mode 100644
index 0000000..5d1afca
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java
@@ -0,0 +1,237 @@
+package com.zy.asrs.wms.asrs.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+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.TableLogic;
+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 java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_mat_field")
+public class MatField implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 瀛楁鍚�
+     */
+    @ApiModelProperty(value= "瀛楁鍚�")
+    @TableField("name")
+    private String name;
+
+    /**
+     * 绫诲瀷
+     */
+    @ApiModelProperty(value= "绫诲瀷")
+    @TableField("type")
+    private String type;
+
+    /**
+     * 鎻忚堪
+     */
+    @ApiModelProperty(value= "鎻忚堪")
+    @TableField("`describe`")
+    private String describe;
+
+    /**
+     * 鍥介檯鍖朓D
+     */
+    @ApiModelProperty(value= "鍥介檯鍖朓D")
+    @TableField("language")
+    private String language;
+
+    /**
+     * 绱㈠紩 0: 鍚�  1: 鏄�  
+     */
+    @ApiModelProperty(value= "绱㈠紩 0: 鍚�  1: 鏄�  ")
+    @TableField("`unique`")
+    private Integer unique;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @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 MatField() {}
+
+    public MatField(String name,String type,String describe,String language,Integer unique,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.name = name;
+        this.type = type;
+        this.describe = describe;
+        this.language = language;
+        this.unique = unique;
+        this.hostId = hostId;
+        this.status = status;
+        this.deleted = deleted;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    MatField matField = new MatField(
+//            null,    // 瀛楁鍚�
+//            null,    // 绫诲瀷
+//            null,    // 鎻忚堪
+//            null,    // 鍥介檯鍖朓D
+//            null,    // 绱㈠紩
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 鐘舵��
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getUnique$(){
+        if (null == this.unique){ return null; }
+        switch (this.unique){
+            case 0:
+                return "鍚�";
+            case 1:
+                return "鏄�";
+            default:
+                return String.valueOf(this.unique);
+        }
+    }
+
+    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;
+    }
+
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
new file mode 100644
index 0000000..c5c4eeb
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface LocDetlMapper extends BaseMapper<LocDetl> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
new file mode 100644
index 0000000..f4f76de
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.zy.asrs.wms.asrs.entity.MatField;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface MatFieldMapper extends BaseMapper<MatField> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
new file mode 100644
index 0000000..cf6c8d5
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.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.LocDetl;
+
+public interface LocDetlService extends IService<LocDetl> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.java
new file mode 100644
index 0000000..bb9fc31
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.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.MatField;
+
+public interface MatFieldService extends IService<MatField> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
new file mode 100644
index 0000000..74db866
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.service.impl;
+
+import com.zy.asrs.wms.asrs.mapper.LocDetlMapper;
+import com.zy.asrs.wms.asrs.entity.LocDetl;
+import com.zy.asrs.wms.asrs.service.LocDetlService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("locDetlService")
+public class LocDetlServiceImpl extends ServiceImpl<LocDetlMapper, LocDetl> implements LocDetlService {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
new file mode 100644
index 0000000..06dd282
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.service.impl;
+
+import com.zy.asrs.wms.asrs.mapper.MatFieldMapper;
+import com.zy.asrs.wms.asrs.entity.MatField;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("matFieldService")
+public class MatFieldServiceImpl extends ServiceImpl<MatFieldMapper, MatField> implements MatFieldService {
+
+}
diff --git a/zy-asrs-wms/src/main/java/locDetl.sql b/zy-asrs-wms/src/main/java/locDetl.sql
new file mode 100644
index 0000000..cc69613
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/locDetl.sql
@@ -0,0 +1,9 @@
+-- save locDetl record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '搴撳瓨鏄庣粏绠$悊', '0', '/asrs/locDetl', '/asrs/locDetl', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ搴撳瓨鏄庣粏', '', '1', 'asrs:locDetl:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞搴撳瓨鏄庣粏', '', '1', 'asrs:locDetl:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼搴撳瓨鏄庣粏', '', '1', 'asrs:locDetl:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎搴撳瓨鏄庣粏', '', '1', 'asrs:locDetl:remove', '3', '1', '1');
+
diff --git a/zy-asrs-wms/src/main/java/matField.sql b/zy-asrs-wms/src/main/java/matField.sql
new file mode 100644
index 0000000..58103e1
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/matField.sql
@@ -0,0 +1,9 @@
+-- save matField record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '鍟嗗搧灞炴�ф墿灞曠鐞�', '0', '/asrs/matField', '/asrs/matField', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ鍟嗗搧灞炴�ф墿灞�', '', '1', 'asrs:matField:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞鍟嗗搧灞炴�ф墿灞�', '', '1', 'asrs:matField:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼鍟嗗搧灞炴�ф墿灞�', '', '1', 'asrs:matField:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎鍟嗗搧灞炴�ф墿灞�', '', '1', 'asrs:matField:remove', '3', '1', '1');
+
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml
new file mode 100644
index 0000000..3124f9a
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.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.LocDetlMapper">
+
+</mapper>
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.xml
new file mode 100644
index 0000000..33989db
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.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.MatFieldMapper">
+
+</mapper>

--
Gitblit v1.9.1