From f5022ab4239abe438ec0866b438988af17e4acc0 Mon Sep 17 00:00:00 2001 From: keyy1315 Date: Thu, 5 Jun 2025 18:06:04 +0900 Subject: [PATCH] feat: get submit target store, representative user emails --- .env.development | 3 +- .env.localhost | 3 +- src/app/api/submission/admin-sub/route.ts | 13 ++++---- src/app/api/submission/builder/route.ts | 20 +++++++---- .../popup/SurveySaleSubmitPopup.tsx | 22 ++++++++++--- src/hooks/useSurvey.ts | 33 +++++++++++++++++-- src/types/Survey.ts | 8 +++++ 7 files changed, 81 insertions(+), 21 deletions(-) diff --git a/.env.development b/.env.development index 919d6f9..86dd24a 100644 --- a/.env.development +++ b/.env.development @@ -9,7 +9,8 @@ NEXT_PUBLIC_QSP_API_URL=http://121.168.9.37:8080 # NEXT_PUBLIC_QSP_API_URL=https://jp-dev.qsalesplatform.com #1:1문의 api -NEXT_PUBLIC_INQUIRY_API_URL=https://jp-dev.qsalesplatform.com +# NEXT_PUBLIC_INQUIRY_API_URL=https://jp-dev.qsalesplatform.com +NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:8120 EMAIL_TITLE_PREFIX=(System Test) diff --git a/.env.localhost b/.env.localhost index eb993b5..089e14e 100644 --- a/.env.localhost +++ b/.env.localhost @@ -9,7 +9,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120 # NEXT_PUBLIC_QSP_API_URL=https://jp-dev.qsalesplatform.com #1:1문의 api -NEXT_PUBLIC_INQUIRY_API_URL=https://jp-dev.qsalesplatform.com +# NEXT_PUBLIC_INQUIRY_API_URL=https://jp-dev.qsalesplatform.com +NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:8120 EMAIL_TITLE_PREFIX= diff --git a/src/app/api/submission/admin-sub/route.ts b/src/app/api/submission/admin-sub/route.ts index 4309e22..c8c30f3 100644 --- a/src/app/api/submission/admin-sub/route.ts +++ b/src/app/api/submission/admin-sub/route.ts @@ -7,7 +7,7 @@ type AdminSubPerson = { eMail: string authority: string } - +// 2차점이 자신에게 매핑 된 1차 판매점과 관리자 정보 조회 export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url) @@ -16,17 +16,18 @@ export async function GET(request: NextRequest) { const query = ` OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP; SELECT - MCS.STORE_ID - , MCP.EOS_LOGIN_ID AS USER_ID - , CONVERT(NVARCHAR(100), DecryptByKey(MCP.EMAIL)) AS E_MAIL - , MCP.AUTHORITY + MCS.STORE_ID AS targetStoreId + , MCS.STORE_QCAST_NM AS targetStoreNm + , MCP.EOS_LOGIN_ID AS repUserId + , CONVERT(NVARCHAR(100), DecryptByKey(MCP.EMAIL)) AS repUserEmail + , MCP.AUTHORITY AS auth FROM MS_CUST_STOREID MCS WITH(NOLOCK) LEFT OUTER JOIN MS_CUST_PERSON MCP WITH(NOLOCK) ON MCS.COMP_CD = MCP.COMP_CD AND MCS.STORE_ID = MCP.STORE_ID AND MCP.DEL_YN = 'N' WHERE MCS.COMP_CD = '5200' - AND MCS.STORE_ID = (SELECT STORE_ID FROM MS_CUST_AGENCY_STOREID WHERE AGENCY_STORE_ID = '201T01' AND DEL_YN = 'N') + AND MCS.STORE_ID = (SELECT STORE_ID FROM MS_CUST_AGENCY_STOREID WHERE AGENCY_STORE_ID = '${id}' AND DEL_YN = 'N') AND MCP.EMAIL IS NOT NULL AND MCS.DEL_YN = 'N'; CLOSE SYMMETRIC KEY SYMMETRICKEY; diff --git a/src/app/api/submission/builder/route.ts b/src/app/api/submission/builder/route.ts index 9e1c5cc..41c66ce 100644 --- a/src/app/api/submission/builder/route.ts +++ b/src/app/api/submission/builder/route.ts @@ -1,4 +1,5 @@ import { prisma } from '@/libs/prisma' +import { SubmitTargetResponse } from '@/types/Survey' import { NextRequest, NextResponse } from 'next/server' type BuilderPerson = { @@ -8,6 +9,8 @@ type BuilderPerson = { userAuthCd: string } +// 2차점의 시공권한 user가 해당 판매점의 관리자 정보 조회 +// N == 일반유저, S == 수퍼유저, B == 시공권한유저 export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url) @@ -16,25 +19,28 @@ export async function GET(request: NextRequest) { const query = ` OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP; SELECT - MCAS.AGENCY_STORE_ID - , BQU.USER_ID - , CONVERT(NVARCHAR(100), DecryptByKey(BQU.EMAIL)) AS E_MAIL - , BQU.USER_AUTH_CD + MCAS.AGENCY_STORE_ID AS targetStoreId + , MCAS.AGENCY_QCAST_NM AS targetStoreNm + , BQU.USER_ID AS repUserId + , CONVERT(NVARCHAR(100), DecryptByKey(BQU.EMAIL)) AS repUserEmail + , BQU.USER_AUTH_CD AS auth FROM MS_CUST_AGENCY_STOREID MCAS WITH(NOLOCK) LEFT OUTER JOIN BC_QM_USER BQU WITH(NOLOCK) ON MCAS.COMP_CD = BQU.COMP_CD AND MCAS.AGENCY_STORE_ID = BQU.AGENCY_STORE_ID AND MCAS.DEL_YN = 'N' WHERE MCAS.COMP_CD = '5200' - AND MCAS.AGENCY_STORE_ID = '201T01' + AND MCAS.AGENCY_STORE_ID = '${id}' AND BQU.EMAIL IS NOT NULL AND BQU.USER_AUTH_CD != 'B' AND MCAS.DEL_YN = 'N'; CLOSE SYMMETRIC KEY SYMMETRICKEY; ` - const suitable: BuilderPerson[] = await prisma.$queryRawUnsafe(query) + // const suitable: BuilderPerson[] = await prisma.$queryRawUnsafe(query) - return NextResponse.json({ message: 'Hello, world!' }) + // return NextResponse.json({ message: 'Hello, world!' }) + const data: SubmitTargetResponse[] = await prisma.$queryRawUnsafe(query) + return NextResponse.json(data) } catch (error) { console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error) return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 }) diff --git a/src/components/popup/SurveySaleSubmitPopup.tsx b/src/components/popup/SurveySaleSubmitPopup.tsx index e064628..ce6be9e 100644 --- a/src/components/popup/SurveySaleSubmitPopup.tsx +++ b/src/components/popup/SurveySaleSubmitPopup.tsx @@ -15,7 +15,7 @@ interface SubmitFormData { targetNm: string | null sender: string receiver: string[] | string - reference: string | null + reference: string[] | null title: string contents: string | null } @@ -34,7 +34,7 @@ export default function SurveySaleSubmitPopup() { const { setIsShow } = useSpinnerStore() const { getCommCode } = useCommCode() - const { surveyDetail } = useSurvey(Number(routeId)) + const { surveyDetail, getSubmitTarget } = useSurvey(Number(routeId)) const [submitData, setSubmitData] = useState({ saleBase: null, @@ -54,11 +54,25 @@ export default function SurveySaleSubmitPopup() { getCommCode('SALES_OFFICE_CD').then((codes) => { setCommCodeList(codes) }) + } else if (session?.role === 'Builder' || session?.role === 'Admin_Sub') { + getSubmitTarget({ storeId: surveyDetail?.storeId ?? '', role: session?.role ?? '' }).then((data) => { + if (data) { + setSubmitData({ + ...submitData, + targetId: data[0].targetStoreId, + targetNm: data[0].targetStoreNm, + }) + data.length > 1 && + setSubmitData({ + ...submitData, + receiver: data.filter((item) => item.auth === 'S').map((item) => item.repUserEmail), + reference: data.filter((item) => item.auth === 'N').map((item) => item.repUserEmail), + }) + } + }) } setSubmitData({ ...submitData, - targetId: session?.role === 'Builder' ? surveyDetail?.storeId ?? null : null, - targetNm: session?.role === 'Builder' ? surveyDetail?.store ?? null : null, sender: session?.email ?? '', title: '[HANASYS現地調査] 調査物件が提出. (' + surveyDetail?.srlNo + ')', }) diff --git a/src/hooks/useSurvey.ts b/src/hooks/useSurvey.ts index 20f304c..1fc4994 100644 --- a/src/hooks/useSurvey.ts +++ b/src/hooks/useSurvey.ts @@ -1,5 +1,5 @@ -import type { SurveyBasicInfo, SurveyDetailRequest, SurveyRegistRequest } from '@/types/Survey' -import { useMemo, useEffect } from 'react' +import type { SubmitTargetResponse, SurveyBasicInfo, SurveyDetailRequest, SurveyRegistRequest } from '@/types/Survey' +import { useMemo } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useSurveyFilterStore } from '@/store/surveyFilterStore' import { useSessionStore } from '@/store/session' @@ -71,6 +71,7 @@ export function useSurvey(id?: number): { validateSurveyDetail: (surveyDetail: SurveyDetailRequest) => string getZipCode: (zipCode: string) => Promise refetchSurveyList: () => void + getSubmitTarget: (params: { storeId: string; role: string }) => Promise } { const queryClient = useQueryClient() const { keyword, searchOption, isMySurvey, sort, offset } = useSurveyFilterStore() @@ -278,6 +279,33 @@ export function useSurvey(id?: number): { } } + const getSubmitTarget = async (params: { storeId: string; role: string }): Promise => { + try { + if (!params.storeId) { + alert('販売店IDがありません。') + return null + } + + const endpoints = { + Admin_Sub: `/api/submission/admin-sub?id=${params.storeId}`, + Builder: `/api/submission/builder?id=${params.storeId}`, + } as const + + const endpoint = endpoints[params.role as keyof typeof endpoints] + if (!endpoint) { + alert('権限が間違っています。') + return null + } + + const { data } = await axiosInstance(null).get(endpoint) + return data + } catch (error: any) { + console.error('Failed to fetch submit target:', error) + alert(error.response?.data.error || 'データの取得に失敗しました。') + return null + } + } + return { surveyList: surveyData.data, surveyDetail: surveyDetail as SurveyBasicInfo | null, @@ -293,6 +321,7 @@ export function useSurvey(id?: number): { submitSurvey, validateSurveyDetail, getZipCode, + getSubmitTarget, refetchSurveyList, } } diff --git a/src/types/Survey.ts b/src/types/Survey.ts index 2db1034..7128926 100644 --- a/src/types/Survey.ts +++ b/src/types/Survey.ts @@ -146,3 +146,11 @@ export type SurveyRegistRequest = { } export type Mode = 'CREATE' | 'EDIT' | 'READ' | 'TEMP' // 등록 | 수정 | 상세 | 임시저장 + +export type SubmitTargetResponse = { + targetStoreId: string + targetStoreNm: string + repUserId: string + repUserEmail: string + auth: string +}