feat: get submit target store, representative user emails
This commit is contained in:
parent
a9ef91a430
commit
f5022ab423
@ -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
|
# NEXT_PUBLIC_QSP_API_URL=https://jp-dev.qsalesplatform.com
|
||||||
|
|
||||||
#1:1문의 api
|
#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)
|
EMAIL_TITLE_PREFIX=(System Test)
|
||||||
|
|
||||||
|
|||||||
@ -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
|
# NEXT_PUBLIC_QSP_API_URL=https://jp-dev.qsalesplatform.com
|
||||||
|
|
||||||
#1:1문의 api
|
#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=
|
EMAIL_TITLE_PREFIX=
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@ type AdminSubPerson = {
|
|||||||
eMail: string
|
eMail: string
|
||||||
authority: string
|
authority: string
|
||||||
}
|
}
|
||||||
|
// 2차점이 자신에게 매핑 된 1차 판매점과 관리자 정보 조회
|
||||||
export async function GET(request: NextRequest) {
|
export async function GET(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { searchParams } = new URL(request.url)
|
const { searchParams } = new URL(request.url)
|
||||||
@ -16,17 +16,18 @@ export async function GET(request: NextRequest) {
|
|||||||
const query = `
|
const query = `
|
||||||
OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP;
|
OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP;
|
||||||
SELECT
|
SELECT
|
||||||
MCS.STORE_ID
|
MCS.STORE_ID AS targetStoreId
|
||||||
, MCP.EOS_LOGIN_ID AS USER_ID
|
, MCS.STORE_QCAST_NM AS targetStoreNm
|
||||||
, CONVERT(NVARCHAR(100), DecryptByKey(MCP.EMAIL)) AS E_MAIL
|
, MCP.EOS_LOGIN_ID AS repUserId
|
||||||
, MCP.AUTHORITY
|
, CONVERT(NVARCHAR(100), DecryptByKey(MCP.EMAIL)) AS repUserEmail
|
||||||
|
, MCP.AUTHORITY AS auth
|
||||||
FROM MS_CUST_STOREID MCS WITH(NOLOCK)
|
FROM MS_CUST_STOREID MCS WITH(NOLOCK)
|
||||||
LEFT OUTER JOIN MS_CUST_PERSON MCP WITH(NOLOCK)
|
LEFT OUTER JOIN MS_CUST_PERSON MCP WITH(NOLOCK)
|
||||||
ON MCS.COMP_CD = MCP.COMP_CD
|
ON MCS.COMP_CD = MCP.COMP_CD
|
||||||
AND MCS.STORE_ID = MCP.STORE_ID
|
AND MCS.STORE_ID = MCP.STORE_ID
|
||||||
AND MCP.DEL_YN = 'N'
|
AND MCP.DEL_YN = 'N'
|
||||||
WHERE MCS.COMP_CD = '5200'
|
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 MCP.EMAIL IS NOT NULL
|
||||||
AND MCS.DEL_YN = 'N';
|
AND MCS.DEL_YN = 'N';
|
||||||
CLOSE SYMMETRIC KEY SYMMETRICKEY;
|
CLOSE SYMMETRIC KEY SYMMETRICKEY;
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { prisma } from '@/libs/prisma'
|
import { prisma } from '@/libs/prisma'
|
||||||
|
import { SubmitTargetResponse } from '@/types/Survey'
|
||||||
import { NextRequest, NextResponse } from 'next/server'
|
import { NextRequest, NextResponse } from 'next/server'
|
||||||
|
|
||||||
type BuilderPerson = {
|
type BuilderPerson = {
|
||||||
@ -8,6 +9,8 @@ type BuilderPerson = {
|
|||||||
userAuthCd: string
|
userAuthCd: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2차점의 시공권한 user가 해당 판매점의 관리자 정보 조회
|
||||||
|
// N == 일반유저, S == 수퍼유저, B == 시공권한유저
|
||||||
export async function GET(request: NextRequest) {
|
export async function GET(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { searchParams } = new URL(request.url)
|
const { searchParams } = new URL(request.url)
|
||||||
@ -16,25 +19,28 @@ export async function GET(request: NextRequest) {
|
|||||||
const query = `
|
const query = `
|
||||||
OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP;
|
OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP;
|
||||||
SELECT
|
SELECT
|
||||||
MCAS.AGENCY_STORE_ID
|
MCAS.AGENCY_STORE_ID AS targetStoreId
|
||||||
, BQU.USER_ID
|
, MCAS.AGENCY_QCAST_NM AS targetStoreNm
|
||||||
, CONVERT(NVARCHAR(100), DecryptByKey(BQU.EMAIL)) AS E_MAIL
|
, BQU.USER_ID AS repUserId
|
||||||
, BQU.USER_AUTH_CD
|
, CONVERT(NVARCHAR(100), DecryptByKey(BQU.EMAIL)) AS repUserEmail
|
||||||
|
, BQU.USER_AUTH_CD AS auth
|
||||||
FROM MS_CUST_AGENCY_STOREID MCAS WITH(NOLOCK)
|
FROM MS_CUST_AGENCY_STOREID MCAS WITH(NOLOCK)
|
||||||
LEFT OUTER JOIN BC_QM_USER BQU WITH(NOLOCK)
|
LEFT OUTER JOIN BC_QM_USER BQU WITH(NOLOCK)
|
||||||
ON MCAS.COMP_CD = BQU.COMP_CD
|
ON MCAS.COMP_CD = BQU.COMP_CD
|
||||||
AND MCAS.AGENCY_STORE_ID = BQU.AGENCY_STORE_ID
|
AND MCAS.AGENCY_STORE_ID = BQU.AGENCY_STORE_ID
|
||||||
AND MCAS.DEL_YN = 'N'
|
AND MCAS.DEL_YN = 'N'
|
||||||
WHERE MCAS.COMP_CD = '5200'
|
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.EMAIL IS NOT NULL
|
||||||
AND BQU.USER_AUTH_CD != 'B'
|
AND BQU.USER_AUTH_CD != 'B'
|
||||||
AND MCAS.DEL_YN = 'N';
|
AND MCAS.DEL_YN = 'N';
|
||||||
CLOSE SYMMETRIC KEY SYMMETRICKEY;
|
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) {
|
} catch (error) {
|
||||||
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
|
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
|
||||||
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })
|
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })
|
||||||
|
|||||||
@ -15,7 +15,7 @@ interface SubmitFormData {
|
|||||||
targetNm: string | null
|
targetNm: string | null
|
||||||
sender: string
|
sender: string
|
||||||
receiver: string[] | string
|
receiver: string[] | string
|
||||||
reference: string | null
|
reference: string[] | null
|
||||||
title: string
|
title: string
|
||||||
contents: string | null
|
contents: string | null
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ export default function SurveySaleSubmitPopup() {
|
|||||||
|
|
||||||
const { setIsShow } = useSpinnerStore()
|
const { setIsShow } = useSpinnerStore()
|
||||||
const { getCommCode } = useCommCode()
|
const { getCommCode } = useCommCode()
|
||||||
const { surveyDetail } = useSurvey(Number(routeId))
|
const { surveyDetail, getSubmitTarget } = useSurvey(Number(routeId))
|
||||||
|
|
||||||
const [submitData, setSubmitData] = useState<SubmitFormData>({
|
const [submitData, setSubmitData] = useState<SubmitFormData>({
|
||||||
saleBase: null,
|
saleBase: null,
|
||||||
@ -54,11 +54,25 @@ export default function SurveySaleSubmitPopup() {
|
|||||||
getCommCode('SALES_OFFICE_CD').then((codes) => {
|
getCommCode('SALES_OFFICE_CD').then((codes) => {
|
||||||
setCommCodeList(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({
|
setSubmitData({
|
||||||
...submitData,
|
...submitData,
|
||||||
targetId: session?.role === 'Builder' ? surveyDetail?.storeId ?? null : null,
|
|
||||||
targetNm: session?.role === 'Builder' ? surveyDetail?.store ?? null : null,
|
|
||||||
sender: session?.email ?? '',
|
sender: session?.email ?? '',
|
||||||
title: '[HANASYS現地調査] 調査物件が提出. (' + surveyDetail?.srlNo + ')',
|
title: '[HANASYS現地調査] 調査物件が提出. (' + surveyDetail?.srlNo + ')',
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import type { SurveyBasicInfo, SurveyDetailRequest, SurveyRegistRequest } from '@/types/Survey'
|
import type { SubmitTargetResponse, SurveyBasicInfo, SurveyDetailRequest, SurveyRegistRequest } from '@/types/Survey'
|
||||||
import { useMemo, useEffect } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
||||||
import { useSurveyFilterStore } from '@/store/surveyFilterStore'
|
import { useSurveyFilterStore } from '@/store/surveyFilterStore'
|
||||||
import { useSessionStore } from '@/store/session'
|
import { useSessionStore } from '@/store/session'
|
||||||
@ -71,6 +71,7 @@ export function useSurvey(id?: number): {
|
|||||||
validateSurveyDetail: (surveyDetail: SurveyDetailRequest) => string
|
validateSurveyDetail: (surveyDetail: SurveyDetailRequest) => string
|
||||||
getZipCode: (zipCode: string) => Promise<ZipCode[] | null>
|
getZipCode: (zipCode: string) => Promise<ZipCode[] | null>
|
||||||
refetchSurveyList: () => void
|
refetchSurveyList: () => void
|
||||||
|
getSubmitTarget: (params: { storeId: string; role: string }) => Promise<SubmitTargetResponse[] | null>
|
||||||
} {
|
} {
|
||||||
const queryClient = useQueryClient()
|
const queryClient = useQueryClient()
|
||||||
const { keyword, searchOption, isMySurvey, sort, offset } = useSurveyFilterStore()
|
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<SubmitTargetResponse[] | null> => {
|
||||||
|
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<SubmitTargetResponse[]>(endpoint)
|
||||||
|
return data
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('Failed to fetch submit target:', error)
|
||||||
|
alert(error.response?.data.error || 'データの取得に失敗しました。')
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
surveyList: surveyData.data,
|
surveyList: surveyData.data,
|
||||||
surveyDetail: surveyDetail as SurveyBasicInfo | null,
|
surveyDetail: surveyDetail as SurveyBasicInfo | null,
|
||||||
@ -293,6 +321,7 @@ export function useSurvey(id?: number): {
|
|||||||
submitSurvey,
|
submitSurvey,
|
||||||
validateSurveyDetail,
|
validateSurveyDetail,
|
||||||
getZipCode,
|
getZipCode,
|
||||||
|
getSubmitTarget,
|
||||||
refetchSurveyList,
|
refetchSurveyList,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -146,3 +146,11 @@ export type SurveyRegistRequest = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type Mode = 'CREATE' | 'EDIT' | 'READ' | 'TEMP' // 등록 | 수정 | 상세 | 임시저장
|
export type Mode = 'CREATE' | 'EDIT' | 'READ' | 'TEMP' // 등록 | 수정 | 상세 | 임시저장
|
||||||
|
|
||||||
|
export type SubmitTargetResponse = {
|
||||||
|
targetStoreId: string
|
||||||
|
targetStoreNm: string
|
||||||
|
repUserId: string
|
||||||
|
repUserEmail: string
|
||||||
|
auth: string
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user