|
|
@@ -3,10 +3,10 @@
|
|
|
<!-- ── 查询栏 ── -->
|
|
|
<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
|
|
|
<el-form-item label="关键字">
|
|
|
- <el-input v-model="query.keyword" placeholder="规则名称/编码" clearable style="width: 180px" />
|
|
|
+ <el-input v-model="query.keyword" placeholder="名称/来源表/工单字段" clearable style="width: 200px" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="生效">
|
|
|
- <el-select v-model="query.isEnabled" clearable placeholder="全部" style="width: 100px">
|
|
|
+ <el-form-item label="是否生效">
|
|
|
+ <el-select v-model="query.isActive" clearable placeholder="全部" style="width: 100px">
|
|
|
<el-option label="是" :value="true" />
|
|
|
<el-option label="否" :value="false" />
|
|
|
</el-select>
|
|
|
@@ -14,36 +14,41 @@
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="loadList">查询</el-button>
|
|
|
<el-button @click="resetQuery">重置</el-button>
|
|
|
- <el-button type="success" @click="openCreate">新增规则</el-button>
|
|
|
- <el-button @click="configDialogVisible = true">配置维护</el-button>
|
|
|
+ <el-button type="success" @click="openCreate">新增配置</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
|
|
|
<!-- ── 主列表 ── -->
|
|
|
<el-table :data="rows" v-loading="loading" border stripe style="width: 100%" max-height="calc(100vh - 260px)">
|
|
|
- <el-table-column prop="name" label="规则名称" min-width="160" show-overflow-tooltip />
|
|
|
- <el-table-column label="客户类型" width="120" show-overflow-tooltip>
|
|
|
- <template #default="{ row }">{{ row.customerTypeLabel || '—' }}</template>
|
|
|
+ <el-table-column prop="descr" label="名称" min-width="150" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.descr || '—' }}</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="订单类型" width="120" show-overflow-tooltip>
|
|
|
- <template #default="{ row }">{{ row.orderTypeLabel || '—' }}</template>
|
|
|
+ <el-table-column prop="value" label="工单字段" width="130" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.value || '—' }}</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="交期条件" width="100" show-overflow-tooltip>
|
|
|
- <template #default="{ row }">{{ row.dueStatusLabel || '—' }}</template>
|
|
|
+ <el-table-column prop="priority" label="优先级" width="80" align="center" />
|
|
|
+ <el-table-column prop="sourceTable" label="来源表" width="140" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.sourceTable || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="sourceColumn" label="来源字段" width="130" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.sourceColumn || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="排序" width="80" align="center">
|
|
|
+ <template #default="{ row }">{{ orderByDisplay(row) }}</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="priorityLevel" label="优先级" width="80" align="center" />
|
|
|
- <el-table-column prop="sortDirection" label="排序方向" width="88" align="center" />
|
|
|
<el-table-column label="是否生效" width="88" align="center">
|
|
|
<template #default="{ row }">
|
|
|
- <el-tag :type="row.isEnabled ? 'success' : 'info'" size="small">{{ row.isEnabled ? '是' : '否' }}</el-tag>
|
|
|
+ <el-tag :type="row.isActive ? 'success' : 'info'" size="small">{{ row.isActive ? '是' : '否' }}</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="remark" label="备注" min-width="140" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="domainCode" label="工厂域" width="100" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.domainCode || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
<el-table-column label="操作" width="200" fixed="right" align="center">
|
|
|
<template #default="{ row }">
|
|
|
<el-button link type="primary" @click="openEdit(row)">编辑</el-button>
|
|
|
- <el-button link :type="row.isEnabled ? 'warning' : 'success'" @click="toggleEnabled(row)">
|
|
|
- {{ row.isEnabled ? '停用' : '生效' }}
|
|
|
+ <el-button link :type="row.isActive ? 'warning' : 'success'" @click="toggleActive(row)">
|
|
|
+ {{ row.isActive ? '停用' : '生效' }}
|
|
|
</el-button>
|
|
|
<el-button link type="danger" @click="onDelete(row)">删除</el-button>
|
|
|
</template>
|
|
|
@@ -62,177 +67,99 @@
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- <!-- ── 新增/编辑规则弹窗 ── -->
|
|
|
+ <!-- ── 新增/编辑配置弹窗 ── -->
|
|
|
<el-dialog
|
|
|
- v-model="ruleDialogVisible"
|
|
|
- :title="ruleDialogTitle"
|
|
|
- width="680px"
|
|
|
+ v-model="formDialogVisible"
|
|
|
+ :title="formDialogTitle"
|
|
|
+ width="720px"
|
|
|
destroy-on-close
|
|
|
- @closed="resetRuleForm"
|
|
|
+ @closed="resetForm"
|
|
|
>
|
|
|
- <el-form ref="ruleFormRef" :model="ruleForm" :rules="ruleFormRules" label-width="110px">
|
|
|
+ <el-form ref="formRef" :model="form" :rules="formRules" label-width="110px">
|
|
|
<el-row :gutter="16">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="规则编码" prop="code">
|
|
|
- <el-input v-model="ruleForm.code" placeholder="可自动填充或手动输入" />
|
|
|
+ <el-form-item label="名称" prop="descr">
|
|
|
+ <el-input v-model="form.descr" placeholder="优先级配置名称" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="规则名称" prop="name">
|
|
|
- <el-input v-model="ruleForm.name" />
|
|
|
+ <el-form-item label="工单字段">
|
|
|
+ <el-input v-model="form.value" placeholder="工单表字段(Value)" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="客户类型">
|
|
|
- <el-select v-model="ruleForm.customerType" clearable placeholder="不限" style="width: 100%">
|
|
|
- <el-option
|
|
|
- v-for="opt in dictOptions.customerType"
|
|
|
- :key="opt.value"
|
|
|
- :label="opt.label"
|
|
|
- :value="opt.value"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="优先级" prop="priority">
|
|
|
+ <el-input-number v-model="form.priority" :min="0" style="width: 100%" controls-position="right" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="订单类型">
|
|
|
- <el-select v-model="ruleForm.orderType" clearable placeholder="不限" style="width: 100%">
|
|
|
- <el-option
|
|
|
- v-for="opt in dictOptions.orderType"
|
|
|
- :key="opt.value"
|
|
|
- :label="opt.label"
|
|
|
- :value="opt.value"
|
|
|
- />
|
|
|
+ <el-form-item label="排序方向">
|
|
|
+ <el-select v-model="form.orderBy" clearable placeholder="未设置" style="width: 100%">
|
|
|
+ <el-option label="正序" :value="true" />
|
|
|
+ <el-option label="倒序" :value="false" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="交期条件">
|
|
|
- <el-select v-model="ruleForm.dueStatus" clearable placeholder="不限" style="width: 100%">
|
|
|
- <el-option
|
|
|
- v-for="opt in dictOptions.dueStatus"
|
|
|
- :key="opt.value"
|
|
|
- :label="opt.label"
|
|
|
- :value="opt.value"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="来源表">
|
|
|
+ <el-input v-model="form.sourceTable" placeholder="来源表" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="优先级" prop="priorityLevel">
|
|
|
- <el-input-number v-model="ruleForm.priorityLevel" :min="1" style="width: 100%" controls-position="right" />
|
|
|
+ <el-form-item label="来源字段">
|
|
|
+ <el-input v-model="form.sourceColumn" placeholder="来源表字段" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="排序方向">
|
|
|
- <el-select v-model="ruleForm.sortDirection" style="width: 100%">
|
|
|
- <el-option label="升序 ASC" value="asc" />
|
|
|
- <el-option label="降序 DESC" value="desc" />
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="来源字段类型">
|
|
|
+ <el-input v-model="form.sourceType" placeholder="来源字段类型" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="是否生效">
|
|
|
- <el-switch v-model="ruleForm.isEnabled" />
|
|
|
+ <el-form-item label="来源关联字段">
|
|
|
+ <el-input v-model="form.sourceId" placeholder="来源表关联字段" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="工单字段类型">
|
|
|
+ <el-input v-model="form.valueType" placeholder="工单字段类型" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="工单关联字段">
|
|
|
+ <el-input v-model="form.valueId" placeholder="工单表关联字段" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="备注">
|
|
|
- <el-input v-model="ruleForm.remark" type="textarea" :rows="2" />
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="工厂域">
|
|
|
+ <el-input v-model="form.domainCode" placeholder="工厂域编码(Domain)" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="是否生效">
|
|
|
+ <el-switch v-model="form.isActive" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
- <el-button @click="ruleDialogVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" :loading="ruleSaving" @click="submitRuleForm">保存</el-button>
|
|
|
+ <el-button @click="formDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" :loading="saving" @click="submitForm">保存</el-button>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
-
|
|
|
- <!-- ── 配置维护弹窗 ── -->
|
|
|
- <el-dialog
|
|
|
- v-model="configDialogVisible"
|
|
|
- title="订单优先级配置维护"
|
|
|
- width="860px"
|
|
|
- destroy-on-close
|
|
|
- @open="loadFieldMapping"
|
|
|
- >
|
|
|
- <el-tabs v-model="configActiveTab">
|
|
|
- <!-- Tab 1: 客户类型 -->
|
|
|
- <el-tab-pane label="客户类型" name="customerType">
|
|
|
- <DictDataMaintainPanel
|
|
|
- dict-code="s0_order_priority_customer_type"
|
|
|
- @changed="loadDictSelects"
|
|
|
- />
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <!-- Tab 2: 订单类型 -->
|
|
|
- <el-tab-pane label="订单类型" name="orderType">
|
|
|
- <DictDataMaintainPanel
|
|
|
- dict-code="s0_order_type"
|
|
|
- @changed="loadDictSelects"
|
|
|
- />
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <!-- Tab 3: 交期规则 -->
|
|
|
- <el-tab-pane label="交期规则" name="dueStatus">
|
|
|
- <DictDataMaintainPanel
|
|
|
- dict-code="s0_due_status"
|
|
|
- :allow-delete="false"
|
|
|
- @changed="loadDictSelects"
|
|
|
- />
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <!-- Tab 4: 字段映射 -->
|
|
|
- <el-tab-pane label="字段映射" name="fieldMapping">
|
|
|
- <div class="field-mapping-panel">
|
|
|
- <el-alert
|
|
|
- type="info"
|
|
|
- :closable="false"
|
|
|
- title="字段映射来源于现有优先级规则字段配置"
|
|
|
- description="来源实体、来源字段、工单字段等字段映射信息在各条业务规则中独立维护,请通过「编辑规则」进行调整。"
|
|
|
- />
|
|
|
- <el-table
|
|
|
- :data="fieldMappingRows"
|
|
|
- v-loading="fieldMappingLoading"
|
|
|
- border
|
|
|
- stripe
|
|
|
- size="small"
|
|
|
- style="width: 100%; margin-top: 12px"
|
|
|
- max-height="320px"
|
|
|
- >
|
|
|
- <el-table-column prop="name" label="规则名称" min-width="130" show-overflow-tooltip />
|
|
|
- <el-table-column prop="sourceEntity" label="来源实体" width="130" show-overflow-tooltip />
|
|
|
- <el-table-column prop="sourceField" label="来源字段" width="130" show-overflow-tooltip />
|
|
|
- <el-table-column prop="workOrderField" label="工单字段" width="130" show-overflow-tooltip />
|
|
|
- <el-table-column prop="workOrderFieldType" label="工单字段类型" width="120" show-overflow-tooltip />
|
|
|
- </el-table>
|
|
|
- <div v-if="!fieldMappingLoading && fieldMappingRows.length === 0" class="empty-hint">
|
|
|
- 当前未维护字段映射
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-tab-pane>
|
|
|
- </el-tabs>
|
|
|
- </el-dialog>
|
|
|
</AidopDemoShell>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts" name="aidopS0SalesOrderPriorityRule">
|
|
|
-import { computed, onMounted, reactive, ref, watch } from 'vue';
|
|
|
+import { computed, onMounted, reactive, ref } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
|
import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
|
|
|
import AidopDemoShell from '../../components/AidopDemoShell.vue';
|
|
|
import {
|
|
|
- s0PriorityRulesApi,
|
|
|
- type S0PriorityRuleRow,
|
|
|
- type S0PriorityRuleUpsert,
|
|
|
- loadDictOptions,
|
|
|
- type OptionItem,
|
|
|
+ s0OrderPriorityRulesApi,
|
|
|
+ type S0PriorityCodeRow,
|
|
|
+ type S0PriorityCodeUpsert,
|
|
|
} from '../api/s0SalesApi';
|
|
|
-import DictDataMaintainPanel from './components/DictDataMaintainPanel.vue';
|
|
|
-
|
|
|
-// ── 旧 API 保留(不删除,不作为主列表数据源)──────────────────────────────
|
|
|
-// s0OrderPriorityRulesApi 仍在 s0SalesApi.ts 中导出,此处不需引用
|
|
|
|
|
|
const route = useRoute();
|
|
|
const pageTitle = computed(() => (route.meta?.title as string) || '订单优先级配置');
|
|
|
@@ -240,23 +167,29 @@ const pageTitle = computed(() => (route.meta?.title as string) || '订单优先
|
|
|
// ── 查询 ──────────────────────────────────────────────────────────────────
|
|
|
const query = reactive({
|
|
|
keyword: '',
|
|
|
- isEnabled: undefined as boolean | undefined,
|
|
|
+ isActive: undefined as boolean | undefined,
|
|
|
page: 1,
|
|
|
pageSize: 20,
|
|
|
});
|
|
|
|
|
|
const loading = ref(false);
|
|
|
-const rows = ref<S0PriorityRuleRow[]>([]);
|
|
|
+const rows = ref<S0PriorityCodeRow[]>([]);
|
|
|
const total = ref(0);
|
|
|
|
|
|
+/** 列表排序展示:优先 orderByText;缺失时按 orderBy 映射(false=倒序,其余=正序)。 */
|
|
|
+function orderByDisplay(row: S0PriorityCodeRow): string {
|
|
|
+ if (row.orderByText) return row.orderByText;
|
|
|
+ return row.orderBy === false ? '倒序' : '正序';
|
|
|
+}
|
|
|
+
|
|
|
async function loadList() {
|
|
|
loading.value = true;
|
|
|
try {
|
|
|
- const data = await s0PriorityRulesApi.list({
|
|
|
+ const data = await s0OrderPriorityRulesApi.list({
|
|
|
page: query.page,
|
|
|
pageSize: query.pageSize,
|
|
|
keyword: query.keyword || undefined,
|
|
|
- isEnabled: query.isEnabled,
|
|
|
+ isActive: query.isActive,
|
|
|
});
|
|
|
rows.value = data.list;
|
|
|
total.value = data.total;
|
|
|
@@ -269,207 +202,152 @@ async function loadList() {
|
|
|
}
|
|
|
|
|
|
function resetQuery() {
|
|
|
- Object.assign(query, { keyword: '', isEnabled: undefined, page: 1 });
|
|
|
+ Object.assign(query, { keyword: '', isActive: undefined, page: 1 });
|
|
|
void loadList();
|
|
|
}
|
|
|
|
|
|
-// ── 字典选项 ──────────────────────────────────────────────────────────────
|
|
|
-const dictOptions = reactive({
|
|
|
- customerType: [] as OptionItem[],
|
|
|
- orderType: [] as OptionItem[],
|
|
|
- dueStatus: [] as OptionItem[],
|
|
|
-});
|
|
|
-
|
|
|
-async function loadDictSelects() {
|
|
|
- const [ct, ot, ds] = await Promise.all([
|
|
|
- loadDictOptions('s0_order_priority_customer_type'),
|
|
|
- loadDictOptions('s0_order_type'),
|
|
|
- loadDictOptions('s0_due_status'),
|
|
|
- ]);
|
|
|
- dictOptions.customerType = ct;
|
|
|
- dictOptions.orderType = ot;
|
|
|
- dictOptions.dueStatus = ds;
|
|
|
+// ── 配置表单 ──────────────────────────────────────────────────────────────
|
|
|
+const formDialogVisible = ref(false);
|
|
|
+const formDialogTitle = ref('新增配置');
|
|
|
+const editingId = ref<string | null>(null);
|
|
|
+const saving = ref(false);
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+
|
|
|
+interface PriorityCodeForm {
|
|
|
+ descr: string;
|
|
|
+ value: string;
|
|
|
+ priority: number;
|
|
|
+ orderBy: boolean | null;
|
|
|
+ sourceTable: string;
|
|
|
+ sourceColumn: string;
|
|
|
+ sourceType: string;
|
|
|
+ sourceId: string;
|
|
|
+ valueType: string;
|
|
|
+ valueId: string;
|
|
|
+ domainCode: string;
|
|
|
+ isActive: boolean;
|
|
|
}
|
|
|
|
|
|
-// ── 规则表单 ──────────────────────────────────────────────────────────────
|
|
|
-const ruleDialogVisible = ref(false);
|
|
|
-const ruleDialogTitle = ref('新增规则');
|
|
|
-const editingId = ref<number | null>(null);
|
|
|
-const ruleSaving = ref(false);
|
|
|
-const ruleFormRef = ref<FormInstance>();
|
|
|
-
|
|
|
-function emptyRuleForm(): S0PriorityRuleUpsert & { customerType?: string; orderType?: string; dueStatus?: string } {
|
|
|
+function emptyForm(): PriorityCodeForm {
|
|
|
return {
|
|
|
- companyRefId: 0,
|
|
|
- factoryRefId: 0,
|
|
|
- code: '',
|
|
|
- name: '',
|
|
|
- priorityLevel: 1,
|
|
|
- sortDirection: 'asc',
|
|
|
- customerType: undefined,
|
|
|
- orderType: undefined,
|
|
|
- dueStatus: undefined,
|
|
|
- isEnabled: true,
|
|
|
- remark: '',
|
|
|
+ descr: '',
|
|
|
+ value: '',
|
|
|
+ priority: 1,
|
|
|
+ orderBy: null,
|
|
|
+ sourceTable: '',
|
|
|
+ sourceColumn: '',
|
|
|
+ sourceType: '',
|
|
|
+ sourceId: '',
|
|
|
+ valueType: '',
|
|
|
+ valueId: '',
|
|
|
+ domainCode: '',
|
|
|
+ isActive: true,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-const ruleForm = reactive(emptyRuleForm());
|
|
|
+const form = reactive<PriorityCodeForm>(emptyForm());
|
|
|
|
|
|
-const ruleFormRules: FormRules = {
|
|
|
- code: [{ required: true, message: '请填写规则编码', trigger: 'blur' }],
|
|
|
- name: [{ required: true, message: '请填写规则名称', trigger: 'blur' }],
|
|
|
- priorityLevel: [{ required: true, message: '请填写优先级', trigger: 'change' }],
|
|
|
+const formRules: FormRules = {
|
|
|
+ descr: [{ required: true, message: '请填写名称', trigger: 'blur' }],
|
|
|
+ priority: [{ required: true, message: '请填写优先级', trigger: 'change' }],
|
|
|
};
|
|
|
|
|
|
-function resetRuleForm() {
|
|
|
+function resetForm() {
|
|
|
editingId.value = null;
|
|
|
- Object.assign(ruleForm, emptyRuleForm());
|
|
|
- ruleFormRef.value?.clearValidate();
|
|
|
+ Object.assign(form, emptyForm());
|
|
|
+ formRef.value?.clearValidate();
|
|
|
}
|
|
|
|
|
|
function openCreate() {
|
|
|
- resetRuleForm();
|
|
|
- ruleDialogTitle.value = '新增规则';
|
|
|
- ruleDialogVisible.value = true;
|
|
|
-}
|
|
|
-
|
|
|
-function parseRuleExpr(row: S0PriorityRuleRow): { customerType?: string; orderType?: string; dueStatus?: string } {
|
|
|
- // 后端 IsIgnore 标签字段优先;fallback 解析 ruleExpr JSON
|
|
|
- if (row.customerTypeLabel !== undefined || row.orderTypeLabel !== undefined || row.dueStatusLabel !== undefined) {
|
|
|
- // 标签字段是展示用的,实际 value 需从 ruleExpr 解析
|
|
|
- }
|
|
|
- if (!row.ruleExpr) return {};
|
|
|
- try {
|
|
|
- const parsed = JSON.parse(row.ruleExpr) as Record<string, unknown>;
|
|
|
- return {
|
|
|
- customerType: typeof parsed.customerType === 'string' ? parsed.customerType : undefined,
|
|
|
- orderType: typeof parsed.orderType === 'string' ? parsed.orderType : undefined,
|
|
|
- dueStatus: typeof parsed.dueStatus === 'string' ? parsed.dueStatus : undefined,
|
|
|
- };
|
|
|
- } catch {
|
|
|
- return {};
|
|
|
- }
|
|
|
+ resetForm();
|
|
|
+ formDialogTitle.value = '新增配置';
|
|
|
+ formDialogVisible.value = true;
|
|
|
}
|
|
|
|
|
|
-function openEdit(row: S0PriorityRuleRow) {
|
|
|
- resetRuleForm();
|
|
|
+function openEdit(row: S0PriorityCodeRow) {
|
|
|
+ resetForm();
|
|
|
editingId.value = row.id;
|
|
|
- ruleDialogTitle.value = `编辑规则 ${row.name}`;
|
|
|
- const expr = parseRuleExpr(row);
|
|
|
- Object.assign(ruleForm, {
|
|
|
- companyRefId: row.companyRefId,
|
|
|
- factoryRefId: row.factoryRefId,
|
|
|
- code: row.code,
|
|
|
- name: row.name,
|
|
|
- priorityLevel: row.priorityLevel,
|
|
|
- sortDirection: row.sortDirection,
|
|
|
- customerType: expr.customerType,
|
|
|
- orderType: expr.orderType,
|
|
|
- dueStatus: expr.dueStatus,
|
|
|
- sourceEntity: row.sourceEntity,
|
|
|
- sourceField: row.sourceField,
|
|
|
- sourceFieldType: row.sourceFieldType,
|
|
|
- sourceLinkField: row.sourceLinkField,
|
|
|
- workOrderField: row.workOrderField,
|
|
|
- workOrderFieldType: row.workOrderFieldType,
|
|
|
- workOrderLinkField: row.workOrderLinkField,
|
|
|
- isEnabled: row.isEnabled,
|
|
|
- remark: row.remark ?? '',
|
|
|
+ formDialogTitle.value = `编辑配置 ${row.descr || ''}`.trim();
|
|
|
+ Object.assign(form, {
|
|
|
+ descr: row.descr ?? '',
|
|
|
+ value: row.value ?? '',
|
|
|
+ priority: row.priority,
|
|
|
+ orderBy: row.orderBy ?? null,
|
|
|
+ sourceTable: row.sourceTable ?? '',
|
|
|
+ sourceColumn: row.sourceColumn ?? '',
|
|
|
+ sourceType: row.sourceType ?? '',
|
|
|
+ sourceId: row.sourceId ?? '',
|
|
|
+ valueType: row.valueType ?? '',
|
|
|
+ valueId: row.valueId ?? '',
|
|
|
+ domainCode: row.domainCode ?? '',
|
|
|
+ isActive: row.isActive,
|
|
|
});
|
|
|
- ruleDialogVisible.value = true;
|
|
|
+ formDialogVisible.value = true;
|
|
|
+}
|
|
|
+
|
|
|
+/** 空字符串归一为 undefined,避免把空值写库。 */
|
|
|
+function blankToUndefined(v: string): string | undefined {
|
|
|
+ return v.trim() === '' ? undefined : v;
|
|
|
}
|
|
|
|
|
|
-async function submitRuleForm() {
|
|
|
- await ruleFormRef.value?.validate();
|
|
|
- ruleSaving.value = true;
|
|
|
+async function submitForm() {
|
|
|
+ await formRef.value?.validate();
|
|
|
+ saving.value = true;
|
|
|
try {
|
|
|
- const payload: S0PriorityRuleUpsert = {
|
|
|
- companyRefId: ruleForm.companyRefId,
|
|
|
- factoryRefId: ruleForm.factoryRefId,
|
|
|
- code: ruleForm.code,
|
|
|
- name: ruleForm.name,
|
|
|
- priorityLevel: ruleForm.priorityLevel,
|
|
|
- sortDirection: ruleForm.sortDirection,
|
|
|
- customerType: (ruleForm as any).customerType || undefined,
|
|
|
- orderType: (ruleForm as any).orderType || undefined,
|
|
|
- dueStatus: (ruleForm as any).dueStatus || undefined,
|
|
|
- sourceEntity: ruleForm.sourceEntity,
|
|
|
- sourceField: ruleForm.sourceField,
|
|
|
- sourceFieldType: ruleForm.sourceFieldType,
|
|
|
- sourceLinkField: ruleForm.sourceLinkField,
|
|
|
- workOrderField: ruleForm.workOrderField,
|
|
|
- workOrderFieldType: ruleForm.workOrderFieldType,
|
|
|
- workOrderLinkField: ruleForm.workOrderLinkField,
|
|
|
- isEnabled: ruleForm.isEnabled,
|
|
|
- remark: ruleForm.remark,
|
|
|
+ const payload: S0PriorityCodeUpsert = {
|
|
|
+ descr: form.descr,
|
|
|
+ value: blankToUndefined(form.value),
|
|
|
+ priority: form.priority,
|
|
|
+ orderBy: form.orderBy,
|
|
|
+ sourceTable: blankToUndefined(form.sourceTable),
|
|
|
+ sourceColumn: blankToUndefined(form.sourceColumn),
|
|
|
+ sourceType: blankToUndefined(form.sourceType),
|
|
|
+ sourceId: blankToUndefined(form.sourceId),
|
|
|
+ valueType: blankToUndefined(form.valueType),
|
|
|
+ valueId: blankToUndefined(form.valueId),
|
|
|
+ domainCode: blankToUndefined(form.domainCode),
|
|
|
+ isActive: form.isActive,
|
|
|
};
|
|
|
if (editingId.value !== null) {
|
|
|
- await s0PriorityRulesApi.update(editingId.value, payload);
|
|
|
+ await s0OrderPriorityRulesApi.update(editingId.value, payload);
|
|
|
ElMessage.success('已保存');
|
|
|
} else {
|
|
|
- await s0PriorityRulesApi.create(payload);
|
|
|
+ await s0OrderPriorityRulesApi.create(payload);
|
|
|
ElMessage.success('已创建');
|
|
|
}
|
|
|
- ruleDialogVisible.value = false;
|
|
|
+ formDialogVisible.value = false;
|
|
|
await loadList();
|
|
|
} catch {
|
|
|
ElMessage.error('保存订单优先级配置失败,请检查填写内容后重试');
|
|
|
} finally {
|
|
|
- ruleSaving.value = false;
|
|
|
+ saving.value = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-function onDelete(row: S0PriorityRuleRow) {
|
|
|
- ElMessageBox.confirm(`确定删除规则「${row.name}」?`, '确认', { type: 'warning' })
|
|
|
+function onDelete(row: S0PriorityCodeRow) {
|
|
|
+ ElMessageBox.confirm('确认删除该订单优先级配置吗?', '确认', { type: 'warning' })
|
|
|
.then(async () => {
|
|
|
- await s0PriorityRulesApi.delete(row.id);
|
|
|
+ await s0OrderPriorityRulesApi.delete(row.id);
|
|
|
ElMessage.success('已删除');
|
|
|
await loadList();
|
|
|
})
|
|
|
.catch(() => {});
|
|
|
}
|
|
|
|
|
|
-function toggleEnabled(row: S0PriorityRuleRow) {
|
|
|
- const next = !row.isEnabled;
|
|
|
+function toggleActive(row: S0PriorityCodeRow) {
|
|
|
+ const next = !row.isActive;
|
|
|
const actionText = next ? '生效' : '停用';
|
|
|
- ElMessageBox.confirm(`确定${actionText}规则「${row.name}」?`, '确认', { type: 'warning' })
|
|
|
+ ElMessageBox.confirm(`确定${actionText}该订单优先级配置「${row.descr || ''}」?`, '确认', { type: 'warning' })
|
|
|
.then(async () => {
|
|
|
- await s0PriorityRulesApi.toggleEnabled(row.id, { isEnabled: next });
|
|
|
+ await s0OrderPriorityRulesApi.toggleEnabled(row.id, { isActive: next });
|
|
|
ElMessage.success(`${actionText}成功`);
|
|
|
await loadList();
|
|
|
})
|
|
|
.catch(() => {});
|
|
|
}
|
|
|
|
|
|
-// ── 配置维护弹窗 ──────────────────────────────────────────────────────────
|
|
|
-const configDialogVisible = ref(false);
|
|
|
-const configActiveTab = ref('customerType');
|
|
|
-
|
|
|
-watch(configActiveTab, (tab) => {
|
|
|
- if (tab === 'fieldMapping') void loadFieldMapping();
|
|
|
-});
|
|
|
-
|
|
|
-// 字段映射 Tab
|
|
|
-const fieldMappingRows = ref<S0PriorityRuleRow[]>([]);
|
|
|
-const fieldMappingLoading = ref(false);
|
|
|
-
|
|
|
-async function loadFieldMapping() {
|
|
|
- fieldMappingLoading.value = true;
|
|
|
- try {
|
|
|
- const data = await s0PriorityRulesApi.list({ page: 1, pageSize: 200 });
|
|
|
- fieldMappingRows.value = data.list.filter(
|
|
|
- (r) => r.sourceEntity || r.sourceField || r.workOrderField,
|
|
|
- );
|
|
|
- } catch {
|
|
|
- fieldMappingRows.value = [];
|
|
|
- } finally {
|
|
|
- fieldMappingLoading.value = false;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
onMounted(async () => {
|
|
|
- await Promise.all([loadList(), loadDictSelects()]);
|
|
|
+ await loadList();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
@@ -485,13 +363,4 @@ onMounted(async () => {
|
|
|
display: flex;
|
|
|
justify-content: flex-end;
|
|
|
}
|
|
|
-
|
|
|
-.field-mapping-panel {
|
|
|
- .empty-hint {
|
|
|
- text-align: center;
|
|
|
- color: #909399;
|
|
|
- padding: 24px 0;
|
|
|
- font-size: 13px;
|
|
|
- }
|
|
|
-}
|
|
|
</style>
|