system-copyright-react/src/route/proj/ProjNew.tsx

1523 lines
71 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 './proj-new.css';
import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import { Table, AutoComplete, Button, Flex, Form, Input, message, Modal, Spin, Checkbox, DatePicker, Select } from "antd";
import { useContext, useEffect, useState, useRef } from "react";
// import { useLocation } from 'react-router-dom';
import { get, post } from "../../util/AjaxUtils.ts";
// import {GlobalContext} from "../../context/GlobalContext.ts";
import {
// IProjCharge,
ProjAdditionalType, ProjChargeType
} from "../../interfaces/proj/IProj.ts";
import locale from 'antd/es/date-picker/locale/zh_CN';
import { GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
import BelongPeople from '../../components/BelongPeople/BelongPeople.tsx'
import ContactPeople from '../../components/ContactPeople/ContactPeople.tsx'
import dayjs from 'dayjs';
import SelectCouponModal from '../../components/CouponModal/SelectCouponModal.tsx'
// import { key } from 'localforage';
import homes from '../../static/homes.png'
const { TextArea } = Input;
// const { TextArea } = Input;
type ProjInfo = {
projName: string;
projIntroduction: string;
belongPeople: string;
contacts: string;
projDevCompleteDate: string;
coupon?: string;
projVersion: string;
backendCodeLang: string;
envIndustry?: string
packageName?: string
};
import type {
TableColumnsType,
TableProps
} from 'antd';
interface DataType {
key: React.Key;
packageName: string;
packageMoney: number;
packageDescription: string;
packageInfoId: string;
packageOrderId: string;
}
import { useDispatch,useSelector } from 'react-redux'
export default function ProjNew() {
const dispath = useDispatch()
// 更新redux的套餐包信息
const getMyPackNum = () => {
get<any>({
messageApi,
url: `/api/proj/servicepkg/packageorder/count/self`,
onBefore() {
},
onSuccess({ data }) {
dispath({
type: 'upPackNum',
val: {
ALL: data.ALL,
MATERIAL: data.MATERIAL,
}
})
},
onFinally() {
}
})
}
const redxuState: any = useSelector(state => state)
// const [packageType, setPackageType] = useState('')
const packNum = redxuState.packNum
const [packselectShow, setPackselectShow] = useState(false)
const [debounceTimer, setDebounceTimer] = useState<any>(null);
// 创建一个 ref 来引用推荐列表容器
const recommendListRef = useRef<HTMLDivElement>(null);
// const [projNameValue, setProjNameValue] = useState('');
const [recommendModal, setRecommendModal] = useState(false) //推荐弹窗
// 土建弹窗输入框内容
const [recommendInput, setRecommendInput] = useState('')
// 推荐窗口加载中
// const [ailoading, setAiloading] = useState(false)
const [recommendList, setRecommendList] = useState<any[]>([
// '呵呵呵哒系统',
// '坐的我屁股疼系统',
// '坐的腰也非常疼系统',
// '减肥还是不减肥系统系统',
// '我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
// '晚上吃点啥系统',
]) //推荐系统全称列表
// 根据输入内容获取标题
const getRecommendList = () => {
// // setRecommendList([])
post<any>({
messageApi,
url: `/api/proj/recommend/list-proj-name/ai`,
body: {
prompt: recommendInput
},
onBefore() {
setRecommendLoading(true)
},
onSuccess({ data }) {
if (recommendListRef.current) {
recommendListRef.current.scrollTop = 0;
}
// console.log(data);
setRecommendList(data)
},
onFinally() {
setRecommendLoading(false)
},
})
}
const [recommendLoading, setRecommendLoading] = useState(false) //推荐系统全称列表加载状态
const [selectList, setSelectList] = useState<any[]>([]) //联想先择的系统名列表
// 获取历史项目名称列表
const getHistoryList = (value: string) => {
// const encodedValue = encodeURIComponent(value);
get({
messageApi,
url: `/api/proj/recommend/list-proj-name/history`,
config: {
params: {
keywords: value
}
},
onBefore() {
},
onSuccess({ data }: any) {
// console.log(data);
setSelectList(data.map((item: any, index: any) => {
return {
key: index,
value: item
}
}))
},
onFinally() {
},
})
}
const [packList, setPackList] = useState<any[]>([]) //服务包列表
// const location = useLocation();
// const { price } = location.state || {};
// const [showPrice, setShowPrice] = useState(location.state.price) //显示的价格
const [selectPack, setSelectPack] = useState(false) //是否选择了服务器套餐
// 是否显示优惠券
const [couponShow, setcouponShow] = useState(true)
// const globalContext = useContext(GlobalContext);
const dateFormat = 'YYYY年MM月DD日';
const globalDispatchContext = useContext(GlobalDispatchContext);
const nav = useNavigate();
const pathParams = useParams();
const [queryParams] = useSearchParams();
const [messageApi, contextHolder] = message.useMessage();
const [loading, setLoading] = useState<boolean>(false);
const height = window.innerHeight - 180;
// 提示结尾是否带关键字弹窗
// const [hasKeywords, setHasKeywords] = useState<boolean>(false);
// 创建项目弹窗
const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
const [chargePrice, setChargePrice] = useState(0);
const [projInfo, setProjInfo] = useState<ProjInfo>({
projName: '',
projIntroduction: '',
belongPeople: '',
contacts: '',
projDevCompleteDate: '',
projVersion: '',
backendCodeLang: '',
// packageInfoId: ''
});
const [form] = Form.useForm<ProjInfo>();
// 所属者弹窗
const [belongModal, setBelongModal] = useState(false)
// 联系人弹窗
const [concatModal, setConcatModal] = useState(false)
// const [belongPeopleName ,setBelongPeopleName] = useState('')
const [belongPeopleInfo, setBelongPeopleInfo] = useState({
authorName: '',
authorType: '',
authorIdCardType: '',
authorIdCard: '',
authorCrcAccount: 0,
authorId: '',
authorProvinceCity: '',
authorCrcAccountPassword: '',
authorCrcAccountUsername: ''
})
const [concatPeopleInfo, setConcatPeopleInfo] = useState({
applyConcatId: '',
applyContactCsaNo: '',
applyContactEmail: '',
applyContactName: '',
applyContactPhone: '',
applyContactCompany: ''
})
// 优惠券弹窗
const [couponModal, setCouponModal] = useState(false)
// 服务包弹窗
const [packModal, setPackModal] = useState(false)
// 套餐包弹窗表格信息
const [total, setTotal] = useState(0)
const [nowPackageName, setNowPackageName] = useState('') //临时选择名字
// const [nowpackageInfoId, setNowpackageInfoId] = useState('') //临时选择包id
// const [packageInfoId, setPackageInfoId] = useState('') //确定选择包id
const [nowpackageOrderId, setNowpackageOrderId] = useState('') //临时选择订单id
const [packageOrderId, setPackageOrderId] = useState('') //确定选择订单id
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([packageOrderId]); //被选择的而项目
const rowSelection: TableProps<DataType>['rowSelection'] = {
selectedRowKeys,
onChange: (selectedRowKeys: React.Key[], selectedRows: DataType[]) => {
setSelectedRowKeys(selectedRowKeys);
setNowPackageName(selectedRows[0].packageName)
// setNowpackageInfoId(selectedRows[0].packageInfoId)
setNowpackageOrderId(selectedRows[0].packageOrderId)
},
};
const setValue = (value: string) => {
form.setFieldsValue({
belongPeople: value
})
}
const setConcatValue = (value: string) => {
form.setFieldsValue({
contacts: value
})
}
const [createProjId, setCreateProjId] = useState('');
const oldlistProjChargeAdditional: string[] = [];
const [listProjChargeAdditional, setlistProjChargeAdditional] = useState<string[]>([])
// 是否可用优惠券
const [hasCoupon, setHasCoupon] = useState(false)
// 给优惠券栏赋值
const setCouponTitle = (value: string) => {
form.setFieldsValue({
coupon: value
});
}
// 优惠券id
const [couponId, setCouponId] = useState('')
// 优惠券减的钱数
const [couponNum, setCouponNum] = useState(0)
// 查看是否有可用获取优惠券信息
const getCouponData = () => {
get({
messageApi,
url: `/api/coupon/user/listpage/self`,
// url: `/api/proj/refund/apply/listpage?applyStatus=${state.type}`,
config: {
params: {
page: 1,
rows: 10,
isEffective: 1,
isUsed: 0,
}
},
onBefore() {
},
onSuccess(data: any) {
if (data.data.rows.length > 0) {
setHasCoupon(true)
}
},
onFinally() {
},
})
}
//判断是否以“软件”、“系统”、“平台”或“APP”结尾
function isEndsWithKeywords(str: string) {
const keywords = ["软件", "系统", "平台", "APP"];
return keywords.some(keyword => str.endsWith(keyword));
}
// 提示信息是否显示
const [showTip, setShowTip] = useState(false)
const [page, setPage] = useState(1);
const packColumns: TableColumnsType<DataType> = [
{
title: '序号',
dataIndex: 'index',
key: 'packageOrderId',
align: 'center',
render: (_text, _record, index) => (page - 1) * 5 + index + 1, // 显示序号从1开始
},
{
title: '套餐名称',
dataIndex: 'packageName',
key: 'packageOrderId',
// 居中显示
align: 'center',
},
{
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>
// }
},
];
// 获取我得服务包信息
const getPickList = (page: number) => {
get<any>({
messageApi,
url: `/api/proj/servicepkg/packageorder/listpage/self`,
config: {
params: {
page: page,
rows: 5,
keyong: "keyong",
packageType: pathParams.projChargeType,
}
},
onBefore() {
},
onSuccess({ data }) {
// console.log(data);
// const list = data as any;
// setSelectList(data.rows)
setPackList(data.rows)
setTotal(data.total)
// const newPackList = data.rows.map((item: any) => {
// return {
// value: item.packageInfoId,
// label: item.packageName,
// key: item.packageNo,
// }
// });
// //
// setPackList(newPackList);
// setHasMore(data.total / 5 > page);
},
onFinally() {
}
})
}
// useEffect(() => {
// getPickList();
// }, [page]);
// useEffect(() => {
// if(projInfo.packageInfoId == ''){
// setPage(1)
// }
// },[projInfo.packageInfoId])
useEffect(() => {
if(packNum.ALL > 0 && pathParams.projChargeType == 'ALL'){
setPackselectShow(true)
}
if(packNum.MATERIAL > 0 && pathParams.projChargeType == 'MATERIAL'){
setPackselectShow(true)
}
}, [packNum]);
const [languageArray, setLanguageArray] = useState<any[]>([]) //语言列表
useEffect(() => {
get({
messageApi: messageApi,
url: '/api/proj/charge/get',
onSuccess({ data }) {
// console.log(data);
const charge = data as any;
// console.log('创建页price',charge.proj.materialAgent);
let price = 0;
switch (pathParams.projChargeType) {
case ProjChargeType.ALL:
// price = charge.proj.all;
price = charge.projTypes[0].price;
break;
// case ProjChargeType.MATERIAL_AGENT:
// price = charge.proj.materialAgent;
// break;
// case ProjChargeType.MATERIAL_AGENT_URGENT:
// price = charge.proj.materialAgentUrgent;
// break;
case ProjChargeType.MATERIAL:
price = charge.projTypes[1].price;
break;
case ProjChargeType.FREE:
price = charge.projTypes[2].price;
break;
default:
messageApi.error({
type: 'error',
content: '价格类型错误',
})
}
const pkg = queryParams.get('pkg') == 'true' ? true : false
const videoDemo = queryParams.get('videoDemo') == 'true' ? true : false
const urgent = queryParams.get('urgent') == 'true' ? true : false
if (pkg) {
price += charge.additional.pkg;
oldlistProjChargeAdditional.push(ProjAdditionalType.PKG);
// console.log(listProjChargeAdditional);
}
if (videoDemo) {
price += charge.additional.videoDemo;
oldlistProjChargeAdditional.push(ProjAdditionalType.VIDEO_DEMO);
// console.log(listProjChargeAdditional);
}
if (urgent) {
price += charge.additional.urgent;
oldlistProjChargeAdditional.push(ProjAdditionalType.URGENT);
// console.log(listProjChargeAdditional);
}
setChargePrice(price);
setlistProjChargeAdditional(oldlistProjChargeAdditional)
// console.log('传递信息pkg:',pkg,'videoDemo:',videoDemo);
}
})
// console.log('类型', pathParams.projChargeType);
if (pathParams.projChargeType == 'FREE') {
setcouponShow(false)
}
getCouponData()
// console.log('价格', showPrice);
getPickList(1)
// console.log()
get({
messageApi: messageApi,
url: 'api/env/custom/list-active-lang',
onSuccess({ data }:any) {
// setDefultLanguage(data[0])
setLanguageArray(data.map((item:any) => ({ value: item, label: item })));
// console.log(data[0],data.map((item:any) => ({ value: item, label: item })));
}
})
}, []);
return (
<>
{contextHolder}
{/* <Breadcrumb
items={[
{title: <Link to={'/'}>首页</Link>},
{title: <Link to={'/proj-create'}>创建项目</Link>},
{title: '新建项目'},
]}
/> */}
<div className='projNew' style={{ height: `${height}px`, overflow: 'auto' }}>
<div className="proj-new">
{/* <div className="proj-title">请完善项目的基本信息</div> */}
<div className="proj-form" >
<Form
name="basic"
form={form}
initialValues={{
projVersion: 'V1.0',
backendCodeLang: 'JAVA',
}} // 添加 initialValues 属性
layout={'vertical'}
labelCol={{ span: 24 }}
wrapperCol={{ span: 24 }}
style={{ width: '100%' }}
onFinish={(formData) => {
// console.log(formData.projName);
setIsCreateModalOpen(true);
setProjInfo({
projName: formData.projName,
projIntroduction: formData.projIntroduction,
belongPeople: formData.belongPeople,
contacts: formData.contacts,
projDevCompleteDate: formData.projDevCompleteDate,
projVersion: formData.projVersion ? formData.projVersion : 'V1.0',
backendCodeLang: formData.backendCodeLang,
// packageInfoId: formData.packageInfoId?formData.packageInfoId : '',
})
}}
autoComplete="off"
>
<div style={{
width: 800,
marginLeft: 130,
display: 'flex',
justifyContent: 'center',
marginBottom: 30,
fontWeight: 'bold',
fontSize: 18,
marginTop: 5
}}>
<img src={homes} width={19} height={19} style={{
marginTop: 4,
marginRight: 5,
}} alt="" />
<div> </div>
</div>
<div style={{ position: 'relative' }}>
<div className='formItemOne'>
<div className='formItem-title oneTitle'><span style={{ color: 'red' }}>*</span></div>
<Form.Item<ProjInfo>
name="projName"
rules={[
{ required: true, message: '请输入系统全称' },
]}
>
{/* <Input onChange={(e) => {
// 打印值
// console.log(e.target.value);
if (e.target.value) {
if (isEndsWithKeywords(e.target.value)) {
setShowTip(false)
} else {
setShowTip(true)
}
} else {
setShowTip(false)
}
}} style={{ background: '#eeeeee', width: '800px', height: '50px', fontSize: '16px' }} placeholder="请输入系统全称 (注系统全称建议以“软件”、“系统”、“平台”或“APP”结尾)" /> */}
<AutoComplete
className='changeStyle'
allowClear
style={{
// background: '#eeeeee',
// fontSize: '16px',
width: '780px',
height: '42px',
}}
placeholder="请输入系统全称 (注系统全称建议以“软件”、“系统”、“平台”或“APP”结尾)"
options={selectList}
onSearch={(value) => {
// setProjNameValue(value);
if (value) {
if (isEndsWithKeywords(value)) {
setShowTip(false);
} else {
setShowTip(true);
}
} else {
setShowTip(false);
}
}}
onChange={(value) => {
// setProjNameValue(value);
// console.log(value);
if (value) {
// getHistoryList(value);
if (isEndsWithKeywords(value)) {
setShowTip(false);
} else {
setShowTip(true);
}
// 清除之前的定时器
if (debounceTimer) {
clearTimeout(debounceTimer);
}
// 设置新的定时器
const newTimer = setTimeout(() => {
getHistoryList(value);
}, 1000);
// 更新定时器 ID
setDebounceTimer(newTimer);
} else {
setShowTip(false);
setSelectList([])
}
}}
/>
</Form.Item>
</div>
<a
onClick={() => {
// form.setFieldsValue({
// projName: '嘻嘻'
// });
setRecommendModal(true)
setRecommendList([])
}}
style={{
position: 'absolute',
right: -35,
top: 10,
}}></a>
<div style={{
position: 'absolute', left: 165,
display: showTip ? 'unset' : 'none',
color: 'green',
}}>APP</div>
</div>
<div style={{
display: 'flex',
marginTop: 20
}}>
<div className='formItemOne' style={{ position: 'relative' }}>
<div className='formItem-title ' style={{
// position: 'relative',
// background: 'pink',
}}>
</div>
<Form.Item<ProjInfo>
name="belongPeople"
rules={[
// { required: true, message: '请选择/创建知识产权所属者' }
]}
>
<Input style={{ background: '#eeeeee', width: '310px', height: '42px', color: '#3B3B3B' }} placeholder="请选择/创建知识产权所属者" disabled />
</Form.Item>
<div style={{
display: belongPeopleInfo.authorId ? 'none' : 'unset',
position: 'absolute', right: 20,
// fontSize: 16,
color: " #1F79FF", cursor: 'pointer',
// background:'pink',
width: 290,
textAlign: 'right',
}} onClick={() => {
setBelongModal(true)
}}></div>
<div style={{
display: belongPeopleInfo.authorId ? 'unset' : 'none',
position: 'absolute', right: 0,
// fontSize: 16,
color: " #1F79FF", cursor: 'pointer',
// background:'pink',
width: 50,
textAlign: 'center',
}} onClick={() => {
setValue('')
setBelongPeopleInfo({
authorName: '',
authorType: '',
authorIdCardType: '',
authorIdCard: '',
authorCrcAccount: 0,
authorId: '',
authorProvinceCity: '',
authorCrcAccountUsername: '',
authorCrcAccountPassword: '',
})
}}></div>
</div>
<div className='formItemOne' style={{ position: 'relative' }}>
<div className='formItem-title '>
<span style={{ color: 'red' }}>*</span>
</div>
<Form.Item<ProjInfo>
name="contacts"
rules={[{ required: true, message: '请选择/创建知识产权联系人' }]}
>
<Input style={{ background: '#eeeeee', width: '310px', height: '42px', color: '#3B3B3B' }} placeholder="请选择/创建知识产权联系人" disabled />
</Form.Item>
<div style={{
position: 'absolute', right: 20,
// fontSize: 16,
color: " #1F79FF", cursor: 'pointer',
width: 290,
textAlign: 'right',
}} onClick={() => {
setConcatModal(true)
}}></div>
</div>
</div>
<div style={{
display: 'flex',
marginTop: 20
}}>
<div className='formItemOne' style={{}}>
<div className='formItem-title oneTitle'><span style={{ color: 'red' }}>*</span></div>
<Form.Item<ProjInfo>
name="projVersion"
>
<Input
style={{
// background: '#eeeeee',
width: '310px', height: '42px',
// fontSize: '16px'
}} placeholder="请输入系统版本 (注默认版本为v1.0)" />
</Form.Item>
</div>
<div className='formItemOne' style={{}}>
<div className='formItem-title oneTitle'><span style={{ color: 'red' }}>*</span></div>
<Form.Item<ProjInfo>
name="backendCodeLang"
rules={[
{ required: true, message: '请选择系统语言' },
]}
>
<Select
style={{
width: '310px', height: '42px',
// fontSize: '16px',
}}
placeholder="请选择系统语言"
className='langselect'
// defaultValue="JAVA"
// options={[
// { value: 'JAVA', label: 'JAVA' },
// // { value: 'NODE', label: 'NODE(JAVASCRIPT)' },
// // { value: 'PYTHON', label: 'PYTHON' },
// // { value: 'GO', label: 'GO' },
// ]}
options={languageArray}
>
</Select>
</Form.Item>
</div>
</div>
<div style={{
display: 'flex',
marginTop: 20
}}>
{/* <div className='formItemOne' style={{}}>
<div className='formItem-title oneTitle'>面向行业/领域*</div>
<Form.Item<ProjInfo>
name="envIndustry"
rules={[
{ required: true, message: '请选面向行业/领域' },
]}
>
<Select
style={{ width: '310px', height: '50px', fontSize: '16px', }}
placeholder="请选面向行业/领域"
className='langselect'
// defaultValue="JAVA"
options={[
{ value: '1', label: '中小企业' },
{ value: '2', label: '事业单位' },
{ value: '3', label: '个人' },
]}
>
</Select>
</Form.Item>
</div> */}
<div className='formItemOne' style={{}}>
<div className='formItem-title '>
</div>
<Form.Item<ProjInfo>
// label="开发完成时间"
name="projDevCompleteDate"
// rules={[{ required: true, message: '请输入开发完成时间' }]}
>
<DatePicker placeholder="请选择开发完成日期"
className='detaPicker'
format={dateFormat}
locale={locale}
// style={{ width: '100%' }}
style={{
height: '42px', width: '310px',
// fontSize: 16,
// background: '#eeeeee',
}}
disabledDate={(current) => current && current > dayjs().endOf('day')}
/>
</Form.Item>
</div>
{/* 服务包 */}
<div style={{
display: couponId || pathParams.projChargeType == 'FREE' ? 'none' : 'unset'
}}>
<div className='formItemOne' >
<div className='formItemOne' style={{ position: 'relative' }}>
<div className='formItem-title oneTitle'></div>
<Form.Item<ProjInfo>
name="packageName"
rules={[
// { required: true, message: '请选择系统语言' },
]}
>
{/* <Select
disabled={packList.length > 0 ? false : true}
style={{ width: '310px', height: '50px', fontSize: '16px', }}
placeholder={packList.length > 0 ? '请选择服务包' : '暂无服务包'}
className='langselect'
// defaultValue="JAVA"
options={packList}
allowClear
onChange={(value) => {
if (value) {
setShowPrice(0)
setSelectPack(true)
setcouponShow(false)
} else {
setShowPrice(location.state.price)
setSelectPack(false)
setcouponShow(true)
}
}}
>
</Select> */}
<Input
className="custom-input"
style={{
// background: '#eeeeee',
// fontSize: 16,
width: '310px', height: '42px', color: '#3B3B3B'
}}
// placeholder={packList.length > 0 ? '请选择套餐包' : '暂无套餐包'}
placeholder={packselectShow ? '请选择套餐包' : '暂无套餐包'}
disabled
/>
</Form.Item>
<div style={{
position: 'absolute',
// left: 165,
left: 158,
top: 40,
// display: showTip ? 'unset' : 'none',
color: 'red',
fontSize: 18,
fontWeight: 'bold',
}}></div>
<div
style={{
display: selectPack ? 'none' : 'unset', position: 'absolute', right: 23,
// fontSize: 16,
// color: packList.length ? '#1F79FF' : '#676767', cursor: 'pointer',
color: packselectShow ? '#1F79FF' : '#676767', cursor: 'pointer',
// background:'pink',
width: 290,
textAlign: 'right',
}}
onClick={() => {
if (packList.length > 0) {
setPackModal(true)
setPage(1)
setSelectedRowKeys([])
getPickList(1)
// #1F79FF
} else {
messageApi.error('无可用套餐包')
}
}}></div>
<div style={{ display: selectPack ? 'unset' : 'none', position: 'absolute', right: 23, color: '#1F79FF', cursor: 'pointer' }} onClick={() => {
// setPackageInfoId('')
setPackageOrderId('')
setNowpackageOrderId('')
setNowPackageName ('')
form.setFieldsValue({
packageName: ''
})
setSelectPack(false)
// setcouponShow(true)
setcouponShow(true)
// setShowPrice(location.state.price)
}}></div>
</div>
</div>
</div>
</div>
<div style={{
display: 'flex',
marginTop: 20
}}>
<div style={{ display: couponShow ? 'unset' : 'none' }}>
<div className='formItemOne' style={{ position: 'relative' }}>
<div className='formItem-title '>
</div>
<Form.Item<ProjInfo>
name="coupon"
// rules={[{ required: true, message: '请选择优惠券' }]}
>
<Input style={{
background: '#eeeeee',
// fontSize: 16,
width: '310px', height: '42px', color: '#3B3B3B'
}} placeholder={hasCoupon ? '请选择优惠券' : '暂无可用优惠券'} disabled />
</Form.Item>
<div style={{
display: couponId ? 'none' : 'unset', position: 'absolute', right: 23,
// fontSize: 16,
color: hasCoupon ? '#1F79FF' : '#676767', cursor: 'pointer',
width: 290,
textAlign: 'right',
}} onClick={() => {
if (hasCoupon) {
setCouponModal(true)
// #1F79FF
} else {
messageApi.error('无可用优惠券')
}
// if (!selectPack) {
// if (hasCoupon) {
// setCouponModal(true);
// } else {
// messageApi.error('暂无可用优惠券');
// }
// } else {
// messageApi.error('服务包已选择,不可使用优惠券');
// }
}}></div>
<div style={{ display: couponId ? 'unset' : 'none', position: 'absolute', right: 23, fontSize: 16, color: '#1F79FF', cursor: 'pointer' }} onClick={() => {
setCouponTitle('')
setCouponId('')
setCouponNum(0)
}}></div>
</div>
</div>
</div>
{/* <div style={{
marginLeft: 50,
// fontWeight: 'bold',
fontSize: 16,
marginTop: 5,
color: 'green',
fontWeight: 'bold',
}}>知识产权选择 : </div> */}
{/* <div style={{
height: 2,
background: '#E9E9E9',
// width: 900,
marginLeft: 50,
marginTop: 20,
marginBottom: 20,
}}></div> */}
{/* <div style={{
width: 800,
marginLeft: 130,
display: 'flex',
justifyContent: 'center',
marginBottom: 30,
fontWeight: 'bold',
fontSize: 18,
marginTop: 20
}}>
<img src={homes} width={19} height={19} style={{
marginTop: 4,
marginRight: 5,
}} alt="" />
<div> 知识产权</div>
</div> */}
<div className='software-protocol'>
<Form.Item
name="agreement"
valuePropName="checked"
rules={[
{
validator: (_, value) =>
value ? Promise.resolve() : Promise.reject(new Error('请阅读并勾选《软件委托开发协议》')),
},
]}
>
<Checkbox>
<a onClick={() => {
window.open('https://www.aimzhu.com/Seda.html')
}}></a>
</Checkbox>
</Form.Item>
</div>
<div style={{
height: 2,
background: '#E9E9E9',
// width: 900,
marginLeft: 50,
marginTop: 20,
marginBottom: 20,
}}></div>
{/* <div className='formItemTwo'>
<div className='formItem-title '>简单描述</div>
<Form.Item<ProjInfo>
name="projIntroduction"
>
<TextArea rows={10} style={{ background: '#eeeeee', resize: 'none',width:"328px",height:'220px',fontSize:'16px' }} placeholder="请对系统作出简单的描述,以使可准确生成资料..." />
</Form.Item>
</div> */}
<div style={{ marginTop: '' }}>
<div style={{
// background: 'pink',
display: 'flex',
justifyContent: 'space-evenly',
// alignItems: 'center',
}}>
<div style={{
fontSize: 30,
// color:'red',
fontWeight: 'bold',
// background:'pink',
lineHeight: '40px'
}}>
<span
style={{
color: 'red',
}}
>
{/* {(showPrice / 100 - couponNum) < 0 ? 0 : showPrice / 100 - couponNum} */}
{selectPack ? 0 : (chargePrice / 100 - couponNum) < 0 ? 0 : chargePrice / 100 - couponNum}
</span>
</div>
<div style={{
// background:'skyBlue',
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
// width:200,
}}>
<Form.Item>
<Flex align="center" justify="center" gap="large">
<Button type="primary" htmlType="submit"
size='large'
// style={{
// backgroundColor: 'var(--color-primary)', width: '216px',
// height: '50px', fontSize: '16px', marginLeft: '53px'
// }}
// onClick={()=>{
// // 打印
// }}
>
</Button>
<Button
style={{
marginLeft: 10,
}}
size='large'
type="default" htmlType="button" onClick={() => {
nav(-1);
}}
>
</Button>
</Flex>
</Form.Item>
</div>
</div>
</div>
</Form>
</div>
</div>
</div>
<Modal title="提示"
centered
okText="确定"
cancelText="取消"
open={isCreateModalOpen}
onOk={() => {
// console.log('最终',listProjChargeAdditional);
// console.log(belongPeopleInfo.authorId);
post<any>({
messageApi,
url: '/api/proj/create',
body: {
// packageInfoId: projInfo.packageInfoId,
projName: projInfo.projName,
projVersion: projInfo.projVersion,
backendCodeLang: projInfo.backendCodeLang,
projChargeType: pathParams.projChargeType,
listProjChargeAdditional: listProjChargeAdditional,
// dayjs(formInfo.getFieldValue('projDevCompleteDate')).format(dateFormat),
projDevCompleteDate: projInfo.projDevCompleteDate ? dayjs(projInfo.projDevCompleteDate).format(dateFormat) : '',
authorCrcAccount: belongPeopleInfo.authorCrcAccount,
authorCrcAccountPassword: belongPeopleInfo.authorCrcAccountPassword,
authorCrcAccountUsername: belongPeopleInfo.authorCrcAccountUsername,
authorId: belongPeopleInfo.authorId,
authorIdCard: belongPeopleInfo.authorIdCard,
authorIdCardType: belongPeopleInfo.authorIdCardType,
authorName: belongPeopleInfo.authorName,
authorProvinceCity: belongPeopleInfo.authorProvinceCity,
authorType: belongPeopleInfo.authorType,
applyContactCompany: concatPeopleInfo.applyContactCompany,
applyContactCsaNo: concatPeopleInfo.applyContactCsaNo,
applyContactEmail: concatPeopleInfo.applyContactEmail,
applyContactId: concatPeopleInfo.applyConcatId,
applyContactName: concatPeopleInfo.applyContactName,
applyContactPhone: concatPeopleInfo.applyContactPhone,
couponId: couponId ? couponId : '',
// packageInfoId: packageInfoId ? packageInfoId : ''
packageOrderId: packageOrderId ? packageOrderId : '',
},
onBefore() {
setLoading(true);
},
onSuccess({ data }) {
setIsEditModalOpen(true);
setCreateProjId(data.data);
reloadUser(messageApi, globalDispatchContext).then(() => {
messageApi.success('扣款成功');
});
getMyPackNum()
},
onFinally() {
setLoading(false);
}
})
setIsCreateModalOpen(false);
}}
onCancel={() => {
setIsCreateModalOpen(false);
}}>
<div>
{/* {(chargePrice / 100 - couponNum) < 0 ? 0 : chargePrice / 100 - couponNum} */}
{selectPack ? 0 : (chargePrice / 100 - couponNum) < 0 ? 0 : chargePrice / 100 - couponNum}
</div>
</Modal>
<Modal title="提示"
okText="确定"
cancelText="取消"
centered
open={isEditModalOpen}
onOk={() => {
sessionStorage.setItem('projName', projInfo.projName);
sessionStorage.setItem('projStatus','编辑')
if (pathParams.projChargeType == ProjChargeType.ALL) {
nav(`/proj-eall/${createProjId}`);
} else if (pathParams.projChargeType == ProjChargeType.FREE) {
nav(`/proj-efree/${createProjId}`);
} else {
nav(`/proj-edit/${createProjId}`);
}
}}
onCancel={() => {
setIsEditModalOpen(false);
}}>
<div></div>
</Modal>
{/* <Modal title="提示"
okText="更改"
cancelText="继续"
open={hasKeywords}
onOk={() => {
//Form表单的projName变为空
form.resetFields(['projName']);
setHasKeywords(false);
}}
centered
onCancel={() => {
setHasKeywords(false);
setIsCreateModalOpen(true);
}}>
<div>系统全称建议以“软件”、“系统”、“平台”或“APP”结尾是否更改</div>
</Modal> */}
<Modal title="选择联系人"
destroyOnClose
centered
open={concatModal}
width={1200}
footer={null}
onCancel={() => {
setConcatModal(false)
}}>
<ContactPeople isShow={true} closeModal={() => { setConcatModal(false) }} setConcatPeopleInfo={setConcatPeopleInfo} concatPeopleInfo={concatPeopleInfo} setConcatValue={setConcatValue}></ContactPeople>
</Modal>
<Modal title="选择所属者"
destroyOnClose
centered
open={belongModal}
width={1200}
footer={null}
onCancel={() => {
setBelongModal(false)
}}>
<BelongPeople closeModal={() => { setBelongModal(false) }} setBelongPeopleInfo={setBelongPeopleInfo} belongPeopleInfo={belongPeopleInfo} setValue={setValue} isShow={true}></BelongPeople>
</Modal>
<Modal title="选择优惠券"
destroyOnClose
centered
open={couponModal}
width={809}
footer={null}
onCancel={() => {
setCouponModal(false)
}}>
<SelectCouponModal
couponId={couponId}
setCouponId={(value: string) => {
setCouponId(value)
}}
couponNum={couponNum}
setCouponNum={(value: number) => {
setCouponNum(value)
}}
setCouponTitle={(value: string) => {
setCouponTitle(value)
}}
closeModal={() => {
setCouponModal(false)
}}
></SelectCouponModal>
</Modal>
<Modal title="选择套餐包"
destroyOnClose
centered
open={packModal}
width={809}
footer={null}
onCancel={() => {
setPackModal(false)
setNowPackageName('')
// setNowpackageInfoId('')
setNowpackageOrderId('')
// setPage(1)
}}>
<div>
<Table
columns={packColumns}
dataSource={packList}
rowSelection={{
...rowSelection,
// selectedRowKeys,
type: 'radio', // 设置为单选
// onChange: (selectedRowKeys: React.Key[], selectedRows: DataType[]) => {
// setSelectedRowKeys(selectedRowKeys);
// },
}}
pagination={{
defaultPageSize: 5, // 设置默认一页显示 5 条数据,
current: page,
total: total,
onChange: (page: number) => {
setPage(page)
getPickList(page)
// console.log(page);
}
}}
rowKey="packageOrderId"
onRow={(record) => {
return {
onClick: (event: React.MouseEvent<HTMLTableRowElement>) => {
event.stopPropagation();
// setPackSelectNo(record.packageInfoId)
setSelectedRowKeys([record.packageOrderId]);
setNowPackageName(record.packageName)
// setNowpackageInfoId(record.packageInfoId)
setNowpackageOrderId(record.packageOrderId)
},
style: { cursor: 'pointer' } // 鼠标显示为小手
};
}}
/>
<div style={{
display: 'flex',
justifyContent: 'flex-end',
marginTop: 10,
}}>
<Button onClick={() => {
setPackModal(false)
setNowPackageName('')
// setNowpackageInfoId('')
setNowpackageOrderId('')
}}></Button>
<Button
style={{
marginLeft: 10
}}
type="primary"
onClick={() => {
if (!nowPackageName) {
messageApi.error('请选择套餐包')
return
}
// setPickSelectNo(nowPickSelectNo)
// setShowPrice(0)
setSelectPack(true)
setcouponShow(false)
// setPackageInfoId(nowpackageInfoId)
setPackageOrderId(nowpackageOrderId)
form.setFieldsValue({
packageName: nowPackageName
})
setPackModal(false)
}}></Button>
</div>
</div>
</Modal>
<Modal title="推荐系统全称"
destroyOnClose
centered
open={recommendModal}
width={600}
footer={null}
onCancel={() => {
setRecommendModal(false)
}}>
<Spin tip="正在生成..." spinning={recommendLoading} >
<TextArea
placeholder='请简单介绍您想创建的系统,我们会根据您的描述为您推荐系统全称'
// 禁止下拉标
style={{
resize: 'none',
height: 133,
fontSize: 16,
padding: 20,
}}
// 回车事件
onKeyDown={(e) => {
if (e.keyCode == 13) {
// 禁止默认回车事件
e.preventDefault();
getRecommendList()
}
}}
onChange={(e) => {
// console.log(e.target.value);
setRecommendInput(e.target.value)
}}
/>
<div style={{
display: recommendList.length > 0 ? 'unset' : 'none',
}}>
<div style={{
marginTop: 10,
fontSize: 16,
fontWeight: 'bold',
}}>
</div>
<div
ref={recommendListRef}
style={{
display: 'flex',
alignItems: 'center',
flexDirection: 'column',
// background: 'pink',
paddingBottom: 10,
height: 300,
overflowY: 'scroll',
}}>
{
recommendList.map((item, index) => {
return (
<div key={index}
title={item}
style={{
fontSize: 18,
marginTop: 10,
cursor: 'pointer',
width: '100%',
background: '#F3F3F3',
padding: 10,
boxSizing: 'border-box',
textAlign: 'center',
// // 禁止换行 唱出部分用...代替
// whiteSpace: 'nowrap',
// overflowY: 'hidden',
// textOverflow: 'ellipsis',
// lineHeight: '20px',
}}
onClick={() => {
form.setFieldsValue({
projName: item
});
if (isEndsWithKeywords(item)) {
setShowTip(false);
} else {
setShowTip(true);
}
messageApi.success(`已选择${item}`);
setRecommendModal(false)
}}
>
{item}
</div>
)
})
}
</div>
</div>
<div style={{
// textAlign: 'right',
marginTop: 10,
// background: '#F3F3F3',
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
}}>
<div style={{
fontSize: 16,
fontWeight: 'bold',
}}>
<div><span style={{
color: 'red',
}}> </span> </div>
<div style={{
color:'#1677ff',
}}></div>
</div>
<Button type="primary"
style={{
width: 100,
}}
onClick={() => {
getRecommendList()
}}
>{
recommendList.length > 0 ? '换一批' : '生成'
}</Button>
</div>
</Spin>
</Modal>
<Spin tip="正在提交..." spinning={loading} fullscreen />
</>
)
}