Flourish æ¯ä»¥ LINE Bot çºæ¥æ¶ç«¯çè±åºåå®¶åŸå°ç³»çµ±ã顧客éé LINE å³éèšè³Œéæ±ïŒç³»çµ±ä»¥ OpenAI å°å°è©±æŽçæçµæ§åèšå®èçš¿ïŒå家確èªåŸå¯«å ¥è³æåº«ïŒäžŠå¯åšåŸå°æ¥è©¢ãå¯åºèšå®ãèšå®æ¬äœïŒä»¥åéé LINE èªåå³éèšå®ç¢ºèªå¡çã
| æä»¶ | 說æ |
|---|---|
| 宿Žå®è£æå | ç°å¢è®æžãè³æåº« Migrationãæ°å¢åºå®¶ãLINE Webhook èšå® |
| API æä»¶ | OpenAPI å¥çŽ |
| User Stories MappingïŒGoogle Drive PDFïŒ | å å« Persona, User journey map 以å User story map |
| WireframesïŒFigmaïŒ | ä»é¢ç·æ¡è UI åå |
| Database Schema | è³æè¡šçµæ§èéè¯ïŒPostgreSQL / SupabaseïŒ |
| Project ManagementïŒNotionïŒ | éçŒæçšãä»»ååå·¥ãMilestones å ±å è 亀ä»çŽé ïŒéçŒå §å®¹èåå·¥å¯èŠãéçŒã |
| æž¬è©Šå ±å | Unit / Integration / Contract / Smoke Test 說æ |
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 顧客端 â
â LINE AppïŒææ©ïŒ â
âââââââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââ
â å³éèšæ¯ / æ¥æ¶å¡ç
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â LINE Messaging API â
â Webhook â POST /callback â
â Push MessageïŒText / Flex MessageïŒ â
âââââââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââ
â
âŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â FastAPI BackendïŒPython 3.12ïŒ â
â â
â routes/ â services/ â repositories/ â
â ââ linebot â LINE Webhook è§£æãèšæ¯åå
¥ DB â
â ââ orders â èšå® CRUDãè皿建ç«ãå¯åº â
â ââ chat â è倩宀å衚ãSSE æšæç«¯é» â
â ââ stores â åºå®¶èšå®ãæ¬äœèšå® â
â â
â usecases/ â
â ââ linebot_flow â Webhook äºä»¶èçæµçš â
â ââ organize_order_draft â OpenAI æŽçèçš¿æµçš â
â â
â SSE endpointïŒ/sse/stores/{id}ïŒ â
â ââ Redis pub/sub â è·š worker å»£ææ°èšæ¯äºä»¶ â
ââââââââââââ¬âââââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââ
â async SQLAlchemy â SSE stream
⌠âŒ
ââââââââââââââââââââââââ âââââââââââââââââââââââââââââââââââââ
â Supabase â â React FrontendïŒTypeScriptïŒ â
â ââ PostgreSQL â â â
â â å€ç§æ¶è³æåº« ââââââââºâ MessagesPage â äžæ¬è倩宀 RWD â
â â store â customer â REST â OrdersPage â èšå®ç®¡ç â
â â â chat_room â +SSE â SettingsPage â æ¬äœèšå® â
â â â order â â â
â ââ Auth â â TanStack QueryïŒserver stateïŒ â
â Google OAuth â â React RouterïŒè·¯ç± / blockerïŒ â
â JWT â â Tailwind CSS â
ââââââââââââââââââââââââ âââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââ
â Redis â
â SSE pub/sub channel â
â æ¯æŽå€å uvicorn â
â worker åæ¥æšæ â
ââââââââââââââââââââââââ
| å±€çŽ | æè¡ |
|---|---|
| å端 | React 19ãTypeScriptãViteãTanStack QueryãReact Router v6ãTailwind CSS |
| åŸç«¯ | Python 3.12ãFastAPIãSQLAlchemy 2.x asyncãAlembicãPydantic v2 |
| è³æåº« | PostgreSQLïŒSupabase æç®¡ïŒãRedis |
| AI | OpenAI GPTïŒèšå®èçš¿æŽçïŒ |
| éèš | LINE Messaging API SDKïŒWebhookãPush MessageãFlex MessageïŒ |
| èªè | Supabase AuthïŒGoogle OAuthïŒãJWT |
| éšçœ² | Docker Compose |
| æä»¶å¯åº | DOCXïŒpython-docxtplïŒãCSVïŒå端ç¢çïŒ |
LINE Webhook æ¶å°æ°èšæ¯åŸïŒåŸç«¯éé Redis publish äºä»¶ïŒææé£ç·äžçå端 SSE client éé subscribe ç«å³æ¶å°æšæãéæš£å³äœ¿éšçœ²å€å uvicorn workerïŒä»»äœ worker æ¶å° Webhook éœèœå»£æçµŠé£å°å ¶ä» worker çå端ïŒäžéèŠ sticky sessionã
çžèŒ WebSocketïŒSSE æ¯å®åæšæãç芜åšèªåéé£ïŒæŽé©åãåŸç«¯äž»åéç¥ãç䜿çšå Žæ¯ïŒäžå端ç¡éé¡å€åœåŒåº«ã
åå®¶æãæŽçèçš¿ã
â
âŒ
PATCH /organize_data/{room_id}
â
âŒ
organize_order_draft usecase
ââ 1. ååºè©²è倩宀æè¿ N åèšæ¯
ââ 2. çµæ promptïŒå«æ¬äœ schemaïŒé OpenAI Chat Completion
ââ 3. è§£æåå³ JSON â 寫å
¥ order_draft 衚
ââ 4. åå³ changed_fieldsïŒåªäºæ¬äœè¢« AI å¡«å
¥ïŒ
å端æ¶å° changed_fields â èè²é«äº®é¡¯ç€º AI å¡«å
¥çæ¬äœåŒ
ææ repository æ¹æ³åŒ·å¶åž¶å
¥ store_idïŒRepository 局統äžé濟ïŒé²æ¢è·šåºè³ææŽ©æŒã
èšå®æ¥è©¢äœ¿çš outerjoin + OR èšèšïŒåææ¯æŽå
©çš®äŸæºïŒåŸè倩宀è皿建ç«çèšå®ïŒæ room_idïŒèåŸå°çŽæ¥æ°å¢çèšå®ïŒroom_id = NULLïŒã
store_order_field_config 衚以 JSONB å²åæ¯å®¶åºçæ¬äœé¡¯ç€ºèšå®ïŒé¡¯ç€º/é±è/é åºïŒãå端è皿衚å®ãèšå®å衚æ¬äœãLINE Flex Message å¡çå
§å®¹åè®åæ€èšå®åæ
æž²æïŒå家調æŽåŸç«å³çæïŒäžéæ¹çšåŒç¢Œã
- äžæ¬ RWD ä»é¢ïŒè倩宀å衚 / å°è©± / èšå®è©³æ ïŒ
- SSE å³ææšææ°èšæ¯ïŒéé Redis è·š worker 廣æïŒ
- AI æŽçèçš¿ïŒåŸ LINE å°è©±èªåæåèšå®æ¬äœïŒèè²é«äº®é¡¯ç€º AI å¡«å ¥çåŒ
- 建ç«èšå®åŸèªå push LINE Flex Message èšå®ç¢ºèªå¡ç絊顧客
- å衚ã篩éžïŒçæ / æ¥æ / ééµåïŒãåé
- çŽæ¥æ°å¢èšå® / åŸè皿建ç«èšå®
- å¯åº DOCX å·¥å®ïŒWord æš¡æ¿ïŒãCSV
- æ¯å®¶åºçšç«èšå®ïŒææ³èª¿æŽé¡¯ç€ºé åº
- åææ¬äœé¡¯ç€º / é±èïŒå¿ èŠæ¬äœéå®ïŒ
- æ¬äœèšå®åœ±é¿è皿衚å®ãèšå®å衚ãFlex Message å¡çå §å®¹
- Google OAuth ç»å ¥ïŒSupabase AuthïŒ
- åºäž»è store 1:1 ç¶å®ïŒå èœååèªå·±åºçè³æ
- Onboarding æµçšïŒéŠæ¬¡ç»å ¥åŒå°èšå®åºåèæ¬äœïŒ
git clone <repository-url>
cd Flower_Order_Bot
cp backend/.env.example backend/.env
# å¡«å
¥ DATABASE_URLãOPENAI_API_KEYãLINE token/secretãSUPABASE_URL/KEY
docker compose up --build- å端ïŒ
http://localhost:5173 - åŸç«¯ SwaggerïŒ
http://localhost:8000/docs
宿Žå®è£æ¥é©ïŒæ¬æ©å·è¡ãngrokãè³æåº« migrationãæ°å¢åºå®¶ïŒèŠ docs/SETUP.mdã
æ¬å°æ¡æ¶µè Unit TestãIntegration TestãContract Test è Smoke TestïŒå®æŽèªªæèŠ docs/TESTING.mdã
| ç¯å | æ¡æ¶ | æž¬è©Šæª | æ¡äŸæž | æè¿çµæïŒ2026-06-12ïŒ |
|---|---|---|---|---|
| Backend | pytest | 39 | 206 | 206 passed |
| Frontend | Vitest | 5 | 18 | 18 passed |
èªè¡å·è¡æž¬è©ŠåïŒè«å äŸ docs/SETUP.md 宿ç°å¢è®æžãè³æåº«èèªèèšå®ã
# Backend
cd backend
pip install -r requirements.txt
python -m pytest tests/ -v
# Frontend
cd frontend
npm install
npx vitest run