diff --git a/hb_client/.env.development b/hb_client/.env.development
index 003a43c..ef83e12 100644
--- a/hb_client/.env.development
+++ b/hb_client/.env.development
@@ -2,8 +2,8 @@
ENV = 'development'
# base api
-#VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
-VUE_APP_BASE_API = 'http://47.95.0.242:2222/api'
+VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
+#VUE_APP_BASE_API = 'http://47.95.0.242:2222/api'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
diff --git a/hb_client/package.json b/hb_client/package.json
index 21eedd0..1382831 100644
--- a/hb_client/package.json
+++ b/hb_client/package.json
@@ -18,6 +18,7 @@
"dependencies": {
"@riophae/vue-treeselect": "^0.4.0",
"axios": "^0.21.1",
+ "cache-loader": "^4.1.0",
"compression-webpack-plugin": "^5.0.1",
"d3": "^5.14.2",
"dagre-d3": "^0.6.4",
diff --git a/hb_client/src/api/equipment.js b/hb_client/src/api/equipment.js
index 0256eb9..2eadc6b 100644
--- a/hb_client/src/api/equipment.js
+++ b/hb_client/src/api/equipment.js
@@ -34,3 +34,37 @@ export function deleteEquipment(id, data) {
data
})
}
+export function getEquipmentrecordList(query) {
+ return request({
+ url: '/em/equipmentrecord/',
+ method: 'get',
+ params: query
+ })
+}
+export function getEquipmentrecordAll() {
+ return request({
+ url: '/em/equipmentrecord/',
+ method: 'get'
+ })
+}
+export function createEquipmentrecord(data) {
+ return request({
+ url: '/em/equipmentrecord/',
+ method: 'post',
+ data
+ })
+}
+export function updateEquipmentrecord(id, data) {
+ return request({
+ url: `/em/equipmentrecord/${id}/`,
+ method: 'put',
+ data
+ })
+}
+export function deleteEquipmentrecord(id, data) {
+ return request({
+ url: `/em/equipmentrecord/${id}/`,
+ method: 'delete',
+ data
+ })
+}
\ No newline at end of file
diff --git a/hb_client/src/api/qm.js b/hb_client/src/api/qm.js
new file mode 100644
index 0000000..b362dce
--- /dev/null
+++ b/hb_client/src/api/qm.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+//标准规范
+export function getStandardList(query) {
+ return request({
+ url: '/qm/standard/',
+ method: 'get',
+ params: query
+ })
+}
+export function createStandard(data) {
+ return request({
+ url: '/qm/standard/',
+ method: 'post',
+ data
+ })
+}
+export function updateStandard(id, data) {
+ return request({
+ url: `/qm/standard/${id}/`,
+ method: 'put',
+ data
+ })
+}
+export function deleteStandard(id, data) {
+ return request({
+ url: `/qm/standard/${id}/`,
+ method: 'delete',
+ data
+ })
+}
+//检测项目
+export function getTestitemList(query) {
+ return request({
+ url: '/qm/testitem/',
+ method: 'get',
+ params: query
+ })
+}
+export function createTestitem(data) {
+ return request({
+ url: '/qm/testitem/',
+ method: 'post',
+ data
+ })
+}
+export function updateTestitem(id, data) {
+ return request({
+ url: `/qm/testitem/${id}/`,
+ method: 'put',
+ data
+ })
+}
+export function deleteTestitem(id, data) {
+ return request({
+ url: `/qm/testitem/${id}/`,
+ method: 'delete',
+ data
+ })
+}
diff --git a/hb_client/src/api/sam.js b/hb_client/src/api/sam.js
index 67998a3..451942a 100644
--- a/hb_client/src/api/sam.js
+++ b/hb_client/src/api/sam.js
@@ -57,3 +57,33 @@ export function deleteContract(id, data) {
data
})
}
+//订单
+//合同
+export function getOrderList(query) {
+ return request({
+ url: '/sam/order/',
+ method: 'get',
+ params: query
+ })
+}
+export function createOrder(data) {
+ return request({
+ url: '/sam/order/',
+ method: 'post',
+ data
+ })
+}
+export function updateOrder(id, data) {
+ return request({
+ url: `/sam/order/${id}/`,
+ method: 'put',
+ data
+ })
+}
+export function deleteOrder(id, data) {
+ return request({
+ url: `/sam/order/${id}/`,
+ method: 'delete',
+ data
+ })
+}
diff --git a/hb_client/src/router/index.js b/hb_client/src/router/index.js
index 047f841..87508ea 100644
--- a/hb_client/src/router/index.js
+++ b/hb_client/src/router/index.js
@@ -143,9 +143,9 @@ export const asyncRoutes = [
meta: { title: '监视和测量设备', icon: 'example', perms: ['index_manage'] }
},
{
- path: 'equipment',
- name: 'equipment',
- component: () => import('@/views/em/equipment'),
+ path: 'record',
+ name: 'record',
+ component: () => import('@/views/em/record'),
meta: { title: '校准检定记录', icon: 'example', perms: ['index_manage'] }
},
{
@@ -175,6 +175,35 @@ export const asyncRoutes = [
component: () => import('@/views/sam/contract'),
meta: { title: '合同信息', icon: 'example', perms: ['index_manage'] }
}
+ ,
+ {
+ path: 'order',
+ name: 'order',
+ component: () => import('@/views/sam/order'),
+ meta: { title: '订单信息', icon: 'example', perms: ['index_manage'] }
+ }
+ ]
+ }
+ ,
+ {
+ path: '/qm',
+ component: Layout,
+ redirect: '/qm/standard',
+ name: 'qm',
+ meta: { title: '质量管理', icon: 'example', perms: ['equipment_set'] },
+ children: [
+ {
+ path: 'standard',
+ name: 'standard',
+ component: () => import('@/views/qm/standard'),
+ meta: { title: '标准', icon: 'example', perms: ['index_manage'] }
+ },
+ {
+ path: 'testitem',
+ name: 'testitem',
+ component: () => import('@/views/qm/testitem'),
+ meta: { title: '检测项目', icon: 'example', perms: ['index_manage'] }
+ }
]
},
{
diff --git a/hb_client/src/views/em/detection.vue b/hb_client/src/views/em/detection.vue
index d4cb95b..e46d5f6 100644
--- a/hb_client/src/views/em/detection.vue
+++ b/hb_client/src/views/em/detection.vue
@@ -73,7 +73,7 @@
{{ state_[scope.row.statedm] }}
- state_
+
{{ scope.row.keeper_.username }}
diff --git a/hb_client/src/views/em/record.vue b/hb_client/src/views/em/record.vue
new file mode 100644
index 0000000..a862578
--- /dev/null
+++ b/hb_client/src/views/em/record.vue
@@ -0,0 +1,336 @@
+
+
+
+
+
+ 搜索
+ 重置
+
+
+ 新增校准或检定
+
+
+
+
+
+
+
+ {{ scope.row.equipment_.name }}
+
+
+ {{ scope.row.equipment_.number }}
+
+
+ {{ scope.row.equipment_.model }}
+
+
+ {{ state_[scope.row.equipment_.statedm] }}
+
+
+ {{ scope.row.recentlydate }}
+
+
+ {{ scope.row.nextdate }}
+
+
+ {{ scope.row.description }}
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/hb_client/src/views/mtm/material.vue b/hb_client/src/views/mtm/material.vue
index 921507d..f56d69b 100644
--- a/hb_client/src/views/mtm/material.vue
+++ b/hb_client/src/views/mtm/material.vue
@@ -170,6 +170,7 @@ import Pagination from "@/components/Pagination"; // secondary package based on
const defaultmaterial = {
name: "",
number: "",
+ processes:[],
};
export default {
components: { Pagination },
diff --git a/hb_client/src/views/mtm/productprocess.vue b/hb_client/src/views/mtm/productprocess.vue
index e7f6676..e810968 100644
--- a/hb_client/src/views/mtm/productprocess.vue
+++ b/hb_client/src/views/mtm/productprocess.vue
@@ -33,7 +33,7 @@
-
+
@@ -546,13 +546,12 @@ export default {
{
this.process = id;
// alert(this.process)
- this.getInputmaterialLists();
+ this.getInputmaterialLists();//输入物料
- this.getmaterialList();
- this.getOutputmaterialLists();
- this.getstepList();
- this. getUsedstepLists();
- this.gettechdocLists();
+ this.getOutputmaterialLists();//输出物料
+ this.getstepList();//子工序
+ this. getUsedstepLists();//
+ this.gettechdocLists();//技术文件
},
diff --git a/hb_client/src/views/qm/standard.vue b/hb_client/src/views/qm/standard.vue
new file mode 100644
index 0000000..ffd426d
--- /dev/null
+++ b/hb_client/src/views/qm/standard.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+ 搜索
+ 重置
+
+
+ 新增标准
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+ {{ scope.row.number }}
+
+
+
+ 是
+ 否
+
+
+
+
+ {{scope.row.file_.name}}
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传文件
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/hb_client/src/views/qm/testitem.vue b/hb_client/src/views/qm/testitem.vue
new file mode 100644
index 0000000..1c92b00
--- /dev/null
+++ b/hb_client/src/views/qm/testitem.vue
@@ -0,0 +1,258 @@
+
+
+
+
+
+ 搜索
+ 重置
+
+
+ 新增项目
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+ {{ scope.row.term_number }}
+
+
+ {{ scope.row.standard_.name }}
+
+
+ {{ scope.row.standard_.number }}
+
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
diff --git a/hb_client/src/views/sam/contract.vue b/hb_client/src/views/sam/contract.vue
index 0ceeb5d..a268f51 100644
--- a/hb_client/src/views/sam/contract.vue
+++ b/hb_client/src/views/sam/contract.vue
@@ -33,7 +33,7 @@
-
+
{{ scope.row.name }}
-
- {{ scope.row.address }}
+
+ {{ scope.row.number }}
-
- {{ scope.row.contact }}
+
+ {{ scope.row.amount }}
-
- {{ scope.row.contact_phone }}
+
+ {{ scope.row.customer_.name }}
+
+
+ {{ scope.row.sign_date }}
{{ scope.row.description }}
@@ -82,8 +85,8 @@
-
+
+
+
+
+
+
+
+
@@ -126,7 +146,7 @@
diff --git a/hb_server/apps/em/migrations/0007_equipmentrecord.py b/hb_server/apps/em/migrations/0007_equipmentrecord.py
new file mode 100644
index 0000000..f4022d1
--- /dev/null
+++ b/hb_server/apps/em/migrations/0007_equipmentrecord.py
@@ -0,0 +1,37 @@
+# Generated by Django 3.2.6 on 2021-09-15 01:49
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0003_auto_20210812_0909'),
+ ('em', '0006_auto_20210914_1335'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Equipmentrecord',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('recentlydate', models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期')),
+ ('nextdate', models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期')),
+ ('description', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')),
+ ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_belong_dept', to='system.organization', verbose_name='所属部门')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('equipment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='em.equipment', verbose_name='校准检定设备')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ ]
diff --git a/hb_server/apps/em/migrations/0008_auto_20210916_1054.py b/hb_server/apps/em/migrations/0008_auto_20210916_1054.py
new file mode 100644
index 0000000..902de86
--- /dev/null
+++ b/hb_server/apps/em/migrations/0008_auto_20210916_1054.py
@@ -0,0 +1,32 @@
+# Generated by Django 3.2.6 on 2021-09-16 02:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('em', '0007_equipmentrecord'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='equipmentrecord',
+ name='nextdate',
+ ),
+ migrations.AddField(
+ model_name='equipment',
+ name='nextdate',
+ field=models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期'),
+ ),
+ migrations.AddField(
+ model_name='equipment',
+ name='recentlydate',
+ field=models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期'),
+ ),
+ migrations.AlterField(
+ model_name='equipmentrecord',
+ name='recentlydate',
+ field=models.DateField(blank=True, null=True, verbose_name='校准/检定日期'),
+ ),
+ ]
diff --git a/hb_server/apps/em/migrations/0009_auto_20210916_1108.py b/hb_server/apps/em/migrations/0009_auto_20210916_1108.py
new file mode 100644
index 0000000..c451677
--- /dev/null
+++ b/hb_server/apps/em/migrations/0009_auto_20210916_1108.py
@@ -0,0 +1,31 @@
+# Generated by Django 3.2.6 on 2021-09-16 03:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('em', '0008_auto_20210916_1054'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='equipment',
+ name='nextdate',
+ ),
+ migrations.RemoveField(
+ model_name='equipment',
+ name='recentlydate',
+ ),
+ migrations.AddField(
+ model_name='equipmentrecord',
+ name='nextdate',
+ field=models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期'),
+ ),
+ migrations.AlterField(
+ model_name='equipmentrecord',
+ name='recentlydate',
+ field=models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期'),
+ ),
+ ]
diff --git a/hb_server/apps/em/models.py b/hb_server/apps/em/models.py
index 961e429..f2cb67c 100644
--- a/hb_server/apps/em/models.py
+++ b/hb_server/apps/em/models.py
@@ -75,3 +75,8 @@ class Equipment(CommonBModel):
def __str__(self):
return self.number + '-' + self.name
+class Equipmentrecord(CommonBModel):
+ equipment = models.ForeignKey(Equipment, verbose_name='校准检定设备', on_delete=models.CASCADE, null=True, blank=True)
+ recentlydate = models.DateField('最近一次校准/检定日期',blank=True, null=True)
+ nextdate = models.DateField('下次应校准或检定日期',blank=True, null=True)
+ description = models.CharField('描述', max_length=200, blank=True, null=True)
\ No newline at end of file
diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py
index dcf4262..b17e860 100644
--- a/hb_server/apps/em/serializers.py
+++ b/hb_server/apps/em/serializers.py
@@ -1,6 +1,6 @@
from rest_framework.serializers import ModelSerializer
-from .models import Equipment
+from .models import Equipment,Equipmentrecord
from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer
@@ -20,4 +20,18 @@ class EquipmentSerializer(ModelSerializer):
class EquipmentSimpleSerializer(ModelSerializer):
class Meta:
model = Equipment
- fields = ['id', 'number', 'name']
\ No newline at end of file
+ fields = ['id', 'number', 'name']
+
+
+
+class EquipmentrecordSerializer(ModelSerializer):
+ equipment_ = EquipmentSerializer(source='equipment', read_only=True)
+ class Meta:
+ model = Equipmentrecord
+ fields = '__all__'
+
+ @staticmethod
+ def setup_eager_loading(queryset):
+ """ Perform necessary eager loading of data. """
+ queryset = queryset.select_related('equipment')
+ return queryset
\ No newline at end of file
diff --git a/hb_server/apps/em/urls.py b/hb_server/apps/em/urls.py
index 0df0ee8..a2f58d8 100644
--- a/hb_server/apps/em/urls.py
+++ b/hb_server/apps/em/urls.py
@@ -1,11 +1,12 @@
from django.db.models import base
from rest_framework import urlpatterns
-from apps.em.views import EquipmentViewSet
+from apps.em.views import EquipmentViewSet,EquipmentrecordViewSet
from django.urls import path, include
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('equipment', EquipmentViewSet, basename='equipment')
+router.register('equipmentrecord', EquipmentrecordViewSet, basename='equipmentrecord')
urlpatterns = [
path('', include(router.urls)),
]
diff --git a/hb_server/apps/em/views.py b/hb_server/apps/em/views.py
index 386ff7f..64ad57d 100644
--- a/hb_server/apps/em/views.py
+++ b/hb_server/apps/em/views.py
@@ -1,8 +1,10 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
-from apps.em.models import Equipment
-from apps.em.serializers import EquipmentSerializer
+from rest_framework import serializers, status
+from rest_framework.response import Response
+from apps.em.models import Equipment,Equipmentrecord
+from apps.em.serializers import EquipmentSerializer,EquipmentrecordSerializer
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
@@ -19,3 +21,40 @@ class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet)
filterset_fields = ['belong_dept', 'keeper', 'type']
ordering_fields = ['create_time']
ordering = ['-create_time']
+
+
+# Create your views here.
+class EquipmentrecordViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet):
+ """
+ 设备校准-增删改查
+ """
+ perms_map = {'get': '*', 'post': 'equipmentrecord_create',
+ 'put': 'equipmentrecord_update', 'delete': 'equipmentrecord_delete'}
+ queryset = Equipmentrecord.objects.all()
+ serializer_class = EquipmentrecordSerializer
+ filterset_fields = ['equipment']
+ ordering_fields = ['create_time']
+ ordering = ['-create_time']
+
+ def create(self, request, *args, **kwargs):
+
+ data = request.data
+ if data.get('equipment', None):
+ equipment = Equipment.objects.get(pk=data['equipment'])
+ equipment.statedm = data['state']
+ equipment.save()
+ serializer = self.get_serializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+ return Response(status=status.HTTP_200_OK)
+ def update(self, request, *args, **kwargs):
+ data = request.data
+ if data.get('equipment', None):
+ equipment = Equipment.objects.get(pk=data['equipment'])
+ equipment.statedm = data['state']
+ equipment.save()
+ id = self.get_object()
+ serializer = self.get_serializer(id, data=data)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+ return Response(status=status.HTTP_200_OK)
\ No newline at end of file
diff --git a/hb_server/apps/mtm/migrations/0014_alter_material_processes.py b/hb_server/apps/mtm/migrations/0014_alter_material_processes.py
new file mode 100644
index 0000000..3d10764
--- /dev/null
+++ b/hb_server/apps/mtm/migrations/0014_alter_material_processes.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.6 on 2021-09-16 08:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mtm', '0013_auto_20210914_1049'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='material',
+ name='processes',
+ field=models.JSONField(blank=True, default=list, null=True, verbose_name='工艺流程'),
+ ),
+ ]
diff --git a/hb_server/apps/mtm/migrations/0015_alter_material_name.py b/hb_server/apps/mtm/migrations/0015_alter_material_name.py
new file mode 100644
index 0000000..64cddd6
--- /dev/null
+++ b/hb_server/apps/mtm/migrations/0015_alter_material_name.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.6 on 2021-09-17 00:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mtm', '0014_alter_material_processes'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='material',
+ name='name',
+ field=models.CharField(blank=True, max_length=100, null=True, unique=True, verbose_name='物料名称'),
+ ),
+ ]
diff --git a/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py b/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py
new file mode 100644
index 0000000..a4555f9
--- /dev/null
+++ b/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.6 on 2021-09-17 01:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mtm', '0015_alter_material_name'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='material',
+ name='name',
+ field=models.CharField(default=1, max_length=100, unique=True, verbose_name='物料名称'),
+ preserve_default=False,
+ ),
+ migrations.AlterField(
+ model_name='material',
+ name='processes',
+ field=models.JSONField(blank=True, default=list, verbose_name='工艺流程'),
+ ),
+ ]
diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py
index 43e5bb8..68b214b 100644
--- a/hb_server/apps/mtm/serializers.py
+++ b/hb_server/apps/mtm/serializers.py
@@ -50,7 +50,7 @@ class StepSimpleSerializer(serializers.ModelSerializer):
fields = ['id', 'name', 'sort']
class StepDetailSerializer(serializers.ModelSerializer):
-
+ equipments_ = EquipmentSimpleSerializer(source='equipments', many=True)
class Meta:
model = Step
fields = '__all__'
diff --git a/hb_server/apps/qm/__init__.py b/hb_server/apps/qm/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/hb_server/apps/qm/admin.py b/hb_server/apps/qm/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/hb_server/apps/qm/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/hb_server/apps/qm/apps.py b/hb_server/apps/qm/apps.py
new file mode 100644
index 0000000..9ccd83f
--- /dev/null
+++ b/hb_server/apps/qm/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class QmConfig(AppConfig):
+ name = 'apps.qm'
+ verbose_name = '质量管理'
diff --git a/hb_server/apps/qm/migrations/0001_initial.py b/hb_server/apps/qm/migrations/0001_initial.py
new file mode 100644
index 0000000..b7a67d7
--- /dev/null
+++ b/hb_server/apps/qm/migrations/0001_initial.py
@@ -0,0 +1,73 @@
+# Generated by Django 3.2.6 on 2021-09-15 14:06
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0003_auto_20210812_0909'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Standard',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('number', models.CharField(max_length=100, verbose_name='标准编号')),
+ ('name', models.CharField(max_length=100, verbose_name='标准名称')),
+ ('enabled', models.BooleanField(default=True, verbose_name='是否启用')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='standard_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.file', verbose_name='文件')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='standard_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '标准库',
+ 'verbose_name_plural': '标准库',
+ },
+ ),
+ migrations.CreateModel(
+ name='TestItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('term_number', models.CharField(max_length=100, verbose_name='条款号')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('standard', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.standard', verbose_name='关联标准')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '检验项目',
+ 'verbose_name_plural': '检验项目',
+ },
+ ),
+ migrations.CreateModel(
+ name='AnalysisItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('rules', models.JSONField(default=dict, verbose_name='判定规则')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='analysisitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('testitem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.testitem', verbose_name='关联检验项目')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='analysisitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '检验分析项',
+ },
+ ),
+ ]
diff --git a/hb_server/apps/qm/migrations/0002_alter_analysisitem_rules.py b/hb_server/apps/qm/migrations/0002_alter_analysisitem_rules.py
new file mode 100644
index 0000000..d0899af
--- /dev/null
+++ b/hb_server/apps/qm/migrations/0002_alter_analysisitem_rules.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.6 on 2021-09-16 02:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('qm', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='analysisitem',
+ name='rules',
+ field=models.JSONField(default=list, verbose_name='判定规则'),
+ ),
+ ]
diff --git a/hb_server/apps/qm/migrations/__init__.py b/hb_server/apps/qm/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py
new file mode 100644
index 0000000..4e667cd
--- /dev/null
+++ b/hb_server/apps/qm/models.py
@@ -0,0 +1,41 @@
+from django.db import models
+from apps.system.models import CommonAModel, File
+# Create your models here.
+class Standard(CommonAModel):
+ """
+ 标准
+ """
+ number = models.CharField('标准编号', max_length=100)
+ name = models.CharField('标准名称', max_length=100)
+ enabled = models.BooleanField('是否启用', default=True)
+ file = models.ForeignKey(File, verbose_name='文件', null=True, blank=True, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '标准库'
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return self.number + '-' + self.name
+
+class TestItem(CommonAModel):
+ """
+ 检验项目
+ """
+ name = models.CharField('名称', max_length=100)
+ standard = models.ForeignKey(Standard, verbose_name='关联标准', on_delete=models.CASCADE)
+ term_number = models.CharField('条款号', max_length=100)
+
+ class Meta:
+ verbose_name = '检验项目'
+ verbose_name_plural = verbose_name
+
+class AnalysisItem(CommonAModel):
+ """
+ 检验分析项
+ """
+ name = models.CharField('名称', max_length=100)
+ testitem = models.ForeignKey(TestItem, on_delete=models.CASCADE, verbose_name='关联检验项目')
+ rules =models.JSONField('判定规则', default=list)
+
+ class Meta:
+ verbose_name = '检验分析项'
\ No newline at end of file
diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py
new file mode 100644
index 0000000..a656332
--- /dev/null
+++ b/hb_server/apps/qm/serializers.py
@@ -0,0 +1,33 @@
+from rest_framework import serializers
+from apps.system.serializers import FileSimpleSerializer
+from .models import Standard, TestItem
+
+class StandardCreateUpdateSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Standard
+ fields = ['name', 'file', 'enabled', 'number']
+
+class StandardSerializer(serializers.ModelSerializer):
+ file_ = FileSimpleSerializer(source='file', read_only=True)
+ class Meta:
+ model = Standard
+ fields = '__all__'
+
+class StandardSimpleSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Standard
+ fields = ['id', 'name', 'number']
+
+class TestItemCreateUpdateSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TestItem
+ fields = ['name', 'standard', 'term_number']
+
+class TestItemSerializer(serializers.ModelSerializer):
+ standard_ = StandardSimpleSerializer(source='standard', read_only=True)
+ class Meta:
+ model = TestItem
+ fields = '__all__'
+
+class AnalysisItemSerializer(serializers.ModelSerializer):
+ pass
diff --git a/hb_server/apps/qm/tests.py b/hb_server/apps/qm/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/hb_server/apps/qm/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/hb_server/apps/qm/urls.py b/hb_server/apps/qm/urls.py
new file mode 100644
index 0000000..070d39b
--- /dev/null
+++ b/hb_server/apps/qm/urls.py
@@ -0,0 +1,13 @@
+from apps.qm.views import StandardViewSet, TestItemViewSet
+from django.db.models import base
+from rest_framework import urlpatterns
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+
+router = DefaultRouter()
+router.register('standard', StandardViewSet, basename='standard')
+router.register('testitem', TestItemViewSet, basename='testitem')
+urlpatterns = [
+ path('', include(router.urls)),
+]
+
diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py
new file mode 100644
index 0000000..da02e97
--- /dev/null
+++ b/hb_server/apps/qm/views.py
@@ -0,0 +1,39 @@
+from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer
+from apps.qm.models import Standard, TestItem
+from django.shortcuts import render
+from rest_framework.viewsets import ModelViewSet
+from apps.system.mixins import CreateUpdateModelAMixin
+# Create your views here.
+class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet):
+ """
+ 标准规范-增删改查
+ """
+ perms_map = {'*': '*'}
+ queryset = Standard.objects.select_related('file').all()
+ serializer_class = StandardSerializer
+ search_fields = ['name', 'number']
+ filterset_fields = []
+ ordering_fields = ['number']
+ ordering = ['id']
+
+ def get_serializer_class(self):
+ if self.action in ['create', 'update']:
+ return StandardCreateUpdateSerializer
+ return StandardSerializer
+
+class TestItemViewSet(CreateUpdateModelAMixin, ModelViewSet):
+ """
+ 检验项目增删改查
+ """
+ perms_map = {'*': '*'}
+ queryset = TestItem.objects.select_related('standard').all()
+ serializer_class = TestItemSerializer
+ search_fields = ['name', 'standard__name', 'standard__number']
+ filterset_fields = ['standard']
+ ordering_fields = ['id']
+ ordering = ['id']
+
+ def get_serializer_class(self):
+ if self.action in ['create', 'update']:
+ return TestItemCreateUpdateSerializer
+ return TestItemSerializer
diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py
index 4d608b0..00efa54 100644
--- a/hb_server/apps/sam/serializers.py
+++ b/hb_server/apps/sam/serializers.py
@@ -2,6 +2,8 @@ from rest_framework import serializers
from .models import Contract, Customer, Order
+from apps.mtm.serializers import MaterialSimpleSerializer
+
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
@@ -14,10 +16,11 @@ class CustomerCreateUpdateSerializer(serializers.ModelSerializer):
class CustomerSimpleSerializer(serializers.ModelSerializer):
class Meta:
+ model = Customer
fields = ['id', 'name']
class ContractSerializer(serializers.ModelSerializer):
-
+ customer_ = CustomerSimpleSerializer(source='customer', read_only=True)
class Meta:
model = Contract
fields = '__all__'
@@ -41,6 +44,7 @@ class OrderCreateUpdateSerializer(serializers.ModelSerializer):
class OrderSerializer(serializers.ModelSerializer):
contract_ = ContractSimpleSerializer(source='contract', read_only=True)
customer_ = CustomerSimpleSerializer(source='customer', read_only=True)
+ product_ = MaterialSimpleSerializer(source='product', read_only=True)
class Meta:
model = Order
fields = '__all__'
diff --git a/hb_server/apps/sam/urls.py b/hb_server/apps/sam/urls.py
index fda60b5..4aa607f 100644
--- a/hb_server/apps/sam/urls.py
+++ b/hb_server/apps/sam/urls.py
@@ -1,12 +1,13 @@
from django.db.models import base
from rest_framework import urlpatterns
-from apps.sam.views import CustomerViewSet,ContractViewSet
+from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet
from django.urls import path, include
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('customer', CustomerViewSet, basename='customer')
router.register('contract', ContractViewSet, basename='contract')
+router.register('order', OrderViewSet, basename='order')
urlpatterns = [
path('', include(router.urls)),
diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py
index c88922b..652d71e 100644
--- a/hb_server/server/settings.py
+++ b/hb_server/server/settings.py
@@ -53,7 +53,8 @@ INSTALLED_APPS = [
'apps.wf',
'apps.mtm',
'apps.inm',
- 'apps.sam'
+ 'apps.sam',
+ 'apps.qm'
]
MIDDLEWARE = [
diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py
index 607412d..e27e660 100644
--- a/hb_server/server/urls.py
+++ b/hb_server/server/urls.py
@@ -66,6 +66,8 @@ urlpatterns = [
path('api/mtm/', include('apps.mtm.urls')),
path('api/inm/', include('apps.inm.urls')),
path('api/sam/', include('apps.sam.urls')),
+ path('api/qm/', include('apps.qm.urls')),
+
# 工具
path('api/utils/signature/', GenSignature.as_view()),