taskUpdateCreate.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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="name" label-width="112px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:89.6%;" /></el-form-item>
  7. <div class="line-between">
  8. <el-form-item label="优先级" prop="priority" label-width="124px">
  9. <el-select v-model="form.priority" style="width:76%;" placeholder="请选择">
  10. <el-option v-for="item in priorityEnumList" :key="item.code" :label="item.name" :value="item.code" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="是否免测" prop="notest" label-width="147px">
  14. <el-select v-model="form.notest" placeholder="请选择" style="width:76%;">
  15. <el-option v-for="item in noTestEnumList" :key="item.code" :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" style="width:76%;" placeholder="请选择">
  22. <el-option v-for="item in processStatusEnumList" :key="item.code" :label="item.name" :value="item.code" />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="任务类型" prop="taskType" label-width="147px">
  26. <el-select v-model="form.taskType" placeholder="请选择" style="width:76%;">
  27. <el-option v-for="item in taskTypeStr" :key="item.code" :label="item.name" :value="item.name" />
  28. </el-select>
  29. </el-form-item>
  30. </div>
  31. <div class="line-between">
  32. <el-form-item label="进展" label-width="124px">
  33. <el-select v-model="form.stage" style="width:76%;" placeholder="请选择">
  34. <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.code" />
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item prop="bizId" label="业务线" label-width="147px">
  38. <el-select v-model="form.bizId" placeholder="业务线" style="width:76%;" @change="clickChangePlatform(form.bizId)">
  39. <el-option v-for="item in bizIdEnumList" :key="item.code" :label="item.name" :value="item.code" />
  40. </el-select>
  41. </el-form-item>
  42. </div>
  43. <div class="line-between-add">
  44. <el-form-item label="平台类型" prop="type" label-width="124px">
  45. <el-select ref="clearPlatform" v-model="form.type" placeholder="平台类型" style="width:76%;" @change="clickChangeBusiness(form.type)">
  46. <el-option v-for="item in typeString" :key="item.code" :label="item.name" :value="item.code" />
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item v-if="businessTypeShow" prop="clientType" label="业务模块" label-width="147px">
  50. <el-select ref="clearBusiness" v-model="form.clientType" placeholder="业务模块" style="width:76%;">
  51. <el-option v-for="item in businessTypeStr" :key="item.code" :label="item.name" :value="item.code" />
  52. </el-select>
  53. </el-form-item>
  54. </div>
  55. <el-form-item label="需求文档" label-width="112px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
  56. <el-form-item label="技术文档" label-width="112px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
  57. <!-- <el-form-item class="submit">
  58. <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
  59. <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">保 存</el-button>
  60. </el-form-item> -->
  61. </div>
  62. </div>
  63. <div class="block">
  64. <div class="block-flex">
  65. <div class="line-between">
  66. <el-form-item label="标签" label-width="124px">
  67. <el-input v-model="form.tag" autocomplete="off" placeholder="请填写" style="width:76%;" />
  68. </el-form-item>
  69. <el-form-item label="分组" label-width="147px">
  70. <el-input v-model="form.group" autocomplete="off" placeholder="请填写" style="width:76%;" />
  71. </el-form-item>
  72. </div>
  73. <div class="line-between">
  74. <el-form-item label="产品" label-width="124px" prop="pm">
  75. <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
  76. <el-option
  77. v-for="item in optionsPM"
  78. :key="item.id"
  79. :label="item.name"
  80. :value="item.email"
  81. />
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item label="开发" label-width="147px" prop="rd">
  85. <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
  86. <el-option
  87. v-for="item in optionsRD"
  88. :key="item.id"
  89. :label="item.name"
  90. :value="item.email"
  91. />
  92. </el-select>
  93. </el-form-item>
  94. </div>
  95. <div class="line-between-add">
  96. <el-form-item label="测试" label-width="124px" prop="qa">
  97. <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
  98. <el-option
  99. v-for="item in optionsQA"
  100. :key="item.id"
  101. :label="item.name"
  102. :value="item.email"
  103. />
  104. </el-select>
  105. </el-form-item>
  106. </div>
  107. <el-form-item label="描述" label-width="112px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:89.6%;" /></el-form-item>
  108. </div>
  109. </div>
  110. <div class="block">
  111. <div class="block-flex">
  112. <div class="line-between">
  113. <el-form-item label="需求评审时间" label-width="166px">
  114. <el-date-picker v-model="form.mrdTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
  115. </el-form-item>
  116. <el-form-item label="计划提测时间" label-width="189px">
  117. <el-date-picker v-model="form.launchTestPlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
  118. </el-form-item>
  119. </div>
  120. <div class="line-between">
  121. <el-form-item label="计划开始开发时间" label-width="166px">
  122. <el-date-picker v-model="form.startDevPlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
  123. </el-form-item>
  124. <el-form-item label="计划测试完成时间" label-width="189px">
  125. <el-date-picker v-model="form.testFinishPlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
  126. </el-form-item>
  127. </div>
  128. <div class="line-between-add">
  129. <el-form-item label="计划上线时间" label-width="166px">
  130. <el-date-picker v-model="form.onlinePlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
  131. </el-form-item>
  132. </div>
  133. <el-form-item label="备注" label-width="146px"><el-input v-model="form.remark" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
  134. <el-form-item class="submit">
  135. <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
  136. <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">确 定</el-button>
  137. </el-form-item>
  138. </div>
  139. </div>
  140. </el-form>
  141. </div>
  142. </template>
  143. <script>
  144. import { projectGetTypeMap, updateTaskList, teamMembers } from '@/api/projectPage'
  145. import { taskListCreate } from '@/api/defectManage'
  146. import { bugGetEnum } from '@/api/defectManage' // 下拉菜单data
  147. import axios from 'axios'
  148. export default {
  149. data() {
  150. return {
  151. form: {
  152. type: '',
  153. clientType: '',
  154. pm: '',
  155. rd: '',
  156. qa: ''
  157. },
  158. optionsPM: [],
  159. optionsRD: [],
  160. optionsQA: [],
  161. bugTypeStr: [],
  162. stageStr: [],
  163. pauseProjectId: '',
  164. businessTypeShow: false,
  165. priorityEnumList: [], // 优先级
  166. typeString: [], // 平台类型
  167. bizIdEnumList: [], // 业务线
  168. businessTypeStr: [], // 业务模块
  169. processStatusEnumList: [], // 状态
  170. noTestEnumList: [], // 是否免测
  171. stageEnumList: [], // 进展
  172. taskTypeStr: [], // 任务类型
  173. userInformation: localStorage.getItem('username'),
  174. userNames: localStorage.getItem('realname'),
  175. serviceDataRules: {
  176. bizId: [{ required: true, message: '业务线不能为空', trigger: 'change' }],
  177. type: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
  178. taskType: [{ required: true, message: '任务类型不能为空', trigger: 'change' }],
  179. notest: [{ required: true, message: '是否免测不能为空', trigger: 'change' }],
  180. status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
  181. name: [{ required: true, message: '任务名称不能为空', trigger: 'change' }],
  182. priority: [{ required: true, message: '优先级不能为空', trigger: 'change' }],
  183. // stage: [{ required: true, message: '进展不能为空', trigger: 'change' }],
  184. clientType: [{ required: true, message: '工程模块为空', trigger: 'change' }],
  185. pm: [{ required: true, message: '产品人员不能为空', trigger: 'change' }],
  186. rd: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
  187. qa: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
  188. }
  189. }
  190. },
  191. created() {
  192. this.bugListSelect()
  193. this.idDetail()
  194. },
  195. mounted() {
  196. document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
  197. this.$refs.form.resetFields()
  198. },
  199. methods: {
  200. bugListSelect() {
  201. bugGetEnum().then(res => {
  202. this.priorityEnumList = res.data.priorityEnumList
  203. this.processStatusEnumList = res.data.processStatusEnumList
  204. this.noTestEnumList = res.data.noTestEnumList
  205. this.bugTypeStr = res.data.stageEnumList
  206. this.taskTypeStr = res.data.taskAndRoutineEnumList
  207. })
  208. },
  209. // 根据id获取数据
  210. async idDetail() {
  211. // 业务线数据获取
  212. await projectGetTypeMap().then(res => {
  213. if (res.code === 200) {
  214. this.bizIdEnumList = res.data
  215. } else {
  216. this.errorFun(res.msg)
  217. }
  218. })
  219. taskListCreate({ id: this.$route.query.id }).then(res => {
  220. if (res.code === 200) {
  221. this.form = res.data[0]
  222. this.typeString = this.bizIdEnumList.filter(value => value.code === this.form.bizId)[0].child
  223. this.getMember() // 保证bizId存在
  224. if (this.form.pm) {
  225. this.form.pm = this.form.pm.split(',')
  226. }
  227. if (this.form.rd) {
  228. this.form.rd = this.form.rd.split(',')
  229. }
  230. if (this.form.qa) {
  231. this.form.qa = this.form.qa.split(',')
  232. }
  233. if (this.form.clientType) {
  234. this.businessTypeShow = true
  235. this.businessTypeStr = this.typeString.filter(value => value.code === this.form.type)[0].child
  236. }
  237. } else {
  238. this.errorFun(res.msg)
  239. }
  240. })
  241. },
  242. // 业务线取子数据
  243. clickChangePlatform(e) {
  244. this.typeString = this.bizIdEnumList.filter(value => value.code === e)[0].child
  245. this.businessTypeStr = []
  246. this.$set(this.form, 'type', '')
  247. this.$set(this.form, 'clientType', '')
  248. this.getMember()
  249. },
  250. // 业务线取子数据
  251. clickChangeBusiness(e) {
  252. if (this.typeString.filter(value => value.code === e)[0].child) {
  253. this.businessTypeShow = true
  254. this.businessTypeStr = this.typeString.filter(value => value.code === e)[0].child
  255. } else {
  256. this.businessTypeShow = false
  257. }
  258. this.$set(this.form, 'clientType', '')
  259. },
  260. // 点击一次更新一次
  261. realTimeChange(e) {
  262. if (e === true) this.getMember()
  263. },
  264. // 人员搜索
  265. getMember() {
  266. this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
  267. this.objDataRD = { bizId: this.form.bizId, email: '', role: 'rd' }
  268. this.objDataQA = { bizId: this.form.bizId, email: '', role: 'qa' }
  269. axios.all([teamMembers(this.objDataPM), teamMembers(this.objDataRD), teamMembers(this.objDataQA)]).then(axios.spread((resPM, resRD, resQA, resFOCUS) => {
  270. if (resPM.code === 200 && resRD.code === 200 && resQA.code === 200) {
  271. this.optionsPM = resPM.data
  272. this.optionsRD = resRD.data
  273. this.optionsQA = resQA.data
  274. } else {
  275. this.errorFun('人员数据获取失败')
  276. }
  277. }))
  278. },
  279. // 新建项目
  280. createFormData(form) {
  281. this.$refs.form.validate((valid) => {
  282. if (valid) {
  283. form.projectId = this.$route.query.projectId
  284. if (form.pm) {
  285. form.pm = form.pm.join(',')
  286. }
  287. if (form.rd) {
  288. form.rd = form.rd.join(',')
  289. }
  290. if (form.qa) {
  291. form.qa = form.qa.join(',')
  292. }
  293. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  294. this.objData = { taskInfo: form, user: this.userData }
  295. updateTaskList(this.objData).then(res => {
  296. res.code === 200 ? this.successFun('updata') : this.errorFun(res.msg)
  297. this.$router.go(-1)
  298. })
  299. } else {
  300. this.errorFun('还有未填写的信息')
  301. }
  302. })
  303. },
  304. successFun(successText) {
  305. this.$notify({ title: 'Success', message: `${successText} Successfully`, type: 'success', duration: 2000 })
  306. },
  307. errorFun(errorText) {
  308. this.$notify({ title: 'Failed', message: errorText, type: 'error', duration: 2000 })
  309. }
  310. }
  311. }
  312. </script>
  313. <style lang="stylus" scoped>
  314. .set-background
  315. background-color #F2F3F6
  316. display flex
  317. justify-content center
  318. min-width 1200px
  319. .block
  320. background-color rgba(255,255,255,1)
  321. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  322. border-radius 7px
  323. width 95%
  324. margin 20px auto
  325. padding 29px 50px
  326. .block >>> .el-form-item__content
  327. margin-left 0 !important
  328. .block-flex
  329. display flex
  330. flex-wrap wrap
  331. .block-flex >>> .el-form-item
  332. width 100%
  333. display flex
  334. .block-flex >>> .el-form-item__content
  335. width 100%
  336. .force-height >>> .w-e-text-container
  337. height 80px !important
  338. .line-between
  339. width 100%
  340. display flex
  341. justify-content space-between
  342. .line-between-add
  343. display flex
  344. flex-wrap wrap
  345. width 100%
  346. .line-between-add >>> .el-form-item
  347. width 50%
  348. .submit
  349. margin 0 9%
  350. .submit >>> .el-form-item__content
  351. margin-top 40px
  352. display flex
  353. flex-direction row-reverse
  354. .move-button
  355. margin-right 20px
  356. // .font
  357. // font-size 18px
  358. // font-family PingFangSC
  359. // font-weight 500
  360. // color rgba(51,59,74,1)
  361. // line-height 35px
  362. </style>