feat: 管理端查看户外招聘会小程序码
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled
This commit is contained in:
@@ -18,6 +18,7 @@ import {
|
|||||||
addOutdoorFairDictOption,
|
addOutdoorFairDictOption,
|
||||||
signupOutdoorFair,
|
signupOutdoorFair,
|
||||||
getMyOutdoorFairQrCode,
|
getMyOutdoorFairQrCode,
|
||||||
|
getOutdoorFairMiniProgramQrCode,
|
||||||
} from '@/services/jobportal/outdoorFair';
|
} from '@/services/jobportal/outdoorFair';
|
||||||
import type {
|
import type {
|
||||||
OutdoorFairItem,
|
OutdoorFairItem,
|
||||||
@@ -25,6 +26,7 @@ import type {
|
|||||||
OutdoorFairForm,
|
OutdoorFairForm,
|
||||||
OutdoorFairDictForm,
|
OutdoorFairDictForm,
|
||||||
OutdoorFairCompanyQrCodeInfo,
|
OutdoorFairCompanyQrCodeInfo,
|
||||||
|
OutdoorFairMiniProgramQrCodeInfo,
|
||||||
} from '@/services/jobportal/outdoorFair';
|
} from '@/services/jobportal/outdoorFair';
|
||||||
import { getParticipatingJobs } from '@/services/jobportal/outdoorFairDetail';
|
import { getParticipatingJobs } from '@/services/jobportal/outdoorFairDetail';
|
||||||
import { getDictSelectOption, getDictValueEnum } from '@/services/system/dict';
|
import { getDictSelectOption, getDictValueEnum } from '@/services/system/dict';
|
||||||
@@ -51,6 +53,10 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
const [jobEditModalOpen, setJobEditModalOpen] = useState(false);
|
const [jobEditModalOpen, setJobEditModalOpen] = useState(false);
|
||||||
const [qrModalOpen, setQrModalOpen] = useState(false);
|
const [qrModalOpen, setQrModalOpen] = useState(false);
|
||||||
const [qrInfo, setQrInfo] = useState<OutdoorFairCompanyQrCodeInfo | null>(null);
|
const [qrInfo, setQrInfo] = useState<OutdoorFairCompanyQrCodeInfo | null>(null);
|
||||||
|
const [miniProgramQrModalOpen, setMiniProgramQrModalOpen] = useState(false);
|
||||||
|
const [miniProgramQrInfo, setMiniProgramQrInfo] =
|
||||||
|
useState<OutdoorFairMiniProgramQrCodeInfo | null>(null);
|
||||||
|
const [miniProgramQrLoadingFairId, setMiniProgramQrLoadingFairId] = useState<number>();
|
||||||
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false);
|
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false);
|
||||||
const [rejectReason, setRejectReason] = useState('');
|
const [rejectReason, setRejectReason] = useState('');
|
||||||
const [companyDetailFair, setCompanyDetailFair] = useState<OutdoorFairItem | null>(null);
|
const [companyDetailFair, setCompanyDetailFair] = useState<OutdoorFairItem | null>(null);
|
||||||
@@ -191,6 +197,23 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const openMiniProgramQrCode = async (record: OutdoorFairItem) => {
|
||||||
|
setMiniProgramQrLoadingFairId(record.id);
|
||||||
|
try {
|
||||||
|
const res = await getOutdoorFairMiniProgramQrCode(record.id);
|
||||||
|
if (res.code === 200 && res.data?.imageData) {
|
||||||
|
setMiniProgramQrInfo(res.data);
|
||||||
|
setMiniProgramQrModalOpen(true);
|
||||||
|
} else {
|
||||||
|
message.error(res.msg || '小程序二维码加载失败');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
message.error('小程序二维码加载失败,请稍后重试');
|
||||||
|
} finally {
|
||||||
|
setMiniProgramQrLoadingFairId(undefined);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const openJobList = (record: OutdoorFairItem) => {
|
const openJobList = (record: OutdoorFairItem) => {
|
||||||
setSelectedFair(record);
|
setSelectedFair(record);
|
||||||
setJobListModalOpen(true);
|
setJobListModalOpen(true);
|
||||||
@@ -374,7 +397,7 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
valueType: 'option',
|
valueType: 'option',
|
||||||
width: isEnterprise ? 520 : 160,
|
width: isEnterprise ? 520 : 260,
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
render: (_, record) => [
|
render: (_, record) => [
|
||||||
isEnterprise && !record.signedUp ? (
|
isEnterprise && !record.signedUp ? (
|
||||||
@@ -410,12 +433,22 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
</Button>
|
</Button>
|
||||||
) : null,
|
) : null,
|
||||||
isEnterprise ? (
|
isEnterprise ? (
|
||||||
<Button key="companyDetail" type="link" size="small" onClick={() => openCompanyDetail(record)}>
|
<Button
|
||||||
|
key="companyDetail"
|
||||||
|
type="link"
|
||||||
|
size="small"
|
||||||
|
onClick={() => openCompanyDetail(record)}
|
||||||
|
>
|
||||||
招聘会详情
|
招聘会详情
|
||||||
</Button>
|
</Button>
|
||||||
) : null,
|
) : null,
|
||||||
isEnterprise && record.signedUp && record.reviewStatus === '1' ? (
|
isEnterprise && record.signedUp && record.reviewStatus === '1' ? (
|
||||||
<Button key="boothMap" type="link" size="small" onClick={() => openCompanyBoothMap(record)}>
|
<Button
|
||||||
|
key="boothMap"
|
||||||
|
type="link"
|
||||||
|
size="small"
|
||||||
|
onClick={() => openCompanyBoothMap(record)}
|
||||||
|
>
|
||||||
查看展位图
|
查看展位图
|
||||||
</Button>
|
</Button>
|
||||||
) : null,
|
) : null,
|
||||||
@@ -429,6 +462,17 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
>
|
>
|
||||||
详情
|
详情
|
||||||
</Button>,
|
</Button>,
|
||||||
|
<Button
|
||||||
|
key="miniProgramQrCode"
|
||||||
|
type="link"
|
||||||
|
size="small"
|
||||||
|
icon={<QrcodeOutlined />}
|
||||||
|
loading={miniProgramQrLoadingFairId === record.id}
|
||||||
|
hidden={isEnterprise || !access.hasPerms('cms:outdoorFair:qrcode')}
|
||||||
|
onClick={() => openMiniProgramQrCode(record)}
|
||||||
|
>
|
||||||
|
小程序二维码
|
||||||
|
</Button>,
|
||||||
<Button
|
<Button
|
||||||
key="edit"
|
key="edit"
|
||||||
type="link"
|
type="link"
|
||||||
@@ -552,6 +596,46 @@ const OutdoorFairList: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
|
<Modal
|
||||||
|
title="招聘会小程序二维码"
|
||||||
|
open={miniProgramQrModalOpen}
|
||||||
|
width={420}
|
||||||
|
footer={[
|
||||||
|
<Button
|
||||||
|
key="close"
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
setMiniProgramQrModalOpen(false);
|
||||||
|
setMiniProgramQrInfo(null);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
关闭
|
||||||
|
</Button>,
|
||||||
|
]}
|
||||||
|
destroyOnHidden
|
||||||
|
onCancel={() => {
|
||||||
|
setMiniProgramQrModalOpen(false);
|
||||||
|
setMiniProgramQrInfo(null);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{miniProgramQrInfo?.imageData && (
|
||||||
|
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
|
||||||
|
<img
|
||||||
|
src={miniProgramQrInfo.imageData}
|
||||||
|
alt="招聘会小程序二维码"
|
||||||
|
style={{ width: 260, height: 260, objectFit: 'contain' }}
|
||||||
|
/>
|
||||||
|
<Typography.Text strong style={{ marginTop: 16, fontSize: 16 }}>
|
||||||
|
请使用微信扫码
|
||||||
|
</Typography.Text>
|
||||||
|
{miniProgramQrInfo.permanent && (
|
||||||
|
<Typography.Text type="secondary" style={{ marginTop: 8 }}>
|
||||||
|
此小程序码长期有效,无需定期更换
|
||||||
|
</Typography.Text>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Modal>
|
||||||
<Modal
|
<Modal
|
||||||
title="驳回原因"
|
title="驳回原因"
|
||||||
open={rejectReasonModalOpen}
|
open={rejectReasonModalOpen}
|
||||||
|
|||||||
@@ -134,6 +134,18 @@ export interface OutdoorFairCompanyQrCodeInfo {
|
|||||||
qrCodeContent: string;
|
qrCodeContent: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 管理端查看的招聘会微信小程序码。 */
|
||||||
|
export interface OutdoorFairMiniProgramQrCodeInfo {
|
||||||
|
fairId: number;
|
||||||
|
page: string;
|
||||||
|
scene: string;
|
||||||
|
imageData: string;
|
||||||
|
/** getUnlimitedQRCode 生成的小程序码长期有效。 */
|
||||||
|
permanent: boolean;
|
||||||
|
/** 小程序码本身是否需要周期轮换。 */
|
||||||
|
rotationRequired: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
/** 企业审核通过后可读取的只读展位图。 */
|
/** 企业审核通过后可读取的只读展位图。 */
|
||||||
export interface OutdoorFairCompanyBoothMap {
|
export interface OutdoorFairCompanyBoothMap {
|
||||||
currentCompanyId: number;
|
currentCompanyId: number;
|
||||||
@@ -307,6 +319,17 @@ export async function getMyOutdoorFairQrCode(fairId: number) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理员获取招聘会微信小程序码
|
||||||
|
* GET /api/cms/outdoor-fair/{fairId}/mini-program-qrcode
|
||||||
|
*/
|
||||||
|
export async function getOutdoorFairMiniProgramQrCode(fairId: number) {
|
||||||
|
return request<{ code: number; msg?: string; data: OutdoorFairMiniProgramQrCodeInfo }>(
|
||||||
|
`${CMS_OUTDOOR_FAIR_BASE}/${fairId}/mini-program-qrcode`,
|
||||||
|
{ method: 'GET' },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传户外招聘会照片
|
* 上传户外招聘会照片
|
||||||
* POST /api/common/upload
|
* POST /api/common/upload
|
||||||
|
|||||||
Reference in New Issue
Block a user