This commit is contained in:
xixi 2024-06-21 16:18:01 +08:00
parent e8e22ffba9
commit 2971536ed1
20 changed files with 1520 additions and 423 deletions

View File

@ -64,6 +64,7 @@ type propsInfo = {
belongPeopleInfo?: any
setValue?: any
isShow?: boolean
closeModal?: any
};
export default function BelongPeople(props: propsInfo) {
// const nav = useNavigate();
@ -71,7 +72,7 @@ export default function BelongPeople(props: propsInfo) {
const [messageApi, contextHolder] = message.useMessage();
const [formInfo] = Form.useForm<FieldType>();
const [formBelong] = Form.useForm<BelongPeopleType>();
const [isLoading, setIsLoading] = useState(false)
const [loading] = useState<boolean>(false);
// const [isEditModalOpen, setIsEditModalOpen] = useState(false);
const [isNewBelongOpen, setIsNewBelongOpen] = useState(false)
@ -81,16 +82,16 @@ export default function BelongPeople(props: propsInfo) {
// 点击查看是否显示账号密码
const [checkCrcAccountShow, setCheckCrcAccountShow] = useState('')
// 页面显示的所属者信息
// const [authorName, setauthorName] = useState('') //所属人姓名
// const [authorIdCardType, setauthorIdCardType] = useState('') //所属人证件类型
// const [authorIdCard, setauthorIdCard] = useState('') //所属人证件号
// const [authorType, setauthorType] = useState('') //所属人类型
// const [authorProvinceCity, setauthorProvinceCity] = useState('') //所属人省市
// const [authorCrcAccount, setauthorCrcAccount] = useState(0) //是否给账号 0 给 1 不给
const [authorName, setauthorName] = useState('') //所属人姓名
const [authorIdCardType, setauthorIdCardType] = useState('') //所属人证件类型
const [authorIdCard, setauthorIdCard] = useState('') //所属人证件号
const [authorType, setauthorType] = useState('') //所属人类型
const [authorProvinceCity, setauthorProvinceCity] = useState('') //所属人省市
const [authorCrcAccount, setauthorCrcAccount] = useState(0) //是否给账号 0 给 1 不给
// const [authorCrcAccountPassword, setauthorCrcAccountPassword] = useState('') //密码
// const [authorCrcAccountUsername, setauthorCrcAccountUsername] = useState('') //账号
// // 从基本信息中获取到的两个表格默认选择的id 所属者id 联系人id
// const [authorId, setAuthorId] = useState('') //所属人id
const [authorId, setAuthorId] = useState('') //所属人id
// 设置所属者more你选中的行
// const [selectedRowKeys, setSelectedRowKeys] = useState<BelongDataType[]>([]);
@ -114,29 +115,29 @@ export default function BelongPeople(props: propsInfo) {
// selectedRowKeys: React.Key[]
onChange: (selectedRowKeys: React.Key[], selectedRows: BelongDataType[]) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
// setauthorName(selectedRows[0].name)
// setauthorIdCardType(selectedRows[0].idCardType)
// setauthorIdCard(selectedRows[0].idCardNo)
// setauthorType(selectedRows[0].type)
// setauthorProvinceCity(selectedRows[0].provinceCity)
// setauthorCrcAccount(selectedRows[0].isCrcAccount)
setauthorName(selectedRows[0].name)
setauthorIdCardType(selectedRows[0].idCardType)
setauthorIdCard(selectedRows[0].idCardNo)
setauthorType(selectedRows[0].type)
setauthorProvinceCity(selectedRows[0].provinceCity)
setauthorCrcAccount(selectedRows[0].isCrcAccount)
// setauthorCrcAccountPassword(selectedRows[0].crcAccountPassword)
// setauthorCrcAccountUsername(selectedRows[0].crcAccountUsername)
// setAuthorId(selectedRows[0].projOwnerId)
setAuthorId(selectedRows[0].projOwnerId)
// setClom(String(selectedRowKeys))
// setbelongselectedKeys(selectedRowKeys)
// props.setBelongPeopleName(selectedRows[0].name)
props.setBelongPeopleInfo({
authorName: selectedRows[0].name,
authorType: selectedRows[0].type,
authorIdCardType: selectedRows[0].idCardType,
authorIdCard: selectedRows[0].idCardNo,
// props.setBelongPeopleInfo({
// authorName: selectedRows[0].name,
// authorType: selectedRows[0].type,
// authorIdCardType: selectedRows[0].idCardType,
// authorIdCard: selectedRows[0].idCardNo,
authorCrcAccount: selectedRows[0].isCrcAccount,
authorId: selectedRows[0].projOwnerId,
authorProvinceCity: selectedRows[0].provinceCity
})
props.setValue(selectedRows[0].name)
// authorCrcAccount: selectedRows[0].isCrcAccount,
// authorId: selectedRows[0].projOwnerId,
// authorProvinceCity: selectedRows[0].provinceCity
// })
// props.setValue(selectedRows[0].name)
},
};
@ -240,6 +241,9 @@ export default function BelongPeople(props: propsInfo) {
get({
messageApi,
url: `/api/proj-owner/list/self`,
onBefore() {
setIsLoading(true);
},
onSuccess({ data }: AxiosResponse) {
console.log('所属者表格', data);
setTableBelongData(data)
@ -247,6 +251,9 @@ export default function BelongPeople(props: propsInfo) {
// console.log('嘻嘻',selectBelongArray);
// setSelectedRowKeys(selectBelongArray)
},
onFinally() {
setIsLoading(false);
}
})
}
@ -256,9 +263,15 @@ export default function BelongPeople(props: propsInfo) {
get({
messageApi,
url: `/api/proj-owner/list/self?keywords=${keywords}&type=${type}`,
onBefore() {
setIsLoading(true);
},
onSuccess({ data }: AxiosResponse) {
console.log('搜索所属者表格', data);
setTableBelongData(data)
},
onFinally() {
setIsLoading(false);
}
})
}
@ -374,7 +387,7 @@ export default function BelongPeople(props: propsInfo) {
return (
<>
<div style={{ height: `${height - 140}px`, overflow: 'auto', background: 'var(--color-light)', position: 'relative' }}>
<div style={{ height: props.isShow ? `${height - 100}px` : `${height - 200}px`, overflow: 'auto', background: 'var(--color-light)', position: 'relative' }}>
{contextHolder}
@ -468,6 +481,15 @@ export default function BelongPeople(props: propsInfo) {
</div> */}
</div>
<div className='showInfo' style={{ display: props.isShow ? 'block' : 'none' }} >
{authorName ? (<>
<div style={{ display: 'flex' }}>
<div style={{ marginRight: ' 10px' }}>:</div>
<div style={{ display: authorName ? 'none' : 'block' }}></div>
<div style={{ display: authorName ? 'block' : 'none' }}>
{authorName}/{authorType == 'PERSONAL' ? '自然人' : '企业-组织'}/{authorIdCardType == 'ID_CARD' ? '身份证' : '营业执照'}/{authorIdCard}
</div>
</div>
</>) : (<>
<div style={{ display: 'flex' }}>
<div style={{ marginRight: ' 10px' }}>:</div>
<div style={{ display: props.belongPeopleInfo.authorName ? 'none' : 'block' }}></div>
@ -475,7 +497,10 @@ export default function BelongPeople(props: propsInfo) {
{props.belongPeopleInfo.authorName}/{props.belongPeopleInfo.authorType == 'PERSONAL' ? '自然人' : '企业-组织'}/{props.belongPeopleInfo.authorIdCardType == 'ID_CARD' ? '身份证' : '营业执照'}/{props.belongPeopleInfo.authorIdCard}
</div>
</div>
</>)}
</div>
<Spin tip="加载中..." spinning={isLoading}>
<div className='belongPeople-bot'>
{/* 表格 */}
{props.isShow ? (<Table
@ -722,12 +747,38 @@ export default function BelongPeople(props: propsInfo) {
</div>
</Spin>
</div>
</Form>
</div>
</div>
<div style={{ display: props.isShow ? 'block' : 'none', marginTop: 10 }}>
<div className="belongPeopleModal-btn" style={{ display: 'flex', justifyContent: 'flex-end' }} >
<Button onClick={() => {
props.closeModal()
}}></Button>
<Button style={{
marginLeft: 20
}} type="primary"
onClick={() => {
props.setBelongPeopleInfo({
authorName,
authorType,
authorIdCardType,
authorIdCard,
authorCrcAccount,
authorId,
authorProvinceCity
})
props.setValue(authorName)
props.closeModal()
}}
></Button>
</div>
</div>
</div>

View File

@ -0,0 +1,408 @@
import { message, Modal,Table, Space } from "antd";
import { FolderAddOutlined } from '@ant-design/icons';
// import locale from 'antd/es/date-picker/locale/zh_CN';
// import { useParams } from "react-router-dom";
import { useEffect, useState } from "react";
// import { get, put, post, del, downloadUrl } from "../../../util/AjaxUtils.ts";
import {
get, put, post, del,
downloadUrl
} from "../../util/AjaxUtils.ts";
import { Button, Form, Input } from 'antd';
import { AxiosResponse } from "axios";
import type { SearchProps } from 'antd/es/input/Search';
// import type { TableColumnsType } from 'antd';
type ContactType = {
csaNo: string
gmtCreate: string
gmtModified: string
name: string
phone: string
projContactId: string
email: string
company: string
}
const { Search } = Input;
const { Column } = Table;
export default function ContactPeople() {
const [messageApi, contextHolder] = message.useMessage();
const [formContact] = Form.useForm<ContactType>()
const height = window.innerHeight - 200;
const [isContantOpen, steIsContantOpen] = useState(false)
// 联系人弹窗标题
const [contactTitle, setContactTitle] = useState('')
// 客服二维码
const [imgUrl, setImgUrl] = useState('')
// 联系人搜索关键字
const [peopleKeyWords, setPeopleKeyWords] = useState('')
// 联系人表格数据
const [tableContactData, setTableContactData] = useState<ContactDataType[]>([])
// 联系人id 关键字
const [contactId, setContactId] = useState('')
// 申请人信息搜索 applicantPeopleSearch
const applicantPeopleSearch: SearchProps['onSearch'] = (value, _e, info) => (
console.log(info?.source, value),
// alert(value),
setPeopleKeyWords(value),
getSearchProjContactList(value)
);
// 获取联系人表格
const getProjContactList = () => {
get({
messageApi,
url: `/api/proj-contact/list/self`,
onSuccess({ data }: AxiosResponse) {
console.log('联系人表格', data);
// setTableBelongData(data)
setTableContactData(data)
}
})
}
// 获取联系人表格 带搜索
const getSearchProjContactList = (keywords: any) => {
get({
messageApi,
url: `/api/proj-contact/list/self?keywords=${keywords}`,
onSuccess({ data }: AxiosResponse) {
// console.log('联系人表格', data);
// setTableBelongData(data)
setTableContactData(data)
}
})
}
// 点击创建联系热人获取随机客服
const getCas = () => {
get({
messageApi,
url: `/api/csa/get`,
onSuccess({ data }: AxiosResponse) {
console.log('随机客服信息二维码', data.casQrCode);
formContact.setFieldsValue({
csaNo: data.csaNo
});
if (data.casQrCode) {
const imgUrl = downloadUrl(data.casQrCode);
console.log('图片地址', imgUrl);
setImgUrl(imgUrl)
}
}
})
}
// 创建联系人
const newContact = () => {
post({
messageApi,
url: '/api/proj-contact/save',
body: {
csaNo: formContact.getFieldValue('csaNo'),
name: formContact.getFieldValue('name'),
phone: formContact.getFieldValue('phone'),
email: formContact.getFieldValue('email'),
company: formContact.getFieldValue('company')
},
onBefore() {
},
onSuccess() {
messageApi.success('提交成功')
getProjContactList()
steIsContantOpen(false)
},
onFinally() {
}
})
}
// 编辑联系人
const upContact = () => {
put({
messageApi,
url: `/api/proj-contact/update/${contactId}`,
body: {
csaNo: formContact.getFieldValue('csaNo'),
name: formContact.getFieldValue('name'),
phone: formContact.getFieldValue('phone'),
email: formContact.getFieldValue('email'),
company: formContact.getFieldValue('company')
},
onBefore() {
},
onSuccess() {
// console.log(data);
// alert('编辑成功')
messageApi.open({
type: 'success',
content: '编辑成功'
})
// getProjContactList()
getSearchProjContactList(peopleKeyWords)
steIsContantOpen(false)
},
onFinally() {
}
})
}
// 联系人人表单信息 点击确定
const contactHandleOk = () => {
// alert('联系热确定')
formContact.validateFields().then(() => {
// 如果验证通过,则执行确认操作
// 这里可以放置你的确认操作逻辑
if (contactTitle === '编辑联系人') {
upContact()
}
if (contactTitle === '创建联系人') {
newContact()
}
// 关闭 弹窗
// setIsNewBelongOpen(false)
// 初始化数据
formContact.resetFields(); // 重置表单字段为初始值
}).catch(() => {
// 如果验证不通过,可以根据需要处理错误信息
// (errorInfo);
});
};
useEffect(() => {
getProjContactList()
}, [])
return (
<div style={{ height: `${height - 175}px`, overflow: 'auto' }}>
{contextHolder}
<div style={{ padding: '22px 15px 0 15px',background: 'var(--color-light)' }}>
<div style={{ padding: '14px 19px', background: '#F3F3F3', color: '#A3A3A3', fontSize: '14px' }}>
线
</div>
<div className='belongPeople-center'>
<Button onClick={() => {
formContact.resetFields()
getCas()
steIsContantOpen(true)
setContactTitle('创建联系人')
}} type="primary" icon={<FolderAddOutlined style={{ fontSize: '18px' }} />} style={{ width: "160px", height: '43px', fontSize: '14px' }}>
</Button>
<div className='belongPeople-search'>
<Search placeholder="请输入持有者名称搜索对应信息" onSearch={applicantPeopleSearch} style={{ width: '353px', height: '43px' }} />
</div>
</div>
<div className='belongPeople-bot'>
{/* 表格 lyp*/}
<Table
dataSource={tableContactData}
pagination={{
defaultPageSize: 5, // 设置默认一页显示 5 条数据
}}
style={{ textAlign: 'center' }} // 设置表格内容居中显示
rowKey="projContactId" // 指定数据项的唯一标识符
>
<Column title="联系人" dataIndex="name" />
<Column title="联系人手机号" dataIndex="phone" />
<Column title="平台专属客服" dataIndex="csaNo" />
<Column title="所属公司" dataIndex="company"
render={(text) => (text !== '' ? text : '一')}
/>
{/* <Column title="实名认证状态" dataIndex="address" key="key" /> */}
<Column
title="操作"
render={(text, record: any) => (
<Space size="middle">
<a onClick={() => {
// alert(record.projOwnerId);
console.log('text:', text);
console.log('record:', record);
setContactId(record.projContactId)
setContactTitle('编辑联系人')
steIsContantOpen(true)
// formContact 表单赋值
formContact.setFieldsValue({
csaNo: record.csaNo,
name: record.name,
phone: record.phone,
email: record.email,
company: record.company
})
}}> </a>
<span style={{ color: '#3472EE' }}>|</span>
<a onClick={() => {
// alert(record.projOwnerId);
del({
messageApi,
url: `/api/proj-contact/remove/${record.projContactId}`,
onSuccess() {
messageApi.success('删除成功');
getProjContactList()
}
})
}}></a>
<span style={{ color: '#3472EE' }}>|</span>
<a onClick={() => {
setContactTitle('查看联系人')
steIsContantOpen(true)
formContact.setFieldsValue({
csaNo: record.csaNo,
name: record.name,
phone: record.phone,
email: record.email
})
}}></a>
</Space>
)}
/>
</Table>
</div>
</div>
{/* 选择创建/编辑/查看联系人弹框 lyp*/}
<Modal
destroyOnClose
okText="确认"
// cancelText="取消"
cancelText={contactTitle === '查看联系人' ? '返回' : '取消'}
open={isContantOpen}
// 点击确认上传事件
// onOk={() => {
// }}
onOk={
contactHandleOk
}
width={745}
// 确认按钮样式
okButtonProps={{ size: 'large', style: { display: contactTitle == '查看联系人' ? 'none' : 'block' } }}
// 返回按钮样式
cancelButtonProps={{ size: 'large', style: {} }}
onCancel={() => {
steIsContantOpen(false)
getSearchProjContactList(peopleKeyWords)
}}
>
<div className='belongPeople-Modal'>
<div className='belongPeople-Mtop'>
{contactTitle}
</div>
<div className='contact-modal-context'>
<div>
<Form
name="contactInfo"
form={formContact}
layout="vertical"
labelCol={{ span: 8 }}
wrapperCol={{ span: 24 }}
style={{ width: '100%', }}
onFinish={() => {
// setIsNewBelongOpen(true);
}}
autoComplete="off"
>
<div className='blongNameInt'>
<div className='blongTitle ' style={{ width: 65, marginRight: '15px' }}>: </div>
<Form.Item<ContactType>
name="name"
rules={[{ required: true, message: '请输入姓名' }]}
>
<Input placeholder="请输入姓名"
style={{ height: '44px', width: '384px', fontSize: '15px', marginTop: '22px' }}
disabled={contactTitle == '查看联系人' ? true : false}
/>
</Form.Item>
</div>
<div className='blongNameInt'>
<div className='blongTitle ' style={{ width: 65, marginRight: '15px' }}>: </div>
<Form.Item<ContactType>
name="phone"
rules={[{ required: true, message: '请输入电话号码' }]}
>
<Input placeholder="请输入电话号码"
style={{ height: '44px', width: '384px', fontSize: '15px', marginTop: '22px' }}
disabled={contactTitle == '查看联系人' ? true : false}
/>
</Form.Item>
</div>
<div className='blongNameInt'>
<div className='blongTitle ' style={{ width: 65, marginRight: '15px' }}>: </div>
<Form.Item<ContactType>
name="company"
rules={[{ required: false, message: '请输入所属公司' }]}
>
<Input placeholder="请输入所属公司"
style={{ height: '44px', width: '384px', fontSize: '15px', marginTop: '22px' }}
disabled={contactTitle == '查看联系人' ? true : false}
/>
</Form.Item>
</div>
<div className='blongNameInt'>
<div className='blongTitle ' style={{ width: 65, marginRight: '15px' }}>: </div>
<Form.Item<ContactType>
name="email"
rules={[{ required: false, message: '请输入邮箱' },
{ type: 'email', message: '请输入有效的邮箱地址' }
]}
>
<Input placeholder="请输入邮箱"
style={{ height: '44px', width: '384px', fontSize: '15px', marginTop: '22px' }}
disabled={contactTitle == '查看联系人' ? true : false}
/>
</Form.Item>
</div>
<div
style={{ display: 'none' }}
>
<Form.Item<ContactType>
name="csaNo"
>
<Input placeholder="客服编码 需隐藏"
style={{ height: '44px', width: '384px', fontSize: '15px', }}
disabled={contactTitle == '查看联系人' ? true : false}
/>
</Form.Item>
</div>
</Form>
</div>
<div className='cas' style={{
display: contactTitle == '创建联系人' ? 'block' : 'none'
}}>
<div className='cas-title'>
使
</div>
<div className='cas-text'>
</div>
<img src={imgUrl} alt="" width={137} height={138} />
</div>
</div>
</div>
</Modal >
</div>
)
}

View File

@ -0,0 +1,166 @@
import React, { useState, useEffect } from 'react'
import './order-detail-modal.css'
import { Input, Rate } from "antd";
export default function OrderDetailModal() {
const height = window.innerHeight - 180;
const [activeKey, setActiveKey] = useState('roder') //tap栏选项 默认选第一个
const [orderPrice, setOrderPrice] = useState('') //订单金额
const [orderStatus, setOrderStatus] = useState('') //订单状态
const [orderTime, setOrderTime] = useState('') //下单时间
const [payTime, setPayTime] = useState('') //付款时间
const [cardTime, setCardTime] = useState('') //下证时间
const [evaluateTime, setEvaluateTime] = useState('') //评价时间
const [orderRate, setOrderRate] = useState(0) //订单评价星星数量
const [rateText,setOrderText] = useState('')
// tab栏 标题数组
const tapTitleArray = [
{
key: 'roder',
title: '订单信息',
className: activeKey == 'roder' ? 'orderDetailTop-tetle tapActive' : 'orderDetailTop-tetle'
},
{
key: 'goodsInfo',
title: '著作权商品信息',
className: activeKey == 'goodsInfo' ? 'orderDetailTop-tetle tapActive' : 'orderDetailTop-tetle'
},
{
key: 'copyright',
title: ' 著作权人信息',
className: activeKey == 'copyright' ? 'orderDetailTop-tetle tapActive' : 'orderDetailTop-tetle'
},
{
key: 'authorize',
title: '受权人信息',
className: activeKey == 'authorize' ? 'orderDetailTop-tetle tapActive' : 'orderDetailTop-tetle'
},
{
key: 'file',
title: '资料补充',
className: activeKey == 'file' ? 'orderDetailTop-tetle tapActive' : 'orderDetailTop-tetle'
},
{
key: 'result',
title: '过户结果',
className: activeKey == 'result' ? 'orderDetailTop-tetle tapActive borderRight' : 'orderDetailTop-tetle borderRight'
},
]
useEffect(() => {
// 发起请求获取订单信息
setOrderPrice('556')
setOrderStatus('已过户完成')
setOrderTime('2024-04-25 15:34:10')
setPayTime('2024-04-25 15:50:10')
setCardTime('2024-05-25 15:50:10')
setEvaluateTime('2024-05-25 15:50:10')
setOrderRate(3)
setOrderText('嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻')
}, [])
return (
<div style={{ width: 1200, height: `${height}px` }}>
<div className='orderDetailTop'>
{tapTitleArray.map((item) => {
return (
<div key={item.key} className={item.className} onClick={() => {
setActiveKey(item.key)
}}>
{item.title}
</div>
)
})}
</div>
<div className='orderDetailBot'>
<div style={{ display: activeKey == 'roder' ? 'block' : 'none' }}>
<div className='orderDetailBot-order'>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={orderPrice}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={orderStatus}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={orderTime}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={payTime}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={cardTime}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={evaluateTime}></Input>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}}
>
</Input>
<div className='orderInfo-rate'>
<Rate allowHalf disabled value={orderRate} />
</div>
</div>
<div className='orderInfo'>
<div className='orderInfo-title'></div>
<Input
disabled
style={{
width: 400,
fontSize: 16,
color: "#5C5C5C"
}} value={rateText}></Input>
</div>
</div>
</div>
</div>
</div>
)
}

View File

@ -0,0 +1,59 @@
.orderDetailTop {
margin-top: 21px;
display: flex;
/* background-color: red; */
height: 45px;
border-bottom: 1px solid #EFE8E2;
}
.orderDetailTop-tetle {
/* background-color: pink; */
line-height: 45px;
padding: 0 16px 0 16px;
font-size: 14px;
color: #888888;
border-left: 1px solid #EFE8E2;
border-top: 1px solid #EFE8E2;
cursor: pointer;
}
.borderRight {
border-right: 1px solid #EFE8E2;
}
.tapActive {
border-top: 2px solid #3168EC;
font-weight: bold;
color: #3168EC;
}
.orderDetailBot {}
.orderDetailBot-order {
display: flex;
justify-content: space-between;
width: 1100px;
/* background-color: red; */
flex-wrap: wrap;
margin-top: 42px;
margin-left: 20px;
}
.orderInfo {
display: flex;
margin-bottom: 29px;
position: relative;
}
.orderInfo-rate{
position: absolute;
left: 110px;
top: 12px;
}
.orderInfo-title {
font-size: 16px;
color: #222222;
line-height: 44px;
/* background-color: red; */
width: 100px;
}

View File

@ -4,13 +4,17 @@ import { GlobalContext } from "../../context/GlobalContext.ts";
import { del, get, post, put, websocketUrl } from "../../util/AjaxUtils.ts";
import {
// Col, Divider, Row,
Spin } from "antd";
Spin
} from "antd";
import useMessage from "antd/es/message/useMessage";
import AiHelperText from "./text/AiHelperText.tsx";
import AiHelperMod from "./mod/AiHelperMod.tsx";
import { IProjMod } from "../../interfaces/proj/IProj.ts";
import { MAX_MOD_SIZE } from "../../route/proj/edit/ProjConfigModList.tsx";
import { useNavigate } from "react-router-dom";
import {
useNavigate,
// useParams
} from "react-router-dom";
import { uuid } from "../../util/CommonUtil.ts";
type PropsType = {
@ -18,7 +22,7 @@ type PropsType = {
projIntroduction?: string;
projDesc?: string;
isFree: boolean;
renderData: any
}
type ProjModType = {
@ -28,6 +32,9 @@ type ProjModType = {
}
export default function AiHelper(props: PropsType) {
// const pathParams = useParams();
// const [openModal ,setOpenModal] = useState(false) //是提示替换弹框
// const height = window.innerHeight - 280;
const globalContext = useContext(GlobalContext);
const pingTimeout = useRef(-1);
@ -37,6 +44,7 @@ export default function AiHelper(props: PropsType) {
const [activeTab, setActiveTab] = useState('简介') //tab栏选中
const [projIntroduction, setProjIntroduction] = useState<string>(props.projIntroduction ? props.projIntroduction : '');
// 中间量
const [newProjIntroduction, setNewProjIntroduction] = useState<string>('');
const [isProjIntroductionLoading, setIsProjIntroductionLoading] = useState(false);
@ -48,7 +56,20 @@ export default function AiHelper(props: PropsType) {
const [newProjModArray, setNewProjModArray] = useState<ProjModType[]>([]);
const [isProjModArrayLoading, setIsProjModArrayLoading] = useState(false);
const nav = useNavigate();
// const [showText,setShowText] = useState('保存成功') //提示信息
// // 获取项目信息
// const renderData = () => {
// get<any>({
// messageApi: messageApi,
// url: `/api/proj/get/${pathParams.projId}`,
// onSuccess({ data }) {
// setProjIntroduction(data.projIntroduction)
// setProjDesc(data.projDesc)
// }
// })
// }
const ping = () => {
clearTimeout(pingTimeout.current);
@ -78,9 +99,19 @@ export default function AiHelper(props: PropsType) {
if (data.type == 'REFRESH_PROJ_INTRODUCTION') {
setIsProjIntroductionLoading(false);
setNewProjIntroduction(data.content);
// if (!projIntroduction) {
// setProjIntroduction(data.content)
// updateProjIntroduction(data.content);
// }
} else if (data.type == 'REFRESH_PROJ_DESC') {
setIsProjDescLoading(false);
setNewProjDesc(data.content);
// if (!projDesc) {
// setProjDesc(data.content)
// updateProjDesc(data.content)
// }
} else if (data.type == 'REFRESH_PROJ_MODS') {
setIsProjModArrayLoading(false);
const projMods = JSON.parse(data.content) as ProjModType[];
@ -116,6 +147,7 @@ export default function AiHelper(props: PropsType) {
}
const generateProjIntroduction = () => {
ws.current?.send(JSON.stringify({
type: 'REFRESH_PROJ_INTRODUCTION',
projId: props.projId
@ -125,6 +157,7 @@ export default function AiHelper(props: PropsType) {
}
const generateProjDesc = () => {
ws.current?.send(JSON.stringify({
type: 'REFRESH_PROJ_DESC',
projId: props.projId
@ -155,13 +188,16 @@ export default function AiHelper(props: PropsType) {
onBefore() {
setIsProjIntroductionLoading(true);
},
onSuccess() {
messageApi.success('保存成功');
onSuccess(data) {
messageApi.success('保存成功,点击编辑按钮可继续修改项目简介');
setProjIntroduction(content);
setNewProjIntroduction('');
console.log('更新成功',data);
},
onFinally() {
setIsProjIntroductionLoading(false)
// renderData()
}
})
}
@ -180,12 +216,13 @@ export default function AiHelper(props: PropsType) {
setIsProjDescLoading(true);
},
onSuccess() {
messageApi.success('保存成功').then();
messageApi.success('保存成功,点击编辑按钮可继续修改项目详情').then();
setProjDesc(content);
setNewProjDesc('');
},
onFinally() {
setIsProjDescLoading(false)
// renderData()
}
})
}
@ -194,10 +231,14 @@ export default function AiHelper(props: PropsType) {
if (!props.projId) {
return;
}
listMods();
websocket();
}, [globalContext.user.userId, props.projId]);
useEffect(()=>{
},[])
return (
<div className='aiTab'>
{messageApiHolder}
@ -355,11 +396,13 @@ export default function AiHelper(props: PropsType) {
maxLength={1500}
handleGenerate={() => {
generateProjIntroduction();
// setProjIntroduction(newProjIntroduction)
}}
handleSave={(text) => {
updateProjIntroduction(text);
}}
></AiHelperText>
</Spin>
</div>
@ -376,6 +419,7 @@ export default function AiHelper(props: PropsType) {
handleSave={(text) => {
updateProjDesc(text);
}}
/>
</Spin>
</div>

View File

@ -1,6 +1,7 @@
import {
Button,
// Divider, Empty, Space
Modal
} from "antd";
import './ai-helper-text.css'
import TextArea from "antd/es/input/TextArea";
@ -19,13 +20,13 @@ type PropsType = {
newText: string;
handleGenerate: () => void;
handleSave: (newText: string) => void;
}
export default function AiHelperText(props: PropsType) {
const height = window.innerHeight - 265;
const pathParams = useParams();
const [status, setStatus] = useState('')
useEffect(() => {
get<any>({
messageApi,
@ -42,14 +43,25 @@ export default function AiHelperText(props: PropsType) {
const [text, setText] = useState('');
const [newText, setNewText] = useState('');
const [isShow, setIsShow] = useState(false) //替换按钮是否显示
const [modal, setModal] = useState(false) //提示替换弹窗
const [isTextEdit, setIsTextEdit] = useState(false);
// const [isNewTextEdit, setIsNewTextEdit] = useState(false);
useEffect(() => {
setText(props.text);
setNewText(props.newText);
if (props.text) {
setIsShow(true)
}
if (props.text && props.newText) {
setModal(true)
}
if (!props.text && props.newText) {
// console.log('aaaaaaaa',props.newText);
props.handleSave(props.newText)
}
}, [props.text, props.newText])
// const renderTextBtn = () => {
// if (!newText) {
// if (!isTextEdit) {
@ -120,7 +132,7 @@ export default function AiHelperText(props: PropsType) {
// )
// }
const renderTextDom = () => {
if (!text) {
if (!props.text) {
return (
<div className="aiText-top-notext">
{/* <Empty description="暂无内容" /> */}
@ -148,7 +160,7 @@ export default function AiHelperText(props: PropsType) {
}
return (
<TextArea style={{ height: ' 77%', resize: 'none', fontSize: 16, textIndent: 32 }} value={text} onChange={(e) => {
<TextArea style={{ height: ' 77%', resize: 'none', fontSize: 16 }} value={text} onChange={(e) => {
setText(e.currentTarget.value);
}}></TextArea>
)
@ -192,7 +204,7 @@ export default function AiHelperText(props: PropsType) {
<div className="aiText" style={{ height: `${height}px` }}>
<div className="aiText-top">
{renderTextDom()}
<div className="aiText-top-btn" style={{ display: text ? 'block' : 'none' }}>
<div className="aiText-top-btn" style={{ display: props.text ? 'block' : 'none' }}>
<div style={{ display: "flex", justifyContent: 'flex-end' }}>
<Button disabled={status == 'SUCCESS' || status == 'GENERATING' ? true : false}
@ -204,12 +216,28 @@ export default function AiHelperText(props: PropsType) {
// size="large"
style={{
marginLeft: 15,
display: text ? 'block' : 'none'
}}
type="primary" onClick={() => {
props.handleSave(text);
setIsTextEdit(false);
}}></Button>
<Button
disabled={status == 'SUCCESS' || status == 'GENERATING' ? true : false}
// size="large"
style={{
marginLeft: 15,
display: text ? 'none' : 'block'
}}
type="primary" onClick={() => {
setText(props.text)
setIsTextEdit(false)
}}></Button>
</div>
</div>
</div>
@ -226,17 +254,34 @@ export default function AiHelperText(props: PropsType) {
}}> AI自动生成后可自动生{props.title}...</span> </>}
</div>
<div style={{ display: "flex", justifyContent: 'flex-end', marginTop: 10 }}>
{/* <Button
style={{
width: 109,
display: isShow ? 'none' : 'block'
}}
onClick={() => {
setText(newText)
}}
>使</Button> */}
<Button
// size="large"
style={{
width: 109,
display: newText ? 'block' : 'none'
display: isShow && newText ? 'block' : 'none'
}}
onClick={() => {
setText(newText)
setModal(true)
// setNewText('')
}}
>使</Button>
></Button>
<Button
disabled={status == 'SUCCESS' || status == 'GENERATING' ? true : false}
// size="large"
@ -245,11 +290,41 @@ export default function AiHelperText(props: PropsType) {
marginLeft: 15,
}}
onClick={() => {
props.handleGenerate();
props.handleGenerate()
}}
>AI生成</Button>
</div>
</div>
<Modal
title={'提示'}
destroyOnClose={true}
open={modal}
okText="确认"
cancelText="取消"
onCancel={() => {
setModal(false);
}}
onOk={() => {
setModal(false);
setText(newText)
props.handleSave(newText);
setNewText('')
}}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}
>
<div style={{ width: 700 }}>
{props.title}
</div>
</Modal>
</div>
</>
)

View File

@ -26,7 +26,7 @@
font-size: 16px;
color: #1D1D1D;
overflow-y: auto;
text-indent: 32px;
/* text-indent: 32px; */
text-align: justify;
/* background-color: pink; */
}
@ -57,7 +57,7 @@
}
.aiText-top-btn {
margin-top: 20px;
margin-top: 50px;
}
.aiText-bot {
@ -74,6 +74,6 @@
width: 100%;
/* background-color: pink; */
overflow-y: auto;
text-indent: 32px;
/* text-indent: 32px; */
text-align: justify;
}

View File

@ -79,7 +79,7 @@ export default function CardProj(props:any ) {
const goEdit = () => {
if (charge == ProjChargeType.ALL) {
nav(`/proj-eall/${data.projId}`);
nav(`/proj-edit/${data.projId}`);
} else if (charge == ProjChargeType.FREE) {
nav(`/proj-efree/${data.projId}`);
} else {

View File

@ -2,7 +2,7 @@ import './head.css'
import BalanceHead from '../../components/balance/BalanceHead.tsx';
import RechargeHead from '../../components/recharge/RechargeHead.tsx';
import { Dropdown, MenuProps, message, Modal, Space, Spin } from "antd";
import { DownOutlined, UserOutlined, KeyOutlined, LogoutOutlined, AccountBookOutlined,MenuFoldOutlined } from "@ant-design/icons";
import { DownOutlined, UserOutlined, KeyOutlined, LogoutOutlined, AccountBookOutlined,MenuFoldOutlined ,UsergroupAddOutlined} from "@ant-design/icons";
import { useContext, useEffect, useState } from "react";
import { put } from "../../util/AjaxUtils.ts";
import { GlobalContext, GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
@ -15,7 +15,7 @@ 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'
export default function Head() {
const globalContext = useContext(GlobalContext);
const globalDispatchContext = useContext(GlobalDispatchContext);
@ -39,6 +39,8 @@ export default function Head() {
const setValue = () => {
// console.log(value);
}
// 联系人弹窗
const [contactModal,setContactModal] = useState(false)
useEffect(() => {
reloadUser(messageApi, globalDispatchContext).then((data) => {
@ -97,6 +99,18 @@ export default function Head() {
setBelongModal(true)
}
},
{
key: 'contact',
label: (
<div className="dropdown-item">
<UsergroupAddOutlined />
<span className="title"></span>
</div>
),
onClick: () => {
setContactModal(true)
}
},
{
key: 'logout',
label: (
@ -244,7 +258,21 @@ export default function Head() {
}}>
<BelongPeople setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={false} ></BelongPeople>
<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 ></ContactPeople>
</Modal>
<Spin tip="正在提交..." spinning={loading} fullscreen />
{contextHolder}

View File

@ -82,3 +82,6 @@
.ant-dropdown .dropdown-item .title {
margin-left: 5px;
} */
.ant-dropdown .dropdown-item .title {
margin-left: 5px;
}

View File

@ -2,7 +2,8 @@ import './trading-goods.css'
import {
Select, DatePicker, Button, Table,
// message,
Space, Empty, Pagination
Space, Empty, Pagination,
Modal
} from 'antd';
// import type { TableColumnsType } from 'antd';
import { SearchOutlined, ClearOutlined } from '@ant-design/icons';
@ -10,6 +11,7 @@ import type { DatePickerProps } from 'antd';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { useState } from 'react';
const { Column } = Table;
import OrderDetail from '../../components/OrderDetailModal/OrderDetailModal'
export default function TradingGoods() {
const height = window.innerHeight - 180;
// const [messageApi, contextHolder] = message.useMessage();
@ -18,6 +20,7 @@ export default function TradingGoods() {
const [endTime, setEndTime] = useState<any>() //结束时间
const [orderStatus, setOrderStatus] = useState<any>() //订单状态
const [page, setPage] = useState(1) //分页
const [orderDetailModal, setOrderDetailModal] = useState(false) //订单详情弹窗
// 更改开始时间
const startTimeChange: DatePickerProps['onChange'] = (date, dateString) => {
console.log(date, dateString);
@ -198,6 +201,12 @@ export default function TradingGoods() {
console.log(record.order);
}}></span>
<span className='trading-goods-table-btn' onClick={() => {
console.log(record.order);
setOrderDetailModal(true)
}}>
</span>
</Space>
)}
/>
@ -213,6 +222,28 @@ export default function TradingGoods() {
</div>
)}
</div>
<Modal
title="订单详情"
okText="确认"
cancelText="取消"
destroyOnClose={true}
footer={null}
open={orderDetailModal}
// onOk={() => {
// setOrderDetailModal(false)
// }}
onCancel={() => {
setOrderDetailModal(false)
}}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<OrderDetail></OrderDetail>
</Modal>
</div>
)
}

View File

@ -3,7 +3,7 @@ import './transaction-order.css'
import {
Select, DatePicker, Button, Table,
// message,
Space, Empty, Pagination
Space, Empty, Pagination,Modal
} from 'antd';
import dayjs, { } from 'dayjs';
// import type { TableColumnsType } from 'antd';
@ -12,6 +12,7 @@ import type { DatePickerProps } from 'antd';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { useEffect, useState } from 'react';
const { Column } = Table;
import OrderDetail from '../../components/OrderDetailModal/OrderDetailModal'
export default function TransactionOrder() {
const height = window.innerHeight - 180;
// const [messageApi, contextHolder] = message.useMessage();
@ -20,7 +21,7 @@ export default function TransactionOrder() {
const [endTime, setEndTime] = useState<any>(undefined) // 结束时间
const [orderStatus, setOrderStatus] = useState<any>(undefined) // 订单状态
const [page, setPage] = useState(1) //分页
const [orderDetailModal, setOrderDetailModal] = useState(false) //订单详情弹窗
// 更改开始时间
const stratTimeChange: DatePickerProps['onChange'] = (date, dateString) => {
console.log(date, dateString);
@ -262,6 +263,12 @@ export default function TransactionOrder() {
console.log(record.order);
}}></span>
<span className='trading-goods-table-btn' onClick={() => {
console.log(record.order);
setOrderDetailModal(true)
}}>
</span>
</Space>
)}
/>
@ -280,6 +287,28 @@ export default function TransactionOrder() {
</div>
<Modal
title="订单详情"
okText="确认"
cancelText="取消"
destroyOnClose={true}
footer={null}
open={orderDetailModal}
// onOk={() => {
// setOrderDetailModal(false)
// }}
onCancel={() => {
setOrderDetailModal(false)
}}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<OrderDetail></OrderDetail>
</Modal>
</div>
)
}

View File

@ -31,6 +31,7 @@ export default function ProjCreate() {
const [allInfo, setAllInfo] = useState<any>({}) //全部托管信息
const [materialInfo, setMaterialInfo] = useState<any>({}) //写材料信息
const [freeInfo, setFreeInfo] = useState<any>({}) //免费托管信息
const [ freeCount,setFreeCount] = useState(0) //免费次数
const nav = useNavigate();
const height = window.innerHeight - 170;
useEffect(() => {
@ -45,7 +46,7 @@ export default function ProjCreate() {
setMaterialInfo(data.projTypes[1])
setFreeInfo(data.projTypes[2])
// console.log('后面的price',data.proj.materialAgent);
setFreeCount(data.freeCount)
}
})
// sessionStorage.setItem('pathArray', JSON.stringify([ { title: <Link to={'/home'}>首页</Link> },{ title: '创建项目' }]));
@ -204,7 +205,7 @@ export default function ProjCreate() {
isClickable = {materialInfo.isClickable}
/>
<CardProjType
head={'免费试用'}
head={`免费试用${freeCount}`}
bodyLineArray={[
{
title: '提供的服务:',

View File

@ -1,4 +1,4 @@
import './proj-edit.css'; 1
import './proj-edit.css';
// import {Link, useNavigate, useParams} from "react-router-dom";
import { useNavigate, useParams } from "react-router-dom";
import {
@ -589,6 +589,9 @@ export default function ProjEdit() {
projIntroduction={aiHelper.projIntroduction}
projDesc={aiHelper.projDesc}
isFree={false}
renderData={()=>{
renderData()
}}
/>
</div>
</Modal>
@ -608,7 +611,9 @@ export default function ProjEdit() {
}}
footer={null}
>
<TitleIntroduction closeModal={() => { setTitleIntroductionOpen(false) }}></TitleIntroduction>
<TitleIntroduction closeModal={() => { setTitleIntroductionOpen(false)
renderData()
}}></TitleIntroduction>
</Modal>
{/* 第1步查看 */}
<Modal open={titleIntroductionShowOpen}
@ -640,7 +645,9 @@ export default function ProjEdit() {
}}
footer={null}
>
<SoftwareInfo closeModal={() => { setSoftwareOpen(false) }}></SoftwareInfo>
<SoftwareInfo closeModal={() => { setSoftwareOpen(false)
renderData()
}}></SoftwareInfo>
</Modal>
{/* 第二步查看 */}
<Modal open={softwareInfoShowOpen}
@ -668,7 +675,9 @@ export default function ProjEdit() {
}}
footer={null}
>
<SoftwareFeatures closeModal={() => { setSoftwareFeaturesOpen(false) }}></SoftwareFeatures>
<SoftwareFeatures closeModal={() => { setSoftwareFeaturesOpen(false)
renderData()
}}></SoftwareFeatures>
</Modal>
{/* 第三步 查看 */}
<Modal open={softwareFeaturesShowOpen}
@ -698,7 +707,9 @@ export default function ProjEdit() {
}}
footer={null}
>
<LoginPage closeModal={() => { setLoginPageOpne(false) }}></LoginPage>
<LoginPage closeModal={() => { setLoginPageOpne(false)
renderData()
}}></LoginPage>
</Modal>
{/* 第四步 查看 */}
<Modal open={loginPageShowOpne}
@ -720,7 +731,9 @@ export default function ProjEdit() {
destroyOnClose={true}
onCancel={() => {
renderData()
setSoftwareManagementOpen(false);
}}
footer={null}
>
@ -746,7 +759,9 @@ export default function ProjEdit() {
destroyOnClose={true}
onCancel={() => {
renderData()
setDisplayOrderOpen(false);
}}
footer={null}
>

View File

@ -232,7 +232,9 @@ export default function ProjEditAll() {
}}
footer={null}
>
<TitleIntroduction closeModal={() => { setTitleIntroductionOpen(false) }}></TitleIntroduction>
<TitleIntroduction closeModal={() => { setTitleIntroductionOpen(false)
renderData()
}}></TitleIntroduction>
</Modal>
{/* 第1步查看 */}
<Modal open={titleIntroductionShowOpen}
@ -264,7 +266,9 @@ export default function ProjEditAll() {
}}
footer={null}
>
<SoftwareInfo closeModal={() => { setSoftwareOpen(false) }}></SoftwareInfo>
<SoftwareInfo closeModal={() => { setSoftwareOpen(false)
renderData()
}}></SoftwareInfo>
</Modal>
{/* 第二步查看 */}
<Modal open={softwareInfoShowOpen}

View File

@ -7,9 +7,9 @@ import { Process } from "../../interfaces/step/IStepProj.ts";
import CardProjDownload from "../../components/card/CardProjDownload.tsx";
import CardProjJump from "../../components/card/CardProjJump.tsx";
import { useEffect, useState } from "react";
import { Axios, get } from "../../util/AjaxUtils.ts";
import { Axios, get, post } from "../../util/AjaxUtils.ts";
import { EditStepEnum, IProjEdit } from "../../interfaces/card/ICardProj.ts";
import { MAX_MOD_SIZE_FREE } from "./edit/ProjConfigModList.tsx";
// import { MAX_MOD_SIZE_FREE } from "./edit/ProjConfigModList.tsx";
import { GenerateStatus } from "../../interfaces/proj/IProj.ts";
import TitleIntroduction from '../../route/proj/edit/ProjEditStep1.tsx'
import TitleIntroductionShow from '../../route/proj/edit/ProjEditStep1Show.tsx'
@ -23,7 +23,32 @@ import SoftwareManagement from '../../route/proj/edit/ProjConfigModList.tsx'
import SoftwareManagementShow from '../../route/proj/edit/ProjConfigModListShow.tsx'
import DisplayOrder from '../../route/proj/edit/ProjConfigMenuList.tsx'
import DisplayOrderShow from '../../route/proj/edit/ProjConfigMenuListShow.tsx'
import CardProjLoading from "../../components/card/CardProjLoading.tsx";
import CardProjResult from "../../components/card/CardProjResult.tsx";
import aiGif from '../../static/ai.gif'
import AiHelper from "../../components/ai/AiHelper.tsx";
type AiHelperType = {
projId: string;
projIntroduction: string;
projDesc: string;
projMods: ProjModType[];
}
type ProjModType = {
name: string,
desc: string
}
export default function ProjEdit() {
const height = window.innerHeight - 180;
const [aiHelperModalOpen, setAiHelperModalOpen] = useState(false);
const [isGenerateModalOpen, setIsGenerateModalOpen] = useState(false);
const [generateErrorMsg, setGenerateErrorMsg] = useState('');
const [aiHelper, setAiHelper] = useState<AiHelperType>({
projId: '',
projIntroduction: '',
projDesc: '',
projMods: [],
});
//第一步 标题简介弹窗
const [titleIntroductionOpen, setTitleIntroductionOpen] = useState(false)
const [titleIntroductionShowOpen, setTitleIntroductionShowOpen] = useState(false)
@ -54,9 +79,9 @@ export default function ProjEdit() {
const [canGenerate, setCanGenerate] = useState(false);
const [generateStatus, setGenerateStatus] = useState(GenerateStatus.NONE);
const [previewUrl, setPreviewUrl] = useState('');
const [generateEmainingTime, setGenerateEmainingTime] = useState(0);
// const height = window.innerHeight - 240;
const [generateErrorModal, setGenerateErrorModal] = useState(false);
const renderEditStep = (data: any, isEdited: boolean, isGenerateSuccess: boolean) => {
const editStepArray: IProjEdit[] = [];
editStepArray.push(
@ -82,7 +107,7 @@ export default function ProjEdit() {
step: 2,
btnName: !isGenerateSuccess ? '设置' : '查看',
status: data.apply.projDevCompleteDate ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
canBtnClick: false,
// canBtnClick: false,
handleEdit() {
if (generateStatus != GenerateStatus.SUCCESS) {
// nav(`/proj-edit/step2/${pathParams.projId}`)
@ -101,7 +126,7 @@ export default function ProjEdit() {
step: 3,
btnName: !isGenerateSuccess ? '设置' : '查看',
status: data.apply.envHardDev ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
canBtnClick: false,
// canBtnClick: false,
handleEdit() {
if (!isGenerateSuccess) {
// nav(`/proj-edit/step3/${pathParams.projId}`)
@ -119,7 +144,7 @@ export default function ProjEdit() {
desc: '对登录界面进行个性化设置,包括背景图片等',
step: 1,
btnName: !isGenerateSuccess ? '设置' : '查看',
canBtnClick: false,
// canBtnClick: false,
// 状态判断lyp
status: data.loginpage.loginpageId ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
@ -206,7 +231,7 @@ export default function ProjEdit() {
desc: '可对软件功能列表进行添加与修改',
step: 2,
btnName: !isGenerateSuccess ? '设置' : '查看',
status: data.projModCount > MAX_MOD_SIZE_FREE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
status: data.projModCount >= 3 ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
if (!isGenerateSuccess) {
// nav(`/proj-edit/config-mod-flist/${pathParams.projId}`)
@ -224,7 +249,7 @@ export default function ProjEdit() {
desc: '调整菜单顺序',
step: 3,
btnName: !isGenerateSuccess ? '设置' : '查看',
status: data.projModCount > MAX_MOD_SIZE_FREE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
status: data.projModCount >= 3 ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
if (!isGenerateSuccess) {
// nav(`/proj-edit/config-menu-list/${pathParams.projId}`)
@ -249,11 +274,13 @@ export default function ProjEdit() {
onSuccess({ data }) {
// const isEdited = data.editSteps[0].editStatus == EditStepEnum.EDITED
// && data.editSteps[5].editStatus == EditStepEnum.EDITED;
// console.log(data);
console.log('嘻嘻', data.projModCount);
// if(data.projModCount >= 3){
// setCanGenerate(true)
// }
const isEdited = Boolean(data.projIntroduction) && Boolean(data.loginpage.loginpageId) == true
// console.log('isEdited',isEdited);
const isConfig = data.loginpage.loginpageId && data.projModCount > MAX_MOD_SIZE_FREE;
const isConfig = data.loginpage.loginpageId && data.projModCount >= 3;
const isGenerate = isEdited && isConfig;
const isGenerateSuccess: boolean = data.generate.generateStatus == GenerateStatus.SUCCESS;
renderEditStep(data, isEdited, isGenerateSuccess);
@ -261,6 +288,14 @@ export default function ProjEdit() {
setCanGenerate(isGenerate);
setGenerateStatus(data.generate.generateStatus);
setPreviewUrl(data.previewUrl);
setGenerateEmainingTime(data.generate.generateEmainingTime)
setGenerateErrorMsg(data.generate.generateMsg);
setAiHelper({
projId: data.projId,
projIntroduction: data.projIntroduction,
projDesc: data.projDesc,
projMods: data.projMods
})
}
})
}
@ -341,13 +376,62 @@ export default function ProjEdit() {
desc="生成软著所需要的资料,此操作后项目无法再次编辑"
btnName="生成"
status={EditStepEnum.UN_EDIT}
canBtnClick={false}
handleEdit={() => { }}
canBtnClick={canGenerate}
// canBtnClick={false}
handleEdit={() => {
setIsGenerateModalOpen(true);
}}
background='#f3f3f3'
/>
) : <></>
}
{
generateStatus == GenerateStatus.PENDING ? (
<CardProjLoading title="正在排队"
desc="资料正在排队"
duration={generateEmainingTime}
handleCountDownOver={() => {
setTimeout(() => {
window.location.reload();
}, 1000)
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.GENERATING ? (
<CardProjLoading title="正在生成"
desc="资料正在生成,点击刷新"
duration={generateEmainingTime}
handleClick={() => {
renderData();
}}
handleCountDownOver={() => {
renderData();
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.SUCCESS ? (
<CardProjResult title="生成成功"
isSuccess={true}
/>
) : <></>
}
{
generateStatus == GenerateStatus.FAILED ? (
<CardProjResult title="生成失败"
isSuccess={false}
handleFeedback={() => {
setGenerateErrorModal(true);
console.log('反馈')
}}
/>
) : <></>
}
</StepProjEdit>
@ -356,29 +440,36 @@ export default function ProjEdit() {
descTitle="资料下载">
<CardProjDownload title="申请表"
desc="点击下载申请表"
canBtnClick={false}
handleDownload={() => { }}
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/apply/${pathParams.projId}`)
}}
/>
<CardProjDownload title="操作手册"
desc="点击下载操作手册"
canBtnClick={false}
handleDownload={() => { }}
// canBtnClick={false}
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/manual/${pathParams.projId}`)
}}
/>
<CardProjDownload title="代码压缩包"
desc="点击下载代码压缩包"
canBtnClick={false}
handleDownload={() => { }}
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/code-zip/${pathParams.projId}`)
}}
/>
<CardProjDownload title="代码文档"
{/* <CardProjDownload title=""
desc="点击下载代码文档"
canBtnClick={false}
handleDownload={() => { }}
/>
<CardProjJump title="找代理"
/> */}
{/* <CardProjJump title=""
desc="到软著代理完成软著申请"
canBtnClick={false}
handleJump={() => { }}
/>
/> */}
</StepProjEdit>
</div>
<div className="btn-container">
@ -393,6 +484,78 @@ export default function ProjEdit() {
nav(-1);
}}></Button>
</div>
<div className='aiImg' onClick={() => { setAiHelperModalOpen(true) }}>
<img src={aiGif} alt="" width={'100%'} height={'100%'} />
</div>
<Modal title="提示"
okText="确定"
cancelText="取消"
open={isGenerateModalOpen}
onOk={() => {
setTimeout(() => {
window.location.reload();
}, 1000)
post({
messageApi,
url: `/api/proj/generate/proj-id/${pathParams.projId}`,
body: {},
onSuccess() {
messageApi.success('提交成功');
setIsGenerateModalOpen(false);
renderData();
}
})
}}
onCancel={() => {
setIsGenerateModalOpen(false);
}}>
<div>便</div>
</Modal>
<Modal open={generateErrorModal}
title="出错信息"
okText="确定"
cancelText={false}
footer={false}
okButtonProps={{
style: {
backgroundColor: 'var(--color-primary)',
}
}}
onCancel={() => {
setGenerateErrorModal(false)
}}
>
<p style={{ color: 'var(--color-red)' }}>{generateErrorMsg}</p>
</Modal>
<Modal open={aiHelperModalOpen}
title=""
width={1200}
footer={false}
maskClosable={false}
destroyOnClose={true}
onCancel={() => {
setAiHelperModalOpen(false);
renderData()
// setAiHelperModalOpen(false);
// console.log(123);
}}
>
<div style={{ height: `${height - 20}px`, overflow: 'hidden', }}>
<AiHelper
projId={aiHelper.projId}
projIntroduction={aiHelper.projIntroduction}
projDesc={aiHelper.projDesc}
isFree={false}
renderData={()=>{
renderData()
}}
/>
</div>
</Modal>
{/* 第1步设置 */}
<Modal open={titleIntroductionOpen}
title="软件简介确认"
@ -409,7 +572,10 @@ export default function ProjEdit() {
}}
footer={null}
>
<TitleIntroduction closeModal={() => { setTitleIntroductionOpen(false) }}></TitleIntroduction>
<TitleIntroduction closeModal={() => {
setTitleIntroductionOpen(false)
renderData()
}}></TitleIntroduction>
</Modal>
{/* 第1步查看 */}
<Modal open={titleIntroductionShowOpen}
@ -441,7 +607,10 @@ export default function ProjEdit() {
}}
footer={null}
>
<SoftwareInfo closeModal={() => { setSoftwareOpen(false) }}></SoftwareInfo>
<SoftwareInfo closeModal={() => {
setSoftwareOpen(false)
renderData()
}}></SoftwareInfo>
</Modal>
{/* 第二步查看 */}
<Modal open={softwareInfoShowOpen}
@ -469,7 +638,10 @@ export default function ProjEdit() {
}}
footer={null}
>
<SoftwareFeatures closeModal={() => { setSoftwareFeaturesOpen(false) }}></SoftwareFeatures>
<SoftwareFeatures closeModal={() => {
setSoftwareFeaturesOpen(false)
renderData()
}}></SoftwareFeatures>
</Modal>
{/* 第三步 查看 */}
<Modal open={softwareFeaturesShowOpen}
@ -499,7 +671,10 @@ export default function ProjEdit() {
}}
footer={null}
>
<LoginPage closeModal={() => { setLoginPageOpne(false) }}></LoginPage>
<LoginPage closeModal={() => {
setLoginPageOpne(false)
renderData()
}}></LoginPage>
</Modal>
{/* 第四步 查看 */}
<Modal open={loginPageShowOpne}
@ -521,11 +696,12 @@ export default function ProjEdit() {
destroyOnClose={true}
onCancel={() => {
renderData()
setSoftwareManagementOpen(false);
}}
footer={null}
>
<SoftwareManagement></SoftwareManagement>
<SoftwareManagement isFree={true}></SoftwareManagement>
</Modal>
{/* 第五步 查看 */}
<Modal open={softwareManagementShowOpen}
@ -548,6 +724,7 @@ export default function ProjEdit() {
onCancel={() => {
setDisplayOrderOpen(false);
renderData()
}}
footer={null}
>

View File

@ -3,6 +3,7 @@ import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import { Button, Flex, Form, Input, message, Modal, Spin, Checkbox } from "antd";
import { useContext, useEffect, useState } from "react";
import { get, post } from "../../util/AjaxUtils.ts";
// import {GlobalContext} from "../../context/GlobalContext.ts";
import {
// IProjCharge,
ProjAdditionalType, ProjChargeType
@ -17,6 +18,7 @@ type ProjInfo = {
};
export default function ProjNew() {
// const globalContext = useContext(GlobalContext);
const globalDispatchContext = useContext(GlobalDispatchContext);
const nav = useNavigate();
const pathParams = useParams();
@ -234,9 +236,8 @@ export default function ProjNew() {
open={isCreateModalOpen}
onOk={() => {
// console.log('最终',listProjChargeAdditional);
console.log(belongPeopleInfo.authorId);
// console.log(belongPeopleInfo.authorId);
setIsCreateModalOpen(false);
post<any>({
messageApi,
url: '/api/proj/create',
@ -267,6 +268,10 @@ export default function ProjNew() {
setLoading(false);
}
})
setIsCreateModalOpen(false);
}}
onCancel={() => {
setIsCreateModalOpen(false);
@ -303,7 +308,7 @@ export default function ProjNew() {
}}>
<BelongPeople setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={true}></BelongPeople>
<BelongPeople closeModal = {()=>{setBelongModal(false)}} setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={true}></BelongPeople>
</Modal>
<Spin tip="正在提交..." spinning={loading} fullscreen />
</>

View File

@ -78,8 +78,6 @@ export default function ProjConfigLoginpage(props: any) {
},
onSuccess({ data }) {
setIframeSrcDoc(data.data);
console.log(data);
}
})
}
@ -155,7 +153,10 @@ export default function ProjConfigLoginpage(props: any) {
messageApi,
url: `/api/proj/get/config-loginpage/${projId}`,
onSuccess({ data }) {
console.log('寻找被选中id', data);
console.log('数据', data);
// if(data.adminPassword adminUsername)
form.setFieldValue('adminUsername', data.adminUsername?data.adminUsername:'admin');
form.setFieldValue('adminPassword', data.adminPassword?data.adminPassword:'admin');
if (data.loginpageId) {
form.setFieldValue('loginpageId', data.loginpageId);
setSelectedLoginpageId(data.loginpageId);
@ -168,8 +169,8 @@ export default function ProjConfigLoginpage(props: any) {
form.setFieldValue('subTitle', data.subTitle);
form.setFieldValue('copyrightOwner', data.copyrightOwner);
form.setFieldValue('copyrightDate', data.copyrightDate);
form.setFieldValue('adminUsername', data.adminUsername);
form.setFieldValue('adminPassword', data.adminPassword);
// form.setFieldValue('adminUsername', data.adminUsername?data.adminUsername:'admin');
// form.setFieldValue('adminPassword', data.adminPassword?data.adminPassword:'admin');
preview()
} else {
getDefaultID()

View File

@ -15,8 +15,8 @@ import ConfigModEdit from '../../proj/edit/ProjConfigModEdit.tsx'
export const MAX_MOD_SIZE = 15;
export const MIN_MOD_SIZE = 10
export const MAX_MOD_SIZE_FREE = 3
export const MIN_MOD_SIZE_FREE = 1
export const MAX_MOD_SIZE_FREE = 5
export const MIN_MOD_SIZE_FREE = 3
interface DataType {
projModId: string;
@ -210,7 +210,7 @@ export default function ProjConfigModList(props: PropType) {
<Modal open={configModSaveOpen}
title="新增"
width={1500}
destroyOnClose={true}
onCancel={() => {
setConfigModSaveOpen(false);
}}

View File

@ -849,7 +849,7 @@ export default function ProjEditStep2(props: any) {
</div>
<div className='Step-title' style={{ marginTop: '30px' }}>
<div className='Step-titlel'></div>
<div className='Step-titler'></div>
<div className='Step-titler'></div>
</div>
<div style={{ padding: '22px 15px' }}>
<div style={{ padding: '14px 19px', background: '#F3F3F3', color: '#A3A3A3', fontSize: '14px' }}>