addAndEditProject.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <template>
  2. <div>
  3. <el-dialog :title="title" :visible.sync="dialogVisible" width="850px" :before-close="handleClose">
  4. <el-form :model="form" status-icon :rules="rules" ref="form" label-width="120px" class="demo-ruleForm">
  5. <template>
  6. <!-- 研发项目 -->
  7. <el-divider content-position="left">研发项目</el-divider>
  8. <el-row>
  9. <el-col :span="12">
  10. <el-form-item label="研发编号:">
  11. <el-autocomplete class="inline-input" v-model="form.rdnumber" value-key="name" v-SelectLazyLoading="load"
  12. :fetch-suggestions="querySearchQuestion" placeholder="请选择研发项目编号" :trigger-on-focus="false"
  13. style="width: 100%;">
  14. </el-autocomplete>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="12">
  18. <el-form-item label="编号名称:" prop="rdName">
  19. <el-input v-model="form.rdName" placeholder="请输入研发项目名称"></el-input>
  20. </el-form-item>
  21. </el-col>
  22. </el-row>
  23. <el-row>
  24. <el-col :span="12">
  25. <el-form-item label="产品:" prop="product">
  26. <el-input v-model="form.product" placeholder="请输入产品名称"></el-input>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="12">
  30. <el-form-item label="产品阶段:">
  31. <el-input v-model="form.productPhase" placeholder="请输入产品阶段"></el-input>
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. </template>
  36. <el-divider content-position="left">挖掘项目</el-divider>
  37. <el-row>
  38. <el-col :span="12">
  39. <el-form-item label="项目名称:" prop="name">
  40. <el-input v-model="form.name" placeholder="请输入项目名称"></el-input>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="12">
  44. <el-form-item label="技术方向:">
  45. <el-input v-model="form.technicalDirection" placeholder="请输入技术方向"></el-input>
  46. </el-form-item>
  47. </el-col>
  48. </el-row>
  49. <el-row>
  50. <!-- <el-col :span="12">
  51. <el-form-item label="技术方向:">
  52. <el-input v-model="form.productPhase" placeholder="请输入产品阶段"></el-input>
  53. </el-form-item>
  54. </el-col> -->
  55. <!-- <el-col :span="12">
  56. <el-form-item label="产出:">
  57. <el-input v-model="form.output" placeholder="请输入产出"></el-input>
  58. </el-form-item>
  59. </el-col> -->
  60. </el-row>
  61. <el-row>
  62. <el-col :span="12">
  63. <el-form-item label="相关竞争对手:">
  64. <el-input v-model="form.relatedCompetitors" placeholder="请输入相关竞争对手"></el-input>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="12">
  68. <el-form-item label="技术关键词:">
  69. <el-input v-model="form.technicalKeyword" placeholder="请输入技术关键词"></el-input>
  70. </el-form-item>
  71. </el-col>
  72. </el-row>
  73. <el-row>
  74. <el-col :span="12">
  75. <el-form-item label="产出:">
  76. <el-input v-model="form.output" placeholder="请输入产出"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item label="是否检索:">
  81. <el-switch v-model="form.ifSearch" active-color="#13ce66" inactive-color="#ff4949">
  82. </el-switch>
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="12">
  86. <!-- <el-form-item label="是否审核:">
  87. <el-switch v-model="form.examine" active-color="#13ce66" inactive-color="#ff4949">
  88. </el-switch>
  89. </el-form-item> -->
  90. </el-col>
  91. </el-row>
  92. <el-row>
  93. <el-col :span="24">
  94. <el-form-item label="参与人:">
  95. <div class="manage">
  96. <el-button size="small" @click="showDialog()">选择</el-button>
  97. <div v-html="getNames(form.adminPersons)">
  98. </div>
  99. </div>
  100. </el-form-item>
  101. </el-col>
  102. </el-row>
  103. <el-row>
  104. <el-col :span="24">
  105. <el-form-item label="事件:">
  106. <mySelectButton size='large' style="width:100%" @click="addEvent">
  107. <div style="width:100%">
  108. <el-select style="width:100%" v-model="form.eventId" @change="changeEvent" filterable remote clearable
  109. placeholder="请选择" :loading="eventList.loading" v-SelectLazyLoading="loadEvent"
  110. :remote-method="remoteEvent">
  111. <el-option v-for="item in eventList.data" :key="item.id" :label="item.name" :value="item.id">
  112. </el-option>
  113. </el-select>
  114. </div>
  115. </mySelectButton>
  116. </el-form-item>
  117. </el-col>
  118. </el-row>
  119. <el-row v-if="show == true">
  120. <el-col :span="24">
  121. <el-form-item label="调查类型:" prop="matterIds">
  122. <el-checkbox-group v-model="form.matterIds">
  123. <template>
  124. <el-checkbox v-for="item in dictAssociates" :key="item.id" :label="parseInt(item.id)">
  125. {{ item.name }}
  126. </el-checkbox>
  127. </template>
  128. </el-checkbox-group>
  129. </el-form-item>
  130. </el-col>
  131. </el-row>
  132. <el-row>
  133. <el-col :span="24">
  134. <el-form-item label="负责人:">
  135. <el-select v-model="form.headId" placeholder="请选择负责人" style="width: 100%;" filterable remote
  136. :remote-method="remoteMethodPerson" v-SelectLazyLoading="lazyLoadingPerson"
  137. :loading="personnelList.loading">
  138. <el-option v-for="item in personnelList.data" :key="item.id" :label="item.name" :value="item.id">
  139. </el-option>
  140. </el-select>
  141. </el-form-item>
  142. </el-col>
  143. </el-row>
  144. <el-row>
  145. <el-col :span="24">
  146. <el-form-item label="附件:">
  147. <myUpload :file-list="form.systemFileList" @on-change="onchangeFile" @on-remove="onRemove"
  148. style="height: 180px;" :autoUpload="true"></myUpload>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <el-row>
  153. <el-col :span="24">
  154. <el-form-item label="项目备注:">
  155. <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="form.description"></el-input>
  156. </el-form-item>
  157. </el-col>
  158. </el-row>
  159. </el-form>
  160. <span slot="footer" class="dialog-footer">
  161. <el-button @click="handleClose">取 消</el-button>
  162. <el-button type="primary" @click="submit">确 定</el-button>
  163. </span>
  164. </el-dialog>
  165. <choosePerson ref="choosePerson" @getPersonIds="getPersonIds"></choosePerson>
  166. </div>
  167. </template>
  168. <script>
  169. import choosePerson from '@/views/components/dialog/person.vue'
  170. export default {
  171. components: {
  172. choosePerson,
  173. },
  174. props: {},
  175. data() {
  176. return {
  177. dialogVisible: false,
  178. title: '',
  179. form: {
  180. matterIds: [],
  181. systemFileList: [],
  182. fileGuids: [],
  183. },
  184. rules: {
  185. name: [{ required: true, message: '请输入项目名称', trigger: 'blur' },],
  186. },
  187. options: [],//负责人数组
  188. value: '',//负责人
  189. //人员列表懒加载
  190. personnelList: {
  191. queryParams: {
  192. current: 1,
  193. size: 10
  194. },
  195. data: []
  196. },
  197. // 研发编号列表懒加载
  198. rdNumberArr: {
  199. queryParams: {
  200. current: 1,
  201. size: 10,
  202. },
  203. eventInput: '',
  204. data: []
  205. },
  206. //事件列表
  207. eventList: {
  208. queryParams: {
  209. current: 1,
  210. size: 10
  211. },
  212. data: []
  213. },
  214. // 控制调查类型是否显示
  215. show: false,
  216. //调查类型列表
  217. dictAssociates: [],
  218. };
  219. },
  220. watch: {},
  221. computed: {},
  222. created() { },
  223. mounted() {
  224. // 获取人员列表
  225. this.getPermissionPersonnel();
  226. },
  227. methods: {
  228. //打开事件弹窗
  229. addEvent() {
  230. },
  231. //懒加载事件
  232. loadEvent() {
  233. if (this.eventList.queryParams.current * this.eventList.queryParams.size >= this.eventList.queryParams.total) {
  234. return false
  235. }
  236. this.eventList.queryParams.current += 1
  237. this.getEventList()
  238. },
  239. //远程搜索
  240. remoteEvent(query) {
  241. this.eventList.data = []
  242. this.eventList.queryParams.current = 1
  243. this.eventList.name = query
  244. this.getEventList()
  245. },
  246. //获取事件列表
  247. async getEventList(type) {
  248. this.eventList.loading = true;
  249. let params = {
  250. ...this.eventList.queryParams,//分页信息
  251. searchQuery: this.eventList.name ? `name=${this.eventList.name}` : '',//检索条件
  252. orderDTOList: [{ orderBy: "createTime", orderType: 1 },]//排序
  253. }
  254. await this.$api.queryEvent(params).then(response => {
  255. if (response.code == 200) {
  256. this.eventList.loading = false;
  257. if (!type) {
  258. if (this.form.eventId) {
  259. var index = response.data.data.findIndex(item => {
  260. return item.id == this.form.eventId
  261. })
  262. if (index != -1) {
  263. response.data.data.splice(index, 1)
  264. }
  265. }
  266. this.eventList.queryParams.total = response.data.total
  267. }
  268. this.eventList.data.push(...response.data.data)
  269. // this.eventList.queryParams.total = response.data.total
  270. }
  271. })
  272. },
  273. //切换事件
  274. async changeEvent(val) {
  275. if (!val) {
  276. this.form.scenarioIds = []
  277. this.show = false
  278. this.form.matterIds = []
  279. return
  280. }
  281. var obj = this.eventList.data.find(item => {
  282. return item.id == val
  283. })
  284. if (obj) {
  285. this.form.scenarioIds = [obj.scenarioId]
  286. this.show = true
  287. await this.onChange()
  288. }
  289. },
  290. //调查类型选择切换
  291. async onChange() {
  292. if (this.form.scenarioIds.length != 0) {
  293. await this.$api.getMatter(this.form.scenarioIds).then(response => {
  294. this.show = true
  295. this.dictAssociates = response.data.data
  296. })
  297. } else {
  298. this.show = false
  299. }
  300. },
  301. // 打开参与人 人员弹窗
  302. showDialog() {
  303. this.$refs.choosePerson.open(this.form.adminIds, this.form.adminPersons)
  304. },
  305. //获取参与人员信息
  306. getPersonIds({ personIds, persons }) {
  307. if (personIds.length > 0) {
  308. // adminPersons存储返回的人员id数组
  309. this.$set(this.form, 'adminPersons', persons)
  310. this.$set(this.form, 'adminIds', personIds)
  311. } else {
  312. this.$set(this.form, 'adminPersons', [])
  313. this.$set(this.form, 'adminIds', [])
  314. }
  315. },
  316. // 处理参与人数据
  317. getNames(row) {
  318. if (!row) {
  319. return ''
  320. }
  321. var arr = row.map(item => {
  322. return item.name
  323. })
  324. return arr.join('、')
  325. },
  326. // 研发编号懒加载方法
  327. load() {
  328. if (this.rdNumberArr.queryParams.current * this.rdNumberArr.queryParams.size >= this.rdNumberArr.queryParams.total) {
  329. return false
  330. }
  331. this.rdNumberArr.queryParams.current++
  332. this.getRdProjectByNumber()
  333. },
  334. // 查询研发编号
  335. async getRdProjectByNumber() {
  336. let searchValue = { name: this.rdNumberArr.eventInput }
  337. let params = {
  338. ...this.rdNumberArr.queryParams,//分页信息
  339. searchQuery: this.$commonJS.objectToString(searchValue)//输入的建议
  340. }
  341. await this.$api.getRdProjectByNumber(params).then(res => {
  342. if (res.code == 200) {
  343. this.rdNumberArr.data.push(...res.data.data)
  344. this.rdNumberArr.queryParams.total = res.data.total
  345. this.rdNumberArr.cb(this.rdNumberArr.data);
  346. }
  347. })
  348. },
  349. //获取下拉建议研发编号数据
  350. async querySearchQuestion(queryString, cb) {
  351. this.rdNumberArr.queryParams.current = 1
  352. this.rdNumberArr.eventInput = queryString
  353. this.rdNumberArr.data = []
  354. this.rdNumberArr.cb = cb
  355. await this.getRdProjectByNumber()
  356. },
  357. // 人员列表远程搜索
  358. remoteMethodPerson(query) {
  359. this.personnelList.data = []
  360. this.personnelList.queryParams.current = 1
  361. this.personnelList.queryParams.name = query
  362. this.getPermissionPersonnel()
  363. },
  364. // 获取所有人员列表懒加载
  365. lazyLoadingPerson() {
  366. if (this.personnelList.queryParams.current * this.personnelList.queryParams.size >= this.personnelList.queryParams.total) {
  367. return false
  368. }
  369. this.personnelList.queryParams.current += 1
  370. this.getPermissionPersonnel()
  371. },
  372. //获取所有人员列表(修改不要一次性获取,可以使用懒加载加远程搜索 )
  373. async getPermissionPersonnel(type) {
  374. this.personnelList.loading = true;
  375. await this.$api.getPermissionPersonnel(this.personnelList.queryParams).then((response) => {
  376. if (response.code == 200) {
  377. this.personnelList.loading = false;
  378. if (!type) {
  379. if (this.form.headId) {
  380. var index = response.data.findIndex(item => {
  381. return item.id == this.form.headId
  382. })
  383. if (index != -1) {
  384. response.data.splice(index, 1)
  385. }
  386. }
  387. this.personnelList.queryParams.total = response.pageColumn.total
  388. }
  389. this.personnelList.data.push(...response.data)
  390. // this.personnelList.queryParams.total = response.pageColumn.total
  391. }
  392. })
  393. },
  394. // 上传的文件监听
  395. onchangeFile(file, fileList) {
  396. if (file.guid) {
  397. let index = this.form.systemFileList.findIndex(item => {
  398. return item.uid == file.uid
  399. })
  400. if (index != -1) {
  401. this.form.systemFileList.splice(index, 1, file)
  402. this.form.fileGuids.push(file.guid)
  403. }
  404. } else {
  405. this.form.systemFileList.push(file.raw)
  406. }
  407. },
  408. // 删除上传的文件
  409. onRemove(file, fileList) {
  410. if (file.guid) {
  411. let index = this.form.systemFileList.findIndex(item => {
  412. return item.guid == file.guid
  413. })
  414. if (index!=-1) {
  415. this.form.systemFileList.splice(index, 1)
  416. }
  417. let index2 = this.form.fileGuids.findIndex(item => {
  418. return item == file.guid
  419. })
  420. if (index2 != -1) {
  421. this.form.fileGuids.splice(index2, 1)
  422. }
  423. } else {
  424. let index3 = this.form.systemFileList.findIndex(item => {
  425. return item.uid == file.uid
  426. })
  427. if (index3 != -1) {
  428. this.form.fileGuids.splice(index3, 1)
  429. }
  430. }
  431. },
  432. //打开弹窗
  433. async open(form) {
  434. if (form && form.id) {
  435. this.form = JSON.parse(JSON.stringify(form))
  436. // 事件
  437. if (this.form.eventIds && this.form.eventIds.length > 0) {
  438. this.form.eventId = this.form.eventIds[0]
  439. this.onChange()
  440. this.eventList.queryParams.id = this.form.eventId[0]
  441. await this.getEventList(1)
  442. this.eventList.queryParams.id = null
  443. this.show = true
  444. } else {
  445. this.show = false
  446. }
  447. // 文件
  448. if (this.form.systemFileList && this.form.systemFileList.length > 0) {
  449. this.$set(this.form, 'fileGuids', [])
  450. this.form.systemFileList.forEach(item => {
  451. this.form.fileGuids.push(item.guid)
  452. })
  453. }
  454. // 负责人
  455. if (this.form.headId) {
  456. this.personnelList.queryParams.id = this.form.headId
  457. await this.getPermissionPersonnel(1)
  458. this.personnelList.queryParams.id = null
  459. }
  460. // 参与人
  461. if (this.form.involvedPersons && this.form.involvedPersons.length) {
  462. this.form.adminPersons = []
  463. this.form.adminIds = []
  464. this.form.involvedPersons.forEach(item => {
  465. let a = {
  466. id: item.personId,
  467. name: item.personName
  468. }
  469. this.form.adminPersons.push(a)
  470. this.form.adminIds.push(a.id)
  471. })
  472. }
  473. this.title = '编辑专利挖掘项目'
  474. } else {
  475. this.title = '新增专利挖掘项目'
  476. }
  477. this.getPermissionPersonnel()
  478. this.getEventList()
  479. this.dialogVisible = true
  480. },
  481. //关闭弹窗
  482. handleClose() {
  483. // this.$refs.upload.clearFiles()
  484. this.$refs.form.resetFields()
  485. this.form = {
  486. matterIds: [],
  487. systemFileList: [],
  488. fileGuids: [],
  489. }
  490. this.dialogVisible = false
  491. },
  492. //提交数据
  493. submit() {
  494. this.$refs.form.validate((valid) => {
  495. if (valid) {
  496. // 判断文件是否全部上传完毕
  497. if ((this.form.fileGuids && this.form.fileGuids.length) != (this.form.systemFileList && this.form.systemFileList.length)) {
  498. this.$message.error('您有文件未上传完毕,请您稍等片刻~~~')
  499. return false
  500. }
  501. if (this.form.scenarioIds && this.form.scenarioIds.length>0) {
  502. var scenarioIds = JSON.parse(JSON.stringify(this.form.scenarioIds))
  503. }
  504. if (this.form.eventId) {
  505. this.form.events = []
  506. this.form.scenarioIds = []
  507. this.form.matterIds.forEach(item => {
  508. this.form.events.push(
  509. {
  510. matterId: item,
  511. scenarioId: scenarioIds[0],
  512. eventId: this.form.eventId
  513. }
  514. )
  515. })
  516. }
  517. if (this.form.adminIds && this.form.adminIds.length > 0) {
  518. this.form.involvedPersonIds = this.form.adminIds
  519. }
  520. if (!this.form.id) {//新增
  521. if (this.form.examine) {//审核任务
  522. } else {//不审核直接创建项目
  523. this.$api.addPatentDigProject(this.form).then(res => {
  524. if (res.code == 200) {
  525. this.$message.success('新增专利挖掘项目成功')
  526. this.$emit('isSuccess', true)
  527. this.handleClose()
  528. }
  529. })
  530. }
  531. } else {//编辑
  532. this.$api.updatePatentDigProject(this.form).then(res => {
  533. if (res.code == 200) {
  534. this.$message.success('更新专利挖掘项目成功')
  535. this.$emit('isSuccess', true)
  536. this.handleClose()
  537. }
  538. })
  539. }
  540. } else {
  541. this.$message.error('信息未输入完整')
  542. }
  543. });
  544. },
  545. // 审核任务
  546. examine(data) {
  547. let params = {
  548. }
  549. this.$api.task(params).then(res => {
  550. if (res.code == 200) {
  551. }
  552. })
  553. },
  554. },
  555. // 组件销毁函数
  556. destroyed() {
  557. // 清空事件相关
  558. this.form.eventIds = []
  559. this.eventList.queryParams.current=1
  560. // 清空负责人相关
  561. this.form.involvedPersons = []
  562. this.form.adminIds = []
  563. this.form.adminPersons = []
  564. this.personnelList.data = []
  565. this.personnelList.queryParams.current=1
  566. },
  567. };
  568. </script>
  569. <style lang="scss" scoped></style>