progressRate.vue 6.48 KB
<template>
  <div>
    <div class="table-page-search-wrapper">
      <a-form layout="inline">
        <a-row :gutter="10">
          <a-col :md="6" :sm="24">
            <a-form-item label="项目名称">
              <a-select show-search
                        placeholder="请输入项目名称"
                        option-filter-prop="children"
                        :filter-option="filterOption"
                        @change="handleChange"
                        v-model="queryParam.projectName">
                <a-select-option v-for="item in projectNameList" :key="item" :value="item">{{ item }}</a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
        </a-row>
      </a-form>
    </div>

    <gantt-elastic
      :options="options"
      :tasks="tasks"
      @tasks-changed="tasksUpdate"
      @options-changed="optionsUpdate"
      @dynamic-style-changed="styleUpdate"
      :dynamic-style="dynamicStyle"
    >
      <gantt-header slot="header" :options="options"></gantt-header>
    </gantt-elastic>
    <div class="q-mt-md" />
  </div>

</template>

<script>
import GanttElastic from 'gantt-elastic'
import GanttHeader from 'gantt-elastic-header'
import moment from 'moment'
import { projectName, queryTask } from '../../api/schedulerApi'
import dayjs from 'dayjs'

function getDate(hours) {
  const currentDate = new Date()
  const currentYear = currentDate.getFullYear()
  const currentMonth = currentDate.getMonth()
  const currentDay = currentDate.getDate()
  const timeStamp = new Date(
    currentYear,
    currentMonth,
    currentDay,
    0,
    0,
    0
  ).getTime()
  return new Date(timeStamp + hours * 60 * 60 * 1000).getTime()
}

let that
let options = {
  taskMapping: {
    progress: "percent"
  },
  maxRows: 100,
  maxHeight: 500,
  title: {
    label: "",
    html: false
  },
  row: {
    height: 24
  },
  calendar: {
    hour: {
      display: false
    }
  },
  chart: {
    progress: {
      bar: false
    },
    expander: {
      type: 'chart',
      display: true, //*
      displayIfTaskListHidden: true, //*
      offset: 4, //*
      size: 18
    },
    text: {
      offset: 4,
      xPadding: 10,
      display: true
    },
    grid: {
      horizontal: {
        gap: 6
      }
    }
  },
  taskList: {
    expander: {
      straight: false
    },
    columns: [
      {
        id: 1,
        label: "ID",
        value: "id",
        width: 50
      },
      // {
      //   id: 2,
      //   label: "项目名称",
      //   value: "projectName",
      //   width: 150,
      //   expander: true
      // },
      // {
      //   id: 3,
      //   label: "项目编码",
      //   value: "projectCode",
      //   width: 130
      // },
      {
        id: 4,
        label: "生产令号",
        value: "orderNo",
        width: 100,
        expander: true
      },
      {
        id: 5,
        label: "部件号",
        value: "partNo",
        width: 100
      },
      {
        id: 5,
        label: "计划开始时间",
        value: task => dayjs(task.completionTime).format("YYYY-MM-DD"),
        width: 100
      },
      {
        id: 6,
        label: "计划完成时间",
        value: task => dayjs(task.actualCompletionTime).format("YYYY-MM-DD"),
        width: 100
      },
      {
        id: 7,
        label: "图号",
        value: "drawingNo",
        width: 120,
        // expander: true
      },
      {
        id: 8,
        label: "名称",
        value: "name",
        width: 120
      },
      {
        id: 9,
        label: "数量",
        value: "qty",
        width: 60
      },
      {
        id: 10,
        label: "状态",
        value: (task) => task.status==0 ? "生产中" : task.status == 1 ? "按时完成":"超时完成",
        width: 60
      }
    ]
  },
  locale: {
    name: "zh-cn",
    Now: "Now",
    "X-Scale": "Zoom-X",
    "Y-Scale": "Zoom-Y",
    "Task list width": "列头宽度",
    "Before/After": "Expand",
    "Display task list": "Task list",
    weekdays:["周日","周一","周二","周三","周四","周五","周六"],
    months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
  },
};

let doingStyle = {
  base: {
    fill: '#BFEFFF',
    stroke: '#BFEFFF'
  }
}
let warnStyle = {
  base: {
    fill: '#FF6A6A',
    stroke: '#FF6A6A'
  }
}
let finishStyle = {
  base: {
    fill: '#C1FFC1',
    stroke: '#C1FFC1'
  }
}
let cancelStyle = {
  base: {
    fill: '#BABABA',
    stroke: '#BABABA'
  }
}

export default {
  name: 'progressRate',
  components: {
    GanttElastic,
    GanttHeader
  },
  mounted() {
    that = this
  },
  data() {
    return {
      tasks: [],
      options,
      dynamicStyle: {
        'task-list-header-label': {
          'font-weight': 'bold',
        },
      },
      lastId: 16,
      projectNameList: {},
      queryParam: []
    }
  },
  created() {
    this.getProjectNameList()

  },
  methods: {
    moment,
    addTask() {
      this.tasks.push({
        id: this.lastId++,
        label:
          '<a href="https://images.pexels.com/photos/423364/pexels-photo-423364.jpeg?auto=compress&cs=tinysrgb&h=650&w=940" target="_blank" style="color:#0077c0;">Yeaahh! you have added a task bro!</a>',
        projectCode:
          '<a href="https://images.pexels.com/photos/423364/pexels-photo-423364.jpeg?auto=compress&cs=tinysrgb&h=650&w=940" target="_blank" style="color:#0077c0;">Awesome!</a>',
        start: getDate(24 * 3),
        duration: 1 * 24 * 60 * 60 * 1000,
        percent: 50,
        type: 'project'
      })
    },
    tasksUpdate(tasks,num) {
      if(num == 2) {
        this.tasks = tasks
      } else {
        return
      }
    },
    optionsUpdate(options,num) {
      if(num == 2) {
        this.options = options
      } else {
        return
      }
    },
    styleUpdate(style) {
      this.dynamicStyle = style
    },
    getProjectNameList() {
      projectName().then((res) => {
        this.projectNameList = res
      })
    },
    handleChange(value) {
      this.getTask(value)
    },
    filterOption(input, option) {
      return (
        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
      );
    },
    getTask(projectName) {
      if (projectName == null || projectName === "") {
        return;
      }
      let params = {
        "projectName": projectName
      };
      queryTask(params).then((res)=> {
        console.log(res)
        if (res.success) {
          this.tasks = res.result
        }
      })
    }
  }
}
</script>

<style scoped>

</style>