<template>
  <div class="app-container">

    <!-- 搜索工作栏 -->
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="部门" prop="deptId">
        <el-select v-model="queryParams.deptId" style="width: 300px;" placeholder="请选择部门">
          <el-option v-for="item in this.deptData" :key="item.id" :label="item.name" :value="item.id"/>
        </el-select>
      </el-form-item>
      <el-form-item label="目标类型" prop="targetType">
        <dict-selector :type="DICT_TYPE.TARGET_TYPE" v-model="queryParams.targetType" formatter="number"/>
      </el-form-item>
      <el-form-item label="运输方式" prop="transportType">
        <dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="queryParams.transportType" formatter="number"/>
      </el-form-item>
      <el-form-item label="出货渠道" prop="shippingChannel">
        <el-select v-model="queryParams.shippingChannel" placeholder="请选择出货渠道">
          <el-option v-for="item in channelList" :label="item.nameZh" :value="item.channelId"
                     :key="item.channelId"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <!-- 操作工具栏 -->
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
                   v-hasPermi="['ecw:dept-target:create']">目标设置
        </el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <!-- 列表 -->
    <el-table v-loading="loading" :data="list">
      <el-table-column label="目标名称" align="center" width="180">
        <template slot-scope="scope">
          <span>{{scope.row.deptName}}{{scope.row.targetPeriodName}}目标</span>
        </template>
      </el-table-column>
      <el-table-column label="部门" align="center" prop="deptName"/>
      <el-table-column label="目标类型" align="center" prop="targetType">
        <template slot-scope="scope">
          <dict-tag :type="DICT_TYPE.TARGET_TYPE" :value="scope.row.targetType"/>
        </template>
      </el-table-column>
      <el-table-column label="时间范围" align="center" prop="targetPeriodName">
        <template slot-scope="scope">
          <span>{{dateFormat(scope.row.startTime)}}~{{dateFormat(scope.row.endTime)}}</span>
        </template>
      </el-table-column>
      <el-table-column label="部门人数" align="center" prop="deptEmpCount"/>
      <el-table-column label="目标方数" align="center" prop="cubeNum"/>
      <el-table-column label="运输方式" align="center" prop="transportType">
        <template slot-scope="scope">
          <dict-tag :type="DICT_TYPE.TRANSPORT_TYPE" :value="scope.row.transportType"/>
        </template>
      </el-table-column>
      <el-table-column label="出货渠道" align="center" prop="shippingChannel">
        <template slot-scope="scope">
          <span>{{ getShipChannelName(scope.row.shippingChannel) }}</span>
        </template>
      </el-table-column>
      <el-table-column label="已完成方数" align="center" prop="completeCubeNum"/>
      <el-table-column label="完成比例" align="center">
        <template slot-scope="scope">
          <span>{{ (scope.row.completeCubeNum/scope.row.cubeNum*100).toFixed(2)+'%' }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
                     v-hasPermi="['ecw:dept-target:update']">修改
          </el-button>
          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
                     v-hasPermi="['ecw:dept-target:delete']">删除
          </el-button>
          <el-button size="mini" type="text" icon="el-icon-search" @click="handleView(scope.row)"
                     v-hasPermi="['ecw:dept-target:create']"></el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
                @pagination="getList"/>

    <!-- 对话框(添加 / 修改) -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="部门" prop="deptId">
          <el-select v-model="form.deptId" style="width: 300px;" placeholder="请选择部门">
            <el-option v-for="item in this.deptData" :key="item.id" :label="item.name" :value="item.id"/>
          </el-select>
        </el-form-item>
        <el-form-item label="目标类型" prop="targetType">
          <el-select v-model="form.targetType" placeholder="请选择运输方式" @change="changeList">
            <el-option v-for="dict in getDictDatas(DICT_TYPE.TARGET_TYPE)"
                       :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"/>
          </el-select>
        </el-form-item>
        <el-form-item label="计算周期" prop="targetPeriodName">
          <el-select v-model="form.targetPeriodName" placeholder="请选择计算周期" @change="setTime">
            <el-option v-for="item in targetPeriod" :label="item.name" :value="item.name" :key="item.name"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="运输方式" prop="transportType">
          <dict-selector :type="DICT_TYPE.ECW_TRANSPORT_TYPE" v-model="form.transportType" formatter="number"/>
        </el-form-item>
        <el-form-item label="出货渠道" prop="shippingChannel">
          <el-select v-model="form.shippingChannel" placeholder="请选择出货渠道">
            <el-option v-for="item in channelList" :label="item.nameZh" :value="item.channelId"
                       :key="item.channelId"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="立方数" prop="cubeNum">
          <el-input v-model="form.cubeNum" placeholder="请输入立方数"/>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>

    <!--人员目标进度-->
    <el-dialog title="人员目标进度" :visible.sync="tableOpen" width="1000px" append-to-body>
      <div><span><b>{{detail.deptName}}-{{getDictDataLabel(DICT_TYPE.TARGET_TYPE,detail.targetType)}}</b></span></div>
      <div>
        <span>运输方式:</span><span>{{getDictDataLabel(DICT_TYPE.TRANSPORT_TYPE,detail.transportType)}}</span>
        <span>出货渠道:</span><span>{{ getShipChannelName(detail.shippingChannel) }}</span>
        <span>部门目标:</span><span>{{detail.cubeNum}}</span>
      </div>
      <el-table v-loading="loading" :data="tableList">
        <el-table-column label="员工名称" align="center" width="180">
          <template slot-scope="scope">
            <span>{{scope.row.userName}}</span>
          </template>
        </el-table-column>
        <el-table-column label="部门" align="center">
          <template>
            <span>{{detail.deptName}}</span>
          </template>
        </el-table-column>
        <el-table-column label="目标类型" align="center" prop="targetType">
          <template slot-scope="scope">
            <dict-tag :type="DICT_TYPE.TARGET_TYPE" :value="scope.row.targetType"/>
          </template>
        </el-table-column>
        <el-table-column label="时间范围" align="center" prop="targetPeriodName">
          <template slot-scope="scope">
            <span>{{dateFormat(scope.row.startTime)}}~{{dateFormat(scope.row.endTime)}}</span>
          </template>
        </el-table-column>
        <el-table-column label="个人目标方数" align="center" prop="personalCubeNum"/>
        <el-table-column label="已完成方数" align="center" prop="personalCompleteCubeNum"/>
        <el-table-column label="完成比例" align="center">
          <template slot-scope="scope">
            <span>{{ (scope.row.personalCompleteCubeNum/scope.row.personalCubeNum*100).toFixed(2)+'%' }}</span>
          </template>
        </el-table-column>
      </el-table>
      <!-- 分页组件 -->
      <pagination v-show="tableTotal > 0" :total="tableTotal" :page.sync="tableQueryParams.pageNo"
                  :limit.sync="tableQueryParams.pageSize"
                  @pagination="getTableList"/>
    </el-dialog>

  </div>
</template>

<script>
    import {
        createDeptTarget,
        updateDeptTarget,
        deleteDeptTarget,
        getDeptTarget,
        getDeptTargetPage,
        exportDeptTargetExcel,
        getCreateInitData,
        getPersonTargetPage
    } from "@/api/ecw/deptTarget";
    import {listSimpleDepts} from "@/api/system/dept";
    import {getChannelList} from '@/api/ecw/channel';
    import dayjs from "dayjs";

    export default {
        name: "DeptTarget",
        components: {},
        data() {
            return {
                // 遮罩层
                loading: true,
                // 导出遮罩层
                exportLoading: false,
                // 显示搜索条件
                showSearch: true,
                // 总条数
                total: 0,
                tableTotal: 0,
                // 部门业绩目标设置列表
                list: [],
                tableList: [],
                // 弹出层标题
                title: "",
                detail: {
                    deptName: null,
                    targetType: null,
                    cubeNum: null,
                    shippingChannel: null,
                    transportType: null,
                },
                // 是否显示弹出层
                open: false,
                tableOpen: false,
                dateRangeCreateTime: [],
                dateRangeStartTime: [],
                dateRangeEndTime: [],
                deptData: [],
                deptArr: [],
                channelList: [],
                monthList: [],
                quarterList: [],
                yearList: [],
                targetPeriod: [],
                // 查询参数
                queryParams: {
                    pageNo: 1,
                    pageSize: 10,
                    deptId: null,
                    targetType: null,
                    targetPeriodName: null,
                    transportType: null,
                    shippingChannel: null,
                    cubeNum: null,
                },
                tableQueryParams: {
                    pageNo: 1,
                    pageSize: 10,
                    id: null,
                },
                // 表单参数
                form: {},
                // 表单校验
                rules: {
                    deptId: [{required: true, message: "部门ID不能为空", trigger: "blur"}],
                    targetType: [{required: true, message: "目标类型不能为空", trigger: "change"}],
                    cubeNum: [{required: true, message: "立方数不能为空", trigger: "blur"}],
                }
            };
        },
        computed: {
            getShipChannelName() {
                return shippingChannelId => {
                    for (let index in this.channelList) {
                        let channelItem = this.channelList[index];
                        if (channelItem.channelId == shippingChannelId) {
                            return channelItem.nameZh;
                        }
                    }
                    return '/'
                }
            }
        },
        created() {
            listSimpleDepts().then(res => {
                res.data.forEach((item) => {
                    if (item.parentId == 0) {

                        this.deptArr.push(item)

                    } else {
                        this.deptData.push(item)
                    }
                })
                this.deptData.forEach((value) => {
                    var dept = this.deptArr.filter(itt => itt.id == value.parentId)
                    if (dept.length > 0) {
                        value.name = dept[0].name + ' | ' + value.name
                    }

                })
            });
            getCreateInitData().then(res => {
                this.monthList = res.data.month;
                this.quarterList = res.data.quarter;
                this.yearList = res.data.year;
            });
            this.getChannelList();
            this.getList();
        },
        methods: {
            getChannelList() {
                getChannelList().then(res => this.channelList = res.data)
            },
            dateFormat(val) {
                return dayjs(val).format("YYYY-MM-DD");
            },
            changeList(val) {
                if (val === 1) {
                    this.form.targetPeriodName = undefined;
                    this.targetPeriod = this.monthList;
                } else if (val === 2) {
                    this.form.targetPeriodName = undefined;
                    this.targetPeriod = this.quarterList;
                } else {
                    this.form.targetPeriodName = undefined;
                    this.targetPeriod = this.yearList;
                }
            },
            setTime(item) {
                this.targetPeriod.forEach((i, index) => {
                    if (i.name === item) {
                        this.form.startTime = i.startDate;
                        this.form.endTime = i.endDate;
                    }
                })
            },
            /** 查询列表 */
            getList() {
                this.loading = true;
                // 处理查询参数
                let params = {...this.queryParams};
                this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
                this.addBeginAndEndTime(params, this.dateRangeStartTime, 'startTime');
                this.addBeginAndEndTime(params, this.dateRangeEndTime, 'endTime');
                // 执行查询
                getDeptTargetPage(params).then(response => {
                    this.list = response.data.list;
                    this.total = response.data.total;
                    this.loading = false;
                });
            },
            /** 取消按钮 */
            cancel() {
                this.open = false;
                this.reset();
            },
            /** 表单重置 */
            reset() {
                this.form = {
                    id: undefined,
                    deptId: undefined,
                    targetType: undefined,
                    targetPeriodName: undefined,
                    startTime: undefined,
                    endTime: undefined,
                    transportType: undefined,
                    shippingChannel: undefined,
                    cubeNum: undefined,
                };
                this.resetForm("form");
            },
            /** 搜索按钮操作 */
            handleQuery() {
                this.queryParams.pageNo = 1;
                this.getList();
            },
            /** 重置按钮操作 */
            resetQuery() {
                this.dateRangeCreateTime = [];
                this.dateRangeStartTime = [];
                this.dateRangeEndTime = [];
                this.resetForm("queryForm");
                this.handleQuery();
            },
            /** 新增按钮操作 */
            handleAdd() {
                this.targetPeriod = this.monthList;
                this.reset();
                this.open = true;
                this.title = "添加部门业绩目标设置";
            },
            /** 查看人员目标情况 */
            handleView(row) {
                this.detail = row;
                this.tableQueryParams.id = row.id;
                this.getTableList();
                this.tableOpen = true;
            },
            getTableList() {
                getPersonTargetPage(this.tableQueryParams).then(res => {
                    this.tableList = res.data.list;
                    this.tableTotal = res.data.total;
                });
            },
            /** 修改按钮操作 */
            handleUpdate(row) {
                this.reset();
                const id = row.id;
                getDeptTarget(id).then(response => {
                    this.form = response.data;
                    if (response.data.targetType === 1) {
                        this.targetPeriod = this.monthList;
                    } else if (response.data.targetType === 2) {
                        this.targetPeriod = this.quarterList;
                    } else {
                        this.targetPeriod = this.yearList;
                    }
                    this.open = true;
                    this.title = "修改部门业绩目标设置";
                });
            },
            /** 提交按钮 */
            submitForm() {
                this.$refs["form"].validate(valid => {
                    if (!valid) {
                        return;
                    }
                    // 修改的提交
                    if (this.form.id != null) {
                        updateDeptTarget(this.form).then(response => {
                            this.$modal.msgSuccess("修改成功");
                            this.open = false;
                            this.getList();
                        });
                        return;
                    }
                    // 添加的提交
                    createDeptTarget(this.form).then(response => {
                        this.$modal.msgSuccess("新增成功");
                        this.open = false;
                        this.getList();
                    });
                });
            },
            /** 删除按钮操作 */
            handleDelete(row) {
                const id = row.id;
                this.$modal.confirm('是否确认删除部门业绩目标设置编号为"' + id + '"的数据项?').then(function () {
                    return deleteDeptTarget(id);
                }).then(() => {
                    this.getList();
                    this.$modal.msgSuccess("删除成功");
                }).catch(() => {
                });
            },
            /** 导出按钮操作 */
            handleExport() {
                // 处理查询参数
                let params = {...this.queryParams};
                params.pageNo = undefined;
                params.pageSize = undefined;
                this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
                this.addBeginAndEndTime(params, this.dateRangeStartTime, 'startTime');
                this.addBeginAndEndTime(params, this.dateRangeEndTime, 'endTime');
                // 执行导出
                this.$modal.confirm('是否确认导出所有部门业绩目标设置数据项?').then(() => {
                    this.exportLoading = true;
                    return exportDeptTargetExcel(params);
                }).then(response => {
                    this.$download.excel(response, '${table.classComment}.xls');
                    this.exportLoading = false;
                }).catch(() => {
                });
            }
        }
    };
</script>