@dssp/dkpi 1.0.0-alpha.81 → 1.0.0-alpha.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/components/kpi-lookup-chart.js +45 -12
- package/dist-client/components/kpi-lookup-chart.js.map +1 -1
- package/dist-client/entries/auth/checkin.js +7 -2
- package/dist-client/entries/auth/checkin.js.map +1 -1
- package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +1 -1
- package/dist-client/pages/kpi-admin/kpi-system-guide.js +29 -21
- package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +5 -0
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +38 -20
- package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -1
- package/dist-client/pages/sv-project-completed-list.js +3 -3
- package/dist-client/pages/sv-project-completed-list.js.map +1 -1
- package/dist-client/pages/sv-project-detail.js +22 -16
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/pages/sv-project-list.d.ts +1 -0
- package/dist-client/pages/sv-project-list.js +3 -3
- package/dist-client/pages/sv-project-list.js.map +1 -1
- package/dist-client/pages/sv-project-update.d.ts +5 -0
- package/dist-client/pages/sv-project-update.js +81 -261
- package/dist-client/pages/sv-project-update.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/shared/complete-api.js +4 -1
- package/dist-client/shared/complete-api.js.map +1 -1
- package/dist-client/shared/geo-group-mapping.d.ts +25 -0
- package/dist-client/shared/geo-group-mapping.js +189 -0
- package/dist-client/shared/geo-group-mapping.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/menu-tools.js +39 -37
- package/dist-client/viewparts/menu-tools.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +22 -11
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +5 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +7 -10
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.js +16 -3
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo-group-mapping.js","sourceRoot":"","sources":["../../client/shared/geo-group-mapping.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geo_group 2자리 코드 ↔ 시도/시군구 매핑.\n * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS dict 를 TypeScript 로 이식.\n *\n * 운영자가 프로젝트 주소를 입력하면 그 안에서 시도+시군구 표준명을 부분 매칭하여\n * 2자리 코드를 추정. 자동 채움 후에도 운영자가 수동 정정 가능.\n */\n\n/**\n * 우편번호 prefix (2자리) → geo_group 2자리 코드 best-guess 매핑.\n * convert-augmented-xlsx-to-csv.py 의 GEO_GROUPS 세 번째 값 (postal_prefix) 기준,\n * 1:N 케이스는 첫 매칭 사용. 정확한 시군구 분리에는 한국 행정안전부 5자리 우편번호\n * 룩업 필요하지만 client embed 불가능 — best-guess 로 시도 단위 통계만 신뢰 가능.\n */\nexport const POSTAL_PREFIX_TO_GEO_GROUP: Record<string, string> = {\n '03': '01', // 서울 종로구\n '04': '02', // 서울 중구\n '05': '05', // 서울 광진구\n '06': '06', // 서울 강남구\n '07': '08', // 서울 강서구\n '10': '12', // 경기 고양시 / 파주시\n '11': '11', // 경기 성남시\n '12': '11', // 경기 성남시\n '13': '11', // 경기 성남시\n '14': '14', // 경기 부천시\n '15': '15', // 경기 안산시\n '16': '10', // 경기 수원시\n '17': '13', // 경기 용인시 / 평택시\n '18': '16', // 경기 화성시\n '21': '21', // 인천 남동구 / 부평구\n '22': '23', // 인천 서구\n '24': '24', // 강원 춘천시\n '25': '26', // 강원 강릉시\n '26': '25', // 강원 원주시\n '27': '28', // 충북 충주시 / 제천시\n '28': '27', // 충북 청주시\n '30': '30', // 세종\n '31': '31', // 충남 천안시 / 아산시\n '34': '35', // 대전 유성구\n '35': '34', // 대전 서구\n '36': '39', // 경북 안동시\n '37': '36', // 경북 포항시\n '38': '37', // 경북 경주시\n '39': '38', // 경북 구미시 / 김천시\n '41': '41', // 대구 중구\n '42': '42', // 대구 수성구 / 달서구\n '44': '44', // 울산 남구 / 중구\n '46': '49', // 부산 금정구\n '48': '46', // 부산 중구 / 해운대구\n '49': '48', // 부산 사하구\n '50': '51', // 경남 김해시 / 양산시\n '51': '50', // 경남 창원시\n '52': '52', // 경남 진주시\n '54': '54', // 전북 전주시 / 익산시 / 군산시\n '57': '59', // 전남 순천시\n '58': '57', // 전남 목포시\n '59': '58', // 전남 여수시\n '61': '61', // 광주 서구 / 북구\n '63': '63' // 제주\n}\n\nexport function inferGeoGroupFromPostalCode(postalCode: string | null | undefined): string | null {\n if (!postalCode) return null\n const prefix = postalCode.trim().slice(0, 2)\n return POSTAL_PREFIX_TO_GEO_GROUP[prefix] || null\n}\n\n/** \"시도+시군구 표준명\" → \"2자리 geo_group 코드\" */\nexport const ADDRESS_TO_GEO_GROUP: Record<string, string> = {\n '서울특별시 종로구': '01',\n '서울특별시 중구': '02',\n '서울특별시 용산구': '03',\n '서울특별시 성동구': '04',\n '서울특별시 광진구': '05',\n '서울특별시 강남구': '06',\n '서울특별시 송파구': '07',\n '서울특별시 강서구': '08',\n '경기도 수원시': '10',\n '경기도 성남시': '11',\n '경기도 고양시': '12',\n '경기도 용인시': '13',\n '경기도 부천시': '14',\n '경기도 안산시': '15',\n '경기도 화성시': '16',\n '경기도 평택시': '17',\n '경기도 파주시': '18',\n '인천광역시 남동구': '21',\n '인천광역시 부평구': '22',\n '인천광역시 서구': '23',\n '강원도 춘천시': '24',\n '강원도 원주시': '25',\n '강원도 강릉시': '26',\n '충청북도 청주시': '27',\n '충청북도 충주시': '28',\n '충청북도 제천시': '29',\n '세종특별자치시': '30',\n '충청남도 천안시': '31',\n '충청남도 아산시': '32',\n '강원도 속초시': '33',\n '대전광역시 서구': '34',\n '대전광역시 유성구': '35',\n '경상북도 포항시': '36',\n '경상북도 경주시': '37',\n '경상북도 구미시': '38',\n '경상북도 안동시': '39',\n '경상북도 김천시': '40',\n '대구광역시 중구': '41',\n '대구광역시 수성구': '42',\n '대구광역시 달서구': '43',\n '울산광역시 남구': '44',\n '울산광역시 중구': '45',\n '부산광역시 중구': '46',\n '부산광역시 해운대구': '47',\n '부산광역시 사하구': '48',\n '부산광역시 금정구': '49',\n '경상남도 창원시': '50',\n '경상남도 김해시': '51',\n '경상남도 진주시': '52',\n '경상남도 양산시': '53',\n '전라북도 전주시': '54',\n '전라북도 익산시': '55',\n '전라북도 군산시': '56',\n '전라남도 목포시': '57',\n '전라남도 여수시': '58',\n '전라남도 순천시': '59',\n '광주광역시 서구': '61',\n '광주광역시 북구': '62',\n '제주특별자치도 제주시': '63'\n}\n\n/** 시도 약칭 → 정식 명 (부분 매칭용). */\nconst PROVINCE_ALIASES: Record<string, string> = {\n 서울: '서울특별시',\n 경기: '경기도',\n 인천: '인천광역시',\n 강원: '강원도',\n 충북: '충청북도',\n 충남: '충청남도',\n 세종: '세종특별자치시',\n 대전: '대전광역시',\n 경북: '경상북도',\n 경남: '경상남도',\n 대구: '대구광역시',\n 울산: '울산광역시',\n 부산: '부산광역시',\n 전북: '전라북도',\n 전남: '전라남도',\n 광주: '광주광역시',\n 제주: '제주특별자치도'\n}\n\n/**\n * 주소 문자열에서 2자리 geo_group 코드 추정. 매칭 안 되면 null.\n * 매칭 우선:\n * 1) 정식 시도명 + 시군구명 (예: '서울특별시 종로구')\n * 2) 약칭 시도 + 시군구 (예: '서울 종로구' → '서울특별시 종로구')\n * 3) 시군구명 단독 매칭 (예: '종로구') — 유니크한 경우\n */\nexport function inferGeoGroupFromAddress(address: string | null | undefined): string | null {\n if (!address) return null\n const trimmed = address.trim()\n if (!trimmed) return null\n\n // 1) 정식 매칭\n for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {\n if (trimmed.includes(key)) return ADDRESS_TO_GEO_GROUP[key]\n }\n\n // 2) 약칭 시도 → 정식 시도로 expand 후 다시 매칭\n for (const [short, full] of Object.entries(PROVINCE_ALIASES)) {\n if (trimmed.startsWith(short) && !trimmed.startsWith(full)) {\n const expanded = trimmed.replace(short, full)\n for (const key of Object.keys(ADDRESS_TO_GEO_GROUP)) {\n if (expanded.includes(key)) return ADDRESS_TO_GEO_GROUP[key]\n }\n }\n }\n\n // 3) 시군구명 단독 매칭 (시도 prefix 없는 경우). 유니크한 시군구만 통과.\n const districtMatches = Object.entries(ADDRESS_TO_GEO_GROUP)\n .filter(([key]) => {\n const parts = key.split(' ')\n const district = parts[parts.length - 1]\n return trimmed.includes(district)\n })\n .map(([, code]) => code)\n const uniqueDistrictCodes = Array.from(new Set(districtMatches))\n if (uniqueDistrictCodes.length === 1) return uniqueDistrictCodes[0]\n\n return null\n}\n"]}
|