From e7ac6b5f625ee84182cb3e268b24aa00e462a8d4 Mon Sep 17 00:00:00 2001 From: c Date: Thu, 12 Mar 2026 16:26:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=20SN=20=E6=BA=AF?= =?UTF-8?q?=E6=BA=90=E3=80=81=E9=94=80=E5=94=AE=E7=AE=A1=E7=90=86=E5=92=8C?= =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E8=AE=B0=E5=BD=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 20 + src/common/languages/locales/zh-CN.ts | 43 ++- .../DefaultStatusSwitchColumn.vue | 32 +- src/router/routes/dynamic.ts | 2 +- src/views/sale/device-sn/DeviceSnView.vue | 35 +- .../sale/repair-record/RepairRecordView.vue | 143 ++++++- src/views/sale/sale-order/SaleOrderView.vue | 348 ++++++++++++++++-- 8 files changed, 556 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index 1cfaf29..704b11f 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "@icon-park/vue-next": "^1.4.2", + "@remixicon/vue": "^4.9.0", "@vueuse/core": "^13.7.0", "axios": "^1.11.0", "decimal.js": "^10.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fd73cd..dfca53e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@icon-park/vue-next': specifier: ^1.4.2 version: 1.4.2(vue@3.5.18(typescript@5.9.2)) + '@remixicon/vue': + specifier: ^4.9.0 + version: 4.9.0(vue@3.5.18(typescript@5.9.2)) '@vueuse/core': specifier: ^13.7.0 version: 13.7.0(vue@3.5.18(typescript@5.9.2)) @@ -44,6 +47,9 @@ importers: qs: specifier: ^6.14.0 version: 6.14.0 + remixicon: + specifier: ^4.9.1 + version: 4.9.1 sortablejs: specifier: ^1.15.6 version: 1.15.6 @@ -913,6 +919,11 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@remixicon/vue@4.9.0': + resolution: {integrity: sha512-4P0MY5ScL+MRLnHu1iT3xHAsliBwOGDIgSgHCZhSj2wkLa5NzqiQ4SGD/04VoHM+BRr8+xjmF7ZemkOUlMDJ3A==} + peerDependencies: + vue: '>= 3' + '@rolldown/pluginutils@1.0.0-beta.26': resolution: {integrity: sha512-r/5po89voz/QRPDmoErL10+hVuTAuz1SHvokx+yWBlOIPB5C41jC7QhLqq9kaebx/+EHyoV3z22/qBfX81Ns8A==} @@ -4249,6 +4260,9 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} + remixicon@4.9.1: + resolution: {integrity: sha512-36gLSoujkabnCFZFDyP17VNh9piuBA/rsXUb4auSJWLGsHVXtmxLj/EM5FjaEAGnk8oIAj1Azob/DZ2N+90lAQ==} + repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} @@ -6040,6 +6054,10 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@remixicon/vue@4.9.0(vue@3.5.18(typescript@5.9.2))': + dependencies: + vue: 3.5.18(typescript@5.9.2) + '@rolldown/pluginutils@1.0.0-beta.26': {} '@rolldown/pluginutils@1.0.0-beta.29': {} @@ -9657,6 +9675,8 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + remixicon@4.9.1: {} + repeat-element@1.1.4: {} repeat-string@1.6.1: {} diff --git a/src/common/languages/locales/zh-CN.ts b/src/common/languages/locales/zh-CN.ts index 4f1325c..edf30ba 100644 --- a/src/common/languages/locales/zh-CN.ts +++ b/src/common/languages/locales/zh-CN.ts @@ -320,6 +320,7 @@ export default { customerName: "客户名称", customerId: "客户", partNumber: "物料编号", + productSpecs: "物料型号", saleCount: "销售数量", price: "单价", totalPrice: "总价", @@ -333,7 +334,7 @@ export default { serialNum: "序列号", productSn: "SN 号", repairMark: "返修记录", - outProductDate: "出货时间", + outProductDate: "出货日期", productType: "型号", mac: "MAC 地址", alNum: "算法标志", @@ -354,6 +355,11 @@ export default { manufacturingDate: "生产日期", mark: "备注", keyAccountId: "客户", + repairCount: "维修次数", + serialNum: "序列号", + softVersion: "软件版本", + alVersion: "算法版本", + createDate: "创建日期", }, }, systemset: { @@ -456,6 +462,7 @@ export default { reject_success: "反审成功", reject_fail: "反审失败", reject_cannel: "反审取消", + all_customers: "所有客户", }, warehouse: { warehouse_item: { @@ -680,15 +687,6 @@ export default { input_productSn: "请输入SN号", input_mac: "请输入MAC地址", }, - repairrecord: { - input_productSn: "请输入SN号", - input_mac: "请输入MAC地址", - input_repairStatus: "请选择维修状态", - input_repairDate: "请输入维修日期", - input_manufacturingDate: "请输入生产日期", - input_mark: "请输入备注", - input_repairMark: "请输入返修记录", - }, }, purchase: { purchase_plan: { @@ -780,6 +778,24 @@ export default { import_fail: "导入失败", delete_message: "删除销售订单", }, + repairrecord: { + input_productSn: "请输入SN号", + input_mac: "请输入MAC地址", + input_repairStatus: "请选择维修状态", + input_repairDate: "请输入维修日期", + input_manufacturingDate: "请输入生产日期", + input_mark: "请输入备注", + input_repairMark: "请输入返修记录", + input_repair_mark: "请输入返修记录", + input_identifier: "SN号、MAC地址、序列号至少填写一个", + delete_message: "删除维修记录", + identifier_tip: "提示:SN号、MAC地址、序列号三者至少填写一个", + input_productSn_optional: "SN号(选填)", + input_mac_optional: "MAC地址(选填)", + input_serialNum_optional: "序列号(选填)", + input_softVersion_optional: "软件版本(选填)", + input_alVersion_optional: "算法版本(选填)", + }, }, systemset: { vendor: { @@ -915,6 +931,13 @@ export default { saleorder: { add: "添加销售订单", edit: "编辑销售订单", + showItem: "销售明细", + baseTitle: "销售订单基本信息", + tableTitle: "销售明细", + }, + repairrecord: { + add: "添加维修记录", + edit: "编辑维修记录", }, }, systemset: { diff --git a/src/components/base/default-column/DefaultStatusSwitchColumn.vue b/src/components/base/default-column/DefaultStatusSwitchColumn.vue index dcdc168..936b085 100644 --- a/src/components/base/default-column/DefaultStatusSwitchColumn.vue +++ b/src/components/base/default-column/DefaultStatusSwitchColumn.vue @@ -7,6 +7,7 @@ import { useStatus } from "@/common/languages/mapping/base-info-mapping"; const props = defineProps({ tableEl: ref, statusLabelMapping: Function, + tagTypeMapping: Function, statusParamName: { type: String, default: "status", @@ -37,14 +38,26 @@ const getLabel = (code: number | null) => { if (props.statusLabelMapping === undefined) return getCommonStatusLabel(code); return props.statusLabelMapping(code); }; + +const getTagType = (code: number | null): string => { + if (props.tagTypeMapping !== undefined) { + return props.tagTypeMapping(code); + } + // 默认逻辑:switchOnValue 为 success,其他为 info + return code === props.switchOnValue ? "success" : "info"; +}; diff --git a/src/views/sale/repair-record/RepairRecordView.vue b/src/views/sale/repair-record/RepairRecordView.vue index 98b68a9..201a39b 100644 --- a/src/views/sale/repair-record/RepairRecordView.vue +++ b/src/views/sale/repair-record/RepairRecordView.vue @@ -6,26 +6,64 @@ import BaseForm from "@/components/base/base-form/BaseForm.vue"; import { $t } from "@/common/languages"; import type { FormInstance, FormRules } from "element-plus"; import TreeSidePageableTable from "@/components/base/treeside-pageable-table/TreeSidePageableTable.vue"; +import { get } from "@/common/http/request"; /** * 必须要的变量 */ -const getPageUrl = "/sale/repairrecord/getRepairRecordPage"; +const getPageUrl = "/sale/repairrecord/getRepairReportPage"; const addUrl = "/sale/repairrecord/addRepairRecord"; const editUrl = "/sale/repairrecord/updateRepairRecord"; const removeUrl = "/sale/repairrecord/deleteRepairRecord"; -const treeSideUrl = "/sale/repairrecord/getKeyAccount"; +const treeSideUrl = "/sys/keyaccount/getKeyAccountTree"; +const keyAccountSelectUrl = "/sys/keyaccount/getKeyAccountSelectList"; const searchers = [ - { name: "searchCode", type: "text" as const, placeholder: $t("_prop.sale.repairrecord.searchCode") }, + { + name: "searchCode", + type: "text" as const, + placeholder: $t("_prop.sale.repairrecord.productSn") + "/" + $t("_prop.sale.repairrecord.mac"), + clearable: true, + }, ]; -const rules = reactive({}); + +const validateIdentifier = (_rule: any, _value: any, callback: any) => { + const formData = form.value; + if (formData.productSn || formData.mac || formData.serialNum) { + callback(); + } else { + callback(new Error($t("_message.sale.repairrecord.input_identifier"))); + } +}; + +const rules = reactive({ + repairMark: [{ required: true, message: $t("_message.sale.repairrecord.input_repair_mark"), trigger: "blur" }], + productSn: [{ validator: validateIdentifier, trigger: "blur" }], +}); + +const keyAccountOptions = ref<{ label: string; value: string }[]>([]); + +const loadKeyAccountOptions = async () => { + const res = await get(keyAccountSelectUrl); + if (res.data) { + keyAccountOptions.value = res.data.map((item: { label: string; value: string }) => ({ + label: item.label, + value: item.value, + })); + } +}; + +onMounted(() => { + loadKeyAccountOptions(); +}); + /** * 基本不变通用变量 */ const tableRef = ref | null>(null); const { useAdd, useEdit, useRemove, useGeneralPageRef } = usePage(tableRef); const { title, visible, formType, form } = useGeneralPageRef(); + /** * 可以自定义的变量 */ @@ -36,25 +74,32 @@ const add = () => { visible.value = true; formType.value = false; }; + const edit = (row: any) => { title.value = "_title.sale.repairrecord.edit"; form.value = { ...row }; visible.value = true; formType.value = true; }; + const remove = (row: any) => { useRemove(removeUrl, row.id, "_message.sale.repairrecord.delete_message"); }; -const submit = (form: any, formRef: FormInstance | undefined) => { + +const submit = (formData: any, formRef: FormInstance | undefined) => { if (formRef !== undefined) { formRef.validate(valid => { if (valid) { - if (formType.value) useEdit(editUrl, form, visible); - else useAdd(addUrl, form, visible); + if (formType.value) { + useEdit(editUrl, formData, visible); + } else { + useAdd(addUrl, formData, visible); + } } }); } }; + const topButtonClick = (eventName: string) => { switch (eventName) { case "add": @@ -62,6 +107,7 @@ const topButtonClick = (eventName: string) => { break; } }; + const operateButtonClick = (eventName: string, row: any) => { switch (eventName) { case "edit": @@ -79,27 +125,98 @@ const operateButtonClick = (eventName: string, row: any) => { :searchers="searchers" ref="tableRef" :tree-side-url="treeSideUrl" - tree-side-node-name="keyAccountId" - tree-side-param-name="keyAccountId" - tree-side-title="所有客户" + tree-side-node-name="id" + tree-side-param-name="keyAccountIdSearch" + :tree-side-title="$t('_message.common.all_customers')" > diff --git a/src/views/sale/sale-order/SaleOrderView.vue b/src/views/sale/sale-order/SaleOrderView.vue index 541f2b3..c392d0f 100644 --- a/src/views/sale/sale-order/SaleOrderView.vue +++ b/src/views/sale/sale-order/SaleOrderView.vue @@ -1,12 +1,17 @@