From 495a9c8bbf3f5f72723a953c1daaa893894e5d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Fri, 20 Mar 2026 00:53:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(credit):=20=E8=A7=A3=E5=86=B3=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=88=86=E9=85=8D=E5=8A=9F=E8=83=BD=E5=9C=A8=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=B7=B3=E8=BD=AC=E6=97=B6=E7=9A=84=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E6=9C=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 pendingAssignRef 引用跟踪待分配状态 - 重构 useDidShow 钩子中的异步处理逻辑 - 实现从选择业务员页面返回后的延迟分配机制 - 修改 submitAssign 函数支持传入指定客户ID数组 - 更新页面跳转参数传递 token 验证机制 - 添加本地存储缓存选择结果的处理逻辑 --- src/credit/mp-customer/index.tsx | 76 +++++++++++++++++++++----------- src/credit/pageUser/index.tsx | 12 ++++- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/src/credit/mp-customer/index.tsx b/src/credit/mp-customer/index.tsx index 3d6b102..5eb9c10 100644 --- a/src/credit/mp-customer/index.tsx +++ b/src/credit/mp-customer/index.tsx @@ -110,6 +110,7 @@ const getStepTagType = (code: number | null): any => { export default function CreditCompanyPage() { const serverPageRef = useRef(1) const staffLoadingPromiseRef = useRef | null>(null) + const pendingAssignRef = useRef<{ token: string; customerIds: number[] } | null>(null) const [list, setList] = useState([]) const [hasMore, setHasMore] = useState(true) const [loading, setLoading] = useState(false) @@ -277,9 +278,37 @@ export default function CreditCompanyPage() { }, [hasMore, loading, reload]) useDidShow(() => { - reload(true).then() - // 预加载员工列表,保证“跟进人(realName)”可展示 - ensureStaffLoaded().then() + const run = async () => { + // 从“选择业务员页”返回:优先处理分配,避免在隐藏页触发 showModal/接口调用 + const picked = safeParseJSON(Taro.getStorageSync('credit_pageUserSelected')) + const pending = pendingAssignRef.current + + if (pending?.token && picked?.token && String(picked.token) === pending.token) { + try { + Taro.removeStorageSync('credit_pageUserSelected') + } catch (_e) { + // ignore + } + + const uid = Number(picked?.userId ?? picked?.user?.userId) + const name = String(picked?.userName || picked?.realName || picked?.nickname || picked?.username || '').trim() + pendingAssignRef.current = null + await submitAssign(uid, name, pending.customerIds) + return + } + + // 若用户取消选择,则保留当前勾选状态,不强制刷新/退出选择模式 + if (pending) { + pendingAssignRef.current = null + return + } + + await reload(true) + // 预加载员工列表,保证“跟进人(realName)”可展示 + await ensureStaffLoaded() + } + + run().then() }) const visibleStatusOptions = useMemo(() => { @@ -369,30 +398,27 @@ export default function CreditCompanyPage() { Taro.showToast({ title: '请先勾选客户', icon: 'none' }) return } + + // 记录待分配的客户ID,返回后再执行分配(避免在隐藏页执行) + const token = `${Date.now()}_${Math.random().toString(36).slice(2)}` + pendingAssignRef.current = { token, customerIds: selectedIds.slice() } + try { + Taro.removeStorageSync('credit_pageUserSelected') + } catch (_e) { + // ignore + } Taro.navigateTo({ - url: '/credit/pageUser/index?isAdmin=1&title=选择业务员', - events: { - userSelected: (payload: any) => { - const uid = Number(payload?.userId ?? payload?.user?.userId) - if (!Number.isFinite(uid) || uid <= 0) return - const u = payload?.user as User | undefined - const pickedName = String( - payload?.realName || - payload?.nickname || - payload?.username || - u?.realName || - u?.nickname || - u?.username || - '' - ).trim() - submitAssign(uid, pickedName).then() - } - } + url: `/credit/pageUser/index?isAdmin=1&title=选择业务员&token=${encodeURIComponent(token)}` }) } - const submitAssign = async (userId: number, userName?: string) => { - if (!selectedIds.length) { + const submitAssign = async (userId: number, userName?: string, customerIds?: number[]) => { + const ids = (customerIds && customerIds.length ? customerIds : selectedIds).filter(v => Number.isFinite(v) && v > 0) + if (!Number.isFinite(userId) || userId <= 0) { + Taro.showToast({ title: '请选择分配对象', icon: 'none' }) + return + } + if (!ids.length) { Taro.showToast({ title: '请先勾选客户', icon: 'none' }) return } @@ -402,11 +428,11 @@ export default function CreditCompanyPage() { const staffName = String(userName || '').trim() || staffNameMap.get(Number(userId)) || `员工${userId}` const confirmRes = await Taro.showModal({ title: '确认分配', - content: `确定将 ${selectedIds.length} 个客户分配给「${staffName}」吗?` + content: `确定将 ${ids.length} 个客户分配给「${staffName}」吗?` }) if (!confirmRes.confirm) return - for (const id of selectedIds) { + for (const id of ids) { const detail = await getCreditMpCustomer(Number(id)) await updateCreditMpCustomer({ ...(detail || {}), id, userId } as any) } diff --git a/src/credit/pageUser/index.tsx b/src/credit/pageUser/index.tsx index bd6625e..89a8f7b 100644 --- a/src/credit/pageUser/index.tsx +++ b/src/credit/pageUser/index.tsx @@ -14,6 +14,7 @@ export default function PageUserSelectPage() { const n = Number(params?.isAdmin) return Number.isFinite(n) ? n : undefined }, [params?.isAdmin]) + const token = useMemo(() => String(params?.token || ''), [params?.token]) const [list, setList] = useState([]) const [page, setPage] = useState(1) @@ -71,9 +72,18 @@ export default function PageUserSelectPage() { const onPick = (u: User) => { if (!u?.userId) return + const userName = String(u.realName || u.nickname || u.username || `用户${u.userId}`) + const payload = { token, userId: u.userId, userName, user: u } + try { + Taro.setStorageSync('credit_pageUserSelected', JSON.stringify(payload)) + } catch (_e) { + // ignore + } + const pageInst: any = Taro.getCurrentInstance().page const eventChannel = pageInst?.getOpenerEventChannel?.() - eventChannel?.emit('userSelected', { userId: u.userId, user: u }) + eventChannel?.emit('userSelected', payload) + Taro.eventCenter?.trigger?.('credit:pageUserSelected', payload) Taro.navigateBack() }