提交 1813a388 作者: 龚洪江

Merge branch 'develop'

......@@ -14,4 +14,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/admin
newTag: 063cc3527bbd3e1199f9aec0d902b1c76c712a0a
newTag: e8642a205674071202d22ba8f884dd9dd226bc36
......@@ -13,6 +13,7 @@ import { MallManageAPI } from './modules/mallManage';
import { ResourceManageAPI } from './modules/resourceManageAPI';
import { ForumManageAPI } from './modules/forumManageAPI';
import { PilotTrainAPI } from './modules/pilotTrainAPI';
import { FlyerCenterAPI } from './modules/flyerCenterAPI';
export {
CommonAPI,
......@@ -30,4 +31,5 @@ export {
ResourceManageAPI,
ForumManageAPI,
PilotTrainAPI,
FlyerCenterAPI,
};
......@@ -169,3 +169,13 @@ export type getUserAccountByPhoneNumType = InterFunction<
export type appletQRCodeType = InterFunction<{ page: string; scene: string }, string>;
//登录信息-获取
export type getLoginInfoType = InterFunction<{ randomLoginCode: string }, any>;
//地区-获取
type locationType = {
id: number;
name: string;
level: number;
childInfo: locationType[];
};
export type getSecondDistrictInfoType = InterFunction<any, locationType[]>;
import { InterFunction, InterListFunction } from '~/api/interface';
import { InterFunction, InterItemFunction, InterListFunction } from '~/api/interface';
// 客户列表
export type listAppUserType = InterListFunction<
......@@ -8,6 +8,7 @@ export type listAppUserType = InterListFunction<
keyword?: string;
phoneNum?: string;
startTime?: string;
realAuthStatus?: number;
},
{
id: number;
......@@ -28,6 +29,7 @@ export type listAppUserType = InterListFunction<
companyAuthStatus: number;
cooperationTagId: number;
companyName: null;
realAuthStatus: number;
tagName: null;
cooperationTagVOS: {
createTime: string;
......@@ -189,6 +191,9 @@ export type editUserApplyTagDetails = InterFunction<
lon: number;
name: string;
score: number;
licenseImg: string;
remark: string;
attachmentList?: { userApplyTagId: number; url: string; type: number }[];
}
>;
// 后台-编辑服务商信息
......@@ -233,3 +238,32 @@ export type listUserRcdType = InterListFunction<
userSex: null;
}
>;
//实名认证列表返回类型
export type listAuthPageType = InterItemFunction<
{ keyword?: string },
{
id: number;
nickName: string;
phoneNum: string;
uid: string;
userName: string;
createTime: string;
remark: string;
}[]
>;
//实名认证详情返回类型
export type authDetailType = InterFunction<
{ id: number },
{
backIdImg: string;
checkStatus: number;
frontIdImg: string;
id: number;
idNumber: string;
userAccountId: number;
userName: string;
}
>;
//实名认证-更新备注
export type authRemarkType = InterFunction<{ id: number; remark: string }, any>;
import { InterFunction, InterItemFunction } from '~/api/interface';
//飞手列表
type flyerItemType = {
abilityUrl: string;
age: number;
areaNumber: number;
auditStatus: number;
createTime: string;
id: number;
individualResume: string;
licenseNumber: number;
licenseType: string;
licenseUrl: string;
phoneNum: number;
pilotAbility: {
abilityId: number;
abilityName: string;
id: number;
}[];
remark: string;
residentCity: string;
sex: number;
timeOfApplication: string;
updateTime: string;
userAccountId: number;
userName: number;
yearsOfWorking: number;
reason: string;
};
export type backListPilotType = InterItemFunction<
{
abilityId?: number;
accountNumber?: string;
areaNumber?: any;
auditStatus?: number;
id?: number;
licenseType?: string;
},
flyerItemType[]
>;
//修改备注
export type updateRemarkType = InterFunction<{ id: number; remark: string }, any>;
//能力类型
export type abilityListType = InterFunction<any, { abilityId: number; abilityName: string }[]>;
//飞手认证日志类型
export type backPilotLogListType = InterItemFunction<
{ accountNumber?: string },
{
certificationDate: number;
certificationMessage: number;
createTime: string;
id: number;
operatorUserAccount: number;
operatorUserId: number;
operatorUserName: number;
phoneNum: number;
updateTime: string;
userAccountId: number;
userName: number;
}[]
>;
//飞手详情
export type backDetailPilotType = InterFunction<{ id: number }, flyerItemType>;
//飞手审批
export type updateAuditStatusType = InterFunction<
{ auditStatus: number; reasonId?: number; id: number },
any
>;
//飞手审批不通过原因列表
export type backListReasonType = InterFunction<any, { id: number; reason: string }[]>;
......@@ -16,6 +16,33 @@ export type listPublishPageType = InterItemFunction<
export type requirementsListType = InterFunction<any, { id: number; typeName: string }[]>;
//需求-强制删除
export type deleteRequirementsType = InterFunction<{ requirementsInfoId: number }, any>;
//需求-详情
export type backDetailPublishType = InterFunction<
{ id: number },
{
cityCode: number;
districtCode: number;
id: number;
latitude: number;
longitude: number;
orderNumber: string;
paramMoney: number;
provinceCode: number;
publishAccountId: number;
publishName: string;
publishPhone: number;
publisherNumber: string;
requireDescription: string;
requireUrl: string;
requirementTypeId: number;
solved: boolean;
taskAddress: string;
taskEndTime: string;
taskStartTime: string;
taskTitle: string;
requirementTypeName: string;
}
>;
// 查询招标快讯列表-分页
export type releaseTenderNews = InterListFunction<
......
......@@ -5,6 +5,7 @@ import {
batchRemoveBannerInfo,
exchangeBannerInfo,
getLoginInfoType,
getSecondDistrictInfoType,
getUserAccountByPhoneNumType,
insertBannerInfo,
insertModuleInfo,
......@@ -84,4 +85,7 @@ export class CommonAPI {
//获取登录信息
static getLoginInfo: getLoginInfoType = (params) =>
axios.get('/userapp/temp-auth/getLoginInfo', { params });
// 获取地域
static getSecondDistrictInfo: getSecondDistrictInfoType = () =>
axios.get('/pms/appDevice/getSecondDistrictInfo');
}
......@@ -2,6 +2,8 @@ import axios from '../request';
import {
applyTagDetails,
approvalApplyTag,
authDetailType,
authRemarkType,
changeUserTagNew,
changeUserTagType,
CompanyListTag,
......@@ -10,6 +12,7 @@ import {
editUserApplyTag,
editUserApplyTagDetails,
listAppUserType,
listAuthPageType,
listUserApplyTag,
listUserRcdType,
userAccountUpdateType,
......@@ -55,4 +58,13 @@ export class CustomManageAPI {
// 裂变-邀请列表
static listUserRcd: listUserRcdType = (data) =>
axios.post('/userapp/user-account/listUserRcd', data);
// 客户-实名认证列表
static getListAuth: listAuthPageType = (data) =>
axios.post('/userapp/real-name-auth/listPage', data);
// 客户-实名认证详情
static getAuthDetail: authDetailType = (params) =>
axios.get('/userapp/real-name-auth/detail', { params });
// 客户-实名认证更新备注
static updateRemark: authRemarkType = (params) =>
axios.get('/userapp/real-name-auth/updateRemark', { params });
}
import {
abilityListType,
backDetailPilotType,
backListPilotType,
backListReasonType,
backPilotLogListType,
updateAuditStatusType,
updateRemarkType,
} from '~/api/interface/flyerCenterType';
import axios from '../request';
export class FlyerCenterAPI {
//飞手列表
static getBackListPilot: backListPilotType = (data) =>
axios.post('/userapp/pilot/backListPilot', data);
//修改备注
static updateRemark: updateRemarkType = (data) => axios.post('/userapp/pilot/updateRemark', data);
// 飞手能力类型
static getAbilityList: abilityListType = () => axios.get('/userapp/pilot/abilityList');
// 飞手认证日志
static getBackPilotLogList: backPilotLogListType = (data) =>
axios.post('/userapp/pilot/backPilotLogList', data);
// 飞手详情
static getBackDetailPilot: backDetailPilotType = (params) =>
axios.get('/userapp/pilot/backDetailPilot', { params });
// 飞手审批
static updateAuditStatus: updateAuditStatusType = (data) =>
axios.post('/userapp/pilot/updateAuditStatus', data);
// 飞手审批不通过原因
static getBackListReason: backListReasonType = () => axios.get('/userapp/pilot/backListReason');
}
......@@ -18,6 +18,7 @@ import {
industryCaseDeleteDetails,
deleteIndustryNewsType,
deleteRequirementsType,
backDetailPublishType,
} from '~/api/interface/resourceManageType';
import axios from '../request';
......@@ -31,6 +32,9 @@ export class ResourceManageAPI {
//需求-强制删除
static deleteRequirement: deleteRequirementsType = (params) =>
axios.get('/release/requirements/deleteRequire', { params });
//需求-详情
static getDetailPublish: backDetailPublishType = (params) =>
axios.get('/release/requirements/backDetailPublish', { params });
// 查询招标快讯列表-分页
static releaseTenderNews: releaseTenderNews = (params) =>
......
......@@ -110,11 +110,6 @@ $page-background: #f3f6ff;
justify-content: space-between;
align-items: center;
.logo-img {
width: 32px;
height: 32px;
border-radius: 4px;
}
.logo-text {
min-width: 100px;
......@@ -187,6 +182,7 @@ $page-background: #f3f6ff;
.ant-layout-header {
padding: 0 10px;
//line-height: normal;
}
.ant-layout-sider-collapsed {
......
import React, { useState } from 'react';
import { Header } from 'antd/es/layout/layout';
import { DownOutlined, UpOutlined } from '@ant-design/icons';
import { Button, Dropdown, MenuProps, Modal } from 'antd';
import { Button, Dropdown, Image, MenuProps, Modal } from 'antd';
import Logo from '../../../assets/icon/logo_big.png';
import './index.scss';
import { REMOVE_MENU, REMOVE_MENU_ID, SET_COLLAPSE } from '~/store/module/menu';
......@@ -60,7 +60,15 @@ export function TitleView() {
}}
>
<div className='layout-logo'>
<img src={userInfo.companyInfoVO.brandLogo || Logo} className='logo-img' alt='云享飞' />
<div className='logo-img'>
<Image
preview={false}
src={userInfo.companyInfoVO.brandLogo || Logo}
alt='云享飞'
width={32}
height={32}
/>
</div>
<div className='logo-text'>{userInfo.companyInfoVO.brandName || '云享飞管理后台'}</div>
<div onClick={setMenuCollapsed}>
<svg
......
......@@ -29,8 +29,6 @@ export const Uploader: React.FC<PropsType> = (props) => {
fileSize: 2,
fileLength: 1,
fileType: ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'],
// eslint-disable-next-line @typescript-eslint/no-empty-function
onChange: () => {},
defaultFileList: [],
disabled: false,
};
......@@ -56,7 +54,7 @@ export const Uploader: React.FC<PropsType> = (props) => {
listType,
fileList,
beforeUpload: (res) => {
// console.log(fileType, res.type);
console.log('文件类型-->', res);
const isType = fileType?.includes(res.type);
const isSize = res.size / 1024 / 1024 < (fileSize || 2);
if (!isType) {
......@@ -79,38 +77,26 @@ export const Uploader: React.FC<PropsType> = (props) => {
// 上传到服务器
const formData = new FormData();
formData.append('uploadFile', res.file);
CommonAPI.uploadOssBP(formData).then(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
//(val: { result: { filePath: string } }) => {
({ result }) => {
// console.log(result);
setFileList([
...fileList,
{
id: new Date().getTime(),
uid: new Date().getTime(),
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
name: res.file.name,
// url: val.result.filePath,
url: result,
},
]);
onChange?.([
...fileList,
{
id: new Date().getTime(),
uid: new Date().getTime(),
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
name: res.file.name,
// url: val.result.filePath,
url: result,
},
]);
},
);
CommonAPI.uploadOssBP(formData).then(({ result }) => {
setFileList([
...fileList,
{
id: new Date().getTime(),
uid: new Date().getTime(),
name: (res.file as any).name,
url: result,
},
]);
onChange?.([
...fileList,
{
id: new Date().getTime(),
uid: new Date().getTime(),
name: (res.file as any).name,
url: result,
},
]);
});
} else {
setFileList([...fileList, res.file]);
onChange?.([...fileList, res.file]);
......
......@@ -410,7 +410,6 @@ const CategoryList = () => {
hideSelectAll: true,
selectedRowKeys,
renderCell: (checked: boolean, record: categoryType[0]) => {
console.log('选中-->', checked);
return (
<>
{record.subDTOList ? (
......
import { FC } from 'react';
import { Form, Input, Modal, ModalProps } from 'antd';
interface selfProps {
onCancel: () => void;
onOk: () => void;
}
const AddOrEditModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk }) => {
const handleCancel = () => {
onCancel();
};
const handleOk = () => {
onOk();
};
return (
<Modal title='新增分类' open={open} onCancel={handleCancel} onOk={handleOk}>
<Form>
<Form.Item label='分类名称'>
<Input placeholder='请输入分类名称' />
</Form.Item>
<Form.Item label='分类图标'></Form.Item>
<Form.Item label='分类描述'></Form.Item>
</Form>
</Modal>
);
};
export default AddOrEditModal;
import { Button, Table } from 'antd';
import { ArrowDownOutlined, ArrowUpOutlined, PlusOutlined } from '@ant-design/icons';
import { ColumnsType } from 'antd/es/table';
import AddOrEditModal from './components/addOrEditModal';
import { useState } from 'react';
const ServiceCategoryList = () => {
const tableColumns: ColumnsType<any> = [
{
title: '分类名称',
align: 'center',
},
{
title: '图片',
align: 'center',
},
{
title: '描述',
align: 'center',
},
{
title: '业务案例图片',
align: 'center',
},
{
title: '业务案例视频',
align: 'center',
},
{
title: '创建时间',
align: 'center',
},
{
title: '操作',
align: 'center',
render: () => (
<>
<Button type='link'>新增子分类</Button>
<Button type='link'>编辑</Button>
<Button type='link'>删除</Button>
</>
),
},
];
const [tableData, setTableData] = useState<any>([{ id: 1 }]);
const [addOrEditModalShow, setAddOrEditModalShow] = useState<boolean>(false);
//新增分类弹窗
const addOrEditModalClick = () => {
setAddOrEditModalShow(true);
};
const addOrEditModalOk = () => {
setAddOrEditModalShow(false);
};
const addOrEditModalCancel = () => {
setAddOrEditModalShow(false);
};
return (
<div className='service-category-list'>
<div className='list-operate' style={{ marginBottom: '10px' }}>
<Button
type='primary'
icon={<PlusOutlined />}
style={{ marginRight: '10px' }}
onClick={addOrEditModalClick}
>
新增分类
</Button>
<Button icon={<ArrowUpOutlined />} style={{ marginRight: '10px' }} type='primary'></Button>
<Button icon={<ArrowDownOutlined />} type='primary'></Button>
</div>
<Table columns={tableColumns} bordered rowKey='id' />
<AddOrEditModal
open={addOrEditModalShow}
onOk={addOrEditModalOk}
onCancel={addOrEditModalCancel}
/>
</div>
);
};
export default ServiceCategoryList;
......@@ -131,6 +131,7 @@ function LoginView() {
{qrCodeUrl ? (
<Image src={qrCodeUrl} alt='' width={200} height={200} preview={false} />
) : (
// 加载二维码
<QRCode value='https://ant.design/' status='loading' />
)}
</div>
......
......@@ -5,9 +5,11 @@ import {
listUserApplyTag,
} from '~/api/interface/customManageType';
import { InterDataType, InterListType, InterReqType } from '~/api/interface';
import { Button, Form, Input, message, Modal, Rate, Select } from 'antd';
import { Button, Form, Image, Input, message, Modal, Rate, Select } from 'antd';
import { CustomManageAPI } from '~/api';
import SelectMapModal from '~/components/select-map';
import { Uploader } from '~/components/uploader';
import { UploadOutlined } from '@ant-design/icons';
// 数据类型
type DataType = InterDataType<editUserApplyTagDetails>;
......@@ -36,6 +38,10 @@ const AddEditModal: FC<propType> = (props) => {
const [cooperationList, setCooperationList] = useState<{ label: string; value: number }[]>([]);
// 选择的地址
const [address, setAddress] = useState<{ lat: number; lon: number; address: string }>();
//附件
const [fileList, setFileList] = useState<
{ id: number; uid: number; url: string; name: string }[]
>([]);
// 关闭弹窗
const handleCancel = () => {
form.resetFields();
......@@ -51,9 +57,17 @@ const AddEditModal: FC<propType> = (props) => {
...res.result,
name: res.result.name || data?.companyName,
address: res.result.address || detail?.address,
attachmentList: res.result.attachmentList || undefined,
});
setDetail(res.result);
// console.log('获取审批详情 -->', res.result);
const fileList =
res.result.attachmentList?.map((v) => ({
id: Math.random(),
uid: Math.random(),
name: v.url.split('/')[v.url.split('/').length - 1],
url: v.url,
})) || [];
setFileList(fileList);
}
};
// 获取加盟列表
......@@ -64,6 +78,24 @@ const AddEditModal: FC<propType> = (props) => {
setCooperationList(list.map((i) => ({ label: i.tagName, value: i.id })));
}
};
//附件上传成功
const attachmentUploadSuccess = (
value: { id: number; uid: number; url: string; name: string }[],
) => {
setFileList(value);
form.setFieldValue(
'attachmentList',
value.map((v) => ({
type: ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf'].includes(
v.url.match(/\.[^.]+$/)?.[0] as any,
)
? 1
: 0,
url: v.url,
})),
);
};
// 确认事件
const handleOk = () => {
form
......@@ -157,6 +189,40 @@ const AddEditModal: FC<propType> = (props) => {
>
<Rate allowClear />
</Form.Item>
<Form.Item label='营业执照'>
<Image src={detail?.licenseImg} width={50} height={50} />
</Form.Item>
<Form.Item label='附件' name='attachmentList'>
<Uploader
fileUpload
listType='text'
defaultFileList={fileList}
fileLength={10}
fileSize={50}
onChange={attachmentUploadSuccess}
fileType={[
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/msword',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-excel',
'application/pdf',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'image/png',
'image/jpeg',
'image/jpg',
'image/gif',
'image/bmp',
]}
>
<Button type='primary' icon={<UploadOutlined />}>
上传
</Button>
</Uploader>
</Form.Item>
<Form.Item label='备注' name='remark'>
<Input.TextArea placeholder='请输入备注' maxLength={70} showCount rows={4} />
</Form.Item>
</Form>
</Modal>
<SelectMapModal
......
......@@ -60,7 +60,6 @@ function CustomListView() {
totalPage,
});
setTableData(list);
// console.log('加载列表 --->', list);
}
};
// 翻页
......@@ -124,6 +123,12 @@ function CustomListView() {
align: 'center',
},
{
title: '实名认证',
dataIndex: 'realNameAuthStatus',
align: 'center',
render: (text: number) => (text ? '已认证' : '未认证'),
},
{
title: '认证企业',
dataIndex: 'companyName',
align: 'center',
......@@ -264,16 +269,16 @@ function CustomListView() {
{ value: 1, label: '已认证' },
],
},
// {
// label: '电子签约认证',
// name: 'contract',
// type: 'Select',
// placeholder: '请选择是否认证',
// options: [
// { value: 1, label: '未认证' },
// { value: 2, label: '已认证' },
// ],
// },
{
label: '实名认证',
name: 'realAuthStatus',
type: 'Select',
placeholder: '请选择认证状态',
options: [
{ value: 0, label: '未认证' },
{ value: 1, label: '已认证' },
],
},
]}
searchData={onFinish}
/>
......
import { CustomManageAPI } from '~/api';
import { useSearchParams, useNavigate } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { InterDataType } from '~/api/interface';
import { authDetailType } from '~/api/interface/customManageType';
import { Button, Descriptions, Image } from 'antd';
//实名认证详情返回类信息
type detailType = InterDataType<authDetailType>;
const CustomVerificationDetail = () => {
const [searchParams] = useSearchParams();
const navigate = useNavigate();
const [detail, setDetail] = useState<detailType>();
const getAuthDetail = (id: number) => {
CustomManageAPI.getAuthDetail({ id }).then(({ result }) => {
setDetail(result);
});
};
//返回
const backRoute = () => {
navigate(-1);
};
useEffect(() => {
getAuthDetail(Number(searchParams.get('id')));
}, []);
return (
<div className='custom-verification-detail'>
<Descriptions
title='认证信息'
bordered
column={2}
extra={
<Button type='primary' onClick={backRoute}>
返回
</Button>
}
>
<Descriptions.Item label='姓名'>{detail?.userName}</Descriptions.Item>
<Descriptions.Item label='身份证号码'>{detail?.idNumber}</Descriptions.Item>
<Descriptions.Item label='身份证正面'>
<Image src={detail?.frontIdImg} width={50} />
</Descriptions.Item>
<Descriptions.Item label='身份证反面'>
<Image src={detail?.backIdImg} width={50} />
</Descriptions.Item>
</Descriptions>
</div>
);
};
export default CustomVerificationDetail;
import { Form, Input, message, Modal, ModalProps } from 'antd';
import { FC, useEffect } from 'react';
import { InterDataType } from '~/api/interface';
import { listAuthPageType } from '~/api/interface/customManageType';
import { CustomManageAPI } from '~/api';
type listAuthType = InterDataType<listAuthPageType>['list'];
interface selfProps {
onOk: () => void;
currentAuthItem: listAuthType[0] | undefined;
}
//实名认证列表返回类型
const RemarkModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk, currentAuthItem }) => {
const [form] = Form.useForm<{ remark: string }>();
const handleOk = () => {
if (currentAuthItem) {
form.validateFields().then((values) => {
CustomManageAPI.updateRemark({ id: currentAuthItem.id, ...values }).then(({ code }) => {
if (code === '200') {
message.success('更新备注成功');
onOk();
}
});
});
}
};
useEffect(() => {
if (currentAuthItem) {
form.setFieldValue('remark', currentAuthItem.remark || undefined);
}
}, [currentAuthItem]);
return (
<Modal open={open} onCancel={onCancel} onOk={handleOk} title='备注弹窗'>
<Form form={form}>
<Form.Item label='备注' name='remark'>
<Input.TextArea placeholder='请输入备注' maxLength={70} showCount rows={4} />
</Form.Item>
</Form>
</Modal>
);
};
export default RemarkModal;
import SearchBox, { searchColumns as searchColumnsType } from '~/components/search-box';
import { Button, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { useEffect, useState } from 'react';
import { CustomManageAPI } from '~/api';
import { InterDataType, InterReqListType, PaginationProps } from '~/api/interface';
import { listAuthPageType } from '~/api/interface/customManageType';
import { useNavigate } from 'react-router-dom';
import RemarkModal from '~/pages/customManage/customVerification/list/components/remarkModal';
//实名认证列表返回类型
type listAuthType = InterDataType<listAuthPageType>['list'];
//实名认证列表请求类型
type listAuthParametersType = InterReqListType<listAuthPageType>;
const CustomVerification = () => {
const navigate = useNavigate();
const searchColumns: searchColumnsType[] = [
{
name: 'keyword',
label: '用户信息',
type: 'input',
placeholder: '请输入UID,姓名或手机号',
},
];
const tableColumns: ColumnsType<listAuthType[0]> = [
{
title: 'UID',
align: 'center',
dataIndex: 'uid',
},
{
title: '昵称',
align: 'center',
dataIndex: 'nickName',
},
{
title: '姓名',
align: 'center',
dataIndex: 'userName',
},
{
title: '手机号',
align: 'center',
dataIndex: 'phoneNum',
},
{
title: '时间',
align: 'center',
dataIndex: 'createTime',
},
{
title: '备注',
align: 'center',
dataIndex: 'remark',
width: '20%',
ellipsis: true,
render: (text: string, record) => (
<div
onClick={() => remarkModalShowClick(record)}
style={{
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
width: '100%',
overflow: 'hidden',
cursor: 'pointer',
color: '#1677ff',
}}
>
{text || '--'}
</div>
),
},
{
title: '操作',
align: 'center',
render: (_text: string, record) => (
<Button type='link' onClick={() => toCustomVerificationDetail(record)}>
详情
</Button>
),
},
];
const [tableData, setTableData] = useState<listAuthType>([]);
const [query, setQuery] = useState<listAuthParametersType>();
const [pagination, setPagination] = useState<PaginationProps & { totalCount: number }>({
pageNo: 1,
pageSize: 10,
totalCount: 0,
});
//备注弹窗
const [remarkModalShow, setRemarkModalShow] = useState<boolean>(false);
const [currentAuthItem, setCurrentAuthItem] = useState<listAuthType[0]>();
const getAuthList = (query?: listAuthParametersType) => {
CustomManageAPI.getListAuth({
pageNo: pagination.pageNo,
pageSize: pagination.pageSize,
...query,
}).then(({ result }) => {
pagination.totalCount = result.totalCount;
setPagination(pagination);
setTableData(result.list || []);
});
};
//分页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getAuthList(query);
};
//筛选成功
const searchSuccess = (value: listAuthParametersType) => {
pagination.pageNo = 1;
pagination.pageSize = 10;
setQuery(value);
getAuthList(value);
};
//认证详情
const toCustomVerificationDetail = (record: listAuthType[0]) => {
navigate({ pathname: '/customManage/customVerificationDetail', search: `id=${record.id}` });
};
//修改备注操作
const remarkModalShowClick = (record: listAuthType[0]) => {
setCurrentAuthItem({ ...record });
setRemarkModalShow(true);
};
const remarkModalCancel = () => {
setRemarkModalShow(false);
};
const remarkModalOk = () => {
getAuthList(query);
setRemarkModalShow(false);
};
useEffect(() => {
getAuthList();
}, []);
return (
<div className='custom-verification'>
<SearchBox search={searchColumns} searchData={searchSuccess} />
<Table
columns={tableColumns}
bordered
dataSource={tableData}
rowKey='id'
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
<RemarkModal
open={remarkModalShow}
onCancel={remarkModalCancel}
onOk={remarkModalOk}
currentAuthItem={currentAuthItem}
/>
</div>
);
};
export default CustomVerification;
import SearchBox, { searchColumns as searchColumnsType } from '~/components/search-box';
import { Button, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { FlyerCenterAPI } from '~/api';
import { useEffect, useState } from 'react';
import { InterDataType, InterReqListType, PaginationProps } from '~/api/interface';
import { backPilotLogListType } from '~/api/interface/flyerCenterType';
import { useNavigate } from 'react-router-dom';
//日志列表返回类型
type logListType = InterDataType<backPilotLogListType>['list'];
//日志列表请求类型
type logParametersType = InterReqListType<backPilotLogListType>;
const FlyerAuthDaily = () => {
const navigate = useNavigate();
const searchColumns: searchColumnsType[] = [
{
label: '账号',
type: 'input',
placeholder: '请输入姓名,手机号',
name: 'accountNumber',
},
];
const tableColumns: ColumnsType<logListType[0]> = [
{
title: '审批及认证时间',
align: 'center',
dataIndex: 'certificationDate',
},
{
title: '账号',
align: 'center',
dataIndex: 'userName',
},
{
title: '手机号',
align: 'center',
dataIndex: 'phoneNum',
},
{
title: '申请及审批信息',
align: 'center',
dataIndex: 'certificationMessage',
},
{
title: '操作人员',
align: 'center',
dataIndex: 'operatorUserName',
},
];
const [tableData, setTableData] = useState<logListType>([]);
const [pagination, setPagination] = useState<PaginationProps & { totalCount: number }>({
pageNo: 1,
pageSize: 10,
totalCount: 0,
});
const [query, setQuery] = useState<logParametersType>();
//认证日志列表
const getBackPilotLogList = (query?: logParametersType) => {
FlyerCenterAPI.getBackPilotLogList({
pageNo: pagination.pageNo,
pageSize: pagination.pageSize,
...query,
}).then(({ result }) => {
pagination.totalCount = result.totalCount;
setPagination(pagination);
setTableData(result.list || []);
});
};
//分页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getBackPilotLogList(query);
};
//筛选成功
const searchSuccess = (value: logParametersType) => {
pagination.pageNo = 1;
pagination.pageSize = 10;
setQuery(value);
getBackPilotLogList(value);
};
//返回
const backRoute = () => {
navigate(-1);
};
useEffect(() => {
getBackPilotLogList();
}, []);
return (
<div className='flyer-auth-daily'>
<SearchBox
search={searchColumns}
searchData={searchSuccess}
otherChild={
<Button type='primary' onClick={backRoute}>
返回
</Button>
}
/>
<Table
columns={tableColumns}
dataSource={tableData}
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
</div>
);
};
export default FlyerAuthDaily;
import { Form, message, Modal, ModalProps, Radio, RadioChangeEvent, Select } from 'antd';
import { FC, useState } from 'react';
import { FlyerCenterAPI } from '~/api';
import { InterDataType } from '~/api/interface';
import { backListReasonType } from '~/api/interface/flyerCenterType';
interface selfProps {
onCancel: () => void;
onOk: () => void;
flyerId: number;
}
//原因列表返回类型
type reasonType = InterDataType<backListReasonType>;
const ApproveModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk, flyerId }) => {
const [form] = Form.useForm();
const [auditStatus, setAuditStatus] = useState<number>(1);
const [reasonList, setReasonList] = useState<reasonType>([]);
const handleCancel = () => {
form.resetFields();
setAuditStatus(-1);
onCancel();
};
const handleOk = () => {
form.validateFields().then((values) => {
FlyerCenterAPI.updateAuditStatus({ ...values, id: flyerId }).then(({ code }) => {
if (code === '200') {
message.success('审批成功');
onOk();
form.resetFields();
setAuditStatus(-1);
}
});
});
};
const radioChange = (e: RadioChangeEvent) => {
if (e.target.value === 2) {
getBackListReason();
}
setAuditStatus(e.target.value);
};
//不通过原因列表
const getBackListReason = () => {
FlyerCenterAPI.getBackListReason().then(({ result }) => {
setReasonList(result || []);
});
};
return (
<Modal open={open} onCancel={handleCancel} onOk={handleOk} title='审批飞手'>
<Form form={form} initialValues={{ auditStatus: 1 }}>
<Form.Item label='状态' name='auditStatus'>
<Radio.Group onChange={radioChange}>
<Radio value={1}>已通过</Radio>
<Radio value={2}>未通过</Radio>
</Radio.Group>
</Form.Item>
{auditStatus !== 2 ? (
''
) : (
<Form.Item
label='原因'
name='reasonId'
rules={[{ required: true, message: '请选择原因' }]}
>
<Select placeholder='请选择原因'>
{reasonList.map((v) => (
<Select.Option value={v.id} key={v.id}>
{v.reason}
</Select.Option>
))}
</Select>
</Form.Item>
)}
</Form>
</Modal>
);
};
export default ApproveModal;
.flyer-detail{
height: 100%;
padding: 20px;
box-sizing: border-box;
.ant-row{
height: 100%;
}
&-header{
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
&-auth{
}
&-ability{
.ability-img{
margin-right: 10px;
margin-bottom: 10px;
}
}
}
import { FlyerCenterAPI } from '~/api';
import { useSearchParams, useNavigate } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { InterDataType } from '~/api/interface';
import { backDetailPilotType } from '~/api/interface/flyerCenterType';
import { Badge, Button, Col, Descriptions, Image, Row, Tag } from 'antd';
import './index.scss';
import ApproveModal from './components/approveModal';
//飞手详情返回类型
type flyerDetailType = InterDataType<backDetailPilotType>;
const FlyerDetail = () => {
const [searchParams] = useSearchParams();
const navigate = useNavigate();
const [isApprove, setIsApprove] = useState<boolean>(false);
const [flyerId, setFlyerId] = useState<number>(-1);
const [flyerDetail, setFlyerDetail] = useState<flyerDetailType>();
const [approveModalShow, setApproveModalShow] = useState<boolean>(false);
const getFlyerDetail = (id: number) => {
FlyerCenterAPI.getBackDetailPilot({ id }).then(({ result }) => {
setFlyerDetail(result);
});
};
//审批弹窗
const approveFlyerClick = () => {
setApproveModalShow(true);
};
const approveModalCancel = () => {
setApproveModalShow(false);
};
const approveModalOk = () => {
setApproveModalShow(false);
getFlyerDetail(flyerId);
};
//返回
const backRoute = () => {
navigate(-1);
};
useEffect(() => {
getFlyerDetail(Number(searchParams.get('id')));
setFlyerId(Number(searchParams.get('id')));
setIsApprove(!!searchParams.get('isApprove'));
}, []);
return (
<div className='flyer-detail'>
<div className='flyer-detail-header'>
<div className='header-info'>
{flyerDetail?.userAccountId}({flyerDetail?.userName})
</div>
<div className='header-operate'>
{isApprove && flyerDetail?.auditStatus === 0 ? (
<Button type='primary' style={{ marginRight: '10px' }} onClick={approveFlyerClick}>
审批
</Button>
) : (
''
)}
<Button type='primary' onClick={backRoute}>
返回
</Button>
</div>
</div>
<Row justify='space-between'>
<Col span={11}>
<div className='flyer-detail-auth'>
<Descriptions title='执照认证' bordered column={1} labelStyle={{ width: '100px' }}>
<Descriptions.Item label='执照类型'>
{flyerDetail?.licenseType === 'OTHER' ? '其它' : flyerDetail?.licenseType}
</Descriptions.Item>
<Descriptions.Item label='执照编号'>{flyerDetail?.licenseNumber}</Descriptions.Item>
<Descriptions.Item label='认证状态'>
<Badge
status={
flyerDetail?.auditStatus === 0
? 'processing'
: flyerDetail?.auditStatus === 1
? 'success'
: 'error'
}
text={
flyerDetail?.auditStatus === 0
? '审核中'
: flyerDetail?.auditStatus === 1
? '已通过'
: '未通过'
}
/>
{flyerDetail?.auditStatus === 2 ? (
<span style={{ color: 'red' }}>({flyerDetail?.reason})</span>
) : (
''
)}
</Descriptions.Item>
<Descriptions.Item label='个人简介'>
{flyerDetail?.individualResume}
</Descriptions.Item>
<Descriptions.Item label='执照图片'>
<Image src={flyerDetail?.licenseUrl} width={100} />
</Descriptions.Item>
</Descriptions>
</div>
</Col>
<Col span={11}>
<div className='flyer-detail-ability'>
<Descriptions title='能力认证' bordered column={1} labelStyle={{ minWidth: '100px' }}>
<Descriptions.Item label='常驻地'>{flyerDetail?.residentCity}</Descriptions.Item>
<Descriptions.Item label='工作年限'>{flyerDetail?.yearsOfWorking}</Descriptions.Item>
<Descriptions.Item label='能力'>
{flyerDetail?.pilotAbility.map((v) => (
<Tag key={v.id}>{v.abilityName}</Tag>
))}
</Descriptions.Item>
<Descriptions.Item label='业务案例'>
{flyerDetail?.abilityUrl ? (
<Image.PreviewGroup>
{JSON.parse(flyerDetail?.abilityUrl).map((v: string, index: number) => (
<Image
src={v}
key={index}
width={100}
height={100}
rootClassName='ability-img'
/>
))}
</Image.PreviewGroup>
) : (
''
)}
</Descriptions.Item>
</Descriptions>
</div>
</Col>
</Row>
{/* 审批弹窗*/}
<ApproveModal
open={approveModalShow}
onCancel={approveModalCancel}
onOk={approveModalOk}
flyerId={flyerId}
/>
</div>
);
};
export default FlyerDetail;
import { Form, Input, message, Modal, ModalProps } from 'antd';
import { FC, useEffect } from 'react';
import { InterDataType } from '~/api/interface';
import { backListPilotType } from '~/api/interface/flyerCenterType';
import { FlyerCenterAPI } from '~/api';
//飞手列表返回类型
type flyerListType = InterDataType<backListPilotType>['list'];
interface selfProps {
onOk: () => void;
flyerItem: flyerListType[0] | undefined;
}
const UpdateRemarkModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk, flyerItem }) => {
const [form] = Form.useForm<{ remark: string }>();
const handleOk = () => {
if (flyerItem) {
form.validateFields().then((values) => {
FlyerCenterAPI.updateRemark({ id: flyerItem.id, ...values }).then(({ code }) => {
if (code === '200') {
message.success('编辑备注成功');
onOk();
}
});
});
}
};
useEffect(() => {
if (flyerItem) {
form.setFieldValue('remark', flyerItem.remark);
}
}, [flyerItem]);
return (
<Modal open={open} onCancel={onCancel} onOk={handleOk} title='备注修改'>
<Form form={form}>
<Form.Item label='备注' name='remark'>
<Input.TextArea placeholder='请输入备注' maxLength={70} showCount rows={4} />
</Form.Item>
</Form>
</Modal>
);
};
export default UpdateRemarkModal;
import SearchBox, { searchColumns as searchColumnsType } from '~/components/search-box';
import { Button, Table, Tag } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { CommonAPI, FlyerCenterAPI } from '~/api';
import { useEffect, useState } from 'react';
import { InterDataType, InterReqListType, PaginationProps } from '~/api/interface';
import { backListPilotType } from '~/api/interface/flyerCenterType';
import { getSecondDistrictInfoType } from '~/api/interface/commonType';
import { useNavigate } from 'react-router-dom';
import UpdateRemarkModal from './components/updateRemarkModal';
//飞手列表返回类型
type flyerListType = InterDataType<backListPilotType>['list'];
//飞手列表请求类型
type flyerListParameters = InterReqListType<backListPilotType>;
//地址返回数据
type locationType = InterDataType<getSecondDistrictInfoType>;
const FlyerList = () => {
const navigate = useNavigate();
const [searchColumns, setSearchColumns] = useState<searchColumnsType[]>([
{
name: 'accountNumber',
label: '账号',
placeholder: '请输入UID,姓名或手机号',
type: 'input',
},
{
name: 'auditStatus',
label: '执照认证状态',
placeholder: '请选择执照认证状态',
type: 'select',
options: [
{ id: 0, name: '审核中' },
{ id: 1, name: '已通过' },
{ id: 2, name: '未通过' },
],
},
{
name: 'abilityId',
label: '能力认证',
placeholder: '请选择能力认证',
type: 'select',
options: [],
},
{
name: 'areaNumber',
label: '常驻城市',
placeholder: '请选择常驻城市',
type: 'Cascader',
options: [],
},
]);
const tableColumns: ColumnsType<flyerListType[0]> = [
{
title: 'UID',
dataIndex: 'userAccountId',
align: 'center',
},
{
title: '姓名',
align: 'center',
dataIndex: 'userName',
},
{
title: '执照认证状态',
align: 'center',
dataIndex: 'auditStatus',
render: (text: number) => (text === 0 ? '审核中' : text === 1 ? '已通过' : '未通过'),
},
{
title: '能力认证',
align: 'center',
dataIndex: 'pilotAbility',
width: '20%',
render: (text: flyerListType[0]['pilotAbility']) =>
text ? text.map((v) => <Tag key={v.abilityId}>{v.abilityName}</Tag>) : '',
},
{
title: '常驻城市',
align: 'center',
dataIndex: 'residentCity',
},
{
title: '手机号',
align: 'center',
dataIndex: 'phoneNum',
},
{
title: '申请认证时间',
align: 'center',
dataIndex: 'createTime',
},
{
title: '备注',
align: 'center',
dataIndex: 'remark',
width: '20%',
ellipsis: true,
render: (text: string, record) => (
<div
onClick={() => updateRemarkClick(record)}
style={{
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
width: '100%',
overflow: 'hidden',
cursor: 'pointer',
color: '#1677ff',
}}
>
{text || '--'}
</div>
),
},
{
title: '操作',
align: 'center',
render: (_text: string, record) => (
<>
<Button
type='link'
danger
disabled={record.auditStatus !== 0}
onClick={() => toFlyerApprove(record)}
>
审批
</Button>
<Button type='link' onClick={() => toFlyerDetail(record)}>
详情
</Button>
</>
),
},
];
const [tableData, setTableData] = useState<flyerListType>([]);
const [currentTableItem, setCurrentTableItem] = useState<flyerListType[0]>();
const [query, setQuery] = useState<flyerListParameters>();
const [pagination, setPagination] = useState<PaginationProps & { totalCount: number }>({
pageNo: 1,
pageSize: 10,
totalCount: 0,
});
const [loading, setLoading] = useState<boolean>(false);
//修改备注弹窗
const [updateRemarkModalShow, setUpdateRemarkModalShow] = useState<boolean>(false);
//飞手列表
const getFlyerList = (query?: flyerListParameters) => {
setLoading(true);
FlyerCenterAPI.getBackListPilot({
pageNo: pagination.pageNo,
pageSize: pagination.pageSize,
...query,
}).then(({ result }) => {
setLoading(false);
pagination.totalCount = result.totalCount;
setTableData(result.list || []);
setPagination(pagination);
});
};
//飞手能力列表
const getAbilityList = () => {
FlyerCenterAPI.getAbilityList().then(({ result }) => {
searchColumns[2].options = (result || []).map((v) => ({
id: v.abilityId,
name: v.abilityName,
}));
setSearchColumns([...searchColumns]);
});
};
//分页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getFlyerList(query);
};
//筛选成功
const searchSuccess = (value: flyerListParameters) => {
pagination.pageNo = 1;
pagination.pageSize = 10;
setQuery({ ...value, areaNumber: value.areaNumber ? value.areaNumber[1] : undefined });
getFlyerList({ ...value, areaNumber: value.areaNumber ? value.areaNumber[1] : undefined });
};
//获取地域数据
const getSecondDistrictInfo = () => {
CommonAPI.getSecondDistrictInfo().then(({ result }) => {
const covertLocationData: any = (list: locationType) => {
return list.map((v) => ({
label: v.name,
value: v.id,
children: v.childInfo ? covertLocationData(v.childInfo) : [],
}));
};
searchColumns[3].options = covertLocationData(result);
setSearchColumns([...searchColumns]);
});
};
//认证日志页面
const toFlyerAuthDaily = () => {
navigate('/flyerCenter/flyerAuthDaily');
};
//飞手审批页面
const toFlyerApprove = (record: flyerListType[0]) => {
navigate({ pathname: '/flyerCenter/flyerDetail', search: `id=${record.id}&isApprove=1` });
};
//飞手详情页面
const toFlyerDetail = (record: flyerListType[0]) => {
navigate({ pathname: '/flyerCenter/flyerApprove', search: `id=${record.id}` });
};
//修改备注
const updateRemarkClick = (record: flyerListType[0]) => {
setCurrentTableItem(record);
setUpdateRemarkModalShow(true);
};
const updateRemarkModalCancel = () => {
setUpdateRemarkModalShow(false);
};
const updateRemarkModalOk = () => {
getFlyerList(query);
setUpdateRemarkModalShow(false);
};
useEffect(() => {
getFlyerList();
getAbilityList();
getSecondDistrictInfo();
}, []);
return (
<div className='flyer-list'>
<SearchBox
search={searchColumns}
searchData={searchSuccess}
child={
<Button type='primary' onClick={toFlyerAuthDaily}>
认证日志
</Button>
}
/>
<Table
bordered
columns={tableColumns}
dataSource={tableData}
loading={loading}
rowKey='id'
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
{/*修改备注*/}
<UpdateRemarkModal
open={updateRemarkModalShow}
onOk={updateRemarkModalOk}
onCancel={updateRemarkModalCancel}
flyerItem={currentTableItem}
/>
</div>
);
};
export default FlyerList;
......@@ -202,7 +202,7 @@ const AddEditModal: React.FC<propType> = (props) => {
wrapperCol={{ span: 20 }}
>
<RichText
value={form.getFieldValue('detailContent')}
richTextContent={form.getFieldValue('detailContent')}
onChange={(e) => form.setFieldValue('detailContent', e)}
height={250}
/>
......
......@@ -79,7 +79,7 @@ const SkuAddOrEditModal: FC<ModalProps & selfProps> = ({
return Promise.reject(new Error('请输入正整数'));
}
} else {
return Promise.reject(new Error('请输入库存'));
return Promise.resolve();
}
};
......@@ -153,7 +153,7 @@ const SkuAddOrEditModal: FC<ModalProps & selfProps> = ({
editable: true,
align: 'center',
dataIndex: 'stock',
rules: [{ required: true, validator: stockPriceValidator }],
rules: [{ required: false, validator: stockPriceValidator }],
inputType: 'number',
},
{
......
.gather-detail-img{
margin-right: 10px;
margin-bottom: 10px;
}
import { useSearchParams } from 'react-router-dom';
import { ResourceManageAPI } from '~/api';
import { useEffect, useState } from 'react';
import { InterDataType } from '~/api/interface';
import { backDetailPublishType } from '~/api/interface/resourceManageType';
import { Button, Descriptions, Image } from 'antd';
import { useNavigate } from 'react-router-dom';
import './index.scss';
//需求详情返回类型
type detailType = InterDataType<backDetailPublishType>;
const GatherDetail = () => {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const [publishDetails, setPublishDetails] = useState<detailType>();
const getPublishDetail = (id: number) => {
ResourceManageAPI.getDetailPublish({ id }).then(({ result }) => {
setPublishDetails(result);
});
};
//返回
const backRoute = () => {
navigate(-1);
};
useEffect(() => {
getPublishDetail(Number(searchParams.get('id')));
}, []);
return (
<div className='gather-detail'>
<Descriptions
title='需求信息'
bordered
extra={
<Button type='primary' onClick={backRoute}>
返回
</Button>
}
column={4}
labelStyle={{ minWidth: '100px' }}
>
<Descriptions.Item label='需求类型'>
{publishDetails?.requirementTypeName}
</Descriptions.Item>
<Descriptions.Item label='任务标题'>{publishDetails?.taskTitle}</Descriptions.Item>
<Descriptions.Item label='任务结束时间'>{publishDetails?.taskEndTime}</Descriptions.Item>
<Descriptions.Item label='任务开始时间'>{publishDetails?.taskStartTime}</Descriptions.Item>
<Descriptions.Item label='任务地址'>{publishDetails?.taskAddress}</Descriptions.Item>
<Descriptions.Item label='描述图片' span={3}>
<Image.PreviewGroup>
{publishDetails?.requireUrl
? JSON.parse(publishDetails?.requireUrl).map((url: string, index: number) => (
<Image
src={url}
width={50}
height={50}
key={index}
rootClassName='gather-detail-img'
/>
))
: ''}
</Image.PreviewGroup>
</Descriptions.Item>
<Descriptions.Item label='需求描述' span={4}>
{publishDetails?.requireDescription}
</Descriptions.Item>
</Descriptions>
</div>
);
};
export default GatherDetail;
......@@ -6,12 +6,15 @@ import { ResourceManageAPI } from '~/api';
import { InterDataType, InterReqType, PaginationProps } from '~/api/interface';
import './index.scss';
import { listPublishPageType } from '~/api/interface/resourceManageType';
import { useNavigate } from 'react-router-dom';
//需求列表返回类型
type requirementsType = InterDataType<listPublishPageType>['list'];
type requirementsParameter = Omit<InterReqType<listPublishPageType>, 'pageSize' | 'pageNo'>;
const RequirementsGathering = () => {
const navigate = useNavigate();
const [searchColumnsData, setSearchColumnsData] = useState<searchColumns[]>([
{
label: '需求类型',
......@@ -63,7 +66,9 @@ const RequirementsGathering = () => {
<Button type='link' danger onClick={() => deleteRequirements(record)}>
强制删除
</Button>
<Button type='link'>联系客户</Button>
<Button type='link' onClick={() => toGatherDetail(record)}>
详情
</Button>
</>
),
},
......@@ -129,6 +134,11 @@ const RequirementsGathering = () => {
},
});
};
//跳转需求详情
const toGatherDetail = (record: requirementsType[0]) => {
navigate({ pathname: '/resourceManage/gatherDetail', search: `id=${record.id}` });
};
useEffect(() => {
getRequirementsList();
getRequirementsTypeList();
......
......@@ -56,12 +56,23 @@ import LoginView from '~/pages/common/login';
import CustomListView from '~/pages/customManage/customList';
import CustomMoneyView from '~/pages/customManage/customMoney';
import CustomMoneyDetail from '~/pages/customManage/customMoney/detail';
const CustomVerificationView = React.lazy(
() => import('~/pages/customManage/customVerification/list'),
); //实名认证
const CustomVerificationDetailView = React.lazy(
() => import('~/pages/customManage/customVerification/details'),
);
//资源管理
import MaterielManageView from '~/pages/resourceManage/materielManage';
import MaterielManageDetail from '~/pages/resourceManage/materielManage/detail';
const RequirementsGatheringView = React.lazy(
() => import('~/pages/resourceManage/requirementsGathering'),
); //需求收集
const GatheringListView = React.lazy(
() => import('~/pages/resourceManage/requirementsGathering/gatherList'),
); //需求收集列表
const GatherDetailView = React.lazy(
() => import('~/pages/resourceManage/requirementsGathering/gatherDetail'),
);
const TagManageView = React.lazy(() => import('~/pages/resourceManage/tagManage')); //标签管理
const IndustryNewsView = React.lazy(() => import('~/pages/resourceManage/industryNews'));
//论坛管理
......@@ -100,20 +111,29 @@ const ProduceDetailView = React.lazy(
); //产品详情
const MakeListView = React.lazy(() => import('~/pages/mallManage/makeManage/makeList'));
// 分类管理
const CategoryListView = React.lazy(() => import('~/pages/categoryManage/categoryList'));
const MallCategoryListView = React.lazy(() => import('~/pages/categoryManage/mallCategoryList')); //商城分类
const ServiceCategoryListView = React.lazy(
() => import('~/pages/categoryManage/serviceCategoryList'),
); //服务分类
const CategoryManage = React.lazy(() => import('~/pages/categoryManage/category'));
const CategoryDetail = React.lazy(() => import('~/pages/categoryManage/category/detail'));
// 目录管理
const DirectoryManage = React.lazy(() => import('~/pages/categoryManage/directoryManage'));
//飞手培训
//执照培训
const InstitutionsListView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/institutionsList'),
);
//机构上传
); //机构列表
const AddInstitutionsView = React.lazy(
() => import('~/pages/pilotTraining/ licensureExamination/addOrEditInstitution'),
);
); //机构上传
//飞手中心
const FlyerListView = React.lazy(() => import('~/pages/flyerCenter/flyerManage/flyerList')); //飞手列表
const FlyerAuthDailyView = React.lazy(
() => import('~/pages/flyerCenter/flyerManage/flyerAuthDaily'),
); //飞手认证日志;
const FlyerDetailsView = React.lazy(() => import('~/pages/flyerCenter/flyerManage/flyerDetail')); //飞手详情、飞手审批
// 系统管理
import AccountManageView from '~/pages/systemManage/accountManage';
......@@ -128,7 +148,7 @@ const CompanyDetailView = React.lazy(
);
import AccountLimit from '~/pages/systemManage/limitManage/roleList'; //账号权限
import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
import CustomListDetail from '~/pages/customManage/customList/detail'; //权限信息
import CustomListDetail from '~/pages/customManage/customList/detail';
// const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryDetailView = React.lazy(
......@@ -206,6 +226,27 @@ export const routerList: Array<RouteObjectType> = [
},
},
{
path: '/customManage/customVerification',
element: withLoadingComponent(<CustomVerificationView />),
errorElement: <ErrorPage />,
meta: {
id: 260,
title: '实名认证',
icon: <SolutionOutlined />,
},
},
{
path: '/customManage/customVerificationDetail',
element: withLoadingComponent(<CustomVerificationDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 250,
title: '实名认证详情',
hidden: true,
icon: <SolutionOutlined />,
},
},
{
path: '/customManage/customList/detail',
element: withLoadingComponent(<CustomListDetail />),
errorElement: <ErrorPage />,
......@@ -251,6 +292,61 @@ export const routerList: Array<RouteObjectType> = [
],
},
{
path: '/flyerCenter',
element: <LayoutView />,
errorElement: <ErrorPage />,
meta: {
id: 1800,
icon: <UserOutlined />,
title: '飞手中心',
},
children: [
{
path: '/flyerCenter/flyerList',
element: withLoadingComponent(<FlyerListView />),
errorElement: <ErrorPage />,
meta: {
id: 1810,
title: '飞手管理',
icon: <UserOutlined />,
},
},
{
path: '/flyerCenter/flyerAuthDaily',
element: withLoadingComponent(<FlyerAuthDailyView />),
errorElement: <ErrorPage />,
meta: {
id: 1815,
title: '认证日志',
hidden: true,
icon: <UserOutlined />,
},
},
{
path: '/flyerCenter/flyerDetail',
element: withLoadingComponent(<FlyerDetailsView />),
errorElement: <ErrorPage />,
meta: {
id: 1816,
title: '飞手详情',
hidden: true,
icon: <UserOutlined />,
},
},
{
path: '/flyerCenter/flyerApprove',
element: withLoadingComponent(<FlyerDetailsView />),
errorElement: <ErrorPage />,
meta: {
id: 1817,
title: '飞手审批',
hidden: true,
icon: <UserOutlined />,
},
},
],
},
{
path: '/resourceManage',
element: <LayoutView />,
errorElement: <ErrorPage />,
......@@ -262,7 +358,7 @@ export const routerList: Array<RouteObjectType> = [
children: [
{
path: '/resourceManage/requirementsGathering',
element: withLoadingComponent(<RequirementsGatheringView />),
element: withLoadingComponent(<GatheringListView />),
errorElement: <ErrorPage />,
meta: {
id: 410,
......@@ -271,6 +367,17 @@ export const routerList: Array<RouteObjectType> = [
},
},
{
path: '/resourceManage/gatherDetail',
element: withLoadingComponent(<GatherDetailView />),
errorElement: <ErrorPage />,
meta: {
id: 415,
title: '需求详情',
hidden: true,
icon: <MonitorOutlined />,
},
},
{
path: '/resourceManage/materielManage',
element: withLoadingComponent(<MaterielManageView />),
errorElement: <ErrorPage />,
......@@ -662,6 +769,17 @@ export const routerList: Array<RouteObjectType> = [
icon: <SendOutlined />,
},
},
// 作业服务分类(新)
// {
// path: '/categoryManage/serviceCategoryList',
// element: withLoadingComponent(<ServiceCategoryListView />),
// errorElement: <ErrorPage />,
// meta: {
// id: 1210,
// title: '作业服务分类',
// icon: <SendOutlined />,
// },
// },
{
path: '/categoryManage/jobServicesCategory/2',
element: withLoadingComponent(<CategoryManage />),
......@@ -682,9 +800,10 @@ export const routerList: Array<RouteObjectType> = [
icon: <AppstoreAddOutlined />,
},
},
// 产品商城分类(新)
{
path: '/categoryManage/categoryList',
element: withLoadingComponent(<CategoryListView />),
path: '/categoryManage/mallCategoryList',
element: withLoadingComponent(<MallCategoryListView />),
errorElement: <ErrorPage />,
meta: {
id: 1240,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论