<template>
    <el-container>
        <el-main>
            <el-card style="background-color: #F5F7FA">
                <!-- 搜素区域 -->
                <div>
                    <el-form :model="queryInfo" :rules="queryFormRules" ref="queryFormRef" status-icon>
                        <el-form-item>
                            <el-col :span="4">
                                <el-form-item prop="gmtCreate">
                                    <el-date-picker v-model="queryInfo.gmtCreate" type="date" value-format="yyyy-MM-dd"
                                                    placeholder="选择创建调度时间"
                                                    style="width: 200px"></el-date-picker>
                                </el-form-item>
                            </el-col>
                            <el-col :span="4" style="margin-left: 50px">
                                <el-form-item prop="dispatchType">
                                    <el-select v-model="queryInfo.dispatchType" placeholder="请选择业务类型"
                                               style="width: 200px"
                                               clearable>
                                        <el-option
                                                v-for="item in dispatchTypeList"
                                                :key="item.value"
                                                :label="item.label"
                                                :value="item.value">
                                        </el-option>
                                    </el-select>
                                </el-form-item>
                            </el-col>
                            <el-col :span="4" style="margin-left: 50px">
                                <el-form-item prop="status">
                                    <el-select v-model="queryInfo.status" placeholder="记录状态" clearable
                                               style="width:200px;margin-left: 6px">
                                        <el-option
                                                v-for="item in statusList"
                                                :key="item.value"
                                                :label="item.label"
                                                :value="item.value">
                                        </el-option>
                                    </el-select>
                                </el-form-item>
                            </el-col>
                            <el-button type="primary" style="margin-left: 60px"
                                       @click="getDispatchNodeList">查询调度记录
                            </el-button>
                            <el-button type="success" style="margin-left: 15px" @click="dispatchFormVisible = true">
                                我要调度车辆
                            </el-button>
                        </el-form-item>
                    </el-form>
                    <el-row style="margin-top: 20px;">
                    </el-row>
                </div>
                <!--调度记录列表区域-->
                <div style="margin-top: 20px;">
                    <el-table :data="DispatchNoteList" border highlight-current-row v-loading="listLoading"
                              :row-class-name="rowStatus"
                              element-loading-text="拼命加载中">
                        <el-table-column type="index" align="center"></el-table-column>
                        <el-table-column label="用户名称" prop="userName" align="center" width="100"></el-table-column>
                        <el-table-column label="联系方式" prop="userMobile" align="center" width="120"></el-table-column>
                        <el-table-column label="状态" prop="status" align="center" width="120">
                            <template slot-scope="scope">
                                <span v-if="scope.row.status ==='1'">完成状态</span>
                                <span v-if="scope.row.status ==='2'">执行状态</span>
                                <span v-if="scope.row.status ==='3'">取消状态</span>
                                <span v-if="scope.row.status ==='4'">待执行状态</span>
                            </template>
                        </el-table-column>
                        <el-table-column label="业务类型" prop="dispatchType" align="center" width="120">
                            <template slot-scope="scope">
                                <span v-if="scope.row.dispatchType ==='1'">进站送货</span>
                                <span v-if="scope.row.dispatchType ==='2'">出站提货</span>
                                <span v-if="scope.row.dispatchType ==='3'">货物调拨</span>
                                <span v-if="scope.row.dispatchType ==='4'">货物流转</span>
                            </template>
                        </el-table-column>
                        <el-table-column label="车牌号码" prop="licensePlateNumber" align="center"
                                         width="120"></el-table-column>
                        <el-table-column label="车辆类型" prop="vehicleType" align="center" width="120">
                            <template slot-scope="scope">
                                <span v-if="scope.row.vehicleType ==='1'">重型货车</span>
                                <span v-if="scope.row.vehicleType ==='2'">中型货车</span>
                                <span v-if="scope.row.vehicleType ==='3'">轻型货车</span>
                                <span v-if="scope.row.vehicleType ==='4'">微型货车</span>
                                <span v-if="scope.row.vehicleType ==='5'">拖车</span>
                                <span v-if="scope.row.vehicleType ==='6'">叉车</span>
                            </template>
                        </el-table-column>
                        <el-table-column label="场站位置" prop="station" align="center" width="120">
                            <template slot-scope="scope">
                                <span v-if="scope.row.station ==='1'">西货站</span>
                                <span v-if="scope.row.station ==='2'">综保区</span>
                                <span v-if="scope.row.station ==='3'">军投</span>
                                <span v-if="scope.row.station ==='4'">快邮</span>
                            </template>
                        </el-table-column>
                        <el-table-column label="创建时间" prop="gmtCreate" align="center" width="160"></el-table-column>
                        <el-table-column label="开始时间" prop="beginTime" align="center" width="160"></el-table-column>
                        <el-table-column label="完成时间" prop="endTime" align="center" width="160"></el-table-column>
                        <el-table-column label="操作" width="220px" fixed="right" align="center">
                            <template slot-scope="scope">
                                <!--查看按钮-->
                                <el-tooltip effect="dark" content="查看" placement="top-start" :enterable="false">
                                    <el-button type="primary" icon="el-icon-edit" size="mini"
                                               @click="showDialogVisible(scope.row)">查看
                                    </el-button>
                                </el-tooltip>
                                <!--取消调度按钮-->
                                <el-tooltip effect="dark" content="取消调度" placement="top-start" :enterable="false">
                                    <el-button type="danger" icon="el-icon-delete" size="mini"
                                               :disabled="scope.row.endTime!==null && scope.row.endTime!==''"
                                               @click="cancelDispatch(scope.row)" :loading="cancelLoading">取消调度
                                    </el-button>
                                </el-tooltip>
                            </template>
                        </el-table-column>
                    </el-table>
                    <!--分页区域-->
                    <div style="margin-top: 10px">
                        <el-pagination
                                @size-change="handleSizeChange"
                                @current-change="handleCurrentChange"
                                :current-page="this.queryInfo.pageNum"
                                :page-sizes="[10,20,30,50]"
                                :page-size="this.queryInfo.pageSize"
                                layout="total, sizes, prev, pager, next, jumper"
                                :total="total">
                        </el-pagination>
                    </div>
                </div>
            </el-card>
            <!-- 我要调度车辆,对话框 -->
            <div>
                <el-dialog
                        title="我要调度车辆"
                        :visible.sync="dispatchFormVisible"
                        width="50%" @close="dispatchDialogClosed">
                    <!--  :rules="dispatchFormRules" ref="dispatchFormRef"-->
                    <el-form :model="dispatchForm" label-width="100px" status-icon
                             :rules="dispatchFormRules" ref="dispatchFormRef"
                             style="margin-left:10%;margin-right:10%;background-color: #F5F7FA">
                        <br>
                        <el-form-item label="车辆类型:" prop="vehicleType">
                            <el-select v-model="dispatchForm.vehicleType" style="width: 300px" clearable
                                       placeholder="请选择车辆类型">
                                <el-option
                                        v-for="item in vehicleTypeList"
                                        :key="item.value"
                                        :label="item.label"
                                        :value="item.value">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="车辆数量:" prop="vehicleNumber">
                            <el-input-number style="width: 200px" v-model="dispatchForm.vehicleNumber"
                                             :min="1" :max="100" controls-position="right">
                            </el-input-number>
                            <span style="margin-left:5px;font-size: 18px">辆</span>
                        </el-form-item>
                        <el-form-item label="场站位置:" prop="station">
                            <el-select v-model="dispatchForm.station" style="width: 300px" clearable
                                       placeholder="请选择场站位置">
                                <el-option
                                        v-for="item in stationList"
                                        :key="item.value"
                                        :label="item.label"
                                        :value="item.value">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="业务类型:" prop="dispatchType">
                            <el-select v-model="dispatchForm.dispatchType" style="width: 300px;" clearable
                                       placeholder="请选择业务类型">
                                <el-option
                                        v-for="item in dispatchTypeList"
                                        :key="item.value"
                                        :label="item.label"
                                        :value="item.value">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <br>
                    </el-form>
                    <!--底部按钮区域-->
                    <span slot="footer" class="dialog-footer">
                        <el-button @click="dispatchFormVisible = false">取 消</el-button>
                        <el-button type="primary" @click="dispatchVehicle" :loading="dispatchLoading">确定调度车辆</el-button>
                    </span>
                </el-dialog>
            </div>
            <!-- 查看调度记录,对话框 -->
            <div>
                <el-dialog
                        style="margin-top: -50px"
                        title="查看调度记录明细"
                        :visible.sync="viewDialogVisible"
                        text-align="center"
                        width="60%" @close="showDialogClosed">
                    <!-- 表单显示区域 :rules="dispatchFormRules" -->
                    <el-form :model="showForm" ref="showFormRef"
                             :inline="true" align="center"
                             style="background-color: #F5F7FA;margin-left: 5%;margin-right: 5%">
                        <div style="margin-top: -15px">
                            <br>
                            <el-form-item label="用户名称:" prop="userName">
                                <el-input v-model="showForm.userName" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="联系方式:" prop="userMobile">
                                <el-input v-model="showForm.userMobile" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="车辆类型:" prop="vehicleType">
                                <el-select v-model="showForm.vehicleType" style="width:200px" size="small" readonly
                                           placeholder="请选择车辆类型">
                                    <el-option
                                            v-for="item in vehicleTypeList"
                                            :key="item.value"
                                            :label="item.label"
                                            :value="item.value">
                                    </el-option>
                                </el-select>
                            </el-form-item>
                            <el-form-item label="车牌号码:" prop="licensePlateNumber">
                                <el-input v-model="showForm.licensePlateNumber" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="场站位置:" prop="station">
                                <el-select v-model="showForm.station" style="width:200px" readonly size="small"
                                           placeholder="请选择场站位置">
                                    <el-option
                                            v-for="item in stationList"
                                            :key="item.value"
                                            :label="item.label"
                                            :value="item.value">
                                    </el-option>
                                </el-select>
                            </el-form-item>
                            <el-form-item label="业务类型:" prop="dispatchType">
                                <el-select v-model="showForm.dispatchType" style="width:200px" readonly size="small"
                                           placeholder="请选择业务类型">
                                    <el-option
                                            v-for="item in dispatchTypeList"
                                            :key="item.value"
                                            :label="item.label"
                                            :value="item.value">
                                    </el-option>
                                </el-select>
                            </el-form-item>
                            <el-form-item label="创建时间:" prop="gmtCreate">
                                <el-input v-model="showForm.gmtCreate" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="开始时间:" prop="beginTime">
                                <el-input v-model="showForm.beginTime" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="结束时间:" prop="endTime">
                                <el-input v-model="showForm.endTime" style="width: 200px;" size="small"
                                          readonly></el-input>
                            </el-form-item>
                            <el-form-item label="记录状态:" prop="status">
                                <el-select v-model="showForm.status" placeholder="记录状态" style="width:200px" size="small"
                                           readonly>
                                    <el-option
                                            v-for="item in statusList"
                                            :key="item.value"
                                            :label="item.label"
                                            :value="item.value">
                                    </el-option>
                                </el-select>
                            </el-form-item>
                            <br>
                        </div>
                    </el-form>
                    <!--底部按钮区域-->
                    <span slot="footer" class="dialog-footer">
                        <el-button type="primary" @click="viewDialogVisible = false">结束查看</el-button>
                    </span>
                </el-dialog>
            </div>
        </el-main>
    </el-container>
</template>

<script>
    import {selectDispatchNoteList, dispatch, cancel, getUser} from '../../api/dispatch_api'

    export default {
        name: 'dispatch_api',
        created() {

        },
        data() {
            /**
             * 验证手机号的自定义规则
             */
            var userMobileValid = (rule, value, callback) => {
                //验证手机号的正则表达式
                const regMobile = /^(0|86|17951)?(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$/;
                if (regMobile.test(value)) {
                    //合法的手机号
                    return callback();
                }
                callback(new Error('请输入合法的手机号'));
            };
            return {
                /**
                 * 查询列表
                 */
                queryInfo: {
                    //用户姓名
                    userName: '',
                    //用户联系方式
                    userMobile: '',
                    //记录状态
                    status: '',
                    //调度时间
                    gmtCreate: new Date(),
                    //业务类型
                    dispatchType: '',
                    //当前的页数
                    pageNum: 1,
                    //当前每页显示多少条数据
                    pageSize: 10
                },
                /**
                 * 记录列表,总条数
                 */
                total: 0,
                /**
                 * 所有,调度记录列表
                 */
                DispatchNoteList: [],
                /**
                 * 我要调度车辆,表单
                 */
                dispatchForm: {
                    userName: '',
                    userMobile: '',
                    //车辆数量
                    vehicleNumber: 1,
                    //车辆类型
                    vehicleType: '2',
                    //场站位置
                    station: '1',
                    //调度业务类型
                    dispatchType: '1'
                },

                /**
                 * 查看记录明细,表单
                 */
                showForm: {},
                /**
                 * 控制添加用户对话框的显示与隐藏
                 */
                dispatchFormVisible: false,
                /**
                 * 控制查看调度记录明细,对话框的显示与隐藏
                 */
                viewDialogVisible: false,
                /**
                 * loading加载
                 */
                /* 获取列表时的加载 */
                listLoading: false,
                /* 调度车辆时的加载 */
                dispatchLoading: false,
                /* 取消调度时的加载 */
                cancelLoading: false,
                /**
                 * 业务类型,选项列表
                 */
                dispatchTypeList: [
                    {
                        value: '1',
                        label: '进站送货'
                    },
                    {
                        value: '2',
                        label: '出站提货'
                    },
                    {
                        value: '3',
                        label: '货物流转'
                    },
                    {
                        value: '4',
                        label: '货物调拨'
                    }
                ],
                /**
                 * 车辆类型,选项列表
                 */
                vehicleTypeList: [
                    {
                        value: '1',
                        label: '重型货车'
                    },
                    {
                        value: '2',
                        label: '中型货车'
                    },
                    {
                        value: '3',
                        label: '经济货车'
                    },
                    {
                        value: '4',
                        label: '微型货车'
                    },
                    {
                        value: '5',
                        label: '拖车'
                    },
                    {
                        value: '6',
                        label: '叉车'
                    }
                ],
                /**
                 * 记录状态,列表
                 */
                statusList: [
                    {
                        value: '1',
                        label: '完成状态'
                    },
                    {
                        value: '2',
                        label: '执行状态'
                    },
                    {
                        value: '3',
                        label: '取消状态'
                    },
                    {
                        value: '4',
                        label: '待执行状态'
                    }
                ],

                /**
                 * 场站位置,选项列表
                 */
                stationList: [
                    {
                        value: '1',
                        label: '西货站'
                    },
                    {
                        value: '2',
                        label: '综保区'
                    },
                    {
                        value: '3',
                        label: '军投'
                    },
                    {
                        value: '4',
                        label: '快邮'
                    }
                ],

                queryFormRules: {
                    userName: [
                        {required: true, message: '请输入姓名', trigger: ['blur', 'change']},
                    ],
                    userMobile: [
                        {required: true, message: '请输入联系方式', trigger: ['blur', 'change']},
                        {validator: userMobileValid, trigger: 'blur'}
                    ],
                },
                /**
                 * 调度车辆表单的验证规则对象
                 */
                dispatchFormRules: {
                    status: [
                        {required: true, message: '请选择记录状态', trigger: ['blur', 'change']},
                    ],
                    gmtCreate: [
                        {required: true, message: '请选择创建时间', trigger: ['blur', 'change']},
                    ],
                    endTime: [
                        {required: true, message: '请选择结束时间', trigger: ['blur', 'change']},
                    ],
                    licensePlateNumber: [
                        {required: true, message: '请输入车牌号', trigger: ['blur', 'change']},
                    ],
                    userName: [
                        {required: true, message: '请输入姓名', trigger: ['blur', 'change']},
                    ],
                    userMobile: [
                        {required: true, message: '请输入联系方式', trigger: ['blur', 'change']},
                        {validator: userMobileValid, trigger: 'blur'}
                    ],
                    vehicleType: [
                        {required: true, message: '请选择车辆类型', trigger: ['blur', 'change']},

                    ],
                    vehicleNumber: [
                        {required: true, message: '请选择车辆数量', trigger: ['blur', 'change']},
                    ],
                    station: [
                        {required: true, message: '请选择场站位置', trigger: ['blur', 'change']},
                    ],
                    dispatchType: [
                        {required: true, message: '请选择调度业务类型', trigger: ['blur', 'change']},
                    ],
                },
            }
        },
        methods: {
            /**
             * 监听,调度车辆对话框的关闭事件
             */
            dispatchDialogClosed() {
                //重置对话框
                this.$refs.dispatchFormRef.resetFields();
            },

            /**
             * 监听,查看调度记录对话框的关闭事件
             */
            showDialogClosed() {
                //重置对话框
                this.$refs.showFormRef.resetFields();
            },

            /**
             * 监听pageSize改变的事件
             */
            handleSizeChange(newSize) {
                this.queryInfo.pageSize = newSize;
                //刷新调度记录列表
                this.getDispatchNodeList();
            },
            /**
             * 监听当前页码值改变的事件
             */
            handleCurrentChange(newPage) {
                this.queryInfo.pageNum = newPage;
                //刷新调度记录列表
                this.getDispatchNodeList();
            },
            /**
             * 打开,查看调度记录明细,对话框
             * @param row
             */
            showDialogVisible(row) {
                this.showForm = row;
                this.viewDialogVisible = true;
            },
            /**
             * 用户端,获取车辆调度记录
             */
            getDispatchNodeList() {
                this.listLoading = true;
                selectDispatchNoteList(this.queryInfo).then((response) => {
                    let res = response.data;
                    if (res.code !== '200') {
                        this.listLoading = false;
                        return this.$message.error('获取车辆调度列表失败');
                    }
                    // 获取车辆调度列表数据
                    this.DispatchNoteList = res.data.list;
                    // 获取列表的总记录数
                    this.total = res.data.total;
                    this.listLoading = false;
                    this.$message.success('获取车辆调度列表,成功!');
                }).catch(error => {
                    this.listLoading = false;
                    this.$message.error(error.toString());
                });
            },
            /**
             * 用户端,我要调度车辆,方法
             */
            dispatchVehicle() {
                this.dispatchLoading = true;
                dispatch(this.dispatchForm).then((response) => {
                    let res = response.data;
                    if (res.code !== '200') {
                        this.dispatchLoading = false;
                        return this.$message.error('车辆繁忙,请稍后重试');
                    }
                    //关闭加载
                    this.dispatchLoading = false;
                    this.$message.success('调度车辆成功!');
                    //调度成功,隐藏对话框
                    this.dispatchFormVisible = false;
                    /* 将调度车辆信息=>查询列表 */
                    // 用户名称
                    this.queryInfo.userName = this.dispatchForm.userName;
                    // 联系方式
                    this.queryInfo.userMobile = this.dispatchForm.userMobile;
                    // 调度业务类型
                    this.queryInfo.dispatchType = this.dispatchForm.dispatchType;
                    // 创建时间为当前时间(需留意)
                    this.queryInfo.gmtCreate = new Date();
                    //刷新车辆调度列表
                    this.getDispatchNodeList();
                }).catch(error => {
                    this.dispatchLoading = false;
                    this.$message.error(error.toString());
                });
            },
            /**
             * 用户端,取消调度车辆,方法
             */
            cancelDispatch(row) {
                //弹框询问是否取消车辆调度
                this.$confirm('此操作将取消该车辆的调度, 是否继续?', '警告', {
                        confirmButtonText: '确定取消调度',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }
                ).then(() => {
                    //开启加载
                    this.cancelLoading = true;
                    cancel(row).then((response) => {
                        let res = response.data;
                        if (res.code !== '200') {
                            this.cancelLoading = false;
                            return this.$message.error('取消车辆调度,失败!请人工介入');
                        }
                        //关闭加载
                        this.cancelLoading = false;
                        this.$message.success('取消调度车辆,成功!');
                        //刷新车辆调度列表
                        this.getDispatchNodeList();
                    }).catch(error => {
                        //关闭加载
                        this.cancelLoading = false;
                        this.$message.error(error.toString());
                    });
                }).catch(() => {
                });
            },
            /**
             * 获取用户信息
             */
            getUserInfo(param) {
                getUser(param).then((response) => {
                    let res = response.data;
                    if (res.code !== '200') {
                        return this.$message.error('网络异常,请刷新界面!');
                    }
                    if (res.data.list.length === 0) {
                        return this.$message.error('网络异常,请刷新界面!');
                    }
                    if (res.data.list[0].mobilephone === null || res.data.list[0].mobilephone === '') {
                        return this.$message.error('请填写您的手机号码');
                    }
                    this.queryInfo.userMobile = res.data.list[0].mobilephone;
                    this.dispatchForm.userMobile = res.data.list[0].mobilephone;
                    this.$message.success('欢迎使用,车辆调度系统!');
                }).catch((error) => {
                    this.$message.error(error.toString());
                });
            },
            /**
             * 根据状态的不同区分颜色
             *
             * @param row
             * @param rowIndex
             */
            rowStatus({row, rowIndex}) {
                if (row.status === '1') {
                    return 'success-row';
                }
                if (row.status === '2') {
                    return 'run-row';
                }
                if (row.status === '3') {
                    return 'cancel-row';
                }
                if (row.status === '4') {
                    return 'await-row';
                }
            }
        },
        mounted() {
            var user = sessionStorage.getItem('user');
            if (user) {
                user = JSON.parse(user);
                console.log(user);
                this.queryInfo.userName = user.username;
                this.dispatchForm.userName = user.username;
                let param = {
                    userName: this.queryInfo.userName
                };
                this.getUserInfo(param);
            }
            /**
             * 渲染完成之后,在获取调度记录列表
             */
            // this.getDispatchNodeList();
        }
    }
</script>

<style>
    /* 完成状态 */
    .el-table .success-row {
        background: rgba(64, 158, 255, 0.2);
    }

    /*  执行状态 */
    .el-table .run-row {
        background: rgba(103, 194, 58, 0.2);
    }

    /*  取消状态 */
    .el-table .cancel-row {
        background: rgba(144, 147, 153, 0.2);
    }

    /*  待执行状态 */
    .el-table .await-row {
        background: rgba(230, 162, 60, 0.2);
    }
</style>