fix: avoid company writes for employee serials

This commit is contained in:
Frudrax Cheng
2026-06-06 14:07:17 +08:00
parent a9aa4a1318
commit f80ab4a8ce
3 changed files with 37 additions and 32 deletions
+1 -26
View File
@@ -79,20 +79,6 @@ func (s *EmployeeSerialsService) generateWithDB(
) ([]models.EmployeeSerial, error) {
var serials []models.EmployeeSerial
// 检查公司是否存在,不存在则创建
var company models.Company
result := db.Where("company_name = ?", companyName).First(&company)
if result.Error != nil {
company = models.Company{
CompanyName: companyName,
IsActive: true,
}
result = db.Create(&company)
if result.Error != nil {
return nil, fmt.Errorf("创建公司失败: %w", result.Error)
}
}
// 生成序列号前缀
if serialPrefix == "" {
serialPrefix = fmt.Sprintf("EMP%d", time.Now().Year()%100)
@@ -136,7 +122,7 @@ func (s *EmployeeSerialsService) generateWithDB(
}
// 保存到数据库
result = db.Create(&serials)
result := db.Create(&serials)
if result.Error != nil {
return nil, fmt.Errorf("保存员工序列号失败: %w", result.Error)
}
@@ -197,17 +183,6 @@ func (s *EmployeeSerialsService) Update(serialNumber string, updateData models.U
}
if updateData.CompanyName != "" {
// 检查公司是否存在
var company models.Company
companyResult := database.DB.Where("company_name = ?", updateData.CompanyName).First(&company)
if companyResult.Error != nil {
company = models.Company{
CompanyName: updateData.CompanyName,
IsActive: true,
}
database.DB.Create(&company)
}
serial.CompanyName = updateData.CompanyName
}
+8 -6
View File
@@ -248,7 +248,7 @@ func TestEmployeeSerialsService_Generate_Success(t *testing.T) {
database.DB.Unscoped().Delete(&user)
}
func TestEmployeeSerialsService_Generate_CreateNewCompany(t *testing.T) {
func TestEmployeeSerialsService_Generate_DoesNotCreateManagedCompany(t *testing.T) {
var user models.User
password, _ := bcrypt.GenerateFromPassword([]byte("password123"), bcrypt.DefaultCost)
user = models.User{
@@ -266,11 +266,9 @@ func TestEmployeeSerialsService_Generate_CreateNewCompany(t *testing.T) {
assert.NoError(t, err)
assert.Len(t, serials, 3)
var company models.Company
result := database.DB.Where("company_name = ?", "NewEmpCompany").First(&company)
assert.NoError(t, result.Error)
assert.Equal(t, "NewEmpCompany", company.CompanyName)
assert.True(t, company.IsActive)
var count int64
database.DB.Model(&models.Company{}).Where("company_name = ?", "NewEmpCompany").Count(&count)
assert.Equal(t, int64(0), count)
for _, serial := range serials {
database.DB.Unscoped().Delete(&serial)
@@ -419,6 +417,10 @@ func TestEmployeeSerialsService_Update_Success(t *testing.T) {
assert.Equal(t, "新名字", result.EmployeeName)
assert.False(t, result.IsActive)
var count int64
database.DB.Model(&models.Company{}).Where("company_name = ?", "UpdatedEmpCompany").Count(&count)
assert.Equal(t, int64(0), count)
for _, serial := range serials {
database.DB.Unscoped().Delete(&serial)
}
+28
View File
@@ -33,6 +33,34 @@ func TestUsersService_Create_Success(t *testing.T) {
database.DB.Unscoped().Where("employee_name = ?", "新技术员").Delete(&models.EmployeeSerial{})
}
func TestUsersService_Create_DoesNotTouchCompanyTable(t *testing.T) {
database.DB.Unscoped().Where("company_name = ?", "内部员工").Delete(&models.Company{})
company := models.Company{CompanyName: "内部员工", IsActive: true}
assert.NoError(t, database.DB.Create(&company).Error)
assert.NoError(t, database.DB.Delete(&company).Error)
svc := UsersService{}
dto, err := svc.Create(models.CreateUserDTO{
Password: "password123",
Name: "软删公司员工",
Phone: "13800000008",
EmployeeNo: "users_create_restore_company",
Position: "硬件工程师",
Role: "hardware_engineer",
})
assert.NoError(t, err)
assert.NotNil(t, dto)
assert.Len(t, dto.EmployeeSerials, 1)
var count int64
database.DB.Model(&models.Company{}).Where("company_name = ?", "内部员工").Count(&count)
assert.Equal(t, int64(0), count)
database.DB.Unscoped().Where("username = ?", "users_create_restore_company").Delete(&models.User{})
database.DB.Unscoped().Where("employee_name = ?", "软删公司员工").Delete(&models.EmployeeSerial{})
database.DB.Unscoped().Where("company_name = ?", "内部员工").Delete(&models.Company{})
}
func TestUsersService_Create_BlocksEmployeeRole(t *testing.T) {
svc := UsersService{}
_, err := svc.Create(models.CreateUserDTO{