From 8f92f99d845c6d800059db094b285ff551a75556 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 25 Jan 2022 10:04:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=93=E5=AE=B6=E8=AF=84=E5=AE=A1-=E7=AB=9E?= =?UTF-8?q?=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/military/components/adminRouter/index.jsx | 1 + src/military/expert/adminRouter.js | 12 + src/military/expert/api.js | 9 + src/military/expert/competionList/index.jsx | 340 +++++++++++++++++- src/military/expert/competionList/index.scss | 57 +++ .../expert/reviewResult/gradesModal/index.jsx | 6 +- src/military/expert/reviewResult/index.jsx | 65 ++-- src/military/expert/reviewRules/index.jsx | 47 ++- src/military/expert/selectExpert/index.jsx | 28 +- src/military/task/api.js | 4 +- src/military/task/taskAdmin/index.jsx | 2 +- 11 files changed, 507 insertions(+), 64 deletions(-) diff --git a/src/military/components/adminRouter/index.jsx b/src/military/components/adminRouter/index.jsx index 72ab88ff..80e51cd5 100644 --- a/src/military/components/adminRouter/index.jsx +++ b/src/military/components/adminRouter/index.jsx @@ -47,6 +47,7 @@ export default props => { const competitionMenu = useMemo(() => { return 竞赛列表 + 评审任务列表 }); diff --git a/src/military/expert/adminRouter.js b/src/military/expert/adminRouter.js index 088f706b..61d467f9 100644 --- a/src/military/expert/adminRouter.js +++ b/src/military/expert/adminRouter.js @@ -30,6 +30,11 @@ const ReviewResult = Loadable({ loader: () => import("./reviewResult"), loading: Loading, }); +//竞赛评审任务列表 +const CompetitionList = Loadable({ + loader: () => import("./competionList"), + loading: Loading, +}) const AdminPage = (propsF) => { @@ -72,6 +77,13 @@ const AdminPage = (propsF) => { )} > + {/* 竞赛评审任务列表 */} + ( + + )} + > ); diff --git a/src/military/expert/api.js b/src/military/expert/api.js index 30448ac9..d6a8fe6d 100644 --- a/src/military/expert/api.js +++ b/src/military/expert/api.js @@ -227,4 +227,13 @@ export function selectExpertList(params) { method: 'get', params }); +} + +//竞赛任务列表 +export function getCompetitionList(params) { + return fetch({ + url: `/api/competitionExpert/getCompetitionList`, + method: 'get', + params + }); } \ No newline at end of file diff --git a/src/military/expert/competionList/index.jsx b/src/military/expert/competionList/index.jsx index b9f3eca0..4a8e137c 100644 --- a/src/military/expert/competionList/index.jsx +++ b/src/military/expert/competionList/index.jsx @@ -1,11 +1,341 @@ -import React from "react"; +import { Button, message, Modal, Select, Tooltip } from "antd"; +import React, { useEffect, useMemo, useState } from "react"; +import Link from "react-router-dom/Link"; +import { publishExpertsAndRules } from "src/military/task/api"; +import PaginationTable from "../../components/paginationTable"; +import { expertReviewArr } from "../../task/static"; +import { getCompetitionList, getRules, selectExpertList } from "../api"; import './index.scss'; -function Competition(){ +// 竞赛任务状态 current_status 1报名中 2即将开始 3比赛进行中 4作品评选中 5公示中 6已结束 +function Competition(props){ + const {mygetHelmetapi} = props; + const {main_web_site_url} = mygetHelmetapi; + const [loading, setLoading] = useState(false); + const [curPage, setCurPage] = useState(1); + //是否加入专家评审流程 + const [expertReview,setExpertReview] = useState(undefined); + //竞赛任务总数 + const [total, setTotal] = useState() + //竞赛任务列表 + const [competitionList, setCompetitionList] = useState(undefined); + + //查看评审规则、查看选取专家、发布评审任务 + const [lookRules, setLookRules] = useState(false); + const [lookExperts, setLookExperts] = useState(false); + const [pulicReview, setPublicReview] = useState(false); + const [rules, setRules] = useState(undefined); + const [selectedExperts, setSelectedExperts] = useState(undefined); + const [publicTaskId, setPublicTaskId] = useState(undefined); + const [reload, setReload] = useState(undefined); + + //竞赛任务列表 表格 + const columns = useMemo(() => { + return [ + { + title: "序号", + dataIndex: "index", + width: 50, + align: "center", + }, + { + title: "竞赛主标题", + dataIndex: "title", + key: "title", + align: "center", + render:(text, record)=>{ + return {text} + } + }, + { + title: , + dataIndex: 'is_expert_audit', + align: "center", + render: (text, record) => { + return + } + }, + { + title: "开始时间", + dataIndex: "start_time", + key: "startTime", + align: "center", + }, + { + title: "截止时间", + dataIndex: "end_time", + key: "endTime", + align: "center", + }, + { + title: "报名人数", + dataIndex: "team_members_count", + key: "teamMembersCount", + align: "center", + }, + { + title: '评审规则', + dataIndex: 'current_status', + key: "rules", + render: (text, record) => { + return record.assignRuleAndExperts ? : record.is_expert_audit && text<4 ? 编辑 : 编辑 + } + }, + { + title: '专家选取', + dataIndex: 'current_status', + key: "experts", + render: (text, record) => { + return record.assignRuleAndExperts ? : record.is_expert_audit && text<4 ? 选择 : 选择 + } + }, + { + title: '评审任务', + dataIndex: 'current_status', + key: "review", + render: (text, record) => { + return record.assignRuleAndExperts ? 已发布 : record.is_expert_audit && text<4 ? : 发布 + } + }, + { + title: '评审结果', + dataIndex: 'assignRuleAndExperts', + key: "results", + render: (text, record) => { + return text ? 查看:查看 + } + } + ]; + }, [competitionList, curPage]); + + //已选取专家 表格 + const columnsExperts = useMemo(() => { + return [ + { + title: '编号', + dataIndex: 'index', + width: 80, + align: 'center', + }, + { + title: '专家姓名', + dataIndex: 'expertName', + key: 'expertName', + width: 120, + }, + { + title: '手机号码', + dataIndex: 'phone', + width: 130, + key: 'phone', + }, + { + title: '最高学历', + dataIndex: 'highestDegree', + key: 'highestDegree', + }, + { + title: '专业职称', + dataIndex: 'professionalTitle', + }, + { + title: '专家类别', + dataIndex: 'expertType', + }, + { + title: '评审领域', + dataIndex: 'reviewAreas', + align: 'center', + width: 260, + }, + { + title: '专家评分', + dataIndex: 'expertScore', + align: 'center', + render:(text,record)=>{ + return record.expertScore || '--'; + } + } + ]; + }, []); + + //发布评审任务 + function publishTaskReview(record){ + if(!record.ruleEdited || !record.expertSelected){ + message.error("请先编辑评审规则以及选取评选专家再发布此任务"); + }else{ + getRules({containerId: record.id, containerType: 2, statusString: 3}).then(response=>{ + if(response && response.message === "success"){ + setRules(response.data); + } + }) + selectExpertList({containerId: record.id, containerType: 2, pageSize: 10000, curPage: 1}).then(response=>{ + if(response && response.message === "success" && Array.isArray(response.data.rows)){ + let index = 1; + for (const item of response.data.rows) { + item.reviewAreas = `${item.reviewAreaOne} ${item.reviewAreaTwo ? `、${item.reviewAreaTwo}`:''} ${item.reviewAreaThree ? `、${item.reviewAreaThree}`:''}`; + item.index = (index++) + (curPage > 1 ? (curPage - 1) * 10 : 0); + } + setPublicTaskId(record.id); + setSelectedExperts(response.data.rows); + setPublicReview(true); + } + }); + } + } + + //已发布任务 查看评审规则 + function viewRules(record){ + getRules({containerId: record.id, containerType: 2, statusString: '-1,1,2'}).then(response=>{ + if(response && response.message === "success"){ + setRules(response.data); + setLookRules(true); + } + }); + } + + //已发布任务 查看已选专家 + function viewExperts(record){ + selectExpertList({containerId: record.id, containerType: 2, pageSize: 10000, curPage: 1,}).then(response=>{ + if(response && response.message === "success" && Array.isArray(response.data.rows)){ + let index = 1; + for (const item of response.data.rows) { + item.reviewAreas = `${item.reviewAreaOne} ${item.reviewAreaTwo ? `、${item.reviewAreaTwo}`:''} ${item.reviewAreaThree ? `、${item.reviewAreaThree}`:''}`; + item.index = (index++) + (curPage > 1 ? (curPage - 1) * 10 : 0); + } + setSelectedExperts(response.data.rows); + setLookExperts(true); + } + }); + } + + //获取竞赛任务列表 + useEffect(()=>{ + setLoading(true); + const params = { + curPage, + pageSize: 10, + isExpertAudit: expertReview + } + getCompetitionList(params).then(response=>{ + if(response && response.message === "success"){ + response.data.map((item, i)=>{ + item.index = ++i; + item.start_time = item.start_time.replace('T', ' ').substring(0,16); + item.end_time = item.end_time.replace('T', ' ').substring(0,16); + }) + setCompetitionList(response.data || []); + setTotal(response.total); + } + }).finally(()=>{ + setLoading(false); + }) + }, [curPage, expertReview, reload]) + + //监听lookRules,lookExperts,pulicReview的变化,弹框 + useEffect(()=>{ + //评审规则 + lookRules && rules && Modal.info({ + className: 'publishReview', + title: "评审规则", + content: + +
{rules && rules.rule}
+

评分标准

+
+ {rules.criterias.map(item=>{return

{item}

})} +
+

评审时间

+
{rules.reviewData}
+
+ , + }); + lookRules && setLookRules(false); + + //已选取评审专家 + lookExperts && selectedExperts && Modal.info({ + className: 'publishReview', + title: "已选取评审专家", + content: + , + }); + lookExperts && setLookExperts(false); + + //发布评审任务 + pulicReview && rules && selectedExperts && Modal.confirm({ + className: 'publishReview', + title: "发布评审任务", + centered: true, + content: + +
+ + 确定发布此评审任务?确定发布后评审规则与评审专家信息将无法重新编辑 +
+

评审规则

+
{rules && rules.rule}
+

评分标准

+
+ {rules.criterias.map(item=>{return

{item}

})} +
+

评审时间

+
{rules.reviewData}
+

已选取评审专家

+ +
+ , + okText: '确定', + cancelText: '取消', + onOk() { + publishExpertsAndRules(publicTaskId, 2).then(response=>{ + if(response && response.message==="发布成功"){ + setReload(Math.random()); + } + }) + }, + }); + pulicReview && setPublicReview(false); + },[lookRules,lookExperts,pulicReview]) + return( -
- aaa -
) +
+ +
+ ) } export default Competition; \ No newline at end of file diff --git a/src/military/expert/competionList/index.scss b/src/military/expert/competionList/index.scss index e69de29b..2aef7ad0 100644 --- a/src/military/expert/competionList/index.scss +++ b/src/military/expert/competionList/index.scss @@ -0,0 +1,57 @@ +a.primary-link{ + color: #4154f1; + &:hover{ + opacity: 0.8; + } +} +.gary_span{ + color: rgba(176, 176, 176, 1); +} + +// 发布评审任务弹框样式 +.publishReview{ + width: 1050px !important; + .ant-modal-body{ + padding: 0; + } + .ant-modal-confirm-btns { + margin: 15px 35px 10px; + } + .ant-modal-confirm-title{ + border-bottom: 1px solid #eeeeee; + padding: 20px 25px; + background: #f2f2ff; + font-size: 18px; + } + .ant-modal-confirm-body > .anticon{ + display: none; + } + .ant-modal-confirm-body > .anticon + .ant-modal-confirm-title + .ant-modal-confirm-content{ + margin-left: 0; + } + .ant-modal-confirm-content{ + &>p{ + font-size: 16px; + color: #333333; + border-bottom: 1px solid #eeeeee; + padding: 10px 35px; + font-weight: bold; + } + &>div{ + padding: 10px 45px; + } + .tip{ + padding: 10px 35px; + i{ + color: #ca0002; + } + .publicTitle { + font-size: 15px; + margin-left: 3px; + } + } + } + .pagination-table .ant-table-tbody > tr > td{ + padding: 3px 8px; + } +} \ No newline at end of file diff --git a/src/military/expert/reviewResult/gradesModal/index.jsx b/src/military/expert/reviewResult/gradesModal/index.jsx index 4f93e7b5..53f0d2b5 100644 --- a/src/military/expert/reviewResult/gradesModal/index.jsx +++ b/src/military/expert/reviewResult/gradesModal/index.jsx @@ -7,7 +7,7 @@ import sucess from '../image/sucess.svg'; import './index.scss'; import '../../index.scss'; -function GradesModal({ setVisible, visible, taskId, opsDetail }) { +function GradesModal({ setVisible, visible, taskId, opsDetail, containerType }) { // 主table参数 const [loading, setLoading] = useState(false); const [dataList, setDataList] = useState([]); @@ -111,12 +111,12 @@ function GradesModal({ setVisible, visible, taskId, opsDetail }) { opsType: opsDetail && opsDetail.opsType, orderBy: 'gradesAverageDesc', containerId: taskId, - containerType: 1, + containerType, }; //获取评审规则 const paramsRule = { containerId: taskId, - containerType: 1, + containerType, statusString: '-1,1', }; taskId && getRules(paramsRule).then(response=>{ diff --git a/src/military/expert/reviewResult/index.jsx b/src/military/expert/reviewResult/index.jsx index 7a92660f..684d3d54 100644 --- a/src/military/expert/reviewResult/index.jsx +++ b/src/military/expert/reviewResult/index.jsx @@ -9,9 +9,11 @@ import './index.scss'; import '../index.scss'; import { queryString } from "educoder"; -function ReviewResult({ history, match }) { - const taskId = match.params.containerId; - let {status, name, taskModeId} = queryString.parse(window.location.hash.slice(1)); +function ReviewResult({ history, match, mygetHelmetapi}) { + const {main_web_site_url} = mygetHelmetapi; + //id:竞赛或者创客任务id,containerType,1创客2竞赛 + const {containerId, containerType} = match.params; + let {identifier, status, name, taskModeId} = queryString.parse(window.location.hash.slice(1)); const [dataList, setDateList] = useState(undefined); const [openResultVisible, setOpenResultVisible] = useState(false); const [winIds, setWinIds] = useState(undefined); @@ -48,22 +50,26 @@ function ReviewResult({ history, match }) { render: (text, record) => { return {detail(record)}}>查看明细 } - }, - { + } + ]; + + //如果是创客任务,那么多出一列 选择胜出者 + if(containerType == 1){ + columns.splice(4, 0, { title: '是否胜出', ket: 'isWin', align: 'center', render: (text, record) => { return record.isWin ?
胜出
: status == 4 ? {changeIsWin(record.applicantInfo.id, e.target.checked)}}>胜出 : '未胜出'; } - } - ]; + }); + } useEffect(()=>{ //获取评分 const params = { - containerId: taskId, - containerType: 1, + containerId, + containerType, orderBy: 'finalGradesDesc' } getFinalScoreRankingList(params).then(response=>{ @@ -71,9 +77,9 @@ function ReviewResult({ history, match }) { //finalGrades 最终得分为null 未到评审时间 0 专家未评审任务 let index = 1; response.data.map(item=>{item.id = index++;setResult(item.finalGrades) }) - status >4 ? getWinnersAndPublicists({ - containerId: taskId, - containerType: 1 + containerType == 1 && status >4 ? getWinnersAndPublicists({ + containerId, + containerType }).then(res=>{ if(res && res.message === "success"){ response.data.map(item=>{ @@ -103,7 +109,8 @@ function ReviewResult({ history, match }) { message.error("还没有到评审结束时间,不能公示结果! "); return; } - if(winIds && winIds.length>0){ + containerType == 2 && setOpenResultVisible(true); + if(containerType ==1 && winIds && winIds.length>0){ taskModeId == 1 && winIds.length >1 ? message.error("此任务是单人悬赏模式, 只能设置一个中标者 ! ") : setOpenResultVisible(true); } } @@ -117,7 +124,7 @@ function ReviewResult({ history, match }) { setErrorMessage('请输入数字!'); }else if(openRange && (openRange.indexOf('.')!==-1 || openRange.indexOf('-')!==-1)){ setErrorMessage('请输入正整数!'); - }else if(openRange && openRange < winIds.length){ + }else if(openRange && containerType == 1 && openRange < winIds.length){ setErrorMessage('公示范围不能少于获胜人数!'); }else if(openRange && openRange > dataList.length){ setErrorMessage('公示范围超过应征者总数!'); @@ -125,23 +132,24 @@ function ReviewResult({ history, match }) { ids[ids.length] = dataList.filter(item=>item.id<=openRange).map(i=>i.applicantInfo.id); } let params = { - containerId : taskId, - containerType: 1, + containerId, + containerType, id: 0, - publicityUserIds : ids.toString(), - winUserIds:winIds.toString() + publicityUserIds : ids.toString() }; + containerType==1 && (params[`winUserIds`] = winIds.toString()); ids.length!=0 && selectWinnersAndPublicists(params).then(response=>{ if(response && response.message === "success"){ message.success("操作成功"); - window.location.href=`${window.location.href.replace('status=4','status=5')}`; - status = 5; - setGoNum(-2); + if(containerType==1){ + window.location.href=`${window.location.href.replace('status=4','status=5')}`; + status = 5; + setGoNum(-2); + } setOpenResultVisible(false); } }) } - return (
@@ -149,8 +157,12 @@ function ReviewResult({ history, match }) { 评审结果
-

任务名称{decodeURI(name)}

-

任务链接{`${window.location.origin}/task/taskDetail/${taskId}`}

+

{containerType ==1 ? '任务':'竞赛'}名称{decodeURI(name)}

+

+ {containerType ==1 ? '任务':'竞赛'}链接 + {containerType == 1 && {`${window.location.origin}/task/taskDetail/${containerId}`}} + {containerType == 2 && {`${main_web_site_url}/competitions/${identifier}/home`}} +

{status > 3 ?

应征者排名

@@ -160,7 +172,7 @@ function ReviewResult({ history, match }) { scroll={{ y: 384 }} />
- {status == 4 && } + {status == 4 && }
:
暂无数据,此任务暂未进入成果评选阶段。
} ) diff --git a/src/military/expert/reviewRules/index.jsx b/src/military/expert/reviewRules/index.jsx index 0ea1f4fa..58679e3b 100644 --- a/src/military/expert/reviewRules/index.jsx +++ b/src/military/expert/reviewRules/index.jsx @@ -10,28 +10,37 @@ import { queryString } from "educoder"; const {RangePicker} = DatePicker; -function ReviewRules({form, history, match}) { - const id = match.params.containerId; - const {name, status, createdAt, collectingEndTime, choosingDays} = queryString.parse(window.location.search.slice(1)); +function ReviewRules({form, history, match, mygetHelmetapi}) { + const {main_web_site_url} = mygetHelmetapi; + //id:竞赛或者创客任务id,containerType,1创客2竞赛 + const {containerId, containerType} = match.params; + const {identifier, name, status, createdAt, collectingEndTime, choosingDays, reviewStartTime, reviewEndTime} = queryString.parse(window.location.search.slice(1)); const { getFieldDecorator,setFieldsValue } = form; //是否有初始值 const [ initValue, setInitValue] = useState(false); const disabledDate = (current) =>{ - if(status == 1){ - const start = new Date((new Date(createdAt.replace("%20", " "))/1000 - 86400)*1000); - return current && current < moment(start).endOf('day'); - }else if(status == 3){ - const start = new Date((new Date(collectingEndTime.replace("%20", " "))/1000 - 86400)*1000); - const endDate = new Date((new Date(collectingEndTime.replace("%20", " "))/1000 + 86400*(choosingDays))*1000); - return current && current < moment(start).endOf('day') || current > moment(endDate).endOf('day'); + if(containerType == 1){ + //创客任务 + if(status == 1){ + const start = new Date((new Date(createdAt.replace("%20", " "))/1000 - 86400)*1000); + return current && current < moment(start).endOf('day'); + }else if(status == 3){ + const start = new Date((new Date(collectingEndTime.replace("%20", " "))/1000 - 86400)*1000); + const endDate = new Date((new Date(collectingEndTime.replace("%20", " "))/1000 + 86400*(choosingDays))*1000); + return current && current < moment(start).endOf('day') || current > moment(endDate).endOf('day'); + } + }else{ + //竞赛任务 + const start = new Date((new Date(reviewStartTime.replace("%20", " "))/1000 - 86400)*1000); + return current && current < moment(start).endOf('day') || current > moment(new Date(reviewEndTime.replace("%20", " "))).endOf('day'); } } useEffect(()=>{ //获取评审规则 const params = { - containerId: id, - containerType: 1, + containerId, + containerType, statusString: 3, }; getRules(params).then(response=>{ @@ -48,9 +57,9 @@ function ReviewRules({form, history, match}) { form.validateFields((err, values) => { if (!err) { let data = { - containerId: id, + containerId, containerName: decodeURI(name), - containerType: 1, + containerType, criteriaOne: values.criteriaOne, reviewStartOn: values.reviewDate[0].format('YYYY-MM-DD HH:mm:ss'), reviewEndOn: values.reviewDate[1].format('YYYY-MM-DD HH:mm:ss'), @@ -62,6 +71,7 @@ function ReviewRules({form, history, match}) { status: 3 } if(initValue){ + //更新评审规则 updateRules({...data, id: initValue.id}).then(response=>{ if(response && response.message === '更新成功'){ message.success('更新成功'); @@ -71,6 +81,7 @@ function ReviewRules({form, history, match}) { } }) }else{ + //新增评审规则 editRules(data).then(response=>{ if(response && response.message === '成功'){ message.success('保存成功'); @@ -93,8 +104,12 @@ function ReviewRules({form, history, match}) { 任务信息 -

任务名称{decodeURI(name)}

-

任务链接{`${window.location.origin}/task/taskDetail/${id}`}

+

{containerType ==1 ? '任务':'竞赛'}名称{decodeURI(name)}

+

+ {containerType ==1 ? '任务':'竞赛'}链接 + {containerType == 1 && {`${window.location.origin}/task/taskDetail/${containerId}`}} + {containerType == 2 && {`${main_web_site_url}/competitions/${identifier}/home`}} +

任务信息

-

任务名称{decodeURI(name)}

-

任务链接{`${window.location.origin}/task/taskDetail/${taskId}`}

+

{containerType ==1 ? '任务':'竞赛'}名称{decodeURI(name)}

+

+ {containerType ==1 ? '任务':'竞赛'}链接 + {containerType == 1 && {`${window.location.origin}/task/taskDetail/${containerId}`}} + {containerType == 2 && {`${main_web_site_url}/competitions/${identifier}/home`}} +

} @@ -148,8 +154,8 @@ function SelectExpert(props) { useEffect(()=>{ setLoading(true); const params = { - containerId: taskId, - containerType: 1, + containerId, + containerType, curPage:curPage, pageSize: 10000, curPage: 1, @@ -197,8 +203,8 @@ function SelectExpert(props) { useEffect(()=>{ setLoading(true); const params = { - containerId: taskId, - containerType: 1, + containerId, + containerType, curPage, pageSize, } @@ -253,9 +259,9 @@ function SelectExpert(props) { const SelectExperts = (id) =>{ const params = { assignorId: parseInt(current_user.user_id), - containerId: taskId, + containerId, containerName: decodeURI(name), - containerType: 1, + containerType, expertIds: id.toString(), status: 3 } diff --git a/src/military/task/api.js b/src/military/task/api.js index 0f9549ab..01655030 100644 --- a/src/military/task/api.js +++ b/src/military/task/api.js @@ -592,9 +592,9 @@ export function addExpertReview(taskId,expertReview){ } //发布评审任务 -export function publishExpertsAndRules(taskId){ +export function publishExpertsAndRules(taskId, containerType){ return fetch({ - url: `/api/taskRuleCriteria/publishExpertsAndRules?containerId=${taskId}&containerType=1&status=-1`, + url: `/api/taskRuleCriteria/publishExpertsAndRules?containerId=${taskId}&containerType=${containerType}&status=-1`, method: 'put' }) } diff --git a/src/military/task/taskAdmin/index.jsx b/src/military/task/taskAdmin/index.jsx index a4941781..8241c23a 100644 --- a/src/military/task/taskAdmin/index.jsx +++ b/src/military/task/taskAdmin/index.jsx @@ -430,7 +430,7 @@ export default Form.create()(({ form, showNotification, match, history, state }) okText: '确定', cancelText: '取消', onOk() { - publishExpertsAndRules(publicTaskId).then(response=>{ + publishExpertsAndRules(publicTaskId,1).then(response=>{ if(response && response.message==="发布成功"){ setReload(Math.random()); }