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";
+};
+
- {{ getLabel(scope.row[statusParamName]) }}
+
+ {{ getLabel(scope.row[statusParamName]) }}
+
-
+
+
change(val, scope.row)"
@@ -54,6 +67,21 @@ const getLabel = (code: number | null) => {
"
/>
+
+
+ {{ getLabel(scope.row[statusParamName]) }}
+
diff --git a/src/router/routes/dynamic.ts b/src/router/routes/dynamic.ts
index 1cc65cd..448e556 100644
--- a/src/router/routes/dynamic.ts
+++ b/src/router/routes/dynamic.ts
@@ -83,7 +83,7 @@ export const dynamicRoutes: RouterConfigRaw[] = [
component: "/systemset/vendor/form",
meta: {
title: "总表",
- icon: Compass,
+ icon: "ep:Compass",
},
},
];
diff --git a/src/views/sale/device-sn/DeviceSnView.vue b/src/views/sale/device-sn/DeviceSnView.vue
index 96d23b6..345ace6 100644
--- a/src/views/sale/device-sn/DeviceSnView.vue
+++ b/src/views/sale/device-sn/DeviceSnView.vue
@@ -1,18 +1,25 @@
@@ -22,21 +29,19 @@ const searchers = [
:searchers="searchers"
ref="tableRef"
:tree-side-url="treeSideUrl"
- tree-side-node-name="keyAccountId"
+ tree-side-node-name="id"
tree-side-param-name="keyAccountId"
- tree-side-title="所有客户"
+ :tree-side-title="$t('_message.common.all_customers')"
>
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
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 @@
-
+
-
-
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.totalPrice?.toFixed(2) || "0.00" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+