defectManagement.vue 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  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.currentHandler" 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.taskId" size="medium" style="width:15%;margin-right: 15px;" clearable placeholder="任务">
  12. <el-option v-for="item in taskIdStr" :key="item.id" :label="item.name" :value="item.id" />
  13. </el-select>
  14. <el-select v-model="queryCode.status" size="medium" style="width:15%;margin-right: 15px;" clearable placeholder="bug状态">
  15. <el-option v-for="item in bugStatusStr" :key="item.code" :label="item.name" :value="item.code" />
  16. </el-select>
  17. <el-select v-model="queryCode.priority" size="medium" style="width:15%;margin-right: 15px;" clearable placeholder="级别">
  18. <el-option v-for="item in bugStatusPriority" :key="item.code" :label="item.name" :value="item.code" />
  19. </el-select>
  20. <el-select v-model="queryCode.repairResult" size="medium" style="width:15%;margin-right: 10px;" clearable placeholder="修复状态">
  21. <el-option v-for="item in repairResultStr" :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="timeShow = !timeShow, isPlatformShow = !isPlatformShow, queryCode.platformType = '', isBusinessShow === true ? isBusinessShow = false : isBusinessShow = false" />
  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. size="medium"
  34. type="datetimerange"
  35. range-separator="至"
  36. start-placeholder="创建开始时间"
  37. end-placeholder="创建结束时间"
  38. clearable
  39. />
  40. <el-select v-if="isPlatformShow" v-model="queryCode.platformType" size="medium" style="width:17.5%;margin-right: 15px;" clearable placeholder="平台类型" @change="clickChangeBusiness(queryCode.platformType)">
  41. <el-option v-for="item in platformTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  42. </el-select>
  43. <el-select v-if="isBusinessShow" v-model="queryCode.clientType" size="medium" style="width:17.5%;margin-right: 15px;" clearable placeholder="业务模块" @change="clickChangeModule(queryCode.clientType)">
  44. <el-option v-for="item in businessTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  45. </el-select>
  46. <div class="set-locate">
  47. <el-table
  48. :data="tableData"
  49. border
  50. style="width: 100%"
  51. size="mini"
  52. >
  53. <el-table-column
  54. prop="id"
  55. label="ID"
  56. align="center"
  57. width="60"
  58. />
  59. <el-table-column
  60. label="主题"
  61. align="center"
  62. width="180"
  63. show-overflow-tooltip
  64. >
  65. <template slot-scope="scope">
  66. <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row.id)">{{ scope.row.bugName }}</a>
  67. </template>
  68. </el-table-column>
  69. <el-table-column
  70. prop="priorityName"
  71. label="级别"
  72. align="center"
  73. width="60"
  74. />
  75. <el-table-column
  76. label="状态"
  77. align="center"
  78. >
  79. <template slot-scope="scope">
  80. <el-tag type="success" size="medium"><span>{{ scope.row.bugStatusName }}</span></el-tag>
  81. </template>
  82. </el-table-column>
  83. <el-table-column
  84. prop="currentHandlerList"
  85. label="处理人"
  86. align="center"
  87. show-overflow-tooltip
  88. />
  89. <el-table-column
  90. prop="creatorList"
  91. label="提交人"
  92. align="center"
  93. show-overflow-tooltip
  94. />
  95. <el-table-column
  96. prop="assignerList"
  97. label="责任人"
  98. align="center"
  99. show-overflow-tooltip
  100. />
  101. <el-table-column
  102. prop="repairResultName"
  103. label="修复结果"
  104. align="center"
  105. width="70"
  106. show-overflow-tooltip
  107. />
  108. <el-table-column
  109. prop="gmtCreate"
  110. label="创建日期"
  111. align="center"
  112. show-overflow-tooltip
  113. />
  114. <el-table-column
  115. label="操作"
  116. align="center"
  117. width="220"
  118. >
  119. <template v-slot="scope">
  120. <div>
  121. <el-button size="mini" type="primary" plain @click="queryPresentation(scope.row)">更新</el-button>
  122. <el-button size="mini" type="danger" plain @click="delePresentation(scope.row.id)">删除</el-button>
  123. <el-button size="mini" type="info" plain @click="copyArrange(scope.row.id)">复制</el-button>
  124. </div>
  125. </template>
  126. </el-table-column>
  127. </el-table>
  128. <div class="set-locate">
  129. <h4>缺陷分析数据</h4>
  130. <el-table
  131. :data="[statistics]"
  132. border
  133. style="width: 100%"
  134. size="mini"
  135. >
  136. <el-table-column
  137. prop="totalBug"
  138. label="有效Bug总数"
  139. align="center"
  140. />
  141. <el-table-column
  142. prop="invalidBug"
  143. label="无效Bug"
  144. align="center"
  145. />
  146. <el-table-column
  147. prop="fixBug"
  148. label="已解决"
  149. align="center"
  150. />
  151. <el-table-column
  152. prop="rateOfFix"
  153. label="修复率"
  154. align="center"
  155. />
  156. <el-table-column
  157. prop="remainBug"
  158. label="遗留"
  159. align="center"
  160. />
  161. <el-table-column
  162. prop="rateOfReopen"
  163. label="Reopen率"
  164. align="center"
  165. />
  166. <el-table-column
  167. prop="overnightRate"
  168. label="过夜率"
  169. align="center"
  170. />
  171. <el-table-column
  172. prop="fixTime"
  173. label="修复时长"
  174. align="center"
  175. />
  176. <el-table-column
  177. prop="p0"
  178. label="P0"
  179. align="center"
  180. />
  181. <el-table-column
  182. prop="p1"
  183. label="P1"
  184. align="center"
  185. />
  186. <el-table-column
  187. prop="other"
  188. label="其他"
  189. align="center"
  190. />
  191. </el-table>
  192. <el-tooltip effect="dark" placement="bottom">
  193. <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>
  194. <span class="titleDescription">统计规则说明<i class="el-icon-question" /> </span>
  195. </el-tooltip>
  196. </div>
  197. <el-pagination style="margin-top:30px;" align="center" :current-page="curIndex" :page-sizes="[5, 10, 20]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
  198. </div>
  199. </div>
  200. <el-dialog class="adjustHeight" :title="titName" :visible.sync="dialogFormVisible" width="70%">
  201. <el-form ref="form" :model="form" :rules="serviceDataRules">
  202. <div class="set-background">
  203. <el-form-item label="标题" :label-width="formLabelWidth"><el-input v-model="form.bugName" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:77.2%;" /></el-form-item>
  204. <div style="display:flex;">
  205. <el-form-item style="flex-grow:1" prop="bizId" label="业务线" :label-width="formLabelWidth1">
  206. <el-select v-model="form.bizId" placeholder="业务线" style="width:54.5%;">
  207. <el-option v-for="item in bizOptions" :key="item.value" :label="item.name" :value="item.value" />
  208. </el-select>
  209. </el-form-item>
  210. <el-form-item style="flex-grow:1" label="业务模块" prop="businessType" :label-width="formLabelWidth1">
  211. <el-select v-model="form.businessType" placeholder="业务模块" style="width:54.5%;">
  212. <el-option v-for="item in businessTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  213. </el-select>
  214. </el-form-item>
  215. </div>
  216. <div style="display:flex;">
  217. <el-form-item style="flex-grow:1" prop="taskId" label="任务" :label-width="formLabelWidth1">
  218. <el-select v-model="form.taskId" placeholder="任务" style="width:54.5%;">
  219. <el-option v-for="item in taskIdStr" :key="item.id" :label="item.name" :value="item.id" />
  220. </el-select>
  221. </el-form-item>
  222. <el-form-item style="flex-grow:1" label="平台类型" prop="platformType" :label-width="formLabelWidth1">
  223. <el-select v-model="form.platformType" placeholder="平台类型" style="width:54.5%;" @change="clickChangeType(form.platformType)">
  224. <el-option v-for="item in platformTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  225. </el-select>
  226. </el-form-item>
  227. </div>
  228. <div style="display:flex;">
  229. <el-form-item style="flex-grow:1" label="类型" prop="bugType" :label-width="formLabelWidth1">
  230. <el-select v-model="form.bugType" style="width:54.5%;" placeholder="类型">
  231. <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.name" />
  232. </el-select>
  233. </el-form-item>
  234. <el-form-item style="flex-grow:1" label="发现方式" prop="discoveryMethod" :label-width="formLabelWidth1">
  235. <el-select v-model="form.discoveryMethod" style="width:54.5%;" placeholder="发现方式">
  236. <el-option v-for="item in discoveryMethodStr" :key="item.name" :label="item.name" :value="item.name" />
  237. </el-select>
  238. </el-form-item>
  239. </div>
  240. <div style="display:flex;">
  241. <el-form-item style="flex-grow:1" label="级别" prop="priority" :label-width="formLabelWidth1">
  242. <el-select v-model="form.priority" style="width:54.5%;" placeholder="级别">
  243. <el-option v-for="item in bugLevelStr" :key="item.name" :label="item.name" :value="item.name" />
  244. </el-select>
  245. </el-form-item>
  246. <el-form-item style="flex-grow:1" label="问题原因" prop="reason" :label-width="formLabelWidth1">
  247. <el-select v-model="form.reason" style="width:54.5%;" placeholder="问题原因">
  248. <el-option v-for="item in reasonStr" :key="item.name" :label="item.name" :value="item.name" />
  249. </el-select>
  250. </el-form-item>
  251. </div>
  252. <div style="display:flex;">
  253. <el-form-item style="flex-grow:1" label="状态" prop="status" :label-width="formLabelWidth1">
  254. <el-select v-model="form.status" placeholder="状态" style="width:54.5%;" @change="buildShow(form.status)">
  255. <el-option v-for="item in bugStatusStr" :key="item.name" :label="item.name" :value="item.name" />
  256. </el-select>
  257. </el-form-item>
  258. <el-form-item style="flex-grow:1" label="所处阶段" prop="stage" :label-width="formLabelWidth1">
  259. <el-select v-model="form.stage" placeholder="所处阶段" style="width:54.5%;">
  260. <el-option v-for="item in stageStr" :key="item.name" :label="item.name" :value="item.name" />
  261. </el-select>
  262. </el-form-item>
  263. </div>
  264. <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>
  265. </div>
  266. <div style="display:flex;">
  267. <el-form-item label="创建人" :label-width="formLabelWidth"><el-input v-model="form.creator" autocomplete="off" style="width:67%;" /></el-form-item>
  268. <el-form-item label="bug责任人" prop="assigner" :label-width="formLabelWidth"><el-input v-model="form.assigner" autocomplete="off" style="width:67%;" /></el-form-item>
  269. </div>
  270. <div style="flex:1">
  271. <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>
  272. </div>
  273. <div style="flex:1">
  274. <el-form-item label="bug处理人" prop="currentHandler" :label-width="formLabelWidth"><el-input v-model="form.currentHandler" autocomplete="off" style="width:67%;" /></el-form-item>
  275. <el-form-item label="app版本号" :label-width="formLabelWidth"><el-input v-model="form.appVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  276. <el-form-item label="地图类型" :label-width="formLabelWidth"><el-input v-model="form.mapType" autocomplete="off" style="width:67%;" /></el-form-item>
  277. <el-form-item label="地图版本号" :label-width="formLabelWidth"><el-input v-model="form.mapVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  278. <el-form-item label="SDK版本" :label-width="formLabelWidth"><el-input v-model="form.sdkVersion" autocomplete="off" style="width:67%;" /></el-form-item>
  279. <el-form-item v-show="repairShow" label="修复结果" :label-width="formLabelWidth">
  280. <el-select v-model="form.repairResult" placeholder="发现方法">
  281. <el-option v-for="item in repairResultStr" :key="item.name" :label="item.name" :value="item.name" />
  282. </el-select>
  283. </el-form-item>
  284. </div>
  285. <el-form-item label="附件" :label-width="formLabelWidth">
  286. <el-upload
  287. class="upload-demo"
  288. multiple
  289. capture
  290. accept="image/jpeg, image/png, image/gif, audio/mp4, video/mp4, audio/mpeg, application/vnd.ms-excel"
  291. :on-change="handleChange"
  292. :file-list="fileList"
  293. action="http://page-daily.kuaidadi.com/upload/img.node"
  294. >
  295. <!-- action="http://page-daily.kuaidadi.com/upload/img.node" 线下 -->
  296. <!-- action="http://star.xiaojukeji.com/upload/img.node" 线上 -->
  297. <!-- action="https://jsonplaceholder.typicode.com/posts/" 原始地址-->
  298. <el-button size="small" type="primary">点击上传</el-button>
  299. </el-upload>
  300. </el-form-item>
  301. {{ form.accessory }}
  302. <!-- <el-form-item label="逻辑删" :label-width="formLabelWidth">
  303. <el-select v-model="form.isDelete" placeholder="发现方法">
  304. <el-option v-for="item in isDeleteStr" :key="item.value" :label="item.name" :value="item.value" />
  305. </el-select>
  306. </el-form-item> -->
  307. <!-- <el-form-item label="reopen的次数" :label-width="formLabelWidth"> <el-input v-model="form.reopenTimes" autocomplete="off" /></el-form-item> -->
  308. <!-- <el-form-item label="业务线" prop="bizId" :label-width="formLabelWidth"><el-input v-model="form.bizId" autocomplete="off" /></el-form-item> -->
  309. <!-- <el-form-item label="模块" :label-width="formLabelWidth"><el-input v-model="form.moduleId" autocomplete="off" /></el-form-item> -->
  310. <!-- <el-form-item label="项目名" :label-width="formLabelWidth"><el-input v-model="form.projectName" autocomplete="off" /></el-form-item> -->
  311. <!-- <el-form-item label="项目ID" :label-width="formLabelWidth"><el-input v-model="form.projectId" autocomplete="off" /></el-form-item> -->
  312. <!-- <el-form-item label="测试计划ID" prop="planId" :label-width="formLabelWidth"><el-input v-model="form.planId" autocomplete="off" /></el-form-item> -->
  313. <!-- <el-form-item label="caseID" :label-width="formLabelWidth"><el-input v-model="form.caseId" autocomplete="off" /></el-form-item> -->
  314. <!-- <el-form-item label="bug创建人" :label-width="formLabelWidth"> <el-input v-model="form.creator" autocomplete="off" /></el-form-item> -->
  315. <!-- <el-form-item label="开始开发时间" :label-width="formLabelWidth"><el-input v-model="form.startDevTime" autocomplete="off" /></el-form-item> -->
  316. <!-- <el-form-item label="开始等待测试时间" :label-width="formLabelWidth"><el-input v-model="form.waitTestTime" autocomplete="off" /></el-form-item> -->
  317. <!-- <el-form-item label="创建时间" :label-width="formLabelWidth"><el-input v-model="form.gmtCreate" autocomplete="off" /></el-form-item> -->
  318. <!-- <el-form-item label="修改时间" :label-width="formLabelWidth"><el-input v-model="form.gmtModify" autocomplete="off" /></el-form-item> -->
  319. </el-form>
  320. <div slot="footer" class="dialog-footer">
  321. <el-button @click="dialogFormVisible = false">取 消</el-button>
  322. <el-button type="primary" @click="titName === '新建' ? createFormData(form) : queryFormData(form)">确 定</el-button>
  323. </div>
  324. </el-dialog>
  325. <el-dialog :visible.sync="dialogFormQuery" width="70%">
  326. <el-form :model="form" size="mini">
  327. <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>
  328. <div style="display:flex;">
  329. <div style="flex:1">
  330. <el-form-item label="任务 : " class="styline" :label-width="formLabelWidth1">{{ form.projectName }}</el-form-item>
  331. <el-form-item label="级别 : " :label-width="formLabelWidth1">{{ form.priority }}</el-form-item>
  332. <el-form-item label="reopen的次数 : " :label-width="formLabelWidth1">{{ form.reopenTimes }}</el-form-item>
  333. <el-form-item label="bug状态 : " :label-width="formLabelWidth1">{{ form.status }}</el-form-item>
  334. <el-form-item label="bug类型 : " :label-width="formLabelWidth1">{{ form.bugType }}</el-form-item>
  335. <el-form-item label="bug描述 : " :label-width="formLabelWidth1">{{ form.bugDescribe }}</el-form-item>
  336. <el-form-item v-show="statusShow" label="问题原因和修复方法" :label-width="formLabelWidth">{{ form.reasonsAndSolutionForTheProblem }}</el-form-item>
  337. <el-form-item label="问题原因 : " :label-width="formLabelWidth1">{{ form.reason }}</el-form-item>
  338. <el-form-item label="平台类型 : " :label-width="formLabelWidth1">{{ form.platformType }}</el-form-item>
  339. <el-form-item label="业务模块 : " :label-width="formLabelWidth1">{{ form.businessType }}</el-form-item>
  340. <el-form-item label="所处阶段 : " :label-width="formLabelWidth1">{{ form.stage }}</el-form-item>
  341. <el-form-item label="发现方法 : " :label-width="formLabelWidth1">{{ form.discoveryMethod }}</el-form-item>
  342. <el-form-item v-show="repairShow" label="修复结果 : " :label-width="formLabelWidth1">{{ form.repairResult }}</el-form-item>
  343. <el-form-item label="os类型 : " :label-width="formLabelWidth1">{{ form.osType }}</el-form-item>
  344. <el-form-item label="机型 : " :label-width="formLabelWidth1">{{ form.model }}</el-form-item>
  345. <el-form-item label="网络类型 : " :label-width="formLabelWidth1">{{ form.networkType }}</el-form-item>
  346. <el-form-item label="SDK版本 : " :label-width="formLabelWidth1">{{ form.sdkVersion }}</el-form-item>
  347. <el-form-item label="app版本号 : " :label-width="formLabelWidth1">{{ form.appVersion }}</el-form-item>
  348. <el-form-item label="地图类型 : " :label-width="formLabelWidth1">{{ form.mapType }}</el-form-item>
  349. <el-form-item label="地图版本号 : " :label-width="formLabelWidth1">{{ form.mapVersion }}</el-form-item>
  350. <el-form-item label="附件 : " :label-width="formLabelWidth1">{{ form.accessory }}</el-form-item>
  351. </div>
  352. <div style="flex:1; margin-left:30px;">
  353. <el-form-item label="业务线 : " :label-width="formLabelWidth1">{{ form.bizId }}</el-form-item>
  354. <el-form-item label="bug责任人 : " :label-width="formLabelWidth1">{{ form.assigner }}</el-form-item>
  355. <el-form-item label="bug创建人 : " :label-width="formLabelWidth1">{{ form.creator }}</el-form-item>
  356. <el-form-item label="bug处理人 : " :label-width="formLabelWidth1">{{ form.currentHandler }}</el-form-item>
  357. <el-form-item label="开始开发时间 : " :label-width="formLabelWidth1">{{ form.startDevTime }}</el-form-item>
  358. <el-form-item label="开始等待测试时间 : " :label-width="formLabelWidth1">{{ form.waitTestTime }}</el-form-item>
  359. <el-form-item label="创建时间 : " :label-width="formLabelWidth1">{{ form.gmtCreate }}</el-form-item>
  360. </div>
  361. </div>
  362. <!-- <el-form-item label="caseID" :label-width="formLabelWidth">{{ form.caseId }}</el-form-item> -->
  363. <!-- <el-form-item label="项目名" :label-width="formLabelWidth">{{ form.projectName }}</el-form-item> -->
  364. <!-- <el-form-item label="项目ID" :label-width="formLabelWidth">{{ form.projectId }}</el-form-item> -->
  365. <!-- <el-form-item label="测试计划ID" :label-width="formLabelWidth">{{ form.planId }}</el-form-item> -->
  366. <!-- <el-form-item label="逻辑删" :label-width="formLabelWidth">{{ form.isDelete }}</el-form-item> -->
  367. <!-- <el-form-item label="业务线" :label-width="formLabelWidth">{{ form.bizId }}</el-form-item> -->
  368. <!-- <el-form-item label="模块ID" :label-width="formLabelWidth">{{ form.moduleId }}</el-form-item> -->
  369. <!-- <el-form-item label="修改时间" :label-width="formLabelWidth">{{ form.gmtModify }}</el-form-item> -->
  370. </el-form>
  371. <div slot="footer" class="dialog-footer">
  372. <el-button type="primary" @click="dialogFormQuery = false">关 闭</el-button>
  373. </div>
  374. </el-dialog>
  375. </div>
  376. </div></template>
  377. <script>
  378. import { bugList, bugGet, bugDelete, bugUpdate, bugCreate, bugCopy, taskListCreate, bugGetEnum } from '@/api/defectManage'
  379. import { projectGetTypeMap } from '@/api/projectPage.js'
  380. export default {
  381. name: 'DefectManage',
  382. data() {
  383. return {
  384. isPlatformShow: false,
  385. isBusinessShow: false,
  386. bugTypeStr: [],
  387. bugStatusStr: [],
  388. bizOptionsRR: [],
  389. bizOptions: [{ name: '万象', value: 101 }, { name: '企业级', value: 100 }, { name: '滴滴代驾', value: 261 }, { name: 'prado', value: 330 }, { name: 'carbo', value: 331 }, { name: '海马', value: 309 }],
  390. bugLevelStr: [{ name: 'p0', value: 0 }, { name: 'p1', value: 1 }, { name: 'p2', value: 2 }, { name: 'p3', value: 3 }],
  391. reasonStr: [],
  392. platformTypeStr: [],
  393. stageStr: [],
  394. discoveryMethodStr: [],
  395. businessTypeStr: [],
  396. bugStatusPriority: [],
  397. repairResultStr: [],
  398. statistics: [],
  399. isDeleteStr: [{ name: '保留', value: 0 }, { name: '删除', value: 1 }],
  400. serviceDataRules: {
  401. bizId: [{ required: true, message: '业务线不能为空', trigger: 'change' }],
  402. // bugName: [{ required: true, message: '主题不能为空', trigger: 'change' }],
  403. taskId: [{ required: true, message: '任务不能为空', trigger: 'change' }],
  404. // projectId: [{ required: true, message: '项目ID不能为空', trigger: 'change' }],
  405. bugType: [{ required: true, message: 'bug类型不能为空', trigger: 'change' }],
  406. discoveryMethod: [{ required: true, message: '发现方式不能为空', trigger: 'change' }],
  407. reason: [{ required: true, message: '问题原因不能为空', trigger: 'change' }],
  408. priority: [{ required: true, message: '级别不能为空', trigger: 'change' }],
  409. status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
  410. platformType: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
  411. stage: [{ required: true, message: '所处阶段不能为空', trigger: 'change' }],
  412. assigner: [{ required: true, message: 'bug责任人不能为空', trigger: 'change' }],
  413. currentHandler: [{ required: true, message: 'bug处理人不能为空', trigger: 'change' }],
  414. bugDescribe: [{ required: true, message: 'bug描述不能为空', trigger: 'change' }],
  415. businessType: [{ required: true, message: '业务模块不能为空', trigger: 'change' }]
  416. },
  417. userInformation: localStorage.getItem('username'),
  418. userNames: localStorage.getItem('realname'),
  419. bizJson: localStorage.getItem('key'),
  420. pageSize: 20,
  421. curIndex: 1,
  422. total: 0,
  423. show2: '',
  424. form: {
  425. id: ''
  426. },
  427. tableData: [],
  428. queryCode: {},
  429. statusShow: false,
  430. repairShow: false,
  431. timeShow: false,
  432. dialogFormVisible: false,
  433. dialogFormQuery: false,
  434. formLabelWidth: '11%',
  435. formLabelWidth1: '22%',
  436. serviceTypeEnumList: [],
  437. clientTypeEnumList: [],
  438. bizIdEnumList: [],
  439. objData: '',
  440. userData: '',
  441. titName: '',
  442. taskIdStr: '',
  443. timeInterval: [],
  444. fileList: [],
  445. fileDbList: []
  446. }
  447. },
  448. created() {
  449. this.getList()
  450. this.forkDown()
  451. this.bugListSelect()
  452. },
  453. mounted() {
  454. document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
  455. this.getQueryData()
  456. },
  457. methods: {
  458. getList() {
  459. this.bizJson = localStorage.getItem('key')
  460. this.indexPage = {
  461. bizId: this.bizJson,
  462. pageSize: this.pageSize,
  463. curIndex: this.curIndex
  464. }
  465. bugList(this.indexPage).then(res => {
  466. this.statistics = res.query
  467. this.tableData = res.data
  468. this.total = res.total
  469. })
  470. },
  471. bugListSelect() {
  472. bugGetEnum().then(res => {
  473. this.bugStatusStr = res.data.bugEnumList
  474. this.bugStatusPriority = res.data.priorityEnumList
  475. this.stageStr = res.data.bugStageEnumList
  476. this.reasonStr = res.data.reasonEnumList
  477. this.platformTypeStr = res.data.platformTypeEnumList
  478. this.bugTypeStr = res.data.bugTypeEnumList
  479. this.bugLevelStr = res.data.priorityEnumList
  480. this.discoveryMethodStr = res.data.discoveryMethodEnumList
  481. this.repairResultStr = res.data.repairResultEnumList
  482. this.clientTypeEnumList = res.data.clientTypeEnumList
  483. this.serviceTypeEnumList = res.data.serviceTypeEnumList
  484. this.bizIdEnumList = res.data.bizIdEnumList
  485. })
  486. },
  487. clickChangeType(e) {
  488. // console.log(this.form.businessType)
  489. // this.form.businessType = ''
  490. if (e === '服务端') {
  491. this.businessTypeStr = this.serviceTypeEnumList
  492. } else {
  493. this.businessTypeStr = this.clientTypeEnumList
  494. }
  495. },
  496. dataQuery(e) {
  497. this.bizJson = localStorage.getItem('key')
  498. this.indexPage = e
  499. this.curIndex = 1
  500. this.indexPage.bizId = this.bizJson
  501. this.indexPage.pageSize = this.pageSize
  502. this.indexPage.curIndex = this.curIndex
  503. if (this.timeShow) {
  504. this.indexPage.gmtCreateBegin = this.timeInterval[0]
  505. this.indexPage.gmtCreateEnd = this.timeInterval[1]
  506. } else {
  507. this.indexPage.gmtCreateBegin = ''
  508. this.indexPage.gmtCreateEnd = ''
  509. }
  510. bugList(this.indexPage).then(res => {
  511. this.tableData = res.data
  512. this.total = res.total
  513. this.statistics = res.query
  514. })
  515. },
  516. // 业务线数据获取
  517. forkDown() {
  518. projectGetTypeMap().then(res => {
  519. if (res.code === 200) {
  520. this.bizOptionsRR = res.data
  521. if (this.bizJson) {
  522. this.platformTypeStr = this.bizOptionsRR.filter(value => value.code === parseInt(this.bizJson))[0].child
  523. this.$set(this.queryCode, 'platformType', '')
  524. this.$set(this.queryCode, 'clientType', '')
  525. } else {
  526. this.isPlatformShow = false
  527. this.isBusinessShow = false
  528. }
  529. } else {
  530. this.errorFun('业务线数据获取失败')
  531. }
  532. })
  533. },
  534. // 业务线取子数据
  535. clickChangeBusiness(e) {
  536. if (e && this.platformTypeStr.filter(value => value.code === e)[0].child) {
  537. this.isBusinessShow = true
  538. this.businessTypeStr = this.platformTypeStr.filter(value => value.code === e)[0].child
  539. this.$set(this.queryCode, 'clientType', '')
  540. } else {
  541. this.isBusinessShow = false
  542. }
  543. },
  544. clickChangeModule(e) {
  545. if (!e) {
  546. this.isBusinessShow = false
  547. }
  548. },
  549. dataQueryInSearch(e) {
  550. this.bizJson = localStorage.getItem('key')
  551. this.indexPage = e
  552. this.indexPage.bizId = this.bizJson
  553. this.indexPage.pageSize = this.pageSize
  554. this.indexPage.curIndex = this.curIndex
  555. if (this.timeShow) {
  556. this.indexPage.gmtCreateBegin = this.timeInterval[0]
  557. this.indexPage.gmtCreateEnd = this.timeInterval[1]
  558. } else {
  559. this.indexPage.gmtCreateBegin = ''
  560. this.indexPage.gmtCreateEnd = ''
  561. }
  562. bugList(this.indexPage).then(res => {
  563. this.tableData = res.data
  564. this.total = res.total
  565. })
  566. },
  567. // // 删除报告
  568. delePresentation(e) {
  569. this.$confirm('是否确认删除', '确认信息', {
  570. distinguishCancelAndClose: true,
  571. confirmButtonText: '确定',
  572. cancelButtonText: '取消'
  573. })
  574. .then(() => {
  575. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  576. bugDelete(this.userData, e).then(res => {
  577. this.getList()
  578. })
  579. this.$message({ type: 'success', message: '已删除' })
  580. })
  581. .catch(action => {
  582. this.$message({ type: 'success', message: '已取消' })
  583. })
  584. },
  585. copyArrange(e) {
  586. this.userData = { id: e, ename: this.userInformation, name: this.userNames }
  587. bugCopy(this.userData, e).then(res => {
  588. this.getList()
  589. this.successFun()
  590. })
  591. },
  592. queryPresentation(ele) {
  593. this.titName = '编辑'
  594. this.form = ele
  595. for (var a of this.bizOptions) {
  596. if (ele.bizId === a.value) {
  597. this.bizId = a.name
  598. }
  599. }
  600. // this.bizId = ele.bizId
  601. this.form.taskId = ele.taskId
  602. this.buildShow(ele)
  603. this.$router.push({ name: '更新Bug', params: { formData: this.form }, query: { id: this.form.id }})
  604. // this.dialogFormVisible = true
  605. },
  606. buildShow(ele) {
  607. if (ele.status === '待回归' || ele === 2) {
  608. this.statusShow = true
  609. }
  610. if (ele.repairResult === '已修复' || ele === 3) {
  611. this.repairShow = true
  612. }
  613. },
  614. queryFormData(form) {
  615. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  616. this.objData = { bugBaseInfo: this.form, user: this.userData }
  617. bugUpdate(this.objData).then(res => {
  618. res.code === 200 ? this.successFun() : this.errorFun()
  619. this.dialogFormVisible = false
  620. this.getList()
  621. })
  622. },
  623. getQueryData() {
  624. this.$route.query.code === 4 ? this.queryCode.taskId = this.$route.query.id : ''
  625. this.bizJson = localStorage.getItem('key')
  626. taskListCreate({ bizId: this.bizJson }).then(res => {
  627. this.taskIdStr = res.data
  628. })
  629. },
  630. handleSizeChange(size) {
  631. this.curIndex = 1
  632. this.pageSize = size
  633. this.dataQueryInSearch(this.queryCode)
  634. },
  635. handleCurrentChange(curIndex) {
  636. this.curIndex = curIndex
  637. this.dataQueryInSearch(this.queryCode)
  638. },
  639. createdCode() {
  640. // this.titName = '新建'
  641. // this.dialogFormVisible = true
  642. this.form = {}
  643. // this.$route.query.code === 4 ? this.form.taskId = this.$route.query.id : ''
  644. // if (this.$refs['form'] !== undefined) {
  645. // this.$refs['form'].resetFields()
  646. // }
  647. this.$router.push({ name: '新建Bug' })
  648. },
  649. createFormData(form) {
  650. this.$refs['form'].validate((valid) => {
  651. if (valid) {
  652. // form.bizId = this.bizJson
  653. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  654. this.objData = { bugBaseInfo: form, user: this.userData }
  655. bugCreate(this.objData).then(res => {
  656. this.dialogFormVisible = false
  657. this.getList()
  658. res.code === 200 ? this.successFun() : this.errorFun()
  659. })
  660. }
  661. })
  662. },
  663. toReportView(e) {
  664. // this.dialogFormQuery = true
  665. // this.buildShow(e)
  666. bugGet(e).then(res => {
  667. this.form = res.data
  668. for (var a of this.bizIdEnumList) {
  669. res.data.bizId === a.code ? this.form.bizId = a.name : ''
  670. }
  671. this.$router.push({ name: '查看Bug', query: { id: this.form.id }})
  672. })
  673. },
  674. handleChange(file, fileList) {
  675. this.fileDbList = []
  676. this.fileList = fileList.slice(-3)
  677. for (var a of this.fileList) {
  678. this.fileDbList.push({ name: a.name, url: 'http' + a.response.url })
  679. }
  680. var arr = []
  681. for (var el of this.fileDbList) {
  682. arr.push({ 'name': el.name, 'url': el.response.url })
  683. }
  684. },
  685. successFun() {
  686. this.$notify({ title: 'Success', message: 'Created Successfully', type: 'success', duration: 2000 })
  687. },
  688. errorFun() {
  689. this.$notify({ title: 'Failed', message: 'Created Failed', type: 'error', duration: 2000 })
  690. }
  691. }
  692. }
  693. </script>
  694. <style lang="stylus" scoped>
  695. .set-background
  696. background-color #F2F3F6
  697. display flex
  698. justify-content center
  699. min-width 900px
  700. .block
  701. background-color rgba(255,255,255,1)
  702. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  703. border-radius 7px
  704. width 96%
  705. margin 20px 0
  706. padding 20px
  707. min-height calc(100vh - 100px)
  708. .block >>> .el-form
  709. display flex
  710. justify-content space-between
  711. margin 10px 0px 15px 0px
  712. .block >>> .el-form-item__content
  713. margin-left 0 !important
  714. .block >>> th
  715. background-color #F0F2F4 !important
  716. .block >>> .el-range-separator
  717. padding 0
  718. .set-between
  719. display flex
  720. .set-between >>> .el-button
  721. height 36px
  722. .set-between >>> .el-form-item
  723. display flex
  724. margin-right -35px
  725. .set-locate
  726. margin-top 25px
  727. .titleDescription
  728. font-size 12px
  729. color rgba(244,121,121,1)
  730. margin 30px 0px
  731. display inline-block
  732. </style>