project_gantt.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. <template>
  2. <div class="container">
  3. <div class="gantt_head">
  4. <div class="head_RorX">
  5. <div class="filter-lefts">
  6. <el-radio-group v-model="radio1" @change="selChange()" size="small">
  7. <el-radio-button :label="$t('an-ren-yuan-cha-kan')" value="renyuan"></el-radio-button>
  8. <el-radio-button :label="$t('an-xiang-mu-cha-kan')" value="xiangmu"></el-radio-button>
  9. <el-radio-button :label="$t('zi-yuan-xu-qiu')" value="demand"></el-radio-button>
  10. </el-radio-group>
  11. <!-- <el-checkbox v-if="radio1 != $t('zi-yuan-xu-qiu') && user.companyId == 876" v-model="justWaitForMe" style="margin-left: 14px;" @change="selChange()">待我审核</el-checkbox> -->
  12. </div>
  13. </div>
  14. <!-- 时间段筛选 -->
  15. <div class="head_date" v-if="isDataLoaded">
  16. <span>{{ $t('message.period') }}</span>
  17. <el-date-picker
  18. style="margin-left:9px;width:15vw"
  19. size="small"
  20. v-model="valueDate"
  21. type="daterange"
  22. :range-separator="$t('other.to')"
  23. :start-placeholder="$t('time.startDate')"
  24. :end-placeholder="$t('time.endDate')"
  25. value-format="yyyy-MM-dd"
  26. @change="dateupdata()">
  27. </el-date-picker>
  28. </div>
  29. <!-- 任务类型筛选 -->
  30. <div v-if="radio1 == $t('an-xiang-mu-cha-kan')" class="head_taskType">
  31. <span>{{ $t('ren-wu-lei-xing') }}</span>
  32. <el-select clearable filterable v-model="taskType" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="taskTypeSel()">
  33. <el-option :label="$t('other.task')" :value="0"></el-option>
  34. <el-option :label="$t('other.milestone')" :value="1"></el-option>
  35. </el-select>
  36. </div>
  37. <!-- 任务分组筛选 -->
  38. <div v-if="reqpar1" class="head_taskgroup">
  39. <span>{{ $t('other.taskGroup') }}</span>
  40. <el-select clearable filterable v-model="valuex2" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="taskgroupSel()">
  41. <el-option
  42. v-for="item in taskgroupList"
  43. :key="item.name"
  44. :label="item.name"
  45. :value="item.name"
  46. >
  47. </el-option>
  48. </el-select>
  49. </div>
  50. <!-- 人员/项目筛选 -->
  51. <div class="head_select">
  52. <span>{{(this.radio1 == $t('an-ren-yuan-cha-kan') ? $t('ren-yuan') : $t('other.project'))}}</span>
  53. <el-select v-if="reqpar1" clearable filterable v-model="valuex" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="optupdata()">
  54. <el-option v-for="item in screenList" :key="item.id" :label="item.projectName" :value="item.id">
  55. <span v-if="reqpar1" style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
  56. <span v-if="reqpar1" style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
  57. </el-option>
  58. </el-select>
  59. <el-select v-if="!reqpar1 && user.userNameNeedTranslate != '1'" clearable filterable v-model="valuex" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="optupdata()">
  60. <el-option v-for="item in screenList" :key="item.id" :label="item.name" :value="item.id">
  61. </el-option>
  62. </el-select>
  63. <selectCat v-if="!reqpar1 && user.userNameNeedTranslate == '1'" style="margin-left:9px;" :size="'small'" :widthStr="'153'" :subject="screenList" :subjectId="valuex" :distinction="'1'" @selectCal="selectCal"></selectCat>
  64. </div>
  65. <!-- 资源需求导入/导出 -->
  66. <div class="head_files" v-if="!isDataLoaded">
  67. <div style="margin-left:10px;float:left;">
  68. <el-link type="primary" :underline="false" :href="'./upload/'+$t('zi-yuan-xu-qiu-dao-ru-mo-ban')+'.xlsx'" download="资源需求导入模板.xlsx">{{ $t('Downloadthetemplate') }}</el-link>
  69. </div>
  70. <el-upload ref="upload" style="margin-left:10px;float:left;" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
  71. <el-link type="primary" :underline="false" >{{ $t('dao-ru-xu-qiu') }}</el-link>
  72. </el-upload>
  73. <div style="margin-left:10px;float:left;">
  74. <el-link type="primary" :underline="false" @click="exportProjectData" download="资源需求导出.xlsx">{{ $t('dao-chu-xu-qiu') }}</el-link>
  75. </div>
  76. </div>
  77. </div>
  78. <gantt v-if="isDataLoaded && user.userNameNeedTranslate != 1" ref="ganttTable1" class="left-container" :tasks="tasks"
  79. :stafforpro="radio1"
  80. :valueDate="valueDate"
  81. :key="updatakey1" @closeBounced="closeBounced"></gantt>
  82. <vueGantt v-if="isDataLoaded && user.userNameNeedTranslate == 1" ref="ganttTable1" :stafforpro="radio1"
  83. :valueDate="valueDate"
  84. :key="updatakey1" :tasks="tasks"></vueGantt>
  85. <div class="demand-container" v-if="!isDataLoaded">
  86. <el-table height="75vh" :loading="demandListLoading" :data="demandList">
  87. <el-table-column :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" prop="projectCode" width="160"></el-table-column>
  88. <el-table-column :label="$t('headerTop.projectName')" prop="projectName" min-width="240"></el-table-column>
  89. <el-table-column :label="$t('jin-qi-ri-huo-yue-ren-yuan')" prop="activeUsers" min-width="240">
  90. <template slot-scope="scope">
  91. <div>
  92. <span v-if="user.userNameNeedTranslate == 1">
  93. <span v-for="(item, index) in scope.row.activeUsers" :key="index">
  94. <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
  95. <span v-if="index < scope.row.activeUsers.length - 1">,</span>
  96. </span>
  97. </span>
  98. <span v-if="user.userNameNeedTranslate != 1">
  99. {{scope.row.activeUsers}}
  100. </span>
  101. </div>
  102. </template>
  103. </el-table-column>
  104. <el-table-column :label="$t('starttimes') +' - '+ $t('time.endTime')" min-width="240">
  105. <template slot-scope="scope">
  106. <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
  107. </template>
  108. </el-table-column>
  109. <el-table-column :label="$t('he-tong-yao-qiu')" prop="contractReq" min-width="240" show-overflow-tooltip></el-table-column>
  110. <el-table-column :label="$t('li-cheng-bei-jin-du')" prop="milepost" min-width="280">
  111. <template slot-scope="scope">
  112. <span>{{scope.row.milepost ? scope.row.milepost.name + '\u3000'+$t('wan-cheng-shi-jian')+':' + scope.row.milepost.finishDate : ''}}</span>
  113. </template>
  114. </el-table-column>
  115. <el-table-column :label="$t('ren-yuan-xu-qiu')" prop="membReq" min-width="280"></el-table-column>
  116. <el-table-column :label="$t('ren-wu-xu-qiu')" prop="taskReq" min-width="280"></el-table-column>
  117. <el-table-column :label="$t('can-yu-bu-men-jin-du')" prop="departmentSpeed" min-width="280"></el-table-column>
  118. <el-table-column :label="$t('operation')" width="120" align="center" fixed="right">
  119. <template slot-scope="scope">
  120. <el-button @click="demandEdit(scope.row)" size="small">{{ $t('xiu-gai') }}</el-button>
  121. </template>
  122. </el-table-column>
  123. </el-table>
  124. <div class="poss">
  125. <el-pagination
  126. @size-change="handleSizeChange"
  127. @current-change="handleCurrentChange"
  128. :current-page="pageIndex"
  129. :page-sizes="[20, 50, 100, 200]"
  130. :page-size="20"
  131. layout="total, sizes, prev, pager, next"
  132. :total="total">
  133. </el-pagination>
  134. </div>
  135. <!-- 资源需求修改 -->
  136. <el-dialog v-if="demandEditDialog" width="500px" append-to-body :visible.sync="demandEditDialog" :title="$t('xiu-gai') +' - ' + editParameter.projectName">
  137. <el-form label-width="150">
  138. <el-form-item :label="$t('starttimes')">
  139. <el-date-picker
  140. style="width:350px"
  141. v-model="editDate1"
  142. type="date"
  143. :placeholder="$t('defaultText.pleaseChoose')"
  144. value-format="yyyy-MM-dd"></el-date-picker>
  145. </el-form-item>
  146. <el-form-item :label="$t('time.endTime')">
  147. <el-date-picker
  148. style="width:350px"
  149. v-model="editDate2"
  150. type="date"
  151. :placeholder="$t('defaultText.pleaseChoose')"
  152. value-format="yyyy-MM-dd"></el-date-picker>
  153. </el-form-item>
  154. <el-form-item :label="$t('ren-yuan-xu-qiu')">
  155. <el-input style="width:350px" v-model="editParameter.membReq" clearable></el-input>
  156. </el-form-item>
  157. <el-form-item :label="$t('ren-wu-xu-qiu')">
  158. <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
  159. </el-form-item>
  160. <el-form-item :label="$t('he-tong-yao-qiu')">
  161. <el-input style="width:350px" v-model="editParameter.contractReq" clearable></el-input>
  162. </el-form-item>
  163. <el-form-item :label="$t('bu-men-jin-du')">
  164. <el-input style="width:350px" v-model="editParameter.departmentSpeed" clearable></el-input>
  165. </el-form-item>
  166. </el-form>
  167. <div slot="footer" class="dialog-footer">
  168. <el-button type="default" @click="demandEditDialog = false">{{ $t('btn.cancel') }}</el-button>
  169. <el-button type="primary" @click="demandEditSure" >{{ $t('btn.determine') }}</el-button>
  170. </div>
  171. </el-dialog>
  172. </div>
  173. </div>
  174. </template>
  175. <script>
  176. import { error } from 'dingtalk-jsapi';
  177. import Gantt from './gantt.vue';
  178. import vueGantt from './vueGantt.vue'
  179. // 自定义select组件
  180. import SelectCat from "@/components/select.vue"
  181. export default {
  182. name: 'project_gantt',
  183. props: {},
  184. components: {Gantt, vueGantt, SelectCat},
  185. data() {
  186. return {
  187. taskType: '',
  188. isDataLoaded:false,
  189. tasks: {
  190. data : [],
  191. links: []
  192. },
  193. tasks1: {links:[]},
  194. updatakey1: 1,
  195. updatakey2: -1,
  196. radio1:this.$t('an-ren-yuan-cha-kan'),
  197. valueDate:[],
  198. options:[{value:this.$t('xuan-xiang-1'),label:this.$t('all')},{value:this.$t('xuan-xiang-2'),label:this.$t('ren-yuan')+"1"}],
  199. valuex:'',
  200. screenList:[],
  201. // 请求参数
  202. reqpar1:0,
  203. reqpar2:[],
  204. demandListLoading: false,
  205. demandList: [],
  206. pageIndex: 1,
  207. pageSize: 20,
  208. demandEditDialog: false,
  209. editParameter: {},
  210. editDate1: '',
  211. editDate2: '',
  212. taskgroupList: [],
  213. valuex2: '',
  214. user: JSON.parse(sessionStorage.getItem("user")),
  215. justWaitForMe: false
  216. };
  217. },
  218. computed: {},
  219. watch: {},
  220. created() {},
  221. mounted() {
  222. let nowdate = new Date()
  223. let nowmonth = nowdate.getMonth() + 1
  224. let startdate = nowdate.getFullYear() + "-" + (nowmonth < 10 ? "0" + nowmonth : nowmonth) + "-" + (nowdate.getDate() < 10 ? "0" + nowdate.getDate() : nowdate.getDate())
  225. let udate = new Date(nowdate.getFullYear(),nowdate.getMonth(),nowdate.getDate() + 31)
  226. let endmonth = udate.getMonth() + 1
  227. let enddate = udate.getFullYear() + "-" + (endmonth < 10 ? "0" + endmonth : endmonth) + "-" + (udate.getDate() < 10 ? "0" + udate.getDate() : udate.getDate())
  228. this.valueDate = [startdate,enddate]
  229. this.valueDate2 = this.valueDate
  230. this.reqpar2 = this.valueDate
  231. // console.log("date",this.valueDate);
  232. this.getList();
  233. this.getScreen()
  234. // this.tasks1 = this.tasks
  235. this.isDataLoaded = true
  236. },
  237. methods: {
  238. parentLevelOpensPopUpWindowGantt(row) {
  239. setTimeout(() => {
  240. this.$refs.ganttTable1.detaliTaskExposure(row);
  241. }, 1000)
  242. },
  243. closeBounced(obj) {
  244. if(obj.submitInsert) {
  245. this.dateupdata()
  246. }
  247. },
  248. selectCal(obj) {
  249. if(obj.distinction == '1') {
  250. this.valuex = obj.id
  251. this.optupdata()
  252. }
  253. },
  254. setGroup() {
  255. this.$refs.ganttTable1.setGroup();
  256. // this.$refs.ganttTable2.setGroup();
  257. },
  258. taskTypeSel(){
  259. console.log(this.taskType);
  260. this.getList()
  261. },
  262. // 资源需求导出
  263. exportProjectData() {
  264. let parameter = {}
  265. if(this.valuex){
  266. parameter.projectId = this.valuex
  267. }
  268. if(this.valuex2){
  269. parameter.groupName = this.valuex2
  270. }
  271. this.http.post('/project-requirement/exportData',parameter,
  272. res => {
  273. if (res.code == "ok") {
  274. let filePath = res.data;
  275. const a = document.createElement('a'); // 创建a标签
  276. a.setAttribute('download', this.$t('zi-yuan-xu-qiu-dao-chu')+'.xlsx');// download属性
  277. a.setAttribute('href', filePath);// href链接
  278. a.click(); //自执行点击事件
  279. a.remove();
  280. }
  281. },
  282. error => {
  283. this.$message({
  284. message: error,
  285. type: "error"
  286. });
  287. }
  288. );
  289. },
  290. // 资源需求导入
  291. importProject(item) {
  292. //首先判断文件类型
  293. let str = item.file.name.split(".");
  294. let format = str[str.length - 1];
  295. if (format != "xls" && format != "xlsx") {
  296. this.$message({
  297. message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
  298. type: "error"
  299. });
  300. } else {
  301. let formData = new FormData();
  302. formData.append("multipartFile", item.file);
  303. this.http.uploadFile('/project-requirement/importData', formData,
  304. res => {
  305. this.$refs.upload.clearFiles();
  306. if (res.code == "ok") {
  307. this.$message({
  308. message: this.$t('other.importSuccess'),
  309. type: "success"
  310. });
  311. this.getDemandList();
  312. } else {
  313. this.$message({
  314. message: res.msg,
  315. type: "error"
  316. });
  317. }
  318. },
  319. error => {
  320. this.$refs.upload.clearFiles();
  321. this.$message({
  322. message: error,
  323. type: "error"
  324. });
  325. });
  326. }
  327. },
  328. // 人员/项目切换
  329. selChange(){
  330. this.valuex = null
  331. // console.log("切换按钮",this.radio1);
  332. if (this.radio1 == this.$t('an-ren-yuan-cha-kan')) {
  333. this.isDataLoaded = true
  334. this.reqpar1 = 0
  335. this.getList()
  336. this.getScreen()
  337. }else if(this.radio1 == this.$t('an-xiang-mu-cha-kan')){
  338. this.isDataLoaded = true
  339. this.reqpar1 = 1
  340. this.getList()
  341. this.getXmScreen()
  342. this.getTaskgroupList()
  343. }else {
  344. this.reqpar1 = 1
  345. this.isDataLoaded = false
  346. this.pageIndex = 1
  347. this.pageSize = 20
  348. this.valuex = ''
  349. this.valuex2 = ''
  350. this.getDemandList()
  351. this.getXmScreen()
  352. this.getTaskgroupList()
  353. }
  354. },
  355. // 时间段改变
  356. dateupdata(){
  357. this.reqpar2 = this.valueDate
  358. if(this.isDataLoaded){
  359. this.getList()
  360. }else {
  361. this.getDemandList()
  362. }
  363. },
  364. // 人员/项目筛选改变
  365. optupdata(){
  366. // console.log(this.valuex);
  367. if(this.isDataLoaded){
  368. this.getList()
  369. }else{
  370. this.getDemandList()
  371. }
  372. },
  373. // 任务分组筛选改变
  374. taskgroupSel(){
  375. // console.log(this.valuex2);
  376. if(this.isDataLoaded){
  377. this.getList()
  378. }else{
  379. this.getDemandList()
  380. }
  381. },
  382. handleSizeChange(val){
  383. this.pageSize = val
  384. this.pageIndex = 1
  385. this.getDemandList()
  386. },
  387. handleCurrentChange(val){
  388. this.pageIndex = val
  389. this.getDemandList()
  390. },
  391. // 资源需求修改
  392. demandEdit(row){
  393. console.log(row);
  394. this.demandEditDialog = true
  395. this.editParameter = JSON.parse(JSON.stringify(row))
  396. this.editDate1 = this.editParameter.startDate
  397. this.editDate2 = this.editParameter.endDate
  398. // console.log('edit',this.demandEditDialog);
  399. },
  400. demandEditSure(){
  401. this.editParameter.startDate = this.editDate1
  402. this.editParameter.endDate = this.editDate2
  403. delete this.editParameter.reStartDate
  404. delete this.editParameter.reEndDate
  405. delete this.editParameter.milepost
  406. this.http.post('/project-requirement/addOrMod',this.editParameter,
  407. res => {
  408. if(res.code == 'ok'){
  409. this.$message({
  410. message: this.$t('message.modifyTheSuccess'),
  411. type: 'success'
  412. })
  413. this.demandEditDialog = false
  414. this.getDemandList()
  415. }else {
  416. this.$message({
  417. message: res.msg,
  418. type: 'error'
  419. })
  420. }
  421. },err => {
  422. this.$message({
  423. message: err,
  424. type: 'error'
  425. })
  426. })
  427. },
  428. // 获取人员项目筛选列表
  429. getScreen(){
  430. this.http.get('/project/getMyUsers',
  431. res => {
  432. if (res.code == "ok") {
  433. this.screenList = res.data
  434. }else{
  435. this.$message({
  436. message: res.msg,
  437. type: "error"
  438. });
  439. }
  440. },
  441. error => {
  442. this.$message({
  443. message : error,
  444. type : "error"
  445. })
  446. }
  447. )
  448. },
  449. getXmScreen(){
  450. this.http.get('/project/getProjectList',
  451. res => {
  452. if (res.code == "ok") {
  453. this.screenList = res.data
  454. // console.log("screen",this.screenList);
  455. }else{
  456. this.$message({
  457. message: res.msg,
  458. type: "error"
  459. });
  460. }
  461. },
  462. error => {
  463. this.$message({
  464. message : error,
  465. type : "error"
  466. })
  467. }
  468. )
  469. },
  470. // 获取任务分组筛选列表
  471. getTaskgroupList(){
  472. this.http.post('/task-group/getGroupNames',{},
  473. res => {
  474. if(res.code == 'ok'){
  475. this.taskgroupList = res.data
  476. }else {
  477. this.$message({
  478. message: res.msg,
  479. type: 'error'
  480. })
  481. }
  482. },err => {
  483. this.$message({
  484. message: err,
  485. type: 'error'
  486. })
  487. })
  488. },
  489. // 获取甘特图数据
  490. getList() {
  491. let getlistcs = {type : this.reqpar1 , startDate : this.reqpar2[0] , endDate : this.reqpar2[1]}
  492. if(this.reqpar1) {
  493. if(this.valuex != ''){
  494. getlistcs.projectId = this.valuex
  495. }
  496. if(this.valuex2 != ''){
  497. getlistcs.groupName = this.valuex2
  498. }
  499. getlistcs.taskType = this.taskType
  500. }else {
  501. if(this.valuex != ''){
  502. getlistcs.userId = this.valuex
  503. }
  504. }
  505. if(this.justWaitForMe) {
  506. getlistcs.justWaitForMe = 1
  507. }
  508. var urls = ''
  509. if(this.user.userNameNeedTranslate == '1') {
  510. urls = '/project/getGanttDataNew'
  511. } else {
  512. urls = '/project/getGanttData'
  513. }
  514. this.http.post(urls, getlistcs,
  515. // this.http.post('/project/getGanttDataNew', getlistcs,
  516. res => {
  517. if (res.code == "ok") {
  518. for(var i in res.data) {
  519. if(res.data[i].id.indexOf(this.$t('chu-cha')) != '-1') {
  520. res.data[i].color = '#E6A23C'
  521. }
  522. if(res.data[i].id.indexOf(this.$t('other.AskForLeave')) != '-1') {
  523. res.data[i].color = '#F56C6C'
  524. }
  525. }
  526. this.tasks = {data:res.data};
  527. if(this.user.userNameNeedTranslate != '1') {
  528. let taskson = []
  529. for(let m in this.tasks.data){
  530. this.tasks.data[m].render = null
  531. if(this.tasks.data[m].time != 0){
  532. if(this.tasks.data[m].id != this.tasks.data[m].userId){
  533. this.tasks.data[m].render = 'split'
  534. let item = JSON.parse(JSON.stringify(this.tasks.data[m]))
  535. item.parent = this.tasks.data[m].id
  536. item.id = this.tasks.data[m].id + 'son'
  537. taskson.push(item)
  538. this.tasks.data[m].time = 0
  539. }
  540. }
  541. }
  542. this.tasks.data.push.apply(this.tasks.data,taskson)
  543. for(let i in this.tasks.data){
  544. if(this.tasks.data[i].time == 0){
  545. delete this.tasks.data[i].start_date
  546. delete this.tasks.data[i].end_date
  547. this.tasks.data[i].type = 'milestone'
  548. }
  549. if(this.tasks.data[i].end_date){
  550. let date = new Date(this.tasks.data[i].end_date)
  551. let date2 = new Date(date.getFullYear(),date.getMonth(),date.getDate() + 1)
  552. let dmonth = date2.getMonth() + 1
  553. let dday = date2.getDate()
  554. this.tasks.data[i].end_date = date2.getFullYear() + '-' + (dmonth < 10 ? '0' + dmonth : dmonth) + '-' + (dday < 10 ? '0' + dday : dday)
  555. }
  556. }
  557. }
  558. console.log('ganttData',this.tasks.data);
  559. this.$nextTick(()=>{
  560. this.updatakey1 += 1
  561. })
  562. } else {
  563. this.$message({
  564. message: res.msg,
  565. type: "error"
  566. });
  567. }
  568. },
  569. error => {
  570. this.$message({
  571. message: error,
  572. type: "error"
  573. });
  574. }
  575. );
  576. },
  577. // 获取资源需求列表
  578. getDemandList(){
  579. let parameter = {
  580. pageIndex: this.pageIndex,
  581. pageSize: this.pageSize,
  582. }
  583. if(this.valuex != ''){
  584. parameter.projectId = this.valuex
  585. }
  586. if(this.valuex2 != ''){
  587. parameter.groupName = this.valuex2
  588. }
  589. this.demandListLoading = true
  590. this.http.post('/project-requirement/listByPage',parameter,
  591. res => {
  592. if(res.code == 'ok'){
  593. this.demandListLoading = false
  594. this.total = res.data.total
  595. if(this.user.userNameNeedTranslate == 1) {
  596. for(let i in res.data.records) {
  597. if(res.data.records[i].activeUsers){
  598. res.data.records[i].activeUsers = res.data.records[i].activeUsers.split(',')
  599. }
  600. }
  601. }
  602. this.demandList = res.data.records
  603. }else {
  604. this.demandListLoading = false
  605. this.$message({
  606. message: res.msg,
  607. type: 'error'
  608. })
  609. }
  610. },err => {
  611. this.demandListLoading = false
  612. this.$message({
  613. message: err,
  614. type: 'error'
  615. })
  616. })
  617. },
  618. },
  619. };
  620. </script>
  621. <style scoped lang="scss">
  622. .container {
  623. height: 100%;
  624. width: 100%;
  625. }
  626. .filter-lefts {
  627. display: flex;
  628. align-items: center;
  629. }
  630. .left-container {
  631. overflow: hidden;
  632. position: relative;
  633. height: 80vh;
  634. }
  635. .demand-container{
  636. overflow: hidden;
  637. position: relative;
  638. height: 92%;
  639. }
  640. .gantt_head{
  641. width: 100%;
  642. height: 80px;
  643. display: flex;
  644. justify-content: space-between;
  645. align-items: center;
  646. }
  647. .gantt_head .head_RorX{
  648. width: 380px;
  649. }
  650. .gantt_head .head_date{
  651. width: 22vw;
  652. }
  653. .gantt_head .head_taskgroup{
  654. width: 15vw;
  655. }
  656. .gantt_head .head_taskType{
  657. width: 15vw;
  658. }
  659. .gantt_head .head_select{
  660. width: 15vw;
  661. }
  662. .gantt_head .head_files{
  663. width: 17vw;
  664. }
  665. .poss {
  666. height: 8%;
  667. float: right;
  668. padding-top: 5px;
  669. }
  670. </style>