BasicsCode.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <template>
  2. <div class="detail-infos">
  3. <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
  4. <el-form-item label="PM:">
  5. <over-click id="pm-select" @overMouse="changeArea">
  6. <template slot="active">
  7. <search-people :value.sync="form_query.pm" :clearable="false" />
  8. </template>
  9. <template slot="overMouse">
  10. <span v-if="form_query.pm">{{ form_query.pmMemberInfoResponse.name }}</span>
  11. </template>
  12. </over-click>
  13. </el-form-item>
  14. <el-form-item label="开发Leader:">
  15. <over-click id="rdLeader-select" style="line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  16. <template slot="active">
  17. <search-people :value.sync="form_query.rdLeader" :clearable="false" :multiple="true" />
  18. </template>
  19. <template slot="overMouse">
  20. <span v-if="form_query.rdLeaderMemberInfoResponse">
  21. <span v-for="(item, index) in form_query.rdLeaderMemberInfoResponse" :key="index">
  22. {{ item.name }}
  23. <span v-if="index < form_query.rdLeaderMemberInfoResponse.length - 1"> , </span>
  24. </span>
  25. </span>
  26. <span v-else style="color: #C0C4CC;">待添加</span>
  27. </template>
  28. </over-click>
  29. </el-form-item>
  30. <el-form-item label="测试Leader:">
  31. <over-click id="qaLeader-select" style="line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  32. <template slot="active">
  33. <search-people :value.sync="form_query.qaLeader" :clearable="false" :multiple="true" />
  34. </template>
  35. <template slot="overMouse">
  36. <span v-if="form_query.qaLeaderMemberInfoResponse">
  37. <span v-for="(item, index) in form_query.qaLeaderMemberInfoResponse" :key="index">
  38. {{ item.name }}
  39. <span v-if="index < form_query.qaLeaderMemberInfoResponse.length - 1"> , </span>
  40. </span>
  41. </span>
  42. <span v-else style="color: #C0C4CC;">待添加</span>
  43. </template>
  44. </over-click>
  45. </el-form-item>
  46. </el-form>
  47. <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
  48. <el-form-item label="需求方向:">
  49. <over-click id="rqmtOrntIds-select" style="line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  50. <template slot="active">
  51. <el-cascader v-model="form_query.rqmtOrntIds" size="medium" collapse-tags :props="props" :options="demandDirection" placeholder="请选择" />
  52. </template>
  53. <template slot="overMouse">
  54. <span v-if="form_query.rqmtOrntNames">{{ form_query.rqmtOrntNames }}</span>
  55. <span v-else style="color: #C0C4CC;">请选择</span>
  56. </template>
  57. </over-click>
  58. </el-form-item>
  59. <el-form-item label="需求来源:">
  60. <over-click id="sourceType-select" @overMouse="changeArea">
  61. <template slot="active">
  62. <el-select v-model="form_query.sourceType" size="small" filterable placeholder="请选择">
  63. <el-option v-for="(item,index) in sourceTypeList" :key="item.msg + index" :label="item.msg" :value="item.code" />
  64. </el-select>
  65. </template>
  66. <template slot="overMouse">
  67. <span v-if="form_query.sourceTypeName">{{ form_query.sourceTypeName }}</span>
  68. </template>
  69. </over-click>
  70. </el-form-item>
  71. <el-form-item label="需求提出人:">
  72. <over-click id="rqmtProposer-select" style="line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  73. <template slot="active">
  74. <search-people :value.sync="form_query.rqmtProposer" :clearable="false" :multiple="true" />
  75. </template>
  76. <template slot="overMouse">
  77. <span v-if="form_query.rqmtProposer">
  78. <span v-for="(item, index) in form_query.rqmtProposers" :key="index">
  79. {{ item.name }}
  80. <span v-if="index < form_query.rqmtProposers.length - 1"> , </span>
  81. </span>
  82. </span>
  83. <span v-else style="color: #C0C4CC;">待添加</span>
  84. </template>
  85. </over-click>
  86. </el-form-item>
  87. </el-form>
  88. <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
  89. <el-form-item label="优先级:">
  90. <over-click id="priority-select" @overMouse="changeArea">
  91. <template slot="active">
  92. <el-select v-model="form_query.priority" size="small" filterable placeholder="请选择">
  93. <el-option v-for="(item,index) in priorityList" :key="item.msg + index" :label="item.msg" :value="item.code" />
  94. </el-select>
  95. </template>
  96. <template slot="overMouse">
  97. <span v-if="form_query.priorityName">{{ form_query.priorityName }}</span>
  98. </template>
  99. </over-click>
  100. </el-form-item>
  101. <el-form-item label="所属迭代:">
  102. <over-click id="iterationId-select" style="line-height: normal; padding: 10px 0;" :parameter="Jump.url1" @overMouse="changeArea">
  103. <template slot="active">
  104. <el-select v-model="form_query.iterationId" clearable placeholder="请选择">
  105. <el-option v-for="(item,index) in iterationList" :key="item.name + index" :label="item.name" :value="item.id" />
  106. </el-select>
  107. </template>
  108. <template slot="overMouse">
  109. <span v-if="form_query.iterationName">{{ form_query.iterationName }}</span>
  110. <span v-else style="color: #C0C4CC;">请选择</span>
  111. </template>
  112. </over-click>
  113. </el-form-item>
  114. <el-form-item label="跟版客户端:">
  115. <over-click id="referredClientType-select" style="line-height: normal; padding: 10px 0;" @overMouse="changeArea" @click="setName">
  116. <template slot="active">
  117. <el-select v-model="form_query.referredClientType" size="small" multiple filterable placeholder="请选择" @change="ReferredClientType(form_query.referredClientType)">
  118. <el-option v-for="(item,index) in appClient" :key="item.msg + index" :label="item.msg" :value="item.code" :disabled="item.dis" @click.native="setReferredClientType(item)" />
  119. </el-select>
  120. </template>
  121. <template slot="overMouse">
  122. <span v-if="form_query.referredClientTypeName === '无' || form_query.referredClientTypeName === 'null' " style="color: #333333;">不跟版</span>
  123. <span v-else>{{ form_query.referredClientTypeName }}</span>
  124. </template>
  125. </over-click>
  126. </el-form-item>
  127. </el-form>
  128. <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
  129. <el-form-item label="所属项目:">
  130. <over-click id="belongingProject-select" style="line-height: normal; padding: 10px 0;" :parameter="Jump.url" @overMouse="changeArea">
  131. <template slot="active">
  132. <el-select v-model="form_query.belongingProject" size="small" clearable placeholder="请选择">
  133. <el-option v-for="(item,index) in belongProjectList" :key="index" :label="item.name" :value="item.id" />
  134. </el-select>
  135. </template>
  136. <template slot="overMouse">
  137. <span v-if="form_query.belongingProject"> {{ form_query.belongingProjectName }} </span>
  138. <span v-else style="color: #C0C4CC;">请选择</span>
  139. </template>
  140. </over-click>
  141. </el-form-item>
  142. </el-form>
  143. <el-form :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
  144. <el-form-item label="BRD链接:" class="PRD">
  145. <over-click id="brdUrl-select" style="width: max-content;line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  146. <template slot="active">
  147. <el-input v-model="form_query.brdUrl" size="small" clearable style="width:100% !important;" placeholder="请输入" />
  148. </template>
  149. <template slot="overMouse">
  150. <span v-if="form_query.brdUrl" class="PRD-link"><a :href="form_query.brdUrl" target="_blank">{{ form_query.brdUrl }}</a></span>
  151. <span v-else style="color: #C0C4CC;">待添加</span>
  152. </template>
  153. </over-click>
  154. </el-form-item>
  155. <el-form-item label="PRD链接:" prop="mrdUrl" class="PRD">
  156. <over-click id="mrdUrl-select" style="width: max-content;line-height: normal; padding: 10px 0;" @overMouse="changeArea">
  157. <template slot="active">
  158. <el-input v-model="form_query.mrdUrl" size="small" clearable style="width:100% !important;" placeholder="请输入" />
  159. </template>
  160. <template slot="overMouse">
  161. <span v-if="form_query.mrdUrl" class="PRD-link">
  162. <a
  163. :href="form_query.mrdUrl"
  164. class="ellipsis"
  165. target="_blank"
  166. style="width: 500px"
  167. >{{ form_query.mrdUrl }}</a>
  168. </span>
  169. <span v-else style="color: #C0C4CC;">待添加</span>
  170. </template>
  171. </over-click>
  172. </el-form-item>
  173. </el-form>
  174. </div>
  175. </template>
  176. <script>
  177. const _ = require('lodash')
  178. import { EncryptId } from '@/utils/crypto-js.js'
  179. import { mapGetters } from 'vuex'
  180. import searchPeople from '@/components/select/searchPeople'
  181. import overClick from '@/components/click/overClick'
  182. import { updateRequirement, iterationList, showRequirementEnum, settingQueryBizRqmtOrntList, projectListProject } from '@/api/requirement.js'
  183. export default {
  184. components: {
  185. searchPeople,
  186. overClick
  187. },
  188. props: {
  189. value: { type: Object, required: true }
  190. },
  191. data() {
  192. return {
  193. // dependList: [{ msg: '否', code: 0 }, { msg: '是', code: 1 }], // 是否跟版
  194. form_query: { pm: null, rqmtOrntIds: [] },
  195. priorityList: [], // 优先级列表
  196. sourceTypeList: [], // 需求来源列表
  197. appClient: [], // 跟版客户端列表
  198. demandDirection: [], // 需求方向option
  199. iterationList: [], // 所属迭代
  200. Jump: {
  201. url: null,
  202. url1: null
  203. },
  204. belongProjectList: [], // 所属项目
  205. props: {
  206. value: 'id',
  207. label: 'rqmtOrntName',
  208. children: 'childRqmtOrnts',
  209. multiple: true
  210. }
  211. }
  212. },
  213. computed: {
  214. ...mapGetters(['bizId'])
  215. },
  216. watch: {
  217. value: {
  218. handler(newV, old) {
  219. this.form_query = newV
  220. this.belongingProject(newV)
  221. },
  222. deep: true,
  223. immediate: true
  224. },
  225. bizId: {
  226. handler(newV) {
  227. if (newV !== -1) this.showRequirementEnum()
  228. },
  229. immediate: true
  230. }
  231. },
  232. methods: {
  233. async changeArea(e) { // area修改
  234. const requirementInfo = _.cloneDeep(this.form_query)
  235. requirementInfo.rqmtProposer = requirementInfo.rqmtProposer ? requirementInfo.rqmtProposer.join() : null
  236. requirementInfo.rdLeader = requirementInfo.rdLeader ? requirementInfo.rdLeader.join() : ''
  237. requirementInfo.qaLeader = requirementInfo.qaLeader ? requirementInfo.qaLeader.join() : ''
  238. requirementInfo.iterationId = requirementInfo.iterationId === '' ? requirementInfo.iterationId = -1 : requirementInfo.iterationId
  239. if (requirementInfo.referredClientType && requirementInfo.referredClientType.length > 0) {
  240. if (requirementInfo.referredClientType === [-1]) {
  241. requirementInfo.dependOnRelease = 0
  242. requirementInfo.referredClientType = []
  243. } else {
  244. requirementInfo.dependOnRelease = 1
  245. requirementInfo.referredClientType = requirementInfo.referredClientType.join()
  246. }
  247. } else {
  248. this.form_query.referredClientType = [-1]
  249. requirementInfo.dependOnRelease = 0
  250. requirementInfo.referredClientType = ''
  251. this.appClient.map(item => {
  252. if (item.code !== -1) {
  253. item.dis = true
  254. }
  255. })
  256. }
  257. const res = await updateRequirement(requirementInfo)
  258. if (res.code === 200) {
  259. this.$emit('update')
  260. this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
  261. }
  262. },
  263. belongingProject(e) {
  264. if (e.belongingProject && e.belongingProject !== -1) {
  265. const bizId_id = EncryptId(`${this.bizId}_${e.belongingProject}`)
  266. this.Jump.url = { name: '项目详情', query: { bizId_id: bizId_id }}
  267. }
  268. if (e.iterationId !== -1 && e.iterationId) {
  269. const bizId_id = EncryptId(`${this.bizId}_${e.iterationId}`)
  270. this.Jump.url1 = { name: '迭代详情', query: { bizId_id: bizId_id }}
  271. }
  272. },
  273. async showRequirementEnum() { // 获取需求状态列表,优先级列表,需求来源
  274. const res1 = await projectListProject({ bizId: this.bizId })
  275. if (res1.code === 200) {
  276. this.belongProjectList = res1.data
  277. }
  278. const res4 = await iterationList({ bizId: this.bizId, curIndex: 1, pageSize: 999 }) // 获取所属迭代列表
  279. if (res4.code === 200) {
  280. this.iterationList = res4.data.list
  281. }
  282. const res = await showRequirementEnum()
  283. if (res.code === 200) {
  284. this.priorityList = res.data.priority
  285. this.sourceTypeList = res.data.sourceType
  286. this.appClient = res.data.appClient
  287. this.appClient.unshift({ msg: '不跟版', code: -1 })
  288. this.$nextTick(() => {
  289. if (this.form_query.referredClientType && this.form_query.referredClientTypes.length === 0) {
  290. this.form_query.referredClientType = [-1]
  291. this.appClient.map(item => {
  292. if (item.code !== -1) {
  293. item.dis = true
  294. }
  295. })
  296. } else {
  297. this.appClient.map(item => {
  298. if (item.code === -1) {
  299. item.dis = true
  300. }
  301. })
  302. }
  303. })
  304. }
  305. const res3 = await settingQueryBizRqmtOrntList(this.bizId)
  306. if (res3.code === 200) { // 需求方向
  307. this.demandDirection = this.getTreeData(res3.data)
  308. }
  309. },
  310. getTreeData(data) {
  311. for (var i = 0; i < data.length; i++) {
  312. if (data[i].childRqmtOrnts.length < 1) {
  313. // children若为空数组,则将children设为undefined
  314. data[i].childRqmtOrnts = undefined
  315. } else {
  316. // children若不为空数组,则继续 递归调用 本方法
  317. this.getTreeData(data[i].childRqmtOrnts)
  318. }
  319. }
  320. return data
  321. },
  322. ReferredClientType(e) {
  323. if (e.length === 0) {
  324. this.$forceUpdate()
  325. this.appClient.map(item => { item.dis = false })
  326. }
  327. },
  328. setName() {
  329. if (this.form_query.referredClientTypeName === '不跟版') {
  330. this.form_query.referredClientType = [-1]
  331. this.appClient.map(item => {
  332. if (item.code !== -1) {
  333. item.dis = true
  334. }
  335. })
  336. }
  337. },
  338. setReferredClientType(val) {
  339. if (val.dis === true) {
  340. return false
  341. }
  342. if (val.code === -1) {
  343. this.form_query.dependOnRelease = 0
  344. this.appClient.map(item => {
  345. if (item.code !== -1) {
  346. this.$forceUpdate()
  347. item.dis = true
  348. }
  349. })
  350. } else {
  351. this.form_query.dependOnRelease = 1
  352. this.appClient.map(item => {
  353. if (item.code === -1) {
  354. this.$forceUpdate()
  355. item.dis = true
  356. }
  357. })
  358. }
  359. if (this.form_query.referredClientType.length === 0) {
  360. this.ReferredClientType(this.form_query.referredClientType)
  361. }
  362. }
  363. }
  364. }
  365. </script>
  366. <style lang="less" scoped>
  367. .detail-infos {
  368. padding: 0 34px 20px 34px;
  369. .demo-form-inline {
  370. .el-form-item {
  371. width: 33%;
  372. margin-right: 0;
  373. margin-bottom: 1px;
  374. }
  375. /deep/.el-form-item__content {
  376. width: calc(100% - 125px);
  377. color: #333333;
  378. font-size: 14px;
  379. }
  380. }
  381. .PRD-link {
  382. width: 50%;
  383. overflow: hidden;
  384. text-overflow:ellipsis;
  385. white-space: nowrap;
  386. color:#409EFF;
  387. }
  388. }
  389. </style>