taskCreate.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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">
  75. <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
  76. <el-option
  77. v-for="item in optionsPM"
  78. :key="item.id"
  79. :label="item.email"
  80. :value="item.email"
  81. />
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item label="开发" label-width="147px">
  85. <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
  86. <el-option
  87. v-for="item in optionsRD"
  88. :key="item.id"
  89. :label="item.email"
  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">
  97. <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
  98. <el-option
  99. v-for="item in optionsQA"
  100. :key="item.id"
  101. :label="item.email"
  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, createTaskData, getProjectData, teamMembers } from '@/api/projectPage'
  145. import { bugGetEnum } from '@/api/defectManage' // 下拉菜单data
  146. import axios from 'axios'
  147. export default {
  148. data() {
  149. return {
  150. form: {
  151. bizId: '',
  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. }
  186. }
  187. },
  188. created() {
  189. this.bugListSelect()
  190. if (this.$route.query.id) {
  191. this.idDetail()
  192. } else {
  193. this.forkdown()
  194. }
  195. },
  196. methods: {
  197. bugListSelect() {
  198. bugGetEnum().then(res => {
  199. this.priorityEnumList = res.data.priorityEnumList
  200. this.processStatusEnumList = res.data.processStatusEnumList
  201. this.noTestEnumList = res.data.noTestEnumList
  202. this.bugTypeStr = res.data.stageEnumList
  203. this.taskTypeStr = res.data.taskAndRoutineEnumList
  204. })
  205. },
  206. // 根据id获取数据
  207. async idDetail() {
  208. // 业务线数据获取
  209. await projectGetTypeMap().then(res => {
  210. if (res.code === 200) {
  211. this.bizIdEnumList = res.data
  212. } else {
  213. this.errorFun(res.msg)
  214. }
  215. })
  216. getProjectData(this.$route.query.id).then(res => {
  217. if (res.code === 200) {
  218. this.form.bizId = res.data.bizId
  219. this.form.type = res.data.platForm
  220. this.typeString = this.bizIdEnumList.filter(value => value.code === this.form.bizId)[0].child
  221. this.businessTypeShow = true
  222. this.businessTypeStr = this.typeString.filter(value => value.code === this.form.type)[0].child
  223. this.getMember() // 保证bizId存在
  224. } else {
  225. this.errorFun(res.msg)
  226. }
  227. })
  228. },
  229. // 业务线数据获取
  230. forkdown() {
  231. projectGetTypeMap().then(res => {
  232. if (res.code === 200) {
  233. this.bizIdEnumList = res.data
  234. } else {
  235. this.errorFun(res.msg)
  236. }
  237. })
  238. },
  239. // 业务线取子数据
  240. clickChangePlatform(e) {
  241. this.typeString = this.bizIdEnumList.filter(value => value.code === e)[0].child
  242. this.businessTypeStr = []
  243. this.$set(this.form, 'type', '')
  244. this.$set(this.form, 'clientType', '')
  245. this.getMember()
  246. },
  247. // 业务线取子数据
  248. clickChangeBusiness(e) {
  249. if (this.typeString.filter(value => value.code === e)[0].child) {
  250. this.businessTypeShow = true
  251. this.businessTypeStr = this.typeString.filter(value => value.code === e)[0].child
  252. } else {
  253. this.businessTypeShow = false
  254. }
  255. this.$set(this.form, 'clientType', '')
  256. },
  257. // 人员搜索
  258. getMember() {
  259. this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
  260. this.objDataRD = { bizId: this.form.bizId, email: '', role: 'rd' }
  261. this.objDataQA = { bizId: this.form.bizId, email: '', role: 'qa' }
  262. axios.all([teamMembers(this.objDataPM), teamMembers(this.objDataRD), teamMembers(this.objDataQA)]).then(axios.spread((resPM, resRD, resQA) => {
  263. if (resPM.code === 200 && resRD.code === 200 && resQA.code === 200) {
  264. this.optionsPM = resPM.data
  265. this.optionsRD = resRD.data
  266. this.optionsQA = resQA.data
  267. } else {
  268. this.errorFun('人员数据获取失败')
  269. }
  270. }))
  271. },
  272. // 新建项目
  273. createFormData(form) {
  274. this.$refs.form.validate((valid) => {
  275. if (valid) {
  276. form.projectId = this.$route.query.id
  277. if (form.pm) {
  278. form.pm = form.pm.join(',')
  279. }
  280. if (form.rd) {
  281. form.rd = form.rd.join(',')
  282. }
  283. if (form.qa) {
  284. form.qa = form.qa.join(',')
  285. }
  286. this.userData = { id: '', ename: this.userInformation, name: this.userNames }
  287. this.objData = { taskInfo: form, user: this.userData }
  288. createTaskData(this.objData).then(res => {
  289. res.code === 200 ? this.successFun('updata') : this.errorFun(res.msg)
  290. this.$router.go(-1)
  291. })
  292. } else {
  293. this.errorFun('还有未填写的信息')
  294. }
  295. })
  296. },
  297. successFun(successText) {
  298. this.$notify({ title: 'Success', message: `${successText} Successfully`, type: 'success', duration: 2000 })
  299. },
  300. errorFun(errorText) {
  301. this.$notify({ title: 'Failed', message: errorText, type: 'error', duration: 2000 })
  302. }
  303. }
  304. }
  305. </script>
  306. <style lang="stylus" scoped>
  307. .set-background
  308. background-color #F2F3F6
  309. display flex
  310. justify-content center
  311. min-width 700px
  312. .block
  313. background-color rgba(255,255,255,1)
  314. box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
  315. border-radius 7px
  316. width 95%
  317. margin 20px auto
  318. padding 29px 50px
  319. .block >>> .el-form-item__content
  320. margin-left 0 !important
  321. .block-flex
  322. display flex
  323. flex-wrap wrap
  324. .block-flex >>> .el-form-item
  325. width 100%
  326. display flex
  327. .block-flex >>> .el-form-item__content
  328. width 100%
  329. .force-height >>> .w-e-text-container
  330. height 80px !important
  331. .line-between
  332. width 100%
  333. display flex
  334. justify-content space-between
  335. .line-between-add
  336. display flex
  337. flex-wrap wrap
  338. width 100%
  339. .line-between-add >>> .el-form-item
  340. width 50%
  341. .submit
  342. margin 0 9%
  343. .submit >>> .el-form-item__content
  344. margin-top 40px
  345. display flex
  346. flex-direction row-reverse
  347. .move-button
  348. margin-right 20px
  349. // .font
  350. // font-size 18px
  351. // font-family PingFangSC
  352. // font-weight 500
  353. // color rgba(51,59,74,1)
  354. // line-height 35px
  355. </style>