taskUpdateCreate.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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="110px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:90%;" /></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="110px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
  56. <el-form-item label="技术文档" label-width="110px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:90%;" /></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="110px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></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="142px"><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: 'blur' }],
  186. rd: [{ required: true, message: '开发人员不能为空', trigger: 'blur' }],
  187. qa: [{ required: true, message: '测试人员不能为空', trigger: 'blur' }]
  188. }
  189. }
  190. },
  191. created() {
  192. this.bugListSelect()
  193. this.idDetail()
  194. },
  195. methods: {
  196. bugListSelect() {
  197. bugGetEnum().then(res => {
  198. this.priorityEnumList = res.data.priorityEnumList
  199. this.processStatusEnumList = res.data.processStatusEnumList
  200. this.noTestEnumList = res.data.noTestEnumList
  201. this.bugTypeStr = res.data.stageEnumList
  202. this.taskTypeStr = res.data.taskAndRoutineEnumList
  203. })
  204. },
  205. // 根据id获取数据
  206. async idDetail() {
  207. // 业务线数据获取
  208. await projectGetTypeMap().then(res => {
  209. if (res.code === 200) {
  210. this.bizIdEnumList = res.data
  211. } else {
  212. this.errorFun(res.msg)
  213. }
  214. })
  215. taskListCreate({ id: this.$route.query.id }).then(res => {
  216. if (res.code === 200) {
  217. this.form = res.data[0]
  218. this.typeString = this.bizIdEnumList.filter(value => value.code === this.form.bizId)[0].child
  219. this.getMember() // 保证bizId存在
  220. if (this.form.pm) {
  221. this.form.pm = this.form.pm.split(',')
  222. }
  223. if (this.form.rd) {
  224. this.form.rd = this.form.rd.split(',')
  225. }
  226. if (this.form.qa) {
  227. this.form.qa = this.form.qa.split(',')
  228. }
  229. if (this.form.clientType) {
  230. this.businessTypeShow = true
  231. this.businessTypeStr = this.typeString.filter(value => value.code === this.form.type)[0].child
  232. }
  233. } else {
  234. this.errorFun(res.msg)
  235. }
  236. })
  237. },
  238. // 业务线取子数据
  239. clickChangePlatform(e) {
  240. this.typeString = this.bizIdEnumList.filter(value => value.code === e)[0].child
  241. this.businessTypeStr = []
  242. this.$set(this.form, 'type', '')
  243. this.$set(this.form, 'clientType', '')
  244. this.getMember()
  245. },
  246. // 业务线取子数据
  247. clickChangeBusiness(e) {
  248. if (this.typeString.filter(value => value.code === e)[0].child) {
  249. this.businessTypeShow = true
  250. this.businessTypeStr = this.typeString.filter(value => value.code === e)[0].child
  251. } else {
  252. this.businessTypeShow = false
  253. }
  254. this.$set(this.form, 'clientType', '')
  255. },
  256. // 点击一次更新一次
  257. realTimeChange(e) {
  258. if (e === true) this.getMember()
  259. },
  260. // 人员搜索
  261. getMember() {
  262. this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
  263. this.objDataRD = { bizId: this.form.bizId, email: '', role: 'rd' }
  264. this.objDataQA = { bizId: this.form.bizId, email: '', role: 'qa' }
  265. axios.all([teamMembers(this.objDataPM), teamMembers(this.objDataRD), teamMembers(this.objDataQA)]).then(axios.spread((resPM, resRD, resQA, resFOCUS) => {
  266. if (resPM.code === 200 && resRD.code === 200 && resQA.code === 200) {
  267. this.optionsPM = resPM.data
  268. this.optionsRD = resRD.data
  269. this.optionsQA = resQA.data
  270. } else {
  271. this.errorFun('人员数据获取失败')
  272. }
  273. }))
  274. },
  275. // 新建项目
  276. createFormData(form) {
  277. this.$refs.form.validate((valid) => {
  278. if (valid) {
  279. form.projectId = this.$route.query.projectId
  280. if (form.pm) {
  281. form.pm = form.pm.join(',')
  282. }
  283. if (form.rd) {
  284. form.rd = form.rd.join(',')
  285. }
  286. if (form.qa) {
  287. form.qa = form.qa.join(',')
  288. }
  289. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  290. this.objData = { taskInfo: form, user: this.userData }
  291. updateTaskList(this.objData).then(res => {
  292. res.code === 200 ? this.successFun('updata') : this.errorFun(res.msg)
  293. this.$router.go(-1)
  294. })
  295. } else {
  296. this.errorFun('还有未填写的信息')
  297. }
  298. })
  299. },
  300. successFun(successText) {
  301. this.$notify({ title: 'Success', message: `${successText} Successfully`, type: 'success', duration: 2000 })
  302. },
  303. errorFun(errorText) {
  304. this.$notify({ title: 'Failed', message: errorText, type: 'error', duration: 2000 })
  305. }
  306. }
  307. }
  308. </script>
  309. <style lang="stylus" scoped>
  310. .set-background
  311. background-color #F2F3F6
  312. display flex
  313. justify-content center
  314. min-width 700px
  315. .block
  316. background-color rgba(255,255,255,1)
  317. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  318. border-radius 7px
  319. width 95%
  320. margin 20px auto
  321. padding 29px 50px
  322. .block >>> .el-form-item__content
  323. margin-left 0 !important
  324. .block-flex
  325. display flex
  326. flex-wrap wrap
  327. .block-flex >>> .el-form-item
  328. width 100%
  329. display flex
  330. .block-flex >>> .el-form-item__content
  331. width 100%
  332. .force-height >>> .w-e-text-container
  333. height 80px !important
  334. .line-between
  335. width 100%
  336. display flex
  337. justify-content space-between
  338. .line-between-add
  339. display flex
  340. flex-wrap wrap
  341. width 100%
  342. .line-between-add >>> .el-form-item
  343. width 50%
  344. .submit
  345. margin 0 9%
  346. .submit >>> .el-form-item__content
  347. margin-top 40px
  348. display flex
  349. flex-direction row-reverse
  350. .move-button
  351. margin-right 20px
  352. // .font
  353. // font-size 18px
  354. // font-family PingFangSC
  355. // font-weight 500
  356. // color rgba(51,59,74,1)
  357. // line-height 35px
  358. </style>