defectManagement.vue 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  1. <template>
  2. <div style="width: 100%;">
  3. <div class="set-background">
  4. <div class="block">
  5. <el-form :model="queryCode">
  6. <div class="set-between">
  7. <!-- <el-form-item label="创建时间" label-width="70px"><el-date-picker v-model="queryCode.dateQuery" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" /></el-form-item> -->
  8. <el-input v-model="queryCode.assigner" placeholder="责任人" autocomplete="off" clearable size="medium" style="width:13%;margin-right: 15px;" />
  9. <el-input v-model="queryCode.creator" placeholder="提交人" autocomplete="off" clearable size="medium" style="width:13%;margin-right: 15px;" />
  10. <el-input v-model="queryCode.bugName" placeholder="主题" autocomplete="off" clearable size="medium" style="width:13%;margin-right: 15px;" />
  11. <el-select v-model="queryCode.projectId" size="medium" style="width:15%;margin-right: 15px;" clearable filterable placeholder="项目">
  12. <el-option v-for="item in projectStr" :key="item.id" :label="item.name" :value="item.id" />
  13. </el-select>
  14. <!-- <el-select v-model="queryCode.taskId" size="medium" style="width:15%;margin-right: 15px;" clearable filterable placeholder="任务">
  15. <el-option v-for="item in taskIdStr" :key="item.id" :label="item.name" :value="item.id" />
  16. </el-select> -->
  17. <el-select v-model="queryCode.statusList" size="medium" style="width:17.5%;margin-right: 15px;" multiple filterable clearable collapse-tags placeholder="bug状态">
  18. <el-option v-for="item in bugStatusStr" :key="item.code" :label="item.name" :value="item.code" />
  19. </el-select>
  20. <el-select v-model="queryCode.priorityList" size="medium" style="width:15%;margin-right: 15px;" multiple filterable clearable collapse-tags placeholder="级别">
  21. <el-option v-for="item in bugStatusPriority" :key="item.code" :label="item.name" :value="item.code" />
  22. </el-select>
  23. <el-button type="primary" size="medium" style="margin-right:10px;" icon="el-icon-plus" circle @click="showOrHide()" />
  24. </div>
  25. <div class="set-between">
  26. <el-button type="primary" size="medium" plain @click="dataQuery(queryCode)">查询</el-button>
  27. <el-button type="primary" size="medium" plain @click="createdCode()">新增</el-button>
  28. </div>
  29. </el-form>
  30. <el-date-picker
  31. v-show="timeShow"
  32. v-model="timeInterval"
  33. style="margin-right: 15px;"
  34. size="medium"
  35. type="datetimerange"
  36. range-separator="至"
  37. start-placeholder="创建开始时间"
  38. end-placeholder="创建结束时间"
  39. clearable
  40. />
  41. <el-select v-show="groupShow" v-model="queryCode.taskId" size="medium" style="width:17.5%;margin-right: 15px;" clearable filterable placeholder="任务">
  42. <el-option v-for="item in taskIdStr" :key="item.id" :label="item.name" :value="item.id" />
  43. </el-select>
  44. <el-select v-if="isPlatformShow" v-model="queryCode.platformType" size="medium" style="width:17.5%;margin-right: 15px;" clearable placeholder="平台类型" @change="clickChangeBusiness(queryCode.platformType)">
  45. <el-option v-for="item in platformTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  46. </el-select>
  47. <el-select v-if="isBusinessShow" v-model="queryCode.clientType" size="medium" style="width:17.5%;margin-right: 15px;" clearable placeholder="业务模块" @change="clickChangeModule(queryCode.clientType)">
  48. <el-option v-for="item in businessTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  49. </el-select>
  50. <el-select v-show="groupShow" v-model="queryCode.teamId" size="medium" style="width:17.5%;margin-right: 15px;" multiple filterable clearable collapse-tags placeholder="团队" @visible-change="realTimeChange">
  51. <el-option v-for="item in groupTypeStr" :key="item.id" :label="item.teamName" :value="item.id" />
  52. </el-select>
  53. <el-select v-show="groupShow" v-model="queryCode.repairResult" size="medium" style="width:17.5%;margin: 15px 10px 0px 0px;" clearable placeholder="修复状态">
  54. <el-option v-for="item in repairResultStr" :key="item.code" :label="item.name" :value="item.code" />
  55. </el-select>
  56. <div class="set-locate">
  57. <el-table
  58. :data="tableData"
  59. border
  60. style="width: 100%"
  61. size="mini"
  62. >
  63. <el-table-column
  64. prop="id"
  65. label="ID"
  66. align="center"
  67. width="60"
  68. />
  69. <el-table-column
  70. label="主题"
  71. align="center"
  72. width="180"
  73. show-overflow-tooltip
  74. >
  75. <template slot-scope="scope">
  76. <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row.id)">{{ scope.row.bugName }}</a>
  77. </template>
  78. </el-table-column>
  79. <el-table-column
  80. prop="priorityName"
  81. label="级别"
  82. align="center"
  83. width="60"
  84. />
  85. <el-table-column
  86. label="状态"
  87. align="center"
  88. >
  89. <template slot-scope="scope">
  90. <el-dropdown trigger="click">
  91. <el-tag type="success" style="cursor: pointer;" size="medium"><span>{{ scope.row.bugStatusName }}</span></el-tag>
  92. <el-dropdown-menu slot="dropdown">
  93. <el-dropdown-item icon="el-icon-coin" @click.native="reopenAndWait(scope.row, 0)">待开发</el-dropdown-item>
  94. <el-dropdown-item icon="el-icon-coin" @click.native="getMember(), dialogInDevelopment = true, formStatus = scope.row, pauseData.pauseCurrentHandler = scope.row.assigner.split(',')">开发中</el-dropdown-item>
  95. <el-dropdown-item icon="el-icon-coin" @click.native="getMember(), dialogWaitTest = true, formStatus = scope.row, pauseData.pauseCurrentHandler = scope.row.creator.split(','), pauseData.bugTypePause = scope.row.bugType">待测试</el-dropdown-item>
  96. <el-dropdown-item icon="el-icon-coin" @click.native="dialogInRepairResult = true, formStatus = scope.row">已完成</el-dropdown-item>
  97. <el-dropdown-item icon="el-icon-coin" @click.native="reopenAndWait(scope.row, 4)">reopen</el-dropdown-item>
  98. </el-dropdown-menu>
  99. </el-dropdown>
  100. </template>
  101. </el-table-column>
  102. <el-table-column
  103. prop="currentHandlerList"
  104. label="处理人"
  105. align="center"
  106. show-overflow-tooltip
  107. />
  108. <el-table-column
  109. prop="creatorList"
  110. label="提交人"
  111. align="center"
  112. show-overflow-tooltip
  113. />
  114. <el-table-column
  115. prop="assignerList"
  116. label="责任人"
  117. align="center"
  118. show-overflow-tooltip
  119. />
  120. <el-table-column
  121. prop="repairResultName"
  122. label="修复结果"
  123. align="center"
  124. width="70"
  125. show-overflow-tooltip
  126. />
  127. <el-table-column
  128. prop="gmtCreate"
  129. label="创建日期"
  130. align="center"
  131. show-overflow-tooltip
  132. />
  133. <el-table-column
  134. label="操作"
  135. align="center"
  136. width="220"
  137. >
  138. <template v-slot="scope">
  139. <div>
  140. <el-button size="mini" type="primary" plain @click="queryPresentation(scope.row)">更新</el-button>
  141. <el-button size="mini" type="danger" :disabled="scope.row.creatorList !== userNames" plain @click="delePresentation(scope.row.id)">删除</el-button>
  142. <el-button size="mini" type="info" plain @click="copyArrange(scope.row.id)">复制</el-button>
  143. </div>
  144. </template>
  145. </el-table-column>
  146. </el-table>
  147. <el-tooltip effect="dark" content="表格下载" placement="top">
  148. <el-button circle type="success" style="float: right;margin-top: 10px;" size="mini" class="el-icon-download" @click="downloadExcel()" />
  149. </el-tooltip>
  150. <div class="set-locate">
  151. <h4>缺陷分析数据</h4>
  152. <el-table
  153. :data="[statistics]"
  154. border
  155. style="width: 100%"
  156. size="mini"
  157. >
  158. <el-table-column
  159. prop="totalBug"
  160. label="有效Bug总数"
  161. align="center"
  162. />
  163. <el-table-column
  164. prop="invalidBug"
  165. label="无效Bug"
  166. align="center"
  167. />
  168. <el-table-column
  169. prop="fixBug"
  170. label="已解决"
  171. align="center"
  172. />
  173. <el-table-column
  174. prop="rateOfFix"
  175. label="修复率"
  176. align="center"
  177. />
  178. <el-table-column
  179. prop="remainBug"
  180. label="遗留"
  181. align="center"
  182. />
  183. <el-table-column
  184. prop="rateOfReopen"
  185. label="Reopen率"
  186. align="center"
  187. />
  188. <el-table-column
  189. prop="overnightRate"
  190. label="过夜率"
  191. align="center"
  192. />
  193. <el-table-column
  194. prop="fixTime"
  195. label="修复时长"
  196. align="center"
  197. />
  198. <el-table-column
  199. prop="p0"
  200. label="P0"
  201. align="center"
  202. />
  203. <el-table-column
  204. prop="p1"
  205. label="P1"
  206. align="center"
  207. />
  208. <el-table-column
  209. prop="other"
  210. label="其他"
  211. align="center"
  212. />
  213. </el-table>
  214. <el-tooltip effect="dark" placement="bottom">
  215. <div slot="content"><div>总数: 搜索结果下的所有有效缺陷不包含无效bug和重复bug</div> <div style="margin:5px 0">已解决: 状态为已完成并且修复结果为已修复或不修复的bug</div><div style="margin:5px 0">遗留bug: 状态不是已完成状态的bug</div><div style="margin:5px 0">reopen率: reopen次数/bug总数</div><div style="margin:5px 0">过夜: 创建时间-修复时间 >24h/bug总数</div><div style="margin:5px 0">修复时长: 创建时间-修复时间,不包含节假日</div><div style="margin:5px 0">其他: 除p0,p1级之外的bug</div><div>无效bug: 修复结果为无效 或者重复的bug</div></div>
  216. <span class="titleDescription">统计规则说明<i class="el-icon-question" /> </span>
  217. </el-tooltip>
  218. </div>
  219. <el-pagination style="margin-top:30px;" align="center" :current-page="curIndex" :page-sizes="[20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
  220. </div>
  221. </div>
  222. <el-dialog :visible.sync="dialogInDevelopment" width="40%" @close="cancelInput()">
  223. <el-form ref="refeshDevelopmentDialog" :model="pauseData" :rules="serviceDataRulesStatus">
  224. <el-form-item label="开发RD" prop="pauseCurrentHandler" label-width="30%">
  225. <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChangeStatus">
  226. <el-option
  227. v-for="item in optionsCurrentHandlerRD"
  228. :key="item.id"
  229. :label="item.name"
  230. :value="item.email"
  231. />
  232. </el-select>
  233. </el-form-item>
  234. </el-form>
  235. <div slot="footer" class="dialog-footer">
  236. <el-button @click="dialogInDevelopment = false">取 消</el-button>
  237. <el-button type="primary" @click="queryFormDataStatus">确 定</el-button>
  238. </div>
  239. </el-dialog>
  240. <el-dialog :visible.sync="dialogWaitTest" width="40%" @close="cancelInput()">
  241. <el-form ref="refeshWaitTestDialog" :model="pauseData" :rules="serviceDataRulesStatus">
  242. <el-form-item label="验收QA" prop="pauseCurrentHandler" label-width="30%">
  243. <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChangeStatus">
  244. <el-option
  245. v-for="item in optionsCurrentHandlerQA"
  246. :key="item.id"
  247. :label="item.name"
  248. :value="item.email"
  249. />
  250. </el-select>
  251. </el-form-item>
  252. <el-form-item style="flex-grow:1" label="问题原因" prop="reasonPause" label-width="30%">
  253. <el-select v-model="pauseData.reasonPause" placeholder="问题原因" style="width:76%;">
  254. <el-option v-for="item in reasonStr" :key="item.name" :label="item.name" :value="item.code" />
  255. </el-select>
  256. </el-form-item>
  257. <el-form-item style="flex-grow:1" label="bug类型" prop="bugTypePause" label-width="30%">
  258. <el-select v-model="pauseData.bugTypePause" placeholder="bug类型" style="width:76%;">
  259. <el-option v-for="item in bugTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  260. </el-select>
  261. </el-form-item>
  262. <el-form-item label="修复方式" label-width="30%"><el-input v-model="pauseData.pauseReasonsAndSolutionForTheProblem" type="textarea" autocomplete="off" rows="3" style="width:76%;" /></el-form-item>
  263. </el-form>
  264. <div slot="footer" class="dialog-footer">
  265. <el-button @click="dialogWaitTest = false">取 消</el-button>
  266. <el-button type="primary" @click="queryFormDataTest">确 定</el-button>
  267. </div>
  268. </el-dialog>
  269. <el-dialog :visible.sync="dialogInRepairResult" width="40%">
  270. <el-form ref="refeshResultDialog" :model="pauseData" :rules="serviceDataRulesStatus">
  271. <el-form-item label="修复结果" prop="pauseRepairResult" label-width="30%">
  272. <el-select v-model="pauseData.pauseRepairResult" placeholder="修复结果" style="width:76%;">
  273. <el-option v-for="item in repairResultStr" :key="item.name" :label="item.name" :value="item.code" />
  274. </el-select>
  275. </el-form-item>
  276. <el-form-item v-show="pauseData.pauseRepairResult === 2 || pauseData.pauseRepairResult === 5" label="原因" label-width="30%"><el-input v-model="formUpdateValue.notFixReason" type="textarea" autocomplete="off" rows="3" style="width:76%;" /></el-form-item>
  277. </el-form>
  278. <div slot="footer" class="dialog-footer">
  279. <el-button @click="dialogInRepairResult = false">取 消</el-button>
  280. <el-button type="primary" @click="queryFormDataRepair">确 定</el-button>
  281. </div>
  282. </el-dialog>
  283. <el-dialog class="adjustHeight" :title="titName" :visible.sync="dialogFormVisible" width="70%">
  284. <el-form ref="form" :model="form" :rules="serviceDataRules">
  285. <div class="set-background">
  286. <el-form-item label="标题" :label-width="formLabelWidth"><el-input v-model="form.bugName" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:77.2%;" /></el-form-item>
  287. <div style="display:flex;">
  288. <el-form-item style="flex-grow:1" prop="bizId" label="业务线" :label-width="formLabelWidth1">
  289. <el-select v-model="form.bizId" placeholder="业务线" style="width:54.5%;">
  290. <el-option v-for="item in bizOptions" :key="item.value" :label="item.name" :value="item.value" />
  291. </el-select>
  292. </el-form-item>
  293. <el-form-item style="flex-grow:1" label="业务模块" prop="businessType" :label-width="formLabelWidth1">
  294. <el-select v-model="form.businessType" placeholder="业务模块" style="width:54.5%;">
  295. <el-option v-for="item in businessTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  296. </el-select>
  297. </el-form-item>
  298. </div>
  299. <div style="display:flex;">
  300. <el-form-item style="flex-grow:1" prop="taskId" label="任务" :label-width="formLabelWidth1">
  301. <el-select v-model="form.taskId" placeholder="任务" style="width:54.5%;">
  302. <el-option v-for="item in taskIdStr" :key="item.id" :label="item.name" :value="item.id" />
  303. </el-select>
  304. </el-form-item>
  305. <el-form-item style="flex-grow:1" label="平台类型" prop="platformType" :label-width="formLabelWidth1">
  306. <el-select v-model="form.platformType" placeholder="平台类型" style="width:54.5%;" @change="clickChangeType(form.platformType)">
  307. <el-option v-for="item in platformTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  308. </el-select>
  309. </el-form-item>
  310. </div>
  311. <div style="display:flex;">
  312. <el-form-item style="flex-grow:1" label="类型" prop="bugType" :label-width="formLabelWidth1">
  313. <el-select v-model="form.bugType" style="width:54.5%;" placeholder="类型">
  314. <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  315. </el-select>
  316. </el-form-item>
  317. <el-form-item style="flex-grow:1" label="发现方式" prop="discoveryMethod" :label-width="formLabelWidth1">
  318. <el-select v-model="form.discoveryMethod" style="width:54.5%;" placeholder="发现方式">
  319. <el-option v-for="item in discoveryMethodStr" :key="item.name" :label="item.name" :value="item.name" />
  320. </el-select>
  321. </el-form-item>
  322. </div>
  323. <div style="display:flex;">
  324. <el-form-item style="flex-grow:1" label="级别" prop="priority" :label-width="formLabelWidth1">
  325. <el-select v-model="form.priority" style="width:54.5%;" placeholder="级别">
  326. <el-option v-for="item in bugLevelStr" :key="item.name" :label="item.name" :value="item.name" />
  327. </el-select>
  328. </el-form-item>
  329. <el-form-item style="flex-grow:1" label="问题原因" prop="reason" :label-width="formLabelWidth1">
  330. <el-select v-model="form.reason" style="width:54.5%;" placeholder="问题原因">
  331. <el-option v-for="item in reasonStr" :key="item.name" :label="item.name" :value="item.name" />
  332. </el-select>
  333. </el-form-item>
  334. </div>
  335. <div style="display:flex;">
  336. <el-form-item style="flex-grow:1" label="状态" prop="status" :label-width="formLabelWidth1">
  337. <el-select v-model="form.status" placeholder="状态" style="width:54.5%;" @change="buildShow(form.status)">
  338. <el-option v-for="item in bugStatusStr" :key="item.name" :label="item.name" :value="item.name" />
  339. </el-select>
  340. </el-form-item>
  341. <el-form-item style="flex-grow:1" label="所处阶段" prop="stage" :label-width="formLabelWidth1">
  342. <el-select v-model="form.stage" placeholder="所处阶段" style="width:54.5%;">
  343. <el-option v-for="item in stageStr" :key="item.name" :label="item.name" :value="item.name" />
  344. </el-select>
  345. </el-form-item>
  346. </div>
  347. <el-form-item label="bug描述" prop="bugDescribe" :label-width="formLabelWidth"><el-input v-model="form.bugDescribe" type="textarea" placeholder="bug描述" rows="2" style="width:77.2%;" /></el-form-item>
  348. </div>
  349. <div style="display:flex;">
  350. <el-form-item label="创建人" :label-width="formLabelWidth"><el-input v-model="form.creator" autocomplete="off" style="width:67%;" /></el-form-item>
  351. <el-form-item label="bug责任人" prop="assigner" :label-width="formLabelWidth"><el-input v-model="form.assigner" autocomplete="off" style="width:67%;" /></el-form-item>
  352. </div>
  353. <div style="flex:1">
  354. <el-form-item v-show="statusShow" label="问题原因和修复方法" :label-width="formLabelWidth"><el-input v-model="form.reasonsAndSolutionForTheProblem" type="textarea" placeholder="问题原因和修复方法" rows="4" style="width:77.2%;" /></el-form-item>
  355. </div>
  356. <div style="flex:1">
  357. <el-form-item label="bug处理人" prop="currentHandler" :label-width="formLabelWidth"><el-input v-model="form.currentHandler" autocomplete="off" style="width:67%;" /></el-form-item>
  358. <el-form-item label="app版本号" :label-width="formLabelWidth"><el-input v-model="form.appVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  359. <el-form-item label="地图类型" :label-width="formLabelWidth"><el-input v-model="form.mapType" autocomplete="off" style="width:67%;" /></el-form-item>
  360. <el-form-item label="地图版本号" :label-width="formLabelWidth"><el-input v-model="form.mapVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  361. <el-form-item label="SDK版本" :label-width="formLabelWidth"><el-input v-model="form.sdkVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  362. <el-form-item v-show="repairShow" label="修复结果" :label-width="formLabelWidth">
  363. <el-select v-model="form.repairResult" placeholder="发现方法">
  364. <el-option v-for="item in repairResultStr" :key="item.name" :label="item.name" :value="item.name" />
  365. </el-select>
  366. </el-form-item>
  367. </div>
  368. <el-form-item label="附件" :label-width="formLabelWidth">
  369. <el-upload
  370. class="upload-demo"
  371. multiple
  372. capture
  373. accept="image/jpeg, image/png, image/gif, audio/mp4, video/mp4, audio/mpeg, application/vnd.ms-excel"
  374. :on-change="handleChange"
  375. :file-list="fileList"
  376. action="http://page-daily.kuaidadi.com/upload/img.node"
  377. >
  378. <!-- action="http://page-daily.kuaidadi.com/upload/img.node" 线下 -->
  379. <!-- action="http://star.xiaojukeji.com/upload/img.node" 线上 -->
  380. <!-- action="https://jsonplaceholder.typicode.com/posts/" 原始地址-->
  381. <el-button size="small" type="primary">点击上传</el-button>
  382. </el-upload>
  383. </el-form-item>
  384. {{ form.accessory }}
  385. <!-- <el-form-item label="逻辑删" :label-width="formLabelWidth">
  386. <el-select v-model="form.isDelete" placeholder="发现方法">
  387. <el-option v-for="item in isDeleteStr" :key="item.value" :label="item.name" :value="item.value" />
  388. </el-select>
  389. </el-form-item> -->
  390. <!-- <el-form-item label="reopen的次数" :label-width="formLabelWidth"> <el-input v-model="form.reopenTimes" autocomplete="off" /></el-form-item> -->
  391. <!-- <el-form-item label="业务线" prop="bizId" :label-width="formLabelWidth"><el-input v-model="form.bizId" autocomplete="off" /></el-form-item> -->
  392. <!-- <el-form-item label="模块" :label-width="formLabelWidth"><el-input v-model="form.moduleId" autocomplete="off" /></el-form-item> -->
  393. <!-- <el-form-item label="项目名" :label-width="formLabelWidth"><el-input v-model="form.projectName" autocomplete="off" /></el-form-item> -->
  394. <!-- <el-form-item label="项目ID" :label-width="formLabelWidth"><el-input v-model="form.projectId" autocomplete="off" /></el-form-item> -->
  395. <!-- <el-form-item label="测试计划ID" prop="planId" :label-width="formLabelWidth"><el-input v-model="form.planId" autocomplete="off" /></el-form-item> -->
  396. <!-- <el-form-item label="caseID" :label-width="formLabelWidth"><el-input v-model="form.caseId" autocomplete="off" /></el-form-item> -->
  397. <!-- <el-form-item label="bug创建人" :label-width="formLabelWidth"> <el-input v-model="form.creator" autocomplete="off" /></el-form-item> -->
  398. <!-- <el-form-item label="开始开发时间" :label-width="formLabelWidth"><el-input v-model="form.startDevTime" autocomplete="off" /></el-form-item> -->
  399. <!-- <el-form-item label="开始等待测试时间" :label-width="formLabelWidth"><el-input v-model="form.waitTestTime" autocomplete="off" /></el-form-item> -->
  400. <!-- <el-form-item label="创建时间" :label-width="formLabelWidth"><el-input v-model="form.gmtCreate" autocomplete="off" /></el-form-item> -->
  401. <!-- <el-form-item label="修改时间" :label-width="formLabelWidth"><el-input v-model="form.gmtModify" autocomplete="off" /></el-form-item> -->
  402. </el-form>
  403. <div slot="footer" class="dialog-footer">
  404. <el-button @click="dialogFormVisible = false">取 消</el-button>
  405. <el-button type="primary" @click="titName === '新建' ? createFormData(form) : queryFormData(form)">确 定</el-button>
  406. </div>
  407. </el-dialog>
  408. <el-dialog :visible.sync="dialogFormQuery" width="70%">
  409. <el-form :model="form" size="mini">
  410. <el-form-item :label-width="formLabelWidth" style="margin-bottom:-10px;"><span style="font-weight:bold;font-size:20px;margin-left:-60px;">主题 : </span>{{ form.bugName }}</el-form-item><hr>
  411. <div style="display:flex;">
  412. <div style="flex:1">
  413. <el-form-item label="任务 : " class="styline" :label-width="formLabelWidth1">{{ form.projectName }}</el-form-item>
  414. <el-form-item label="级别 : " :label-width="formLabelWidth1">{{ form.priority }}</el-form-item>
  415. <el-form-item label="reopen的次数 : " :label-width="formLabelWidth1">{{ form.reopenTimes }}</el-form-item>
  416. <el-form-item label="bug状态 : " :label-width="formLabelWidth1">{{ form.status }}</el-form-item>
  417. <el-form-item label="bug类型 : " :label-width="formLabelWidth1">{{ form.bugType }}</el-form-item>
  418. <el-form-item label="bug描述 : " :label-width="formLabelWidth1">{{ form.bugDescribe }}</el-form-item>
  419. <el-form-item v-show="statusShow" label="问题原因和修复方法" :label-width="formLabelWidth">{{ form.reasonsAndSolutionForTheProblem }}</el-form-item>
  420. <el-form-item label="问题原因 : " :label-width="formLabelWidth1">{{ form.reason }}</el-form-item>
  421. <el-form-item label="平台类型 : " :label-width="formLabelWidth1">{{ form.platformType }}</el-form-item>
  422. <el-form-item label="业务模块 : " :label-width="formLabelWidth1">{{ form.businessType }}</el-form-item>
  423. <el-form-item label="所处阶段 : " :label-width="formLabelWidth1">{{ form.stage }}</el-form-item>
  424. <el-form-item label="发现方法 : " :label-width="formLabelWidth1">{{ form.discoveryMethod }}</el-form-item>
  425. <el-form-item v-show="repairShow" label="修复结果 : " :label-width="formLabelWidth1">{{ form.repairResult }}</el-form-item>
  426. <el-form-item label="os类型 : " :label-width="formLabelWidth1">{{ form.osType }}</el-form-item>
  427. <el-form-item label="机型 : " :label-width="formLabelWidth1">{{ form.model }}</el-form-item>
  428. <el-form-item label="网络类型 : " :label-width="formLabelWidth1">{{ form.networkType }}</el-form-item>
  429. <el-form-item label="SDK版本 : " :label-width="formLabelWidth1">{{ form.sdkVersion }}</el-form-item>
  430. <el-form-item label="app版本号 : " :label-width="formLabelWidth1">{{ form.appVersion }}</el-form-item>
  431. <el-form-item label="地图类型 : " :label-width="formLabelWidth1">{{ form.mapType }}</el-form-item>
  432. <el-form-item label="地图版本号 : " :label-width="formLabelWidth1">{{ form.mapVersion }}</el-form-item>
  433. <el-form-item label="附件 : " :label-width="formLabelWidth1">{{ form.accessory }}</el-form-item>
  434. </div>
  435. <div style="flex:1; margin-left:30px;">
  436. <el-form-item label="业务线 : " :label-width="formLabelWidth1">{{ form.bizId }}</el-form-item>
  437. <el-form-item label="bug责任人 : " :label-width="formLabelWidth1">{{ form.assigner }}</el-form-item>
  438. <el-form-item label="bug创建人 : " :label-width="formLabelWidth1">{{ form.creator }}</el-form-item>
  439. <el-form-item label="bug处理人 : " :label-width="formLabelWidth1">{{ form.currentHandler }}</el-form-item>
  440. <el-form-item label="开始开发时间 : " :label-width="formLabelWidth1">{{ form.startDevTime }}</el-form-item>
  441. <el-form-item label="开始等待测试时间 : " :label-width="formLabelWidth1">{{ form.waitTestTime }}</el-form-item>
  442. <el-form-item label="创建时间 : " :label-width="formLabelWidth1">{{ form.gmtCreate }}</el-form-item>
  443. </div>
  444. </div>
  445. <!-- <el-form-item label="caseID" :label-width="formLabelWidth">{{ form.caseId }}</el-form-item> -->
  446. <!-- <el-form-item label="项目名" :label-width="formLabelWidth">{{ form.projectName }}</el-form-item> -->
  447. <!-- <el-form-item label="项目ID" :label-width="formLabelWidth">{{ form.projectId }}</el-form-item> -->
  448. <!-- <el-form-item label="测试计划ID" :label-width="formLabelWidth">{{ form.planId }}</el-form-item> -->
  449. <!-- <el-form-item label="逻辑删" :label-width="formLabelWidth">{{ form.isDelete }}</el-form-item> -->
  450. <!-- <el-form-item label="业务线" :label-width="formLabelWidth">{{ form.bizId }}</el-form-item> -->
  451. <!-- <el-form-item label="模块ID" :label-width="formLabelWidth">{{ form.moduleId }}</el-form-item> -->
  452. <!-- <el-form-item label="修改时间" :label-width="formLabelWidth">{{ form.gmtModify }}</el-form-item> -->
  453. </el-form>
  454. <div slot="footer" class="dialog-footer">
  455. <el-button type="primary" @click="dialogFormQuery = false">关 闭</el-button>
  456. </div>
  457. </el-dialog>
  458. </div>
  459. </div></template>
  460. <script>
  461. import { bugList, bugDelete, bugUpdate, bugCreate, bugCopy, taskListCreate, bugGetEnum, projectListOnlyInfo } from '@/api/defectManage'
  462. import { projectGetTypeMap, groupDataGet, teamMembers } from '@/api/projectPage.js'
  463. import axios from 'axios'
  464. export default {
  465. name: 'DefectManage',
  466. data() {
  467. return {
  468. isPlatformShow: false,
  469. isBusinessShow: false,
  470. groupShow: false,
  471. projectStr: [],
  472. bugTypeStr: [],
  473. groupTypeStr: [],
  474. bugStatusStr: [],
  475. bizOptionsRR: [],
  476. bizOptions: [{ name: '万象', value: 101 }, { name: '企业级', value: 100 }, { name: '滴滴代驾', value: 261 }, { name: 'prado', value: 330 }, { name: 'carbo', value: 331 }, { name: '海马', value: 309 }],
  477. bugLevelStr: [{ name: 'p0', value: 0 }, { name: 'p1', value: 1 }, { name: 'p2', value: 2 }, { name: 'p3', value: 3 }],
  478. reasonStr: [],
  479. platformTypeStr: [],
  480. stageStr: [],
  481. discoveryMethodStr: [],
  482. businessTypeStr: [],
  483. bugStatusPriority: [],
  484. repairResultStr: [],
  485. statistics: [],
  486. isDeleteStr: [{ name: '保留', value: 0 }, { name: '删除', value: 1 }],
  487. serviceDataRules: {
  488. bizId: [{ required: true, message: '业务线不能为空', trigger: 'change' }],
  489. taskId: [{ required: true, message: '任务不能为空', trigger: 'change' }],
  490. bugType: [{ required: true, message: 'bug类型不能为空', trigger: 'change' }],
  491. discoveryMethod: [{ required: true, message: '发现方式不能为空', trigger: 'change' }],
  492. reason: [{ required: true, message: '问题原因不能为空', trigger: 'change' }],
  493. priority: [{ required: true, message: '级别不能为空', trigger: 'change' }],
  494. status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
  495. platformType: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
  496. stage: [{ required: true, message: '所处阶段不能为空', trigger: 'change' }],
  497. assigner: [{ required: true, message: 'bug责任人不能为空', trigger: 'change' }],
  498. currentHandler: [{ required: true, message: 'bug处理人不能为空', trigger: 'change' }],
  499. bugDescribe: [{ required: true, message: 'bug描述不能为空', trigger: 'change' }],
  500. businessType: [{ required: true, message: '业务模块不能为空', trigger: 'change' }]
  501. },
  502. userInformation: localStorage.getItem('username'),
  503. userNames: localStorage.getItem('realname'),
  504. bizJson: localStorage.getItem('key'),
  505. pageSize: 20,
  506. curIndex: 1,
  507. total: 0,
  508. show2: '',
  509. indexPage: {},
  510. form: {
  511. id: ''
  512. },
  513. formStatus: {},
  514. pauseData: {
  515. reasonPause: '',
  516. bugTypePause: '',
  517. pauseCurrentHandler: '',
  518. pauseRepairResult: '',
  519. pauseReasonsAndSolutionForTheProblem: ''
  520. },
  521. serviceDataRulesStatus: {
  522. pauseCurrentHandler: [{ required: true, message: '处理人不能为空', trigger: 'blur' }],
  523. reasonPause: [{ required: true, message: '问题原因不能为空', trigger: 'change' }],
  524. bugTypePause: [{ required: true, message: 'bug类型不能为空', trigger: 'change' }],
  525. pauseRepairResult: [{ required: true, message: '修复结果不能为空', trigger: 'change' }]
  526. },
  527. dialogInDevelopment: false,
  528. dialogWaitTest: false,
  529. dialogInRepairResult: false,
  530. tableData: [],
  531. downloadExcelData: [],
  532. formUpdateValue: {},
  533. optionsCurrentHandlerQA: [],
  534. optionsCurrentHandlerRD: [],
  535. queryCode: {
  536. repairResult: '',
  537. teamId: '',
  538. clientType: '',
  539. platformType: '',
  540. taskId: '',
  541. priorityList: [],
  542. statusList: [],
  543. projectId: '',
  544. bugName: '',
  545. creator: '',
  546. assigner: ''
  547. },
  548. statusShow: false,
  549. repairShow: false,
  550. timeShow: false,
  551. dialogFormVisible: false,
  552. dialogFormQuery: false,
  553. formLabelWidth: '11%',
  554. formLabelWidth1: '22%',
  555. serviceTypeEnumList: [],
  556. clientTypeEnumList: [],
  557. objData: '',
  558. userData: '',
  559. titName: '',
  560. taskIdStr: '',
  561. timeInterval: [],
  562. fileList: [],
  563. fileDbList: []
  564. }
  565. },
  566. created() {
  567. this.getList()
  568. this.forkDown()
  569. this.bugListSelect()
  570. },
  571. mounted() {
  572. document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
  573. this.getQueryData()
  574. },
  575. activated() {
  576. this.dataQuery(this.queryCode)
  577. },
  578. methods: {
  579. getList() {
  580. this.bizJson = localStorage.getItem('key')
  581. this.indexPage = {
  582. bizId: this.bizJson,
  583. pageSize: this.pageSize,
  584. curIndex: this.curIndex
  585. }
  586. projectListOnlyInfo({ bizId: this.bizJson }).then(res => {
  587. res.code === 200 ? this.projectStr = res.data : this.errorFun(res.msg)
  588. })
  589. bugList(this.indexPage).then(res => {
  590. if (res.code === 200) {
  591. this.statistics = res.query
  592. this.tableData = res.data
  593. this.total = res.total
  594. } else {
  595. this.errorFun(res.msg)
  596. }
  597. })
  598. },
  599. showOrHide() {
  600. this.timeShow = !this.timeShow
  601. this.groupShow = !this.groupShow
  602. this.isPlatformShow = !this.isPlatformShow
  603. this.$set(this.queryCode, 'taskId', '')
  604. this.$set(this.queryCode, 'platformType', '')
  605. this.$set(this.queryCode, 'repairResult', '')
  606. this.$set(this.queryCode, 'teamId', '')
  607. this.isBusinessShow === true ? this.isBusinessShow = false : this.isBusinessShow = false
  608. },
  609. bugListSelect() {
  610. bugGetEnum().then(res => {
  611. this.bugStatusStr = res.data.bugEnumList
  612. this.bugStatusPriority = res.data.priorityEnumList
  613. this.stageStr = res.data.bugStageEnumList
  614. this.reasonStr = res.data.reasonEnumList
  615. this.platformTypeStr = res.data.platformTypeEnumList
  616. this.bugTypeStr = res.data.bugTypeEnumList
  617. this.bugLevelStr = res.data.priorityEnumList
  618. this.discoveryMethodStr = res.data.discoveryMethodEnumList
  619. this.repairResultStr = res.data.repairResultEnumList
  620. this.clientTypeEnumList = res.data.clientTypeEnumList
  621. this.serviceTypeEnumList = res.data.serviceTypeEnumList
  622. })
  623. },
  624. reopenAndWait(scope, status) {
  625. this.formUpdateValue.currentHandler = scope.currentHandler
  626. this.formUpdateValue.id = scope.id
  627. this.formUpdateValue.status = status
  628. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  629. this.objData = { bugBaseInfo: this.formUpdateValue, user: this.userData }
  630. bugUpdate(this.objData).then(res => {
  631. if (res.code === 200) {
  632. this.successFun('UpDate')
  633. this.getList()
  634. if (this.$refs.refeshDevelopmentDialog !== undefined) {
  635. this.$refs.refeshDevelopmentDialog.resetFields()
  636. }
  637. } else {
  638. this.errorFun(res.msg)
  639. }
  640. })
  641. this.formUpdateValue = {}
  642. },
  643. clickChangeType(e) {
  644. if (e === '服务端') {
  645. this.businessTypeStr = this.serviceTypeEnumList
  646. } else {
  647. this.businessTypeStr = this.clientTypeEnumList
  648. }
  649. },
  650. // 接口不接受空值处理
  651. emptyJudge(obj) {
  652. for (const key in obj) {
  653. if (!obj[key] || obj[key].length === 0) {
  654. delete obj[key]
  655. }
  656. }
  657. },
  658. dataQuery(e) {
  659. this.bizJson = localStorage.getItem('key')
  660. this.indexPage = e
  661. this.curIndex = 1
  662. this.indexPage.bizId = this.bizJson
  663. this.indexPage.pageSize = this.pageSize
  664. this.indexPage.curIndex = this.curIndex
  665. if (this.timeShow && this.timeInterval !== null) {
  666. this.indexPage.gmtCreateBegin = this.timeInterval[0]
  667. this.indexPage.gmtCreateEnd = this.timeInterval[1]
  668. } else {
  669. this.indexPage.gmtCreateBegin = ''
  670. this.indexPage.gmtCreateEnd = ''
  671. }
  672. this.emptyJudge(this.indexPage)
  673. bugList(this.indexPage).then(res => {
  674. if (res.code === 200) {
  675. this.tableData = res.data
  676. this.total = res.total
  677. this.statistics = res.query
  678. } else {
  679. this.errorFun(res.msg)
  680. }
  681. })
  682. },
  683. // 业务线数据获取
  684. forkDown() {
  685. projectGetTypeMap().then(res => {
  686. if (res.code === 200) {
  687. this.bizOptionsRR = res.data
  688. if (this.bizJson) {
  689. this.platformTypeStr = this.bizOptionsRR.filter(value => value.code === parseInt(this.bizJson))[0].child
  690. this.$set(this.queryCode, 'platformType', '')
  691. this.$set(this.queryCode, 'clientType', '')
  692. } else {
  693. this.isPlatformShow = false
  694. this.isBusinessShow = false
  695. }
  696. } else {
  697. this.errorFun('业务线数据获取失败')
  698. }
  699. })
  700. },
  701. // 弹窗关闭时重置
  702. cancelInput() {
  703. this.pauseData.pauseCurrentHandler = ''
  704. },
  705. // 格式转换,直接复制即可
  706. formatJson(filterVal, jsonData) {
  707. return jsonData.map(v => filterVal.map(j => v[j]))
  708. },
  709. // 列表下载
  710. downloadExcel() {
  711. this.queryCode.bizId = this.bizJson
  712. delete this.queryCode.curIndex
  713. delete this.queryCode.pageSize
  714. if (this.timeShow && this.timeInterval !== null) {
  715. this.queryCode.gmtCreateBegin = this.timeInterval[0]
  716. this.queryCode.gmtCreateEnd = this.timeInterval[1]
  717. } else {
  718. this.queryCode.gmtCreateBegin = ''
  719. this.queryCode.gmtCreateEnd = ''
  720. }
  721. this.emptyJudge(this.queryCode)
  722. bugList(this.queryCode).then(res => {
  723. if (res.code === 200) {
  724. this.downloadExcelData = res.data
  725. require.ensure([], () => {
  726. const { export_json_to_excel } = require('@/excel/Export2Excel') // 这里必须使用绝对路径,使用@/+存放export2Excel的路径
  727. const tHeader = ['ID', '主题', '级别', '状态', '处理人', '提交人', '责任人', '修复结果', '平台类型', '业务模块', '工程模块', '更新时间', '错误类型', 'reopen次数', '问题原因', '创建日期'] // 导出的表头名信息
  728. const filterVal = ['id', 'bugName', 'priorityName', 'bugStatusName', 'currentHandlerList', 'creatorList', 'assignerList', 'repairResultName', 'platformTypeName', 'clientName', 'bizModuleName', 'gmtModify', 'bugTypeName', 'reopenTimes', 'reasomName', 'gmtCreate'] // 导出的表头字段名,需要导出表格字段名
  729. const list = this.downloadExcelData
  730. const data = this.formatJson(filterVal, list)
  731. export_json_to_excel(tHeader, data, '缺陷excel')// 导出的表格名称,根据需要自己命名
  732. })
  733. } else {
  734. this.errorFun(res.msg)
  735. }
  736. })
  737. },
  738. // 人员搜索
  739. getMember() {
  740. const objDataRD = { bizId: this.formStatus.bizId, email: '', role: 'rd' }
  741. const objDataQA = { bizId: this.formStatus.bizId, email: '', role: 'qa' }
  742. axios.all([teamMembers(objDataRD), teamMembers(objDataQA)]).then(axios.spread((resRD, resQA) => {
  743. if (resRD.code === 200 && resQA.code === 200) {
  744. this.optionsCurrentHandlerRD = resRD.data
  745. this.optionsCurrentHandlerQA = resQA.data
  746. } else {
  747. this.errorFun('人员数据获取失败')
  748. }
  749. }))
  750. },
  751. // 点击一次更新一次
  752. realTimeChangeStatus(e) {
  753. if (e === true) this.getMember()
  754. },
  755. queryFormDataStatus() {
  756. this.$refs.refeshDevelopmentDialog.validate((valid) => {
  757. if (valid) {
  758. if (this.dialogWaitTest || this.dialogInDevelopment) {
  759. this.formStatus.currentHandler = this.pauseData.pauseCurrentHandler.join(',')
  760. }
  761. this.formUpdateValue.currentHandler = this.formStatus.currentHandler
  762. this.formUpdateValue.id = this.formStatus.id
  763. this.formUpdateValue.status = 1
  764. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  765. this.objData = { bugBaseInfo: this.formUpdateValue, user: this.userData }
  766. bugUpdate(this.objData).then(res => {
  767. if (res.code === 200) {
  768. this.successFun('UpDate')
  769. this.getList()
  770. } else {
  771. this.errorFun(res.msg)
  772. }
  773. this.dialogInDevelopment = false
  774. this.formUpdateValue = {}
  775. })
  776. }
  777. })
  778. },
  779. queryFormDataTest() {
  780. this.$refs.refeshWaitTestDialog.validate((valid) => {
  781. if (valid) {
  782. if (this.dialogWaitTest || this.dialogInDevelopment) {
  783. this.formStatus.currentHandler = this.pauseData.pauseCurrentHandler.join(',')
  784. this.formStatus.reason = this.pauseData.reasonPause
  785. this.formStatus.bugType = this.pauseData.bugTypePause
  786. }
  787. this.formUpdateValue.currentHandler = this.formStatus.currentHandler
  788. this.formUpdateValue.id = this.formStatus.id
  789. this.formUpdateValue.status = 2
  790. this.formUpdateValue.reason = this.pauseData.reasonPause
  791. this.formUpdateValue.bugType = this.pauseData.bugTypePause
  792. this.formUpdateValue.reasonsAndSolutionForTheProblem = this.pauseData.pauseReasonsAndSolutionForTheProblem
  793. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  794. this.objData = { bugBaseInfo: this.formUpdateValue, user: this.userData }
  795. bugUpdate(this.objData).then(res => {
  796. if (res.code === 200) {
  797. this.successFun('UpDate')
  798. this.getList()
  799. if (this.$refs.refeshWaitTestDialog !== undefined) {
  800. this.$refs.refeshWaitTestDialog.resetFields()
  801. }
  802. } else {
  803. this.errorFun(res.msg)
  804. }
  805. this.dialogWaitTest = false
  806. this.formUpdateValue = {}
  807. })
  808. }
  809. })
  810. },
  811. queryFormDataRepair() {
  812. this.$refs.refeshResultDialog.validate((valid) => {
  813. if (valid) {
  814. if (this.dialogInRepairResult) {
  815. this.formStatus.repairResult = this.pauseData.pauseRepairResult
  816. }
  817. this.formUpdateValue.currentHandler = this.formStatus.currentHandler
  818. this.formUpdateValue.id = this.formStatus.id
  819. this.formUpdateValue.status = 3
  820. this.formUpdateValue.repairResult = this.formStatus.repairResult
  821. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  822. this.objData = { bugBaseInfo: this.formUpdateValue, user: this.userData }
  823. bugUpdate(this.objData).then(res => {
  824. if (res.code === 200) {
  825. this.successFun('UpDate')
  826. this.getList()
  827. if (this.$refs.refeshResultDialog !== undefined) {
  828. this.$refs.refeshResultDialog.resetFields()
  829. }
  830. } else {
  831. this.errorFun(res.msg)
  832. }
  833. this.dialogInRepairResult = false
  834. this.formUpdateValue = {}
  835. })
  836. }
  837. })
  838. },
  839. // 团队查询
  840. realTimeChange() {
  841. const user = { ename: this.userInformation, name: this.userNames }
  842. groupDataGet(user).then(res => {
  843. res.code === 200 ? this.groupTypeStr = res.data : this.errorFun(res.msg)
  844. })
  845. },
  846. // 业务线取子数据
  847. clickChangeBusiness(e) {
  848. if (e && this.platformTypeStr.filter(value => value.code === e)[0].child) {
  849. this.isBusinessShow = true
  850. this.businessTypeStr = this.platformTypeStr.filter(value => value.code === e)[0].child
  851. this.$set(this.queryCode, 'clientType', '')
  852. } else {
  853. this.queryCode.clientType = ''
  854. this.isBusinessShow = false
  855. }
  856. },
  857. clickChangeModule(e) {
  858. if (!e) {
  859. this.queryCode.clientType = ''
  860. }
  861. },
  862. dataQueryInSearch(e) {
  863. this.bizJson = localStorage.getItem('key')
  864. this.indexPage = e
  865. this.indexPage.bizId = this.bizJson
  866. this.indexPage.pageSize = this.pageSize
  867. this.indexPage.curIndex = this.curIndex
  868. if (this.timeShow) {
  869. this.indexPage.gmtCreateBegin = this.timeInterval[0]
  870. this.indexPage.gmtCreateEnd = this.timeInterval[1]
  871. } else {
  872. this.indexPage.gmtCreateBegin = ''
  873. this.indexPage.gmtCreateEnd = ''
  874. }
  875. this.emptyJudge(this.indexPage)
  876. bugList(this.indexPage).then(res => {
  877. if (res.code === 200) {
  878. this.tableData = res.data
  879. this.total = res.total
  880. } else {
  881. this.errorFun(res.msg)
  882. }
  883. })
  884. },
  885. // // 删除报告
  886. delePresentation(e) {
  887. this.$confirm('是否确认删除', '确认信息', {
  888. distinguishCancelAndClose: true,
  889. confirmButtonText: '确定',
  890. cancelButtonText: '取消'
  891. })
  892. .then(() => {
  893. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  894. bugDelete(this.userData, e).then(res => {
  895. res.code === 200 ? this.$message({ type: 'success', message: '已删除' }) : this.errorFun(res.msg)
  896. this.getList()
  897. })
  898. })
  899. .catch(action => {
  900. this.$message({ type: 'success', message: '已取消' })
  901. })
  902. },
  903. copyArrange(e) {
  904. this.userData = { id: e, ename: this.userInformation, name: this.userNames }
  905. bugCopy(this.userData, e).then(res => {
  906. res.code === 200 ? this.successFun('Copy') : this.errorFun(res.msg)
  907. this.getList()
  908. })
  909. },
  910. queryPresentation(ele) {
  911. this.titName = '编辑'
  912. this.form = ele
  913. for (var a of this.bizOptions) {
  914. if (ele.bizId === a.value) {
  915. this.bizId = a.name
  916. }
  917. }
  918. // this.bizId = ele.bizId
  919. this.form.taskId = ele.taskId
  920. this.buildShow(ele)
  921. this.$router.push({ name: '更新Bug', params: { formData: this.form }, query: { id: this.form.id }})
  922. // this.dialogFormVisible = true
  923. },
  924. buildShow(ele) {
  925. if (ele.status === '待回归' || ele === 2) {
  926. this.statusShow = true
  927. }
  928. if (ele.repairResult === '已修复' || ele === 3) {
  929. this.repairShow = true
  930. }
  931. },
  932. queryFormData(form) {
  933. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  934. this.objData = { bugBaseInfo: this.form, user: this.userData }
  935. bugUpdate(this.objData).then(res => {
  936. res.code === 200 ? this.successFun('UpDate') : this.errorFun(res.msg)
  937. this.dialogFormVisible = false
  938. this.getList()
  939. })
  940. },
  941. getQueryData() {
  942. this.$route.query.code === 4 ? this.queryCode.taskId = this.$route.query.id : ''
  943. this.bizJson = localStorage.getItem('key')
  944. taskListCreate({ bizId: this.bizJson }).then(res => {
  945. this.taskIdStr = res.data
  946. })
  947. },
  948. handleSizeChange(size) {
  949. this.curIndex = 1
  950. console.log(1)
  951. this.pageSize = size
  952. this.dataQueryInSearch(this.queryCode)
  953. },
  954. handleCurrentChange(curIndex) {
  955. this.curIndex = curIndex
  956. console.log(2)
  957. this.dataQueryInSearch(this.queryCode)
  958. },
  959. createdCode() {
  960. // this.titName = '新建'
  961. // this.dialogFormVisible = true
  962. this.form = {}
  963. // this.$route.query.code === 4 ? this.form.taskId = this.$route.query.id : ''
  964. // if (this.$refs['form'] !== undefined) {
  965. // this.$refs['form'].resetFields()
  966. // }
  967. this.$router.push({ name: '新建Bug' })
  968. },
  969. createFormData(form) {
  970. this.$refs['form'].validate((valid) => {
  971. if (valid) {
  972. // form.bizId = this.bizJson
  973. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  974. this.objData = { bugBaseInfo: form, user: this.userData }
  975. bugCreate(this.objData).then(res => {
  976. this.dialogFormVisible = false
  977. this.getList()
  978. res.code === 200 ? this.successFun('Create') : this.errorFun(res.msg)
  979. })
  980. }
  981. })
  982. },
  983. toReportView(e) {
  984. this.$router.push({ name: '查看Bug', query: { id: e }})
  985. },
  986. handleChange(file, fileList) {
  987. this.fileDbList = []
  988. this.fileList = fileList.slice(-3)
  989. for (var a of this.fileList) {
  990. this.fileDbList.push({ name: a.name, url: 'http' + a.response.url })
  991. }
  992. var arr = []
  993. for (var el of this.fileDbList) {
  994. arr.push({ 'name': el.name, 'url': el.response.url })
  995. }
  996. },
  997. successFun(suc) {
  998. this.$notify({ title: 'Success', message: suc + ' Successfully', type: 'success', duration: 2000 })
  999. },
  1000. errorFun(err) {
  1001. this.$notify({ title: 'Failed', message: err, type: 'error', duration: 2000 })
  1002. }
  1003. }
  1004. }
  1005. </script>
  1006. <style lang="stylus" scoped>
  1007. .set-background
  1008. background-color #F2F3F6
  1009. display flex
  1010. justify-content center
  1011. min-width 900px
  1012. .block
  1013. background-color rgba(255,255,255,1)
  1014. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  1015. border-radius 7px
  1016. width 96%
  1017. margin 20px 0
  1018. padding 20px
  1019. min-height calc(100vh - 100px)
  1020. .block >>> .el-form
  1021. display flex
  1022. justify-content space-between
  1023. margin 10px 0px 15px 0px
  1024. .block >>> .el-form-item__content
  1025. margin-left 0 !important
  1026. .block >>> th
  1027. background-color #F0F2F4 !important
  1028. .block >>> .el-range-separator
  1029. padding 0
  1030. .set-between
  1031. display flex
  1032. .set-between >>> .el-button
  1033. height 36px
  1034. .set-between >>> .el-form-item
  1035. display flex
  1036. margin-right -35px
  1037. .set-locate
  1038. margin-top 25px
  1039. .titleDescription
  1040. font-size 12px
  1041. color rgba(244,121,121,1)
  1042. margin 30px 0px
  1043. display inline-block
  1044. </style>