system-copyright-react/src/layout/head/Head.tsx
2024-12-16 11:38:40 +08:00

796 lines
29 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import './head.css'
// import { NodeJS } from 'types/node';
import { useDispatch } from 'react-redux'
import BalanceHead from '../../components/balance/BalanceHead.tsx';
import RechargeHead from '../../components/recharge/RechargeHead.tsx';
import { Dropdown, MenuProps, message, Modal, Space, Spin, Input } from "antd";
import { DownOutlined, UserOutlined, QuestionCircleOutlined, BellOutlined, KeyOutlined, LogoutOutlined, GiftOutlined, AccountBookOutlined, ContainerOutlined, MenuFoldOutlined, UsergroupAddOutlined } from "@ant-design/icons";
import { useContext, useEffect, useState } from "react";
import { put, get, post, getUseUrl } from "../../util/AjaxUtils.ts";
import { GlobalContext, GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
import UserEdit from "../../components/user/UserEdit.tsx";
import PasswordChange from "../../components/password/PasswordChange.tsx";
// import headRightBg from '../../assets/head-right-bg.png';
import InvoiceList from "../../components/invoice/InvoiceList.tsx";
import logoImg from '../../static/head/logo.png'
import userImg from '../../static/homeimg/userimg.png'
import { reMenuActive } from '../../util/cache';
// import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx'
import inv from '../../static/inv.png'
import MyOrder from '../../components/myOrder/MyOrder.tsx'
import NoticeModal from '../../components/NoticeModal/NoticeModal.tsx';
// import HeadCouponModal from '../../components/CouponModal/HeadCouponModal.tsx'
export default function Head() {
// const redxuState: any = useSelector(state => state)
// const couponModal = redxuState.couponModal
// 消息通知弹窗
const [noticeModal, setNoticeModal] = useState(false)
// 未读消息数
const [unRead, setUnRead] = useState(0)
// 获取未读消息总数
const getUnRead = () => {
get<any>({
messageApi,
url: '/api/user-msg/count-un-read/self',
onSuccess({ data }) {
// console.log(data);
setUnRead(data.data)
}
})
}
// 邀请码弹窗
const [invitationModal, setinvitationModal] = useState(false)
// 邀请码弹窗加载
const [isLoading, setisLoading] = useState(false)
// 解除绑定邀请码弹窗
// const [relieveModal, setRelieveModal] = useState(false)
// 申请的邀请码
const [invNum, setInvNum] = useState('')
// 输入的邀请码
const [inInvNum, setInInvNum] = useState('')
// 已绑定的邀请码
const [bindingInvNum, setBindingInvNum] = useState('')
// 邀请码申请状态
const [icStatus, setIcStatus] = useState('')
// 邀请码返利比例
const [icRebateRatio, seticRebateRatio] = useState('')
// 全托管分账
const [icPriceAll, seticPriceAll] = useState(0)
// 写材料分账
const [icPriceMaterial, seticPriceMaterial] = useState(0)
// 获取邀请码申请状态
const getIcStatus = () => {
get<any>({
messageApi,
url: '/api/ic/apply/get/self',
onSuccess({ data }) {
// console.log(data);
if (data) {
setIcStatus(data.applyStatus)
}
}
})
}
// 获取邀请码信息
const getIc = () => {
get<any>({
messageApi,
url: '/api/ic/get/self',
onBefore() {
setisLoading(true)
},
onSuccess({ data }) {
// console.log(data);
setInvNum(data.ic)
setBindingInvNum(data.relationIc)
seticRebateRatio(data.icRebateRatio)
seticPriceAll(Number(data.icPriceAll) / 100 * Number(data.icRebateRatio) / 100)
seticPriceMaterial(Number(data.icPriceMaterial) / 100 * Number(data.icRebateRatio) / 100)
if (data.ic == '') {
getIcStatus()
}
},
onFinally() {
setisLoading(false)
}
})
}
// 绑定邀请码
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()
}
}
// 点击获取邀请码
const getInvNum = () => {
post<any>({
messageApi,
url: `/api/ic/apply/apply`,
onBefore() {
},
onSuccess() {
messageApi.success('已申请')
getIcStatus()
},
onFinally() {
}
})
// setInvNum('RSDNQ5H7')
}
// 复制邀请码
const copyInvNum = () => {
// navigator.clipboard.writeText(invNum)
// messageApi.open({
// type: 'success',
// content: '已复制到剪切板'
// })
// 创建一个临时的 input 元素
const tempInput = document.createElement('input');
document.body.appendChild(tempInput);
tempInput.value = invNum;
// 选中 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);
}
const dispath = useDispatch()
// 更新所属者表格储存至redux
const upBelongArray = () => {
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() {
}
})
}
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);
const [isPasswordModalOpen, setIsPasswordModalOpen] = useState(false);
const [isInvoiceModalOpen, setIsInvoiceModalOpen] = useState(false);
// 我的订单弹窗
const [myorderModal, setMyorderModal] = useState(false)
// 所属者弹窗
const [belongModal, setBelongModal] = useState(false)
const [belongPeopleInfo, setBelongPeopleInfo] = useState({
authorName: '',
authorType: '',
authorIdCardType: '',
authorIdCard: '',
authorCrcAccount: '',
authorId: '',
authorProvinceCity: ''
})
const setValue = () => {
// console.log(value);
}
const setConcatValue = () => {
}
// 联系人弹窗
const [contactModal, setContactModal] = useState(false)
const [concatPeopleInfo, setConcatPeopleInfo] = useState({
applyConcatId: '',
applyContactCsaNo: '',
applyContactEmail: '',
applyContactName: '',
applyContactPhone: '',
applyContactCompany: ''
})
// 优惠券弹窗
// const [couponModal, setCouponModal] = useState(false)
// 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);
// // if (data.data == belongArray) {
// // window.location.reload();
// // }
// },
// onFinally() {
// }
// })
// }
useEffect(() => {
// getLength()
reloadUser(messageApi, globalDispatchContext).then((data) => {
if (!data.hasUserInfo) {
setIsSelfModalOpen(true);
}
});
}, [globalContext.user]);
// 刷新用户信息
const reloadUserInterval = async () => {
await reloadUser(messageApi, globalDispatchContext);
};
useEffect(() => {
getUnRead()
setInterval(reloadUserInterval, 5 * 60 * 1000);
}, [])
const items: MenuProps['items'] = [
{
key: 'userinfo',
label: (
<div className="dropdown-item">
<UserOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setIsSelfModalOpen(true);
}
},
{
key: 'changePass',
label: (
<div className="dropdown-item">
<KeyOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setIsPasswordModalOpen(true);
}
},
{
key: 'invoice',
label: (
<div className="dropdown-item">
<AccountBookOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setIsInvoiceModalOpen(true);
}
},
{
key: 'myorder',
label: (
<div className="dropdown-item">
{/* <UsergroupAddOutlined /> */}
<ContainerOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setMyorderModal(true)
}
},
{
key: 'belong',
label: (
<div className="dropdown-item">
<MenuFoldOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setBelongModal(true)
}
},
{
key: 'contact',
label: (
<div className="dropdown-item">
<UsergroupAddOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setContactModal(true)
}
},
{
key: 'coupon',
label: (
<div className="dropdown-item">
<GiftOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
// setCouponModal(true)
dispath({
type: 'changeCouponModal',
val: true
})
}
},
{
key: 'logout',
label: (
<div className="dropdown-item">
<LogoutOutlined />
<span className="title">退</span>
</div>
),
onClick: () => {
reMenuActive()
window.location.href = '/copyright/logout'
}
},
]
return (
<>
<div className="head">
<div className="center">
<div className="left">
{/* <span className="sys-title">AI引擎软著</span>
<Divider type="vertical"/>
<span className="sys-title-sub">软件著作权一站式服务平台</span> */}
<img src={logoImg} alt="" />
</div>
{/* <div className="right" style={{backgroundImage: `url(${headRightBg})`}}> */}
<div className="right">
{/* <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>
<div className='invitationButton' onClick={() => {
setinvitationModal(true)
getIc()
}}>
</div>
<div className='headLine'></div>
<div className='head-nav' title='系统操作流程' onClick={() => {
// window.open('https://www.aimzhu.com/operator/route/agreementportal/view?agreementId=c0c5683a-bef3-40c3-8395-900a362ea234&title=系统操作流程')
getUseUrl()
}}>
<QuestionCircleOutlined />
</div>
<div className='headLine'></div>
<div className='head-notice' onClick={() => {
setNoticeModal(true)
}}>
<BellOutlined />
<div className='noticeNum' style={{ display: unRead == 0 ? 'none' : 'block' }}>{unRead}</div>
</div>
<div className='headLine'></div>
{/*<MessageHead/>*/}
<div style={{ display: 'flex', alignContent: 'center', padding: '0', cursor: 'pointer' }}>
<div style={{ width: '50px', height: '50px', borderRadius: '25px', marginLeft: '', marginRight: '10px' }} >
<img src={userImg} alt="" width={50} height={50} />
</div>
<Dropdown menu={{
items: items
}}>
<Space>
{/* 您好:{globalContext.user.nickname} */}
<DownOutlined />
</Space>
</Dropdown>
</div>
</div>
</div>
</div>
<Modal open={isSelfModalOpen}
destroyOnClose={true}
title="个人信息"
footer={false}
onCancel={() => {
if (!globalContext.user.hasUserInfo) {
messageApi.info('请完善个人信息');
return;
}
setIsSelfModalOpen(false)
// console.log('用户信息',globalContext.user.hasUserInfo);
}}>
<UserEdit handleConfirm={(data) => {
modal.confirm({
title: '提示',
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);
}
})
}
});
}} />
</Modal>
<Modal open={isPasswordModalOpen}
title="修改密码"
footer={false}
onCancel={() => {
setIsPasswordModalOpen(false)
}}>
<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);
}
})
}
});
}} />
</Modal>
<Modal open={isInvoiceModalOpen}
title="发票管理"
width={1100}
footer={false}
onCancel={() => setIsInvoiceModalOpen(false)}
>
<InvoiceList />
</Modal>
<Modal title="知识产权所属者"
destroyOnClose
open={belongModal}
width={1200}
footer={null}
onCancel={() => {
upBelongArray()
// getNewLength()
setBelongModal(false)
}}>
<BelongPeople closeModal={() => { setBelongModal(false) }} setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={false} ></BelongPeople>
</Modal>
<Modal title="知识产权联系人"
destroyOnClose
open={contactModal}
width={1200}
footer={null}
onCancel={() => {
setContactModal(false)
}}>
<ContactPeople isShow={false} closeModal={() => { setContactModal(false) }} setConcatPeopleInfo={setConcatPeopleInfo} concatPeopleInfo={concatPeopleInfo} setConcatValue={setConcatValue}></ContactPeople>
</Modal>
<Modal title="邀请码"
destroyOnClose
open={invitationModal}
width={578}
footer={null}
onCancel={() => {
// getNewLength()
setinvitationModal(false)
setInvNum('')
setInInvNum('')
}}>
<Spin tip="加载中..." spinning={isLoading}>
<div className='invitation-box'>
<div className='invBox-top'>
<div className='invBox-title'>
</div>
<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>
</div>
</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>
</div>
</div>
</div>
{/* <div style={{ display: icRebateRatio ? 'block' : 'none' }}> */}
<div className='invBox-bot'>
<div className='invBox-tips' >
{/* {icRebateRatio ? `邀请码分享给他人,即可获得${icRebateRatio}%佣金` : '邀请码分享给他人,即可获得佣金'} */}
{icRebateRatio ?
(<div>
<div> {icRebateRatio}%</div>
<div style={{ paddingBottom: 20 }}>:{icPriceAll}:{icPriceMaterial}</div>
</div>
)
: (<></>)}
{/* */}
</div>
{/* <div className='invBox-tips'>
失败的原因可能是XXXXXX导致,如有疑问请您咨询客服人员
</div> */}
</div>
{/* </div> */}
</div>
<div className='invitation-box'>
<div className='invBox-top'>
<div className='invBox-title' style={{ fontSize: '24px' }}>
</div>
<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 }} />
</div>
</div>
</div>
<div className='invBox-input' style={{ display: bindingInvNum ? 'block' : 'none' }}>
<div className='invInput'>
<div className='invNum-box'>
<div className='invNum' >
{bindingInvNum}
</div>
{/* <div className='relieveBtn' onClick={() => {
setRelieveModal(true)
}}>
解绑
</div> */}
</div>
</div>
</div>
</div>
<div className='invBox-bot'>
<div className='invBox-tips' >
{bindingInvNum ? '已绑定邀请码' : '输入他人的邀请码,即可获得相应优惠'}
</div>
</div>
</div>
</Spin>
</Modal>
{/* <Modal title="提示"
okText="确认"
cancelText="取消"
destroyOnClose
open={relieveModal}
onOk={() => {
setBindingInvNum('')
setInInvNum('')
setRelieveModal(false)
}}
onCancel={() => {
setRelieveModal(false)
}}>
<div>
确定解绑当前邀请码吗?
</div>
</Modal> */}
<Modal title="我的订单"
footer={null}
// okText="确认"
// cancelText="取消"
destroyOnClose
open={myorderModal}
// onOk={() => {
// setBindingInvNum('')
// setInInvNum('')
// setRelieveModal(false)
// }}
width={1500}
onCancel={() => {
setMyorderModal(false)
}}>
<MyOrder></MyOrder>
</Modal>
<Modal title="消息通知"
footer={null}
destroyOnClose
open={noticeModal}
width={1200}
onCancel={() => {
setNoticeModal(false)
getUnRead()
// setUnRead(0)
}}>
<NoticeModal></NoticeModal>
</Modal>
{/* <Modal title="优惠券"
footer={null}
destroyOnClose
open={couponModal}
width={809}
onCancel={() => {
// setCouponModal(false)
// setUnRead(0)
}}>
<HeadCouponModal closeModal={() => {
// setCouponModal(false)
}}></HeadCouponModal>
</Modal> */}
<Spin tip="正在提交..." spinning={loading} fullscreen />
{contextHolder}
{modalHolder}
</>
)
}