import React, { useEffect, useRef, useState } from 'react';
import { Form, Row, Col, Card, Modal, Input, Select, Upload, Button, message, Tag, Tooltip, Image } from 'antd';
import { connect } from 'umi';
import styles from './index.less';
import {
ForkOutlined,
PlusOutlined,
ExclamationCircleFilled,
UploadOutlined,
EditOutlined,
EyeOutlined,
ShareAltOutlined,
LeftOutlined,
RightOutlined,
} from '@ant-design/icons';
const { Search } = Input;
import * as echarts from 'echarts';
import { recurrent as bug_recurrent, severity, bug_categories } from './const';
import { timeToString, getBase64 } from '@/utils/common';
import BugGuideTree from '../BugGuideTree';
const formItemLayout = {
labelCol: {
span: 8,
},
wrapperCol: {
span: 19,
},
};
const modalFormItemLayout = {
labelCol: {
span: 5,
},
wrapperCol: {
span: 19,
},
};
const uploadButton = (
);
const Step2 = (props) => {
const [reportForm] = Form.useForm();
const [addCaseForm] = Form.useForm();
const [addBugForm] = Form.useForm();
const [editReportForm] = Form.useForm();
const {
dispatch, reportCommonInfo, osType,collaborative_type,
testCaseList, caseBugList, categories, pathInfo,commonId
} = props;
const [showTaskRecommendModal, setTaskRecommendModal] = useState(false);
const [showAddTestCaseModal, setAddTestCaseModal] = useState(false);
const [showAddBugModal, setAddTestBugModal] = useState(false);
const [showEditReportModal, setEditReportModal] = useState(false);
const currentTestCaseRef = useRef({});
const [currBugDetail,setCurrBugDetail] = useState({});
const [isAddCaseStatus, setIsAddCaseStatus] = useState(true);
// const [currActiveTestCase, setCurrActiveTestCase] = useState({});
//上传图片廊需要的字段
const [fileList, setFileList] = useState([]);
const [previewTitle, setPreviewTitle] = useState('');
const [previewImage, setPreviewImage] = useState('');
const [previewVisible, setPreviewVisible] = useState(false);
const [page2List, setPage2List] = useState([]);
const [page3List, setPage3List] = useState([]);
const [bugList, setBugList] = useState([]);
const forkStatus = useRef(false);
const currForkId = useRef('');
const forkInput = useRef('');
const handleEditReportInfo = () => {
editReportForm.validateFields().then((res) => {
let formData = new FormData();
formData.append('name', res.name);
formData.append('report_id', reportCommonInfo.id);
formData.append('worker_id', commonId.userId);
formData.append('case_take_id', commonId.case_take_id);
formData.append('device_model', res.device_model);
formData.append('device_brand', res.device_brand);
formData.append('device_os', res.device_os);
dispatch({
type: 'editReport/updateReportCommonDetail',
payload: { formData },
});
});
setEditReportModal(false);
};
const handleAddOrEditTestCase = () => {
addCaseForm.validateFields().then((res) => {
let formData = new FormData();
// formData.append("id", values.reportName);
formData.append('report_id', reportCommonInfo.id);
formData.append('name', res.name);
formData.append('front', res.front);
formData.append('behind', res.behind);
formData.append('description', res.description);
if (!isAddCaseStatus) {
//处理编辑用例
formData.append('id', currentTestCaseRef.current.id);
dispatch({
type: 'editReport/updateTestCase',
payload: {
formData,
report_id: reportCommonInfo.id,
},
}).then((res) => {
if (res && res.status === 200) {
message.success('修改成功!');
}
});
} else {
//处理添加用例
dispatch({
type: 'editReport/createTestCase',
payload: {
formData,
report_id: reportCommonInfo.id,
},
}).then(({ res, testCaseList }) => {
if (res && res.id) {
message.success('添加成功!');
//添加成功后要把currCase指向新的
const currCase = testCaseList.filter(item =>
item.id === res.id,
);
handleClickTestCase(currCase[0]);
}
});
}
setAddTestCaseModal(false);
});
};
const handleAddBug = () => {
addBugForm.validateFields().then((res) => {
let formData = new FormData();
formData.append('report_id', reportCommonInfo.id);
formData.append('title', res.title);
formData.append('description', res.description);
formData.append('bug_category', res.bug_category);
formData.append('severity', res.severity);
formData.append('recurrent', res.recurrent);
formData.append('parent', forkStatus.current?currForkId.current+'-2':null);
formData.append('useCase', currentTestCaseRef.current.id);
formData.append('case_id', commonId.caseId);
formData.append('case_take_id', commonId.case_take_id);
formData.append('worker_id', commonId.userId);
formData.append('page', `${res.page1}-${res.page2}-${res.page3}`);
if (fileList.length) {
let str = '';
fileList.map(item => {
str += (item.response + ',');
});
str = str.substring(0, str.length - 1);
formData.append('img_url', str);
}
//新建bug
//提交bug之前要做相似度判断,超过80%就不让提交了
dispatch({
type: 'editReport/bugSimilarity',
payload: {
case_take_id:commonId.case_take_id,
type:res.title,
content:res.description
},
}).then(res=>{
if(res){
const { scores } = res;
const s = scores.some(item=>item>=80);
if(!s){
dispatch({
type: 'editReport/createCaseBug',
payload: {
formData,
useCase: currentTestCaseRef.current.id,
},
}).then(res => {
addBugForm.resetFields();
setPage2List([]);
setPage3List([]);
setFileList([]);
forkStatus.current=false;
setAddTestBugModal(false);
});
}else{
message.error('当前缺陷与已有缺陷相似度超过80%,请修改标题和内容后重试');
}
}
})
});
};
const handleCancelTestBug = ()=>{
setAddTestBugModal(false);
setFileList([]);
forkInput.current.state.value = '';
forkStatus.current = false;
addBugForm.resetFields();
setPage2List([]);
setPage3List([]);
}
const handleClickTestCase = (caseItem) => {
// setCurrActiveTestCase(caseItem);
currentTestCaseRef.current = caseItem;
dispatch({
type: 'editReport/getCaseBugList',
payload: caseItem.id,
});
};
const handleEditTestCase = (item) => {
setIsAddCaseStatus(false);
currentTestCaseRef.current = item;
addCaseForm.setFieldsValue(currentTestCaseRef.current);
setAddTestCaseModal(true);
};
const handleClickAddCase = () => {
addCaseForm.resetFields();
setAddTestCaseModal(true);
};
const handleClickAddBug = () => {
//current目前只在点击edit cease的时候会有用
addBugForm.resetFields();
forkInput.current.state.value = '';
setAddTestBugModal(true);
};
const handleClickRecommendBtn = () => {
dispatch({
type: 'editReport/getPathInfo',
payload: {
case_take_id: commonId.case_take_id,
report_id: reportCommonInfo.id,
},
});
dispatch({
type: 'editReport/getBugRecommendPath',
payload: {
case_take_id: commonId.case_take_id,
report_id: reportCommonInfo.id,
},
});
dispatch({
type: 'editReport/getBugRecommendList',
payload: {
case_take_id: commonId.case_take_id,
report_id: reportCommonInfo.id,
},
});
setTaskRecommendModal(true);
};
const handleSelectPage1 = (val) => {
if (val !== page1) {
addBugForm.setFieldsValue({page1:val,page2:'',page3:''})
let item = categories.find(x => x.item === val);
setPage2List(item.children);
}
};
const handleSelectPage2 = (val) => {
if (val !== page2) {
addBugForm.setFieldsValue({page2:val,page3:''})
let item = page2List.find(x => x.item === val);
setPage3List(item.children);
}
};
// const handlePage3Change = val => {
// // setPage3(val);
// };
const handlePreview = async file => {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj);
}
setPreviewImage(file.url || file.preview);
setPreviewVisible(true);
setPreviewTitle(file.name || file.url.substring(file.url.lastIndexOf('/') + 1));
};
const handleCancel = () => setPreviewVisible(false);
const handleChange = ({ fileList }) => {
setFileList(fileList);
};
const handleChangeImgToLeft = (item) => {
console.log(item);
item.left--;
item.right--;
item['imgArr'] = item['originArr'].slice(item['left'], item['right']);
let newList = [...bugList];
let index = newList.findIndex(i => i.id === item.id);
newList.splice(index, 1, item);
setBugList(newList);
};
const handleChangeImgToRight = (item) => {
console.log(item);
item.left++;
item.right++;
item['imgArr'] = item['originArr'].slice(item['left'], item['right']);
let newList = [...bugList];
let index = newList.findIndex(i => i.id === item.id);
newList.splice(index, 1, item);
setBugList(newList);
};
const searchBugToFork = value =>{
value = value.trim();
forkStatus.current = true;
currForkId.current = value;
dispatch({
type: 'editReport/getBugDetail',
payload: { id: value},
}).then(res=>{
let detail = res.detail;
// detail['recurrent'] = bug_recurrent[res.detail.recurrent-1];
// console.log(bug_recurrent[res.detail.recurrent-1])
setCurrBugDetail(detail);
const {bug_page, bug_category, severity, recurrent} = res.detail;
const pages = bug_page.split("-");
const page1 = pages[0];
const page2 = pages[1];
const page3 = pages[2];
dispatch({
type: 'editReport/forkReport',
payload: {
page1, page2, page3, bug_category, severity, recurrent
},
})
})
}
const handleInitThreePages = ()=>{
let detail = { ...currBugDetail };
detail['recurrent'] = bug_recurrent[currBugDetail.recurrent-1];
detail['severity'] = severity[currBugDetail.severity-1];
if(JSON.stringify(detail)!=='{}') {
let pages = detail.bug_page.split("-");
detail.page1 = pages[0];
detail.page2 = pages[1];
detail.page3 = pages[2];
if (page2List && page2List.length) {
handleSelectPage2(pages[1]);
// console.log(detail)
addBugForm.setFieldsValue(detail)
// console.log(addBugForm.getFieldsValue())
}else{
handleSelectPage1(pages[0]);
}
}
}
useEffect(()=>{
handleInitThreePages();
},[currBugDetail,page2List])
useEffect(() => {
//能到第二步,说明是有报告信息的
//有报告,获取对应信息。没有就直接转去了第一步
dispatch({
type: 'editReport/getTestCaseList',
payload: { report_id: reportCommonInfo.id },
}).then((res) => {
if (res && res.length && commonId) {
currentTestCaseRef.current = res[0];
dispatch({
type: 'editReport/getCaseBugList',
payload: currentTestCaseRef.current.id,
});
}
});
dispatch({
type: 'editReport/getCategories',
payload: { examId: commonId.examId },
});
}, [reportCommonInfo,commonId.userId,commonId.examId,commonId.case_take_id]);
useEffect(() => {
let bugs = caseBugList.map(item => item.detail);
bugs.map(item => {
item['originArr'] = item.img_url ? item.img_url.split(',') : [];
if (item['originArr'].length >= 3) {
//通过更改左右的标记值来更改显示的图片
item['left'] = 0;
item['right'] = 3;
item['imgArr'] = item['originArr'].slice(item['left'], item['right']);
} else if (item['originArr'].length > 0 && item['originArr'].length < 3) {
item['imgArr'] = item['originArr'];
item['left'] = 0;
item['right'] = item['originArr'].length;
}
});
setBugList(bugs);
}, [caseBugList]);
return (
setEditReportModal(true)}
/>
测试用例列表
{testCaseList && testCaseList.length ? testCaseList.map((item) => {
return (
{
handleClickTestCase(item);
}}>
{{`编号.${((item.id).substring((item.id.length) - 6)).toUpperCase()}`}}
{item.name}
handleEditTestCase(item)} />
);
}) :
快来创建你的第一个测试用例吧~
}
缺陷列表
{
collaborative_type === '0' ?
: null
}
{bugList && bugList.length ? bugList.map((item) => {
return (
标题:{item.title}
特征:
{bug_recurrent[item.recurrent - 1]}
{severity[item.severity - 1]}
{item.bug_category}
标识:
{item.id}
路径:
{item.bug_page}
描述:{item.description}
{
item.img_url ? (
{item.left > 0 ? {
handleChangeImgToLeft(item);
}} /> : }
{item.imgArr.map(img => {
return ;})}
{item.right < item.originArr.length ? {
handleChangeImgToRight(item);
}} /> : }
)
: null}
);
}) :
当前用例暂无提交记录,快去创建第一个BUG吧~
}
确定,
]}
onCancel={() => {
setAddTestCaseModal(false);
}}
>
为了评分准确,请勿提交重复测试用例
添加用例缺陷,
]}
footer={[
,
]}
onCancel={() => {
handleCancelTestBug();
}}
className={styles.bugForm}
>
为了评分准确,请勿提交重复缺陷Bug
({ // data里存放的是接口的请求参数
file,
caseId: currentTestCaseRef.current.id,
work_id: '2',
})}
listType="picture-card"
fileList={fileList}
onPreview={handlePreview}
onChange={handleChange}
>
{uploadButton}
handleCancel()}
>
确定,
]}
onCancel={() => {
setEditReportModal(false);
}}>
setTaskRecommendModal(false)}
onCancel={() => {
setTaskRecommendModal(false);
}
}
className={styles.recommendModal}>
);
};
export default connect(({ editReport, loading ,report}) => ({
submitting: loading.effects['editReport/submitStepForm'],
reportCommonInfo: editReport.reportCommonInfo,
testCaseList: editReport.testCaseList,
caseBugList: editReport.caseBugList,
categories: editReport.categories,
pathInfo: editReport.pathInfo,
osType: editReport.osType,
commonId: editReport.commonId,
collaborative_type: report.collaborative_type,
}))(Step2);