models.py 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043
  1. import django
  2. from django.core.exceptions import ValidationError
  3. from django.db import models
  4. from django.utils import timezone
  5. from datetime import timedelta,datetime
  6. from django.utils.translation import gettext_lazy as _
  7. from django.db.models import Q
  8. # Create your models here.
  9. DefaultStatus = [
  10. (5, "使用中"),
  11. (6, "已停用"),
  12. (4, "已删除"),
  13. ]
  14. UseStatus = [
  15. (5, "已用中"),
  16. (6, "未使用"),
  17. ]
  18. ParamsType = [
  19. (1, "变量"),
  20. (2, "常量"),
  21. ]
  22. ParamsValueType = [
  23. (1, "输入框"),
  24. (2, "下拉选择"),
  25. (3, "小数"),
  26. (4, "百分比"),
  27. (5, "分数")
  28. ]
  29. YESOrNO = [
  30. (0, "否"),
  31. (1, "是"),
  32. ]
  33. def eight_hours_from_now():
  34. return timezone.now() + timedelta(hours=8)
  35. # 管理员
  36. class Admin(models.Model):
  37. id = models.AutoField(primary_key=True)
  38. username = models.CharField(max_length=60, verbose_name="登录用户名", unique=True)
  39. password = models.CharField(max_length=255, verbose_name="登录密码")
  40. mobile = models.CharField(max_length=20, verbose_name="手机号码")
  41. email = models.CharField(max_length=60, verbose_name="邮件地址",blank=True,null=True)
  42. real_name = models.CharField(max_length=255, verbose_name="真实姓名", blank=True,null=True)
  43. token = models.CharField(max_length=120, verbose_name="登录授权码", default="")
  44. role_id = models.IntegerField(verbose_name='所属角色', default=0)
  45. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  46. last_login_time = models.DateTimeField(verbose_name="最后登录时间", default=eight_hours_from_now)
  47. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  48. header = models.CharField(max_length=255, verbose_name="头像", blank=True,null=True)
  49. code = models.CharField(max_length=255, verbose_name="工号", blank=True,null=True)
  50. job = models.CharField(max_length=255, verbose_name="职位", blank=True,null=True)
  51. contact = models.CharField(max_length=255, verbose_name="联系方式", blank=True,null=True)
  52. verification_code = models.CharField(max_length=255, verbose_name="验证码", blank=True,null=True)
  53. class Meta:
  54. db_table = 'dc_admin'
  55. verbose_name = "管理员信息"
  56. verbose_name_plural = "管理员信息"
  57. def __int__(self):
  58. return self.id
  59. # 角色
  60. class AdminRole(models.Model):
  61. id = models.AutoField(primary_key=True)
  62. name = models.CharField(max_length=60, verbose_name="角色名称")
  63. intro = models.CharField(max_length=255, verbose_name="角色介绍",blank=True,null=True)
  64. is_admin = models.SmallIntegerField(verbose_name="超管标识", default=2)
  65. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  66. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  67. class Meta:
  68. db_table = 'dc_admin_role'
  69. verbose_name = "管理员角色"
  70. verbose_name_plural = "管理员角色信息"
  71. def clean(self):
  72. print("开始进行校验")
  73. super().clean()
  74. # 检查是否存在同名且状态不为4的记录
  75. if AdminRole.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  76. print("校验返回")
  77. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  78. def save(self, *args, **kwargs):
  79. self.full_clean()
  80. super().save(*args, **kwargs)
  81. def __str__(self):
  82. return self.name
  83. # 客户
  84. class Customer(models.Model):
  85. id = models.AutoField(primary_key=True)
  86. code = models.CharField(max_length=60, verbose_name="客户编码", unique=True)
  87. name = models.CharField(max_length=255, verbose_name="客户名称")
  88. en_name = models.CharField(max_length=255, verbose_name="英文名称")
  89. mobile = models.CharField(max_length=255, verbose_name="手机号码")
  90. contact = models.CharField(max_length=60, verbose_name="联系人")
  91. address = models.CharField(max_length=255, verbose_name="联系地址")
  92. other = models.CharField(max_length=255, verbose_name="其它信息")
  93. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  94. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  95. class Meta:
  96. db_table = 'dc_customer'
  97. verbose_name = "客户信息"
  98. verbose_name_plural = "客户信息"
  99. def clean(self):
  100. super().clean()
  101. # 检查是否存在同名且状态不为4的记录
  102. if Customer.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  103. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  104. def save(self, *args, **kwargs):
  105. self.full_clean()
  106. super().save(*args, **kwargs)
  107. def __str__(self):
  108. return self.name
  109. # 项目分类
  110. class ProjectCategory(models.Model):
  111. id = models.AutoField(primary_key=True)
  112. code = models.CharField(max_length=60, verbose_name="客户编码")
  113. name = models.CharField(max_length=255, verbose_name="客户名称")
  114. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  115. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  116. class Meta:
  117. db_table = 'dc_project_category'
  118. verbose_name = "项目分类"
  119. verbose_name_plural = "项目分类"
  120. def clean(self):
  121. super().clean()
  122. # 检查是否存在同名且状态不为4的记录
  123. if ProjectCategory.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  124. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  125. def save(self, *args, **kwargs):
  126. self.full_clean()
  127. super().save(*args, **kwargs)
  128. def __str__(self):
  129. return self.name
  130. # 项目信息
  131. class Project(models.Model):
  132. id = models.AutoField(primary_key=True)
  133. name = models.CharField(max_length=255, verbose_name="客户名称")
  134. intro = models.TextField(verbose_name="客户编码")
  135. customer_id = models.IntegerField(verbose_name="客户id")
  136. category_id = models.IntegerField(verbose_name="所属分类id")
  137. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  138. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  139. class Meta:
  140. db_table = 'dc_project'
  141. verbose_name = "项目信息"
  142. verbose_name_plural = "项目信息"
  143. def clean(self):
  144. super().clean()
  145. # 检查是否存在同名且状态不为4的记录
  146. if Project.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  147. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  148. def save(self, *args, **kwargs):
  149. self.full_clean()
  150. super().save(*args, **kwargs)
  151. def __str__(self):
  152. return self.name
  153. # 项目相关文档
  154. class ProjectDocument(models.Model):
  155. id = models.AutoField(primary_key=True)
  156. project_id = models.IntegerField(verbose_name="项目id")
  157. doc_id = models.IntegerField(verbose_name="文档id")
  158. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  159. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  160. class Meta:
  161. db_table = 'dc_project_document'
  162. verbose_name = "项目相关文档"
  163. verbose_name_plural = "项目相关文档"
  164. def __int__(self):
  165. return self.id
  166. # 文档
  167. class Document(models.Model):
  168. id = models.AutoField(primary_key=True)
  169. title = models.CharField(max_length=255, verbose_name="文档标题")
  170. data = models.TextField(verbose_name="文档内容")
  171. user_id = models.IntegerField(verbose_name="用户id", default=0)
  172. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  173. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  174. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  175. category_id = models.IntegerField(verbose_name="所属文档分类", default=0, blank=True,null=True)
  176. is_template = models.SmallIntegerField(choices=YESOrNO, verbose_name="是否为模板 0否 1是",default=1)
  177. class Meta:
  178. db_table = 'dc_document'
  179. verbose_name = "文档"
  180. verbose_name_plural = "文档"
  181. def __str__(self):
  182. return self.title
  183. # 文档
  184. class SourceData(models.Model):
  185. id = models.AutoField(primary_key=True)
  186. code = models.CharField(max_length=60, unique=True, verbose_name="数据代码")
  187. name = models.TextField(verbose_name="数据名称")
  188. file_name = models.TextField(verbose_name="文件名称", default="",blank=True, null=True)
  189. source_data = models.TextField(verbose_name="文件内容", default="")
  190. create_time = models.DateTimeField(verbose_name="创建日期", default=django.utils.timezone.now)
  191. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  192. category_id = models.IntegerField(verbose_name="所属文档分类", default=0)
  193. class Meta:
  194. db_table = 'dc_source_data'
  195. verbose_name = "原始数据"
  196. verbose_name_plural = "原始数据"
  197. def clean(self):
  198. super().clean()
  199. # 检查是否存在同名且状态不为4的记录
  200. if SourceData.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  201. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  202. def save(self, *args, **kwargs):
  203. self.full_clean()
  204. super().save(*args, **kwargs)
  205. def __str__(self):
  206. return self.name
  207. class SourceCategory(models.Model):
  208. name = models.CharField(max_length=100, verbose_name="分类名称")
  209. status = models.CharField(max_length=20, choices=[
  210. ('active', '启用'),
  211. ('inactive', '禁用')
  212. ], default='active', verbose_name="分类状态")
  213. created_at = models.DateTimeField(default=eight_hours_from_now, verbose_name="创建时间")
  214. class Meta:
  215. db_table = 'dc_source_data_category'
  216. verbose_name = "原始数据分类"
  217. verbose_name_plural = "原始数据分类"
  218. def clean(self):
  219. super().clean()
  220. # 检查是否存在同名且状态不为4的记录
  221. if SourceCategory.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  222. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  223. def save(self, *args, **kwargs):
  224. self.full_clean()
  225. super().save(*args, **kwargs)
  226. def __str__(self):
  227. return self.name
  228. # 文档分类
  229. class DocumentCategory(models.Model):
  230. id = models.AutoField(primary_key=True)
  231. name = models.CharField(max_length=255, verbose_name="文档分类名称")
  232. intro = models.TextField(verbose_name="文档分类介绍")
  233. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  234. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  235. class Meta:
  236. db_table = 'dc_document_category'
  237. verbose_name = "文档分类"
  238. verbose_name_plural = "文档分类"
  239. def clean(self):
  240. super().clean()
  241. # 检查是否存在同名且状态不为4的记录
  242. if DocumentCategory.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  243. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  244. def save(self, *args, **kwargs):
  245. self.full_clean()
  246. super().save(*args, **kwargs)
  247. def __str__(self):
  248. return self.name
  249. # 品牌信息
  250. class Brand(models.Model):
  251. id = models.AutoField(primary_key=True)
  252. name = models.CharField(max_length=255, verbose_name="品牌名称")
  253. intro = models.TextField(verbose_name="品牌介绍")
  254. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  255. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  256. class Meta:
  257. db_table = 'dc_brand'
  258. verbose_name = "品牌信息"
  259. verbose_name_plural = "品牌信息"
  260. def clean(self):
  261. super().clean()
  262. # 检查是否存在同名且状态不为4的记录
  263. if Brand.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  264. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  265. def save(self, *args, **kwargs):
  266. self.full_clean()
  267. super().save(*args, **kwargs)
  268. def __str__(self):
  269. return self.name
  270. # 供应商
  271. class Supplier(models.Model):
  272. id = models.AutoField(primary_key=True)
  273. code = models.CharField(max_length=255, verbose_name="供应商编码", unique=True)
  274. name = models.CharField(max_length=255, verbose_name="供应商名称")
  275. intro = models.TextField(verbose_name="供应商介绍")
  276. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  277. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  278. class Meta:
  279. db_table = 'dc_supplier'
  280. verbose_name = "供应商信息"
  281. verbose_name_plural = "供应商信息"
  282. def clean(self):
  283. super().clean()
  284. # 检查是否存在同名且状态不为4的记录
  285. if Supplier.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  286. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  287. def save(self, *args, **kwargs):
  288. self.full_clean()
  289. super().save(*args, **kwargs)
  290. def __str__(self):
  291. return self.name
  292. # 模板分类
  293. class TemplateCategory(models.Model):
  294. id = models.AutoField(primary_key=True)
  295. name = models.CharField(max_length=255, verbose_name="文档分类名称")
  296. intro = models.TextField(verbose_name="文档分类介绍",blank=True,null=True)
  297. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  298. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  299. parent_id = models.CharField(max_length=100,default="0", verbose_name="父类id")
  300. class Meta:
  301. db_table = 'dc_template_category'
  302. verbose_name = "模板分类"
  303. verbose_name_plural = "模板分类"
  304. def clean(self):
  305. super().clean()
  306. # 检查是否存在同名、状态不为4、parent_id不为0的记录
  307. if TemplateCategory.objects.filter(
  308. Q(name=self.name),
  309. Q(parent_id="0"), # 确保 parent_id 不等于 "0"
  310. ~Q(status=4),
  311. ~Q(pk=self.pk)
  312. ).exists():
  313. raise ValidationError({'name': _("已存在同名且非顶级的分类,请修改后重试。")})
  314. def save(self, *args, **kwargs):
  315. self.full_clean()
  316. super().save(*args, **kwargs)
  317. def __str__(self):
  318. return self.name
  319. # 模板信息
  320. class Template(models.Model):
  321. id = models.AutoField(primary_key=True)
  322. code = models.CharField(max_length=255, verbose_name="模板编码",blank=True,null=True)
  323. name = models.CharField(max_length=255, verbose_name="模板分类名称")
  324. intro = models.TextField(verbose_name="介绍", default="",blank=True,null=True)
  325. lay_id = models.CharField(max_length=100, default="", verbose_name="图层id",blank=True,null=True)
  326. type = models.CharField(max_length=100, default="", verbose_name="类型",blank=True,null=True)
  327. content = models.TextField(verbose_name="模板内容", default="",blank=True,null=True)
  328. attrs = models.TextField(verbose_name="属性", default="[]",blank=True,null=True)
  329. category_id = models.IntegerField(verbose_name="所属分类")
  330. admin_id = models.IntegerField(verbose_name="管理员id", default=0)
  331. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  332. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  333. class Meta:
  334. db_table = 'dc_template'
  335. verbose_name = "模板信息"
  336. verbose_name_plural = "模板信息"
  337. def clean(self):
  338. super().clean()
  339. # 检查是否存在同名且状态不为4的记录
  340. if Template.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  341. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  342. def save(self, *args, **kwargs):
  343. self.full_clean()
  344. super().save(*args, **kwargs)
  345. def __str__(self):
  346. return self.name
  347. # 模板分类
  348. class ImageCategory(models.Model):
  349. id = models.AutoField(primary_key=True)
  350. name = models.CharField(max_length=255, verbose_name="图片分类名称")
  351. intro = models.TextField(verbose_name="图片分类介绍")
  352. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  353. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  354. class Meta:
  355. db_table = 'dc_image_category'
  356. verbose_name = "图片分类"
  357. verbose_name_plural = "图片分类"
  358. def clean(self):
  359. super().clean()
  360. # 检查是否存在同名且状态不为4的记录
  361. if ImageCategory.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  362. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  363. def save(self, *args, **kwargs):
  364. self.full_clean()
  365. super().save(*args, **kwargs)
  366. def __str__(self):
  367. return self.name
  368. # 模板分类
  369. class Image(models.Model):
  370. id = models.AutoField(primary_key=True)
  371. category_id = models.IntegerField(verbose_name="图片分类")
  372. name = models.CharField(max_length=255, verbose_name="图片信息")
  373. width = models.CharField(max_length=60, verbose_name="图片宽度")
  374. height = models.CharField(max_length=255, verbose_name="图片高度")
  375. path = models.CharField(max_length=255, verbose_name="图片路径")
  376. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  377. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  378. class Meta:
  379. db_table = 'dc_image'
  380. verbose_name = "图片信息"
  381. verbose_name_plural = "图片信息"
  382. def clean(self):
  383. super().clean()
  384. # 检查是否存在同名且状态不为4的记录
  385. if Image.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  386. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  387. def save(self, *args, **kwargs):
  388. self.full_clean()
  389. super().save(*args, **kwargs)
  390. def __str__(self):
  391. return self.name
  392. # 系统参数配置
  393. class Params(models.Model):
  394. id = models.AutoField(primary_key=True)
  395. code = models.CharField(max_length=255, verbose_name="参数代码", unique=True)
  396. name = models.CharField(max_length=255, verbose_name="参数名称")
  397. value = models.CharField(max_length=255, verbose_name="参数值",blank=True,null=True)
  398. value_type = models.SmallIntegerField(verbose_name="变量类型", choices=ParamsValueType, default=1)
  399. value_item = models.CharField(max_length=255, verbose_name="取值范围",blank=True,null=True)
  400. intro = models.CharField(max_length=255, verbose_name="参数介绍",blank=True,null=True)
  401. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  402. type = models.SmallIntegerField(verbose_name="状态", choices=ParamsType, default=1)
  403. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  404. class Meta:
  405. db_table = 'dc_params'
  406. verbose_name = "参数配置"
  407. verbose_name_plural = "参数配置"
  408. def clean(self):
  409. super().clean()
  410. # 检查是否存在同名且状态不为4的记录
  411. if Params.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  412. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  413. def save(self, *args, **kwargs):
  414. self.full_clean()
  415. super().save(*args, **kwargs)
  416. def __str__(self):
  417. return self.name
  418. # 公式管理
  419. class Formula(models.Model):
  420. id = models.AutoField(primary_key=True)
  421. name = models.CharField(max_length=255, verbose_name="公式名称")
  422. formula = models.TextField(max_length=255, verbose_name="公式内容")
  423. intro = models.CharField(max_length=255, verbose_name="公式介绍")
  424. params = models.CharField(max_length=255, verbose_name="公式参数")
  425. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  426. use_status = models.SmallIntegerField(choices=UseStatus, verbose_name="用户状态", default=5)
  427. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态", default=5)
  428. point = models.SmallIntegerField(verbose_name="小数点标识",default=0)
  429. class Meta:
  430. db_table = 'dc_formula'
  431. verbose_name = "公式管理"
  432. verbose_name_plural = "公式管理"
  433. def clean(self):
  434. super().clean()
  435. # 检查是否存在同名且状态不为4的记录
  436. if Formula.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  437. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  438. def save(self, *args, **kwargs):
  439. self.full_clean()
  440. super().save(*args, **kwargs)
  441. def __str__(self):
  442. return self.name
  443. class Product(models.Model):
  444. id = models.AutoField(primary_key=True)
  445. category_id = models.IntegerField(verbose_name="分类信息")
  446. brand_id = models.IntegerField(verbose_name="所属品牌")
  447. supplier_id = models.IntegerField(verbose_name="所属供应商")
  448. name = models.CharField(max_length=255, verbose_name="产品名称")
  449. intro = models.CharField(max_length=255, verbose_name="产品介绍")
  450. price = models.CharField(max_length=255, verbose_name="价格")
  451. product_area = models.CharField(max_length=255, verbose_name="产地")
  452. is_safe = models.CharField(max_length=255, verbose_name="是否质保")
  453. safe_time = models.CharField(max_length=255, verbose_name="质保期限", default="")
  454. is_package = models.CharField(max_length=255, verbose_name="是否为套餐商品")
  455. package_intro = models.CharField(max_length=255, verbose_name="套餐说明", default="")
  456. qualifications = models.CharField(max_length=255, verbose_name="产品资质")
  457. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  458. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态", default=5)
  459. attrs = models.TextField(verbose_name="产品资质", default="")
  460. class Meta:
  461. db_table = 'dc_product'
  462. verbose_name = "产品信息"
  463. verbose_name_plural = "产品信息"
  464. def clean(self):
  465. super().clean()
  466. # 检查是否存在同名且状态不为4的记录
  467. if Product.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  468. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  469. def save(self, *args, **kwargs):
  470. self.full_clean()
  471. super().save(*args, **kwargs)
  472. def __str__(self):
  473. return self.name
  474. # 模板分类
  475. class ProductCategory(models.Model):
  476. id = models.AutoField(primary_key=True)
  477. parent_id = models.IntegerField(verbose_name="所属父级")
  478. name = models.CharField(max_length=255, verbose_name="分类名称")
  479. attrs = models.TextField(verbose_name="属性配置")
  480. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now)
  481. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  482. class Meta:
  483. db_table = 'dc_product_category'
  484. verbose_name = "产品分类"
  485. verbose_name_plural = "产品分类"
  486. def clean(self):
  487. super().clean()
  488. # 检查是否存在同名且状态不为4的记录
  489. if ProductCategory.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  490. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  491. def save(self, *args, **kwargs):
  492. self.full_clean()
  493. super().save(*args, **kwargs)
  494. def __str__(self):
  495. return self.name
  496. # 模板分类
  497. class ProductDocument(models.Model):
  498. id = models.AutoField(primary_key=True)
  499. product_id = models.IntegerField(verbose_name="相关产品")
  500. document_id = models.IntegerField(verbose_name="文档id")
  501. create_time = models.DateTimeField(verbose_name="创建日期", default=django.utils.timezone.now)
  502. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态")
  503. class Meta:
  504. db_table = 'dc_product_document'
  505. verbose_name = "产品相关文档"
  506. verbose_name_plural = "产品相关文档"
  507. def __int__(self):
  508. return self.id
  509. #用户菜单表
  510. class AuthMenu(models.Model):
  511. id = models.AutoField(primary_key=True)
  512. code = models.CharField(max_length=255, verbose_name="菜单code")
  513. name = models.CharField(max_length=255, verbose_name="菜单名称")
  514. parent_id = models.IntegerField(verbose_name="父级id",null=True, blank=True,default=0)
  515. path = models.CharField(max_length=255, verbose_name="权限路径",default='')
  516. type = models.CharField(max_length=255, verbose_name="type",default='')
  517. sort = models.IntegerField(verbose_name="排序",default=0)
  518. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态",default=5)
  519. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  520. class Meta:
  521. db_table = 'auth_menu'
  522. verbose_name = "用户菜单表"
  523. verbose_name_plural = "用户菜单表"
  524. def clean(self):
  525. super().clean()
  526. # 检查是否存在同名且状态不为4的记录
  527. if AuthMenu.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  528. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  529. def save(self, *args, **kwargs):
  530. self.full_clean()
  531. super().save(*args, **kwargs)
  532. def __str__(self):
  533. return self.name
  534. #用户菜单关联表
  535. class AuthUserMenu(models.Model):
  536. id = models.AutoField(primary_key=True)
  537. rola_id = models.IntegerField(verbose_name="角色id",default=0)
  538. menu_id = models.IntegerField(verbose_name="菜单id")
  539. class Meta:
  540. db_table = 'auth_user_menu'
  541. verbose_name = "用户菜单关联表"
  542. verbose_name_plural = "用户菜单关联表"
  543. def __str__(self):
  544. return self.name
  545. # 模块分类用户关联表
  546. class TemplateCateGoryUser(models.Model):
  547. id = models.AutoField(primary_key=True)
  548. rola_id = models.IntegerField(verbose_name="角色id",default=0)
  549. category_id = models.IntegerField(verbose_name="模块分类id")
  550. action = models.CharField(max_length=255, verbose_name="权限类型",default=0)
  551. value = models.CharField(max_length=255, verbose_name="权限code",default=0)
  552. type = models.CharField(max_length=255, verbose_name="归属分类",default=0)
  553. name = models.CharField(max_length=255, verbose_name="权限名称",default=0)
  554. label = models.CharField(max_length=255, verbose_name="权限label",default=0)
  555. isMain = models.CharField(max_length=255, verbose_name="权限label",default=0)
  556. class Meta:
  557. db_table = 'dc_template_category_user'
  558. verbose_name = "模块分类用户关联表"
  559. verbose_name_plural = "模块分类用户关联表"
  560. def __str__(self):
  561. return self.name
  562. # 模块分类用户关联表
  563. class DocumentCategoryUser(models.Model):
  564. id = models.AutoField(primary_key=True)
  565. rola_id = models.IntegerField(verbose_name="角色id",default=0)
  566. category_id = models.IntegerField(verbose_name="文档分类id")
  567. label = models.CharField(max_length=255, verbose_name="权限label", default=0)
  568. name = models.CharField(max_length=255, verbose_name="权限名称", default=0)
  569. action = models.CharField(max_length=255, verbose_name="权限类型", default=0)
  570. type = models.CharField(max_length=255, verbose_name="归属分类", default=0)
  571. value = models.CharField(max_length=255, verbose_name="权限code", default=0)
  572. isMain = models.CharField(max_length=255, verbose_name="是否选择", default=0)
  573. class Meta:
  574. db_table = 'dc_document_category_user'
  575. verbose_name = "文档分类角色关联表"
  576. verbose_name_plural = "文档分类角色关联表"
  577. def __str__(self):
  578. return self.name
  579. # 原始数据分类关联表
  580. class SourceDataCategoryUser(models.Model):
  581. id = models.AutoField(primary_key=True)
  582. rola_id = models.IntegerField(verbose_name="角色id",default=0)
  583. category_id = models.IntegerField(verbose_name="文档分类id")
  584. label = models.CharField(max_length=255, verbose_name="权限label", default=0)
  585. name = models.CharField(max_length=255, verbose_name="权限名称", default=0)
  586. action = models.CharField(max_length=255, verbose_name="权限类型", default=0)
  587. type = models.CharField(max_length=255, verbose_name="归属分类", default=0)
  588. value = models.CharField(max_length=255, verbose_name="权限code", default=0)
  589. isMain = models.CharField(max_length=255, verbose_name="是否选择", default=0)
  590. class Meta:
  591. db_table = 'dc_source_data_category_user'
  592. verbose_name = "原始数据分类关联表"
  593. verbose_name_plural = "原始数据分类关联表"
  594. def __str__(self):
  595. return self.name
  596. class Knowledgebase(models.Model):
  597. id = models.AutoField(primary_key=True)
  598. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  599. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  600. role_id= models.IntegerField(verbose_name="角色id", default=2)
  601. location=models.CharField(max_length=255, verbose_name="buceket内名称",default='')
  602. name = models.CharField(max_length=255, verbose_name="展示名称")
  603. description = models.CharField(max_length=255, verbose_name="描述备注",null=True, blank=True)
  604. language = models.CharField(max_length=255, verbose_name="语言",null=True, blank=True)
  605. embd_id = models.CharField(max_length=255, verbose_name="嵌入模型",null=True, blank=True)
  606. permission = models.CharField(max_length=255, verbose_name="权限:如果权限是“团队”,则所有团队成员都可以操作知识库。",null=True, blank=True)
  607. created_by = models.CharField(max_length=255, verbose_name="创建人id",null=True, blank=True)
  608. doc_num = models.CharField(max_length=255, verbose_name="",null=True, blank=True,default=0)
  609. token_num = models.CharField(max_length=255, verbose_name="块Token数",null=True, blank=True,default=0)
  610. chunk_num = models.CharField(max_length=255, verbose_name="",null=True, blank=True,default=0)
  611. similarity_threshold = models.CharField(max_length=255, verbose_name="相似度阈值",null=True, blank=True)
  612. vector_similarity_weight = models.CharField(max_length=255, verbose_name="关键字相似度权重",null=True, blank=True)
  613. parser_id = models.CharField(max_length=255, verbose_name="",null=True, blank=True)
  614. parser_config = models.CharField(max_length=255, verbose_name="",null=True, blank=True)
  615. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态",default=5)
  616. def clean(self):
  617. super().clean()
  618. # 检查是否存在同名且状态不为4的记录
  619. if Knowledgebase.objects.filter(name=self.name).exclude(status=4).exclude(pk=self.pk).exists():
  620. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  621. def save(self, *args, **kwargs):
  622. self.update_time = eight_hours_from_now()
  623. self.full_clean()
  624. super().save(*args, **kwargs)
  625. class Meta:
  626. db_table = 'kbm_knowledgebase'
  627. verbose_name = "bucket信息表"
  628. verbose_name_plural = "bucket信息表"
  629. def __str__(self):
  630. return self.name
  631. class File(models.Model):
  632. id = models.AutoField(primary_key=True)
  633. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  634. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  635. parent_id = models.CharField(max_length=255, verbose_name="父级id",null=True, blank=True)
  636. role_id = models.IntegerField(verbose_name="角色id", default=2)
  637. created_by = models.CharField(max_length=255, verbose_name="创建人id", null=True, blank=True)
  638. name = models.CharField(max_length=255, verbose_name="展示文件名称")
  639. location =models.CharField(max_length=255, verbose_name="原文件名称",null=True, blank=True)
  640. size = models.IntegerField(verbose_name="文件大小", default=0)
  641. type = models.CharField(max_length=255, verbose_name="文件类型")
  642. source_type = models.CharField(max_length=255, verbose_name="属于分类",default="knowledgebase",null=True, blank=True)
  643. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态",default=5)
  644. def clean(self):
  645. super().clean()
  646. # 检查是否存在同名且状态不为4的记录
  647. if File.objects.filter(name=self.name,parent_id=self.parent_id).exclude(status=4).exclude(pk=self.pk).exists():
  648. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  649. def save(self, *args, **kwargs):
  650. self.update_time = eight_hours_from_now()
  651. self.full_clean()
  652. super().save(*args, **kwargs)
  653. class Meta:
  654. db_table = 'kbm_file'
  655. verbose_name = "知识库文件层级表"
  656. verbose_name_plural = "知识库文件层级表"
  657. def __str__(self):
  658. return self.name
  659. class DocumentKbm(models.Model):
  660. id = models.AutoField(primary_key=True)
  661. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  662. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  663. thumbnail = models.TextField(verbose_name="图片解析base64",null=True, blank=True)
  664. kb_id =models.CharField(max_length=255, verbose_name="知识库id")
  665. parser_id =models.CharField(max_length=255, verbose_name="分析器id")
  666. parser_config =models.CharField(max_length=255, verbose_name="分析器配置信息")
  667. source_type = models.CharField(max_length=255, verbose_name="属于分类", default="local", null=True,blank=True)
  668. type = models.CharField(max_length=255, verbose_name="文件类型")
  669. created_by = models.CharField(max_length=255, verbose_name="创建人id", null=True, blank=True)
  670. name = models.CharField(max_length=255, verbose_name="展示文件名称")
  671. location = models.CharField(max_length=255, verbose_name="原文件名称", null=True, blank=True)
  672. size = models.IntegerField(verbose_name="文件大小", default=0)
  673. token_num = models.IntegerField(verbose_name="token数量", default=0)
  674. chunk_num = models.IntegerField(verbose_name="分块数量", default=0)
  675. progress = models.FloatField(verbose_name="解析数", default=0)
  676. progress_msg = models.TextField(verbose_name="解析详情信息",default='',null=True, blank=True)
  677. process_begin_at = models.DateTimeField(verbose_name="解析开始时间",null=True, blank=True)
  678. process_duation = models.FloatField(verbose_name="解析时间记录", default=0)
  679. run = models.CharField(max_length=255, verbose_name="解析标识",default=0)
  680. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态",default=5)
  681. def clean(self):
  682. super().clean()
  683. # 检查是否存在同名且状态不为4的记录
  684. if DocumentKbm.objects.filter(name=self.name,kb_id=self.kb_id).exclude(status=4).exclude(pk=self.pk).exists():
  685. raise ValidationError({'name': _("已存在同名,请修改后重试。")})
  686. def save(self, *args, **kwargs):
  687. self.update_time = eight_hours_from_now()
  688. self.full_clean()
  689. super().save(*args, **kwargs)
  690. class Meta:
  691. db_table = 'kbm_document'
  692. verbose_name = "上传文件详情表"
  693. verbose_name_plural = "上传文件详情表"
  694. def __str__(self):
  695. return self.name
  696. class File2document(models.Model):
  697. id = models.AutoField(primary_key=True)
  698. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  699. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  700. file_id =models.CharField(max_length=255, verbose_name="文件fileid")
  701. document_id =models.CharField(max_length=255, verbose_name="文件详情id")
  702. def save(self, *args, **kwargs):
  703. self.update_time = eight_hours_from_now()
  704. self.full_clean()
  705. super().save(*args, **kwargs)
  706. class Meta:
  707. db_table = 'kbm_file2document'
  708. verbose_name = "文件位置关联表"
  709. verbose_name_plural = "文件位置关联表"
  710. def __str__(self):
  711. return self.name
  712. class Task(models.Model):
  713. id = models.AutoField(primary_key=True)
  714. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now,null=True, blank=True)
  715. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  716. doc_id = models.CharField(max_length=255, verbose_name="文件详情id")
  717. from_page = models.IntegerField(verbose_name="开始页数", default=0)
  718. to_page = models.IntegerField(verbose_name="结束页数", default=-1)
  719. begin_at = models.CharField(max_length=255, verbose_name="begin_at",null=True, blank=True)
  720. process_duation = models.FloatField(max_length=255, verbose_name="解析时间",default=0)
  721. progress = models.FloatField(max_length=255, verbose_name="解析进度",default=0)
  722. progress_msg = models.TextField(max_length=255, verbose_name="解析内容",default='',null=True, blank=True)
  723. def save(self, *args, **kwargs):
  724. self.update_time = eight_hours_from_now()
  725. self.full_clean()
  726. super().save(*args, **kwargs)
  727. class Meta:
  728. db_table = 'kbm_task'
  729. verbose_name = "文件解析信息表"
  730. verbose_name_plural = "文件解析信息表"
  731. def __str__(self):
  732. return self.name
  733. class TaskSublist(models.Model):
  734. id = models.AutoField(primary_key=True)
  735. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now, null=True, blank=True)
  736. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  737. doc_id = models.CharField(max_length=255, verbose_name="文件详情id")
  738. name = models.CharField(max_length=255, verbose_name="展示文件名称")
  739. page_number = models.CharField(max_length=255, verbose_name="第几页",default=0)
  740. chunk_number = models.CharField(max_length=255, verbose_name="分片数量",default=0)
  741. content = models.TextField(max_length=255, verbose_name="解析文本",default='',null=True, blank=True)
  742. milvus_id = models.CharField(max_length=255, verbose_name="milvus向量库id", default=0,null=True, blank=True)
  743. def save(self, *args, **kwargs):
  744. self.update_time = eight_hours_from_now()
  745. self.full_clean()
  746. super().save(*args, **kwargs)
  747. class Meta:
  748. db_table = 'kbm_task_sublist'
  749. verbose_name = "文件解析子表"
  750. verbose_name_plural = "文件解析子表"
  751. def __str__(self):
  752. return self.name
  753. class UserOperation(models.Model):
  754. id = models.AutoField(primary_key=True)
  755. role_id = models.IntegerField(verbose_name="角色id")
  756. operation_id = models.IntegerField(verbose_name="操作权限id")
  757. class Meta:
  758. db_table = 'auth_user_operation'
  759. verbose_name = "用户模块权限表"
  760. verbose_name_plural = "用户模块权限表"
  761. def __str__(self):
  762. return self.name
  763. class Operation(models.Model):
  764. id = models.AutoField(primary_key=True)
  765. name = models.CharField(max_length=255, verbose_name="对应模块名称")
  766. content_type_id = models.IntegerField(verbose_name="所属分类id", default=0)
  767. codename = models.CharField(max_length=100, verbose_name="权限code码")
  768. class Meta:
  769. db_table = 'auth_operation'
  770. verbose_name = "菜单操作权限表"
  771. verbose_name_plural = "菜单操作权限表"
  772. def __str__(self):
  773. return self.name
  774. class WechatUser(models.Model):
  775. id = models.AutoField(primary_key=True)
  776. name = models.CharField(max_length=255, verbose_name="姓名",null=True, blank=True)
  777. nikeName = models.CharField(max_length=255, verbose_name="昵称",null=True, blank=True)
  778. phone = models.CharField(max_length=255, verbose_name="手机号",null=True, blank=True)
  779. openid = models.CharField(max_length=255, verbose_name="微信唯一标识",null=True, blank=True)
  780. age = models.CharField(max_length=255, verbose_name="年龄",null=True, blank=True)
  781. level = models.CharField(max_length=255, verbose_name="等级",null=True, blank=True,default=1)
  782. user_id = models.CharField(max_length=255, verbose_name="用户id",null=True, blank=True)
  783. id_card = models.CharField(max_length=255, verbose_name="身份证号",null=True, blank=True)
  784. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态", default=5)
  785. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now, null=True, blank=True)
  786. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  787. mini_url = models.CharField(max_length=255, verbose_name="小程序头像url",null=True, blank=True)
  788. examine = models.CharField(max_length=255, verbose_name="审核状态 0未审核 1审核",null=True, blank=True,default=0)
  789. source = models.CharField(max_length=255, verbose_name="来源标识 pc:pc 小程序:mini", null=True, blank=True)
  790. def save(self, *args, **kwargs):
  791. self.update_time = eight_hours_from_now()
  792. self.full_clean()
  793. super().save(*args, **kwargs)
  794. class Meta:
  795. db_table = 'wechat_user'
  796. verbose_name = "微信用户表"
  797. verbose_name_plural = "微信用户表"
  798. def __str__(self):
  799. return self.name
  800. class WechatComplaint(models.Model):
  801. id = models.AutoField(primary_key=True)
  802. name = models.CharField(max_length=255, verbose_name="姓名",null=True, blank=True)
  803. phone = models.CharField(max_length=255, verbose_name="手机号",null=True, blank=True)
  804. corporate_name = models.CharField(max_length=255, verbose_name="公司名称",null=True, blank=True)
  805. content = models.CharField(max_length=255, verbose_name="内容",null=True, blank=True)
  806. status = models.SmallIntegerField(choices=DefaultStatus, verbose_name="状态", default=5)
  807. create_time = models.DateTimeField(verbose_name="创建日期", default=eight_hours_from_now, null=True, blank=True)
  808. update_time = models.DateTimeField(verbose_name="更新时间", default=eight_hours_from_now)
  809. def save(self, *args, **kwargs):
  810. if self.status is None:
  811. self.status = 5
  812. self.update_time = eight_hours_from_now()
  813. self.full_clean()
  814. super().save(*args, **kwargs)
  815. class Meta:
  816. db_table = 'wechat_complaint'
  817. verbose_name = "微信投诉建议信息表"
  818. verbose_name_plural = "微信投诉建议信息表"
  819. def __str__(self):
  820. return self.name