Browse Source

2023-11-16 基本信息

zoie 1 year ago
parent
commit
4e486d8aa2
93 changed files with 8775 additions and 2 deletions
  1. 2 0
      .gitignore
  2. 36 0
      Makefile
  3. 12 2
      README.md
  4. 30 0
      common/actions/permission.go
  5. 106 0
      common/dto/generate.go
  6. 12 0
      common/dto/order.go
  7. 20 0
      common/dto/pagination.go
  8. 94 0
      common/dto/search.go
  9. 21 0
      common/dto/type.go
  10. 11 0
      common/global/adm.go
  11. 43 0
      common/global/constant.go
  12. 16 0
      common/global/error.go
  13. 112 0
      common/initialize/db.go
  14. 75 0
      common/initialize/log.go
  15. 2 0
      common/initialize/service_discovery.go
  16. 37 0
      common/model/model.go
  17. 11 0
      common/model/type.go
  18. 116 0
      common/redis/redis.go
  19. 44 0
      common/response/model.go
  20. 50 0
      common/response/return.go
  21. 10 0
      common/response/type.go
  22. 48 0
      conf/app.conf
  23. 12 0
      conf/conf.go
  24. 63 0
      controllers/base_controller.go
  25. 153 0
      controllers/dosage_form.go
  26. 153 0
      controllers/enterprise.go
  27. 24 0
      controllers/error.go
  28. 153 0
      controllers/product.go
  29. 41 0
      controllers/role_api.go
  30. 154 0
      controllers/spec.go
  31. 153 0
      controllers/unit.go
  32. 1641 0
      docs/docs.go
  33. BIN
      docs/favicon-16x16.png
  34. BIN
      docs/favicon-32x32.png
  35. 60 0
      docs/index.html
  36. 79 0
      docs/oauth2-redirect.html
  37. 1 0
      docs/swagger-ui-bundle.js
  38. 0 0
      docs/swagger-ui-bundle.js.map
  39. 0 0
      docs/swagger-ui-es-bundle-core.js
  40. 1 0
      docs/swagger-ui-es-bundle.js
  41. 1 0
      docs/swagger-ui-standalone-preset.js
  42. 0 0
      docs/swagger-ui-standalone-preset.js.map
  43. 1 0
      docs/swagger-ui.css
  44. 0 0
      docs/swagger-ui.css.map
  45. 0 0
      docs/swagger-ui.js
  46. 0 0
      docs/swagger-ui.js.map
  47. 1621 0
      docs/swagger.json
  48. 1023 0
      docs/swagger.yaml
  49. 60 0
      docs/swagger.yml
  50. 98 0
      dto/dosage_form.go
  51. 98 0
      dto/enterprise.go
  52. 20 0
      dto/pagination.go
  53. 98 0
      dto/product.go
  54. 13 0
      dto/role_api.go
  55. 98 0
      dto/spec.go
  56. 98 0
      dto/unit.go
  57. 101 0
      go.mod
  58. 328 0
      go.sum
  59. 0 0
      logs/logs.alert.log
  60. 1 0
      logs/logs.critical.log
  61. 0 0
      logs/logs.emergency.log
  62. 2 0
      logs/logs.error.log
  63. 51 0
      logs/logs.info.log
  64. 54 0
      logs/logs.log
  65. 0 0
      logs/logs.notice.log
  66. 0 0
      logs/logs.warning.log
  67. 88 0
      main.go
  68. 120 0
      middleware/auth_middle.go
  69. 26 0
      middleware/cors_middle.go
  70. 98 0
      middleware/log_middle.go
  71. 22 0
      models/dosage_form.go
  72. 22 0
      models/enterprise.go
  73. 27 0
      models/init.go
  74. 16 0
      models/operation_log.go
  75. 22 0
      models/product.go
  76. 26 0
      models/role_api.go
  77. 22 0
      models/spec.go
  78. 22 0
      models/unit.go
  79. 19 0
      routers/dosage_form.go
  80. 19 0
      routers/enterprise.go
  81. 19 0
      routers/product.go
  82. 16 0
      routers/role_api.go
  83. 27 0
      routers/router.go
  84. 19 0
      routers/spec.go
  85. 19 0
      routers/unit.go
  86. 106 0
      services/dosage_form.go
  87. 106 0
      services/enterprise.go
  88. 106 0
      services/product.go
  89. 65 0
      services/role_api.go
  90. 110 0
      services/spec.go
  91. 106 0
      services/unit.go
  92. 38 0
      tests/default_test.go
  93. 127 0
      utils/comm.go

+ 2 - 0
.gitignore

@@ -24,3 +24,5 @@ _testmain.go
 *.test
 *.prof
 
+./bin
+./Medical_ERP

+ 36 - 0
Makefile

@@ -0,0 +1,36 @@
+PACKAGE=Medical_ERP
+PREFIX=$(shell pwd)
+CMD_PACKAGE=${PACKAGE}
+OUTPUT_DIR=${PREFIX}/bin
+OUTPUT_FILE=${OUTPUT_DIR}/Medical_ERP
+OUTPUT_FILE_LINUX=${OUTPUT_DIR}/linux/Medical_ERP
+COMMIT_ID=$(shell git rev-parse --short HEAD)
+VERSION=$(shell git describe --tags || echo "v0.0.1")
+VERSION_IMPORT_PATH=github.com/lneoe/go-help-libs/version
+BUILD_TIME=$(shell date '+%Y-%m-%dT%H:%M:%S%Z')
+VCS_BRANCH=$(shell git symbolic-ref --short -q HEAD)
+
+# build args
+BUILD_ARGS := \
+    -ldflags "-X $(VERSION_IMPORT_PATH).appName=$(PACKAGE) \
+    -X $(VERSION_IMPORT_PATH).version=$(VERSION) \
+    -X $(VERSION_IMPORT_PATH).revision=$(COMMIT_ID) \
+    -X $(VERSION_IMPORT_PATH).branch=$(VCS_BRANCH) \
+    -X $(VERSION_IMPORT_PATH).buildDate=$(BUILD_TIME)"
+EXTRA_BUILD_ARGS=
+build:
+	@echo "+ build"
+	go build $(BUILD_ARGS) $(EXTRA_BUILD_ARGS) -o ${OUTPUT_FILE} $(CMD_PACKAGE)
+
+build-linux:
+	@echo "+ build linux"
+	GOOS=linux GOARCH=amd64 go build $(BUILD_ARGS) $(EXTRA_BUILD_ARGS) -o ${OUTPUT_FILE_LINUX} $(CMD_PACKAGE)
+
+
+#.PHONY: test
+#test:
+#	go test -v ./... -cover
+
+#.PHONY: docker
+#docker:
+#	docker build . -t Medical_ERP:latest

+ 12 - 2
README.md

@@ -1,3 +1,13 @@
-# Medical_ERP
+### 配置 swagger
+
+使用 bee generate docs 生成符合 swagger 使用的两个文档 swagger.json 和 swagger.yml
+使用命令 bee run -downdoc=true 更新 swagger-ui ,如果 swagger 目录没有 swagger-ui 则会自动下载安装
+使用命令 bee run -gendoc=true 让项目重新编译也会生成 swagger 文档
+重点: 这里建议 直接使用命令 bee run -gendoc=true -downdoc=true 结合两个方法
+
+
+### 接口文档
+### 生成swagger文档
+swag init --parseDependency --parseDepth=6
+
 
-医药进销存

+ 30 - 0
common/actions/permission.go

@@ -0,0 +1,30 @@
+package actions
+
+import (
+	"github.com/beego/beego/v2/server/web/context"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+	"gorm.io/gorm"
+)
+
+type DataPermission struct {
+	UserId int
+	DeptId int
+}
+
+func Permission(tableName string, p *DataPermission) func(db *gorm.DB) *gorm.DB {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Where(tableName+".dept_id = ? ", p.DeptId)
+	}
+}
+
+func getPermissionFromContext(c *context.Context) *DataPermission {
+	p := new(DataPermission)
+	p.UserId = beegouser.GetUserId(c)
+	p.DeptId = beegouser.GetDeptId(c)
+	return p
+}
+
+// GetPermissionFromContext 提供非action写法数据范围约束
+func GetPermissionFromContext(c *context.Context) *DataPermission {
+	return getPermissionFromContext(c)
+}

+ 106 - 0
common/dto/generate.go

@@ -0,0 +1,106 @@
+package dto
+
+import (
+	vd "github.com/bytedance/go-tagexpr/v2/validator"
+	"net/http"
+
+	"github.com/gin-gonic/gin"
+	"gogs.baozhida.cn/zoie/OAuth-core/api"
+)
+
+type ObjectById struct {
+	Id  int   `uri:"id"`
+	Ids []int `json:"ids"`
+}
+
+func (s *ObjectById) Bind(ctx *gin.Context) error {
+	var err error
+	log := api.GetRequestLogger(ctx)
+	err = ctx.ShouldBindUri(s)
+	if err != nil {
+		log.Warnf("ShouldBindUri error: %s", err.Error())
+		return err
+	}
+	if ctx.Request.Method == http.MethodDelete {
+		err = ctx.ShouldBind(&s)
+		if err != nil {
+			log.Warnf("ShouldBind error: %s", err.Error())
+			return err
+		}
+		if len(s.Ids) > 0 {
+			return nil
+		}
+		if s.Ids == nil {
+			s.Ids = make([]int, 0)
+		}
+		if s.Id != 0 {
+			s.Ids = append(s.Ids, s.Id)
+		}
+	}
+	if err = vd.Validate(s); err != nil {
+		log.Errorf("Validate error: %s", err.Error())
+		return err
+	}
+	return err
+}
+
+func (s *ObjectById) GetId() interface{} {
+	if len(s.Ids) > 0 {
+		s.Ids = append(s.Ids, s.Id)
+		return s.Ids
+	}
+	return s.Id
+}
+
+type ObjectGetReq struct {
+	Id int `uri:"id"`
+}
+
+func (s *ObjectGetReq) Bind(ctx *gin.Context) error {
+	var err error
+	log := api.GetRequestLogger(ctx)
+	err = ctx.ShouldBindUri(s)
+	if err != nil {
+		log.Warnf("ShouldBindUri error: %s", err.Error())
+		return err
+	}
+	if err = vd.Validate(s); err != nil {
+		log.Errorf("Validate error: %s", err.Error())
+		return err
+	}
+	return err
+}
+
+func (s *ObjectGetReq) GetId() interface{} {
+	return s.Id
+}
+
+type ObjectDeleteReq struct {
+	Ids []int `json:"ids"`
+}
+
+func (s *ObjectDeleteReq) Bind(ctx *gin.Context) error {
+	var err error
+	log := api.GetRequestLogger(ctx)
+	err = ctx.ShouldBind(&s)
+	if err != nil {
+		log.Warnf("ShouldBind error: %s", err.Error())
+		return err
+	}
+	if len(s.Ids) > 0 {
+		return nil
+	}
+	if s.Ids == nil {
+		s.Ids = make([]int, 0)
+	}
+
+	if err = vd.Validate(s); err != nil {
+		log.Errorf("Validate error: %s", err.Error())
+		return err
+	}
+	return err
+}
+
+func (s *ObjectDeleteReq) GetId() interface{} {
+	return s.Ids
+}

+ 12 - 0
common/dto/order.go

@@ -0,0 +1,12 @@
+package dto
+
+import (
+	"gorm.io/gorm"
+	"gorm.io/gorm/clause"
+)
+
+func OrderDest(sort string, bl bool) func(db *gorm.DB) *gorm.DB {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Order(clause.OrderByColumn{Column: clause.Column{Name: sort}, Desc: bl})
+	}
+}

+ 20 - 0
common/dto/pagination.go

@@ -0,0 +1,20 @@
+package dto
+
+type Pagination struct {
+	Page     int `json:"page" example:"1"`      // 页数
+	PageSize int `json:"pageSize" example:"10"` // 每页条数
+}
+
+func (m *Pagination) GetPageIndex() int {
+	if m.Page <= 0 {
+		m.Page = 1
+	}
+	return m.Page
+}
+
+func (m *Pagination) GetPageSize() int {
+	if m.PageSize <= 0 {
+		m.PageSize = 10
+	}
+	return m.PageSize
+}

+ 94 - 0
common/dto/search.go

@@ -0,0 +1,94 @@
+package dto
+
+import (
+	"Medical_ERP/common/global"
+	"fmt"
+	"gogs.baozhida.cn/zoie/OAuth-core/tools/search"
+	"gorm.io/gorm"
+	"strings"
+)
+
+type GeneralDelDto struct {
+	Id  int   `uri:"id" json:"id" validate:"required"`
+	Ids []int `json:"ids"`
+}
+
+func (g GeneralDelDto) GetIds() []int {
+	ids := make([]int, 0)
+	if g.Id != 0 {
+		ids = append(ids, g.Id)
+	}
+	if len(g.Ids) > 0 {
+		for _, id := range g.Ids {
+			if id > 0 {
+				ids = append(ids, id)
+			}
+		}
+	} else {
+		if g.Id > 0 {
+			ids = append(ids, g.Id)
+		}
+	}
+	if len(ids) <= 0 {
+		//方式全部删除
+		ids = append(ids, 0)
+	}
+	return ids
+}
+
+type GeneralGetDto struct {
+	Id int `uri:"id" json:"id" validate:"required"`
+}
+
+func MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB {
+	return func(db *gorm.DB) *gorm.DB {
+		condition := &search.GormCondition{
+			GormPublic: search.GormPublic{},
+			Join:       make([]*search.GormJoin, 0),
+		}
+		search.ResolveSearchQuery(global.Driver, q, condition)
+		for _, join := range condition.Join {
+			if join == nil {
+				continue
+			}
+			db = db.Joins(join.JoinOn)
+			for k, v := range join.Where {
+				db = db.Where(k, v...)
+			}
+			for k, v := range join.Or {
+				db = db.Or(k, v...)
+			}
+			for _, o := range join.Order {
+				db = db.Order(o)
+			}
+		}
+		for k, v := range condition.Where {
+			db = db.Where(k, v...)
+		}
+
+		for k, v := range condition.Or {
+			db = db.Or(k, v...)
+		}
+		var orContains string
+		for k, v := range condition.OrContains {
+			orContains += fmt.Sprintf(" OR %v '%v'", k, v[0])
+		}
+		if len(orContains) > 0 {
+			db = db.Where(strings.TrimLeft(orContains, " OR"))
+		}
+		for _, o := range condition.Order {
+			db = db.Order(o)
+		}
+		return db
+	}
+}
+
+func Paginate(pageSize, pageIndex int) func(db *gorm.DB) *gorm.DB {
+	return func(db *gorm.DB) *gorm.DB {
+		offset := (pageIndex - 1) * pageSize
+		if offset < 0 {
+			offset = 0
+		}
+		return db.Offset(offset).Limit(pageSize)
+	}
+}

+ 21 - 0
common/dto/type.go

@@ -0,0 +1,21 @@
+package dto
+
+import (
+	"Medical_ERP/common/model"
+	"github.com/gin-gonic/gin"
+)
+
+type Index interface {
+	Generate() Index
+	Bind(ctx *gin.Context) error
+	GetPageIndex() int
+	GetPageSize() int
+	GetNeedSearch() interface{}
+}
+
+type Control interface {
+	Generate() Control
+	Bind(ctx *gin.Context) error
+	GenerateM() (model.ActiveRecord, error)
+	GetId() interface{}
+}

+ 11 - 0
common/global/adm.go

@@ -0,0 +1,11 @@
+package global
+
+const (
+	Version = "0.0.1"
+)
+
+var (
+	Source string
+	Driver string
+	DBName string
+)

+ 43 - 0
common/global/constant.go

@@ -0,0 +1,43 @@
+package global
+
+const (
+	// ContextKeyUserObj 上下文用户对象
+	ContextKeyUserObj = "authedUserObj"
+	// ContextKeyServiceId 上下文服务对象
+	ContextKeyServiceId = "serviceId"
+	// RedisPrefixAuth redis 权限验证前缀
+	RedisPrefixAuth = "auth:"
+	// RedisPrefixRoleApi redis 角色api
+	RedisPrefixRoleApi = "role_api:"
+)
+
+const (
+	// MsgOk 成功
+	MsgOk = 200
+	// Found 资源发生改变
+	Found = 302
+	// BadRequest 请求错误
+	BadRequest = 400
+	// Unauthorized 未认证
+	Unauthorized = 401
+	// PageNotFoundErr 	页面未找到
+	PageNotFoundErr = 404
+
+	// NotAcceptable 不被允许的操作
+	NotAcceptable = 406
+	// MsgErr 异常
+	MsgErr = 500
+	// ConvertErr 转换异常
+	ConvertErr = 501
+	// ArgsValidErr 参数验证错误
+	ArgsValidErr = 503
+	// DatabaseOperationErr 数据库操作出错
+	DatabaseOperationErr = 504
+	UnmarshalErr         = 505
+	// ParseFormErr 解析表单数据异常
+	ParseFormErr = 506
+)
+
+var (
+	ServiceId int
+)

+ 16 - 0
common/global/error.go

@@ -0,0 +1,16 @@
+package global
+
+import (
+	"errors"
+)
+
+var (
+	GetFailedErr                    = errors.New("查询失败")
+	CreateFailedErr                 = errors.New("添加失败")
+	UpdateFailedErr                 = errors.New("更新失败")
+	DeleteFailedErr                 = errors.New("删除失败")
+	GetNotFoundErr                  = errors.New("数据不存在")
+	GetNotFoundOrNoPermissionErr    = errors.New("数据不存在或无权查看该数据")
+	UpdateNotFoundOrNoPermissionErr = errors.New("数据不存在或无权修改该数据")
+	DeleteNotFoundOrNoPermissionErr = errors.New("数据不存在或无权删除该数据")
+)

+ 112 - 0
common/initialize/db.go

@@ -0,0 +1,112 @@
+package initialize
+
+import (
+	_ "github.com/go-sql-driver/mysql"
+)
+
+import (
+	"fmt"
+	"log"
+	"time"
+
+	"gorm.io/gorm/logger"
+
+	"github.com/beego/beego/v2/core/logs"
+	beego "github.com/beego/beego/v2/server/web"
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+)
+
+var DB *gorm.DB
+
+var Err error
+
+// 重写gorm日志的Writer
+type Writer struct {
+}
+
+func (w Writer) Printf(format string, args ...interface{}) {
+	// log.Infof(format, args...)
+	logs.Notice(format, args...)
+}
+
+// 设置psql
+func init() {
+	log.Println("连接数据库...")
+
+	mysqlUrlPort, err := beego.AppConfig.String("mysqlUrlPort")
+	if err != nil {
+		log.Fatalf("无法获取mysqlUrlPort: %v", err)
+	}
+	mysqlUser, err := beego.AppConfig.String("mysqlUser")
+	if err != nil {
+		log.Fatalf("无法获取mysqlUser: %v", err)
+	}
+
+	mysqlPass, err := beego.AppConfig.String("mysqlPass")
+	if err != nil {
+		log.Fatalf("无法获取mysqlPass: %v", err)
+	}
+
+	mysqlDB, err := beego.AppConfig.String("mysqlDB")
+	if err != nil {
+		log.Fatalf("无法获取mysqlDB: %v", err)
+	}
+
+	mysqlMaxConns, err := beego.AppConfig.Int("mysqlMaxConns")
+	if err != nil {
+		log.Fatalf("无法获取mysqlMaxConns: %v", err)
+	}
+
+	mysqlMaxOpen, err := beego.AppConfig.Int("mysqlMaxOpen")
+	if err != nil {
+		log.Fatalf("无法获取mysqlMaxOpen: %v", err)
+	}
+
+	sqlloglevel, err := beego.AppConfig.Int("sqlloglevel")
+	if err != nil {
+		log.Fatalf("无法获取sqlloglevel: %v", err)
+	}
+
+	dataSource := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
+		mysqlUser,
+		mysqlPass,
+		mysqlUrlPort,
+		mysqlDB,
+	)
+
+	slow_threshold, err := beego.AppConfig.Int("slow_threshold")
+	if err != nil {
+		log.Fatalf("无法获取slow_threshold: %v", err)
+	}
+	//设置gorm日志规则
+	newLogger := logger.New(
+		// log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer 单独设置grom日志输出
+		Writer{}, // beego日志info输出
+		logger.Config{
+			SlowThreshold:             time.Duration(slow_threshold) * time.Millisecond, // Slow SQL threshold
+			LogLevel:                  logger.LogLevel(sqlloglevel),                     // Log level
+			IgnoreRecordNotFoundError: true,                                             // Ignore ErrRecordNotFound error for logger
+			Colorful:                  true,                                             // Disable color
+		},
+	)
+
+	DB, Err = gorm.Open(mysql.Open(dataSource), &gorm.Config{
+		Logger: newLogger,
+	})
+
+	if Err != nil {
+		log.Fatalf("连接数据库失败: %v", Err)
+	}
+
+	SqlDB, err2 := DB.DB()
+	if err2 != nil {
+		log.Fatalf("连接数据库失败: %v", err2)
+	}
+
+	SqlDB.SetMaxIdleConns(mysqlMaxConns)
+	SqlDB.SetMaxOpenConns(mysqlMaxOpen)
+	SqlDB.SetConnMaxLifetime(time.Hour)
+
+	log.Println("连接数据库完成...")
+}

+ 75 - 0
common/initialize/log.go

@@ -0,0 +1,75 @@
+package initialize
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/beego/beego/v2/core/logs"
+	beego "github.com/beego/beego/v2/server/web"
+	"log"
+	"time"
+)
+
+func init() {
+	log.SetFlags(log.Lshortfile | log.Ltime | log.Ldate)
+	log.Println("系统日志初始化...")
+
+	dateStr := time.Now().Format("2006-01-02")
+
+	maxdays, err := beego.AppConfig.Int("maxdays")
+	if err != nil {
+		log.Println("无法获取maxdays:", err)
+	}
+
+	level, err := beego.AppConfig.Int("level")
+	if err != nil {
+		log.Println("无法获取level:", err)
+	}
+
+	maxlines, err := beego.AppConfig.Int("maxlines")
+	if err != nil {
+		log.Println("无法获取maxlines:", err)
+	}
+
+	dataSource := &struct {
+		Filename string `json:"filename"`
+		Level    int    `json:"level"`
+		Maxlines int    `json:"maxlines"`
+		Maxsize  int    `json:"maxsize"`
+		Daily    bool   `json:"daily"`
+		Maxdays  int    `json:"maxdays"`
+		Color    bool   `json:"color"`
+	}{
+		Filename: fmt.Sprintf("files/logs/%s/log.log", dateStr),
+		Level:    level,
+		Maxlines: maxlines,
+		Maxsize:  0,
+		Daily:    true,
+		Maxdays:  maxdays,
+		Color:    true,
+	}
+	dataSourceBytes, err := json.Marshal(dataSource)
+	if err != nil {
+		log.Println("无法创建dataSource:", err)
+	}
+	logs.SetLevel(level)
+	adapter_type, err := beego.AppConfig.Int("adapter_type")
+	if err != nil {
+		log.Println("无法获取adapter_type:", err)
+	}
+	// 日志输出选择
+	switch adapter_type {
+	case 0:
+		logs.SetLogger(logs.AdapterConsole)
+	case 1:
+		logs.Reset()
+		logs.SetLogger(logs.AdapterFile, string(dataSourceBytes))
+	case 2:
+		logs.SetLogger(logs.AdapterFile, string(dataSourceBytes))
+	default:
+		logs.SetLogger(logs.AdapterConsole)
+	}
+	// 是否记录日志的调用层级 默认是logs.SetLogFuncCallDepth(2)
+	logs.EnableFuncCallDepth(true)
+	logs.Async()
+	log.Println("系统日志初始化完成")
+}

+ 2 - 0
common/initialize/service_discovery.go

@@ -0,0 +1,2 @@
+package initialize
+

+ 37 - 0
common/model/model.go

@@ -0,0 +1,37 @@
+package model
+
+import (
+	"gorm.io/gorm"
+	"time"
+)
+
+type ControlBy struct {
+	CreateBy int `json:"createBy" gorm:"index;comment:创建者"` // 创建者
+	UpdateBy int `json:"updateBy" gorm:"index;comment:更新者"` // 更新者
+	DeptId   int `json:"deptId" gorm:"index;comment:更新者"`   // 更新者
+}
+
+// SetCreateBy 设置创建人id
+func (e *ControlBy) SetCreateBy(createBy int) {
+	e.CreateBy = createBy
+}
+
+// SetUpdateBy 设置修改人id
+func (e *ControlBy) SetUpdateBy(updateBy int) {
+	e.UpdateBy = updateBy
+}
+
+// SetUpdateBy 设置公司id
+func (e *ControlBy) SetDeptId(deptId int) {
+	e.DeptId = deptId
+}
+
+type Model struct {
+	Id int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"` // 主键编码
+}
+
+type ModelTime struct {
+	CreatedAt time.Time      `json:"createdAt" gorm:"comment:创建时间"`   // 创建时间
+	UpdatedAt time.Time      `json:"updatedAt" gorm:"comment:最后更新时间"` // 最后更新时间
+	DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
+}

+ 11 - 0
common/model/type.go

@@ -0,0 +1,11 @@
+package model
+
+import "gorm.io/gorm/schema"
+
+type ActiveRecord interface {
+	schema.Tabler
+	SetCreateBy(createBy int)
+	SetUpdateBy(updateBy int)
+	Generate() ActiveRecord
+	GetId() interface{}
+}

+ 116 - 0
common/redis/redis.go

@@ -0,0 +1,116 @@
+package redis
+
+import (
+	"Medical_ERP/utils"
+	"encoding/json"
+	"errors"
+	"github.com/beego/beego/v2/server/web"
+	"github.com/go-redis/redis/v7"
+	"log"
+	"time"
+
+	"github.com/beego/beego/v2/core/logs"
+)
+
+var redisCache *redis.Client
+
+// 创建 redis 客户端
+func createClient(redisHost string, password string, dataBase int) *redis.Client {
+	log.Println("连接redis...")
+	client := redis.NewClient(&redis.Options{
+		Addr:         redisHost,
+		Password:     password,
+		DB:           dataBase,
+		ReadTimeout:  2 * time.Minute,
+		WriteTimeout: 1 * time.Minute,
+		PoolTimeout:  2 * time.Minute,
+		IdleTimeout:  10 * time.Minute,
+		PoolSize:     1000,
+	})
+
+	// 通过 cient.Ping() 来检查是否成功连接到了 redis 服务器
+	_, err := client.Ping().Result()
+	if err != nil {
+		logs.Error("连接redis连接失败,", err)
+	} else {
+		log.Println("连接redis成完成...")
+	}
+
+	return client
+}
+
+func init() {
+
+	Redis_address, _ := web.AppConfig.String("Redis_address")
+	Redis_password, _ := web.AppConfig.String("Redis_password")
+	Redis_dbNum, _ := web.AppConfig.Int("Redis_dbNum")
+	redisCache = createClient(Redis_address, Redis_password, Redis_dbNum)
+}
+
+func SetJson(key string, data interface{}, timeout time.Duration) error {
+
+	//json序列化
+	str, err := json.Marshal(data)
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+	err = redisCache.Set(key, str, timeout).Err()
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+	return nil
+
+}
+
+func GetJson(key string, data interface{}) error {
+	if existed, err := redisCache.Exists(key).Result(); err != nil || existed == 0 {
+		return errors.New("redis nil")
+	}
+
+	v, err := redisCache.Get(key).Result()
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+
+	err = json.Unmarshal([]byte(v), &data)
+	if err != nil {
+		logs.Error(err)
+		return err
+	}
+
+	return nil
+
+}
+
+func SetStr(key, value string, time time.Duration) (err error) {
+	err = redisCache.Set(key, value, time).Err()
+	if err != nil {
+		logs.Error("set key:", utils.ReplaceUserInput(key), ",value:", utils.ReplaceUserInput(value), err)
+	}
+	return
+}
+
+func GetStr(key string) (value string) {
+	v, _ := redisCache.Get(key).Result()
+	return v
+}
+
+func DelKey(key string) (err error) {
+	err = redisCache.Del(key).Err()
+	return
+}
+
+// SetNX 尝试获取锁
+func SetNX(key, value string, expiration time.Duration) (ok bool, err error) {
+	ok, err = redisCache.SetNX(key, value, expiration).Result()
+	return
+}
+
+// SetNX 释放锁
+func DelNX(key string) (err error) {
+	err = redisCache.Del(key).Err()
+	return
+}

+ 44 - 0
common/response/model.go

@@ -0,0 +1,44 @@
+package response
+
+// 数据集
+type Msg struct {
+	RequestId string `json:"requestId,omitempty"`
+	Code      int32  `json:"code,omitempty"`
+	Msg       string `json:"msg,omitempty"`
+	Status    string `json:"status,omitempty"`
+}
+
+type Response struct {
+	Msg
+	Data interface{} `json:"data"`
+}
+
+type page struct {
+	Count    int `json:"count"`    //总数
+	Page     int `json:"page"`     //页码
+	PageSize int `json:"pageSize"` //页条数
+}
+
+type Page struct {
+	Msg
+	page
+	List interface{} `json:"list"`
+}
+
+func (e *Msg) SetTraceID(id string) {
+	e.RequestId = id
+}
+
+func (e *Msg) SetMsg(s string) {
+	e.Msg = s
+}
+
+func (e *Msg) SetCode(code int32) {
+	e.Code = code
+}
+
+func (e *Msg) SetSuccess(success bool) {
+	if !success {
+		e.Status = "error"
+	}
+}

+ 50 - 0
common/response/return.go

@@ -0,0 +1,50 @@
+package response
+
+import (
+	"github.com/google/uuid"
+	"net/http"
+)
+
+// Error 失败数据处理
+func Error(code int, err error, msg string) Response {
+	var res Response
+	if err != nil {
+		res.SetMsg(err.Error())
+	}
+	if msg != "" {
+		res.SetMsg(msg)
+	}
+	res.SetTraceID(uuid.New().String())
+	res.SetCode(int32(code))
+	res.SetSuccess(false)
+	return res
+}
+
+// OK 通常成功数据处理
+func OK(data interface{}, msg string) Response {
+	var res Response
+	res.SetSuccess(true)
+	if msg != "" {
+		res.SetMsg(msg)
+	}
+	res.SetTraceID(uuid.New().String())
+	res.SetCode(http.StatusOK)
+	res.Data = data
+	return res
+}
+
+// PageOK 分页数据处理
+func PageOK(result interface{}, count int, pageIndex int, pageSize int, msg string) Page {
+	var res Page
+	res.SetSuccess(true)
+	if msg != "" {
+		res.SetMsg(msg)
+	}
+	res.SetTraceID(uuid.New().String())
+	res.SetCode(http.StatusOK)
+	res.List = result
+	res.Count = count
+	res.Page = pageIndex
+	res.PageSize = pageSize
+	return res
+}

+ 10 - 0
common/response/type.go

@@ -0,0 +1,10 @@
+package response
+
+type Responses interface {
+	SetCode(int32)
+	SetTraceID(string)
+	SetMsg(string)
+	SetData(interface{})
+	SetSuccess(bool)
+	Clone() Responses
+}

+ 48 - 0
conf/app.conf

@@ -0,0 +1,48 @@
+appname = Medical_ERP
+httpport = 8083
+runmode = dev
+autorender = false
+copyrequestbody = true
+EnableDocs = true
+
+# 数据库配置(Mysql)
+mysqlUrlPort = "192.168.11.77:3306"
+mysqlDB = "medical_erp"
+mysqlUser = "medical_erp"
+mysqlPass= "XMzTDthD4By3ArjG"
+mysqlMaxConns = 100
+MysqlMaxOpen = 200
+
+# 日志配置
+# 0-控制台输出 1-文件输出 2-文件和控制台输出
+adapter_type = 0
+# 文件最多保存多少天
+maxdays = 7
+# 日志级别 (0-紧急 1-报警 2-严重错误 3-错误 4-警告 5-注意 6-信息 7-调试)
+level = 7
+# SQL日志级别 (1-静音 2-错误 3-警告 4-信息). 注意: sql日志只在level大于等于5级别才会输出。
+sqlloglevel = 4
+# 慢SQL阈值(毫秒)。慢SQL会在sqlloglevel大于等于3时输出。
+slow_threshold = 200
+# 每个文件保存的最大行数
+maxlines = 10000
+
+#redis
+Redis_address = "192.168.11.77:6379"
+Redis_password = ""
+Redis_dbNum = "4"
+
+#不验证登录URL
+FilterExcludeURL =
+#只验证登录URL
+FilterOnlyLoginCheckURL = "/api/role-api"
+
+# 统一身份认证
+# OAuth_baseUrl = "http://192.168.11.77:8100"
+OAuth_baseUrl = "http://127.0.0.1:8000"
+# 服务发现服务信息
+Service_number = "q9YeglML"
+Service_authCode = "3EDJRaagFTVVo2Ilo80nHJfLVN1O1234"
+Service_name = "医药进销存综合管理系统"
+Service_Host = "http://127.0.0.1:8110"
+Service_RoleApiUrl = "/api/role-api"

+ 12 - 0
conf/conf.go

@@ -0,0 +1,12 @@
+package conf
+
+import (
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+var Httpport, _ = beego.AppConfig.Int("httpport")
+var Redis_address, _ = beego.AppConfig.String("Redis_address")
+var Redis_password, _ = beego.AppConfig.String("Redis_password")
+var Redis_dbNum, _ = beego.AppConfig.String("Redis_dbNum")
+
+var OAuthBaseUrl, _ = beego.AppConfig.String("OAuth_baseUrl")

+ 63 - 0
controllers/base_controller.go

@@ -0,0 +1,63 @@
+package controllers
+
+import (
+	"Medical_ERP/common/response"
+	"encoding/json"
+	"errors"
+	"github.com/beego/beego/v2/core/validation"
+	"github.com/beego/beego/v2/server/web"
+	"reflect"
+	"strings"
+)
+
+type BaseController struct {
+	web.Controller
+}
+
+func (c *BaseController) OK(data any, msg string) {
+	c.Data["json"] = response.OK(data, msg)
+	c.ServeJSON()
+	return
+}
+
+// Error 通常错误数据处理
+func (c *BaseController) Error(code int, err error, msg string) {
+
+	c.Data["json"] = response.Error(code, err, msg)
+	c.ServeJSON()
+	return
+}
+
+// PageOK 分页数据处理
+func (c *BaseController) PageOK(result interface{}, count int, pageIndex int, pageSize int, msg string) {
+	c.Data["json"] = response.PageOK(result, count, pageIndex, pageSize, msg)
+	c.ServeJSON()
+	return
+}
+
+func (c *BaseController) ParseAndValidate(requestBody *[]byte, reqData interface{}) error {
+	valueType := reflect.ValueOf(reqData).Elem().Type() // 获取结构体类型
+	newStruct := reflect.New(valueType).Interface()     // 创建新的结构体
+	if err := json.Unmarshal(*requestBody, newStruct); err != nil {
+		return err
+	}
+
+	v := validation.Validation{}
+	status, err := v.Valid(newStruct)
+	if err != nil {
+		return err
+	}
+	if !status {
+		for _, err := range v.Errors {
+			// 获取 newStruct 指向的真实结构体的类型
+			structType := reflect.Indirect(reflect.ValueOf(newStruct)).Type()
+			field, _ := structType.FieldByName(err.Field)
+			alias := field.Tag.Get("alias")
+			message := strings.Replace(err.Message, err.Field, alias, 1)
+			return errors.New(message)
+		}
+	}
+
+	reflect.ValueOf(reqData).Elem().Set(reflect.ValueOf(newStruct).Elem())
+	return nil
+}

+ 153 - 0
controllers/dosage_form.go

@@ -0,0 +1,153 @@
+package controllers
+
+import (
+	"Medical_ERP/common/actions"
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+type DosageFormController struct {
+	BaseController
+}
+
+// List 获取剂型列表
+// @Summary 获取剂型列表
+// @Description 获取剂型列表
+// @Tags 剂型
+// @Param body body dto.DosageFormPageReq true "body"
+// @Success 200 {object} response.Page{list=[]models.DosageForm} "{"code": 200, "data": [...]}"
+// @Router /dosage-form/list [post]
+// @Security Bearer
+func (c DosageFormController) List() {
+	s := services.DosageForm{}
+	reqData := dto.DosageFormPageReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	list := make([]models.DosageForm, 0)
+	var count int64
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.GetPage(&reqData, &list, &count, p)
+	if err != nil {
+		c.Error(global.BadRequest, err, err.Error())
+		return
+	}
+
+	c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+}
+
+// Detail 通过id获取剂型
+// @Summary 通过id获取剂型
+// @Description 通过id获取剂型
+// @Tags 剂型
+// @Param body body dto.DosageFormGetReq true "body"
+// @Success 200 {object} response.Response{data=models.DosageForm} "{"code": 200, "data": [...]}"
+// @Router /dosage-form/detail [post]
+// @Security Bearer
+func (c DosageFormController) Detail() {
+	s := services.DosageForm{}
+	reqData := dto.DosageFormGetReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var object models.DosageForm
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.Get(&reqData, &object, p)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+
+	c.OK(object, "查询成功")
+}
+
+// Add 添加剂型
+// @Summary 添加剂型
+// @Description 添加剂型
+// @Tags 剂型
+// @Accept  application/json
+// @DosageForm application/json
+// @Param data body dto.DosageFormInsertReq true "data"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /dosage-form/add [post]
+// @Security Bearer
+func (c DosageFormController) Add() {
+	s := services.DosageForm{}
+	reqData := dto.DosageFormInsertReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
+	reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
+	err := s.Insert(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "创建成功")
+}
+
+// Edit 修改剂型
+// @Summary 修改剂型
+// @Description 修改剂型
+// @Tags 剂型
+// @Accept  application/json
+// @DosageForm application/json
+// @Param data body dto.DosageFormUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /dosage-form/edit [post]
+// @Security Bearer
+func (c DosageFormController) Edit() {
+	s := services.DosageForm{}
+	reqData := dto.DosageFormUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+
+	err := s.Update(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "更新成功")
+}
+
+// Delete 删除剂型
+// @Summary 删除剂型
+// @Description 删除剂型
+// @Tags 剂型
+// @Accept  application/json
+// @DosageForm application/json
+// @Param id body dto.DosageFormDeleteReq true "请求参数"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /dosage-form/delete [post]
+// @Security Bearer
+func (c DosageFormController) Delete() {
+	s := services.DosageForm{}
+	reqData := dto.DosageFormDeleteReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	// TODO 判断出入库数据
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Remove(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "删除成功")
+}

+ 153 - 0
controllers/enterprise.go

@@ -0,0 +1,153 @@
+package controllers
+
+import (
+	"Medical_ERP/common/actions"
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+type EnterpriseController struct {
+	BaseController
+}
+
+// List 获取生产企业列表
+// @Summary 获取生产企业列表
+// @Description 获取生产企业列表
+// @Tags 生产企业
+// @Param body body dto.EnterprisePageReq true "body"
+// @Success 200 {object} response.Page{list=[]models.Enterprise} "{"code": 200, "data": [...]}"
+// @Router /enterprise/list [post]
+// @Security Bearer
+func (c EnterpriseController) List() {
+	s := services.Enterprise{}
+	reqData := dto.EnterprisePageReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	list := make([]models.Enterprise, 0)
+	var count int64
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.GetPage(&reqData, &list, &count, p)
+	if err != nil {
+		c.Error(global.BadRequest, err, err.Error())
+		return
+	}
+
+	//c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+	c.PageOK(list, beegouser.GetDeptId(c.Ctx), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+}
+
+// Detail 通过id获取生产企业
+// @Summary 通过id获取生产企业
+// @Description 通过id获取生产企业
+// @Tags 生产企业
+// @Param body body dto.EnterpriseGetReq true "body"
+// @Success 200 {object} response.Response{data=models.Enterprise} "{"code": 200, "data": [...]}"
+// @Router /enterprise/detail [post]
+// @Security Bearer
+func (c EnterpriseController) Detail() {
+	s := services.Enterprise{}
+	reqData := dto.EnterpriseGetReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var object models.Enterprise
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.Get(&reqData, &object, p)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+
+	c.OK(object, "查询成功")
+}
+
+// Add 添加生产企业
+// @Summary 添加生产企业
+// @Description 添加生产企业
+// @Tags 生产企业
+// @Accept  application/json
+// @Enterprise application/json
+// @Param data body dto.EnterpriseInsertReq true "data"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /enterprise/add [post]
+// @Security Bearer
+func (c EnterpriseController) Add() {
+	s := services.Enterprise{}
+	reqData := dto.EnterpriseInsertReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Insert(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "创建成功")
+}
+
+// Edit 修改生产企业
+// @Summary 修改生产企业
+// @Description 修改生产企业
+// @Tags 生产企业
+// @Accept  application/json
+// @Enterprise application/json
+// @Param data body dto.EnterpriseUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /enterprise/edit [post]
+// @Security Bearer
+func (c EnterpriseController) Edit() {
+	s := services.Enterprise{}
+	reqData := dto.EnterpriseUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+
+	err := s.Update(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "更新成功")
+}
+
+// Delete 删除生产企业
+// @Summary 删除生产企业
+// @Description 删除生产企业
+// @Tags 生产企业
+// @Accept  application/json
+// @Enterprise application/json
+// @Param id body dto.EnterpriseDeleteReq true "请求参数"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /enterprise/delete [post]
+// @Security Bearer
+func (c EnterpriseController) Delete() {
+	s := services.Enterprise{}
+	reqData := dto.EnterpriseDeleteReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	// TODO 判断出入库数据
+
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Remove(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "删除成功")
+}

+ 24 - 0
controllers/error.go

@@ -0,0 +1,24 @@
+package controllers
+
+import (
+	"Medical_ERP/common/global"
+)
+
+type ErrorController struct {
+	BaseController
+}
+
+func (c *ErrorController) Error404() {
+	//c.Data["content"] = "page not found"
+	c.Error(global.PageNotFoundErr, nil, "page not found")
+}
+
+func (c *ErrorController) Error500() {
+	//c.Data["content"] = "server error"
+	c.Error(global.MsgErr, nil, "server error")
+
+}
+
+func (c *ErrorController) ErrorDb() {
+	c.Error(global.MsgErr, nil, "database is now down")
+}

+ 153 - 0
controllers/product.go

@@ -0,0 +1,153 @@
+package controllers
+
+import (
+	"Medical_ERP/common/actions"
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+type ProductController struct {
+	BaseController
+}
+
+// List 获取品名列表
+// @Summary 获取品名列表
+// @Description 获取品名列表
+// @Tags 品名
+// @Param body body dto.ProductPageReq true "body"
+// @Success 200 {object} response.Page{list=[]models.Product} "{"code": 200, "data": [...]}"
+// @Router /product/list [post]
+// @Security Bearer
+func (c ProductController) List() {
+	s := services.Product{}
+	reqData := dto.ProductPageReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	list := make([]models.Product, 0)
+	var count int64
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.GetPage(&reqData, &list, &count, p)
+	if err != nil {
+		c.Error(global.BadRequest, err, err.Error())
+		return
+	}
+
+	c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+}
+
+// Detail 通过id获取品名
+// @Summary 通过id获取品名
+// @Description 通过id获取品名
+// @Tags 品名
+// @Param body body dto.ProductGetReq true "body"
+// @Success 200 {object} response.Response{data=models.Product} "{"code": 200, "data": [...]}"
+// @Router /product/detail [post]
+// @Security Bearer
+func (c ProductController) Detail() {
+	s := services.Product{}
+	reqData := dto.ProductGetReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var object models.Product
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.Get(&reqData, &object, p)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+
+	c.OK(object, "查询成功")
+}
+
+// Add 添加品名
+// @Summary 添加品名
+// @Description 添加品名
+// @Tags 品名
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.ProductInsertReq true "data"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /product/add [post]
+// @Security Bearer
+func (c ProductController) Add() {
+	s := services.Product{}
+	reqData := dto.ProductInsertReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
+	reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
+	err := s.Insert(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "创建成功")
+}
+
+// Edit 修改品名
+// @Summary 修改品名
+// @Description 修改品名
+// @Tags 品名
+// @Accept  application/json
+// @Product application/json
+// @Param data body dto.ProductUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /product/edit [post]
+// @Security Bearer
+func (c ProductController) Edit() {
+	s := services.Product{}
+	reqData := dto.ProductUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+
+	err := s.Update(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "更新成功")
+}
+
+// Delete 删除品名
+// @Summary 删除品名
+// @Description 删除品名
+// @Tags 品名
+// @Accept  application/json
+// @Product application/json
+// @Param id body dto.ProductDeleteReq true "请求参数"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /product/delete [post]
+// @Security Bearer
+func (c ProductController) Delete() {
+	s := services.Product{}
+	reqData := dto.ProductDeleteReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	// TODO 判断出入库数据
+
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Remove(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "删除成功")
+}

+ 41 - 0
controllers/role_api.go

@@ -0,0 +1,41 @@
+package controllers
+
+import (
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+// 角色权限
+type RoleApi struct {
+	BaseController
+}
+
+// UpdateRoleApi 修改角色路由权限
+// @Title 修改角色路由权限
+// @Summary 对接统一身份认证(前端暂时忽略)
+// @Description 修改角色路由权限
+// @Tags 角色
+// @Accept  application/json
+// @Product application/json
+// @Param body body dto.RoleApiUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @router /api/role-api [post]
+// @Security Bearer
+func (c *RoleApi) UpdateRoleApi() {
+	reqData := dto.RoleApiUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var RoleApService services.RoleApi
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := RoleApService.UpdateRoleApi(&reqData)
+	if err != nil {
+		c.Error(global.DatabaseOperationErr, err, err.Error())
+
+	}
+	c.OK(reqData.RoleKey, "操作成功")
+}

+ 154 - 0
controllers/spec.go

@@ -0,0 +1,154 @@
+package controllers
+
+import (
+	"Medical_ERP/common/actions"
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+type SpecController struct {
+	BaseController
+}
+
+// List 获取规格列表
+// @Summary 获取规格列表
+// @Description 获取规格列表
+// @Tags 规格
+// @Param body body dto.SpecPageReq true "body"
+// @Success 200 {object} response.Page{list=[]models.Spec} "{"code": 200, "data": [...]}"
+// @Router /spec/list [post]
+// @Security Bearer
+func (c SpecController) List() {
+	s := services.Spec{}
+	reqData := dto.SpecPageReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	list := make([]models.Spec, 0)
+	var count int64
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.GetPage(&reqData, &list, &count, p)
+	if err != nil {
+		c.Error(global.BadRequest, err, err.Error())
+		return
+	}
+
+	c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+}
+
+// Detail 通过id获取规格
+// @Summary 通过id获取规格
+// @Description 通过id获取规格
+// @Tags 规格
+// @Param body body dto.SpecGetReq true "body"
+// @Success 200 {object} response.Response{data=models.Spec} "{"code": 200, "data": [...]}"
+// @Router /spec/detail [post]
+// @Security Bearer
+func (c SpecController) Detail() {
+	s := services.Spec{}
+	reqData := dto.SpecGetReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var object models.Spec
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.Get(&reqData, &object, p)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+
+	c.OK(object, "查询成功")
+}
+
+// Add 添加规格
+// @Summary 添加规格
+// @Description 添加规格
+// @Tags 规格
+// @Accept  application/json
+// @Spec application/json
+// @Param data body dto.SpecInsertReq true "data"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /spec/add [post]
+// @Security Bearer
+func (c SpecController) Add() {
+	s := services.Spec{}
+	reqData := dto.SpecInsertReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
+	reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
+	err := s.Insert(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "创建成功")
+}
+
+// Edit 修改规格
+// @Summary 修改规格
+// @Description 修改规格
+// @Tags 规格
+// @Accept  application/json
+// @Spec application/json
+// @Param data body dto.SpecUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /spec/edit [post]
+// @Security Bearer
+func (c SpecController) Edit() {
+	s := services.Spec{}
+	reqData := dto.SpecUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
+
+	err := s.Update(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "更新成功")
+}
+
+// Delete 删除规格
+// @Summary 删除规格
+// @Description 删除规格
+// @Tags 规格
+// @Accept  application/json
+// @Spec application/json
+// @Param id body dto.SpecDeleteReq true "请求参数"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /spec/delete [post]
+// @Security Bearer
+func (c SpecController) Delete() {
+	s := services.Spec{}
+	reqData := dto.SpecDeleteReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	// TODO 判断出入库数据
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Remove(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "删除成功")
+}

+ 153 - 0
controllers/unit.go

@@ -0,0 +1,153 @@
+package controllers
+
+import (
+	"Medical_ERP/common/actions"
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/response"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"Medical_ERP/services"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
+)
+
+type UnitController struct {
+	BaseController
+}
+
+// List 获取单位列表
+// @Summary 获取单位列表
+// @Description 获取单位列表
+// @Tags 单位
+// @Param body body dto.UnitPageReq true "body"
+// @Success 200 {object} response.Page{list=[]models.Unit} "{"code": 200, "data": [...]}"
+// @Router /unit/list [post]
+// @Security Bearer
+func (c UnitController) List() {
+	s := services.Unit{}
+	reqData := dto.UnitPageReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	list := make([]models.Unit, 0)
+	var count int64
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.GetPage(&reqData, &list, &count, p)
+	if err != nil {
+		c.Error(global.BadRequest, err, err.Error())
+		return
+	}
+
+	c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
+}
+
+// Detail 通过id获取单位
+// @Summary 通过id获取单位
+// @Description 通过id获取单位
+// @Tags 单位
+// @Param body body dto.UnitGetReq true "body"
+// @Success 200 {object} response.Response{data=models.Unit} "{"code": 200, "data": [...]}"
+// @Router /unit/detail [post]
+// @Security Bearer
+func (c UnitController) Detail() {
+	s := services.Unit{}
+	reqData := dto.UnitGetReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	var object models.Unit
+	//数据权限检查
+	p := actions.GetPermissionFromContext(c.Ctx)
+	err := s.Get(&reqData, &object, p)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+
+	c.OK(object, "查询成功")
+}
+
+// Add 添加单位
+// @Summary 添加单位
+// @Description 添加单位
+// @Tags 单位
+// @Accept  application/json
+// @Unit application/json
+// @Param data body dto.UnitInsertReq true "data"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /unit/add [post]
+// @Security Bearer
+func (c UnitController) Add() {
+	s := services.Unit{}
+	reqData := dto.UnitInsertReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
+	reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
+	err := s.Insert(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "创建成功")
+}
+
+// Edit 修改单位
+// @Summary 修改单位
+// @Description 修改单位
+// @Tags 单位
+// @Accept  application/json
+// @Unit application/json
+// @Param data body dto.UnitUpdateReq true "body"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /unit/edit [post]
+// @Security Bearer
+func (c UnitController) Edit() {
+	s := services.Unit{}
+	reqData := dto.UnitUpdateReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+
+	err := s.Update(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "更新成功")
+}
+
+// Delete 删除单位
+// @Summary 删除单位
+// @Description 删除单位
+// @Tags 单位
+// @Accept  application/json
+// @Unit application/json
+// @Param id body dto.UnitDeleteReq true "请求参数"
+// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
+// @Router /unit/delete [post]
+// @Security Bearer
+func (c UnitController) Delete() {
+	s := services.Unit{}
+	reqData := dto.UnitDeleteReq{}
+	if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
+		c.Error(global.ParseFormErr, err, err.Error())
+		return
+	}
+
+	// TODO 判断出入库数据
+	reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
+	err := s.Remove(&reqData)
+	if err != nil {
+		c.Error(500, err, err.Error())
+		return
+	}
+	c.OK(reqData.GetId(), "删除成功")
+}

+ 1641 - 0
docs/docs.go

@@ -0,0 +1,1641 @@
+// Package docs GENERATED BY SWAG; DO NOT EDIT
+// This file was generated by swaggo/swag
+package docs
+
+import "github.com/swaggo/swag"
+
+const docTemplate = `{
+    "schemes": {{ marshal .Schemes }},
+    "swagger": "2.0",
+    "info": {
+        "description": "{{escape .Description}}",
+        "title": "{{.Title}}",
+        "contact": {},
+        "version": "{{.Version}}"
+    },
+    "host": "{{.Host}}",
+    "basePath": "{{.BasePath}}",
+    "paths": {
+        "/api/role-api": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改角色路由权限",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "角色"
+                ],
+                "summary": "对接统一身份认证(前端暂时忽略)",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.RoleApiUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "添加剂型",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "删除剂型",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取剂型",
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "通过id获取剂型",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.DosageForm"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "修改剂型",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取剂型列表",
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "获取剂型列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.DosageForm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "添加生产企业",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "删除生产企业",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取生产企业",
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "通过id获取生产企业",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Enterprise"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "修改生产企业",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取生产企业列表",
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "获取生产企业列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterprisePageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Enterprise"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "添加品名",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "删除品名",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取品名",
+                "tags": [
+                    "品名"
+                ],
+                "summary": "通过id获取品名",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Product"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "修改品名",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取品名列表",
+                "tags": [
+                    "品名"
+                ],
+                "summary": "获取品名列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Product"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "添加规格",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "删除规格",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取规格",
+                "tags": [
+                    "规格"
+                ],
+                "summary": "通过id获取规格",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Spec"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "修改规格",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取规格列表",
+                "tags": [
+                    "规格"
+                ],
+                "summary": "获取规格列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Spec"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "添加单位",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "删除单位",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取单位",
+                "tags": [
+                    "单位"
+                ],
+                "summary": "通过id获取单位",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Unit"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "修改单位",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取单位列表",
+                "tags": [
+                    "单位"
+                ],
+                "summary": "获取单位列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Unit"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "dto.DosageFormDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.DosageFormGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.DosageFormInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "剂型",
+                    "type": "string",
+                    "example": "剂型"
+                }
+            }
+        },
+        "dto.DosageFormPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.DosageFormUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "剂型",
+                    "type": "string",
+                    "example": "剂型"
+                }
+            }
+        },
+        "dto.EnterpriseDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.EnterpriseGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.EnterpriseInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "生产企业",
+                    "type": "string",
+                    "example": "生产企业"
+                }
+            }
+        },
+        "dto.EnterprisePageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.EnterpriseUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "生产企业",
+                    "type": "string",
+                    "example": "生产企业"
+                }
+            }
+        },
+        "dto.ProductDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.ProductGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.ProductInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "品名",
+                    "type": "string",
+                    "example": "品名"
+                }
+            }
+        },
+        "dto.ProductPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.ProductUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "品名",
+                    "type": "string",
+                    "example": "品名"
+                }
+            }
+        },
+        "dto.RoleApiUpdateReq": {
+            "type": "object",
+            "properties": {
+                "apiList": {
+                    "description": "api路由列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.BeegoApi"
+                    }
+                },
+                "roleKey": {
+                    "description": "服务id",
+                    "type": "string",
+                    "example": "test"
+                }
+            }
+        },
+        "dto.SpecDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.SpecGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.SpecInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.SpecPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.SpecUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.UnitDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.UnitGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.UnitInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.UnitPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.UnitUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "model.BeegoApi": {
+            "type": "object",
+            "properties": {
+                "action": {
+                    "description": "请求类型",
+                    "type": "string",
+                    "example": "Get"
+                },
+                "name": {
+                    "description": "标题",
+                    "type": "string",
+                    "example": "test"
+                },
+                "path": {
+                    "description": "地址",
+                    "type": "string",
+                    "example": "/test"
+                },
+                "serviceId": {
+                    "description": "服务ID",
+                    "type": "integer",
+                    "example": 1
+                }
+            }
+        },
+        "models.DosageForm": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "剂型名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Enterprise": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "生产企业名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Product": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "产品名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Spec": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "规格名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Unit": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "单位名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "response.Page": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "integer"
+                },
+                "count": {
+                    "description": "总数",
+                    "type": "integer"
+                },
+                "list": {},
+                "msg": {
+                    "type": "string"
+                },
+                "page": {
+                    "description": "页码",
+                    "type": "integer"
+                },
+                "pageSize": {
+                    "description": "页条数",
+                    "type": "integer"
+                },
+                "requestId": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "string"
+                }
+            }
+        },
+        "response.Response": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "integer"
+                },
+                "data": {},
+                "msg": {
+                    "type": "string"
+                },
+                "requestId": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "string"
+                }
+            }
+        }
+    },
+    "securityDefinitions": {
+        "Bearer": {
+            "type": "apiKey",
+            "name": "Authorization",
+            "in": "header"
+        }
+    }
+}`
+
+// SwaggerInfo holds exported Swagger Info so clients can modify it
+var SwaggerInfo = &swag.Spec{
+	Version:          "1.0",
+	Host:             "192.168.11.77:8110",
+	BasePath:         "/api",
+	Schemes:          []string{"http"},
+	Title:            "疫苗进销存管理系统",
+	Description:      "疫苗进销存管理系统",
+	InfoInstanceName: "swagger",
+	SwaggerTemplate:  docTemplate,
+}
+
+func init() {
+	swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
+}

BIN
docs/favicon-16x16.png


BIN
docs/favicon-32x32.png


+ 60 - 0
docs/index.html

@@ -0,0 +1,60 @@
+<!-- HTML for static distribution bundle build -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8">
+    <title>Swagger UI</title>
+    <link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
+    <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
+    <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
+    <style>
+      html
+      {
+        box-sizing: border-box;
+        overflow: -moz-scrollbars-vertical;
+        overflow-y: scroll;
+      }
+
+      *,
+      *:before,
+      *:after
+      {
+        box-sizing: inherit;
+      }
+
+      body
+      {
+        margin:0;
+        background: #fafafa;
+      }
+    </style>
+  </head>
+
+  <body>
+    <div id="swagger-ui"></div>
+
+    <script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
+    <script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
+    <script>
+    window.onload = function() {
+      // Begin Swagger UI call region
+      const ui = SwaggerUIBundle({
+        url: "swagger.json",
+        dom_id: '#swagger-ui',
+        deepLinking: true,
+        presets: [
+          SwaggerUIBundle.presets.apis,
+          SwaggerUIStandalonePreset
+        ],
+        plugins: [
+          SwaggerUIBundle.plugins.DownloadUrl
+        ],
+        layout: "StandaloneLayout"
+      });
+      // End Swagger UI call region
+
+      window.ui = ui;
+    };
+  </script>
+  </body>
+</html>

+ 79 - 0
docs/oauth2-redirect.html

@@ -0,0 +1,79 @@
+<!doctype html>
+<html lang="en-US">
+<head>
+    <title>Swagger UI: OAuth2 Redirect</title>
+</head>
+<body>
+<script>
+    'use strict';
+    function run () {
+        var oauth2 = window.opener.swaggerUIRedirectOauth2;
+        var sentState = oauth2.state;
+        var redirectUrl = oauth2.redirectUrl;
+        var isValid, qp, arr;
+
+        if (/code|token|error/.test(window.location.hash)) {
+            qp = window.location.hash.substring(1);
+        } else {
+            qp = location.search.substring(1);
+        }
+
+        arr = qp.split("&");
+        arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
+        qp = qp ? JSON.parse('{' + arr.join() + '}',
+                function (key, value) {
+                    return key === "" ? value : decodeURIComponent(value);
+                }
+        ) : {};
+
+        isValid = qp.state === sentState;
+
+        if ((
+          oauth2.auth.schema.get("flow") === "accessCode" ||
+          oauth2.auth.schema.get("flow") === "authorizationCode" ||
+          oauth2.auth.schema.get("flow") === "authorization_code"
+        ) && !oauth2.auth.code) {
+            if (!isValid) {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "warning",
+                    message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"
+                });
+            }
+
+            if (qp.code) {
+                delete oauth2.state;
+                oauth2.auth.code = qp.code;
+                oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
+            } else {
+                let oauthErrorMsg;
+                if (qp.error) {
+                    oauthErrorMsg = "["+qp.error+"]: " +
+                        (qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
+                        (qp.error_uri ? "More info: "+qp.error_uri : "");
+                }
+
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "error",
+                    message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server"
+                });
+            }
+        } else {
+            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
+        }
+        window.close();
+    }
+
+    if (document.readyState !== 'loading') {
+        run();
+    } else {
+        document.addEventListener('DOMContentLoaded', function () {
+            run();
+        });
+    }
+</script>
+</body>
+</html>

File diff suppressed because it is too large
+ 1 - 0
docs/swagger-ui-bundle.js


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui-bundle.js.map


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui-es-bundle-core.js


File diff suppressed because it is too large
+ 1 - 0
docs/swagger-ui-es-bundle.js


File diff suppressed because it is too large
+ 1 - 0
docs/swagger-ui-standalone-preset.js


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui-standalone-preset.js.map


File diff suppressed because it is too large
+ 1 - 0
docs/swagger-ui.css


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui.css.map


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui.js


File diff suppressed because it is too large
+ 0 - 0
docs/swagger-ui.js.map


+ 1621 - 0
docs/swagger.json

@@ -0,0 +1,1621 @@
+{
+    "schemes": [
+        "http"
+    ],
+    "swagger": "2.0",
+    "info": {
+        "description": "疫苗进销存管理系统",
+        "title": "疫苗进销存管理系统",
+        "contact": {},
+        "version": "1.0"
+    },
+    "host": "192.168.11.77:8110",
+    "basePath": "/api",
+    "paths": {
+        "/api/role-api": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改角色路由权限",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "角色"
+                ],
+                "summary": "对接统一身份认证(前端暂时忽略)",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.RoleApiUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "添加剂型",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "删除剂型",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取剂型",
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "通过id获取剂型",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.DosageForm"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改剂型",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "修改剂型",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/dosage-form/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取剂型列表",
+                "tags": [
+                    "剂型"
+                ],
+                "summary": "获取剂型列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.DosageFormPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.DosageForm"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "添加生产企业",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "删除生产企业",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取生产企业",
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "通过id获取生产企业",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Enterprise"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改生产企业",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "修改生产企业",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterpriseUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/enterprise/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取生产企业列表",
+                "tags": [
+                    "生产企业"
+                ],
+                "summary": "获取生产企业列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.EnterprisePageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Enterprise"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "添加品名",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "删除品名",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取品名",
+                "tags": [
+                    "品名"
+                ],
+                "summary": "通过id获取品名",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Product"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/product/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改品名",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "品名"
+                ],
+                "summary": "修改品名",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/product/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取品名列表",
+                "tags": [
+                    "品名"
+                ],
+                "summary": "获取品名列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.ProductPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Product"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "添加规格",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "删除规格",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取规格",
+                "tags": [
+                    "规格"
+                ],
+                "summary": "通过id获取规格",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Spec"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改规格",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "规格"
+                ],
+                "summary": "修改规格",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/spec/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取规格列表",
+                "tags": [
+                    "规格"
+                ],
+                "summary": "获取规格列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.SpecPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Spec"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/add": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "添加单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "添加单位",
+                "parameters": [
+                    {
+                        "description": "data",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitInsertReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/delete": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "删除单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "删除单位",
+                "parameters": [
+                    {
+                        "description": "请求参数",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitDeleteReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/detail": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "通过id获取单位",
+                "tags": [
+                    "单位"
+                ],
+                "summary": "通过id获取单位",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitGetReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Response"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "$ref": "#/definitions/models.Unit"
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/edit": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "修改单位",
+                "consumes": [
+                    "application/json"
+                ],
+                "tags": [
+                    "单位"
+                ],
+                "summary": "修改单位",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "data",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitUpdateReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/unit/list": {
+            "post": {
+                "security": [
+                    {
+                        "Bearer": []
+                    }
+                ],
+                "description": "获取单位列表",
+                "tags": [
+                    "单位"
+                ],
+                "summary": "获取单位列表",
+                "parameters": [
+                    {
+                        "description": "body",
+                        "name": "body",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/dto.UnitPageReq"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "{\"code\": 200, \"data\": [...]}",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.Page"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "list": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/models.Unit"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "definitions": {
+        "dto.DosageFormDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.DosageFormGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.DosageFormInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "剂型",
+                    "type": "string",
+                    "example": "剂型"
+                }
+            }
+        },
+        "dto.DosageFormPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.DosageFormUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "剂型",
+                    "type": "string",
+                    "example": "剂型"
+                }
+            }
+        },
+        "dto.EnterpriseDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.EnterpriseGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.EnterpriseInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "生产企业",
+                    "type": "string",
+                    "example": "生产企业"
+                }
+            }
+        },
+        "dto.EnterprisePageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.EnterpriseUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "生产企业",
+                    "type": "string",
+                    "example": "生产企业"
+                }
+            }
+        },
+        "dto.ProductDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.ProductGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.ProductInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "品名",
+                    "type": "string",
+                    "example": "品名"
+                }
+            }
+        },
+        "dto.ProductPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.ProductUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "品名",
+                    "type": "string",
+                    "example": "品名"
+                }
+            }
+        },
+        "dto.RoleApiUpdateReq": {
+            "type": "object",
+            "properties": {
+                "apiList": {
+                    "description": "api路由列表",
+                    "type": "array",
+                    "items": {
+                        "$ref": "#/definitions/model.BeegoApi"
+                    }
+                },
+                "roleKey": {
+                    "description": "服务id",
+                    "type": "string",
+                    "example": "test"
+                }
+            }
+        },
+        "dto.SpecDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.SpecGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.SpecInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.SpecPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.SpecUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.UnitDeleteReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.UnitGetReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                }
+            }
+        },
+        "dto.UnitInsertReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "dto.UnitPageReq": {
+            "type": "object",
+            "properties": {
+                "name": {
+                    "description": "名称",
+                    "type": "string",
+                    "example": ""
+                },
+                "page": {
+                    "description": "页数",
+                    "type": "integer",
+                    "example": 1
+                },
+                "pageSize": {
+                    "description": "每页条数",
+                    "type": "integer",
+                    "example": 10
+                }
+            }
+        },
+        "dto.UnitUpdateReq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer",
+                    "example": 1
+                },
+                "name": {
+                    "description": "规格",
+                    "type": "string",
+                    "example": "规格"
+                }
+            }
+        },
+        "model.BeegoApi": {
+            "type": "object",
+            "properties": {
+                "action": {
+                    "description": "请求类型",
+                    "type": "string",
+                    "example": "Get"
+                },
+                "name": {
+                    "description": "标题",
+                    "type": "string",
+                    "example": "test"
+                },
+                "path": {
+                    "description": "地址",
+                    "type": "string",
+                    "example": "/test"
+                },
+                "serviceId": {
+                    "description": "服务ID",
+                    "type": "integer",
+                    "example": 1
+                }
+            }
+        },
+        "models.DosageForm": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "剂型名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Enterprise": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "生产企业名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Product": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "产品名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Spec": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "规格名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "models.Unit": {
+            "type": "object",
+            "properties": {
+                "createBy": {
+                    "description": "创建者",
+                    "type": "integer"
+                },
+                "createdAt": {
+                    "description": "创建时间",
+                    "type": "string"
+                },
+                "deptId": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "主键编码",
+                    "type": "integer"
+                },
+                "name": {
+                    "description": "单位名称",
+                    "type": "string"
+                },
+                "updateBy": {
+                    "description": "更新者",
+                    "type": "integer"
+                },
+                "updatedAt": {
+                    "description": "最后更新时间",
+                    "type": "string"
+                }
+            }
+        },
+        "response.Page": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "integer"
+                },
+                "count": {
+                    "description": "总数",
+                    "type": "integer"
+                },
+                "list": {},
+                "msg": {
+                    "type": "string"
+                },
+                "page": {
+                    "description": "页码",
+                    "type": "integer"
+                },
+                "pageSize": {
+                    "description": "页条数",
+                    "type": "integer"
+                },
+                "requestId": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "string"
+                }
+            }
+        },
+        "response.Response": {
+            "type": "object",
+            "properties": {
+                "code": {
+                    "type": "integer"
+                },
+                "data": {},
+                "msg": {
+                    "type": "string"
+                },
+                "requestId": {
+                    "type": "string"
+                },
+                "status": {
+                    "type": "string"
+                }
+            }
+        }
+    },
+    "securityDefinitions": {
+        "Bearer": {
+            "type": "apiKey",
+            "name": "Authorization",
+            "in": "header"
+        }
+    }
+}

+ 1023 - 0
docs/swagger.yaml

@@ -0,0 +1,1023 @@
+basePath: /api
+definitions:
+  dto.DosageFormDeleteReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.DosageFormGetReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.DosageFormInsertReq:
+    properties:
+      name:
+        description: 剂型
+        example: 剂型
+        type: string
+    type: object
+  dto.DosageFormPageReq:
+    properties:
+      name:
+        description: 名称
+        example: ""
+        type: string
+      page:
+        description: 页数
+        example: 1
+        type: integer
+      pageSize:
+        description: 每页条数
+        example: 10
+        type: integer
+    type: object
+  dto.DosageFormUpdateReq:
+    properties:
+      id:
+        example: 1
+        type: integer
+      name:
+        description: 剂型
+        example: 剂型
+        type: string
+    type: object
+  dto.EnterpriseDeleteReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.EnterpriseGetReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.EnterpriseInsertReq:
+    properties:
+      name:
+        description: 生产企业
+        example: 生产企业
+        type: string
+    type: object
+  dto.EnterprisePageReq:
+    properties:
+      name:
+        description: 名称
+        example: ""
+        type: string
+      page:
+        description: 页数
+        example: 1
+        type: integer
+      pageSize:
+        description: 每页条数
+        example: 10
+        type: integer
+    type: object
+  dto.EnterpriseUpdateReq:
+    properties:
+      id:
+        example: 1
+        type: integer
+      name:
+        description: 生产企业
+        example: 生产企业
+        type: string
+    type: object
+  dto.ProductDeleteReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.ProductGetReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.ProductInsertReq:
+    properties:
+      name:
+        description: 品名
+        example: 品名
+        type: string
+    type: object
+  dto.ProductPageReq:
+    properties:
+      name:
+        description: 名称
+        example: ""
+        type: string
+      page:
+        description: 页数
+        example: 1
+        type: integer
+      pageSize:
+        description: 每页条数
+        example: 10
+        type: integer
+    type: object
+  dto.ProductUpdateReq:
+    properties:
+      id:
+        example: 1
+        type: integer
+      name:
+        description: 品名
+        example: 品名
+        type: string
+    type: object
+  dto.RoleApiUpdateReq:
+    properties:
+      apiList:
+        description: api路由列表
+        items:
+          $ref: '#/definitions/model.BeegoApi'
+        type: array
+      roleKey:
+        description: 服务id
+        example: test
+        type: string
+    type: object
+  dto.SpecDeleteReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.SpecGetReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.SpecInsertReq:
+    properties:
+      name:
+        description: 规格
+        example: 规格
+        type: string
+    type: object
+  dto.SpecPageReq:
+    properties:
+      name:
+        description: 名称
+        example: ""
+        type: string
+      page:
+        description: 页数
+        example: 1
+        type: integer
+      pageSize:
+        description: 每页条数
+        example: 10
+        type: integer
+    type: object
+  dto.SpecUpdateReq:
+    properties:
+      id:
+        example: 1
+        type: integer
+      name:
+        description: 规格
+        example: 规格
+        type: string
+    type: object
+  dto.UnitDeleteReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.UnitGetReq:
+    properties:
+      id:
+        type: integer
+    type: object
+  dto.UnitInsertReq:
+    properties:
+      name:
+        description: 规格
+        example: 规格
+        type: string
+    type: object
+  dto.UnitPageReq:
+    properties:
+      name:
+        description: 名称
+        example: ""
+        type: string
+      page:
+        description: 页数
+        example: 1
+        type: integer
+      pageSize:
+        description: 每页条数
+        example: 10
+        type: integer
+    type: object
+  dto.UnitUpdateReq:
+    properties:
+      id:
+        example: 1
+        type: integer
+      name:
+        description: 规格
+        example: 规格
+        type: string
+    type: object
+  model.BeegoApi:
+    properties:
+      action:
+        description: 请求类型
+        example: Get
+        type: string
+      name:
+        description: 标题
+        example: test
+        type: string
+      path:
+        description: 地址
+        example: /test
+        type: string
+      serviceId:
+        description: 服务ID
+        example: 1
+        type: integer
+    type: object
+  models.DosageForm:
+    properties:
+      createBy:
+        description: 创建者
+        type: integer
+      createdAt:
+        description: 创建时间
+        type: string
+      deptId:
+        description: 更新者
+        type: integer
+      id:
+        description: 主键编码
+        type: integer
+      name:
+        description: 剂型名称
+        type: string
+      updateBy:
+        description: 更新者
+        type: integer
+      updatedAt:
+        description: 最后更新时间
+        type: string
+    type: object
+  models.Enterprise:
+    properties:
+      createBy:
+        description: 创建者
+        type: integer
+      createdAt:
+        description: 创建时间
+        type: string
+      deptId:
+        description: 更新者
+        type: integer
+      id:
+        description: 主键编码
+        type: integer
+      name:
+        description: 生产企业名称
+        type: string
+      updateBy:
+        description: 更新者
+        type: integer
+      updatedAt:
+        description: 最后更新时间
+        type: string
+    type: object
+  models.Product:
+    properties:
+      createBy:
+        description: 创建者
+        type: integer
+      createdAt:
+        description: 创建时间
+        type: string
+      deptId:
+        description: 更新者
+        type: integer
+      id:
+        description: 主键编码
+        type: integer
+      name:
+        description: 产品名称
+        type: string
+      updateBy:
+        description: 更新者
+        type: integer
+      updatedAt:
+        description: 最后更新时间
+        type: string
+    type: object
+  models.Spec:
+    properties:
+      createBy:
+        description: 创建者
+        type: integer
+      createdAt:
+        description: 创建时间
+        type: string
+      deptId:
+        description: 更新者
+        type: integer
+      id:
+        description: 主键编码
+        type: integer
+      name:
+        description: 规格名称
+        type: string
+      updateBy:
+        description: 更新者
+        type: integer
+      updatedAt:
+        description: 最后更新时间
+        type: string
+    type: object
+  models.Unit:
+    properties:
+      createBy:
+        description: 创建者
+        type: integer
+      createdAt:
+        description: 创建时间
+        type: string
+      deptId:
+        description: 更新者
+        type: integer
+      id:
+        description: 主键编码
+        type: integer
+      name:
+        description: 单位名称
+        type: string
+      updateBy:
+        description: 更新者
+        type: integer
+      updatedAt:
+        description: 最后更新时间
+        type: string
+    type: object
+  response.Page:
+    properties:
+      code:
+        type: integer
+      count:
+        description: 总数
+        type: integer
+      list: {}
+      msg:
+        type: string
+      page:
+        description: 页码
+        type: integer
+      pageSize:
+        description: 页条数
+        type: integer
+      requestId:
+        type: string
+      status:
+        type: string
+    type: object
+  response.Response:
+    properties:
+      code:
+        type: integer
+      data: {}
+      msg:
+        type: string
+      requestId:
+        type: string
+      status:
+        type: string
+    type: object
+host: 192.168.11.77:8110
+info:
+  contact: {}
+  description: 疫苗进销存管理系统
+  title: 疫苗进销存管理系统
+  version: "1.0"
+paths:
+  /api/role-api:
+    post:
+      consumes:
+      - application/json
+      description: 修改角色路由权限
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.RoleApiUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 对接统一身份认证(前端暂时忽略)
+      tags:
+      - 角色
+  /dosage-form/add:
+    post:
+      consumes:
+      - application/json
+      description: 添加剂型
+      parameters:
+      - description: data
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.DosageFormInsertReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 添加剂型
+      tags:
+      - 剂型
+  /dosage-form/delete:
+    post:
+      consumes:
+      - application/json
+      description: 删除剂型
+      parameters:
+      - description: 请求参数
+        in: body
+        name: id
+        required: true
+        schema:
+          $ref: '#/definitions/dto.DosageFormDeleteReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 删除剂型
+      tags:
+      - 剂型
+  /dosage-form/detail:
+    post:
+      description: 通过id获取剂型
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.DosageFormGetReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/models.DosageForm'
+              type: object
+      security:
+      - Bearer: []
+      summary: 通过id获取剂型
+      tags:
+      - 剂型
+  /dosage-form/edit:
+    post:
+      consumes:
+      - application/json
+      description: 修改剂型
+      parameters:
+      - description: body
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.DosageFormUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 修改剂型
+      tags:
+      - 剂型
+  /dosage-form/list:
+    post:
+      description: 获取剂型列表
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.DosageFormPageReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Page'
+            - properties:
+                list:
+                  items:
+                    $ref: '#/definitions/models.DosageForm'
+                  type: array
+              type: object
+      security:
+      - Bearer: []
+      summary: 获取剂型列表
+      tags:
+      - 剂型
+  /enterprise/add:
+    post:
+      consumes:
+      - application/json
+      description: 添加生产企业
+      parameters:
+      - description: data
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.EnterpriseInsertReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 添加生产企业
+      tags:
+      - 生产企业
+  /enterprise/delete:
+    post:
+      consumes:
+      - application/json
+      description: 删除生产企业
+      parameters:
+      - description: 请求参数
+        in: body
+        name: id
+        required: true
+        schema:
+          $ref: '#/definitions/dto.EnterpriseDeleteReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 删除生产企业
+      tags:
+      - 生产企业
+  /enterprise/detail:
+    post:
+      description: 通过id获取生产企业
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.EnterpriseGetReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/models.Enterprise'
+              type: object
+      security:
+      - Bearer: []
+      summary: 通过id获取生产企业
+      tags:
+      - 生产企业
+  /enterprise/edit:
+    post:
+      consumes:
+      - application/json
+      description: 修改生产企业
+      parameters:
+      - description: body
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.EnterpriseUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 修改生产企业
+      tags:
+      - 生产企业
+  /enterprise/list:
+    post:
+      description: 获取生产企业列表
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.EnterprisePageReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Page'
+            - properties:
+                list:
+                  items:
+                    $ref: '#/definitions/models.Enterprise'
+                  type: array
+              type: object
+      security:
+      - Bearer: []
+      summary: 获取生产企业列表
+      tags:
+      - 生产企业
+  /product/add:
+    post:
+      consumes:
+      - application/json
+      description: 添加品名
+      parameters:
+      - description: data
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.ProductInsertReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 添加品名
+      tags:
+      - 品名
+  /product/delete:
+    post:
+      consumes:
+      - application/json
+      description: 删除品名
+      parameters:
+      - description: 请求参数
+        in: body
+        name: id
+        required: true
+        schema:
+          $ref: '#/definitions/dto.ProductDeleteReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 删除品名
+      tags:
+      - 品名
+  /product/detail:
+    post:
+      description: 通过id获取品名
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.ProductGetReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/models.Product'
+              type: object
+      security:
+      - Bearer: []
+      summary: 通过id获取品名
+      tags:
+      - 品名
+  /product/edit:
+    post:
+      consumes:
+      - application/json
+      description: 修改品名
+      parameters:
+      - description: body
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.ProductUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 修改品名
+      tags:
+      - 品名
+  /product/list:
+    post:
+      description: 获取品名列表
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.ProductPageReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Page'
+            - properties:
+                list:
+                  items:
+                    $ref: '#/definitions/models.Product'
+                  type: array
+              type: object
+      security:
+      - Bearer: []
+      summary: 获取品名列表
+      tags:
+      - 品名
+  /spec/add:
+    post:
+      consumes:
+      - application/json
+      description: 添加规格
+      parameters:
+      - description: data
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.SpecInsertReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 添加规格
+      tags:
+      - 规格
+  /spec/delete:
+    post:
+      consumes:
+      - application/json
+      description: 删除规格
+      parameters:
+      - description: 请求参数
+        in: body
+        name: id
+        required: true
+        schema:
+          $ref: '#/definitions/dto.SpecDeleteReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 删除规格
+      tags:
+      - 规格
+  /spec/detail:
+    post:
+      description: 通过id获取规格
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.SpecGetReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/models.Spec'
+              type: object
+      security:
+      - Bearer: []
+      summary: 通过id获取规格
+      tags:
+      - 规格
+  /spec/edit:
+    post:
+      consumes:
+      - application/json
+      description: 修改规格
+      parameters:
+      - description: body
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.SpecUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 修改规格
+      tags:
+      - 规格
+  /spec/list:
+    post:
+      description: 获取规格列表
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.SpecPageReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Page'
+            - properties:
+                list:
+                  items:
+                    $ref: '#/definitions/models.Spec'
+                  type: array
+              type: object
+      security:
+      - Bearer: []
+      summary: 获取规格列表
+      tags:
+      - 规格
+  /unit/add:
+    post:
+      consumes:
+      - application/json
+      description: 添加单位
+      parameters:
+      - description: data
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.UnitInsertReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 添加单位
+      tags:
+      - 单位
+  /unit/delete:
+    post:
+      consumes:
+      - application/json
+      description: 删除单位
+      parameters:
+      - description: 请求参数
+        in: body
+        name: id
+        required: true
+        schema:
+          $ref: '#/definitions/dto.UnitDeleteReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 删除单位
+      tags:
+      - 单位
+  /unit/detail:
+    post:
+      description: 通过id获取单位
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.UnitGetReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Response'
+            - properties:
+                data:
+                  $ref: '#/definitions/models.Unit'
+              type: object
+      security:
+      - Bearer: []
+      summary: 通过id获取单位
+      tags:
+      - 单位
+  /unit/edit:
+    post:
+      consumes:
+      - application/json
+      description: 修改单位
+      parameters:
+      - description: body
+        in: body
+        name: data
+        required: true
+        schema:
+          $ref: '#/definitions/dto.UnitUpdateReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            $ref: '#/definitions/response.Response'
+      security:
+      - Bearer: []
+      summary: 修改单位
+      tags:
+      - 单位
+  /unit/list:
+    post:
+      description: 获取单位列表
+      parameters:
+      - description: body
+        in: body
+        name: body
+        required: true
+        schema:
+          $ref: '#/definitions/dto.UnitPageReq'
+      responses:
+        "200":
+          description: '{"code": 200, "data": [...]}'
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.Page'
+            - properties:
+                list:
+                  items:
+                    $ref: '#/definitions/models.Unit'
+                  type: array
+              type: object
+      security:
+      - Bearer: []
+      summary: 获取单位列表
+      tags:
+      - 单位
+schemes:
+- http
+securityDefinitions:
+  Bearer:
+    in: header
+    name: Authorization
+    type: apiKey
+swagger: "2.0"

+ 60 - 0
docs/swagger.yml

@@ -0,0 +1,60 @@
+swagger: "2.0"
+info:
+  title: 接入统一身份认证demo
+  description: |
+    接入统一身份认证demo
+  version: 1.0.0
+  termsOfService: http://127.0.0.1:8083/swagger/swagger.json
+basePath: /api
+paths: {}
+definitions:
+  common.ControlBy:
+    title: ControlBy
+    type: object
+  coreModel.BeegoApi:
+    title: BeegoApi
+    type: object
+  dto.RoleApiUpdateReq:
+    title: RoleApiUpdateReq
+    type: object
+    properties:
+      apiList:
+        description: api路由列表
+        type: array
+        items:
+          $ref: '#/definitions/coreModel.BeegoApi'
+      roleKey:
+        description: 服务id
+        type: string
+        example: test
+  response.Msg:
+    title: Msg
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      msg:
+        type: string
+      requestId:
+        type: string
+      status:
+        type: string
+  response.Response:
+    title: Response
+    type: object
+    properties:
+      code:
+        type: integer
+        format: int32
+      data:
+        $ref: '#/definitions/response.interface'
+      msg:
+        type: string
+      requestId:
+        type: string
+      status:
+        type: string
+  response.interface:
+    title: interface
+    type: object

+ 98 - 0
dto/dosage_form.go

@@ -0,0 +1,98 @@
+package dto
+
+import (
+	"Medical_ERP/common/dto"
+	common "Medical_ERP/common/model"
+	"Medical_ERP/models"
+)
+
+// DosageFormPageReq 列表或者搜索使用结构体
+type DosageFormPageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `json:"name" search:"type:contains;column:name;table:product" example:""` // 名称
+}
+
+func (m *DosageFormPageReq) GetNeedSearch() interface{} {
+	return *m
+}
+
+// DosageFormInsertReq 增使用的结构体
+type DosageFormInsertReq struct {
+	Id               int    `json:"id" comment:"id" swaggerignore:"true"`
+	Name             string `json:"name" example:"剂型" valid:"MinSize(1)"`     //剂型
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`    //排序
+	Remark           string `json:"remark" example:"备注" swaggerignore:"true"` //备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *DosageFormInsertReq) Generate(model *models.DosageForm) {
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+	model.DeptId = s.DeptId
+}
+
+// GetId 获取数据对应的ID
+func (s *DosageFormInsertReq) GetId() interface{} {
+	return s.Id
+}
+
+// DosageFormUpdateReq 改使用的结构体
+type DosageFormUpdateReq struct {
+	Id               int    `json:"id"  example:"1"`
+	Name             string `json:"name"  example:"剂型"`                         // 剂型
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`      //排序
+	Remark           string `json:"remark"   example:"备注" swaggerignore:"true"` // 备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *DosageFormUpdateReq) Generate(model *models.DosageForm) {
+	model.Id = s.Id
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *DosageFormUpdateReq) GetId() interface{} {
+	return s.Id
+}
+
+// DosageFormGetReq 获取单个的结构体
+type DosageFormGetReq struct {
+	Id int `json:"id"`
+}
+
+func (s *DosageFormGetReq) GetId() interface{} {
+	return s.Id
+}
+
+// DosageFormDeleteReq 删除的结构体
+type DosageFormDeleteReq struct {
+	Id               int `json:"id"`
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *DosageFormDeleteReq) Generate(model *models.DosageForm) {
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *DosageFormDeleteReq) GetId() interface{} {
+	return s.Id
+}

+ 98 - 0
dto/enterprise.go

@@ -0,0 +1,98 @@
+package dto
+
+import (
+	"Medical_ERP/common/dto"
+	common "Medical_ERP/common/model"
+	"Medical_ERP/models"
+)
+
+// EnterprisePageReq 列表或者搜索使用结构体
+type EnterprisePageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `json:"name" search:"type:contains;column:name;table:product" example:""` // 名称
+}
+
+func (m *EnterprisePageReq) GetNeedSearch() interface{} {
+	return *m
+}
+
+// EnterpriseInsertReq 增使用的结构体
+type EnterpriseInsertReq struct {
+	Id               int    `json:"id" comment:"id" swaggerignore:"true"`
+	Name             string `json:"name" example:"生产企业" valid:"MinSize(1)"`   //生产企业
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`    //排序
+	Remark           string `json:"remark" example:"备注" swaggerignore:"true"` //备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *EnterpriseInsertReq) Generate(model *models.Enterprise) {
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+// GetId 获取数据对应的ID
+func (s *EnterpriseInsertReq) GetId() interface{} {
+	return s.Id
+}
+
+// EnterpriseUpdateReq 改使用的结构体
+type EnterpriseUpdateReq struct {
+	Id               int    `json:"id"  example:"1"`
+	Name             string `json:"name"  example:"生产企业"`                       // 生产企业
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`      //排序
+	Remark           string `json:"remark"   example:"备注" swaggerignore:"true"` // 备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *EnterpriseUpdateReq) Generate(model *models.Enterprise) {
+	model.Id = s.Id
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+	model.DeptId = s.DeptId
+}
+
+func (s *EnterpriseUpdateReq) GetId() interface{} {
+	return s.Id
+}
+
+// EnterpriseGetReq 获取单个的结构体
+type EnterpriseGetReq struct {
+	Id int `json:"id"`
+}
+
+func (s *EnterpriseGetReq) GetId() interface{} {
+	return s.Id
+}
+
+// EnterpriseDeleteReq 删除的结构体
+type EnterpriseDeleteReq struct {
+	Id               int `json:"id"`
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *EnterpriseDeleteReq) Generate(model *models.Enterprise) {
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *EnterpriseDeleteReq) GetId() interface{} {
+	return s.Id
+}

+ 20 - 0
dto/pagination.go

@@ -0,0 +1,20 @@
+package dto
+
+type Pagination struct {
+	PageIndex int `form:"pageIndex" example:"1"`
+	PageSize  int `form:"pageSize" example:"10"`
+}
+
+func (m *Pagination) GetPageIndex() int {
+	if m.PageIndex <= 0 {
+		m.PageIndex = 1
+	}
+	return m.PageIndex
+}
+
+func (m *Pagination) GetPageSize() int {
+	if m.PageSize <= 0 {
+		m.PageSize = 10
+	}
+	return m.PageSize
+}

+ 98 - 0
dto/product.go

@@ -0,0 +1,98 @@
+package dto
+
+import (
+	"Medical_ERP/common/dto"
+	common "Medical_ERP/common/model"
+	"Medical_ERP/models"
+)
+
+// ProductPageReq 列表或者搜索使用结构体
+type ProductPageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `json:"name" search:"type:contains;column:name;table:product" example:""` // 名称
+}
+
+func (m *ProductPageReq) GetNeedSearch() interface{} {
+	return *m
+}
+
+// ProductInsertReq 增使用的结构体
+type ProductInsertReq struct {
+	Id               int    `json:"id" comment:"id" swaggerignore:"true"`
+	Name             string `json:"name" example:"品名" valid:"MinSize(1)"`     //品名
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`    //排序
+	Remark           string `json:"remark" example:"备注" swaggerignore:"true"` //备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *ProductInsertReq) Generate(model *models.Product) {
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+	model.DeptId = s.DeptId
+}
+
+// GetId 获取数据对应的ID
+func (s *ProductInsertReq) GetId() interface{} {
+	return s.Id
+}
+
+// ProductUpdateReq 改使用的结构体
+type ProductUpdateReq struct {
+	Id               int    `json:"id"  example:"1"`
+	Name             string `json:"name"  example:"品名"`                         // 品名
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`      //排序
+	Remark           string `json:"remark"   example:"备注" swaggerignore:"true"` // 备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *ProductUpdateReq) Generate(model *models.Product) {
+	model.Id = s.Id
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *ProductUpdateReq) GetId() interface{} {
+	return s.Id
+}
+
+// ProductGetReq 获取单个的结构体
+type ProductGetReq struct {
+	Id int `json:"id"`
+}
+
+func (s *ProductGetReq) GetId() interface{} {
+	return s.Id
+}
+
+// ProductDeleteReq 删除的结构体
+type ProductDeleteReq struct {
+	Id               int `json:"id"`
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *ProductDeleteReq) Generate(model *models.Product) {
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *ProductDeleteReq) GetId() interface{} {
+	return s.Id
+}

+ 13 - 0
dto/role_api.go

@@ -0,0 +1,13 @@
+package dto
+
+import (
+	common "Medical_ERP/common/model"
+	coreModel "gogs.baozhida.cn/zoie/OAuth-core/model"
+)
+
+type RoleApiUpdateReq struct {
+	RoleKey string               `json:"roleKey" example:"test"` // 服务id
+	ApiList []coreModel.BeegoApi `json:"apiList"`                // api路由列表
+
+	common.ControlBy `swaggerignore:"true"`
+}

+ 98 - 0
dto/spec.go

@@ -0,0 +1,98 @@
+package dto
+
+import (
+	"Medical_ERP/common/dto"
+	common "Medical_ERP/common/model"
+	"Medical_ERP/models"
+)
+
+// SpecPageReq 列表或者搜索使用结构体
+type SpecPageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `json:"name" search:"type:contains;column:name;table:product" example:""` // 名称
+}
+
+func (m *SpecPageReq) GetNeedSearch() interface{} {
+	return *m
+}
+
+// SpecInsertReq 增使用的结构体
+type SpecInsertReq struct {
+	Id               int    `json:"id" comment:"id" swaggerignore:"true"`
+	Name             string `json:"name" example:"规格" valid:"MinSize(1)"`     //规格
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`      //排序
+	Remark           string `json:"remark" example:"备注" swaggerignore:"true"` //备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *SpecInsertReq) Generate(model *models.Spec) {
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+	model.DeptId = s.DeptId
+}
+
+// GetId 获取数据对应的ID
+func (s *SpecInsertReq) GetId() interface{} {
+	return s.Id
+}
+
+// SpecUpdateReq 改使用的结构体
+type SpecUpdateReq struct {
+	Id               int    `json:"id"  example:"1"`
+	Name             string `json:"name"  example:"规格"`                         // 规格
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`        //排序
+	Remark           string `json:"remark"   example:"备注" swaggerignore:"true"` // 备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *SpecUpdateReq) Generate(model *models.Spec) {
+	model.Id = s.Id
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *SpecUpdateReq) GetId() interface{} {
+	return s.Id
+}
+
+// SpecGetReq 获取单个的结构体
+type SpecGetReq struct {
+	Id int `json:"id"`
+}
+
+func (s *SpecGetReq) GetId() interface{} {
+	return s.Id
+}
+
+// SpecDeleteReq 删除的结构体
+type SpecDeleteReq struct {
+	Id               int `json:"id"`
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *SpecDeleteReq) Generate(model *models.Spec) {
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *SpecDeleteReq) GetId() interface{} {
+	return s.Id
+}

+ 98 - 0
dto/unit.go

@@ -0,0 +1,98 @@
+package dto
+
+import (
+	"Medical_ERP/common/dto"
+	common "Medical_ERP/common/model"
+	"Medical_ERP/models"
+)
+
+// UnitPageReq 列表或者搜索使用结构体
+type UnitPageReq struct {
+	dto.Pagination `search:"-"`
+	Name           string `json:"name" search:"type:contains;column:name;table:product" example:""` // 名称
+}
+
+func (m *UnitPageReq) GetNeedSearch() interface{} {
+	return *m
+}
+
+// UnitInsertReq 增使用的结构体
+type UnitInsertReq struct {
+	Id               int    `json:"id" comment:"id" swaggerignore:"true"`
+	Name             string `json:"name" example:"规格" valid:"MinSize(1)"`     //规格
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`    //排序
+	Remark           string `json:"remark" example:"备注" swaggerignore:"true"` //备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *UnitInsertReq) Generate(model *models.Unit) {
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+	model.DeptId = s.DeptId
+}
+
+// GetId 获取数据对应的ID
+func (s *UnitInsertReq) GetId() interface{} {
+	return s.Id
+}
+
+// UnitUpdateReq 改使用的结构体
+type UnitUpdateReq struct {
+	Id               int    `json:"id"  example:"1"`
+	Name             string `json:"name"  example:"规格"`                         // 规格
+	Sort             int    `json:"sort" example:"0" swaggerignore:"true"`      //排序
+	Remark           string `json:"remark"   example:"备注" swaggerignore:"true"` // 备注
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *UnitUpdateReq) Generate(model *models.Unit) {
+	model.Id = s.Id
+	model.Name = s.Name
+	model.Sort = s.Sort
+	model.Remark = s.Remark
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *UnitUpdateReq) GetId() interface{} {
+	return s.Id
+}
+
+// UnitGetReq 获取单个的结构体
+type UnitGetReq struct {
+	Id int `json:"id"`
+}
+
+func (s *UnitGetReq) GetId() interface{} {
+	return s.Id
+}
+
+// UnitDeleteReq 删除的结构体
+type UnitDeleteReq struct {
+	Id               int `json:"id"`
+	common.ControlBy `swaggerignore:"true"`
+}
+
+func (s *UnitDeleteReq) Generate(model *models.Unit) {
+	if s.ControlBy.UpdateBy != 0 {
+		model.UpdateBy = s.UpdateBy
+	}
+	if s.ControlBy.CreateBy != 0 {
+		model.CreateBy = s.CreateBy
+	}
+}
+
+func (s *UnitDeleteReq) GetId() interface{} {
+	return s.Id
+}

+ 101 - 0
go.mod

@@ -0,0 +1,101 @@
+module Medical_ERP
+
+go 1.19
+
+require (
+	github.com/beego/beego/v2 v2.1.0
+	github.com/bytedance/go-tagexpr/v2 v2.7.12
+	github.com/gin-gonic/gin v1.8.1
+	github.com/go-basic/uuid v1.0.0
+	github.com/go-redis/redis/v7 v7.4.0
+	github.com/go-resty/resty/v2 v2.7.0
+	github.com/go-sql-driver/mysql v1.7.0
+	github.com/gobwas/glob v0.2.3
+	github.com/google/uuid v1.3.0
+	github.com/opentracing/opentracing-go v1.2.0
+	github.com/smartystreets/goconvey v1.8.1
+	github.com/swaggo/swag v1.16.2
+	github.com/tidwall/gjson v1.15.0
+	gogs.baozhida.cn/zoie/OAuth-core v0.0.0-00010101000000-000000000000
+	gorm.io/driver/mysql v1.3.5
+	gorm.io/gorm v1.23.8
+)
+
+require (
+	github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect
+	github.com/KyleBanks/depth v1.2.1 // indirect
+	github.com/PuerkitoBio/purell v1.1.1 // indirect
+	github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/bsm/redislock v0.5.0 // indirect
+	github.com/casbin/casbin/v2 v2.47.2 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973 // indirect
+	github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd // indirect
+	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
+	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
+	github.com/fatih/color v1.9.0 // indirect
+	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f // indirect
+	github.com/go-openapi/jsonpointer v0.19.5 // indirect
+	github.com/go-openapi/jsonreference v0.19.6 // indirect
+	github.com/go-openapi/spec v0.20.4 // indirect
+	github.com/go-openapi/swag v0.19.15 // indirect
+	github.com/go-playground/locales v0.14.0 // indirect
+	github.com/go-playground/universal-translator v0.18.0 // indirect
+	github.com/go-playground/validator/v10 v10.11.0 // indirect
+	github.com/goccy/go-json v0.9.10 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
+	github.com/gopherjs/gopherjs v1.17.2 // indirect
+	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/henrylee2cn/ameda v1.4.10 // indirect
+	github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect
+	github.com/imdario/mergo v0.3.9 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/jtolds/gls v4.20.0+incompatible // indirect
+	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
+	github.com/leodido/go-urn v1.2.1 // indirect
+	github.com/mailru/easyjson v0.7.6 // indirect
+	github.com/mattn/go-colorable v0.1.7 // indirect
+	github.com/mattn/go-isatty v0.0.14 // indirect
+	github.com/mattn/goveralls v0.0.2 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
+	github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/nsqio/go-nsq v1.0.8 // indirect
+	github.com/nyaruka/phonenumbers v1.0.55 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.2 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/prometheus/client_golang v1.15.1 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.9.0 // indirect
+	github.com/robfig/cron/v3 v3.0.1 // indirect
+	github.com/robinjoseph08/redisqueue/v2 v2.1.0 // indirect
+	github.com/russross/blackfriday/v2 v2.1.0 // indirect
+	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
+	github.com/smarty/assertions v1.15.0 // indirect
+	github.com/tidwall/match v1.1.1 // indirect
+	github.com/tidwall/pretty v1.2.1 // indirect
+	github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df // indirect
+	github.com/ugorji/go/codec v1.2.7 // indirect
+	github.com/urfave/cli v1.22.1 // indirect
+	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
+	golang.org/x/net v0.8.0 // indirect
+	golang.org/x/sys v0.6.0 // indirect
+	golang.org/x/text v0.8.0 // indirect
+	golang.org/x/tools v0.7.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
+	gopkg.in/AlecAivazis/survey.v1 v1.8.5 // indirect
+	gopkg.in/kyokomi/emoji.v1 v1.5.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
+
+replace gogs.baozhida.cn/zoie/OAuth-core => /Users/zoie/work/bzd_project/OAuth-core

+ 328 - 0
go.sum

@@ -0,0 +1,328 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
+github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
+github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw=
+github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
+github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/beego/beego/v2 v2.1.0 h1:Lk0FtQGvDQCx5V5yEu4XwDsIgt+QOlNjt5emUa3/ZmA=
+github.com/beego/beego/v2 v2.1.0/go.mod h1:6h36ISpaxNrrpJ27siTpXBG8d/Icjzsc7pU1bWpp0EE=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bsm/redislock v0.5.0 h1:ODM11/cbuUXQqLgZWK6XQnufaTjsBE2UcwBc2EAFNDA=
+github.com/bsm/redislock v0.5.0/go.mod h1:qagqKlV+xiLy26iV34Y3zRPxRcJjQYbV7pZfWFeSZ8M=
+github.com/bytedance/go-tagexpr/v2 v2.7.12 h1:qL2f0j11S8DHQsUWUA6aacLNBcbPTbNKuzVjaW4kF/M=
+github.com/bytedance/go-tagexpr/v2 v2.7.12/go.mod h1:cKpo/rwg2Y5Njs8SX3FspMWEhAWCaF4xUr5LJYXibSU=
+github.com/casbin/casbin/v2 v2.47.2 h1:FVdlX0GEYWpYj7IdSThBpidLr8Bp+yfvlmVNec5INtw=
+github.com/casbin/casbin/v2 v2.47.2/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973 h1:Js/7nHtkpvUW62passc9FOflXyLQDjSoYclkFeDdTEM=
+github.com/chanxuehong/rand v0.0.0-20201110082127-2f19a1bdd973/go.mod h1:9+sJ9zvvkXC5sPjPEZM3Jpb9n2Q2VtcrGZly0UHYF5I=
+github.com/chanxuehong/util v0.0.0-20200304121633-ca8141845b13/go.mod h1:XEYt99iTxMqkv+gW85JX/DdUINHUe43Sbe5AtqSaDAQ=
+github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd h1:TM3wjEWel4U31J72dlhnwCBqPC0+FA0Ejm2NCbn5a5U=
+github.com/chanxuehong/wechat v0.0.0-20201110083048-0180211b69fd/go.mod h1:/dvhOIRCjjiZu6NV0QTTiMcc5XwoORbxfDSsRY2IfaM=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
+github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
+github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f h1:8l4Aw3Jmx0pLKYMkY+1b6yBPgE+rzRtA5T3vqFyI2Z8=
+github.com/git-chglog/git-chglog v0.0.0-20190611050339-63a4e637021f/go.mod h1:Dcsy1kii/xFyNad5JqY/d0GO5mu91sungp5xotbm3Yk=
+github.com/go-basic/uuid v1.0.0 h1:Faqtetcr8uwOzR2qp8RSpkahQiv4+BnJhrpuXPOo63M=
+github.com/go-basic/uuid v1.0.0/go.mod h1:yVtVnsXcmaLc9F4Zw7hTV7R0+vtuQw00mdXi+F6tqco=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
+github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
+github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
+github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
+github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
+github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
+github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
+github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
+github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw=
+github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
+github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
+github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
+github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
+github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
+github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/goccy/go-json v0.9.10 h1:hCeNmprSNLB8B8vQKWl6DpuH0t60oEs+TAk9a7CScKc=
+github.com/goccy/go-json v0.9.10/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=
+github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 h1:yE9ULgp02BhYIrO6sdV/FPe0xQM6fNHkVQW2IAymfM0=
+github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ=
+github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ=
+github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
+github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
+github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
+github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
+github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc=
+github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
+github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
+github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
+github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nsqio/go-nsq v1.0.8 h1:3L2F8tNLlwXXlp2slDUrUWSBn2O3nMh8R1/KEDFTHPk=
+github.com/nsqio/go-nsq v1.0.8/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/nyaruka/phonenumbers v1.0.55 h1:bj0nTO88Y68KeUQ/n3Lo2KgK7lM1hF7L9NFuwcCl3yg=
+github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
+github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw=
+github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
+github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
+github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
+github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
+github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
+github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
+github.com/robinjoseph08/redisqueue/v2 v2.1.0 h1:GactHlrxS8YSCJc4CbP1KbTObo14pieNmNWSUlquTGI=
+github.com/robinjoseph08/redisqueue/v2 v2.1.0/go.mod h1:fiNYBqIF/DqZxKvO6faLB6nkBtfJucuM+rDbFhZG1vs=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=
+github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=
+github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=
+github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04=
+github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E=
+github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
+github.com/tidwall/gjson v1.15.0 h1:5n/pM+v3r5ujuNl4YLZLsQ+UE5jlkLVm7jMzT5Mpolw=
+github.com/tidwall/gjson v1.15.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df h1:Y2l28Jr3vOEeYtxfVbMtVfOdAwuUqWaP9fvNKiBVeXY=
+github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df/go.mod h1:pnyouUty/nBr/zm3GYwTIt+qFTLWbdjeLjZmJdzJOu8=
+github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
+github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
+github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
+golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
+golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/AlecAivazis/survey.v1 v1.8.5 h1:QoEEmn/d5BbuPIL2qvXwzJdttFFhRQFkaq+tEKb7SMI=
+gopkg.in/AlecAivazis/survey.v1 v1.8.5/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/kyokomi/emoji.v1 v1.5.1 h1:beetH5mWDMzFznJ+Qzd5KVHp79YKhVUMcdO8LpRLeGw=
+gopkg.in/kyokomi/emoji.v1 v1.5.1/go.mod h1:N9AZ6hi1jHOPn34PsbpufQZUcKftSD7WgS2pgpmH4Lg=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.3.5 h1:iWBTVW/8Ij5AG4e0G/zqzaJblYkBI1VIL1LG2HUGsvY=
+gorm.io/driver/mysql v1.3.5/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c=
+gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
+gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

+ 0 - 0
logs/logs.alert.log


+ 1 - 0
logs/logs.critical.log

@@ -0,0 +1 @@
+2023/07/27 16:43:50.412  [C] [server.go:298]  ListenAndServe:  listen tcp :8080: bind: address already in use

+ 0 - 0
logs/logs.emergency.log


+ 2 - 0
logs/logs.error.log

@@ -0,0 +1,2 @@
+2023/07/28 09:18:53.891  [E] [redis.go:25]  failed to init redis ERROR-5002004, can not connect to remote redis server, please check the connection info and network state: {"key":"default","conn":"127.0.0.1:43379","dbNum":"2","password":""}: ERROR-5002005, could not dial to remote server: 127.0.0.1:43379 : dial tcp 127.0.0.1:43379: connect: connection refused
+2023/07/28 10:27:03.281  [E] [redis.go:25]  failed to init redis ERROR-5002004, can not connect to remote redis server, please check the connection info and network state: {"key":"default","conn":"127.0.0.1:43379","dbNum":"2","password":""}: ERROR-5002005, could not dial to remote server: 127.0.0.1:43379 : dial tcp 127.0.0.1:43379: connect: connection refused

+ 51 - 0
logs/logs.info.log

@@ -0,0 +1,51 @@
+2023/07/27 16:16:53.582  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:08.186  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:55.058  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:56.293  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:22:28.111  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:24:51.865  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:29:49.062  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:31:35.992  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:33:30.318  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:34:10.444  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:35:17.803  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:35:42.469  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:36:50.229  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:43:50.412  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:44:00.757  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:45:34.565  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:47:18.336  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:56:25.695  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:16:21.600  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:18:21.906  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:18:53.305  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:19:16.241  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:23:29.424  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:27:18.440  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:27:31.004  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:35:19.201  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:38:27.321  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:38:36.629  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:51:28.996  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 09:18:53.954  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 10:27:03.303  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 10:36:19.505  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:05:39.590  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:10:19.266  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:28:18.672  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:30:25.672  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:31:36.395  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:37:05.018  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:38:29.250  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:38:38.339  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:41:11.149  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:44:07.280  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:48:04.375  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:50:27.618  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:51:36.421  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:53:31.499  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:59:55.035  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:02:00.804  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:03:59.133  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:05:02.071  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:05:43.671  [I] [server.go:281]  http server Running on http://:8083

+ 54 - 0
logs/logs.log

@@ -0,0 +1,54 @@
+2023/07/27 16:16:53.582  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:08.186  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:55.058  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:20:56.293  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:22:28.111  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:24:51.865  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:29:49.062  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:31:35.992  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:33:30.318  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:34:10.444  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:35:17.803  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:35:42.469  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:36:50.229  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:43:50.412  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:43:50.412  [C] [server.go:298]  ListenAndServe:  listen tcp :8080: bind: address already in use
+2023/07/27 16:44:00.757  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:45:34.565  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:47:18.336  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 16:56:25.695  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:16:21.600  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:18:21.906  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:18:53.305  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:19:16.241  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:23:29.424  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:27:18.440  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:27:31.004  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:35:19.201  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:38:27.321  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:38:36.629  [I] [server.go:281]  http server Running on http://:8080
+2023/07/27 17:51:28.996  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 09:18:53.891  [E] [redis.go:25]  failed to init redis ERROR-5002004, can not connect to remote redis server, please check the connection info and network state: {"key":"default","conn":"127.0.0.1:43379","dbNum":"2","password":""}: ERROR-5002005, could not dial to remote server: 127.0.0.1:43379 : dial tcp 127.0.0.1:43379: connect: connection refused
+2023/07/28 09:18:53.954  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 10:27:03.281  [E] [redis.go:25]  failed to init redis ERROR-5002004, can not connect to remote redis server, please check the connection info and network state: {"key":"default","conn":"127.0.0.1:43379","dbNum":"2","password":""}: ERROR-5002005, could not dial to remote server: 127.0.0.1:43379 : dial tcp 127.0.0.1:43379: connect: connection refused
+2023/07/28 10:27:03.303  [I] [server.go:281]  http server Running on http://:8080
+2023/07/28 10:36:19.505  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:05:39.590  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:10:19.266  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:28:18.672  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:30:25.672  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:31:36.395  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:37:05.018  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:38:29.250  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:38:38.339  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:41:11.149  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:44:07.280  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:48:04.375  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:50:27.618  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:51:36.421  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:53:31.499  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 11:59:55.035  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:02:00.804  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:03:59.133  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:05:02.071  [I] [server.go:281]  http server Running on http://:8083
+2023/07/28 12:05:43.671  [I] [server.go:281]  http server Running on http://:8083

+ 0 - 0
logs/logs.notice.log


+ 0 - 0
logs/logs.warning.log


+ 88 - 0
main.go

@@ -0,0 +1,88 @@
+package main
+
+import (
+	"Medical_ERP/common/global"
+	_ "Medical_ERP/common/initialize"
+	"Medical_ERP/conf"
+	"Medical_ERP/controllers"
+	_ "Medical_ERP/models"
+	_ "Medical_ERP/routers"
+	"fmt"
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/go-resty/resty/v2"
+	"github.com/tidwall/gjson"
+	"gogs.baozhida.cn/zoie/OAuth-core/pkg"
+	"log"
+	"net/http"
+	"os"
+)
+
+//go:generate swag init --parseDependency --parseDepth=6
+// @title 疫苗进销存管理系统
+// @version 1.0
+// @description 疫苗进销存管理系统
+// @Host 192.168.11.77:8110
+// @BasePath /api
+// @Schemes http
+
+// @securityDefinitions.apikey Bearer
+// @in header
+// @name Authorization
+func main() {
+	if beego.BConfig.RunMode == "dev" {
+		//beego.BConfig.WebConfig.DirectoryIndex = true
+		//beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
+		beego.SetStaticPath("/swagger", "docs")
+	}
+
+	// 错误处理
+	beego.ErrorController(&controllers.ErrorController{})
+	// 从 panic 中恢复
+	beego.BConfig.RecoverPanic = true
+
+	//go func() {
+	//	// 初始化服务发现
+	//	InitServiceDiscovery()
+	//}()
+
+	go InitServiceDiscovery()
+
+	fmt.Println(pkg.Green("Server run at:"))
+	fmt.Printf("-  Local:   http://127.0.0.1:%d/ \r\n", conf.Httpport)
+	fmt.Printf("-  Network: http://%s:%d/ \r\n", pkg.GetLocalHost(), conf.Httpport)
+	fmt.Println(pkg.Green("Swagger run at:"))
+	fmt.Printf("-  Local:   http://127.0.0.1:%d/swagger/index.html \r\n", conf.Httpport)
+	fmt.Printf("-  Network: http://%s:%d/swagger/index.html \r\n", pkg.GetLocalHost(), conf.Httpport)
+	beego.Run()
+}
+
+// 初始化服务发现
+func InitServiceDiscovery() {
+	AuthCode, _ := beego.AppConfig.String("Service_authCode")
+	Host, _ := beego.AppConfig.String("Service_host")
+	Name, _ := beego.AppConfig.String("Service_name")
+	RoleApiUrl, _ := beego.AppConfig.String("Service_roleApiUrl")
+
+	reqPath := "/api/service-disco"
+	url := conf.OAuthBaseUrl + reqPath
+
+	r, reqError := resty.New().R().SetBody(map[string]string{
+		"authCode":   AuthCode,
+		"host":       Host,
+		"name":       Name,
+		"roleApiUrl": RoleApiUrl,
+	}).Post(url)
+	if reqError != nil {
+		log.Fatal("初始化服务发现失败", reqError)
+		os.Exit(-1)
+	}
+
+	code := gjson.GetBytes(r.Body(), "code").Int()
+	id := gjson.GetBytes(r.Body(), "data").Int()
+	if code != http.StatusOK {
+		log.Fatal("初始化服务发现失败", string(r.Body()))
+		os.Exit(-1)
+	}
+	global.ServiceId = int(id)
+
+}

+ 120 - 0
middleware/auth_middle.go

@@ -0,0 +1,120 @@
+package middleware
+
+import (
+	"Medical_ERP/common/global"
+	"Medical_ERP/common/response"
+	"Medical_ERP/conf"
+	"Medical_ERP/services"
+	"encoding/json"
+	"errors"
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/go-resty/resty/v2"
+	"github.com/gobwas/glob"
+	"github.com/opentracing/opentracing-go/log"
+	coreModel "gogs.baozhida.cn/zoie/OAuth-core/model"
+	jwt "gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth"
+	"net/http"
+	"strconv"
+	"strings"
+
+	adapter "github.com/beego/beego/v2/adapter"
+	"github.com/beego/beego/v2/adapter/context"
+)
+
+const ErrUnauthorized = "Unauthorized"
+
+// AuthMiddle 中间件
+func AuthMiddle() {
+	// 不 需要验证的url
+	FilterExcludeURL, _ := beego.AppConfig.String("FilterExcludeURL")
+	FilterOnlyLoginCheckURL, _ := beego.AppConfig.String("FilterOnlyLoginCheckURL")
+	var filterLogin = func(ctx *context.Context) {
+		url := ctx.Input.URL()
+		method := ctx.Input.Method()
+		if !strings.Contains(FilterExcludeURL, url) && !strings.Contains(url, "/swagger") && !strings.Contains(url, "/static") {
+			// 验证登录
+			usr, err := ValidateToken(ctx)
+			if err != nil {
+				ctx.Output.JSON(response.Error(global.Unauthorized, err, err.Error()),
+					true, true)
+				return
+			}
+			// 过滤掉不需要验证权限的路由
+			if !strings.Contains(FilterOnlyLoginCheckURL, url) {
+				if usr.RoleKey != "admin" {
+					//校验权限
+					if !checkPermission(usr.RoleKey, url, method) {
+						ctx.Output.JSON(response.Error(global.Unauthorized, nil, "无权访问"), true, true)
+						return
+					}
+				}
+			}
+
+			ctx.Input.SetData(global.ContextKeyUserObj, usr)
+		}
+	}
+	adapter.InsertFilter("/api/*", adapter.BeforeRouter, filterLogin)
+}
+
+func ValidateToken(c *context.Context) (coreModel.UserInfo, error) {
+
+	reqPath := "/api/service/userinfo"
+	url := conf.OAuthBaseUrl + reqPath
+
+	r, reqError := resty.New().R().SetHeaders(
+		map[string]string{
+			"Authorization": c.Request.Header.Get("Authorization"),
+			"serviceId":     strconv.Itoa(global.ServiceId),
+		},
+	).Get(url)
+	if reqError != nil {
+		log.Error(reqError)
+		return coreModel.UserInfo{}, reqError
+
+	}
+	type Res struct {
+		response.Msg
+		Data coreModel.UserInfo `json:"data"`
+	}
+
+	var res Res // 替换为你期望的结构体类型
+	err := json.Unmarshal(r.Body(), &res)
+	if err != nil {
+		log.Error(err)
+		return coreModel.UserInfo{}, err
+	}
+
+	if res.Code != http.StatusOK {
+		log.Error(errors.New(res.Msg.Msg))
+		return coreModel.UserInfo{}, errors.New(res.Msg.Msg)
+	}
+	c.Input.SetData(jwt.JwtPayloadKey, jwt.MapClaims{
+		"uuid":      res.Data.Uuid,
+		"identity":  float64(res.Data.UserId),
+		"userName":  res.Data.UserName,
+		"roleName":  res.Data.RoleName,
+		"roleKey":   res.Data.RoleKey,
+		"userId":    float64(res.Data.UserId),
+		"roleId":    float64(res.Data.RoleId),
+		"dataScope": float64(res.Data.DataScope),
+		"deptId":    float64(res.Data.DeptId),
+	})
+	return res.Data, nil
+
+}
+
+// 验证权限
+func checkPermission(roleKey, url string, method string) bool {
+	RoleApiService := services.RoleApi{}
+	apiList, err := RoleApiService.GetRoleApi(roleKey)
+	if err != nil {
+		return false
+	}
+	for _, v := range apiList {
+		g := glob.MustCompile(strings.Replace(v.Path, ":id", "?", -1))
+		if g.Match(url) && v.Action == method {
+			return true
+		}
+	}
+	return false
+}

+ 26 - 0
middleware/cors_middle.go

@@ -0,0 +1,26 @@
+package middleware
+
+import (
+	beego "github.com/beego/beego/v2/adapter"
+	"github.com/beego/beego/v2/adapter/context"
+	"net/http"
+)
+
+var success = []byte("SUPPORT OPTIONS")
+
+var corsFunc = func(ctx *context.Context) {
+	//origin := ctx.Input.Header("Origin")
+	ctx.Output.Header("Access-Control-Allow-Methods", "OPTIONS,DELETE,POST,GET,PUT,PATCH")
+	ctx.Output.Header("Access-Control-Max-Age", "3600")
+	ctx.Output.Header("Access-Control-Allow-Headers", "X-Custom-Header,accept,Content-Type,Access-Token,Authorization")
+	ctx.Output.Header("Access-Control-Allow-Credentials", "true")
+	ctx.Output.Header("Access-Control-Allow-Origin", "*")
+	if ctx.Input.Method() == http.MethodOptions {
+		ctx.Output.SetStatus(http.StatusOK)
+		_ = ctx.Output.Body(success)
+	}
+}
+
+func CorsMiddle() {
+	beego.InsertFilter("/*", beego.BeforeRouter, corsFunc)
+}

+ 98 - 0
middleware/log_middle.go

@@ -0,0 +1,98 @@
+package middleware
+
+import (
+	db "Medical_ERP/common/initialize"
+	"Medical_ERP/models"
+	"encoding/json"
+	"fmt"
+	"github.com/go-basic/uuid"
+	"strconv"
+	"strings"
+	"time"
+
+	adapter "github.com/beego/beego/v2/adapter"
+	"github.com/beego/beego/v2/adapter/context"
+)
+
+type OperationLogDetailed struct {
+	Input       string `json:"input"`
+	Data        string `json:"data"`
+	Path        string `json:"path"`
+	Method      string `json:"method"`
+	Ip          string `json:"ip"`
+	Username    string `json:"username"`
+	RequestTime string `json:"request_time"`
+}
+
+// LogMiddle 中间件
+var filterLog = func(ctx *context.Context) {
+	if ctx.Input.URL() != "/api/home/chart" && ctx.Input.URL() != "/api/home/list" {
+
+		var name, username string
+		//非登录接口从token中获取用户name
+		if len(ctx.Request.Header["Authorization"]) != 0 {
+			user, err := ValidateToken(ctx)
+			if err == nil {
+				username = user.UserName
+			}
+		}
+		//获取url类型
+		urlKey := strings.Replace(ctx.Input.URL(), "/", "_", -1)
+		//传递name
+		detailedStruct := getRequestDetailed(ctx)
+		detailedStruct.Username = username
+		detailedJsonByte, err := json.Marshal(detailedStruct) //转换成JSON返回的是byte[]
+		if err != nil {
+			fmt.Println(err.Error())
+		}
+		//组合描述
+		describe := name + "-send:" + detailedStruct.Path
+		var uuid = uuid.New()
+		logData := models.OperationLog{
+			ID:       uuid,
+			UrlKey:   urlKey,
+			Describe: describe,
+			DataID:   "",
+			Detailed: string(detailedJsonByte),
+		}
+		if err := db.DB.Create(&logData).Error; err != nil {
+			fmt.Println("log insert fail")
+		}
+	}
+
+}
+
+// 获取请求详细数据
+func getRequestDetailed(ctx *context.Context) *OperationLogDetailed {
+	var jsonDataMap map[string]interface{}
+	_ = json.Unmarshal(ctx.Input.RequestBody, &jsonDataMap)
+
+	// 将 JSON 对象压缩为字节切片
+	compressedData, _ := json.Marshal(jsonDataMap)
+
+	//获取起始时间
+	startTime := ctx.Request.Header.Get("req_start_time")
+	//string转int
+	startTimeInt, _ := strconv.Atoi(startTime)
+	reqTimeInt := int(time.Now().UnixNano()/1e6) - startTimeInt
+	var detailedStruct OperationLogDetailed
+	detailedStruct.Input = string(compressedData)
+	detailedStruct.Path = ctx.Input.URL()
+	detailedStruct.Method = ctx.Request.Method
+	detailedStruct.Ip = ctx.Input.IP()
+	detailedStruct.RequestTime = strconv.Itoa(reqTimeInt)
+	return &detailedStruct
+
+}
+
+// 将开始时间放入cookie
+var getStartTime = func(ctx *context.Context) {
+	startTime := time.Now().UnixNano() / 1e6
+	startTimeStr := strconv.FormatInt(startTime, 10)
+	ctx.Request.Header.Set("req_start_time", startTimeStr)
+}
+
+func LogMiddle() {
+	adapter.InsertFilter("/*", adapter.FinishRouter, filterLog, false)
+	adapter.InsertFilter("/*", adapter.BeforeRouter, getStartTime, false)
+}

+ 22 - 0
models/dosage_form.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+)
+
+type DosageForm struct {
+	model2.Model
+	Name   string `orm:"size(128)" json:"name"`                   //剂型名称
+	Sort   int    `orm:"size(4)" json:"-" swaggerignore:"true"`   //剂型排序
+	Remark string `orm:"size(255)" json:"-" swaggerignore:"true"` //描述
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (e *DosageForm) TableName() string {
+	return "dosage_form"
+}
+
+func (e *DosageForm) GetId() interface{} {
+	return e.Id
+}

+ 22 - 0
models/enterprise.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+)
+
+type Enterprise struct {
+	model2.Model
+	Name   string `orm:"size(128)" json:"name"`                   //生产企业名称
+	Sort   int    `orm:"size(4)" json:"-" swaggerignore:"true"`   //生产企业排序
+	Remark string `orm:"size(255)" json:"-" swaggerignore:"true"` //描述
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (e *Enterprise) TableName() string {
+	return "enterprise"
+}
+
+func (e *Enterprise) GetId() interface{} {
+	return e.Id
+}

+ 27 - 0
models/init.go

@@ -0,0 +1,27 @@
+package models
+
+import (
+	db "Medical_ERP/common/initialize"
+	_ "github.com/go-sql-driver/mysql"
+	"log"
+)
+
+func init() {
+	AutoMigrateDB()
+}
+
+func AutoMigrateDB() {
+	//自动迁移模式
+	err := db.DB.Set("gorm:table_options", "charset=utf8mb4").
+		AutoMigrate(
+			&OperationLog{},
+			&RoleApi{},
+			&Product{},
+			&Enterprise{},
+			&Spec{},
+			&DosageForm{},
+		)
+	if err != nil {
+		log.Fatalf("migrate db fail: %v", err)
+	}
+}

+ 16 - 0
models/operation_log.go

@@ -0,0 +1,16 @@
+package models
+
+import model2 "Medical_ERP/common/model"
+
+type OperationLog struct {
+	ID       string `json:"id" gorm:"primaryKey,size:36"`
+	UrlKey   string `json:"url_key" gorm:"size:36"`
+	Describe string `json:"describe" gorm:"type:longtext"`
+	DataID   string `json:"data_id" gorm:"size:36"`
+	Detailed string `json:"detailed" gorm:"type:longtext"`
+	model2.ModelTime
+}
+
+func (OperationLog) TableName() string {
+	return "operation_log"
+}

+ 22 - 0
models/product.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+)
+
+type Product struct {
+	model2.Model
+	Name   string `orm:"size(128)" json:"name"`                   //产品名称
+	Sort   int    `orm:"size(4)" json:"-" swaggerignore:"true"`   //产品排序
+	Remark string `orm:"size(255)" json:"-" swaggerignore:"true"` //描述
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (e *Product) TableName() string {
+	return "product"
+}
+
+func (e *Product) GetId() interface{} {
+	return e.Id
+}

+ 26 - 0
models/role_api.go

@@ -0,0 +1,26 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+	coreModel "gogs.baozhida.cn/zoie/OAuth-core/model"
+)
+
+type RoleApi struct {
+	model2.Model
+	coreModel.BeegoApi
+	model2.ModelTime `swaggerignore:"true"`
+	model2.ControlBy `swaggerignore:"true"`
+}
+
+func (e *RoleApi) TableName() string {
+	return "role_api"
+}
+
+func (e *RoleApi) Generate() model2.ActiveRecord {
+	o := *e
+	return &o
+}
+
+func (e *RoleApi) GetId() interface{} {
+	return e.Id
+}

+ 22 - 0
models/spec.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+)
+
+type Spec struct {
+	model2.Model
+	Name   string `orm:"size(128)" json:"name"`                   //规格名称
+	Sort   int    `orm:"size(4)" json:"-" swaggerignore:"true"`   //规格排序
+	Remark string `orm:"size(255)" json:"-" swaggerignore:"true"` //描述
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (e *Spec) TableName() string {
+	return "spec"
+}
+
+func (e *Spec) GetId() interface{} {
+	return e.Id
+}

+ 22 - 0
models/unit.go

@@ -0,0 +1,22 @@
+package models
+
+import (
+	model2 "Medical_ERP/common/model"
+)
+
+type Unit struct {
+	model2.Model
+	Name   string `orm:"size(128)" json:"name"`                   //单位名称
+	Sort   int    `orm:"size(4)" json:"-" swaggerignore:"true"`   //单位排序
+	Remark string `orm:"size(255)" json:"-" swaggerignore:"true"` //描述
+	model2.ControlBy
+	model2.ModelTime
+}
+
+func (e *Unit) TableName() string {
+	return "spec"
+}
+
+func (e *Unit) GetId() interface{} {
+	return e.Id
+}

+ 19 - 0
routers/dosage_form.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 分组
+	dosageForm := beego.NewNamespace("/api/dosage-form",
+		beego.NSRouter("/list", &controllers.DosageFormController{}, "*:List"),
+		beego.NSRouter("/detail", &controllers.DosageFormController{}, "*:Detail"),
+		beego.NSRouter("/add", &controllers.DosageFormController{}, "*:Add"),
+		beego.NSRouter("/edit", &controllers.DosageFormController{}, "*:Edit"),
+		beego.NSRouter("/delete", &controllers.DosageFormController{}, "*:Delete"),
+	)
+	//注册 namespace
+	beego.AddNamespace(dosageForm)
+}

+ 19 - 0
routers/enterprise.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 生产企业
+	enterprise := beego.NewNamespace("/api/enterprise",
+		beego.NSRouter("/list", &controllers.EnterpriseController{}, "*:List"),
+		beego.NSRouter("/detail", &controllers.EnterpriseController{}, "*:Detail"),
+		beego.NSRouter("/add", &controllers.EnterpriseController{}, "*:Add"),
+		beego.NSRouter("/edit", &controllers.EnterpriseController{}, "*:Edit"),
+		beego.NSRouter("/delete", &controllers.EnterpriseController{}, "*:Delete"),
+	)
+	//注册 namespace
+	beego.AddNamespace(enterprise)
+}

+ 19 - 0
routers/product.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 分组
+	product := beego.NewNamespace("/api/product",
+		beego.NSRouter("/list", &controllers.ProductController{}, "*:List"),
+		beego.NSRouter("/detail", &controllers.ProductController{}, "*:Detail"),
+		beego.NSRouter("/add", &controllers.ProductController{}, "*:Add"),
+		beego.NSRouter("/edit", &controllers.ProductController{}, "*:Edit"),
+		beego.NSRouter("/delete", &controllers.ProductController{}, "*:Delete"),
+	)
+	//注册 namespace
+	beego.AddNamespace(product)
+}

+ 16 - 0
routers/role_api.go

@@ -0,0 +1,16 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+
+	ns := beego.NewNamespace("/api",
+		beego.NSCtrlPost("/role-api", (*controllers.RoleApi).UpdateRoleApi),
+	)
+	//注册 namespace
+	beego.AddNamespace(ns)
+
+}

+ 27 - 0
routers/router.go

@@ -0,0 +1,27 @@
+// Package routers
+// @APIVersion 1.0.0
+// @Title 接入统一身份认证demo
+// @Description 接入统一身份认证demo
+// @TermsOfServiceUrl http://127.0.0.1:8083/swagger/swagger.json
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	"Medical_ERP/middleware"
+
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+
+	//跨域
+	middleware.CorsMiddle()
+	//授权登录中间件
+	middleware.AuthMiddle()
+	//日志中间件
+	middleware.LogMiddle()
+
+	// 更新权限
+	beego.Router("/api/role-api", &controllers.RoleApi{}, "*:UpdateRoleApi")
+
+}

+ 19 - 0
routers/spec.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 分组
+	spec := beego.NewNamespace("/api/spec",
+		beego.NSRouter("/list", &controllers.SpecController{}, "*:List"),
+		beego.NSRouter("/detail", &controllers.SpecController{}, "*:Detail"),
+		beego.NSRouter("/add", &controllers.SpecController{}, "*:Add"),
+		beego.NSRouter("/edit", &controllers.SpecController{}, "*:Edit"),
+		beego.NSRouter("/delete", &controllers.SpecController{}, "*:Delete"),
+	)
+	//注册 namespace
+	beego.AddNamespace(spec)
+}

+ 19 - 0
routers/unit.go

@@ -0,0 +1,19 @@
+package routers
+
+import (
+	"Medical_ERP/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 分组
+	unit := beego.NewNamespace("/api/unit",
+		beego.NSRouter("/list", &controllers.UnitController{}, "*:List"),
+		beego.NSRouter("/detail", &controllers.UnitController{}, "*:Detail"),
+		beego.NSRouter("/add", &controllers.UnitController{}, "*:Add"),
+		beego.NSRouter("/edit", &controllers.UnitController{}, "*:Edit"),
+		beego.NSRouter("/delete", &controllers.UnitController{}, "*:Delete"),
+	)
+	//注册 namespace
+	beego.AddNamespace(unit)
+}

+ 106 - 0
services/dosage_form.go

@@ -0,0 +1,106 @@
+package services
+
+import (
+	"Medical_ERP/common/actions"
+	cDto "Medical_ERP/common/dto"
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+
+	"gorm.io/gorm"
+
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+)
+
+type DosageForm struct {
+}
+
+// GetPage 获取DosageForm列表
+func (e *DosageForm) GetPage(c *dto.DosageFormPageReq, list *[]models.DosageForm, count *int64, p *actions.DataPermission) error {
+	var err error
+	var data models.DosageForm
+
+	err = db.DB.Model(&data).
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.Permission(data.TableName(), p),
+		).
+		Find(list).Limit(-1).Offset(-1).
+		Count(count).Error
+	if err != nil {
+		logs.Error("db error: %s ", err)
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Get 获取DosageForm对象
+func (e *DosageForm) Get(d *dto.DosageFormGetReq, productModel *models.DosageForm, p *actions.DataPermission) error {
+	err := db.DB.
+		Scopes(actions.Permission(productModel.TableName(), p)).
+		First(productModel, d.GetId()).Error
+
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Insert 创建DosageForm对象
+func (e *DosageForm) Insert(c *dto.DosageFormInsertReq) error {
+	var err error
+	var data models.DosageForm
+	c.Generate(&data)
+	err = db.DB.Create(&data).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	c.Id = data.Id
+	return nil
+}
+
+// Update 修改DosageForm对象
+func (e *DosageForm) Update(c *dto.DosageFormUpdateReq) error {
+	var productModel = models.DosageForm{}
+	err := db.DB.First(&productModel, c.GetId()).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.UpdateNotFoundOrNoPermissionErr
+		}
+		return global.UpdateFailedErr
+	}
+
+	c.Generate(&productModel)
+
+	err = db.DB.Save(&productModel).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}
+
+// Remove 删除DosageForm
+func (e *DosageForm) Remove(d *dto.DosageFormDeleteReq) error {
+	var err error
+	var data models.DosageForm
+
+	result := db.DB.Model(&data).Delete(&data, d.GetId())
+	if err = result.Error; err != nil {
+		logs.Error("Delete error: %s", err)
+		return global.DeleteFailedErr
+	}
+	if result.RowsAffected == 0 {
+		return global.DeleteNotFoundOrNoPermissionErr
+	}
+	return nil
+}

+ 106 - 0
services/enterprise.go

@@ -0,0 +1,106 @@
+package services
+
+import (
+	"Medical_ERP/common/actions"
+	cDto "Medical_ERP/common/dto"
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+
+	"gorm.io/gorm"
+
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+)
+
+type Enterprise struct {
+}
+
+// GetPage 获取Enterprise列表
+func (e *Enterprise) GetPage(c *dto.EnterprisePageReq, list *[]models.Enterprise, count *int64, p *actions.DataPermission) error {
+	var err error
+	var data models.Enterprise
+
+	err = db.DB.Model(&data).
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.Permission(data.TableName(), p),
+		).
+		Find(list).Limit(-1).Offset(-1).
+		Count(count).Error
+	if err != nil {
+		logs.Error("db error: %s ", err)
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Get 获取Enterprise对象
+func (e *Enterprise) Get(d *dto.EnterpriseGetReq, productModel *models.Enterprise, p *actions.DataPermission) error {
+	err := db.DB.
+		Scopes(actions.Permission(productModel.TableName(), p)).
+		First(productModel, d.GetId()).Error
+
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Insert 创建Enterprise对象
+func (e *Enterprise) Insert(c *dto.EnterpriseInsertReq) error {
+	var err error
+	var data models.Enterprise
+	c.Generate(&data)
+	err = db.DB.Create(&data).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	c.Id = data.Id
+	return nil
+}
+
+// Update 修改Enterprise对象
+func (e *Enterprise) Update(c *dto.EnterpriseUpdateReq) error {
+	var productModel = models.Enterprise{}
+	err := db.DB.First(&productModel, c.GetId()).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.UpdateNotFoundOrNoPermissionErr
+		}
+		return global.UpdateFailedErr
+	}
+
+	c.Generate(&productModel)
+
+	err = db.DB.Save(&productModel).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}
+
+// Remove 删除Enterprise
+func (e *Enterprise) Remove(d *dto.EnterpriseDeleteReq) error {
+	var err error
+	var data models.Enterprise
+
+	result := db.DB.Model(&data).Delete(&data, d.GetId())
+	if err = result.Error; err != nil {
+		logs.Error("Delete error: %s", err)
+		return global.DeleteFailedErr
+	}
+	if result.RowsAffected == 0 {
+		return global.DeleteNotFoundOrNoPermissionErr
+	}
+	return nil
+}

+ 106 - 0
services/product.go

@@ -0,0 +1,106 @@
+package services
+
+import (
+	"Medical_ERP/common/actions"
+	cDto "Medical_ERP/common/dto"
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+
+	"gorm.io/gorm"
+
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+)
+
+type Product struct {
+}
+
+// GetPage 获取Product列表
+func (e *Product) GetPage(c *dto.ProductPageReq, list *[]models.Product, count *int64, p *actions.DataPermission) error {
+	var err error
+	var data models.Product
+
+	err = db.DB.Model(&data).
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.Permission(data.TableName(), p),
+		).
+		Find(list).Limit(-1).Offset(-1).
+		Count(count).Error
+	if err != nil {
+		logs.Error("db error: %s ", err)
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Get 获取Product对象
+func (e *Product) Get(d *dto.ProductGetReq, productModel *models.Product, p *actions.DataPermission) error {
+	err := db.DB.
+		Scopes(actions.Permission(productModel.TableName(), p)).
+		First(productModel, d.GetId()).Error
+
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Insert 创建Product对象
+func (e *Product) Insert(c *dto.ProductInsertReq) error {
+	var err error
+	var data models.Product
+	c.Generate(&data)
+	err = db.DB.Create(&data).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	c.Id = data.Id
+	return nil
+}
+
+// Update 修改Product对象
+func (e *Product) Update(c *dto.ProductUpdateReq) error {
+	var productModel = models.Product{}
+	err := db.DB.First(&productModel, c.GetId()).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.UpdateNotFoundOrNoPermissionErr
+		}
+		return global.UpdateFailedErr
+	}
+
+	c.Generate(&productModel)
+
+	err = db.DB.Save(&productModel).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}
+
+// Remove 删除Product
+func (e *Product) Remove(d *dto.ProductDeleteReq) error {
+	var err error
+	var data models.Product
+
+	result := db.DB.Model(&data).Delete(&data, d.GetId())
+	if err = result.Error; err != nil {
+		logs.Error("Delete error: %s", err)
+		return global.DeleteFailedErr
+	}
+	if result.RowsAffected == 0 {
+		return global.DeleteNotFoundOrNoPermissionErr
+	}
+	return nil
+}

+ 65 - 0
services/role_api.go

@@ -0,0 +1,65 @@
+package services
+
+import (
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"Medical_ERP/common/redis"
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+	"github.com/beego/beego/v2/core/logs"
+	"time"
+)
+
+type RoleApi struct {
+}
+
+func (svc *RoleApi) UpdateRoleApi(d *dto.RoleApiUpdateReq) error {
+	var err error
+	tx := db.DB.Begin()
+
+	// 删除之前的角色关联的api
+	result := db.DB.Where("role_key = ?", d.RoleKey).Delete(&RoleApi{})
+	if result.RowsAffected == 1 {
+		tx.Rollback()
+		logs.Error("delete api list error, %s", result.Error)
+		return global.UpdateFailedErr
+	}
+
+	var roleApiList []models.RoleApi
+	// 添加新增的角色关联的api
+	for _, v := range d.ApiList {
+		roleApiObj := models.RoleApi{}
+		roleApiObj.SetApi(v.ServiceId, v.Name, v.Path, v.Action, d.RoleKey)
+		roleApiObj.SetCreateBy(d.UpdateBy)
+		roleApiList = append(roleApiList, roleApiObj)
+	}
+
+	// 批量插入
+	err = tx.Create(&roleApiList).Error
+	if err != nil {
+		tx.Rollback()
+		logs.Error("save api list error, %s", err)
+		return global.UpdateFailedErr
+	}
+	tx.Commit()
+
+	// 更新redis
+	redis.SetJson(global.RedisPrefixRoleApi, roleApiList, 24*time.Hour)
+	return nil
+}
+
+func (svc *RoleApi) GetRoleApi(roleKey string) ([]models.RoleApi, error) {
+	var roleApiList []models.RoleApi
+	err := redis.GetJson(global.RedisPrefixRoleApi+roleKey, &roleApiList)
+	if err != nil {
+		logs.Error("get role api list from redis error, %s", err)
+	}
+	err = db.DB.Where("role_key = ?", roleKey).Find(&roleApiList).Error
+	if err != nil {
+		logs.Error("get role api list error, %s", err)
+		return roleApiList, err
+	}
+	// 更新redis
+	redis.SetJson(global.RedisPrefixRoleApi+roleKey, roleApiList, 24*time.Hour)
+	return roleApiList, err
+}

+ 110 - 0
services/spec.go

@@ -0,0 +1,110 @@
+package services
+
+import (
+	"Medical_ERP/common/actions"
+	cDto "Medical_ERP/common/dto"
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+
+	"gorm.io/gorm"
+
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+)
+
+type Spec struct {
+}
+
+// GetPage 获取Spec列表
+func (e *Spec) GetPage(c *dto.SpecPageReq, list *[]models.Spec, count *int64, p *actions.DataPermission) error {
+	var err error
+	var data models.Spec
+
+	err = db.DB.Model(&data).
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.Permission(data.TableName(), p),
+		).
+		Find(list).Limit(-1).Offset(-1).
+		Count(count).Error
+	if err != nil {
+		logs.Error("db error: %s ", err)
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Get 获取Spec对象
+func (e *Spec) Get(d *dto.SpecGetReq, productModel *models.Spec, p *actions.DataPermission) error {
+	err := db.DB.
+		Scopes(actions.Permission(productModel.TableName(), p)).
+		First(productModel, d.GetId()).Error
+
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Insert 创建Spec对象
+func (e *Spec) Insert(c *dto.SpecInsertReq) error {
+	var err error
+	var data models.Spec
+	c.Generate(&data)
+	err = db.DB.Create(&data).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	c.Id = data.Id
+	return nil
+}
+
+// Update 修改Spec对象
+func (e *Spec) Update(c *dto.SpecUpdateReq) error {
+	var productModel = models.Spec{}
+	err := db.DB.First(&productModel, c.GetId()).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.UpdateNotFoundOrNoPermissionErr
+		}
+		return global.UpdateFailedErr
+	}
+	
+	if c.DeptId != productModel.DeptId {
+		return global.UpdateNotFoundOrNoPermissionErr
+	}
+
+	c.Generate(&productModel)
+
+	err = db.DB.Save(&productModel).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}
+
+// Remove 删除Spec
+func (e *Spec) Remove(d *dto.SpecDeleteReq) error {
+	var err error
+	var data models.Spec
+
+	result := db.DB.Model(&data).Delete(&data, d.GetId())
+	if err = result.Error; err != nil {
+		logs.Error("Delete error: %s", err)
+		return global.DeleteFailedErr
+	}
+	if result.RowsAffected == 0 {
+		return global.DeleteNotFoundOrNoPermissionErr
+	}
+	return nil
+}

+ 106 - 0
services/unit.go

@@ -0,0 +1,106 @@
+package services
+
+import (
+	"Medical_ERP/common/actions"
+	cDto "Medical_ERP/common/dto"
+	"Medical_ERP/common/global"
+	db "Medical_ERP/common/initialize"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+
+	"gorm.io/gorm"
+
+	"Medical_ERP/dto"
+	"Medical_ERP/models"
+)
+
+type Unit struct {
+}
+
+// GetPage 获取Unit列表
+func (e *Unit) GetPage(c *dto.UnitPageReq, list *[]models.Unit, count *int64, p *actions.DataPermission) error {
+	var err error
+	var data models.Unit
+
+	err = db.DB.Model(&data).
+		Scopes(
+			cDto.MakeCondition(c.GetNeedSearch()),
+			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
+			actions.Permission(data.TableName(), p),
+		).
+		Find(list).Limit(-1).Offset(-1).
+		Count(count).Error
+	if err != nil {
+		logs.Error("db error: %s ", err)
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Get 获取Unit对象
+func (e *Unit) Get(d *dto.UnitGetReq, productModel *models.Unit, p *actions.DataPermission) error {
+	err := db.DB.
+		Scopes(actions.Permission(productModel.TableName(), p)).
+		First(productModel, d.GetId()).Error
+
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.GetNotFoundOrNoPermissionErr
+		}
+		return global.GetFailedErr
+	}
+	return nil
+}
+
+// Insert 创建Unit对象
+func (e *Unit) Insert(c *dto.UnitInsertReq) error {
+	var err error
+	var data models.Unit
+	c.Generate(&data)
+	err = db.DB.Create(&data).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.CreateFailedErr
+	}
+	c.Id = data.Id
+	return nil
+}
+
+// Update 修改Unit对象
+func (e *Unit) Update(c *dto.UnitUpdateReq) error {
+	var productModel = models.Unit{}
+	err := db.DB.First(&productModel, c.GetId()).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return global.UpdateNotFoundOrNoPermissionErr
+		}
+		return global.UpdateFailedErr
+	}
+
+	c.Generate(&productModel)
+
+	err = db.DB.Save(&productModel).Error
+	if err != nil {
+		logs.Error("db error: %s", err)
+		return global.UpdateFailedErr
+	}
+	return nil
+}
+
+// Remove 删除Unit
+func (e *Unit) Remove(d *dto.UnitDeleteReq) error {
+	var err error
+	var data models.Unit
+
+	result := db.DB.Model(&data).Delete(&data, d.GetId())
+	if err = result.Error; err != nil {
+		logs.Error("Delete error: %s", err)
+		return global.DeleteFailedErr
+	}
+	if result.RowsAffected == 0 {
+		return global.DeleteNotFoundOrNoPermissionErr
+	}
+	return nil
+}

+ 38 - 0
tests/default_test.go

@@ -0,0 +1,38 @@
+package test
+
+import (
+	_ "Medical_ERP/routers"
+	"net/http"
+	"net/http/httptest"
+	"path/filepath"
+	"runtime"
+	"testing"
+
+	"github.com/beego/beego/v2/core/logs"
+	beego "github.com/beego/beego/v2/server/web"
+	. "github.com/smartystreets/goconvey/convey"
+)
+
+func init() {
+	_, file, _, _ := runtime.Caller(0)
+	apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
+	beego.TestBeegoInit(apppath)
+}
+
+// TestGet is a sample to run an endpoint test
+func TestGet(t *testing.T) {
+	r, _ := http.NewRequest("GET", "/v1/object", nil)
+	w := httptest.NewRecorder()
+	beego.BeeApp.Handlers.ServeHTTP(w, r)
+
+	logs.Info("testing", "TestGet", "Code[%d]\n%s", w.Code, w.Body.String())
+
+	Convey("Subject: Test Station Endpoint\n", t, func() {
+		Convey("Status Code Should Be 200", func() {
+			So(w.Code, ShouldEqual, 200)
+		})
+		Convey("The Result Should Not Be Empty", func() {
+			So(w.Body.Len(), ShouldBeGreaterThan, 0)
+		})
+	})
+}

+ 127 - 0
utils/comm.go

@@ -0,0 +1,127 @@
+package utils
+
+import (
+	"crypto/md5"
+	"crypto/rand"
+	"crypto/sha256"
+	"encoding/hex"
+	"errors"
+	"github.com/beego/beego/v2/core/logs"
+	"io"
+	"net/url"
+	"os"
+	"strings"
+)
+
+// 用户输入组合路径安全校验
+func CheckPath(param string) error {
+	if count := strings.Count(param, "."); count > 0 {
+		return errors.New("路径中不能包含非法字符“.”")
+	}
+	if count := strings.Count(param, "/"); count > 0 {
+		return errors.New("路径中不能包含非法字符“/”")
+	}
+	if count := strings.Count(param, "\\"); count > 0 {
+		return errors.New("路径中不能包含非法字符“\\”")
+	}
+	return nil
+}
+
+// 用户输入文件名安全校验
+func CheckFilename(param string) error {
+	if count := strings.Count(param, "."); count > 1 {
+		return errors.New("文件名中不能超过一个“.”")
+	}
+	if count := strings.Count(param, "/"); count > 0 {
+		return errors.New("文件名中不能包含非法字符“/”")
+	}
+	if count := strings.Count(param, "\\"); count > 0 {
+		return errors.New("文件名中不能包含非法字符“\\”")
+	}
+	return nil
+}
+
+// 用户文件全路径安全校验
+func CheckPathFilename(param string) error {
+	if count := strings.Count(param, "."); count > 2 {
+		return errors.New("文件全路径中不能超过两个“.”")
+	}
+	if count := strings.Count(param, "/"); count > 5 {
+		return errors.New("文件全路径中不能包含非法字符“/”")
+	}
+	if count := strings.Count(param, "\\"); count > 0 {
+		return errors.New("文件全路径中不能包含非法字符“\\”")
+	}
+	return nil
+}
+
+// 提取url中的路径
+func GetUrlPath(rawURL string) string {
+	parsedURL, err := url.Parse(rawURL)
+	if err != nil {
+		logs.Error("url parse error: %v", err)
+		return ""
+	}
+	return parsedURL.Path
+}
+
+// 字符串替换非法字符
+func ReplaceUserInput(s string) string {
+	newStringInput := strings.NewReplacer("\n", " ", "\r", " ")
+	return newStringInput.Replace(s)
+}
+
+// 字符包含非法字符
+func ContainsIllegal(target string) bool {
+	var str_array [3]string = [3]string{"/", "./", "\\"}
+	for _, element := range str_array {
+		if strings.Contains(target, element) {
+			return true
+		}
+	}
+	return false
+}
+
+// 文件md5计算
+func FileSign(filePath string, sign string) (string, error) {
+	check_err := CheckPathFilename(filePath)
+	if check_err != nil {
+		return "", check_err
+	}
+	file, err := os.Open(filePath)
+	if err != nil {
+		return "", err
+	}
+	if sign == "MD5" {
+		hash := md5.New()
+		_, _ = io.Copy(hash, file)
+		return hex.EncodeToString(hash.Sum(nil)), nil
+	} else {
+		hash := sha256.New()
+		_, _ = io.Copy(hash, file)
+		return hex.EncodeToString(hash.Sum(nil)), nil
+	}
+
+}
+
+func GetFileSize(filePath string) (int64, error) {
+	check_err := CheckPathFilename(filePath)
+	if check_err != nil {
+		return 0, check_err
+	}
+	fi, err := os.Stat(filePath)
+	if err != nil {
+		return 0, err
+	}
+	return fi.Size(), nil
+}
+
+// GenerateAppKey 生成指定字节长度的随机字符串
+func GenerateAppKey(length int) string {
+	b := make([]byte, length)
+	_, err := rand.Read(b)
+	if err != nil {
+		panic(err)
+	}
+	return hex.EncodeToString(b)
+}

Some files were not shown because too many files changed in this diff