<template>
    <el-dialog v-model="data.dialogVisible" title="编辑装车订单" :before-close="handleClose" style="width: 1100px; padding-bottom: 20px">
        <el-form ref="formDataRef" :model="ruleForm" :rules="rules" label-width="auto">
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="订单标题" prop="deliveryTitle">
                        <el-input v-model="ruleForm.deliveryTitle" placeholder="请输入订单标题" clearable></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="装车数量" prop="ratedQuantity">
                        <el-input v-model="ruleForm.ratedQuantity" placeholder="请输入装车数量" clearable> <template #append>头</template></el-input>
                    </el-form-item></el-col
                >
            </el-row>
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="选择供应商" prop="supplierName">
                        <el-select
                            v-model="ruleForm.supplierName"
                            clearable
                            filterable
                            remote
                            :remote-method="supplierRemoteMethod"
                            :loading="data.supplierLoading"
                            @change="supplierChange"
                            placeholder="请选择供应商"
                            style="width: 100%"
                            multiple
                            collapse-tags
                            collapse-tags-tooltip
                            :max-collapse-tags="2"
                        >
                            <el-option
                                v-for="item in data.supplierOptions"
                                :key="item.id"
                                :label="item.username + ' / ' + item.mobile + ' (' + item.tenantName + ')'"
                                :value="item.mobile"
                            >
                            </el-option>
                            <el-pagination
                                style="padding: 0px 20px"
                                @current-change="supplierHandleCurrentChange"
                                :page-size="10"
                                :current-page="data.supplierPageNum"
                                layout="total, prev, pager, next"
                                :total="data.supplierTotal"
                            >
                            </el-pagination>
                        </el-select>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="选择资金方" prop="financeName">
                        <el-select
                            v-model="ruleForm.financeName"
                            clearable
                            filterable
                            remote
                            :remote-method="financeRemoteMethod"
                            :loading="data.financeLoading"
                            @change="financeChange"
                            placeholder="请选择资金方"
                            style="width: 100%"
                        >
                            <el-option
                                v-for="item in data.financeOptions"
                                :key="item.id"
                                :label="item.username + ' / ' + item.mobile + ' (' + item.tenantName + ')'"
                                :value="item.mobile"
                            >
                            </el-option>
                            <el-pagination
                                style="padding: 0px 20px"
                                @current-change="financeHandleCurrentChange"
                                :page-size="10"
                                :current-page="data.financePageNum"
                                layout="total, prev, pager, next"
                                :total="data.financeTotal"
                            >
                            </el-pagination>
                        </el-select> </el-form-item
                ></el-col>
            </el-row>
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="选择司机" prop="driverMobile">
                        <el-select
                            v-model="ruleForm.driverMobile"
                            clearable
                            filterable
                            remote
                            :remote-method="driverRemoteMethod"
                            :loading="data.driverLoading"
                            @change="driverChange"
                            placeholder="请选择司机"
                            style="width: 100%"
                        >
                            <el-option
                                v-for="item in data.driverOptions"
                                :key="item.id"
                                :label="item.username + ' / ' + item.mobile"
                                :value="item.mobile"
                            >
                            </el-option>
                            <el-pagination
                                style="padding: 0px 20px"
                                @current-change="driverHandleCurrentChange"
                                :page-size="10"
                                :current-page="data.driverPageNum"
                                layout="total, prev, pager, next"
                                :total="data.driverTotal"
                            >
                            </el-pagination>
                        </el-select>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="选择采购商" prop="purchaserMobile">
                        <el-select
                            v-model="ruleForm.purchaserMobile"
                            clearable
                            filterable
                            remote
                            :remote-method="purchaserRemoteMethod"
                            :loading="data.purchaserLoading"
                            @change="purchaserChange"
                            placeholder="请选择采购商"
                            style="width: 100%"
                        >
                            <el-option
                                v-for="item in data.purchaserOptions"
                                :key="item.id"
                                :label="item.username + ' / ' + item.mobile + ' (' + item.tenantName + ')'"
                                :value="item.mobile"
                            >
                            </el-option>
                            <el-pagination
                                style="padding: 0px 20px"
                                @current-change="purchaserHandleCurrentChange"
                                :page-size="10"
                                :current-page="data.purchaserPageNum"
                                layout="total, prev, pager, next"
                                :total="data.purchaserTotal"
                            >
                            </el-pagination>
                        </el-select> </el-form-item
                ></el-col>
            </el-row>
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="采购单价" prop="buyerPrice">
                        <el-input v-model="ruleForm.buyerPrice" placeholder="请输入采购单价" clearable>
                            <template #append>元/公斤</template>
                        </el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="销售单价" prop="salePrice">
                        <el-input v-model="ruleForm.salePrice" placeholder="请输入销售单价" clearable> <template #append>元/公斤</template></el-input>
                    </el-form-item></el-col
                >
            </el-row>
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="约定单价" prop="firmPrice">
                        <el-input-number
                            v-model="ruleForm.firmPrice"
                            :precision="4"
                            :min="0"
                            :max="999999.9999"
                            placeholder="请输入约定单价"
                            style="width: 100%"
                        >
                            <template #append>元/公斤</template>
                        </el-input-number>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row :gutter="40">
                <el-col :span="12">
                    <el-form-item label="起始地" prop="startLocation">
                        <el-autocomplete
                            v-model="ruleForm.startLocation"
                            :fetch-suggestions="startSearchLocation"
                            placeholder="请输入起始地"
                            style="width: 100%"
                            :trigger-on-focus="false"
                            @select="startHandleSelects"
                        />
                        <div class="maps" style="width: 100%">
                            <baidu-map
                                class="bm-view"
                                :center="data.startCenter"
                                :zoom="14"
                                style="height: 300px; width: 100%; border: 1px solid #ddd"
                                @ready="handler"
                                :scroll-wheel-zoom="true"
                                :extensions_road="true"
                                :extensions_town="true"
                                v-if="data.dialogVisible"
                                @click="startClickInfo"
                                :map-type="'BMAP_NORMAL_MAP'"
                                :enable-map-click="true"
                            >
                                <bm-marker :position="data.startCenter" :dragging="true"></bm-marker>
                            </baidu-map>
                        </div>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="目的地" prop="endLocation">
                        <el-autocomplete
                            v-model="ruleForm.endLocation"
                            :fetch-suggestions="endSearchLocation"
                            placeholder="请输入目的地"
                            style="width: 100%"
                            :trigger-on-focus="false"
                            @select="endHandleSelects"
                        />
                        <div class="maps" style="width: 100%">
                            <baidu-map
                                class="bm-view"
                                :center="data.endCenter"
                                :zoom="14"
                                style="height: 300px; width: 100%; border: 1px solid #ddd"
                                @ready="handler"
                                :scroll-wheel-zoom="true"
                                :extensions_road="true"
                                :extensions_town="true"
                                v-if="data.dialogVisible"
                                @click="endClickInfo"
                                :map-type="'BMAP_NORMAL_MAP'"
                                :enable-map-click="true"
                            >
                                <bm-marker :position="data.endCenter" :dragging="true"></bm-marker>
                            </baidu-map>
                        </div>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <template #footer>
            <span class="dialog-footer">
                <el-button :loading="data.saveLoading" type="primary" @click="onClickSave">保存</el-button>
                <el-button @click="handleClose">取消</el-button>
            </span>
        </template>
    </el-dialog>
</template>

<script setup>
import { ref, reactive, onMounted } from 'vue';
import { orderEdit } from '@/api/shipping.js';
import { driverList, userList, memberListByType } from '@/api/userManage.js';

const emits = defineEmits();
const formDataRef = ref(null);
const maps = ref();
const BMap = reactive({});
const editId = ref();
const data = reactive({
    dialogVisible: false,
    saveLoading: false,
    supplierOptions: [],
    financeOptions: [],
    driverOptions: [],
    purchaserOptions: [],
    startCenter: { lng: 0, lat: 0 },
    endCenter: { lng: 0, lat: 0 },
    driverLoading: false, // 司机loading
    driverName: '',
    driverPageNum: 1,
    driverTotal: 0,
    purchaserLoading: false, // 采购商loading
    purchaserPageNum: 1,
    purchaserTotal: 0,
    purchaserName: '',
    financeLoading: false, // 资金方loading
    financePageNum: 1,
    financeTotal: 0,
    financeName: '',
    supplierLoading: false, // 供应商loading
    supplierPageNum: 1,
    supplierTotal: 0,
    supplierName: '',
});
const ruleForm = reactive({
    deliveryTitle: '', // 订单标题
    ratedQuantity: '', // 装车数量
    supplier: [], // 供应商
    fundId: '', // 资金方
    driverId: '', // 司机
    buyerId: '', // 采购商
    buyerPrice: '', // 采购单价
    salePrice: '', // 销售单价
    firmPrice: null, // 约定单价
    startLocation: '', // 起始地
    startLat: '',
    startLon: '',
    endLocation: '', // 目的地
    endLat: '',
    endLon: '',
    driverMobile: '',
    purchaserMobile: '',
    supplierMobile: '',
});
const rules = reactive({
    deliveryTitle: [{ required: true, message: '请输入订单标题', trigger: 'blur' }],
    // ratedQuantity: [{ required: true, message: '请输入装车数量', trigger: 'blur' }],
    // supplierName: [{ required: true, message: '请选择供应商', trigger: 'change' }],
    // financeName: [{ required: true, message: '请选择资金方', trigger: 'change' }],
    // driverMobile: [{ required: true, message: '请选择司机', trigger: 'change' }],
    // purchaserMobile: [{ required: true, message: '请选择采购商', trigger: 'change' }],
    // buyerPrice: [{ required: true, message: '请输入采购单价', trigger: 'blur' }],
    // salePrice: [{ required: true, message: '请输入销售单价', trigger: 'blur' }],
    // startLocation: [{ required: true, message: '请输入起始地', trigger: 'blur' }],
    // endLocation: [{ required: true, message: '请输入目的地', trigger: 'blur' }],
});
const handleClose = () => {
    if (formDataRef.value) {
        formDataRef.value.resetFields();
    }
    data.dialogVisible = false;
};
// ----------------
// 初始化
const handler = ({ BMap, map }) => {
    BMap = BMap;
    maps.value = map;
    if (data.startCenter.lng == 0 && data.startCenter.lat == 0) {
        const localcity = new BMap.LocalCity();
        localcity.get((e) => {
            data.startCenter.lng = e.center.lng;
            data.startCenter.lat = e.center.lat;
            data.endCenter.lng = e.center.lng;
            data.endCenter.lat = e.center.lat;
        });
    } else {
        // 如果有坐标点则,展示坐标点
    }
};
const startSearchLocation = async (str, cb) => {
    // 使用百度地图的地点搜索服务
    const local = new window.BMap.LocalSearch(maps.value, {
        onSearchComplete(res) {
            const arr = [];
            if (local.getStatus() == BMAP_STATUS_SUCCESS) {
                for (let i = 0; i < res.getCurrentNumPois(); i++) {
                    const x = res.getPoi(i);
                    const item = { value: x.address + x.title, point: x.point };
                    arr.push(item);
                }
                cb(arr);
            } else {
                // ElMessage.error('未找到相关地点，请尝试其他关键字。');
            }
        },
    });
    local.search(str);
};

const endSearchLocation = async (str, cb) => {
    // 使用百度地图的地点搜索服务
    const local = new window.BMap.LocalSearch(maps.value, {
        onSearchComplete(res) {
            const arr = [];
            if (local.getStatus() == BMAP_STATUS_SUCCESS) {
                for (let i = 0; i < res.getCurrentNumPois(); i++) {
                    const x = res.getPoi(i);
                    const item = { value: x.address + x.title, point: x.point };
                    arr.push(item);
                }
                cb(arr);
            } else {
                // ElMessage.error('未找到相关地点，请尝试其他关键字。');
            }
        },
    });
    local.search(str);
};
const startHandleSelects = (item) => {
    // 点击搜索的点位并地图跳转到该坐标
    const { point } = item;
    ruleForm.startLocation = item.value;
    getStartClickInfo({ point });
};
const getStartClickInfo = ({ point }) => {
    const geoc = new window.BMap.Geocoder(); // 创建地址解析器的实例
    data.startCenter.lng = point.lng;
    data.startCenter.lat = point.lat;
    geoc.getLocation(point, function (result) {
        if (result.surroundingPois.length > 0) {
            const fcaArr = [result.addressComponents.province, result.addressComponents.city, result.addressComponents.district];
            ruleForm.startLon = result.point.lng;
            ruleForm.startLat = result.point.lat;
        }
    });
};
const startClickInfo = (e) => {
    data.startCenter.lng = e.point.lng;
    data.startCenter.lat = e.point.lat;
    const geocoder = new window.BMap.Geocoder();
    geocoder.getLocation(e.point, (res) => {
        if (res) {
            ruleForm.startLocation = res.address;
            ruleForm.startLon = res.point.lng;
            ruleForm.startLat = res.point.lat;
        }
    });
};
// 到达点
const endHandleSelects = (item) => {
    // 点击搜索的点位并地图跳转到该坐标
    const { point } = item;
    ruleForm.endLocation = item.value;
    getEndClickInfo({ point });
};
const getEndClickInfo = ({ point }) => {
    const geoc = new window.BMap.Geocoder(); // 创建地址解析器的实例
    data.endCenter.lng = point.lng;
    data.endCenter.lat = point.lat;
    geoc.getLocation(point, function (result) {
        if (result.surroundingPois.length > 0) {
            const fcaArr = [result.addressComponents.province, result.addressComponents.city, result.addressComponents.district];
            ruleForm.endLon = result.point.lng;
            ruleForm.endLat = result.point.lat;
        }
    });
};
const endClickInfo = (e) => {
    data.endCenter.lng = e.point.lng;
    data.endCenter.lat = e.point.lat;
    const geocoder = new window.BMap.Geocoder();
    geocoder.getLocation(e.point, (res) => {
        if (res) {
            ruleForm.endLocation = res.address;
            ruleForm.endLon = res.point.lng;
            ruleForm.endLat = res.point.lat;
        }
    });
};

// ----------------
// 供应商远程搜索
const supplierRemoteMethod = (e) => {
    data.supplierName = e;
    data.supplierPageNum = 1;
    getSupplierList();
};
// 供应商 列表
const getSupplierList = () => {
    data.supplierLoading = true;
    const params = {
        pageNum: data.supplierPageNum,
        pageSize: 10,
        type: 2, // 供应商类型
        username: data.supplierName,
    };
    memberListByType(params)
        .then((res) => {
            data.supplierLoading = false;
            data.supplierOptions = res.data.rows;
            data.supplierTotal = res.data.total;
        })
        .catch(() => {
            data.supplierLoading = false;
        });
};
// 选择供应商分页
const supplierHandleCurrentChange = (val) => {
    data.supplierPageNum = val;
    getSupplierList();
};
// 选择供应商
const supplierChange = (e) => {
    if (e) {
        // ruleForm.supplier = data.supplierOptions.find((item) => item.mobile == e).id;
        ruleForm.supplier = data.supplierOptions.filter((user) => e.includes(user.mobile)).map((user) => user.id);
    } else {
        ruleForm.supplier = [];
    }
};
// 供应商远程搜索
const financeRemoteMethod = (e) => {
    data.financeName = e;
    data.financePageNum = 1;
    getFinanceList();
};
// 资金方 列表
const getFinanceList = () => {
    data.financeLoading = true;
    const params = {
        pageNum: data.financePageNum,
        pageSize: 10,
        type: 3, // 资金方类型
        username: data.financeName,
    };
    memberListByType(params)
        .then((res) => {
            data.financeLoading = false;
            data.financeOptions = res.data.rows;
            data.financeTotal = res.data.total;
        })
        .catch(() => {
            data.financeLoading = false;
        });
};
// 选择资金方分页
const financeHandleCurrentChange = (val) => {
    data.financePageNum = val;
    getFinanceList();
};
// 选择资金方
const financeChange = (e) => {
    if (e) {
        ruleForm.fundId = data.financeOptions.find((item) => item.mobile == e).id;
    } else {
        ruleForm.fundId = '';
    }
};
// 司机远程搜索
const driverRemoteMethod = (e) => {
    data.driverName = e;
    data.driverPageNum = 1;
    getDriverList();
};
// 列表
const getDriverList = () => {
    data.driverLoading = true;
    const params = {
        pageNum: data.driverPageNum,
        pageSize: 10,
        username: data.driverName,
    };
    driverList(params)
        .then((res) => {
            data.driverLoading = false;
            data.driverOptions = res.data.rows;
            data.driverTotal = res.data.total;
        })
        .catch(() => {
            data.driverLoading = false;
        });
};
// 选择司机分页
const driverHandleCurrentChange = (val) => {
    data.driverPageNum = val;
    getDriverList();
};
// 选择司机
const driverChange = (e) => {
    if (e) {
        ruleForm.driverId = data.driverOptions.find((item) => item.mobile == e).id;
    } else {
        ruleForm.driverId = '';
    }
};
// 采购商远程搜索
const purchaserRemoteMethod = (e) => {
    data.purchaserName = e;
    data.purchaserPageNum = 1;
    getPurchaserList();
};
// 采购商 列表
const getPurchaserList = () => {
    data.purchaserLoading = true;
    const params = {
        pageNum: data.purchaserPageNum,
        pageSize: 10,
        type: 4, // 采购商类型
        username: data.purchaserName,
    };
    memberListByType(params)
        .then((res) => {
            data.purchaserLoading = false;
            data.purchaserOptions = res.data.rows;
            data.purchaserTotal = res.data.total;
        })
        .catch(() => {
            data.purchaserLoading = false;
        });
};
// 采购商分页
const purchaserHandleCurrentChange = (val) => {
    data.purchaserPageNum = val;
    getPurchaserList();
};
// 选择采购商
const purchaserChange = (e) => {
    if (e) {
        ruleForm.buyerId = data.purchaserOptions.find((item) => item.mobile == e).id;
    } else {
        ruleForm.buyerId = '';
    }
};
const onClickSave = () => {
    if (formDataRef.value) {
        formDataRef.value.validate((valid) => {
            if (valid) {
                const params = {
                    deliveryId: editId.value,
                    deliveryTitle: ruleForm.deliveryTitle,
                    ratedQuantity: ruleForm.ratedQuantity,
                    supplierId: ruleForm.supplier.join(','),
                    fundId: ruleForm.fundId,
                    driverId: ruleForm.driverId,
                    driverMobile: ruleForm.driverMobile,
                    buyerId: ruleForm.buyerId,
                    buyerPrice: ruleForm.buyerPrice,
                    salePrice: ruleForm.salePrice,
                    firmPrice: ruleForm.firmPrice,
                    startLocation: ruleForm.startLocation,
                    startLat: ruleForm.startLat,
                    startLon: ruleForm.startLon,
                    endLocation: ruleForm.endLocation,
                    endLat: ruleForm.endLat,
                    endLon: ruleForm.endLon,
                };
                data.saveLoading = true;
                orderEdit(params)
                    .then((res) => {
                        data.saveLoading = false;
                        if (res.code === 200) {
                            ElMessage({
                                message: res.msg,
                                type: 'success',
                            });
                            emits('success');
                            if (formDataRef.value) {
                                formDataRef.value.resetFields();
                                data.dialogVisible = false;
                            }
                        } else {
                            ElMessage.error(res.msg);
                        }
                    })
                    .catch((err) => {
                        data.saveLoading = false;
                    });
            } else {

            }
        });
    }
};
const onShowDialog = (val) => {
    getDriverList();
    getPurchaserList();
    getFinanceList();
    getSupplierList();
    if (formDataRef.value) {
        formDataRef.value.resetFields();
    }

    setTimeout(() => {
        if (val) {
            Object.assign(ruleForm, val);
            editId.value = val.id;

            // // 资金方
            if (data.financeOptions && data.financeOptions.length > 0) {
                const financeObj = data.financeOptions.find((item) => item.id == val.fundId);
                ruleForm.financeName = financeObj ? financeObj.mobile : '';
            } else {
                ruleForm.financeName = '';
            }
            
            // 供应商
            if (val.supplierId && data.supplierOptions && data.supplierOptions.length > 0) {
                val.supplier = val.supplierId.split(',').map((id) => Number(id));

                ruleForm.supplierName = data.supplierOptions.filter((supplier) => val.supplier.includes(supplier.id)).map((supplier) => supplier.mobile);
            } else {
                val.supplier = [];
                ruleForm.supplierName = [];
            }

            // 采购商
            if (data.purchaserOptions && data.purchaserOptions.length > 0) {
                const purchaserObj = data.purchaserOptions.find((item) => item.id == val.buyerId);
                ruleForm.purchaserMobile = purchaserObj ? purchaserObj.mobile : '';
            } else {
                ruleForm.purchaserMobile = '';
            }

            // 司机
            if (data.driverOptions && data.driverOptions.length > 0) {
                const driverObj = data.driverOptions.find((item) => item.id == val.driverId);
                ruleForm.driverMobile = driverObj ? driverObj.mobile : '';
            } else {
                ruleForm.driverMobile = '';
            }
            data.startCenter.lng = val.startLon ? val.startLon : '';
            data.startCenter.lat = val.startLat ? val.startLat : '';
            data.endCenter.lng = val.endLon ? val.endLon : '';
            data.endCenter.lat = val.endLat ? val.endLat : '';
        }
        data.dialogVisible = true;
    }, 1000);
};
defineExpose({
    onShowDialog,
});
</script>

<style lang="less" scoped>
::v-deep .anchorBL {
    display: none;
    visibility: hidden;
}

.bm-view {
    border-radius: 4px;
    overflow: hidden;
    /* 优化WebGL渲染 */
    transform: translateZ(0);
    -webkit-transform: translateZ(0);
    will-change: transform;
}

.maps {
    border-radius: 4px;
    overflow: hidden;
}
</style>
