From 55bfbaeb386476db8f9d0367c22e1b1ba666aff4 Mon Sep 17 00:00:00 2001 From: c Date: Tue, 10 Mar 2026 09:55:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=8D=95=EF=BC=8C=E5=85=A5=E5=BA=93=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E9=83=A8=E5=88=86=E5=BA=93=E5=AD=98=E7=9B=98=E7=82=B9?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/languages/locales/en-US.ts | 1 + src/common/languages/locales/zh-CN.ts | 18 +- src/composables/use-page.ts | 8 +- .../sale/repair-record/RepairRecordView.vue | 2 +- .../inventory-count/InventoryCountView.vue | 304 +++++++++++++++-- .../WarehouseReceiptView.vue | 316 +++++++++++++++--- 6 files changed, 568 insertions(+), 81 deletions(-) diff --git a/src/common/languages/locales/en-US.ts b/src/common/languages/locales/en-US.ts index ab2232c..480fb0c 100644 --- a/src/common/languages/locales/en-US.ts +++ b/src/common/languages/locales/en-US.ts @@ -68,6 +68,7 @@ export default { remark: "Remark", startdate: "Start Date", enddate: "End Date", + searchCode: "Doc No/Name/Remark", }, warehouse: { warehouse: { diff --git a/src/common/languages/locales/zh-CN.ts b/src/common/languages/locales/zh-CN.ts index 452c30f..9b80d63 100644 --- a/src/common/languages/locales/zh-CN.ts +++ b/src/common/languages/locales/zh-CN.ts @@ -68,6 +68,7 @@ export default { remark: "备注", startdate: "开始时间", enddate: "结束时间", + searchCode: "单据编号/名称/备注", }, warehouse: { warehouse: { @@ -128,15 +129,17 @@ export default { storeName: "仓库名称", storeId: "仓库", partNumber: "物料编号", - productSpec: "物料规格", + productSpec: "物料型号", productCount: "盘点数量", originalProductCount: "原始数量", diffCount: "差异数量", stockTakingMark: "盘点备注", - reserve1: "预留字段1", + reserve1: "单据类型", reserve2: "预留字段2", createDate: "创建时间", formStatus: "单据状态", + isInit: "初始库存", + searchCode: "单据编号/名称/备注", }, }, production: { @@ -489,6 +492,10 @@ export default { input_formMark: "请输入单据备注", delete_message: "删除入库单", input_formCode: "请输入单据编号", + input_partNumber: "请输入物料编号", + not_exist_partNumber: "物料编号不存在", + input_productCount: "请输入入库数量", + no_items: "请添加入库明细", approve_confirm: "是否审核通过", approve_success: "审核成功", approve_fail: "审核失败", @@ -507,7 +514,7 @@ export default { input_formMark: "请输入单据备注", input_formCode: "请输入单据编号", input_partNumber: "请输入物料编号", - input_productSpec: "请输入物料规格", + input_productSpec: "请输入物料型号", input_productCount: "请输入盘点数量", input_originalProductCount: "请输入原始数量", input_diffCount: "请输入差异数量", @@ -525,6 +532,8 @@ export default { import_success: "导入成功", import_fail: "导入失败", delete_message: "删除盘点单", + upload_countItems: "请上传盘点明细", + not_exist_partNumber: "物料编号不存在", }, }, production: { @@ -805,6 +814,9 @@ export default { warehousereceipt: { add: "添加入库单", edit: "编辑入库单", + showItem: "入库明细", + baseTitle: "入库单基本信息", + tableTitle: "入库明细", }, inventorycount: { add: "添加盘点单", diff --git a/src/composables/use-page.ts b/src/composables/use-page.ts index 2ba01a6..e043604 100644 --- a/src/composables/use-page.ts +++ b/src/composables/use-page.ts @@ -3,9 +3,15 @@ import { $t } from "@/common/languages"; import { ElMessage, ElMessageBox } from "element-plus"; import BasePageableTable from "@/components/base/base-pageable-table/BasePageableTable.vue"; import ExpandablePageableTable from "@/components/base/expandable-pageable-table/ExpandablePageableTable.vue"; +import type TreeSidePageableTable from "@/components/base/treeside-pageable-table/TreeSidePageableTable.vue"; export const usePage = ( - tableRef: Ref | InstanceType | null> + tableRef: Ref< + | InstanceType + | InstanceType + | InstanceType + | null + > ) => { const postForm = (url: string, form: any, visible: Ref, type: string) => { post(url, form) diff --git a/src/views/sale/repair-record/RepairRecordView.vue b/src/views/sale/repair-record/RepairRecordView.vue index 2121c77..98b68a9 100644 --- a/src/views/sale/repair-record/RepairRecordView.vue +++ b/src/views/sale/repair-record/RepairRecordView.vue @@ -1,11 +1,11 @@ diff --git a/src/views/warehouse/warehouse-receipt/WarehouseReceiptView.vue b/src/views/warehouse/warehouse-receipt/WarehouseReceiptView.vue index 689e896..a2fefbc 100644 --- a/src/views/warehouse/warehouse-receipt/WarehouseReceiptView.vue +++ b/src/views/warehouse/warehouse-receipt/WarehouseReceiptView.vue @@ -3,62 +3,130 @@ import BasePageableTable from "@/components/base/base-pageable-table/BasePageabl import DefaultToolButton from "@/components/base/default-tool-button/DefaultToolButton.vue"; import DefaultOperateButtonColumn from "@/components/base/default-column/DefaultOperateButtonColumn.vue"; import { usePage } from "@/composables/use-page"; -import BaseForm from "@/components/base/base-form/BaseForm.vue"; +import BaseFormWithTable from "@/components/base/base-form-with-table/BaseFormWithTable.vue"; +import BaseSelect from "@/components/base/base-select/BaseSelect.vue"; import { $t } from "@/common/languages"; import type { FormInstance, FormRules } from "element-plus"; import { formatDate } from "@/common/utils/format-utils"; - -/** - * 必须要的变量 - */ +import ExpandablePageableTable from "@/components/base/expandable-pageable-table/ExpandablePageableTable.vue"; +import DefaultStatusSwitchColumn from "@/components/base/default-column/DefaultStatusSwitchColumn.vue"; +import { useStatus } from "@/common/languages/mapping/base-info-mapping"; +import { get, post } from "@/common/http/request"; +import { ElMessage } from "element-plus"; +import { ref } from "vue"; +import { generateDucumentNo } from "@/common/utils/document-no-generator/document-no-generator"; +import { DocumentType } from "@/common/enums/DocumentType"; +import { type FieldMappingConfig } from "@/components/base/base-form-with-table/type"; +import BaseItemDialog from "@/components/base/base-item-dialog/BaseItemDialog.vue"; const getPageUrl = "/warehouse/warehousereceipt/getWarehouseReceiptPage"; +const getItemUrl = "/warehouse/warehousereceipt/getWarehouseReceiptDetail"; const addUrl = "/warehouse/warehousereceipt/addWarehouseReceipt"; const editUrl = "/warehouse/warehousereceipt/updateWarehouseReceipt"; const removeUrl = "/warehouse/warehousereceipt/deleteWarehouseReceipt"; -const searchers = [ - { name: "searchCode", type: "text" as const, placeholder: $t("_prop.warehouse.warehousereceipt.searchCode") }, -]; +const approveUrl = "/warehouse/warehousereceipt/approveWarehouseReceipt"; +const rejectUrl = "/warehouse/warehousereceipt/rejectWarehouseReceipt"; +const partNumberExistsUrl = "/warehouse/warehouseitem/existsWarehouseItem"; +const getWarehouseSelectListUrl = "/warehouse/warehouse/getWarehouseSelectList"; + +const searchers = [{ name: "searchCode", type: "text" as const, placeholder: $t("_prop.common.searchCode") }]; + +const tableRef = ref | null>(null); +const { useAdd, useEdit, useRemove, useGeneralPageRef, useApprove, useReject } = usePage(tableRef); +const { title, visible, formType, form, itemVisible, itemParentId } = useGeneralPageRef(); +const { getFormStatusLabel } = useStatus(); +const baseFormWithTableRef = ref>(); +const warehouseSelectRef = ref>(); + +const itemArrayName = "receiptItems"; + const rules = reactive({ - storeId: [{ required: true, message: $t("_message.warehouse.warehousereceipt.input_storeId"), trigger: "blur" }], + storeNo: [{ required: true, message: $t("_message.warehouse.warehousereceipt.select_storeId"), trigger: "change" }], + storeName: [{ required: true, message: $t("_message.warehouse.warehousereceipt.select_storeId"), trigger: "change" }], + formCode: [{ required: true, message: $t("_message.warehouse.warehousereceipt.input_formCode"), trigger: "blur" }], formName: [{ required: true, message: $t("_message.warehouse.warehousereceipt.input_formName"), trigger: "blur" }], - formMark: [{ required: true, message: $t("_message.warehouse.warehousereceipt.input_formMark"), trigger: "blur" }], + formMark: [{ required: false, message: $t("_message.warehouse.warehousereceipt.input_formMark"), trigger: "blur" }], + receiptItems: [ + { + required: true, + validator: (rule, value, callback) => { + if (value === undefined || value.length === 0) { + callback($t("_message.warehouse.warehousereceipt.no_items")); + } + callback(); + }, + trigger: "change", + }, + ], }); -/** - * 基本不变通用变量 - */ -const tableRef = ref | null>(null); -const { useAdd, useEdit, useRemove, useGeneralPageRef } = usePage(tableRef); -const { title, visible, formType, form } = useGeneralPageRef(); -/** - * 可以自定义的变量 - */ + +const mappingConfig: FieldMappingConfig = { + partNumber: { + sourceKey: ["商品编号", "物料编号", "partNumber"], + defaultValue: "", + }, + productSpec: { + sourceKey: ["型号", "物料型号", "productSpecs", "productSpec"], + defaultValue: "", + }, + productCount: { + sourceKey: ["数量", "入库数量", "productCount"], + defaultValue: 0, + transform: (val: any) => { + const num = Number(val); + return isNaN(num) ? 0 : num; + }, + }, +}; const add = () => { - form.value = {}; + form.value = { + formCode: generateDucumentNo(DocumentType.WarehouseReceipt), + formName: "", + formMark: "", + storeNo: null, + storeName: "", + receiptItems: [], + }; title.value = "_title.warehouse.warehousereceipt.add"; visible.value = true; formType.value = false; }; + const edit = (row: any) => { title.value = "_title.warehouse.warehousereceipt.edit"; form.value = { ...row }; + // 加载明细数据 + get(getItemUrl, { id: row.id }) + .then(res => { + if (res.code === 0) { + form.value.receiptItems = res.data || []; + } + }) + .catch(() => { + form.value.receiptItems = []; + }); visible.value = true; formType.value = true; }; + const remove = (row: any) => { useRemove(removeUrl, row.id, "_message.warehouse.warehousereceipt.delete_message"); }; -const submit = (form: any, formRef: FormInstance | undefined) => { - if (formRef !== undefined) { - formRef.validate(valid => { - if (valid) { - if (formType.value) useEdit(editUrl, form, visible); - else useAdd(addUrl, form, visible); - } - }); - } + +const showItem = (row: any) => { + itemParentId.value = row.id; + itemVisible.value = true; }; + +const approve = (row: any) => { + useApprove(approveUrl, row.id, "_message.warehouse.warehousereceipt.approve_confirm"); +}; + +const reject = (row: any) => { + useReject(rejectUrl, row.id, "_message.warehouse.warehousereceipt.reject_confirm"); +}; + const topButtonClick = (eventName: string) => { switch (eventName) { case "add": @@ -66,6 +134,7 @@ const topButtonClick = (eventName: string) => { break; } }; + const operateButtonClick = (eventName: string, row: any) => { switch (eventName) { case "edit": @@ -74,36 +143,197 @@ const operateButtonClick = (eventName: string, row: any) => { case "remove": remove(row); break; + case "showItem": + showItem(row); + break; + case "approve": + approve(row); + break; + case "reject": + reject(row); + break; } }; + +const authShowFunc = (row: any, button: globalThis.ButtonProp) => { + if (row.formStatus === 0 && button.eventName === "reject") return false; + if (row.formStatus === 1 && button.eventName === "approve") return false; + if (row.formStatus === 1 && button.eventName === "edit") return false; + return true; +}; + +const submit = (form: any, formRef: FormInstance | undefined) => { + const targetRef = formRef || (baseFormWithTableRef.value as any)?.baseFormRef; + if (!targetRef) return; + + // 从 BaseSelect 获取仓库名称 + const storeName = warehouseSelectRef.value?.getLabel(); + if (storeName) { + form.storeName = storeName; + } + + targetRef.validate((valid: any) => { + if (valid) { + if (formType.value) useEdit(editUrl, form, visible); + else useAdd(addUrl, form, visible); + } + }); +};