Newer
Older
dxCard-admin / src / views / customers / components / DispatchOrderModal.vue
jiangqihao 7 days ago 4 KB unice
<template>
  <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose title="派单" :width="500" @ok="handleSubmit" @visible-change="resetForm">
    <a-form :model="formState" :label-col="labelCol" :wrapper-col="wrapperCol">
        <a-form-item label="区域">
            <JAreaLinkage v-model:value="formState.areaIds" :show-all="true" @change="formatArea" />
        </a-form-item>
        <a-form-item label="街道 ">
            <a-input v-model:value="formState.address" placeholder="请输入街道地址" />
        </a-form-item>
        <a-form-item label=" ">
            <a href="javascript:;" @click="loadDeliveryList">查询这个区域的送卡人</a>
        </a-form-item>
        <a-form-item label="送卡人">
            <a-select v-model:value="formData.cardDeliveryPerson" :options="deliveryList"
                  :fieldNames="{ label: 'name', value: 'id' }" style="width: 100%" placeholder="请选择送卡人">
            </a-select>
        </a-form-item>
    </a-form>
  </BasicModal>
</template>

<script lang="ts" setup>
    import {ref, computed, unref, reactive}  from 'vue';
    import type { UnwrapRef } from 'vue';
    import {BasicModal, useModalInner} from '/@/components/Modal';
    import {JAreaLinkage} from '/@/components/Form';
    import { getAreaCardDeliveryPersonList, dispatch } from '../CardApplicationCustomers.api';
    import { useMessage } from '/@/hooks/web/useMessage';

    const { createMessage } = useMessage();

    const labelCol = { style: { width: '150px' } };
    const wrapperCol = { span: 14 };

    // Emits声明
    const emit = defineEmits(['register','success']);

    interface FormState {
        areaIds?: string[];
        province: string;
        city: string;
        area: string;
        address: string;
    }
    const formState: UnwrapRef<FormState> = reactive({
        areaIds: [],
        province: '',
        city: '',
        area: '',
        address: '',
    });
    const deliveryList = ref<any[]>([]);

    function formatArea(value){
        if(value && value.length == 3){
            formState.province = value[0];
            formState.city = value[1];
            formState.area = value[2];
        }else{
            formState.province = '';
            formState.city = '';
            formState.area = '';
        }
    }

    function resetForm(visible: boolean){
        if(visible){
            formState.areaIds = [];
            formState.province = '';
            formState.city = '';
            formState.area = '';
            formState.address = '';
            deliveryList.value = [];
            formData.value.cardDeliveryPerson = '';
        }
    }

    //表单赋值
    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
        formData.value.id = data?.record?.id || '';
        setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
        
    });

    const formData = ref<any>({
        id: '',
        cardDeliveryPerson: ''
    });
    //表单提交事件
    async function handleSubmit(v) {
        try {
            if(!formData.value.id){
                createMessage.warning('无效的客户信息');
                return Promise.reject('无效的客户信息');
            } else if(!formData.value.cardDeliveryPerson){
                createMessage.warning('请选择送卡人');
                return Promise.reject('请选择送卡人');
            }
            setModalProps({confirmLoading: true});
            //提交表单
            await dispatch(formData.value);
            //关闭弹窗
            closeModal();
            //刷新列表
            emit('success');
        } catch (error) {
           return Promise.reject(error);
        } finally {
            setModalProps({confirmLoading: false});
        }
    }

    async function loadDeliveryList() {
        if(!formState.province || !formState.city){
            createMessage.warning('请先选择区域');
            return;
        }
        const res = await getAreaCardDeliveryPersonList(formState);
        if(Array.isArray(res)){
            deliveryList.value = res;
        } else {
            createMessage.error(res || '查询送卡人失败');
        }
    }

</script>

<style lang="less" scoped>
	/** 时间和数字输入框样式 */
  :deep(.ant-input-number) {
    width: 100%;
  }

  :deep(.ant-calendar-picker) {
    width: 100%;
  }
</style>