problemUpdate.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. <template>
  2. <div class="set-background">
  3. <el-form ref="form" :model="form" :rules="serviceDataRules">
  4. <div class="block">
  5. <div class="block-flex">
  6. <el-form-item label="标题" prop="bugName" label-width="112px"><el-input v-model="form.bugName" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:89.6%;" /></el-form-item>
  7. <div class="line-between">
  8. <el-form-item label="类型" prop="bugType" label-width="124px">
  9. <el-select v-model="form.bugType" style="width:76%;" placeholder="类型">
  10. <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.code" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="所处阶段" prop="stage" label-width="147px">
  14. <el-select v-model="form.stage" disabled placeholder="所处阶段" style="width:76%;">
  15. <el-option v-for="item in stageStr" :key="item.name" :label="item.name" :value="item.code" />
  16. </el-select>
  17. </el-form-item>
  18. </div>
  19. <div class="line-between">
  20. <el-form-item label="状态" prop="status" label-width="124px">
  21. <el-select v-model="form.status" placeholder="状态" style="width:76%;">
  22. <el-option v-for="item in bugStatusStr" :key="item.name" :label="item.name" :value="item.code" />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="问题原因" prop="reason" label-width="147px">
  26. <el-select v-model="form.reason" style="width:76%;" placeholder="问题原因">
  27. <el-option v-for="item in reasonStr" :key="item.name" :label="item.name" :value="item.code" />
  28. </el-select>
  29. </el-form-item>
  30. </div>
  31. <div class="line-between">
  32. <el-form-item label="级别" prop="priority" label-width="124px">
  33. <el-select v-model="form.priority" style="width:76%;" placeholder="级别">
  34. <el-option v-for="item in bugLevelStr" :key="item.name" :label="item.name" :value="item.code" />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="发现方式" prop="discoveryMethod" label-width="147px">
  38. <el-select v-model="form.discoveryMethod" style="width:76%;" placeholder="发现方式">
  39. <el-option v-for="item in discoveryMethodStr" :key="item.name" :label="item.name" :value="item.code" />
  40. </el-select>
  41. </el-form-item>
  42. </div>
  43. <div class="line-between">
  44. <el-form-item prop="bizId" label="业务线" label-width="124px">
  45. <el-select v-model="form.bizId" placeholder="业务线" style="width:76%;" @change="clickChangePlatform(form.bizId)">
  46. <el-option v-for="item in bizOptions" :key="item.value" :label="item.name" :value="item.code" />
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="平台类型" prop="platformType" label-width="147px">
  50. <el-select ref="clearPlatform" v-model="form.platformType" placeholder="平台类型" style="width:76%;" @change="clickChangeBusiness(form.platformType)">
  51. <el-option v-for="item in platformTypeStr" :key="item.name" :label="item.name" :value="item.code" />
  52. </el-select>
  53. </el-form-item>
  54. </div>
  55. <div class="line-between-add">
  56. <el-form-item v-if="businessTypeShow" prop="clientType" label="业务模块" label-width="127px">
  57. <el-select ref="clearBusiness" v-model="form.clientType" placeholder="业务模块" style="width:76%;" @change="clickChangeModule(form.clientType)">
  58. <el-option v-for="item in businessTypeStr" :key="item.name" :label="item.name" :value="item.code" />
  59. </el-select>
  60. </el-form-item>
  61. </div>
  62. <div class="line-between-add">
  63. <el-form-item v-if="moduleTypeShow" label="工程模块" prop="moduleId" label-width="124px">
  64. <el-select ref="clearPlatform" v-model="form.moduleId" placeholder="工程模块" style="width:76%;">
  65. <el-option v-for="item in moduleStr" :key="item.name" :label="item.name" :value="item.code" />
  66. </el-select>
  67. </el-form-item>
  68. </div>
  69. <el-form-item label="故障描述" prop="bugDescribe" label-width="112px"><el-input v-model="form.bugDescribe" type="textarea" placeholder="故障详细信息以及复盘wiki地址" rows="2" style="width:89.6%;" /></el-form-item>
  70. </div>
  71. </div>
  72. <div class="block">
  73. <div class="block-flex">
  74. <div class="line-between">
  75. <el-form-item label="创建人" label-width="124px"><el-input v-model="form.creator" autocomplete="off" style="width:76%;" /></el-form-item>
  76. <el-form-item label="故障责任人" prop="assigner" label-width="147px">
  77. <el-select v-model="form.assigner" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
  78. <el-option
  79. v-for="item in optionsAssigner"
  80. :key="item.id"
  81. :label="item.name"
  82. :value="item.email"
  83. />
  84. </el-select>
  85. </el-form-item>
  86. </div>
  87. <div class="line-between">
  88. <el-form-item label="当前处理人" prop="currentHandler" label-width="124px">
  89. <el-select v-model="form.currentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
  90. <el-option
  91. v-for="item in optionsCurrentHandler"
  92. :key="item.id"
  93. :label="item.name"
  94. :value="item.email"
  95. />
  96. </el-select>
  97. </el-form-item>
  98. <el-form-item label="故障开始时间" label-width="147px"> <el-date-picker
  99. v-model="form.startDevTime"
  100. type="datetime"
  101. placeholder="选择时间"
  102. style="width:76%;"
  103. value-format="yyyy-MM-dd HH:hh:mm"
  104. /></el-form-item>
  105. </div>
  106. <div class="line-between-add">
  107. <el-form-item label="故障结束时间" label-width="124px"> <el-date-picker
  108. v-model="form.finishTime"
  109. type="datetime"
  110. placeholder="选择时间"
  111. style="width:76%;"
  112. value-format="yyyy-MM-dd HH:hh:mm"
  113. /></el-form-item>
  114. </div>
  115. </div>
  116. </div>
  117. <div class="block">
  118. <div class="block-flex">
  119. <div class="line-between">
  120. <el-form-item label="机型" label-width="124px"><el-input v-model="form.model" autocomplete="off" style="width:76%;" /></el-form-item>
  121. <el-form-item label="地图类型" label-width="147px"><el-input v-model="form.mapType" autocomplete="off" style="width:76%;" /></el-form-item>
  122. </div>
  123. <div class="line-between">
  124. <el-form-item label="OS类型" label-width="124px"><el-input v-model="form.osType" autocomplete="off" style="width:76%;" /></el-form-item>
  125. <el-form-item label="地图版本号" label-width="147px"><el-input v-model="form.mapVersion" autocomplete="off" style="width:76%;" /></el-form-item>
  126. </div>
  127. <div class="line-between">
  128. <el-form-item label="网络类型" label-width="124px"><el-input v-model="form.networkType" autocomplete="off" style="width:76%;" /></el-form-item>
  129. <el-form-item label="SDK版本" label-width="147px"><el-input v-model="form.sdkVersion" autocomplete="off" style="width:76%;" /></el-form-item>
  130. </div>
  131. <div class="line-between-add">
  132. <el-form-item label="app版本号" label-width="124px"><el-input v-model="form.appVersion" autocomplete="off" style="width:76%;" /></el-form-item>
  133. </div>
  134. </div>
  135. </div>
  136. <div class="block-end">
  137. <div class="font">备注</div>
  138. <el-input v-model="form.remark" type="textarea" autocomplete="off" rows="5" style="margin: 20px 0;" />
  139. <div>
  140. <el-upload
  141. ref="upload"
  142. class="upload-demo"
  143. multiple
  144. :file-list="fileList"
  145. action="https://star.xiaojukeji.com/upload/img.node"
  146. :on-success="handleChange"
  147. :auto-upload="false"
  148. >
  149. <!-- action="https://page-daily.kuaidadi.com/upload/img.node" 线下 -->
  150. <!-- action="https://star.xiaojukeji.com/upload/img.node" 线上 -->
  151. <!-- action="https://jsonplaceholder.typicode.com/posts/" 原始地址-->
  152. <!-- <el-button size="small">点击上传</el-button> -->
  153. <el-button slot="trigger" size="small" type="primary" @click="createdDis">选取文件</el-button>
  154. <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>
  155. </el-upload>
  156. </div>
  157. <!-- accept="image/jpeg, image/png, image/gif, audio/mp4, video/mp4, application/pdf, audio/mpeg, text/plain, application/vnd.ms-excel, application/vnd.ms-works, application/msword" -->
  158. <el-form-item class="submit">
  159. <el-button size="mini" type="primary" @click="createFormData(form)">提 交</el-button>
  160. <el-button class="move-button" size="mini" @click="$router.go(-1)">取 消</el-button>
  161. </el-form-item>
  162. </div>
  163. <!-- <div style="flex:1">
  164. <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>
  165. </div>
  166. <div style="flex:1">
  167. <el-form-item v-show="repairShow" label="修复结果" :label-width="formLabelWidth">
  168. <el-select v-model="form.repairResult" placeholder="发现方法">
  169. <el-option v-for="item in repairResultStr" :key="item.name" :label="item.name" :value="item.name" />
  170. </el-select>
  171. </el-form-item>
  172. </div> -->
  173. <!-- <el-form-item label="逻辑删" :label-width="formLabelWidth">
  174. <el-select v-model="form.isDelete" placeholder="发现方法">
  175. <el-option v-for="item in isDeleteStr" :key="item.value" :label="item.name" :value="item.value" />
  176. </el-select>
  177. </el-form-item> -->
  178. <!-- <el-form-item label="reopen的次数" :label-width="formLabelWidth"> <el-input v-model="form.reopenTimes" autocomplete="off" /></el-form-item> -->
  179. <!-- <el-form-item label="业务线" prop="bizId" :label-width="formLabelWidth"><el-input v-model="form.bizId" autocomplete="off" /></el-form-item> -->
  180. <!-- <el-form-item label="模块" :label-width="formLabelWidth"><el-input v-model="form.moduleId" autocomplete="off" /></el-form-item> -->
  181. <!-- <el-form-item label="项目名" :label-width="formLabelWidth"><el-input v-model="form.projectName" autocomplete="off" /></el-form-item> -->
  182. <!-- <el-form-item label="项目ID" :label-width="formLabelWidth"><el-input v-model="form.projectId" autocomplete="off" /></el-form-item> -->
  183. <!-- <el-form-item label="测试计划ID" prop="planId" :label-width="formLabelWidth"><el-input v-model="form.planId" autocomplete="off" /></el-form-item> -->
  184. <!-- <el-form-item label="caseID" :label-width="formLabelWidth"><el-input v-model="form.caseId" autocomplete="off" /></el-form-item> -->
  185. <!-- <el-form-item label="bug创建人" :label-width="formLabelWidth"> <el-input v-model="form.creator" autocomplete="off" /></el-form-item> -->
  186. <!-- <el-form-item label="开始开发时间" :label-width="formLabelWidth"><el-input v-model="form.startDevTime" autocomplete="off" /></el-form-item> -->
  187. <!-- <el-form-item label="开始等待测试时间" :label-width="formLabelWidth"><el-input v-model="form.waitTestTime" autocomplete="off" /></el-form-item> -->
  188. <!-- <el-form-item label="创建时间" :label-width="formLabelWidth"><el-input v-model="form.gmtCreate" autocomplete="off" /></el-form-item> -->
  189. <!-- <el-form-item label="修改时间" :label-width="formLabelWidth"><el-input v-model="form.gmtModify" autocomplete="off" /></el-form-item> -->
  190. </el-form>
  191. </div>
  192. </template>
  193. <script>
  194. import { bugGetEnum, taskListCreate, bugUpdate, bugGet } from '@/api/defectManage'
  195. import { projectGetTypeMap, teamMembers } from '@/api/projectPage'
  196. import axios from 'axios'
  197. export default {
  198. data() {
  199. return {
  200. form: {
  201. id: '',
  202. platformType: '',
  203. clientType: ''
  204. },
  205. optionsAssigner: [],
  206. optionsCurrentHandler: [],
  207. businessTypeStr: [],
  208. taskIdStr: '',
  209. platformTypeStr: [],
  210. bugTypeStr: [],
  211. discoveryMethodStr: [],
  212. reasonStr: [],
  213. bugStatusStr: [],
  214. moduleStr: [],
  215. stageStr: [],
  216. fileList: [],
  217. uptataKey: [],
  218. // uptataKey: [{ name: '智慧平台.png', url: 'https://pt-starimg.didistatic.com/static/starimg/node/qo4sKioLko1571277086594.png' }, { name: '智慧平台.png', url: 'https://pt-starimg.didistatic.com/static/starimg/node/qo4sKioLko1571277086594.png' }],
  219. serviceTypeEnumList: [],
  220. clientTypeEnumList: [],
  221. bugLevelStr: [],
  222. bizOptions: [],
  223. serviceDataRules: {
  224. bugName: [{ required: true, message: '标题不能为空', trigger: 'change' }],
  225. bizId: [{ required: true, message: '业务线不能为空', trigger: 'change' }],
  226. // bugName: [{ required: true, message: '主题不能为空', trigger: 'change' }],
  227. taskId: [{ required: true, message: '任务不能为空', trigger: 'change' }],
  228. moduleId: [{ required: true, message: '工程模块不能为空', trigger: 'change' }],
  229. // projectId: [{ required: true, message: '项目ID不能为空', trigger: 'change' }],
  230. bugType: [{ required: true, message: 'bug类型不能为空', trigger: 'change' }],
  231. reopenTimes: [{ required: true, message: 'reopen不能为空', trigger: 'change' }],
  232. discoveryMethod: [{ required: true, message: '发现方式不能为空', trigger: 'change' }],
  233. reason: [{ required: true, message: '问题原因不能为空', trigger: 'change' }],
  234. priority: [{ required: true, message: '级别不能为空', trigger: 'change' }],
  235. status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
  236. platformType: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
  237. stage: [{ required: true, message: '所处阶段不能为空', trigger: 'change' }],
  238. assigner: [{ required: true, message: 'bug责任人不能为空', trigger: 'blur' }],
  239. currentHandler: [{ required: true, message: 'bug处理人不能为空', trigger: 'blur' }],
  240. bugDescribe: [{ required: true, message: 'bug描述不能为空', trigger: 'change' }],
  241. clientType: [{ required: true, message: '业务模块不能为空', trigger: 'change' }]
  242. },
  243. userData: '',
  244. formLabelWidth1: '22%',
  245. businessTypeShow: false,
  246. moduleTypeShow: false,
  247. userInformation: localStorage.getItem('username'),
  248. userNames: localStorage.getItem('realname'),
  249. accessory: '',
  250. dis: false
  251. }
  252. },
  253. created() {
  254. this._initBegin()
  255. this.taskIdGet()
  256. },
  257. methods: {
  258. createdDis() {
  259. this.dis = true
  260. },
  261. submitUpload() {
  262. this.$refs.upload.submit()
  263. this.dis = true
  264. this.$message({ showClose: true, message: '文件正在上传······', type: 'success' })
  265. },
  266. handleChange(response, file, fileList) {
  267. this.fileDbList = []
  268. this.fileList = fileList.slice(-3)
  269. for (var a of this.fileList) {
  270. this.fileDbList.push({ 'name': a.name, 'url': 'http:' + a.response.url })
  271. }
  272. this.accessory = JSON.stringify(this.fileDbList)
  273. this.dis = false
  274. this.$message({ showClose: true, message: '文件上传成功', type: 'success' })
  275. },
  276. async _initBegin() {
  277. await bugGetEnum().then(res => {
  278. this.bugStatusStr = this.problemStatus(res.data.bugEnumList)
  279. this.stageStr = res.data.bugStageEnumList
  280. this.reasonStr = res.data.reasonEnumList
  281. this.bugTypeStr = res.data.bugTypeEnumList
  282. this.bugLevelStr = res.data.priorityEnumList
  283. this.discoveryMethodStr = res.data.discoveryMethodEnumList
  284. this.clientTypeEnumList = res.data.clientTypeEnumList
  285. this.serviceTypeEnumList = res.data.serviceTypeEnumList
  286. })
  287. await projectGetTypeMap().then(res => {
  288. if (res.code === 200) {
  289. this.bizOptions = res.data
  290. } else {
  291. this.errorFun()
  292. }
  293. })
  294. bugGet(this.$route.query.id).then(res => {
  295. this.form = res.data
  296. var str = res.data.accessory
  297. if (str !== '') {
  298. var obj = JSON.parse(str.split('{}')[0])
  299. for (var a of obj) {
  300. this.uptataKey.push(a)
  301. }
  302. }
  303. this.platformTypeStr = this.bizOptions.filter(value => value.code === this.form.bizId)[0].child
  304. if (this.form.clientType) {
  305. this.businessTypeShow = true
  306. this.businessTypeStr = this.platformTypeStr.filter(value => value.code === this.form.platformType)[0].child
  307. if (this.form.moduleId) {
  308. this.moduleTypeShow = true
  309. this.moduleStr = this.businessTypeStr.filter(value => value.code === this.form.clientType)[0].child
  310. }
  311. }
  312. this.getMember() // 保证bizId存在
  313. if (this.form.assigner) {
  314. this.form.assigner = this.form.assigner.split(',')
  315. }
  316. if (this.form.currentHandler) {
  317. this.form.currentHandler = this.form.currentHandler.split(',')
  318. }
  319. })
  320. },
  321. // 获取任务数据
  322. taskIdGet() {
  323. taskListCreate({}).then(res => {
  324. this.taskIdStr = res.data
  325. })
  326. },
  327. // 业务线取子数据
  328. clickChangePlatform(e) {
  329. this.platformTypeStr = this.bizOptions.filter(value => value.code === e)[0].child
  330. this.businessTypeStr = []
  331. this.moduleStr = []
  332. this.$set(this.form, 'platformType', '')
  333. this.$set(this.form, 'clientType', '')
  334. this.$set(this.form, 'moduleId', '')
  335. this.getMember() // 保证bizId存在
  336. },
  337. // 业务线取子数据
  338. clickChangeBusiness(e) {
  339. if (this.platformTypeStr.filter(value => value.code === e)[0].child) {
  340. this.businessTypeShow = true
  341. this.businessTypeStr = this.platformTypeStr.filter(value => value.code === e)[0].child
  342. this.moduleStr = []
  343. } else {
  344. this.businessTypeShow = false
  345. }
  346. this.$set(this.form, 'clientType', '')
  347. this.$set(this.form, 'moduleId', '')
  348. },
  349. // 业务线取子数据
  350. clickChangeModule(e) {
  351. if (this.businessTypeStr.filter(value => value.code === e)[0].child) {
  352. this.moduleTypeShow = true
  353. this.moduleStr = this.businessTypeStr.filter(value => value.code === e)[0].child
  354. } else {
  355. this.moduleTypeShow = false
  356. }
  357. this.$set(this.form, 'moduleId', '')
  358. },
  359. // 人员搜索
  360. getMember() {
  361. const objDataAssigner = { bizId: this.form.bizId, email: '', role: 'rd' }
  362. const objDataCurrentHandler = { bizId: this.form.bizId, email: '' }
  363. axios.all([teamMembers(objDataAssigner), teamMembers(objDataCurrentHandler)]).then(axios.spread((resAssigner, resCurrentHandler) => {
  364. if (resAssigner.code === 200 && resCurrentHandler.code === 200) {
  365. this.optionsAssigner = resAssigner.data
  366. this.optionsCurrentHandler = resCurrentHandler.data
  367. } else {
  368. this.errorFun('人员数据获取失败')
  369. }
  370. }))
  371. },
  372. // 待修复已修复
  373. problemStatus(arr) {
  374. return arr.filter(each => {
  375. if (each.code === 0) {
  376. each.name = '待修复'
  377. return true
  378. } else if (each.code === 3) {
  379. each.name = '已修复'
  380. return true
  381. }
  382. })
  383. },
  384. handleDelContractList(val) {
  385. for (var i = 0; i <= this.uptataKey.length; i++) {
  386. if (val.name === this.uptataKey[i].name) {
  387. this.uptataKey.splice(i, 1)
  388. }
  389. }
  390. },
  391. // 提交表单并且返回刷新
  392. createFormData(form) {
  393. this.$refs.form.validate((valid) => {
  394. if (valid) {
  395. if (form.assigner) {
  396. form.assigner = form.assigner.join(',')
  397. }
  398. if (form.currentHandler) {
  399. form.currentHandler = form.currentHandler.join(',')
  400. }
  401. form.reopenTimes = parseInt(form.reopenTimes)
  402. form.accessory = this.accessory
  403. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  404. this.objData = { bugBaseInfo: form, user: this.userData }
  405. bugUpdate(this.objData).then(res => {
  406. res.code === 200 ? this.successFun() : this.errorFun()
  407. this.$router.go(-1)
  408. })
  409. }
  410. })
  411. },
  412. successFun() {
  413. this.$notify({ title: 'Success', message: 'Updated Successfully', type: 'success', duration: 2000 })
  414. },
  415. errorFun() {
  416. this.$notify({ title: 'Failed', message: 'Updated Failed', type: 'error', duration: 2000 })
  417. }
  418. }
  419. }
  420. </script>
  421. <style>
  422. .cla .el-table td {
  423. padding:0px;
  424. }
  425. .deleteSty {
  426. cursor: pointer;
  427. border: none;
  428. }
  429. </style>
  430. <style lang="stylus" scoped>
  431. .set-background
  432. background-color #F2F3F6
  433. display flex
  434. justify-content center
  435. min-width 700px
  436. .block
  437. background-color rgba(255,255,255,1)
  438. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  439. border-radius 7px
  440. width 82vw
  441. margin-top 25px
  442. padding 29px 50px
  443. .block-flex
  444. display flex
  445. flex-wrap wrap
  446. .block-flex >>> .el-form-item
  447. width 100%
  448. display flex
  449. .block-flex >>> .el-form-item__content
  450. width 100%
  451. margin-left 0 !important
  452. .line-between
  453. width 100%
  454. display flex
  455. justify-content space-between
  456. .line-between-add
  457. display flex
  458. flex-wrap wrap
  459. width 100%
  460. .line-between-add >>> .el-form-item
  461. width 50%
  462. .block-end
  463. background-color rgba(255,255,255,1)
  464. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  465. border-radius 7px
  466. width 82vw
  467. margin-top 25px
  468. padding 29px 50px
  469. margin-bottom 22px
  470. .font
  471. font-size 18px
  472. font-family PingFangSC
  473. font-weight 500
  474. color rgba(51,59,74,1)
  475. line-height 35px
  476. .submit
  477. margin-top 40px
  478. display flex
  479. flex-direction row-reverse
  480. .move-button
  481. margin-right 20px
  482. </style>