use Message instead of Toast
This commit is contained in:
@@ -52,7 +52,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import TagAPI from "@/api/TagAPI";
|
||||
import type { Tag } from "@/types/Tag";
|
||||
@@ -136,7 +136,7 @@ async function loadTags(): Promise<void> {
|
||||
});
|
||||
tagList.value = result.list || [];
|
||||
} catch {
|
||||
Toast.error("标签加载失败");
|
||||
Message.error("标签加载失败");
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
@@ -145,11 +145,11 @@ async function loadTags(): Promise<void> {
|
||||
async function createTag(): Promise<void> {
|
||||
const name = newTagName.value.trim();
|
||||
if (!name) {
|
||||
Toast.warning("请输入标签名称");
|
||||
Message.warning("请输入标签名称");
|
||||
return;
|
||||
}
|
||||
if (tagList.value.some(item => getTagName(item) === name)) {
|
||||
Toast.warning("标签已存在");
|
||||
Message.warning("标签已存在");
|
||||
return;
|
||||
}
|
||||
isCreating.value = true;
|
||||
@@ -163,9 +163,9 @@ async function createTag(): Promise<void> {
|
||||
if (tag.id) {
|
||||
draftSelectedIdList.value = [...draftSelectedIdList.value, tag.id];
|
||||
}
|
||||
Toast.success("标签已新增");
|
||||
Message.success("标签已新增");
|
||||
} catch {
|
||||
Toast.error("标签新增失败");
|
||||
Message.error("标签新增失败");
|
||||
} finally {
|
||||
isCreating.value = false;
|
||||
}
|
||||
|
||||
+7
-15
@@ -1,8 +1,8 @@
|
||||
import {createApp} from "vue";
|
||||
import {createPinia} from "pinia";
|
||||
import { createApp } from "vue";
|
||||
import { createPinia } from "pinia";
|
||||
import router from "@/router";
|
||||
import Root from "@/Root.vue";
|
||||
import {useCurrentStoreStore} from "@/store/currentStoreStore";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
|
||||
import "tdesign-mobile-vue/es/style/index.css";
|
||||
import "timi-web/style.css";
|
||||
@@ -10,8 +10,8 @@ import "timi-tdesign-mobile/style.css";
|
||||
import "vue-virtual-scroller/dist/vue-virtual-scroller.css";
|
||||
import "@/styles/tdesign-custom.css";
|
||||
import "@/styles/global.less";
|
||||
import {configureUserStore, type ApiResponse, Network, useUserStore, VCan, VRole} from "timi-web";
|
||||
import {Toast} from "tdesign-mobile-vue";
|
||||
import { type ApiResponse, configureUserStore, Network, useUserStore, VCan, VRole } from "timi-web";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
export const pinia = createPinia();
|
||||
const apiBaseURL = import.meta.env.VITE_API_BASE_URL as string | undefined;
|
||||
@@ -55,11 +55,7 @@ async function bootstrap(): Promise<void> {
|
||||
}
|
||||
|
||||
Network.setGlobalErrorCallback((resp: ApiResponse<any>) => {
|
||||
Toast({
|
||||
theme: "error",
|
||||
direction: "row",
|
||||
message: resp.message
|
||||
});
|
||||
Message.error(resp.message);
|
||||
});
|
||||
|
||||
app.use(router);
|
||||
@@ -71,11 +67,7 @@ async function start(): Promise<void> {
|
||||
await bootstrap();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
Toast({
|
||||
theme: "error",
|
||||
direction: "row",
|
||||
message: "应用启动失败"
|
||||
});
|
||||
Message.error("应用启动失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { AttachmentAPI, PassTimeLabel, Text, useUserStore } from "timi-web";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
@@ -264,7 +264,7 @@ async function loadCustomer(): Promise<void> {
|
||||
customerTagList.value = [];
|
||||
selectedTagIdList.value = [];
|
||||
console.warn("客户详情加载失败", err);
|
||||
Toast.warning("客户详情加载失败");
|
||||
Message.warning("客户详情加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,7 +306,7 @@ async function handleTagSelected(tagList: Tag[]): Promise<void> {
|
||||
});
|
||||
customerTagList.value = tagList;
|
||||
selectedTagIdList.value = tagList.map(item => item.id || "").filter(Boolean);
|
||||
Toast.success("客户标签已保存");
|
||||
Message.success("客户标签已保存");
|
||||
}
|
||||
|
||||
const inviter = computed(() => customer.value?.introducerCustomer);
|
||||
@@ -346,7 +346,7 @@ async function removeCustomer(id: string): Promise<void> {
|
||||
isRemoving.value = true;
|
||||
try {
|
||||
await CustomerAPI.remove(id);
|
||||
Toast.success("客户已删除");
|
||||
Message.success("客户已删除");
|
||||
await router.replace("/management/customers");
|
||||
} finally {
|
||||
isRemoving.value = false;
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { type Attachment, AttachmentAPI, useUserStore } from "timi-web";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import TagAPI from "@/api/TagAPI";
|
||||
import BodyAreaSelector from "@/components/BodyAreaSelector.vue";
|
||||
@@ -266,7 +266,7 @@ async function applyIntroducer(code: string): Promise<void> {
|
||||
formData.introducerCustomer = undefined;
|
||||
introducerCustomerId.value = "";
|
||||
scannerVisible.value = false;
|
||||
Toast.warning(`未匹配到 ${code} 编码介绍人,请选择或扫码已有客户`);
|
||||
Message.warning(`未匹配到 ${code} 编码介绍人,请选择或扫码已有客户`);
|
||||
return;
|
||||
}
|
||||
formData.introducerCustomerId = matched.id;
|
||||
@@ -394,7 +394,7 @@ async function loadDetail() {
|
||||
introducerCustomerId.value = customer.introducerCustomerId || customer.introducerCustomer?.id || "";
|
||||
} catch (err) {
|
||||
console.warn("客户详情加载失败", err);
|
||||
Toast.error("客户详情加载失败");
|
||||
Message.error("客户详情加载失败");
|
||||
}
|
||||
}
|
||||
onMounted(loadDetail);
|
||||
@@ -480,11 +480,11 @@ function validateCustomerPhotoList(): boolean {
|
||||
|
||||
const attachTypeSet = new Set(photoItemList.value.map(item => item.attachType));
|
||||
if (!attachTypeSet.has("PHOTO")) {
|
||||
Toast.warning("请上传客户照片");
|
||||
Message.warning("请上传客户照片");
|
||||
return false;
|
||||
}
|
||||
if (!attachTypeSet.has("POINT_CARD")) {
|
||||
Toast.warning("请上传积分卡照片");
|
||||
Message.warning("请上传积分卡照片");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -523,10 +523,10 @@ async function doSubmit(): Promise<void> {
|
||||
}
|
||||
if (!canSubmit.value) {
|
||||
if (!formData.name?.trim()) {
|
||||
Toast.warning("请填写姓名");
|
||||
Message.warning("请填写姓名");
|
||||
return;
|
||||
}
|
||||
Toast.warning("当前门店未设置");
|
||||
Message.warning("当前门店未设置");
|
||||
return;
|
||||
}
|
||||
if (!validateCustomerPhotoList()) {
|
||||
@@ -552,13 +552,13 @@ async function doSubmit(): Promise<void> {
|
||||
|
||||
if (isCreateMode.value) {
|
||||
await CustomerAPI.create(payload);
|
||||
Toast.success("创建成功");
|
||||
Message.success("创建成功");
|
||||
const redirect = String(route.query.redirect || "");
|
||||
await router.replace(redirect || "/management/customers");
|
||||
return;
|
||||
} else {
|
||||
await CustomerAPI.update(payload);
|
||||
Toast.success("保存成功");
|
||||
Message.success("保存成功");
|
||||
const redirect = String(route.query.redirect || "");
|
||||
if (redirect) {
|
||||
await router.replace(redirect);
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import CodeScanner from "@/components/CodeScanner.vue";
|
||||
@@ -147,7 +147,7 @@ async function loadCustomer(): Promise<void> {
|
||||
customer.value = undefined;
|
||||
invitees.value = [];
|
||||
console.warn("邀请客户加载失败", err);
|
||||
Toast.warning("邀请客户加载失败");
|
||||
Message.warning("邀请客户加载失败");
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
@@ -202,7 +202,7 @@ function handleScanStatusChange(value: string): void {
|
||||
|
||||
async function confirmScannedInvitee(): Promise<void> {
|
||||
if (!pendingInvitee.value) {
|
||||
Toast.warning("请先扫码识别客户");
|
||||
Message.warning("请先扫码识别客户");
|
||||
return;
|
||||
}
|
||||
if (await addInvitee(pendingInvitee.value)) {
|
||||
@@ -224,17 +224,17 @@ async function addInvitee(invitee: Customer): Promise<boolean> {
|
||||
return false;
|
||||
}
|
||||
if (invitee.id === customer.value.id) {
|
||||
Toast.warning("不能把客户本人添加为邀请客户");
|
||||
Message.warning("不能把客户本人添加为邀请客户");
|
||||
return false;
|
||||
}
|
||||
if (isCustomerAncestor(invitee)) {
|
||||
Toast.warning("不能把上级邀请人添加为邀请客户");
|
||||
Message.warning("不能把上级邀请人添加为邀请客户");
|
||||
return false;
|
||||
}
|
||||
|
||||
await CustomerAPI.saveInvite(customer.value.id, invitee.id);
|
||||
await loadInvitees();
|
||||
Toast.success(`已添加 ${invitee.name || invitee.code}`);
|
||||
Message.success(`已添加 ${invitee.name || invitee.code}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -258,7 +258,7 @@ async function removeInvitee(item: Customer): Promise<void> {
|
||||
|
||||
await CustomerAPI.deleteInvite(item.id);
|
||||
await loadInvitees();
|
||||
Toast.success("已删除邀请关系");
|
||||
Message.success("已删除邀请关系");
|
||||
}
|
||||
|
||||
// ---------- 导航 ----------
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { type Page, type PageResult, Time, Toolkit, useUserStore } from "timi-web";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import GenderIcon from "@/components/GenderIcon.vue";
|
||||
@@ -236,7 +236,7 @@ async function doExport(): Promise<void> {
|
||||
try {
|
||||
const blob = await CustomerAPI.exportXSSF(page);
|
||||
Toolkit.downloadBlob(blob, `客户列表-${Time.formatDate(new Date())}.xlsx`);
|
||||
Toast.success("导出已开始");
|
||||
Message.success("导出已开始");
|
||||
} finally {
|
||||
isExporting.value = false;
|
||||
}
|
||||
|
||||
@@ -63,13 +63,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import {
|
||||
calculateQrCodeGrid,
|
||||
downloadQrCodeImages,
|
||||
printQrCodeImages,
|
||||
splitQrCodePages
|
||||
} from "@/utils/qrCode";
|
||||
import { Message } from "@/utils/message";
|
||||
import { calculateQrCodeGrid, downloadQrCodeImages, printQrCodeImages, splitQrCodePages } from "@/utils/qrCode";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
|
||||
defineOptions({
|
||||
@@ -220,11 +215,7 @@ async function printQrCode(): Promise<void> {
|
||||
title: `${finalStartCode.value}-${finalEndCode.value}`
|
||||
});
|
||||
} catch (err) {
|
||||
Toast({
|
||||
theme: "warning",
|
||||
direction: "row",
|
||||
message: err instanceof Error ? err.message : "打印失败"
|
||||
});
|
||||
Message.warning(err instanceof Error ? err.message : "打印失败");
|
||||
} finally {
|
||||
printing.value = false;
|
||||
}
|
||||
|
||||
@@ -219,15 +219,15 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RoleAPI, Time, type ModuleCode } from "timi-web";
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { type ModuleCode, type Role, RoleAPI, Time, useUserStore } from "timi-web";
|
||||
import type { ColorObject } from "tdesign-mobile-vue";
|
||||
import { useUserStore, type Role } from "timi-web";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import type { EventItem, EventStatus, EventLimitType, EventValueType, EventValueUnit } from "@/types/EventItem";
|
||||
import type { EventItem, EventLimitType, EventStatus, EventValueType, EventValueUnit } from "@/types/EventItem";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
type PickerValue = string | number;
|
||||
|
||||
@@ -301,7 +301,7 @@ function openStorePicker(): void {
|
||||
return;
|
||||
}
|
||||
if (!currentStoreStore.storeList.length) {
|
||||
Toast.warning("暂无可选门店");
|
||||
Message.warning("暂无可选门店");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -563,25 +563,25 @@ function resolveTimestamp(valueText: string): number | undefined {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!formModel.storeId) {
|
||||
Toast.warning("请选择门店");
|
||||
Message.warning("请选择门店");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.name.trim()) {
|
||||
Toast.warning("请输入登记事件名称");
|
||||
Message.warning("请输入登记事件名称");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.roleCodeList.length) {
|
||||
Toast.warning("请至少选择一个可登记角色");
|
||||
Message.warning("请至少选择一个可登记角色");
|
||||
return false;
|
||||
}
|
||||
if (isValueLimitType(formModel.limitType) && !resolveLimitValue()) {
|
||||
Toast.warning("请输入有效的约束数值");
|
||||
Message.warning("请输入有效的约束数值");
|
||||
return false;
|
||||
}
|
||||
const beginAt = resolveTimestamp(formModel.beginAtText);
|
||||
const endAt = resolveTimestamp(formModel.endAtText);
|
||||
if (beginAt !== undefined && endAt !== undefined && endAt < beginAt) {
|
||||
Toast.warning("终止时间不能早于起始时间");
|
||||
Message.warning("终止时间不能早于起始时间");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -651,10 +651,10 @@ async function saveEventItem(): Promise<void> {
|
||||
} else {
|
||||
await EventAPI.update(payload);
|
||||
}
|
||||
Toast.success("登记事件已保存");
|
||||
Message.success("登记事件已保存");
|
||||
await router.replace("/management/registration-events");
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "登记事件保存失败"));
|
||||
Message.error(getErrorMessage(error, "登记事件保存失败"));
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -690,10 +690,10 @@ async function removeEventItem(id: string): Promise<void> {
|
||||
isRemoving.value = true;
|
||||
try {
|
||||
await EventAPI.remove(id);
|
||||
Toast.success("登记事件已删除");
|
||||
Message.success("登记事件已删除");
|
||||
await router.replace("/management/registration-events");
|
||||
} catch {
|
||||
Toast.error("登记事件删除失败");
|
||||
Message.error("登记事件删除失败");
|
||||
} finally {
|
||||
isRemoving.value = false;
|
||||
}
|
||||
@@ -746,7 +746,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await fillForm();
|
||||
} catch {
|
||||
Toast.error("登记事件加载失败");
|
||||
Message.error("登记事件加载失败");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { type Page, type PageResult, type Role, useUserStore } from "timi-web";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
@@ -259,7 +259,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("登记事件加载失败");
|
||||
Message.error("登记事件加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { AttachmentAPI, Time, type Attachment, useUserStore } from "timi-web";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import EventRecordAPI from "@/api/EventRecordAPI";
|
||||
@@ -438,18 +438,18 @@ function validateNumberValueList(): boolean {
|
||||
const valueText = numberValueTextMap[eventId] || "";
|
||||
if (event.valueType !== "NUMBER") {
|
||||
if (valueText.trim()) {
|
||||
Toast.warning(`${event.name || "当前事件"}不能提交数值`);
|
||||
Message.warning(`${event.name || "当前事件"}不能提交数值`);
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const numberValue = resolveNumberValue(eventId);
|
||||
if (valueText.trim() && numberValue === undefined) {
|
||||
Toast.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
|
||||
Message.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
|
||||
return false;
|
||||
}
|
||||
if (event.requireValue && numberValue === undefined) {
|
||||
Toast.warning(`请填写${event.name || "当前事件"}数值`);
|
||||
Message.warning(`请填写${event.name || "当前事件"}数值`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -630,7 +630,7 @@ async function submitRecord(): Promise<void> {
|
||||
}
|
||||
await loadRecentRecordList();
|
||||
await settingStore.playRegisterSuccessSound();
|
||||
Toast.success("登记已提交");
|
||||
Message.success("登记已提交");
|
||||
await router.replace("/customers");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
@@ -639,11 +639,11 @@ async function submitRecord(): Promise<void> {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!selectedCustomerList.value.some(item => !!item.id)) {
|
||||
Toast.warning("请先选择或扫码客户");
|
||||
Message.warning("请先选择或扫码客户");
|
||||
return false;
|
||||
}
|
||||
if (!selectedEventIdList.value.length) {
|
||||
Toast.warning("请至少选择一个登记事件");
|
||||
Message.warning("请至少选择一个登记事件");
|
||||
return false;
|
||||
}
|
||||
if (!isEditMode.value && !validateNumberValueList()) {
|
||||
@@ -653,7 +653,7 @@ function validateForm(): boolean {
|
||||
const pointValue = resolveSourceValue();
|
||||
const range = sourceValueConfig.value?.range;
|
||||
if (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue)) {
|
||||
Toast.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
|
||||
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -663,7 +663,7 @@ function validateForm(): boolean {
|
||||
|
||||
async function updateRecord(): Promise<void> {
|
||||
if (!editingRecord.value?.id || !editingRecord.value.customerId || !editingRecord.value.eventId) {
|
||||
Toast.warning("登记事件记录不存在");
|
||||
Message.warning("登记事件记录不存在");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -675,7 +675,7 @@ async function updateRecord(): Promise<void> {
|
||||
registeredAt: editingRecord.value.registeredAt,
|
||||
attachmentList: buildPhotoAttachmentList()
|
||||
});
|
||||
Toast.success("记录已保存");
|
||||
Message.success("记录已保存");
|
||||
await router.replace(`/management/registration-event-records/${editingRecord.value.id}`);
|
||||
}
|
||||
|
||||
|
||||
@@ -132,17 +132,18 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast, type DropdownValue } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin, type DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Time, Toolkit, useUserStore } from "timi-web";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import EventRecordAPI from "@/api/EventRecordAPI";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import type { EventItem } from "@/types/EventItem";
|
||||
import type { EventRecordPage, EventRecordPageResult, EventRecordListItemView } from "@/types/EventRecord";
|
||||
import type { EventRecordListItemView, EventRecordPage, EventRecordPageResult } from "@/types/EventRecord";
|
||||
import { getCustomerPhotoURL } from "@/utils/customer";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { formatEventNumberValue } from "@/utils/eventValue";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
type DateFilterType = "today" | "yesterday" | "beforeYesterday" | "lastWeek" | "all" | "custom";
|
||||
|
||||
@@ -368,7 +369,7 @@ async function exportExcel(): Promise<void> {
|
||||
...buildRangeReq()
|
||||
});
|
||||
Toolkit.downloadBlob(blob, `登记事件记录-${Time.formatDate(new Date())}.xlsx`);
|
||||
Toast.success("导出已开始");
|
||||
Message.success("导出已开始");
|
||||
} finally {
|
||||
isExporting.value = false;
|
||||
}
|
||||
@@ -424,14 +425,14 @@ async function removeRecord(id: string): Promise<void> {
|
||||
try {
|
||||
await EventRecordAPI.remove(id);
|
||||
await reloadRecords();
|
||||
Toast.success("登记记录已删除");
|
||||
Message.success("登记记录已删除");
|
||||
} catch (error) {
|
||||
const message = getErrorMessage(error, "登记记录删除失败");
|
||||
if (message.includes("积分余额不足") || message.includes("余额不足")) {
|
||||
Toast.warning("积分余额不足,请先人工调整积分后再删除登记记录");
|
||||
Message.warning("积分余额不足,请先人工调整积分后再删除登记记录");
|
||||
return;
|
||||
}
|
||||
Toast.error(message);
|
||||
Message.error(message);
|
||||
} finally {
|
||||
isDeleting.value = false;
|
||||
deletingId.value = "";
|
||||
|
||||
@@ -139,8 +139,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast, type DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Time, type PageResult } from "timi-web";
|
||||
import { type DropdownValue } from "tdesign-mobile-vue";
|
||||
import { type PageResult, Time } from "timi-web";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import EventRecordAPI from "@/api/EventRecordAPI";
|
||||
import type { CustomerEventRankView, EventRecordRankPage, EventRecordRankType } from "@/types/EventRecord";
|
||||
@@ -149,6 +149,7 @@ import { getCustomerPhotoURL } from "@/utils/customer";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { formatEventNumberValue } from "@/utils/eventValue";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
type DateFilterType = "all" | "today" | "yesterday" | "lastWeek" | "thisMonth" | "custom";
|
||||
|
||||
@@ -314,7 +315,7 @@ async function loadRanks(): Promise<void> {
|
||||
page.index += 1;
|
||||
isNoMore.value = pageResult.total <= pageResult.list.length || (result.list || []).length < page.size;
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "登记记录排行加载失败"));
|
||||
Message.error(getErrorMessage(error, "登记记录排行加载失败"));
|
||||
} finally {
|
||||
if (token === loadToken) {
|
||||
isLoading.value = false;
|
||||
@@ -342,7 +343,7 @@ async function selectRankType(value: DropdownValue): Promise<void> {
|
||||
const filterChanged = normalizeEventFilter();
|
||||
await replaceFilterQuery();
|
||||
if (!canLoadRank.value) {
|
||||
Toast.warning(rankType.value === "TOTAL_NUMBER_VALUE" ? "数值排行需要选择单个有数值事件" : "连续排行需要选择单个登记事件");
|
||||
Message.warning(rankType.value === "TOTAL_NUMBER_VALUE" ? "数值排行需要选择单个有数值事件" : "连续排行需要选择单个登记事件");
|
||||
}
|
||||
if (!filterChanged) {
|
||||
await reloadRanks();
|
||||
|
||||
@@ -48,12 +48,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast, type TagProps } from "tdesign-mobile-vue";
|
||||
import { type TagProps } from "tdesign-mobile-vue";
|
||||
import { VueDraggableNext } from "vue-draggable-next";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import type { EventItem, EventStatus } from "@/types/EventItem";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
defineOptions({
|
||||
name: "EventSort"
|
||||
@@ -115,10 +116,10 @@ async function saveSort(): Promise<void> {
|
||||
item.sort = index;
|
||||
});
|
||||
sortDirty.value = false;
|
||||
Toast.success("登记事件排序已保存");
|
||||
await router.back();
|
||||
Message.success("登记事件排序已保存");
|
||||
router.back();
|
||||
} catch {
|
||||
Toast.error("登记事件排序保存失败");
|
||||
Message.error("登记事件排序保存失败");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -150,7 +151,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("登记事件加载失败");
|
||||
Message.error("登记事件加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
<script setup lang="ts">
|
||||
import { AttachmentAPI, Toolkit, useUserStore, type Attachment } from "timi-web";
|
||||
import type { TdInputProps } from "tdesign-mobile-vue";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import CodeScanner from "@/components/CodeScanner.vue";
|
||||
@@ -227,18 +227,18 @@ function validateNumberValueList(): boolean {
|
||||
const valueText = numberValueTextMap[eventId] || "";
|
||||
if (event.valueType !== "NUMBER") {
|
||||
if (valueText.trim()) {
|
||||
showToast(`${event.name || "当前事件"}不能提交数值`, "warning");
|
||||
Message.warning(`${event.name || "当前事件"}不能提交数值`);
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const numberValue = resolveNumberValue(eventId);
|
||||
if (valueText.trim() && numberValue === undefined) {
|
||||
showToast(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`, "warning");
|
||||
Message.warning(`${event.name || "当前事件"}数值格式不正确,请检查单位和小数位`);
|
||||
return false;
|
||||
}
|
||||
if (event.requireValue && numberValue === undefined) {
|
||||
showToast(`请填写${event.name || "当前事件"}数值`, "warning");
|
||||
Message.warning(`请填写${event.name || "当前事件"}数值`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -549,11 +549,11 @@ function validateCustomerPhotoList(): boolean {
|
||||
|
||||
const attachTypeSet = new Set(customerPhotoItemList.value.map(item => item.attachType));
|
||||
if (!attachTypeSet.has("PHOTO")) {
|
||||
showToast("请上传客户照片", "warning");
|
||||
Message.warning("请上传客户照片");
|
||||
return false;
|
||||
}
|
||||
if (!attachTypeSet.has("POINT_CARD")) {
|
||||
showToast("请上传积分卡照片", "warning");
|
||||
Message.warning("请上传积分卡照片");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -570,7 +570,7 @@ async function handleCustomerPhotoSelected(event: Event): Promise<void> {
|
||||
const compressedFile = await compressUploadImage(file);
|
||||
const [tempFile] = await AttachmentAPI.upload(compressedFile);
|
||||
if (!tempFile?.id) {
|
||||
showToast("客户照片上传失败", "warning");
|
||||
Message.warning("客户照片上传失败");
|
||||
return;
|
||||
}
|
||||
customerPhotoItemList.value.push({
|
||||
@@ -635,7 +635,7 @@ async function saveRecord(): Promise<void> {
|
||||
return;
|
||||
}
|
||||
if (customerPhotoUploading.value || recordPhotoUploading.value) {
|
||||
showToast("照片正在上传,请稍候", "warning");
|
||||
Message.warning("照片正在上传,请稍候");
|
||||
return;
|
||||
}
|
||||
const customerCode = validateForm();
|
||||
@@ -674,7 +674,7 @@ async function saveRecord(): Promise<void> {
|
||||
await EventRecordAPI.createWithCustomer(customer);
|
||||
resetFormAfterSubmit();
|
||||
await settingStore.playRegisterSuccessSound();
|
||||
showToast("登记已提交");
|
||||
Message.success("登记已提交");
|
||||
await router.replace("/customers");
|
||||
} finally {
|
||||
saving.value = false;
|
||||
@@ -724,11 +724,11 @@ function buildCustomerAttachmentList(): Attachment[] {
|
||||
function validateForm(): string {
|
||||
const customerCode = (currentCode.value || scanCode.value).trim();
|
||||
if (!customerCode) {
|
||||
showToast("请先输入或扫码客户编码", "warning");
|
||||
Message.warning("请先输入或扫码客户编码");
|
||||
return "";
|
||||
}
|
||||
if (!customerName.value.trim()) {
|
||||
showToast("请填写客户姓名", "warning");
|
||||
Message.warning("请填写客户姓名");
|
||||
return "";
|
||||
}
|
||||
if (!validateCustomerPhotoList()) {
|
||||
@@ -741,21 +741,13 @@ function validateForm(): string {
|
||||
const pointValue = resolveSourceValue();
|
||||
const range = sourceValueConfig.value?.range;
|
||||
if (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue)) {
|
||||
showToast(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`, "warning");
|
||||
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
return customerCode;
|
||||
}
|
||||
|
||||
function showToast(message: string, theme: "success" | "warning" = "success"): void {
|
||||
Toast({
|
||||
theme,
|
||||
direction: "row",
|
||||
message
|
||||
});
|
||||
}
|
||||
|
||||
// ---------- 初始化 ----------
|
||||
|
||||
onMounted(async () => {
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import EventRecordAPI from "@/api/EventRecordAPI";
|
||||
@@ -143,7 +143,7 @@ async function selectEvent(eventId?: string): Promise<void> {
|
||||
Storage.setString(EventItemStorageKey, selectedEventId);
|
||||
eventSelectorVisible.value = false;
|
||||
await loadSourceValueRule();
|
||||
Toast.success("登记事件已切换");
|
||||
Message.success("登记事件已切换");
|
||||
}
|
||||
|
||||
onMounted(loadActions);
|
||||
@@ -251,16 +251,16 @@ async function doSubmit(): Promise<void> {
|
||||
const pointValue = resolveSourceValue();
|
||||
const numberValue = resolveNumberValue();
|
||||
if (showNumberValueInput.value && numberValueText.value.trim() && numberValue === undefined) {
|
||||
Toast.warning("事件数值格式不正确,请检查单位和小数位");
|
||||
Message.warning("事件数值格式不正确,请检查单位和小数位");
|
||||
return;
|
||||
}
|
||||
if (selectedEvent.value?.requireValue && numberValue === undefined) {
|
||||
Toast.warning("请填写事件数值");
|
||||
Message.warning("请填写事件数值");
|
||||
return;
|
||||
}
|
||||
const range = sourceValueConfig.value?.range;
|
||||
if (showSourceValueInput.value && (!pointValue || !range || Math.abs(pointValue) < range[0] || range[1] < Math.abs(pointValue))) {
|
||||
Toast.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
|
||||
Message.warning(`积分数量必须是 ${range?.[0] || 1}-${range?.[1] || 0} 的正整数`);
|
||||
return;
|
||||
}
|
||||
submitting.value = true;
|
||||
|
||||
@@ -19,10 +19,11 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { NotifyAPI, type NotifyDetail, PassTimeLabel } from "timi-web";
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { corePermissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
@@ -62,7 +63,7 @@ async function loadDetail(): Promise<void> {
|
||||
await markRead(result, requestToken);
|
||||
} catch (error) {
|
||||
console.warn("通知详情加载失败", error);
|
||||
Toast.error("通知详情加载失败");
|
||||
Message.error("通知详情加载失败");
|
||||
} finally {
|
||||
if (requestToken === loadToken) {
|
||||
isLoading.value = false;
|
||||
@@ -106,10 +107,10 @@ async function deleteDetail(detailId: string): Promise<void> {
|
||||
navBarStore.clearRight();
|
||||
try {
|
||||
await NotifyAPI.deleteInternal(detailId);
|
||||
Toast.success("通知已删除");
|
||||
Message.success("通知已删除");
|
||||
await router.replace({ name: "NotifyList" });
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "通知删除失败"));
|
||||
Message.error(getErrorMessage(error, "通知删除失败"));
|
||||
setDeleteAction();
|
||||
} finally {
|
||||
isDeleting.value = false;
|
||||
|
||||
@@ -66,7 +66,8 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { NotifyAPI, Time, type NotifyDetail, type Page, type PageResult, useUserStore } from "timi-web";
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { corePermissionCodes } from "@/utils/permission";
|
||||
@@ -220,10 +221,10 @@ async function markAllRead(): Promise<void> {
|
||||
await NotifyAPI.markAllInternalRead();
|
||||
unreadCount.value = 0;
|
||||
await reloadList();
|
||||
Toast.success("已全部标记为已读");
|
||||
Message.success("已全部标记为已读");
|
||||
} catch (error) {
|
||||
console.warn("全部通知标记已读失败", error);
|
||||
Toast.error("全部标记已读失败");
|
||||
Message.error("全部标记已读失败");
|
||||
} finally {
|
||||
isMarkingAllRead.value = false;
|
||||
updateNavBarAction();
|
||||
@@ -261,9 +262,9 @@ async function deleteNotification(detailId: string): Promise<void> {
|
||||
await NotifyAPI.deleteInternal(detailId);
|
||||
await reloadList();
|
||||
await loadUnreadCount();
|
||||
Toast.success("通知已删除");
|
||||
Message.success("通知已删除");
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "通知删除失败"));
|
||||
Message.error(getErrorMessage(error, "通知删除失败"));
|
||||
} finally {
|
||||
deletingId.value = "";
|
||||
}
|
||||
@@ -320,7 +321,7 @@ onMounted(async () => {
|
||||
await loadUnreadCount();
|
||||
} catch (error) {
|
||||
console.warn("站内通知加载失败", error);
|
||||
Toast.error("站内通知加载失败");
|
||||
Message.error("站内通知加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { moduleCode, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
|
||||
import { corePermissionCodes } from "@/utils/permission";
|
||||
|
||||
@@ -75,7 +75,7 @@ async function savePermission(): Promise<void> {
|
||||
name: formModel.name,
|
||||
description: formModel.description
|
||||
}, isCreateMode.value);
|
||||
Toast.success("权限已保存");
|
||||
Message.success("权限已保存");
|
||||
await router.push(isCreateMode.value ? "/management/permissions/items" : `/management/permissions/items/${permission?.id || formModel.id}`);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { type Permission, useUserStore } from "timi-web";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import { type Role, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
|
||||
@@ -131,7 +131,7 @@ async function savePermissionList(): Promise<void> {
|
||||
...checkedPermissionIds.value,
|
||||
...unmanagedPermissionIds.value
|
||||
])));
|
||||
Toast.success("D 已保存");
|
||||
Message.success("D 已保存");
|
||||
await loadActiveRolePermissions();
|
||||
} catch (error) {
|
||||
clearPermissionState();
|
||||
@@ -139,7 +139,7 @@ async function savePermissionList(): Promise<void> {
|
||||
await loadAuthorizationScope();
|
||||
await loadActiveRolePermissions();
|
||||
} finally {
|
||||
Toast.error(getErrorMessage(error, "D 保存失败"));
|
||||
Message.error(getErrorMessage(error, "D 保存失败"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
@@ -233,7 +233,7 @@ function openParentRolePicker(): void {
|
||||
return;
|
||||
}
|
||||
if (!parentRoleOptions.value.length) {
|
||||
Toast.warning("暂无可选上级");
|
||||
Message.warning("暂无可选上级");
|
||||
return;
|
||||
}
|
||||
parentRolePickerDraft.value = [formModel.parentRoleId];
|
||||
@@ -387,7 +387,7 @@ async function saveBaseInfo(): Promise<void> {
|
||||
savingTarget.value = "base";
|
||||
try {
|
||||
if (isCreateMode.value && !formModel.parentRoleId) {
|
||||
Toast.warning("请选择管理父级");
|
||||
Message.warning("请选择管理父级");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -406,11 +406,11 @@ async function saveBaseInfo(): Promise<void> {
|
||||
if (!isCreateMode.value && formModel.parentRoleId !== currentRole.value?.parentRoleId) {
|
||||
await permissionStore.setRoleParentRole(formModel.id, formModel.parentRoleId);
|
||||
}
|
||||
Toast.success(isCreateMode.value ? "角色已创建" : "基础信息已保存");
|
||||
Message.success(isCreateMode.value ? "角色已创建" : "基础信息已保存");
|
||||
await router.push(`/management/permissions/roles/${role?.id || formModel.id}`);
|
||||
} catch (error) {
|
||||
await reloadAfterError();
|
||||
Toast.error(getErrorMessage(error, "角色保存失败"));
|
||||
Message.error(getErrorMessage(error, "角色保存失败"));
|
||||
} finally {
|
||||
savingTarget.value = "";
|
||||
}
|
||||
@@ -427,12 +427,12 @@ async function saveRoleInherit(): Promise<void> {
|
||||
await permissionStore.setRoleChildRoleList(formModel.id, childRoleIdList);
|
||||
formModel.childRoleIdList = childRoleIdList;
|
||||
childRolePickerVisible.value = false;
|
||||
Toast.success("继承关系已保存");
|
||||
Message.success("继承关系已保存");
|
||||
await reloadCurrentRole();
|
||||
} catch (error) {
|
||||
await reloadAfterError();
|
||||
childRolePickerDraft.value = [...formModel.childRoleIdList];
|
||||
Toast.error(getErrorMessage(error, "继承关系保存失败"));
|
||||
Message.error(getErrorMessage(error, "继承关系保存失败"));
|
||||
} finally {
|
||||
savingTarget.value = "";
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import type { Role } from "@/store/permissionSettingsStore";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
@@ -81,7 +81,7 @@ async function removeRole(id: string): Promise<void> {
|
||||
} catch (error) {
|
||||
await refreshAuthorizationScope();
|
||||
await permissionStore.loadAll(true);
|
||||
Toast.error(getErrorMessage(error, "角色删除失败"));
|
||||
Message.error(getErrorMessage(error, "角色删除失败"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { type Permission, useUserStore } from "timi-web";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import { type Role, usePermissionSettingsStore } from "@/store/permissionSettingsStore";
|
||||
@@ -141,7 +141,7 @@ async function savePermissionList(): Promise<void> {
|
||||
...checkedPermissionIds.value,
|
||||
...unmanagedPermissionIds.value
|
||||
])));
|
||||
Toast.success("已保存");
|
||||
Message.success("已保存");
|
||||
await loadActiveRolePermissions();
|
||||
} catch (error) {
|
||||
clearPermissionState();
|
||||
@@ -149,7 +149,7 @@ async function savePermissionList(): Promise<void> {
|
||||
await loadAuthorizationScope();
|
||||
await loadActiveRolePermissions();
|
||||
} finally {
|
||||
Toast.error(getErrorMessage(error, "保存失败"));
|
||||
Message.error(getErrorMessage(error, "保存失败"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
@@ -149,7 +149,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
|
||||
try {
|
||||
const matched = await CustomerAPI.findByCode(normalizedCode);
|
||||
if (!matched?.id) {
|
||||
Toast.warning("未找到客户");
|
||||
Message.warning("未找到客户");
|
||||
return;
|
||||
}
|
||||
selectedCustomerId.value = matched.id;
|
||||
@@ -160,7 +160,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
|
||||
});
|
||||
await loadAccount();
|
||||
} catch {
|
||||
Toast.error("客户信息加载失败");
|
||||
Message.error("客户信息加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ async function loadAccount(): Promise<void> {
|
||||
} catch {
|
||||
customer.value = undefined;
|
||||
account.value = undefined;
|
||||
Toast.error("客户信息加载失败");
|
||||
Message.error("客户信息加载失败");
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import type { PointAction } from "@/types/Point";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
@@ -141,7 +141,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
|
||||
try {
|
||||
const matched = await CustomerAPI.findByCode(normalizedCode);
|
||||
if (!matched?.id) {
|
||||
Toast.warning("未找到客户");
|
||||
Message.warning("未找到客户");
|
||||
return;
|
||||
}
|
||||
selectedCustomerId.value = matched.id;
|
||||
@@ -150,7 +150,7 @@ async function loadCustomerByCode(code: string): Promise<void> {
|
||||
} catch {
|
||||
selectedCustomer.value = undefined;
|
||||
account.value = undefined;
|
||||
Toast.error("客户信息加载失败");
|
||||
Message.error("客户信息加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ async function loadCustomerAccount(): Promise<void> {
|
||||
} catch {
|
||||
selectedCustomer.value = undefined;
|
||||
account.value = undefined;
|
||||
Toast.error("客户信息加载失败");
|
||||
Message.error("客户信息加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,23 +243,23 @@ function confirmPointActionPicker(value: Array<string | number>): void {
|
||||
async function submitAdjust(): Promise<void> {
|
||||
const pointDelta = parsePointDelta();
|
||||
if (!selectedCustomerId.value) {
|
||||
Toast.warning("请选择客户");
|
||||
Message.warning("请选择客户");
|
||||
return;
|
||||
}
|
||||
if (!currentStoreStore.currentStoreId) {
|
||||
Toast.warning("当前门店未设置");
|
||||
Message.warning("当前门店未设置");
|
||||
return;
|
||||
}
|
||||
if (!pointDelta) {
|
||||
Toast.warning("调整积分不能为 0,且必须是整数");
|
||||
Message.warning("调整积分不能为 0,且必须是整数");
|
||||
return;
|
||||
}
|
||||
if (!remark.value.trim()) {
|
||||
Toast.warning("请填写调整原因");
|
||||
Message.warning("请填写调整原因");
|
||||
return;
|
||||
}
|
||||
if (pointDelta < 0 && Math.abs(pointDelta) > (account.value?.balance ?? 0)) {
|
||||
Toast.warning("扣分后余额不能小于 0");
|
||||
Message.warning("扣分后余额不能小于 0");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -272,13 +272,13 @@ async function submitAdjust(): Promise<void> {
|
||||
pointDelta,
|
||||
remark: remark.value.trim()
|
||||
});
|
||||
Toast.success("积分调整已提交");
|
||||
Message.success("积分调整已提交");
|
||||
await router.replace({
|
||||
name: "PointLedgerList",
|
||||
query: { customerId: selectedCustomerId.value }
|
||||
});
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "积分调整失败"));
|
||||
Message.error(getErrorMessage(error, "积分调整失败"));
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -293,7 +293,7 @@ onMounted(async () => {
|
||||
await prepareStoreScope();
|
||||
await loadCustomerAccount();
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "门店信息加载失败"));
|
||||
Message.error(getErrorMessage(error, "门店信息加载失败"));
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast, type DropdownValue } from "tdesign-mobile-vue";
|
||||
import type { DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Time, type PageResult, useUserStore } from "timi-web";
|
||||
import CustomerAPI from "@/api/CustomerAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
@@ -165,6 +165,7 @@ import { useSettingStore } from "@/store/settingStore";
|
||||
import type { Customer } from "@/types/Customer";
|
||||
import type { PointLedger, PointLedgerChangeType, PointLedgerPage } from "@/types/Point";
|
||||
import { getCustomerPhotoURL } from "@/utils/customer";
|
||||
import { Message } from "@/utils/message";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
|
||||
type DateFilter = "all" | "today" | "last7" | "last30" | "custom";
|
||||
@@ -228,14 +229,14 @@ async function loadCustomerByCode(code: string): Promise<void> {
|
||||
try {
|
||||
const matched = await CustomerAPI.findByCode(normalizedCode);
|
||||
if (!matched?.id) {
|
||||
Toast.warning("未找到客户");
|
||||
Message.warning("未找到客户");
|
||||
return;
|
||||
}
|
||||
selectedCustomerId.value = matched.id;
|
||||
customer.value = matched;
|
||||
await reload();
|
||||
} catch {
|
||||
Toast.error("客户信息加载失败");
|
||||
Message.error("客户信息加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -353,7 +354,7 @@ async function load(): Promise<void> {
|
||||
page.index += 1;
|
||||
isNoMore.value = pageResult.list.length >= pageResult.total || list.length < page.size;
|
||||
} catch {
|
||||
Toast.error("积分流水加载失败");
|
||||
Message.error("积分流水加载失败");
|
||||
} finally {
|
||||
if (token === loadToken) {
|
||||
isLoading.value = false;
|
||||
@@ -492,7 +493,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await preparePage();
|
||||
} catch {
|
||||
Toast.error("积分流水页面加载失败");
|
||||
Message.error("积分流水页面加载失败");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { Time, useUserStore } from "timi-web";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
@@ -197,11 +197,26 @@ import PointRuleTierEditor from "@/pages/point/component/PointRuleTierEditor.vue
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import type { EventItem } from "@/types/EventItem";
|
||||
import type { PointAction, PointRule, PointRuleMode, PointRuleStatus, PointRuleTier, PointRuleTierForm, PointRuleTriggerType } from "@/types/Point";
|
||||
import type {
|
||||
PointAction,
|
||||
PointRule,
|
||||
PointRuleMode,
|
||||
PointRuleStatus,
|
||||
PointRuleTier,
|
||||
PointRuleTierForm,
|
||||
PointRuleTriggerType
|
||||
} from "@/types/Point";
|
||||
import { getEventValueUnitText } from "@/utils/eventValue";
|
||||
import { getErrorMessage } from "@/utils/error";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
import { formatTierBoundaryValue, getTierMinValue, isLastTier, resolveNonNegativeInteger, resolveTierBoundaryValue } from "@/utils/pointRule";
|
||||
import {
|
||||
formatTierBoundaryValue,
|
||||
getTierMinValue,
|
||||
isLastTier,
|
||||
resolveNonNegativeInteger,
|
||||
resolveTierBoundaryValue
|
||||
} from "@/utils/pointRule";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
type PickerValue = string | number;
|
||||
|
||||
@@ -316,7 +331,7 @@ async function confirmStorePicker(value: Array<string | number>): Promise<void>
|
||||
await loadEventList();
|
||||
} catch {
|
||||
eventList.value = [];
|
||||
Toast.error("登记事件加载失败");
|
||||
Message.error("登记事件加载失败");
|
||||
}
|
||||
}
|
||||
storePickerVisible.value = false;
|
||||
@@ -324,7 +339,7 @@ async function confirmStorePicker(value: Array<string | number>): Promise<void>
|
||||
|
||||
function openEventPicker(): void {
|
||||
if (!eventPickerColumns.value[0]?.length) {
|
||||
Toast.warning("暂无可选登记事件");
|
||||
Message.warning("暂无可选登记事件");
|
||||
return;
|
||||
}
|
||||
eventPickerDraft.value = [formModel.eventId];
|
||||
@@ -344,7 +359,7 @@ function openSourceEventPicker(): void {
|
||||
return;
|
||||
}
|
||||
if (!sourceEventPickerColumns.value[0]?.length) {
|
||||
Toast.warning("暂无可用的 NUMBER 来源事件");
|
||||
Message.warning("暂无可用的 NUMBER 来源事件");
|
||||
return;
|
||||
}
|
||||
sourceEventPickerDraft.value = [formModel.sourceEventId];
|
||||
@@ -358,7 +373,7 @@ function confirmSourceEventPicker(value: Array<string | number>): void {
|
||||
const nextSourceEvent = sourceEventList.value.find(item => item.id === sourceEventId);
|
||||
if (formModel.sourceEventId && previousSourceEvent?.valueUnit !== nextSourceEvent?.valueUnit) {
|
||||
formModel.tiers = [createTierForm(undefined, true, nextSourceEvent?.valueUnit)];
|
||||
Toast.warning("来源事件单位已变化,原分档已清空,请重新配置");
|
||||
Message.warning("来源事件单位已变化,原分档已清空,请重新配置");
|
||||
}
|
||||
formModel.sourceEventId = sourceEventId;
|
||||
}
|
||||
@@ -617,36 +632,36 @@ function buildCondition(): PointRule["conditionJson"] {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!formModel.storeId) {
|
||||
Toast.warning("请选择门店");
|
||||
Message.warning("请选择门店");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.eventId) {
|
||||
Toast.warning("请选择登记事件");
|
||||
Message.warning("请选择登记事件");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.name.trim()) {
|
||||
Toast.warning("请输入规则名称");
|
||||
Message.warning("请输入规则名称");
|
||||
return false;
|
||||
}
|
||||
if (formModel.triggerType === "CUSTOMER_EVENT_VALUE_TIER") {
|
||||
if (formModel.pointMode !== "TIER") {
|
||||
Toast.warning("分档规则必须使用分档积分模式");
|
||||
Message.warning("分档规则必须使用分档积分模式");
|
||||
return false;
|
||||
}
|
||||
if (!selectedSourceEvent.value) {
|
||||
Toast.warning("请选择 NUMBER 类型的来源事件");
|
||||
Message.warning("请选择 NUMBER 类型的来源事件");
|
||||
return false;
|
||||
}
|
||||
if (selectedSourceValueUnit.value !== "CENT" && selectedSourceValueUnit.value !== "COUNT") {
|
||||
Toast.warning("来源事件必须配置数值单位");
|
||||
Message.warning("来源事件必须配置数值单位");
|
||||
return false;
|
||||
}
|
||||
if (!resolvePositiveInteger(formModel.windowAmountText)) {
|
||||
Toast.warning("累计窗口必须是正整数");
|
||||
Message.warning("累计窗口必须是正整数");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.tiers.length || !(formModel.tiers.length < 100)) {
|
||||
Toast.warning("分档数量必须是 1-100 档");
|
||||
Message.warning("分档数量必须是 1-100 档");
|
||||
return false;
|
||||
}
|
||||
for (let i = 0; i < formModel.tiers.length; i++) {
|
||||
@@ -654,17 +669,17 @@ function validateForm(): boolean {
|
||||
const min = getTierMinValue(formModel.tiers, i, selectedSourceValueUnit.value);
|
||||
const pointValue = resolveNonNegativeInteger(tier.pointValueText);
|
||||
if (min === undefined) {
|
||||
Toast.warning(`第 ${i + 1} 档的上一档最大值无效`);
|
||||
Message.warning(`第 ${i + 1} 档的上一档最大值无效`);
|
||||
return false;
|
||||
}
|
||||
if (pointValue === undefined) {
|
||||
Toast.warning(`第 ${i + 1} 档积分数量必须是大于等于 0 的整数`);
|
||||
Message.warning(`第 ${i + 1} 档积分数量必须是大于等于 0 的整数`);
|
||||
return false;
|
||||
}
|
||||
if (!isLastTier(formModel.tiers, i)) {
|
||||
const max = resolveTierBoundaryValue(tier.maxText, selectedSourceValueUnit.value);
|
||||
if (max === undefined || max < min) {
|
||||
Toast.warning(selectedSourceValueUnit.value === "CENT"
|
||||
Message.warning(selectedSourceValueUnit.value === "CENT"
|
||||
? `第 ${i + 1} 档最大值必须是不小于最小值且最多两位小数`
|
||||
: `第 ${i + 1} 档最大值必须是不小于最小值的整数`);
|
||||
return false;
|
||||
@@ -672,25 +687,25 @@ function validateForm(): boolean {
|
||||
}
|
||||
}
|
||||
} else if (formModel.pointMode === "FIXED" && !resolvePositiveInteger(formModel.pointValueText)) {
|
||||
Toast.warning("积分数量必须是正整数");
|
||||
Message.warning("积分数量必须是正整数");
|
||||
return false;
|
||||
}
|
||||
if (formModel.triggerType === "AFTER_COUNT_EVERY_TIME" && !resolvePositiveInteger(formModel.thresholdText)) {
|
||||
Toast.warning("请输入有效的触发阈值");
|
||||
Message.warning("请输入有效的触发阈值");
|
||||
return false;
|
||||
}
|
||||
if (formModel.pointMode === "SOURCE_VALUE") {
|
||||
const min = resolvePositiveInteger(formModel.minText);
|
||||
const max = resolvePositiveInteger(formModel.maxText);
|
||||
if (!min || !max || max < min) {
|
||||
Toast.warning("积分数量范围必须是正整数,且最大值不能小于最小值");
|
||||
Message.warning("积分数量范围必须是正整数,且最大值不能小于最小值");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const beginAt = resolveTimestamp(formModel.beginAtText);
|
||||
const endAt = resolveTimestamp(formModel.endAtText);
|
||||
if (beginAt !== undefined && endAt !== undefined && endAt < beginAt) {
|
||||
Toast.warning("生效结束时间不能早于开始时间");
|
||||
Message.warning("生效结束时间不能早于开始时间");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -722,10 +737,10 @@ async function saveRule(): Promise<void> {
|
||||
} else {
|
||||
await PointAPI.ruleUpdate(payload);
|
||||
}
|
||||
Toast.success("积分规则已保存");
|
||||
Message.success("积分规则已保存");
|
||||
await router.replace("/management/points/rules");
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "积分规则保存失败"));
|
||||
Message.error(getErrorMessage(error, "积分规则保存失败"));
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -759,10 +774,10 @@ async function removeRule(): Promise<void> {
|
||||
isRemoving.value = true;
|
||||
try {
|
||||
await PointAPI.ruleRemove(formModel.id);
|
||||
Toast.success("积分规则已删除");
|
||||
Message.success("积分规则已删除");
|
||||
await router.replace("/management/points/rules");
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "积分规则删除失败"));
|
||||
Message.error(getErrorMessage(error, "积分规则删除失败"));
|
||||
} finally {
|
||||
isRemoving.value = false;
|
||||
}
|
||||
@@ -817,7 +832,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await fillForm();
|
||||
} catch (error) {
|
||||
Toast.error(getErrorMessage(error, "积分规则加载失败"));
|
||||
Message.error(getErrorMessage(error, "积分规则加载失败"));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { type DropdownValue, Toast } from "tdesign-mobile-vue";
|
||||
import { type DropdownValue } from "tdesign-mobile-vue";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
@@ -71,6 +71,7 @@ import type { EventItem } from "@/types/EventItem";
|
||||
import type { PointRule, PointRuleStatus } from "@/types/Point";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
import { type Page, type PageResult, useUserStore } from "timi-web";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
defineOptions({
|
||||
name: "PointRuleList"
|
||||
@@ -158,7 +159,7 @@ async function load(): Promise<void> {
|
||||
page.index += 1;
|
||||
isNoMore.value = pageResult.list.length >= pageResult.total || list.length < page.size;
|
||||
} catch {
|
||||
Toast.error("积分规则加载失败");
|
||||
Message.error("积分规则加载失败");
|
||||
} finally {
|
||||
if (token === loadToken) {
|
||||
isLoading.value = false;
|
||||
@@ -274,7 +275,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await preparePage();
|
||||
} catch {
|
||||
Toast.error("积分规则页面加载失败");
|
||||
Message.error("积分规则页面加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { VueDraggableNext } from "vue-draggable-next";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import PointAPI from "@/api/PointAPI";
|
||||
@@ -95,10 +95,10 @@ async function saveSort(): Promise<void> {
|
||||
await PointAPI.ruleSort(idList);
|
||||
ruleList.value.forEach((item, index) => { item.priority = index; });
|
||||
sortDirty.value = false;
|
||||
Toast.success("积分规则排序已保存");
|
||||
Message.success("积分规则排序已保存");
|
||||
await router.back();
|
||||
} catch {
|
||||
Toast.error("积分规则排序保存失败");
|
||||
Message.error("积分规则排序保存失败");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -110,7 +110,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("启用积分规则加载失败");
|
||||
Message.error("启用积分规则加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
import type { EventValueUnit } from "@/types/EventItem";
|
||||
import type { PointAction, PointRuleTierForm } from "@/types/Point";
|
||||
import { formatTierBoundaryValue, getTierMinText, getTierMinValue, isLastTier, resolveNonNegativeInteger, resolveTierBoundaryValue } from "@/utils/pointRule";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
defineOptions({
|
||||
name: "PointRuleTierEditor"
|
||||
@@ -173,20 +173,20 @@ function confirmTierEditor(): void {
|
||||
: getTierMinValue(tiers.value, index, valueUnit.value);
|
||||
const pointValue = resolveNonNegativeInteger(tierEditorDraft.pointValueText);
|
||||
if (min === undefined) {
|
||||
Toast.warning(index < 1
|
||||
Message.warning(index < 1
|
||||
? valueUnit.value === "CENT" ? "首档最小值必须是非负且最多两位小数" : "首档最小值必须是非负整数"
|
||||
: "请先修正上一档的最大值");
|
||||
return;
|
||||
}
|
||||
if (pointValue === undefined) {
|
||||
Toast.warning("积分数量必须是大于等于 0 的整数,允许填写 0");
|
||||
Message.warning("积分数量必须是大于等于 0 的整数,允许填写 0");
|
||||
return;
|
||||
}
|
||||
const shouldAddTier = tierEditorAdding.value && isLastTier(tiers.value, index);
|
||||
if (!isLastTier(tiers.value, index) || shouldAddTier) {
|
||||
const max = resolveTierBoundaryValue(tierEditorDraft.maxText, valueUnit.value);
|
||||
if (max === undefined || max < min) {
|
||||
Toast.warning(valueUnit.value === "CENT" ? "当前档最大值必须是不小于最小值且最多两位小数" : "当前档最大值必须是不小于最小值的整数");
|
||||
Message.warning(valueUnit.value === "CENT" ? "当前档最大值必须是不小于最小值且最多两位小数" : "当前档最大值必须是不小于最小值的整数");
|
||||
return;
|
||||
}
|
||||
tier.maxText = formatTierBoundaryValue(max, valueUnit.value);
|
||||
@@ -206,7 +206,7 @@ function confirmTierEditor(): void {
|
||||
|
||||
function addTier(): void {
|
||||
if (!(tiers.value.length < 100)) {
|
||||
Toast.warning("最多配置 100 档");
|
||||
Message.warning("最多配置 100 档");
|
||||
return;
|
||||
}
|
||||
const lastTierIndex = tiers.value.length - 1;
|
||||
|
||||
@@ -84,11 +84,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast, type CalendarProps, type TDate } from "tdesign-mobile-vue";
|
||||
import { type CalendarProps, DialogPlugin, type TDate } from "tdesign-mobile-vue";
|
||||
import { useUserStore } from "timi-web";
|
||||
import StoreAPI from "@/api/StoreAPI";
|
||||
import type { Store, StoreBusinessDay, StoreBusinessDayStatus } from "@/types/Store";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
defineOptions({
|
||||
name: "StoreBusinessDayCalendar"
|
||||
@@ -167,7 +168,7 @@ async function handlePanelChange(context: { year: number; month: number }): Prom
|
||||
try {
|
||||
await loadCalendar(context.year, context.month);
|
||||
} catch {
|
||||
Toast.error("营业日加载失败");
|
||||
Message.error("营业日加载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,11 +227,11 @@ async function saveDay(): Promise<void> {
|
||||
} else {
|
||||
await StoreAPI.createBusinessDay(day);
|
||||
}
|
||||
Toast.success("营业日已保存");
|
||||
Message.success("营业日已保存");
|
||||
editorVisible.value = false;
|
||||
await loadCalendar(calendarMonth.year, calendarMonth.month);
|
||||
} catch {
|
||||
Toast.error("营业日保存失败");
|
||||
Message.error("营业日保存失败");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -238,7 +239,7 @@ async function saveDay(): Promise<void> {
|
||||
|
||||
function validateDay(): boolean {
|
||||
if (!formModel.dateText) {
|
||||
Toast.warning("请选择日期");
|
||||
Message.warning("请选择日期");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -271,11 +272,11 @@ async function removeDay(id: string): Promise<void> {
|
||||
isDeleting.value = true;
|
||||
try {
|
||||
await StoreAPI.removeBusinessDay(id);
|
||||
Toast.success("营业日已删除");
|
||||
Message.success("营业日已删除");
|
||||
editorVisible.value = false;
|
||||
await loadCalendar(calendarMonth.year, calendarMonth.month);
|
||||
} catch {
|
||||
Toast.error("营业日删除失败");
|
||||
Message.error("营业日删除失败");
|
||||
} finally {
|
||||
isDeleting.value = false;
|
||||
}
|
||||
@@ -311,7 +312,7 @@ onMounted(async () => {
|
||||
]);
|
||||
store.value = currentStore;
|
||||
} catch {
|
||||
Toast.error("营业日数据加载失败");
|
||||
Message.error("营业日数据加载失败");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -56,12 +56,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { useUserStore } from "timi-web";
|
||||
import StoreAPI from "@/api/StoreAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import type { StoreStatus } from "@/types/Store";
|
||||
import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
defineOptions({
|
||||
name: "StoreEdit"
|
||||
@@ -106,7 +107,7 @@ async function doSave(): Promise<void> {
|
||||
await StoreAPI.update(formData);
|
||||
await refreshCurrentStore();
|
||||
}
|
||||
Toast.success("门店已保存");
|
||||
Message.success("门店已保存");
|
||||
if (userStore.hasPermissions(permissionCodes.store.create)) {
|
||||
await router.replace("/management/stores");
|
||||
} else {
|
||||
@@ -127,11 +128,11 @@ async function refreshCurrentStore(): Promise<void> {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!isStoreManagerScope.value && !formData.code) {
|
||||
Toast.warning("请填写门店编码");
|
||||
Message.warning("请填写门店编码");
|
||||
return false;
|
||||
}
|
||||
if (!formData.name) {
|
||||
Toast.warning("请填写门店名称");
|
||||
Message.warning("请填写门店名称");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -145,7 +146,7 @@ onMounted(async () => {
|
||||
const current = await StoreAPI.detail(routeId.value);
|
||||
Object.assign(formData, current);
|
||||
} catch {
|
||||
Toast.error("门店数据加载失败");
|
||||
Message.error("门店数据加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -178,7 +179,7 @@ async function removeStore(): Promise<void> {
|
||||
isRemoving.value = true;
|
||||
try {
|
||||
await StoreAPI.remove(formData.id);
|
||||
Toast.success("门店已删除");
|
||||
Message.success("门店已删除");
|
||||
await router.replace("/management/stores");
|
||||
} finally {
|
||||
isRemoving.value = false;
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { Time, Toolkit, type Page, type PageResult, useUserStore } from "timi-web";
|
||||
import StoreAPI from "@/api/StoreAPI";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
@@ -129,7 +129,7 @@ async function exportExcel(): Promise<void> {
|
||||
orderMap: page.orderMap
|
||||
});
|
||||
Toolkit.downloadBlob(blob, `门店列表-${Time.formatDate(new Date())}.xlsx`);
|
||||
Toast.success("导出已开始");
|
||||
Message.success("导出已开始");
|
||||
} finally {
|
||||
isExporting.value = false;
|
||||
}
|
||||
@@ -152,7 +152,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await fetch();
|
||||
} catch {
|
||||
Toast.error("门店列表加载失败");
|
||||
Message.error("门店列表加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -46,11 +46,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast, type TagProps } from "tdesign-mobile-vue";
|
||||
import type { TagProps } from "tdesign-mobile-vue";
|
||||
import { VueDraggableNext } from "vue-draggable-next";
|
||||
import StoreAPI from "@/api/StoreAPI";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import type { Store, StoreStatus } from "@/types/Store";
|
||||
import { Message } from "@/utils/message";
|
||||
import { permissionCodes } from "@/utils/permission";
|
||||
|
||||
defineOptions({
|
||||
@@ -100,10 +101,10 @@ async function saveSort(): Promise<void> {
|
||||
item.sort = index;
|
||||
});
|
||||
sortDirty.value = false;
|
||||
Toast.success("门店排序已保存");
|
||||
Message.success("门店排序已保存");
|
||||
await router.back();
|
||||
} catch {
|
||||
Toast.error("门店排序保存失败");
|
||||
Message.error("门店排序保存失败");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -135,7 +136,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("门店加载失败");
|
||||
Message.error("门店加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import { gaoRoleCodes, gaoStoreScopePermissionCodes, permissionCodes } from "@/utils/permission";
|
||||
@@ -93,7 +93,7 @@ function openStorePicker(): void {
|
||||
}
|
||||
|
||||
if (!currentStoreStore.storeList.length) {
|
||||
Toast.warning("暂无可选门店");
|
||||
Message.warning("暂无可选门店");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ function confirmStorePicker(): void {
|
||||
|
||||
currentStoreStore.selectStore(storeId);
|
||||
storePickerVisible.value = false;
|
||||
Toast.success("当前门店已切换");
|
||||
Message.success("当前门店已切换");
|
||||
}
|
||||
|
||||
// ---------- 门店管理 ----------
|
||||
@@ -122,7 +122,7 @@ async function goStoreManagement(): Promise<void> {
|
||||
|
||||
const store = await currentStoreStore.loadLoginStore();
|
||||
if (!store?.id) {
|
||||
Toast.warning("未绑定所属门店");
|
||||
Message.warning("未绑定所属门店");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,11 +62,12 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { type Page, useUserStore } from "timi-web";
|
||||
import TagAPI from "@/api/TagAPI";
|
||||
import type { Tag } from "@/types/Tag";
|
||||
import { corePermissionCodes } from "@/utils/permission";
|
||||
import { Message } from "@/utils/message.ts";
|
||||
|
||||
defineOptions({
|
||||
name: "TagList"
|
||||
@@ -136,7 +137,7 @@ async function fetch(reset = false): Promise<void> {
|
||||
isNoMore.value = list.length < page.size || total.value <= tagList.value.length;
|
||||
} catch {
|
||||
if (token === requestToken) {
|
||||
Toast.error("标签加载失败");
|
||||
Message.error("标签加载失败");
|
||||
}
|
||||
} finally {
|
||||
if (token === requestToken) {
|
||||
@@ -183,7 +184,7 @@ function closeEditDialog(): void {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!formModel.name.trim()) {
|
||||
Toast.warning("请输入标签名称");
|
||||
Message.warning("请输入标签名称");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -207,9 +208,9 @@ async function saveTag(): Promise<void> {
|
||||
}
|
||||
editDialogVisible.value = false;
|
||||
await reload();
|
||||
Toast.success("标签已保存");
|
||||
Message.success("标签已保存");
|
||||
} catch {
|
||||
Toast.error("标签保存失败");
|
||||
Message.error("标签保存失败");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
}
|
||||
@@ -243,9 +244,9 @@ async function removeTag(id: string): Promise<void> {
|
||||
try {
|
||||
await TagAPI.remove(id);
|
||||
await reload();
|
||||
Toast.success("标签已删除");
|
||||
Message.success("标签已删除");
|
||||
} catch {
|
||||
Toast.error("标签删除失败");
|
||||
Message.error("标签删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { Captcha, NotifyAPI, useUserStore, type LoginResponse, Time } from "timi-web";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
@@ -118,23 +118,23 @@ async function validateInvite(): Promise<void> {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!/^1\d{10}$/.test(formModel.phoneNo)) {
|
||||
Toast.warning("请输入正确的 11 位手机号");
|
||||
Message.warning("请输入正确的 11 位手机号");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.name || formModel.name.length > 191) {
|
||||
Toast.warning("请输入不超过 191 个字符的用户名");
|
||||
Message.warning("请输入不超过 191 个字符的用户名");
|
||||
return false;
|
||||
}
|
||||
if (formModel.password.length < 6) {
|
||||
Toast.warning("密码至少需要 6 个字符");
|
||||
Message.warning("密码至少需要 6 个字符");
|
||||
return false;
|
||||
}
|
||||
if (formModel.password !== formModel.confirmPassword) {
|
||||
Toast.warning("两次输入的密码不一致");
|
||||
Message.warning("两次输入的密码不一致");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.notifyDetailId || !/^\d{6}$/.test(formModel.smsCode)) {
|
||||
Toast.warning("请先获取并输入短信验证码");
|
||||
Message.warning("请先获取并输入短信验证码");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -169,7 +169,7 @@ async function sendSms(): Promise<void> {
|
||||
}
|
||||
const captchaId = getCaptchaId();
|
||||
if (!captchaId) {
|
||||
Toast.warning("图形验证码尚未加载,请稍后重试");
|
||||
Message.warning("图形验证码尚未加载,请稍后重试");
|
||||
await captchaRef.value?.update();
|
||||
return;
|
||||
}
|
||||
@@ -182,7 +182,7 @@ async function sendSms(): Promise<void> {
|
||||
}
|
||||
});
|
||||
startSmsTimer();
|
||||
Toast.success(`验证码已发送,请检查 ${formModel.phoneNo} 手机短信(易保网络)`);
|
||||
Message.success(`验证码已发送,请检查 ${formModel.phoneNo} 手机短信(易保网络)`);
|
||||
} catch {
|
||||
formModel.notifyDetailId = "";
|
||||
} finally {
|
||||
@@ -194,7 +194,7 @@ async function sendSms(): Promise<void> {
|
||||
async function register(): Promise<void> {
|
||||
if (isSubmitting.value || isExpired.value || !validateForm()) {
|
||||
if (isExpired.value) {
|
||||
Toast.warning("邀请码已失效,请联系邀请人重新生成");
|
||||
Message.warning("邀请码已失效,请联系邀请人重新生成");
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -212,7 +212,7 @@ async function register(): Promise<void> {
|
||||
});
|
||||
await userStore.updateLoginUser(result as LoginResponse);
|
||||
await currentStoreStore.loadAfterLogin();
|
||||
Toast.success("注册成功");
|
||||
Message.success("注册成功");
|
||||
await router.replace("/management");
|
||||
} catch {
|
||||
formModel.smsCode = "";
|
||||
@@ -222,7 +222,7 @@ async function register(): Promise<void> {
|
||||
}
|
||||
|
||||
async function handleCaptchaError(): Promise<void> {
|
||||
Toast.warning("验证码加载失败,请点击验证码重试");
|
||||
Message.warning("验证码加载失败,请点击验证码重试");
|
||||
}
|
||||
|
||||
let expireTimer = 0;
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { PassTimeLabel, type User, UserAPI } from "timi-web";
|
||||
import EventAPI from "@/api/EventAPI";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
@@ -186,7 +186,7 @@ onMounted(async () => {
|
||||
navBarStore.setRightText("编辑", "var(--td-brand-color)", toEdit);
|
||||
}
|
||||
} catch {
|
||||
Toast.error("用户详情加载失败");
|
||||
Message.error("用户详情加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
@@ -81,7 +81,7 @@ const selectedStoreName = computed(() => {
|
||||
|
||||
function openStorePicker(): void {
|
||||
if (!currentStoreStore.storeList.length) {
|
||||
Toast.warning("暂无可选门店");
|
||||
Message.warning("暂无可选门店");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ async function saveUser(): Promise<void> {
|
||||
});
|
||||
}
|
||||
}
|
||||
Toast.success("用户已保存");
|
||||
Message.success("用户已保存");
|
||||
const detailPath = `/management/users/${saved.id || formModel.id}`;
|
||||
if (isCreateMode.value) {
|
||||
await router.replace(detailPath);
|
||||
@@ -191,15 +191,15 @@ async function saveUser(): Promise<void> {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!formModel.name) {
|
||||
Toast.warning("请填写姓名");
|
||||
Message.warning("请填写姓名");
|
||||
return false;
|
||||
}
|
||||
if (!formModel.storeId) {
|
||||
Toast.warning("请选择门店");
|
||||
Message.warning("请选择门店");
|
||||
return false;
|
||||
}
|
||||
if (isCreateMode.value && !formModel.password) {
|
||||
Toast.warning("请填写密码");
|
||||
Message.warning("请填写密码");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -212,7 +212,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await fillForm();
|
||||
} catch {
|
||||
Toast.error("用户数据加载失败");
|
||||
Message.error("用户数据加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { createInvitePosterImage, downloadInvitePoster } from "@/utils/qrCode";
|
||||
|
||||
defineOptions({ name: "UserInvitePoster" });
|
||||
@@ -61,9 +61,9 @@ async function savePoster(): Promise<void> {
|
||||
isDownloading.value = true;
|
||||
try {
|
||||
await downloadInvitePoster(posterOptions.value, "GAO-邀请注册海报.png");
|
||||
Toast.success("海报已保存");
|
||||
Message.success("海报已保存");
|
||||
} catch {
|
||||
Toast.error("海报保存失败");
|
||||
Message.error("海报保存失败");
|
||||
} finally {
|
||||
isDownloading.value = false;
|
||||
}
|
||||
@@ -72,9 +72,9 @@ async function savePoster(): Promise<void> {
|
||||
async function copyLink(): Promise<void> {
|
||||
try {
|
||||
await navigator.clipboard.writeText(registerLink);
|
||||
Toast.success("注册链接已复制");
|
||||
Message.success("注册链接已复制");
|
||||
} catch {
|
||||
Toast.error("复制失败,请检查浏览器权限");
|
||||
Message.error("复制失败,请检查浏览器权限");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { type Page, type PageResult, UserAPI, type User, useUserStore } from "timi-web";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
@@ -227,7 +227,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("用户列表加载失败");
|
||||
Message.error("用户列表加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { UserAPI, useUserStore } from "timi-web";
|
||||
|
||||
defineOptions({
|
||||
@@ -39,11 +39,11 @@ const formModel = reactive({
|
||||
|
||||
async function savePassword(): Promise<void> {
|
||||
if (!formModel.oldPassword || !formModel.newPassword) {
|
||||
Toast.warning("请填写旧密码和新密码");
|
||||
Message.warning("请填写旧密码和新密码");
|
||||
return;
|
||||
}
|
||||
if (formModel.newPassword !== formModel.confirmPassword) {
|
||||
Toast.warning("两次输入的新密码不一致");
|
||||
Message.warning("两次输入的新密码不一致");
|
||||
return;
|
||||
}
|
||||
isSaving.value = true;
|
||||
@@ -53,7 +53,7 @@ async function savePassword(): Promise<void> {
|
||||
newValue: formModel.newPassword
|
||||
});
|
||||
userStore.clearLoginUser();
|
||||
Toast.success("密码已更新,请重新登录");
|
||||
Message.success("密码已更新,请重新登录");
|
||||
await router.replace("/login");
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
|
||||
@@ -53,12 +53,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DialogPlugin, Toast } from "tdesign-mobile-vue";
|
||||
import { DialogPlugin } from "tdesign-mobile-vue";
|
||||
import { AttachmentAPI, type Gender, UserAPI, useUserStore } from "timi-web";
|
||||
import PhotoField from "@/components/PhotoField.vue";
|
||||
import { useNavBarStore } from "@/store/navBarStore";
|
||||
import { buildFallbackAvatar } from "@/utils/avatar";
|
||||
import { compressUploadImage } from "@/utils/imageCompression";
|
||||
import { Message } from "@/utils/message";
|
||||
|
||||
type UserAvatarSource = NonNullable<Parameters<typeof UserAPI.getAvatarURL>[0]> & {
|
||||
name?: string;
|
||||
@@ -135,7 +136,7 @@ async function handleAvatarSelected(event: Event): Promise<void> {
|
||||
const compressedFile = await compressUploadImage(file);
|
||||
const [tempFile] = await AttachmentAPI.upload(compressedFile);
|
||||
if (!tempFile?.id) {
|
||||
Toast.error("头像上传失败");
|
||||
Message.error("头像上传失败");
|
||||
return;
|
||||
}
|
||||
avatarTempFileId.value = tempFile.id;
|
||||
@@ -156,7 +157,7 @@ async function toPassword(): Promise<void> {
|
||||
|
||||
async function saveProfile(): Promise<void> {
|
||||
if (!formModel.name) {
|
||||
Toast.warning("请填写用户名");
|
||||
Message.warning("请填写用户名");
|
||||
return;
|
||||
}
|
||||
isSaving.value = true;
|
||||
@@ -169,7 +170,7 @@ async function saveProfile(): Promise<void> {
|
||||
tempFileIdList: avatarTempFileId.value ? [avatarTempFileId.value] : undefined
|
||||
});
|
||||
await userStore.updateLoginUser(result);
|
||||
Toast.success("资料已保存");
|
||||
Message.success("资料已保存");
|
||||
await router.back();
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { DropdownOption, DropdownValue } from "tdesign-mobile-vue";
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { RoleAPI, type ModuleCode, type Role as UserRole, useUserStore } from "timi-web";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
@@ -198,7 +198,7 @@ async function loadActiveUserRoles(): Promise<void> {
|
||||
async function saveRoleList(): Promise<void> {
|
||||
const current = activeUser.value;
|
||||
if (!current?.id || !current.userId) {
|
||||
Toast.warning("请选择用户");
|
||||
Message.warning("请选择用户");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -210,14 +210,14 @@ async function saveRoleList(): Promise<void> {
|
||||
roleIdList: [...checkedRoleIds.value]
|
||||
});
|
||||
await loadActiveUserRoles();
|
||||
Toast.success("用户角色已保存");
|
||||
Message.success("用户角色已保存");
|
||||
} catch (error) {
|
||||
checkedRoleIds.value = [];
|
||||
try {
|
||||
await reloadAuthorizationScope();
|
||||
await loadActiveUserRoles();
|
||||
} finally {
|
||||
Toast.error(getErrorMessage(error, "用户角色授权失败"));
|
||||
Message.error(getErrorMessage(error, "用户角色授权失败"));
|
||||
}
|
||||
} finally {
|
||||
isSaving.value = false;
|
||||
@@ -285,7 +285,7 @@ onMounted(async () => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("用户角色加载失败");
|
||||
Message.error("用户角色加载失败");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { Captcha, useUserStore } from "timi-web";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
|
||||
@@ -56,7 +56,7 @@ function getRedirectPath(): string {
|
||||
|
||||
function validateForm(): boolean {
|
||||
if (!formModel.user || !formModel.password || !formModel.captcha || !captchaRef.value?.captchaId) {
|
||||
Toast.warning("请输入账号、密码和验证码");
|
||||
Message.warning("请输入账号、密码和验证码");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import ManagedUserAPI from "@/api/ManagedUserAPI";
|
||||
import { useCurrentStoreStore } from "@/store/currentStoreStore";
|
||||
import { coreRoleCodes, gaoRoleCodes } from "@/utils/permission";
|
||||
@@ -123,7 +123,7 @@ function confirmPicker(): void {
|
||||
|
||||
async function generateInvite(): Promise<void> {
|
||||
if (!formModel.roleId || (shouldSelectStore.value && !formModel.storeId)) {
|
||||
Toast.warning(shouldSelectStore.value ? "请选择角色和门店" : "请选择角色");
|
||||
Message.warning(shouldSelectStore.value ? "请选择角色和门店" : "请选择角色");
|
||||
return;
|
||||
}
|
||||
isGenerating.value = true;
|
||||
@@ -157,7 +157,7 @@ watch(() => props.visible, async visible => {
|
||||
try {
|
||||
await loadData();
|
||||
} catch {
|
||||
Toast.error("邀请配置加载失败");
|
||||
Message.error("邀请配置加载失败");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Toast } from "tdesign-mobile-vue";
|
||||
import { Message } from "@/utils/message";
|
||||
import { useUserStore } from "timi-web";
|
||||
import StoreAPI from "@/api/StoreAPI";
|
||||
import type { Store } from "@/types/Store";
|
||||
@@ -42,7 +42,7 @@ export const useCurrentStoreStore = defineStore("currentStore", () => {
|
||||
storeList.value = result.list || [];
|
||||
normalizeCurrentStoreId();
|
||||
} catch {
|
||||
Toast.error("门店列表加载失败");
|
||||
Message.error("门店列表加载失败");
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
@@ -94,7 +94,7 @@ export const useCurrentStoreStore = defineStore("currentStore", () => {
|
||||
try {
|
||||
await loadLoginStore();
|
||||
} catch {
|
||||
Toast.error("登录门店加载失败");
|
||||
Message.error("登录门店加载失败");
|
||||
}
|
||||
if (isGlobalManager) {
|
||||
await loadStoreList();
|
||||
|
||||
Reference in New Issue
Block a user