From cbf274cc7cd1107c525f1f2e77ad01948d184f54 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 17 May 2023 17:03:24 +0800 Subject: [PATCH 01/24] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E4=BF=9D?= =?UTF-8?q?=E5=AD=98num=5Fissue=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 14 +++++++++++--- server/apps/supervision/views.py | 19 +++++++++++++++++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 78db033..417d041 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -140,13 +140,13 @@ class ValidateMixin: class BaseMeta: fields = '__all__' - read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'is_deleted'] + read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'is_deleted', 'belong_dept'] class PgoalDeptSerializer(ValidateMixin, serializers.ModelSerializer): goal_file_ = FileSimpleSerializer(source='goal_file', read_only=True) class Meta(BaseMeta): model = PgoalDept - read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key'] + read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key', 'goal_file_', 'goal_o_file'] class RcSerializer(ValidateMixin, serializers.ModelSerializer): @@ -176,4 +176,12 @@ class OinspectSerializer(ValidateMixin, serializers.ModelSerializer): class NoRecordSerializer(serializers.Serializer): - key = serializers.ChoiceField(label='字段key', choices=['num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect']) \ No newline at end of file + key = serializers.ChoiceField(label='字段key', choices=['num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect']) + + +class UpdateFieldSerializer(serializers.ModelSerializer): + + class Meta: + model = Task2Do + fields = ['num_issue', 'num_expect'] + extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} \ No newline at end of file diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 2bd25c0..80f350b 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -475,7 +475,7 @@ class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): if task2.type == Task2.TASK2_F: count_all = 5 for i in vdata['ids']: - Task2Do.objects.get_or_create(task2=task2, belong_dept=i, defaults={'task2': task2, 'belong_dept': i, 'count_all': count_all}) + Task2Do.objects.get_or_create(task2=task2, belong_dept=i, defaults={'task2': task2, 'belong_dept': i, 'count_all': count_all, 'create_by': self.request.user}) return Response() @@ -484,7 +484,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): queryset = Task2Do.objects.select_related('belong_dept', 'task2').all() serializer_class = Task2DoSerializer ordering = ['belong_dept__sort'] - + filterset_fields = ['task2', 'belong_dept'] cfields = ['num_issue', 'num_expect', 'num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect'] @classmethod @@ -498,6 +498,20 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): instance.count_up = count_up instance.save() + @action(methods=['put'], detail=False, perms_map = {'post':'task2do'}, serializer_class=UpdateFieldSerializer) + def save_num(self, request, *args, **kwargs): + """保存数值 + + 保存数值 + """ + obj = self.get_object() + obj.num_issue = request.data.get('num_issue', 0) + obj.num_expect = request.data.get('num_expect', 0) + obj.update_by = request.user + obj.save() + self.countup_task2do(obj) + return Response() + @action(methods=['put'], detail=True, perms_map = {'post':'task2do'}, serializer_class=NoRecordSerializer) def no_record(self, request, *args, **kwargs): """没有记录 @@ -532,6 +546,7 @@ class Domixin: perms_map = {'get': '*', 'put': 'task2do', 'post': 'task2do', 'delete': 'task2do'} ordering = ['create_time'] ordering_fields = ['create_time', 'belong_dept__sort'] + filterset_fields = ['task2do', 'task2do__task2', 'task2do__belong_dept'] def countnum_task2do_field(self, task2do): for k, v in self.count_dict: From c9c9d136a16a65c84505d1baf13d54be5cfaab02 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 22 May 2023 15:20:24 +0800 Subject: [PATCH 02/24] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93task2=20default?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0040_auto_20230522_1515.py | 18 ++++++++++++++++++ .../migrations/0041_auto_20230522_1518.py | 18 ++++++++++++++++++ server/apps/supervision/models.py | 4 ++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 server/apps/supervision/migrations/0040_auto_20230522_1515.py create mode 100644 server/apps/supervision/migrations/0041_auto_20230522_1518.py diff --git a/server/apps/supervision/migrations/0040_auto_20230522_1515.py b/server/apps/supervision/migrations/0040_auto_20230522_1515.py new file mode 100644 index 0000000..286be76 --- /dev/null +++ b/server/apps/supervision/migrations/0040_auto_20230522_1515.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2023-05-22 07:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0039_auto_20230517_1419'), + ] + + operations = [ + migrations.AlterField( + model_name='task2', + name='state', + field=models.PositiveSmallIntegerField(choices=[(10, '创建中'), (20, '进行中'), (30, '已关闭')], default=10, verbose_name='任务状态'), + ), + ] diff --git a/server/apps/supervision/migrations/0041_auto_20230522_1518.py b/server/apps/supervision/migrations/0041_auto_20230522_1518.py new file mode 100644 index 0000000..2b7ee81 --- /dev/null +++ b/server/apps/supervision/migrations/0041_auto_20230522_1518.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2023-05-22 07:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0040_auto_20230522_1515'), + ] + + operations = [ + migrations.AlterField( + model_name='task2', + name='cycle', + field=models.PositiveSmallIntegerField(blank=True, default=0, help_text='1-6个周期', verbose_name='所属周期'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 6b3dd7f..86ab03f 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -157,9 +157,9 @@ class Task2(CommonAModel): ) year = models.PositiveSmallIntegerField('年份', default=2023) - cycle = models.PositiveSmallIntegerField('所属周期', default=0, help_text='1-6个周期') + cycle = models.PositiveSmallIntegerField('所属周期', default=0, help_text='1-6个周期', blank=True) type = models.PositiveSmallIntegerField('任务类型', choices=TASK2_TYPES, default=20) - state = models.PositiveSmallIntegerField('任务状态', choices=TASK2_STATES, default=20) + state = models.PositiveSmallIntegerField('任务状态', choices=TASK2_STATES, default=10) depts = models.ManyToManyField(Organization, verbose_name='执行公司', through='supervision.task2do', blank=True) From 36b608197eca6c0daaeecfaaee36414c68e4d1ad Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 22 May 2023 16:35:57 +0800 Subject: [PATCH 03/24] =?UTF-8?q?fix:=20task2do=20my=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 80f350b..c9b225f 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -537,7 +537,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): else: mydept = request.user.dept belong_depts = get_child_queryset2(mydept) - queryset = queryset.filter(belong_dept = belong_depts) + queryset = queryset.filter(belong_dept__in = belong_depts) serializer = Task2DoSerializer(queryset, many=True) return Response(serializer.data) From f9f3a256b87930c2b197de04eab1281c917a72a9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 22 May 2023 17:15:27 +0800 Subject: [PATCH 04/24] =?UTF-8?q?fix:=20task2=20update=20pop=20=E4=B8=8D?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 417d041..171d303 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -112,7 +112,7 @@ class Task2Serializer(serializers.ModelSerializer): read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'belong_dept', 'state', 'is_deleted', 'depts'] def update(self, instance, validated_data): - validated_data.pop('type') # type不可编辑 + validated_data.pop('type', None) # type不可编辑 if instance.state != Task2.TASK2_CLOSE: raise ParseError('非创建状态不可编辑') return super().update(instance, validated_data) From f41a8292d6a7b664fd437716d75813ab476bda44 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 23 May 2023 14:13:25 +0800 Subject: [PATCH 05/24] =?UTF-8?q?fix:=20=E6=9D=83=E9=99=90=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index c9b225f..940970c 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -498,7 +498,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): instance.count_up = count_up instance.save() - @action(methods=['put'], detail=False, perms_map = {'post':'task2do'}, serializer_class=UpdateFieldSerializer) + @action(methods=['put'], detail=False, perms_map = {'put':'task2do'}, serializer_class=UpdateFieldSerializer) def save_num(self, request, *args, **kwargs): """保存数值 @@ -512,7 +512,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): self.countup_task2do(obj) return Response() - @action(methods=['put'], detail=True, perms_map = {'post':'task2do'}, serializer_class=NoRecordSerializer) + @action(methods=['put'], detail=True, perms_map = {'put':'task2do'}, serializer_class=NoRecordSerializer) def no_record(self, request, *args, **kwargs): """没有记录 @@ -524,7 +524,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): self.countup_task2do(obj) return Response() - @action(methods=['get'], detail=False, perms_map = {'post':'task2do'}) + @action(methods=['get'], detail=False, perms_map = {'get':'task2do'}) def my(self, request, *args, **kwargs): """我的任务 From 90900bf71e56c965712647b0e83e55d82c62fe55 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 23 May 2023 14:17:50 +0800 Subject: [PATCH 06/24] fix: task2 start bug --- server/apps/supervision/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 940970c..9eae222 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -451,11 +451,11 @@ class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): raise ParseError('未配置年度基础目标') for i in tds: for k, v in enumerate(Pgoal.basedict): - pds = PgoalDept.objects.filter(year=i.year, task2do=i, goal_key=k) + pds = PgoalDept.objects.filter(task2do=i, goal_key=k) if pds.exists(): pds.update(**{'goal_name': v, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')}) else: - PgoalDept.objects.create(**{'year': i.year, 'task2do': i, 'belong_dept': i.belong_dept, + PgoalDept.objects.create(**{'year': i.task2.year, 'task2do': i, 'belong_dept': i.belong_dept, 'goal_name': v, 'goal_key': k, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')}) obj.state = Task2.TASK2_DOING obj.save() From 91ac2f29f9e4ac518dd640c24963d4e7e0b2bc2b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 23 May 2023 14:55:24 +0800 Subject: [PATCH 07/24] =?UTF-8?q?refector:=20=E6=9B=B4=E6=96=B0=E5=BA=93?= =?UTF-8?q?=E7=89=88=E6=9C=AC.=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/ability/apps.py | 2 +- server/apps/consulting/apps.py | 2 +- server/apps/crm/apps.py | 2 +- server/apps/exam/apps.py | 2 +- server/apps/ops/apps.py | 2 +- server/apps/quality/apps.py | 2 +- server/apps/supervision/apps.py | 2 +- .../0042_alter_pgoaldept_goal_value_b.py | 18 ++++++++++++++++++ server/apps/supervision/models.py | 2 +- server/apps/supervision/views.py | 12 ++++++------ server/apps/system/apps.py | 2 +- .../migrations/0023_alter_user_first_name.py | 18 ++++++++++++++++++ server/apps/vod/apps.py | 2 +- server/requirements.txt | Bin 554 -> 554 bytes server/server/settings.py | 3 +++ 15 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 server/apps/supervision/migrations/0042_alter_pgoaldept_goal_value_b.py create mode 100644 server/apps/system/migrations/0023_alter_user_first_name.py diff --git a/server/apps/ability/apps.py b/server/apps/ability/apps.py index f4be2ff..7bcdb3b 100644 --- a/server/apps/ability/apps.py +++ b/server/apps/ability/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class AbilityConfig(AppConfig): - name = 'ability' + name = 'apps.ability' diff --git a/server/apps/consulting/apps.py b/server/apps/consulting/apps.py index b3c0c5a..8306fe1 100644 --- a/server/apps/consulting/apps.py +++ b/server/apps/consulting/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class QualityConfig(AppConfig): - name = 'consulting' + name = 'apps.consulting' diff --git a/server/apps/crm/apps.py b/server/apps/crm/apps.py index d6f91d2..ede510e 100644 --- a/server/apps/crm/apps.py +++ b/server/apps/crm/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class CrmConfig(AppConfig): - name = 'crm' + name = 'apps.crm' diff --git a/server/apps/exam/apps.py b/server/apps/exam/apps.py index 9649087..c01c2f6 100644 --- a/server/apps/exam/apps.py +++ b/server/apps/exam/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class ExamConfig(AppConfig): - name = 'exam' + name = 'apps.exam' diff --git a/server/apps/ops/apps.py b/server/apps/ops/apps.py index 23b85df..84687ff 100644 --- a/server/apps/ops/apps.py +++ b/server/apps/ops/apps.py @@ -2,5 +2,5 @@ from django.apps import AppConfig class OpsConfig(AppConfig): - name = 'ops' + name = 'apps.ops' verbose_name = '系统监控' diff --git a/server/apps/quality/apps.py b/server/apps/quality/apps.py index 2455d38..c4ffb5c 100644 --- a/server/apps/quality/apps.py +++ b/server/apps/quality/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class QualityConfig(AppConfig): - name = 'quality' + name = 'apps.quality' diff --git a/server/apps/supervision/apps.py b/server/apps/supervision/apps.py index 7da9691..589f5aa 100644 --- a/server/apps/supervision/apps.py +++ b/server/apps/supervision/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class SupervisionConfig(AppConfig): - name = 'supervision' + name = 'apps.supervision' diff --git a/server/apps/supervision/migrations/0042_alter_pgoaldept_goal_value_b.py b/server/apps/supervision/migrations/0042_alter_pgoaldept_goal_value_b.py new file mode 100644 index 0000000..90df6a6 --- /dev/null +++ b/server/apps/supervision/migrations/0042_alter_pgoaldept_goal_value_b.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-05-23 06:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0041_auto_20230522_1518'), + ] + + operations = [ + migrations.AlterField( + model_name='pgoaldept', + name='goal_value_b', + field=models.FloatField(blank=True, null=True, verbose_name='设定值'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 86ab03f..2447f83 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -189,7 +189,7 @@ class PgoalDept(CommonBModel): goal_key = models.CharField('目标key值', max_length=100, default='other', blank=True) goal_value_a = models.FloatField('基础值') goal_o_file = models.ForeignKey(File, related_name='goal_o_file', verbose_name='原文件ID', on_delete=models.SET_NULL, null=True, blank=True) - goal_value_b = models.FloatField('设定值') + goal_value_b = models.FloatField('设定值', null=True, blank=True) goal_value_c = models.FloatField('实际值', null=True, blank=True) goal_file = models.ForeignKey(File, related_name='goal_file', verbose_name='当前文件ID', on_delete=models.SET_NULL, null=True, blank=True) goal_files = models.ManyToManyField(File, related_name='goal_files', verbose_name='历史文件', blank=True) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 9eae222..504fe65 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -434,7 +434,7 @@ class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): return Response() @transaction.atomic - @action(methods=['put'], detail=True, perms_map = {'put':'task2'}) + @action(methods=['put'], detail=True, perms_map = {'put':'task2'}, serializer_class=serializers.Serializer) def start(self, request, *args, **kwargs): """ 开始执行 @@ -450,13 +450,13 @@ class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): except: raise ParseError('未配置年度基础目标') for i in tds: - for k, v in enumerate(Pgoal.basedict): - pds = PgoalDept.objects.filter(task2do=i, goal_key=k) + for key in Pgoal.basedict: + pds = PgoalDept.objects.filter(task2do=i, goal_key=key) if pds.exists(): - pds.update(**{'goal_name': v, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')}) + pds.update(**{'goal_name': Pgoal.basedict[key], 'goal_value_a': getattr(pg, key), 'goal_o_file': getattr(pg, key+'_file')}) else: PgoalDept.objects.create(**{'year': i.task2.year, 'task2do': i, 'belong_dept': i.belong_dept, - 'goal_name': v, 'goal_key': k, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')}) + 'goal_name': Pgoal.basedict[key], 'goal_key': key, 'goal_value_a': getattr(pg, key), 'goal_o_file': getattr(pg, key+'_file')}) obj.state = Task2.TASK2_DOING obj.save() return Response() @@ -557,7 +557,7 @@ class Domixin: def countup_task2do(self, task2do): if task2do.task2.type == Task2.TASK2_F: - task2do.count_up = PgoalDept.objects.filter(task2do=task2do).count() + task2do.count_up = PgoalDept.objects.filter(task2do=task2do).exclude(goal_value_b=None).count() task2do.save() elif task2do.task2.type == Task2.TASK2_S: self.countnum_task2do_field(task2do) diff --git a/server/apps/system/apps.py b/server/apps/system/apps.py index 0e3baeb..7d38593 100644 --- a/server/apps/system/apps.py +++ b/server/apps/system/apps.py @@ -2,5 +2,5 @@ from django.apps import AppConfig class RbacConfig(AppConfig): - name = 'system' + name = 'apps.system' verbose_name = '系统管理' diff --git a/server/apps/system/migrations/0023_alter_user_first_name.py b/server/apps/system/migrations/0023_alter_user_first_name.py new file mode 100644 index 0000000..e3498fc --- /dev/null +++ b/server/apps/system/migrations/0023_alter_user_first_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-05-23 06:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0022_delete_historicaldict'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='first_name', + field=models.CharField(blank=True, max_length=150, verbose_name='first name'), + ), + ] diff --git a/server/apps/vod/apps.py b/server/apps/vod/apps.py index d5b0761..ed6dc55 100644 --- a/server/apps/vod/apps.py +++ b/server/apps/vod/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class VodConfig(AppConfig): - name = 'vod' + name = 'apps.vod' diff --git a/server/requirements.txt b/server/requirements.txt index 77fa7d5cc364af8cdb6186417e61e269626176b3..1b1b0b1f2364fe3dfae054fe9a2ffd294e9c255b 100644 GIT binary patch delta 68 zcmZ3*vWjJb7`qXJ9)lr+(M0K3M#G8zq7x^mFdBntsfkY{SWQ8)lNlKmf$9u_Y~#tA OjIyjCmce9i#`^#>d=Gg5 delta 70 zcmZ3*vWjJb7^?w;9)syb*;sZx1|uNTU}C)~t09D;J@JVIs|k>8Hkpx8k=>BN9LP4D PtjQ<~)@3}|oAEvX3+N78 diff --git a/server/server/settings.py b/server/server/settings.py index b7396ec..1934997 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -126,6 +126,9 @@ USE_TZ = True CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_ALLOW_ALL = True +# 默认主键 +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ From 3b95625d0445cc906b7e486a35248280533e5913 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 25 May 2023 16:04:00 +0800 Subject: [PATCH 08/24] =?UTF-8?q?feat:=20=E8=BF=94=E5=9B=9Egoal=5Fo=5Ffile?= =?UTF-8?q?=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 171d303..637853c 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -144,9 +144,10 @@ class BaseMeta: class PgoalDeptSerializer(ValidateMixin, serializers.ModelSerializer): goal_file_ = FileSimpleSerializer(source='goal_file', read_only=True) + goal_o_file_ = FileSimpleSerializer(source='goal_o_file', read_only=True) class Meta(BaseMeta): model = PgoalDept - read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key', 'goal_file_', 'goal_o_file'] + read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key', 'goal_file_', 'goal_o_file', 'goal_o_file_'] class RcSerializer(ValidateMixin, serializers.ModelSerializer): From 43dc1d176eb5c59aed801d3c6012774ba4e083e9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 26 May 2023 16:36:51 +0800 Subject: [PATCH 09/24] fix: pgoaldept create validate bug --- server/apps/supervision/serializers.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 637853c..95c3dd9 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -134,22 +134,29 @@ class ValidateMixin: if task2do: if task2do.task2.state == Task2.TASK2_CLOSE: raise ParseError('任务已关闭不可处理') - attrs['year'] = task2do.task2.year - attrs['belong_dept'] = task2do.task2.belong_dept + attrs['belong_dept'] = task2do.belong_dept return attrs class BaseMeta: fields = '__all__' read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'is_deleted', 'belong_dept'] -class PgoalDeptSerializer(ValidateMixin, serializers.ModelSerializer): +class PgoalDeptSerializer(serializers.ModelSerializer): goal_file_ = FileSimpleSerializer(source='goal_file', read_only=True) goal_o_file_ = FileSimpleSerializer(source='goal_o_file', read_only=True) class Meta(BaseMeta): model = PgoalDept read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key', 'goal_file_', 'goal_o_file', 'goal_o_file_'] - + def validate(self, attrs): + task2do = attrs.get('task2do', None) + if task2do: + if task2do.task2.state == Task2.TASK2_CLOSE: + raise ParseError('任务已关闭不可处理') + attrs['year'] = task2do.task2.year + attrs['belong_dept'] = task2do.belong_dept + return attrs + class RcSerializer(ValidateMixin, serializers.ModelSerializer): class Meta(BaseMeta): From 5069d1b7fe60f83876f272c012731d6d58869ac7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 26 May 2023 16:42:49 +0800 Subject: [PATCH 10/24] fix: pgoaldept create validate bug --- server/apps/supervision/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 504fe65..0cbdcc8 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -579,7 +579,7 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): serializer_class = PgoalDeptSerializer def perform_update(self, serializer): - instance = super().perform_update(serializer) + instance = serializer.save() goal_file = instance.goal_file if goal_file: instance.goal_files.add(goal_file) From e8dbb8df24b699bc505a24705e0e79a07c729a36 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 26 May 2023 16:47:17 +0800 Subject: [PATCH 11/24] =?UTF-8?q?fix:=20goal=5Fvalue=5Fa=E5=8F=AF=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0043_alter_pgoaldept_goal_value_a.py | 18 ++++++++++++++++++ server/apps/supervision/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 server/apps/supervision/migrations/0043_alter_pgoaldept_goal_value_a.py diff --git a/server/apps/supervision/migrations/0043_alter_pgoaldept_goal_value_a.py b/server/apps/supervision/migrations/0043_alter_pgoaldept_goal_value_a.py new file mode 100644 index 0000000..6548a55 --- /dev/null +++ b/server/apps/supervision/migrations/0043_alter_pgoaldept_goal_value_a.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-05-26 08:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0042_alter_pgoaldept_goal_value_b'), + ] + + operations = [ + migrations.AlterField( + model_name='pgoaldept', + name='goal_value_a', + field=models.FloatField(blank=True, null=True, verbose_name='基础值'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 2447f83..f3e105c 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -187,7 +187,7 @@ class PgoalDept(CommonBModel): year = models.PositiveSmallIntegerField('年份') goal_name = models.CharField('目标名称', max_length=100) goal_key = models.CharField('目标key值', max_length=100, default='other', blank=True) - goal_value_a = models.FloatField('基础值') + goal_value_a = models.FloatField('基础值', null=True, blank=True) goal_o_file = models.ForeignKey(File, related_name='goal_o_file', verbose_name='原文件ID', on_delete=models.SET_NULL, null=True, blank=True) goal_value_b = models.FloatField('设定值', null=True, blank=True) goal_value_c = models.FloatField('实际值', null=True, blank=True) From 89b90f8e663db7d37392ac59d90b721a141236d5 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 26 May 2023 17:08:43 +0800 Subject: [PATCH 12/24] fix: save_num bug --- server/apps/supervision/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 0cbdcc8..942cc26 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -498,7 +498,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): instance.count_up = count_up instance.save() - @action(methods=['put'], detail=False, perms_map = {'put':'task2do'}, serializer_class=UpdateFieldSerializer) + @action(methods=['put'], detail=True, perms_map = {'put':'task2do'}, serializer_class=UpdateFieldSerializer) def save_num(self, request, *args, **kwargs): """保存数值 From 459caa7667990419d90a249a8e7946f80a96e80d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 08:39:18 +0800 Subject: [PATCH 13/24] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_rename_num_ocheck_task2do_num_oinspect.py | 18 ++++++++++++++++++ server/apps/supervision/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 server/apps/supervision/migrations/0044_rename_num_ocheck_task2do_num_oinspect.py diff --git a/server/apps/supervision/migrations/0044_rename_num_ocheck_task2do_num_oinspect.py b/server/apps/supervision/migrations/0044_rename_num_ocheck_task2do_num_oinspect.py new file mode 100644 index 0000000..089137c --- /dev/null +++ b/server/apps/supervision/migrations/0044_rename_num_ocheck_task2do_num_oinspect.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-05-29 00:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0043_alter_pgoaldept_goal_value_a'), + ] + + operations = [ + migrations.RenameField( + model_name='task2do', + old_name='num_ocheck', + new_name='num_oinspect', + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index f3e105c..9849a66 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -178,7 +178,7 @@ class Task2Do(CommonBModel): num_complaint = models.PositiveSmallIntegerField('客户投诉数', null=True, blank=True) num_pt = models.PositiveSmallIntegerField('能力验证数', null=True, blank=True) num_risk = models.PositiveSmallIntegerField('风险识别数', null=True, blank=True) - num_ocheck = models.PositiveSmallIntegerField('外部检查数', null=True, blank=True) + num_oinspect = models.PositiveSmallIntegerField('外部检查数', null=True, blank=True) class PgoalDept(CommonBModel): From 45e95ad014f2105fb570f5de69b281affecff667 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 12:07:07 +0800 Subject: [PATCH 14/24] =?UTF-8?q?refector:=20=E5=90=8C=E6=AD=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supervision/migrations/0045_rc_remark.py | 18 +++++++++ .../migrations/0046_auto_20230529_1206.py | 38 +++++++++++++++++++ server/apps/supervision/models.py | 16 ++++++-- 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 server/apps/supervision/migrations/0045_rc_remark.py create mode 100644 server/apps/supervision/migrations/0046_auto_20230529_1206.py diff --git a/server/apps/supervision/migrations/0045_rc_remark.py b/server/apps/supervision/migrations/0045_rc_remark.py new file mode 100644 index 0000000..829d9ca --- /dev/null +++ b/server/apps/supervision/migrations/0045_rc_remark.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-05-29 01:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0044_rename_num_ocheck_task2do_num_oinspect'), + ] + + operations = [ + migrations.AddField( + model_name='rc', + name='remark', + field=models.TextField(blank=True, null=True, verbose_name='备注'), + ), + ] diff --git a/server/apps/supervision/migrations/0046_auto_20230529_1206.py b/server/apps/supervision/migrations/0046_auto_20230529_1206.py new file mode 100644 index 0000000..b4480af --- /dev/null +++ b/server/apps/supervision/migrations/0046_auto_20230529_1206.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.12 on 2023-05-29 04:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0045_rc_remark'), + ] + + operations = [ + migrations.AddField( + model_name='pt', + name='handle_result', + field=models.PositiveSmallIntegerField(choices=[(0, '/'), (10, '已整改'), (20, '被暂停'), (30, '已被撤销认可资格')], default=0, help_text="((0, '/'), (10, '已整改'), (20, '被暂停'), (30, '已被撤销认可资格'))", verbose_name='处理结果'), + ), + migrations.AlterField( + model_name='oinspect', + name='cate', + field=models.PositiveSmallIntegerField(choices=[(10, '市场监管部门检查'), (20, '行业主管部门检查'), (30, '其他检查')], default=30, help_text="((10, '市场监管部门检查'), (20, '行业主管部门检查'), (30, '其他检查'))", verbose_name='检查分类'), + ), + migrations.AlterField( + model_name='pt', + name='result', + field=models.PositiveSmallIntegerField(choices=[(10, '满意'), (20, '有问题'), (30, '不满意')], default=10, help_text="((10, '满意'), (20, '有问题'), (30, '不满意'))", verbose_name='结果'), + ), + migrations.AlterField( + model_name='risk', + name='level', + field=models.PositiveSmallIntegerField(choices=[(10, '主要风险'), (20, '严重风险'), (30, '重大风险')], default=10, help_text="((10, '主要风险'), (20, '严重风险'), (30, '重大风险'))", verbose_name='风险等级'), + ), + migrations.AlterField( + model_name='risk', + name='state', + field=models.PositiveSmallIntegerField(choices=[(10, '未整改'), (20, '整改中'), (30, '整改完成')], default=10, help_text="((10, '未整改'), (20, '整改中'), (30, '整改完成'))", verbose_name='整改状态'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 9849a66..55270ad 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -211,6 +211,7 @@ class Rc(CommonBModel): date_expect = models.DateField('预计发放日期', null=True, blank=True) date_issue = models.DateField('实际发放日期', null=True, blank=True) task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) + remark = models.TextField('备注', null=True, blank=True) class Complaint(CommonBModel): @@ -232,11 +233,18 @@ class Pt(CommonBModel): (20, '有问题'), (30, '不满意') ) + pt_hresult_choices = ( + (0, '/'), + (10, '已整改'), + (20, '被暂停'), + (30, '已被撤销认可资格') + ) name = models.CharField('名称', max_length=100) number = models.CharField('编号', max_length=100) organizer = models.CharField('组织方', max_length=100) params = models.TextField('参加参数名称') - result = models.PositiveSmallIntegerField('结果', choices=pt_result_choices, default=10) + result = models.PositiveSmallIntegerField('结果', choices=pt_result_choices, default=10, help_text=str(pt_result_choices)) + handle_result = models.PositiveSmallIntegerField('处理结果', choices = pt_hresult_choices, default=0, help_text=str(pt_hresult_choices)) task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) @@ -254,9 +262,9 @@ class Risk(CommonBModel): (30, '整改完成') ) content = models.TextField('内容') - level = models.PositiveSmallIntegerField('风险等级', choices=risk_level_choices, default=10) + level = models.PositiveSmallIntegerField('风险等级', choices=risk_level_choices, default=10, help_text=str(risk_level_choices)) code = models.CharField('风险代码', max_length=100) - state = models.PositiveSmallIntegerField('整改状态', choices=risk_state_choices, default=10) + state = models.PositiveSmallIntegerField('整改状态', choices=risk_state_choices, default=10, help_text=str(risk_state_choices)) task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) @@ -268,7 +276,7 @@ class Oinspect(CommonBModel): (20, '行业主管部门检查'), (30, '其他检查') ) - cate = models.PositiveSmallIntegerField('检查分类', choices=oinspect_cate_choices, default=30) + cate = models.PositiveSmallIntegerField('检查分类', choices=oinspect_cate_choices, default=30, help_text=str(oinspect_cate_choices)) checker = models.CharField('检查方', max_length=100) date_inspect = models.DateField('检查日期') result = models.TextField('检查结果') From 4f58ed67e02341a9826c5cf1b1ca50b27233318d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 13:47:01 +0800 Subject: [PATCH 15/24] =?UTF-8?q?feat:=20=E8=A1=A8=E6=A0=BC=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=8E=A5=E5=8F=A3=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 8 +- server/apps/supervision/views.py | 152 ++++++++++++++++++++++++- 2 files changed, 154 insertions(+), 6 deletions(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 95c3dd9..c9e87c0 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -192,4 +192,10 @@ class UpdateFieldSerializer(serializers.ModelSerializer): class Meta: model = Task2Do fields = ['num_issue', 'num_expect'] - extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} \ No newline at end of file + extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} + + + +class ImpSerializer(serializers.Serializer): + path = serializers.CharField(label='文件地址') + task2do = serializers.PrimaryKeyRelatedField(label='关联task2do的ID值', queryset = Task2Do.objects.all()) \ No newline at end of file diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 942cc26..5f3d51e 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -11,6 +11,7 @@ from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelM from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet, ModelViewSet from utils.pagination import PageOrNot +from openpyxl import load_workbook from apps.system.mixins import CreateUpdateCustomMixin from apps.system.models import Organization @@ -584,43 +585,184 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): if goal_file: instance.goal_files.add(goal_file) +class ImpMixin: + def get_enum(self, val, atuple, ind): + for i in atuple: + if i[1] == val: + return i[0] + raise ParseError('第{}: 请选择固定选项值'.format(ind)) + + def make_data(self, data, sheet, i, etype): + raise NotImplementedError() -class RcViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + def gen_imp_view(self, request, start: int, mySerializer, etype=0): + sr = ImpSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + path = vdata['path'] + task2do = vdata['task2do'] + fullpath = settings.BASE_DIR + path + wb = load_workbook(fullpath,data_only=True) + sheet = wb.worksheets[0] + datalist = [] + i = start + while sheet['b'+str(i)].value: + data = {} + data['task2do'] = task2do.id + data = self.make_data(data, sheet, i, etype) + datalist.append(data) + i = i + 1 + sr = mySerializer(data=datalist, many=True) + sr.is_valid() + err_msg = '' + for ind, val in enumerate(sr.errors): + if val: + for i in val: + err_msg = '第{}行: {}'.format(5+ind, i + str(val[i][0])) + if err_msg != '': + raise ParseError(err_msg) + else: + sr.save(create_by=request.user) + return Response() + +class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Rc.objects.all() serializer_class = RcSerializer count_dict = { "num_error": {'etype': 10}, "num_overdue": {'etype': 20} } + + + def make_data(self, data, sheet, i, etype): + data['etype'] = etype + if etype == 10: + data['number'] = sheet['b'+str(i)].value + data['number_correct'] = sheet['c'+str(i)].value + data['reason_error'] = sheet['d'+str(i)].value + data['date_issue'] = sheet['e'+str(i)].value + else: + data['number'] = sheet['b'+str(i)].value + data['date_accept'] = sheet['c'+str(i)].value + data['date_expect'] = sheet['d'+str(i)].value + data['date_issue'] = sheet['e'+str(i)].value + data['remark'] = sheet['f'+str(i)].value + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp_error(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, RcSerializer, 10) + + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp_overdue(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, RcSerializer, 20) + -class ComplaintViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): +class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Complaint.objects.all() serializer_class = ComplaintSerializer count_dict = { "num_complaint": {} } + def make_data(self, data, sheet, i, etype): + data['complainant'] = sheet['b'+str(i)].value + data['date_occurrence'] = sheet['c'+str(i)].value + data['content'] = sheet['d'+str(i)].value + data['date_feedback'] = sheet['e'+str(i)].value + data['is_satisfied'] = True if sheet['f'+str(i)].value == '是' else False + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, ComplaintSerializer) -class PtViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): +class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Pt.objects.all() serializer_class = PtSerializer count_dict = { "num_pt": {} } + def make_data(self, data, sheet, i, etype): + data['name'] = sheet['b'+str(i)].value + data['number'] = sheet['c'+str(i)].value + data['organizer'] = sheet['d'+str(i)].value + data['params'] = sheet['e'+str(i)].value + data['result'] = self.get_enum(sheet['f'+str(i)].value, Pt.pt_result_choices, i) + data['handle_result'] = self.get_enum(sheet['g'+str(i)].value, Pt.pt_hresult_choices, i) + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 -class RiskViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + 导入表格 + """ + return self.gen_imp_view(request, 5, PtSerializer) + + +class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Risk.objects.all() serializer_class = RiskSerializer count_dict = { "num_risk": {} } + def make_data(self, data, sheet, i, etype): + data['content'] = sheet['b'+str(i)].value + data['level'] = self.get_enum(sheet['c'+str(i)].value, Risk.risk_level_choices, i) + data['code'] = sheet['d'+str(i)].value + data['state'] = self.get_enum(sheet['e'+str(i)].value, Risk.risk_state_choices, i) + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 -class OinspectViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + 导入表格 + """ + return self.gen_imp_view(request, 5, RiskSerializer) + + +class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Oinspect.objects.all() serializer_class = OinspectSerializer count_dict = { "num_oinspect": {} } + + def make_data(self, data, sheet, i, etype): + data['cate'] = self.get_enum(sheet['b'+str(i)].value, Oinspect.oinspect_cate_choices, i) + data['checker'] = sheet['c'+str(i)].value + data['date_inspect'] = sheet['d'+str(i)].value + data['result'] = sheet['e'+str(i)].value + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, OinspectSerializer) \ No newline at end of file From d533b1c93c26ad6749bcb2e030ae0f2c3e7d331f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 14:42:56 +0800 Subject: [PATCH 16/24] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 5f3d51e..8a775cd 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -578,6 +578,7 @@ class Domixin: class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = PgoalDept.objects.all() serializer_class = PgoalDeptSerializer + filterset_fields = ['goal_key', 'belong_dept', 'year'] def perform_update(self, serializer): instance = serializer.save() @@ -632,6 +633,7 @@ class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): "num_error": {'etype': 10}, "num_overdue": {'etype': 20} } + filterset_fields = ['etype', 'task2do', 'task2do__belong_dept', 'task2do__year'] def make_data(self, data, sheet, i, etype): @@ -676,6 +678,8 @@ class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet) count_dict = { "num_complaint": {} } + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] + def make_data(self, data, sheet, i, etype): data['complainant'] = sheet['b'+str(i)].value data['date_occurrence'] = sheet['c'+str(i)].value @@ -700,6 +704,7 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_pt": {} } + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] def make_data(self, data, sheet, i, etype): data['name'] = sheet['b'+str(i)].value @@ -726,6 +731,7 @@ class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_risk": {} } + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] def make_data(self, data, sheet, i, etype): data['content'] = sheet['b'+str(i)].value @@ -750,6 +756,7 @@ class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_oinspect": {} } + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] def make_data(self, data, sheet, i, etype): data['cate'] = self.get_enum(sheet['b'+str(i)].value, Oinspect.oinspect_cate_choices, i) From 1c9e7a876947544626cff3fb0f6f79b4662197c3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 15:09:03 +0800 Subject: [PATCH 17/24] =?UTF-8?q?fix:=20=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9C=89=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 8a775cd..1d588c9 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -633,7 +633,7 @@ class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): "num_error": {'etype': 10}, "num_overdue": {'etype': 20} } - filterset_fields = ['etype', 'task2do', 'task2do__belong_dept', 'task2do__year'] + filterset_fields = ['etype', 'task2do', 'task2do__belong_dept', 'task2do__task2__year'] def make_data(self, data, sheet, i, etype): @@ -678,7 +678,7 @@ class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet) count_dict = { "num_complaint": {} } - filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] def make_data(self, data, sheet, i, etype): data['complainant'] = sheet['b'+str(i)].value @@ -704,7 +704,7 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_pt": {} } - filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] def make_data(self, data, sheet, i, etype): data['name'] = sheet['b'+str(i)].value @@ -731,7 +731,7 @@ class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_risk": {} } - filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] def make_data(self, data, sheet, i, etype): data['content'] = sheet['b'+str(i)].value @@ -756,7 +756,7 @@ class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): count_dict = { "num_oinspect": {} } - filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__year'] + filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] def make_data(self, data, sheet, i, etype): data['cate'] = self.get_enum(sheet['b'+str(i)].value, Oinspect.oinspect_cate_choices, i) From 10feb5493a2eabf0f83da91fab358cd07200627d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 15:46:40 +0800 Subject: [PATCH 18/24] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BApt=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 4 ++++ server/apps/supervision/views.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index c9e87c0..dd63a74 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -131,6 +131,8 @@ class Task2DoSerializer(serializers.ModelSerializer): class ValidateMixin: def validate(self, attrs): task2do = attrs.get('task2do', None) + attrs['create_by'] = self.context['request'].user + attrs['belong_dept'] = self.context['request'].user.belong_dept if task2do: if task2do.task2.state == Task2.TASK2_CLOSE: raise ParseError('任务已关闭不可处理') @@ -150,6 +152,8 @@ class PgoalDeptSerializer(serializers.ModelSerializer): def validate(self, attrs): task2do = attrs.get('task2do', None) + attrs['create_by'] = self.context['request'].user + attrs['belong_dept'] = self.context['request'].user.belong_dept if task2do: if task2do.task2.state == Task2.TASK2_CLOSE: raise ParseError('任务已关闭不可处理') diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 1d588c9..c706bec 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -565,7 +565,7 @@ class Domixin: @transaction.atomic def perform_create(self, serializer): - instance = super().perform_create(serializer) + instance = serializer.save() self.countup_task2do(instance.task2do) @transaction.atomic From 610e7850d390437a70e2d620500d58ef7cfc2285 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 15:56:55 +0800 Subject: [PATCH 19/24] fix: countnum_task2do_field bug --- server/apps/supervision/serializers.py | 4 ++-- server/apps/supervision/views.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index dd63a74..6b6571e 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -132,7 +132,7 @@ class ValidateMixin: def validate(self, attrs): task2do = attrs.get('task2do', None) attrs['create_by'] = self.context['request'].user - attrs['belong_dept'] = self.context['request'].user.belong_dept + attrs['belong_dept'] = self.context['request'].user.dept if task2do: if task2do.task2.state == Task2.TASK2_CLOSE: raise ParseError('任务已关闭不可处理') @@ -153,7 +153,7 @@ class PgoalDeptSerializer(serializers.ModelSerializer): def validate(self, attrs): task2do = attrs.get('task2do', None) attrs['create_by'] = self.context['request'].user - attrs['belong_dept'] = self.context['request'].user.belong_dept + attrs['belong_dept'] = self.context['request'].user.dept if task2do: if task2do.task2.state == Task2.TASK2_CLOSE: raise ParseError('任务已关闭不可处理') diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index c706bec..750c0d5 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -550,8 +550,8 @@ class Domixin: filterset_fields = ['task2do', 'task2do__task2', 'task2do__belong_dept'] def countnum_task2do_field(self, task2do): - for k, v in self.count_dict: - setattr(task2do, k, self.queryset.model.objects.filter({**{'task2do': task2do}, **v}).count()) + for k, v in self.count_dict.items(): + setattr(task2do, k, self.queryset.model.objects.filter(**{**{'task2do': task2do}, **v}).count()) task2do.save() # 更新count_up字段 Task2DoViewSet.countup_task2do(task2do) From 2c168411de9b8ea931e5e53221bc0cbc3fb11e95 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 17:08:28 +0800 Subject: [PATCH 20/24] =?UTF-8?q?fix:=20=E5=B9=B4=E5=BA=A6=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=9B=AE=E6=A0=87=E4=BD=BF=E7=94=A8=E7=89=A9=E7=90=86?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 750c0d5..7ba7f70 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -410,6 +410,9 @@ class PogalViewSet(CreateUpdateCustomMixin, ModelViewSet): if self.action in ['create', 'update']: return PgoalCreateUpdateSerializer return super().get_serializer_class() + + def perform_destroy(self, instance): + instance.delete(soft=False) class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'task2', From ca5f75177b5a86ccc816494fdf5f7fa29b24d8ae Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 May 2023 17:28:27 +0800 Subject: [PATCH 21/24] =?UTF-8?q?feat:=20pgoaldept=E5=A2=9E=E5=8A=A0task2d?= =?UTF-8?q?o=E7=AD=9B=E9=80=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 7ba7f70..bf5c4b2 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -581,7 +581,7 @@ class Domixin: class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = PgoalDept.objects.all() serializer_class = PgoalDeptSerializer - filterset_fields = ['goal_key', 'belong_dept', 'year'] + filterset_fields = ['goal_key', 'belong_dept', 'year', 'task2do'] def perform_update(self, serializer): instance = serializer.save() From 46e9607942f1b9b5f9fec2cab118d09b0e933277 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 30 May 2023 14:46:52 +0800 Subject: [PATCH 22/24] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0commonadmodel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/models.py | 20 ++++++++++---------- server/apps/supervision/views.py | 4 +--- server/apps/system/models.py | 24 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 55270ad..11dc6d9 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -1,6 +1,6 @@ from django.db import models from utils.model import BaseModel -from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File, CommonADModel, CommonBDModel from django.contrib.postgres.fields import JSONField # Create your models here. @@ -114,7 +114,7 @@ class TAction(CommonAModel): value_old = JSONField('原值', null=True, blank=True, default=dict) value_new = JSONField('新值', null=True, blank=True, default=dict) -class Pgoal(CommonAModel): +class Pgoal(CommonADModel): """ 基础目标 """ @@ -137,7 +137,7 @@ class Pgoal(CommonAModel): pgoal_4_file = models.ForeignKey(File, related_name='pgoal_4_file', on_delete=models.SET_NULL, null=True, blank=True) pgoal_5_file = models.ForeignKey(File, related_name='pgoal_5_file', on_delete=models.SET_NULL, null=True, blank=True) -class Task2(CommonAModel): +class Task2(CommonADModel): """ 报送任务2 """ @@ -163,7 +163,7 @@ class Task2(CommonAModel): depts = models.ManyToManyField(Organization, verbose_name='执行公司', through='supervision.task2do', blank=True) -class Task2Do(CommonBModel): +class Task2Do(CommonBDModel): """任务执行情况 """ task2 = models.ForeignKey(Task2, verbose_name='关联任务', on_delete=models.CASCADE, related_name='task2dept_task2') @@ -181,7 +181,7 @@ class Task2Do(CommonBModel): num_oinspect = models.PositiveSmallIntegerField('外部检查数', null=True, blank=True) -class PgoalDept(CommonBModel): +class PgoalDept(CommonBDModel): """企业年度目标值 """ year = models.PositiveSmallIntegerField('年份') @@ -196,7 +196,7 @@ class PgoalDept(CommonBModel): task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) -class Rc(CommonBModel): +class Rc(CommonBDModel): """报告或证书 """ etype_choices = ( @@ -214,7 +214,7 @@ class Rc(CommonBModel): remark = models.TextField('备注', null=True, blank=True) -class Complaint(CommonBModel): +class Complaint(CommonBDModel): """客户投诉 """ complainant = models.CharField('投诉人', max_length=100) @@ -225,7 +225,7 @@ class Complaint(CommonBModel): task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) -class Pt(CommonBModel): +class Pt(CommonBDModel): """能力验证 """ pt_result_choices = ( @@ -248,7 +248,7 @@ class Pt(CommonBModel): task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) -class Risk(CommonBModel): +class Risk(CommonBDModel): """风险识别 """ risk_level_choices = ( @@ -268,7 +268,7 @@ class Risk(CommonBModel): task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) -class Oinspect(CommonBModel): +class Oinspect(CommonBDModel): """外部检查 """ oinspect_cate_choices = ( diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index bf5c4b2..dc3a491 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -411,8 +411,6 @@ class PogalViewSet(CreateUpdateCustomMixin, ModelViewSet): return PgoalCreateUpdateSerializer return super().get_serializer_class() - def perform_destroy(self, instance): - instance.delete(soft=False) class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'task2', @@ -574,7 +572,7 @@ class Domixin: @transaction.atomic def perform_destroy(self, instance): task2do = instance.task2do - instance.delete(soft=False) + instance.delete() self.countup_task2do(task2do) diff --git a/server/apps/system/models.py b/server/apps/system/models.py index 8b6781f..fd84af5 100644 --- a/server/apps/system/models.py +++ b/server/apps/system/models.py @@ -167,6 +167,17 @@ class Dict(SoftModel): def __str__(self): return self.name +class CommonADModel(BaseModel): + """ + 业务用基本表A,包含create_by, update_by字段,物理删除 + """ + create_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by') + update_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by') + + class Meta: + abstract = True class CommonAModel(SoftModel): """ @@ -194,6 +205,19 @@ class CommonBModel(SoftModel): class Meta: abstract = True +class CommonBDModel(BaseModel): + """ + 业务用基本表B,包含create_by, update_by, belong_dept字段,物理删除 + """ + create_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='%(class)s_create_by') + update_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='%(class)s_update_by') + belong_dept = models.ForeignKey( + Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name='%(class)s_belong_dept') + + class Meta: + abstract = True class File(CommonAModel): """ From 1d31f80c920141e59ec1f80bc2a36c093566d2ff Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 31 May 2023 16:31:43 +0800 Subject: [PATCH 23/24] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0047_auto_20230531_1629.py | 28 +++++++++++++++++++ server/apps/supervision/models.py | 5 +++- server/apps/supervision/views.py | 19 +++++++++---- 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 server/apps/supervision/migrations/0047_auto_20230531_1629.py diff --git a/server/apps/supervision/migrations/0047_auto_20230531_1629.py b/server/apps/supervision/migrations/0047_auto_20230531_1629.py new file mode 100644 index 0000000..c6cbef7 --- /dev/null +++ b/server/apps/supervision/migrations/0047_auto_20230531_1629.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.12 on 2023-05-31 08:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('supervision', '0046_auto_20230529_1206'), + ] + + operations = [ + migrations.AddField( + model_name='task2do', + name='num_acc', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='重大质量事故'), + ), + migrations.AddField( + model_name='task2do', + name='num_complaint_10', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='满意客户投诉数'), + ), + migrations.AddField( + model_name='task2do', + name='num_pt_10', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='满意能力验证数'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index 11dc6d9..6ce7664 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -168,15 +168,18 @@ class Task2Do(CommonBDModel): """ task2 = models.ForeignKey(Task2, verbose_name='关联任务', on_delete=models.CASCADE, related_name='task2dept_task2') count_up = models.PositiveSmallIntegerField('完成上报内容数', default=0) - count_all = models.PositiveSmallIntegerField('需上报内容数', default=8) + count_all = models.PositiveSmallIntegerField('需上报内容数', default=9) num_issue = models.PositiveSmallIntegerField('已发放报告数量', null=True, blank=True) num_expect = models.PositiveSmallIntegerField('应发报告数', null=True, blank=True) + num_acc = models.PositiveSmallIntegerField('重大质量事故', null=True, blank=True) num_error = models.PositiveSmallIntegerField('不准确报告数', null=True, blank=True) num_overdue = models.PositiveSmallIntegerField('超期报告数', null=True, blank=True) num_complaint = models.PositiveSmallIntegerField('客户投诉数', null=True, blank=True) + num_complaint_10 = models.PositiveSmallIntegerField('满意客户投诉数', null=True, blank=True) num_pt = models.PositiveSmallIntegerField('能力验证数', null=True, blank=True) + num_pt_10 = models.PositiveSmallIntegerField('满意能力验证数', null=True, blank=True) num_risk = models.PositiveSmallIntegerField('风险识别数', null=True, blank=True) num_oinspect = models.PositiveSmallIntegerField('外部检查数', null=True, blank=True) diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index dc3a491..bbff424 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -473,7 +473,7 @@ class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet): sr = Task2DeptsSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data - count_all = 8 + count_all = 9 if task2.type == Task2.TASK2_F: count_all = 5 for i in vdata['ids']: @@ -486,7 +486,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): queryset = Task2Do.objects.select_related('belong_dept', 'task2').all() serializer_class = Task2DoSerializer ordering = ['belong_dept__sort'] - filterset_fields = ['task2', 'belong_dept'] + filterset_fields = ['task2', 'belong_dept', 'task2__year', 'task2__cycle'] cfields = ['num_issue', 'num_expect', 'num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect'] @classmethod @@ -509,6 +509,7 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): obj = self.get_object() obj.num_issue = request.data.get('num_issue', 0) obj.num_expect = request.data.get('num_expect', 0) + obj.num_acc = request.data.get('num_acc', 0) obj.update_by = request.user obj.save() self.countup_task2do(obj) @@ -521,7 +522,11 @@ class Task2DoViewSet(ListModelMixin, GenericViewSet): 没有记录 """ obj = self.get_object() - setattr(obj, request.data.get('key'), 0) + theattr = getattr(obj, request.data.get('key'), None) + if theattr is None: + theattr = 0 + else: + raise ParseError('已有记录') obj.save() self.countup_task2do(obj) return Response() @@ -602,6 +607,8 @@ class ImpMixin: sr.is_valid(raise_exception=True) vdata = sr.validated_data path = vdata['path'] + if not path.endswith('.xlsx'): + raise ParseError('请提供xlsx格式文件') task2do = vdata['task2do'] fullpath = settings.BASE_DIR + path wb = load_workbook(fullpath,data_only=True) @@ -677,7 +684,8 @@ class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet) queryset = Complaint.objects.all() serializer_class = ComplaintSerializer count_dict = { - "num_complaint": {} + "num_complaint": {}, + "num_complaint_10": {'is_satisfied': True} } filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] @@ -703,7 +711,8 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Pt.objects.all() serializer_class = PtSerializer count_dict = { - "num_pt": {} + "num_pt": {}, + "num_pt_10": {'result': 10} } filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year'] From 9cbd7ff12ee4e6d5fcccf16b5abbe8a5d7791836 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 31 May 2023 16:38:49 +0800 Subject: [PATCH 24/24] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=AD=97=E6=AE=B5=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/supervision/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 6b6571e..28a35dc 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -195,8 +195,8 @@ class UpdateFieldSerializer(serializers.ModelSerializer): class Meta: model = Task2Do - fields = ['num_issue', 'num_expect'] - extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} + fields = ['num_issue', 'num_expect', 'num_acc'] + extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}, 'num_acc': {'required': True}}