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; } export default function ProjNew() { const [debounceTimer, setDebounceTimer] = useState(null); // 创建一个 ref 来引用推荐列表容器 const recommendListRef = useRef(null); // const [projNameValue, setProjNameValue] = useState(''); const [recommendModal, setRecommendModal] = useState(false) //推荐弹窗 // 土建弹窗输入框内容 const [recommendInput, setRecommendInput] = useState('') // 推荐窗口加载中 // const [ailoading, setAiloading] = useState(false) const [recommendList, setRecommendList] = useState([ // '呵呵呵哒系统', // '坐的我屁股疼系统', // '坐的腰也非常疼系统', // '减肥还是不减肥系统系统', // '我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统我要酷酷吃吃吃吃吃吃系统', // '晚上吃点啥系统', // '晚上吃点啥系统', // '晚上吃点啥系统', // '晚上吃点啥系统', // '晚上吃点啥系统', // '晚上吃点啥系统', // '晚上吃点啥系统', ]) //推荐系统全称列表 // 根据输入内容获取标题 const getRecommendList = () => { // // setRecommendList([]) post({ 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([]) //联想先择的系统名列表 // 获取历史项目名称列表 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([]) //服务包列表 // 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(false); const height = window.innerHeight - 180; // 提示结尾是否带关键字弹窗 // const [hasKeywords, setHasKeywords] = useState(false); // 创建项目弹窗 const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [chargePrice, setChargePrice] = useState(0); const [projInfo, setProjInfo] = useState({ projName: '', projIntroduction: '', belongPeople: '', contacts: '', projDevCompleteDate: '', projVersion: '', backendCodeLang: '', // packageInfoId: '' }); const [form] = Form.useForm(); // 所属者弹窗 const [belongModal, setBelongModal] = useState(false) // 联系人弹窗 const [concatModal, setConcatModal] = useState(false) // const [belongPeopleName ,setBelongPeopleName] = useState('') const [belongPeopleInfo, setBelongPeopleInfo] = useState({ authorName: '', authorType: '', authorIdCardType: '', authorIdCard: '', authorCrcAccount: '', authorId: '', authorProvinceCity: '' }) 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([packageOrderId]); //被选择的而项目 const rowSelection: TableProps['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([]) // 是否可用优惠券 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 = [ { 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
{text}
} }, { title: '下单时间', align: 'center', dataIndex: 'gmtCreate', key: 'packageOrderId', // render: (text: string) => { // return
{text}
// } }, ]; // 获取我得服务包信息 const getPickList = () => { get({ messageApi, url: `/api/proj/servicepkg/packageorder/listpage/${pathParams.projChargeType}/self`, config: { params: { page: page, rows: 5, } }, 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(() => { 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() // console.log() }, []); return ( <> {contextHolder} {/* 首页}, {title: 创建项目}, {title: '新建项目'}, ]} /> */}
{/*
请完善项目的基本信息
*/}
{ // 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" >
系统全称*
name="projName" rules={[ { required: true, message: '请输入系统全称' }, ]} > {/* { // 打印值 // 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”结尾)" /> */} { // 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.setFieldsValue({ // projName: '嘻嘻' // }); setRecommendModal(true) setRecommendList([]) }} style={{ position: 'absolute', right: -35, top: 15, }}>推荐
系统全称建议以“软件”、“系统”、“平台”或“APP”结尾
系统版本*
name="projVersion" >
系统语言*
name="backendCodeLang" rules={[ { required: true, message: '请选择系统语言' }, ]} >
{/*
面向行业/领域*
name="envIndustry" rules={[ { required: true, message: '请选面向行业/领域' }, ]} >
*/}
开发完成时间
// label="开发完成时间" name="projDevCompleteDate" // rules={[{ required: true, message: '请输入开发完成时间' }]} > current && current > dayjs().endOf('day')} />
{/* 服务包 */}
套餐包
name="packageName" rules={[ // { required: true, message: '请选择系统语言' }, ]} > {/* */} 0 ? '请选择套餐包' : '暂无套餐包'} disabled />
{ if (packList.length > 0) { setPackModal(true) setPage(1) setSelectedRowKeys([]) // #1F79FF } else { messageApi.error('无可用套餐包') } }}>选择
{ // setPackageInfoId('') setPackageOrderId('') form.setFieldsValue({ packageName: '' }) setSelectPack(false) // setcouponShow(true) setcouponShow(true) // setShowPrice(location.state.price) }}>取消
优惠券
name="coupon" // rules={[{ required: true, message: '请选择优惠券' }]} >
{ if (hasCoupon) { setCouponModal(true) // #1F79FF } else { messageApi.error('无可用优惠券') } // if (!selectPack) { // if (hasCoupon) { // setCouponModal(true); // } else { // messageApi.error('暂无可用优惠券'); // } // } else { // messageApi.error('服务包已选择,不可使用优惠券'); // } }}>选择
{ setCouponTitle('') setCouponId('') setCouponNum(0) }}>取消
{/*
知识产权选择 :
*/}
知识产权选择
产权所属者*
name="belongPeople" rules={[{ required: true, message: '请选择/创建知识产权所属者' }]} >
{ setBelongModal(true) }}>选择
产权联系人*
name="contacts" rules={[{ required: true, message: '请选择/创建知识产权联系人' }]} >
{ setConcatModal(true) }}>选择
value ? Promise.resolve() : Promise.reject(new Error('请阅读并勾选《软件委托开发协议》')), }, ]} > 我同意平台 { window.open('https://www.aimzhu.com/Seda.html') }}>《软件委托开发协议》
{/*
简单描述
name="projIntroduction" >