#
Junjie
2024-07-09 0b86f0390c17ca06758cc436596774e56687a875
#
5个文件已修改
18个文件已添加
1 文件已重命名
1892 ■■■■■ 已修改文件
zy-asrs-admin/src/locales/en_US.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/mat/edit.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/mat/index.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/config/matField/edit.vue 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/config/matField/field.vue 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/config/matField/index.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locDetl/edit.vue 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locDetl/index.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatController.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Mat.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/locDetl.sql 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/matField.sql 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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',
};
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>
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;">
zy-asrs-admin/src/views/config/matField/edit.vue
New file
@@ -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', '国际化ID')" 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: '正常', 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>
zy-asrs-admin/src/views/config/matField/field.vue
zy-asrs-admin/src/views/config/matField/index.vue
New file
@@ -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', '国际化ID'),
    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>
zy-asrs-admin/src/views/loc/locDetl/edit.vue
New file
@@ -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: '正常', 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>
zy-asrs-admin/src/views/loc/locDetl/index.vue
New file
@@ -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>
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
New file
@@ -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);
    }
}
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("添加商品档案")
    @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("修改商品档案")
    @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;
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MatFieldController.java
New file
@@ -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);
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
New file
@@ -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: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  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 "正常";
            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;
    }
}
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) {
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/MatField.java
New file
@@ -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;
    /**
     * 国际化ID
     */
    @ApiModelProperty(value= "国际化ID")
    @TableField("language")
    private String language;
    /**
     * 索引 0: 否  1: 是
     */
    @ApiModelProperty(value= "索引 0: 否  1: 是  ")
    @TableField("`unique`")
    private Integer unique;
    /**
     * 所属机构
     */
    @ApiModelProperty(value= "所属机构")
    private Long hostId;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  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,    // 国际化ID
//            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 "正常";
            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;
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocDetlMapper.java
New file
@@ -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> {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/MatFieldMapper.java
New file
@@ -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> {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
New file
@@ -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> {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MatFieldService.java
New file
@@ -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> {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
New file
@@ -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 {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MatFieldServiceImpl.java
New file
@@ -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 {
}
zy-asrs-wms/src/main/java/locDetl.sql
New file
@@ -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');
zy-asrs-wms/src/main/java/matField.sql
New file
@@ -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');
zy-asrs-wms/src/main/resources/mapper/asrs/LocDetlMapper.xml
New file
@@ -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>
zy-asrs-wms/src/main/resources/mapper/asrs/MatFieldMapper.xml
New file
@@ -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>