feat: add builderId field in session

- 세션에 buildId 필드 추가
- 조사매물 목록 조회 에러 핸들링 추가
This commit is contained in:
Dayoung 2025-06-04 18:05:50 +09:00
parent 64a643e619
commit 8c278b01c6
8 changed files with 65 additions and 24 deletions

View File

@ -13,7 +13,7 @@ interface Survey {
interface SessionParams {
role: string | null
storeId: string | null
builderNo: string | null
builderId: string | null
isLoggedIn: string | null
}
@ -37,9 +37,9 @@ const checkAdminSubRole = (survey: Survey, storeId: string | null): boolean => {
return survey.STORE_ID === storeId && survey.CONSTRUCTION_POINT_ID === null
}
const checkPartnerOrBuilderRole = (survey: Survey, builderNo: string | null): boolean => {
if (!builderNo) return false
return survey.CONSTRUCTION_POINT_ID === builderNo
const checkPartnerOrBuilderRole = (survey: Survey, builderId: string | null): boolean => {
if (!builderId) return false
return survey.CONSTRUCTION_POINT_ID === builderId
}
const checkRole = (survey: Survey, sessionParams: SessionParams): boolean => {
@ -58,7 +58,7 @@ const checkRole = (survey: Survey, sessionParams: SessionParams): boolean => {
case 'Partner':
// 2차점 시공권한 user
case 'Builder':
return checkPartnerOrBuilderRole(survey, sessionParams.builderNo)
return checkPartnerOrBuilderRole(survey, sessionParams.builderId)
default:
return false
}
@ -72,7 +72,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
const sessionParams: SessionParams = {
role: searchParams.get('role'),
storeId: searchParams.get('storeId'),
builderNo: searchParams.get('builderNo'),
builderId: searchParams.get('builderId'),
isLoggedIn: searchParams.get('isLoggedIn'),
}
// @ts-ignore
@ -87,7 +87,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
if (checkRole(survey, sessionParams)) {
return NextResponse.json(survey)
} else {
return NextResponse.json({ error: '権限がありません。' }, { status: 403 })
return NextResponse.json({ error: '該当物件の照会権限がありません。' }, { status: 403 })
}
} catch (error: any) {
console.error('Error fetching survey:', error)

View File

@ -12,7 +12,7 @@ type SearchParams = {
offset?: string | null
role?: string | null // 회원권한한
storeId?: string | null // 판매점ID
builderNo?: string | null // 시공ID
builderId?: string | null // 시공ID
}
type WhereCondition = {
@ -90,7 +90,7 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
where.OR = [
{
// MUSUBI (시공권한 X) 같은 판매점에서 작성한 제출/제출되지 않은 매물
AND: [{ STORE_ID: { equals: params.storeId } }, { CONSTRUCTION_POINT_ID: { equals: params.builderNo } }],
AND: [{ STORE_ID: { equals: params.storeId } }, { CONSTRUCTION_POINT_ID: { equals: params.builderId } }],
},
{
// MUSUBI (시공권한 O) 가 MUSUBI 에 제출한 매물 + PARTNER 가 제출한 매물
@ -108,7 +108,7 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
case 'Partner': // PARTNER
// 시공ID 같은 매물
where.AND?.push({
CONSTRUCTION_POINT_ID: { equals: params.builderNo },
CONSTRUCTION_POINT_ID: { equals: params.builderId },
})
break
@ -146,12 +146,12 @@ export async function GET(request: Request) {
const params: SearchParams = {
keyword: searchParams.get('keyword'),
searchOption: searchParams.get('searchOption'),
isMySurvey: searchParams.get('isMySurvey'), //representativeId
isMySurvey: searchParams.get('isMySurvey'),
sort: searchParams.get('sort'),
offset: searchParams.get('offset'),
role: searchParams.get('role'),
storeId: searchParams.get('storeId'), //storeId
builderNo: searchParams.get('builderNo'),
storeId: searchParams.get('storeId'),
builderId: searchParams.get('builderId'),
}
// 검색 조건 구성
@ -172,7 +172,6 @@ export async function GET(request: Request) {
if (Object.keys(roleCondition).length > 0) {
where.AND.push(roleCondition)
}
// 페이지네이션 데이터 조회
//@ts-ignore
const surveys = await prisma.SD_SURVEY_SALES_BASIC_INFO.findMany({

View File

@ -38,7 +38,7 @@ export default function Detail() {
<tr>
<th></th>
<td>
{session?.userNm} {session?.builderNo ? `[${session?.builderNo}]` : ''}
{session?.userNm} {session?.builderNm ? `[${session?.builderNm}]` : ''}
</td>
</tr>
<tr>

View File

@ -10,6 +10,7 @@ import { useSpinnerStore } from '@/store/spinnerStore'
export default function SurveySaleDownloadPdf() {
const params = useParams()
const id = params.id
const router = useRouter()
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
const { setIsShow } = useSpinnerStore()
@ -49,6 +50,7 @@ export default function SurveySaleDownloadPdf() {
generatePDF(targetRef, options).then(() => {
setIsShow(false)
router.replace(`/survey-sale/${id}`)
alert('PDFの生成が完了しました。 ポップアップウィンドウからダウンロードしてください。')
})
}

View File

@ -78,10 +78,10 @@ export default function ButtonForm({ mode, setMode, data }: ButtonFormProps) {
return false
case 'Admin':
case 'Admin_Sub':
return session.storeNm === basicData.store && session.builderNo === basicData.constructionPointId
return session.storeNm === basicData.store && session.builderId === basicData.constructionPointId
case 'Builder':
case 'Partner':
return session.builderNo === basicData.constructionPointId
return session.builderId === basicData.constructionPointId
default:
return false
}

View File

@ -85,7 +85,7 @@ export default function DetailForm() {
store: session?.storeNm ?? null,
storeId: session?.storeId ?? null,
constructionPoint: session?.builderNm ?? null,
constructionPointId: session?.builderNo ?? null,
constructionPointId: session?.builderId ?? null,
}))
const [roofInfoData, setRoofInfoData] = useState<SurveyDetailRequest>(roofInfoForm)
@ -99,7 +99,7 @@ export default function DetailForm() {
store: session.storeNm ?? null,
storeId: session.storeId ?? null,
constructionPoint: session.builderNm ?? null,
constructionPointId: session.builderNo ?? null,
constructionPointId: session.builderId ?? null,
}))
}, [session?.isLoggedIn])

View File

@ -28,6 +28,11 @@ export default function ListTable() {
useEffect(() => {
if (!session.isLoggedIn || isLoadingSurveyList) return
// if ('status' in surveyList && surveyList.status === 403) {
// alert('権限がありません。')
// router.push('/survey-sale')
// return
// }
if ('count' in surveyList && surveyList.count > 0) {
if (offset > 0) {
setHeldSurveyList((prev) => [...prev, ...surveyList.data])
@ -54,7 +59,7 @@ export default function ListTable() {
{heldSurveyList.map((survey) => (
<li className="sale-list-item cursor-pointer" key={survey.id} onClick={() => handleDetailClick(survey.id)}>
<div className="sale-item-bx">
<div className="sale-item-date-bx">
<div className="sale-item-date-bx">
<div className="sale-item-num">{survey.srlNo}</div>
<div className="sale-item-date">{survey.investigationDate}</div>
</div>

View File

@ -78,13 +78,44 @@ export function useSurvey(id?: number): {
const { axiosInstance } = useAxios()
const router = useRouter()
const checkSession = () => {
if (session?.isLoggedIn) {
switch (session?.role) {
case 'T01':
case 'Admin':
case 'Admin_Sub':
if (session?.storeId === null) {
alert('販売店IDがありません。')
return false
}
return true
case 'Builder':
case 'Partner':
if (session?.builderId === null) {
alert('施工店IDがありません。')
return false
}
return true
default:
alert('権限が間違っています。')
return false
}
}
alert('ログインしていません。')
return false
}
const {
data: surveyListData,
isLoading: isLoadingSurveyList,
refetch: refetchSurveyList,
} = useQuery({
queryKey: ['survey', 'list', keyword, searchOption, isMySurvey, sort, offset, session?.storeNm, session?.builderNo, session?.role],
queryKey: ['survey', 'list', keyword, searchOption, isMySurvey, sort, offset, session?.storeNm, session?.builderId, session?.role],
queryFn: async () => {
if (!checkSession()) {
router.replace('/')
return { data: [], count: 0 }
}
const resp = await axiosInstance(null).get<{ data: SurveyBasicInfo[]; count: number }>('/api/survey-sales', {
params: {
keyword,
@ -93,7 +124,7 @@ export function useSurvey(id?: number): {
sort,
offset,
storeId: session?.storeId,
builderNo: session?.builderNo,
builderId: session?.builderId,
role: session?.role,
},
})
@ -111,13 +142,17 @@ export function useSurvey(id?: number): {
const { data: surveyDetail, isLoading: isLoadingSurveyDetail } = useQuery({
queryKey: ['survey', id],
queryFn: async () => {
if (!session?.isLoggedIn || id === 0 || id === undefined) return null
if (!checkSession()) {
router.replace('/survey-sale')
return null
}
if (id === 0 || id === undefined) return null
try {
const resp = await axiosInstance(null).get<SurveyBasicInfo>(`/api/survey-sales/${id}`, {
params: {
role: session?.role,
storeId: session?.storeId,
builderNo: session?.builderNo,
builderId: session?.builderId,
isLoggedIn: session?.isLoggedIn,
},
})