Compare commits

...

2 Commits

Author SHA1 Message Date
80846d507f feat: 广告还有角色异常报错 2025-07-12 15:28:40 +08:00
42d1208ee4 feat: get is vip 2025-07-07 22:08:51 +08:00
16 changed files with 32 additions and 36 deletions

View File

@ -22,7 +22,7 @@ const GET_CONTACT_TYPE_OPTIONS = [
{ {
type: GET_CONTACT_TYPE.SHARE, type: GET_CONTACT_TYPE.SHARE,
icon: 'https://publiccdn.neighbourhood.com.cn/img/file.svg', icon: 'https://publiccdn.neighbourhood.com.cn/img/file.svg',
title: '完善资料', title: '转发推广',
desc: '转发给朋友可享推荐奖励', desc: '转发给朋友可享推荐奖励',
btnText: '分享', btnText: '分享',
}, },
@ -30,7 +30,7 @@ const GET_CONTACT_TYPE_OPTIONS = [
type: GET_CONTACT_TYPE.VIP, type: GET_CONTACT_TYPE.VIP,
icon: 'https://publiccdn.neighbourhood.com.cn/img/diamond.svg', icon: 'https://publiccdn.neighbourhood.com.cn/img/diamond.svg',
title: '播络会员', title: '播络会员',
desc: '开通会员每天可查看10个', desc: '开通会员每天可查看5个',
btnText: '开通', btnText: '开通',
}, },
{ {

View File

@ -82,7 +82,10 @@ function ProductGroupDialog(props: IProps) {
return; return;
} }
// 否则:如果有解锁次数,显示是否确定消费。无解锁次数,显示不无次数 UI // 否则:如果有解锁次数,显示是否确定消费。无解锁次数,显示不无次数 UI
const [time, detail] = await Promise.all([requestProductBalance(PRODUCT_CODE), requestGroupDetail(blGroupId)]); const [[time], detail] = await Promise.all([
requestProductBalance(PRODUCT_CODE),
requestGroupDetail(blGroupId),
]);
setGroupDetail(detail); setGroupDetail(detail);
if (time <= 0) { if (time <= 0) {
setStatus(DialogStatus.GROUP_NEED_BUY_ADD); setStatus(DialogStatus.GROUP_NEED_BUY_ADD);

View File

@ -102,7 +102,7 @@ function ProductJobWithGroupDialog(props: Omit<IProps, 'visible'>) {
return; return;
} }
// 否则:如果有解锁次数,显示是否确定消费。无解锁次数,显示不无次数 UI // 否则:如果有解锁次数,显示是否确定消费。无解锁次数,显示不无次数 UI
const time = await requestProductBalance(ProductType.AddGroup); const [time] = await requestProductBalance(ProductType.AddGroup);
if (time <= 0) { if (time <= 0) {
setStatus(DialogStatus.JOB_CONTACT_NEED_BUY_GROUP); setStatus(DialogStatus.JOB_CONTACT_NEED_BUY_GROUP);
} else { } else {
@ -119,7 +119,7 @@ function ProductJobWithGroupDialog(props: Omit<IProps, 'visible'>) {
return; return;
} }
// 自动报单 // 自动报单
const time = await requestProductBalance(ProductType.GetJob); const [time] = await requestProductBalance(ProductType.GetJob);
if (time <= 0) { if (time <= 0) {
setStatus(DialogStatus.JOB_UNABLE_UNLOCK); setStatus(DialogStatus.JOB_UNABLE_UNLOCK);
} else { } else {

View File

@ -15,7 +15,6 @@ import { DeclarationType, ProductType } from '@/constants/product';
import { JobDetails } from '@/types/job'; import { JobDetails } from '@/types/job';
import { ProductInfo } from '@/types/product'; import { ProductInfo } from '@/types/product';
import { logWithPrefix } from '@/utils/common'; import { logWithPrefix } from '@/utils/common';
import { getSkipPrejobAction, setSkipPrejobAction } from '@/utils/job';
import { import {
requestAllBuyProduct, requestAllBuyProduct,
requestProductBalance, requestProductBalance,
@ -49,6 +48,7 @@ function ProductJobDialog(props: Omit<IProps, 'visible'>) {
const handleClosePrejob = useCallback(() => { const handleClosePrejob = useCallback(() => {
setShowPrejob(false); setShowPrejob(false);
onClose();
}, []); }, []);
const handleConfirmPrejob = useCallback(async (type: GET_CONTACT_TYPE) => { const handleConfirmPrejob = useCallback(async (type: GET_CONTACT_TYPE) => {
@ -63,7 +63,7 @@ function ProductJobDialog(props: Omit<IProps, 'visible'>) {
}, []); }, []);
const handleAfterBuy = useCallback(async () => { const handleAfterBuy = useCallback(async () => {
const time = await requestProductBalance(PRODUCT_CODE); const [time] = await requestProductBalance(PRODUCT_CODE);
if (time <= 0) { if (time <= 0) {
Toast.error('发生错误请重试'); Toast.error('发生错误请重试');
onClose(); onClose();
@ -110,19 +110,14 @@ function ProductJobDialog(props: Omit<IProps, 'visible'>) {
return; return;
} }
} }
const time = await requestProductBalance(PRODUCT_CODE); const [time, isPaidVip] = await requestProductBalance(PRODUCT_CODE);
if (time <= 0) { if (time <= 0) {
const allowBuy = await requestAllBuyProduct(PRODUCT_CODE); const allowBuy = await requestAllBuyProduct(PRODUCT_CODE);
setShowContact(true); setShowContact(true);
setStatus(allowBuy ? DialogStatus.JOB_BUY : DialogStatus.JOB_UNABLE_UNLOCK); setStatus(allowBuy ? DialogStatus.JOB_BUY : DialogStatus.JOB_UNABLE_UNLOCK);
} } else if (isPaidVip || skipPreAction) {
// 创建模卡之后可以直接解锁一次, 分享后解锁一次
else if (getSkipPrejobAction() || skipPreAction) {
const productInfo = await requestUseProduct(PRODUCT_CODE, { jobId: data.id }); const productInfo = await requestUseProduct(PRODUCT_CODE, { jobId: data.id });
setShowPrejob(false); setShowPrejob(false);
if (!skipPreAction) {
setSkipPrejobAction(false);
}
handleContact(productInfo.declarationTypeResult); handleContact(productInfo.declarationTypeResult);
} else { } else {
setShowPrejob(true); setShowPrejob(true);
@ -132,6 +127,7 @@ function ProductJobDialog(props: Omit<IProps, 'visible'>) {
// handleContact(productInfo.declarationTypeResult); // handleContact(productInfo.declarationTypeResult);
} }
} catch (e) { } catch (e) {
console.log(e);
Toast.error('出错了,请重试'); Toast.error('出错了,请重试');
handleCloseDialog(); handleCloseDialog();
} finally { } finally {

View File

@ -115,7 +115,7 @@ export function CompanyPublishJobDialog(props: IProps) {
try { try {
const productCode = ProductType.CompanyPublishJob; const productCode = ProductType.CompanyPublishJob;
Taro.showLoading(); Taro.showLoading();
const time = await requestProductBalance(productCode); const [time] = await requestProductBalance(productCode);
if (time <= 0) { if (time <= 0) {
setStatus(DialogStatus.COMPANY_PUBLISH_JOB_BUY); setStatus(DialogStatus.COMPANY_PUBLISH_JOB_BUY);
return; return;

View File

@ -70,7 +70,7 @@ export default function GroupBuy(props: IProps) {
if (status !== OrderStatus.Success) { if (status !== OrderStatus.Success) {
throw new Error('order status error'); throw new Error('order status error');
} }
const time = await requestProductBalance(ProductType.AddGroup); const [time] = await requestProductBalance(ProductType.AddGroup);
log('handleBuy new addGroupTime', time); log('handleBuy new addGroupTime', time);
onConfirm(time); onConfirm(time);
} catch (e) { } catch (e) {

View File

@ -15,5 +15,4 @@ export enum CacheKey {
JOIN_GROUP_CARD_CLICKED = '__join_group_card_clicked__', JOIN_GROUP_CARD_CLICKED = '__join_group_card_clicked__',
SHARE_TO_GET_JOB_CONTACT = '__share_to_get_job_contract__', SHARE_TO_GET_JOB_CONTACT = '__share_to_get_job_contract__',
SHARE_TO_GET_ANCHOR_CONTACT = '__share_to_get_anchor_contract__', SHARE_TO_GET_ANCHOR_CONTACT = '__share_to_get_anchor_contract__',
SKIP_PREACTION = '__skip_preaction__',
} }

View File

@ -26,6 +26,7 @@ export enum RESPONSE_ERROR_CODE {
INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE', // 聊天或者模卡查看超出限制 INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE', // 聊天或者模卡查看超出限制
INSUFFICIENT_FREE_BALANCE = 'INSUFFICIENT_FREE_BALANCE', // 免费查看次数(未购买会员)超限 INSUFFICIENT_FREE_BALANCE = 'INSUFFICIENT_FREE_BALANCE', // 免费查看次数(未购买会员)超限
BOSS_VIP_EXPIRED = 'BOSS_VIP_EXPIRED', // 会员过期 BOSS_VIP_EXPIRED = 'BOSS_VIP_EXPIRED', // 会员过期
CHAT_MSG_SEND_NOT_ALLOW = 'CHAT_MSG_SEND_NOT_ALLOW',
} }
export const RESPONSE_ERROR_INFO: { [key in RESPONSE_ERROR_CODE]?: string } = { export const RESPONSE_ERROR_INFO: { [key in RESPONSE_ERROR_CODE]?: string } = {

View File

@ -271,9 +271,11 @@ export default function JobDetail() {
}, []); }, []);
useLoad(async () => { useLoad(async () => {
switchRoleType(RoleType.Anchor); const query = getPageQuery<Pick<JobDetails, 'id'> & { c: string; share: string }>();
const query = getPageQuery<Pick<JobDetails, 'id'> & { c: string }>(); if (query?.share === 'true') {
switchRoleType(RoleType.Anchor);
}
getInviteCodeFromQueryAndUpdate(query); getInviteCodeFromQueryAndUpdate(query);
const jobId = query?.id; const jobId = query?.id;
if (!jobId) { if (!jobId) {

View File

@ -15,7 +15,7 @@ import useLocation from '@/hooks/use-location';
import { MaterialProfile } from '@/types/material'; import { MaterialProfile } from '@/types/material';
import { logWithPrefix } from '@/utils/common'; import { logWithPrefix } from '@/utils/common';
import { collectEvent } from '@/utils/event'; import { collectEvent } from '@/utils/event';
import { isFullTimePriceRequired, isPartTimePriceRequired, setSkipPrejobAction } from '@/utils/job'; import { isFullTimePriceRequired, isPartTimePriceRequired } from '@/utils/job';
import { updateProfile, subscribeMaterialMessage } from '@/utils/material'; import { updateProfile, subscribeMaterialMessage } from '@/utils/material';
import { navigateBack } from '@/utils/route'; import { navigateBack } from '@/utils/route';
import Toast from '@/utils/toast'; import Toast from '@/utils/toast';
@ -110,7 +110,6 @@ export default function MaterialCreateProfile() {
// 发起订阅不能在异步任务中,保证是第一个 // 发起订阅不能在异步任务中,保证是第一个
await Promise.all([subscribeMaterialMessage(), updateProfile(data)]); await Promise.all([subscribeMaterialMessage(), updateProfile(data)]);
} }
setSkipPrejobAction();
Taro.eventCenter.trigger(EventName.CREATE_PROFILE); Taro.eventCenter.trigger(EventName.CREATE_PROFILE);
nextType ? setGroupType(nextType) : navigateBack(2); nextType ? setGroupType(nextType) : navigateBack(2);
} catch (e) { } catch (e) {

View File

@ -167,6 +167,9 @@ export default function MessageChat() {
) { ) {
tips = '今日申请交换联系方式次数已用完当前每日限制为5次'; tips = '今日申请交换联系方式次数已用完当前每日限制为5次';
duration = 3000; duration = 3000;
} else if (errorCode === RESPONSE_ERROR_CODE.CHAT_MSG_SEND_NOT_ALLOW) {
tips = '账号已在另一台设备上切换身份,本条消息未发送成功,请在本设备重新切换身份后,再发送消息';
duration = 5000;
} }
tips.length > 7 ? Toast.info(tips, duration) : Toast.error(tips, duration); tips.length > 7 ? Toast.info(tips, duration) : Toast.error(tips, duration);
} }

View File

@ -21,9 +21,9 @@
padding-top: var(--tabs-wrap-height); padding-top: var(--tabs-wrap-height);
} }
.taroify-tabs__nav .taroify-tabs__tab:nth-child(2) .taroify-badge-wrapper { //.taroify-tabs__nav .taroify-tabs__tab:nth-child(2) .taroify-badge-wrapper {
left: 18px; // left: 18px;
} //}
} }
&__star { &__star {

View File

@ -106,7 +106,7 @@ export default function BizService() {
title={ title={
<> <>
<Image src={require('@/statics/svg/star.svg')} className={`${PREFIX}__star`} /> {/*<Image src={require('@/statics/svg/star.svg')} className={`${PREFIX}__star`} />*/}
</> </>
} }
> >

View File

@ -13,6 +13,7 @@ export interface ProductInfo {
balance: number; balance: number;
created: number; created: number;
updated: number; updated: number;
isPaidVip?: boolean;
// 报单类型信息,只有 use 接口返回值才有 // 报单类型信息,只有 use 接口返回值才有
declarationTypeResult?: DeclarationTypeResult; declarationTypeResult?: DeclarationTypeResult;
} }

View File

@ -132,14 +132,6 @@ export function postCloseJob(jobId: string) {
return http.post(API.CLOSE_JOB, { data: { jobId }, contentType: 'application/x-www-form-urlencoded' }); return http.post(API.CLOSE_JOB, { data: { jobId }, contentType: 'application/x-www-form-urlencoded' });
} }
export function setSkipPrejobAction(skip = true) {
Taro.setStorageSync(CacheKey.SKIP_PREACTION, skip);
}
export function getSkipPrejobAction() {
return !!Taro.getStorageSync(CacheKey.SKIP_PREACTION);
}
export function setShareToGetContact(job = true) { export function setShareToGetContact(job = true) {
Taro.setStorageSync(job ? CacheKey.SHARE_TO_GET_JOB_CONTACT : CacheKey.SHARE_TO_GET_ANCHOR_CONTACT, true); Taro.setStorageSync(job ? CacheKey.SHARE_TO_GET_JOB_CONTACT : CacheKey.SHARE_TO_GET_ANCHOR_CONTACT, true);
} }

View File

@ -54,13 +54,13 @@ export async function requestUseProduct(
} }
// 获取某个产品的剩余解锁次数 // 获取某个产品的剩余解锁次数
export async function requestProductBalance(productCode: ProductType) { export async function requestProductBalance(productCode: ProductType): Promise<[number, boolean | undefined]> {
const data: GetProductDetailRequest = { productCode, userId: getUserId() }; const data: GetProductDetailRequest = { productCode, userId: getUserId() };
const { balance } = await http.post<ProductInfo>(API.GET_PRODUCT_DETAIL, { const { balance, isPaidVip } = await http.post<ProductInfo>(API.GET_PRODUCT_DETAIL, {
data, data,
contentType: 'application/x-www-form-urlencoded', contentType: 'application/x-www-form-urlencoded',
}); });
return balance; return [balance, isPaidVip];
} }
// 是否可以购买某一个产品 // 是否可以购买某一个产品