
    Ki6              	          d dl mZmZmZmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlZd dlZd dlmZ d dlmZ d dlZd dlZd dlZ edd	
          Ze                    edgddgdg            ed          Ze                    d            G d de          Z G d de          Zi Zi Z	  ee          j        dz  dz  Z ej         dd          !                                Z"e"dk    r% ee          j        dz  dz  Z e#de" d            e$edd          5 Z% ej&        e%          Zddd           n# 1 swxY w Y    e#d e'e(                    d g                      d!           n%# e)$ rZ* e#d"e*            g i d#ZY dZ*[*ndZ*[*ww xY we(                    d$          d%             Z+e(                    d&          d'             Z,e-                    d(e)           ed*d+,          fd-efd.            Z.e(                    d/          d0e/fd1            Z0d dlZ ej         d2d3          Z1 G d4 d5e          Z2 G d6 d7e          Z3 G d8 d9e          Z4e-                    d:          d;e2fd<            Z5e(                    d=          d>             Z6e7d?k    rd dl8Z8 e8j9        ed@dAB           dS dS )C    )FastAPIFile
UploadFileHTTPException)CORSMiddleware)	BaseModelField)OptionalListN)datetime)PathzHome Renovation APIz1.0.0)titleversion*T)allow_originsallow_credentialsallow_methodsallow_headersuploads)exist_okc                       e Zd ZU dZ edd          Zeed<    edd          Zeed<    edd          Z	eed	<    edd
          Z
eed<    edd          Zeed<    edd          Zeed<   dS )LayoutUploadResponseu   上传户型图响应模型.u   布局唯一 IDdescription	layout_idu   原始文件名filenameu   文件保存路径	file_pathu   文件大小（字节）	file_sizeu   上传时间upload_timeu   上传成功u   响应消息)defaultr   messageN)__name__
__module____qualname____doc__r	   r   str__annotations__r   r   r   intr   r!        9/home/ubuntu/projects/home-renovation-app/backend/main.pyr   r      s         %%U3,=>>>Is>>>E#+<===Hc===U3,@AAAIsAAAU3,FGGGIsGGGuSn===K===5^LLLGSLLLLLr*   r   c                   `    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZe	e         ed<   dS )	
LayoutInfouP   户型图信息模型（用于数据库存储，当前 MVP 先保存到本地）r   r   r   r   r   Ncontent_type)
r"   r#   r$   r%   r&   r'   r(   r   r.   r
   r)   r*   r+   r-   r-   '   s\         ZZNNNMMMNNNNNN"&L(3-&&&&&r*   r-   datazmaterials.jsonMARKETCNUSzmaterials_us.jsonu)   🌎 加载北美材料数据库 (MARKET=)rzutf-8)encodingu&   ✅ 材料数据库加载成功，共 	materialsu
    种材料u$   ⚠️ 材料数据库加载失败: )r6   rooms/c                     K   ddiS )Nr!   zHome Renovation API is runningr)   r)   r*   r+   rootr:   G   s      788r*   z/healthc                     K   ddiS )Nstatushealthyr)   r)   r*   r+   health_checkr>   L   s      i  r*   z/api/v1/upload-layout)response_model.u   户型图文件（PNG/JPG）r   filec           
        K   g d}| j         r4| j         pd                                                    d          d         nd}g d}| j        |vr!||vrt	          dd| j         d| d	
          d}d}|                                  d{V }t          |          }||k    rt	          dd|dz  dz  dd
          t          t          j	                              }| j         pd}t          |          j        pd}| | }	t          |	z  }
	 t          |
d          5 }|                    |           ddd           n# 1 swxY w Y   n3# t          $ r&}t	          ddt          |           
          d}~ww xY wt!          j                    }t%          j        ||||dt          |
                    }|st)          d|            t+          ||t          |
          ||                                d          S )u   
    上传户型图接口
    
    - **file**: 户型图文件，支持 PNG/JPG 格式
    
    返回布局 ID，用于后续生成装修方案
    )z	image/pngz
image/jpegz	image/jpgzapplication/octet-stream .)pngjpgjpegi  u   不支持的文件类型: u    (扩展名: .u   )。仅支持 PNG/JPGstatus_codedetaili   r   Nu   文件过大: i   z.2fu   MB。最大支持 10MBunknownz.jpgwb  u   文件保存失败: uploadedu3   ⚠️ 数据库保存失败，但文件已上传: u   户型图上传成功)r   r   r   r   r   r!   )r   lowersplitr.   r   readlenr&   uuiduuid4r   suffix
UPLOAD_DIRopenwrite	Exceptionr   nowdatabasesave_layoutprintr   	isoformat)r@   allowed_typesfile_extallowed_extsMAX_SIZEr   contentr   original_filenamesafe_filenamer   fer   
db_successs                  r+   upload_layoutri   Q   s      YXXM?C}T#**,,22377;;RTH)))L --(,2N2Np0AppQYppp
 
 
 	
  HIIIKKGGI8WI$4t$;WWWW
 
 
 	
 DJLL!!I 2%&&-7H ,(,,M]*IU)T"" 	aGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 U U U4S3q664S4STTTTU ,..K%$ij#i.. J  QOIOOPPP"i..))++'   s<   E !E7E EE 
EE 
E?!E::E?z/api/v1/layouts/{layout_id}r   c                    K   t          j        |           }|st          dd          |d         |d         |d         |d         |d         r|d                                         nd	d	d
S )u-   获取户型图信息（从数据库查询）  u   布局不存在rH   r   r   
image_pathr   r   N)r   r   r   r   r   r.   )r[   
get_layoutr   r^   )r   rows     r+   rm   rm      s       
i
(
(C G4EFFFF %
O&%9<]9KUs=)33555QU  r*   AI_SERVICE_URLzhttp://localhost:8001c                   \    e Zd ZU dZ edd          Zeed<    edd          Zeed<   dS )	PlanRequestu   生成方案请求模型.u   户型图 IDr   r   u-   装修风格（现代、北欧、中式等）styleN)	r"   r#   r$   r%   r	   r   r&   r'   rr   r)   r*   r+   rq   rq      sW         ""U3N;;;Is;;;s(WXXXE3XXXXXr*   rq   c                       e Zd ZU dZeed<   eed<   eed<   dZeed<   dZe	e         ed<   dZ
e	e         ed	<   dZe	e         ed
<   dZe	e         ed<   dZe	e         ed<   dS )MaterialItemu	   材料项namecategoryestimated_cost	   平方米unitNbrandmodelroomsupplierpurchase_url)r"   r#   r$   r%   r&   r'   floatry   rz   r
   r{   r|   r}   r~   r)   r*   r+   rt   rt      s         O
IIIMMMD#E8C=E8C=D(3-"Hhsm""""&L(3-&&&&&r*   rt   c                       e Zd ZU dZeed<   eed<    edd          Zee	         ed<    edd          Z
ee         ed	<   d
Zeed<   dS )PlanResponseu   生成方案响应r   rr   .u
   3套方案r   plansu   材料清单r6   u   方案生成成功r!   N)r"   r#   r$   r%   r&   r'   r	   r   r   dictr6   rt   r!   r)   r*   r+   r   r      s         NNNJJJc|<<<E4:<<<$)E#>$J$J$JItL!JJJ'GS'''''r*   r   z/api/v1/generate-planrequestc                 	   K   t          j         j                  st          dd          	 t	          j                    4 d{V }g }g d}t          d          D ]y}	 t          dt           d j	         d	 j         d
||                     |
                    t           d j	         j        ||         dd           d{V }t          d|j                    |j        dk    r~|                                }d|v rA|                    |dz   |d          j	        ||          j	         d||          dd           nDt          d|                                            nt          d|j         d|j                    /# t           $ r?}t          dt#          |          j         dt'          |                      Y d}~sd}~ww xY w|st          dd          g }t(                              dg           }	t(                              di           }
g d}|D ]}|
                    |          }|s|                    d|          }|                    dg           }|                    d i           }|D ]3}d!d"d#d$d%d&d'}|                    ||          fd(|	D             } fd)|D             }|s|}|sEt-          dt/          |                    }|d|         }|D ]}|                    |d*          }|d*k    r|nd}|d+         |z  }|                    t1          |d         |d,         t3          |d-          |d.         |                    d/          |                    d0          ||                    d1          |                    d2          3	  	                   Ő5|sDt1          d4d!d5d6d7d8d9d:;          t1          d<d"d=d6d>d?d9d@;          t1          dAd#dBd6dCdDd9dE;          g}t5           j         j	        ||dFt/          |           dGH          cddd          d{V  S # 1 d{V swxY w Y   dS # t          $ r  t           $ r}t          dIt#          |          j         dt'          |                      d*dl}|                                 t          ddJt#          |          j         dt'          |                     d}~ww xY w)Ku   
    生成装修方案
    
    - **layout_id**: 户型图 ID
    - **style**: 装修风格
    
    返回 3 套方案（含材料清单），调用 AI 服务生成效果图
    rk   u   户型图不存在rH   N)living_roombedroomkitchen   u   正在调用 AI 服务: u   /inference, 参数: style=z, layout_id=z, room_type=z
/inference)rr   r   	room_typeg      N@)paramstimeoutu   AI 服务响应: status=   image_base64   z - u   （Stability AI 生成）)plan_idr   rr   viewr   u*   AI 服务返回数据缺少 image_base64: u   AI服务调用失败: u!   调用 AI 服务时发生异常: z: rM   u9   AI服务未返回任何方案，请检查 AI 服务日志r6   r7   ru   required_materialsareas   地面   墙面u   顶面u   厨房u   灯具u   卫浴)floorwallceilingr   lightingbathroomc                 F    g | ]}|                     d           k    |S )rv   )get).0mtarget_categorys     r+   
<listcomp>z!generate_plan.<locals>.<listcomp>  s0    $f$f$f1zARARVeAeAeQAeAeAer*   c                 N    g | ]!}j         |                    d g           v |"S )style_match)rr   r   )r   r   r   s     r+   r   z!generate_plan.<locals>.<listcomp>  s8    &m&m&mQ7=TUTYTYZgikTlTlClClqClClClr*   r   price_per_unitrv      ry   rz   r{   r}   r~   )	ru   rv   rw   ry   rz   r{   r|   r}   r~      复合地板g      `@rx   u   圣象zF-2001u   客厅u   圣象地板)ru   rv   rw   ry   rz   r{   r|   r}   	   乳胶漆g     F@u	   多乐士z
Dulux-A991u   多乐士官方旗舰店u   集成吊顶g     f@u   奥普z	AUPU-6001u   奥普集成吊顶u   成功生成 u
    套方案)r   rr   r   r6   r!   u   generate_plan 发生异常: u   AI 服务调用失败: )r[   layout_existsr   r   httpxAsyncClientranger]   ro   rr   postrI   jsonappendkeystextrY   typer"   r&   materials_dbr   minrR   rt   roundr   	traceback	print_exc)r   clientr   
room_typesiresponser/   rg   r6   all_materialsrooms_configr   room_config	room_namerequired_catsr   catcat_mapcat_materialsstyle_materials	max_itemsselected_materialsmaterialareaquantitysubtotalr   r   s   `                          @r+   generate_planr      s      !'"344 J4HIIII|l$&& s	 s	 s	 s	 s	 s	 s	&E>>>J1XX \ \\  i^  i  i_f_l  i  i  {B  {L  i  i  Zd  ef  Zg  i  i  j  j  j%+[[)555%,])0):)3A   
 !% &1 & &            H KX5IKKLLL+s22'}})T11!LL+,q504^0D)0(2129-/l/lJqM/l/l/l* *     ""\tyy{{"\"\]]]]_x7K__PXP]__```  \ \ \Zd1gg>NZZRUVWRXRXZZ[[[[[[[[\  z#<xyyyy I(,,["==M'++GR88L ?>>J ( 3 3	*..y99" 'OOFI>>	 +0Db I I#44( * *C "* (#+#+$,$, G '.kk#s&;&;O %g$f$f$f$f$f$fM&m&m&m&m-&m&m&mO* 8*7* !  !$As?';'; < <I)8))D& %7  $yya00+/!8844#+,<#=#H!((!)&!1%-j%9+01+=+=!)&!1"*,,w"7"7"*,,w"7"7!*%-\\*%=%=)1n)E)E
* 
* 
* 
 
 
 
5*Z   nxX]dow  HP  W_  jx  y  y  y kHUY`ks~  GS  Zb  mG  H  H  H nxX]dow  HS  Zb  mA  B  B  B	  !+m#>E

>>>  [s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	h     l l lIT!WW-=IIQIIJJJ4jdSTggN^4j4jbefgbhbh4j4jkkkk	lsh   Q 	Q#D)FQ
G4GQGIQ5Q 
QQ QQ S6/BS11S6z/api/v1/materialsc            	      L   K   ddddddddddd	d
dddddddddddddgddS )u   返回可选材料列表r   u   实木地板r   r   )idru   rv   r   r   r   x   r   u   瓷砖P      r   r   -      u   壁纸<   u   材料列表获取成功)r6   r!   r)   r)   r*   r+   get_materialsr   P  sq      
 n(VYZZn(VYZZhHPRSSkxSUVVhHPRSS
 .	 	 	r*   __main__z0.0.0.0i@  )hostport):fastapir   r   r   r   fastapi.middleware.corsr   pydanticr   r	   typingr
   r   osrS   r   pathlibr   r   r   r[   appadd_middlewarerV   mkdirr   r-   
layouts_dbr   __file__parent	data_pathgetenvuppermarketr]   rW   rf   loadrR   r   rY   rg   r:   r>   r   ri   r&   rm   ro   rq   rt   r   r   r   r"   uvicornrunr)   r*   r+   <module>r      s@   < < < < < < < < < < < < 2 2 2 2 2 2 % % % % % % % % ! ! ! ! ! ! ! ! 				                g)7;;;   %%%     T)__
 
  $    M M M M M9 M M M' ' ' ' ' ' ' ' 
 2X%.1AAI RYx&&,,..F~~DNN)F25HH	C&CCCDDD	iw	/	/	/ $1 ty||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $	E
e33|7G7GUW7X7X3Y3Y
e
e
effff 2 2 2	E
4
4
4555!#b11LLLLLL2
 9 9 9 ! ! ! 
!2FGGtC-KLLLB B
B B B HGBJ 	&''    ('  
			+-DEEY Y Y Y Y) Y Y Y

' 
' 
' 
' 
'9 
' 
' 
'( ( ( ( (9 ( ( ( 
!""Il Il Il Il #"IlV 	   zNNNGK)$////// s=   /A2E6 !D>2E6 >EE6 E/E6 6F;FF