zs
2025-05-13 de4a3a2c1b39c128d4ecd23367db5fcbda957bdd
临时提交
已添加8个文件
已修改13个文件
1177 ■■■■■ 文件已修改
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/Config.ts 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/WmsMaterialStockDetail.module.scss 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/WmsMaterialStockDetail.tsx 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/WmsMaterialStock.tsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/config/WmsMaterialStockDetail.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/ChangeToPlace.tsx 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/WmsTask.ts 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Models/Service/WmsTaskDrawer.ts 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Models/WmsTaskDrawer.ts 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/Dialog/ChangeToPlaceDialog/ChangeToPlaceDialog.module.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/Dialog/ChangeToPlaceDialog/ChangeToPlaceDialog.tsx 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/ChangeTaskToPlaceInput.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/Config.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
export const columns = [
  {
    type: 'seq',
    width: 60,
    title: '序号',
  },
  {
    field: 'materialNo',
    title: '物料编号',
  },
  {
    field: 'materialName',
    title: '物料名称',
  },
  {
    field: 'placeNo',
    title: '库位编号',
  },
  {
    field: 'placeStatusDesc',
    title: '库位状态',
  },
  {
    field: 'containerNo',
    title: '容器编号',
  },
  {
    field: 'stockNumber',
    title: '库存数量',
  },
  {
    field: 'materialBatch',
    title: '物料批次',
  },
  {
    field: 'materialModel',
    title: '型号',
  },
  {
    field: 'areaName',
    title: '所属库区',
  },
  {
    field: 'checkStatusDesc',
    title: '检验状态',
  },
  {
    field: 'inStockTime',
    title: '入库时间',
    width: 180,
  },
  {
    field: 'isLockDesc',
    title: '锁定状态',
  },
  {
    field: 'remark',
    title: '备注',
  },
]
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/WmsMaterialStockDetail.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
.wmsMaterialStockContent {
  width: 100%;
  height: 80%;
  .wmsMaterialStockList {
    width: 100%;
    height: calc(100% - 70px);
  }
  .headerContent {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 43px;
  }
  .header {
    margin-bottom: 12px;
    display: flex;
    justify-content: flex-start;
    align-items: center;
  }
}
.tagBox {
  width: auto;
  min-width: 80px;
  height: 24px;
  background: #ffffff;
  border-radius: 19px 19px 19px 19px;
  opacity: 1;
  border: 1px dashed #bcc4cc;
  width: 50px;
  height: 20px;
  font-size: 14px;
  font-family: PingFang SC, PingFang SC;
  font-weight: 400;
  color: #5a84ff;
  display: flex;
  justify-content: center;
  align-items: center;
  // cursor: pointer;
}
.group {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.groupTable {
  width: 100%;
}
.overBox {
  width: 100%;
  height: calc(100% - 20px);
  overflow: auto;
  :global(.cs-collapse-item__header) {
    background-color: #f1f1f1;
    padding: 0 20px;
    height: 35px;
    font-size: 16px;
    font-family: PingFang SC, PingFang SC;
    font-weight: 500;
  }
  :global(.cs-collapse-item__content) {
    padding-bottom: 0px;
  }
}
.groupHeader {
  width: 100%;
  height: 30px;
  background: #ccc;
}
.hideBlock {
  display: none;
}
.queryForm {
  padding: 10px;
  background: #f5f7fa;
  margin-bottom: 0px;
  border-radius: 4px;
  .el-form-item {
    margin-right: 20px;
    margin-bottom: 0;
    // ç»Ÿä¸€è¾“入框和选择框的宽度
    .el-input, .el-select {
      width: 200px; // è®¾ç½®ç»Ÿä¸€çš„宽度
    }
    // é€‰æ‹©æ¡†å†…部输入框样式
    .el-select .el-input__wrapper {
      height: 32px; // ä¸Žè¾“入框高度一致
      padding: 1px 11px; // ä¸Žè¾“入框内边距一致
    }
    // æ—¥æœŸé€‰æ‹©å™¨å®½åº¦
    .el-date-editor {
      width: 220px;
    }
  }
}
// å¦‚果需要更精确的控制,可以单独设置
.formItem {
  width: 200px;
  &.el-input, &.el-select {
    width: 100%;
  }
}
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/Pages/WmsMaterialStockDetail/WmsMaterialStockDetail.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,317 @@
import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
import type { Ref } from 'vue'
import BaseTable from '@/components/Table/Table'
import styles from './WmsMaterialStockDetail.module.scss'
import { useWmsMaterialStock } from '../../../Controllers/WmsMaterialStock'
import IconButton from '@/components/IconButton/IconButton'
import WmsMaterialStockDrawer from '../Dialog/WmsMaterialStockDrawer/WmsMaterialStockDrawer'
import Search from '@/components/Search/Search'
import { columns } from './Config'
import TdButton from '@/components/TdButton/TdButton'
import { vPermission } from '@/libs/Permission/Permission'
import dayjs from 'dayjs'
import {
  ElDatePicker,
  ElForm,
  ElFormItem,
  ElInput,
  ElOption,
  ElSelect,
} from 'element-plus'
import { getWmsEnumData } from '@/widgets/HIAWms/Models/Service/WmsMaterialDrawer'
interface RenderTableType {
  url?: string
  dataSource: Ref<any[]>
  isDrag?: boolean
  isChecked?: boolean
  isHidePagination?: boolean
  params?: Record<string, any>
  autoHeight?: boolean
}
export default defineComponent({
  name: 'WmsMaterialStock',
  directives: {
    permission: vPermission,
  },
  setup(props, ctx) {
    const {
      dataSource,
      contextMenu,
      dialogConfig,
      tableRef,
      current,
      search,
      sort,
      headers,
      onError,
      onSearch,
      onRowClick,
      onConfirmWmsMaterialStock,
      onCheck,
      onAddWmsMaterialStock,
      onExport,
      openDetail,
      onSuccess,
      onBeforeUpload,
    } = useWmsMaterialStock(props, ctx)
    // æ–°å¢žçš„æŸ¥è¯¢æ¡ä»¶
    const queryForm = ref({
      containerNo: '',
      materialNo: '',
      materialName: '',
      containerType: '',
      containerStatus: '',
      storageTypeNo: 1,
      placeStatus: '',
      placeNo: '',
      isLock: '',
      emptyContainer: '',
      dateRange: [],
      filter: '',
    })
    const queryParams = computed(() => ({
      ...queryForm.value,
      containerType: queryForm.value.containerType || '', // å¤„理下拉
      containerStatus: queryForm.value.containerStatus || '',
      storageTypeNo: queryForm.value.storageTypeNo || 1, // å¤„理下拉
      placeStatus: queryForm.value.placeStatus || '',
      islock: queryForm.value.isLock || '',
      emptyContainer: queryForm.value.emptyContainer || '',
      startTime: queryForm.value.dateRange[0] || '',
      endTime: queryForm.value.dateRange[1] || '',
    }))
    // åŠ¨æ€æžšä¸¾é€‰é¡¹
    const enumOptions = reactive({
      containerType: [] as Array<{ label: string; value: any }>,
      containerStatus: [] as Array<{ label: string; value: any }>,
      storageTypeNo: [] as Array<{ label: string; value: any }>,
      placeStatus: [] as Array<{ label: string; value: any }>,
      yesOrNo: [] as Array<{ label: string; value: any }>,
    })
    // èŽ·å–æžšä¸¾æ•°æ®
    const fetchEnumData = async () => {
      try {
        // èŽ·å–ç‰©æ–™ç±»åž‹æžšä¸¾
        const containerTypeData = await getWmsEnumData({
          EnumName: 'ContainerTypeEnum',
        })
        enumOptions.containerType = containerTypeData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        // èŽ·å–ç‰©æ–™ç±»åž‹æžšä¸¾
        const storageTypeNoData = await getWmsEnumData({
          EnumName: 'PlaceTypeEnum',
        })
        enumOptions.storageTypeNo = storageTypeNoData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        // èŽ·å–é‡‡è´­ç±»åž‹æžšä¸¾
        const placeStatusData = await getWmsEnumData({
          EnumName: 'PlaceStatusEnum',
        })
        enumOptions.placeStatus = placeStatusData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        // èŽ·å–é‡‡è´­ç±»åž‹æžšä¸¾
        const containerStatusData = await getWmsEnumData({
          EnumName: 'ContainerStatusEnum',
        })
        enumOptions.containerStatus = containerStatusData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        const yesNoData = await getWmsEnumData({
          EnumName: 'YesNoEnum',
        })
        enumOptions.yesOrNo = yesNoData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
      } catch (error) {
        console.error('获取枚举数据失败:', error)
      }
    }
    // ç»„件挂载时获取枚举数据
    onMounted(() => {
      fetchEnumData()
      handleQuery()
    })
    // æ–°å¢žçš„æŸ¥è¯¢æ–¹æ³•
    const handleQuery = async () => {
      console.log('查询条件:', queryParams.value)
      // tableRef.value.getTableList()
      tableRef.value.getList(queryParams.value)
    }
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    const resetQuery = () => {
      queryForm.value = {
        containerNo: '',
        materialNo: '',
        materialName: '',
        containerType: '',
        containerStatus: '',
        storageTypeNo: 1,
        placeStatus: '',
        placeNo: '',
        isLock: '',
        emptyContainer: '',
        dateRange: [],
        filter: '',
      }
    }
    /**
     * @returns è¡¨æ ¼
     */
    const RenderBaseTable = (props: RenderTableType) => {
      const {
        url,
        dataSource,
        isDrag,
        isChecked,
        isHidePagination,
        params,
        autoHeight,
      } = props
      props.params = {
        ...queryParams.value,
        ...params,
      }
      return (
        <div
          class={{
            [styles.wmsMaterialStockList]: true,
          }}
        >
          <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsMaterialStock/{id}/adjustsort/{sort}"
            v-model:dataSource={dataSource.value}
            columns={columns}
            contextMenu={contextMenu}
            params={params}
            isDrag={isDrag}
            isChecked={isChecked}
            autoHeight={autoHeight}
            onCheck={onCheck}
            onRowClick={onRowClick}
            isHidePagination={isHidePagination}
            pageSize={20}
            v-slots={{
              inStockTime: ({ row }: any) => {
                return (
                  <div>
                    {row.inStockTime != null
                      ? dayjs(row.inStockTime).format('YYYY-MM-DD HH:mm:ss')
                      : '-'}
                  </div>
                )
              },
              name: ({ row }: any) => {
                return row?.name ? (
                  <TdButton
                    onClick={() => openDetail(row)}
                    text={<span style="color:#5a84ff">详情</span>}
                    icon="scale"
                    tip={row?.name}
                    hover
                  >
                    {row?.name}
                  </TdButton>
                ) : (
                  '-'
                )
              },
            }}
          ></BaseTable>
        </div>
      )
    }
    return () => {
      return (
        <div class={styles.wmsMaterialStockContent}>
          {/* æ·»åŠ /编辑 */}
          <WmsMaterialStockDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsMaterialStock}
          />
          {/* é«˜çº§æŸ¥è¯¢ */}
          {/* <WmsMaterialStockDetailDrawer
            ref="wmsTaskQueryDrawerRef"
            v-model={dialogConfigForQuery.visible}
            title={dialogConfigForQuery.title}
            row={current.value}
            sort={sort.value}
            onConfirmQuery={handleQuery}
            onRestQuery={resetQuery}
            onClose={closeQuery}
          /> */}
          <div class={styles.headerContent}>
            <div class={styles.header}>
              <IconButton
                v-permission="wmsMaterialStock-add"
                icon="add-p"
                onClick={onAddWmsMaterialStock}
                type="primary"
              >
                æ·»åŠ 
              </IconButton>
              <el-divider direction="vertical" />
              <el-upload
                v-permission="wmsMaterialStock-import"
                name="file"
                accept=".xlsx,.xls,.csv"
                show-file-list={false}
                onError={onError}
                onSuccess={onSuccess}
                before-upload={onBeforeUpload}
                headers={headers.value}
                action="/api/v1/HIAWms/wmsMaterialStock/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload>
              <IconButton
                v-permission="wmsMaterialStock-output"
                icon="out"
                onClick={onExport}
              >
                å¯¼å‡º
              </IconButton>
            </div>
            {/* <Search
              placeholder="请输入关键字"
              v-model={search.value}
              onConfirm={onSearch}
              style={{ marginTop: '-1px' }}
            /> */}
          </div>
          <RenderBaseTable
            url="/api/v1/HIAWms/wmsMaterialStock"
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
        </div>
      )
    }
  },
})
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/WmsMaterialStock.tsx
@@ -22,7 +22,10 @@
})
const entityNames = getEntityNames(Models)
const nameToLabelMap = [{ name: 'WmsMaterialStock', label: '库存' }]
const nameToLabelMap = [
  { name: 'WmsMaterialStock', label: '库存' },
  { name: 'WmsMaterialStockDetail', label: '库存明细' },
]
export default defineComponent({
  name: 'WmsMaterialStock',
HIAWms/hiawms_web/src/widgets/WmsMaterialStock/Views/config/WmsMaterialStockDetail.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
{
  "name": "WmsMaterialStockDetail"
}
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/ChangeToPlace.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,166 @@
import {
  ref,
  onMounted,
  reactive,
  computed,
  Ref,
  watch,
  SetupContext,
  h,
} from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsTaskDrawer } from '../Models/WmsTaskDrawer'
import { ElMessage } from 'element-plus'
import isEqual from 'lodash/isEqual'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { cloneDeep } from 'lodash'
export const ChangeToPlace = (props: any, ctx?: any) => {
  const wmsTaskDrawer = injectModel<WmsTaskDrawer>('wmsTaskDrawer')
  /**
   * ç”¨æ¥å¯¹æ¯”的初始化数据
   */
  const initiateData: Ref<Record<string, any>> = ref({})
  const formData = ref<Record<string, any>>({})
  // ref
  const formRef = ref()
  const disabled = ref(false)
  const current = computed(() => {
    return props.row || null
  })
  const visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
    {
      label: '任务号',
      prop: 'taskNo',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入任务号',
      rules: [{ required: true, message: '任务号不能为空', trigger: 'blur' }],
    },
    {
      label: '起始库位',
      prop: 'sourcePlace',
      el: 'input',
      disabled: disabled,
      rules: [{ required: true, message: '起始库位不能为空', trigger: 'blur' }],
      placeholder: '请输入起始库位',
    },
    {
      label: '目标库位',
      prop: 'toPlace',
      el: 'input',
      // disabled: disabled,
      rules: [{ required: true, message: '目标库位不能为空', trigger: 'blur' }],
      placeholder: '请输入目标库位',
    },
    {
      label: '型号',
      prop: 'mutableParam1',
      el: 'input',
      disabled: disabled,
      placeholder: '请输入可变变量1',
    },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  const checkIsEqualObject = () => {
    const data = {
      formData: formData.value,
    }
    const check = isEqual(initiateData.value, data)
    return check
  }
  const onClose = (done: () => void) => {
    if (visible.value) {
      if (checkIsEqualObject()) {
        visible.value = false
        done && done()
      } else {
        ConfirmBox('是否保存设置?')
          .then(() => {
            onConfirm()
          })
          .catch(() => {
            visible.value = false
            done && done()
          })
      }
    }
  }
  /**
   * ä¿å­˜
   */
  const onConfirm = async () => {
    await formRef.value?.validate()
    const data = {
      taskNo: formData.value.taskNo,
      sourcePlace: formData.value.sourcePlace,
      toPlace: formData.value.toPlace,
      mutableParam1: formData.value.mutableParam1,
    }
    const id = current.value.id
    await wmsTaskDrawer.changeTaskToPlace(data)
    ElMessage.success('修改成功')
    ctx.emit('confirm')
  }
  const updateCheckData = () => {
    initiateData.value = {
      formData: {
        ...formData.value,
      },
    }
  }
  /**
   * å¼¹çª—打开获取详情
   */
  const onOpenChange = async () => {
    if (current.value) {
      const res = await wmsTaskDrawer.getWmsTaskDetail(current.value)
      formData.value = {
        taskNo: res.taskNo,
        sourcePlace: res.sourcePlace,
        toPlace: res.toPlace,
        mutableParam1: res.mutableParam1,
        id: res.id,
      }
      if (res.taskStatus != 1) {
        disabled.value = true
      }
      updateCheckData()
    } else {
      ElMessage.warning('请先选择一条数据')
      visible.value = false
      return
    }
  }
  watch(() => current.value, onOpenChange)
  return {
    formItems,
    formData,
    visible,
    formRef,
    onOpenChange,
    onClose,
    onConfirm,
  }
}
HIAWms/hiawms_web/src/widgets/WmsTask/Controllers/WmsTask.ts
@@ -67,6 +67,11 @@
    title: '',
  })
  const dialogChangeToPlaceConfig = reactive({
    visible: false,
    title: '',
    isAdd: false,
  })
  /**
   * åˆ†é¡µæ•°æ®
   */
@@ -84,6 +89,14 @@
    sort.value = row.sort
  }
  const openChangToPlace = (row: any) => {
    current.value = row
    dialogChangeToPlaceConfig.visible = true
    dialogChangeToPlaceConfig.title = '修改目标库位'
    dialogChangeToPlaceConfig.isAdd = false
    console.log('row', row)
  }
  const contextMenu = [
    {
      label: '展开详情',
@@ -95,18 +108,16 @@
      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) => {
        current.value = null
        sort.value = c.row.sort
        nextTick(() => openChangToPlace(c.row))
      },
      divided: true,
      icon: 'up',
    },
    {
      label: '强制完成',
      fn: async (c: CurrentType) => {
@@ -278,6 +289,7 @@
    dialogConfig,
    dialogConfigForQuery,
    dialogSettingConfig,
    dialogChangeToPlaceConfig,
    tableRef,
    current,
    search,
@@ -289,6 +301,7 @@
    onError,
    onSuccess,
    openDetail,
    openChangToPlace,
    onSearch,
    onExport,
    onRowClick,
HIAWms/hiawms_web/src/widgets/WmsTask/Models/Service/WmsTaskDrawer.ts
@@ -1,34 +1,42 @@
import { Base } from '@/libs/Base/Base'
const request = Base.request
/**
 * æ·»åŠ 
 * @returns
 */
export const addWmsTask = (data: any) => {
  return request.post('/api/v1/HIAWms/wmsTask', data)
}
/**
 * èŽ·å–è¯¦æƒ…
 * @returns
 */
export const getWmsTask = (id: string) => {
  return request.get(`/api/v1/HIAWms/wmsTask/${id}`)
}
/**
 * æ›´æ–°
 * @returns
 */
export const updateWmsTask = (id: string, data: Record<string, any>) => {
  return request.put(`/api/v1/HIAWms/wmsTask/${id}`, data)
}
/**
 * èŽ·å–æžšä¸¾
 * @returns
 */
export const getWmsEnumData = (data: any) => {
  return request.post('/api/v1/HIAWms/WmsEnum', data)
}
import { Base } from '@/libs/Base/Base'
const request = Base.request
/**
 * æ·»åŠ 
 * @returns
 */
export const addWmsTask = (data: any) => {
  return request.post('/api/v1/HIAWms/wmsTask', data)
}
/**
 * èŽ·å–è¯¦æƒ…
 * @returns
 */
export const getWmsTask = (id: string) => {
  return request.get(`/api/v1/HIAWms/wmsTask/${id}`)
}
/**
 * æ›´æ–°
 * @returns
 */
export const updateWmsTask = (id: string, data: Record<string, any>) => {
  return request.put(`/api/v1/HIAWms/wmsTask/${id}`, data)
}
/**
 * èŽ·å–æžšä¸¾
 * @returns
 */
export const getWmsEnumData = (data: any) => {
  return request.post('/api/v1/HIAWms/WmsEnum', data)
}
/**
 * ä¿®æ”¹ç›®æ ‡åº“位
 * @returns
 */
export const changeToPlace = (data: any) => {
  return request.post('/api/v1/HIAWms/wmsTask/ChangeTaskToPlace', data)
}
HIAWms/hiawms_web/src/widgets/WmsTask/Models/WmsTaskDrawer.ts
@@ -1,44 +1,53 @@
import { Base } from '@/libs/Base/Base'
import {
  addWmsTask,
  getWmsTask,
  updateWmsTask,
  getWmsEnumData,
} from './Service/WmsTaskDrawer'
import { useGlobalState } from '@/libs/Store/Store'
export class WmsTaskDrawer extends Base<{ [key: string]: any }> {
  constructor() {
    super({
      data: [],
      wmsTask: {},
    })
  }
  /**
   * æ·»åŠ 
   * @param data
   */
  async addWmsTask(data: Record<string, any>) {
    return addWmsTask(data)
  }
  /**
   * æ›´æ–°
   * @param data
   */
  async updateWmsTask(id: string, data: Record<string, any>) {
    return updateWmsTask(id, data)
  }
  /**
   * èŽ·å–è¯¦æƒ…
   */
  async getWmsTaskDetail(current: any, id?: string) {
    return getWmsTask(id || current?.id)
  }
  //  èŽ·å–æžšä¸¾å€¼
  async getWmsEnumData(data: Record<string, any>) {
    return getWmsEnumData(data)
  }
}
import { Base } from '@/libs/Base/Base'
import {
  addWmsTask,
  getWmsTask,
  updateWmsTask,
  getWmsEnumData,
  changeToPlace,
} from './Service/WmsTaskDrawer'
import { useGlobalState } from '@/libs/Store/Store'
export class WmsTaskDrawer extends Base<{ [key: string]: any }> {
  constructor() {
    super({
      data: [],
      wmsTask: {},
    })
  }
  /**
   * æ·»åŠ 
   * @param data
   */
  async addWmsTask(data: Record<string, any>) {
    return addWmsTask(data)
  }
  /**
   * æ›´æ–°
   * @param data
   */
  async updateWmsTask(id: string, data: Record<string, any>) {
    return updateWmsTask(id, data)
  }
  /**
   * æ›´æ–°
   * @param data
   */
  async changeTaskToPlace(data: Record<string, any>) {
    return changeToPlace(data)
  }
  /**
   * èŽ·å–è¯¦æƒ…
   */
  async getWmsTaskDetail(current: any, id?: string) {
    return getWmsTask(id || current?.id)
  }
  //  èŽ·å–æžšä¸¾å€¼
  async getWmsEnumData(data: Record<string, any>) {
    return getWmsEnumData(data)
  }
}
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/Dialog/ChangeToPlaceDialog/ChangeToPlaceDialog.module.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
.drawer {
  width: 800px;
}
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/Dialog/ChangeToPlaceDialog/ChangeToPlaceDialog.tsx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
import { SetupContext, defineComponent } from 'vue'
import BaseDrawer from '@/components/BaseDrawer/BaseDrawer'
import styles from './ChangeToPlaceDialog.module.scss'
import { ChangeToPlace } from '../../../../Controllers/ChangeToPlace.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirm'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirm,
      onOpenChange,
      formRef,
      visible,
      formItems,
      formData,
    } = ChangeToPlace(props, ctx)
    return () => (
      <BaseDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '添加'}
        v-model={visible.value}
        close-on-click-modal={true}
        onConfirm={onConfirm}
        onOpen={onOpenChange}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="150px"
          formItemProps={formItems}
        ></DyForm>
      </BaseDrawer>
    )
  },
})
HIAWms/hiawms_web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx
@@ -5,6 +5,7 @@
import { useWmsTask } from '../../../Controllers/WmsTask'
import IconButton from '@/components/IconButton/IconButton'
import WmsTaskDrawer from '../Dialog/WmsTaskDrawer/WmsTaskDrawer'
import ChangeToPlaceDialog from '../Dialog/ChangeToPlaceDialog/ChangeToPlaceDialog'
import WmsTaskQueryDrawer from '../Dialog/WmsTaskQueryDrawer/WmsTaskQueryDrawer'
import Search from '@/components/Search/Search'
import { columns } from './Config'
@@ -43,6 +44,7 @@
      contextMenu,
      dialogConfig,
      dialogConfigForQuery,
      dialogChangeToPlaceConfig,
      tableRef,
      current,
      search,
@@ -264,6 +266,16 @@
            onRestQuery={resetQuery}
            onClose={closeQuery}
          />
          <ChangeToPlaceDialog
            ref="changeToPlace"
            v-model={dialogChangeToPlaceConfig.visible}
            title={dialogChangeToPlaceConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirmQuery={handleQuery}
            onRestQuery={resetQuery}
            onClose={closeQuery}
          />
          <div class={styles.headerContent}>
            <div class={styles.header}>
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/ChangeTaskToPlaceInput.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask
{
    /// <summary>
    /// ä¿®æ”¹ç›®æ ‡åº“位参数
    /// </summary>
    public class ChangeTaskToPlaceInput
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹
        /// </summary>
        public TaskTypeEnum TaskType { get; set; }
        /// <summary>
        /// èµ·å§‹åº“位
        /// </summary>
        public string? SourcePlace { get; set; }
        /// <summary>
        /// ç›®æ ‡åº“位
        /// </summary>
        public string? ToPlace { get; set; }
        /// <summary>
        /// å¯å˜å˜é‡1
        /// </summary>
        public string? MutableParam1 { get; set; }
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs
@@ -1,4 +1,5 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace CMS.Plugin.HIAWms.Application.Contracts.Services;
@@ -16,6 +17,13 @@
    Task<List<WmsMaterialStockDto>> CloneAsync(IEnumerable<Guid> ids);
    /// <summary>
    /// èŽ·å–åº“å­˜æ˜Žç»†
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<PagedResultDto<WmsMaterialStockDto>> GetStockDetailAsync(GetWmsMaterialStocksInput input);
    /// <summary>
    /// Deletes the many asynchronous.
    /// </summary>
    /// <param name="ids">The ids.</param>
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsTaskAppService.cs
@@ -57,4 +57,11 @@
    /// <param name="input"></param>
    /// <returns></returns>
    Task CancelTaskAysnc(WmsTaskStatusDto input);
    /// <summary>
    /// ä¿®æ”¹ç›®æ ‡åº“位
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task ChangeTaskToPlaceAsync(ChangeTaskToPlaceInput input);
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs
@@ -1,4 +1,5 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsAreas;
@@ -6,8 +7,11 @@
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CmsQueryExtensions;
using CmsQueryExtensions.Extension;
using Microsoft.Extensions.DependencyInjection;
using System.Linq.Expressions;
using System.Text.Json;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
@@ -71,6 +75,51 @@
        return new PagedResultDto<WmsMaterialStockDto>(count, ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(list));
    }
    public async Task<PagedResultDto<WmsMaterialStockDto>> GetStockDetailAsync(GetWmsMaterialStocksInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsMaterialStock.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await _wmsmaterialstockRepository.GetDetailCountAsync(whereConditions);
        var list = await _wmsmaterialstockRepository.GetStockDetailListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsMaterialStockDto>(count, ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(list));
    }
    /// <summary>
    /// åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    private FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> DynamicGetQueryParams(GetWmsMaterialStocksInput input)
    {
        //动态构造查询条件
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsMaterialStock, GetWmsMaterialStocksInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件
        Expression<Func<WmsMaterialStock, bool>> extendExpression = a => a.IsDeleted == false ;
        // ä½¿ç”¨ System.Linq.PredicateBuilder çš„ And
        var pres = (System.Linq.Expressions.Expression<Func<WmsMaterialStock, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <inheritdoc />
    public virtual async Task<WmsMaterialStockDto> CreateAsync(WmsMaterialStockCreateDto input)
    {
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -694,4 +694,38 @@
        await uow.SaveChangesAsync();
        await uow.CompleteAsync();
    }
    /// <summary>
    /// ä¿®æ”¹ç›®æ ‡åº“位
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task ChangeTaskToPlaceAsync(ChangeTaskToPlaceInput input)
    {
        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo);
        if (task == null)
        {
            throw new UserFriendlyException("任务信息不存在");
        }
        if (task.TaskStatus != WmsTaskStatus.WEIZHIXING)
        {
            throw new UserFriendlyException("已开始或者结束的任务不允许修改");
        }
        var toplaceStock = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { PlaceNo = input.ToPlace });
        if (toplaceStock != null && toplaceStock.Count>0)
        {
            var model = toplaceStock.FirstOrDefault();
            if (model.MaterialModel != input.MutableParam1)
            {
                throw new UserFriendlyException("目标库位型号与当前型号不一致不允许修改");
            }
        }
        task.ToPlace = input.ToPlace;
        await wmsTaskRepository.UpdateAsync(task);
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs
@@ -1,3 +1,5 @@
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Specifications;
@@ -57,6 +59,27 @@
    /// <param name="stock"></param>
    /// <returns></returns>
    Task<List<WmsMaterialStock>> GetStockListAsync(WmsMaterialStock? stock);
    /// <summary>
    /// æŸ¥è¯¢åº“存明细
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="sorting"></param>
    /// <param name="maxResultCount"></param>
    /// <param name="skipCount"></param>
    /// <param name="includeDetails"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<WmsMaterialStock>> GetStockDetailListAsync(FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default);
    /// <summary>
    /// èŽ·å–åº“å­˜æ€»æ•°
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<long> GetDetailCountAsync(FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    /// Gets the count asynchronous.
    /// </summary>
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs
@@ -1,6 +1,9 @@
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CMS.Plugin.HIAWms.EntityFrameworkCore.Extensions;
using CmsQueryExtensions.Extension;
using DatabaseSchemaReader.Filters;
using Microsoft.EntityFrameworkCore;
using SqlKata;
@@ -253,9 +256,48 @@
       .WhereIf(!string.IsNullOrEmpty(stock?.AreaName), u => u.AreaName.Contains(stock.AreaName))
       .WhereIf(stock.IsLock > 0, u => u.IsLock == stock.IsLock)
       .Where(u => !u.IsDeleted)
       .OrderByDescending(x=>x.InStockTime)
       .ToListAsync();
        return baseQuery;
    }
    /// <summary>
    /// æŸ¥è¯¢åº“存明细
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="sorting"></param>
    /// <param name="maxResultCount"></param>
    /// <param name="skipCount"></param>
    /// <param name="includeDetails"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<WmsMaterialStock>> GetStockDetailListAsync(FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .IncludeDetails(includeDetails)
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .OrderBy(x=>x.PlaceNo)
            .ThenByDescending(x => x.CreationTime)
            .PageBy(skipCount, maxResultCount)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    /// <summary>
    /// èŽ·å–æ€»æ•°åº“å­˜ç®¡ç†
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<long> GetDetailCountAsync(FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetQueryableAsync())
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .CountAsync(cancellationToken: GetCancellationToken(cancellationToken));
    }
    /// <inheritdoc />
    public override async Task<IQueryable<WmsMaterialStock>> WithDetailsAsync()
    {
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs
@@ -58,6 +58,18 @@
        }
        /// <summary>
        /// å“­å‡ºæ¥æ˜Žç»†
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("StockDetail")]
        public async Task<PagedResultDto<WmsMaterialStockDto>> GetStockDetailAsync(GetWmsMaterialStocksInput input)
        {
            return await _wmsmaterialstockAppService.GetStockDetailAsync(input);
        }
        /// <summary>
        /// åˆ›å»ºwmsmaterialstock.
        /// </summary>
        /// <param name="input">输入.</param>
HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsTaskController.cs
@@ -208,5 +208,17 @@
        {
            await _wmsTaskAppService.CancelTaskAysnc(input);
        }
        /// <summary>
        /// ä¿®æ”¹ä»»åŠ¡ç›®æ ‡åº“ä½
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("ChangeTaskToPlace")]
        public async Task ChangeTaskToPlaceAsync(ChangeTaskToPlaceInput input)
        {
            await _wmsTaskAppService.ChangeTaskToPlaceAsync(input);
        }
    }