diff --git a/application/perf_mgnt/models.py b/application/perf_mgnt/models.py index 7df026c..932313a 100644 --- a/application/perf_mgnt/models.py +++ b/application/perf_mgnt/models.py @@ -1,5 +1,7 @@ from django.db import models +from application.org_mgnt.models import PrimaryDepartment + # 集团经营目标表 class GroupBusinessTarget(models.Model): @@ -23,6 +25,14 @@ class GroupBusinessTarget(models.Model): expense_limit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='费用限额(元)') operating_profit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='营业利润(元)') + def save(self, *args, **kwargs): + primary_department_name = PrimaryDepartment.objects.filter(department_name=self.primary_department).first() + + if not primary_department_name: + raise ValueError("一级部门不存在") + + super(GroupBusinessTarget, self).save(*args, **kwargs) + class Meta: verbose_name = '集团经营目标' verbose_name_plural = '集团经营目标表' diff --git a/excel_parser/utils.py b/excel_parser/utils.py index 0b06693..1742a37 100644 --- a/excel_parser/utils.py +++ b/excel_parser/utils.py @@ -1,5 +1,6 @@ from django.core.exceptions import ValidationError from django.apps import apps +from django.db import transaction class ExcelDataSaver: @@ -36,7 +37,7 @@ class ExcelDataSaver: for field, errors in e.message_dict.items(): for error in errors: try: - self.errors.append(f"第【{row_num + 1}】行【{self.reverse_field_mapping[field]}】字段输入错误: {error}") + self.errors.append(f"第【{row_num + 1}】行【{self.reverse_field_mapping[field]}】输入错误: {error}") except KeyError: self.errors.append(f"第【{row_num + 1}】行,错误原因: {error}") except Exception as e: @@ -44,11 +45,22 @@ class ExcelDataSaver: return len(self.errors) == 0 def save_data(self): + errors = [] + row_counter = 0 + if self.validate_data(): - for row in self.data: - row_data = {self.field_mapping[field]: value for field, value in row.items() if field in self.field_mapping} - instance = self.model(**row_data) - instance.save() + try: + with transaction.atomic(): + for row in self.data: + row_data = {self.field_mapping[field]: value for field, value in row.items() if field in self.field_mapping} + instance = self.model(**row_data) + instance.save() + row_counter += 1 + except Exception as e: + errors.append(f"第【{row_counter + 1}】行保存错误: {e}") + transaction.rollback() # 回滚事务 + self.errors.extend(errors) + return False return True return False