This commit is contained in:
Macbook
2026-07-12 05:37:13 +09:00
parent 9c49b01d7f
commit 3c57a28edd
6 changed files with 49 additions and 6 deletions
@@ -72,6 +72,10 @@ class SecurityConfig {
patterns.add("http://127.0.0.1:*"); patterns.add("http://127.0.0.1:*");
patterns.add("http://192.168.*.*:*"); patterns.add("http://192.168.*.*:*");
patterns.add("http://10.*.*.*:*"); patterns.add("http://10.*.*.*:*");
patterns.add("tauri://localhost");
patterns.add("tauri://*");
patterns.add("https://tauri.localhost");
patterns.add("http://tauri.localhost");
c.setAllowedOriginPatterns(patterns); c.setAllowedOriginPatterns(patterns);
} }
c.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); c.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
+1 -1
View File
@@ -26,5 +26,5 @@ app:
secret: ${APP_JWT_SECRET:billcare-bizcare-homes-secret-key-must-be-long-enough-256bits} secret: ${APP_JWT_SECRET:billcare-bizcare-homes-secret-key-must-be-long-enough-256bits}
expiration-ms: ${APP_JWT_EXPIRATION_MS:86400000} expiration-ms: ${APP_JWT_EXPIRATION_MS:86400000}
cors: cors:
origins: ${APP_CORS_ORIGINS:http://localhost:5174,http://localhost:82,http://127.0.0.1:82} origins: ${APP_CORS_ORIGINS:http://localhost:5174,http://localhost:82,http://127.0.0.1:82,http://localhost:1420,https://billcare.exdev.co.kr,tauri://localhost,https://tauri.localhost,http://tauri.localhost}
upload-dir: ${APP_UPLOAD_DIR:./storage/uploads} upload-dir: ${APP_UPLOAD_DIR:./storage/uploads}
+1 -1
View File
@@ -33,7 +33,7 @@ services:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/billcare?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/billcare?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME: billcare SPRING_DATASOURCE_USERNAME: billcare
SPRING_DATASOURCE_PASSWORD: billcare SPRING_DATASOURCE_PASSWORD: billcare
APP_CORS_ORIGINS: ${APP_CORS_ORIGINS:-http://localhost:82,http://127.0.0.1:82,http://localhost:5174,https://billcare.exdev.co.kr} APP_CORS_ORIGINS: ${APP_CORS_ORIGINS:-http://localhost:82,http://127.0.0.1:82,http://localhost:5174,http://localhost:1420,https://billcare.exdev.co.kr,tauri://localhost,https://tauri.localhost,http://tauri.localhost}
APP_UPLOAD_DIR: /app/storage/uploads APP_UPLOAD_DIR: /app/storage/uploads
volumes: volumes:
- billcare_uploads:/app/storage/uploads - billcare_uploads:/app/storage/uploads
+3 -2
View File
@@ -83,8 +83,9 @@ export default function AgentShell({ shop = false }: Props) {
setOpenCards((prev) => { setOpenCards((prev) => {
const next = { ...prev } const next = { ...prev }
sections.forEach((sec) => { sections.forEach((sec) => {
// 기본은 접힘. 현재 경로가 속한 섹션만 펼침
if (next[sec.id] === undefined) { if (next[sec.id] === undefined) {
next[sec.id] = sectionContainsPath(sec, location.pathname) || sec.items.length <= 1 next[sec.id] = sectionContainsPath(sec, location.pathname)
} }
if (sectionContainsPath(sec, location.pathname)) next[sec.id] = true if (sectionContainsPath(sec, location.pathname)) next[sec.id] = true
}) })
@@ -201,7 +202,7 @@ export default function AgentShell({ shop = false }: Props) {
{!collapsed && ( {!collapsed && (
<aside className="leftpanel" style={{ width: panelWidth }}> <aside className="leftpanel" style={{ width: panelWidth }}>
{sections.map((sec) => { {sections.map((sec) => {
const open = openCards[sec.id] !== false const open = openCards[sec.id] === true
const activeSec = sectionContainsPath(sec, location.pathname) const activeSec = sectionContainsPath(sec, location.pathname)
return ( return (
<div className={`lp-card${activeSec ? ' is-active' : ''}`} key={sec.id}> <div className={`lp-card${activeSec ? ' is-active' : ''}`} key={sec.id}>
+25 -2
View File
@@ -19,6 +19,29 @@ import { DownOutlined } from '@ant-design/icons'
import client, { apiPrefix, unwrap, type ApiResponse } from '../../api/client' import client, { apiPrefix, unwrap, type ApiResponse } from '../../api/client'
import { options } from './homesShared' import { options } from './homesShared'
/** 진행현황 배지 색상 클래스 */
function progressBadgeClass(status?: string) {
const s = (status || '').trim()
if (s.startsWith('1.') || s.includes('접수완료')) return 'badge badge-ps-1'
if (s.startsWith('2.') || s.includes('고객통화')) return 'badge badge-ps-2'
if (s.startsWith('3.') || s.includes('서류검토')) return 'badge badge-ps-3'
if (s.startsWith('4.') || s.includes('개통완료')) return 'badge badge-ps-4'
if (s.startsWith('5.') || s.includes('사은품지급')) return 'badge badge-ps-5'
if (s.startsWith('6.') || s.includes('정산완료')) return 'badge badge-ps-6'
if (s.startsWith('9.') || s.includes('취소')) return 'badge badge-ps-9'
return 'badge'
}
/** 사은품현황 배지 색상 클래스 */
function giftBadgeClass(status?: string) {
const s = (status || '').trim()
if (s === '미지급') return 'badge badge-gs-none'
if (s === '지급대기') return 'badge badge-gs-wait'
if (s === '지급완료') return 'badge badge-gs-done'
if (s === '반송') return 'badge badge-gs-return'
return 'badge'
}
type ReceptionRow = { type ReceptionRow = {
id: number id: number
orderDate?: string orderDate?: string
@@ -678,7 +701,7 @@ export default function ReceptionListPage() {
</td> </td>
<td className="col-status floating-cell"> <td className="col-status floating-cell">
<p className="c-green">{o.employeeName || o.counselor || ''}</p> <p className="c-green">{o.employeeName || o.counselor || ''}</p>
<p><span className="badge">{o.status || o.progressStatus || ''}</span></p> <p><span className={progressBadgeClass(o.status || o.progressStatus)}>{o.status || o.progressStatus || ''}</span></p>
<div className="floating-layer"> <div className="floating-layer">
<p>개통일: {o.opened || o.openDate || '-'}</p> <p>개통일: {o.opened || o.openDate || '-'}</p>
<p>해지일: {o.canceled || '-'}</p> <p>해지일: {o.canceled || '-'}</p>
@@ -694,7 +717,7 @@ export default function ReceptionListPage() {
<p className="fs11">{o.giftSended || o.giftDate || ''}</p> <p className="fs11">{o.giftSended || o.giftDate || ''}</p>
</td> </td>
<td className="col-gift"> <td className="col-gift">
<p><span className="badge">{o.giftStatus || ''}</span></p> <p><span className={giftBadgeClass(o.giftStatus)}>{o.giftStatus || ''}</span></p>
<p>{num(giftAmt)}</p> <p>{num(giftAmt)}</p>
</td> </td>
<td className="col-cstatus floating-cell"> <td className="col-cstatus floating-cell">
+15
View File
@@ -4357,7 +4357,22 @@ table.order-list .badge {
font-size: 11px; font-size: 11px;
background: var(--badge-bg); background: var(--badge-bg);
color: var(--badge-text); color: var(--badge-text);
white-space: nowrap;
} }
/* 진행현황 */
table.order-list .badge-ps-1 { background: #1677ff; color: #fff; } /* 1.접수완료 */
table.order-list .badge-ps-2 { background: #13c2c2; color: #fff; } /* 2.고객통화 */
table.order-list .badge-ps-3 { background: #722ed1; color: #fff; } /* 3.서류검토 */
table.order-list .badge-ps-4 { background: #52c41a; color: #fff; } /* 4.개통완료 */
table.order-list .badge-ps-5 { background: #fa8c16; color: #fff; } /* 5.사은품지급 */
table.order-list .badge-ps-6 { background: #2f54eb; color: #fff; } /* 6.정산완료 */
table.order-list .badge-ps-9 { background: #f5222d; color: #fff; } /* 9.취소 */
/* 사은품현황 */
table.order-list .badge-gs-none { background: #8c8c8c; color: #fff; } /* 미지급 */
table.order-list .badge-gs-wait { background: #faad14; color: #1f1f1f; } /* 지급대기 */
table.order-list .badge-gs-done { background: #52c41a; color: #fff; } /* 지급완료 */
table.order-list .badge-gs-return { background: #f5222d; color: #fff; } /* 반송 */
html.theme-light table.order-list .badge-gs-wait { color: #fff; }
table.order-list .floating-cell { position: relative; } table.order-list .floating-cell { position: relative; }
table.order-list .floating-layer { table.order-list .floating-layer {
display: none; display: none;