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 (
{timeToString(reportCommonInfo.create_time_millis)} {reportCommonInfo.name} {reportCommonInfo.device_brand} {reportCommonInfo.device_model} {reportCommonInfo.device_os}
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()} > example
确定, ]} 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);