feat: model add note
This commit is contained in:
parent
6e12ca3137
commit
b66157edb8
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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, '未检查'),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 = (
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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='关联物料')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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', '正常'),
|
||||
|
|
|
@ -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_
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 # 拒绝
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue