update point tier rule
This commit is contained in:
@@ -50,6 +50,23 @@
|
||||
:disabled="isEditMode"
|
||||
required-mark
|
||||
/>
|
||||
<div v-if="!isEditMode && selectedNumberEventList.length" class="event-value-list">
|
||||
<t-form-item
|
||||
v-for="item in selectedNumberEventList"
|
||||
:key="item.id"
|
||||
:label="`${item.name || '未命名事件'}数值`"
|
||||
:required-mark="item.requireValue === true"
|
||||
label-align="top"
|
||||
>
|
||||
<t-input
|
||||
v-model.trim="numberValueTextMap[item.id || '']"
|
||||
type="number"
|
||||
align="right"
|
||||
borderless
|
||||
:placeholder="getNumberValuePlaceholder(item)"
|
||||
/>
|
||||
</t-form-item>
|
||||
</div>
|
||||
<div v-if="isEditMode" class="edit-point-tip">已产生积分的登记记录不会因修改客户、事件或时间而重算;如需修改这些事实,请删除后重新创建。</div>
|
||||
<t-form-item v-if="showSourceValueInput" label="自定义积分" required-mark>
|
||||
<t-input
|
||||
@@ -182,6 +199,7 @@ import type { Customer } from "@/types/Customer";
|
||||
import type { EventItem } from "@/types/EventItem";
|
||||
import type { EventRecord } from "@/types/EventRecord";
|
||||
import { getEventRecordPhotoURL } from "@/utils/eventRecord";
|
||||
import { getEventNumberValuePlaceholder, resolveEventNumberValue } from "@/utils/eventValue";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
import { loadSourceValueRange } from "@/utils/point";
|
||||
import { compressUploadImageList } from "@/utils/imageCompression";
|
||||
@@ -372,6 +390,10 @@ function handleScanStatusChange(value: string): void {
|
||||
|
||||
const eventList = ref<EventItem[]>([]);
|
||||
const selectedEventIdList = ref<string[]>([]);
|
||||
const numberValueTextMap = reactive<Record<string, string>>({});
|
||||
const selectedNumberEventList = computed(() => selectedEventIdList.value
|
||||
.map(eventId => eventList.value.find(item => item.id === eventId))
|
||||
.filter((item): item is EventItem => item?.valueType === "NUMBER"));
|
||||
|
||||
const eventNameMap = computed(() => {
|
||||
const map = new Map<string, string>();
|
||||
@@ -391,6 +413,46 @@ function appendRecordEvent(record: EventRecord): void {
|
||||
eventList.value = [record.event, ...eventList.value];
|
||||
}
|
||||
|
||||
function getNumberValuePlaceholder(event: EventItem): string {
|
||||
return getEventNumberValuePlaceholder(event);
|
||||
}
|
||||
|
||||
function resolveNumberValue(eventId: string): number | undefined {
|
||||
const valueText = numberValueTextMap[eventId] || "";
|
||||
if (!valueText.trim()) {
|
||||
return undefined;
|
||||
}
|
||||
const event = eventList.value.find(item => item.id === eventId);
|
||||
return event ? resolveEventNumberValue(event, valueText) : undefined;
|
||||
}
|
||||
|
||||
function validateNumberValueList(): boolean {
|
||||
for (const eventId of selectedEventIdList.value) {
|
||||
const event = eventList.value.find(item => item.id === eventId);
|
||||
if (!event) {
|
||||
continue;
|
||||
}
|
||||
const valueText = numberValueTextMap[eventId] || "";
|
||||
if (event.valueType !== "NUMBER") {
|
||||
if (valueText.trim()) {
|
||||
Toast.warning(`${event.name || "当前事件"}不能提交数值`);
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const numberValue = resolveNumberValue(eventId);
|
||||
if (valueText.trim() && numberValue === undefined) {
|
||||
Toast.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
|
||||
return false;
|
||||
}
|
||||
if (event.requireValue && numberValue === undefined) {
|
||||
Toast.warning(`请填写${event.name || "当前事件"}数值`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ---------- 积分规则联动 ----------
|
||||
|
||||
const pointValueText = ref("");
|
||||
@@ -533,6 +595,7 @@ async function submitRecord(): Promise<void> {
|
||||
}
|
||||
|
||||
const customerIdList = selectedCustomerList.value.map(customer => customer.id).filter((item): item is string => !!item);
|
||||
// 多个事件按选择顺序逐条提交,避免把有累计积分顺序依赖的事件混入同一批次。
|
||||
for (const eventId of selectedEventIdList.value) {
|
||||
await EventRecordAPI.create({
|
||||
eventId,
|
||||
@@ -540,6 +603,7 @@ async function submitRecord(): Promise<void> {
|
||||
remark: note.value || "客户现场登记",
|
||||
registeredAt: buildRegisteredAt(),
|
||||
pointValue: showSourceValueInput.value ? resolveSourceValue() : undefined,
|
||||
numberValue: resolveNumberValue(eventId),
|
||||
attachmentList: buildTempFileIdList().map(tempFileId => ({
|
||||
tempFileId,
|
||||
attachType: "PHOTO"
|
||||
@@ -551,6 +615,9 @@ async function submitRecord(): Promise<void> {
|
||||
note.value = "";
|
||||
pointValueText.value = "";
|
||||
photoItemList.value = [];
|
||||
for (const eventId of Object.keys(numberValueTextMap)) {
|
||||
delete numberValueTextMap[eventId];
|
||||
}
|
||||
await loadRecentRecordList();
|
||||
await settingStore.playRegisterSuccessSound();
|
||||
Toast.success("登记已提交");
|
||||
@@ -569,6 +636,9 @@ function validateForm(): boolean {
|
||||
Toast.warning("请至少选择一个登记事件");
|
||||
return false;
|
||||
}
|
||||
if (!isEditMode.value && !validateNumberValueList()) {
|
||||
return false;
|
||||
}
|
||||
if (showSourceValueInput.value) {
|
||||
const pointValue = resolveSourceValue();
|
||||
const range = sourceValueRange.value;
|
||||
@@ -710,6 +780,14 @@ watch(customerCode, async (value) => {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.event-value-list {
|
||||
padding: 0 1rem;
|
||||
|
||||
.t-form-item {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.time-actions {
|
||||
gap: .5rem;
|
||||
display: flex;
|
||||
|
||||
Reference in New Issue
Block a user