payne
2024-04-23 3112a2cacb090aaa7a25edcf48be047249ff9d1d
Merge branch 'master' of http://222.71.245.114:9086/r/iWare_RawMaterialWarehouse
已添加35个文件
已修改1个文件
5888 ■■■■■ 文件已修改
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsContainerPackagingManage.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsSubstituteGoodManage.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsWarehouseManage.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/addForm.vue 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/editForm.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/excelForm.vue 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/index.vue 498 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabForm.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabItem/addFormContainerPackaging.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabItem/addFormWmsSubstituteGood.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/addForm.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/editForm.vue 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/excelForm.vue 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/index.vue 537 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/addForm.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/editForm.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/excelForm.vue 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/index.vue 638 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Dto/WmsContainerPackagingInput.cs 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Dto/WmsContainerPackagingOutput.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/IWmsContainerPackagingService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Map/WmsContainerPackagingMapper.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/WmsContainerPackagingService.cs 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodInput.cs 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodOutput.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/IWmsSubstituteGoodService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Map/WmsSubstituteGoodMapper.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/WmsSubstituteGoodService.cs 481 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Dto/WmsWarehouseInput.cs 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Dto/WmsWarehouseOutput.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/IWmsWarehouseService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Map/WmsWarehouseMapper.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/WmsWarehouseService.cs 517 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsContainerPackagingImport.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsSubstituteGoodImport.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsWarehouseImport.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsContainerPackagingManage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
import { axios } from '@/utils/request'
/**
 * æŸ¥è¯¢åŒ…装关系基础表
 *
 * @author ly
 */
export function WmsContainerPackagingPage (parameter) {
  return axios({
    url: '/WmsContainerPackaging/page',
    method: 'get',
    params: parameter
  })
}
/**
 * åŒ…装关系基础表列表
 *
 * @author ly
 */
export function WmsContainerPackagingList (parameter) {
  return axios({
    url: '/WmsContainerPackaging/list',
    method: 'get',
    params: parameter
  })
}
/**
 * æ·»åŠ åŒ…è£…å…³ç³»åŸºç¡€è¡¨
 *
 * @author ly
 */
export function WmsContainerPackagingAdd (parameter) {
  return axios({
    url: '/WmsContainerPackaging/add',
    method: 'post',
    data: parameter
  })
}
/**
 * ç¼–辑包装关系基础表
 *
 * @author ly
 */
export function WmsContainerPackagingEdit (parameter) {
  return axios({
    url: '/WmsContainerPackaging/edit',
    method: 'post',
    data: parameter
  })
}
/**
 * åˆ é™¤åŒ…装关系基础表
 *
 * @author ly
 */
export function WmsContainerPackagingDelete (parameter) {
  return axios({
    url: '/WmsContainerPackaging/delete',
    method: 'post',
    data: parameter
  })
}
/**
 * å¯¼å‡ºåŒ…装关系基础表的Excel文件
 *
 * @author ly
 */
export function WmsContainerPackagingToExcel (parameter) {
  return axios({
    url: '/WmsContainerPackaging/toExcel',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
/**
 * å¯¼å…¥åŒ…装关系基础表的Excel文件
 *
 * @author ly
 */
export function WmsContainerPackagingImportExcel (data, parameter) {
  return axios({
    url: '/WmsContainerPackaging/importExcel',
    method: 'post',
    data: data,
    params: parameter
  })
}
/**
 * ä¸‹è½½åŒ…装关系基础表的Excel导入模板
 *
 * @author ly
 */
export function WmsContainerPackagingDownloadExcelTemplate(parameter) {
  return axios({
    url: '/WmsContainerPackaging/downloadExcelTemplate',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsSubstituteGoodManage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
import { axios } from '@/utils/request'
/**
 * æŸ¥è¯¢æ›¿ä»£å“ç®¡ç†
 *
 * @author ly
 */
export function WmsSubstituteGoodPage (parameter) {
  return axios({
    url: '/WmsSubstituteGood/page',
    method: 'get',
    params: parameter
  })
}
/**
 * æ›¿ä»£å“ç®¡ç†åˆ—表
 *
 * @author ly
 */
export function WmsSubstituteGoodList (parameter) {
  return axios({
    url: '/WmsSubstituteGood/list',
    method: 'get',
    params: parameter
  })
}
/**
 * æ·»åŠ æ›¿ä»£å“ç®¡ç†
 *
 * @author ly
 */
export function WmsSubstituteGoodAdd (parameter) {
  return axios({
    url: '/WmsSubstituteGood/add',
    method: 'post',
    data: parameter
  })
}
/**
 * ç¼–辑替代品管理
 *
 * @author ly
 */
export function WmsSubstituteGoodEdit (parameter) {
  return axios({
    url: '/WmsSubstituteGood/edit',
    method: 'post',
    data: parameter
  })
}
/**
 * åˆ é™¤æ›¿ä»£å“ç®¡ç†
 *
 * @author ly
 */
export function WmsSubstituteGoodDelete (parameter) {
  return axios({
    url: '/WmsSubstituteGood/delete',
    method: 'post',
    data: parameter
  })
}
/**
 * å¯¼å‡ºæ›¿ä»£å“ç®¡ç†çš„Excel文件
 *
 * @author ly
 */
export function WmsSubstituteGoodToExcel (parameter) {
  return axios({
    url: '/WmsSubstituteGood/toExcel',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
/**
 * å¯¼å…¥æ›¿ä»£å“ç®¡ç†çš„Excel文件
 *
 * @author ly
 */
export function WmsSubstituteGoodImportExcel (data, parameter) {
  return axios({
    url: '/WmsSubstituteGood/importExcel',
    method: 'post',
    data: data,
    params: parameter
  })
}
/**
 * ä¸‹è½½æ›¿ä»£å“ç®¡ç†çš„Excel导入模板
 *
 * @author ly
 */
export function WmsSubstituteGoodDownloadExcelTemplate(parameter) {
  return axios({
    url: '/WmsSubstituteGood/downloadExcelTemplate',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsWarehouseManage.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
import { axios } from '@/utils/request'
/**
 * æŸ¥è¯¢ä»“库表
 *
 * @author ly
 */
export function WmsWarehousePage (parameter) {
  return axios({
    url: '/WmsWarehouse/page',
    method: 'get',
    params: parameter
  })
}
/**
 * ä»“库表列表
 *
 * @author ly
 */
export function WmsWarehouseList (parameter) {
  return axios({
    url: '/WmsWarehouse/list',
    method: 'get',
    params: parameter
  })
}
/**
 * æ·»åŠ ä»“åº“è¡¨
 *
 * @author ly
 */
export function WmsWarehouseAdd (parameter) {
  return axios({
    url: '/WmsWarehouse/add',
    method: 'post',
    data: parameter
  })
}
/**
 * ç¼–辑仓库表
 *
 * @author ly
 */
export function WmsWarehouseEdit (parameter) {
  return axios({
    url: '/WmsWarehouse/edit',
    method: 'post',
    data: parameter
  })
}
/**
 * åˆ é™¤ä»“库表
 *
 * @author ly
 */
export function WmsWarehouseDelete (parameter) {
  return axios({
    url: '/WmsWarehouse/delete',
    method: 'post',
    data: parameter
  })
}
/**
 * å¯¼å‡ºä»“库表的Excel文件
 *
 * @author ly
 */
export function WmsWarehouseToExcel (parameter) {
  return axios({
    url: '/WmsWarehouse/toExcel',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
/**
 * å¯¼å…¥ä»“库表的Excel文件
 *
 * @author ly
 */
export function WmsWarehouseImportExcel (data, parameter) {
  return axios({
    url: '/WmsWarehouse/importExcel',
    method: 'post',
    data: data,
    params: parameter
  })
}
/**
 * ä¸‹è½½ä»“库表的Excel导入模板
 *
 * @author ly
 */
export function WmsWarehouseDownloadExcelTemplate(parameter) {
  return axios({
    url: '/WmsWarehouse/downloadExcelTemplate',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/addForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
<template>
  <a-modal
    title="新增包装关系基础表"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
        <a-form :form="form">
        <a-form-item label="容器类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型ID" v-decorator="['containerTypeId']" />
        </a-form-item>
        <a-form-item label="容器类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型名称" v-decorator="['containerTypeName']" />
        </a-form-item>
        <a-form-item label="物料类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型ID" v-decorator="['materialTypeId']" />
        </a-form-item>
        <a-form-item label="物料类型编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型编号" v-decorator="['materialTypeCode']" />
        </a-form-item>
        <a-form-item label="物料类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型名称" v-decorator="['materialTypeName']" />
        </a-form-item>
        <a-form-item label="物料容器容量" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料容器容量" v-decorator="['boxQty']" />
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
  import moment from 'moment'
  import {
  WmsContainerPackagingAdd
  } from '@/api/modular/main/WmsBase/WmsContainerPackagingManage'
  export default {
  data () {
  return {
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      add (record) {
        this.visible = true
        this.$nextTick(() => {
        });
      },
      /**
       * æäº¤è¡¨å•
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
              }
            }
            WmsContainerPackagingAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/editForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
<template>
  <a-modal
    title="编辑包装关系基础表"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item label="容器类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型ID" v-decorator="['containerTypeId']" />
        </a-form-item>
        <a-form-item label="容器类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型名称" v-decorator="['containerTypeName']" />
        </a-form-item>
        <a-form-item label="物料类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型ID" v-decorator="['materialTypeId']" />
        </a-form-item>
        <a-form-item label="物料类型编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型编号" v-decorator="['materialTypeCode']" />
        </a-form-item>
        <a-form-item label="物料类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型名称" v-decorator="['materialTypeName']" />
        </a-form-item>
        <a-form-item label="物料容器容量" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料容器容量" v-decorator="['boxQty']" />
        </a-form-item>
        <a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import moment from 'moment'
  import {
  WmsContainerPackagingEdit
  } from '@/api/modular/main/WmsBase/WmsContainerPackagingManage'
  export default {
  data () {
  return {
  Id: 0,
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
  record: {},
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      edit (record) {
        this.visible = true;
        this.Id = record.id;
        this.$nextTick(() => {
        });
        //深度拷贝 ç§»é™¤VUE的监听,防止INDEX页面值变动
        this.record = JSON.parse(JSON.stringify(record))
        this.$nextTick(() => {
          this.form.setFieldsValue(
            {
              id: record.id,
              containerTypeId: record.containerTypeId,
              containerTypeName: record.containerTypeName,
              materialTypeId: record.materialTypeId,
              materialTypeCode: record.materialTypeCode,
              materialTypeName: record.materialTypeName,
              boxQty: record.boxQty
            }
          )
        })
      },
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (values[key] == null) continue
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
                 this.record[key] = values[key]
              } else {
                 this.record[key] = values[key]
              }
            }
            WmsContainerPackagingEdit(this.record).then((res) => {
              if (res.success) {
                this.$message.success('编辑成功')
                this.confirmLoading = false
                this.$emit('ok', this.record)
                this.handleCancel()
              } else {
                this.$message.error('编辑失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          }else{
            this.confirmLoading = false
          }
        });
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/excelForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
<template>
  <a-modal
    :width="850"
    :destroyOnClose="true"
    :visible="visible"
    :forceRender="true"
    title="批量导入"
    cancelText="取消上传"
    okText="开始上传"
    @cancel="handleCancel"
    @ok="handleSubmit">
    <a-spin :spinning="confirmLoading">
      <a-row :span="24">
        <span>请选择要导入的数据文件(Excel格式)</span>
      </a-row>
      <p></p>
      <a-row>
        <a-col :span="16">
          <a-upload-dragger accept=".xlsx,.xls" :multiple="false" :customRequest="customRequest" @change="handleChange" :beforeUpload="beforeUpload">
            <a-icon style="font-size: 40px;" type="cloud-upload" />
          </a-upload-dragger>
        </a-col>
        <!--<a-col :span="8">
          <span>导入模式:</span>
          <a-select
            style="width: 130px"
            placeholder="请选择导入模式"
            v-model="importExcelType">
            <a-select-option
              v-for="(item,index) in importExcelTypeData"
              :key="index"
              :value="item.code">{{ item.name }}
            </a-select-option>
          </a-select>
        </a-col>-->
      </a-row>
      <a-row :span="24">
        <!--<a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="!detailed">
          ç‚¹å‡»æŸ¥çœ‹æ–‡ä»¶ä¸Šä¼ è¦æ±‚
        </a-button>-->
        <span>【</span>
        <a-button style="width: 90px;text-align: left;" @click="wmsContainerPackagingDownloadExcelTemplate" type="link">下载导入模板</a-button>,填写并上传
        <span>】</span>
        <a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="detailed">
          æ”¶èµ·
        </a-button>
      </a-row>
      <a-row v-show="detailed" style="background: #fef4e8; height: 30px;" :span="24">
        <a-breadcrumb>
          <a-breadcrumb-item style="line-height: 30px;color: #faad14;margin-left: 18px;">文件上传要求</a-breadcrumb-item>
        </a-breadcrumb>
      </a-row>
      <pre v-show="detailed">
        <div v-html="demandText"></div>
      </pre>
      <a-table v-show="detailed" :columns="columns" :data-source="dataList" :rowKey="(record) => record.processID" :pagination="false"></a-table>
      <pre v-show="detailed">
        <div v-html="columnText"></div>
      </pre>
    </a-spin>
  </a-modal>
</template>
<script>
  import { downloadFile, checkFile, parseExcelFieldText, parseDemandText } from '@/utils/util'
  import { WmsContainerPackagingImportExcel, WmsContainerPackagingDownloadExcelTemplate} from '@/api/modular/main/WmsBase/WmsContainerPackagingManage'
  import { sysExcelTemplateGetColumnList } from '@/api/modular/system/excelTemplateManage'
  export default {
  components: {
  },
  data() {
  return {
  visible: false,
  detailed: false,
  confirmLoading: false,
  fileList: [],
  importExcelTypeData: [],
  importExcelType: '1',
  uploadFile: null,
  columns: [],
  dataList: [],
  demandText:'',
  columnText: ''
  }
  },
  methods: {
  index() {
  this.visible = true;
  this.importExcelTypeData = this.$options.filters['dictData']('import_excel_type')
  this.demandText = parseDemandText("wmsContainerPackagingDownloadExcelTemplate")
  window.downloadFile = this.wmsContainerPackagingDownloadExcelTemplate;
  this.getTable();
  },
  showDemand() {
  this.detailed = !this.detailed;
  },
  customRequest(document) {
  this.uploadFile = document
  },
  getTable() {
  sysExcelTemplateGetColumnList({className: "WmsContainerPackaging"}).then(res =>
  {
  if (res.success) {
  this.columns =[];
  this.dataList = [{}];
  res.data.forEach(x => {
  this.columns.push({
  dataIndex: x.columnName,
  key: x.columnName,
  title: x.columnComment
  });
  this.dataList[0][x.columnName] = x.isRequired ? "必填" : "非必填"
  });
  this.columnText = parseExcelFieldText(res.data);
  }
  });
  },
  beforeUpload(fileInfo) {
  let res = checkFile(fileInfo, 1073741824, ['.xlsx', '.xls']);
  if (!res.success) {
  this.$message.warning(res.msg)
  return false
  }
  setTimeout(() => {this.uploadFile.onSuccess(this.uploadFile.file)}, 1000)
  },
  handleChange(fileInfo) {
  if (fileInfo.file.status === 'error') {
  fileInfo.fileList.splice(0, 1)
  }
  if (fileInfo.file.status === 'done') {
  if (fileInfo.fileList.length > 1) {
  fileInfo.fileList.splice(0, 1)
  }
  this.fileList = fileInfo.file
  }
  },
  handleSubmit() {
  this.confirmLoading = true
  const formData = new FormData()
  formData.append('file', this.uploadFile.file)
  WmsContainerPackagingImportExcel(formData, {importExcelType: this.importExcelType}).then(res => {
  this.$message.success('操作成功')
  this.confirmLoading = false
  this.$emit('ok', [])
  this.handleCancel()
  }).finally((res)=>{this.confirmLoading = false})
  },
  handleCancel() {
  this.visible = false
  this.detailed = false
  },
  wmsContainerPackagingDownloadExcelTemplate() {
  WmsContainerPackagingDownloadExcelTemplate({version: "v2"}).then((res) => {
  downloadFile(res);
  }).catch((err) => {
  this.$message.error('下载错误:获取文件流错误' + err)
  })
  }
  }
  }
</script>
<style scoped>
::v-deep .ant-upload.ant-upload-drag {
  position: relative;
  width: 140px;
  height: 135px;
  text-align: center;
  background: #fafafa;
  border: 1px dashed #d9d9d9;
  border-radius: 2px;
  cursor: pointer;
  -webkit-transition: border-color 0.3s;
  transition: border-color 0.3s;
}
::v-deep .ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger), .ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger) {
  color: #ffc53d;
  border-color: white;
}
</style>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsContainerPackaging/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,498 @@
<template>
  <div ref="boxOutWrap" class="boxOutWrap">
    <div ref="boxForm" class="boxForm">
    <a-card :bordered="false" :bodyStyle="tstyle">
      <div class="table-page-search-wrapper" v-if="hasPerm('WmsContainerPackaging:page')">
        <a-form layout="inline">
          <a-row :gutter="48">
            <a-col :md="8" :sm="24">
              <a-form-item label="容器类型ID">
                <a-input v-model="queryParam.containerTypeId" allow-clear placeholder="请输入容器类型ID"/>
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="24">
              <a-form-item label="容器类型名称">
                <a-input v-model="queryParam.containerTypeName" allow-clear placeholder="请输入容器类型名称"/>
              </a-form-item>
            </a-col><template v-if="advanced">
              <a-col :md="8" :sm="24">
                <a-form-item label="物料类型ID">
                  <a-input v-model="queryParam.materialTypeId" allow-clear placeholder="请输入物料类型ID"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="物料类型编号">
                  <a-input v-model="queryParam.materialTypeCode" allow-clear placeholder="请输入物料类型编号"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="物料类型名称">
                  <a-input v-model="queryParam.materialTypeName" allow-clear placeholder="请输入物料类型名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="物料容器容量">
                  <a-input v-model="queryParam.boxQty" allow-clear placeholder="请输入物料容器容量"/>
                </a-form-item>
              </a-col>          <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="创建时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.createdTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangecreatedTime"/>
                    </a-form-item>
                </a-col>
                      <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="更新时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.updatedTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangeupdatedTime"/>
                    </a-form-item>
                </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="创建者名称">
                  <a-input v-model="queryParam.createdUserName" allow-clear placeholder="请输入创建者名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="修改者名称">
                  <a-input v-model="queryParam.updatedUserName" allow-clear placeholder="请输入修改者名称"/>
                </a-form-item>
              </a-col>    </template>
            <a-col :md="8" :sm="24" >
              <span class="table-page-search-submitButtons">
                <a-button type="primary" @click="$refs.table.refresh(true)" >查询</a-button>
                <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
                <a @click="toggleAdvanced" style="margin-left: 8px"> {{ advanced ? '收起' : '展开' }}
                  <a-icon :type="advanced ? 'up' : 'down'"/>
                </a>
              </span>
            </a-col>
          </a-row>
        </a-form>
      </div>
    </a-card>
    </div>
    <a-card :bordered="false">
      <s-table
        ref="table"
        :columns="columns"
        :data="loadData"
        :alert="true"
        @changeTablePage="pageInfo = $event"
        :scroll="{x: true,y:tableHeight}"
        :rowKey="(record) => record.id"
        :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
        <template class="table-operator" slot="operator" v-if="hasPerm('WmsContainerPackaging:add')" >
        <div ref="actionBar" class="actionBar">
            <a-button type="info" v-if="hasPerm('sysExcelTemplate:importExcel')" icon="upload" @click="$refs.excelForm.index()">
            å¯¼å…¥
          </a-button>
          <a-button type="info" v-if="hasPerm('WmsContainerPackaging:exportExcel')" icon="download" @click="WmsContainerPackagingToExcel()">
            å¯¼å‡º
          </a-button>
            <a-button type="primary" v-if="hasPerm('WmsContainerPackaging:add')" icon="plus" @click="$refs.addForm.add()">新增包装关系基础表</a-button>
        </div>
        </template>
          <span slot="action" slot-scope="text, record">
            <a v-if="hasPerm('WmsContainerPackaging:edit')" @click="$refs.editForm.edit(record)">编辑</a>
          <a-divider type="vertical" v-if="hasPerm('WmsContainerPackaging:edit') & hasPerm('WmsContainerPackaging:delete')"/>
          <a-popconfirm v-if="hasPerm('WmsContainerPackaging:delete')" placement="topRight" title="确认删除?" @confirm="() => WmsContainerPackagingDelete(record)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </s-table>
      <add-form ref="addForm" @ok="handleOk" />
      <edit-form ref="editForm" @ok="handleOk" />
      <excel-form ref="excelForm" @ok="handleOk" />
    </a-card>
  </div>
</template>
<script>
    import { STable } from '@/components'
    import moment from 'moment'
    import { WmsContainerPackagingPage, WmsContainerPackagingDelete, WmsContainerPackagingToExcel } from '@/api/modular/main/WmsBase/WmsContainerPackagingManage'
    //自定义table高度
    import setTableHtMixin from '@/mixins/handleTableHt.js'
    import addForm from './addForm.vue'
    import { exportExcel } from '@/utils/exportToExcel'
    import { downloadFile } from '@/utils/util'
    import editForm from './editForm.vue'
    import excelForm from './excelForm.vue'
    export default {
    mixins: [setTableHtMixin],
    components: {
    STable,
    addForm,
    editForm,
    excelForm
    },
    data () {
    return {
    advanced: false, // é«˜çº§æœç´¢ å±•å¼€/关闭
    queryParam: {},
     pageInfo: {
        current: 1,
        pageSize: 10
      },
    columns: [
    {
    title:'序号',
    width: '60px',
    align: 'center',
    customRender: (text, record, index) => `${index + 1 + (this.pageInfo.current - 1) * this.pageInfo.pageSize}`
    },
    {
    title: '容器类型ID',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'containerTypeId'
    },
    {
    title: '容器类型名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'containerTypeName'
    },
    {
    title: '物料类型ID',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'materialTypeId'
    },
    {
    title: '物料类型编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'materialTypeCode'
    },
    {
    title: '物料类型名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'materialTypeName'
    },
    {
    title: '物料容器容量',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'boxQty'
    },
    {
    title: '创建时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdTime'
    },
    {
    title: '更新时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedTime'
    },
    {
    title: '创建者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdUserName'
    },
    {
    title: '修改者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': ''//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': ''//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedUserName'
    }
    ],
    tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
    // åŠ è½½æ•°æ®æ–¹æ³• å¿…须为 Promise å¯¹è±¡
    loadData: parameter => {
    return WmsContainerPackagingPage(Object.assign(parameter, this.switchingDate())).then((res) => {
    return res.data
    })
    },
    selectedRowKeys: [],
    selectedRows: []
    }
    },
    created () {
    if (this.hasPerm('WmsContainerPackaging:edit') || this.hasPerm('WmsContainerPackaging:delete')) {
    this.columns.push({
    title: '操作',
    width: '150px',
    dataIndex: 'action',
    scopedSlots: { customRender: 'action' }
    })
    }
    const path = this.$route.path
    const columnStr = window.localStorage.getItem(path)
    if(columnStr) {
    var _columns = JSON.parse(columnStr)
    this.columns.forEach(element => {
    var fObj = _columns.find((item, index) => {
    return item.dataIndex === element.dataIndex;
    })
    if(fObj!=undefined && fObj!=null){
    element.checked=fObj.checked;
    }
    });
    }
    this.handleTableHt() //设置主表表格高度
    window.addEventListener(
    'resize',
    () => {
    this.handleTableHt() // ç›‘听屏幕大小改变表格高度
    },
    false
    )
    },
    methods: {
    moment,
    /**
    * æŸ¥è¯¢å‚数组装
    */
    switchingDate () {
    const obj = JSON.parse(JSON.stringify(this.queryParam))
    return obj
    },
    WmsContainerPackagingDelete (record) {
    WmsContainerPackagingDelete(record).then((res) => {
    if (res.success) {
    this.$message.success('删除成功')
    this.$refs.table.refresh()
    } else {
    this.$message.error('删除失败') // + res.message
    }
    })
    },
    WmsContainerPackagingToExcel() {
    this.loading = true
    let entozh = {};
    const path = this.$route.path;
    if (window.localStorage.getItem(path)) {
    JSON.parse(window.localStorage.getItem(path)).forEach(item => {
    if (item.dataIndex != 'action' && item.checked) {
    entozh[item.dataIndex] = item.title
    }
    })
    } else { //直接点导出
    this.columns.forEach(item => {
    if (item.dataIndex != 'action') {
    entozh[item.dataIndex] = item.title
    }
    })
    }
    WmsContainerPackagingPage(Object.assign({ pageSize: 100000, pageIndex: 1 }, this.queryParam)).then((res) => {
    this.loading = false;
    //需要截取日期的字段
    var arrDataCutout = this.columns.filter(v => v.customCutout == true);
    res.data.rows.forEach(item => {
    var arrKeys = Object.keys(item);
    arrKeys.forEach(key => {
    var strFieldDic = key + 'Data';
    //枚举转值
    if (this[strFieldDic] && this[strFieldDic].length > 0) {
    let arrFieldDic = this[strFieldDic].filter(v => String(v.code) == String(item[key]));
    if (arrFieldDic.length > 0) {
    item[key] = arrFieldDic[0]?.name || '没有枚举值';
    }
    }
    // æ—¥æœŸæˆªå–
    if (arrDataCutout.length > 0) {
    arrDataCutout.forEach(itemIn => {
    if (key == itemIn.dataIndex && item[key]) {
    item[key] = item[key].split(" ")[0]
    }
    })
    }
    });
    })
    exportExcel(res.data.rows, entozh, "xlsx", `${this.$route.meta.title}`)
    }).catch((err) => {
    this.loading = false
    this.$message.error('下载错误:获取文件流错误' + err)
    })
    },
    toggleAdvanced () {
    this.advanced = !this.advanced
    this.handleTableHt() //设置主表表格高度
    },
    onChangecreatedTime(date, dateString) {
      this.queryParam.createdTime = dateString
    },
    onChangeupdatedTime(date, dateString) {
      this.queryParam.updatedTime = dateString
    },
    handleOk () {
    this.$refs.table.refresh()
    },
    onSelectChange (selectedRowKeys, selectedRows) {
    this.selectedRowKeys = selectedRowKeys
    this.selectedRows = selectedRows
    }
    }
    }
</script>
<style lang="less">
  .table-operator {
    margin-bottom: 18px;
  }
  button {
    margin-right: 8px;
  }
</style>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabForm.vue
@@ -8,8 +8,8 @@
    @cancel="handleCancel"
  >
    <a-spin :spinning="confirmLoading">
      <!-- tab -->
      <a-tabs default-active-key="1" @change="callback">
      <!-- tab @change="callback"-->
      <a-tabs default-active-key="1" >
        <a-tab-pane key="1" tab="基本信息">
         <add-form ref="addForm" @ok="handleOk" />
        </a-tab-pane>
@@ -20,14 +20,14 @@
          Content of Tab Pane 3
        </a-tab-pane>
        <a-tab-pane key="4" tab="替代品管理">
          Content of Tab Pane 4
          <add-form-sub ref="addFormWmsSubstituteGood" @ok="handleOk" />
        </a-tab-pane>
        <a-tab-pane key="5" tab="客户">
          <add-form-base-customer ref="addFormBaseCustomer" @ok="handleOk" />
        </a-tab-pane>
        <a-tab-pane key="7" tab="包装关系">
          Content of Tab Pane 6
          <add-form-container-packaging ref="addFormContainerPackaging" @ok="handleOk" />
        </a-tab-pane>
      </a-tabs>
@@ -39,15 +39,15 @@
import { WmsMaterialAdd, GetAreas, GetStations } from '@/api/modular/main/WmsMaterialManage'
import addForm from './tabItem/addForm.vue'
import addFormBaseCustomer from './tabItem/addFormBaseCustomer.vue'
import addFormContainerPackaging from './tabItem/addFormContainerPackaging.vue'
import addFormSub from './tabItem/addFormWmsSubstituteGood.vue'
export default {
  components: {
    // STable,
    addForm,
    addFormBaseCustomer,
    // editForm,
    // excelForm
    addFormContainerPackaging,
    addFormSub
  },
  data() {
    return {
@@ -71,6 +71,9 @@
    }
  },
  methods: {
    handleOk(){
    },
    // åˆå§‹åŒ–方法
    add(record) {
      this.visible = true
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabItem/addFormContainerPackaging.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <!-- åŒ…装关系基础表 -->
  <a-form :form="form">
        <a-form-item label="容器类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型ID" v-decorator="['containerTypeId']" />
        </a-form-item>
        <a-form-item label="容器类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入容器类型名称" v-decorator="['containerTypeName']" />
        </a-form-item>
        <a-form-item label="物料类型ID" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型ID" v-decorator="['materialTypeId']" />
        </a-form-item>
        <a-form-item label="物料类型编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型编号" v-decorator="['materialTypeCode']" />
        </a-form-item>
        <a-form-item label="物料类型名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料类型名称" v-decorator="['materialTypeName']" />
        </a-form-item>
        <a-form-item label="物料容器容量" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料容器容量" v-decorator="['boxQty']" />
        </a-form-item>
      </a-form>
</template>
<script>
  import moment from 'moment'
  import {
  WmsContainerPackagingAdd
  } from '@/api/modular/main/WmsBase/WmsContainerPackagingManage'
  export default {
  data () {
  return {
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      add (record) {
        this.visible = true
        this.$nextTick(() => {
        });
      },
      /**
       * æäº¤è¡¨å•
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
              }
            }
            WmsContainerPackagingAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsMaterial/tabItem/addFormWmsSubstituteGood.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
<template>
  <!-- æ›¿ä»£å“ç®¡ç† -->
    <a-form :form="form">
        <a-form-item label="替代编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代编号" v-decorator="['substituteCode', {rules: [{required: true, message: '请输入替代编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料编号" v-decorator="['materialCode', {rules: [{required: true, message: '请输入物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料名称" v-decorator="['materialName', {rules: [{required: true, message: '请输入物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料编号" v-decorator="['substituteMaterialCode', {rules: [{required: true, message: '请输入替代品物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料名称" v-decorator="['substituteMaterialName', {rules: [{required: true, message: '请输入替代品物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代次序" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input-number placeholder="请输入替代次序" style="width: 100%" v-decorator="['substituteIndex', {rules: [{required: true, message: '请输入替代次序!'}]}]" />
        </a-form-item>
        <a-form-item label="是否禁用" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: '请选择是否禁用!' }], valuePropName: 'checked'}]" />
        </a-form-item>
      </a-form>
</template>
<script>
  import moment from 'moment'
  import {
  WmsSubstituteGoodAdd
  } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage'
  export default {
  data () {
  return {
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      add (record) {
        this.visible = true
        this.$nextTick(() => {
        });
      },
      /**
       * æäº¤è¡¨å•
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
              }
            }
            WmsSubstituteGoodAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/addForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
<template>
  <a-modal
    title="新增替代品管理"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
        <a-form :form="form">
        <a-form-item label="替代编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代编号" v-decorator="['substituteCode', {rules: [{required: true, message: '请输入替代编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料编号" v-decorator="['materialCode', {rules: [{required: true, message: '请输入物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料名称" v-decorator="['materialName', {rules: [{required: true, message: '请输入物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料编号" v-decorator="['substituteMaterialCode', {rules: [{required: true, message: '请输入替代品物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料名称" v-decorator="['substituteMaterialName', {rules: [{required: true, message: '请输入替代品物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代次序" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input-number placeholder="请输入替代次序" style="width: 100%" v-decorator="['substituteIndex', {rules: [{required: true, message: '请输入替代次序!'}]}]" />
        </a-form-item>
        <a-form-item label="是否禁用" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: '请选择是否禁用!' }], valuePropName: 'checked'}]" />
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
  import moment from 'moment'
  import {
  WmsSubstituteGoodAdd
  } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage'
  export default {
  data () {
  return {
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      add (record) {
        this.visible = true
        this.$nextTick(() => {
        });
      },
      /**
       * æäº¤è¡¨å•
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
              }
            }
            WmsSubstituteGoodAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/editForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
<template>
  <a-modal
    title="编辑替代品管理"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item label="替代编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代编号" v-decorator="['substituteCode', {rules: [{required: true, message: '请输入替代编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料编号" v-decorator="['materialCode', {rules: [{required: true, message: '请输入物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入物料名称" v-decorator="['materialName', {rules: [{required: true, message: '请输入物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料编号" v-decorator="['substituteMaterialCode', {rules: [{required: true, message: '请输入替代品物料编号!'}]}]" />
        </a-form-item>
        <a-form-item label="替代品物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入替代品物料名称" v-decorator="['substituteMaterialName', {rules: [{required: true, message: '请输入替代品物料名称!'}]}]" />
        </a-form-item>
        <a-form-item label="替代次序" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input-number placeholder="请输入替代次序" style="width: 100%" v-decorator="['substituteIndex', {rules: [{required: true, message: '请输入替代次序!'}]}]" />
        </a-form-item>
        <a-form-item label="是否禁用" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: '请选择是否禁用!' }], valuePropName: 'checked'}]" />
        </a-form-item>
        <a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import moment from 'moment'
  import {
  WmsSubstituteGoodEdit
  } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage'
  export default {
  data () {
  return {
  Id: 0,
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
  record: {},
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      edit (record) {
        this.visible = true;
        this.Id = record.id;
        this.$nextTick(() => {
        });
        //深度拷贝 ç§»é™¤VUE的监听,防止INDEX页面值变动
        this.record = JSON.parse(JSON.stringify(record))
        this.$nextTick(() => {
          this.form.setFieldsValue(
            {
              id: record.id,
              substituteCode: record.substituteCode,
              materialCode: record.materialCode,
              materialName: record.materialName,
              substituteMaterialCode: record.substituteMaterialCode,
              substituteMaterialName: record.substituteMaterialName,
              substituteIndex: record.substituteIndex,
              isDisabled: record.isDisabled
            }
          )
        })
      },
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (values[key] == null) continue
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
                 this.record[key] = values[key]
              } else {
                 this.record[key] = values[key]
              }
            }
            WmsSubstituteGoodEdit(this.record).then((res) => {
              if (res.success) {
                this.$message.success('编辑成功')
                this.confirmLoading = false
                this.$emit('ok', this.record)
                this.handleCancel()
              } else {
                this.$message.error('编辑失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          }else{
            this.confirmLoading = false
          }
        });
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/excelForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
<template>
  <a-modal
    :width="850"
    :destroyOnClose="true"
    :visible="visible"
    :forceRender="true"
    title="批量导入"
    cancelText="取消上传"
    okText="开始上传"
    @cancel="handleCancel"
    @ok="handleSubmit">
    <a-spin :spinning="confirmLoading">
      <a-row :span="24">
        <span>请选择要导入的数据文件(Excel格式)</span>
      </a-row>
      <p></p>
      <a-row>
        <a-col :span="16">
          <a-upload-dragger accept=".xlsx,.xls" :multiple="false" :customRequest="customRequest" @change="handleChange" :beforeUpload="beforeUpload">
            <a-icon style="font-size: 40px;" type="cloud-upload" />
          </a-upload-dragger>
        </a-col>
        <!--<a-col :span="8">
          <span>导入模式:</span>
          <a-select
            style="width: 130px"
            placeholder="请选择导入模式"
            v-model="importExcelType">
            <a-select-option
              v-for="(item,index) in importExcelTypeData"
              :key="index"
              :value="item.code">{{ item.name }}
            </a-select-option>
          </a-select>
        </a-col>-->
      </a-row>
      <a-row :span="24">
        <!--<a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="!detailed">
          ç‚¹å‡»æŸ¥çœ‹æ–‡ä»¶ä¸Šä¼ è¦æ±‚
        </a-button>-->
        <span>【</span>
        <a-button style="width: 90px;text-align: left;" @click="wmsSubstituteGoodDownloadExcelTemplate" type="link">下载导入模板</a-button>,填写并上传
        <span>】</span>
        <a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="detailed">
          æ”¶èµ·
        </a-button>
      </a-row>
      <a-row v-show="detailed" style="background: #fef4e8; height: 30px;" :span="24">
        <a-breadcrumb>
          <a-breadcrumb-item style="line-height: 30px;color: #faad14;margin-left: 18px;">文件上传要求</a-breadcrumb-item>
        </a-breadcrumb>
      </a-row>
      <pre v-show="detailed">
        <div v-html="demandText"></div>
      </pre>
      <a-table v-show="detailed" :columns="columns" :data-source="dataList" :rowKey="(record) => record.processID" :pagination="false"></a-table>
      <pre v-show="detailed">
        <div v-html="columnText"></div>
      </pre>
    </a-spin>
  </a-modal>
</template>
<script>
  import { downloadFile, checkFile, parseExcelFieldText, parseDemandText } from '@/utils/util'
  import { WmsSubstituteGoodImportExcel, WmsSubstituteGoodDownloadExcelTemplate} from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage'
  import { sysExcelTemplateGetColumnList } from '@/api/modular/system/excelTemplateManage'
  export default {
  components: {
  },
  data() {
  return {
  visible: false,
  detailed: false,
  confirmLoading: false,
  fileList: [],
  importExcelTypeData: [],
  importExcelType: '1',
  uploadFile: null,
  columns: [],
  dataList: [],
  demandText:'',
  columnText: ''
  }
  },
  methods: {
  index() {
  this.visible = true;
  this.importExcelTypeData = this.$options.filters['dictData']('import_excel_type')
  this.demandText = parseDemandText("wmsSubstituteGoodDownloadExcelTemplate")
  window.downloadFile = this.wmsSubstituteGoodDownloadExcelTemplate;
  this.getTable();
  },
  showDemand() {
  this.detailed = !this.detailed;
  },
  customRequest(document) {
  this.uploadFile = document
  },
  getTable() {
  sysExcelTemplateGetColumnList({className: "WmsSubstituteGood"}).then(res =>
  {
  if (res.success) {
  this.columns =[];
  this.dataList = [{}];
  res.data.forEach(x => {
  this.columns.push({
  dataIndex: x.columnName,
  key: x.columnName,
  title: x.columnComment
  });
  this.dataList[0][x.columnName] = x.isRequired ? "必填" : "非必填"
  });
  this.columnText = parseExcelFieldText(res.data);
  }
  });
  },
  beforeUpload(fileInfo) {
  let res = checkFile(fileInfo, 1073741824, ['.xlsx', '.xls']);
  if (!res.success) {
  this.$message.warning(res.msg)
  return false
  }
  setTimeout(() => {this.uploadFile.onSuccess(this.uploadFile.file)}, 1000)
  },
  handleChange(fileInfo) {
  if (fileInfo.file.status === 'error') {
  fileInfo.fileList.splice(0, 1)
  }
  if (fileInfo.file.status === 'done') {
  if (fileInfo.fileList.length > 1) {
  fileInfo.fileList.splice(0, 1)
  }
  this.fileList = fileInfo.file
  }
  },
  handleSubmit() {
  this.confirmLoading = true
  const formData = new FormData()
  formData.append('file', this.uploadFile.file)
  WmsSubstituteGoodImportExcel(formData, {importExcelType: this.importExcelType}).then(res => {
  this.$message.success('操作成功')
  this.confirmLoading = false
  this.$emit('ok', [])
  this.handleCancel()
  }).finally((res)=>{this.confirmLoading = false})
  },
  handleCancel() {
  this.visible = false
  this.detailed = false
  },
  wmsSubstituteGoodDownloadExcelTemplate() {
  WmsSubstituteGoodDownloadExcelTemplate({version: "v2"}).then((res) => {
  downloadFile(res);
  }).catch((err) => {
  this.$message.error('下载错误:获取文件流错误' + err)
  })
  }
  }
  }
</script>
<style scoped>
::v-deep .ant-upload.ant-upload-drag {
  position: relative;
  width: 140px;
  height: 135px;
  text-align: center;
  background: #fafafa;
  border: 1px dashed #d9d9d9;
  border-radius: 2px;
  cursor: pointer;
  -webkit-transition: border-color 0.3s;
  transition: border-color 0.3s;
}
::v-deep .ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger), .ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger) {
  color: #ffc53d;
  border-color: white;
}
</style>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,537 @@
<template>
  <div ref="boxOutWrap" class="boxOutWrap">
    <div ref="boxForm" class="boxForm">
    <a-card :bordered="false" :bodyStyle="tstyle">
      <div class="table-page-search-wrapper" v-if="hasPerm('WmsSubstituteGood:page')">
        <a-form layout="inline">
          <a-row :gutter="48">
            <a-col :md="8" :sm="24">
              <a-form-item label="替代编号">
                <a-input v-model="queryParam.substituteCode" allow-clear placeholder="请输入替代编号"/>
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="24">
              <a-form-item label="物料编号">
                <a-input v-model="queryParam.materialCode" allow-clear placeholder="请输入物料编号"/>
              </a-form-item>
            </a-col><template v-if="advanced">
              <a-col :md="8" :sm="24">
                <a-form-item label="物料名称">
                  <a-input v-model="queryParam.materialName" allow-clear placeholder="请输入物料名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="替代品物料编号">
                  <a-input v-model="queryParam.substituteMaterialCode" allow-clear placeholder="请输入替代品物料编号"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="替代品物料名称">
                  <a-input v-model="queryParam.substituteMaterialName" allow-clear placeholder="请输入替代品物料名称"/>
                </a-form-item>
              </a-col><a-col :md="8" :sm="24">
                <a-form-item label="替代次序">
                  <a-input-number v-model="queryParam.substituteIndex" style="width: 100%" allow-clear placeholder="请输入替代次序"/>
                </a-form-item>
              </a-col>
            <a-col :md="8" :sm="24">
                <a-form-item label="是否禁用">
                    <a-select :allowClear="true" style="width: 100%" v-model="queryParam.isDisabled" placeholder="请选择是否禁用">
                        <a-select-option v-for="(item,index) in isDisabledData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                    </a-select>
                </a-form-item>
            </a-col>
                  <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="创建时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.createdTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangecreatedTime"/>
                    </a-form-item>
                </a-col>
                      <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="更新时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.updatedTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangeupdatedTime"/>
                    </a-form-item>
                </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="创建者名称">
                  <a-input v-model="queryParam.createdUserName" allow-clear placeholder="请输入创建者名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="修改者名称">
                  <a-input v-model="queryParam.updatedUserName" allow-clear placeholder="请输入修改者名称"/>
                </a-form-item>
              </a-col>    </template>
            <a-col :md="8" :sm="24" >
              <span class="table-page-search-submitButtons">
                <a-button type="primary" @click="$refs.table.refresh(true)" >查询</a-button>
                <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
                <a @click="toggleAdvanced" style="margin-left: 8px"> {{ advanced ? '收起' : '展开' }}
                  <a-icon :type="advanced ? 'up' : 'down'"/>
                </a>
              </span>
            </a-col>
          </a-row>
        </a-form>
      </div>
    </a-card>
    </div>
    <a-card :bordered="false">
      <s-table
        ref="table"
        :columns="columns"
        :data="loadData"
        :alert="true"
        @changeTablePage="pageInfo = $event"
        :scroll="{x: true,y:tableHeight}"
        :rowKey="(record) => record.id"
        :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
        <template class="table-operator" slot="operator" v-if="hasPerm('WmsSubstituteGood:add')" >
        <div ref="actionBar" class="actionBar">
            <a-button type="info" v-if="hasPerm('sysExcelTemplate:importExcel')" icon="upload" @click="$refs.excelForm.index()">
            å¯¼å…¥
          </a-button>
          <a-button type="info" v-if="hasPerm('WmsSubstituteGood:exportExcel')" icon="download" @click="WmsSubstituteGoodToExcel()">
            å¯¼å‡º
          </a-button>
            <a-button type="primary" v-if="hasPerm('WmsSubstituteGood:add')" icon="plus" @click="$refs.addForm.add()">新增替代品管理</a-button>
        </div>
        </template>
          <span slot="isDisabledscopedSlots" slot-scope="text">
            <div v-if="text===true ">
                <a-tag color="green">是</a-tag>
            </div>
            <div v-else-if="text==false">
                <a-tag color="volcano">否</a-tag>
            </div>
            <div v-else=""></div>
            </span>
          <span slot="action" slot-scope="text, record">
            <a v-if="hasPerm('WmsSubstituteGood:edit')" @click="$refs.editForm.edit(record)">编辑</a>
          <a-divider type="vertical" v-if="hasPerm('WmsSubstituteGood:edit') & hasPerm('WmsSubstituteGood:delete')"/>
          <a-popconfirm v-if="hasPerm('WmsSubstituteGood:delete')" placement="topRight" title="确认删除?" @confirm="() => WmsSubstituteGoodDelete(record)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </s-table>
      <add-form ref="addForm" @ok="handleOk" />
      <edit-form ref="editForm" @ok="handleOk" />
      <excel-form ref="excelForm" @ok="handleOk" />
    </a-card>
  </div>
</template>
<script>
    import { STable } from '@/components'
    import moment from 'moment'
    import { WmsSubstituteGoodPage, WmsSubstituteGoodDelete, WmsSubstituteGoodToExcel } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage'
    //自定义table高度
    import setTableHtMixin from '@/mixins/handleTableHt.js'
    import addForm from './addForm.vue'
    import { exportExcel } from '@/utils/exportToExcel'
    import { downloadFile } from '@/utils/util'
    import editForm from './editForm.vue'
    import excelForm from './excelForm.vue'
    export default {
    mixins: [setTableHtMixin],
    components: {
    STable,
    addForm,
    editForm,
    excelForm
    },
    data () {
    return {
    advanced: false, // é«˜çº§æœç´¢ å±•å¼€/关闭
    queryParam: {},
     pageInfo: {
        current: 1,
        pageSize: 10
      },
    columns: [
    {
    title:'序号',
    width: '60px',
    align: 'center',
    customRender: (text, record, index) => `${index + 1 + (this.pageInfo.current - 1) * this.pageInfo.pageSize}`
    },
    {
    title: '替代编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'substituteCode'
    },
    {
    title: '物料编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'materialCode'
    },
    {
    title: '物料名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'materialName'
    },
    {
    title: '替代品物料编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '140px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '140px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'substituteMaterialCode'
    },
    {
    title: '替代品物料名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '140px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '140px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'substituteMaterialName'
    },
    {
    title: '替代次序',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'substituteIndex'
    },
    {
    title: '是否禁用',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'isDisabled',
    scopedSlots: { customRender: 'isDisabledscopedSlots' }
    },
    {
    title: '创建时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdTime'
    },
    {
    title: '更新时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedTime'
    },
    {
    title: '创建者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdUserName'
    },
    {
    title: '修改者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedUserName'
    }
    ],
    tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
    // åŠ è½½æ•°æ®æ–¹æ³• å¿…须为 Promise å¯¹è±¡
    loadData: parameter => {
    return WmsSubstituteGoodPage(Object.assign(parameter, this.switchingDate())).then((res) => {
    return res.data
    })
    },
    selectedRowKeys: [],
    selectedRows: []
    }
    },
    created () {
    if (this.hasPerm('WmsSubstituteGood:edit') || this.hasPerm('WmsSubstituteGood:delete')) {
    this.columns.push({
    title: '操作',
    width: '150px',
    dataIndex: 'action',
    scopedSlots: { customRender: 'action' }
    })
    }
    const path = this.$route.path
    const columnStr = window.localStorage.getItem(path)
    if(columnStr) {
    var _columns = JSON.parse(columnStr)
    this.columns.forEach(element => {
    var fObj = _columns.find((item, index) => {
    return item.dataIndex === element.dataIndex;
    })
    if(fObj!=undefined && fObj!=null){
    element.checked=fObj.checked;
    }
    });
    }
    const isDisabledOption = this.$options
    this.isDisabledData = isDisabledOption.filters['dictData']('yes_true_false')
    this.handleTableHt() //设置主表表格高度
    window.addEventListener(
    'resize',
    () => {
    this.handleTableHt() // ç›‘听屏幕大小改变表格高度
    },
    false
    )
    },
    methods: {
    moment,
    /**
    * æŸ¥è¯¢å‚数组装
    */
    switchingDate () {
    const obj = JSON.parse(JSON.stringify(this.queryParam))
    return obj
    },
    WmsSubstituteGoodDelete (record) {
    WmsSubstituteGoodDelete(record).then((res) => {
    if (res.success) {
    this.$message.success('删除成功')
    this.$refs.table.refresh()
    } else {
    this.$message.error('删除失败') // + res.message
    }
    })
    },
    WmsSubstituteGoodToExcel() {
    this.loading = true
    let entozh = {};
    const path = this.$route.path;
    if (window.localStorage.getItem(path)) {
    JSON.parse(window.localStorage.getItem(path)).forEach(item => {
    if (item.dataIndex != 'action' && item.checked) {
    entozh[item.dataIndex] = item.title
    }
    })
    } else { //直接点导出
    this.columns.forEach(item => {
    if (item.dataIndex != 'action') {
    entozh[item.dataIndex] = item.title
    }
    })
    }
    WmsSubstituteGoodPage(Object.assign({ pageSize: 100000, pageIndex: 1 }, this.queryParam)).then((res) => {
    this.loading = false;
    //需要截取日期的字段
    var arrDataCutout = this.columns.filter(v => v.customCutout == true);
    res.data.rows.forEach(item => {
    var arrKeys = Object.keys(item);
    arrKeys.forEach(key => {
    var strFieldDic = key + 'Data';
    //枚举转值
    if (this[strFieldDic] && this[strFieldDic].length > 0) {
    let arrFieldDic = this[strFieldDic].filter(v => String(v.code) == String(item[key]));
    if (arrFieldDic.length > 0) {
    item[key] = arrFieldDic[0]?.name || '没有枚举值';
    }
    }
    // æ—¥æœŸæˆªå–
    if (arrDataCutout.length > 0) {
    arrDataCutout.forEach(itemIn => {
    if (key == itemIn.dataIndex && item[key]) {
    item[key] = item[key].split(" ")[0]
    }
    })
    }
    });
    })
    exportExcel(res.data.rows, entozh, "xlsx", `${this.$route.meta.title}`)
    }).catch((err) => {
    this.loading = false
    this.$message.error('下载错误:获取文件流错误' + err)
    })
    },
    toggleAdvanced () {
    this.advanced = !this.advanced
    this.handleTableHt() //设置主表表格高度
    },
    onChangecreatedTime(date, dateString) {
      this.queryParam.createdTime = dateString
    },
    onChangeupdatedTime(date, dateString) {
      this.queryParam.updatedTime = dateString
    },
    handleOk () {
    this.$refs.table.refresh()
    },
    onSelectChange (selectedRowKeys, selectedRows) {
    this.selectedRowKeys = selectedRowKeys
    this.selectedRows = selectedRows
    }
    }
    }
</script>
<style lang="less">
  .table-operator {
    margin-bottom: 18px;
  }
  button {
    margin-right: 8px;
  }
</style>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/addForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
<template>
  <a-modal
    title="新增仓库表"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
        <a-form :form="form">
        <a-form-item label="仓库编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库编号" v-decorator="['code', {rules: [{required: true, message: '请输入仓库编号!'}]}]" />
        </a-form-item>
        <a-form-item label="仓库名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库名称" v-decorator="['name', {rules: [{required: true, message: '请输入仓库名称!'}]}]" />
        </a-form-item>
        <a-form-item label="仓库地址" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库地址" v-decorator="['address']" />
        </a-form-item>
        <a-form-item label="工厂编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入工厂编号" v-decorator="['factoryCode']" />
        </a-form-item>
        <a-form-item label="长" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入长" v-decorator="['length']" />
        </a-form-item>
        <a-form-item label="宽" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入宽" v-decorator="['width']" />
        </a-form-item>
        <a-form-item label="高" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入高" v-decorator="['height']" />
        </a-form-item>
        <a-form-item label="基本单元" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入基本单元" v-decorator="['baseUnit']" />
        </a-form-item>
        <a-form-item label="定位" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入定位" v-decorator="['position']" />
        </a-form-item>
        <a-form-item label="是否禁用" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: '请选择是否禁用!' }], valuePropName: 'checked'}]" />
        </a-form-item>
        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入备注" v-decorator="['remarks']" />
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
  import moment from 'moment'
  import {
  WmsWarehouseAdd
  } from '@/api/modular/main/WmsBase/WmsWarehouseManage'
  export default {
  data () {
  return {
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      add (record) {
        this.visible = true
        this.$nextTick(() => {
        });
      },
      /**
       * æäº¤è¡¨å•
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
              }
            }
            WmsWarehouseAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/editForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
<template>
  <a-modal
    title="编辑仓库表"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel">
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item label="仓库编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库编号" v-decorator="['code', {rules: [{required: true, message: '请输入仓库编号!'}]}]" />
        </a-form-item>
        <a-form-item label="仓库名称" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库名称" v-decorator="['name', {rules: [{required: true, message: '请输入仓库名称!'}]}]" />
        </a-form-item>
        <a-form-item label="仓库地址" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入仓库地址" v-decorator="['address']" />
        </a-form-item>
        <a-form-item label="工厂编号" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入工厂编号" v-decorator="['factoryCode']" />
        </a-form-item>
        <a-form-item label="长" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入长" v-decorator="['length']" />
        </a-form-item>
        <a-form-item label="宽" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入宽" v-decorator="['width']" />
        </a-form-item>
        <a-form-item label="高" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入高" v-decorator="['height']" />
        </a-form-item>
        <a-form-item label="基本单元" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入基本单元" v-decorator="['baseUnit']" />
        </a-form-item>
        <a-form-item label="定位" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入定位" v-decorator="['position']" />
        </a-form-item>
        <a-form-item label="是否禁用" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: '请选择是否禁用!' }], valuePropName: 'checked'}]" />
        </a-form-item>
        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback>
          <a-input placeholder="请输入备注" v-decorator="['remarks']" />
        </a-form-item>
        <a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
import moment from 'moment'
  import {
  WmsWarehouseEdit
  } from '@/api/modular/main/WmsBase/WmsWarehouseManage'
  export default {
  data () {
  return {
  Id: 0,
  labelCol: {
  xs: { span: 24 },
  sm: { span: 5 }
  },
  wrapperCol: {
  xs: { span: 24 },
  sm: { span: 15 }
  },
  record: {},
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
    moment,
      // åˆå§‹åŒ–方法
      edit (record) {
        this.visible = true;
        this.Id = record.id;
        this.$nextTick(() => {
        });
        //深度拷贝 ç§»é™¤VUE的监听,防止INDEX页面值变动
        this.record = JSON.parse(JSON.stringify(record))
        this.$nextTick(() => {
          this.form.setFieldsValue(
            {
              id: record.id,
              code: record.code,
              name: record.name,
              address: record.address,
              factoryCode: record.factoryCode,
              length: record.length,
              width: record.width,
              height: record.height,
              baseUnit: record.baseUnit,
              position: record.position,
              isDisabled: record.isDisabled,
              remarks: record.remarks
            }
          )
        })
      },
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (values[key] == null) continue
              if (typeof (values[key]) === 'object') {
                values[key] = JSON.stringify(values[key])
                 this.record[key] = values[key]
              } else {
                 this.record[key] = values[key]
              }
            }
            WmsWarehouseEdit(this.record).then((res) => {
              if (res.success) {
                this.$message.success('编辑成功')
                this.confirmLoading = false
                this.$emit('ok', this.record)
                this.handleCancel()
              } else {
                this.$message.error('编辑失败:' + JSON.stringify(res.message))
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          }else{
            this.confirmLoading = false
          }
        });
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/excelForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
<template>
  <a-modal
    :width="850"
    :destroyOnClose="true"
    :visible="visible"
    :forceRender="true"
    title="批量导入"
    cancelText="取消上传"
    okText="开始上传"
    @cancel="handleCancel"
    @ok="handleSubmit">
    <a-spin :spinning="confirmLoading">
      <a-row :span="24">
        <span>请选择要导入的数据文件(Excel格式)</span>
      </a-row>
      <p></p>
      <a-row>
        <a-col :span="16">
          <a-upload-dragger accept=".xlsx,.xls" :multiple="false" :customRequest="customRequest" @change="handleChange" :beforeUpload="beforeUpload">
            <a-icon style="font-size: 40px;" type="cloud-upload" />
          </a-upload-dragger>
        </a-col>
        <!--<a-col :span="8">
          <span>导入模式:</span>
          <a-select
            style="width: 130px"
            placeholder="请选择导入模式"
            v-model="importExcelType">
            <a-select-option
              v-for="(item,index) in importExcelTypeData"
              :key="index"
              :value="item.code">{{ item.name }}
            </a-select-option>
          </a-select>
        </a-col>-->
      </a-row>
      <a-row :span="24">
        <!--<a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="!detailed">
          ç‚¹å‡»æŸ¥çœ‹æ–‡ä»¶ä¸Šä¼ è¦æ±‚
        </a-button>-->
        <span>【</span>
        <a-button style="width: 90px;text-align: left;" @click="wmsWarehouseDownloadExcelTemplate" type="link">下载导入模板</a-button>,填写并上传
        <span>】</span>
        <a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="detailed">
          æ”¶èµ·
        </a-button>
      </a-row>
      <a-row v-show="detailed" style="background: #fef4e8; height: 30px;" :span="24">
        <a-breadcrumb>
          <a-breadcrumb-item style="line-height: 30px;color: #faad14;margin-left: 18px;">文件上传要求</a-breadcrumb-item>
        </a-breadcrumb>
      </a-row>
      <pre v-show="detailed">
        <div v-html="demandText"></div>
      </pre>
      <a-table v-show="detailed" :columns="columns" :data-source="dataList" :rowKey="(record) => record.processID" :pagination="false"></a-table>
      <pre v-show="detailed">
        <div v-html="columnText"></div>
      </pre>
    </a-spin>
  </a-modal>
</template>
<script>
  import { downloadFile, checkFile, parseExcelFieldText, parseDemandText } from '@/utils/util'
  import { WmsWarehouseImportExcel, WmsWarehouseDownloadExcelTemplate} from '@/api/modular/main/WmsBase/WmsWarehouseManage'
  import { sysExcelTemplateGetColumnList } from '@/api/modular/system/excelTemplateManage'
  export default {
  components: {
  },
  data() {
  return {
  visible: false,
  detailed: false,
  confirmLoading: false,
  fileList: [],
  importExcelTypeData: [],
  importExcelType: '1',
  uploadFile: null,
  columns: [],
  dataList: [],
  demandText:'',
  columnText: ''
  }
  },
  methods: {
  index() {
  this.visible = true;
  this.importExcelTypeData = this.$options.filters['dictData']('import_excel_type')
  this.demandText = parseDemandText("wmsWarehouseDownloadExcelTemplate")
  window.downloadFile = this.wmsWarehouseDownloadExcelTemplate;
  this.getTable();
  },
  showDemand() {
  this.detailed = !this.detailed;
  },
  customRequest(document) {
  this.uploadFile = document
  },
  getTable() {
  sysExcelTemplateGetColumnList({className: "WmsWarehouse"}).then(res =>
  {
  if (res.success) {
  this.columns =[];
  this.dataList = [{}];
  res.data.forEach(x => {
  this.columns.push({
  dataIndex: x.columnName,
  key: x.columnName,
  title: x.columnComment
  });
  this.dataList[0][x.columnName] = x.isRequired ? "必填" : "非必填"
  });
  this.columnText = parseExcelFieldText(res.data);
  }
  });
  },
  beforeUpload(fileInfo) {
  let res = checkFile(fileInfo, 1073741824, ['.xlsx', '.xls']);
  if (!res.success) {
  this.$message.warning(res.msg)
  return false
  }
  setTimeout(() => {this.uploadFile.onSuccess(this.uploadFile.file)}, 1000)
  },
  handleChange(fileInfo) {
  if (fileInfo.file.status === 'error') {
  fileInfo.fileList.splice(0, 1)
  }
  if (fileInfo.file.status === 'done') {
  if (fileInfo.fileList.length > 1) {
  fileInfo.fileList.splice(0, 1)
  }
  this.fileList = fileInfo.file
  }
  },
  handleSubmit() {
  this.confirmLoading = true
  const formData = new FormData()
  formData.append('file', this.uploadFile.file)
  WmsWarehouseImportExcel(formData, {importExcelType: this.importExcelType}).then(res => {
  this.$message.success('操作成功')
  this.confirmLoading = false
  this.$emit('ok', [])
  this.handleCancel()
  }).finally((res)=>{this.confirmLoading = false})
  },
  handleCancel() {
  this.visible = false
  this.detailed = false
  },
  wmsWarehouseDownloadExcelTemplate() {
  WmsWarehouseDownloadExcelTemplate({version: "v2"}).then((res) => {
  downloadFile(res);
  }).catch((err) => {
  this.$message.error('下载错误:获取文件流错误' + err)
  })
  }
  }
  }
</script>
<style scoped>
::v-deep .ant-upload.ant-upload-drag {
  position: relative;
  width: 140px;
  height: 135px;
  text-align: center;
  background: #fafafa;
  border: 1px dashed #d9d9d9;
  border-radius: 2px;
  cursor: pointer;
  -webkit-transition: border-color 0.3s;
  transition: border-color 0.3s;
}
::v-deep .ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger), .ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger) {
  color: #ffc53d;
  border-color: white;
}
</style>
iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsWarehouse/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,638 @@
<template>
  <div ref="boxOutWrap" class="boxOutWrap">
    <div ref="boxForm" class="boxForm">
    <a-card :bordered="false" :bodyStyle="tstyle">
      <div class="table-page-search-wrapper" v-if="hasPerm('WmsWarehouse:page')">
        <a-form layout="inline">
          <a-row :gutter="48">
            <a-col :md="8" :sm="24">
              <a-form-item label="仓库编号">
                <a-input v-model="queryParam.code" allow-clear placeholder="请输入仓库编号"/>
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="24">
              <a-form-item label="仓库名称">
                <a-input v-model="queryParam.name" allow-clear placeholder="请输入仓库名称"/>
              </a-form-item>
            </a-col><template v-if="advanced">
              <a-col :md="8" :sm="24">
                <a-form-item label="仓库地址">
                  <a-input v-model="queryParam.address" allow-clear placeholder="请输入仓库地址"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="工厂编号">
                  <a-input v-model="queryParam.factoryCode" allow-clear placeholder="请输入工厂编号"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="长">
                  <a-input v-model="queryParam.length" allow-clear placeholder="请输入长"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="宽">
                  <a-input v-model="queryParam.width" allow-clear placeholder="请输入宽"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="高">
                  <a-input v-model="queryParam.height" allow-clear placeholder="请输入高"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="基本单元">
                  <a-input v-model="queryParam.baseUnit" allow-clear placeholder="请输入基本单元"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="定位">
                  <a-input v-model="queryParam.position" allow-clear placeholder="请输入定位"/>
                </a-form-item>
              </a-col>
            <a-col :md="8" :sm="24">
                <a-form-item label="是否禁用">
                    <a-select :allowClear="true" style="width: 100%" v-model="queryParam.isDisabled" placeholder="请选择是否禁用">
                        <a-select-option v-for="(item,index) in isDisabledData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                    </a-select>
                </a-form-item>
            </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="备注">
                  <a-input v-model="queryParam.remarks" allow-clear placeholder="请输入备注"/>
                </a-form-item>
              </a-col>          <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="创建时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.createdTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangecreatedTime"/>
                    </a-form-item>
                </a-col>
                      <!--年月日时分秒-->
            <!--时间范围-->
                <a-col :md="8" :sm="24">
                    <a-form-item label="更新时间">
                        <a-range-picker style="width: 100%" :placeholder="['开始时间', '结束时间']"  :show-time="{
format: 'HH:mm:ss',  defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.updatedTime"  value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"   @change="onChangeupdatedTime"/>
                    </a-form-item>
                </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="创建者名称">
                  <a-input v-model="queryParam.createdUserName" allow-clear placeholder="请输入创建者名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="修改者名称">
                  <a-input v-model="queryParam.updatedUserName" allow-clear placeholder="请输入修改者名称"/>
                </a-form-item>
              </a-col>    </template>
            <a-col :md="8" :sm="24" >
              <span class="table-page-search-submitButtons">
                <a-button type="primary" @click="$refs.table.refresh(true)" >查询</a-button>
                <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
                <a @click="toggleAdvanced" style="margin-left: 8px"> {{ advanced ? '收起' : '展开' }}
                  <a-icon :type="advanced ? 'up' : 'down'"/>
                </a>
              </span>
            </a-col>
          </a-row>
        </a-form>
      </div>
    </a-card>
    </div>
    <a-card :bordered="false">
      <s-table
        ref="table"
        :columns="columns"
        :data="loadData"
        :alert="true"
        @changeTablePage="pageInfo = $event"
        :scroll="{x: true,y:tableHeight}"
        :rowKey="(record) => record.id"
        :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
        <template class="table-operator" slot="operator" v-if="hasPerm('WmsWarehouse:add')" >
        <div ref="actionBar" class="actionBar">
            <a-button type="info" v-if="hasPerm('sysExcelTemplate:importExcel')" icon="upload" @click="$refs.excelForm.index()">
            å¯¼å…¥
          </a-button>
          <a-button type="info" v-if="hasPerm('WmsWarehouse:exportExcel')" icon="download" @click="WmsWarehouseToExcel()">
            å¯¼å‡º
          </a-button>
            <a-button type="primary" v-if="hasPerm('WmsWarehouse:add')" icon="plus" @click="$refs.addForm.add()">新增仓库表</a-button>
        </div>
        </template>
          <span slot="isDisabledscopedSlots" slot-scope="text">
            <div v-if="text===true ">
                <a-tag color="green">是</a-tag>
            </div>
            <div v-else-if="text==false">
                <a-tag color="volcano">否</a-tag>
            </div>
            <div v-else=""></div>
            </span>
          <span slot="action" slot-scope="text, record">
            <a v-if="hasPerm('WmsWarehouse:edit')" @click="$refs.editForm.edit(record)">编辑</a>
          <a-divider type="vertical" v-if="hasPerm('WmsWarehouse:edit') & hasPerm('WmsWarehouse:delete')"/>
          <a-popconfirm v-if="hasPerm('WmsWarehouse:delete')" placement="topRight" title="确认删除?" @confirm="() => WmsWarehouseDelete(record)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </s-table>
      <add-form ref="addForm" @ok="handleOk" />
      <edit-form ref="editForm" @ok="handleOk" />
      <excel-form ref="excelForm" @ok="handleOk" />
    </a-card>
  </div>
</template>
<script>
    import { STable } from '@/components'
    import moment from 'moment'
    import { WmsWarehousePage, WmsWarehouseDelete, WmsWarehouseToExcel } from '@/api/modular/main/WmsBase/WmsWarehouseManage'
    //自定义table高度
    import setTableHtMixin from '@/mixins/handleTableHt.js'
    import addForm from './addForm.vue'
    import { exportExcel } from '@/utils/exportToExcel'
    import { downloadFile } from '@/utils/util'
    import editForm from './editForm.vue'
    import excelForm from './excelForm.vue'
    export default {
    mixins: [setTableHtMixin],
    components: {
    STable,
    addForm,
    editForm,
    excelForm
    },
    data () {
    return {
    advanced: false, // é«˜çº§æœç´¢ å±•å¼€/关闭
    queryParam: {},
     pageInfo: {
        current: 1,
        pageSize: 10
      },
    columns: [
    {
    title:'序号',
    width: '60px',
    align: 'center',
    customRender: (text, record, index) => `${index + 1 + (this.pageInfo.current - 1) * this.pageInfo.pageSize}`
    },
    {
    title: '仓库编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'code'
    },
    {
    title: '仓库名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'name'
    },
    {
    title: '仓库地址',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'address'
    },
    {
    title: '工厂编号',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'factoryCode'
    },
    {
    title: '长',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'length'
    },
    {
    title: '宽',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'width'
    },
    {
    title: '高',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'height'
    },
    {
    title: '基本单元',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'baseUnit'
    },
    {
    title: '定位',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'position'
    },
    {
    title: '是否禁用',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'isDisabled',
    scopedSlots: { customRender: 'isDisabledscopedSlots' }
    },
    {
    title: '备注',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'remarks'
    },
    {
    title: '创建时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdTime'
    },
    {
    title: '更新时间',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedTime'
    },
    {
    title: '创建者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'createdUserName'
    },
    {
    title: '修改者名称',
    align: 'center',
    customHeaderCell: () => {
    return {
     style: {
    'min-width': '120px'//最小列宽设置
     }
     }
    },
    customCell: () => {
    return {
    style: {
    'min-width': '120px'//最小列宽设置
    }
    }
    },
    sorter: true,
    dataIndex: 'updatedUserName'
    }
    ],
    tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
    // åŠ è½½æ•°æ®æ–¹æ³• å¿…须为 Promise å¯¹è±¡
    loadData: parameter => {
    return WmsWarehousePage(Object.assign(parameter, this.switchingDate())).then((res) => {
    return res.data
    })
    },
    selectedRowKeys: [],
    selectedRows: []
    }
    },
    created () {
    if (this.hasPerm('WmsWarehouse:edit') || this.hasPerm('WmsWarehouse:delete')) {
    this.columns.push({
    title: '操作',
    width: '150px',
    dataIndex: 'action',
    scopedSlots: { customRender: 'action' }
    })
    }
    const path = this.$route.path
    const columnStr = window.localStorage.getItem(path)
    if(columnStr) {
    var _columns = JSON.parse(columnStr)
    this.columns.forEach(element => {
    var fObj = _columns.find((item, index) => {
    return item.dataIndex === element.dataIndex;
    })
    if(fObj!=undefined && fObj!=null){
    element.checked=fObj.checked;
    }
    });
    }
    const isDisabledOption = this.$options
    this.isDisabledData = isDisabledOption.filters['dictData']('yes_true_false')
    this.handleTableHt() //设置主表表格高度
    window.addEventListener(
    'resize',
    () => {
    this.handleTableHt() // ç›‘听屏幕大小改变表格高度
    },
    false
    )
    },
    methods: {
    moment,
    /**
    * æŸ¥è¯¢å‚数组装
    */
    switchingDate () {
    const obj = JSON.parse(JSON.stringify(this.queryParam))
    return obj
    },
    WmsWarehouseDelete (record) {
    WmsWarehouseDelete(record).then((res) => {
    if (res.success) {
    this.$message.success('删除成功')
    this.$refs.table.refresh()
    } else {
    this.$message.error('删除失败') // + res.message
    }
    })
    },
    WmsWarehouseToExcel() {
    this.loading = true
    let entozh = {};
    const path = this.$route.path;
    if (window.localStorage.getItem(path)) {
    JSON.parse(window.localStorage.getItem(path)).forEach(item => {
    if (item.dataIndex != 'action' && item.checked) {
    entozh[item.dataIndex] = item.title
    }
    })
    } else { //直接点导出
    this.columns.forEach(item => {
    if (item.dataIndex != 'action') {
    entozh[item.dataIndex] = item.title
    }
    })
    }
    WmsWarehousePage(Object.assign({ pageSize: 100000, pageIndex: 1 }, this.queryParam)).then((res) => {
    this.loading = false;
    //需要截取日期的字段
    var arrDataCutout = this.columns.filter(v => v.customCutout == true);
    res.data.rows.forEach(item => {
    var arrKeys = Object.keys(item);
    arrKeys.forEach(key => {
    var strFieldDic = key + 'Data';
    //枚举转值
    if (this[strFieldDic] && this[strFieldDic].length > 0) {
    let arrFieldDic = this[strFieldDic].filter(v => String(v.code) == String(item[key]));
    if (arrFieldDic.length > 0) {
    item[key] = arrFieldDic[0]?.name || '没有枚举值';
    }
    }
    // æ—¥æœŸæˆªå–
    if (arrDataCutout.length > 0) {
    arrDataCutout.forEach(itemIn => {
    if (key == itemIn.dataIndex && item[key]) {
    item[key] = item[key].split(" ")[0]
    }
    })
    }
    });
    })
    exportExcel(res.data.rows, entozh, "xlsx", `${this.$route.meta.title}`)
    }).catch((err) => {
    this.loading = false
    this.$message.error('下载错误:获取文件流错误' + err)
    })
    },
    toggleAdvanced () {
    this.advanced = !this.advanced
    this.handleTableHt() //设置主表表格高度
    },
    onChangecreatedTime(date, dateString) {
      this.queryParam.createdTime = dateString
    },
    onChangeupdatedTime(date, dateString) {
      this.queryParam.updatedTime = dateString
    },
    handleOk () {
    this.$refs.table.refresh()
    },
    onSelectChange (selectedRowKeys, selectedRows) {
    this.selectedRowKeys = selectedRowKeys
    this.selectedRows = selectedRows
    }
    }
    }
</script>
<style lang="less">
  .table-operator {
    margin-bottom: 18px;
  }
  button {
    margin-right: 8px;
  }
</style>
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Dto/WmsContainerPackagingInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,193 @@
using Admin.NET.Core;
using Admin.NET.Core.Service;
using System.ComponentModel.DataAnnotations;
namespace Admin.NET.Application
{
    /// <summary>
    /// åŒ…装关系基础表查询参数
    /// </summary>
    public class WmsContainerPackagingSearch : PageInputBase
    {
        /// <summary>
        /// å®¹å™¨ç±»åž‹ID
        /// </summary>
        public virtual long? ContainerTypeId { get; set; }
        /// <summary>
        /// å®¹å™¨ç±»åž‹åç§°
        /// </summary>
        public virtual string ContainerTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ID
        /// </summary>
        public virtual long? MaterialTypeId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ç¼–号
        /// </summary>
        public virtual string MaterialTypeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹åç§°
        /// </summary>
        public virtual string MaterialTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™å®¹å™¨å®¹é‡
        /// </summary>
        public virtual decimal? BoxQty { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public virtual List<string> CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public virtual List<string> UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
        /// <summary>
    /// åŒ…装关系基础表不分页查询参数
    /// </summary>
    public class WmsContainerPackagingSearchNonPage : PageInputNonPageBase
    {
        /// <summary>
        /// å®¹å™¨ç±»åž‹ID
        /// </summary>
        public virtual long? ContainerTypeId { get; set; }
        /// <summary>
        /// å®¹å™¨ç±»åž‹åç§°
        /// </summary>
        public virtual string ContainerTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ID
        /// </summary>
        public virtual long? MaterialTypeId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ç¼–号
        /// </summary>
        public virtual string MaterialTypeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹åç§°
        /// </summary>
        public virtual string MaterialTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™å®¹å™¨å®¹é‡
        /// </summary>
        public virtual decimal? BoxQty { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
    /// <summary>
    /// åŒ…装关系基础表输入参数
    /// </summary>
    public class WmsContainerPackagingInput
    {
        /// <summary>
        /// å®¹å™¨ç±»åž‹ID
        /// </summary>
        public virtual long? ContainerTypeId { get; set; }
        /// <summary>
        /// å®¹å™¨ç±»åž‹åç§°
        /// </summary>
        public virtual string ContainerTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ID
        /// </summary>
        public virtual long? MaterialTypeId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ç¼–号
        /// </summary>
        public virtual string MaterialTypeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹åç§°
        /// </summary>
        public virtual string MaterialTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™å®¹å™¨å®¹é‡
        /// </summary>
        public virtual decimal? BoxQty { get; set; }
    }
    /// <summary>
    /// åŒ…装关系基础表新增参数
    /// </summary>
    public class AddWmsContainerPackagingInput : WmsContainerPackagingInput
    {
    }
    /// <summary>
    /// åŒ…装关系基础表删除参数
    /// </summary>
    public class DeleteWmsContainerPackagingInput : BaseId
    {
    }
    /// <summary>
    /// åŒ…装关系基础表更新参数
    /// </summary>
    public class UpdateWmsContainerPackagingInput : WmsContainerPackagingInput
    {
        /// <summary>
        /// Id主键
        /// </summary>
        [Required(ErrorMessage = "Id主键不能为空")]
        public long? Id { get; set; }
    }
    /// <summary>
    /// åŒ…装关系基础表获取单个参数
    /// </summary>
    public class QueryeWmsContainerPackagingInput : BaseId
    {
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Dto/WmsContainerPackagingOutput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
using Admin.NET.Core.Util.LowCode.Dto;
using System;
namespace Admin.NET.Application
{
    /// <summary>
    /// åŒ…装关系基础表输出参数
    /// </summary>
    public class WmsContainerPackagingOutput
    {
        /// <summary>
        /// å®¹å™¨ç±»åž‹ID
        /// </summary>
        public long? ContainerTypeId { get; set; }
        /// <summary>
        /// å®¹å™¨ç±»åž‹åç§°
        /// </summary>
        public string ContainerTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ID
        /// </summary>
        public long? MaterialTypeId { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹ç¼–号
        /// </summary>
        public string MaterialTypeCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç±»åž‹åç§°
        /// </summary>
        public string MaterialTypeName { get; set; }
        /// <summary>
        /// ç‰©æ–™å®¹å™¨å®¹é‡
        /// </summary>
        public decimal? BoxQty { get; set; }
        /// <summary>
        /// Id主键
        /// </summary>
        public long? Id { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public DateTimeOffset? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public DateTimeOffset? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public string UpdatedUserName { get; set; }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/IWmsContainerPackagingService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using Admin.NET.Core;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Admin.NET.Application
{
    public interface IWmsContainerPackagingService
    {
        Task<WmsContainerPackagingOutput> Get([FromQuery] QueryeWmsContainerPackagingInput input);
        Task<List<WmsContainerPackagingOutput>> List([FromQuery] WmsContainerPackagingInput input);
        Task<PageResult<WmsContainerPackagingOutput>> Page([FromQuery] WmsContainerPackagingSearch input);
        Task<List<WmsContainerPackagingOutput>> ListNonPageAsync([FromQuery] WmsContainerPackagingSearchNonPage input);
        Task Add(AddWmsContainerPackagingInput input);
        Task Update(UpdateWmsContainerPackagingInput input);
        Task Delete(DeleteWmsContainerPackagingInput input);
        Task<int> ImportExcelAsync(IFormFile file);
        IActionResult DownloadExcelTemplate(string version);
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/Map/WmsContainerPackagingMapper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using Mapster;
using Admin.NET.Core;
namespace Admin.NET.Application
{
    public class WmsContainerPackagingMapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<AddWmsContainerPackagingInput, WmsContainerPackaging>()
            ;
            config.ForType<UpdateWmsContainerPackagingInput, WmsContainerPackaging>()
            ;
            config.ForType<WmsContainerPackaging, WmsContainerPackagingOutput>()
            ;
        }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsContainerPackaging/WmsContainerPackagingService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,397 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Admin.NET.Core;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Web;
using System.ComponentModel;
using System.Data;
namespace Admin.NET.Application
{
    /// <summary>
    /// åŒ…装关系基础表服务
    /// </summary>
    [ApiDescriptionSettings("WmsBase", Name = "WmsContainerPackaging", Order = 100)]
    [Route("api")]
    public class WmsContainerPackagingService : IWmsContainerPackagingService, IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsContainerPackaging,MasterDbContextLocator> _wmsContainerPackagingRep;
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        public WmsContainerPackagingService(
            IRepository<WmsContainerPackaging,MasterDbContextLocator> wmsContainerPackagingRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
        )
        {
            _wmsContainerPackagingRep = wmsContainerPackagingRep;
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
        }
        /// <summary>
        /// åˆ†é¡µæŸ¥è¯¢åŒ…装关系基础表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsContainerPackaging/page")]
        public async Task<PageResult<WmsContainerPackagingOutput>> Page([FromQuery] WmsContainerPackagingSearch input)
        {
            var wmsContainerPackagings = await _wmsContainerPackagingRep.DetachedEntities
                                     .Where(input.ContainerTypeId != null, u => u.ContainerTypeId == input.ContainerTypeId)
                                     .Where(!string.IsNullOrEmpty(input.ContainerTypeName), u => u.ContainerTypeName == input.ContainerTypeName)
                                     .Where(input.MaterialTypeId != null, u => u.MaterialTypeId == input.MaterialTypeId)
                                     .Where(!string.IsNullOrEmpty(input.MaterialTypeCode), u => u.MaterialTypeCode == input.MaterialTypeCode)
                                     .Where(!string.IsNullOrEmpty(input.MaterialTypeName), u => u.MaterialTypeName == input.MaterialTypeName)
                                     .Where(input.BoxQty != null, u => u.BoxQty == input.BoxQty)
                                     .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
                                     .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                                     .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName)
                                     .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName)
                                     .OrderBy(PageInputOrder.OrderBuilder<WmsContainerPackagingSearch>(input))
                                     .ProjectToType<WmsContainerPackagingOutput>()
                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsContainerPackagings;
        }
        /// <summary>
        /// ä¸åˆ†é¡µæŸ¥è¯¢åŒ…装关系基础表列表
        /// </summary>
        /// <param name="input">包装关系基础表查询参数</param>
        /// <returns>(包装关系基础表)实例列表</returns>
        [HttpGet("WmsContainerPackaging/listNonPage")]
        public async Task<List<WmsContainerPackagingOutput>> ListNonPageAsync([FromQuery] WmsContainerPackagingSearchNonPage input)
        {
            var pContainerTypeId = input.ContainerTypeId;
            var pContainerTypeName = input.ContainerTypeName?.Trim() ?? "";
            var pMaterialTypeId = input.MaterialTypeId;
            var pMaterialTypeCode = input.MaterialTypeCode?.Trim() ?? "";
            var pMaterialTypeName = input.MaterialTypeName?.Trim() ?? "";
            var pBoxQty = input.BoxQty;
            var pCreatedTime = input.CreatedTime;
            var pUpdatedTime = input.UpdatedTime;
            var pCreatedUserName = input.CreatedUserName?.Trim() ?? "";
            var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? "";
            var wmsContainerPackagings = await _wmsContainerPackagingRep.DetachedEntities
                .Where(pContainerTypeId != null, u => u.ContainerTypeId == pContainerTypeId)
                .Where(!string.IsNullOrEmpty(pContainerTypeName), u => u.ContainerTypeName == pContainerTypeName)
                .Where(pMaterialTypeId != null, u => u.MaterialTypeId == pMaterialTypeId)
                .Where(!string.IsNullOrEmpty(pMaterialTypeCode), u => u.MaterialTypeCode == pMaterialTypeCode)
                .Where(!string.IsNullOrEmpty(pMaterialTypeName), u => u.MaterialTypeName == pMaterialTypeName)
                .Where(pBoxQty != null, u => u.BoxQty == pBoxQty)
           .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
           .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName)
                .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<WmsContainerPackagingOutput>()
            .ToListAsync();
            return wmsContainerPackagings;
        }
         /// <summary>
        /// èŽ·å–åŒ…è£…å…³ç³»åŸºç¡€è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsContainerPackaging/detail")]
        public async Task<WmsContainerPackagingOutput> Get([FromQuery] QueryeWmsContainerPackagingInput input)
        {
            return (await _wmsContainerPackagingRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsContainerPackagingOutput>();
        }
        /// <summary>
        /// èŽ·å–åŒ…è£…å…³ç³»åŸºç¡€è¡¨åˆ—è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsContainerPackaging/list")]
        public async Task<List<WmsContainerPackagingOutput>> List([FromQuery] WmsContainerPackagingInput input)
        {
            return await _wmsContainerPackagingRep.DetachedEntities.ProjectToType<WmsContainerPackagingOutput>().ToListAsync();
        }
        #region å¢žã€åˆ ã€æ”¹
        /// <summary>
        /// å¢žåŠ åŒ…è£…å…³ç³»åŸºç¡€è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsContainerPackaging/add")]
        public async Task Add(AddWmsContainerPackagingInput input)
        {
            var wmsContainerPackaging = input.Adapt<WmsContainerPackaging>();
                        //验证
            await CheckExisit(wmsContainerPackaging);
            wmsContainerPackaging.CreatedUserId = wmsContainerPackaging.UpdatedUserId = SysHelper.GetUserId();
            wmsContainerPackaging.CreatedUserName = wmsContainerPackaging.UpdatedUserName = SysHelper.GetUserName();
            wmsContainerPackaging.CreatedTime = wmsContainerPackaging.UpdatedTime = SysHelper.GetNowTime();
            await _wmsContainerPackagingRep.InsertAsync(wmsContainerPackaging);
        }
        /// <summary>
        /// åˆ é™¤åŒ…装关系基础表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsContainerPackaging/delete")]
        public async Task Delete(DeleteWmsContainerPackagingInput input)
        {
            var wmsContainerPackaging = await _wmsContainerPackagingRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsContainerPackagingRep.DeleteAsync(wmsContainerPackaging);
        }
        /// <summary>
        /// æ›´æ–°åŒ…装关系基础表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsContainerPackaging/edit")]
        public async Task Update(UpdateWmsContainerPackagingInput input)
        {
            var isExist = await _wmsContainerPackagingRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D1002);
            var wmsContainerPackaging = input.Adapt<WmsContainerPackaging>();
            //验证
            await CheckExisit(wmsContainerPackaging,true);
            wmsContainerPackaging.UpdatedUserId = SysHelper.GetUserId();
            wmsContainerPackaging.UpdatedUserName = SysHelper.GetUserName();
            wmsContainerPackaging.UpdatedTime = SysHelper.GetNowTime();
            await _wmsContainerPackagingRep.UpdateAsync(wmsContainerPackaging,ignoreNullValues:true);
        }
        #endregion
        #region å¯¼å…¥
        /// <summary>
        /// Excel模板导入包装关系基础表功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("WmsContainerPackaging/importExcel")]
        public async Task<int> ImportExcelAsync(IFormFile file)
        {
            int _HeadStartLine = 2;//第1行是说明,第2行是列名
            int _DataStartLine = 3;//第3行开始是数据
            DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine);
            var addList =await CommonImport(importDataTable, _DataStartLine);
            lock (_lock)
            {
                _wmsContainerPackagingRep.InsertAsync(addList);
            }
            await Task.CompletedTask;
            return addList.Count;
        }
        /// <summary>
        ///  DataTable转换实体对象列表
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="dataStartLine">模版列名开始行</param>
        /// <returns></returns>
        private async Task<List<WmsContainerPackaging>> CommonImport(DataTable dataTable, int dataStartLine)
        {
            var details = new List<WmsContainerPackaging>();
            int index = dataStartLine;//模版列名开始行
            foreach (System.Data.DataRow row in dataTable.Rows)
            {
                index++;
               //导入模版定制化代码(替换模版使用)
                           var addItem = new WmsContainerPackaging()
                            {
                               CreatedTime = SysHelper.GetNowTime(),
                               CreatedUserId = SysHelper.GetUserId(),
                               CreatedUserName = SysHelper.GetUserName(),
                               UpdatedTime = SysHelper.GetNowTime(),
                               UpdatedUserId = SysHelper.GetUserId(),
                               UpdatedUserName = SysHelper.GetUserName()
                             };
                          #region å®šä¹‰å˜é‡
                           var _ContainerTypeId = "";//容器类型ID
                           var _ContainerTypeName = "";//容器类型名称
                           var _MaterialTypeId = "";//物料类型ID
                           var _MaterialTypeCode = "";//物料类型编号
                           var _MaterialTypeName = "";//物料类型名称
                           var _BoxQty = "";//物料容器容量
                           var _Id = "";//Id主键
                          #endregion
                          #region å–值
                           _ContainerTypeId = row["容器类型ID"]?.ToString() ;
                           _ContainerTypeName = row["容器类型名称"]?.ToString() ;
                           _MaterialTypeId = row["物料类型ID"]?.ToString() ;
                           _MaterialTypeCode = row["物料类型编号"]?.ToString() ;
                           _MaterialTypeName = row["物料类型名称"]?.ToString() ;
                           _BoxQty = row["物料容器容量"]?.ToString() ;
                           _Id = row["Id主键"]?.ToString() ;
                          #endregion
                          #region éªŒè¯
                          if(!string.IsNullOrEmpty(_ContainerTypeId))
                          {
                              if (!long.TryParse(_ContainerTypeId, out long outContainerTypeId)&&!string.IsNullOrEmpty(_ContainerTypeId))
                              {
                                 throw Oops.Oh($"第{index}行[容器类型ID]{_ContainerTypeId}值不正确!");
                              }
                              if (outContainerTypeId <= 0&&!string.IsNullOrEmpty(_ContainerTypeId))
                              {
                                 throw Oops.Oh($"第{index}行[容器类型ID]{_ContainerTypeId}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.ContainerTypeId = outContainerTypeId;
                              }
                          }
                          if(!string.IsNullOrEmpty(_ContainerTypeName))
                          {
                                addItem.ContainerTypeName = (string)_ContainerTypeName;
                           }
                          if(!string.IsNullOrEmpty(_MaterialTypeId))
                          {
                              if (!long.TryParse(_MaterialTypeId, out long outMaterialTypeId)&&!string.IsNullOrEmpty(_MaterialTypeId))
                              {
                                 throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialTypeId}值不正确!");
                              }
                              if (outMaterialTypeId <= 0&&!string.IsNullOrEmpty(_MaterialTypeId))
                              {
                                 throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialTypeId}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.MaterialTypeId = outMaterialTypeId;
                              }
                          }
                          if(!string.IsNullOrEmpty(_MaterialTypeCode))
                          {
                                addItem.MaterialTypeCode = (string)_MaterialTypeCode;
                           }
                          if(!string.IsNullOrEmpty(_MaterialTypeName))
                          {
                                addItem.MaterialTypeName = (string)_MaterialTypeName;
                           }
                          if(!string.IsNullOrEmpty(_BoxQty))
                          {
                              if (!decimal.TryParse(_BoxQty, out decimal outBoxQty)&&!string.IsNullOrEmpty(_BoxQty))
                              {
                                 throw Oops.Oh($"第{index}行[物料容器容量]{_BoxQty}值不正确!");
                              }
                              if (outBoxQty <= 0&&!string.IsNullOrEmpty(_BoxQty))
                              {
                                 throw Oops.Oh($"第{index}行[物料容器容量]{_BoxQty}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.BoxQty = outBoxQty;
                              }
                          }
                          if(!string.IsNullOrEmpty(_Id))
                          {
                              if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!");
                              }
                              if (outId <= 0&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Id = outId;
                              }
                          }
                          #endregion
                details.Add(addItem);
            }
              //验重
              await CheckExisitForImport(details);
            return details;
        }
        /// <summary>
        /// æ ¹æ®ç‰ˆæœ¬ä¸‹è½½åŒ…装关系基础表的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("WmsContainerPackaging/downloadExcelTemplate")]
        public IActionResult DownloadExcelTemplate([FromQuery] string version)
        {
            string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsContainerPackaging{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx";
            var fileName = HttpUtility.UrlEncode($"导入模板(包装关系基础表).xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
        }
        #endregion
        #region ç§æœ‰æ–¹æ³•
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-数据库
        /// </summary>
        /// <param name="input"></param>
        /// <param name="isEdit"></param>
        /// <returns></returns>
        private async Task CheckExisit( WmsContainerPackaging input,bool isEdit=false)
        {
            //没有配置联合主键,不需要验重
       }
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-导入时验证
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        private async Task CheckExisitForImport(List<WmsContainerPackaging> inputs)
        {
            //根据联合主键验证表格中中是否已存在相同数据
        }
        #endregion
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
using Admin.NET.Core;
using Admin.NET.Core.Service;
using System.ComponentModel.DataAnnotations;
namespace Admin.NET.Application
{
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†æŸ¥è¯¢å‚æ•°
    /// </summary>
    public class WmsSubstituteGoodSearch : PageInputBase
    {
        /// <summary>
        /// æ›¿ä»£ç¼–号
        /// </summary>
        public virtual string SubstituteCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        public virtual string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public virtual string MaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™ç¼–号
        /// </summary>
        public virtual string SubstituteMaterialCode { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™åç§°
        /// </summary>
        public virtual string SubstituteMaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£æ¬¡åº
        /// </summary>
        public virtual int? SubstituteIndex { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public virtual bool? IsDisabled { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public virtual List<string> CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public virtual List<string> UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
        /// <summary>
    /// æ›¿ä»£å“ç®¡ç†ä¸åˆ†é¡µæŸ¥è¯¢å‚æ•°
    /// </summary>
    public class WmsSubstituteGoodSearchNonPage : PageInputNonPageBase
    {
        /// <summary>
        /// æ›¿ä»£ç¼–号
        /// </summary>
        public virtual string SubstituteCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        public virtual string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public virtual string MaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™ç¼–号
        /// </summary>
        public virtual string SubstituteMaterialCode { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™åç§°
        /// </summary>
        public virtual string SubstituteMaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£æ¬¡åº
        /// </summary>
        public virtual int? SubstituteIndex { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public virtual bool? IsDisabled { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†è¾“入参数
    /// </summary>
    public class WmsSubstituteGoodInput
    {
        /// <summary>
        /// æ›¿ä»£ç¼–号
        /// </summary>
        [Required(ErrorMessage = "替代编号不能为空")]
        public virtual string SubstituteCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [Required(ErrorMessage = "物料编号不能为空")]
        public virtual string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [Required(ErrorMessage = "物料名称不能为空")]
        public virtual string MaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™ç¼–号
        /// </summary>
        [Required(ErrorMessage = "替代品物料编号不能为空")]
        public virtual string SubstituteMaterialCode { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™åç§°
        /// </summary>
        [Required(ErrorMessage = "替代品物料名称不能为空")]
        public virtual string SubstituteMaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£æ¬¡åº
        /// </summary>
        [Required(ErrorMessage = "替代次序不能为空")]
        public virtual int SubstituteIndex { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        [Required(ErrorMessage = "是否禁用不能为空")]
        public virtual bool IsDisabled { get; set; }
    }
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†æ–°å¢žå‚æ•°
    /// </summary>
    public class AddWmsSubstituteGoodInput : WmsSubstituteGoodInput
    {
    }
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†åˆ é™¤å‚æ•°
    /// </summary>
    public class DeleteWmsSubstituteGoodInput : BaseId
    {
    }
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†æ›´æ–°å‚æ•°
    /// </summary>
    public class UpdateWmsSubstituteGoodInput : WmsSubstituteGoodInput
    {
        /// <summary>
        /// Id主键
        /// </summary>
        [Required(ErrorMessage = "Id主键不能为空")]
        public long? Id { get; set; }
    }
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†èŽ·å–å•ä¸ªå‚æ•°
    /// </summary>
    public class QueryeWmsSubstituteGoodInput : BaseId
    {
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodOutput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
using Admin.NET.Core.Util.LowCode.Dto;
using System;
namespace Admin.NET.Application
{
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†è¾“出参数
    /// </summary>
    public class WmsSubstituteGoodOutput
    {
        /// <summary>
        /// æ›¿ä»£ç¼–号
        /// </summary>
        public string SubstituteCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string MaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™ç¼–号
        /// </summary>
        public string SubstituteMaterialCode { get; set; }
        /// <summary>
        /// æ›¿ä»£å“ç‰©æ–™åç§°
        /// </summary>
        public string SubstituteMaterialName { get; set; }
        /// <summary>
        /// æ›¿ä»£æ¬¡åº
        /// </summary>
        public int SubstituteIndex { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public bool IsDisabled { get; set; }
        /// <summary>
        /// Id主键
        /// </summary>
        public long? Id { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public DateTimeOffset? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public DateTimeOffset? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public string UpdatedUserName { get; set; }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/IWmsSubstituteGoodService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using Admin.NET.Core;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Admin.NET.Application
{
    public interface IWmsSubstituteGoodService
    {
        Task<WmsSubstituteGoodOutput> Get([FromQuery] QueryeWmsSubstituteGoodInput input);
        Task<List<WmsSubstituteGoodOutput>> List([FromQuery] WmsSubstituteGoodInput input);
        Task<PageResult<WmsSubstituteGoodOutput>> Page([FromQuery] WmsSubstituteGoodSearch input);
        Task<List<WmsSubstituteGoodOutput>> ListNonPageAsync([FromQuery] WmsSubstituteGoodSearchNonPage input);
        Task Add(AddWmsSubstituteGoodInput input);
        Task Update(UpdateWmsSubstituteGoodInput input);
        Task Delete(DeleteWmsSubstituteGoodInput input);
        Task<int> ImportExcelAsync(IFormFile file);
        IActionResult DownloadExcelTemplate(string version);
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Map/WmsSubstituteGoodMapper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using Mapster;
using Admin.NET.Core;
namespace Admin.NET.Application
{
    public class WmsSubstituteGoodMapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<AddWmsSubstituteGoodInput, WmsSubstituteGood>()
            ;
            config.ForType<UpdateWmsSubstituteGoodInput, WmsSubstituteGood>()
            ;
            config.ForType<WmsSubstituteGood, WmsSubstituteGoodOutput>()
            ;
        }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/WmsSubstituteGoodService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,481 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Admin.NET.Core;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Web;
using System.ComponentModel;
using System.Data;
namespace Admin.NET.Application
{
    /// <summary>
    /// æ›¿ä»£å“ç®¡ç†æœåŠ¡
    /// </summary>
    [ApiDescriptionSettings("WmsBase", Name = "WmsSubstituteGood", Order = 100)]
    [Route("api")]
    public class WmsSubstituteGoodService : IWmsSubstituteGoodService, IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsSubstituteGood,MasterDbContextLocator> _wmsSubstituteGoodRep;
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        public WmsSubstituteGoodService(
            IRepository<WmsSubstituteGood,MasterDbContextLocator> wmsSubstituteGoodRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
        )
        {
            _wmsSubstituteGoodRep = wmsSubstituteGoodRep;
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
        }
        /// <summary>
        /// åˆ†é¡µæŸ¥è¯¢æ›¿ä»£å“ç®¡ç†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsSubstituteGood/page")]
        public async Task<PageResult<WmsSubstituteGoodOutput>> Page([FromQuery] WmsSubstituteGoodSearch input)
        {
            var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities
                                     .Where(!string.IsNullOrEmpty(input.SubstituteCode), u => u.SubstituteCode == input.SubstituteCode)
                                     .Where(!string.IsNullOrEmpty(input.MaterialCode), u => u.MaterialCode == input.MaterialCode)
                                     .Where(!string.IsNullOrEmpty(input.MaterialName), u => u.MaterialName == input.MaterialName)
                                     .Where(!string.IsNullOrEmpty(input.SubstituteMaterialCode), u => u.SubstituteMaterialCode == input.SubstituteMaterialCode)
                                     .Where(!string.IsNullOrEmpty(input.SubstituteMaterialName), u => u.SubstituteMaterialName == input.SubstituteMaterialName)
                                     .Where(input.SubstituteIndex != null, u => u.SubstituteIndex == input.SubstituteIndex)
                                     .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled)
                                     .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
                                     .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                                     .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName)
                                     .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName)
                                     .OrderBy(PageInputOrder.OrderBuilder<WmsSubstituteGoodSearch>(input))
                                     .ProjectToType<WmsSubstituteGoodOutput>()
                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsSubstituteGoods;
        }
        /// <summary>
        /// ä¸åˆ†é¡µæŸ¥è¯¢æ›¿ä»£å“ç®¡ç†åˆ—表
        /// </summary>
        /// <param name="input">替代品管理查询参数</param>
        /// <returns>(替代品管理)实例列表</returns>
        [HttpGet("WmsSubstituteGood/listNonPage")]
        public async Task<List<WmsSubstituteGoodOutput>> ListNonPageAsync([FromQuery] WmsSubstituteGoodSearchNonPage input)
        {
            var pSubstituteCode = input.SubstituteCode?.Trim() ?? "";
            var pMaterialCode = input.MaterialCode?.Trim() ?? "";
            var pMaterialName = input.MaterialName?.Trim() ?? "";
            var pSubstituteMaterialCode = input.SubstituteMaterialCode?.Trim() ?? "";
            var pSubstituteMaterialName = input.SubstituteMaterialName?.Trim() ?? "";
            var pSubstituteIndex = input.SubstituteIndex;
            var pIsDisabled = input.IsDisabled;
            var pCreatedTime = input.CreatedTime;
            var pUpdatedTime = input.UpdatedTime;
            var pCreatedUserName = input.CreatedUserName?.Trim() ?? "";
            var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? "";
            var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(pSubstituteCode), u => u.SubstituteCode == pSubstituteCode)
                .Where(!string.IsNullOrEmpty(pMaterialCode), u => u.MaterialCode == pMaterialCode)
                .Where(!string.IsNullOrEmpty(pMaterialName), u => u.MaterialName == pMaterialName)
                .Where(!string.IsNullOrEmpty(pSubstituteMaterialCode), u => u.SubstituteMaterialCode == pSubstituteMaterialCode)
                .Where(!string.IsNullOrEmpty(pSubstituteMaterialName), u => u.SubstituteMaterialName == pSubstituteMaterialName)
                .Where(pSubstituteIndex != null, u => u.SubstituteIndex == pSubstituteIndex)
                .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled)
           .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
           .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName)
                .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<WmsSubstituteGoodOutput>()
            .ToListAsync();
            return wmsSubstituteGoods;
        }
         /// <summary>
        /// èŽ·å–æ›¿ä»£å“ç®¡ç†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsSubstituteGood/detail")]
        public async Task<WmsSubstituteGoodOutput> Get([FromQuery] QueryeWmsSubstituteGoodInput input)
        {
            return (await _wmsSubstituteGoodRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsSubstituteGoodOutput>();
        }
        /// <summary>
        /// èŽ·å–æ›¿ä»£å“ç®¡ç†åˆ—è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsSubstituteGood/list")]
        public async Task<List<WmsSubstituteGoodOutput>> List([FromQuery] WmsSubstituteGoodInput input)
        {
            return await _wmsSubstituteGoodRep.DetachedEntities.ProjectToType<WmsSubstituteGoodOutput>().ToListAsync();
        }
        #region å¢žã€åˆ ã€æ”¹
        /// <summary>
        /// å¢žåŠ æ›¿ä»£å“ç®¡ç†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsSubstituteGood/add")]
        public async Task Add(AddWmsSubstituteGoodInput input)
        {
            var wmsSubstituteGood = input.Adapt<WmsSubstituteGood>();
                        //验证
            await CheckExisit(wmsSubstituteGood);
            wmsSubstituteGood.CreatedUserId = wmsSubstituteGood.UpdatedUserId = SysHelper.GetUserId();
            wmsSubstituteGood.CreatedUserName = wmsSubstituteGood.UpdatedUserName = SysHelper.GetUserName();
            wmsSubstituteGood.CreatedTime = wmsSubstituteGood.UpdatedTime = SysHelper.GetNowTime();
            await _wmsSubstituteGoodRep.InsertAsync(wmsSubstituteGood);
        }
        /// <summary>
        /// åˆ é™¤æ›¿ä»£å“ç®¡ç†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsSubstituteGood/delete")]
        public async Task Delete(DeleteWmsSubstituteGoodInput input)
        {
            var wmsSubstituteGood = await _wmsSubstituteGoodRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsSubstituteGoodRep.DeleteAsync(wmsSubstituteGood);
        }
        /// <summary>
        /// æ›´æ–°æ›¿ä»£å“ç®¡ç†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsSubstituteGood/edit")]
        public async Task Update(UpdateWmsSubstituteGoodInput input)
        {
            var isExist = await _wmsSubstituteGoodRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D1002);
            var wmsSubstituteGood = input.Adapt<WmsSubstituteGood>();
            //验证
            await CheckExisit(wmsSubstituteGood,true);
            wmsSubstituteGood.UpdatedUserId = SysHelper.GetUserId();
            wmsSubstituteGood.UpdatedUserName = SysHelper.GetUserName();
            wmsSubstituteGood.UpdatedTime = SysHelper.GetNowTime();
            await _wmsSubstituteGoodRep.UpdateAsync(wmsSubstituteGood,ignoreNullValues:true);
        }
        #endregion
        #region å¯¼å…¥
        /// <summary>
        /// Excel模板导入替代品管理功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("WmsSubstituteGood/importExcel")]
        public async Task<int> ImportExcelAsync(IFormFile file)
        {
            int _HeadStartLine = 2;//第1行是说明,第2行是列名
            int _DataStartLine = 3;//第3行开始是数据
            DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine);
            var addList =await CommonImport(importDataTable, _DataStartLine);
            lock (_lock)
            {
                _wmsSubstituteGoodRep.InsertAsync(addList);
            }
            await Task.CompletedTask;
            return addList.Count;
        }
        /// <summary>
        ///  DataTable转换实体对象列表
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="dataStartLine">模版列名开始行</param>
        /// <returns></returns>
        private async Task<List<WmsSubstituteGood>> CommonImport(DataTable dataTable, int dataStartLine)
        {
            var details = new List<WmsSubstituteGood>();
            int index = dataStartLine;//模版列名开始行
            foreach (System.Data.DataRow row in dataTable.Rows)
            {
                index++;
               //导入模版定制化代码(替换模版使用)
                           var addItem = new WmsSubstituteGood()
                            {
                               CreatedTime = SysHelper.GetNowTime(),
                               CreatedUserId = SysHelper.GetUserId(),
                               CreatedUserName = SysHelper.GetUserName(),
                               UpdatedTime = SysHelper.GetNowTime(),
                               UpdatedUserId = SysHelper.GetUserId(),
                               UpdatedUserName = SysHelper.GetUserName()
                             };
                          #region å®šä¹‰å˜é‡
                           var _SubstituteCode = "";//替代编号
                           var _MaterialCode = "";//物料编号
                           var _MaterialName = "";//物料名称
                           var _SubstituteMaterialCode = "";//替代品物料编号
                           var _SubstituteMaterialName = "";//替代品物料名称
                           var _SubstituteIndex = "";//替代次序
                           var _IsDisabled = "";//是否禁用
                           var _Id = "";//Id主键
                          #endregion
                          #region å–值
                           _SubstituteCode = row["替代编号"]?.ToString() ;
                           _MaterialCode = row["物料编号"]?.ToString() ;
                           _MaterialName = row["物料名称"]?.ToString() ;
                           _SubstituteMaterialCode = row["替代品物料编号"]?.ToString() ;
                           _SubstituteMaterialName = row["替代品物料名称"]?.ToString() ;
                           _SubstituteIndex = row["替代次序"]?.ToString() ;
                           _IsDisabled = row["是否禁用"]?.ToString() ;
                           _Id = row["Id主键"]?.ToString() ;
                          #endregion
                          #region éªŒè¯
                          if (string.IsNullOrEmpty(_SubstituteCode))
                          {
                            throw Oops.Oh($"第{index}行[替代编号]{_SubstituteCode}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_SubstituteCode))
                          {
                                addItem.SubstituteCode = (string)_SubstituteCode;
                           }
                          if (string.IsNullOrEmpty(_MaterialCode))
                          {
                            throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_MaterialCode))
                          {
                                addItem.MaterialCode = (string)_MaterialCode;
                           }
                          if (string.IsNullOrEmpty(_MaterialName))
                          {
                            throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_MaterialName))
                          {
                                addItem.MaterialName = (string)_MaterialName;
                           }
                          if (string.IsNullOrEmpty(_SubstituteMaterialCode))
                          {
                            throw Oops.Oh($"第{index}行[替代品物料编号]{_SubstituteMaterialCode}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_SubstituteMaterialCode))
                          {
                                addItem.SubstituteMaterialCode = (string)_SubstituteMaterialCode;
                           }
                          if (string.IsNullOrEmpty(_SubstituteMaterialName))
                          {
                            throw Oops.Oh($"第{index}行[替代品物料名称]{_SubstituteMaterialName}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_SubstituteMaterialName))
                          {
                                addItem.SubstituteMaterialName = (string)_SubstituteMaterialName;
                           }
                          if (string.IsNullOrEmpty(_SubstituteIndex))
                          {
                            throw Oops.Oh($"第{index}行[替代次序]{_SubstituteIndex}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_SubstituteIndex))
                          {
                              if (!int.TryParse(_SubstituteIndex, out int outSubstituteIndex)&&!string.IsNullOrEmpty(_SubstituteIndex))
                              {
                                 throw Oops.Oh($"第{index}行[替代次序]{_SubstituteIndex}值不正确!");
                              }
                              if (outSubstituteIndex <= 0&&!string.IsNullOrEmpty(_SubstituteIndex))
                              {
                                 throw Oops.Oh($"第{index}行[替代次序]{_SubstituteIndex}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.SubstituteIndex = outSubstituteIndex;
                              }
                          }
                          if (string.IsNullOrEmpty(_IsDisabled))
                          {
                            throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_IsDisabled))
                          {
                            if(!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否"))
                             {
                               throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!");
                             }
                             else
                             {
                               bool outIsDisabled = _IsDisabled.Equals("是") ? true : false;
                               addItem.IsDisabled = outIsDisabled;
                             }
                             }
                          if(!string.IsNullOrEmpty(_Id))
                          {
                              if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!");
                              }
                              if (outId <= 0&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Id = outId;
                              }
                          }
                          #endregion
                details.Add(addItem);
            }
              //验重
              await CheckExisitForImport(details);
            return details;
        }
        /// <summary>
        /// æ ¹æ®ç‰ˆæœ¬ä¸‹è½½æ›¿ä»£å“ç®¡ç†çš„Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("WmsSubstituteGood/downloadExcelTemplate")]
        public IActionResult DownloadExcelTemplate([FromQuery] string version)
        {
            string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsSubstituteGood{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx";
            var fileName = HttpUtility.UrlEncode($"导入模板(替代品管理).xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
        }
        #endregion
        #region ç§æœ‰æ–¹æ³•
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-数据库
        /// </summary>
        /// <param name="input"></param>
        /// <param name="isEdit"></param>
        /// <returns></returns>
        private async Task CheckExisit( WmsSubstituteGood input,bool isEdit=false)
        {
           bool isExist = false;
           if (!isEdit)//新增
           {
                   //数据是否存在重复
                   isExist = await _wmsSubstituteGoodRep.AnyAsync(u =>
                                   u.SubstituteCode.Equals(input.SubstituteCode)
                   ,false);
          }
           else//编辑
          {
                 //当前编辑数据以外是否存在重复
                  isExist = await _wmsSubstituteGoodRep.AnyAsync(u =>
                                    u.Id != input.Id
                                    &&u.SubstituteCode.Equals(input.SubstituteCode)
                    ,false);
               }
            if (isExist) throw Oops.Oh(ErrorCode.E0001);
       }
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-导入时验证
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        private async Task CheckExisitForImport(List<WmsSubstituteGood> inputs)
        {
            //根据联合主键验证表格中中是否已存在相同数据
                 if (inputs?.Count <= 0)
                 {
                     throw Oops.Oh($"导入数据不能为空");
                 }
                 //数据是否重复
                 var existExcelItem = inputs.GroupBy(g => new {
                                               g.SubstituteCode
                                               })
                                               .Where(g => g.Count() > 1)
                                               .Select(s => new {
                                               s.Key.SubstituteCode
                                               }).FirstOrDefault();
                 if (existExcelItem != null)
                 {
                   var wmsSubstituteGood = existExcelItem.Adapt<WmsSubstituteGood>();
                   var item= existExcelItem.Adapt<WmsSubstituteGood>();
                   throw Oops.Oh($"导入的表格中,替代编号[{item.SubstituteCode}]已存在");
                 }
    //根据联合主键验证数据库中是否已存在相同数据
                 var existDBItem = await _wmsSubstituteGoodRep.DetachedEntities.FirstOrDefaultAsync(w=>
                                                                         inputs.Select(s=>""
                                                                           +s.SubstituteCode
                                                                        )
                                                                        .Contains(""
                                                                         +w.SubstituteCode
                  ));
                  if (existDBItem != null)
                 {
                   var wmsSubstituteGood = existExcelItem.Adapt<WmsSubstituteGood>();
                   var item= existExcelItem.Adapt<WmsSubstituteGood>();
                   throw Oops.Oh($"系统中,替代编号[{item.SubstituteCode}]已存在");
                 }
        }
        #endregion
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Dto/WmsWarehouseInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,271 @@
using Admin.NET.Core;
using Admin.NET.Core.Service;
using System.ComponentModel.DataAnnotations;
namespace Admin.NET.Application
{
    /// <summary>
    /// ä»“库表查询参数
    /// </summary>
    public class WmsWarehouseSearch : PageInputBase
    {
        /// <summary>
        /// ä»“库编号
        /// </summary>
        public virtual string Code { get; set; }
        /// <summary>
        /// ä»“库名称
        /// </summary>
        public virtual string Name { get; set; }
        /// <summary>
        /// ä»“库地址
        /// </summary>
        public virtual string Address { get; set; }
        /// <summary>
        /// å·¥åŽ‚ç¼–å·
        /// </summary>
        public virtual string FactoryCode { get; set; }
        /// <summary>
        /// é•¿
        /// </summary>
        public virtual decimal? Length { get; set; }
        /// <summary>
        /// å®½
        /// </summary>
        public virtual decimal? Width { get; set; }
        /// <summary>
        /// é«˜
        /// </summary>
        public virtual decimal? Height { get; set; }
        /// <summary>
        /// åŸºæœ¬å•å…ƒ
        /// </summary>
        public virtual string BaseUnit { get; set; }
        /// <summary>
        /// å®šä½
        /// </summary>
        public virtual string Position { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public virtual bool? IsDisabled { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        public virtual string Remarks { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public virtual List<string> CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public virtual List<string> UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
        /// <summary>
    /// ä»“库表不分页查询参数
    /// </summary>
    public class WmsWarehouseSearchNonPage : PageInputNonPageBase
    {
        /// <summary>
        /// ä»“库编号
        /// </summary>
        public virtual string Code { get; set; }
        /// <summary>
        /// ä»“库名称
        /// </summary>
        public virtual string Name { get; set; }
        /// <summary>
        /// ä»“库地址
        /// </summary>
        public virtual string Address { get; set; }
        /// <summary>
        /// å·¥åŽ‚ç¼–å·
        /// </summary>
        public virtual string FactoryCode { get; set; }
        /// <summary>
        /// é•¿
        /// </summary>
        public virtual decimal? Length { get; set; }
        /// <summary>
        /// å®½
        /// </summary>
        public virtual decimal? Width { get; set; }
        /// <summary>
        /// é«˜
        /// </summary>
        public virtual decimal? Height { get; set; }
        /// <summary>
        /// åŸºæœ¬å•å…ƒ
        /// </summary>
        public virtual string BaseUnit { get; set; }
        /// <summary>
        /// å®šä½
        /// </summary>
        public virtual string Position { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public virtual bool? IsDisabled { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        public virtual string Remarks { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
         public virtual List<DateTimeOffset>? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public virtual string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public virtual string UpdatedUserName { get; set; }
    }
    /// <summary>
    /// ä»“库表输入参数
    /// </summary>
    public class WmsWarehouseInput
    {
        /// <summary>
        /// ä»“库编号
        /// </summary>
        [Required(ErrorMessage = "仓库编号不能为空")]
        public virtual string Code { get; set; }
        /// <summary>
        /// ä»“库名称
        /// </summary>
        [Required(ErrorMessage = "仓库名称不能为空")]
        public virtual string Name { get; set; }
        /// <summary>
        /// ä»“库地址
        /// </summary>
        public virtual string Address { get; set; }
        /// <summary>
        /// å·¥åŽ‚ç¼–å·
        /// </summary>
        public virtual string FactoryCode { get; set; }
        /// <summary>
        /// é•¿
        /// </summary>
        public virtual decimal? Length { get; set; }
        /// <summary>
        /// å®½
        /// </summary>
        public virtual decimal? Width { get; set; }
        /// <summary>
        /// é«˜
        /// </summary>
        public virtual decimal? Height { get; set; }
        /// <summary>
        /// åŸºæœ¬å•å…ƒ
        /// </summary>
        public virtual string BaseUnit { get; set; }
        /// <summary>
        /// å®šä½
        /// </summary>
        public virtual string Position { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        [Required(ErrorMessage = "是否禁用不能为空")]
        public virtual bool IsDisabled { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        public virtual string Remarks { get; set; }
    }
    /// <summary>
    /// ä»“库表新增参数
    /// </summary>
    public class AddWmsWarehouseInput : WmsWarehouseInput
    {
    }
    /// <summary>
    /// ä»“库表删除参数
    /// </summary>
    public class DeleteWmsWarehouseInput : BaseId
    {
    }
    /// <summary>
    /// ä»“库表更新参数
    /// </summary>
    public class UpdateWmsWarehouseInput : WmsWarehouseInput
    {
        /// <summary>
        /// Id主键
        /// </summary>
        [Required(ErrorMessage = "Id主键不能为空")]
        public long? Id { get; set; }
    }
    /// <summary>
    /// ä»“库表获取单个参数
    /// </summary>
    public class QueryeWmsWarehouseInput : BaseId
    {
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Dto/WmsWarehouseOutput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
using Admin.NET.Core.Util.LowCode.Dto;
using System;
namespace Admin.NET.Application
{
    /// <summary>
    /// ä»“库表输出参数
    /// </summary>
    public class WmsWarehouseOutput
    {
        /// <summary>
        /// ä»“库编号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// ä»“库名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// ä»“库地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// å·¥åŽ‚ç¼–å·
        /// </summary>
        public string FactoryCode { get; set; }
        /// <summary>
        /// é•¿
        /// </summary>
        public decimal? Length { get; set; }
        /// <summary>
        /// å®½
        /// </summary>
        public decimal? Width { get; set; }
        /// <summary>
        /// é«˜
        /// </summary>
        public decimal? Height { get; set; }
        /// <summary>
        /// åŸºæœ¬å•å…ƒ
        /// </summary>
        public string BaseUnit { get; set; }
        /// <summary>
        /// å®šä½
        /// </summary>
        public string Position { get; set; }
        /// <summary>
        /// æ˜¯å¦ç¦ç”¨
        /// </summary>
        public bool IsDisabled { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        public string Remarks { get; set; }
        /// <summary>
        /// Id主键
        /// </summary>
        public long? Id { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        public DateTimeOffset? CreatedTime { get; set; }
        /// <summary>
        /// æ›´æ–°æ—¶é—´
        /// </summary>
        public DateTimeOffset? UpdatedTime { get; set; }
        /// <summary>
        /// åˆ›å»ºè€…名称
        /// </summary>
        public string CreatedUserName { get; set; }
        /// <summary>
        /// ä¿®æ”¹è€…名称
        /// </summary>
        public string UpdatedUserName { get; set; }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/IWmsWarehouseService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using Admin.NET.Core;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Admin.NET.Application
{
    public interface IWmsWarehouseService
    {
        Task<WmsWarehouseOutput> Get([FromQuery] QueryeWmsWarehouseInput input);
        Task<List<WmsWarehouseOutput>> List([FromQuery] WmsWarehouseInput input);
        Task<PageResult<WmsWarehouseOutput>> Page([FromQuery] WmsWarehouseSearch input);
        Task<List<WmsWarehouseOutput>> ListNonPageAsync([FromQuery] WmsWarehouseSearchNonPage input);
        Task Add(AddWmsWarehouseInput input);
        Task Update(UpdateWmsWarehouseInput input);
        Task Delete(DeleteWmsWarehouseInput input);
        Task<int> ImportExcelAsync(IFormFile file);
        IActionResult DownloadExcelTemplate(string version);
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/Map/WmsWarehouseMapper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using Mapster;
using Admin.NET.Core;
namespace Admin.NET.Application
{
    public class WmsWarehouseMapper : IRegister
    {
        public void Register(TypeAdapterConfig config)
        {
            config.ForType<AddWmsWarehouseInput, WmsWarehouse>()
            ;
            config.ForType<UpdateWmsWarehouseInput, WmsWarehouse>()
            ;
            config.ForType<WmsWarehouse, WmsWarehouseOutput>()
            ;
        }
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsWarehouse/WmsWarehouseService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,517 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Admin.NET.Core;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Web;
using System.ComponentModel;
using System.Data;
namespace Admin.NET.Application
{
    /// <summary>
    /// ä»“库表服务
    /// </summary>
    [ApiDescriptionSettings("WmsBase", Name = "WmsWarehouse", Order = 100)]
    [Route("api")]
    public class WmsWarehouseService : IWmsWarehouseService, IDynamicApiController, ITransient
    {
        private readonly IRepository<WmsWarehouse,MasterDbContextLocator> _wmsWarehouseRep;
        private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
        private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
        private readonly ISysExcelTemplateService _sysExcelTemplateService;
        private readonly static object _lock = new();
        public WmsWarehouseService(
            IRepository<WmsWarehouse,MasterDbContextLocator> wmsWarehouseRep
            ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep
            ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep
            ,ISysExcelTemplateService sysExcelTemplateService
        )
        {
            _wmsWarehouseRep = wmsWarehouseRep;
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataRep = sysDictDataRep;
         _sysExcelTemplateService = sysExcelTemplateService;
        }
        /// <summary>
        /// åˆ†é¡µæŸ¥è¯¢ä»“库表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsWarehouse/page")]
        public async Task<PageResult<WmsWarehouseOutput>> Page([FromQuery] WmsWarehouseSearch input)
        {
            var wmsWarehouses = await _wmsWarehouseRep.DetachedEntities
                                     .Where(!string.IsNullOrEmpty(input.Code), u => u.Code == input.Code)
                                     .Where(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name)
                                     .Where(!string.IsNullOrEmpty(input.Address), u => u.Address == input.Address)
                                     .Where(!string.IsNullOrEmpty(input.FactoryCode), u => u.FactoryCode == input.FactoryCode)
                                     .Where(input.Length != null, u => u.Length == input.Length)
                                     .Where(input.Width != null, u => u.Width == input.Width)
                                     .Where(input.Height != null, u => u.Height == input.Height)
                                     .Where(!string.IsNullOrEmpty(input.BaseUnit), u => u.BaseUnit == input.BaseUnit)
                                     .Where(!string.IsNullOrEmpty(input.Position), u => u.Position == input.Position)
                                     .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled)
                                     .Where(!string.IsNullOrEmpty(input.Remarks), u => u.Remarks == input.Remarks)
                                     .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
                                     .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                                     .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName)
                                     .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName)
                                     .OrderBy(PageInputOrder.OrderBuilder<WmsWarehouseSearch>(input))
                                     .ProjectToType<WmsWarehouseOutput>()
                                     .ToADPagedListAsync(input.PageNo, input.PageSize);
            return wmsWarehouses;
        }
        /// <summary>
        /// ä¸åˆ†é¡µæŸ¥è¯¢ä»“库表列表
        /// </summary>
        /// <param name="input">仓库表查询参数</param>
        /// <returns>(仓库表)实例列表</returns>
        [HttpGet("WmsWarehouse/listNonPage")]
        public async Task<List<WmsWarehouseOutput>> ListNonPageAsync([FromQuery] WmsWarehouseSearchNonPage input)
        {
            var pCode = input.Code?.Trim() ?? "";
            var pName = input.Name?.Trim() ?? "";
            var pAddress = input.Address?.Trim() ?? "";
            var pFactoryCode = input.FactoryCode?.Trim() ?? "";
            var pLength = input.Length;
            var pWidth = input.Width;
            var pHeight = input.Height;
            var pBaseUnit = input.BaseUnit?.Trim() ?? "";
            var pPosition = input.Position?.Trim() ?? "";
            var pIsDisabled = input.IsDisabled;
            var pRemarks = input.Remarks?.Trim() ?? "";
            var pCreatedTime = input.CreatedTime;
            var pUpdatedTime = input.UpdatedTime;
            var pCreatedUserName = input.CreatedUserName?.Trim() ?? "";
            var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? "";
            var wmsWarehouses = await _wmsWarehouseRep.DetachedEntities
                .Where(!string.IsNullOrEmpty(pCode), u => u.Code == pCode)
                .Where(!string.IsNullOrEmpty(pName), u => u.Name == pName)
                .Where(!string.IsNullOrEmpty(pAddress), u => u.Address == pAddress)
                .Where(!string.IsNullOrEmpty(pFactoryCode), u => u.FactoryCode == pFactoryCode)
                .Where(pLength != null, u => u.Length == pLength)
                .Where(pWidth != null, u => u.Width == pWidth)
                .Where(pHeight != null, u => u.Height == pHeight)
                .Where(!string.IsNullOrEmpty(pBaseUnit), u => u.BaseUnit == pBaseUnit)
                .Where(!string.IsNullOrEmpty(pPosition), u => u.Position == pPosition)
                .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled)
                .Where(!string.IsNullOrEmpty(pRemarks), u => u.Remarks == pRemarks)
           .Where(input.CreatedTime!=null, u => u.CreatedTime>=  Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
           .Where(input.UpdatedTime!=null, u => u.UpdatedTime>=  Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
                .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName)
                .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName)
            .OrderBy(PageInputOrder.OrderNonPageBuilder(input))
            .ProjectToType<WmsWarehouseOutput>()
            .ToListAsync();
            return wmsWarehouses;
        }
         /// <summary>
        /// èŽ·å–ä»“åº“è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsWarehouse/detail")]
        public async Task<WmsWarehouseOutput> Get([FromQuery] QueryeWmsWarehouseInput input)
        {
            return (await _wmsWarehouseRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsWarehouseOutput>();
        }
        /// <summary>
        /// èŽ·å–ä»“åº“è¡¨åˆ—è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("WmsWarehouse/list")]
        public async Task<List<WmsWarehouseOutput>> List([FromQuery] WmsWarehouseInput input)
        {
            return await _wmsWarehouseRep.DetachedEntities.ProjectToType<WmsWarehouseOutput>().ToListAsync();
        }
        #region å¢žã€åˆ ã€æ”¹
        /// <summary>
        /// å¢žåŠ ä»“åº“è¡¨
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsWarehouse/add")]
        public async Task Add(AddWmsWarehouseInput input)
        {
            var wmsWarehouse = input.Adapt<WmsWarehouse>();
                        //验证
            await CheckExisit(wmsWarehouse);
            wmsWarehouse.CreatedUserId = wmsWarehouse.UpdatedUserId = SysHelper.GetUserId();
            wmsWarehouse.CreatedUserName = wmsWarehouse.UpdatedUserName = SysHelper.GetUserName();
            wmsWarehouse.CreatedTime = wmsWarehouse.UpdatedTime = SysHelper.GetNowTime();
            await _wmsWarehouseRep.InsertAsync(wmsWarehouse);
        }
        /// <summary>
        /// åˆ é™¤ä»“库表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsWarehouse/delete")]
        public async Task Delete(DeleteWmsWarehouseInput input)
        {
            var wmsWarehouse = await _wmsWarehouseRep.FirstOrDefaultAsync(u => u.Id == input.Id);
            await _wmsWarehouseRep.DeleteAsync(wmsWarehouse);
        }
        /// <summary>
        /// æ›´æ–°ä»“库表
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("WmsWarehouse/edit")]
        public async Task Update(UpdateWmsWarehouseInput input)
        {
            var isExist = await _wmsWarehouseRep.AnyAsync(u => u.Id == input.Id, false);
            if (!isExist) throw Oops.Oh(ErrorCode.D1002);
            var wmsWarehouse = input.Adapt<WmsWarehouse>();
            //验证
            await CheckExisit(wmsWarehouse,true);
            wmsWarehouse.UpdatedUserId = SysHelper.GetUserId();
            wmsWarehouse.UpdatedUserName = SysHelper.GetUserName();
            wmsWarehouse.UpdatedTime = SysHelper.GetNowTime();
            await _wmsWarehouseRep.UpdateAsync(wmsWarehouse,ignoreNullValues:true);
        }
        #endregion
        #region å¯¼å…¥
        /// <summary>
        /// Excel模板导入仓库表功能
        /// </summary>
        /// <param name="file">Excel模板文件</param>
        /// <returns>导入的记录数</returns>
        [HttpPost("WmsWarehouse/importExcel")]
        public async Task<int> ImportExcelAsync(IFormFile file)
        {
            int _HeadStartLine = 2;//第1行是说明,第2行是列名
            int _DataStartLine = 3;//第3行开始是数据
            DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine);
            var addList =await CommonImport(importDataTable, _DataStartLine);
            lock (_lock)
            {
                _wmsWarehouseRep.InsertAsync(addList);
            }
            await Task.CompletedTask;
            return addList.Count;
        }
        /// <summary>
        ///  DataTable转换实体对象列表
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="dataStartLine">模版列名开始行</param>
        /// <returns></returns>
        private async Task<List<WmsWarehouse>> CommonImport(DataTable dataTable, int dataStartLine)
        {
            var details = new List<WmsWarehouse>();
            int index = dataStartLine;//模版列名开始行
            foreach (System.Data.DataRow row in dataTable.Rows)
            {
                index++;
               //导入模版定制化代码(替换模版使用)
                           var addItem = new WmsWarehouse()
                            {
                               CreatedTime = SysHelper.GetNowTime(),
                               CreatedUserId = SysHelper.GetUserId(),
                               CreatedUserName = SysHelper.GetUserName(),
                               UpdatedTime = SysHelper.GetNowTime(),
                               UpdatedUserId = SysHelper.GetUserId(),
                               UpdatedUserName = SysHelper.GetUserName()
                             };
                          #region å®šä¹‰å˜é‡
                           var _Code = "";//仓库编号
                           var _Name = "";//仓库名称
                           var _Address = "";//仓库地址
                           var _FactoryCode = "";//工厂编号
                           var _Length = "";//长
                           var _Width = "";//宽
                           var _Height = "";//高
                           var _BaseUnit = "";//基本单元
                           var _Position = "";//定位
                           var _IsDisabled = "";//是否禁用
                           var _Remarks = "";//备注
                           var _Id = "";//Id主键
                          #endregion
                          #region å–值
                           _Code = row["仓库编号"]?.ToString() ;
                           _Name = row["仓库名称"]?.ToString() ;
                           _Address = row["仓库地址"]?.ToString() ;
                           _FactoryCode = row["工厂编号"]?.ToString() ;
                           _Length = row["长"]?.ToString() ;
                           _Width = row["宽"]?.ToString() ;
                           _Height = row["高"]?.ToString() ;
                           _BaseUnit = row["基本单元"]?.ToString() ;
                           _Position = row["定位"]?.ToString() ;
                           _IsDisabled = row["是否禁用"]?.ToString() ;
                           _Remarks = row["备注"]?.ToString() ;
                           _Id = row["Id主键"]?.ToString() ;
                          #endregion
                          #region éªŒè¯
                          if (string.IsNullOrEmpty(_Code))
                          {
                            throw Oops.Oh($"第{index}行[仓库编号]{_Code}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_Code))
                          {
                                addItem.Code = (string)_Code;
                           }
                          if (string.IsNullOrEmpty(_Name))
                          {
                            throw Oops.Oh($"第{index}行[仓库名称]{_Name}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_Name))
                          {
                                addItem.Name = (string)_Name;
                           }
                          if(!string.IsNullOrEmpty(_Address))
                          {
                                addItem.Address = (string)_Address;
                           }
                          if(!string.IsNullOrEmpty(_FactoryCode))
                          {
                                addItem.FactoryCode = (string)_FactoryCode;
                           }
                          if(!string.IsNullOrEmpty(_Length))
                          {
                              if (!decimal.TryParse(_Length, out decimal outLength)&&!string.IsNullOrEmpty(_Length))
                              {
                                 throw Oops.Oh($"第{index}行[长]{_Length}值不正确!");
                              }
                              if (outLength <= 0&&!string.IsNullOrEmpty(_Length))
                              {
                                 throw Oops.Oh($"第{index}行[长]{_Length}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Length = outLength;
                              }
                          }
                          if(!string.IsNullOrEmpty(_Width))
                          {
                              if (!decimal.TryParse(_Width, out decimal outWidth)&&!string.IsNullOrEmpty(_Width))
                              {
                                 throw Oops.Oh($"第{index}行[宽]{_Width}值不正确!");
                              }
                              if (outWidth <= 0&&!string.IsNullOrEmpty(_Width))
                              {
                                 throw Oops.Oh($"第{index}行[宽]{_Width}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Width = outWidth;
                              }
                          }
                          if(!string.IsNullOrEmpty(_Height))
                          {
                              if (!decimal.TryParse(_Height, out decimal outHeight)&&!string.IsNullOrEmpty(_Height))
                              {
                                 throw Oops.Oh($"第{index}行[高]{_Height}值不正确!");
                              }
                              if (outHeight <= 0&&!string.IsNullOrEmpty(_Height))
                              {
                                 throw Oops.Oh($"第{index}行[高]{_Height}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Height = outHeight;
                              }
                          }
                          if(!string.IsNullOrEmpty(_BaseUnit))
                          {
                                addItem.BaseUnit = (string)_BaseUnit;
                           }
                          if(!string.IsNullOrEmpty(_Position))
                          {
                                addItem.Position = (string)_Position;
                           }
                          if (string.IsNullOrEmpty(_IsDisabled))
                          {
                            throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}不能为空!");
                          }
                          if(!string.IsNullOrEmpty(_IsDisabled))
                          {
                            if(!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否"))
                             {
                               throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!");
                             }
                             else
                             {
                               bool outIsDisabled = _IsDisabled.Equals("是") ? true : false;
                               addItem.IsDisabled = outIsDisabled;
                             }
                             }
                          if(!string.IsNullOrEmpty(_Remarks))
                          {
                                addItem.Remarks = (string)_Remarks;
                           }
                          if(!string.IsNullOrEmpty(_Id))
                          {
                              if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!");
                              }
                              if (outId <= 0&&!string.IsNullOrEmpty(_Id))
                              {
                                 throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!");
                              }
                              else
                              {
                                 addItem.Id = outId;
                              }
                          }
                          #endregion
                details.Add(addItem);
            }
              //验重
              await CheckExisitForImport(details);
            return details;
        }
        /// <summary>
        /// æ ¹æ®ç‰ˆæœ¬ä¸‹è½½ä»“库表的Excel导入模板
        /// </summary>
        /// <param name="version">模板版本</param>
        /// <returns>下载的模板文件</returns>
        [HttpGet("WmsWarehouse/downloadExcelTemplate")]
        public IActionResult DownloadExcelTemplate([FromQuery] string version)
        {
            string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsWarehouse{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx";
            var fileName = HttpUtility.UrlEncode($"导入模板(仓库表).xlsx", Encoding.GetEncoding("UTF-8"));
            return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
        }
        #endregion
        #region ç§æœ‰æ–¹æ³•
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-数据库
        /// </summary>
        /// <param name="input"></param>
        /// <param name="isEdit"></param>
        /// <returns></returns>
        private async Task CheckExisit( WmsWarehouse input,bool isEdit=false)
        {
           bool isExist = false;
           if (!isEdit)//新增
           {
                   //数据是否存在重复
                   isExist = await _wmsWarehouseRep.AnyAsync(u =>
                                   u.Code.Equals(input.Code)
                   ,false);
          }
           else//编辑
          {
                 //当前编辑数据以外是否存在重复
                  isExist = await _wmsWarehouseRep.AnyAsync(u =>
                                    u.Id != input.Id
                                    &&u.Code.Equals(input.Code)
                    ,false);
               }
            if (isExist) throw Oops.Oh(ErrorCode.E0001);
       }
        /// <summary>
        /// æ ¹æ®è”合主键验证数据是否已存在-导入时验证
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        private async Task CheckExisitForImport(List<WmsWarehouse> inputs)
        {
            //根据联合主键验证表格中中是否已存在相同数据
                 if (inputs?.Count <= 0)
                 {
                     throw Oops.Oh($"导入数据不能为空");
                 }
                 //数据是否重复
                 var existExcelItem = inputs.GroupBy(g => new {
                                               g.Code
                                               })
                                               .Where(g => g.Count() > 1)
                                               .Select(s => new {
                                               s.Key.Code
                                               }).FirstOrDefault();
                 if (existExcelItem != null)
                 {
                   var wmsWarehouse = existExcelItem.Adapt<WmsWarehouse>();
                   var item= existExcelItem.Adapt<WmsWarehouse>();
                   throw Oops.Oh($"导入的表格中,仓库编号[{item.Code}]已存在");
                 }
    //根据联合主键验证数据库中是否已存在相同数据
                 var existDBItem = await _wmsWarehouseRep.DetachedEntities.FirstOrDefaultAsync(w=>
                                                                         inputs.Select(s=>""
                                                                           +s.Code
                                                                        )
                                                                        .Contains(""
                                                                         +w.Code
                  ));
                  if (existDBItem != null)
                 {
                   var wmsWarehouse = existExcelItem.Adapt<WmsWarehouse>();
                   var item= existExcelItem.Adapt<WmsWarehouse>();
                   throw Oops.Oh($"系统中,仓库编号[{item.Code}]已存在");
                 }
        }
        #endregion
    }
}
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsContainerPackagingImport.xlsx
Binary files differ
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsSubstituteGoodImport.xlsx
Binary files differ
iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsWarehouseImport.xlsx
Binary files differ