{"record":{"id":"e64646bb4f39a5aa","repo":"flipped-aurora/gin-vue-admin","slug":"packagename-e64646","errorCode":null,"errorMessage":"存在相同PackageName","messagePattern":"存在相同PackageName","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/service/system/auto_code_package.go","lineNumber":48,"sourceCode":"func (s *autoCodePackage) Create(ctx context.Context, info *request.SysAutoCodePackageCreate) error {\n\tswitch {\n\tcase info.Template == \"\":\n\t\treturn errors.New(\"模板不能为空!\")\n\tcase info.Template == \"page\":\n\t\treturn errors.New(\"page为表单生成器!\")\n\tcase info.PackageName == \"\":\n\t\treturn errors.New(\"PackageName不能为空!\")\n\tcase token.IsKeyword(info.PackageName):\n\t\treturn errors.Errorf(\"%s为go的关键字!\", info.PackageName)\n\tcase info.Template == \"package\":\n\t\tif info.PackageName == \"system\" || info.PackageName == \"example\" {\n\t\t\treturn errors.New(\"不能使用已保留的package name\")\n\t\t}\n\tdefault:\n\t\tbreak\n\t}\n\tif !errors.Is(global.GVA_DB.Where(\"package_name = ? and template = ?\", info.PackageName, info.Template).First(&model.SysAutoCodePackage{}).Error, gorm.ErrRecordNotFound) {\n\t\treturn errors.New(\"存在相同PackageName\")\n\t}\n\tcreate := info.Create()\n\treturn global.GVA_DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {\n\t\terr := tx.Create(&create).Error\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"创建失败!\")\n\t\t}\n\t\tcode := info.AutoCode()\n\t\t_, asts, creates, err := s.templates(ctx, create, code, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor key, value := range creates { // key 为 模版绝对路径\n\t\t\tvar files *template.Template\n\t\t\tfiles, err = template.New(filepath.Base(key)).Funcs(autocode.GetTemplateFuncMap()).ParseFiles(key)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"[filepath:%s]读取模版文件失败!\", key)\n\t\t\t}","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/service/system/auto_code_package.go#L30-L66","documentation":"After passing name validation, Create queries sys_auto_code_package for a row with the same packageName AND template. If such a record is found (query does not return gorm.ErrRecordNotFound), creation is refused to keep package names unique per template.","triggerScenarios":"POSTing a new package whose (packageName, template) pair already exists in sys_auto_code_package; retrying a creation that already succeeded; same name but different template passes (the uniqueness is per-template).","commonSituations":"Double-clicking the submit button; re-running an automation script; re-creating a package after deleting its generated code but not its package record.","solutions":["Query existing packages first (GET autoCode/package list) and reuse or delete the existing one before re-creating.","Pick a unique packageName, or intentionally reuse the existing package when generating new code.","If the leftover record is stale, delete the old package entry via the auto-code UI/API, then re-create."],"exampleFix":"// before: blind create\nPOST /autoCode/createPackage {\"template\":\"package\",\"packageName\":\"crm\"}\n// after: check then create or reuse\nconst pkgs = await api.getPackageList()\nif (!pkgs.some(p => p.packageName === 'crm' && p.template === 'package')) {\n  await api.createPackage({ template: 'package', packageName: 'crm' })\n}","handlingStrategy":"validation","validationCode":"const exists = (await api.getPackageList()).list?.some(\n  p => p.packageName === name && p.template === template\n)\nif (exists) {\n  throw new Error('存在相同PackageName，请先删除或复用')\n}","typeGuard":null,"tryCatchPattern":"try {\n  await api.createPackage(payload)\n} catch (e) {\n  if (e?.msg === '存在相同PackageName') {\n    const use = await confirm('包已存在，复用该包继续生成？')\n    if (use) targetPackageId = await findPackageId(name)\n  } else { throw e }\n}","preventionTips":["Search existing packages before creating; reuse is usually the intent.","Make (packageName, template) a composite unique constraint in your data design to catch duplicates at insert.","When deleting generated code, also delete the package record to avoid stale uniqueness collisions."],"tags":["duplicate","database","autocode"],"backgroundTag":"duplicate-record","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}