system-copyright-react/src/layout/head/Head.tsx

1539 lines
54 KiB
TypeScript
Raw Normal View History

2024-03-11 19:13:42 +08:00
import './head.css'
2024-12-16 11:38:40 +08:00
// import { NodeJS } from 'types/node';
2024-07-31 16:00:30 +08:00
import { useDispatch } from 'react-redux'
2024-03-11 23:33:03 +08:00
import BalanceHead from '../../components/balance/BalanceHead.tsx';
import RechargeHead from '../../components/recharge/RechargeHead.tsx';
2025-02-26 16:57:47 +08:00
import { Empty, Dropdown, MenuProps, message, Modal, Space, Spin, Input, Table, Form, Button, InputNumber } from "antd";
import type { TableProps, FormProps } from 'antd';
interface DataType {
usericId: string;
icPriceMaterial: number;
icPriceAll: number;
createTime: string;
}
interface icDataType {
contactName: string;//联系人姓名
contactPhone: string;//联系人电话
idCardNumber: string;//证件号
idCardType: string;//证件类型
lastLoginTime: string;//最后登录时间
userId: string;//用户id
userInfoId: string;//主键
userInfoName: string;//用户名称
userInfoNameEn: string;//用户英文名称
userInfoType: string;//用户类型
userUsername: string;//用户名
}
type FieldType = {
icPriceMaterial: string;
icPriceAll: string;
};
// const data: DataType[] = [
// {
// key: '1',
// code: 'xixi112',
// price: 32,
// },
// {
// key: '2',
// code: 'xixi22',
// price: 42,
// },
// {
// key: '3',
// code: 'hehe23',
// price: 32,
// },
// {
// key: '4',
// code: 'hehe1232',
// price: 32,
// },
// {
// key: '4',
// code: 'hehe123',
// price: 32,
// },
// {
// key: '5',
// code: 'hehe1235',
// price: 32,
// },
// {
// key: '6',
// code: 'hehe1236',
// price: 32,
// },
// {
// key: '7',
// code: 'hehe1237',
// price: 32,
// },
// {
// key: '8',
// code: 'hehe1238',
// price: 32,
// },
// {
// key: '9',
// code: 'hehe1239',
// price: 32,
// },
// ];
2025-03-02 18:07:03 +08:00
import { DownOutlined, UserOutlined, QuestionCircleOutlined, BellOutlined, KeyOutlined, LogoutOutlined, GiftOutlined, AccountBookOutlined, ContainerOutlined, MenuFoldOutlined, UsergroupAddOutlined,TableOutlined } from "@ant-design/icons";
2024-04-29 17:22:26 +08:00
import { useContext, useEffect, useState } from "react";
2025-02-26 16:57:47 +08:00
import {
put, get,
post,
getUseUrl
} from "../../util/AjaxUtils.ts";
2024-04-29 17:22:26 +08:00
import { GlobalContext, GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
2024-04-02 18:45:46 +08:00
import UserEdit from "../../components/user/UserEdit.tsx";
import PasswordChange from "../../components/password/PasswordChange.tsx";
2024-04-29 17:22:26 +08:00
// import headRightBg from '../../assets/head-right-bg.png';
2024-04-02 18:45:46 +08:00
import InvoiceList from "../../components/invoice/InvoiceList.tsx";
2024-04-29 17:22:26 +08:00
import logoImg from '../../static/head/logo.png'
2024-05-23 14:57:22 +08:00
import userImg from '../../static/homeimg/userimg.png'
2025-01-19 10:19:11 +08:00
import kf from '../../static/head/kf.png'
import kfImg from '../../static/head/kfImg.png'
2024-05-28 18:00:42 +08:00
import { reMenuActive } from '../../util/cache';
2024-06-19 11:08:39 +08:00
// import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
2024-06-21 16:18:01 +08:00
import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx'
2024-08-12 14:43:58 +08:00
import inv from '../../static/inv.png'
import MyOrder from '../../components/myOrder/MyOrder.tsx'
2024-08-13 18:06:34 +08:00
import NoticeModal from '../../components/NoticeModal/NoticeModal.tsx';
2025-03-02 18:07:03 +08:00
import type {
TableColumnsType,
} from 'antd';
2024-09-02 16:41:02 +08:00
// import HeadCouponModal from '../../components/CouponModal/HeadCouponModal.tsx'
2024-03-11 19:13:42 +08:00
export default function Head() {
2025-03-02 18:07:03 +08:00
const [packList, setPackList] = useState<any[]>([]) //服务包列表
const [packPage, setPackPage] = useState(1) //服务包分页
const [packTotal, setPackTotal] = useState(0) //服务包总数
// 获取我得服务包信息
const getPickList = () => {
get<any>({
messageApi,
url: `/api/proj/servicepkg/packageorder/listpage/self`,
config: {
params: {
page: packPage,
rows: 10,
}
},
onBefore() {
},
onSuccess({ data }) {
setPackList(data.rows)
setPackTotal(data.total)
},
onFinally() {
}
})
}
useEffect(() => {
getPickList();
}, [packPage]);
2025-02-26 16:57:47 +08:00
const [page, setPage] = useState(1) //邀请码使用人数分页
const [total, setTotal] = useState(0) //邀请码使用人数总量
const [icListLoading, setIcListLoading] = useState(false)
const [myInvModal, setMyInvModal] = useState(false) //我的邀请码弹窗
const [createInvModal, setCreateInvModal] = useState(false) //创建邀请码弹窗
const [icModal, setIcModal] = useState(false) //查看邀请码详情弹窗
const [selectIc, setSelectIc] = useState('') //选中的邀请码
2024-09-02 16:41:02 +08:00
// const redxuState: any = useSelector(state => state)
// const couponModal = redxuState.couponModal
2024-08-13 18:06:34 +08:00
// 消息通知弹窗
const [noticeModal, setNoticeModal] = useState(false)
2025-01-19 10:19:11 +08:00
// 客服弹窗
const [kfModal, setkfModal] = useState(false)
2024-08-13 18:06:34 +08:00
// 未读消息数
const [unRead, setUnRead] = useState(0)
// 获取未读消息总数
const getUnRead = () => {
get<any>({
messageApi,
url: '/api/user-msg/count-un-read/self',
onSuccess({ data }) {
2024-08-14 11:04:35 +08:00
// console.log(data);
2024-08-13 18:06:34 +08:00
setUnRead(data.data)
}
})
}
2024-08-12 14:43:58 +08:00
// 邀请码弹窗
const [invitationModal, setinvitationModal] = useState(false)
2024-08-12 17:15:23 +08:00
// 邀请码弹窗加载
2024-08-13 18:06:34 +08:00
const [isLoading, setisLoading] = useState(false)
2024-08-12 14:43:58 +08:00
// 解除绑定邀请码弹窗
// const [relieveModal, setRelieveModal] = useState(false)
// 申请的邀请码
2025-02-26 16:57:47 +08:00
// const [invNum, setInvNum] = useState('')
2024-08-12 14:43:58 +08:00
// 输入的邀请码
const [inInvNum, setInInvNum] = useState('')
// 已绑定的邀请码
const [bindingInvNum, setBindingInvNum] = useState('')
// 邀请码申请状态
2025-02-26 16:57:47 +08:00
// const [icStatus, setIcStatus] = useState('')
2024-08-12 14:43:58 +08:00
// 邀请码返利比例
const [icRebateRatio, seticRebateRatio] = useState('')
2024-08-14 16:22:29 +08:00
// 全托管分账
2025-03-03 10:38:30 +08:00
// const [icPriceAll, seticPriceAll] = useState(0)
2024-08-14 16:22:29 +08:00
// 写材料分账
2025-03-03 10:38:30 +08:00
// const [icPriceMaterial, seticPriceMaterial] = useState(0)
2024-08-12 14:43:58 +08:00
// 获取邀请码申请状态
2025-02-26 16:57:47 +08:00
// const getIcStatus = () => {
// get<any>({
// messageApi,
// url: '/api/ic/apply/get/self',
// onSuccess({ data }) {
// // console.log(data);
// if (data) {
// setIcStatus(data.applyStatus)
// }
// }
// })
// }
2024-08-12 14:43:58 +08:00
// 获取邀请码信息
const getIc = () => {
get<any>({
messageApi,
url: '/api/ic/get/self',
2024-08-12 17:15:23 +08:00
onBefore() {
setisLoading(true)
},
2024-08-12 14:43:58 +08:00
onSuccess({ data }) {
2024-08-12 17:18:44 +08:00
// console.log(data);
2025-02-26 16:57:47 +08:00
// setInvNum(data.ic)
2024-08-12 14:43:58 +08:00
setBindingInvNum(data.relationIc)
seticRebateRatio(data.icRebateRatio)
2025-03-03 10:38:30 +08:00
// seticPriceAll(Number(data.icPriceAll) / 100 * Number(data.icRebateRatio) / 100)
// seticPriceMaterial(Number(data.icPriceMaterial) / 100 * Number(data.icRebateRatio) / 100)
2024-08-12 14:43:58 +08:00
if (data.ic == '') {
2025-02-26 16:57:47 +08:00
// getIcStatus()
2024-08-12 14:43:58 +08:00
}
2024-08-12 17:15:23 +08:00
},
onFinally() {
setisLoading(false)
2024-08-12 14:43:58 +08:00
}
})
}
// 绑定邀请码
const putIc = () => {
put<any>({
messageApi,
url: `/api/ic/update-relation-ic`,
body: {
value: inInvNum
},
onBefore() {
},
onSuccess() {
// messageApi.success('保存成功,点击编辑按钮可继续修改项目简介');
// console.log(data);
getIc()
},
onFinally() {
}
})
}
// 确定输入的邀请码事件
const postInvNum = () => {
if (!inInvNum) {
messageApi.open({
type: 'error',
content: '请输入邀请码'
})
} else {
// setBindingInvNum(inInvNum)
// messageApi.open({
// type: 'success',
// content: '已绑定邀请码'
// })
putIc()
}
}
2025-02-26 16:57:47 +08:00
// 我的邀请码列表
const [myIcList, setMyIcList] = useState([])
// 获取我得邀请码列表
const getMyIcList = () => {
get<any>({
messageApi,
url: '/api/ic/v2/list/self',
// body: {
// value: inInvNum
// },
onBefore() {
setIcListLoading(true)
},
onSuccess({ data }) {
// console.log(data);
setMyIcList(data)
// setMyIcList([])
},
onFinally() {
setIcListLoading(false)
}
})
}
const [minAllPrice, setMinAllPrice] = useState(0) //最低全托管折扣价
const [minMaterialPrice, setMinMaterialPrice] = useState(0) //最低写材料折扣价
// 查看我得最低定价
const getMyIcMinPrice = () => {
get<any>({
messageApi,
url: '/api/proj/charge/get',
onBefore() {
},
onSuccess({ data }) {
// console.log(data.projTypes);
// console.log((data.projTypes.find((item:any) => item.type === 'MATERIAL')).price/100);
setMinAllPrice((data.projTypes.find((item: any) => item.type === 'ALL')).price / 100)
setMinMaterialPrice((data.projTypes.find((item: any) => item.type === 'MATERIAL')).price / 100)
},
onFinally() {
}
})
}
// 查看我的邀请码是否超出限制
const getIcLimit = () => {
get<any>({
messageApi,
url: '/api/ic/v2/list/self',
onBefore() {
},
onSuccess({ data }) {
// console.log(data);
// console.log(data.length);
if (data.length >= 10) {
messageApi.open({
type: 'error',
content: '您的邀请码已达上限'
})
} else {
setCreateInvModal(true)
getMyIcMinPrice()
}
}
})
}
2024-08-12 14:43:58 +08:00
// 点击获取邀请码
2025-02-26 16:57:47 +08:00
// const getInvNum = () => {
// post<any>({
// messageApi,
// url: `/api/ic/apply/apply`,
// onBefore() {
// },
// onSuccess() {
// messageApi.success('已申请')
// getIcStatus()
// },
// onFinally() {
// }
// })
// // setInvNum('RSDNQ5H7')
// }
// 表单事件
const onFinish: FormProps<FieldType>['onFinish'] = (values: any) => {
// console.log('Success:', values.icPriceAll);
// console.log('Success:', values.icPriceMaterial);
2024-08-12 14:43:58 +08:00
post<any>({
messageApi,
2025-02-26 16:57:47 +08:00
url: `/api/ic/v2/save`,
body: {
icPriceAll: values.icPriceAll * 100,
icPriceMaterial: values.icPriceMaterial * 100
},
2024-08-12 14:43:58 +08:00
onBefore() {
2025-02-26 16:57:47 +08:00
setIcListLoading(true)
2024-08-12 14:43:58 +08:00
},
onSuccess() {
2025-02-26 16:57:47 +08:00
// console.log(data);
messageApi.success('创建成功')
// 关闭弹窗
setCreateInvModal(false)
2024-08-12 14:43:58 +08:00
},
onFinally() {
2025-02-26 16:57:47 +08:00
setIcListLoading(false)
}
})
};
2024-08-12 14:43:58 +08:00
2025-02-26 16:57:47 +08:00
// const onFinishFailed: FormProps<FieldType>['onFinishFailed'] = (errorInfo) => {
// console.log('Failed:', errorInfo);
// };
// 使用的邀请码的人的信息列表
const [icList, setIcList] = useState<icDataType[]>([]);
// 获取使用的邀请码的人的信息
const getIcUserInfo = (id: string, page: number) => {
get<any>({
messageApi,
url: `/api/ic/v2/user-list/${id}`,
config: {
params: {
page: page,
rows: 10
}
},
onBefore() {
setIcListLoading(true)
},
onSuccess({ data }) {
setIcList(data.rows)
setTotal(data.total)
},
onFinally() {
setIcListLoading(false)
2024-08-12 14:43:58 +08:00
}
2025-02-26 16:57:47 +08:00
2024-08-12 14:43:58 +08:00
})
}
// 复制邀请码
2025-02-26 16:57:47 +08:00
const copyInvNum = (code: any) => {
2024-08-12 14:43:58 +08:00
// 创建一个临时的 input 元素
const tempInput = document.createElement('input');
document.body.appendChild(tempInput);
2025-02-26 16:57:47 +08:00
tempInput.value = code;
2024-08-12 14:43:58 +08:00
// 选中 input 中的内容
tempInput.select();
tempInput.setSelectionRange(0, 99999); // 对于移动设备的支持
// 执行复制操作
try {
document.execCommand('copy');
messageApi.open({
type: 'success',
content: '已复制到剪切板'
})
} catch (err) {
messageApi.open({
type: 'error',
content: '复制失败,请手动复制'
})
}
// 移除临时的 input 元素
document.body.removeChild(tempInput);
}
2025-02-26 16:57:47 +08:00
const columns: TableProps<DataType>['columns'] = [
{
title: '序号',
align: 'center',
dataIndex: 'usericId',
key: 'usericId',
render: (_text, _record, index) => <div>
{index + 1}
</div>,
},
{
title: '邀请码',
align: 'center',
dataIndex: 'usericId',
key: 'usericId',
// render: (text) => <a>{text}</a>,
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createTime',
key: 'usericId',
// render: (text) => <a>{text}</a>,
},
{
title: '写材料价格',
align: 'center',
dataIndex: 'icPriceMaterial',
key: 'usericId',
render: (text) => <>{text / 100}</>
},
{
title: '全托管价格',
align: 'center',
dataIndex: 'icPriceAll',
key: 'usericId',
render: (text) => <>{text / 100}</>
},
// {
// title: '返利比例',
// align: 'center',
// dataIndex: 'icRebateTatio',
// key: 'usericId',
// render: (text) => <>{text}%</>,
// },
// {
// title: '产生的成交金额',
// align: 'center',
// dataIndex: 'totalMoney',
// key: 'usericId',
// },
{
title: '操作',
align: 'center',
key: 'usericId',
render: (_, record) => (
<Space size="middle">
<a style={{
textDecoration: 'underline',
}} onClick={() => {
copyInvNum(record.usericId)
}}></a>
<a style={{
textDecoration: 'underline',
}} onClick={() => {
setIcModal(true)
setSelectIc(record.usericId)
getIcUserInfo(record.usericId, page)
}}>使</a>
2024-08-12 14:43:58 +08:00
2025-02-26 16:57:47 +08:00
</Space>
),
},
];
const icColumns: TableProps<icDataType>['columns'] = [
{
title: '序号',
align: 'center',
dataIndex: 'index',
key: 'userInfoId',
render: (_text, _record, index) => <div>
{index + 1}
</div>,
},
// {
// title: '用户ID',
// align: 'center',
// dataIndex: 'userId',
// key: 'userInfoId',
// // render: (text) => <a>{text}</a>,
// },
{
title: '账号',
align: 'center',
dataIndex: 'userUsername',
key: 'userInfoId',
// render: (text) => <a>{text}</a>,
},
{
title: '昵称',
align: 'center',
dataIndex: 'userInfoName',
key: 'userInfoId',
// render: (text) => <a>{text}</a>,
},
{
title: '最近登录时间',
align: 'center',
dataIndex: 'lastLoginTime',
key: 'userInfoId',
// render: (text) => <a>{text}</a>,
},
]
2024-07-31 16:00:30 +08:00
const dispath = useDispatch()
2024-08-12 14:43:58 +08:00
// 更新所属者表格储存至redux
const upBelongArray = () => {
2024-07-31 16:00:30 +08:00
get({
messageApi,
url: `/api/proj-owner/list/self`,
onBefore() {
},
onSuccess(data: any) {
// console.log('所属者表格', data.data);
// setBelongPeopleArray(data.data)
// 存redux的belongArray
dispath({
type: 'uparray',
val: data.data
})
},
onFinally() {
}
})
}
2024-03-26 21:09:41 +08:00
const globalContext = useContext(GlobalContext);
const globalDispatchContext = useContext(GlobalDispatchContext);
const [messageApi, contextHolder] = message.useMessage();
const [modal, modalHolder] = Modal.useModal();
const [loading, setLoading] = useState<boolean>(false);
const [isSelfModalOpen, setIsSelfModalOpen] = useState(false);
2024-03-27 11:04:38 +08:00
const [isPasswordModalOpen, setIsPasswordModalOpen] = useState(false);
2024-04-07 17:37:09 +08:00
const [isInvoiceModalOpen, setIsInvoiceModalOpen] = useState(false);
2024-08-12 14:43:58 +08:00
// 我的订单弹窗
const [myorderModal, setMyorderModal] = useState(false)
2024-06-19 11:08:39 +08:00
// 所属者弹窗
2024-07-05 13:38:59 +08:00
const [belongModal, setBelongModal] = useState(false)
2024-06-19 11:08:39 +08:00
const [belongPeopleInfo, setBelongPeopleInfo] = useState({
authorName: '',
authorType: '',
authorIdCardType: '',
authorIdCard: '',
2024-07-05 13:38:59 +08:00
authorCrcAccount: '',
authorId: '',
authorProvinceCity: ''
2024-06-19 11:08:39 +08:00
})
2024-07-29 17:22:42 +08:00
2024-06-19 11:08:39 +08:00
const setValue = () => {
// console.log(value);
2024-07-15 16:58:47 +08:00
}
2024-07-29 17:22:42 +08:00
const setConcatValue = () => {
2024-06-19 11:08:39 +08:00
}
2024-06-21 16:18:01 +08:00
// 联系人弹窗
2024-07-05 13:38:59 +08:00
const [contactModal, setContactModal] = useState(false)
2025-03-02 18:07:03 +08:00
// 套餐包弹窗
const [packageModal, setPackageModal] = useState(false)
2024-07-29 17:22:42 +08:00
const [concatPeopleInfo, setConcatPeopleInfo] = useState({
applyConcatId: '',
applyContactCsaNo: '',
applyContactEmail: '',
applyContactName: '',
applyContactPhone: '',
applyContactCompany: ''
2024-07-15 16:58:47 +08:00
})
2025-03-02 18:07:03 +08:00
const packColumns: TableColumnsType<DataType> = [
{
title: '序号',
dataIndex: 'index',
key: 'packageOrderId',
align: 'center',
render: (_text, _record, index) => (page - 1) * 10 + index + 1, // 显示序号从1开始
},
{
title: '套餐名称',
dataIndex: 'packageName',
key: 'packageOrderId',
// 居中显示
align: 'center',
},
// packageType
{
title: '套餐类型',
dataIndex: 'packageType',
key: 'packageOrderId',
// 居中显示
align: 'center',
render: (text) => {
return <div>{text=="ALL"?'全托管':'写材料'} </div>
}
},
{
title: '价格',
dataIndex: 'packageTotalMoney',
key: 'packageOrderId',
// 居中显示
align: 'center',
render: (text) => {
return <div>{text/100}</div>
}
},
{
title: '当前剩余次数',
dataIndex: 'packageTotalSurplusCount',
align: 'center',
key: 'packageOrderId',
render: (text: number) => {
return <div>{text} </div>
}
},
{
title: '下单时间',
align: 'center',
dataIndex: 'gmtCreate',
key: 'packageOrderId',
// render: (text: string) => {
// return <div title={text} style={{ width: 200, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{text}</div>
// }
},
];
2024-08-30 15:53:34 +08:00
// 优惠券弹窗
2024-09-02 16:41:02 +08:00
// const [couponModal, setCouponModal] = useState(false)
2024-07-31 16:00:30 +08:00
// const [belongArray,setBelongArray] = useState([])
// // 获取初始所属者数组
// const getLength = () => {
// get({
// messageApi,
// url: `/api/proj-owner/list/self`,
// onBefore() {
// },
// onSuccess(data: any) {
// // console.log('所属者表格', data.data);
// // setBelongPeopleArray(data.data)
// setBelongArray(data.data )
// },
// onFinally() {
// }
// })
// }
// // 获取更新的所属者数组并且做对比查看是否刷新网页
// const getNewLength = () => {
// get({
// messageApi,
// url: `/api/proj-owner/list/self`,
// onBefore() {
// },
// onSuccess(data: any) {
// // console.log('所属者表格', data.data);
// // setBelongPeopleArray(data.data)
// console.log('查看结果',data.data != belongArray);
2024-08-12 14:43:58 +08:00
2024-07-31 16:00:30 +08:00
// // if (data.data == belongArray) {
// // window.location.reload();
// // }
// },
// onFinally() {
2024-07-29 19:48:37 +08:00
2024-07-31 16:00:30 +08:00
// }
// })
// }
2024-08-12 14:43:58 +08:00
2025-01-19 10:19:11 +08:00
2024-12-16 11:38:40 +08:00
2024-03-26 21:09:41 +08:00
useEffect(() => {
2024-07-31 16:00:30 +08:00
// getLength()
2024-04-02 18:45:46 +08:00
reloadUser(messageApi, globalDispatchContext).then((data) => {
if (!data.hasUserInfo) {
setIsSelfModalOpen(true);
2024-03-26 21:09:41 +08:00
}
2024-04-02 18:45:46 +08:00
});
2024-03-26 21:09:41 +08:00
}, [globalContext.user]);
2024-12-16 11:38:40 +08:00
// 刷新用户信息
const reloadUserInterval = async () => {
await reloadUser(messageApi, globalDispatchContext);
};
2024-08-14 16:22:29 +08:00
useEffect(() => {
2024-08-13 18:06:34 +08:00
getUnRead()
2024-12-16 11:38:40 +08:00
setInterval(reloadUserInterval, 5 * 60 * 1000);
2024-08-14 16:22:29 +08:00
}, [])
2024-12-16 11:38:40 +08:00
2024-03-16 23:12:49 +08:00
const items: MenuProps['items'] = [
{
key: 'userinfo',
label: (
<div className="dropdown-item">
2024-04-29 17:22:26 +08:00
<UserOutlined />
2024-03-16 23:12:49 +08:00
<span className="title"></span>
</div>
),
2024-03-26 21:09:41 +08:00
onClick: () => {
setIsSelfModalOpen(true);
}
2024-03-16 23:12:49 +08:00
},
{
key: 'changePass',
label: (
<div className="dropdown-item">
2024-04-29 17:22:26 +08:00
<KeyOutlined />
2024-03-16 23:12:49 +08:00
<span className="title"></span>
</div>
),
2024-03-27 11:04:38 +08:00
onClick: () => {
setIsPasswordModalOpen(true);
}
2024-03-16 23:12:49 +08:00
},
2024-04-02 18:45:46 +08:00
{
key: 'invoice',
label: (
<div className="dropdown-item">
<AccountBookOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
2024-04-07 17:37:09 +08:00
setIsInvoiceModalOpen(true);
2024-04-02 18:45:46 +08:00
}
},
2024-08-12 14:43:58 +08:00
{
key: 'myorder',
label: (
<div className="dropdown-item">
{/* <UsergroupAddOutlined /> */}
<ContainerOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setMyorderModal(true)
}
},
2024-03-16 23:12:49 +08:00
{
2024-06-20 09:14:36 +08:00
key: 'belong',
2024-03-16 23:12:49 +08:00
label: (
<div className="dropdown-item">
2024-07-05 13:38:59 +08:00
<MenuFoldOutlined />
2024-06-20 09:14:36 +08:00
<span className="title"></span>
2024-03-16 23:12:49 +08:00
</div>
),
2024-04-12 14:12:38 +08:00
onClick: () => {
2024-06-20 09:14:36 +08:00
setBelongModal(true)
2024-04-12 14:12:38 +08:00
}
2024-03-16 23:12:49 +08:00
},
2024-06-21 16:18:01 +08:00
{
key: 'contact',
label: (
<div className="dropdown-item">
2024-07-05 13:38:59 +08:00
<UsergroupAddOutlined />
2024-06-21 16:18:01 +08:00
<span className="title"></span>
</div>
),
onClick: () => {
setContactModal(true)
}
},
2024-08-30 15:53:34 +08:00
{
key: 'coupon',
label: (
<div className="dropdown-item">
2024-09-02 16:41:02 +08:00
<GiftOutlined />
2024-08-30 15:53:34 +08:00
<span className="title"></span>
</div>
),
onClick: () => {
2024-09-02 16:41:02 +08:00
// setCouponModal(true)
dispath({
type: 'changeCouponModal',
val: true
})
2024-08-30 15:53:34 +08:00
}
},
2025-03-02 18:07:03 +08:00
{
key: 'package',
label: (
<div className="dropdown-item">
<TableOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
// setCouponModal(true)
setPackageModal(true)
setPackPage(1);
}
},
2024-08-12 14:43:58 +08:00
2024-06-19 11:08:39 +08:00
{
2024-06-20 09:14:36 +08:00
key: 'logout',
2024-06-19 11:08:39 +08:00
label: (
<div className="dropdown-item">
2024-06-20 09:14:36 +08:00
<LogoutOutlined />
<span className="title">退</span>
2024-06-19 11:08:39 +08:00
</div>
),
onClick: () => {
2024-06-20 09:14:36 +08:00
reMenuActive()
window.location.href = '/copyright/logout'
2024-06-19 11:08:39 +08:00
}
},
2024-09-02 16:41:02 +08:00
2024-07-05 13:38:59 +08:00
2024-03-16 23:12:49 +08:00
]
2024-03-11 19:13:42 +08:00
return (
2024-03-26 21:09:41 +08:00
<>
<div className="head">
<div className="center">
<div className="left">
2024-04-29 17:22:26 +08:00
{/* <span className="sys-title">AI</span>
2024-03-26 21:09:41 +08:00
<Divider type="vertical"/>
2024-04-29 17:22:26 +08:00
<span className="sys-title-sub"></span> */}
<img src={logoImg} alt="" />
2024-03-26 21:09:41 +08:00
</div>
2024-04-29 17:22:26 +08:00
{/* <div className="right" style={{backgroundImage: `url(${headRightBg})`}}> */}
2024-07-05 13:38:59 +08:00
2024-04-29 17:22:26 +08:00
<div className="right">
2025-01-19 10:19:11 +08:00
<div className='kf' onClick={() => {
setkfModal(true)
}}>
<div className='kfIcon'>
<img src={kf} width={20} alt="" />
</div>
<div className='kfText'>
线
</div>
2024-08-12 17:15:23 +08:00
2025-01-19 10:19:11 +08:00
</div>
<div className='headLine'></div>
2024-08-12 17:15:23 +08:00
{/* <div className='head-nav' onClick={() => {
window.open('https://www.aimzhu.com/operator/route/agreementportal/view?agreementId=c0c5683a-bef3-40c3-8395-900a362ea234&title=系统操作流程')
}}>
<QuestionCircleOutlined />
</div> */}
{/* <div className='headLine'></div> */}
<BalanceHead />
{/* <div className='headLine'></div> */}
<RechargeHead />
<div className='headLine'></div>
2024-08-12 14:43:58 +08:00
<div className='invitationButton' onClick={() => {
setinvitationModal(true)
getIc()
}}>
</div>
2024-08-12 17:15:23 +08:00
<div className='headLine'></div>
<div className='head-nav' title='系统操作流程' onClick={() => {
2024-09-11 09:22:39 +08:00
// window.open('https://www.aimzhu.com/operator/route/agreementportal/view?agreementId=c0c5683a-bef3-40c3-8395-900a362ea234&title=系统操作流程')
getUseUrl()
2024-08-15 17:57:24 +08:00
2024-07-05 13:38:59 +08:00
}}>
2024-08-12 17:15:23 +08:00
<QuestionCircleOutlined />
2024-07-05 13:38:59 +08:00
</div>
2024-08-12 17:15:23 +08:00
<div className='headLine'></div>
2024-08-14 16:22:29 +08:00
<div className='head-notice' onClick={() => {
2024-08-13 18:06:34 +08:00
setNoticeModal(true)
}}>
<BellOutlined />
2024-08-14 16:22:29 +08:00
<div className='noticeNum' style={{ display: unRead == 0 ? 'none' : 'block' }}>{unRead}</div>
2024-08-13 18:06:34 +08:00
</div>
<div className='headLine'></div>
2024-03-26 21:09:41 +08:00
{/*<MessageHead/>*/}
2024-08-12 17:15:23 +08:00
<div style={{ display: 'flex', alignContent: 'center', padding: '0', cursor: 'pointer' }}>
<div style={{ width: '50px', height: '50px', borderRadius: '25px', marginLeft: '', marginRight: '10px' }} >
2024-07-05 13:38:59 +08:00
<img src={userImg} alt="" width={50} height={50} />
2024-05-23 14:57:22 +08:00
</div>
2024-03-26 21:09:41 +08:00
<Dropdown menu={{
items: items
}}>
<Space>
2024-04-29 17:22:26 +08:00
{/* 您好:{globalContext.user.nickname} */}
<DownOutlined />
2024-03-26 21:09:41 +08:00
</Space>
</Dropdown>
</div>
2024-03-16 23:12:49 +08:00
</div>
2024-03-11 19:13:42 +08:00
</div>
</div>
2024-03-26 21:09:41 +08:00
<Modal open={isSelfModalOpen}
2025-03-02 18:07:03 +08:00
centered
2024-07-29 17:22:42 +08:00
destroyOnClose={true}
2024-04-29 17:22:26 +08:00
title="个人信息"
footer={false}
onCancel={() => {
2024-07-29 19:48:37 +08:00
if (!globalContext.user.hasUserInfo) {
2024-04-29 17:22:26 +08:00
messageApi.info('请完善个人信息');
return;
}
setIsSelfModalOpen(false)
2024-07-29 17:22:42 +08:00
// console.log('用户信息',globalContext.user.hasUserInfo);
2024-07-29 19:48:37 +08:00
2024-04-29 17:22:26 +08:00
}}>
2024-03-26 21:09:41 +08:00
<UserEdit handleConfirm={(data) => {
modal.confirm({
2024-03-27 11:04:38 +08:00
title: '提示',
2024-03-26 21:09:41 +08:00
content: '确定保存吗?',
okText: '确认',
cancelText: '取消',
okButtonProps: {
style: {
backgroundColor: 'var(--color-primary)'
}
},
onOk: () => {
setIsSelfModalOpen(false);
put({
messageApi,
url: '/api/user-info/update-self',
body: data,
onBefore() {
setLoading(true);
},
onSuccess() {
messageApi.success('修改成功');
},
onFinally() {
setLoading(false);
}
})
2024-03-27 11:04:38 +08:00
}
});
2024-04-29 17:22:26 +08:00
}} />
2024-03-27 11:04:38 +08:00
</Modal>
<Modal open={isPasswordModalOpen}
2025-03-02 18:07:03 +08:00
centered
2024-04-29 17:22:26 +08:00
title="修改密码"
footer={false}
onCancel={() => {
setIsPasswordModalOpen(false)
}}>
2024-03-27 11:04:38 +08:00
<PasswordChange handleConfirm={(data) => {
modal.confirm({
title: '提示',
content: '确定修改吗?',
okText: '确认',
cancelText: '取消',
okButtonProps: {
style: {
backgroundColor: 'var(--color-primary)'
}
},
onOk: () => {
put({
messageApi,
url: '/api/user/update-password',
body: data,
onBefore() {
setLoading(true);
},
onSuccess() {
setIsPasswordModalOpen(false);
messageApi.success('修改成功,重新登录生效');
},
onFinally() {
setLoading(false);
}
})
2024-03-26 21:09:41 +08:00
}
});
2024-04-29 17:22:26 +08:00
}} />
2024-03-26 21:09:41 +08:00
</Modal>
2024-04-07 17:37:09 +08:00
<Modal open={isInvoiceModalOpen}
2025-03-02 18:07:03 +08:00
centered
2024-04-29 17:22:26 +08:00
title="发票管理"
width={1100}
footer={false}
onCancel={() => setIsInvoiceModalOpen(false)}
2024-04-01 20:39:22 +08:00
>
2024-04-29 17:22:26 +08:00
<InvoiceList />
2024-04-01 20:39:22 +08:00
</Modal>
2024-06-20 09:14:36 +08:00
<Modal title="知识产权所属者"
2024-06-19 11:08:39 +08:00
destroyOnClose
2025-03-02 18:07:03 +08:00
centered
2024-06-19 11:08:39 +08:00
open={belongModal}
width={1200}
footer={null}
onCancel={() => {
2024-07-31 16:00:30 +08:00
upBelongArray()
// getNewLength()
2024-06-19 11:08:39 +08:00
setBelongModal(false)
}}>
2024-07-05 13:38:59 +08:00
<BelongPeople closeModal={() => { setBelongModal(false) }} setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={false} ></BelongPeople>
2024-06-21 16:18:01 +08:00
</Modal>
<Modal title="知识产权联系人"
destroyOnClose
2025-03-02 18:07:03 +08:00
centered
2024-06-21 16:18:01 +08:00
open={contactModal}
width={1200}
footer={null}
onCancel={() => {
setContactModal(false)
}}>
2024-07-29 17:22:42 +08:00
<ContactPeople isShow={false} closeModal={() => { setContactModal(false) }} setConcatPeopleInfo={setConcatPeopleInfo} concatPeopleInfo={concatPeopleInfo} setConcatValue={setConcatValue}></ContactPeople>
2024-06-19 11:08:39 +08:00
</Modal>
2025-03-02 18:07:03 +08:00
<Modal title="套餐包"
destroyOnClose
centered
open={packageModal}
width={1000}
footer={null}
onCancel={() => {
setPackageModal(false)
}}>
<Table
columns={packColumns}
dataSource={packList}
pagination={{
defaultPageSize: 10, // 设置默认一页显示 5 条数据,
current: packPage,
total: packTotal,
onChange: (page: number) => {
setPackPage(page);
// getPickList(page)
// console.log(page);
}
}}
rowKey="packageOrderId"
/>
</Modal>
2024-08-12 14:43:58 +08:00
<Modal title="邀请码"
destroyOnClose
2025-02-26 16:57:47 +08:00
centered
2024-08-12 14:43:58 +08:00
open={invitationModal}
width={578}
footer={null}
onCancel={() => {
// getNewLength()
setinvitationModal(false)
2025-02-26 16:57:47 +08:00
// setInvNum('')
2024-08-16 10:27:29 +08:00
setInInvNum('')
2024-08-12 14:43:58 +08:00
}}>
2024-08-12 17:15:23 +08:00
<Spin tip="加载中..." spinning={isLoading}>
<div className='invitation-box'>
2025-02-26 16:57:47 +08:00
{/* <div className='invBox-top'>
2024-08-12 17:15:23 +08:00
<div className='invBox-title'>
2024-08-12 14:43:58 +08:00
</div>
2024-08-12 17:15:23 +08:00
<div className='invBox-line'></div>
<div className='invBox-btn' onClick={() => {
getInvNum()
}} style={{ display: invNum || icStatus ? 'none' : 'block' }}>
</div>
<div className='invBox-btnTwo' style={{ display: icStatus == 'PENDING' ? 'block' : 'none' }}>
</div>
<div className='invBox-btnthree' style={{ display: icStatus == 'REJECTED' ? 'block' : 'none' }}>
<div className='errorBox'>
<div className='errorBox-title'> !</div>
<div className='errorBox-btn' onClick={() => {
getInvNum()
}}></div>
2024-08-12 14:43:58 +08:00
</div>
2024-08-12 17:15:23 +08:00
</div>
<div className='invBox-Num' style={{ display: invNum ? 'block' : 'none' }}>
<div className='invNum-box'>
<div className='invNum'>
{invNum}
</div>
<div className='copyBtn' onClick={() => {
copyInvNum()
}}>
</div>
2024-08-12 14:43:58 +08:00
</div>
</div>
2025-02-26 16:57:47 +08:00
</div> */}
<div className='invBox-top'>
<div className='invBox-titleTop'
>
<span
onClick={() => {
getMyIcList()
setMyInvModal(true)
}}
style={{
cursor: 'pointer'
}}></span>
</div>
<div className='invBox-lineTop'></div>
<div className='createInv'>
<span
onClick={() => {
// setCreateInvModal(true)
getIcLimit()
}}
style={{
cursor: 'pointer'
}}></span>
</div>
2024-08-12 14:43:58 +08:00
</div>
2025-02-26 16:57:47 +08:00
2024-08-12 17:15:23 +08:00
{/* <div style={{ display: icRebateRatio ? 'block' : 'none' }}> */}
<div className='invBox-bot'>
<div className='invBox-tips' >
2024-08-14 16:22:29 +08:00
{/* {icRebateRatio ? `邀请码分享给他人,即可获得${icRebateRatio}%佣金` : '邀请码分享给他人,即可获得佣金'} */}
{icRebateRatio ?
(<div>
<div> {icRebateRatio}%</div>
2025-03-03 10:38:30 +08:00
{/* <div style={{ paddingBottom: 20 }}>全托管佣金:{icPriceAll}元,写材料佣金:{icPriceMaterial}元</div> */}
2024-08-14 16:22:29 +08:00
</div>
)
: (<></>)}
{/* */}
2024-08-12 14:43:58 +08:00
2024-08-12 17:15:23 +08:00
</div>
{/* <div className='invBox-tips'>
2024-08-12 14:43:58 +08:00
XXXXXX导致,
</div> */}
</div>
2024-08-12 17:15:23 +08:00
{/* </div> */}
</div>
<div className='invitation-box'>
<div className='invBox-top'>
2025-03-03 10:38:30 +08:00
<div className='invBox-title' style={{ fontSize: '24px',
width: bindingInvNum?264:362,
}}>
2024-08-12 17:15:23 +08:00
2024-08-12 14:43:58 +08:00
</div>
2024-08-12 17:15:23 +08:00
<div className='invBox-line'></div>
<div className='invBox-input' style={{ display: bindingInvNum ? 'none' : 'block' }}>
<div className='invInput'>
<Input value={inInvNum} style={{ width: 261, height: 60, borderRadius: 25, fontSize: 24, textAlign: 'center' }} onChange={(e) => {
setInInvNum(e.target.value)
}} />
<div className='invImg' onClick={() => {
postInvNum()
}}>
<img src={inv} alt="" style={{ width: 31, height: 30 }} />
2024-08-12 14:43:58 +08:00
</div>
2024-08-12 17:15:23 +08:00
</div>
</div>
2025-03-03 10:38:30 +08:00
<div className='invBox-inputl' style={{ display: bindingInvNum ? 'block' : 'none' }}>
<div className='invInputl'>
2024-08-12 17:15:23 +08:00
<div className='invNum-box'>
<div className='invNum' >
{bindingInvNum}
</div>
{/* <div className='relieveBtn' onClick={() => {
2024-08-12 14:43:58 +08:00
setRelieveModal(true)
}}>
</div> */}
2024-08-12 17:15:23 +08:00
</div>
2024-08-12 14:43:58 +08:00
</div>
</div>
</div>
2024-08-12 17:15:23 +08:00
<div className='invBox-bot'>
<div className='invBox-tips' >
{bindingInvNum ? '已绑定邀请码' : '输入他人的邀请码,即可获得相应优惠'}
</div>
2024-08-12 14:43:58 +08:00
2024-08-12 17:15:23 +08:00
</div>
2024-08-12 14:43:58 +08:00
</div>
2024-08-12 17:15:23 +08:00
</Spin>
2024-08-12 14:43:58 +08:00
</Modal>
{/* <Modal title=""
okText="确认"
cancelText="取消"
destroyOnClose
open={relieveModal}
onOk={() => {
setBindingInvNum('')
setInInvNum('')
setRelieveModal(false)
}}
onCancel={() => {
setRelieveModal(false)
}}>
<div>
?
</div>
</Modal> */}
<Modal title="我的订单"
footer={null}
2025-02-26 16:57:47 +08:00
centered
2024-08-12 14:43:58 +08:00
// okText="确认"
// cancelText="取消"
destroyOnClose
open={myorderModal}
// onOk={() => {
// setBindingInvNum('')
// setInInvNum('')
// setRelieveModal(false)
// }}
width={1500}
onCancel={() => {
setMyorderModal(false)
}}>
<MyOrder></MyOrder>
</Modal>
2024-08-13 18:06:34 +08:00
<Modal title="消息通知"
footer={null}
2025-02-26 16:57:47 +08:00
centered
2024-08-13 18:06:34 +08:00
destroyOnClose
open={noticeModal}
width={1200}
onCancel={() => {
setNoticeModal(false)
getUnRead()
// setUnRead(0)
}}>
<NoticeModal></NoticeModal>
</Modal>
2025-01-19 10:19:11 +08:00
<Modal title="在线客服"
footer={null}
destroyOnClose
open={kfModal}
centered
width={450}
onCancel={() => {
setkfModal(false)
}}>
<div className='kfBox'>
<div className='kfTitle'></div>
<div className='kfImg'>
<img src={kfImg} width={300} alt="" />
</div>
<div className='kfHttp' >
<span></span><span className='kfHttpText' onClick={
2025-02-26 16:57:47 +08:00
() => {
window.open('https://work.weixin.qq.com/kfid/kfc599f9d40b65ac392')
}
}></span>
2025-01-19 10:19:11 +08:00
</div>
</div>
</Modal>
2024-09-02 16:41:02 +08:00
{/* <Modal title=""
2024-08-30 15:53:34 +08:00
footer={null}
destroyOnClose
open={couponModal}
width={809}
onCancel={() => {
2024-09-02 16:41:02 +08:00
// setCouponModal(false)
2024-08-30 15:53:34 +08:00
// setUnRead(0)
}}>
2024-09-02 16:41:02 +08:00
<HeadCouponModal closeModal={() => {
// setCouponModal(false)
}}></HeadCouponModal>
</Modal> */}
2025-02-26 16:57:47 +08:00
<Modal title="我的邀请码"
// footer={null}
centered
destroyOnClose
open={myInvModal}
footer={null}
width={1000}
onCancel={() => {
setMyInvModal(false)
2024-09-02 16:41:02 +08:00
2025-02-26 16:57:47 +08:00
}}>
<Spin tip="加载中..." spinning={icListLoading}>
<div>
<Table columns={columns} dataSource={myIcList}
pagination={false}
bordered
key="usericId"
rowKey="usericId"
locale={{
emptyText: () => {
return (
<div style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: 300,
}}>
<Empty description="暂无邀请码" />
</div>
)
},
}}
/>
</div>
</Spin>
</Modal>
<Modal title="创建邀请码"
// footer={null}
centered
destroyOnClose
open={createInvModal}
footer={null}
width={400}
onCancel={() => {
setCreateInvModal(false)
}}>
<div style={{
paddingTop: 20,
}}>
<Spin tip="加载中..." spinning={icListLoading}>
<Form
name="basic"
// labelCol={{ span: 8 }}
// wrapperCol={{ span: 16 }}
// style={{ maxWidth: 600 }}
initialValues={{ remember: true }}
onFinish={onFinish}
// onFinishFailed={onFinishFailed}
autoComplete="off"
> <div style={{
display: 'flex',
// alignItems:'center',
justifyContent: "center"
}}>
<div style={{ fontSize: 16, height: 40, lineHeight: "40px", marginRight: 5, textWrap: "nowrap" }}> <span style={{ color: 'red' }}>*</span> </div>
<Form.Item<FieldType>
// label={
// <div style={{ fontSize: 16 }}>全托管价格</div>
// }
name="icPriceAll"
rules={[
{ required: true, message: '请输入写全托管价格' },
{
validator: (_, value) => {
if (value && Number(value) < minAllPrice) {
return Promise.reject(new Error(`全托管价格不能小于${minAllPrice}`));
}
return Promise.resolve();
},
},
]}
>
<InputNumber
size="large"
// min={minAllPrice}
style={{ width: 250 }}
placeholder={`全托管价格不能小于${minAllPrice}`}
/>
</Form.Item>
</div>
<div style={{
display: 'flex',
// alignItems:'center',
justifyContent: "center"
}}>
<div style={{ fontSize: 16, height: 40, lineHeight: "40px", marginRight: 5, textWrap: "nowrap" }}> <span style={{ color: 'red' }}>*</span> </div>
<Form.Item<FieldType>
// label={
// <div style={{ fontSize: 16 }}>写材料价格</div>
// }
name="icPriceMaterial"
rules={[
{ required: true, message: '请输入写材料价格' },
{
validator: (_, value) => {
if (value && Number(value) < minMaterialPrice) {
return Promise.reject(new Error(`写材料价格不能小于${minMaterialPrice}`));
}
return Promise.resolve();
},
},
]}
>
<InputNumber
// min={minMaterialPrice}
size="large"
placeholder={`写材料价格不能小于${minMaterialPrice}`}
style={{ width: 250 }} />
</Form.Item>
</div>
<Form.Item label={null}>
<div style={{
// background:'pink',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
marginTop: 20,
}}>
<Button type="primary" htmlType="submit" block size={'large'} >
</Button>
</div>
</Form.Item>
</Form>
</Spin>
</div>
</Modal>
<Modal title={`邀请码${selectIc}使用用户`}
// footer={null}
centered
destroyOnClose
open={icModal}
footer={null}
width={1000}
onCancel={() => {
setIcModal(false)
}}>
<Spin tip="加载中..." spinning={icListLoading}>
<Table columns={icColumns} dataSource={icList}
pagination={
{
pageSize: 10,
total: total,
onChange: (currentPage) => {
setPage(currentPage);
getIcUserInfo(selectIc, currentPage)
},
showSizeChanger: false,
current: page
}
}
bordered
key="userInfoId"
rowKey="userInfoId"
locale={{
emptyText: () => {
return (
<div style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: 300,
}}>
<Empty description="暂无使用用户" />
</div>
)
},
}}
/>
</Spin>
</Modal>
2024-04-29 17:22:26 +08:00
<Spin tip="正在提交..." spinning={loading} fullscreen />
2024-03-26 21:09:41 +08:00
{contextHolder}
{modalHolder}
</>
2024-03-11 19:13:42 +08:00
)
}