from django.db import models, IntegrityError from application.org_mgnt.models import PrimaryDepartment # 集团经营目标表 class GroupBusinessTarget(models.Model): PROJECT_NATURE_CHOICES = ( ('新增', '新增'), ('存续', '存续'), ('新增及存续', '新增及存续'), ('老客户新业务', '老客户新业务') ) target_id = models.AutoField(primary_key=True, verbose_name='记录ID') primary_department = models.CharField(max_length=255, verbose_name='一级部门') year = models.IntegerField(verbose_name='年份') project_nature = models.CharField(max_length=255, choices=PROJECT_NATURE_CHOICES, verbose_name='项目性质') sales = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='销售额(元)', null=True, blank=True) total_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='收入总目标(元)', null=True, blank=True) new_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='新增收入目标(元)', null=True, blank=True) existing_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='存量收入目标(元)', null=True, blank=True) cost_limit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='成本限额(元)', null=True, blank=True) gross_profit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='毛利润(元)', null=True, blank=True) expense_limit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='费用限额(元)', null=True, blank=True) operating_profit = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='营业利润(元)', null=True, blank=True) def save(self, *args, **kwargs): primary_department_name = PrimaryDepartment.objects.filter(department_name=self.primary_department).first() if not primary_department_name: raise ValueError("一级部门不存在") if self.pk is None: # 新增操作,进行唯一性校验 if GroupBusinessTarget.objects.filter(primary_department=self.primary_department, year=self.year, project_nature=self.project_nature).exists(): raise IntegrityError("该一级部门在同一年已经有一个相同项目性质的业绩目标。") super(GroupBusinessTarget, self).save(*args, **kwargs) class Meta: verbose_name = '集团经营目标' verbose_name_plural = '集团经营目标表' constraints = [ models.UniqueConstraint(fields=['primary_department', 'year', 'project_nature'], name='unique_department_year_nature') ] def __str__(self): return f"{self.primary_department} - {self.year}" # 经营目标修改记录表 class TargetAudit(models.Model): audit_id = models.AutoField(primary_key=True, verbose_name='记录ID') target_id = models.ForeignKey(GroupBusinessTarget, on_delete=models.CASCADE, verbose_name='目标ID') modified_field = models.CharField(max_length=255, verbose_name='修改字段') old_value = models.CharField(max_length=255, verbose_name='旧值', null=True, blank=True) new_value = models.CharField(max_length=255, verbose_name='新值', null=True, blank=True) modification_date = models.DateTimeField(auto_now_add=True, verbose_name='修改日期') modified_by = models.CharField(max_length=255, verbose_name='修改人') class Meta: verbose_name = '经营目标修改记录' verbose_name_plural = '经营目标修改记录表' def __str__(self): return f"{self.target_id} - {self.modified_field} - {self.modification_date}" # 员工业绩目标 class EmployeePerformanceTarget(models.Model): PROJECT_NATURE_CHOICES = ( ('新增', '新增'), ('存续', '存续'), ('新增及存续', '新增及存续'), ('老客户新业务', '老客户新业务') ) target_id = models.AutoField(primary_key=True, verbose_name='目标ID') name = models.CharField(max_length=255, verbose_name='姓名') department = models.CharField(max_length=255, verbose_name='一级部门') year = models.IntegerField(verbose_name='年份') sales_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='销售额目标(元)') total_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='收入总目标(元)') new_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='新增收入目标(元)') existing_revenue_target = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='存量收入目标(元)') def save(self, *args, **kwargs): primary_department_name = PrimaryDepartment.objects.filter(department_name=self.department).first() if not primary_department_name: raise ValueError("一级部门不存在") if self.pk is None: # 新增操作,进行唯一性校验 if EmployeePerformanceTarget.objects.filter(department=self.department, year=self.year, name=self.name).exists(): raise IntegrityError("该姓名和一级部门在同一年已经有一个相同的业绩目标。") super(EmployeePerformanceTarget, self).save(*args, **kwargs) class Meta: verbose_name = '员工业绩目标' verbose_name_plural = '员工业绩目标表' def __str__(self): return f"{self.name} - {self.department} - {self.year}" # 员工业绩目标修改记录 class EmployeeTargetAudit(models.Model): audit_id = models.AutoField(primary_key=True, verbose_name='记录ID') target_id = models.ForeignKey(EmployeePerformanceTarget, on_delete=models.CASCADE, verbose_name='目标ID') modified_field = models.CharField(max_length=255, verbose_name='修改字段') old_value = models.CharField(max_length=255, verbose_name='旧值', null=True, blank=True) new_value = models.CharField(max_length=255, verbose_name='新值', null=True, blank=True) modification_date = models.DateTimeField(auto_now_add=True, verbose_name='修改日期') modified_by = models.CharField(max_length=255, verbose_name='修改人') class Meta: verbose_name = '员工业绩目标修改记录' verbose_name_plural = '员工业绩目标修改记录表' def __str__(self): return f"{self.target_id} - {self.modified_field} - {self.modification_date}"