entity.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. import uuid
  4. from datetime import datetime
  5. from types import NoneType
  6. from typing_extensions import Annotated
  7. from flask_login import UserMixin
  8. from pydantic import BaseModel, BeforeValidator, Field, Strict, computed_field
  9. from typing import List, Optional
  10. from pydantic.types import UUID4
  11. from ruoyi_common.base.model import AuditEntity, VoAccess, strict_base_config, BaseEntity
  12. from ruoyi_common.base.schema_excel import ExcelAccess, ExcelField, ExcelFields
  13. from ruoyi_common.base.schema_vo import VoField
  14. from ruoyi_common.base.transformer import int_to_str, to_datetime, str_to_int
  15. class LoginUser(BaseModel, UserMixin):
  16. model_config = strict_base_config.copy()
  17. user_id: int
  18. dept_id: Optional[int] = None
  19. token: UUID4 = Field(default_factory=uuid.uuid4)
  20. login_time: Annotated[
  21. datetime,
  22. BeforeValidator(to_datetime())
  23. ] = None
  24. expire_time: Annotated[
  25. datetime,
  26. BeforeValidator(to_datetime())
  27. ] = None
  28. ip_addr: Optional[str] = None
  29. login_location: Optional[str] = None
  30. browser: Optional[str] = None
  31. os: Optional[str] = None
  32. permissions: Optional[List] = []
  33. user: Optional["SysUser"] = None
  34. def get_id(self) -> int:
  35. return self.user_id
  36. @property
  37. def user_name(self) -> str:
  38. return self.user.user_name
  39. @property
  40. def dept_name(self) -> str:
  41. if self.user:
  42. if self.user.dept:
  43. return self.user.dept.dept_name
  44. else:
  45. return ""
  46. else:
  47. return ""
  48. class SysUser(AuditEntity):
  49. user_id: Annotated[
  50. int,
  51. BeforeValidator(str_to_int),
  52. Field(gt=0, default=None),
  53. VoField(query=True),
  54. ExcelField(name="用户序号", cell_type="numeric", prompt="用户编号")
  55. ]
  56. dept_id: Annotated[
  57. Optional[int],
  58. BeforeValidator(str_to_int),
  59. Field(default=None),
  60. VoField(query=True),
  61. ExcelField(name="部门编号", action="import")
  62. ]
  63. user_name: Annotated[
  64. Optional[str],
  65. Field(default=None),
  66. VoField(query=True),
  67. ExcelField(name="登录名称")
  68. ]
  69. nick_name: Annotated[
  70. Optional[str],
  71. Field(default=None),
  72. ExcelField(name="用户名称")
  73. ]
  74. user_type: Optional[str] = None
  75. email: Annotated[
  76. Optional[str],
  77. Field(default=None),
  78. ExcelField(name="用户邮箱")
  79. ]
  80. phonenumber: Annotated[
  81. Optional[str],
  82. Field(default=None),
  83. VoField(query=True),
  84. ExcelField(name="手机号码")
  85. ]
  86. sex: Annotated[
  87. Optional[str],
  88. Field(default=None),
  89. ExcelField(name="用户性别", converter="0=男,1=女,2=未知")
  90. ]
  91. avatar: Optional[str] = None
  92. password: Annotated[
  93. str,
  94. Field(default=None, exclude=True)
  95. ]
  96. salt: Annotated[
  97. Optional[UUID4],
  98. Field(default=None),
  99. VoField(body=False)
  100. ]
  101. status: Annotated[
  102. Optional[str],
  103. Field(default=None),
  104. VoField(query=True),
  105. ExcelField(name="帐号状态", converter="0=正常,1=停用")
  106. ]
  107. del_flag: Optional[str] = None
  108. login_ip: Annotated[
  109. Optional[str],
  110. Field(default=None),
  111. ExcelField(name="最后登录IP", action="export")
  112. ]
  113. login_date: Annotated[
  114. Optional[datetime],
  115. BeforeValidator(to_datetime()),
  116. ExcelField(
  117. name="最后登录IP",
  118. width=30,
  119. date_format="yyyy-MM-dd HH:mm:ss",
  120. action="export"
  121. )
  122. ] = None
  123. dept: Annotated[
  124. "SysDept",
  125. Field(default=None),
  126. VoField(body=False),
  127. ExcelFields(
  128. ExcelAccess(name="部门名称", width=20, attr="dept_name"),
  129. ExcelAccess(name="部门负责人", width=20, attr="leader")
  130. )
  131. ]
  132. roles: Annotated[
  133. List["SysRole"],
  134. Field(default_factory=list),
  135. VoField(body=False)
  136. ]
  137. role_ids: Optional[List[int]] = []
  138. post_ids: Optional[List[int]] = []
  139. role_id: Annotated[
  140. Optional[int],
  141. Field(default=None),
  142. VoField(body=False)
  143. ]
  144. def is_admin(self) -> bool:
  145. return True if self.user_id and self.user_id == 1 else False
  146. class SysRole(AuditEntity):
  147. role_id: Annotated[
  148. int,
  149. BeforeValidator(str_to_int),
  150. Field(gt=0, default=None, vo=VoAccess(query=True))
  151. ]
  152. role_name: Annotated[
  153. Optional[str],
  154. Field(default=None, vo=VoAccess(query=True))
  155. ]
  156. role_key: Annotated[
  157. Optional[str],
  158. Field(default=None, vo=VoAccess(query=True))
  159. ]
  160. role_sort: Annotated[
  161. Optional[int],
  162. BeforeValidator(str_to_int),
  163. Field(default=None)
  164. ]
  165. data_scope: Optional[str] = None
  166. menu_check_strictly: Annotated[Optional[bool], Strict(False)] = None
  167. dept_check_strictly: Annotated[Optional[bool], Strict(False)] = None
  168. status: Annotated[
  169. Optional[str],
  170. Field(default=None, vo=VoAccess(query=True))
  171. ]
  172. del_flag: Annotated[
  173. Optional[str],
  174. Field(default=None, vo=VoAccess(body=False))
  175. ]
  176. flag: Annotated[
  177. Optional[bool],
  178. Field(default=None, vo=VoAccess(body=False))
  179. ]
  180. menu_ids: Annotated[
  181. Optional[List[int]],
  182. Field(default=[], vo=VoAccess(body=False))
  183. ]
  184. dept_ids: Annotated[
  185. Optional[List[int]],
  186. Field(default=[], vo=VoAccess(body=False))
  187. ]
  188. def is_admin(self) -> bool:
  189. return self.role_id and self.role_id == 1 if self.role_id else False
  190. class SysMenu(AuditEntity):
  191. menu_id: Annotated[
  192. int,
  193. BeforeValidator(str_to_int),
  194. Field(gt=0, default=None, vo=VoAccess(query=True))
  195. ]
  196. menu_name: Annotated[
  197. Optional[str],
  198. Field(default=None, vo=VoAccess(query=True))
  199. ]
  200. parent_name: Annotated[
  201. Optional[int],
  202. Field(default=None, exclude=True, vo=VoAccess(body=False))
  203. ]
  204. parent_id: Optional[int] = None
  205. order_num: Optional[int] = None
  206. path: Optional[str] = None
  207. component: Optional[str] = None
  208. query: Optional[str] = None
  209. is_frame: Annotated[str,
  210. BeforeValidator(int_to_str),
  211. Field(default=None)
  212. ]
  213. is_cache: Annotated[str,
  214. BeforeValidator(int_to_str),
  215. Field(default=None)
  216. ]
  217. menu_type: Optional[str] = None
  218. visible: Annotated[
  219. Optional[str],
  220. Field(default=None, vo=VoAccess(query=True))
  221. ]
  222. status: Annotated[
  223. Optional[str],
  224. Field(default=None, vo=VoAccess(query=True))
  225. ]
  226. perms: Optional[str] = None
  227. icon: Optional[str] = None
  228. children: Annotated[
  229. List["SysMenu"] | NoneType,
  230. Field(default=[], exclude=True, vo=VoAccess(body=False))
  231. ]
  232. class SysDictType(AuditEntity):
  233. dict_id: Annotated[
  234. int,
  235. BeforeValidator(str_to_int),
  236. Field(default=None, ge=0, vo=VoAccess(query=True))
  237. ]
  238. dict_name: Annotated[
  239. str,
  240. Field(default=None, vo=VoAccess(query=True))
  241. ]
  242. dict_type: Annotated[
  243. str,
  244. Field(default=None, vo=VoAccess(query=True))
  245. ]
  246. status: Annotated[
  247. str,
  248. Field(default=None, vo=VoAccess(query=True))
  249. ]
  250. class SysDictData(AuditEntity):
  251. dict_code: Annotated[
  252. int,
  253. BeforeValidator(str_to_int),
  254. Field(default=None, ge=0, vo=VoAccess(query=True))
  255. ]
  256. dict_sort: Annotated[int, Field(default=None)]
  257. dict_label: Annotated[
  258. str,
  259. Field(default=None, vo=VoAccess(query=True))
  260. ]
  261. dict_value: Annotated[
  262. str,
  263. Field(default=None, vo=VoAccess(query=True))
  264. ]
  265. dict_type: Annotated[
  266. str,
  267. Field(default=None, vo=VoAccess(query=True))
  268. ]
  269. css_class: Annotated[
  270. Optional[str],
  271. Field(default=None, vo=VoAccess(body=False))
  272. ]
  273. list_class: Annotated[
  274. str,
  275. Field(default=None)
  276. ]
  277. is_default: Annotated[str, Field(default=None)]
  278. status: Annotated[
  279. str,
  280. Field(default=None, vo=VoAccess(query=True))
  281. ]
  282. class SysDept(AuditEntity):
  283. dept_id: Annotated[
  284. Optional[int],
  285. BeforeValidator(str_to_int),
  286. Field(default=None, vo=VoAccess(query=True))
  287. ]
  288. parent_id: Annotated[
  289. Optional[int],
  290. BeforeValidator(str_to_int),
  291. Field(default=None, vo=VoAccess(query=True))
  292. ]
  293. ancestors: Optional[str] = None
  294. dept_name: Annotated[
  295. Optional[str],
  296. Field(default=None, vo=VoAccess(query=True))
  297. ]
  298. order_num: Optional[int] = None
  299. leader: Optional[str] = None
  300. phone: Optional[str] = None
  301. email: Optional[str] = None
  302. status: Annotated[
  303. Optional[str],
  304. Field(default=None, vo=VoAccess(query=True))
  305. ]
  306. del_flag: Optional[str] = None
  307. parent_name: Annotated[Optional[str], Field(default=None, exclude=True, vo=VoAccess(body=False))]
  308. children: Annotated[List["SysDept"], Field(default=[], vo=VoAccess(body=False))]
  309. class TreeSelect(BaseModel):
  310. # 节点ID
  311. id: Annotated[int, Field(default=None)]
  312. # 节点名称
  313. label: Annotated[str, Field(default=None)]
  314. # 子节点
  315. children: Annotated[List["TreeSelect"], Field(default=[])]
  316. @classmethod
  317. def from_menu(cls, menu: SysMenu) -> "TreeSelect":
  318. return cls(id=menu.menu_id, label=menu.menu_name, children=[cls.from_menu(child) for child in menu.children])
  319. @classmethod
  320. def from_dept(cls, dept: SysDept) -> "TreeSelect":
  321. return cls(id=dept.dept_id, label=dept.dept_name, children=[cls.from_dept(child) for child in dept.children])
  322. # 员工配置
  323. class SysStuffInfoConf(BaseEntity):
  324. """
  325. 员工配置表对象
  326. """
  327. # conf_id
  328. conf_id: Annotated[
  329. Optional[int],
  330. BeforeValidator(str_to_int),
  331. Field(default=None, description="conf_id"),
  332. VoField(query=True),
  333. ExcelField(name="conf_id")
  334. ]
  335. # 分类索引
  336. module_index: Annotated[
  337. Optional[str],
  338. Field(default=None, description="分类索引"),
  339. VoField(query=True),
  340. ExcelField(name="分类索引")
  341. ]
  342. # 子类路径
  343. category: Annotated[
  344. Optional[str],
  345. Field(default=None, description="子类路径"),
  346. VoField(query=True),
  347. ExcelField(name="子类路径")
  348. ]
  349. # 属性列表
  350. attributes: Annotated[
  351. Optional[str],
  352. Field(default=None, description="属性列表"),
  353. VoField(query=True),
  354. ExcelField(name="属性列表")
  355. ]
  356. # # 页码
  357. # page_num: Optional[int] = Field(default=1, description="页码")
  358. # # 每页数量
  359. # page_size: Optional[int] = Field(default=10, description="每页数量")
  360. # 价目表配置
  361. class SysPriceConf(BaseEntity):
  362. """
  363. 价目表对象
  364. """
  365. # conf_id
  366. conf_id: Annotated[
  367. Optional[int],
  368. BeforeValidator(str_to_int),
  369. Field(default=None, description="conf_id"),
  370. VoField(query=True),
  371. ExcelField(name="conf_id")
  372. ]
  373. # 分类索引
  374. module_index: Annotated[
  375. Optional[str],
  376. Field(default=None, description="分类索引"),
  377. VoField(query=True),
  378. ExcelField(name="分类索引")
  379. ]
  380. # 子类路径
  381. category: Annotated[
  382. Optional[str],
  383. Field(default=None, description="子类路径"),
  384. VoField(query=True),
  385. ExcelField(name="子类路径")
  386. ]
  387. # 属性列表
  388. attributes: Annotated[
  389. Optional[str],
  390. Field(default=None, description="属性列表"),
  391. VoField(query=True),
  392. ExcelField(name="属性列表")
  393. ]
  394. # 单品配置表
  395. class SysProductConf(BaseEntity):
  396. """
  397. 单品配置表对象
  398. """
  399. # conf_id
  400. conf_id: Annotated[
  401. Optional[str],
  402. Field(default=None, description="conf_id"),
  403. VoField(query=True),
  404. ExcelField(name="conf_id")
  405. ]
  406. # 分类索引
  407. module_index: Annotated[
  408. Optional[str],
  409. Field(default=None, description="分类索引"),
  410. VoField(query=True),
  411. ExcelField(name="分类索引")
  412. ]
  413. # 子类路径
  414. category: Annotated[
  415. Optional[str],
  416. Field(default=None, description="子类路径"),
  417. VoField(query=True),
  418. ExcelField(name="子类路径")
  419. ]
  420. # 属性列表
  421. attributes: Annotated[
  422. Optional[str],
  423. Field(default=None, description="属性列表"),
  424. VoField(query=True),
  425. ExcelField(name="属性列表")
  426. ]
  427. # 版本号
  428. version: Annotated[
  429. Optional[int],
  430. Field(default=None, description="版本号"),
  431. VoField(query=True),
  432. ExcelField(name="版本号")
  433. ]
  434. # 删除标记
  435. delete_flag: Annotated[
  436. Optional[int],
  437. Field(default=None, description="删除标记 0:未删除 1:删除"),
  438. VoField(query=True),
  439. ExcelField(name="删除标记")
  440. ]
  441. # 状态
  442. status: Annotated[
  443. Optional[int],
  444. Field(default=None, description="状态 0:禁用, 1:启用"),
  445. VoField(query=True),
  446. ExcelField(name="状态")
  447. ]
  448. # 套餐配置表
  449. class SysCompoConf(BaseEntity):
  450. """
  451. 套餐配置表对象
  452. """
  453. # conf_id
  454. conf_id: Annotated[
  455. Optional[str],
  456. Field(default=None, description="conf_id"),
  457. VoField(query=True),
  458. ExcelField(name="conf_id")
  459. ]
  460. # 分类索引
  461. module_index: Annotated[
  462. Optional[str],
  463. Field(default=None, description="分类索引"),
  464. VoField(query=True),
  465. ExcelField(name="分类索引")
  466. ]
  467. # 子类路径
  468. category: Annotated[
  469. Optional[str],
  470. Field(default=None, description="子类路径"),
  471. VoField(query=True),
  472. ExcelField(name="子类路径")
  473. ]
  474. # 属性列表
  475. attributes: Annotated[
  476. Optional[str],
  477. Field(default=None, description="属性列表"),
  478. VoField(query=True),
  479. ExcelField(name="属性列表")
  480. ]
  481. # 版本号
  482. version: Annotated[
  483. Optional[int],
  484. Field(default=None, description="版本号"),
  485. VoField(query=True),
  486. ExcelField(name="版本号")
  487. ]
  488. # 删除标记
  489. delete_flag: Annotated[
  490. Optional[int],
  491. Field(default=None, description="删除标记 0:未删除 1:删除"),
  492. VoField(query=True),
  493. ExcelField(name="删除标记")
  494. ]
  495. # 状态
  496. status: Annotated[
  497. Optional[int],
  498. Field(default=None, description="状态 0:禁用, 1:启用"),
  499. VoField(query=True),
  500. ExcelField(name="状态")
  501. ]