useGenerateAlignerApiStore.js 5.21 KB
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { defineStore, storeToRefs } from 'pinia';
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';

import { useIsLoadingStore } from '@/views/stores/inprogress/useIsLoadingStore';
import { useAlignerParamsStore } from '@/views/stores/modal/useAlignerParamsStore';
import { useClassFunctionStore } from '@/views/stores/useClassFunctionStore';
import { useInProgressStore } from '@/views/stores/inprogress/useInProgressStore';

export const useGenerateAlignerApiStore = defineStore('aligner-generate-api', () => {
    const i18n = useI18n();
    const route = useRoute();

    const loadingStore = useIsLoadingStore();
    const { setIsLoading } = loadingStore;

    const alignerParamsStore = useAlignerParamsStore();
    const { alignerParams } = alignerParamsStore;
    const { isBase } = storeToRefs(alignerParamsStore);

    const classFunctionStore = useClassFunctionStore();
    const { MarkPointsOnMeshClass } = storeToRefs(classFunctionStore);
    const { MarkPointsOnMeshClassDispose } = classFunctionStore;

    const inProgressStore = useInProgressStore();
    const { setCurrentProgress } = inProgressStore;

    const ossUrl = 'https://tcloud.luxcreo.cn/oss/';
    const generateAlignerUrl = 'https://tcloud.luxcreo.cn/api/step/steptwo';

    const errorMessage = (message, error) => {
        console.log(error);
        ElMessage.error({
            message,
            duration: 5000,
            showClose: true
        });
        setIsLoading(false);
        setCurrentProgress('trimPointDefine');
    };

    const successMessage = (message) => {
        ElMessage.success({
            message,
            duration: 5000,
            showClose: true
        });
        MarkPointsOnMeshClassDispose();
    };

    const createOSSFormData = (data, key, file) => {
        const uploadData = new FormData();
        const { accessid, policy, callback, signature } = data;
        uploadData.append('OSSAccessKeyId', accessid);
        uploadData.append('policy', policy);
        uploadData.append('success_action_status', '200');
        uploadData.append('callback', callback);
        uploadData.append('Signature', signature);
        uploadData.append('key', key);
        uploadData.append('file', file);
        return uploadData;
    };

    const postTables = ({ meshKey, trimlineKey }) => {
        const { fid } = route.query;
        const { markPointPosition } = MarkPointsOnMeshClass.value;
        const data = new FormData();
        data.append('fid', fid);
        data.append('stl', meshKey);
        data.append('trimline', trimlineKey);
        const isNeedBase = isBase.value ? 1 : 0;
        data.append('NeedBase', isNeedBase);
        if (markPointPosition) {
            data.append('RefPosX', markPointPosition.x);
            data.append('RefPosY', markPointPosition.y);
            data.append('RefPosZ', markPointPosition.z);
        }
        alignerParams.forEach((el) => {
            const { key, value } = el;
            const objectsKey = `${key.replace(/^./, key[0].toUpperCase())}`;
            data.append(objectsKey, value);
        });
        axios
            .post(generateAlignerUrl, data)
            .then(() => {
                setIsLoading(false);
                successMessage(i18n.t('alignerloadingSuccess'));
            })
            .catch((error) => {
                errorMessage('postGenerateAlignerParametersError', error);
            });
    };

    const alignerPost = ({ meshKey, meshBlob, trimlineKey, trimlineBlob }) => {
        const customConfig = {
            headers: {
                'Content-Type': 'application/json'
            }
        };
        axios
            .get(ossUrl, customConfig)
            .then((response) => {
                const { data } = response;
                const { host } = data;
                const ossAxios = axios.create({
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    }
                });
                const meshFormData = createOSSFormData(data, meshKey, meshBlob);
                const trimlineFormData = createOSSFormData(data, trimlineKey, trimlineBlob);
                ossAxios
                    .post(host, trimlineFormData)
                    .then(() => {
                        const ossMeshAxios = axios.create({
                            headers: {
                                'Content-Type': 'multipart/form-data'
                            }
                        });
                        ossMeshAxios
                            .post(host, meshFormData)
                            .then(() => {
                                postTables({ meshKey, trimlineKey });
                            })
                            .catch((error) => {
                                errorMessage(i18n.t('alignerloadingFail'), error);
                            });
                    })
                    .catch((error) => {
                        errorMessage(i18n.t('alignerloadingFail'), error);
                    });
            })
            .catch((error) => {
                errorMessage(i18n.t('getOSSError'), error);
            });
    };

    return {
        alignerPost
    };
});