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