feat: model add note

This commit is contained in:
zty 2025-04-23 16:48:52 +08:00
parent 6e12ca3137
commit b66157edb8
26 changed files with 193 additions and 96 deletions

View File

@ -7,7 +7,7 @@ from apps.utils.models import CommonADModel, CommonBModel
class Area(CommonBModel): class Area(CommonBModel):
""" """
地图区域 TN: 地图区域
""" """
AREA_1 = 10 AREA_1 = 10
AREA_2 = 20 AREA_2 = 20
@ -47,7 +47,7 @@ class Area(CommonBModel):
class Access(CommonADModel): class Access(CommonADModel):
""" """
准入禁入权限(动态变化) TN: 准入禁入权限(动态变化)
""" """
ACCESS_IN_YES = 10 ACCESS_IN_YES = 10
ACCESS_IN_NO = 20 ACCESS_IN_NO = 20

View File

@ -6,6 +6,7 @@ from apps.wpm.models import WmStateOption
# Create your models here. # Create your models here.
class LableMat(BaseModel): class LableMat(BaseModel):
"""TN: 标签物料"""
state = models.PositiveSmallIntegerField('状态', default=10, choices=WmStateOption.choices) state = models.PositiveSmallIntegerField('状态', default=10, choices=WmStateOption.choices)
material = models.ForeignKey(Material, on_delete=models.CASCADE) material = models.ForeignKey(Material, on_delete=models.CASCADE)
batch = models.CharField('批次号', max_length=100) batch = models.CharField('批次号', max_length=100)

View File

@ -3,6 +3,7 @@ from apps.utils.models import CommonADModel
# Create your models here. # Create your models here.
class Article(CommonADModel): class Article(CommonADModel):
"""TN: 文章"""
title = models.CharField(max_length=200, verbose_name="标题") title = models.CharField(max_length=200, verbose_name="标题")
poster = models.TextField(verbose_name="封面地址", null=True, blank=True) poster = models.TextField(verbose_name="封面地址", null=True, blank=True)
video = models.TextField(verbose_name="视频地址", null=True, blank=True) video = models.TextField(verbose_name="视频地址", null=True, blank=True)

View File

@ -5,6 +5,7 @@ from apps.utils.models import BaseModel
class Project(BaseModel): class Project(BaseModel):
"""TN: 项目"""
name = models.CharField('项目名称', max_length=50) name = models.CharField('项目名称', max_length=50)
code = models.CharField('标识', max_length=20, unique=True) code = models.CharField('标识', max_length=20, unique=True)
config_json = models.JSONField('配置信息', default=dict) config_json = models.JSONField('配置信息', default=dict)

View File

@ -5,7 +5,7 @@ from django_celery_beat.models import PeriodicTask
# Create your models here. # Create your models here.
class RiskPoint(CommonAModel): class RiskPoint(CommonAModel):
""" """
风险点表 TN: 风险点表
""" """
R_LEVEL = ( R_LEVEL = (
(10, '低风险'), (10, '低风险'),
@ -34,7 +34,7 @@ class RiskPoint(CommonAModel):
class Risk(CommonAModel): class Risk(CommonAModel):
""" """
风险表 TN: 风险表
""" """
name = models.TextField('项目/步骤') name = models.TextField('项目/步骤')
level = models.PositiveSmallIntegerField('风险等级', default=10, choices=RiskPoint.R_LEVEL) level = models.PositiveSmallIntegerField('风险等级', default=10, choices=RiskPoint.R_LEVEL)
@ -56,7 +56,7 @@ class Risk(CommonAModel):
class CheckTaskSet(CommonADModel): class CheckTaskSet(CommonADModel):
""" """
检查任务派发设置 TN:检查任务派发设置
""" """
riskpoint = models.ForeignKey(RiskPoint, verbose_name='关联风险点', related_name='ctask_riskpoint', on_delete=models.SET_NULL, null=True, blank=True) riskpoint = models.ForeignKey(RiskPoint, verbose_name='关联风险点', related_name='ctask_riskpoint', on_delete=models.SET_NULL, null=True, blank=True)
note = models.TextField('派发备注', null=True, blank=True) note = models.TextField('派发备注', null=True, blank=True)
@ -68,7 +68,7 @@ class CheckTaskSet(CommonADModel):
class CheckWork(CommonAModel): class CheckWork(CommonAModel):
""" """
检查工作 TN: 检查工作
""" """
CW_TYPE = ( CW_TYPE = (
(10, '手动'), (10, '手动'),
@ -90,7 +90,7 @@ class CheckWork(CommonAModel):
class Hazard(CommonADModel): class Hazard(CommonADModel):
""" """
事故隐患表 TN: 事故隐患表
""" """
H_HARM = ( H_HARM = (
(10, '无伤害'), (10, '无伤害'),
@ -142,7 +142,7 @@ class Hazard(CommonADModel):
class CheckItem(BaseModel): class CheckItem(BaseModel):
""" """
检查工作-隐患关联表 TN:检查工作-隐患关联表
""" """
CITEM_RESULT = ( CITEM_RESULT = (
(10, '未检查'), (10, '未检查'),

View File

@ -16,7 +16,7 @@ LEVEL_CHOICES = (
class EventCate(CommonAModel): class EventCate(CommonAModel):
""" """
事件种类 TN: 事件种类
""" """
EVENT_TRIGGER_CHOICES = ( EVENT_TRIGGER_CHOICES = (
(10, '监控'), (10, '监控'),
@ -47,7 +47,7 @@ class EventCate(CommonAModel):
class AlgoChannel(BaseModel): class AlgoChannel(BaseModel):
"""TN: 算法通道"""
algo = models.ForeignKey(EventCate, verbose_name='关联算法', on_delete=models.CASCADE, related_name='ac_algo') algo = models.ForeignKey(EventCate, verbose_name='关联算法', on_delete=models.CASCADE, related_name='ac_algo')
vchannel = models.ForeignKey(TDevice, verbose_name='视频通道', on_delete=models.CASCADE, related_name='ac_vchannel') vchannel = models.ForeignKey(TDevice, verbose_name='视频通道', on_delete=models.CASCADE, related_name='ac_vchannel')
always_on = models.BooleanField("实时开启", default=False) always_on = models.BooleanField("实时开启", default=False)
@ -58,7 +58,7 @@ class AlgoChannel(BaseModel):
class NotifySetting(CommonADModel): class NotifySetting(CommonADModel):
""" """
提醒配置 TN: 提醒配置
""" """
PUSH_FILTER1_CHOICES = ( PUSH_FILTER1_CHOICES = (
(10, '当事人部门'), (10, '当事人部门'),
@ -84,7 +84,7 @@ class NotifySetting(CommonADModel):
class Event(CommonBDModel): class Event(CommonBDModel):
""" """
事件 TN: 事件
""" """
EVENT_MARK_CHOICES = ( EVENT_MARK_CHOICES = (
(10, '正常'), (10, '正常'),
@ -118,6 +118,7 @@ class Event(CommonBDModel):
class Eventdo(BaseModel): class Eventdo(BaseModel):
"""TN: 事件处理记录"""
cate = models.ForeignKey(EventCate, verbose_name='关联事件种类', cate = models.ForeignKey(EventCate, verbose_name='关联事件种类',
on_delete=models.CASCADE, related_name='do_cate') on_delete=models.CASCADE, related_name='do_cate')
event = models.ForeignKey(Event, verbose_name='关联事件', event = models.ForeignKey(Event, verbose_name='关联事件',
@ -130,7 +131,7 @@ class Eventdo(BaseModel):
class Remind(BaseModel): class Remind(BaseModel):
""" """
事件提醒表 TN: 事件提醒表
""" """
event = models.ForeignKey(Event, verbose_name='关联事件', event = models.ForeignKey(Event, verbose_name='关联事件',
on_delete=models.CASCADE) on_delete=models.CASCADE)

View File

@ -6,6 +6,7 @@ from apps.system.models import User, Dept, File
class Train(CommonADModel): class Train(CommonADModel):
"""TN: 线下培训"""
T_L_POST = 10 T_L_POST = 10
T_L_TEAM = 20 T_L_TEAM = 20
T_L_DEPT = 30 T_L_DEPT = 30
@ -27,6 +28,7 @@ class Train(CommonADModel):
class Questioncat(CommonAModel): class Questioncat(CommonAModel):
"""TN: 题库分类"""
name = models.CharField(max_length=200, verbose_name="名称") name = models.CharField(max_length=200, verbose_name="名称")
parent = models.ForeignKey("self", on_delete=models.SET_NULL, null=True, blank=True, verbose_name="父级", related_name="cate_parent") parent = models.ForeignKey("self", on_delete=models.SET_NULL, null=True, blank=True, verbose_name="父级", related_name="cate_parent")
sort = models.PositiveIntegerField(default=0, verbose_name="排序") sort = models.PositiveIntegerField(default=0, verbose_name="排序")
@ -40,6 +42,7 @@ class Questioncat(CommonAModel):
class Question(CommonAModel): class Question(CommonAModel):
"""TN: 题目"""
Q_DAN = 10 Q_DAN = 10
Q_DUO = 20 Q_DUO = 20
Q_PAN = 30 Q_PAN = 30
@ -65,6 +68,7 @@ class Question(CommonAModel):
class Paper(CommonAModel): class Paper(CommonAModel):
"""TN: 押题卷"""
PAPER_FIX = 10 # 固定试卷 PAPER_FIX = 10 # 固定试卷
PAPER_RANDOM = 20 # 自动抽题 PAPER_RANDOM = 20 # 自动抽题
@ -94,6 +98,7 @@ class Paper(CommonAModel):
class PaperQuestion(BaseModel): class PaperQuestion(BaseModel):
"""TN: 试卷-试题关系表"""
paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name="试卷") paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name="试卷")
question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name="试题") question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name="试题")
total_score = models.FloatField(default=0, verbose_name="单题满分") total_score = models.FloatField(default=0, verbose_name="单题满分")
@ -101,6 +106,7 @@ class PaperQuestion(BaseModel):
class Exam(CommonADModel): class Exam(CommonADModel):
"""TN: 在线考试"""
name = models.CharField("名称", max_length=100) name = models.CharField("名称", max_length=100)
open_time = models.DateTimeField("开启时间") open_time = models.DateTimeField("开启时间")
close_time = models.DateTimeField("关闭时间", null=True, blank=True) close_time = models.DateTimeField("关闭时间", null=True, blank=True)
@ -120,7 +126,7 @@ class Exam(CommonADModel):
class ExamRecord(CommonADModel): class ExamRecord(CommonADModel):
""" """
考试记录表 TN: 考试记录表
""" """
exam = models.ForeignKey(Exam, on_delete=models.CASCADE, verbose_name="关联考试", related_name="record_exam") exam = models.ForeignKey(Exam, on_delete=models.CASCADE, verbose_name="关联考试", related_name="record_exam")
@ -139,6 +145,7 @@ class ExamRecord(CommonADModel):
class AnswerDetail(BaseModel): class AnswerDetail(BaseModel):
"""TN: 答题记录详情表"""
examrecord = models.ForeignKey(ExamRecord, on_delete=models.CASCADE, related_name="detail_er") examrecord = models.ForeignKey(ExamRecord, on_delete=models.CASCADE, related_name="detail_er")
total_score = models.FloatField(default=0, verbose_name="该题满分") total_score = models.FloatField(default=0, verbose_name="该题满分")
question = models.ForeignKey(Question, on_delete=models.CASCADE) question = models.ForeignKey(Question, on_delete=models.CASCADE)

View File

@ -9,6 +9,7 @@ etype_choices = ((10, "生产设备"), (20, "计量设备"), (30, "治理设备"
class Ecate(CommonADModel): class Ecate(CommonADModel):
"""TN:设备类别"""
name = models.CharField("名称", max_length=50, unique=True) name = models.CharField("名称", max_length=50, unique=True)
code = models.CharField("编码", max_length=50, unique=True, null=True, blank=True) code = models.CharField("编码", max_length=50, unique=True, null=True, blank=True)
type = models.PositiveSmallIntegerField("类型", choices=etype_choices, help_text=str(etype_choices)) type = models.PositiveSmallIntegerField("类型", choices=etype_choices, help_text=str(etype_choices))
@ -22,8 +23,7 @@ class Ecate(CommonADModel):
class Equipment(CommonBModel): class Equipment(CommonBModel):
""" """
设备台账信息 TN:设备台账信息,其中belong_dept是责任部门
其中belong_dept是责任部门
""" """
RUNING = 10 RUNING = 10
STANDBY = 20 STANDBY = 20
@ -126,7 +126,7 @@ class Equipment(CommonBModel):
class EcheckRecord(CommonADModel): class EcheckRecord(CommonADModel):
""" """
校准检定记录 TN:校准检定记录
""" """
CHECK_CHOICES = ((10, "正常"), (20, "异常")) CHECK_CHOICES = ((10, "正常"), (20, "异常"))
@ -139,7 +139,7 @@ class EcheckRecord(CommonADModel):
class EInspect(CommonADModel): class EInspect(CommonADModel):
""" """
巡检记录 TN:巡检记录
""" """
INSPECT_RESULTS = ( INSPECT_RESULTS = (

View File

@ -5,6 +5,7 @@ from apps.mtm.models import Material, Mgroup, Team
from django_celery_beat.models import PeriodicTask from django_celery_beat.models import PeriodicTask
class Xscript(BaseModel): class Xscript(BaseModel):
"""TN:脚本"""
name = models.CharField("脚本名称", max_length=50) name = models.CharField("脚本名称", max_length=50)
code = models.TextField("脚本内容", null=True, blank=True) code = models.TextField("脚本内容", null=True, blank=True)
base_data = models.JSONField("基础数据", default=dict, null=True, blank=True) base_data = models.JSONField("基础数据", default=dict, null=True, blank=True)
@ -13,7 +14,7 @@ class Xscript(BaseModel):
periodictask = models.ForeignKey(PeriodicTask, verbose_name='关联定时任务', on_delete=models.CASCADE, related_name='xscript_periodictask', null=True, blank=True) periodictask = models.ForeignKey(PeriodicTask, verbose_name='关联定时任务', on_delete=models.CASCADE, related_name='xscript_periodictask', null=True, blank=True)
class Mpoint(CommonBModel): class Mpoint(CommonBModel):
"""测点""" """TN:测点"""
MT_AUTO = 10 MT_AUTO = 10
MT_COMPUTE = 20 MT_COMPUTE = 20
MT_MANUAL = 30 MT_MANUAL = 30
@ -69,7 +70,7 @@ class Mpoint(CommonBModel):
class MpLogx(models.Model): class MpLogx(models.Model):
""" """
测点记录超表 TN:测点记录超表
""" """
timex = models.DateTimeField("采集时间", primary_key=True) timex = models.DateTimeField("采集时间", primary_key=True)
@ -87,7 +88,7 @@ class MpLogx(models.Model):
class MpLog(BaseModel): class MpLog(BaseModel):
"""旧表(已废弃)""" """TN:旧表(已废弃)"""
mpoint = models.ForeignKey(Mpoint, verbose_name="关联测点", on_delete=models.SET_NULL, null=True, blank=True) mpoint = models.ForeignKey(Mpoint, verbose_name="关联测点", on_delete=models.SET_NULL, null=True, blank=True)
tag_id = models.BigIntegerField("记录ID", db_index=True) tag_id = models.BigIntegerField("记录ID", db_index=True)
@ -97,7 +98,7 @@ class MpLog(BaseModel):
class MpointStat(CommonADModel): class MpointStat(CommonADModel):
"""测点统计表""" """TN:测点统计表"""
type = models.CharField("统计维度", max_length=50, default="hour", help_text="year/month/day/year_s/month_s/month_st/day_s/sflog/hour_s/hour") type = models.CharField("统计维度", max_length=50, default="hour", help_text="year/month/day/year_s/month_s/month_st/day_s/sflog/hour_s/hour")
year = models.PositiveSmallIntegerField("", null=True, blank=True) year = models.PositiveSmallIntegerField("", null=True, blank=True)
@ -123,7 +124,7 @@ class MpointStat(CommonADModel):
class EnStat(BaseModel): class EnStat(BaseModel):
""" """
能源数据统计表 TN:能源数据统计表
""" """
type = models.CharField("统计维度", max_length=50, default="hour", help_text="year_s/month_s/month_st/day_s/sflog/hour_s") type = models.CharField("统计维度", max_length=50, default="hour", help_text="year_s/month_s/month_st/day_s/sflog/hour_s")
@ -174,7 +175,7 @@ class EnStat(BaseModel):
class EnStat2(BaseModel): class EnStat2(BaseModel):
""" """
能源数据统计表2 TN:能源数据统计表2
""" """
type = models.CharField("统计维度", max_length=50, default="month_s", help_text="month_s/day_s") type = models.CharField("统计维度", max_length=50, default="month_s", help_text="month_s/day_s")

View File

@ -6,6 +6,7 @@ from apps.em.models import Equipment
class Drain(CommonBModel): class Drain(CommonBModel):
"""TN:排口表"""
DR_TYPE_CHOICES = ( DR_TYPE_CHOICES = (
(10, "排放口"), (10, "排放口"),
(20, "污染源"), (20, "污染源"),
@ -37,7 +38,7 @@ class Drain(CommonBModel):
class DrainEquip(BaseModel): class DrainEquip(BaseModel):
""" """
排口/设备关系表 TN:排口/设备关系表
""" """
drain = models.ForeignKey(Drain, verbose_name="排口", related_name="drainequip_drain", on_delete=models.CASCADE) drain = models.ForeignKey(Drain, verbose_name="排口", related_name="drainequip_drain", on_delete=models.CASCADE)
@ -50,7 +51,7 @@ class DrainEquip(BaseModel):
class EnvData(models.Model): class EnvData(models.Model):
""" """
环保监测数据 TN:环保监测数据
""" """
enp_fields = [ enp_fields = [
@ -105,6 +106,7 @@ class EnvData(models.Model):
class VehicleAccess(BaseModel): class VehicleAccess(BaseModel):
"""TN:车辆出入厂记录"""
type = models.PositiveSmallIntegerField("出入类型", default=1, help_text="1: 进厂, 2: 出厂") type = models.PositiveSmallIntegerField("出入类型", default=1, help_text="1: 进厂, 2: 出厂")
vehicle_number = models.CharField("车牌号", max_length=10) vehicle_number = models.CharField("车牌号", max_length=10)
access_time = models.DateTimeField("出入时间", null=True, blank=True) access_time = models.DateTimeField("出入时间", null=True, blank=True)
@ -114,6 +116,7 @@ class VehicleAccess(BaseModel):
class CarWash(BaseModel): class CarWash(BaseModel):
"""TN:洗车记录"""
station = models.ForeignKey(Equipment, verbose_name="洗车台", on_delete=models.CASCADE) station = models.ForeignKey(Equipment, verbose_name="洗车台", on_delete=models.CASCADE)
vehicle_number = models.CharField("车牌号", max_length=10, default="") vehicle_number = models.CharField("车牌号", max_length=10, default="")
start_time = models.DateTimeField("洗车时间", null=True, blank=True) start_time = models.DateTimeField("洗车时间", null=True, blank=True)

View File

@ -6,6 +6,7 @@ from apps.wpm.models import SfLog
# Create your models here. # Create your models here.
class Fee(BaseModel): class Fee(BaseModel):
"""TN:费用"""
name = models.CharField('名称', max_length=20) name = models.CharField('名称', max_length=20)
cate = models.CharField('父名称', max_length=20) cate = models.CharField('父名称', max_length=20)
element = models.CharField('要素', max_length=20, help_text='直接材料/直接人工/制造费用') element = models.CharField('要素', max_length=20, help_text='直接材料/直接人工/制造费用')
@ -13,6 +14,7 @@ class Fee(BaseModel):
class FeeSet(CommonADModel): class FeeSet(CommonADModel):
"""TN:费用集合"""
year = models.PositiveSmallIntegerField('年份') year = models.PositiveSmallIntegerField('年份')
month = models.PositiveSmallIntegerField('月份') month = models.PositiveSmallIntegerField('月份')
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE) mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE)
@ -21,6 +23,7 @@ class FeeSet(CommonADModel):
class PriceSet(CommonADModel): class PriceSet(CommonADModel):
"""TN:价格集合"""
year = models.PositiveSmallIntegerField('年份') year = models.PositiveSmallIntegerField('年份')
month = models.PositiveSmallIntegerField('月份') month = models.PositiveSmallIntegerField('月份')
material = models.ForeignKey('mtm.material', on_delete=models.CASCADE, verbose_name='关联物料') material = models.ForeignKey('mtm.material', on_delete=models.CASCADE, verbose_name='关联物料')

View File

@ -8,7 +8,7 @@ from datetime import timedelta
class Employee(CommonBModel): class Employee(CommonBModel):
""" """
员工信息 TN:员工信息
""" """
JOB_ON = 10 JOB_ON = 10
JOB_OFF = 20 JOB_OFF = 20
@ -77,7 +77,7 @@ class Employee(CommonBModel):
class NotWorkRemark(CommonADModel): class NotWorkRemark(CommonADModel):
""" """
离岗说明 TN:离岗说明
""" """
not_work_date = models.DateField('未打卡日期') not_work_date = models.DateField('未打卡日期')
user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE) user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)
@ -86,7 +86,7 @@ class NotWorkRemark(CommonADModel):
class Attendance(CommonADModel): class Attendance(CommonADModel):
""" """
到岗记录 TN:到岗记录
""" """
ATT_STATE_CHOICES = [ ATT_STATE_CHOICES = [
('pending', '待定'), ('pending', '待定'),
@ -119,7 +119,7 @@ class Attendance(CommonADModel):
class ClockRecord(BaseModel): class ClockRecord(BaseModel):
""" """
打卡记录 TN:打卡记录
""" """
ClOCK_ON = 10 ClOCK_ON = 10
CLOCK_OFF = 20 CLOCK_OFF = 20
@ -157,7 +157,7 @@ class ClockRecord(BaseModel):
class Certificate(CommonAModel): class Certificate(CommonAModel):
""" """
证书 TN:证书
""" """
CERT_OK = 10 CERT_OK = 10
CERT_EXPIRING = 20 CERT_EXPIRING = 20

View File

@ -1,3 +1,69 @@
from django.shortcuts import render from django.shortcuts import render
# Create your views here. # Create your views here.
from pydantic import Field
from langchain_core.language_models import LLM
from langchain_core.outputs import LLMResult, Generation
import requests
class CustomLLM(LLM):
model_url: str
def _call(self, prompt: str, stop: list = None) -> str:
data = {
"model": "glm4",
"messages": [
{
"role": "system",
"content": "你是一个 SQL 助手,严格遵循以下规则:\n"
"1. 只返回 PostgreSQL 语法 SQL 语句。\n"
"2. 严格禁止添加任何解释、注释、Markdown 代码块标记(包括 ```sql 和 ```)。\n"
"3. 输出必须是纯 SQL且可直接执行无需任何额外处理。"
"4. 在 SQL 中如有多个表,请始终使用表名前缀引用字段,避免字段歧义。"
},
{"role": "user", "content": prompt}
],
"stream": False
}
response = requests.post(self.model_url, json=data, timeout=600)
response.raise_for_status()
content = response.json()["choices"][0]["message"]["content"]
clean_sql = self.strip_sql_markdown(content)
print('clean content----------', clean_sql)
return clean_sql
def _generate(self, prompts: list, stop: list = None) -> LLMResult:
generations = []
for prompt in prompts:
text = self._call(prompt, stop)
generations.append([Generation(text=text)])
return LLMResult(generations=generations)
def strip_sql_markdown(self, content: str) -> str:
import re
# 去掉包裹在 ```sql 或 ``` 中的内容
match = re.search(r"```sql\s*(.*?)```", content, re.DOTALL | re.IGNORECASE)
if match:
return match.group(1).strip()
match = re.search(r"```\s*(.*?)```", content, re.DOTALL)
if match:
return match.group(1).strip()
return content.strip()
@property
def _llm_type(self) -> str:
return "custom_llm"
# 实例化
# model_url = "http://14.22.88.72:11025/v1/chat/completions"
model_url = "http://139.159.180.64:11434/v1/chat/completions"
llm = CustomLLM(model_url=model_url)
# 测试数据库查询
from langchain_experimental.sql import SQLDatabaseChain
from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("postgresql+pg8000://postgres:zcDsj%402024@127.0.0.1:5432/factory")
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
result = db_chain.invoke("帮我生成一份数据库的表结构")
print('res-------------------------------',result)

View File

@ -11,7 +11,7 @@ from django.db.models import Max
class WareHouse(CommonBModel): class WareHouse(CommonBModel):
""" """
仓库信息 TN:仓库信息
""" """
number = models.CharField('仓库编号', max_length=20) number = models.CharField('仓库编号', max_length=20)
name = models.CharField('仓库名称', max_length=20) name = models.CharField('仓库名称', max_length=20)
@ -20,7 +20,7 @@ class WareHouse(CommonBModel):
class MaterialBatch(BaseModel): class MaterialBatch(BaseModel):
""" """
物料批次 TN:物料批次
""" """
batch = models.TextField('批次号') batch = models.TextField('批次号')
state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废'))) state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')))
@ -41,7 +41,7 @@ class MaterialBatch(BaseModel):
class MaterialBatchA(BaseModel): class MaterialBatchA(BaseModel):
""" """
组合件物料批次 TN:组合件物料批次
""" """
batch = models.CharField('批次号', max_length=100) batch = models.CharField('批次号', max_length=100)
material = models.ForeignKey( material = models.ForeignKey(
@ -62,7 +62,7 @@ MIO_TYPE_PREFIX = {
class MIO(CommonBDModel): class MIO(CommonBDModel):
""" """
出入库记录 TN:出入库记录
""" """
MIO_TYPE_DO_OUT = 'do_out' MIO_TYPE_DO_OUT = 'do_out'
MIO_TYPE_SALE_OUT = 'sale_out' MIO_TYPE_SALE_OUT = 'sale_out'
@ -126,7 +126,7 @@ class MIO(CommonBDModel):
class MIOItem(BaseModel): class MIOItem(BaseModel):
""" """
出入库明细 TN:出入库明细
""" """
mio = models.ForeignKey(MIO, verbose_name='关联出入库', mio = models.ForeignKey(MIO, verbose_name='关联出入库',
on_delete=models.CASCADE, related_name='item_mio') on_delete=models.CASCADE, related_name='item_mio')
@ -182,7 +182,7 @@ class MIOItem(BaseModel):
class MIOItemA(BaseModel): class MIOItemA(BaseModel):
""" """
组合件出入库明细 TN:组合件出入库明细
""" """
material = models.ForeignKey( material = models.ForeignKey(
Material, verbose_name='物料', on_delete=models.CASCADE) Material, verbose_name='物料', on_delete=models.CASCADE)
@ -198,7 +198,7 @@ class MIOItemA(BaseModel):
class MIOItemw(BaseModel): class MIOItemw(BaseModel):
""" """
单件记录 TN:单件记录
""" """
number = models.TextField('编号') number = models.TextField('编号')
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw' wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL, related_name='wpr_mioitemw'

View File

@ -5,6 +5,7 @@ from apps.utils.models import BaseModel
class AuditLog(models.Model): class AuditLog(models.Model):
"""TN:审计表"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
action = models.CharField('动作', max_length=20) action = models.CharField('动作', max_length=20)
model_name = models.CharField('模型名', max_length=20) model_name = models.CharField('模型名', max_length=20)
@ -18,7 +19,7 @@ class AuditLog(models.Model):
class DrfRequestLog(BaseModel): class DrfRequestLog(BaseModel):
"""Logs Django rest framework API requests""" """TN:Logs Django rest framework API requests"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4) id = models.UUIDField(primary_key=True, default=uuid.uuid4)
user = models.ForeignKey( user = models.ForeignKey(

View File

@ -7,7 +7,7 @@ from django.db.models import Q
class Process(CommonBModel): class Process(CommonBModel):
""" """
工序 TN:工序
""" """
PRO_PROD = 10 PRO_PROD = 10
PRO_TEST = 20 PRO_TEST = 20
@ -42,6 +42,7 @@ class Process(CommonBModel):
# Create your models here. # Create your models here.
class Material(CommonAModel): class Material(CommonAModel):
"""TN:物料"""
MA_TYPE_BASE = 0 MA_TYPE_BASE = 0
MA_TYPE_GOOD = 10 MA_TYPE_GOOD = 10
MA_TYPE_HALFGOOD = 20 MA_TYPE_HALFGOOD = 20
@ -107,7 +108,7 @@ class Material(CommonAModel):
class Shift(CommonBModel): class Shift(CommonBModel):
"""班次 """TN:班次
""" """
name = models.CharField('名称', max_length=50) name = models.CharField('名称', max_length=50)
rule = models.CharField('所属规则', max_length=10, default='默认') rule = models.CharField('所属规则', max_length=10, default='默认')
@ -120,13 +121,13 @@ class Shift(CommonBModel):
class Srule(CommonBDModel): class Srule(CommonBDModel):
""" """
班组规则 TN:班组规则
""" """
rule = models.JSONField('排班规则', default=list, blank=True) rule = models.JSONField('排班规则', default=list, blank=True)
class Team(CommonBModel): class Team(CommonBModel):
"""班组, belong_dept为所属车间 """TN:班组, belong_dept为所属车间
""" """
name = models.CharField('名称', max_length=50) name = models.CharField('名称', max_length=50)
leader = models.ForeignKey( leader = models.ForeignKey(
@ -134,7 +135,7 @@ class Team(CommonBModel):
class Mgroup(CommonBModel): class Mgroup(CommonBModel):
"""测点集 """TN:测点集
""" """
M_SELF = 10 M_SELF = 10
M_OTHER = 20 M_OTHER = 20
@ -179,7 +180,7 @@ class TeamMember(BaseModel):
class Goal(CommonADModel): class Goal(CommonADModel):
"""目标 """TN:目标
""" """
mgroup = models.ForeignKey( mgroup = models.ForeignKey(
Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True) Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True)
@ -206,7 +207,7 @@ class Goal(CommonADModel):
class RoutePack(CommonADModel): class RoutePack(CommonADModel):
""" """
加工工艺 TN:加工工艺
""" """
RP_S_CREATE = 10 RP_S_CREATE = 10
RP_S_AUDIT = 20 RP_S_AUDIT = 20
@ -354,7 +355,7 @@ class RoutePack(CommonADModel):
return list(self.get_gjson().keys()) return list(self.get_gjson().keys())
class Route(CommonADModel): class Route(CommonADModel):
""" """
加工路线 TN:加工路线
""" """
routepack = models.ForeignKey(RoutePack, verbose_name='关联路线包', on_delete=models.CASCADE, null=True, blank=True) routepack = models.ForeignKey(RoutePack, verbose_name='关联路线包', on_delete=models.CASCADE, null=True, blank=True)
material = models.ForeignKey( material = models.ForeignKey(
@ -389,7 +390,7 @@ class Route(CommonADModel):
@staticmethod @staticmethod
def get_routes(material: Material=None, routepack:RoutePack=None, routeIds=None): def get_routes(material: Material=None, routepack:RoutePack=None, routeIds=None):
""" """
返回工艺路线带车间(不关联工艺包) TN:返回工艺路线带车间(不关联工艺包)
""" """
if material: if material:
kwargs = {'material': material, 'routepack__isnull': True} kwargs = {'material': material, 'routepack__isnull': True}
@ -410,7 +411,7 @@ class Route(CommonADModel):
@classmethod @classmethod
def validate_dag(cls, final_material_out:Material, rqs): def validate_dag(cls, final_material_out:Material, rqs):
""" """
校验工艺路线是否正确 TN:校验工艺路线是否正确
- 所有 Route 必须有 material_in material_out - 所有 Route 必须有 material_in material_out
- 所有路径最终指向给定的 final_material_out - 所有路径最终指向给定的 final_material_out
- 无循环依赖 - 无循环依赖
@ -519,5 +520,6 @@ class Route(CommonADModel):
return {'nodes': nodes, 'edges': edges} return {'nodes': nodes, 'edges': edges}
class RouteMat(BaseModel): class RouteMat(BaseModel):
"""TN:工艺路线辅助物料"""
route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE, related_name="routemat_route") route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE, related_name="routemat_route")
material = models.ForeignKey(Material, verbose_name='辅助物料', on_delete=models.CASCADE) material = models.ForeignKey(Material, verbose_name='辅助物料', on_delete=models.CASCADE)

View File

@ -7,7 +7,7 @@ from apps.utils.models import BaseModel, CommonADModel, CommonAModel, CommonBDMo
# Create your models here. # Create your models here.
class OplCate(CommonAModel): class OplCate(CommonAModel):
""" """
作业许可种类 TN:作业许可种类
""" """
code = models.CharField('标识', max_length=10) code = models.CharField('标识', max_length=10)
name = models.CharField('名称', max_length=20) name = models.CharField('名称', max_length=20)
@ -26,6 +26,7 @@ class OplCate(CommonAModel):
class Operation(CommonBDModel): class Operation(CommonBDModel):
"""TN:作业表"""
OP_CREATE = 10 OP_CREATE = 10
OP_AUDIT = 20 OP_AUDIT = 20
OP_WAIT = 30 OP_WAIT = 30
@ -61,7 +62,7 @@ class Operation(CommonBDModel):
class Opl(CommonBDModel): class Opl(CommonBDModel):
""" """
作业许可证 TN:作业许可证
""" """
CLOSE_CHOICES1 = ( CLOSE_CHOICES1 = (
(10, '作业正常结束'), (10, '作业正常结束'),
@ -126,7 +127,7 @@ class Opl(CommonBDModel):
class OplWorker(BaseModel): class OplWorker(BaseModel):
""" """
作业许可人员 TN:作业许可人员
""" """
worker = models.ForeignKey('system.user', verbose_name='作业人员', worker = models.ForeignKey('system.user', verbose_name='作业人员',
on_delete=models.CASCADE, related_name='opl_worker') on_delete=models.CASCADE, related_name='opl_worker')
@ -142,7 +143,7 @@ class OplWorker(BaseModel):
class OplCert(BaseModel): class OplCert(BaseModel):
""" """
作业许可人员证书 TN:作业许可人员证书
""" """
opl_worker = models.ForeignKey(OplWorker, verbose_name='关联作业人员', opl_worker = models.ForeignKey(OplWorker, verbose_name='关联作业人员',
on_delete=models.CASCADE) on_delete=models.CASCADE)
@ -159,7 +160,7 @@ class OplCert(BaseModel):
class GasCheck(CommonADModel): class GasCheck(CommonADModel):
""" """
气体检测记录 TN:气体检测记录
""" """
check_time = models.DateTimeField('检测时间') check_time = models.DateTimeField('检测时间')
check_place = models.CharField('检测部位', max_length=100) check_place = models.CharField('检测部位', max_length=100)

View File

@ -18,7 +18,7 @@ SCHEDULE_TYPE = (
class Utask(CommonBDModel): class Utask(CommonBDModel):
""" """
生产大任务 TN:生产大任务
""" """
UTASK_CREATED = 10 UTASK_CREATED = 10
UTASK_DECOMPOSE = 14 UTASK_DECOMPOSE = 14
@ -69,7 +69,7 @@ class Utask(CommonBDModel):
class Mtask(CommonADModel): class Mtask(CommonADModel):
""" """
生产任务 TN:生产任务
""" """
MTASK_CREATED = 10 MTASK_CREATED = 10
MTASK_ASSGINED = 20 MTASK_ASSGINED = 20
@ -112,7 +112,7 @@ class Mtask(CommonADModel):
@property @property
def related(self): def related(self):
""" """
当天已下达的所有的兄弟小任务 TN:当天已下达的所有的兄弟小任务
""" """
if self.utask: if self.utask:
return Mtask.objects.filter( return Mtask.objects.filter(
@ -132,6 +132,7 @@ class Mtask(CommonADModel):
class Mtaskb(BaseModel): class Mtaskb(BaseModel):
"""TN:生产任务关联表"""
mtask = models.ForeignKey(Mtask, verbose_name='关联任务', on_delete=models.CASCADE, related_name='b_mtask') mtask = models.ForeignKey(Mtask, verbose_name='关联任务', on_delete=models.CASCADE, related_name='b_mtask')
handle_user = models.ForeignKey( handle_user = models.ForeignKey(
'system.user', verbose_name='操作人', on_delete=models.CASCADE, related_name='mtaskb_handle_user') 'system.user', verbose_name='操作人', on_delete=models.CASCADE, related_name='mtaskb_handle_user')

View File

@ -6,7 +6,7 @@ from apps.mtm.models import Material
# Create your models here. # Create your models here.
class Supplier(CommonBModel): class Supplier(CommonBModel):
""" """
供应商 TN:供应商
""" """
name = models.CharField('供应商名称', max_length=50) name = models.CharField('供应商名称', max_length=50)
number= models.CharField('供应商编号', max_length=20, null=True, blank=True) number= models.CharField('供应商编号', max_length=20, null=True, blank=True)
@ -18,7 +18,7 @@ class Supplier(CommonBModel):
class PuPlan(CommonBModel): class PuPlan(CommonBModel):
""" """
采购计划 TN:采购计划
""" """
PUPLAN_CREATE = 10 PUPLAN_CREATE = 10
PUPLAN_SUBMITED = 20 PUPLAN_SUBMITED = 20
@ -44,7 +44,7 @@ class PuPlan(CommonBModel):
class PuOrder(CommonBModel): class PuOrder(CommonBModel):
""" """
采购订单 TN:采购订单
""" """
PUORDER_CREATE = 10 PUORDER_CREATE = 10
PUORDER_SUBMITED = 20 PUORDER_SUBMITED = 20
@ -71,6 +71,7 @@ class PuOrder(CommonBModel):
class PuOrderItem(BaseModel): class PuOrderItem(BaseModel):
"""TN:物料信息表"""
material = models.ForeignKey( material = models.ForeignKey(
Material, verbose_name='物料', on_delete=models.CASCADE, related_name='pu_orderitem_material') Material, verbose_name='物料', on_delete=models.CASCADE, related_name='pu_orderitem_material')
count = models.PositiveIntegerField('所需数量', default=0) count = models.PositiveIntegerField('所需数量', default=0)
@ -83,7 +84,7 @@ class PuOrderItem(BaseModel):
class PuPlanItem(CommonBDModel): class PuPlanItem(CommonBDModel):
""" """
采购计划明细(因为各部门填写所以需要belong_dept字段) TN:采购计划明细(因为各部门填写所以需要belong_dept字段)
""" """
material = models.ForeignKey( material = models.ForeignKey(
Material, verbose_name='所需物料', on_delete=models.CASCADE) Material, verbose_name='所需物料', on_delete=models.CASCADE)

View File

@ -10,7 +10,7 @@ from django.db.models import Sum
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
class Defect(CommonAModel): class Defect(CommonAModel):
# 缺陷项 """TN:缺陷项"""
DEFECT_OK = 10 DEFECT_OK = 10
DEFECT_OK_B = 20 DEFECT_OK_B = 20
DEFECT_NOTOK = 30 DEFECT_NOTOK = 30
@ -27,7 +27,7 @@ class Defect(CommonAModel):
class NotOkOption(models.TextChoices): class NotOkOption(models.TextChoices):
# 不合格项 """TN:不合格项"""
zw = "zw", _("炸纹") zw = "zw", _("炸纹")
zt = "zt", _("炸头") zt = "zt", _("炸头")
tw = "tw", _("条纹") tw = "tw", _("条纹")
@ -110,7 +110,7 @@ FTEST_TYPE_CHOICES = (
class TestItem(CommonAModel): class TestItem(CommonAModel):
""" """
检测项目 TN:检测项目
""" """
T_TEST = 10 T_TEST = 10
T_OPER = 20 T_OPER = 20
@ -149,6 +149,7 @@ QC_TRACE_CHOICES = (
) )
class Qct(CommonAModel): class Qct(CommonAModel):
"""TN:质检表"""
name = models.CharField(max_length=50, verbose_name="名称") name = models.CharField(max_length=50, verbose_name="名称")
number = models.CharField(max_length=20, verbose_name="编号") number = models.CharField(max_length=20, verbose_name="编号")
tags = models.JSONField('检测类型', default=list, blank=True) # process/inm/default tags = models.JSONField('检测类型', default=list, blank=True) # process/inm/default
@ -200,6 +201,7 @@ class Qct(CommonAModel):
return qct_qs return qct_qs
class QctTestItem(BaseModel): class QctTestItem(BaseModel):
"""TN:质检模板检测项关系表"""
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qcttestitem") qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qcttestitem")
testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True) testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True)
addto_wpr = models.BooleanField('加入WPR作为信息', default=False) addto_wpr = models.BooleanField('加入WPR作为信息', default=False)
@ -207,6 +209,7 @@ class QctTestItem(BaseModel):
sort = models.FloatField('排序', default=1) sort = models.FloatField('排序', default=1)
class QctDefect(BaseModel): class QctDefect(BaseModel):
"""TN:质检模板缺陷项关系表"""
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctdefect") qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctdefect")
is_default = models.BooleanField('是否默认缺陷', default=False) is_default = models.BooleanField('是否默认缺陷', default=False)
defect = models.ForeignKey(Defect, verbose_name="缺陷项", on_delete=models.CASCADE) defect = models.ForeignKey(Defect, verbose_name="缺陷项", on_delete=models.CASCADE)
@ -215,6 +218,7 @@ class QctDefect(BaseModel):
sort = models.FloatField('排序', default=1) sort = models.FloatField('排序', default=1)
class QctMat(BaseModel): class QctMat(BaseModel):
"""TN:质检模板物料关系表"""
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctmat") qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctmat")
material = models.ForeignKey(Material, verbose_name="物料", on_delete=models.CASCADE) material = models.ForeignKey(Material, verbose_name="物料", on_delete=models.CASCADE)
tracing = models.CharField('追溯层级', default=QC_T, choices=QC_TRACE_CHOICES, tracing = models.CharField('追溯层级', default=QC_T, choices=QC_TRACE_CHOICES,
@ -224,7 +228,7 @@ class QctMat(BaseModel):
class QuaStat(CommonBDModel): class QuaStat(CommonBDModel):
""" """
质量数据表 TN:质量数据表
""" """
material = models.ForeignKey( material = models.ForeignKey(
Material, verbose_name='关联产物', on_delete=models.CASCADE) Material, verbose_name='关联产物', on_delete=models.CASCADE)
@ -241,7 +245,7 @@ class QuaStat(CommonBDModel):
class FtestWork(CommonBDModel): class FtestWork(CommonBDModel):
""" """
检验工作 TN:检验工作
""" """
TYPE2_SOME = 10 TYPE2_SOME = 10
TYPE2_ALL = 20 TYPE2_ALL = 20
@ -309,7 +313,7 @@ class FtestworkDefect(BaseModel):
class Ftest(CommonBDModel): class Ftest(CommonBDModel):
""" """
检验记录 TN:检验记录
""" """
type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES) type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES)
test_date = models.DateField('检验日期') test_date = models.DateField('检验日期')
@ -367,7 +371,7 @@ class Ftest(CommonBDModel):
class FtestItem(BaseModel): class FtestItem(BaseModel):
""" """
检测明细 TN:检测明细
""" """
ftest = models.ForeignKey( ftest = models.ForeignKey(
Ftest, verbose_name='关联检验', on_delete=models.CASCADE) Ftest, verbose_name='关联检验', on_delete=models.CASCADE)
@ -384,7 +388,7 @@ class FtestItem(BaseModel):
class FtestDefect(BaseModel): class FtestDefect(BaseModel):
""" """
缺陷明细 TN:缺陷明细
""" """
ftest = models.ForeignKey( ftest = models.ForeignKey(
Ftest, verbose_name='关联检验', on_delete=models.CASCADE, related_name="defects_ftest") Ftest, verbose_name='关联检验', on_delete=models.CASCADE, related_name="defects_ftest")
@ -396,7 +400,7 @@ class FtestDefect(BaseModel):
class Ptest(CommonAModel): class Ptest(CommonAModel):
""" """
性能测试记录 TN:性能测试记录
""" """
PTEST_EQUIP_STATES = ( PTEST_EQUIP_STATES = (
('R', '正常'), ('R', '正常'),

View File

@ -8,7 +8,7 @@ from apps.wf.models import Ticket
# Create your models here. # Create your models here.
class Rparty(CommonBModel): class Rparty(CommonBModel):
""" """
相关方 TN:相关方
""" """
dept = models.OneToOneField(Dept, verbose_name='关联部门', dept = models.OneToOneField(Dept, verbose_name='关联部门',
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -25,7 +25,7 @@ class Rparty(CommonBModel):
class BlackList(CommonBDModel): class BlackList(CommonBDModel):
"""黑名单 """TN:黑名单
""" """
name = models.CharField('名称', max_length=20) name = models.CharField('名称', max_length=20)
number = models.CharField('信用代码', max_length=50) number = models.CharField('信用代码', max_length=50)
@ -34,7 +34,7 @@ class BlackList(CommonBDModel):
class Rfile(CommonBDModel): class Rfile(CommonBDModel):
""" """
相关方文件库 TN:相关方文件库
""" """
file_cate = models.ForeignKey(Dictionary, verbose_name='文件种类', file_cate = models.ForeignKey(Dictionary, verbose_name='文件种类',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.CASCADE, null=True, blank=True)
@ -44,7 +44,7 @@ class Rfile(CommonBDModel):
class Rpj(CommonBDModel): class Rpj(CommonBDModel):
""" """
相关方项目 TN:相关方项目
""" """
RPJ_CREATE = 10 RPJ_CREATE = 10
RPJ_AUDIT = 20 RPJ_AUDIT = 20
@ -81,7 +81,7 @@ class Rpj(CommonBDModel):
class Rpjfile(BaseModel): class Rpjfile(BaseModel):
""" """
相关方项目文件库 TN:相关方项目文件库
""" """
file_cate = models.ForeignKey(Dictionary, verbose_name='文件种类', file_cate = models.ForeignKey(Dictionary, verbose_name='文件种类',
on_delete=models.CASCADE) on_delete=models.CASCADE)
@ -91,7 +91,7 @@ class Rpjfile(BaseModel):
class Remployee(CommonBModel): class Remployee(CommonBModel):
""" """
相关方成员 TN:相关方成员
""" """
employee = models.ForeignKey(Employee, verbose_name='成员信息', employee = models.ForeignKey(Employee, verbose_name='成员信息',
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
@ -106,7 +106,7 @@ class Remployee(CommonBModel):
class Rcertificate(CommonBModel): class Rcertificate(CommonBModel):
""" """
相关方证书 TN:相关方证书
""" """
certificate = models.ForeignKey(Certificate, verbose_name='关联认可证书', certificate = models.ForeignKey(Certificate, verbose_name='关联认可证书',
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
@ -124,7 +124,7 @@ class Rcertificate(CommonBModel):
class Rpjmember(BaseModel): class Rpjmember(BaseModel):
""" """
相关方项目成员 TN:相关方项目成员
""" """
rpj = models.ForeignKey(Rpj, verbose_name='关联项目', on_delete=models.CASCADE) rpj = models.ForeignKey(Rpj, verbose_name='关联项目', on_delete=models.CASCADE)
remployee = models.ForeignKey(Remployee, verbose_name='关联人员', remployee = models.ForeignKey(Remployee, verbose_name='关联人员',
@ -137,7 +137,7 @@ class Rpjmember(BaseModel):
class Rpjcertificate(BaseModel): class Rpjcertificate(BaseModel):
""" """
相关方项目人员证书 TN:相关方项目人员证书
""" """
rpj_member = models.ForeignKey(Rpjmember, verbose_name='关联项目成员', on_delete=models.CASCADE) rpj_member = models.ForeignKey(Rpjmember, verbose_name='关联项目成员', on_delete=models.CASCADE)
rcertificate = models.ForeignKey(Rcertificate, verbose_name='关联相关方证书', on_delete=models.SET_NULL, rcertificate = models.ForeignKey(Rcertificate, verbose_name='关联相关方证书', on_delete=models.SET_NULL,
@ -152,7 +152,7 @@ class Rpjcertificate(BaseModel):
class RpjLog(CommonADModel): class RpjLog(CommonADModel):
"""项目变更日志 """TN:项目变更日志
Args: Args:
BaseModel (_type_): _description_ BaseModel (_type_): _description_

View File

@ -7,7 +7,7 @@ from apps.mtm.models import Material
class Customer(CommonBModel): class Customer(CommonBModel):
""" """
客户信息 TN:客户信息
""" """
name = models.CharField('客户名称', max_length=50, unique=True) name = models.CharField('客户名称', max_length=50, unique=True)
address = models.CharField('详细地址', max_length=20, blank=True, null=True) address = models.CharField('详细地址', max_length=20, blank=True, null=True)
@ -26,7 +26,7 @@ class Customer(CommonBModel):
class Contract(CommonBModel): class Contract(CommonBModel):
""" """
合同信息 TN:合同信息
""" """
name = models.CharField('合同名称', max_length=100) name = models.CharField('合同名称', max_length=100)
number = models.CharField('合同编号', max_length=100, unique=True) number = models.CharField('合同编号', max_length=100, unique=True)
@ -46,7 +46,7 @@ class Contract(CommonBModel):
class Order(CommonBModel): class Order(CommonBModel):
""" """
订单信息 TN:订单信息
""" """
ORDER_CREATE = 10 ORDER_CREATE = 10
ORDER_SUBMITED = 20 ORDER_SUBMITED = 20
@ -77,7 +77,7 @@ class Order(CommonBModel):
class OrderItem(BaseModel): class OrderItem(BaseModel):
""" """
订单明细 TN:订单明细
""" """
order = models.ForeignKey( order = models.ForeignKey(
Order, verbose_name='关联订单', on_delete=models.CASCADE, related_name='item_order') Order, verbose_name='关联订单', on_delete=models.CASCADE, related_name='item_order')

View File

@ -15,7 +15,7 @@ class DataFilter(models.IntegerChoices):
class Permission(ParentModel, BaseModel): class Permission(ParentModel, BaseModel):
""" """
功能权限:模块,页面,接口 TN:功能权限:模块,页面,接口
""" """
PERM_TYPE_MODULE = 10 PERM_TYPE_MODULE = 10
PERM_TYPE_PAGE = 20 PERM_TYPE_PAGE = 20
@ -49,7 +49,7 @@ class Permission(ParentModel, BaseModel):
class Dept(ParentModel, CommonAModel): class Dept(ParentModel, CommonAModel):
""" """
部门 TN:部门
""" """
name = models.CharField('名称', max_length=60) name = models.CharField('名称', max_length=60)
type = models.CharField('类型', max_length=20, default='dept') type = models.CharField('类型', max_length=20, default='dept')
@ -66,7 +66,7 @@ class Dept(ParentModel, CommonAModel):
class Role(CommonADModel): class Role(CommonADModel):
""" """
角色 TN:角色
""" """
name = models.CharField('名称', max_length=32) name = models.CharField('名称', max_length=32)
code = models.CharField('角色标识', max_length=32, null=True, blank=True) code = models.CharField('角色标识', max_length=32, null=True, blank=True)
@ -85,7 +85,7 @@ class Role(CommonADModel):
class Post(CommonADModel): class Post(CommonADModel):
""" """
职位/岗位 TN:职位/岗位
""" """
name = models.CharField('名称', max_length=32) name = models.CharField('名称', max_length=32)
code = models.CharField('岗位标识', max_length=32, null=True, blank=True) code = models.CharField('岗位标识', max_length=32, null=True, blank=True)
@ -118,7 +118,7 @@ class SoftDeletableUserManager(SoftDeletableManagerMixin, UserManager):
class User(AbstractUser, CommonBModel): class User(AbstractUser, CommonBModel):
""" """
用户 TN:用户
""" """
type = models.CharField('账号类型', max_length=10, default='employee') type = models.CharField('账号类型', max_length=10, default='employee')
name = models.CharField('姓名', max_length=20, null=True, blank=True) name = models.CharField('姓名', max_length=20, null=True, blank=True)
@ -158,7 +158,7 @@ class User(AbstractUser, CommonBModel):
class UserPost(BaseModel): class UserPost(BaseModel):
""" """
用户岗位关系表 TN:用户岗位关系表
""" """
name = models.CharField('名称', max_length=20, null=True, blank=True) name = models.CharField('名称', max_length=20, null=True, blank=True)
user = models.ForeignKey( user = models.ForeignKey(
@ -178,7 +178,7 @@ class UserPost(BaseModel):
class DictType(ParentModel, CommonAModel): class DictType(ParentModel, CommonAModel):
""" """
数据字典类型 TN:数据字典类型
""" """
name = models.CharField('名称', max_length=30) name = models.CharField('名称', max_length=30)
code = models.CharField('标识', max_length=30) code = models.CharField('标识', max_length=30)
@ -194,7 +194,7 @@ class DictType(ParentModel, CommonAModel):
class Dictionary(ParentModel, CommonAModel): class Dictionary(ParentModel, CommonAModel):
""" """
数据字典 TN:数据字典
""" """
name = models.CharField('名称', max_length=60) name = models.CharField('名称', max_length=60)
value = models.CharField('', max_length=10, null=True, blank=True) value = models.CharField('', max_length=10, null=True, blank=True)
@ -217,7 +217,7 @@ class Dictionary(ParentModel, CommonAModel):
class File(CommonAModel): class File(CommonAModel):
""" """
文件存储表,业务表根据具体情况选择是否外键关联 TN:文件存储表,业务表根据具体情况选择是否外键关联
""" """
FILE_TYPE_DOC = 10 FILE_TYPE_DOC = 10
FILE_TYPE_VIDEO = 20 FILE_TYPE_VIDEO = 20

View File

@ -6,7 +6,7 @@ from apps.utils.models import BaseModel
class Workflow(CommonAModel): class Workflow(CommonAModel):
""" """
工作流 TN:工作流
""" """
name = models.CharField('名称', max_length=50) name = models.CharField('名称', max_length=50)
key = models.CharField('工作流标识', unique=True, max_length=20, null=True, blank=True) key = models.CharField('工作流标识', unique=True, max_length=20, null=True, blank=True)
@ -32,7 +32,7 @@ class Workflow(CommonAModel):
class State(CommonAModel): class State(CommonAModel):
""" """
状态记录 TN:状态记录
""" """
STATE_TYPE_START = 1 STATE_TYPE_START = 1
STATE_TYPE_END = 2 STATE_TYPE_END = 2
@ -118,7 +118,7 @@ class State(CommonAModel):
class Transition(CommonAModel): class Transition(CommonAModel):
""" """
工作流流转定时器条件(允许跳过) 条件流转与定时器不可同时存在 TN:工作流流转定时器条件(允许跳过) 条件流转与定时器不可同时存在
""" """
TRANSITION_ATTRIBUTE_TYPE_ACCEPT = 1 # 同意 TRANSITION_ATTRIBUTE_TYPE_ACCEPT = 1 # 同意
TRANSITION_ATTRIBUTE_TYPE_REFUSE = 2 # 拒绝 TRANSITION_ATTRIBUTE_TYPE_REFUSE = 2 # 拒绝

View File

@ -309,6 +309,7 @@ class Mlog(CommonADModel):
return mlog_count_fields return mlog_count_fields
class MlogUser(BaseModel): class MlogUser(BaseModel):
"""TN: 子级生产/检验日志操作人"""
mlog = models.ForeignKey(Mlog, verbose_name='关联日志', on_delete=models.CASCADE) mlog = models.ForeignKey(Mlog, verbose_name='关联日志', on_delete=models.CASCADE)
handle_user = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) handle_user = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE)
process = models.ForeignKey(Process, verbose_name='子工序', on_delete=models.CASCADE) process = models.ForeignKey(Process, verbose_name='子工序', on_delete=models.CASCADE)
@ -424,6 +425,7 @@ class Mlogb(BaseModel):
mlog.save(update_fields=["count_ok", "count_notok", "count_ok_full"]) mlog.save(update_fields=["count_ok", "count_notok", "count_ok_full"])
class MlogbDefect(BaseModel): class MlogbDefect(BaseModel):
"""TN: 生成记录的缺陷记录"""
mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE) mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE)
defect = models.ForeignKey("qm.Defect", verbose_name='缺陷', on_delete=models.CASCADE, null=True, blank=True) defect = models.ForeignKey("qm.Defect", verbose_name='缺陷', on_delete=models.CASCADE, null=True, blank=True)
count = models.DecimalField('数量', default=0, max_digits=11, decimal_places=1) count = models.DecimalField('数量', default=0, max_digits=11, decimal_places=1)

View File

@ -115,6 +115,7 @@ class Wpr(BaseModel):
return WprDefect.objects.filter(wpr=self) return WprDefect.objects.filter(wpr=self)
class WprDefect(BaseModel): class WprDefect(BaseModel):
"""TN:产物缺陷项关联表"""
wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE) wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE)
defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE) defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE)
is_main = models.BooleanField("是否主要缺陷", default=False) is_main = models.BooleanField("是否主要缺陷", default=False)