diff --git a/src/api/erp/stock/check/index.ts b/src/api/erp/stock/check/index.ts index 4a3e6534..9de3a893 100644 --- a/src/api/erp/stock/check/index.ts +++ b/src/api/erp/stock/check/index.ts @@ -2,13 +2,54 @@ import request from '@/config/axios' // ERP 库存盘点单 VO export interface StockCheckVO { - id: number // 出库编号 - no: string // 出库单号 - outTime: Date // 出库时间 + id: number // 盘点编号 + no: string // 盘点单号 + checkTime: Date | string // 盘点时间 + sourceType?: number | string // 生成来源类型:1-按库存,2-按产品 totalCount: number // 合计数量 totalPrice: number // 合计金额,单位:元 status: number // 状态 - remark: string // 备注 + auditUserId?: number // 审核人编号 + auditUserName?: string // 审核人名称 + remark?: string // 备注 + fileUrl?: string // 附件 URL + creator?: string // 创建人 + creatorName?: string // 创建人名称 + createTime?: Date | string // 创建时间 + productNames?: string // 产品信息 + items?: StockCheckItemVO[] // 盘点项列表 + approveRecords?: StockCheckApproveRecordVO[] // 审核记录 +} + +export interface StockCheckItemVO { + id?: number // 盘点项编号 + warehouseId: number // 仓库编号 + warehouseName?: string // 仓库名称 + areaId?: number // 库区编号 + areaName?: string // 库区名称 + productId: number // 产品编号 + productPrice: number // 产品单价 + stockCount: number // 账面数量 + actualCount: number // 实际数量 + count: number // 盈亏数量 + remark?: string // 备注 + productName: string // 产品名称 + productBarCode: string // 产品条码 + productUnitName: string // 产品单位名称 +} + +export interface StockCheckApproveRecordVO { + id?: number // 编号 + stockCheckId?: number // 盘点单编号 + actionType?: string // 操作类型 + fromStatus?: number // 变更前状态 + toStatus?: number // 变更后状态 + targetUserId?: number // 目标审核人编号 + targetUserName?: string // 目标审核人名称 + remark?: string // 备注 + creator?: string // 操作人 + creatorName?: string // 操作人名称 + createTime?: Date | string // 创建时间 } // ERP 库存盘点单 API @@ -23,6 +64,16 @@ export const StockCheckApi = { return await request.get({ url: `/erp/stock-check/get?id=` + id }) }, + // 按仓库/库区生成盘点项 + generateItemsByLocation: async (data: any) => { + return await request.post({ url: `/erp/stock-check/generate-items/by-location`, data }) + }, + + // 按产品生成盘点项 + generateItemsByProduct: async (data: any) => { + return await request.post({ url: `/erp/stock-check/generate-items/by-product`, data }) + }, + // 新增库存盘点单 createStockCheck: async (data: StockCheckVO) => { return await request.post({ url: `/erp/stock-check/create`, data }) diff --git a/src/api/erp/stock/in/index.ts b/src/api/erp/stock/in/index.ts index 8af08078..edff0500 100644 --- a/src/api/erp/stock/in/index.ts +++ b/src/api/erp/stock/in/index.ts @@ -1,4 +1,21 @@ import request from '@/config/axios' +import qs from 'qs' + +const normalizeStockQueryParams = (params: any) => { + if (!params) return params + const nextParams = { ...params } + if (Array.isArray(nextParams.statusList)) { + if (nextParams.statusList.length) { + nextParams.statusList = nextParams.statusList.join(',') + } else { + delete nextParams.statusList + } + } + return nextParams +} + +const stockQueryParamsSerializer = (params: any) => + qs.stringify(params, { allowDots: true, arrayFormat: 'repeat' }) // ERP 其它入库单 VO export interface StockInVO { @@ -32,7 +49,12 @@ export interface StockInApproveRecordVO { export const StockInApi = { // 查询其它入库单分页 getStockInPage: async (params: any) => { - return await request.get({ url: `/erp/stock-in/page`, params }) + const finalParams = normalizeStockQueryParams(params) + return await request.get({ + url: `/erp/stock-in/page`, + params: finalParams, + paramsSerializer: stockQueryParamsSerializer + }) }, // 查询其它入库单详情 @@ -88,7 +110,12 @@ export const StockInApi = { // 导出其它入库单 Excel exportStockIn: async (params) => { - return await request.download({ url: `/erp/stock-in/export-excel`, params }) + const finalParams = normalizeStockQueryParams(params) + return await request.download({ + url: `/erp/stock-in/export-excel`, + params: finalParams, + paramsSerializer: stockQueryParamsSerializer + }) }, // 查询生产入库单分页 diff --git a/src/api/erp/stock/out/index.ts b/src/api/erp/stock/out/index.ts index cc54ea20..76e2902f 100644 --- a/src/api/erp/stock/out/index.ts +++ b/src/api/erp/stock/out/index.ts @@ -1,4 +1,21 @@ import request from '@/config/axios' +import qs from 'qs' + +const normalizeStockQueryParams = (params: any) => { + if (!params) return params + const nextParams = { ...params } + if (Array.isArray(nextParams.statusList)) { + if (nextParams.statusList.length) { + nextParams.statusList = nextParams.statusList.join(',') + } else { + delete nextParams.statusList + } + } + return nextParams +} + +const stockQueryParamsSerializer = (params: any) => + qs.stringify(params, { allowDots: true, arrayFormat: 'repeat' }) // ERP 其它出库单 VO export interface StockOutVO { @@ -32,7 +49,12 @@ export interface StockOutApproveRecordVO { export const StockOutApi = { // 查询其它出库单分页 getStockOutPage: async (params: any) => { - return await request.get({ url: `/erp/stock-out/page`, params }) + const finalParams = normalizeStockQueryParams(params) + return await request.get({ + url: `/erp/stock-out/page`, + params: finalParams, + paramsSerializer: stockQueryParamsSerializer + }) }, // 查询其它出库单详情 @@ -85,7 +107,12 @@ export const StockOutApi = { // 导出其它出库单 Excel exportStockOut: async (params) => { - return await request.download({ url: `/erp/stock-out/export-excel`, params }) + const finalParams = normalizeStockQueryParams(params) + return await request.download({ + url: `/erp/stock-out/export-excel`, + params: finalParams, + paramsSerializer: stockQueryParamsSerializer + }) }, // 查询其它出库单分页 getMesStockOutPage: async (params: any) => { diff --git a/src/api/erp/stock/warehouse/index.ts b/src/api/erp/stock/warehouse/index.ts index b953eeb2..92b797ac 100644 --- a/src/api/erp/stock/warehouse/index.ts +++ b/src/api/erp/stock/warehouse/index.ts @@ -4,6 +4,7 @@ import request from '@/config/axios' export interface WarehouseVO { id: number // 仓库编号 name: string // 仓库名称 + categoryType?: number // 仓库分类 address: string // 仓库地址 sort: number // 排序 remark: string // 备注 @@ -49,8 +50,8 @@ export const WarehouseApi = { }, // 查询仓库精简列表 - getWarehouseSimpleList: async () => { - return await request.get({ url: `/erp/warehouse/simple-list` }) + getWarehouseSimpleList: async (params?: any) => { + return await request.get({ url: `/erp/warehouse/simple-list`, params }) }, // 查询仓库详情 diff --git a/src/locales/en.ts b/src/locales/en.ts index 7e6b3705..0d66d18f 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -267,6 +267,7 @@ ErpStock: { Warehouse: { name: 'Warehouse Name', + categoryType: 'Warehouse Category', status: 'Warehouse Status', address: 'Warehouse Address', warehousePrice: 'Storage Fee', @@ -277,12 +278,14 @@ defaultStatus: 'Default Status', createTime: 'Create Time', placeholderName: 'Please enter warehouse name', + placeholderCategoryType: 'Please select warehouse category', placeholderStatus: 'Please select warehouse status', placeholderAddress: 'Please enter warehouse address', placeholderPrincipal: 'Please enter principal', placeholderSort: 'Please enter sort', placeholderRemark: 'Please enter remark', validatorNameRequired: 'Warehouse name is required', + validatorCategoryTypeRequired: 'Warehouse category is required', validatorSortRequired: 'Sort is required', validatorStatusRequired: 'Status is required', confirmDefaultStatus: 'Are you sure to {action} "{name}" as default?', @@ -541,15 +544,41 @@ count: 'Quantity', price: 'Amount', totalPrice: 'Total Price', + sourceType: 'Source Type', + sourceTypeStock: 'By Stock', + sourceTypeProduct: 'By Product', + area: 'Area', + checkItem: 'Check Item', + stockCount: 'Stock Quantity', + actualCount: 'Actual Count', + inventoryCheck: 'Check', + materialCategory: 'Material Category', + materialSubCategory: 'Material Subcategory', + standard: 'Standard', + selectWarehouseDialogTitle: 'Select Warehouse', + selectAreaDialogTitle: 'Select Area', + selectProductDialogTitle: 'Select Product', + selectCheckItemDialogTitle: 'Select Check Item', + selectedItemCount: '{count} selected', + selectedTextSeparator: ', ', placeholderNo: 'Please enter check no', placeholderNoAuto: 'Auto-generated on save', placeholderProduct: 'Please select product', placeholderWarehouse: 'Please select warehouse', + placeholderArea: 'Please select area', + placeholderCheckItem: 'Please select check item', + placeholderProductBarCode: 'Please enter material code', + placeholderProductName: 'Please enter material name', placeholderCreator: 'Please select creator', placeholderStatus: 'Please select status', placeholderRemark: 'Please enter remark', placeholderCheckTime: 'Select check time', validatorCheckTimeRequired: 'Check time is required', + validatorSourceTypeRequired: 'Please select source type', + validatorSelectWarehouseFirst: 'Please select warehouse first', + validatorSelectAreaFirst: 'Please select area first', + validatorSelectProductFirst: 'Please select product first', + validatorSelectCheckItem: 'Please select check item', confirmApprove: 'Are you sure to approve this check order?', confirmReverseApprove: 'Are you sure to reverse approve this check order?', approveSuccess: 'Approve success', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 8553a215..431118c7 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -267,6 +267,7 @@ ErpStock: { Warehouse: { name: '仓库名称', + categoryType: '仓库分类', status: '仓库状态', address: '仓库地址', warehousePrice: '仓储费', @@ -277,12 +278,14 @@ defaultStatus: '是否默认', createTime: '创建时间', placeholderName: '请输入仓库名称', + placeholderCategoryType: '请选择仓库分类', placeholderStatus: '请选择仓库状态', placeholderAddress: '请输入仓库地址', placeholderPrincipal: '请输入负责人', placeholderSort: '请输入排序', placeholderRemark: '请输入备注', validatorNameRequired: '仓库名称不能为空', + validatorCategoryTypeRequired: '仓库分类不能为空', validatorSortRequired: '排序不能为空', validatorStatusRequired: '开启状态不能为空', confirmDefaultStatus: '确认要{action}"{name}"默认吗?', @@ -541,15 +544,41 @@ count: '数量', price: '金额', totalPrice: '合计金额', + sourceType: '生成来源', + sourceTypeStock: '按库存', + sourceTypeProduct: '按产品', + area: '库区', + checkItem: '盘点项', + stockCount: '库存数量', + actualCount: '实盘数量', + inventoryCheck: '盘点', + materialCategory: '物料大类', + materialSubCategory: '物料小类', + standard: '规格', + selectWarehouseDialogTitle: '选择仓库', + selectAreaDialogTitle: '选择库区', + selectProductDialogTitle: '选择产品', + selectCheckItemDialogTitle: '选择盘点项', + selectedItemCount: '已选择 {count} 项', + selectedTextSeparator: '、', placeholderNo: '请输入盘点单号', placeholderNoAuto: '保存时自动生成', placeholderProduct: '请选择产品', placeholderWarehouse: '请选择仓库', + placeholderArea: '请选择库区', + placeholderCheckItem: '请选择盘点项', + placeholderProductBarCode: '请输入物料编码', + placeholderProductName: '请输入物料名称', placeholderCreator: '请选择创建人', placeholderStatus: '请选择状态', placeholderRemark: '请输入备注', placeholderCheckTime: '选择盘点时间', validatorCheckTimeRequired: '盘点时间不能为空', + validatorSourceTypeRequired: '请选择生成来源', + validatorSelectWarehouseFirst: '请先选择仓库', + validatorSelectAreaFirst: '请先选择库区', + validatorSelectProductFirst: '请先选择产品', + validatorSelectCheckItem: '请选择盘点项', confirmApprove: '确定审批该盘点单吗?', confirmReverseApprove: '确定反审批该盘点单吗?', approveSuccess: '审批成功', diff --git a/src/views/erp/mold/detail/brand.vue b/src/views/erp/mold/detail/brand.vue index d5a08226..49cd7e53 100644 --- a/src/views/erp/mold/detail/brand.vue +++ b/src/views/erp/mold/detail/brand.vue @@ -157,7 +157,12 @@ - +
-
-
{{ t('MoldManagement.MoldBrandDetail.moldCode') }}{{ row.moldCode ?? '-' }}
-
{{ t('MoldManagement.MoldBrandDetail.repairStatus') }}{{ - getRepairStatusLabel(row.status) }}
-
{{ t('EquipmentManagement.DvRepair.repairStatus') }} +
+
基本信息
+
{{ t('MoldManagement.MoldBrandDetail.repairCode') }}{{ row.repairCode ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.repairName') }}{{ row.repairName ?? '-' }}
+
{{ t('MoldManagement.MoldBrandDetail.requireDate') }}{{ formatHistoryTime(row.requireDate) }}
+
{{ t('MoldManagement.MoldRepair.repairUser') }}{{ row.acceptedByName ?? row.acceptedName ?? row.acceptedBy ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.confirmUser') }}{{ row.confirmByName ?? row.confirmName ?? row.confirmBy ?? '-' }}
+
{{ t('MoldManagement.MoldBrandDetail.repairStatus') }}{{ + getRepairStatusLabel(row.status) }}
+
{{ t('EquipmentManagement.DvRepair.repairStatus') }}{{ getRepairResultLabel(row.repairStatus) }}
-
{{ t('MoldManagement.MoldBrandDetail.requireDate') }}{{ formatHistoryTime(row.requireDate) }}
-
{{ t('MoldManagement.MoldBrandDetail.finishDate') }}{{ formatHistoryTime(row.finishDate) }}
-
{{ t('MoldManagement.MoldRepair.faultImages') }} -
- +
+
维修对象
+
{{ t('MoldManagement.MoldRepair.moldName') }}{{ row.moldName ?? row.machineryName ?? '-' }}
+
{{ t('MoldManagement.MoldBrandDetail.moldCode') }}{{ row.moldCode ?? row.machineryCode ?? '-' }}
+
规格型号{{ row.machinerySpec ?? row.moldSpec ?? '-' }}
+
品牌{{ row.machineryBrand ?? row.moldBrand ?? '-' }}
+
+
+
故障信息
+
{{ t('MoldManagement.MoldRepair.faultLevel') }} + -
-
-
-
+ - +
+
{{ t('MoldManagement.MoldRepair.isShutdown') }}{{ formatBooleanLabel(row.shutdown ?? row.isShutdown) }}
+
{{ t('MoldManagement.MoldRepair.faultPhenomenon') }}{{ row.faultPhenomenon ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.faultDescription') }}{{ row.faultDescription ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.faultImages') }} +
+ +
+
-
+
+
{{ t('MoldManagement.MoldBrandDetail.remark') }}{{ row.remark ?? '-' }}
+
+
+
+
+ 处理结果 + + {{ isRepairResultExpanded(row) ? '收起' : '展开' }} + +
+
+
{{ t('MoldManagement.MoldRepair.repairResult') }}{{ + getRepairResultLabel(row.repairStatus) }}
+
{{ t('MoldManagement.MoldBrandDetail.finishDate') }}{{ formatHistoryTime(row.finishDate) }}
+
{{ t('MoldManagement.MoldRepair.confirmDate') }}{{ formatHistoryTime(row.confirmDate) }}
+
{{ t('MoldManagement.MoldRepair.downtimeDuration') }}{{ formatDowntimeDuration(row.downtimeDuration) }}
+
{{ t('MoldManagement.MoldRepair.faultReason') }}{{ row.faultReason ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.handlingMeasures') }}{{ row.handlingMeasures ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.replacementParts') }}{{ row.replacementParts ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.repairContent') }}{{ row.repairContent ?? '-' }}
+
{{ t('MoldManagement.MoldRepair.repairedImages') }} +
+ +
+
-
+
+
@@ -443,6 +549,7 @@ const installDateRange = ref() const installOperateType = ref() const moldList = ref([]) const repairActiveNames = ref([]) +const repairResultActiveNames = ref([]) const inspectionDateRange = ref() const maintainDateRange = ref() const repairDateRange = ref() @@ -485,6 +592,36 @@ const formatHistoryTime = (value: any) => { return String(raw) } +const formatBooleanLabel = (value: any) => { + if (value === undefined || value === null || value === '') return '-' + if (value === true || value === 1 || value === '1' || value === 'true') return t('common.yes') + if (value === false || value === 0 || value === '0' || value === 'false') return t('common.no') + return String(value) +} + +const formatDowntimeDuration = (value: any) => { + if (value === undefined || value === null || value === '') return '-' + return `${value}小时` +} + +const shouldShowRepairResult = (row: any) => { + const value = row?.repairStatus ?? row?.repairResult + const status = value === undefined || value === null || value === '' ? '0' : String(value) + return status !== '0' +} + +const getRepairRowKey = (row: any) => String(row?.id ?? row?.repairCode ?? '') + +const isRepairResultExpanded = (row: any) => repairResultActiveNames.value.includes(getRepairRowKey(row)) + +const toggleRepairResult = (row: any) => { + const key = getRepairRowKey(row) + if (!key) return + repairResultActiveNames.value = isRepairResultExpanded(row) + ? repairResultActiveNames.value.filter((item) => item !== key) + : [...repairResultActiveNames.value, key] +} + const parseImages = (value: any): string[] => { if (!value) return [] if (Array.isArray(value)) return value.map(String).filter(Boolean) @@ -782,6 +919,7 @@ const fetchRepairHistory = async () => { const data = await MoldRepairApi.getMoldRepairList(params) repairList.value = Array.isArray(data) ? data : [] repairActiveNames.value = repairList.value.map((row: any) => String(row.id ?? row.repairCode)) + repairResultActiveNames.value = [] } finally { repairLoading.value = false } @@ -1092,6 +1230,39 @@ onMounted(() => { margin-top: 10px; } +.device-ledger-repair-collapse { + border-top: 0; + border-bottom: 0; +} + +.device-ledger-repair-collapse :deep(.device-ledger-repair-collapse-item) { + overflow: hidden; + margin-bottom: 14px; + border: 1px solid var(--el-border-color-lighter); + border-radius: 10px; + background: #fff; + box-shadow: 0 2px 8px rgb(31 45 61 / 6%); +} + +.device-ledger-repair-collapse :deep(.device-ledger-repair-collapse-item:nth-child(even)) { + background: #fbfdff; +} + +.device-ledger-repair-collapse :deep(.device-ledger-repair-collapse-item:last-child) { + margin-bottom: 0; +} + +.device-ledger-repair-collapse :deep(.device-ledger-repair-collapse-item .el-collapse-item__header) { + height: 46px; + padding: 0 14px; + border-bottom-color: var(--el-border-color-lighter); + +} + +.device-ledger-repair-collapse :deep(.device-ledger-repair-collapse-item .el-collapse-item__content) { + padding: 14px; +} + .device-ledger-history-title, .device-ledger-repair-title { display: flex; @@ -1117,6 +1288,24 @@ onMounted(() => { border-radius: 12px; } +.device-ledger-repair-collapse .device-ledger-history-item { + position: relative; + padding: 16px; + border-color: var(--el-border-color); + background: #fff; +} + +.device-ledger-repair-collapse .device-ledger-history-item::before { + position: absolute; + top: 16px; + bottom: 16px; + left: 0; + width: 4px; + border-radius: 0 4px 4px 0; + background: var(--el-color-primary); + content: ''; +} + .device-ledger-history-item-head { display: flex; align-items: center; @@ -1129,6 +1318,50 @@ onMounted(() => { gap: 8px; } +.device-ledger-repair-overview { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; +} + +.device-ledger-repair-overview > .device-ledger-history-item-body { + padding: 12px; + border: 1px solid var(--el-border-color-lighter); + border-radius: 8px; + background: var(--el-fill-color-lighter); +} + +.device-ledger-repair-overview .device-ledger-history-item-row, +.device-ledger-repair-result .device-ledger-history-item-row { + grid-template-columns: 128px minmax(0, 1fr); +} + +.device-ledger-repair-result { + margin-top: 14px; + padding: 12px; + border: 1px solid var(--el-border-color-lighter); + border-radius: 8px; + background: var(--el-fill-color-lighter); +} + +.device-ledger-repair-result-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.device-ledger-repair-section-title { + margin-top: 4px; + padding-bottom: 2px; + font-weight: 600; + color: var(--el-text-color-primary); +} + +.device-ledger-repair-section-title:first-child { + margin-top: 0; +} + .device-ledger-history-item-row { display: grid; grid-template-columns: 88px minmax(0, 1fr); @@ -1143,6 +1376,11 @@ onMounted(() => { color: var(--el-text-color-secondary); } +.device-ledger-history-item-value { + min-width: 0; + word-break: break-word; +} + .device-ledger-repair-images { display: flex; flex-wrap: wrap; @@ -1192,5 +1430,9 @@ onMounted(() => { .mold-brand-detail__grid { grid-template-columns: 1fr; } + + .device-ledger-repair-overview { + grid-template-columns: 1fr; + } } diff --git a/src/views/erp/stock/checkExecution/components/StockCheckExecutionForm.vue b/src/views/erp/stock/checkExecution/components/StockCheckExecutionForm.vue new file mode 100644 index 00000000..520fc6a0 --- /dev/null +++ b/src/views/erp/stock/checkExecution/components/StockCheckExecutionForm.vue @@ -0,0 +1,846 @@ + + + + + diff --git a/src/views/erp/stock/checkExecution/index.vue b/src/views/erp/stock/checkExecution/index.vue new file mode 100644 index 00000000..fde8217c --- /dev/null +++ b/src/views/erp/stock/checkExecution/index.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/src/views/erp/stock/in/components/StockInItemForm.vue b/src/views/erp/stock/in/components/StockInItemForm.vue index 1bdb41c3..b2574a5e 100644 --- a/src/views/erp/stock/in/components/StockInItemForm.vue +++ b/src/views/erp/stock/in/components/StockInItemForm.vue @@ -301,6 +301,27 @@ const productCascaderOptions = computed(() => { return Array.from(map.values()) }) +const loadWarehouseList = async () => { + const categoryType = activeCategoryType.value + warehouseList.value = await WarehouseApi.getWarehouseSimpleList(categoryType ? { categoryType } : undefined) + const firstWarehouse = warehouseList.value[0] + defaultWarehouse.value = firstWarehouse + const warehouseIds = new Set((warehouseList.value || []).map((item) => item.id)) + formData.value.forEach((row) => { + if (row.warehouseId && !warehouseIds.has(row.warehouseId)) { + row.warehouseId = undefined + row.areaId = undefined + row.stockCount = 0 + } + if (!row.warehouseId && firstWarehouse?.id) { + row.warehouseId = firstWarehouse.id + row.areaId = undefined + row.stockCount = 0 + } + }) + warehouseAreaMap.value = {} +} + /** 初始化设置入库项 */ watch( () => props.items, @@ -317,6 +338,7 @@ watch( watch( () => props.inType, async () => { + await loadWarehouseList() if (isProductMaterialStockIn.value) { formData.value.forEach((row) => { row.inputCount = row.inputCount ?? row.count ?? 1 @@ -601,8 +623,7 @@ defineExpose({ validate, resetItems }) /** 初始化 */ onMounted(async () => { productList.value = await ProductApi.getProductSimpleList() - warehouseList.value = await WarehouseApi.getWarehouseSimpleList() - defaultWarehouse.value = warehouseList.value.find((item) => item.defaultStatus) + await loadWarehouseList() fillProductNames(formData.value) if (isProductMaterialStockIn.value) { await loadRowsWarehouseAreas(formData.value) diff --git a/src/views/erp/stock/in/index.vue b/src/views/erp/stock/in/index.vue index f384778c..e8ff9bef 100644 --- a/src/views/erp/stock/in/index.vue +++ b/src/views/erp/stock/in/index.vue @@ -78,11 +78,14 @@ /> - + { /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() + queryParams.statusList = [] queryParams.inType = activeName.value || stockInTypeOptions.value[0]?.value handleQuery() } diff --git a/src/views/erp/stock/out/components/StockOutItemForm.vue b/src/views/erp/stock/out/components/StockOutItemForm.vue index 85c3470d..7aa7e97a 100644 --- a/src/views/erp/stock/out/components/StockOutItemForm.vue +++ b/src/views/erp/stock/out/components/StockOutItemForm.vue @@ -498,6 +498,27 @@ const productCascaderOptions = computed(() => { return Array.from(map.values()) }) +const loadWarehouseList = async () => { + const categoryType = activeCategoryType.value + warehouseList.value = await WarehouseApi.getWarehouseSimpleList(categoryType ? { categoryType } : undefined) + const firstWarehouse = warehouseList.value[0] + defaultWarehouse.value = firstWarehouse + const warehouseIds = new Set((warehouseList.value || []).map((item) => item.id)) + formData.value.forEach((row) => { + if (row.warehouseId && !warehouseIds.has(row.warehouseId)) { + row.warehouseId = undefined + row.areaId = undefined + row.stockCount = 0 + } + if (!row.warehouseId && firstWarehouse?.id) { + row.warehouseId = firstWarehouse.id + row.areaId = undefined + row.stockCount = 0 + } + }) + warehouseAreaMap.value = {} +} + /** 初始化设置入库项 */ watch( () => props.items, @@ -516,6 +537,7 @@ watch( watch( () => props.outType, async () => { + await loadWarehouseList() if (isProductMaterialStockOut.value) { formData.value.forEach((row) => { normalizeRow(row) @@ -986,8 +1008,7 @@ defineExpose({ validate, resetItems }) /** 初始化 */ onMounted(async () => { productList.value = await ProductApi.getProductSimpleList() - warehouseList.value = await WarehouseApi.getWarehouseSimpleList() - defaultWarehouse.value = warehouseList.value.find((item) => item.defaultStatus) + await loadWarehouseList() fillProductNames(formData.value) if (isProductMaterialStockOut.value) { await loadRowsWarehouseAreas(formData.value) diff --git a/src/views/erp/stock/out/index.vue b/src/views/erp/stock/out/index.vue index f98d00b5..5c8e5d24 100644 --- a/src/views/erp/stock/out/index.vue +++ b/src/views/erp/stock/out/index.vue @@ -78,11 +78,14 @@ /> - + { /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value.resetFields() + queryParams.statusList = [] queryParams.outType = activeName.value || stockOutTypeOptions.value[0]?.value handleQuery() } diff --git a/src/views/erp/stock/record/index.vue b/src/views/erp/stock/record/index.vue index fb24253a..85776be5 100644 --- a/src/views/erp/stock/record/index.vue +++ b/src/views/erp/stock/record/index.vue @@ -16,12 +16,6 @@ - - - - - @@ -66,6 +60,15 @@ + + + + @@ -83,12 +86,6 @@ sortable /> - - - { showAllFilters.value = !showAllFilters.value @@ -229,6 +227,15 @@ const handleQuery = () => { /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() + activeName.value = '' + queryParams.categoryType = undefined + handleQuery() +} + +const handleTabClick = (tab: any) => { + const value = String(tab.paneName || '') + activeName.value = value + queryParams.categoryType = value ? Number(value) : undefined handleQuery() } diff --git a/src/views/erp/stock/stock/index.vue b/src/views/erp/stock/stock/index.vue index 1c7a16e6..cf131c6c 100644 --- a/src/views/erp/stock/stock/index.vue +++ b/src/views/erp/stock/stock/index.vue @@ -27,21 +27,6 @@ - - - - - + + + + - - - @@ -188,6 +177,7 @@ const queryParams = reactive<{ }) const queryFormRef = ref() // 搜索的表单 const exportLoading = ref(false) // 导出的加载中 +const activeName = ref('') const productList = ref([]) // 产品列表 const warehouseList = ref([]) // 仓库列表 const categoryTypeOptions = computed(() => getIntDictOptions(DICT_TYPE.MATERIAL_CLASSIFICATION_TYPE)) @@ -256,6 +246,15 @@ const handleQuery = () => { /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() + activeName.value = '' + queryParams.categoryType = undefined + handleQuery() +} + +const handleTabClick = (tab: any) => { + const value = String(tab.paneName || '') + activeName.value = value + queryParams.categoryType = value ? Number(value) : undefined handleQuery() } diff --git a/src/views/erp/stock/warehouse/WarehouseForm.vue b/src/views/erp/stock/warehouse/WarehouseForm.vue index 51254d9c..7df399da 100644 --- a/src/views/erp/stock/warehouse/WarehouseForm.vue +++ b/src/views/erp/stock/warehouse/WarehouseForm.vue @@ -14,6 +14,17 @@ + + + + {{ dict.label }} + + + { /** 重置表单 */ const resetForm = () => { + const categoryTypeOptions = getIntDictOptions(DICT_TYPE.MATERIAL_CLASSIFICATION_TYPE) formData.value = { id: undefined, name: undefined, + categoryType: categoryTypeOptions[0]?.value, address: undefined, sort: undefined, remark: undefined, diff --git a/src/views/erp/stock/warehouse/index.vue b/src/views/erp/stock/warehouse/index.vue index fe505046..9e524ff8 100644 --- a/src/views/erp/stock/warehouse/index.vue +++ b/src/views/erp/stock/warehouse/index.vue @@ -18,6 +18,21 @@ class="!w-240px" /> + + + + + + + +