zs
2025-05-08 5ae700afd7763cc2338564753ce22a964f4b6439
页面修改
已修改9个文件
1561 ■■■■ 文件已修改
HIAWms/hiawms_web/src/widgets/WmsInOutStockOrder/Controllers/WmsInOutStockOrderDrawer.tsx 222 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsInOutStockRecord/Controllers/WmsInOutStockRecord.ts 557 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialContainer/Views/Pages/WmsMaterialContainer/WmsMaterialContainer.tsx 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Controllers/WmsMaterialStockDrawer.tsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/WmsTaskQueryDrawer.tsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsInOutStockOrderAppService.cs 657 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsInOutStockOrder/IWmsInOutStockOrderRepository.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsInOutStockOrderRepository.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsInOutStockOrder/Controllers/WmsInOutStockOrderDrawer.tsx
@@ -77,21 +77,52 @@
   * 添加的form字段
   */
  const formItems = reactive([
    // {
    //   label: '单据编号',
    //   prop: 'orderNo',
    //   el: 'input',
    //   disabled: disabled,
    //   placeholder: '请输入单据编号',
    //   rules: [{ required: true, message: '单据编号不能为空', trigger: 'blur' }],
    // },
    // {
    //   label: '单据状态',
    //   prop: 'orderStatus',
    //   el: 'select',
    //   disabled: disabled,
    //   placeholder: '请输入单据状态',
    //   rules: [{ required: true, message: '单据状态不能为空', trigger: 'blur' }],
    // },
    {
      label: '单据编号',
      prop: 'orderNo',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入单据编号',
      rules: [{ required: true, message: '单据编号不能为空', trigger: 'blur' }],
    },
    {
      label: '单据状态',
      prop: 'orderStatus',
      label: '单据类型',
      prop: 'orderType',
      el: 'select',
      disabled: disabled,
      placeholder: '请输入单据状态',
      rules: [{ required: true, message: '单据状态不能为空', trigger: 'blur' }],
      placeholder: '请输入单据类型',
      rules: [{ required: true, message: '单据类型不能为空', trigger: 'blur' }],
    },
    // {
    //   label: '操作类型',
    //   prop: 'stockType',
    //   el: 'select',
    //   disabled: disabled,
    //   placeholder: '请输入操作类型',
    //   rules: [
    //     {
    //       required: true,
    //       message: '操作类型不能为空',
    //       trigger: 'blur',
    //     },
    //   ],
    // },
    {
      label: '物料编号',
      prop: 'materialNo',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入物料编号',
      rules: [{ required: true, message: '物料编号不能为空', trigger: 'blur' }],
    },
    {
      label: '物料名称',
@@ -101,49 +132,12 @@
      placeholder: '请输入物料名称',
    },
    {
      label: '物料件号',
      prop: 'materialNo',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入物料件号',
      rules: [{ required: true, message: '物料件号不能为空', trigger: 'blur' }],
    },
    {
      label: '型号',
      prop: 'materialModel',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入型号',
    },
    {
      label: '批次号',
      prop: 'materialBatch',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入批次号',
      rules: [{ required: true, message: '批次号不能为空', trigger: 'blur' }],
    },
    {
      label: '单据类型',
      prop: 'orderType',
      el: 'select',
      disabled: disabled,
      placeholder: '请输入单据类型',
      rules: [{ required: true, message: '单据类型不能为空', trigger: 'blur' }],
    },
    {
      label: '操作类型',
      prop: 'stockType',
      el: 'select',
      disabled: disabled,
      placeholder: '请输入操作类型',
      rules: [
        {
          required: true,
          message: '操作类型不能为空',
          trigger: 'blur',
        },
      ],
    },
    {
      label: '单据数量',
@@ -162,57 +156,57 @@
      placeholder: '请输入单据数量',
      rules: [{ required: true, message: '单据数量不能为空', trigger: 'blur' }],
    },
    {
      label: '下发数量',
      prop: 'distributeNumber',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      disabled: disabled,
      placeholder: '请输入下发数量',
      rules: [{ required: true, message: '下发数量不能为空', trigger: 'blur' }],
    },
    {
      label: '完成数量',
      prop: 'completeNumber',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      disabled: disabled,
      placeholder: '请输入完成数量',
      rules: [{ required: true, message: '完成数量不能为空', trigger: 'blur' }],
    },
    {
      label: '优先级',
      prop: 'priority',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      //disabled: disabled,
      placeholder: '请输入优先级',
      rules: [{ required: true, message: '优先级不能为空', trigger: 'blur' }],
    },
    // {
    //   label: '下发数量',
    //   prop: 'distributeNumber',
    //   el: (props: any, { attrs }: SetupContext) => {
    //     return h(inputNumber, {
    //       ...props,
    //       clearable: true,
    //       ...attrs,
    //     })
    //   },
    //   width: '100%',
    //   step: 1,
    //   precision: 0,
    //   disabled: disabled,
    //   placeholder: '请输入下发数量',
    //   rules: [{ required: true, message: '下发数量不能为空', trigger: 'blur' }],
    // },
    // {
    //   label: '完成数量',
    //   prop: 'completeNumber',
    //   el: (props: any, { attrs }: SetupContext) => {
    //     return h(inputNumber, {
    //       ...props,
    //       clearable: true,
    //       ...attrs,
    //     })
    //   },
    //   width: '100%',
    //   step: 1,
    //   precision: 0,
    //   disabled: disabled,
    //   placeholder: '请输入完成数量',
    //   rules: [{ required: true, message: '完成数量不能为空', trigger: 'blur' }],
    // },
    // {
    //   label: '优先级',
    //   prop: 'priority',
    //   el: (props: any, { attrs }: SetupContext) => {
    //     return h(inputNumber, {
    //       ...props,
    //       clearable: true,
    //       ...attrs,
    //     })
    //   },
    //   width: '100%',
    //   step: 1,
    //   precision: 0,
    //   //disabled: disabled,
    //   placeholder: '请输入优先级',
    //   rules: [{ required: true, message: '优先级不能为空', trigger: 'blur' }],
    // },
    {
      label: '关联计划编号',
      prop: 'planNo',
@@ -220,20 +214,20 @@
      disabled: disabled,
      placeholder: '请输入关联计划编号',
    },
    {
      label: '操作时间',
      prop: 'operateTime',
      el: (props: any, { attrs }: SetupContext) => {
        return h(dateTimePicker, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      //disabled: disabled,
      placeholder: '请输入操作时间',
    },
    // {
    //   label: '操作时间',
    //   prop: 'operateTime',
    //   el: (props: any, { attrs }: SetupContext) => {
    //     return h(dateTimePicker, {
    //       ...props,
    //       clearable: true,
    //       ...attrs,
    //     })
    //   },
    //   width: '100%',
    //   //disabled: disabled,
    //   placeholder: '请输入操作时间',
    // },
    {
      label: '备注',
      prop: 'remark',
HIAWms/hiawms_web/src/widgets/WmsInOutStockRecord/Controllers/WmsInOutStockRecord.ts
@@ -1,275 +1,282 @@
import { ref, onMounted, reactive, Ref, nextTick, computed } from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsInOutStockRecord } from '../Models/WmsInOutStockRecord'
import { ElMessage } from 'element-plus'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { useFile } from './File'
interface CurrentType {
  row: any
  index: number
}
export const useWmsInOutStockRecord = (props: any, ctx?: any) => {
  const wmsInOutStockRecord = injectModel<WmsInOutStockRecord>('wmsInOutStockRecord')
  const { exportFile } = useFile()
  /**
   * 头部配置
   */
  const headers = ref({})
  /**
   * 动态列配置
   */
  const wmsInOutStockRecordColumns = ref<Record<string, any>>([])
  /**
   * 搜索值
   */
  const search = ref('')
  /**
   * 排序
   */
  const sort = ref(0)
  /**
   * 选择项
   */
  const selection = ref([])
  /**
   * 当前选中的行
   */
  const current = ref<any>(null)
  /**
   * 数据源
   */
  const dataSource: Ref<any[]> = ref([])
  /**
   * 表格
   */
  const tableRef = ref()
  const dialogConfig = reactive({
    visible: false,
    title: '',
    isAdd: false,
  })
  const dialogConfigForQuery = reactive({
    visible: false,
    title: '',
    isAdd: false,
  })
  const dialogSettingConfig = reactive({
    visible: false,
    title: '',
  })
  /**
   * 分页数据
   */
  const paginationParams = ref({})
  /**
   * 打开详情
   * @param row
   */
  const openDetail = (row: any) => {
    current.value = row
    dialogConfig.visible = true
    dialogConfig.title = row.name
    dialogConfig.isAdd = false
    sort.value = row.sort
  }
  const contextMenu = [
    {
      label: '展开详情',
      fn: (c: CurrentType) => {
        current.value = null
        sort.value = c.row.sort
        nextTick(() => openDetail(c.row))
      },
      divided: true,
      icon: 'o',
    },
    // {
    //   label: '向上添加',
    //   fn: (c: CurrentType, pageNum: number) => {
    //     current.value = null
    //     sort.value = c.index + 1 + (pageNum - 1) * 50
    //     dialogConfig.visible = true
    //     dialogConfig.title = '添加'
    //     dialogConfig.isAdd = false
    //   },
    //   divided: true,
    //   icon: 'up',
    // },
    // {
    //   label: '向下添加',
    //   fn: (c: CurrentType, pageNum: number) => {
    //     current.value = null
    //     sort.value = c.index + 2 + (pageNum - 1) * 50
    //     dialogConfig.visible = true
    //     dialogConfig.title = '添加'
    //     dialogConfig.isAdd = false
    //   },
    //   divided: true,
    //   icon: 'down',
    // },
    // {
    //   label: '创建副本',
    //   fn: async ({ row }: CurrentType) => {
    //     await wmsInOutStockRecord.cloneData([row.id])
    //     ElMessage.success('创建副本成功')
    //     tableRef.value?.getList()
    //   },
    //   divided: true,
    //   icon: 'copy',
    // },
    {
      label: '删除',
      fn: async (c: CurrentType) => {
        const names = selection.value.map((item: { id: string }) => item.id)
        ConfirmBox(
          `是否删除${names.length ? names.join(',') : c.row.id}`
        ).then(async () => {
          const ids = selection.value.map((item: { id: string }) => item.id)
          await wmsInOutStockRecord.deleteWmsInOutStockRecords(ids.length ? ids : [c.row.id])
          ElMessage.success('删除成功')
          tableRef.value.getList()
        })
      },
      icon: 'close',
    },
  ]
  const onCheck = (records: any) => {
    selection.value = records
  }
  const onAddWmsInOutStockRecord = () => {
    const params = tableRef.value?.getPaginationParams()
    current.value = null
    dialogConfig.visible = true
    dialogConfig.isAdd = true
    dialogConfig.title = '添加'
    sort.value = params.totalCount + 1
  }
  //点击按钮【高级查询】
  const onAdvancedQuery = () => {
    const params = tableRef.value?.getPaginationParams()
    current.value = null
    dialogConfigForQuery.visible = true
    dialogConfigForQuery.isAdd = true
    dialogConfigForQuery.title = '高级查询'
  }
  const onConfirmWmsInOutStockRecord = async () => {
    dialogConfig.visible = false
    if (dialogConfig.isAdd) {
      tableRef.value?.scrollToRow({
        skip: true,
      })
    } else {
      await tableRef.value?.getList()
    }
  }
  /**
   * 行点击时更新current
   */
  const onRowClick = ({ row }: any) => {
    if (dialogConfig.visible && current.value) {
      current.value = row
    }
  }
  /**
   * 导出
   */
  const onExport = (data={}) => {
    //const params = tableRef.value?.getParams()
    exportFile('/api/v1/HIAWms/wmsInOutStockRecord/export', data, 'wmsInOutStockRecord')
  }
  /**
   * 关键字搜索
   */
  const onSearch = () => {
    tableRef.value?.getList({
      Filter: search.value,
    })
  }
  /**
   * 重置表格数据
   */
  const reloadList = () => {
    tableRef.value?.getList()
  }
  /**
   * 上传成功
   */
  const onSuccess = () => {
    tableRef.value?.getList()
    ElMessage.success('导入成功')
  }
  /**
   * 失败
   * @param err
   */
  const onError = (err: any) => {
    try {
      const message = JSON.parse(err.message)
      ElMessage.error(message.msg)
    } catch (error) {
      ElMessage.error('导入失败')
    }
  }
  /**
   * 上传钩子
   */
  const onBeforeUpload = (file: File) => {
    const format = ['xlsx', 'xls', 'csv']
    if (!format.includes(file.name.split('.')[1])) {
      ElMessage.error('导入文件格式不正确,请导入.xlsx/.xls与.csv格式的文件')
      return false
    }
    return true
  }
  onMounted(() => {
    headers.value = {
      Authorization: `Bearer ${sessionStorage.getItem('Token')}`,
      'X-Project': sessionStorage.getItem('X-Project'),
    }
  })
  ctx.expose({
    reloadList,
  })
  return {
    dataSource,
    contextMenu,
    dialogConfig,
    dialogConfigForQuery,
    dialogSettingConfig,
    tableRef,
    current,
    search,
    sort,
    wmsInOutStockRecordColumns,
    paginationParams,
    headers,
    onBeforeUpload,
    onError,
    onSuccess,
    openDetail,
    onSearch,
    onExport,
    onRowClick,
    onConfirmWmsInOutStockRecord,
    onCheck,
    onAddWmsInOutStockRecord,
    onAdvancedQuery
  }
}
import { ref, onMounted, reactive, Ref, nextTick, computed } from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsInOutStockRecord } from '../Models/WmsInOutStockRecord'
import { ElMessage } from 'element-plus'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { useFile } from './File'
interface CurrentType {
  row: any
  index: number
}
export const useWmsInOutStockRecord = (props: any, ctx?: any) => {
  const wmsInOutStockRecord = injectModel<WmsInOutStockRecord>(
    'wmsInOutStockRecord'
  )
  const { exportFile } = useFile()
  /**
   * 头部配置
   */
  const headers = ref({})
  /**
   * 动态列配置
   */
  const wmsInOutStockRecordColumns = ref<Record<string, any>>([])
  /**
   * 搜索值
   */
  const search = ref('')
  /**
   * 排序
   */
  const sort = ref(0)
  /**
   * 选择项
   */
  const selection = ref([])
  /**
   * 当前选中的行
   */
  const current = ref<any>(null)
  /**
   * 数据源
   */
  const dataSource: Ref<any[]> = ref([])
  /**
   * 表格
   */
  const tableRef = ref()
  const dialogConfig = reactive({
    visible: false,
    title: '',
    isAdd: false,
  })
  const dialogConfigForQuery = reactive({
    visible: false,
    title: '',
    isAdd: false,
  })
  const dialogSettingConfig = reactive({
    visible: false,
    title: '',
  })
  /**
   * 分页数据
   */
  const paginationParams = ref({})
  /**
   * 打开详情
   * @param row
   */
  const openDetail = (row: any) => {
    current.value = row
    dialogConfig.visible = true
    dialogConfig.title = row.name
    dialogConfig.isAdd = false
    sort.value = row.sort
  }
  const contextMenu = [
    // {
    //   label: '展开详情',
    //   fn: (c: CurrentType) => {
    //     current.value = null
    //     sort.value = c.row.sort
    //     nextTick(() => openDetail(c.row))
    //   },
    //   divided: true,
    //   icon: 'o',
    // },
    // {
    //   label: '向上添加',
    //   fn: (c: CurrentType, pageNum: number) => {
    //     current.value = null
    //     sort.value = c.index + 1 + (pageNum - 1) * 50
    //     dialogConfig.visible = true
    //     dialogConfig.title = '添加'
    //     dialogConfig.isAdd = false
    //   },
    //   divided: true,
    //   icon: 'up',
    // },
    // {
    //   label: '向下添加',
    //   fn: (c: CurrentType, pageNum: number) => {
    //     current.value = null
    //     sort.value = c.index + 2 + (pageNum - 1) * 50
    //     dialogConfig.visible = true
    //     dialogConfig.title = '添加'
    //     dialogConfig.isAdd = false
    //   },
    //   divided: true,
    //   icon: 'down',
    // },
    // {
    //   label: '创建副本',
    //   fn: async ({ row }: CurrentType) => {
    //     await wmsInOutStockRecord.cloneData([row.id])
    //     ElMessage.success('创建副本成功')
    //     tableRef.value?.getList()
    //   },
    //   divided: true,
    //   icon: 'copy',
    // },
    {
      label: '删除',
      fn: async (c: CurrentType) => {
        const names = selection.value.map((item: { id: string }) => item.id)
        ConfirmBox(`是否删除${names.length ? names.join(',') : c.row.id}`).then(
          async () => {
            const ids = selection.value.map((item: { id: string }) => item.id)
            await wmsInOutStockRecord.deleteWmsInOutStockRecords(
              ids.length ? ids : [c.row.id]
            )
            ElMessage.success('删除成功')
            tableRef.value.getList()
          }
        )
      },
      icon: 'close',
    },
  ]
  const onCheck = (records: any) => {
    selection.value = records
  }
  const onAddWmsInOutStockRecord = () => {
    const params = tableRef.value?.getPaginationParams()
    current.value = null
    dialogConfig.visible = true
    dialogConfig.isAdd = true
    dialogConfig.title = '添加'
    sort.value = params.totalCount + 1
  }
  //点击按钮【高级查询】
  const onAdvancedQuery = () => {
    const params = tableRef.value?.getPaginationParams()
    current.value = null
    dialogConfigForQuery.visible = true
    dialogConfigForQuery.isAdd = true
    dialogConfigForQuery.title = '高级查询'
  }
  const onConfirmWmsInOutStockRecord = async () => {
    dialogConfig.visible = false
    if (dialogConfig.isAdd) {
      tableRef.value?.scrollToRow({
        skip: true,
      })
    } else {
      await tableRef.value?.getList()
    }
  }
  /**
   * 行点击时更新current
   */
  const onRowClick = ({ row }: any) => {
    if (dialogConfig.visible && current.value) {
      current.value = row
    }
  }
  /**
   * 导出
   */
  const onExport = (data = {}) => {
    //const params = tableRef.value?.getParams()
    exportFile(
      '/api/v1/HIAWms/wmsInOutStockRecord/export',
      data,
      'wmsInOutStockRecord'
    )
  }
  /**
   * 关键字搜索
   */
  const onSearch = () => {
    tableRef.value?.getList({
      Filter: search.value,
    })
  }
  /**
   * 重置表格数据
   */
  const reloadList = () => {
    tableRef.value?.getList()
  }
  /**
   * 上传成功
   */
  const onSuccess = () => {
    tableRef.value?.getList()
    ElMessage.success('导入成功')
  }
  /**
   * 失败
   * @param err
   */
  const onError = (err: any) => {
    try {
      const message = JSON.parse(err.message)
      ElMessage.error(message.msg)
    } catch (error) {
      ElMessage.error('导入失败')
    }
  }
  /**
   * 上传钩子
   */
  const onBeforeUpload = (file: File) => {
    const format = ['xlsx', 'xls', 'csv']
    if (!format.includes(file.name.split('.')[1])) {
      ElMessage.error('导入文件格式不正确,请导入.xlsx/.xls与.csv格式的文件')
      return false
    }
    return true
  }
  onMounted(() => {
    headers.value = {
      Authorization: `Bearer ${sessionStorage.getItem('Token')}`,
      'X-Project': sessionStorage.getItem('X-Project'),
    }
  })
  ctx.expose({
    reloadList,
  })
  return {
    dataSource,
    contextMenu,
    dialogConfig,
    dialogConfigForQuery,
    dialogSettingConfig,
    tableRef,
    current,
    search,
    sort,
    wmsInOutStockRecordColumns,
    paginationParams,
    headers,
    onBeforeUpload,
    onError,
    onSuccess,
    openDetail,
    onSearch,
    onExport,
    onRowClick,
    onConfirmWmsInOutStockRecord,
    onCheck,
    onAddWmsInOutStockRecord,
    onAdvancedQuery,
  }
}
HIAWms/hiawms_web/src/widgets/WmsMaterialContainer/Views/Pages/WmsMaterialContainer/WmsMaterialContainer.tsx
@@ -163,7 +163,7 @@
            [styles.wmsMaterialContainerList]: true,
          }}
        >
          <BaseTable
          {/* <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsMaterialContainer/{id}/adjustsort/{sort}"
@@ -195,7 +195,33 @@
                )
              },
            }}
          ></BaseTable>
          ></BaseTable> */}
          <ElForm>
            <ElFormItem label="物料码">
              <ElInput
                v-model={queryForm.value.searchVal}
                placeholder="请输入"
                clearable
                class={styles.formItem}
              />
            </ElFormItem>
            <ElFormItem label="库位号">
              <ElInput
                v-model={queryForm.value.searchVal}
                placeholder="请输入"
                clearable
                class={styles.formItem}
              />
            </ElFormItem>
            <ElFormItem label="数量">
              <ElInput
                v-model={queryForm.value.searchVal}
                placeholder="请输入"
                clearable
                class={styles.formItem}
              />
            </ElFormItem>
          </ElForm>
        </div>
      )
    }
@@ -203,16 +229,26 @@
    return () => {
      return (
        <div class={styles.wmsMaterialContainerContent}>
          <ElForm>
            <ElFormItem label="关键字">
              <ElInput
                v-model={queryForm.value.searchVal}
                placeholder="请输入"
                clearable
                class={styles.formItem}
              />
            </ElFormItem>
          </ElForm>
          {/* 添加/编辑 */}
          <WmsMaterialContainerDrawer
          {/* <WmsMaterialContainerDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsMaterialContainer}
          />
          /> */}
          {/* 高级查询 */}
          <WmsMaterialContainerQueryDrawer
          {/* <WmsMaterialContainerQueryDrawer
            ref="wmsMaterialContainerQueryDrawerRef"
            v-model={dialogConfigForQuery.visible}
            title={dialogConfigForQuery.title}
@@ -221,9 +257,9 @@
            onConfirmQuery={handleQuery}
            onRestQuery={resetQuery}
            onClose={closeQuery}
          />
          /> */}
          <div class={styles.headerContent}>
          {/* <div class={styles.headerContent}>
            <div class={styles.header}>
              <IconButton
                v-permission="wmsMaterialContainer-add"
@@ -236,7 +272,7 @@
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              {/* <el-upload
              <el-upload
                v-permission="wmsMaterialContainer-import"
                name="file"
                accept=".xlsx,.xls,.csv"
@@ -256,7 +292,7 @@
                onClick={handleExport}
              >
                导出
              </IconButton> */}
              </IconButton>
            </div>
            <ElFormItem style={{ marginTop: '15px' }}>
              <ElFormItem label="关键字">
@@ -274,9 +310,7 @@
              >
                查询
              </IconButton>
              {/* <IconButton style="" icon="refresh" onClick={resetQuery}>
                重置
              </IconButton> */}
              <IconButton
                v-permission="wmsMaterialContainer-add"
                icon="search"
@@ -293,7 +327,7 @@
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
          /> */}
        </div>
      )
    }
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Controllers/WmsMaterialStockDrawer.tsx
@@ -82,10 +82,6 @@
      prop: 'materialName',
      el: 'input',
      placeholder: '请输入物料名称',
      rules: [
        { required: true, message: '物料名称不能为空', trigger: 'blur' },
        { max: 100, message: '长度不能超过100个字符', trigger: 'blur' },
      ],
    },
    // 容器信息
    {
@@ -324,6 +320,7 @@
      formData.value = {
        isLock: 0,
        emptyContainer: 0,
        checkStatus: 2,
        inStockTime: new Date(),
      }
      updateCheckData()
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/WmsTaskQueryDrawer.tsx
@@ -226,7 +226,7 @@
      placeholder: '请输入来源单据号',
    },
    {
      label: '下个任务是否生成成功',
      label: '下个任务是否生成',
      prop: 'isNextTask',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsInOutStockOrderAppService.cs
@@ -1,127 +1,152 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockOrder;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrder;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
namespace CMS.Plugin.HIAWms.Application.Implements;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockOrder;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrder;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
namespace CMS.Plugin.HIAWms.Application.Implements;
/// <summary> 
/// 出入库单据应用服务 
/// </summary> 
public class WmsInOutStockOrderAppService : CMSPluginAppService, IWmsInOutStockOrderAppService
{
    private readonly IWmsInOutStockOrderRepository wmsInOutStockOrderRepository;
public class WmsInOutStockOrderAppService : CMSPluginAppService, IWmsInOutStockOrderAppService
{
    private readonly IWmsInOutStockOrderRepository wmsInOutStockOrderRepository;
    private readonly IWmsMaterialRepository _wmsMaterialRepository;
    /// <summary> 
    /// Initializes a new instance of the <see cref="WmsInOutStockOrderAppService"/> class. 
    /// </summary> 
    /// <param name="WmsInOutStockOrderRepository">The task job repository.</param> 
    public WmsInOutStockOrderAppService(IWmsInOutStockOrderRepository _WmsInOutStockOrderRepository)
    {
        wmsInOutStockOrderRepository = _WmsInOutStockOrderRepository;
    }
    public WmsInOutStockOrderAppService(IWmsInOutStockOrderRepository _WmsInOutStockOrderRepository, IWmsMaterialRepository wmsMaterialRepository)
    {
        wmsInOutStockOrderRepository = _WmsInOutStockOrderRepository;
        _wmsMaterialRepository = wmsMaterialRepository;
    }
    /// <summary> 
    /// 获取指定出入库单据 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsInOutStockOrderDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(await wmsInOutStockOrderRepository.GetAsync(id));
    }
    public virtual async Task<WmsInOutStockOrderDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(await wmsInOutStockOrderRepository.GetAsync(id));
    }
    /// <summary> 
    /// 分页获取出入库单据 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public virtual async Task<PagedResultDto<WmsInOutStockOrderDto>> GetListAsync(GetWmsInOutStockOrderInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockOrder.Sort);
        }
    public virtual async Task<PagedResultDto<WmsInOutStockOrderDto>> GetListAsync(GetWmsInOutStockOrderInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockOrder.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsInOutStockOrderRepository.GetCountAsync(whereConditions);
        var list = await wmsInOutStockOrderRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsInOutStockOrderDto>(count, ObjectMapper.Map<List<WmsInOutStockOrder>, List<WmsInOutStockOrderDto>>(list));
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsInOutStockOrderRepository.GetCountAsync(whereConditions);
        var list = await wmsInOutStockOrderRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsInOutStockOrderDto>(count, ObjectMapper.Map<List<WmsInOutStockOrder>, List<WmsInOutStockOrderDto>>(list));
    }
    /// <summary>  
    /// 动态构造查询条件  
    /// </summary>  
    /// <param name="input">输入参数</param>  
    /// <returns></returns>  
    private FunReturnResultModel<Expression<Func<WmsInOutStockOrder, bool>>> DynamicGetQueryParams(GetWmsInOutStockOrderInput input)
    {
    private FunReturnResultModel<Expression<Func<WmsInOutStockOrder, bool>>> DynamicGetQueryParams(GetWmsInOutStockOrderInput input)
    {
        //动态构造查询条件  
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsInOutStockOrder, GetWmsInOutStockOrderInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsInOutStockOrder, GetWmsInOutStockOrderInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件  
        Expression<Func<WmsInOutStockOrder, bool>> extendExpression = a => a.IsDeleted == false;
        Expression<Func<WmsInOutStockOrder, bool>> extendExpression = a => a.IsDeleted == false;
        // 使用 System.Linq.PredicateBuilder 的 And 
        var pres = (System.Linq.Expressions.Expression<Func<WmsInOutStockOrder, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
        var pres = (System.Linq.Expressions.Expression<Func<WmsInOutStockOrder, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary> 
    /// 新建出入库单据 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsInOutStockOrderDto> CreateAsync(WmsInOutStockOrderCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await wmsInOutStockOrderRepository.NameExistAsync(input.OrderNo);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.OrderNo]);
        }
        var maxSort = await wmsInOutStockOrderRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WmsInOutStockOrderCreateDto, WmsInOutStockOrder>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsInOutStockOrderRepository.InsertAsync(insertObj);
    public virtual async Task<WmsInOutStockOrderDto> CreateAsync(WmsInOutStockOrderCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var material = await _wmsMaterialRepository.FindByNameAsync(input.MaterialNo);
        if (material == null)
        {
            throw new UserFriendlyException("物料信息不存在");
        }
        var exist = await wmsInOutStockOrderRepository.NameExistAsync(input.OrderNo);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.OrderNo]);
        }
        var maxSort = await wmsInOutStockOrderRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var maxPriority = await wmsInOutStockOrderRepository.GetMaxPriorityAsync();
        var priority = input.Priority > 0 ? input.Priority : maxPriority;
        var insertObj = ObjectMapper.Map<WmsInOutStockOrderCreateDto, WmsInOutStockOrder>(input);
        insertObj.MaterialName = material.MaterialName;
        insertObj.MaterialModel = material.MaterialModel;
        insertObj.OrderStatus = Domain.Shared.Enums.OrderStatusEnum.NoStart;
        var type = "RK-";
        insertObj.StockType = Domain.Shared.Enums.StockTypeEnum.InBound;
        if (input.OrderType == Domain.Shared.Enums.OrderTypeEnum.PRODUCTCALL || input.OrderType == Domain.Shared.Enums.OrderTypeEnum.PERSONOT)
        {
            type = "CK-";
            insertObj.StockType = Domain.Shared.Enums.StockTypeEnum.OutBound;
        }
        insertObj.OrderNo = type + DateTime.Now.ToString("yyyyMMddHHmmssfff");
        insertObj.Sort = sort;
        insertObj.Priority = priority;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsInOutStockOrderRepository.InsertAsync(insertObj);
        //if (input.Sort.HasValue && insertObj.Sort != maxSort) 
        //{ 
        //    await AdjustSortAsync(insertObj.Id, insertObj.Sort); 
        //} 
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(insertObj);
    }
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(insertObj);
    }
    /// <summary> 
    /// 更新出入库单据 
    /// </summary> 
@@ -129,21 +154,21 @@
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsInOutStockOrderDto> UpdateAsync(Guid id, WmsInOutStockOrderUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsInOutStockOrderRepository.GetAsync(id);
        var exist = await wmsInOutStockOrderRepository.NameExistAsync(input.OrderNo, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.OrderNo]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
                updateObj.OrderNo = input.OrderNo;
    public virtual async Task<WmsInOutStockOrderDto> UpdateAsync(Guid id, WmsInOutStockOrderUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsInOutStockOrderRepository.GetAsync(id);
        var exist = await wmsInOutStockOrderRepository.NameExistAsync(input.OrderNo, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.OrderNo]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        updateObj.OrderNo = input.OrderNo;
        updateObj.OrderStatus = input.OrderStatus;
        updateObj.MaterialName = input.MaterialName;
        updateObj.MaterialNo = input.MaterialNo;
@@ -159,20 +184,20 @@
        updateObj.OperateTime = input.OperateTime;
        updateObj.Remark = input.Remark;
        updateObj.IsDisabled = input.IsDisabled;
        await wmsInOutStockOrderRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(updateObj);
    }
        await wmsInOutStockOrderRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsInOutStockOrder, WmsInOutStockOrderDto>(updateObj);
    }
    /// <summary> 
    /// 克隆出入库单据 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task<List<WmsInOutStockOrderDto>> CloneAsync(IEnumerable<Guid> ids)
    {
    public async Task<List<WmsInOutStockOrderDto>> CloneAsync(IEnumerable<Guid> ids)
    {
        //var wmsInOutStockOrders = new List<WmsInOutStockOrder>(); 
        //if (ids != null) 
        //{ 
@@ -192,259 +217,259 @@
        //                    name += WmsInOutStockOrderConsts.CloneTag; 
        //                    continue; 
        //                } 
        //                notExist = true; 
        //            } 
        //            //WmsInOutStockOrder = await wmsInOutStockOrderRepository.InsertAsync(WmsInOutStockOrder.Clone(GuidGenerator.Create(), name, sort++)); 
        //            wmsInOutStockOrders.Add(WmsInOutStockOrder); 
        //        } 
        //    } 
        //} 
        //return ObjectMapper.Map<List<WmsInOutStockOrder>, List<WmsInOutStockOrderDto>>(wmsInOutStockOrders); 
        return new List<WmsInOutStockOrderDto>();
    }
        return new List<WmsInOutStockOrderDto>();
    }
    /// <summary> 
    /// 删除单个出入库单据 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsInOutStockOrderRepository.DeleteAsync(id);
    }
    public virtual async Task DeleteAsync(Guid id)
    {
        var order = await wmsInOutStockOrderRepository.GetAsync(id);
        if(order != null && order.OrderStatus != Domain.Shared.Enums.OrderStatusEnum.NoStart)
        {
            throw new UserFriendlyException("只能删除未开始的单据");
        }
        await wmsInOutStockOrderRepository.DeleteAsync(id);
    }
    /// <summary> 
    /// 删除多个出入库单据 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <summary> 
    /// 调整排序出入库单据 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsInOutStockOrderRepository.GetListAsync(null, nameof(WmsInOutStockOrder.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsInOutStockOrderRepository.UpdateManyAsync(list);
    }
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsInOutStockOrderRepository.GetListAsync(null, nameof(WmsInOutStockOrder.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsInOutStockOrderRepository.UpdateManyAsync(list);
    }
    /// <summary> 
    /// 导入出入库单据 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public async Task ImportAsync(WmsInOutStockOrdersImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsInOutStockOrderCreateDtos = new List<(int RowIndex, WmsInOutStockOrderCreateDto Item)>();
        var wmsInOutStockOrderUpdateDtos = new List<(int RowIndex, Guid Id, WmsInOutStockOrderUpdateDto Item)>();
        var importItems = input.WmsInOutStockOrders;
        if (importItems != null && importItems.Any())
        {
    public async Task ImportAsync(WmsInOutStockOrdersImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsInOutStockOrderCreateDtos = new List<(int RowIndex, WmsInOutStockOrderCreateDto Item)>();
        var wmsInOutStockOrderUpdateDtos = new List<(int RowIndex, Guid Id, WmsInOutStockOrderUpdateDto Item)>();
        var importItems = input.WmsInOutStockOrders;
        if (importItems != null && importItems.Any())
        {
            #region 导入校验 
            // 判断名称是否重复,并输出第几行重复 
            var duplicateWmsInOutStockOrders = importItems.GroupBy(x => x.OrderNo).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsInOutStockOrders?.Any() == true)
            {
                var duplicateWmsInOutStockOrderMsgs = duplicateWmsInOutStockOrders.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsInOutStockOrderMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.OrderNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.OrderNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsInOutStockOrder名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsInOutStockOrder = await wmsInOutStockOrderRepository.FindByNameAsync(impItem.OrderNo);
                if (oldWmsInOutStockOrder != null)
                {
                    var wmsInOutStockOrderUpdateDto = new WmsInOutStockOrderUpdateDto
                    {
            var duplicateWmsInOutStockOrders = importItems.GroupBy(x => x.OrderNo).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsInOutStockOrders?.Any() == true)
            {
                var duplicateWmsInOutStockOrderMsgs = duplicateWmsInOutStockOrders.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsInOutStockOrderMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.OrderNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.OrderNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsInOutStockOrder名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsInOutStockOrder = await wmsInOutStockOrderRepository.FindByNameAsync(impItem.OrderNo);
                if (oldWmsInOutStockOrder != null)
                {
                    var wmsInOutStockOrderUpdateDto = new WmsInOutStockOrderUpdateDto
                    {
                        OrderNo = impItem.OrderNo,
OrderStatus = impItem.OrderStatus,
MaterialName = impItem.MaterialName,
MaterialNo = impItem.MaterialNo,
MaterialModel = impItem.MaterialModel,
MaterialBatch = impItem.MaterialBatch,
OrderType = impItem.OrderType,
StockType = impItem.StockType,
MaterialNumber = impItem.MaterialNumber,
DistributeNumber = impItem.DistributeNumber,
CompleteNumber = impItem.CompleteNumber,
Priority = impItem.Priority,
PlanNo = impItem.PlanNo,
OperateTime = impItem.OperateTime,
Remark = impItem.Remark,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockOrderUpdateDtos.Add((impItem.RowIndex, oldWmsInOutStockOrder.Id, wmsInOutStockOrderUpdateDto));
                }
                else
                {
                    var wmsInOutStockOrderCreateDto = new WmsInOutStockOrderCreateDto
                    {
                        OrderStatus = impItem.OrderStatus,
                        MaterialName = impItem.MaterialName,
                        MaterialNo = impItem.MaterialNo,
                        MaterialModel = impItem.MaterialModel,
                        MaterialBatch = impItem.MaterialBatch,
                        OrderType = impItem.OrderType,
                        StockType = impItem.StockType,
                        MaterialNumber = impItem.MaterialNumber,
                        DistributeNumber = impItem.DistributeNumber,
                        CompleteNumber = impItem.CompleteNumber,
                        Priority = impItem.Priority,
                        PlanNo = impItem.PlanNo,
                        OperateTime = impItem.OperateTime,
                        Remark = impItem.Remark,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockOrderUpdateDtos.Add((impItem.RowIndex, oldWmsInOutStockOrder.Id, wmsInOutStockOrderUpdateDto));
                }
                else
                {
                    var wmsInOutStockOrderCreateDto = new WmsInOutStockOrderCreateDto
                    {
                        OrderNo = impItem.OrderNo,
OrderStatus = impItem.OrderStatus,
MaterialName = impItem.MaterialName,
MaterialNo = impItem.MaterialNo,
MaterialModel = impItem.MaterialModel,
MaterialBatch = impItem.MaterialBatch,
OrderType = impItem.OrderType,
StockType = impItem.StockType,
MaterialNumber = impItem.MaterialNumber,
DistributeNumber = impItem.DistributeNumber,
CompleteNumber = impItem.CompleteNumber,
Priority = impItem.Priority,
PlanNo = impItem.PlanNo,
OperateTime = impItem.OperateTime,
Remark = impItem.Remark,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockOrderCreateDtos.Add((impItem.RowIndex, wmsInOutStockOrderCreateDto));
                }
            }
        }
                        OrderStatus = impItem.OrderStatus,
                        MaterialName = impItem.MaterialName,
                        MaterialNo = impItem.MaterialNo,
                        MaterialModel = impItem.MaterialModel,
                        MaterialBatch = impItem.MaterialBatch,
                        OrderType = impItem.OrderType,
                        StockType = impItem.StockType,
                        MaterialNumber = impItem.MaterialNumber,
                        DistributeNumber = impItem.DistributeNumber,
                        CompleteNumber = impItem.CompleteNumber,
                        Priority = impItem.Priority,
                        PlanNo = impItem.PlanNo,
                        OperateTime = impItem.OperateTime,
                        Remark = impItem.Remark,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockOrderCreateDtos.Add((impItem.RowIndex, wmsInOutStockOrderCreateDto));
                }
            }
        }
        // 新增 
        foreach (var wmsInOutStockOrderDto in wmsInOutStockOrderCreateDtos)
        {
            try
            {
                await CreateAsync(wmsInOutStockOrderDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockOrderDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        foreach (var wmsInOutStockOrderDto in wmsInOutStockOrderCreateDtos)
        {
            try
            {
                await CreateAsync(wmsInOutStockOrderDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockOrderDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // 更新 
        foreach (var wmsInOutStockOrderDto in wmsInOutStockOrderUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsInOutStockOrderDto.Id, wmsInOutStockOrderDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockOrderDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
        foreach (var wmsInOutStockOrderDto in wmsInOutStockOrderUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsInOutStockOrderDto.Id, wmsInOutStockOrderDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockOrderDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary> 
    /// 导出出入库单据 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsInOutStockOrderInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockOrder.Sort);
        }
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsInOutStockOrderInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockOrder.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsInOutStockOrderRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsInOutStockOrder>, List<WmsInOutStockOrderDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "出入库单据列表" : result.Count == 1 ? result[0]?.OrderNo : "WmsInOutStockOrder模版";
        return (sheets, fileName);
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsInOutStockOrderRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsInOutStockOrder>, List<WmsInOutStockOrderDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "出入库单据列表" : result.Count == 1 ? result[0]?.OrderNo : "WmsInOutStockOrder模版";
        return (sheets, fileName);
    }
    /// <summary> 
    /// 校验出入库单据,当新建或更新时 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WmsInOutStockOrderCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
                Check.NotNullOrWhiteSpace(input.OrderNo, "单据编号", 50);
        Check.NotNull(input.OrderStatus, "单据状态");
        Check.NotNullOrWhiteSpace(input.MaterialNo, "物料件号", 50);
    protected Task CheckCreateOrUpdateDtoAsync(WmsInOutStockOrderCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.MaterialNo, "物料编号", 50);
        Check.NotNullOrWhiteSpace(input.MaterialBatch, "批次号", 50);
        Check.NotNull(input.OrderType, "单据类型");
        Check.NotNull(input.StockType, "操作类型(枚举值)");
        Check.NotNull(input.StockType, "操作类型");
        Check.NotNull(input.MaterialNumber, "单据数量");
        Check.NotNull(input.DistributeNumber, "下发数量");
        Check.NotNull(input.CompleteNumber, "完成数量");
        Check.NotNull(input.Priority, "优先级");
        return Task.CompletedTask;
    }
}
        return Task.CompletedTask;
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs
@@ -104,6 +104,15 @@
        {
            throw new UserFriendlyException("库位库区信息不存在");
        }
        var wmsmaterialstockList = await _wmsmaterialstockRepository.GetStockListAsync(new WmsMaterialStock { PlaceNo = input.PlaceNo });
        if (wmsmaterialstockList.Count > 0)
        {
            if (wmsmaterialstockList[0].MaterialNo != input.MaterialNo)
            {
                throw new UserFriendlyException("当前库位已存放别的物料");
            }
        }
        var maxSort = await _wmsmaterialstockRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var wmsmaterialstock = ObjectMapper.Map<WmsMaterialStockCreateDto, WmsMaterialStock>(input);
@@ -133,7 +142,7 @@
            stock = JsonSerializer.Deserialize<WmsMaterialStock>(json);
            stock.MaterialId = Guid.NewGuid().ToString("N");
            stock.StockNumber = 1;
            stockList.Add(stock);
            stockList.Add(stock);
        }
        await _wmsmaterialstockRepository.InsertManyAsync(stockList);
@@ -146,10 +155,10 @@
        await _wmscontainerRepository.UpdateAsync(container);
        await _wmsplaceRepository.UpdateAsync(place);
        if (input.Sort.HasValue && wmsmaterialstock.Sort != maxSort)
        {
            await AdjustSortAsync(wmsmaterialstock.Id, wmsmaterialstock.Sort);
        }
        //if (input.Sort.HasValue && wmsmaterialstock.Sort != maxSort)
        //{
        //    await AdjustSortAsync(wmsmaterialstock.Id, wmsmaterialstock.Sort);
        //}
        await uow.SaveChangesAsync();
        await uow.CompleteAsync();
        return ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(wmsmaterialstock);
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsInOutStockOrder/IWmsInOutStockOrderRepository.cs
@@ -29,8 +29,14 @@
    /// 获取最大排序出入库单据 
    /// </summary> 
    /// <returns></returns> 
    Task<int> GetMaxSortAsync();
    Task<int> GetMaxSortAsync();
    /// <summary>
    /// 获取最大优先级值
    /// </summary>
    /// <returns></returns>
    Task<int> GetMaxPriorityAsync();
    /// <summary> 
    /// 获取分页列表出入库单据 
    /// </summary> 
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsInOutStockOrderRepository.cs
@@ -66,8 +66,33 @@
        var sort = await (await GetQueryableAsync()) 
            .Where(x => !x.IsDeleted).MaxAsync(x => x.Sort); 
        return sort + 1; 
    }
    }
    /// <summary>
    /// 获取最大优先级值
    /// </summary>
    /// <returns></returns>
    public async Task<int> GetMaxPriorityAsync()
    {
        // 获取今天的日期(时间部分为00:00:00)
        var today = DateTime.Today;
        var queryable = await GetQueryableAsync();
        var query = queryable
            .Where(x => x.CreationTime > today)
            .Where(x => !x.IsDeleted);
        var hasAny = await query.AnyAsync();
        if (!hasAny)
        {
            return 1;
        }
        // 获取最大Sort值并加1
        var maxSort = await query.MaxAsync(x => x.Sort);
        return maxSort + 1;
    }
    /// <summary> 
    /// 获取分页列表出入库单据 
    /// </summary>