import { 
 | 
  ParkCustomersCountEnum, 
 | 
  ServiceWorkerCountEnum, 
 | 
  ParkCustomersCountTextToEnum, 
 | 
  ServiceWorkerCountTextToEnum, 
 | 
} from '@/constants'; 
 | 
import dayjs from 'dayjs'; 
 | 
import axios from 'axios'; 
 | 
import { loadEnv } from '@build/index'; 
 | 
import { setOSSLink as boleSetOSSLink } from '@bole-core/core'; 
 | 
import _ from 'lodash'; 
 | 
  
 | 
export const CompanyXLSXHeaderMap = { 
 | 
  belongPark: '所属园区', 
 | 
  enterpriseName: '企业名称', 
 | 
  societyCreditCode: '社会统一信用代码', 
 | 
  contact: '联系人', 
 | 
  contactPhone: '联系电话(手机号)', 
 | 
  legalPersonName: '法人姓名', 
 | 
  address: '所属区域(省/市/地)', 
 | 
  setUpDate: '成立时间', 
 | 
  parkCustomersCount: '服务客户数量【家数】', 
 | 
  serviceWorkerCount: '服务劳工数量【人数】', 
 | 
  serveSetting: '企业服务类型', 
 | 
  hrLicenseUrl: '人力资源服务许可证(图片)', 
 | 
  licenseUrl: '营业执照(图片)', 
 | 
}; 
 | 
  
 | 
type CompanyXLSXItem = { 
 | 
  belongPark: string; 
 | 
  enterpriseName: string; 
 | 
  societyCreditCode: string; 
 | 
  contact: string; 
 | 
  contactPhone: string; 
 | 
  legalPersonName: string; 
 | 
  address: API.HRAreaDto[]; 
 | 
  setUpDate: number; 
 | 
  parkCustomersCount: ParkCustomersCountEnum; 
 | 
  serviceWorkerCount: ServiceWorkerCountEnum; 
 | 
  serveSetting: string[]; 
 | 
  hrLicenseUrl: string; 
 | 
  licenseUrl: string; 
 | 
}; 
 | 
  
 | 
type CompanyXLSXItemV2 = { 
 | 
  [key in keyof typeof CompanyXLSXHeaderMap]: string; 
 | 
}; 
 | 
  
 | 
export type YZALLCompanyListRes = { 
 | 
  AlternativeName1: string; 
 | 
  RZSrc: string; 
 | 
  YYSrc: string; 
 | 
  CertificateTypeId: YZCertificateType; 
 | 
}[]; 
 | 
  
 | 
enum YZCertificateType { 
 | 
  HRLicense = '10', 
 | 
  License = '30', 
 | 
} 
 | 
  
 | 
export async function getYZALLCompanyList() { 
 | 
  try { 
 | 
    let res = await axios.get<YZALLCompanyListRes>('/1823555004544454656'); 
 | 
    return res.data; 
 | 
  } catch (error) {} 
 | 
} 
 | 
  
 | 
const { VITE_WEMAP_KEY } = loadEnv(); 
 | 
  
 | 
interface AddressResolveByWeMapRes { 
 | 
  status: number; 
 | 
  message: 'Success'; 
 | 
  request_id: string; 
 | 
  result: { 
 | 
    title: string; 
 | 
    location: { 
 | 
      lng: number; 
 | 
      lat: number; 
 | 
    }; 
 | 
    ad_info: { 
 | 
      adcode: string; 
 | 
    }; 
 | 
    address_components: { 
 | 
      province: string; 
 | 
      city: string; 
 | 
      district: string; 
 | 
      street: string; 
 | 
      street_number: string; 
 | 
    }; 
 | 
    similarity: number; 
 | 
    deviation: number; 
 | 
    reliability: number; 
 | 
    level: number; 
 | 
  }; 
 | 
} 
 | 
  
 | 
const DefaultAddress = { 
 | 
  provinceName: '浙江省', 
 | 
  cityName: '宁波市', 
 | 
  areaName: '鄞州区', 
 | 
}; 
 | 
  
 | 
export async function getAddressResolveByWeMap(address: string) { 
 | 
  try { 
 | 
    let res = await axios.get<AddressResolveByWeMapRes>('/v1', { 
 | 
      params: { 
 | 
        key: VITE_WEMAP_KEY, 
 | 
        address: address, 
 | 
      }, 
 | 
    }); 
 | 
    const address_components = res.data.result?.address_components; 
 | 
    if ( 
 | 
      res.data.status === 0 && 
 | 
      address_components.province && 
 | 
      address_components.city && 
 | 
      address_components.district 
 | 
    ) { 
 | 
      return { 
 | 
        provinceName: address_components.province, 
 | 
        cityName: address_components.city, 
 | 
        areaName: address_components.district, 
 | 
      }; 
 | 
    } else { 
 | 
      return DefaultAddress; 
 | 
    } 
 | 
  } catch (error) { 
 | 
    return DefaultAddress; 
 | 
  } 
 | 
} 
 | 
  
 | 
function getAddressResolve(address: string) { 
 | 
  let nameList = address.match( 
 | 
    /.+?(省|行政区|市|自治区|自治州|行政单位|盟|市辖区|旗|海域|岛|县|区)/g 
 | 
  ); 
 | 
  if (nameList) { 
 | 
    if (nameList?.length === 2) { 
 | 
      return { 
 | 
        provinceName: nameList[0], 
 | 
        cityName: nameList[0], 
 | 
        areaName: nameList[1], 
 | 
      }; 
 | 
    } else { 
 | 
      return { 
 | 
        provinceName: nameList[0], 
 | 
        cityName: nameList[1], 
 | 
        areaName: nameList[2], 
 | 
      }; 
 | 
    } 
 | 
  } 
 | 
  return DefaultAddress; 
 | 
} 
 | 
  
 | 
type ConvertCompanyXLSXDataOptions = { 
 | 
  companyXLSXList: { [K in keyof typeof CompanyXLSXHeaderMap]: string }[]; 
 | 
  parkServeType?: API.GetTypeSearchSettingList[]; 
 | 
  findAreaCodeFromName: (areaName: string) => number; 
 | 
  YZALLCompanyList: YZALLCompanyListRes; 
 | 
}; 
 | 
  
 | 
export function exportCompanyXLSXV2({ 
 | 
  companyXLSXList, 
 | 
  findAreaCodeFromName, 
 | 
  YZALLCompanyList, 
 | 
}: ConvertCompanyXLSXDataOptions) { 
 | 
  const resolveSuccessList: CompanyXLSXItemV2[] = []; 
 | 
  const resolveFailList: Record<string, string>[] = []; 
 | 
  
 | 
  const companyXLSXListChunks = _.chunk(companyXLSXList, 20); 
 | 
  
 | 
  for (const chunk of companyXLSXListChunks) { 
 | 
    for (const companyXLSXListItem of chunk) { 
 | 
      let _address = getAddressResolve(companyXLSXListItem.address); 
 | 
      // let _address = await new Promise<{ 
 | 
      //   provinceName: string; 
 | 
      //   cityName: string; 
 | 
      //   areaName: string; 
 | 
      // }>((resolve) => { 
 | 
      //   resolve({ 
 | 
      //     provinceName: '', 
 | 
      //     cityName: '', 
 | 
      //     areaName: '', 
 | 
      //   }); 
 | 
      // }); 
 | 
  
 | 
      let address: API.HRAreaDto = { 
 | 
        provinceCode: findAreaCodeFromName(_address.provinceName), 
 | 
        cityCode: findAreaCodeFromName(_address.cityName), 
 | 
        areaCode: findAreaCodeFromName(_address.areaName), 
 | 
        provinceName: _address.provinceName, 
 | 
        cityName: _address.cityName, 
 | 
        areaName: _address.areaName, 
 | 
        sort: 1, 
 | 
      }; 
 | 
      if (Object.values(address).some((x) => !x)) { 
 | 
        address.provinceCode = findAreaCodeFromName(DefaultAddress.provinceName); 
 | 
        address.cityCode = findAreaCodeFromName(DefaultAddress.cityName); 
 | 
        address.areaCode = findAreaCodeFromName(DefaultAddress.areaName); 
 | 
        address.provinceName = DefaultAddress.provinceName; 
 | 
        address.cityName = DefaultAddress.cityName; 
 | 
        address.areaName = DefaultAddress.areaName; 
 | 
      } 
 | 
  
 | 
      const address2 = [address.provinceName, address.cityName, address.areaName] 
 | 
        .filter(Boolean) 
 | 
        .join(','); 
 | 
  
 | 
      const YZCompany = YZALLCompanyList.find( 
 | 
        (c) => c.AlternativeName1 === companyXLSXListItem.enterpriseName && c.RZSrc && c.YYSrc 
 | 
      ); 
 | 
  
 | 
      if (!YZCompany) { 
 | 
        resolveFailList.push(companyXLSXListItem); 
 | 
        continue; 
 | 
      } 
 | 
  
 | 
      resolveSuccessList.push({ 
 | 
        ...companyXLSXListItem, 
 | 
        setUpDate: dayjs(companyXLSXListItem.setUpDate).year() + '', 
 | 
        hrLicenseUrl: YZCompany?.RZSrc 
 | 
          ? boleSetOSSLink(YZCompany.RZSrc, 'https://waterdropcloud.oss-cn-hangzhou.aliyuncs.com/') 
 | 
          : '', 
 | 
        licenseUrl: YZCompany?.YYSrc 
 | 
          ? boleSetOSSLink(YZCompany.YYSrc, 'https://waterdropcloud.oss-cn-hangzhou.aliyuncs.com/') 
 | 
          : '', 
 | 
        address: address2, 
 | 
      } as CompanyXLSXItemV2); 
 | 
    } 
 | 
  
 | 
    // await new Promise((resolve) => setTimeout(resolve, 2000)); 
 | 
  } 
 | 
  
 | 
  return { 
 | 
    resolveSuccessList, 
 | 
    resolveFailList, 
 | 
  }; 
 | 
} 
 | 
  
 | 
export function convertCompanyXLSXData({ 
 | 
  companyXLSXList, 
 | 
  parkServeType, 
 | 
  findAreaCodeFromName, 
 | 
}: ConvertCompanyXLSXDataOptions) { 
 | 
  const resolveSuccessList: CompanyXLSXItem[] = []; 
 | 
  const resolveFailList: Record<string, string>[] = []; 
 | 
  
 | 
  for (const companyXLSXListItem of companyXLSXList) { 
 | 
    let _address = companyXLSXListItem.address.split(','); 
 | 
    let address: API.HRAreaDto = { 
 | 
      provinceCode: findAreaCodeFromName(_address[0]), 
 | 
      cityCode: findAreaCodeFromName(_address[1]), 
 | 
      areaCode: findAreaCodeFromName(_address[2]), 
 | 
      provinceName: _address[0], 
 | 
      cityName: _address[1], 
 | 
      areaName: _address[2], 
 | 
      sort: 1, 
 | 
    }; 
 | 
    if (Object.values(address).some((x) => !x)) { 
 | 
      address.provinceCode = findAreaCodeFromName(DefaultAddress.provinceName); 
 | 
      address.cityCode = findAreaCodeFromName(DefaultAddress.cityName); 
 | 
      address.areaCode = findAreaCodeFromName(DefaultAddress.areaName); 
 | 
      address.provinceName = DefaultAddress.provinceName; 
 | 
      address.cityName = DefaultAddress.cityName; 
 | 
      address.areaName = DefaultAddress.areaName; 
 | 
    } 
 | 
  
 | 
    resolveSuccessList.push({ 
 | 
      ...companyXLSXListItem, 
 | 
      setUpDate: dayjs(companyXLSXListItem.setUpDate).year(), 
 | 
      parkCustomersCount: ParkCustomersCountTextToEnum[companyXLSXListItem.parkCustomersCount], 
 | 
      serviceWorkerCount: ServiceWorkerCountTextToEnum[companyXLSXListItem.serviceWorkerCount], 
 | 
      serveSetting: companyXLSXListItem.serveSetting 
 | 
        .split('、') 
 | 
        .map((s) => parkServeType.find((p) => p.name === s)?.id ?? ''), 
 | 
      address: [address], 
 | 
    } as CompanyXLSXItem); 
 | 
  } 
 | 
  
 | 
  return { 
 | 
    resolveSuccessList, 
 | 
    resolveFailList, 
 | 
  }; 
 | 
} 
 |