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):
"""
地图区域
TN: 地图区域
"""
AREA_1 = 10
AREA_2 = 20
@ -47,7 +47,7 @@ class Area(CommonBModel):
class Access(CommonADModel):
"""
准入禁入权限(动态变化)
TN: 准入禁入权限(动态变化)
"""
ACCESS_IN_YES = 10
ACCESS_IN_NO = 20

View File

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

View File

@ -3,6 +3,7 @@ from apps.utils.models import CommonADModel
# Create your models here.
class Article(CommonADModel):
"""TN: 文章"""
title = models.CharField(max_length=200, verbose_name="标题")
poster = 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):
"""TN: 项目"""
name = models.CharField('项目名称', max_length=50)
code = models.CharField('标识', max_length=20, unique=True)
config_json = models.JSONField('配置信息', default=dict)

View File

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

View File

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

View File

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

View File

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

View File

@ -5,6 +5,7 @@ from apps.mtm.models import Material, Mgroup, Team
from django_celery_beat.models import PeriodicTask
class Xscript(BaseModel):
"""TN:脚本"""
name = models.CharField("脚本名称", max_length=50)
code = models.TextField("脚本内容", 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)
class Mpoint(CommonBModel):
"""测点"""
"""TN:测点"""
MT_AUTO = 10
MT_COMPUTE = 20
MT_MANUAL = 30
@ -69,7 +70,7 @@ class Mpoint(CommonBModel):
class MpLogx(models.Model):
"""
测点记录超表
TN:测点记录超表
"""
timex = models.DateTimeField("采集时间", primary_key=True)
@ -87,7 +88,7 @@ class MpLogx(models.Model):
class MpLog(BaseModel):
"""旧表(已废弃)"""
"""TN:旧表(已废弃)"""
mpoint = models.ForeignKey(Mpoint, verbose_name="关联测点", on_delete=models.SET_NULL, null=True, blank=True)
tag_id = models.BigIntegerField("记录ID", db_index=True)
@ -97,7 +98,7 @@ class MpLog(BaseModel):
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")
year = models.PositiveSmallIntegerField("", null=True, blank=True)
@ -123,7 +124,7 @@ class MpointStat(CommonADModel):
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")
@ -174,7 +175,7 @@ class EnStat(BaseModel):
class EnStat2(BaseModel):
"""
能源数据统计表2
TN:能源数据统计表2
"""
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):
"""TN:排口表"""
DR_TYPE_CHOICES = (
(10, "排放口"),
(20, "污染源"),
@ -37,7 +38,7 @@ class Drain(CommonBModel):
class DrainEquip(BaseModel):
"""
排口/设备关系表
TN:排口/设备关系表
"""
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):
"""
环保监测数据
TN:环保监测数据
"""
enp_fields = [
@ -105,6 +106,7 @@ class EnvData(models.Model):
class VehicleAccess(BaseModel):
"""TN:车辆出入厂记录"""
type = models.PositiveSmallIntegerField("出入类型", default=1, help_text="1: 进厂, 2: 出厂")
vehicle_number = models.CharField("车牌号", max_length=10)
access_time = models.DateTimeField("出入时间", null=True, blank=True)
@ -114,6 +116,7 @@ class VehicleAccess(BaseModel):
class CarWash(BaseModel):
"""TN:洗车记录"""
station = models.ForeignKey(Equipment, verbose_name="洗车台", on_delete=models.CASCADE)
vehicle_number = models.CharField("车牌号", max_length=10, default="")
start_time = models.DateTimeField("洗车时间", null=True, blank=True)

View File

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

View File

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

View File

@ -1,3 +1,69 @@
from django.shortcuts import render
# 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):
"""
仓库信息
TN:仓库信息
"""
number = models.CharField('仓库编号', max_length=20)
name = models.CharField('仓库名称', max_length=20)
@ -20,7 +20,7 @@ class WareHouse(CommonBModel):
class MaterialBatch(BaseModel):
"""
物料批次
TN:物料批次
"""
batch = models.TextField('批次号')
state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')))
@ -41,7 +41,7 @@ class MaterialBatch(BaseModel):
class MaterialBatchA(BaseModel):
"""
组合件物料批次
TN:组合件物料批次
"""
batch = models.CharField('批次号', max_length=100)
material = models.ForeignKey(
@ -62,7 +62,7 @@ MIO_TYPE_PREFIX = {
class MIO(CommonBDModel):
"""
出入库记录
TN:出入库记录
"""
MIO_TYPE_DO_OUT = 'do_out'
MIO_TYPE_SALE_OUT = 'sale_out'
@ -126,7 +126,7 @@ class MIO(CommonBDModel):
class MIOItem(BaseModel):
"""
出入库明细
TN:出入库明细
"""
mio = models.ForeignKey(MIO, verbose_name='关联出入库',
on_delete=models.CASCADE, related_name='item_mio')
@ -182,7 +182,7 @@ class MIOItem(BaseModel):
class MIOItemA(BaseModel):
"""
组合件出入库明细
TN:组合件出入库明细
"""
material = models.ForeignKey(
Material, verbose_name='物料', on_delete=models.CASCADE)
@ -198,7 +198,7 @@ class MIOItemA(BaseModel):
class MIOItemw(BaseModel):
"""
单件记录
TN:单件记录
"""
number = models.TextField('编号')
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):
"""TN:审计表"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
action = models.CharField('动作', max_length=20)
model_name = models.CharField('模型名', max_length=20)
@ -18,7 +19,7 @@ class AuditLog(models.Model):
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)
user = models.ForeignKey(

View File

@ -7,7 +7,7 @@ from django.db.models import Q
class Process(CommonBModel):
"""
工序
TN:工序
"""
PRO_PROD = 10
PRO_TEST = 20
@ -42,6 +42,7 @@ class Process(CommonBModel):
# Create your models here.
class Material(CommonAModel):
"""TN:物料"""
MA_TYPE_BASE = 0
MA_TYPE_GOOD = 10
MA_TYPE_HALFGOOD = 20
@ -107,7 +108,7 @@ class Material(CommonAModel):
class Shift(CommonBModel):
"""班次
"""TN:班次
"""
name = models.CharField('名称', max_length=50)
rule = models.CharField('所属规则', max_length=10, default='默认')
@ -120,13 +121,13 @@ class Shift(CommonBModel):
class Srule(CommonBDModel):
"""
班组规则
TN:班组规则
"""
rule = models.JSONField('排班规则', default=list, blank=True)
class Team(CommonBModel):
"""班组, belong_dept为所属车间
"""TN:班组, belong_dept为所属车间
"""
name = models.CharField('名称', max_length=50)
leader = models.ForeignKey(
@ -134,7 +135,7 @@ class Team(CommonBModel):
class Mgroup(CommonBModel):
"""测点集
"""TN:测点集
"""
M_SELF = 10
M_OTHER = 20
@ -179,7 +180,7 @@ class TeamMember(BaseModel):
class Goal(CommonADModel):
"""目标
"""TN:目标
"""
mgroup = models.ForeignKey(
Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True)
@ -206,7 +207,7 @@ class Goal(CommonADModel):
class RoutePack(CommonADModel):
"""
加工工艺
TN:加工工艺
"""
RP_S_CREATE = 10
RP_S_AUDIT = 20
@ -354,7 +355,7 @@ class RoutePack(CommonADModel):
return list(self.get_gjson().keys())
class Route(CommonADModel):
"""
加工路线
TN:加工路线
"""
routepack = models.ForeignKey(RoutePack, verbose_name='关联路线包', on_delete=models.CASCADE, null=True, blank=True)
material = models.ForeignKey(
@ -389,7 +390,7 @@ class Route(CommonADModel):
@staticmethod
def get_routes(material: Material=None, routepack:RoutePack=None, routeIds=None):
"""
返回工艺路线带车间(不关联工艺包)
TN:返回工艺路线带车间(不关联工艺包)
"""
if material:
kwargs = {'material': material, 'routepack__isnull': True}
@ -410,7 +411,7 @@ class Route(CommonADModel):
@classmethod
def validate_dag(cls, final_material_out:Material, rqs):
"""
校验工艺路线是否正确
TN:校验工艺路线是否正确
- 所有 Route 必须有 material_in material_out
- 所有路径最终指向给定的 final_material_out
- 无循环依赖
@ -519,5 +520,6 @@ class Route(CommonADModel):
return {'nodes': nodes, 'edges': edges}
class RouteMat(BaseModel):
"""TN:工艺路线辅助物料"""
route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE, related_name="routemat_route")
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.
class OplCate(CommonAModel):
"""
作业许可种类
TN:作业许可种类
"""
code = models.CharField('标识', max_length=10)
name = models.CharField('名称', max_length=20)
@ -26,6 +26,7 @@ class OplCate(CommonAModel):
class Operation(CommonBDModel):
"""TN:作业表"""
OP_CREATE = 10
OP_AUDIT = 20
OP_WAIT = 30
@ -61,7 +62,7 @@ class Operation(CommonBDModel):
class Opl(CommonBDModel):
"""
作业许可证
TN:作业许可证
"""
CLOSE_CHOICES1 = (
(10, '作业正常结束'),
@ -126,7 +127,7 @@ class Opl(CommonBDModel):
class OplWorker(BaseModel):
"""
作业许可人员
TN:作业许可人员
"""
worker = models.ForeignKey('system.user', verbose_name='作业人员',
on_delete=models.CASCADE, related_name='opl_worker')
@ -142,7 +143,7 @@ class OplWorker(BaseModel):
class OplCert(BaseModel):
"""
作业许可人员证书
TN:作业许可人员证书
"""
opl_worker = models.ForeignKey(OplWorker, verbose_name='关联作业人员',
on_delete=models.CASCADE)
@ -159,7 +160,7 @@ class OplCert(BaseModel):
class GasCheck(CommonADModel):
"""
气体检测记录
TN:气体检测记录
"""
check_time = models.DateTimeField('检测时间')
check_place = models.CharField('检测部位', max_length=100)

View File

@ -18,7 +18,7 @@ SCHEDULE_TYPE = (
class Utask(CommonBDModel):
"""
生产大任务
TN:生产大任务
"""
UTASK_CREATED = 10
UTASK_DECOMPOSE = 14
@ -69,7 +69,7 @@ class Utask(CommonBDModel):
class Mtask(CommonADModel):
"""
生产任务
TN:生产任务
"""
MTASK_CREATED = 10
MTASK_ASSGINED = 20
@ -112,7 +112,7 @@ class Mtask(CommonADModel):
@property
def related(self):
"""
当天已下达的所有的兄弟小任务
TN:当天已下达的所有的兄弟小任务
"""
if self.utask:
return Mtask.objects.filter(
@ -132,6 +132,7 @@ class Mtask(CommonADModel):
class Mtaskb(BaseModel):
"""TN:生产任务关联表"""
mtask = models.ForeignKey(Mtask, verbose_name='关联任务', on_delete=models.CASCADE, related_name='b_mtask')
handle_user = models.ForeignKey(
'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.
class Supplier(CommonBModel):
"""
供应商
TN:供应商
"""
name = models.CharField('供应商名称', max_length=50)
number= models.CharField('供应商编号', max_length=20, null=True, blank=True)
@ -18,7 +18,7 @@ class Supplier(CommonBModel):
class PuPlan(CommonBModel):
"""
采购计划
TN:采购计划
"""
PUPLAN_CREATE = 10
PUPLAN_SUBMITED = 20
@ -44,7 +44,7 @@ class PuPlan(CommonBModel):
class PuOrder(CommonBModel):
"""
采购订单
TN:采购订单
"""
PUORDER_CREATE = 10
PUORDER_SUBMITED = 20
@ -71,6 +71,7 @@ class PuOrder(CommonBModel):
class PuOrderItem(BaseModel):
"""TN:物料信息表"""
material = models.ForeignKey(
Material, verbose_name='物料', on_delete=models.CASCADE, related_name='pu_orderitem_material')
count = models.PositiveIntegerField('所需数量', default=0)
@ -83,7 +84,7 @@ class PuOrderItem(BaseModel):
class PuPlanItem(CommonBDModel):
"""
采购计划明细(因为各部门填写所以需要belong_dept字段)
TN:采购计划明细(因为各部门填写所以需要belong_dept字段)
"""
material = models.ForeignKey(
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
class Defect(CommonAModel):
# 缺陷项
"""TN:缺陷项"""
DEFECT_OK = 10
DEFECT_OK_B = 20
DEFECT_NOTOK = 30
@ -27,7 +27,7 @@ class Defect(CommonAModel):
class NotOkOption(models.TextChoices):
# 不合格项
"""TN:不合格项"""
zw = "zw", _("炸纹")
zt = "zt", _("炸头")
tw = "tw", _("条纹")
@ -110,7 +110,7 @@ FTEST_TYPE_CHOICES = (
class TestItem(CommonAModel):
"""
检测项目
TN:检测项目
"""
T_TEST = 10
T_OPER = 20
@ -149,6 +149,7 @@ QC_TRACE_CHOICES = (
)
class Qct(CommonAModel):
"""TN:质检表"""
name = models.CharField(max_length=50, verbose_name="名称")
number = models.CharField(max_length=20, verbose_name="编号")
tags = models.JSONField('检测类型', default=list, blank=True) # process/inm/default
@ -200,6 +201,7 @@ class Qct(CommonAModel):
return qct_qs
class QctTestItem(BaseModel):
"""TN:质检模板检测项关系表"""
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)
addto_wpr = models.BooleanField('加入WPR作为信息', default=False)
@ -207,6 +209,7 @@ class QctTestItem(BaseModel):
sort = models.FloatField('排序', default=1)
class QctDefect(BaseModel):
"""TN:质检模板缺陷项关系表"""
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctdefect")
is_default = models.BooleanField('是否默认缺陷', default=False)
defect = models.ForeignKey(Defect, verbose_name="缺陷项", on_delete=models.CASCADE)
@ -215,6 +218,7 @@ class QctDefect(BaseModel):
sort = models.FloatField('排序', default=1)
class QctMat(BaseModel):
"""TN:质检模板物料关系表"""
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qctmat")
material = models.ForeignKey(Material, verbose_name="物料", on_delete=models.CASCADE)
tracing = models.CharField('追溯层级', default=QC_T, choices=QC_TRACE_CHOICES,
@ -224,7 +228,7 @@ class QctMat(BaseModel):
class QuaStat(CommonBDModel):
"""
质量数据表
TN:质量数据表
"""
material = models.ForeignKey(
Material, verbose_name='关联产物', on_delete=models.CASCADE)
@ -241,7 +245,7 @@ class QuaStat(CommonBDModel):
class FtestWork(CommonBDModel):
"""
检验工作
TN:检验工作
"""
TYPE2_SOME = 10
TYPE2_ALL = 20
@ -309,7 +313,7 @@ class FtestworkDefect(BaseModel):
class Ftest(CommonBDModel):
"""
检验记录
TN:检验记录
"""
type = models.CharField('检验类型', max_length=20, choices=FTEST_TYPE_CHOICES)
test_date = models.DateField('检验日期')
@ -367,7 +371,7 @@ class Ftest(CommonBDModel):
class FtestItem(BaseModel):
"""
检测明细
TN:检测明细
"""
ftest = models.ForeignKey(
Ftest, verbose_name='关联检验', on_delete=models.CASCADE)
@ -384,7 +388,7 @@ class FtestItem(BaseModel):
class FtestDefect(BaseModel):
"""
缺陷明细
TN:缺陷明细
"""
ftest = models.ForeignKey(
Ftest, verbose_name='关联检验', on_delete=models.CASCADE, related_name="defects_ftest")
@ -396,7 +400,7 @@ class FtestDefect(BaseModel):
class Ptest(CommonAModel):
"""
性能测试记录
TN:性能测试记录
"""
PTEST_EQUIP_STATES = (
('R', '正常'),

View File

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

View File

@ -7,7 +7,7 @@ from apps.mtm.models import Material
class Customer(CommonBModel):
"""
客户信息
TN:客户信息
"""
name = models.CharField('客户名称', max_length=50, unique=True)
address = models.CharField('详细地址', max_length=20, blank=True, null=True)
@ -26,7 +26,7 @@ class Customer(CommonBModel):
class Contract(CommonBModel):
"""
合同信息
TN:合同信息
"""
name = models.CharField('合同名称', max_length=100)
number = models.CharField('合同编号', max_length=100, unique=True)
@ -46,7 +46,7 @@ class Contract(CommonBModel):
class Order(CommonBModel):
"""
订单信息
TN:订单信息
"""
ORDER_CREATE = 10
ORDER_SUBMITED = 20
@ -77,7 +77,7 @@ class Order(CommonBModel):
class OrderItem(BaseModel):
"""
订单明细
TN:订单明细
"""
order = models.ForeignKey(
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):
"""
功能权限:模块,页面,接口
TN:功能权限:模块,页面,接口
"""
PERM_TYPE_MODULE = 10
PERM_TYPE_PAGE = 20
@ -49,7 +49,7 @@ class Permission(ParentModel, BaseModel):
class Dept(ParentModel, CommonAModel):
"""
部门
TN:部门
"""
name = models.CharField('名称', max_length=60)
type = models.CharField('类型', max_length=20, default='dept')
@ -66,7 +66,7 @@ class Dept(ParentModel, CommonAModel):
class Role(CommonADModel):
"""
角色
TN:角色
"""
name = models.CharField('名称', max_length=32)
code = models.CharField('角色标识', max_length=32, null=True, blank=True)
@ -85,7 +85,7 @@ class Role(CommonADModel):
class Post(CommonADModel):
"""
职位/岗位
TN:职位/岗位
"""
name = models.CharField('名称', max_length=32)
code = models.CharField('岗位标识', max_length=32, null=True, blank=True)
@ -118,7 +118,7 @@ class SoftDeletableUserManager(SoftDeletableManagerMixin, UserManager):
class User(AbstractUser, CommonBModel):
"""
用户
TN:用户
"""
type = models.CharField('账号类型', max_length=10, default='employee')
name = models.CharField('姓名', max_length=20, null=True, blank=True)
@ -158,7 +158,7 @@ class User(AbstractUser, CommonBModel):
class UserPost(BaseModel):
"""
用户岗位关系表
TN:用户岗位关系表
"""
name = models.CharField('名称', max_length=20, null=True, blank=True)
user = models.ForeignKey(
@ -178,7 +178,7 @@ class UserPost(BaseModel):
class DictType(ParentModel, CommonAModel):
"""
数据字典类型
TN:数据字典类型
"""
name = models.CharField('名称', max_length=30)
code = models.CharField('标识', max_length=30)
@ -194,7 +194,7 @@ class DictType(ParentModel, CommonAModel):
class Dictionary(ParentModel, CommonAModel):
"""
数据字典
TN:数据字典
"""
name = models.CharField('名称', max_length=60)
value = models.CharField('', max_length=10, null=True, blank=True)
@ -217,7 +217,7 @@ class Dictionary(ParentModel, CommonAModel):
class File(CommonAModel):
"""
文件存储表,业务表根据具体情况选择是否外键关联
TN:文件存储表,业务表根据具体情况选择是否外键关联
"""
FILE_TYPE_DOC = 10
FILE_TYPE_VIDEO = 20

View File

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

View File

@ -309,6 +309,7 @@ class Mlog(CommonADModel):
return mlog_count_fields
class MlogUser(BaseModel):
"""TN: 子级生产/检验日志操作人"""
mlog = models.ForeignKey(Mlog, 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)
@ -424,6 +425,7 @@ class Mlogb(BaseModel):
mlog.save(update_fields=["count_ok", "count_notok", "count_ok_full"])
class MlogbDefect(BaseModel):
"""TN: 生成记录的缺陷记录"""
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)
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)
class WprDefect(BaseModel):
"""TN:产物缺陷项关联表"""
wpr = models.ForeignKey(Wpr, verbose_name="关联产物", on_delete=models.CASCADE)
defect = models.ForeignKey("qm.defect", verbose_name="关联缺陷项", on_delete=models.CASCADE)
is_main = models.BooleanField("是否主要缺陷", default=False)