BasicsCode.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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"><a :href="form_query.mrdUrl" target="_blank">{{ form_query.mrdUrl }}</a></span>
  162. <span v-else style="color: #C0C4CC;">待添加</span>
  163. </template>
  164. </over-click>
  165. </el-form-item>
  166. </el-form>
  167. </div>
  168. </template>
  169. <script>
  170. const _ = require('lodash')
  171. import { EncryptId } from '@/utils/crypto-js.js'
  172. import { mapGetters } from 'vuex'
  173. import '@/styles/PublicStyle/index.scss'
  174. import searchPeople from '@/components/select/searchPeople'
  175. import overClick from '@/components/click/overClick'
  176. import { updateRequirement, iterationList, showRequirementEnum, settingQueryBizRqmtOrntList, projectListProject } from '@/api/requirement.js'
  177. export default {
  178. components: {
  179. searchPeople,
  180. overClick
  181. },
  182. props: {
  183. value: { type: Object, required: true }
  184. },
  185. data() {
  186. return {
  187. // dependList: [{ msg: '否', code: 0 }, { msg: '是', code: 1 }], // 是否跟版
  188. form_query: { pm: null, rqmtOrntIds: [] },
  189. priorityList: [], // 优先级列表
  190. sourceTypeList: [], // 需求来源列表
  191. appClient: [], // 跟版客户端列表
  192. demandDirection: [], // 需求方向option
  193. iterationList: [], // 所属迭代
  194. Jump: {
  195. url: null,
  196. url1: null
  197. },
  198. belongProjectList: [], // 所属项目
  199. props: {
  200. value: 'id',
  201. label: 'rqmtOrntName',
  202. children: 'childRqmtOrnts',
  203. multiple: true
  204. }
  205. }
  206. },
  207. computed: {
  208. ...mapGetters(['bizId'])
  209. },
  210. watch: {
  211. value: {
  212. handler(newV, old) {
  213. this.form_query = newV
  214. this.belongingProject(newV)
  215. },
  216. deep: true,
  217. immediate: true
  218. },
  219. bizId: {
  220. handler(newV) {
  221. if (newV !== -1) this.showRequirementEnum()
  222. },
  223. immediate: true
  224. }
  225. },
  226. methods: {
  227. async changeArea(e) { // area修改
  228. const requirementInfo = _.cloneDeep(this.form_query)
  229. requirementInfo.rqmtProposer = requirementInfo.rqmtProposer ? requirementInfo.rqmtProposer.join() : null
  230. requirementInfo.rdLeader = requirementInfo.rdLeader ? requirementInfo.rdLeader.join() : ''
  231. requirementInfo.qaLeader = requirementInfo.qaLeader ? requirementInfo.qaLeader.join() : ''
  232. requirementInfo.iterationId = requirementInfo.iterationId === '' ? requirementInfo.iterationId = -1 : requirementInfo.iterationId
  233. if (requirementInfo.referredClientType && requirementInfo.referredClientType.length > 0) {
  234. if (requirementInfo.referredClientType === [-1]) {
  235. requirementInfo.dependOnRelease = 0
  236. requirementInfo.referredClientType = []
  237. } else {
  238. requirementInfo.dependOnRelease = 1
  239. requirementInfo.referredClientType = requirementInfo.referredClientType.join()
  240. }
  241. } else {
  242. this.form_query.referredClientType = [-1]
  243. requirementInfo.dependOnRelease = 0
  244. requirementInfo.referredClientType = ''
  245. this.appClient.map(item => {
  246. if (item.code !== -1) {
  247. item.dis = true
  248. }
  249. })
  250. }
  251. const res = await updateRequirement(requirementInfo)
  252. if (res.code === 200) {
  253. this.$emit('update')
  254. this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
  255. }
  256. },
  257. belongingProject(e) {
  258. if (e.belongingProject && e.belongingProject !== -1) {
  259. const bizId_id = EncryptId(`${this.bizId}_${e.belongingProject}`)
  260. this.Jump.url = { name: '项目详情', query: { bizId_id: bizId_id }}
  261. }
  262. if (e.iterationId !== -1 && e.iterationId) {
  263. const bizId_id = EncryptId(`${this.bizId}_${e.iterationId}`)
  264. this.Jump.url1 = { name: '迭代详情', query: { bizId_id: bizId_id }}
  265. }
  266. },
  267. async showRequirementEnum() { // 获取需求状态列表,优先级列表,需求来源
  268. const res1 = await projectListProject({ bizId: this.bizId })
  269. if (res1.code === 200) {
  270. this.belongProjectList = res1.data
  271. }
  272. const res4 = await iterationList({ bizId: this.bizId, curIndex: 1, pageSize: 999 }) // 获取所属迭代列表
  273. if (res4.code === 200) {
  274. this.iterationList = res4.data.list
  275. }
  276. const res = await showRequirementEnum()
  277. if (res.code === 200) {
  278. this.priorityList = res.data.priority
  279. this.sourceTypeList = res.data.sourceType
  280. this.appClient = res.data.appClient
  281. this.appClient.unshift({ msg: '不跟版', code: -1 })
  282. this.$nextTick(() => {
  283. if (this.form_query.referredClientType && this.form_query.referredClientTypes.length === 0) {
  284. this.form_query.referredClientType = [-1]
  285. this.appClient.map(item => {
  286. if (item.code !== -1) {
  287. item.dis = true
  288. }
  289. })
  290. } else {
  291. this.appClient.map(item => {
  292. if (item.code === -1) {
  293. item.dis = true
  294. }
  295. })
  296. }
  297. })
  298. }
  299. const res3 = await settingQueryBizRqmtOrntList(this.bizId)
  300. if (res3.code === 200) { // 需求方向
  301. this.demandDirection = this.getTreeData(res3.data)
  302. }
  303. },
  304. getTreeData(data) {
  305. for (var i = 0; i < data.length; i++) {
  306. if (data[i].childRqmtOrnts.length < 1) {
  307. // children若为空数组,则将children设为undefined
  308. data[i].childRqmtOrnts = undefined
  309. } else {
  310. // children若不为空数组,则继续 递归调用 本方法
  311. this.getTreeData(data[i].childRqmtOrnts)
  312. }
  313. }
  314. return data
  315. },
  316. ReferredClientType(e) {
  317. if (e.length === 0) {
  318. this.$forceUpdate()
  319. this.appClient.map(item => { item.dis = false })
  320. }
  321. },
  322. setName() {
  323. if (this.form_query.referredClientTypeName === '不跟版') {
  324. this.form_query.referredClientType = [-1]
  325. this.appClient.map(item => {
  326. if (item.code !== -1) {
  327. item.dis = true
  328. }
  329. })
  330. }
  331. },
  332. setReferredClientType(val) {
  333. if (val.dis === true) {
  334. return false
  335. }
  336. if (val.code === -1) {
  337. this.form_query.dependOnRelease = 0
  338. this.appClient.map(item => {
  339. if (item.code !== -1) {
  340. this.$forceUpdate()
  341. item.dis = true
  342. }
  343. })
  344. } else {
  345. this.form_query.dependOnRelease = 1
  346. this.appClient.map(item => {
  347. if (item.code === -1) {
  348. this.$forceUpdate()
  349. item.dis = true
  350. }
  351. })
  352. }
  353. if (this.form_query.referredClientType.length === 0) {
  354. this.ReferredClientType(this.form_query.referredClientType)
  355. }
  356. }
  357. }
  358. }
  359. </script>
  360. <style lang="scss" scoped>
  361. .detail-infos {
  362. padding: 0 34px 20px 34px;
  363. .demo-form-inline {
  364. .el-form-item {
  365. width: 33%;
  366. margin-right: 0;
  367. margin-bottom: 1px;
  368. }
  369. >>>.el-form-item__content {
  370. width: calc(100% - 125px);
  371. color: #333333;
  372. font-size: 14px;
  373. }
  374. }
  375. .PRD-link {
  376. width: 50%;
  377. overflow: hidden;
  378. text-overflow:ellipsis;
  379. white-space: nowrap;
  380. color:#409EFF;
  381. }
  382. }
  383. </style>