system-copyright-react/src/route/ProductRelease/ProductRelease.tsx
2025-06-04 10:52:03 +08:00

826 lines
29 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

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

// import React from 'react'
import './product-release.css'
import {
// Select, DatePicker, Button,
// message,
// Checkbox,
Empty,
// Switch,
Modal, Pagination, Image,
Spin,
Button
} from 'antd';
import { DeleteOutlined } from '@ant-design/icons';
import { getGoodsList, submitAudit, putOnShelf, putOffShelf, deleteGoods, getSoftTypeList } from '../../request/api'
import { showImage } from '../../request/request'
import EditModal from './components/EditModal/EditModal'
import useMessage from "antd/es/message/useMessage";
// import type { CheckboxProps } from 'antd';
// import {
// // SearchOutlined,
// ClearOutlined
// } from '@ant-design/icons';
import { useLocation } from 'react-router-dom';
// import type { DatePickerProps } from 'antd';
// import locale from 'antd/es/date-picker/locale/zh_CN';
import { useState, useEffect } from 'react';
import dayjs, { } from 'dayjs';
export default function ProductRelease() {
const [reasonModalOpen, setReasonModalOpen] = useState(false) // 未通过原因弹窗
const [goodsCheckRemark, setGoodsCheckRemark] = useState('') // 未通过原因
const [messageApi, messageContext] = useMessage();
const { state } = useLocation()
// const dateFormat = 'YYYY年MM月DD日';
const sellBelongType = state ? state.sellBelongType : ''; // 所属人类型
const sellDate = state ? state.sellDate : ''; // 日期
// const sellDate = state?dayjs(state.sellDate).format(dateFormat) : ''; // 日期
const language = state ? state.language : ''; // 开发者语言
// const sellBoxtype = state ? state.sellBoxtype : ''; //软著类型
const sellKeywords = state ? state.sellKeywords : ''; // 搜索关键字
useEffect(() => {
// console.log('sellBelongType', sellBelongType);
// console.log('sellDate', sellDate);
// console.log('language', language);
// console.log('sellBoxtype', sellBoxtype);
// console.log('sellKeywords', sellKeywords);
// if (sellDate) {
// console.log('sellDate', dayjs(sellDate).year());
// }
setPage(1)
getGoodsDate(1)
}, [state])
const height = window.innerHeight - 180;
// const [messageApi, contextHolder] = message.useMessage();
// const [belongType, setBelongType] = useState<any>() // 所属人类型
// const [date, setDate] = useState<any>() // 日期
// const [language, setLanguage] = useState<any>() // 开发者语言
// const [type, setType] = useState<any>() //软著类型
const [page, setPage] = useState(1) // 分页
const [total, setTotal] = useState(0) // 总条数
const [editModalOpen, setEditModalOpen] = useState(false) // 控制编辑弹窗
const [delModalOpen, setDelModalOpen] = useState(false) // 控制删除弹窗
const [sellModalOpen, setSellModalOpen] = useState(false) // 控制上架弹窗
const [offModalOpen, setOffModalOpen] = useState(false) // 控制下架弹窗
const [id, setId] = useState<any>('') // 编辑id
const [loading, setLoading] = useState(false) // 加载
const [data, setData] = useState<any>([])
// 点击编辑
const edit = (item: any) => {
// console.log(item.goodsId);
setEditModalOpen(true)
setId(item.goodsId)
};
// 删除id
const [delId, setDelId] = useState('')
// 删除商品名字
// const [delName, setDelName] = useState('')
// 点击删除
const del = (item: any) => {
// console.log(item.order);
setDelId(item.goodsId)
// setDelName(item.goodsName)
setDelModalOpen(true)
};
// 点击确定删除
const delOk = async () => {
try {
await deleteGoods(delId)
// setData((prevData: any) => {
// return prevData.filter((dataItem: any) => dataItem.goodsId !== delId)
// })
setDelModalOpen(false)
messageApi.open({
type: 'success',
content: '删除成功',
})
getGoodsDate(page)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
// 下架id
const [offId, setOffId] = useState('')
// 下架商品名字
const [offName, setOffName] = useState('')
// 点击下架
const off = (item: any) => {
setOffId(item.goodsId)
setOffName(item.goodsName)
setOffModalOpen(true)
};
// 点击确定下架
const offOk = async () => {
try {
await putOffShelf(offId)
setData((prevData: any) => {
return prevData.map((dataItem: any) => {
if (dataItem.goodsId == offId) {
return {
...dataItem,
goodsStatus: 0
};
}
return dataItem;
});
})
// console.log('setData', data);
setOffModalOpen(false)
messageApi.open({
type: 'success',
content: '下架成功',
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
// 上架id
const [sellId, setSellId] = useState('')
// 上架商品名字
const [sellName, setSellName] = useState('')
// 点击上架
const sell = (item: any) => {
setSellId(item.goodsId)
setSellName(item.goodsName)
setSellModalOpen(true)
};
// 点击确定上架
const sellOk = async () => {
try {
await putOnShelf(sellId)
setData((prevData: any) => {
return prevData.map((dataItem: any) => {
if (dataItem.goodsId === sellId) {
return {
...dataItem,
goodsStatus: 1
};
}
return dataItem;
});
})
setSellModalOpen(false)
messageApi.open({
type: 'success',
content: '上架成功',
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const [submitModalOpen, setSubmitModalOpen] = useState(false) // 控制提交审核弹窗
const [submitId, setSubmitId] = useState('') // 提交审核id
const [submitName, setSubmitName] = useState('') // 提交审核名字
// 点击提交审核
const submit = async (item: any) => {
// console.log(item);
setSubmitName(item.goodsName)
setSubmitId(item.goodsId)
setSubmitModalOpen(true)
};
// 点击确定提交
const submitAuditOk = async () => {
try {
await submitAudit(submitId)
setData((prevData: any) => {
return prevData.map((dataItem: any) => {
if (dataItem.goodsId === submitId) {
return {
...dataItem,
goodsCheckStatus: 1
};
}
return dataItem;
});
});
setSubmitModalOpen(false)
messageApi.open({
type: 'success',
content: '提交审核成功',
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const [selectTypeArray, setSelectTypeArray] = useState<any>([]) // 选择的软著类型
const getGoodsDate = async (page: number) => {
try {
setLoading(true)
const res: any = await getGoodsList({
page: page,
rows: 20,
// sellBelongType: sellBelongType,
// sellDate: sellDate,
// language: language,
// sellBoxtype: sellBoxtype,
// sellKeywords: sellKeywords,
keywords: sellKeywords ? sellKeywords : '',
goodsLeaderType: sellBelongType ? sellBelongType : '',
goodsGetTime: sellDate ? dayjs(sellDate).year() : '',
goodsDevelop: language ? language : '',
// goodsType: sellBoxtype ? sellBoxtype.join(',') : '',
goodsType: selectTypeArray.length > 0 ? selectTypeArray.join(',') : '',
})
setPage(res.page)
setData(res.rows)
setTotal(res.total)
setLoading(false)
// console.log(res);
if (res.rows.length <= 0) {
if (page > 1) {
setPage(page - 1)
getGoodsDate(page - 1)
}
}
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
} finally {
setLoading(false)
}
}
const [softTypeList, setSoftTypeList] = useState<any>([]) // 软著类型列表
// 获取软著类型列表
const getSoftTypeListDate = async () => {
try {
const res: any = await getSoftTypeList()
// console.log('软著类型列表', res);
// setSoftTypeList(res.map((item: any) => {
// return {
// value: item.dataId,
// label: item.dataName,
// }
// }))
setSoftTypeList(res)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
useEffect(() => {
getGoodsDate(page)
}, [page])
useEffect(() => {
getGoodsDate(1)
setPage(1)
}, [selectTypeArray])
useEffect(() => {
getSoftTypeListDate()
}, [])
return (
<div className='product-release' style={{ height: `${height}px`, overflow: 'auto' }}>
{messageContext}
<div>
{/* 表格 */}
<div className='product-release-table' style={{ height: `${height - 80}px` }}>
<Spin tip="正在加载..." size="small" spinning={loading}>
<div style={{ height: `${height - 80}px`, overflow: 'auto', position: 'relative' }}>
<div className='goodsTypeArrayBox'>
<div className='goodsTypeTitle'> : </div>
<div className='goodsTypeArray'>
{softTypeList.map((item: any) => {
return (
<div className='typeName'
key={item.dataId}
style={{
color: selectTypeArray.includes(item.dataId) ? '#E73B3B' : '#707070',
}}
onClick={() => {
if (selectTypeArray.includes(item.dataId)) {
setSelectTypeArray(selectTypeArray.filter((typeId: any) => typeId !== item.dataId))
} else {
setSelectTypeArray([...selectTypeArray, item.dataId])
}
}}
>
{item.dataName}
</div>
)
})}
</div>
</div>
{/* {data.length <= 0 ? (
<div className='nodata' style={{ height: `${height - 93}px` }}>
<Empty
description={
'暂无数据'
} />
</div>) : (
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead >
<tr style={{ background: '#F7F7F7', height: 32, fontSize: 14 }}>
<th style={{ width: 50 }}>序号</th>
<th style={{ width: 110 }}></th>
<th>软著名称</th>
<th>软著版本</th>
<th>售卖价格</th>
<th>截止售卖时间</th>
<th>平台审核</th>
<th>操作</th>
</tr>
</thead>
<tbody style={{ color: '#888888' }}>
{data.map((item: any, index: any) => {
return (
<React.Fragment key={item.goodsId}>
<tr style={{ height: 15 }}>
<td colSpan={9} style={{ border: 'none' }}>
</td>
</tr>
<tr style={{ background: '#F7F7F7', height: 45 }}>
<td colSpan={9}>
<span style={{ marginLeft: 55 }}>
编号 : {item.goodsNumber}
</span>
<span style={{ marginLeft: 45 }}>
软著取得时间 : {item.goodsGetTime}
</span>
</td>
</tr>
<tr style={{ textAlign: 'center', height: 110, maxWidth: 110 }}>
<td>{(page - 1) * 10 + index + 1}</td>
<td className='product-release-table-img-td'>
<div className='product-release-table-img'>
<Image src={showImage(item.goodsPhoto, false)} height={90} preview={{
mask: '查看',
}}
style={{ maxWidth: '100%' }}
></Image>
</div>
</td>
<td className='product-release-table-name-td'>
{item.goodsName}
</td>
<td>{item.goodsVersion}</td>
<td style={{ fontSize: 24, color: '#FF5D15' }}>{item.goodsPrice}</td>
<td>{item.goodsLastTime}</td>
<td style={{
fontWeight: 'bold',
}}>
{item.goodsCheckStatus == '0' ?
<div>
<div style={{
color: 'red',
cursor: 'pointer',
}}
title='点击查看未通过原因'
onClick={() => {
setGoodsCheckRemark(item.goodsCheckRemark)
setReasonModalOpen(true)
}}
> 未通过 </div>
<div style={{
fontSize: 12
}}>(点击查看原因)</div>
</div>
: item.goodsCheckStatus == '1' ?
<span style={{ color: 'skyBlue' }}> 审核中 </span>
: item.goodsCheckStatus == '2' ?
<span style={{ color: 'green' }}> 已通过 </span>
: '未提交'}</td>
<td style={{
width: 250,
}}>
<div>
<span className='product-release-table-btn'
style={{
display: item.goodsStatus == '1' ? 'none' : 'unset'
}}
onClick={() => {
edit(item)
}}>编辑</span>
<span className='product-release-table-btn product-btn' style={{
display: item.goodsCheckStatus == '1' || item.goodsCheckStatus == '2' ? 'none' : 'unset'
}} onClick={() => submit(item)}>提交审核</span>
<span className='product-release-table-btn product-btn ' style={{
display: item.goodsStatus == 0 ? 'unset' : 'none'
}} onClick={() => del(item)}>删除</span>
<span className='product-release-table-btn product-btn ' style={{
display: item.goodsStatus == '0' && item.goodsCheckStatus == '2' ? 'unset' : 'none'
}} onClick={() => sell(item)}>上架</span>
<span className='product-release-table-btn product-btn '
style={{
display: item.goodsStatus == '0' || item.goodsOrderStatus == '1' ? 'none' : 'unset'
}}
onClick={() => off(item)}>下架</span>
<span style={{
display: item.goodsOrderStatus == '1' ? 'unset' : 'none',
}}>
正在交易中...
</span>
</div>
</td>
</tr>
</React.Fragment>
)
})}
</tbody>
</table>
)
} */}
{data.length <= 0 ? (
<div className='nodata' style={{ height: `${height - 93}px` }}>
<Empty
description={
'暂无数据'
} />
</div>) : (
<div className='showGoodsBox'>
{data.map((item: any) => {
return (
<div className='goodSBox' key={item.goodsId}>
<div className='delBtn' title='删除'
style={{
display: item.goodsStatus == 0 ? 'unset' : 'none'
}}
onClick={
() => del(item)
}>
<div className='delBtnIcons'>
<DeleteOutlined />
</div>
</div>
<div className='goodsImg'>
<Image src={showImage(item.goodsLocalPhoto, false)} width={'100%'} preview={{
mask: '查看',
}}
style={{ maxWidth: '100%' }}
></Image>
<div className='goodsTime'>
: {item.goodsLastTime}
</div>
</div>
<div className='goodsBot'>
<div className='goodsNameBox'>
{/* <div className='tipsPrice'>特价</div> */}
<div className='goodsName' title={item.goodsName}>{item.goodsName}</div>
</div>
<div className='goodsPrice'>
<div>
<span style={{
fontSize: 20,
}}></span>
<span>{item.goodsPrice}</span>
</div>
<div className='goodsStatus' >
{item.goodsCheckStatus == '0' ?
<div>
<div style={{
color: 'red',
cursor: 'pointer',
}}
title='点击查看未通过原因'
onClick={() => {
setGoodsCheckRemark(item.goodsCheckRemark)
setReasonModalOpen(true)
}}
> </div>
{/* <div style={{
fontSize: 12
}}>(点击查看原因)</div> */}
</div>
: item.goodsCheckStatus == '1' ?
<span style={{ color: 'skyBlue' }}> </span>
: item.goodsCheckStatus == '2' ?
<span style={{ color: 'green' }}> </span>
: <span style={{ color: 'rgb(155, 155, 155)' }}> </span>}
</div>
</div>
<div className='goodsBtnBox'>
<Button className='goodsBtn' style={{
display: item.goodsStatus == '1' ? 'none' : 'unset',
width: '80px'
}}
onClick={() => {
edit(item)
}}></Button>
<Button className='goodsBtn' type="primary" style={{
width: '163px',
background: '#0FADAB',
display: item.goodsCheckStatus == '1' || item.goodsCheckStatus == '2' ? 'none' : 'unset'
}} onClick={() => submit(item)}></Button>
<Button className='goodsBtn' type="primary" style={{
width: '80px',
display: item.goodsStatus == '0' && item.goodsCheckStatus == '2' ? 'unset' : 'none'
}} onClick={() => sell(item)}></Button>
<Button className='goodsBtn' type="primary" style={{
width: '80px',
background:'rgb(248, 97, 97)',
display: item.goodsStatus == '0' || item.goodsOrderStatus == '3'|| item.goodsOrderStatus == '4' ? 'none' : 'unset'
}}
onClick={() => off(item)}></Button>
<div className='goodsBtnIng' style={{
display: item.goodsOrderStatus == '3' ? 'unset' : 'none'
}}>
...
</div>
<div className='goodsBtnIng' style={{
display: item.goodsOrderStatus == '4' ? 'unset' : 'none'
}}>
</div>
</div>
</div>
</div>
)
})}
{/* <div className='goodSBox'>
<div className='goodsImg'>
</div>
<div className='goodsBot'>
<div className='goodsPrice'>
<span style={{
fontSize: 20,
}}>¥</span>
<span>299</span>
</div>
<div className='goodsNameBox'>
<div className='tipsPrice'>特价</div>
<div className='goodsName' title='智能化接口处理系统'>智能化接口处理系统</div>
</div>
<div className='goodsTime'>
2025-05-12
</div>
<div className='goodsBtnBox'>
<div className='goodsBtn'>编辑</div>
<div className='goodsBtn'>提交审核</div>
</div>
</div>
</div> */}
</div>
)
}
</div>
</Spin>
{/* )} */}
</div>
{/* defaultCurrent: 默认当前页数 total:数据总数 defaultPageSize:'页面显示几条' */}
<div className='product-release-pagination'>
<Pagination
showSizeChanger={false}
current={page} total={total} defaultPageSize={20} onChange={(page) => {
// console.log(page)
setPage(page)
}} />
</div>
</div>
{/* 编辑弹窗 */}
<Modal title={'编辑'}
destroyOnClose={true}
open={editModalOpen}
footer={null} // footer 设置为 null 来隐藏自带按钮
width={1152}
onCancel={() => {
setEditModalOpen(false);
}}
centered
// 点击遮罩不允许关闭
maskClosable={false}
>
{/* <div style={{ height: `${height - 20}px`, overflow: 'auto', borderTop: '1px solid #e8e8e8' }}> */}
<EditModal closeModal={() => { setEditModalOpen(false) }}
getGoodsDate={getGoodsDate}
id={id}
></EditModal>
{/* </div> */}
</Modal>
{/* 删除弹窗 */}
<Modal title="删除"
okText="确认"
cancelText="取消"
destroyOnClose={true}
open={delModalOpen}
onOk={() => {
// setDelModalOpen(false)
delOk()
}}
onCancel={() => {
setDelModalOpen(false)
}}
okButtonProps={{ style: { background: 'red', color: 'white' } }}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<div style={{
width: 700,
marginTop: 20
}}>
{/* {delName} */}
</div>
</Modal>
{/* 出售弹窗 */}
<Modal title="上架"
okText="确认"
cancelText="取消"
destroyOnClose={true}
open={sellModalOpen}
onOk={() => {
// setSellModalOpen(false)
sellOk()
}}
onCancel={() => {
setSellModalOpen(false)
}}
okButtonProps={{ style: { background: '#28915A', color: 'white' } }}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<div style={{
width: 700,
marginTop: 20
}}>
{sellName}
</div>
</Modal>
<Modal title="下架"
okText="确认"
cancelText="取消"
destroyOnClose={true}
open={offModalOpen}
onOk={() => {
// setSellModalOpen(false)
offOk()
}}
onCancel={() => {
setOffModalOpen(false)
}}
okButtonProps={{ style: { background: '#28915A', color: 'white' } }}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<div style={{
width: 700,
marginTop: 20
}}>
{offName}
</div>
</Modal>
<Modal title="提交审核"
okText="确认"
cancelText="取消"
destroyOnClose={true}
open={submitModalOpen}
onOk={() => {
submitAuditOk()
}}
onCancel={() => {
setSubmitModalOpen(false)
}}
// okButtonProps={{ style: { background: 'red', color: 'white' } }}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<div style={{
width: 700,
marginTop: 20
}}>
{submitName}?
</div>
</Modal>
<Modal title="未通过原因"
okText="确认"
cancelText="取消"
destroyOnClose={true}
open={reasonModalOpen}
onOk={() => {
// submitAuditOk()
}}
footer={null}
onCancel={() => {
setReasonModalOpen(false)
}}
// okButtonProps={{ style: { background: 'red', color: 'white' } }}
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: `${height}px`,
}}>
<div style={{
width: 700,
// marginTop: 20
padding: '20px 0px',
}}>
{goodsCheckRemark}
</div>
</Modal>
</div>
)
}